From 9119c044fa066ac209796ad2cece6c513bd11b6b Mon Sep 17 00:00:00 2001 From: renya Date: Fri, 17 Jul 2026 11:29:04 +0900 Subject: [PATCH 1/5] feat: add AgentCore AWS Specialist Agent sample An AWS specialist chat agent built on FAST v0.4.1, showcased at the AgentCore booth at AWS Summit Japan 2026. Key additions over the FAST baseline: - Selectable models: Claude and OpenAI GPT on Bedrock via a CDK model registry and per-chat UI selector - Long-term memory: AgentCore Memory SemanticMemoryStrategy plus an LTM-listing MCP server hosted on its own Runtime - Web search: Amazon-managed AgentCore Gateway web search connector - Chat-history sidebar: API Gateway + Lambda + DynamoDB session history - Fully closed NAT-free VPC: all egress via interface/gateway endpoints - Skills on Runtime: read-only S3 Files mount at /mnt/skills with vendored, hash-pinned skill content - Multi-MCP-server management with Cedar ABAC per user department - Speculative pre-warming to reduce cold-start latency ASH scan green with suppressions documented in .ash/ash.yaml. Tests: pytest 57/57, vitest 102/102, CDK jest 18/18. --- README.md | 12 + samples/aws-specialist-agent/.ash/ash.yaml | 56 + .../vercel-react-best-practices/AGENTS.md | 3810 ++++ .../vercel-react-best-practices/README.md | 123 + .../vercel-react-best-practices/SKILL.md | 149 + .../vercel-react-best-practices/metadata.json | 15 + .../rules/_sections.md | 46 + .../rules/_template.md | 28 + .../rules/advanced-effect-event-deps.md | 56 + .../rules/advanced-event-handler-refs.md | 55 + .../rules/advanced-init-once.md | 42 + .../rules/advanced-use-latest.md | 39 + .../rules/async-api-routes.md | 38 + .../async-cheap-condition-before-await.md | 37 + .../rules/async-defer-await.md | 82 + .../rules/async-dependencies.md | 51 + .../rules/async-parallel.md | 28 + .../rules/async-suspense-boundaries.md | 99 + .../rules/bundle-analyzable-paths.md | 63 + .../rules/bundle-barrel-imports.md | 60 + .../rules/bundle-conditional.md | 31 + .../rules/bundle-defer-third-party.md | 49 + .../rules/bundle-dynamic-imports.md | 35 + .../rules/bundle-preload.md | 50 + .../rules/client-event-listeners.md | 74 + .../rules/client-localstorage-schema.md | 71 + .../rules/client-passive-event-listeners.md | 48 + .../rules/client-swr-dedup.md | 56 + .../rules/js-batch-dom-css.md | 107 + .../rules/js-cache-function-results.md | 80 + .../rules/js-cache-property-access.md | 28 + .../rules/js-cache-storage.md | 70 + .../rules/js-combine-iterations.md | 32 + .../rules/js-early-exit.md | 50 + .../rules/js-flatmap-filter.md | 60 + .../rules/js-hoist-regexp.md | 45 + .../rules/js-index-maps.md | 37 + .../rules/js-length-check-first.md | 49 + .../rules/js-min-max-loop.md | 82 + .../rules/js-request-idle-callback.md | 105 + .../rules/js-set-map-lookups.md | 24 + .../rules/js-tosorted-immutable.md | 57 + .../rules/rendering-activity.md | 26 + .../rules/rendering-animate-svg-wrapper.md | 47 + .../rules/rendering-conditional-render.md | 40 + .../rules/rendering-content-visibility.md | 38 + .../rules/rendering-hoist-jsx.md | 46 + .../rules/rendering-hydration-no-flicker.md | 82 + .../rendering-hydration-suppress-warning.md | 30 + .../rules/rendering-resource-hints.md | 85 + .../rules/rendering-script-defer-async.md | 68 + .../rules/rendering-svg-precision.md | 28 + .../rules/rendering-usetransition-loading.md | 75 + .../rules/rerender-defer-reads.md | 39 + .../rules/rerender-dependencies.md | 45 + .../rules/rerender-derived-state-no-effect.md | 40 + .../rules/rerender-derived-state.md | 29 + .../rules/rerender-functional-setstate.md | 74 + .../rules/rerender-lazy-state-init.md | 58 + .../rules/rerender-memo-with-default-value.md | 38 + .../rules/rerender-memo.md | 44 + .../rules/rerender-move-effect-to-event.md | 45 + .../rules/rerender-no-inline-components.md | 82 + .../rerender-simple-expression-in-memo.md | 35 + .../rules/rerender-split-combined-hooks.md | 64 + .../rules/rerender-transitions.md | 40 + .../rules/rerender-use-deferred-value.md | 59 + .../rerender-use-ref-transient-values.md | 73 + .../rules/server-after-nonblocking.md | 73 + .../rules/server-auth-actions.md | 96 + .../rules/server-cache-lru.md | 41 + .../rules/server-cache-react.md | 76 + .../rules/server-dedup-props.md | 65 + .../rules/server-hoist-static-io.md | 149 + .../rules/server-no-shared-module-state.md | 50 + .../rules/server-parallel-fetching.md | 83 + .../rules/server-parallel-nested-fetching.md | 34 + .../rules/server-serialization.md | 38 + .../skills/web-design-guidelines/SKILL.md | 39 + samples/aws-specialist-agent/.dockerignore | 38 + samples/aws-specialist-agent/.gitignore | 66 + samples/aws-specialist-agent/.kics.yml | 21 + samples/aws-specialist-agent/.prettierrc | 11 + samples/aws-specialist-agent/CHANGELOG.md | 340 + samples/aws-specialist-agent/CLAUDE.md | 12 + samples/aws-specialist-agent/CONTRIBUTING.md | 164 + samples/aws-specialist-agent/LICENSE | 190 + samples/aws-specialist-agent/Makefile | 58 + samples/aws-specialist-agent/NOTICE | 153 + samples/aws-specialist-agent/README-jp.md | 186 + samples/aws-specialist-agent/README.md | 210 + samples/aws-specialist-agent/VERSION | 1 + .../agent/strands-single-agent/Dockerfile | 48 + .../agent/strands-single-agent/README.md | 121 + .../agent/strands-single-agent/basic_agent.py | 310 + .../agent/strands-single-agent/models.py | 178 + .../strands-single-agent/requirements.txt | 23 + .../strands-single-agent/tools/__init__.py | 1 + .../strands-single-agent/tools/gateway.py | 125 + .../agent/utils/__init__.py | 1 + .../aws-specialist-agent/agent/utils/auth.py | 275 + .../aws-specialist-agent/agent/utils/ssm.py | 45 + .../docker/Dockerfile.frontend.dev | 28 + .../docker/docker-compose.yml | 49 + samples/aws-specialist-agent/docs-jp/.nav.yml | 5 + .../docs-jp/AGENTCORE_EVALUATIONS_GUIDE.md | 1312 ++ .../docs-jp/AGENT_CONFIGURATION.md | 184 + .../docs-jp/CEDAR_POLICY_GUIDE.md | 415 + .../docs-jp/CONTEXT_MANAGEMENT.md | 618 + .../docs-jp/DEPLOYMENT.md | 476 + .../aws-specialist-agent/docs-jp/GATEWAY.md | 485 + .../docs-jp/IDENTITY_POLICY.md | 344 + .../docs-jp/LOCAL_DEVELOPMENT.md | 215 + .../docs-jp/LOCAL_DOCKER_TESTING.md | 234 + .../docs-jp/MEMORY_INTEGRATION.md | 408 + .../docs-jp/REPLACING_COGNITO.md | 841 + .../docs-jp/RUNTIME_GATEWAY_AUTH.md | 591 + .../aws-specialist-agent/docs-jp/SKILLS.md | 19 + .../aws-specialist-agent/docs-jp/STREAMING.md | 331 + .../docs-jp/TOOL_AC_CODE_INTERPRETER.md | 171 + .../docs-jp/VERSION_BUMP_PLAYBOOK.md | 69 + samples/aws-specialist-agent/docs-jp/index.md | 9 + samples/aws-specialist-agent/docs/.nav.yml | 5 + .../docs/AGENTCORE_EVALUATIONS_GUIDE.md | 1317 ++ .../docs/AGENT_CONFIGURATION.md | 185 + .../docs/CEDAR_POLICY_GUIDE.md | 415 + .../docs/CONTEXT_MANAGEMENT.md | 618 + .../aws-specialist-agent/docs/DEPLOYMENT.md | 520 + samples/aws-specialist-agent/docs/GATEWAY.md | 485 + .../docs/IDENTITY_POLICY.md | 344 + .../docs/LOCAL_DEVELOPMENT.md | 215 + .../docs/LOCAL_DOCKER_TESTING.md | 234 + .../docs/MEMORY_INTEGRATION.md | 408 + .../docs/REPLACING_COGNITO.md | 841 + .../docs/RUNTIME_GATEWAY_AUTH.md | 591 + samples/aws-specialist-agent/docs/SKILLS.md | 19 + .../aws-specialist-agent/docs/STREAMING.md | 331 + .../docs/TOOL_AC_CODE_INTERPRETER.md | 175 + .../docs/VERSION_BUMP_PLAYBOOK.md | 69 + .../aws-specialist-agent-architecture.drawio | 528 + .../aws-specialist-agent-architecture.png | Bin 0 -> 623644 bytes .../aws-specialist-agent/docs/img/demo.webp | Bin 0 -> 458206 bytes .../docs/img/screenshot.png | Bin 0 -> 66581 bytes samples/aws-specialist-agent/docs/index.md | 9 + .../aws-specialist-agent/frontend/README.md | 200 + .../frontend/components.json | 21 + .../frontend/eslint.config.mjs | 27 + .../aws-specialist-agent/frontend/index.html | 18 + .../frontend/package-lock.json | 17226 ++++++++++++++++ .../frontend/package.json | 64 + .../frontend/postcss.config.mjs | 7 + .../frontend/public/favicon.ico | Bin 0 -> 370070 bytes .../readme-imgs/fast-chat-screenshot.png | Bin 0 -> 66581 bytes .../frontend/readme-imgs/login-page.png | Bin 0 -> 22336 bytes .../aws-specialist-agent/frontend/src/App.tsx | 16 + .../src/app/context/GlobalContext.tsx | 74 + .../src/components/auth/AuthProvider.tsx | 71 + .../src/components/auth/AutoSignin.tsx | 38 + .../src/components/chat/ChatHeader.tsx | 66 + .../src/components/chat/ChatInput.tsx | 110 + .../src/components/chat/ChatInterface.tsx | 572 + .../src/components/chat/ChatMessage.tsx | 122 + .../src/components/chat/ChatMessages.tsx | 65 + .../src/components/chat/ChatSidebar.tsx | 62 + .../src/components/chat/FeedbackDialog.tsx | 83 + .../src/components/chat/MarkdownRenderer.tsx | 102 + .../src/components/chat/MermaidDiagram.tsx | 207 + .../src/components/chat/ModelSelector.tsx | 50 + .../src/components/chat/ToolCallDisplay.tsx | 54 + .../frontend/src/components/chat/types.ts | 46 + .../src/components/loaders/LoadingSpinner.tsx | 19 + .../src/components/ui/alert-dialog.tsx | 135 + .../frontend/src/components/ui/button.tsx | 56 + .../frontend/src/components/ui/card.tsx | 75 + .../frontend/src/components/ui/dialog.tsx | 129 + .../frontend/src/components/ui/input.tsx | 21 + .../frontend/src/components/ui/popover.tsx | 42 + .../frontend/src/components/ui/progress.tsx | 28 + .../frontend/src/components/ui/select.tsx | 170 + .../frontend/src/components/ui/separator.tsx | 28 + .../frontend/src/components/ui/sheet.tsx | 130 + .../frontend/src/components/ui/sidebar.tsx | 696 + .../frontend/src/components/ui/skeleton.tsx | 13 + .../frontend/src/components/ui/textarea.tsx | 23 + .../frontend/src/components/ui/tooltip.tsx | 57 + .../frontend/src/hooks/UseMobile.ts | 19 + .../frontend/src/hooks/useAuth.ts | 70 + .../frontend/src/hooks/useToolRenderer.ts | 25 + .../src/lib/agentcore-client/client.ts | 126 + .../src/lib/agentcore-client/index.ts | 11 + .../src/lib/agentcore-client/parsers/agui.ts | 81 + .../parsers/claude-agent-sdk.ts | 56 + .../lib/agentcore-client/parsers/converse.ts | 83 + .../lib/agentcore-client/parsers/langgraph.ts | 82 + .../lib/agentcore-client/parsers/strands.ts | 92 + .../src/lib/agentcore-client/types.ts | 32 + .../src/lib/agentcore-client/utils/sse.ts | 45 + .../frontend/src/lib/auth.ts | 110 + .../frontend/src/lib/utils.ts | 6 + .../frontend/src/main.tsx | 13 + .../frontend/src/routes/ChatPage.tsx | 29 + .../frontend/src/routes/index.tsx | 13 + .../frontend/src/services/feedbackService.ts | 73 + .../frontend/src/services/historyService.ts | 75 + .../frontend/src/services/sessionService.ts | 103 + .../frontend/src/styles/globals.css | 155 + .../frontend/src/test/build.test.ts | 197 + .../frontend/src/test/components.test.tsx | 131 + .../frontend/src/test/config.test.ts | 199 + .../frontend/src/test/env.test.ts | 149 + .../src/test/property-auth-routing.test.tsx | 233 + .../property-config-compatibility.test.ts | 233 + .../src/test/property-env-vars.test.ts | 66 + .../frontend/src/test/routing.test.ts | 80 + .../frontend/src/test/setup.ts | 9 + .../frontend/src/types/jsx.d.ts | 9 + .../frontend/src/vite-env.d.ts | 19 + .../frontend/tsconfig.json | 32 + .../frontend/tsconfig.node.json | 11 + .../frontend/vite.config.ts | 42 + .../frontend/vitest.config.ts | 20 + .../aws-specialist-agent/gateway/__init__.py | 1 + .../gateway/policies/01-sample-tool.cedar | 19 + .../gateway/policies/02-aws-mcp-read.cedar | 26 + .../policies/03-aws-mcp-destructive.cedar | 28 + .../gateway/policies/04-ltm-mcp.cedar | 19 + .../gateway/policies/05-strands-mcp.cedar | 26 + .../gateway/policies/06-web-search.cedar | 24 + .../gateway/policies/README.md | 78 + .../gateway/tools/__init__.py | 1 + .../tools/ltm_mcp_server/.dockerignore | 6 + .../gateway/tools/ltm_mcp_server/Dockerfile | 30 + .../tools/ltm_mcp_server/requirements.txt | 5 + .../gateway/tools/ltm_mcp_server/server.py | 162 + .../tools/sample_tool/sample_tool_lambda.py | 99 + .../gateway/tools/sample_tool/tool_spec.json | 22 + .../tools/strands_mcp_server/.dockerignore | 6 + .../tools/strands_mcp_server/Dockerfile | 30 + .../tools/strands_mcp_server/requirements.txt | 5 + .../tools/strands_mcp_server/server.py | 68 + .../aws-specialist-agent/infra-cdk/.gitignore | 13 + .../aws-specialist-agent/infra-cdk/.npmignore | 6 + .../aws-specialist-agent/infra-cdk/README.md | 237 + .../infra-cdk/bin/fast-cdk.ts | 35 + .../aws-specialist-agent/infra-cdk/cdk.json | 101 + .../infra-cdk/config.yaml | 96 + .../infra-cdk/jest.config.js | 8 + .../infra-cdk/lambdas/cedar-policy/index.py | 490 + .../lambdas/cedar-policy/requirements.txt | 1 + .../infra-cdk/lambdas/feedback/index.py | 186 + .../lambdas/feedback/requirements.txt | 6 + .../infra-cdk/lambdas/history/index.py | 211 + .../lambdas/history/requirements.txt | 4 + .../lambdas/oauth2-provider/index.py | 164 + .../infra-cdk/lambdas/pretoken-v3/index.py | 134 + .../infra-cdk/lambdas/sessions/index.py | 245 + .../lambdas/sessions/requirements.txt | 5 + .../infra-cdk/lambdas/zip-packager/index.py | 252 + .../infra-cdk/lib/amplify-hosting-stack.ts | 100 + .../infra-cdk/lib/backend-stack.ts | 2329 +++ .../infra-cdk/lib/cognito-stack.ts | 250 + .../infra-cdk/lib/fast-main-stack.ts | 176 + .../infra-cdk/lib/skills-storage-stack.ts | 204 + .../infra-cdk/lib/utils/agentcore-role.ts | 132 + .../infra-cdk/lib/utils/config-manager.ts | 357 + .../infra-cdk/lib/utils/model-registry.ts | 193 + .../infra-cdk/lib/vpc-stack.ts | 183 + .../infra-cdk/minimal-deploy-policy.json | 96 + .../infra-cdk/package-lock.json | 5876 ++++++ .../infra-cdk/package.json | 31 + .../infra-cdk/test/config-manager.test.ts | 154 + .../infra-cdk/test/fast-cdk.test.ts | 17 + .../infra-cdk/tsconfig.json | 32 + samples/aws-specialist-agent/pyproject.toml | 92 + .../aws-specialist-agent/requirements-dev.txt | 4 + samples/aws-specialist-agent/ruff.toml | 92 + .../aws-specialist-agent/scripts/.env.example | 12 + .../aws-specialist-agent/scripts/README.md | 128 + .../scripts/build-project-guide.py | 339 + .../scripts/create-demo-users.py | 363 + .../scripts/deploy-frontend.py | 618 + .../scripts/deploy-with-codebuild.py | 769 + .../scripts/drawio-export.sh | 103 + .../scripts/requirements.txt | 7 + samples/aws-specialist-agent/scripts/utils.py | 240 + .../scripts/vendor-skills.py | 117 + samples/aws-specialist-agent/skills-lock.json | 17 + .../skills/agent-toolkit-for-aws/LICENSE | 175 + .../skills/agent-toolkit-for-aws/NOTICE | 1 + .../skills/agent-toolkit-for-aws/README.md | 39 + .../amazon-bedrock/SKILL.md | 362 + .../agentcore-credentials-and-security.md | 134 + .../references/agentcore-gateway.md | 117 + .../agentcore-memory-observability.md | 120 + .../agentcore-registry-evaluations.md | 126 + .../agentcore-runtime-container-build.md | 275 + .../references/agentcore-runtime.md | 132 + .../references/agents-and-action-groups.md | 223 + .../references/cost-tracking.md | 106 + .../amazon-bedrock/references/guardrails.md | 231 + .../references/knowledge-bases-retrieval.md | 138 + .../references/knowledge-bases-setup.md | 273 + .../references/model-invocation.md | 200 + .../references/model-migration.md | 75 + .../references/model-selection-guide.md | 97 + .../references/prompt-caching.md | 124 + .../references/prompt-engineering-by-model.md | 149 + .../amazon-bedrock/references/quota-health.md | 94 + .../references/sdk-converse-api-python.md | 156 + .../references/sdk-converse-api-typescript.md | 177 + .../aws-amplify/SKILL.md | 399 + .../aws-amplify/references/ai.md | 203 + .../aws-amplify/references/auth-backend.md | 274 + .../aws-amplify/references/auth-mobile.md | 477 + .../aws-amplify/references/auth-web.md | 145 + .../aws-amplify/references/data-backend.md | 350 + .../aws-amplify/references/data-mobile.md | 149 + .../aws-amplify/references/data-web.md | 172 + .../aws-amplify/references/deployment.md | 275 + .../references/functions-and-api.md | 322 + .../aws-amplify/references/geo-pubsub-cdk.md | 311 + .../aws-amplify/references/scaffolding.md | 193 + .../aws-amplify/references/storage-backend.md | 148 + .../aws-amplify/references/storage-mobile.md | 202 + .../aws-amplify/references/storage-web.md | 94 + .../aws-billing-and-cost-management/SKILL.md | 171 + .../references/budgets.md | 51 + .../references/cost-audit.md | 75 + .../references/cost-explorer.md | 137 + .../references/cost-optimization-hub.md | 141 + .../references/cur-athena.md | 104 + .../references/deterministic-calculations.md | 62 + .../references/ebs-optimization.md | 52 + .../references/ec2-rightsizing.md | 88 + .../references/free-tier.md | 34 + .../references/lambda-optimization.md | 47 + .../references/pricing-lookup.md | 78 + .../references/rds-optimization.md | 43 + .../references/reserved-instances.md | 63 + .../references/savings-plans.md | 69 + .../references/service-optimization.md | 59 + .../agent-toolkit-for-aws/aws-cdk/SKILL.md | 72 + .../references/bootstrap-and-project-setup.md | 236 + .../references/compliance-and-drift.md | 193 + .../aws-cdk/references/construct-patterns.md | 276 + .../aws-cdk/references/import-and-migrate.md | 184 + .../refactor-and-prevent-replacement.md | 198 + .../references/troubleshooting-credentials.md | 183 + .../references/troubleshooting-deployment.md | 202 + .../references/troubleshooting-synth.md | 274 + .../aws-cdk/references/v1-to-v2-migration.md | 113 + .../aws-cleanrooms/SKILL.md | 27 + .../custom-model-logging-debugging.md | 104 + .../references/permission-debugging.md | 127 + .../aws-cloudformation/SKILL.md | 75 + ...or-cloudformation-best-practices.script.md | 179 + ...oudformation-template-compliance.script.md | 159 + ...dformation-pre-deploy-validation.script.md | 217 + .../lookup-resource-properties.script.md | 130 + .../troubleshoot-deployment.script.md | 200 + ...validate-cloudformation-template.script.md | 135 + .../aws-containers/SKILL.md | 230 + .../references/app-runner-guide.md | 275 + .../references/ecr-repository-management.md | 303 + .../references/ecs-exec-debugging.md | 298 + .../references/ecs-infrastructure-patterns.md | 638 + .../references/ecs-logging-and-firelens.md | 270 + .../references/ecs-troubleshooting-guide.md | 351 + .../references/fargate-service-deployment.md | 375 + .../aws-containers/references/fargate-spot.md | 237 + .../references/service-scaling-and-updates.md | 373 + .../references/task-definition-authoring.md | 331 + .../agent-toolkit-for-aws/aws-iam/SKILL.md | 94 + .../aws-messaging-and-streaming/SKILL.md | 111 + .../aws-observability/SKILL.md | 47 + .../assets/alarm-template.ts | 105 + .../aws-observability/assets/otel-config.yaml | 57 + .../aws-observability/references/alarms.md | 277 + .../references/cloudtrail.md | 125 + .../references/dashboards.md | 166 + .../references/log-insights.md | 266 + .../aws-observability/references/metrics.md | 207 + .../references/synthetics.md | 142 + .../aws-observability/references/tracing.md | 274 + .../references/troubleshooting.md | 122 + .../aws-sdk-js-v3-usage/SKILL.md | 254 + .../aws-sdk-js-v3-usage/references/clients.md | 143 + .../references/credentials.md | 117 + .../references/dynamodb.md | 104 + .../references/effective-practices.md | 81 + .../references/error-handling.md | 59 + .../aws-sdk-js-v3-usage/references/lambda.md | 72 + .../references/performance.md | 68 + .../aws-sdk-js-v3-usage/references/s3.md | 87 + .../aws-sdk-js-v3-usage/references/schemas.md | 38 + .../aws-sdk-js-v3-usage/references/sigv4a.md | 51 + .../references/typescript.md | 31 + .../aws-sdk-python-usage/SKILL.md | 260 + .../references/configuration.md | 151 + .../references/credentials.md | 127 + .../references/dynamodb.md | 295 + .../references/error-handling.md | 139 + .../references/pagination.md | 104 + .../aws-sdk-python-usage/references/s3.md | 223 + .../references/waiters.md | 121 + .../aws-sdk-swift-usage/SKILL.md | 185 + .../aws-serverless/SKILL.md | 43 + .../assets/powertools-handler.py | 49 + .../aws-serverless/references/api-gateway.md | 553 + .../aws-serverless/references/architecture.md | 262 + .../aws-serverless/references/concurrency.md | 200 + .../aws-serverless/references/deployment.md | 94 + .../references/event-sources.md | 484 + .../aws-serverless/references/lambda.md | 548 + .../references/orchestration.md | 509 + .../aws-serverless/references/production.md | 493 + .../references/troubleshooting.md | 711 + .../aws-transform/SKILL.md | 845 + .../aws-transform/references/cli-reference.md | 133 + .../references/multi-transformation.md | 221 + .../references/remote-execution.md | 486 + .../aws-transform/references/repo-analysis.md | 138 + .../references/results-synthesis.md | 54 + .../references/single-transformation.md | 286 + .../references/troubleshooting.md | 133 + .../SKILL.md | 36 + ...ndpoints-for-private-aws-service-access.md | 229 + .../connecting-lambda-to-api-gateway/SKILL.md | 39 + .../references/lambda-gateway-api.md | 260 + .../connecting-lambda-to-dynamodb/SKILL.md | 32 + .../references/lambda-dynamodb-connection.md | 230 + .../connecting-to-data-source/SKILL.md | 170 + .../references/bigquery-setup.md | 64 + .../references/credential-security.md | 152 + .../references/discovery.md | 89 + .../references/jdbc-setup.md | 90 + .../references/network-setup.md | 119 + .../references/snowflake-setup.md | 58 + .../references/troubleshooting.md | 253 + .../connecting-vpcs-with-peering/SKILL.md | 36 + .../references/vpc-peering-connection.md | 165 + .../SKILL.md | 40 + ...amazon-aurora-db-cluster-with-instances.md | 152 + .../creating-api-gateway-stage/SKILL.md | 36 + .../references/create-api-gateway-stage.md | 244 + .../creating-data-lake-table/SKILL.md | 193 + .../references/access-control.md | 38 + .../references/athena-ddl-path.md | 79 + .../references/best-practices.md | 82 + .../references/table-creation-glue-etl.md | 142 + .../SKILL.md | 37 + .../references/ec2-image-builder-pipeline.md | 355 + .../creating-production-vpc-multi-az/SKILL.md | 45 + .../create-production-vpc-multi-az.md | 221 + .../SKILL.md | 40 + .../create-secrets-using-best-practices.md | 232 + .../debugging-lambda-timeouts/SKILL.md | 47 + .../references/lambda-timeout-debugging.md | 322 + .../SKILL.md | 34 + .../references/lambda-vpc-internet-access.md | 249 + .../exploring-data-catalog/SKILL.md | 129 + .../references/discovery-checklist.md | 65 + .../exporting-rds-to-s3/SKILL.md | 34 + .../references/export-rds-to-s3.md | 1602 ++ .../finding-data-lake-assets/SKILL.md | 231 + .../references/search-strategy.md | 129 + .../ingesting-into-data-lake/SKILL.md | 183 + .../references/athena-loading.md | 115 + .../references/bigquery-ingest.md | 114 + .../references/catalog-migration.md | 116 + .../references/ctas-patterns.md | 91 + .../references/data-quality-validation.md | 436 + .../references/dynamodb-ingest.md | 234 + .../references/error-handling.md | 399 + .../references/format-specific-loading.md | 482 + .../references/glue-etl-migration.md | 129 + .../references/glue-job-config.md | 316 + .../references/glue-job-scripts.md | 341 + .../iceberg-catalog-config-and-usage.md | 179 + .../references/incremental-loading.md | 500 + .../references/jdbc-ingest.md | 174 + .../references/jdbc-performance.md | 444 + .../references/jdbc-schema-discovery.md | 469 + .../references/local-upload.md | 127 + .../references/migration-troubleshooting.md | 42 + .../references/migration-validation.md | 103 + .../references/s3-files.md | 119 + .../references/schema-evolution.md | 400 + .../references/snowflake-ingest.md | 106 + .../references/testing-and-scheduling.md | 524 + .../references/type-transformations.md | 325 + .../references/upload-options.md | 40 + .../SKILL.md | 41 + ...launch-ec2-instance-with-best-practices.md | 1697 ++ .../querying-data-lake/SKILL.md | 138 + .../references/query-patterns.md | 186 + .../references/workgroup-selection.md | 82 + .../SKILL.md | 42 + .../references/route53-cloudfront-routing.md | 282 + .../securing-s3-buckets/SKILL.md | 158 + .../references/audit-checklist.md | 65 + .../references/encryption.md | 133 + .../references/iam-permissions.md | 11 + .../references/remediation.md | 122 + .../references/workflows.md | 167 + .../SKILL.md | 41 + .../cloudtrail-multi-region-setup.md | 332 + .../SKILL.md | 36 + .../setup-cloudwatch-alarm-notifications.md | 213 + .../setting-up-ec2-instance-profiles/SKILL.md | 41 + .../references/ec2-instance-profile-setup.md | 835 + .../storing-and-querying-vectors/SKILL.md | 160 + .../references/limits-and-patterns.md | 67 + .../references/metadata-filtering.md | 68 + .../SKILL.md | 34 + .../application-failure-troubleshooting.md | 350 + .../troubleshooting-efs/SKILL.md | 178 + .../troubleshooting-s3-files/SKILL.md | 192 + .../skills/aws-specialist-agent/README.md | 83 + .../fast-project-guide/SKILL.md | 27 + .../references/architecture.md | 457 + .../references/configuration.md | 63 + .../references/demo-features.md | 90 + .../fast-project-guide/references/overview.md | 38 + .../test-scripts/README.md | 135 + .../test-scripts/requirements.txt | 5 + .../test-scripts/test-agent.py | 516 + .../test-scripts/test-aws-mcp-call.py | 166 + .../test-scripts/test-feedback-api.py | 226 + .../test-scripts/test-gateway.py | 236 + .../test-scripts/test-ltm-mcp.py | 168 + .../test-scripts/test-memory.py | 428 + .../test-scripts/test-runtime-vpc-e2e.py | 145 + .../test-scripts/test-skills-e2e.py | 151 + .../test-scripts/test-strands-mcp.py | 152 + .../test-scripts/test-web-search.py | 189 + samples/aws-specialist-agent/tests/README.md | 0 .../aws-specialist-agent/tests/__init__.py | 6 + .../aws-specialist-agent/tests/conftest.py | 5 + .../tests/integration/__init__.py | 6 + samples/aws-specialist-agent/tests/pytest.ini | 7 + .../aws-specialist-agent/tests/unit/__init.py | 6 + .../tests/unit/test_basic_agent_warmup.py | 176 + .../tests/unit/test_build_project_guide.py | 97 + .../tests/unit/test_ltm_mcp_server.py | 219 + .../tests/unit/test_models.py | 311 + .../tests/unit/test_strands_mcp_server.py | 125 + .../vibe-context/AGENTS.md | 13 + .../vibe-context/coding-conventions.md | 11 + .../development-best-practices.md | 10 + 550 files changed, 114093 insertions(+) create mode 100644 samples/aws-specialist-agent/.ash/ash.yaml create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/AGENTS.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/README.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/SKILL.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/metadata.json create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/_sections.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/_template.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/advanced-init-once.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/async-api-routes.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/async-defer-await.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/async-dependencies.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/async-parallel.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/bundle-analyzable-paths.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/bundle-conditional.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/bundle-preload.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/client-event-listeners.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/client-localstorage-schema.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-cache-storage.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-early-exit.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-flatmap-filter.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-index-maps.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-length-check-first.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-request-idle-callback.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rendering-activity.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rendering-resource-hints.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-memo.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-transitions.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/server-auth-actions.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/server-cache-lru.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/server-cache-react.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/server-dedup-props.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/server-hoist-static-io.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md create mode 100644 samples/aws-specialist-agent/.claude/skills/vercel-react-best-practices/rules/server-serialization.md create mode 100644 samples/aws-specialist-agent/.claude/skills/web-design-guidelines/SKILL.md create mode 100644 samples/aws-specialist-agent/.dockerignore create mode 100644 samples/aws-specialist-agent/.gitignore create mode 100644 samples/aws-specialist-agent/.kics.yml create mode 100644 samples/aws-specialist-agent/.prettierrc create mode 100644 samples/aws-specialist-agent/CHANGELOG.md create mode 100644 samples/aws-specialist-agent/CLAUDE.md create mode 100644 samples/aws-specialist-agent/CONTRIBUTING.md create mode 100644 samples/aws-specialist-agent/LICENSE create mode 100644 samples/aws-specialist-agent/Makefile create mode 100644 samples/aws-specialist-agent/NOTICE create mode 100644 samples/aws-specialist-agent/README-jp.md create mode 100644 samples/aws-specialist-agent/README.md create mode 100644 samples/aws-specialist-agent/VERSION create mode 100644 samples/aws-specialist-agent/agent/strands-single-agent/Dockerfile create mode 100644 samples/aws-specialist-agent/agent/strands-single-agent/README.md create mode 100644 samples/aws-specialist-agent/agent/strands-single-agent/basic_agent.py create mode 100644 samples/aws-specialist-agent/agent/strands-single-agent/models.py create mode 100644 samples/aws-specialist-agent/agent/strands-single-agent/requirements.txt create mode 100644 samples/aws-specialist-agent/agent/strands-single-agent/tools/__init__.py create mode 100644 samples/aws-specialist-agent/agent/strands-single-agent/tools/gateway.py create mode 100644 samples/aws-specialist-agent/agent/utils/__init__.py create mode 100644 samples/aws-specialist-agent/agent/utils/auth.py create mode 100644 samples/aws-specialist-agent/agent/utils/ssm.py create mode 100644 samples/aws-specialist-agent/docker/Dockerfile.frontend.dev create mode 100644 samples/aws-specialist-agent/docker/docker-compose.yml create mode 100644 samples/aws-specialist-agent/docs-jp/.nav.yml create mode 100644 samples/aws-specialist-agent/docs-jp/AGENTCORE_EVALUATIONS_GUIDE.md create mode 100644 samples/aws-specialist-agent/docs-jp/AGENT_CONFIGURATION.md create mode 100644 samples/aws-specialist-agent/docs-jp/CEDAR_POLICY_GUIDE.md create mode 100644 samples/aws-specialist-agent/docs-jp/CONTEXT_MANAGEMENT.md create mode 100644 samples/aws-specialist-agent/docs-jp/DEPLOYMENT.md create mode 100644 samples/aws-specialist-agent/docs-jp/GATEWAY.md create mode 100644 samples/aws-specialist-agent/docs-jp/IDENTITY_POLICY.md create mode 100644 samples/aws-specialist-agent/docs-jp/LOCAL_DEVELOPMENT.md create mode 100644 samples/aws-specialist-agent/docs-jp/LOCAL_DOCKER_TESTING.md create mode 100644 samples/aws-specialist-agent/docs-jp/MEMORY_INTEGRATION.md create mode 100644 samples/aws-specialist-agent/docs-jp/REPLACING_COGNITO.md create mode 100644 samples/aws-specialist-agent/docs-jp/RUNTIME_GATEWAY_AUTH.md create mode 100644 samples/aws-specialist-agent/docs-jp/SKILLS.md create mode 100644 samples/aws-specialist-agent/docs-jp/STREAMING.md create mode 100644 samples/aws-specialist-agent/docs-jp/TOOL_AC_CODE_INTERPRETER.md create mode 100644 samples/aws-specialist-agent/docs-jp/VERSION_BUMP_PLAYBOOK.md create mode 100644 samples/aws-specialist-agent/docs-jp/index.md create mode 100644 samples/aws-specialist-agent/docs/.nav.yml create mode 100644 samples/aws-specialist-agent/docs/AGENTCORE_EVALUATIONS_GUIDE.md create mode 100644 samples/aws-specialist-agent/docs/AGENT_CONFIGURATION.md create mode 100644 samples/aws-specialist-agent/docs/CEDAR_POLICY_GUIDE.md create mode 100644 samples/aws-specialist-agent/docs/CONTEXT_MANAGEMENT.md create mode 100644 samples/aws-specialist-agent/docs/DEPLOYMENT.md create mode 100644 samples/aws-specialist-agent/docs/GATEWAY.md create mode 100644 samples/aws-specialist-agent/docs/IDENTITY_POLICY.md create mode 100644 samples/aws-specialist-agent/docs/LOCAL_DEVELOPMENT.md create mode 100644 samples/aws-specialist-agent/docs/LOCAL_DOCKER_TESTING.md create mode 100644 samples/aws-specialist-agent/docs/MEMORY_INTEGRATION.md create mode 100644 samples/aws-specialist-agent/docs/REPLACING_COGNITO.md create mode 100644 samples/aws-specialist-agent/docs/RUNTIME_GATEWAY_AUTH.md create mode 100644 samples/aws-specialist-agent/docs/SKILLS.md create mode 100644 samples/aws-specialist-agent/docs/STREAMING.md create mode 100644 samples/aws-specialist-agent/docs/TOOL_AC_CODE_INTERPRETER.md create mode 100644 samples/aws-specialist-agent/docs/VERSION_BUMP_PLAYBOOK.md create mode 100644 samples/aws-specialist-agent/docs/architecture-diagram/aws-specialist-agent-architecture.drawio create mode 100644 samples/aws-specialist-agent/docs/architecture-diagram/aws-specialist-agent-architecture.png create mode 100644 samples/aws-specialist-agent/docs/img/demo.webp create mode 100644 samples/aws-specialist-agent/docs/img/screenshot.png create mode 100644 samples/aws-specialist-agent/docs/index.md create mode 100644 samples/aws-specialist-agent/frontend/README.md create mode 100644 samples/aws-specialist-agent/frontend/components.json create mode 100644 samples/aws-specialist-agent/frontend/eslint.config.mjs create mode 100644 samples/aws-specialist-agent/frontend/index.html create mode 100644 samples/aws-specialist-agent/frontend/package-lock.json create mode 100644 samples/aws-specialist-agent/frontend/package.json create mode 100644 samples/aws-specialist-agent/frontend/postcss.config.mjs create mode 100644 samples/aws-specialist-agent/frontend/public/favicon.ico create mode 100644 samples/aws-specialist-agent/frontend/readme-imgs/fast-chat-screenshot.png create mode 100644 samples/aws-specialist-agent/frontend/readme-imgs/login-page.png create mode 100644 samples/aws-specialist-agent/frontend/src/App.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/app/context/GlobalContext.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/auth/AuthProvider.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/auth/AutoSignin.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/ChatHeader.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/ChatInput.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/ChatInterface.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/ChatMessage.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/ChatMessages.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/ChatSidebar.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/FeedbackDialog.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/MarkdownRenderer.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/MermaidDiagram.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/ModelSelector.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/ToolCallDisplay.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/chat/types.ts create mode 100644 samples/aws-specialist-agent/frontend/src/components/loaders/LoadingSpinner.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/alert-dialog.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/button.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/card.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/dialog.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/input.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/popover.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/progress.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/select.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/separator.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/sheet.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/sidebar.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/skeleton.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/textarea.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/components/ui/tooltip.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/hooks/UseMobile.ts create mode 100644 samples/aws-specialist-agent/frontend/src/hooks/useAuth.ts create mode 100644 samples/aws-specialist-agent/frontend/src/hooks/useToolRenderer.ts create mode 100644 samples/aws-specialist-agent/frontend/src/lib/agentcore-client/client.ts create mode 100644 samples/aws-specialist-agent/frontend/src/lib/agentcore-client/index.ts create mode 100644 samples/aws-specialist-agent/frontend/src/lib/agentcore-client/parsers/agui.ts create mode 100644 samples/aws-specialist-agent/frontend/src/lib/agentcore-client/parsers/claude-agent-sdk.ts create mode 100644 samples/aws-specialist-agent/frontend/src/lib/agentcore-client/parsers/converse.ts create mode 100644 samples/aws-specialist-agent/frontend/src/lib/agentcore-client/parsers/langgraph.ts create mode 100644 samples/aws-specialist-agent/frontend/src/lib/agentcore-client/parsers/strands.ts create mode 100644 samples/aws-specialist-agent/frontend/src/lib/agentcore-client/types.ts create mode 100644 samples/aws-specialist-agent/frontend/src/lib/agentcore-client/utils/sse.ts create mode 100644 samples/aws-specialist-agent/frontend/src/lib/auth.ts create mode 100644 samples/aws-specialist-agent/frontend/src/lib/utils.ts create mode 100644 samples/aws-specialist-agent/frontend/src/main.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/routes/ChatPage.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/routes/index.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/services/feedbackService.ts create mode 100644 samples/aws-specialist-agent/frontend/src/services/historyService.ts create mode 100644 samples/aws-specialist-agent/frontend/src/services/sessionService.ts create mode 100644 samples/aws-specialist-agent/frontend/src/styles/globals.css create mode 100644 samples/aws-specialist-agent/frontend/src/test/build.test.ts create mode 100644 samples/aws-specialist-agent/frontend/src/test/components.test.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/test/config.test.ts create mode 100644 samples/aws-specialist-agent/frontend/src/test/env.test.ts create mode 100644 samples/aws-specialist-agent/frontend/src/test/property-auth-routing.test.tsx create mode 100644 samples/aws-specialist-agent/frontend/src/test/property-config-compatibility.test.ts create mode 100644 samples/aws-specialist-agent/frontend/src/test/property-env-vars.test.ts create mode 100644 samples/aws-specialist-agent/frontend/src/test/routing.test.ts create mode 100644 samples/aws-specialist-agent/frontend/src/test/setup.ts create mode 100644 samples/aws-specialist-agent/frontend/src/types/jsx.d.ts create mode 100644 samples/aws-specialist-agent/frontend/src/vite-env.d.ts create mode 100644 samples/aws-specialist-agent/frontend/tsconfig.json create mode 100644 samples/aws-specialist-agent/frontend/tsconfig.node.json create mode 100644 samples/aws-specialist-agent/frontend/vite.config.ts create mode 100644 samples/aws-specialist-agent/frontend/vitest.config.ts create mode 100644 samples/aws-specialist-agent/gateway/__init__.py create mode 100644 samples/aws-specialist-agent/gateway/policies/01-sample-tool.cedar create mode 100644 samples/aws-specialist-agent/gateway/policies/02-aws-mcp-read.cedar create mode 100644 samples/aws-specialist-agent/gateway/policies/03-aws-mcp-destructive.cedar create mode 100644 samples/aws-specialist-agent/gateway/policies/04-ltm-mcp.cedar create mode 100644 samples/aws-specialist-agent/gateway/policies/05-strands-mcp.cedar create mode 100644 samples/aws-specialist-agent/gateway/policies/06-web-search.cedar create mode 100644 samples/aws-specialist-agent/gateway/policies/README.md create mode 100644 samples/aws-specialist-agent/gateway/tools/__init__.py create mode 100644 samples/aws-specialist-agent/gateway/tools/ltm_mcp_server/.dockerignore create mode 100644 samples/aws-specialist-agent/gateway/tools/ltm_mcp_server/Dockerfile create mode 100644 samples/aws-specialist-agent/gateway/tools/ltm_mcp_server/requirements.txt create mode 100644 samples/aws-specialist-agent/gateway/tools/ltm_mcp_server/server.py create mode 100644 samples/aws-specialist-agent/gateway/tools/sample_tool/sample_tool_lambda.py create mode 100644 samples/aws-specialist-agent/gateway/tools/sample_tool/tool_spec.json create mode 100644 samples/aws-specialist-agent/gateway/tools/strands_mcp_server/.dockerignore create mode 100644 samples/aws-specialist-agent/gateway/tools/strands_mcp_server/Dockerfile create mode 100644 samples/aws-specialist-agent/gateway/tools/strands_mcp_server/requirements.txt create mode 100644 samples/aws-specialist-agent/gateway/tools/strands_mcp_server/server.py create mode 100644 samples/aws-specialist-agent/infra-cdk/.gitignore create mode 100644 samples/aws-specialist-agent/infra-cdk/.npmignore create mode 100644 samples/aws-specialist-agent/infra-cdk/README.md create mode 100644 samples/aws-specialist-agent/infra-cdk/bin/fast-cdk.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/cdk.json create mode 100644 samples/aws-specialist-agent/infra-cdk/config.yaml create mode 100644 samples/aws-specialist-agent/infra-cdk/jest.config.js create mode 100644 samples/aws-specialist-agent/infra-cdk/lambdas/cedar-policy/index.py create mode 100644 samples/aws-specialist-agent/infra-cdk/lambdas/cedar-policy/requirements.txt create mode 100644 samples/aws-specialist-agent/infra-cdk/lambdas/feedback/index.py create mode 100644 samples/aws-specialist-agent/infra-cdk/lambdas/feedback/requirements.txt create mode 100644 samples/aws-specialist-agent/infra-cdk/lambdas/history/index.py create mode 100644 samples/aws-specialist-agent/infra-cdk/lambdas/history/requirements.txt create mode 100644 samples/aws-specialist-agent/infra-cdk/lambdas/oauth2-provider/index.py create mode 100644 samples/aws-specialist-agent/infra-cdk/lambdas/pretoken-v3/index.py create mode 100644 samples/aws-specialist-agent/infra-cdk/lambdas/sessions/index.py create mode 100644 samples/aws-specialist-agent/infra-cdk/lambdas/sessions/requirements.txt create mode 100644 samples/aws-specialist-agent/infra-cdk/lambdas/zip-packager/index.py create mode 100644 samples/aws-specialist-agent/infra-cdk/lib/amplify-hosting-stack.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/lib/backend-stack.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/lib/cognito-stack.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/lib/fast-main-stack.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/lib/skills-storage-stack.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/lib/utils/agentcore-role.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/lib/utils/config-manager.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/lib/utils/model-registry.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/lib/vpc-stack.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/minimal-deploy-policy.json create mode 100644 samples/aws-specialist-agent/infra-cdk/package-lock.json create mode 100644 samples/aws-specialist-agent/infra-cdk/package.json create mode 100644 samples/aws-specialist-agent/infra-cdk/test/config-manager.test.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/test/fast-cdk.test.ts create mode 100644 samples/aws-specialist-agent/infra-cdk/tsconfig.json create mode 100644 samples/aws-specialist-agent/pyproject.toml create mode 100644 samples/aws-specialist-agent/requirements-dev.txt create mode 100644 samples/aws-specialist-agent/ruff.toml create mode 100644 samples/aws-specialist-agent/scripts/.env.example create mode 100644 samples/aws-specialist-agent/scripts/README.md create mode 100644 samples/aws-specialist-agent/scripts/build-project-guide.py create mode 100644 samples/aws-specialist-agent/scripts/create-demo-users.py create mode 100644 samples/aws-specialist-agent/scripts/deploy-frontend.py create mode 100644 samples/aws-specialist-agent/scripts/deploy-with-codebuild.py create mode 100755 samples/aws-specialist-agent/scripts/drawio-export.sh create mode 100644 samples/aws-specialist-agent/scripts/requirements.txt create mode 100644 samples/aws-specialist-agent/scripts/utils.py create mode 100644 samples/aws-specialist-agent/scripts/vendor-skills.py create mode 100644 samples/aws-specialist-agent/skills-lock.json create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/LICENSE create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/NOTICE create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/README.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/agentcore-credentials-and-security.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/agentcore-gateway.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/agentcore-memory-observability.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/agentcore-registry-evaluations.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/agentcore-runtime-container-build.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/agentcore-runtime.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/agents-and-action-groups.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/cost-tracking.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/guardrails.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/knowledge-bases-retrieval.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/knowledge-bases-setup.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/model-invocation.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/model-migration.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/model-selection-guide.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/prompt-caching.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/prompt-engineering-by-model.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/quota-health.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/sdk-converse-api-python.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/amazon-bedrock/references/sdk-converse-api-typescript.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/ai.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/auth-backend.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/auth-mobile.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/auth-web.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/data-backend.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/data-mobile.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/data-web.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/deployment.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/functions-and-api.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/geo-pubsub-cdk.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/scaffolding.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/storage-backend.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/storage-mobile.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-amplify/references/storage-web.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/budgets.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/cost-audit.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/cost-explorer.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/cost-optimization-hub.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/cur-athena.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/deterministic-calculations.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/ebs-optimization.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/ec2-rightsizing.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/free-tier.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/lambda-optimization.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/pricing-lookup.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/rds-optimization.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/reserved-instances.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/savings-plans.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-billing-and-cost-management/references/service-optimization.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cdk/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cdk/references/bootstrap-and-project-setup.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cdk/references/compliance-and-drift.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cdk/references/construct-patterns.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cdk/references/import-and-migrate.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cdk/references/refactor-and-prevent-replacement.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cdk/references/troubleshooting-credentials.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cdk/references/troubleshooting-deployment.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cdk/references/troubleshooting-synth.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cdk/references/v1-to-v2-migration.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cleanrooms/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cleanrooms/references/custom-model-logging-debugging.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cleanrooms/references/permission-debugging.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cloudformation/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cloudformation/references/author-cloudformation-best-practices.script.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cloudformation/references/check-cloudformation-template-compliance.script.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cloudformation/references/cloudformation-pre-deploy-validation.script.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cloudformation/references/lookup-resource-properties.script.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cloudformation/references/troubleshoot-deployment.script.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-cloudformation/references/validate-cloudformation-template.script.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-containers/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-containers/references/app-runner-guide.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-containers/references/ecr-repository-management.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-containers/references/ecs-exec-debugging.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-containers/references/ecs-infrastructure-patterns.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-containers/references/ecs-logging-and-firelens.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-containers/references/ecs-troubleshooting-guide.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-containers/references/fargate-service-deployment.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-containers/references/fargate-spot.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-containers/references/service-scaling-and-updates.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-containers/references/task-definition-authoring.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-iam/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-messaging-and-streaming/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-observability/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-observability/assets/alarm-template.ts create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-observability/assets/otel-config.yaml create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-observability/references/alarms.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-observability/references/cloudtrail.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-observability/references/dashboards.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-observability/references/log-insights.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-observability/references/metrics.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-observability/references/synthetics.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-observability/references/tracing.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-observability/references/troubleshooting.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/references/clients.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/references/credentials.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/references/dynamodb.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/references/effective-practices.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/references/error-handling.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/references/lambda.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/references/performance.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/references/s3.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/references/schemas.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/references/sigv4a.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-js-v3-usage/references/typescript.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-python-usage/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-python-usage/references/configuration.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-python-usage/references/credentials.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-python-usage/references/dynamodb.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-python-usage/references/error-handling.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-python-usage/references/pagination.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-python-usage/references/s3.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-python-usage/references/waiters.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-sdk-swift-usage/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-serverless/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-serverless/assets/powertools-handler.py create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-serverless/references/api-gateway.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-serverless/references/architecture.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-serverless/references/concurrency.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-serverless/references/deployment.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-serverless/references/event-sources.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-serverless/references/lambda.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-serverless/references/orchestration.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-serverless/references/production.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-serverless/references/troubleshooting.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-transform/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-transform/references/cli-reference.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-transform/references/multi-transformation.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-transform/references/remote-execution.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-transform/references/repo-analysis.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-transform/references/results-synthesis.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-transform/references/single-transformation.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/aws-transform/references/troubleshooting.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/configuring-vpc-endpoints-for-private-aws-service-access/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/configuring-vpc-endpoints-for-private-aws-service-access/references/configure-vpc-endpoints-for-private-aws-service-access.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-lambda-to-api-gateway/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-lambda-to-api-gateway/references/lambda-gateway-api.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-lambda-to-dynamodb/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-lambda-to-dynamodb/references/lambda-dynamodb-connection.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-to-data-source/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-to-data-source/references/bigquery-setup.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-to-data-source/references/credential-security.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-to-data-source/references/discovery.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-to-data-source/references/jdbc-setup.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-to-data-source/references/network-setup.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-to-data-source/references/snowflake-setup.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-to-data-source/references/troubleshooting.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-vpcs-with-peering/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/connecting-vpcs-with-peering/references/vpc-peering-connection.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-amazon-aurora-db-cluster-with-instances/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-amazon-aurora-db-cluster-with-instances/references/create-amazon-aurora-db-cluster-with-instances.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-api-gateway-stage/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-api-gateway-stage/references/create-api-gateway-stage.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-data-lake-table/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-data-lake-table/references/access-control.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-data-lake-table/references/athena-ddl-path.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-data-lake-table/references/best-practices.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-data-lake-table/references/table-creation-glue-etl.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-ec2-image-builder-pipeline/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-ec2-image-builder-pipeline/references/ec2-image-builder-pipeline.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-production-vpc-multi-az/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-production-vpc-multi-az/references/create-production-vpc-multi-az.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-secrets-using-best-practices/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/creating-secrets-using-best-practices/references/create-secrets-using-best-practices.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/debugging-lambda-timeouts/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/debugging-lambda-timeouts/references/lambda-timeout-debugging.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/enabling-lambda-vpc-internet-access/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/enabling-lambda-vpc-internet-access/references/lambda-vpc-internet-access.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/exploring-data-catalog/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/exploring-data-catalog/references/discovery-checklist.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/exporting-rds-to-s3/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/exporting-rds-to-s3/references/export-rds-to-s3.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/finding-data-lake-assets/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/finding-data-lake-assets/references/search-strategy.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/athena-loading.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/bigquery-ingest.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/catalog-migration.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/ctas-patterns.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/data-quality-validation.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/dynamodb-ingest.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/error-handling.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/format-specific-loading.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/glue-etl-migration.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/glue-job-config.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/glue-job-scripts.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/iceberg-catalog-config-and-usage.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/incremental-loading.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/jdbc-ingest.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/jdbc-performance.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/jdbc-schema-discovery.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/local-upload.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/migration-troubleshooting.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/migration-validation.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/s3-files.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/schema-evolution.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/snowflake-ingest.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/testing-and-scheduling.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/type-transformations.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/ingesting-into-data-lake/references/upload-options.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/launching-ec2-instance-with-best-practices/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/launching-ec2-instance-with-best-practices/references/launch-ec2-instance-with-best-practices.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/querying-data-lake/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/querying-data-lake/references/query-patterns.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/querying-data-lake/references/workgroup-selection.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/routing-traffic-with-route53-and-cloudfront/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/routing-traffic-with-route53-and-cloudfront/references/route53-cloudfront-routing.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/securing-s3-buckets/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/securing-s3-buckets/references/audit-checklist.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/securing-s3-buckets/references/encryption.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/securing-s3-buckets/references/iam-permissions.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/securing-s3-buckets/references/remediation.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/securing-s3-buckets/references/workflows.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/setting-up-cloudtrail-multi-region/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/setting-up-cloudtrail-multi-region/references/cloudtrail-multi-region-setup.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/setting-up-cloudwatch-alarm-notifications/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/setting-up-cloudwatch-alarm-notifications/references/setup-cloudwatch-alarm-notifications.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/setting-up-ec2-instance-profiles/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/setting-up-ec2-instance-profiles/references/ec2-instance-profile-setup.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/storing-and-querying-vectors/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/storing-and-querying-vectors/references/limits-and-patterns.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/storing-and-querying-vectors/references/metadata-filtering.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/troubleshooting-application-failures/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/troubleshooting-application-failures/references/application-failure-troubleshooting.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/troubleshooting-efs/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/agent-toolkit-for-aws/troubleshooting-s3-files/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/aws-specialist-agent/README.md create mode 100644 samples/aws-specialist-agent/skills/aws-specialist-agent/fast-project-guide/SKILL.md create mode 100644 samples/aws-specialist-agent/skills/aws-specialist-agent/fast-project-guide/references/architecture.md create mode 100644 samples/aws-specialist-agent/skills/aws-specialist-agent/fast-project-guide/references/configuration.md create mode 100644 samples/aws-specialist-agent/skills/aws-specialist-agent/fast-project-guide/references/demo-features.md create mode 100644 samples/aws-specialist-agent/skills/aws-specialist-agent/fast-project-guide/references/overview.md create mode 100644 samples/aws-specialist-agent/test-scripts/README.md create mode 100644 samples/aws-specialist-agent/test-scripts/requirements.txt create mode 100755 samples/aws-specialist-agent/test-scripts/test-agent.py create mode 100644 samples/aws-specialist-agent/test-scripts/test-aws-mcp-call.py create mode 100755 samples/aws-specialist-agent/test-scripts/test-feedback-api.py create mode 100755 samples/aws-specialist-agent/test-scripts/test-gateway.py create mode 100644 samples/aws-specialist-agent/test-scripts/test-ltm-mcp.py create mode 100755 samples/aws-specialist-agent/test-scripts/test-memory.py create mode 100644 samples/aws-specialist-agent/test-scripts/test-runtime-vpc-e2e.py create mode 100644 samples/aws-specialist-agent/test-scripts/test-skills-e2e.py create mode 100644 samples/aws-specialist-agent/test-scripts/test-strands-mcp.py create mode 100644 samples/aws-specialist-agent/test-scripts/test-web-search.py create mode 100644 samples/aws-specialist-agent/tests/README.md create mode 100644 samples/aws-specialist-agent/tests/__init__.py create mode 100644 samples/aws-specialist-agent/tests/conftest.py create mode 100644 samples/aws-specialist-agent/tests/integration/__init__.py create mode 100644 samples/aws-specialist-agent/tests/pytest.ini create mode 100644 samples/aws-specialist-agent/tests/unit/__init.py create mode 100644 samples/aws-specialist-agent/tests/unit/test_basic_agent_warmup.py create mode 100644 samples/aws-specialist-agent/tests/unit/test_build_project_guide.py create mode 100644 samples/aws-specialist-agent/tests/unit/test_ltm_mcp_server.py create mode 100644 samples/aws-specialist-agent/tests/unit/test_models.py create mode 100644 samples/aws-specialist-agent/tests/unit/test_strands_mcp_server.py create mode 100644 samples/aws-specialist-agent/vibe-context/AGENTS.md create mode 100644 samples/aws-specialist-agent/vibe-context/coding-conventions.md create mode 100644 samples/aws-specialist-agent/vibe-context/development-best-practices.md diff --git a/README.md b/README.md index 7dd098e..35057c6 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ While [FAST](https://github.com/awslabs/fullstack-solution-template-for-agentcor | [CopilotKit Generative UI](#copilotkit-generative-ui) | Generative UI, shared state, and human-in-the-loop interactions via CopilotKit | | [LLM Council](#llm-council) | An implementation of "Council of LLMs" pattern on AWS. Builds consensus among multiple diverse LLMs.| | [Dual Monitoring System](#dual-monitoring-system) | Dual-layer monitoring for agentic solutions using AgentCore Evaluations and AWS DevOps Agent | +| [AgentCore AWS Specialist Agent](#agentcore-aws-specialist-agent) | AWS specialist chat agent with Gateway MCP tools, long-term memory, web search, Skills on Runtime, and a NAT-free VPC | @@ -70,6 +71,17 @@ While [FAST](https://github.com/awslabs/fullstack-solution-template-for-agentcor ![Architecture Diagram](samples/dual-monitoring-system/docs/architecture-diagram/Dual-monitoring-20260407.jpg) +### [AgentCore AWS Specialist Agent](samples/aws-specialist-agent/) +**Description**: An AWS specialist chat agent showcased at the AgentCore booth at AWS Summit Japan 2026. The agent reasons about AWS, calls AWS APIs and managed tools through AgentCore Gateway, searches the web, executes code, and remembers facts across sessions. + +**Built on FAST**: v0.4.1 + +**Key Differences from FAST**: Adds selectable models (Claude and OpenAI GPT on Bedrock via a CDK model registry), AgentCore Memory long-term memory with an LTM-listing MCP server, the Amazon-managed Web Search connector, a chat-history sidebar (API Gateway + Lambda + DynamoDB), a fully closed NAT-free VPC using only VPC endpoints, AWS Skills mounted from S3 Files at `/mnt/skills`, speculative pre-warming to cut cold-start latency, and multi-MCP-server management gated per user department by Cedar ABAC. + +**Use Case**: Building production-oriented specialist agents that need fine-grained per-user tool authorization, private networking, long-term memory, and multiple MCP tool sources on AgentCore. + +![AgentCore AWS Specialist Agent UI](samples/aws-specialist-agent/docs/img/screenshot.png) + >SDK: config_id, execution_status + SDK-->>You: Config created ✓ + + loop Every sampled session + AC->>CW: Read agent runtime logs + AC->>AC: Run LLM-as-judge evaluators + AC->>CW: Write evaluation results + end + + You->>SDK: list_online_configs() + SDK->>AC: ListOnlineEvaluationConfigs + AC-->>You: configs[] +``` + +### オンライン評価設定の作成 + +特定の環境でエージェントの品質を継続的にモニタリングしたい場合に使用します。 + +> **補足:** `auto_create_execution_role=True` が IAM ロールの自動作成を発動させます。SDK は `AgentCoreEvalsSDK-{region}-{hash}` という名前のロールを作成し、エージェントの CloudWatch ログを読み取り、LLM-as-judge スコアリングのために Bedrock モデルを呼び出す権限を付与します。 + +```python +from bedrock_agentcore_starter_toolkit import Evaluation + +eval_client = Evaluation(region="us-east-1") + +# agent_id はランタイム ARN の最後のセグメント +# 例: "arn:aws:bedrock-agentcore:us-east-1:123456789:runtime/my-agent-abc123" の "my-agent-abc123" +agent_id = "my-agent-abc123" # 実際のエージェント ID に置き換えてください + +response = eval_client.create_online_config( + agent_id=agent_id, + config_name="production_eval", + sampling_rate=10.0, # セッションの 10% を評価 + evaluator_list=[ + "Builtin.Helpfulness", + "Builtin.Correctness", + "Builtin.GoalSuccessRate", + ], + config_description="Production evaluation with core metrics", + auto_create_execution_role=True, # IAM ロールを自動作成 + enable_on_create=True, # 即座に評価を開始 +) + +config_id = response["onlineEvaluationConfigId"] # メトリクスを照会する際に必要なので保存しておく +print(f"Created config: {config_id}") +print(f"Status: {response['executionStatus']}") +``` + +> **タイミング:** 設定の作成は通常 10〜30 秒で完了します。エージェントが次のセッションを処理した 2〜5 分後から、評価結果が CloudWatch に表示され始めます。 + +### オンライン評価の有効化 / 無効化 + +設定を失わずに評価を一時的に停止したい場合 (例: メンテナンスウィンドウやコスト管理時) に使用します。 + +```python +# 評価を無効化 (削除せずに一時停止) +eval_client.update_online_config( + config_id="your-config-id", # 実際の config ID に置き換えてください + execution_status="DISABLED" +) + +# 評価を再度有効化 +eval_client.update_online_config( + config_id="your-config-id", + execution_status="ENABLED" +) +``` + +### サンプリングレートの更新 + +設定を再作成せずにコストとカバレッジのトレードオフを調整したい場合に使用します。 + +```python +eval_client.update_online_config( + config_id="your-config-id", + sampling_rate=5.0 # コスト削減のために 5% に減らす +) +``` + +### すべての設定の一覧表示 + +```python +configs = eval_client.list_online_configs() +for config in configs.get("onlineEvaluationConfigs", []): + print(f"{config['onlineEvaluationConfigName']}: {config['executionStatus']} " + f"(sampling: {config.get('samplingRate', 'N/A')}%)") +``` + +### 設定の削除 + +```python +eval_client.delete_online_config(config_id="your-config-id") +``` + +--- + +## オンデマンド評価 + +オンデマンド評価では、特定のセッションを即座に評価し、結果を同期的に取得できます。SDK は AgentCore Observability からセッションのトレースを自動的に取得します。 + +```mermaid +sequenceDiagram + participant You + participant SDK as Evaluation SDK + participant Obs as Observability + participant AC as AgentCore + + You->>SDK: eval_client.run(agent_id, session_id, evaluators) + SDK->>Obs: Retrieve session traces & spans + Obs-->>SDK: trace_data + SDK->>AC: Evaluate(spans, evaluator_id) + AC->>AC: Run LLM-as-judge + AC-->>SDK: score, label, explanation + SDK-->>You: Results (synchronous) +``` + +### 単一セッションの評価 + +特定の会話をスポットチェックしたり、ユーザーから報告された問題をデバッグしたり、プロンプト変更後のエージェントの動作を検証したりする際に使用します。 + +> **タイミング:** 各評価器はセッションあたり 5〜15 秒かかります。1 つのセッションに対して 3 つの評価器を実行する場合、通常 15〜45 秒で完了します。 + +```python +from bedrock_agentcore_starter_toolkit import Evaluation + +eval_client = Evaluation(region="us-east-1") + +agent_id = "my-agent-abc123" # 実際のエージェント ID に置き換えてください +session_id = "session-456" # 実際のセッション ID に置き換えてください + +# 1 つ以上の評価器をセッションに対して実行 +results = eval_client.run( + agent_id=agent_id, + session_id=session_id, + evaluators=["Builtin.Helpfulness", "Builtin.Correctness"] +) + +for result in results.results: + print(f"Evaluator: {result.evaluator_name}") + print(f" Score: {result.value:.2f}") + print(f" Label: {result.label}") + print(f" Explanation: {result.explanation}") + if hasattr(result, 'token_usage') and result.token_usage: + print(f" Tokens: {result.token_usage}") + print() +``` + +### 低レベル boto3 API による評価 + +きめ細かい制御が必要な場合 (たとえば、セッション全体ではなく特定のスパンを評価する場合や、すでにスパンを自分で取得している場合) に使用します。 + +```python +import boto3 + +bedrock_agentcore = boto3.client("bedrock-agentcore") + +response = bedrock_agentcore.evaluate( + evaluatorId="Builtin.Helpfulness", + evaluationInput={ + "sessionSpans": [ + { + "traceId": "abc123", + "spanId": "def456", + "name": "agent_response", + "startTimeUnixNano": 1708128000000000000, + "endTimeUnixNano": 1708128001000000000, + "attributes": { + "session.id": "session-456" + }, + "status": {"code": "OK"}, + "scope": {"name": "bedrock-agentcore"} + } + ] + }, + evaluationTarget={ + "traceIds": ["abc123"], # オプション: 特定のトレースに範囲を限定 + "spanIds": ["def456"] # オプション: 特定のスパンに範囲を限定 + } +) + +for result in response.get("evaluationResults", []): + print(f"Score: {result['value']}, Label: {result['label']}") + print(f"Explanation: {result['explanation']}") +``` + +### バッチ評価 (複数セッション) + +プロンプト変更やデプロイ後に一連のセッションを評価し、品質の前後比較を行う場合に使用します。 + +> **タイミング:** バッチ評価は逐次実行されます。評価器ごと、セッションごとに約 10 秒かかります。10 セッションを 2 つの評価器で評価する場合、おおよそ 3〜4 分かかります。 + +```python +agent_id = "my-agent-abc123" +session_ids = ["session-001", "session-002", "session-003"] # 実際の ID に置き換えてください +evaluators = ["Builtin.Helpfulness", "Builtin.Correctness"] + +all_results = [] +for session_id in session_ids: + try: + results = eval_client.run( + agent_id=agent_id, + session_id=session_id, + evaluators=evaluators + ) + all_results.append({ + "session_id": session_id, + "results": [ + { + "evaluator": r.evaluator_name, + "score": r.value, + "label": r.label, + "explanation": r.explanation + } + for r in results.results + ] + }) + except Exception as e: + print(f"Failed to evaluate {session_id}: {e}") + +print(f"Evaluated {len(all_results)} sessions successfully") +``` + +--- + +## 組み込み評価器リファレンス + +AgentCore は 3 つの評価レベルにまたがる 15 の組み込み評価器を提供します。 + +### 評価レベルの判断ツリー + +| 目的 | 使用するレベル | 理由 | +| -------------------------- | -------------- | ------------------------------------ | +| 全体的なタスク完了度を測定 | SESSION | 会話全体をエンドツーエンドで評価 | +| 個々の応答品質を評価 | TRACE | エージェントの各ターンを独立して評価 | +| ツール使用の正しさを検証 | TOOL_CALL | 特定のツール呼び出しを評価 | + +### 品質と関連性 (TRACE レベル) + +| 評価器 ID | 測定内容 | +| ------------------------------ | ---------------------------------------------------------------- | +| `Builtin.Helpfulness` | ユーザーの観点から見た応答の有用性と価値 | +| `Builtin.Correctness` | 応答に含まれる情報が事実として正確かどうか | +| `Builtin.Faithfulness` | 応答が提供されたコンテキストに忠実で、ハルシネーションがないか | +| `Builtin.Coherence` | 応答の論理的な流れと一貫性 | +| `Builtin.Conciseness` | 応答が不必要な情報なく適切に簡潔であるか | +| `Builtin.InstructionFollowing` | 応答がユーザー入力内のすべての明示的な指示に従っているか | +| `Builtin.ContextRelevance` | 取得されたコンテキストがユーザーのクエリにどれだけ関連しているか | +| `Builtin.ResponseRelevance` | 応答が特定の質問やリクエストにどれだけ的確に対応しているか | + +### 安全性 (TRACE レベル) + +| 評価器 ID | 測定内容 | +| ----------------------- | ------------------------------------------------------------ | +| `Builtin.Harmfulness` | 応答内に潜在的に有害または安全でないコンテンツがあるかを検出 | +| `Builtin.Maliciousness` | 悪意のある意図やユーザーを操作しようとする試みを特定 | +| `Builtin.Stereotyping` | 応答内のステレオタイプや偏った表現を検出 | +| `Builtin.Refusal` | エージェントが不適切なリクエストを適切に拒否したかを追跡 | + +### ツール使用 (TOOL_CALL レベル) + +| 評価器 ID | 測定内容 | +| ------------------------------- | ---------------------------------------------------- | +| `Builtin.ToolSelectionAccuracy` | エージェントがタスクに対して正しいツールを選択したか | +| `Builtin.ToolParameterAccuracy` | エージェントが正しいパラメータでツールを使用したか | + +### セッションレベル + +| 評価器 ID | 測定内容 | +| ------------------------- | -------------------------------------------------------------- | +| `Builtin.GoalSuccessRate` | エージェントが会話内のすべてのユーザー目標を成功裏に完了したか | + +### 評価器選択ガイド + +ユースケースに基づいて有効化する評価器を決定するためのマトリックスです。 + +| ユースケース | 推奨される評価器 | +| ------------------------------ | ------------------------------------------------------------------- | +| 汎用チャットボット | `Helpfulness`、`Correctness`、`GoalSuccessRate` | +| RAG / 知識検索 | `Faithfulness`、`ContextRelevance`、`Correctness` | +| ツールを使うエージェント | `ToolSelectionAccuracy`、`ToolParameterAccuracy`、`GoalSuccessRate` | +| 安全性が重要なアプリケーション | `Harmfulness`、`Maliciousness`、`Stereotyping`、`Refusal` | +| 指示追従タスク | `InstructionFollowing`、`Coherence`、`Conciseness` | + +### プログラムから利用可能な評価器を一覧表示 + +```python +evaluators = eval_client.list_evaluators() +for evaluator in evaluators.get("evaluatorSummaries", []): + print(f"{evaluator['evaluatorId']}: {evaluator.get('evaluatorName', '')}") +``` + +--- + +## カスタム評価器 + +組み込み評価器がドメイン固有の品質基準 (たとえば財務的正確性、医療安全性、ブランドボイスへの準拠など) をカバーしていない場合に、カスタム評価器を使用します。 + +### プレースホルダー リファレンス + +各評価レベルでは、実際のトレースデータに置き換えられる固定のプレースホルダー (シングルブレース) のセットがサポートされています。 + +| レベル | プレースホルダー | 説明 | +| --------- | ------------------- | -------------------------------------------------------------------------- | +| SESSION | `{context}` | すべてのターンにわたるユーザープロンプト、アシスタント応答、ツール呼び出し | +| SESSION | `{available_tools}` | ID、パラメータ、説明を含む利用可能なツール呼び出し | +| TRACE | `{context}` | 過去のターン + 現在のターンのユーザープロンプトとツール呼び出し | +| TRACE | `{assistant_turn}` | 現在のターンのアシスタント応答 | +| TOOL_CALL | `{context}` | 過去のターン + 現在のターンのユーザープロンプトと過去のツール呼び出し | +| TOOL_CALL | `{tool_turn}` | 評価対象のツール呼び出し | +| TOOL_CALL | `{available_tools}` | ID、パラメータ、説明を含む利用可能なツール呼び出し | + +> **重要:** ダブルブレース `{{placeholder}}` ではなく、シングルブレース `{placeholder}` を使用してください。命令文には少なくとも 1 つのプレースホルダーを含める必要があります。 + +### カスタム評価器の作成 (AWS SDK) + +`create_evaluator` API は、命令文、評価スケール、モデル設定を含む `llmAsAJudge` を持つネストされた `evaluatorConfig` 構造を使用します。 + +```python +import boto3 + +control_client = boto3.client("bedrock-agentcore-control") + +response = control_client.create_evaluator( + evaluatorName="domain_accuracy", + description="Evaluates domain-specific accuracy for financial queries", + level="TRACE", + evaluatorConfig={ + "llmAsAJudge": { + "instructions": ( + "You are evaluating the domain-specific accuracy of the assistant's response " + "in financial contexts. Consider:\n" + "1. Are financial terms used correctly?\n" + "2. Are calculations accurate?\n" + "3. Are regulatory references correct?\n\n" + "Context: {context}\n" + "Candidate Response: {assistant_turn}" + ), + "ratingScale": { + "numerical": [ + { + "value": 1.0, + "label": "Very Good", + "definition": "Completely accurate, all facts and calculations correct" + }, + { + "value": 0.75, + "label": "Good", + "definition": "Mostly accurate with minor issues" + }, + { + "value": 0.5, + "label": "OK", + "definition": "Partially correct with notable errors" + }, + { + "value": 0.25, + "label": "Poor", + "definition": "Significant errors or misconceptions" + }, + { + "value": 0.0, + "label": "Very Poor", + "definition": "Completely incorrect or irrelevant" + } + ] + }, + "modelConfig": { + "bedrockEvaluatorModelConfig": { + "modelId": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "inferenceConfig": { + "maxTokens": 500, + "temperature": 1.0 + } + } + } + } + } +) + +evaluator_arn = response["evaluatorArn"] +evaluator_id = evaluator_arn.split("/")[-1] +print(f"Created custom evaluator: {evaluator_id}") +``` + +### カスタム評価器の作成 (Starter Toolkit SDK) + +```python +import json +from bedrock_agentcore_starter_toolkit import Evaluation + +eval_client = Evaluation(region="us-east-1") + +# JSON ファイルから設定を読み込む (設定フォーマットは下記参照) +with open("custom_evaluator_config.json") as f: + evaluator_config = json.load(f) + +custom_evaluator = eval_client.create_evaluator( + name="domain_accuracy", + level="TRACE", + description="Evaluates domain-specific accuracy for financial queries", + config=evaluator_config +) +``` + +### カスタム評価器の Config JSON フォーマット + +Starter Toolkit SDK または AWS CLI で利用するため、以下を `custom_evaluator_config.json` として保存します。 + +```json +{ + "llmAsAJudge": { + "modelConfig": { + "bedrockEvaluatorModelConfig": { + "modelId": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "inferenceConfig": { + "maxTokens": 500, + "temperature": 1.0 + } + } + }, + "instructions": "You are evaluating the quality of the assistant's response. Context: {context}\nCandidate Response: {assistant_turn}", + "ratingScale": { + "numerical": [ + { "value": 1.0, "label": "Very Good", "definition": "Completely accurate" }, + { "value": 0.75, "label": "Good", "definition": "Mostly accurate with minor issues" }, + { "value": 0.5, "label": "OK", "definition": "Partially correct" }, + { "value": 0.25, "label": "Poor", "definition": "Significant errors" }, + { "value": 0.0, "label": "Very Poor", "definition": "Completely incorrect" } + ] + } + } +} +``` + +### カスタム評価器をオンライン設定に追加 + +評価器を作成した後、それをオンライン評価設定に追加します。 + +```python +import boto3 + +control_client = boto3.client("bedrock-agentcore-control") + +# 現在の評価器を取得 +config = control_client.get_online_evaluation_config( + onlineEvaluationConfigId="your-config-id" +) +current_evaluators = [e["evaluatorId"] for e in config.get("evaluators", [])] + +# カスタム評価器を追加 +current_evaluators.append("domain_accuracy-XXXXXXXXXX") # create_evaluator から返された ID を使用 + +control_client.update_online_evaluation_config( + onlineEvaluationConfigId="your-config-id", + evaluators=[{"evaluatorId": eid} for eid in current_evaluators] +) +``` + +カスタム評価器は、組み込み評価器と同様に、オンライン評価とオンデマンド評価の両方で使用できます。 + +> **補足:** サービスは `reason` および `score` 出力フィールドを強制する標準化プロンプトを命令文に自動的に追加します。評価器の命令文には出力フォーマットの指示を含めないでください。 + +--- + +## 評価結果とフォーマット + +### オンライン評価の結果 (CloudWatch Logs) + +オンライン評価結果は、次の場所の CloudWatch Logs に書き込まれます。 + +``` +/aws/bedrock-agentcore/evaluations/results/{config-id} +``` + +> **補足:** ロググループ名には設定名ではなく config ID (例: `a1b2c3d4-...`) が使用されます。config ID は `create_online_config()` のレスポンスまたは `list_online_configs()` から取得できます。 + +各ログイベントには、OpenTelemetry スタイルの属性を持つ JSON オブジェクトが含まれます。 + +```json +{ + "attributes": { + "gen_ai.evaluation.name": "Builtin.Helpfulness", + "gen_ai.evaluation.score.value": 0.83, + "gen_ai.evaluation.score.label": "Very Helpful", + "gen_ai.evaluation.explanation": "The response directly addresses the user's question with relevant and actionable information..." + }, + "traceId": "abc123def456", // pragma: allowlist secret (example placeholder, not a real secret) + "spanId": "789ghi", + "sessionId": "session-456", + "timestamp": "2026-02-17T00:42:42.086Z" +} +``` + +### 主要フィールド + +| フィールド | 説明 | +| ------------------------------------------ | --------------------------------------- | +| `attributes.gen_ai.evaluation.name` | 評価器 ID (例: `Builtin.Helpfulness`) | +| `attributes.gen_ai.evaluation.score.value` | 0.0 から 1.0 の数値スコア | +| `attributes.gen_ai.evaluation.score.label` | 人間が読めるラベル (例: "Very Helpful") | +| `attributes.gen_ai.evaluation.explanation` | スコアの詳細な根拠 | +| `traceId` | 評価対象のトレース | +| `spanId` | 評価対象の特定のスパン | +| `sessionId` | エージェントのセッション ID | + +### オンデマンド評価の結果 + +オンデマンド結果は、API レスポンスとして同期的に返されます。 + +```json +{ + "evaluatorId": "Builtin.Helpfulness", + "evaluatorName": "Builtin.Helpfulness", + "value": 0.83, + "label": "Very Helpful", + "explanation": "The response directly addresses...", + "tokenUsage": { + "inputTokens": 958, + "outputTokens": 211, + "totalTokens": 1169 + } +} +``` + +--- + +## 結果のダウンロードとクエリ + +### CloudWatch から結果をクエリ (Python) + +分析、エクスポート、ダッシュボード表示のために評価結果を取得する際に使用します。 + +> **CloudWatch Logs クォータ:** `FilterLogEvents` は、リージョンごとアカウントごとに 1 秒あたり 5 リクエストに制限されています。大規模な結果セットの場合は、ページネーション間に遅延を追加するか、より高速なクエリのために CloudWatch Logs Insights を使用してください。 + +```python +import boto3 +import json +from datetime import datetime, timedelta + +cloudwatch_logs = boto3.client("logs") + +config_id = "your-config-id" # create/list で取得した実際の config ID に置き換えてください +log_group = f"/aws/bedrock-agentcore/evaluations/results/{config_id}" + +end_time = datetime.utcnow() +start_time = end_time - timedelta(days=7) + +results = [] +next_token = None + +while True: + params = { + "logGroupName": log_group, + "startTime": int(start_time.timestamp() * 1000), + "endTime": int(end_time.timestamp() * 1000), + "limit": 10000, + } + if next_token: + params["nextToken"] = next_token + + response = cloudwatch_logs.filter_log_events(**params) + + for event in response.get("events", []): + try: + log_data = json.loads(event["message"]) + results.append(log_data) + except json.JSONDecodeError: + continue + + next_token = response.get("nextToken") + if not next_token: + break + +print(f"Retrieved {len(results)} evaluation results") +``` + +### 結果を CSV にエクスポート + +結果をステークホルダーと共有したり、表計算ツールにインポートしたりする際に使用します。 + +```python +import csv + +with open("evaluation_results.csv", "w", newline="") as f: + writer = csv.writer(f) + writer.writerow(["session_id", "trace_id", "evaluator", "score", "label", "explanation"]) + + for result in results: + attrs = result.get("attributes", {}) + writer.writerow([ + result.get("sessionId", ""), + result.get("traceId", ""), + attrs.get("gen_ai.evaluation.name", ""), + attrs.get("gen_ai.evaluation.score.value", ""), + attrs.get("gen_ai.evaluation.score.label", ""), + attrs.get("gen_ai.evaluation.explanation", ""), + ]) +``` + +### 結果から集計メトリクスを計算 + +ダッシュボードやレポート用のサマリー統計を構築する際に使用します。 + +```python +from collections import defaultdict + +evaluator_metrics = defaultdict(lambda: {"count": 0, "total_score": 0.0}) + +for result in results: + attrs = result.get("attributes", {}) + evaluator = attrs.get("gen_ai.evaluation.name", "unknown") + score = attrs.get("gen_ai.evaluation.score.value", 0.0) + + evaluator_metrics[evaluator]["count"] += 1 + evaluator_metrics[evaluator]["total_score"] += score + +# 評価器ごとの平均を出力 +for evaluator, metrics in evaluator_metrics.items(): + avg = metrics["total_score"] / metrics["count"] if metrics["count"] > 0 else 0 + print(f"{evaluator}: avg={avg:.2f} ({metrics['count']} evaluations)") +``` + +### スコア分布 + +スコアデータの形状を理解するために使用します。スコアの大半が高い側に集中しているのか、低スコアのロングテールがあるのかを把握できます。 + +```python +def compute_score_distribution(results): + """標準的なビンに沿ってスコア分布を計算する。""" + bins = { + "0.0-0.2": 0, + "0.2-0.4": 0, + "0.4-0.6": 0, + "0.6-0.8": 0, + "0.8-1.0": 0, + } + + for result in results: + score = result.get("attributes", {}).get("gen_ai.evaluation.score.value", 0.0) + if score < 0.2: + bins["0.0-0.2"] += 1 + elif score < 0.4: + bins["0.2-0.4"] += 1 + elif score < 0.6: + bins["0.4-0.6"] += 1 + elif score < 0.8: + bins["0.6-0.8"] += 1 + else: + bins["0.8-1.0"] += 1 + + return bins + +distribution = compute_score_distribution(results) +for range_label, count in distribution.items(): + print(f" {range_label}: {count}") +``` + +--- + +## AI 駆動の分析 + +評価結果が得られたら、Amazon Bedrock の基盤モデルを使用して、低スコア評価のパターンを自動的に分析し、システムプロンプトの改善案を生成できます。これにより、フィードバックループが完成します。 + +``` +┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ +│ Evaluate │────▶│ Identify │────▶│ Improve │────▶│ Deploy & │ +│ Agent │ │ Patterns │ │ Prompt │ │ Re-evaluate│ +└─────────────┘ └─────────────┘ └─────────────┘ └──────┬──────┘ + ▲ │ + └───────────────────────────────────────────────────────────┘ + Continuous improvement loop +``` + +```mermaid +sequenceDiagram + participant You + participant CW as CloudWatch Logs + participant FM as Foundation Model (Bedrock) + + You->>CW: Query low-scoring evaluation results + CW-->>You: Evaluation logs (scores, explanations) + You->>FM: Analyze patterns in low-scoring results + FM-->>You: Patterns, summary, recommendations + You->>FM: Generate improved prompt based on patterns + FM-->>You: Improved prompt + change explanations + You->>You: Review, apply, and re-evaluate +``` + +### パターン分析 + +評価結果が蓄積され、特定の評価器でなぜ低スコアになっているのかを理解したい場合に使用します。 + +> **タイミング:** 約 50 件の評価結果に対するパターン分析は、モデルと入力サイズに応じて通常 15〜30 秒かかります。 + +```python +import boto3 +import json + +bedrock_runtime = boto3.client("bedrock-runtime") + +def analyze_evaluation_patterns(low_scoring_results: list[dict]) -> dict: + """ + 低スコア評価結果を分析し、失敗パターンを特定する。 + + Args: + low_scoring_results: CloudWatch から取得した評価結果ログ + (しきい値以下のスコア、例: <= 0.5 にフィルタリング) + + Returns: + パターン、サマリー、推奨事項を含む分析結果 + """ + # モデル用に結果をフォーマット — 評価器名、スコア、説明を含める + formatted = [] + for result in low_scoring_results[:50]: # トークン超過を避けるため制限 + attrs = result.get("attributes", {}) + formatted.append({ + "session_id": attrs.get("session.id", "unknown"), + "evaluator": attrs.get("gen_ai.evaluation.name", "unknown"), + "score": attrs.get("gen_ai.evaluation.score.value", 0.0), + "label": attrs.get("gen_ai.evaluation.score.label", ""), + "explanation": attrs.get("gen_ai.evaluation.explanation", ""), + }) + + system_prompt = """You are an expert at analyzing agent evaluation data to identify +patterns and root causes of poor performance. For each pattern you identify: +1. Describe the pattern clearly +2. Count how frequently it occurs +3. List affected session IDs +4. Provide concrete evidence from the evaluation explanations + +Return JSON: {"patterns": [...], "summary": "...", "recommendations": [...]}""" + + response = bedrock_runtime.invoke_model( + modelId="us.anthropic.claude-sonnet-4-5-20250929-v1:0", + body=json.dumps({ + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 4096, + "system": system_prompt, + "messages": [{"role": "user", "content": f""" +Analyze these {len(formatted)} low-scoring evaluations and identify common patterns: + +{json.dumps(formatted, indent=2)} + +Focus on: which evaluators score low consistently, common issues in explanations, +and actionable patterns across sessions."""}], + "temperature": 0.7, + }), + ) + + response_body = json.loads(response["body"].read()) + analysis_text = response_body["content"][0]["text"] + + # レスポンスから JSON を解析 (markdown のフェンスがある場合は除去) + analysis_text = analysis_text.strip().strip("`").removeprefix("json").strip() + return json.loads(analysis_text) +``` + +### システムプロンプトの改善 + +パターン分析の後、特定された問題に対処するより良いシステムプロンプトを自動的に生成する際に使用します。 + +> **タイミング:** プロンプト改善の生成は、モデルが説明とともに完全な改訂プロンプトを生成するため、通常 20〜60 秒かかります。 + +```python +def generate_prompt_improvement(current_prompt: str, analysis: dict) -> dict: + """ + 失敗パターンの分析に基づいて、改善されたシステムプロンプトを生成する。 + + Args: + current_prompt: エージェントの現在のシステムプロンプト + analysis: analyze_evaluation_patterns() の出力 + + Returns: + improvedPrompt と理由付きの変更リストを含む辞書 + """ + system_prompt = """You are an expert at improving system prompts for AI agents. +Generate specific improvements based on identified failure patterns. +For each change, explain the reasoning and expected impact. + +Return JSON: {"improvedPrompt": "...", "changes": [{"section": "...", +"reasoning": "...", "impact": "..."}]}""" + + # トークン制限内に収めるため、パターンの根拠を切り詰める + analysis_summary = { + "summary": analysis.get("summary", ""), + "patterns": [ + { + "pattern": p["pattern"], + "frequency": p["frequency"], + "evidence": p["evidence"][:500], + } + for p in analysis.get("patterns", [])[:10] + ], + "recommendations": analysis.get("recommendations", [])[:10], + } + + response = bedrock_runtime.invoke_model( + modelId="us.anthropic.claude-sonnet-4-5-20250929-v1:0", + body=json.dumps({ + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 8192, + "system": system_prompt, + "messages": [{"role": "user", "content": f""" +Current System Prompt: +{current_prompt} + +Performance Analysis: +{json.dumps(analysis_summary, indent=2)} + +Generate an improved prompt that addresses these issues."""}], + "temperature": 0.7, + }), + ) + + response_body = json.loads(response["body"].read()) + result_text = response_body["content"][0]["text"] + result_text = result_text.strip().strip("`").removeprefix("json").strip() + return json.loads(result_text) +``` + +### エンドツーエンドのワークフロー + +これらをすべて組み合わせる — 結果のクエリから改善されたプロンプトの生成まで: + +```python +# 1. 低スコアの評価結果をクエリ (「結果のダウンロードとクエリ」を参照) +results = query_evaluation_results("your-config-id", days=30) +low_scoring = [ + r for r in results + if r.get("attributes", {}).get("gen_ai.evaluation.score.value", 1.0) <= 0.5 +] +print(f"Found {len(low_scoring)} low-scoring evaluations") + +# 2. パターン分析 (約 15〜30 秒) +analysis = analyze_evaluation_patterns(low_scoring) +print(f"Identified {len(analysis['patterns'])} patterns") +for pattern in analysis["patterns"]: + print(f" - {pattern['pattern']} (frequency: {pattern['frequency']})") + +# 3. プロンプト改善を生成 (約 20〜60 秒) +current_prompt = "You are a helpful assistant..." # エージェントの現在のプロンプト +improvement = generate_prompt_improvement(current_prompt, analysis) +print(f"\nSuggested {len(improvement['changes'])} changes:") +for change in improvement["changes"]: + print(f" Section: {change['section']}") + print(f" Reasoning: {change['reasoning']}") + print(f" Impact: {change['impact']}\n") + +# 4. 改善されたプロンプトをレビューして適用 +print("Improved prompt:") +print(improvement["improvedPrompt"]) +``` + +--- + +## セッション、トレース、スパンの取得 (Observability) + +`bedrock-agentcore-starter-toolkit` には、AgentCore からセッションデータ (トレースとスパン) を取得する Observability クライアントが含まれています。これは、セッションエクスプローラーやトレースビューアの構築、評価へのデータ投入に役立ちます。 + +### Session / Trace / Span の階層 + +``` +Session (conversation) +├── Trace 1 (user turn) +│ ├── Span: agent_planning (root) +│ ├── Span: tool_call → search_api +│ ├── Span: tool_result ← search_api +│ └── Span: agent_response +├── Trace 2 (user turn) +│ ├── Span: agent_planning (root) +│ └── Span: agent_response +└── Trace 3 (user turn) + ├── Span: agent_planning (root) + ├── Span: tool_call → database_query + ├── Span: tool_result ← database_query + └── Span: agent_response +``` + +### Observability クライアントの初期化 + +```python +from bedrock_agentcore_starter_toolkit import Observability + +agent_id = "my-agent-abc123" # 実際のエージェント ID に置き換えてください +obs_client = Observability(agent_id=agent_id, region="us-east-1") +``` + +### セッションのトレースとスパンの一覧表示 + +特定の会話で何が起こったか — どのツールが呼び出されたか、各ステップにかかった時間、エラーが発生したかどうか — を調査するために使用します。 + +```python +trace_data = obs_client.list(session_id="session-456") # 実際のセッション ID に置き換えてください + +# trace_data.traces → dict: {trace_id: [list of spans]} +# trace_data.spans → すべてのトレースにわたるすべてのスパンのフラットなリスト +# trace_data.start_time → ナノ秒単位のセッション開始時刻 + +print(f"Traces: {len(trace_data.traces)}") +print(f"Total spans: {len(trace_data.spans)}") + +for trace_id, spans in trace_data.traces.items(): + print(f"\nTrace {trace_id}: {len(spans)} spans") + for span in sorted(spans, key=lambda s: s.start_time_unix_nano or 0): + print(f" {span.span_name} ({span.duration_ms}ms) " + f"parent={span.parent_span_id or 'root'}") +``` + +### スパンのプロパティ + +SDK が返す各スパンオブジェクトには、以下の主要なプロパティがあります。 + +| プロパティ | 型 | 説明 | +| ---------------------- | ------------- | -------------------------------------------------- | +| `span_id` | `str` | 一意のスパン識別子 | +| `trace_id` | `str` | 親トレースの識別子 | +| `parent_span_id` | `str \| None` | 親スパン ID (ルートスパンの場合は `None`) | +| `span_name` | `str` | 操作の名前 (例: `"agent_response"`、`"tool_call"`) | +| `start_time_unix_nano` | `int` | エポックからのナノ秒単位の開始時刻 | +| `end_time_unix_nano` | `int` | エポックからのナノ秒単位の終了時刻 | +| `duration_ms` | `float` | ミリ秒単位の継続時間 | +| `status_code` | `str` | ステータス (`"OK"`、`"ERROR"`、`"UNSET"`) | +| `attributes` | `dict` | OpenTelemetry 属性 (モデル ID、トークン数など) | + +### トレースデータを表示用にフォーマット + +このヘルパーを使って、SDK のトレースデータを API レスポンスや UI レンダリングに適した JSON シリアライズ可能な構造に変換します。 + +```python +from datetime import datetime + +def format_session_for_display(trace_data) -> dict: + """SDK のトレースデータを JSON シリアライズ可能な構造にフォーマットする。""" + formatted_traces = [] + + for trace_id, spans in trace_data.traces.items(): + if not spans: + continue + + spans.sort(key=lambda s: s.start_time_unix_nano or 0) + + trace_start = min(s.start_time_unix_nano for s in spans if s.start_time_unix_nano) + trace_end = max(s.end_time_unix_nano for s in spans if s.end_time_unix_nano) + + formatted_traces.append({ + "traceId": trace_id, + "startTime": datetime.fromtimestamp(trace_start / 1e9).isoformat(), + "endTime": datetime.fromtimestamp(trace_end / 1e9).isoformat(), + "durationMs": (trace_end - trace_start) / 1e6, + "spans": [ + { + "spanId": s.span_id, + "traceId": s.trace_id, + "parentSpanId": s.parent_span_id, + "name": s.span_name, + "startTime": datetime.fromtimestamp(s.start_time_unix_nano / 1e9).isoformat(), + "endTime": datetime.fromtimestamp(s.end_time_unix_nano / 1e9).isoformat(), + "durationMs": s.duration_ms, + "status": s.status_code or "UNSET", + "attributes": s.attributes or {}, + } + for s in spans + ], + }) + + formatted_traces.sort(key=lambda t: t["startTime"]) + return { + "traceCount": len(formatted_traces), + "spanCount": len(trace_data.spans), + "traces": formatted_traces, + } +``` + +--- + +## ダッシュボードの構築 + +評価結果と Observability データを利用して、エージェントのパフォーマンスをモニタリングするダッシュボードを構築できます。主要なコンポーネントとデータフローの概要を以下に示します。 + +### アーキテクチャ概要 + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ Dashboard UI │ +│ │ +│ ┌───────────────┐ ┌──────────────┐ ┌────────────────────┐ │ +│ │ Summary Tiles │ │ Score Dist. │ │ Per-Evaluator │ │ +│ │ • Total evals │ │ Chart │ │ Metrics │ │ +│ │ • Avg score │ │ (bar chart) │ │ (color-coded) │ │ +│ │ • Low/High │ │ │ │ │ │ +│ └───────────────┘ └──────────────┘ └────────────────────┘ │ +│ │ +│ ┌──────────────────────────┐ ┌───────────────────────────┐ │ +│ │ Session Explorer │ │ On-Demand Eval Panel │ │ +│ │ • Browse sessions │ │ • Select evaluators │ │ +│ │ • Filter by score/date │ │ • Run against session │ │ +│ │ • View trace timeline │ │ • View scores/explanations│ │ +│ └──────────────────────────┘ └───────────────────────────┘ │ +│ │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ AI Analysis Panel │ │ +│ │ • Trigger pattern analysis on low-scoring results │ │ +│ │ • View identified patterns and recommendations │ │ +│ │ • Generate and review prompt improvements │ │ +│ └──────────────────────────────────────────────────────────┘ │ +└──────────────────────────────┬──────────────────────────────────┘ + │ + ▼ +┌──────────────────────────────────────────────────────────────────┐ +│ Backend API │ +│ │ +│ Evaluation SDK CloudWatch Logs Observability SDK │ +│ • list_online_configs • filter_log_events • obs.list() │ +│ • run() (on-demand) • (eval results) • (traces/spans) │ +│ • create/update/delete │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 主要なダッシュボードコンポーネント + +| コンポーネント | データソース | 表示する内容 | +| -------------------------- | -------------------------- | --------------------------------------------------------------------- | +| サマリータイル | 集計された CloudWatch 結果 | 総評価数、平均スコア、低スコア数 (< 0.5)、高スコア数 (≥ 0.8) | +| スコア分布 | 集計された CloudWatch 結果 | ビン (0.0〜0.2、0.2〜0.4 など) ごとのスコアを示す棒グラフ | +| 評価器ごとのメトリクス | 集計された CloudWatch 結果 | 各評価器の平均スコアと件数を色分け表示 (緑 ≥ 0.8、黄 ≥ 0.6、赤 < 0.6) | +| セッションエクスプローラー | Observability SDK | スコア、トレース数、タイムスタンプ付きの閲覧可能なセッション一覧 | +| トレースビューア | Observability SDK | トレースとスパンのタイムライン可視化 (親子階層を表示) | +| オンデマンド評価パネル | Evaluation SDK の `run()` | 評価器を選択し、セッションに対して実行、スコアと説明を表示 | +| AI 分析パネル | Bedrock の `invoke_model` | パターン分析、推奨事項、プロンプト改善案 | + +### データフロー + +```mermaid +graph TD + A[Dashboard loads] --> B[Fetch evaluation configs] + B --> C{Configs found?} + C -->|Yes| D[Fetch metrics per config from CloudWatch] + C -->|No| E[Show setup banner] + D --> F[Aggregate across configs] + F --> G[Display summary tiles + charts + evaluator breakdown] + + H[User selects session] --> I[Fetch traces via Observability SDK] + I --> J[Display trace timeline viewer] + + K[User clicks Run Evaluation] --> L[Call eval_client.run per evaluator] + L --> M[Display scores + explanations] + + N[User triggers AI Analysis] --> O[Query low-scoring results from CloudWatch] + O --> P[Send to foundation model for pattern analysis] + P --> Q[Display patterns + recommendations] + Q --> R[Generate prompt improvement] +``` + +### 設定をまたいだメトリクスの集計 + +複数の評価設定 (たとえば、評価器セットごとに分けた設定) がある場合、統合されたダッシュボードビューのためにメトリクスを集計します。 + +```python +def aggregate_metrics(all_config_metrics: list[dict]) -> dict: + """複数の評価設定のメトリクスを統合する。""" + total_evals = 0 + weighted_score_sum = 0.0 + combined_distribution = {} + combined_evaluators = {} + + for metrics in all_config_metrics: + count = metrics["totalEvaluations"] + if count == 0: + continue + + total_evals += count + weighted_score_sum += metrics["averageScore"] * count + + for bin_key, bin_count in metrics.get("scoreDistribution", {}).items(): + combined_distribution[bin_key] = combined_distribution.get(bin_key, 0) + bin_count + + for eval_id, eval_metrics in metrics.get("evaluatorMetrics", {}).items(): + if eval_id not in combined_evaluators: + combined_evaluators[eval_id] = {"count": 0, "totalScore": 0.0} + combined_evaluators[eval_id]["count"] += eval_metrics["count"] + combined_evaluators[eval_id]["totalScore"] += eval_metrics["totalScore"] + + # 平均を計算 + for eval_id in combined_evaluators: + m = combined_evaluators[eval_id] + m["averageScore"] = m["totalScore"] / m["count"] if m["count"] > 0 else 0.0 + + return { + "totalEvaluations": total_evals, + "averageScore": weighted_score_sum / total_evals if total_evals > 0 else 0.0, + "scoreDistribution": combined_distribution, + "evaluatorMetrics": combined_evaluators, + } +``` + +--- + +## ベストプラクティス + +### コスト最適化 + +#### サンプリングレート戦略 + +| 環境 | 推奨レート | 理由 | +| ------------ | ---------- | ---------------------------- | +| 開発 | 100% | テスト中の完全な可視性 | +| ステージング | 25〜50% | QA に十分なカバレッジ | +| 本番 | 5〜10% | コスト効率の良いモニタリング | + +#### 評価器選択戦略 + +少数のコア評価器から始めて、必要に応じて拡張します。 + +1. **3 つのコア評価器から始める**: `Helpfulness`、`Correctness`、`GoalSuccessRate` +2. **本番向けに安全性評価器を追加**: `Harmfulness`、`Maliciousness` +3. **必要に応じて品質評価器を追加**: `Faithfulness`、`Coherence`、`InstructionFollowing` +4. **ツールを使用する場合はツール評価器を追加**: `ToolSelectionAccuracy`、`ToolParameterAccuracy` + +各オンライン評価設定では、最大 10 個の評価器をサポートします。 + +#### トークン使用量 + +- 組み込み評価器は効率的なプロンプトを使用します (評価あたり約 1,000 トークン) +- SESSION レベル評価器はコストが高くなります (会話全体を評価) +- TRACE レベル評価器はより細粒度です (応答ごと) +- TOOL_CALL レベル評価器が最もターゲットを絞っています (ツール呼び出しごと) + +#### CloudWatch Logs のコスト + +オンライン評価結果は CloudWatch Logs に保存され、以下のコストが発生します。 + +- **取り込み:** 取り込み 1 GB あたり $0.50 +- **ストレージ:** 月あたり 1 GB で $0.03 (デフォルトの保持期間は無期限) + +コストを抑えるため、評価ロググループに保持ポリシーを設定します。 + +```python +cloudwatch_logs.put_retention_policy( + logGroupName=f"/aws/bedrock-agentcore/evaluations/results/{config_id}", + retentionInDays=90 # 結果を 90 日間保持 +) +``` + +### 運用上のヒント + +#### 一般的な操作の所要時間の目安 + +| 操作 | 一般的な所要時間 | +| ----------------------------------------- | -------------------------------------- | +| オンライン評価設定の作成 | 10〜30 秒 | +| 最初の結果が CloudWatch に表示されるまで | 次のエージェントセッションから 2〜5 分 | +| オンデマンド評価 (1 評価器、1 セッション) | 5〜15 秒 | +| オンデマンド評価 (3 評価器、1 セッション) | 15〜45 秒 | +| バッチ評価 (10 セッション × 2 評価器) | 3〜4 分 | +| AI パターン分析 (約 50 件の結果) | 15〜30 秒 | +| AI プロンプト改善生成 | 20〜60 秒 | + +#### 命名規則 + +コードベース全体で一貫した命名を使用します。 + +| 概念 | Python (SDK) | JSON (API レスポンス) | +| ------------------ | -------------- | -------------------------- | +| エージェント識別子 | `agent_id` | `agentId` | +| 設定識別子 | `config_id` | `onlineEvaluationConfigId` | +| セッション識別子 | `session_id` | `sessionId` | +| 評価器識別子 | `evaluator_id` | `evaluatorId` | + +> **補足:** SDK はパラメータに `snake_case` を使用します。AgentCore からの API レスポンスは `camelCase` を使用します。このガイドの例では、Python 変数には `snake_case`、JSON レスポンスを表示する際には `camelCase` を使用しています。 + +#### トラブルシューティング + +| 症状 | 想定される原因 | 解決策 | +| ------------------------------------------ | ----------------------------------- | --------------------------------------------------------------------- | +| メトリクスが表示されない | 結果が表示されるまで 2〜5 分かかる | 待ってから更新する。`executionStatus` が `ENABLED` であることを確認 | +| 評価 API 呼び出しで 403 が発生 | IAM 権限が不足している | ロールに `bedrock-agentcore:*` を追加 | +| ロググループで `ResourceNotFoundException` | まだ評価が実行されていない | エージェントを呼び出してセッションを生成し、待つ | +| セッション数に対して評価数が少ない | サンプリングレートが低すぎる | `sampling_rate` を増やすか、エージェントトラフィックを増やす | +| `FilterLogEvents` がスロットリングされる | CloudWatch の 5 リクエスト/秒の制限 | ページネーション間に遅延を追加するか、CloudWatch Logs Insights を使用 | + +--- + +## 参考資料 + +- [AgentCore Evaluations Documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/evaluations.html) +- [CreateOnlineEvaluationConfig API](https://docs.aws.amazon.com/bedrock-agentcore-control/latest/APIReference/API_CreateOnlineEvaluationConfig.html) +- [Evaluate API](https://docs.aws.amazon.com/bedrock-agentcore/latest/APIReference/API_Evaluate.html) +- [AgentCore Samples Repository](https://github.com/awslabs/amazon-bedrock-agentcore-samples) +- [Fullstack Solution Template for AgentCore](https://github.com/awslabs/amazon-bedrock-agentcore-samples/tree/main/fullstack-solution-template-for-agentcore) +- [CloudWatch Logs Pricing](https://aws.amazon.com/cloudwatch/pricing/) +- [Bedrock Supported Regions](https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-regions.html) diff --git a/samples/aws-specialist-agent/docs-jp/AGENT_CONFIGURATION.md b/samples/aws-specialist-agent/docs-jp/AGENT_CONFIGURATION.md new file mode 100644 index 0000000..f7ef5d0 --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/AGENT_CONFIGURATION.md @@ -0,0 +1,184 @@ +# エージェント設定ガイド + +FAST はコンテナ内で動作する任意のエージェントフレームワークをサポートします。このガイドでは、既存のパターンを使用する方法、独自のパターンを作成する方法、エージェントの動作を設定する方法について説明します。 + +--- + +## 既存のパターン + +### Strands Single Agent パターン + +**場所**: `agent/strands-single-agent/` + +AgentCore Memory との統合を備えた、Strands フレームワークを使用した基本的な会話エージェントです。 + +**このエージェントが行うこと**: + +- マルチターンの会話チャット +- 短期メモリでの会話履歴の維持 +- **オプションの長期メモリ**: `config.yaml` で `use_long_term_memory: true` を設定すると、エージェントは `SemanticMemoryStrategy` を使用してセッションをまたいで事実を抽出して呼び出します (Cognito ユーザー ID をキーとして使用)。詳細は [Memory Integration Guide](MEMORY_INTEGRATION.md#enabling-long-term-memory) を参照してください。 +- より良い UX のためにレスポンスをストリーミング +- Cognito で認証 (ユーザー ID はメモリで追跡) + +**主要な設定ファイル**: + +- **エージェントのロジック**: `agent/strands-single-agent/basic_agent.py` - メモリ統合、モデル設定、ストリーミングロジックを含むメインのエージェント実装 +- **Python の依存関係**: `agent/strands-single-agent/requirements.txt` - 必要な Python パッケージ (Strands、bedrock-agentcore など) +- **コンテナ設定**: `agent/strands-single-agent/Dockerfile` - Docker コンテナの定義 (`deployment_type: docker` の場合のみ使用) +- **インフラストラクチャ**: `infra-cdk/lib/backend-stack.ts` - メモリリソースとランタイムデプロイメントのための CDK 設定 + +**モデル設定** (レジストリ駆動): + +チャットモデルは `basic_agent.py` にハードコードされていません。ユーザーが UI +でモデルを選び、選択肢はレジストリで一元定義されます: + +```typescript +// infra-cdk/lib/utils/model-registry.ts +export const SELECTABLE_MODELS: readonly SelectableModel[] = [ + { + key: "opus-4.8", + label: "Claude Opus 4.8", + id: "global.anthropic.claude-opus-4-8", + provider: "anthropic", + }, + { + key: "sonnet-5", + label: "Claude Sonnet 5", + id: "global.anthropic.claude-sonnet-5", + provider: "anthropic", + }, + { + key: "sonnet-4.6", + label: "Claude Sonnet 4.6", + id: "global.anthropic.claude-sonnet-4-6", + provider: "anthropic", + default: true, + }, + // ...ここに 1 行追加して再デプロイ +] +``` + +CDK がバックエンドの allowlist (`MODEL_MAP` / `DEFAULT_MODEL_KEY` 環境変数) と +フロントエンドのピッカー選択肢 (`aws-exports.json`) をこの単一ソースから導出する +ため、両者がズレることはありません。モデルの変更・追加はこの配列を編集して再 +デプロイするだけで、`basic_agent.py` の変更は不要です。論理キーから物理モデルへの +解決は `agent/strands-single-agent/models.py` が担います。Claude は bedrock-runtime +(Converse)、OpenAI GPT は bedrock-mantle の OpenAI Responses API で、両プロバイダ +とも稼働中です。どのモデルにも `temperature` は渡しません (現行世代は拒否するため)。 + +**システムプロンプト** (`agent/strands-single-agent/basic_agent.py`): + +```python +system_prompt = """You are a helpful assistant. Answer questions clearly and concisely.""" +``` + +**変更後**: 再デプロイの手順については [Deployment Guide](DEPLOYMENT.md) を参照してください。 + +--- + +## 独自のエージェントパターンを作成する + +### Step 1: パターンディレクトリを作成する + +```bash +mkdir -p agent/my-custom-agent +cd agent/my-custom-agent +``` + +### Step 2: エージェントを実装する + +以下を行うエージェントコードを作成します: + +- AgentCore Runtime からの HTTP リクエストを受信する +- ユーザークエリを処理する +- レスポンスを返す (ストリーミングまたは非ストリーミング) +- AgentCore Memory と統合する (オプション) + +**構造の例**: + +```python +from bedrock_agentcore.runtime import BedrockAgentCoreApp, RequestContext +from utils.auth import extract_user_id_from_context + +app = BedrockAgentCoreApp() + +@app.entrypoint +async def agent_handler(payload, context: RequestContext): + """エージェントのメインエントリポイント""" + user_query = payload.get("prompt") + session_id = payload.get("runtimeSessionId") + + # 検証済みの JWT トークンからユーザー ID を安全に抽出する + # (操作される可能性のある) ペイロード本体を信頼するのではなく + user_id = extract_user_id_from_context(context) + + # ここにエージェントのロジック + # ... + + yield response + +if __name__ == "__main__": + app.run() +``` + +### Step 3: Dockerfile を作成する (Docker デプロイメントのみ) + +設定で `deployment_type: docker` を使用する場合は、Dockerfile を作成します: + +```dockerfile +FROM public.ecr.aws/docker/library/python:3.13-slim + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +EXPOSE 8080 + +CMD ["python", "your_agent.py"] +``` + +**ZIP デプロイメントの場合**: Dockerfile は不要です。ZIP パッケージャーは `agent//` ディレクトリと `agent/utils/`、`gateway/`、`tools/` ディレクトリ、および `requirements.txt` の依存関係を自動的にバンドルします。 + +### Step 4: CDK 設定を更新する + +`infra-cdk/config.yaml` で: + +```yaml +backend: + pattern: "my-custom-agent" # パターンディレクトリ名 +``` + +**エージェントが追加の AWS サービスを必要とする場合** (Knowledge Bases、DynamoDB、S3 など)、`infra-cdk/lib/` の CDK スタックを変更します: + +**例**: Knowledge Base を追加する + +```typescript +// Knowledge Base コンストラクトを作成 +const knowledgeBase = new bedrock.CfnKnowledgeBase(this, "KB", { + name: "MyKnowledgeBase", + // ... 設定 +}); + +// backend-stack.ts でエージェントの環境変数に追加 +EnvironmentVariables: { + KNOWLEDGE_BASE_ID: knowledgeBase.attrKnowledgeBaseId, + // ... その他の変数 +} +``` + +### Step 5: デプロイ + +完全なデプロイ手順については [Deployment Guide](DEPLOYMENT.md) を参照してください。 + +## Design notes + +本派生プロジェクト固有の設計判断: + +- **選択可能モデル、単一の信頼ソース**: モデルピッカーは任意の ID からの推測ではなくレジストリで駆動する。レジストリは表示名・プロバイダ・推論プロファイル/エンドポイント・機能フラグを宣言し、フロントエンドとバックエンドの双方がここから読むのでピッカーと Runtime が常に同期する。 +- **OpenAI モデルを Bedrock 経由で配信**: GPT モデルもレジストリエントリとして追加し、Bedrock が公開している OpenAI Responses API エンドポイント経由で呼ぶ。認証と可観測性の経路を一本化でき、別途 OpenAI API キーを配線する必要はない。 +- **直接呼び出しによる簡素化**: OpenAI 統合は同一リージョンのエンドポイントを直叩きする。同一リージョン版エンドポイントが提供された段階で旧クロスリージョン peering 構成は撤去し、ネットワーク構成の単純化と遅延削減を達成した。 +- **モデル構築時に temperature を渡さない**: 一部の reasoning 系エンドポイントは `temperature` を拒否するため、モデル構築経路では一切設定しない。エンドポイント依存のパラメータは各モデルのレジストリフラグで管理する。 +- **System prompt をセクション分割**: Language / Skills first / AWS guidance / Tool routing といった名前付きセクションに分け、追記が適切な場所に入り複数プロバイダ間でも保守性を保てるようにしている。 diff --git a/samples/aws-specialist-agent/docs-jp/CEDAR_POLICY_GUIDE.md b/samples/aws-specialist-agent/docs-jp/CEDAR_POLICY_GUIDE.md new file mode 100644 index 0000000..fd961d1 --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/CEDAR_POLICY_GUIDE.md @@ -0,0 +1,415 @@ +# Cedar Policy ガイド + +このドキュメントでは、AgentCore Gateway 向けの Cedar policy の書き方、管理方法、拡張方法について解説します。アイデンティティ伝搬アーキテクチャやコンポーネントセットアップについては [Identity Propagation & Cedar Policy Guide](IDENTITY_POLICY.md) を参照してください。 + +## クレームの理解(カスタム vs 標準) + +Cedar policy は `principal.getTag("claim_name")` を介して JWT クレームを参照します。これらのクレームは 2 つのカテゴリに分かれます。 + +### カスタムクレーム(アプリケーション定義) + +カスタムクレームは V3 Pre-Token Lambda が `claimsToAddOrOverride` 経由で注入します。標準的な JWT/OIDC クレームセットの一部ではなく、アプリケーションのアクセス制御のニーズに基づいて定義されます。 + +**このデモのクレーム:** + +| クレーム | 用途 | 値の例 | +| ------------ | ---------------------------------- | ------------------------ | +| `user_id` | 認証済みユーザーのアイデンティティ | `"yourname@company.com"` | +| `department` | ユーザーの組織単位 | `"finance"` | +| `role` | ユーザーの権限レベル | `"admin"` | + +**カスタムクレームの追加例:** + +| クレーム | ユースケース | Cedar での利用 | +| ----------------- | -------------------------- | ---------------------------------------------------- | +| `tenant_id` | マルチテナント分離 | `principal.getTag("tenant_id") == "example-corp"` | +| `clearance_level` | 階層化されたデータアクセス | `principal.getTag("clearance_level") == "top-level"` | +| `region` | 地理的に制限されたアクセス | `principal.getTag("region") == "us-east-1"` | +| `runtime_env` | Runtime レベルの分離 | `principal.getTag("runtime_env") == "production"` | + +カスタムクレームの追加方法: Pre-Token Lambda の `claimsToAddOrOverride` dict にクレームを注入し、Cedar 内で `principal.getTag("claim_name")` を使って参照します。Gateway の構成変更は不要 — CUSTOM_JWT authorizer がすべての JWT クレームを Cedar タグに自動マッピングします。 + +### 標準クレーム(Cognito 管理) + +標準クレームは Cognito によって自動的にすべてのトークンに含められます。Pre-Token Lambda で上書きすることはできません。 + +| クレーム | 説明 | 変更可能? | +| --------------------- | -------------------------------------------- | --------- | +| `sub` | Subject 識別子(M2M の場合は app client ID) | 不可 | +| `iss` | トークン発行者(Cognito user pool URL) | 不可 | +| `client_id` | App client ID | 不可 | +| `token_use` | 常に `"access"` | 不可 | +| `scope` | 付与された OAuth スコープ | 不可 | +| `exp` / `iat` / `jti` | トークンのタイミングと ID | 不可 | + +標準クレームも Cedar 内で `principal.getTag()` 経由でアクセス可能ですが、ビジネスロジックよりもインフラレベルのチェックに使われるのが一般的です。 + +### クレームとして利用できないもの + +| データ | 理由 | 代替手段 | +| --------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| リクエストヘッダ / IP | Cedar に公開されていない | N/A(サポートされていません) | +| Runtime ARN | Cedar スキーマに存在しない | Pre-Token Lambda 経由で `runtime_env` を注入([Runtime-Level Access Control](IDENTITY_POLICY.md#runtime-level-access-control) 参照) | +| ツール入力パラメータ | クレームではない | Cedar 内で `context.input.` を使用 | + +## Policy ファイルの場所 + +`gateway/policies/` — 1 ファイル = 1 Cedar ステートメント(AgentCore `CreatePolicy` は 1 ポリシーにつき 1 ステートメント)です。出荷されるセットは以下のとおりです。 + +| ファイル | ツール | 許可される部門 | +| ------------------------------ | -------------------------------------------------------- | -------------------- | +| `01-sample-tool.cedar` | `sample-tool-target___text_analysis_tool` | finance, engineering | +| `02-aws-mcp-read.cedar` | AWS MCP の読み取り系ツール | finance, engineering | +| `03-aws-mcp-destructive.cedar` | `aws-mcp___aws___call_aws`、`aws-mcp___aws___run_script` | finance のみ | + +該当ファイルを編集して `cdk deploy` を実行すると変更が適用されます。Custom Resource Lambda が Policy Engine を再作成することなくポリシーをインプレースで更新します。guest(グループなし)はどの `permit` にもマッチせず、deny-by-default により拒否されます。 + +## アクション名のフォーマット + +Cedar のアクション名は `___`(アンダースコア 3 つ)のフォーマットに従います。 + +- **TargetName** は `backend-stack.ts` 内の `CfnGatewayTarget` 名から取得(例: `sample-tool-target`) +- **tool_name** は `tool_spec.json` から取得(例: `text_analysis_tool`) +- 結合: `sample-tool-target___text_analysis_tool` + +これらは大文字小文字を区別します。不一致があると、ポリシーロジックが正しく見えてもすべてのリクエストが密かに拒否されます。 + +## Deny-by-Default + +Cedar は deny-by-default です: いずれの `permit` 文もリクエストにマッチしなければ、自動的に拒否されます。アクセスをブロックするのに明示的な `forbid` 文は不要 — permit の条件から該当の部門を単に外せばよいだけです。 + +例えば、ゲストを拒否するには、permit の部門リストから `"guest"` を削除します。`forbid` 文は不要です。 + +## ツールディスカバリー vs 実行 + +AgentCore Policy Engine はツールライフサイクルの **2 つの時点** で認可を強制します。 + +### 1. ディスカバリー(`tools/list`)— ツールフィルタリング + +Runtime が Gateway に対して `tools/list` を呼び出すと、Policy Engine は `PartiallyAuthorizeActions` を使って **すべてのツール** を呼び出し元のアイデンティティに対して評価します。呼び出し元が利用を許可されていないツールは **レスポンスから削除** されます。エージェントはそれらの存在に気付きません。 + +``` +Agent → Runtime → Gateway tools/list → Policy Engine (PartiallyAuthorizeActions) + ↓ + 各ツールを principal のクレームに対して評価 + ↓ + 許可されたツールのみを返す + ↓ + Agent はフィルタリングされたツールリストを受け取る +``` + +**効果:** Version 2(ゲスト拒否)がアクティブな状態で `department=guest` のユーザーが `tools/list` を呼び出すと、`text_analysis_tool` はレスポンスに含まれません。エージェントはツールの存在を知らないため、呼び出そうとすることもありません。 + +### 2. 実行(`tools/call`)— 完全コンテキスト強制 + +エージェントが特定のツールを呼び出すと、Policy Engine はツールの入力パラメータ(`context.input`)を含む **完全なコンテキスト** でリクエストを評価します。実際のリクエストペイロードにアクセスできるため、ディスカバリーよりも厳格な評価です。 + +``` +Agent → Runtime → Gateway tools/call → Policy Engine (AuthorizeAction) + ↓ + principal クレーム + context.input を評価 + ↓ + Allow → ツール実行 + Deny → 認可エラーを返す +``` + +**なぜ両方必要か?** ツールがディスカバリーフィルタリングを通過する(ユーザーは一般的にツール利用を許可されている)ものの、入力固有の条件で実行時に拒否される場合があります。例えば: + +```cedar +// ユーザーは refund ツールをディスカバリーできる(tools/list フィルタリングを通過) +// ただし amount > 1000 の場合は実行が拒否される(tools/call チェックで失敗) +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"billing-target___process_refund", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("department") && + principal.getTag("department") == "finance" && + context.input.amount < 1000 +}; +``` + +この例では、finance ユーザーは `tools/list` で `process_refund` を確認できます(finance 部門だから)が、$5000 の返金を処理しようとすると、`context.input.amount < 1000` が失敗するため `tools/call` は拒否されます。 + +### CloudWatch でのディスカバリーフィルタリングの確認 + +拒否されたツールが `tools/list` からフィルタリングされていることを確認するには: + +1. Runtime と Gateway の両方でトレーシングを有効化([Verifying Policy Decisions via Tracing](IDENTITY_POLICY.md#verifying-policy-decisions-via-tracing) 参照) +2. フロントエンドからクエリをトリガー +3. CloudWatch → `aws/spans` ロググループで `PartiallyAuthorizeActions` をフィルタ +4. スパンに含まれる情報: + - `aws.agentcore.policy.allowed_tools`: エージェントに返されたツール + - `aws.agentcore.policy.denied_tools`: フィルタアウトされたツール + - `aws.agentcore.gateway.policy.mode`: `ENFORCE` と表示されるはず + +> **Runtime レベルでの確認:** エージェントコードにログ行を追加して、Cedar policy フィルタリング後にエージェントが受け取ったツールを確認します。Strands エージェントパターンの例: +> +> **Strands パターン**(`agent/strands-single-agent/basic_agent.py`)— `Agent()` 作成後に追加: +> +> ```python +> agent = Agent( +> name="strands_agent", +> tools=[gateway_client, code_tools.execute_python_securely], +> ... +> ) +> specs = agent.tool_registry.get_all_tool_specs() +> logger.info(f"[GATEWAY] Raw tool specs: {specs}") +> return agent +> ``` +> +> **確認場所:** CloudWatch → Log groups → `/aws/bedrock-agentcore/runtimes/{runtime_name}` → ログストリーム `otel-rt-logs`。`[GATEWAY] Raw tool specs` で検索。 + +### サマリー + +| ステージ | API | 評価対象 | 拒否時の挙動 | +| ------------------------------ | --------------------------- | ---------------------------------------------- | --------------------------------------------------- | +| ディスカバリー(`tools/list`) | `PartiallyAuthorizeActions` | Principal クレームのみ(入力コンテキストなし) | ツールが隠される — エージェントは存在を知らない | +| 実行(`tools/call`) | `AuthorizeAction` | Principal クレーム + `context.input` | リクエスト拒否 — エージェントは認可エラーを受け取る | + +## 新しいツールの追加 + +新しい Gateway target とツールを追加する場合: + +1. `backend-stack.ts` で新しい Lambda ツールと `CfnGatewayTarget` を作成 +2. 正しいアクション名で `gateway/policies/` に新しいポリシーファイル(1 ステートメント)を追加 +3. `cdk deploy` を実行 + +各 `create_policy` 呼び出しは 1 つの Cedar 文を含む 1 つのポリシーを作成します。Custom Resource は現状デプロイごとに単一ポリシーを作成します。複数のポリシーを追加するには(例: permit と forbid 文を別々に)、文ごとに `create_policy()` を呼び出すように Custom Resource Lambda を更新してください。 + +## Cedar スキーマ制約 + +AgentCore Gateway は、Gateway の MCP ツールマニフェストから自動生成されたスキーマに対して Cedar policy を検証します。サポートされていないフィールドを参照するポリシーは作成時に失敗し、CloudFormation がロールバックします。 + +**Cedar policy でサポートされている要素:** + +| 要素 | 参照可能なもの | 例 | +| ------------------------------------------- | ----------------------------------------------------------- | -------------------------------------------------------------- | +| `principal` | `AgentCore::OAuthUser` でなければならない | `principal is AgentCore::OAuthUser` | +| `principal.hasTag()` / `principal.getTag()` | CUSTOM_JWT authorizer がマッピングした任意の JWT クレーム | `principal.getTag("department")` | +| `action` | `___` フォーマットのツールアクション | `AgentCore::Action::"sample-tool-target___text_analysis_tool"` | +| `resource` | Gateway ARN | `AgentCore::Gateway::"arn:aws:..."` | +| `context.input` | MCP マニフェストで定義されたツール入力パラメータ | `context.input.query` | + +**Cedar policy でサポートされていない要素:** + +| 要素 | 理由 | +| --------------------------------------- | ----------------------------------------------------------- | +| `context.runtime.arn` | スキーマに存在しない — `context.input` のみ利用可能 | +| カスタムエンティティタイプ | `AgentCore` 名前空間外でエンティティを定義できない | +| `OAuthUser` 上のカスタム属性 | プロパティ直接アクセスではなく `hasTag()`/`getTag()` を使用 | +| リクエストメタデータ(ヘッダ、IP など) | Cedar に公開されていない | + +`context.input` で利用できない情報にアクセス制御の判断が依存する場合は、Pre-Token Lambda 経由で JWT クレームとして注入し、`principal.getTag()` でアクセスしてください。このパターンの例は [Runtime-Level Access Control](IDENTITY_POLICY.md#runtime-level-access-control) を参照してください。 + +## Cedar Policy 機能 + +Cedar は認可向けに設計された専用ポリシー言語です。このセクションでは、AgentCore Gateway の Cedar policy で表現できる内容を、各機能の実用的な例と共に解説します。 + +> **このプロジェクトで既に実演されているもの:** +> +> - アイデンティティベースのアクセス(`principal.getTag("department") == "finance"`)— [Cedar Policy ファイル](IDENTITY_POLICY.md#cedar-policy-file) の Version 1 & 2 を参照 +> - 多値 OR 条件(`department == "finance" || department == "engineering"`)— Version 1 ポリシーを参照 +> +> 以下の機能は同じインフラを使って実装できる **追加のパターン** を示します。 + +### 機能 1: 入力検証 (`context.input`) + +**シナリオ:** Finance ユーザーは返金処理ができますが、$1000 までです。$1000 を超える返金には別の承認ワークフローが必要です。 + +**仕組み:** `context.input` により Cedar はツール入力パラメータ(MCP ツールマニフェストで定義されたもの)にアクセスできます。これらの値に対して条件を書けます。ツールは finance ユーザーには `tools/list` で表示されます(ディスカバリーは principal クレームのみをチェック)が、$1000 制限は実際の入力が利用可能な `tools/call` 時に強制されます。 + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"billing-target___process_refund", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("department") && + principal.getTag("department") == "finance" && + context.input.amount < 1000 +}; +``` + +**結果:** + +- Finance ユーザー、amount=500 → 許可 +- Finance ユーザー、amount=5000 → 拒否(制限超過) +- Engineering ユーザー、amount=100 → 拒否(部門が違う) + +**重要:** これは [ツールディスカバリー vs 実行](#tool-discovery-vs-execution) が最も重要となる例です。ツールはディスカバリーフィルタリングを通過する(finance ユーザーは一般的に許可される)ものの、入力が条件に違反する場合は実行が拒否されます。 + +--- + +### 機能 2: 複数ツールポリシー (`action in [...]`) + +**シナリオ:** 開発者はすべての読み取り専用ツール(list、get、search)を使えますが、書き込みツール(create、update、delete)は使えません。 + +**仕組み:** ツールごとに別々の `permit` 文を書く代わりに、`action in [...]` を使って 1 つのポリシーを複数のツールに同時に適用します。 + +```cedar +permit( + principal is AgentCore::OAuthUser, + action in [ + AgentCore::Action::"data-target___list_records", + AgentCore::Action::"data-target___get_record", + AgentCore::Action::"data-target___search_records" + ], + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("role") && + principal.getTag("role") == "developer" +}; +``` + +**結果:** + +- 開発者が `list_records` を呼び出す → 許可 +- 開発者が `search_records` を呼び出す → 許可 +- 開発者が `delete_record` を呼び出す → 拒否(アクションリストに含まれない) + +> **補足:** 各ツールに対して個別の `permit` 文を書くこともできます。`action in [...]` 構文は、同じ条件下でツールをグループ化するための便利な手段です。 + +--- + +### 機能 3: 明示的拒否 (`forbid`) + +**シナリオ:** すべての部門がツールを使用できますが、特定のユーザー(例: 漏洩したアカウント)は部門に関係なく明示的にブロックする必要があります。 + +**仕組み:** `forbid` 文は `permit` 文をオーバーライドします。Cedar の競合解決は「forbid wins」です — `permit` と `forbid` の両方がマッチする場合、リクエストは拒否されます。 + +```cedar +// すべての部門を許可 +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"sample-tool-target___text_analysis_tool", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("department") +}; + +// ただし特定のユーザーは明示的にブロック +forbid( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"sample-tool-target___text_analysis_tool", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("user_id") && + principal.getTag("user_id") == "compromised-user@example.com" +}; +``` + +**結果:** + +- 部門を持つ任意のユーザー → 許可 +- `compromised-user@example.com` → 拒否(forbid が permit に勝つ) + +> **補足:** Cedar の deny-by-default により、ユーザーや部門を `permit` から単に省略するだけで +> アクセスを拒否するのに十分なことが多いです。`forbid` は広範な `permit` を特定のケースで +> オーバーライドするとき(漏洩ユーザーのブロック、インシデント時のツール無効化、 +> 緊急停止の実装など)に使ってください。 + +--- + +### 機能 4: ワイルドカード文字列マッチング (`like`) + +**シナリオ:** `@example.com` メールドメインのユーザーのみが内部ツールにアクセスできます。他のメールドメインの外部請負業者は拒否されます。 + +**仕組み:** 文字列クレーム値のパターンマッチングには `like` と `*` ワイルドカードを使います。 + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"internal-target___internal_tool", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("user_id") && + principal.getTag("user_id") like "*@example.com" +}; +``` + +**結果:** + +- `alice@example.com` → 許可 +- `bob@example.com` → 許可 +- `contractor@external.com` → 拒否(パターンに一致しない) + +> **補足:** `like` はワイルドカードとして `*` のみをサポートし、 +> 任意の種類の文字(文字、数字、記号、ドットなど)が 0 個以上にマッチします。 +> 正規表現、単一文字ワイルドカード、文字クラス、その他のパターン構文はサポートされていません。 + +--- + +### 機能 5: 環境ベースのアクセス制御 + +**シナリオ:** 本番ツールは本番 runtime からのみアクセス可能であるべきです。Staging runtime は、ユーザーが正しい部門・役割を持っていても本番ツールを呼び出せないようにします。 + +**仕組み:** Pre-Token Lambda が Cognito の `clientId` を `runtime_env` クレームにマッピングします([Runtime-Level Access Control](IDENTITY_POLICY.md#runtime-level-access-control) 参照)。Cedar はユーザーアイデンティティと runtime 環境の両方をチェックします。 + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"prod-target___production_tool", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("runtime_env") && + principal.getTag("runtime_env") == "production" && + principal.hasTag("department") && + principal.getTag("department") == "finance" +}; +``` + +**結果:** + +- 本番 runtime からの finance ユーザー → 許可 +- Staging runtime からの finance ユーザー → 拒否(環境が違う) +- 本番 runtime からの engineering ユーザー → 拒否(部門が違う) + +--- + +### クイックリファレンス: Cedar 演算子 + +| 演算子 | 意味 | 例 | +| -------------------- | ---------------------------- | ---------------------------------------------------- | +| `==` | 等しい | `principal.getTag("role") == "admin"` | +| `!=` | 等しくない | `principal.getTag("department") != "restricted"` | +| `&&` | AND(両方とも真) | `condition_a && condition_b` | +| `\|\|` | OR(いずれかが真) | `value == "a" \|\| value == "b"` | +| `<`, `>`, `<=`, `>=` | 数値比較 | `context.input.amount < 1000` | +| `in [...]` | アクションが集合に含まれる | `action in [Action::"a", Action::"b"]` | +| `like` | ワイルドカード文字列マッチ | `principal.getTag("email") like "*@example.com"` | +| `hasTag()` | クレームがトークンに存在する | `principal.hasTag("department")` | +| `getTag()` | クレーム値を取得 | `principal.getTag("department")` | +| `has` | フィールド/属性が存在する | `context.input has shippingAddress` | +| `.contains()` | 集合のメンバーシップ | `["US", "CA", "MX"].contains(context.input.country)` | + +### Cedar でできないこと + +| 制限事項 | 回避策 | +| ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 正規表現 | シンプルなパターンには `like` と `*` ワイルドカードを使う | +| 算術演算(例: `a + b > c`) | Pre-Token Lambda で事前計算してクレームとして注入 | +| 外部データ参照(例: データベースクエリ) | Pre-Token Lambda で解決してクレームとして注入 | +| 時刻ベースのルール(例: 「営業時間中のみ」) | Pre-Token Lambda から `time_window` クレームを注入 | +| 配列/リストメンバーシップ(例: 「ユーザーが allowed_list に含まれる」) | ハードコードされたリストには `.contains()` を使う: `["a", "b"].contains(context.input.x)`。動的なリスト(データベースから読み込み)の場合は Pre-Token Lambda で解決し、ブール値クレームとして注入 | +| リクエストヘッダ、IP アドレス、ネットワークコンテキスト | Cedar に公開されていない — 利用不可 | + +> **アーキテクチャパターン:** Cedar が直接評価できないもの(時刻、外部データ、 +> 複雑なロジック)は Pre-Token Lambda で解決し、結果をカスタムクレームとして +> 注入してください。Cedar は事前解決済みの値をチェックします。これによりポリシーは +> シンプル、決定的、監査可能に保たれます。 + +## Design notes + +本派生プロジェクト固有の設計判断: + +- **Cedar v2 + guest 既定拒否**: 未認証呼び出しはポリシーセット側で弾き、ツール呼び出しには必ず認証済み principal を要求する。アプリ層のフィルタリング後置きには依存しない。 +- **Cognito グループによるユーザー単位 ABAC**: 部門相当のグループメンバーシップを pre-token Lambda で Cedar 属性に投影し、ポリシー本体を書き換えずにユーザー単位のツール許可/拒否を実現する。解決は Cognito 側のサーバーサイドで行うため閉域構成でも動作する。 +- **Cedar policy Lambda の権限**: Cedar policy を生成する Custom Resource は target カタログを列挙・検証するために `bedrock-agentcore:ListGatewayTargets` と `bedrock-agentcore:InvokeGateway` が必要。いずれも欠落するとデプロイ時にエラーになるため、回帰の切り分けが容易になっている。 diff --git a/samples/aws-specialist-agent/docs-jp/CONTEXT_MANAGEMENT.md b/samples/aws-specialist-agent/docs-jp/CONTEXT_MANAGEMENT.md new file mode 100644 index 0000000..c3ea5d7 --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/CONTEXT_MANAGEMENT.md @@ -0,0 +1,618 @@ +# コンテキスト管理ガイド + +FAST 内における長時間実行型あるいはマルチターン型のエージェント会話で、LLM のコンテキストウィンドウを管理するための実践ガイドです。 + +エージェントが長い会話を扱うにつれ(特に大量のツール呼び出し、巨大なツール結果、反復ワークフローを伴う場合)、会話履歴はモデルのコンテキストウィンドウを超えるほど膨らんでいきます。オーバーフローに到達する前であっても、巨大なコンテキストはモデル性能の劣化、レイテンシの増加、コストの肥大化を引き起こします。コンテキスト管理戦略は、会話履歴を能動的または受動的に圧縮・トリミング・要約することで、これらの問題に対処します。 + +このガイドでは Strands と LangGraph で利用可能な組み込みオプション、それぞれの使いどころ、そして組み込みオプションがユースケースに合わない場合に完全カスタムなソリューションを実装する方法について解説します。 + +--- + +## どのような場合にコンテキスト管理が必要か + +エージェントが以下に該当する場合、コンテキスト管理が必要となる可能性があります。 + +- 時間とともにメッセージが蓄積する **マルチターン会話** を実行する +- 多数の連続したツール呼び出しを伴う **反復ワークフロー** を実行する(例: コード生成ループ、データ分析パイプライン) +- **大きなツール結果** を返す(例: ファイル内容、API レスポンス、スクリーンショット) +- 人間の介在なしに **長期間自律的に動作する** + +シンプルな単発のチャットや短いマルチターンチャットエージェントでは、デフォルトの挙動(明示的なコンテキスト管理なし)で通常は十分です。特に、200k トークン以上の大きなコンテキストウィンドウを持つ最強の LLM を使う場合はそうです。 + +--- + +## 戦略の比較 + +| 戦略 | 情報損失 | 複雑性 | 適した用途 | +| ---------------------------- | --------------------------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------- | +| **スライディングウィンドウ** | 高 — 古いメッセージは完全に破棄される | 低 | シンプルなチャットボット、短い会話、古いメッセージを参照しない UX、または古いトピックの参照を扱う長期メモリを内蔵したアプリケーション | +| **要約** | 低 — 重要情報が圧縮された形で保持される | 中 | マルチターンアシスタント、反復ワークフロー、コンテキストウィンドウがオーバーフローした際に数秒間停止しても許容される(要約生成のため)UX | +| **能動的圧縮** | 低〜中 — オーバーフロー前にトリガー | 中 | 長時間自律稼働するエージェント、コンテキストウィンドウが 50% を超えると高品質な結果を返すのが難しい弱い LLM を使うアプリケーション | +| **カスタムフックベース** | 設定可能 — 何を残すかを完全に制御 | 高 | 外部メモリを伴う特殊な長時間稼働エージェント | + +--- + +## オプション 1: スライディングウィンドウ (Strands) + +最もシンプルなアプローチです。直近 N 件のメッセージを保持し、それより古いものを破棄します。Strands は `SlidingWindowConversationManager` を標準で提供しています。 + +### 仕組み + +- 固定ウィンドウサイズでメッセージを保持(デフォルト: 40 件) +- ウィンドウを超えると最も古いメッセージから削除 +- 不正な会話状態にならないよう tool use / result のペアを維持 +- 大きなツール結果を必要に応じて切り詰める(先頭・末尾 200 文字を保持) + +### 設定 + +```python +from strands import Agent +from strands.agent.conversation_manager import SlidingWindowConversationManager + +agent = Agent( + model=model, + tools=tools, + conversation_manager=SlidingWindowConversationManager( + window_size=40, # 保持する最大メッセージ数(デフォルト: 40) + should_truncate_results=True, # 大きなツール結果を切り詰める(デフォルト: True) + ), +) +``` + +### 能動的圧縮 + +スライディングウィンドウマネージャは能動的圧縮もサポートしており、エラーを待たずにコンテキストウィンドウがオーバーフローする前にコンテキスト削減をトリガーできます。 + +```python +conversation_manager=SlidingWindowConversationManager( + window_size=40, + proactive_compression=True, # コンテキスト使用率 70% で圧縮(デフォルト閾値) +) + +# あるいはカスタム閾値で: +conversation_manager=SlidingWindowConversationManager( + window_size=40, + proactive_compression={"compression_threshold": 0.5}, # 50% で圧縮 +) +``` + +### ターンごとの管理 + +ループ内で多くのツール操作を行うエージェント(例: 頻繁なスクリーンショットを伴う Web ブラウジング)の場合、毎モデル呼び出し前に能動的にトリミングするようターンごとの管理を有効化します。 + +```python +conversation_manager=SlidingWindowConversationManager( + window_size=40, + per_turn=True, # 毎モデル呼び出し前に適用 + # per_turn=5, # または 5 回ごとに適用 +) +``` + +### FAST Strands パターンへの適用 + +`agent/strands-single-agent/basic_agent.py` にスライディングウィンドウ管理を追加するには、`Agent` 構築時に `conversation_manager` パラメータを渡します。 + +```python +from strands.agent.conversation_manager import SlidingWindowConversationManager + +# create_strands_agent() 内: +agent = Agent( + model=model, + system_prompt=SYSTEM_PROMPT, + tools=[gateway_client, code_tools.execute_python_securely], + conversation_manager=SlidingWindowConversationManager(window_size=40), + session_manager=session_manager, +) +``` + +### 長所と短所 + +| 長所 | 短所 | +| ------------------------------ | -------------------------------------------- | +| 追加の LLM 呼び出しがゼロ | 古いコンテキストが完全に失われる | +| レイテンシ増加・コスト増加なし | エージェントが過去の会話を「忘れる」 | +| 設定がシンプル | 完全な履歴が必要な長時間稼働タスクには不向き | + +ドキュメント: **Strands Docs**: [SlidingWindowConversationManager API](https://strandsagents.com/docs/api/python/strands.agent.conversation_manager.sliding_window_conversation_manager/) + +--- + +## オプション 2: 要約型 Conversation Manager (Strands) + +古いメッセージを完全に破棄するのではなく、LLM 呼び出しを使って要約します。これによりトークン数を削減しつつ重要情報を保持できます。 + +### 仕組み + +- コンテキストオーバーフロー(または能動的圧縮閾値到達)時に、最古の N% のメッセージを要約 +- 要約は単一のユーザーメッセージとして元のメッセージ群を置き換える +- 直近メッセージはそのまま保持 +- 別途の LLM 呼び出しで要約を生成 + +### 設定 + +```python +from strands import Agent +from strands.agent.conversation_manager import SummarizingConversationManager + +agent = Agent( + model=model, + tools=tools, + conversation_manager=SummarizingConversationManager( + summary_ratio=0.3, # 最古の 30% のメッセージを要約(デフォルト) + preserve_recent_messages=10, # 直近 10 件のメッセージを常に保持(デフォルト) + proactive_compression=True, # コンテキスト使用率 70% で圧縮 + ), +) +``` + +### 専用要約エージェントの利用 + +デフォルトでは要約マネージャは親エージェント(とそのツール)を使って要約を生成します。より細かく制御したい場合は、要約専用エージェントを指定できます。 + +```python +from strands import Agent +from strands.agent.conversation_manager import SummarizingConversationManager + +# 要約専用の軽量エージェント — ツールは不要 +summarizer = Agent( + model="us.anthropic.claude-sonnet-4-20250514-v1:0", + system_prompt="You are a conversation summarizer. Create concise bullet-point summaries.", +) + +agent = Agent( + model=model, + tools=tools, + conversation_manager=SummarizingConversationManager( + summary_ratio=0.3, + preserve_recent_messages=10, + summarization_agent=summarizer, + proactive_compression={"compression_threshold": 0.5}, + ), +) +``` + +### FAST Strands パターンへの適用 + +```python +from strands.agent.conversation_manager import SummarizingConversationManager + +# create_strands_agent() 内: +agent = Agent( + model=model, + system_prompt=SYSTEM_PROMPT, + tools=[gateway_client, code_tools.execute_python_securely], + conversation_manager=SummarizingConversationManager( + summary_ratio=0.3, + preserve_recent_messages=10, + proactive_compression=True, + ), + session_manager=session_manager, +) +``` + +### 長所と短所 + +| 長所 | 短所 | +| -------------------------------- | ------------------------------------------------- | +| 古いコンテキストの重要情報を保持 | 追加の LLM 呼び出しによりレイテンシとコストが増加 | +| 圧縮率を設定可能 | 要約品質はモデル依存 | +| 組み込み済みでカスタムコード不要 | ニュアンスや具体的な詳細が失われる可能性 | + +ドキュメント: **Strands Docs**: [SummarizingConversationManager API](https://strandsagents.com/docs/api/python/strands.agent.conversation_manager.summarizing_conversation_manager/) + +--- + +## オプション 3: LangGraph ミドルウェア (Trim / Summarize) + +LangGraph は `@before_model` デコレータを使ったミドルウェアベースのコンテキスト管理アプローチを提供します。 + +### メッセージのトリミング + +毎モデル呼び出し前に古いメッセージを削除し、直近のものだけを残します。 + +```python +from langchain.messages import RemoveMessage +from langgraph.graph.message import REMOVE_ALL_MESSAGES +from langchain.agents import create_agent, AgentState +from langchain.agents.middleware import before_model +from langgraph.runtime import Runtime +from typing import Any + + +@before_model +def trim_messages(state: AgentState, runtime: Runtime) -> dict[str, Any] | None: + """コンテキストウィンドウに収まるよう直近の数メッセージのみ残す。""" + messages = state["messages"] + if len(messages) <= 10: + return None + + first_msg = messages[0] + recent_messages = messages[-10:] + return { + "messages": [ + RemoveMessage(id=REMOVE_ALL_MESSAGES), + first_msg, + *recent_messages, + ] + } +``` + +### メッセージの要約 + +組み込みの `SummarizationMiddleware` を使って自動要約を行います。 + +```python +from langchain.agents import create_agent +from langchain.agents.middleware import SummarizationMiddleware +from langgraph.checkpoint.memory import InMemorySaver + +agent = create_agent( + model="us.anthropic.claude-sonnet-4-20250514-v1:0", + tools=tools, + middleware=[ + SummarizationMiddleware( + model="us.anthropic.claude-sonnet-4-20250514-v1:0", + trigger=("tokens", 4000), # トークン数が 4000 を超えたらトリガー + keep=("messages", 20), # 直近 20 メッセージはそのまま保持 + ) + ], + checkpointer=InMemorySaver(), +) +``` + +### 長所と短所 + +| 長所 | 短所 | +| ---------------------------------------- | ------------------------------------------------ | +| LangGraph とのネイティブな統合 | LangGraph 固有のパターンが必要 | +| 他のミドルウェアと組み合わせ可能 | Strands とは API が異なる | +| `SummarizationMiddleware` が複雑性を吸収 | トークンカウンティングのオーバーヘッドが少々ある | + +ドキュメント: **LangGraph Docs**: [Short-term Memory & Summarization](https://docs.langchain.com/oss/python/langchain/short-term-memory) + +--- + +## オプション 4: カスタムフックベースのコンテキスト管理 (Strands) + +高度なユースケース、特に長時間自律稼働エージェントでは、組み込みマネージャでは制御が不足する場合があります。Strands フックを使えば完全カスタムなソリューションを実装できます。 + +このアプローチは以下の場合に最適です: + +- コンテキストウィンドウ使用率の特定の **パーセント** で要約をトリガー(オーバーフロー時のみではない) +- 圧縮後に **外部メモリの再注入**(例: ログファイル、ナレッジベース、構造化された状態)を行いたい +- 要約に **生の Bedrock Converse 呼び出し** を使いたい(エージェントループやツール呼び出しを回避) +- コンテキスト管理アクティビティをフロントエンドに通知するため **カスタムストリームイベント** を発火したい +- 要約失敗時の **フォールバック戦略** を実装したい + +### アーキテクチャ + +このパターンでは 2 つのコンポーネントを協調させます: + +1. **No-op の `ConversationManager`** — Strands の組み込みコンテキスト管理を完全に無効化 +2. **`HookProvider`** — `BeforeModelCallEvent` に登録され、毎 LLM 呼び出し前に能動的なコンテキスト管理を実行 + +### 実装 + +#### ステップ 1: `strands.agent.conversation_manager.ConversationManager` を継承した No-op Conversation Manager を作成 + +```python +from strands.agent.conversation_manager import ConversationManager + + +class NoOpConversationManager(ConversationManager): + """組み込みコンテキスト管理を無効化する。 + + Strands は ConversationManager を要求するが、コンテキスト削減は + フックで自前処理する。両メソッドは意図的に空とする。 + """ + + def apply_management(self, agent, **kwargs): + """No-op: コンテキスト管理はフックで行う。""" + pass + + def reduce_context(self, agent, **kwargs): + """No-op: コンテキスト管理はフックで行う。""" + pass +``` + +#### ステップ 2: コンテキストチェックフックを作成 + +```python +import logging +import os + +import boto3 +from strands.hooks import HookProvider, HookRegistry, BeforeModelCallEvent + +logger = logging.getLogger(__name__) + +# ご利用のモデルのコンテキストウィンドウサイズに合わせて設定してください +CONTEXT_WINDOW_TOKENS = 200_000 # 例: Claude Sonnet + +SUMMARIZATION_PROMPT = """You are a conversation summarizer. Provide a concise summary. + +Format Requirements: +- Create a structured summary in bullet-point format +- Do NOT respond conversationally +- Include: key decisions, tool executions and results, current state, next steps +""" + + +class ContextCheckHook(HookProvider): + """コンテキスト使用率が閾値を超えた際に能動的に会話を要約する。 + + BeforeModelCallEvent で発火する。コンテキストが threshold_pct を超えると、 + 直接 Bedrock Converse 呼び出し(エージェントループ・ツールなし)で + 古いメッセージを要約しつつ、直近のメッセージはそのまま保持する。 + + Args: + threshold_pct: 要約をトリガーするコンテキストウィンドウのパーセント。 + preserve_recent: そのまま保持する直近メッセージの数。 + model_id: 要約呼び出しに使用するモデル ID。 + """ + + def __init__( + self, + threshold_pct: float = 50.0, + preserve_recent: int = 6, + model_id: str = "us.anthropic.claude-sonnet-4-20250514-v1:0", + ): + self.threshold_pct = threshold_pct + self.preserve_recent = preserve_recent + self._model_id = model_id + self._bedrock = None + + def register_hooks(self, registry: HookRegistry, **kwargs) -> None: + """before-model-call チェックを登録する。""" + registry.add_callback(BeforeModelCallEvent, self._check) + + def _check(self, event: BeforeModelCallEvent) -> None: + """コンテキスト使用率を確認し、閾値超過時に要約をトリガーする。""" + agent = event.agent + # 後ろから走査して、usage メタデータを持つ最新の assistant メッセージを探す + for msg in reversed(agent.messages): + if msg.get("role") == "assistant": + usage = msg.get("metadata", {}).get("usage", {}) + if usage: + input_tokens = usage.get("inputTokens", 0) + cache_tokens = usage.get("cacheReadInputTokens", 0) + pct = (input_tokens + cache_tokens) / CONTEXT_WINDOW_TOKENS * 100 + if pct >= self.threshold_pct: + logger.info("Context at %.1f%% — summarizing", pct) + self._summarize_and_replace(agent) + return # 最新の assistant メッセージだけをチェック + + def _summarize_and_replace(self, agent) -> None: + """古いメッセージを要約し、要約で置き換える。""" + messages = agent.messages + if len(messages) <= self.preserve_recent: + return + + # 分割点を探す — tool_use/tool_result のペアを破壊しないように + split = len(messages) - self.preserve_recent + while split > 0 and self._is_tool_result(messages[split]): + split -= 1 + if split <= 0: + return + + to_summarize = messages[:split] + to_keep = messages[split:] + + # 要約呼び出し用にテキストのみのフォーマットへ変換 + converse_messages = self._to_text_only(to_summarize) + converse_messages.append({ + "role": "user", + "content": [{"text": "Please summarize this conversation."}], + }) + + # Bedrock Converse の直接呼び出し — エージェントループもツールもなし + if not self._bedrock: + self._bedrock = boto3.client( + "bedrock-runtime", + region_name=os.environ.get("AWS_DEFAULT_REGION", "us-east-1"), + ) + + try: + response = self._bedrock.converse( + modelId=self._model_id, + system=[{"text": SUMMARIZATION_PROMPT}], + messages=converse_messages, + inferenceConfig={"maxTokens": 4096}, + ) + summary_text = response["output"]["message"]["content"][0]["text"] + except Exception as e: + logger.error("Summarization failed: %s — falling back to truncation", e) + summary_text = "(conversation history truncated due to context limits)" + + # エージェントのメッセージを in-place で置き換える + agent.messages[:] = [ + {"role": "user", "content": [{"text": f"## Previous Conversation Summary\n\n{summary_text}"}]}, + {"role": "assistant", "content": [{"text": "Understood. I'll continue from where we left off."}]}, + ] + to_keep + + def _is_tool_result(self, msg: dict) -> bool: + """メッセージに toolResult ブロックが含まれるかチェックする。""" + content = msg.get("content", []) + if isinstance(content, list): + return any(isinstance(b, dict) and "toolResult" in b for b in content) + return False + + def _to_text_only(self, messages: list[dict]) -> list[dict]: + """メッセージをテキストのみのフォーマットに変換する(toolUse/toolResult ブロックを除去)。 + + Bedrock Converse API では、対応するツール定義をリクエストに含めずに + toolUse ブロックを送ることはできないため、この変換が必要となる。 + """ + result = [] + for msg in messages: + role = msg.get("role") + if role not in ("user", "assistant"): + continue + content = msg.get("content", []) + if isinstance(content, str): + result.append({"role": role, "content": [{"text": content}]}) + continue + text_blocks = [] + for block in content: + if isinstance(block, dict): + if "text" in block: + text_blocks.append({"text": block["text"]}) + elif "toolUse" in block: + name = block["toolUse"].get("name", "unknown") + text_blocks.append({"text": f"[Called tool: {name}]"}) + elif "toolResult" in block: + tr_content = block["toolResult"].get("content", []) + snippet = next( + (c["text"][:200] for c in tr_content if isinstance(c, dict) and "text" in c), + "result received", + ) + text_blocks.append({"text": f"[Tool result: {snippet}]"}) + if text_blocks: + result.append({"role": role, "content": text_blocks}) + + # user / assistant が交互になるよう保証する(Bedrock の要件) + cleaned = [] + for msg in result: + if cleaned and cleaned[-1]["role"] == msg["role"]: + cleaned[-1]["content"].extend(msg["content"]) + else: + cleaned.append(msg) + if cleaned and cleaned[0]["role"] == "assistant": + cleaned.insert(0, {"role": "user", "content": [{"text": "(start of conversation)"}]}) + + return cleaned +``` + +#### ステップ 3: エージェントに組み込む + +```python +from strands import Agent + +agent = Agent( + model=model, + system_prompt=SYSTEM_PROMPT, + tools=tools, + hooks=[ContextCheckHook(threshold_pct=50.0, preserve_recent=6)], + conversation_manager=NoOpConversationManager(), + session_manager=session_manager, +) +``` + +### 高度な使い方: 要約後の外部メモリ再注入 + +会話外に構造化された状態を持つ長時間稼働エージェント(例: 進捗ログ、結果ファイル、ナレッジベース)では、要約後にその状態を再注入することで、圧縮で失われた可能性のある重要なコンテキストを復元できます。 + +```python +def _summarize_and_replace(self, agent) -> None: + # ... (上と同じ要約処理)... + + # メッセージ置き換え後、外部状態を再注入する + self._inject_external_state(agent) + +def _inject_external_state(self, agent) -> None: + """コンテキスト圧縮後、構造化された外部状態を再注入する。""" + state_path = os.environ.get("AGENT_STATE_FILE", "") + if not state_path: + return + try: + with open(state_path) as f: + state_content = f.read() + except FileNotFoundError: + return + + agent.messages.append({ + "role": "user", + "content": [{"text": ( + "Context was compressed. Here is the current state log — " + "use it to recall what has been done and the current status:\n\n" + + state_content + )}], + }) +``` + +このパターンは以下のエージェントで特に強力です: + +- 実行したアクションと観測された結果のログを保持しているエージェント +- 圧縮を跨いで構造化データ(テーブル、設定)を保持する必要があるエージェント +- 試行履歴が重要な反復最適化ループで動作するエージェント + +### 長所と短所 + +| 長所 | 短所 | +| -------------------------------------------------------------------- | ----------------------------------------------------------- | +| トリガータイミングと圧縮挙動を完全制御 | 書く・保守するコード量が多い | +| 外部メモリの再注入を統合可能 | Bedrock API のフォーマット制約を自前で扱う必要がある | +| 能動的 — オーバーフロー前に発火し、より多くの詳細を保持 | メッセージフォーマット内部の理解が必要 | +| Bedrock 直接呼び出しでエージェントループやツール呼び出しの問題を回避 | tool_use / tool_result ペアの分割を自前で処理する必要がある | + +--- + +## 設計上の判断とベストプラクティス + +### 閾値の選び方 + +- **70%**(組み込み能動的圧縮のデフォルト)— 大半のマルチターンチャットエージェントに適しています。モデルの応答用にヘッドルームを確保できます。 +- **50%** — 急速にコンテキストを蓄積する長時間自律稼働エージェントに適しています。早めにトリガーし、要約により多くの詳細を残せます。 +- **オーバーフロー時のみ**(受動的)— 最もシンプルですが、オーバーフローエラーで最後のリクエストが破棄され情報を失うリスクがあります。 + +総じて、閾値はテストデータがあれば定量的に決定できる指標です。例えばさまざまな閾値で実行し、ハルシネーションが発生し始める閾値を見つけ、それより低い値を設定するなどです。A/B テストとユーザーフィードバックシグナルの収集でも判断できます。 + +### ツールペアの保持 + +メッセージをトリミング・分割する際、`toolUse` ブロックとそれに対応する `toolResult` を絶対に分断しないでください。これは不正な会話状態を生み、API エラーを引き起こします。分割点からは必ず後ろ向きに走査して、クリーンな境界を見つけてください。 + +### 要約のためのテキストのみへの変換 + +要約用に別途 Bedrock Converse 呼び出しを行う場合、対応するツール定義を提供せずに `toolUse` や `toolResult` ブロックを含めることはできません。最もシンプルな解決策は、これらのブロックをテキスト記述に変換することです(例: `[Called tool: analyze_data]`、`[Tool result: 42 records processed]`)。 + +### コストの考慮 + +要約呼び出しは追加の LLM 呼び出しになります: + +- Claude Sonnet で約 50K トークンのコンテキストを要約するコストは概ね $0.15〜$0.25 です +- 要約を頻繁にトリガーするエージェントでは、要約呼び出しに小型・低コストのモデルの利用を検討してください +- スライディングウィンドウ方式は追加コストはゼロですが情報を失います + +### 会話の妥当性ルール (Bedrock Converse API) + +`agent.messages` を直接操作する際は、以下を保証してください: + +1. メッセージは `user` と `assistant` のロールを交互に持つ +2. 会話は `user` メッセージで開始する +3. すべての `toolUse` ブロックには次の user メッセージに対応する `toolResult` がある +4. 空の content ブロックがない + +--- + +## クイックリファレンス: どのオプションを選ぶか + +| ユースケース | 推奨アプローチ | +| ---------------------------------------------------- | -------------------------------------------------------------- | +| シンプルなチャットボット、短い会話 | スライディングウィンドウ(オプション 1) | +| 中程度の長さのマルチターンアシスタント | 能動的圧縮を有効化した要約マネージャ(オプション 2) | +| LangGraph ベースのエージェント | LangGraph ミドルウェア(オプション 3) | +| 長時間(数時間)自律稼働するエージェント | 外部メモリ再注入を伴うカスタムフック(オプション 4) | +| 大きなツール結果(画像、ファイル)を扱うエージェント | `per_turn=True` と切り詰めを有効化したスライディングウィンドウ | + +--- + +## 参考資料 + +- [Strands ConversationManager API](https://strandsagents.com/docs/api/python/strands.agent.conversation_manager.conversation_manager/) +- [Strands SlidingWindowConversationManager](https://strandsagents.com/docs/api/python/strands.agent.conversation_manager.sliding_window_conversation_manager/) +- [Strands SummarizingConversationManager](https://strandsagents.com/docs/api/python/strands.agent.conversation_manager.summarizing_conversation_manager/) +- [Strands Hooks API](https://strandsagents.com/docs/api/python/strands.hooks.events/) +- [LangGraph Short-term Memory](https://docs.langchain.com/oss/python/langchain/short-term-memory) +- [LangMem Summarization Guide](https://langchain-ai.github.io/langmem/guides/summarization/) +- [FAST Memory Integration Guide](./MEMORY_INTEGRATION.md) + +## Design notes + +本派生プロジェクト固有のチャット UX 設計判断: + +- **Lambda バックの履歴サイドバー**: 過去の会話は専用 history API 経由で一覧し、各セッションは DynamoDB 上のインデックスから復元する。DDB にはインデックスだけを保存しメッセージ本体は保存しないので書き込みが安く、Memory との重複も避けられる。 +- **ストリーミングイベントのスリム化**: AgentCore Runtime のイベントサイズ上限に当たらないように、ストリーミングペイロードを最小化している。診断用データはワイヤフォーマットから外し、クライアント側で再構築する。 +- **スティッキー auto-scroll**: チャットの自動スクロールはユーザーが最下部にいるときだけ作動する。ストリーミング中に過去メッセージを読んでいる最中に途切れさせない。 +- **Cmd+Enter で送信 (IME 安全)**: 日本語などの IME 変換イベントを検出し、変換中の Enter では送信しない。Cmd/Ctrl+Enter を送信の正規バインディングにしている。 +- **OpenAI の toolUseId 使い回しを許容**: OpenAI は同一ターン内で `toolUseId` をラウンド跨ぎで再利用するが Anthropic は再利用しない。チャット UI はツール呼び出しを ID 一意の前提を持たずに追跡する。 +- **Mermaid レンダリング**: エージェント応答中の ` ```mermaid ` フェンスをクライアント側で SVG にレンダリングし、別ツール不要でアーキテクチャ説明に図を載せられるようにしている。 diff --git a/samples/aws-specialist-agent/docs-jp/DEPLOYMENT.md b/samples/aws-specialist-agent/docs-jp/DEPLOYMENT.md new file mode 100644 index 0000000..61cebcb --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/DEPLOYMENT.md @@ -0,0 +1,476 @@ +# デプロイガイド + +このガイドでは、Fullstack AgentCore Solution Template (FAST) を AWS にデプロイする手順を説明します。 + +## 前提条件 + +デプロイを行う前に、以下を準備してください。 + +- **Node.js 20+** がインストールされていること([AWS guide for installing Node.js on EC2](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html) を参照) +- **AWS CLI** が認証情報とともに構成されていること(`aws configure`)- [AWS CLI Configuration guide](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html) を参照 +- **AWS CDK CLI** がインストールされていること: `npm install -g aws-cdk`([CDK Getting Started guide](https://docs.aws.amazon.com/cdk/v2/guide/getting-started.html) を参照) +- **Python 3.11 以上**(標準ライブラリのみ - デプロイには仮想環境は不要) +- **Docker** - すべてのデプロイで必要です。[Install Docker Engine](https://docs.docker.com/engine/install/) を参照してください。`docker ps` で確認できます。代わりに Mac では [Finch](https://github.com/runfinch/finch) を使用することもできます。non-ARM マシンを使用している場合は以下を参照してください。 +- 以下を作成するための十分な権限を持つ AWS アカウント: + - S3 buckets + - CloudFront distributions + - Cognito User Pools + - Amplify Hosting projects + - Bedrock AgentCore resources + - IAM roles and policies + +### 別のアカウント/リージョンへデプロイする場合 + +コミット済みの `config.yaml` は **us-east-1** で検証済みです。同一アカウント・同一リージョン内であれば、`vpc_cidr` を他と重複しない値にし、`admin_user_email` を実在アドレスに変えるだけでそのままデプロイできます。**別アカウントや別リージョン**へデプロイする場合は、加えて以下が必要です。 + +1. **リージョンは us-east-1(現時点)。** AgentCore Web Search が us-east-1 のみ提供のため、それ以外のリージョンでは意図的にデプロイが早期失敗します。OpenAI(GPT)モデルも同リージョンの `bedrock-mantle` エンドポイント経由で到達します。別リージョンにするには、先に Web Search ターゲットと OpenAI モデルを外す必要があります。 +2. **アカウントに合った AZ をピン留めする。** AgentCore Runtime の VPC モードは特定の AZ **ID**(us-east-1: `use1-az1` / `use1-az2` / `use1-az4`)のみ対応し、AZ 名 → ID のマッピングはアカウント固有です。既定の `availability_zones: [us-east-1b, us-east-1d]` は検証アカウントでは対応 ID にマップされますが、あなたのアカウントでは異なる可能性があります。`aws ec2 describe-availability-zones --query "AvailabilityZones[].[ZoneName,ZoneId]" --output table` で正しい AZ 名を導出し、対応 ID にマップされる 2 つの名前を `backend.availability_zones` に設定してください(外れるとサブネット作成が失敗します)。 +3. **Bedrock のモデルアクセスを有効化する。** 選択可能なモデル(Claude Fable 5 / Opus / Sonnet / Haiku と OpenAI GPT)がアカウントで有効である必要があります。Claude Fable 5 はさらに、呼び出し元リージョンで Bedrock のデータ保持モードを `provider_data_share` に設定する必要があります(後述の「Claude Fable 5 の有効化」を参照)。アクセスのないモデルは `infra-cdk/lib/utils/model-registry.ts` で `available: false` にしてください。 + +## 構成 + +### 1. 構成ファイルの更新 + +`infra-cdk/config.yaml` を編集してデプロイをカスタマイズします。 + +```yaml +stack_name_base: your-project-name # 任意のスタック名に変更してください(最大 35 文字) + +admin_user_email: null # 任意: admin@example.com(ユーザーを自動作成して認証情報をメール送信) + +backend: + pattern: strands-single-agent # 利用可能なパターン: strands-single-agent, langgraph + deployment_type: docker # 利用可能なデプロイタイプ: docker (default), zip +``` + +**重要**: + +- 競合を避けるため、`stack_name_base` をプロジェクト固有の一意な名前に変更してください +- 最大長は 35 文字です(AWS AgentCore runtime の命名規則による制約) +- コミット済みの `infra-cdk/config.yaml` では `admin_user_email` がダミー値(`your-email+fastprojectadmin@example.com`)になっています。**デプロイ前に必ず自分の実在する受信可能なアドレスに変更してください** — 管理者ユーザーの一時パスワードがこのアドレスに送信されるため、ダミーのままだとサインインできません。 +- department/role の認可はメールアドレスではなく Cognito の**グループ所属**で決まります。グループ所属は CDK 管理外の運用データなので、デプロイ後に管理者ユーザーをグループに追加してください(例: `aws cognito-idp admin-add-user-to-group --user-pool-id --username --group-name finance`)。未所属のままだと "guest" 扱いで全 Gateway ツールが拒否されます。 + +### デプロイタイプ + +FAST は AgentCore Runtime に対して 2 つのデプロイタイプをサポートしています。`infra-cdk/config.yaml` で `deployment_type` を設定します。 + +| タイプ | 説明 | +| ------------------ | ------------------------------------------------------------ | +| `docker` (default) | コンテナイメージをビルドし、ECR にプッシュします | +| `zip` | Lambda 経由でコードをパッケージ化し、S3 にアップロードします | + +**補足**: どちらのデプロイタイプでも Docker は必要です。`zip` オプションは agent runtime のパッケージ化方法にのみ影響します。スタック内の他の Lambda 関数は依然として依存関係のバンドルに Docker を使用します。 + +**Docker (デフォルト) を使用するケース:** + +- PyPI で ARM64 wheel が提供されていないネイティブ C/C++ ライブラリが必要な場合 +- デプロイパッケージが 250 MB を超える場合 +- カスタムの OS レベル依存関係が必要な場合 +- 最大限の互換性を求める場合 + +**ZIP を使用するケース:** + +- 開発時の反復速度を高めたい場合 +- 依存関係が pure Python であるか、ARM64 wheel が利用可能な場合 +- セッションスループットを高めたい場合 + +**ZIP パッケージに含まれるもの**: `agent//`、`agent/utils/`、`gateway/`、`tools/` の各ディレクトリが、`requirements.txt` の依存関係とともにバンドルされます。これは Docker デプロイの Dockerfile における `COPY` コマンドに対応しています。 + +### VPC デプロイ(プライベートネットワーク) + +デフォルトでは、AgentCore Runtime はインターネットアクセス可能な PUBLIC ネットワークモードで動作します。プライベートなネットワーク分離のために既存の VPC へ runtime をデプロイするには、`infra-cdk/config.yaml` で `network_mode: VPC` を設定し、VPC の詳細を指定します。 + +#### VPC の内側/外側で動作するもの + +VPC モードを有効にすると、**AgentCore Runtime**(エージェントコード)は VPC のプライベートサブネット内で動作します。エージェントが行うすべてのネットワーク呼び出しは VPC のネットワーキングルールに従い、AWS サービスには VPC エンドポイント経由で到達します。エージェントが直接インターネット呼び出しを行うことはありません。 + +以下のコンポーネントは VPC の **外側** にある AWS マネージドインフラストラクチャで動作します。 + +- **Gateway tool Lambdas** — エージェントは `bedrock-agentcore.gateway` VPC エンドポイント経由で Gateway を呼び出します(プライベートネットワーキング)。Gateway はその後、AWS マネージドインフラストラクチャ上で Lambda 関数を呼び出します。エージェントのネットワーク呼び出し自体はプライベートに保たれ、Lambda の実行のみ VPC の外で行われます。 +- **Code Interpreter** — エージェントは `bedrock-agentcore` VPC エンドポイント経由で Code Interpreter API を呼び出します。サンドボックス実行は Bedrock のマネージド環境で行われます。 +- **Bedrock model invocations** — モデル呼び出しは `bedrock-runtime` VPC エンドポイント経由で Bedrock のマネージドインフラストラクチャに到達します。 +- **Frontend (Amplify/CloudFront)** — 完全に分離されており、パブリック向けで、VPC デプロイの一部ではありません。 + +要するに、エージェントの送信ネットワークトラフィックは VPC エンドポイント経由でプライベートな AWS ネットワーキング上に留まります。エージェントが呼び出すサービス(Bedrock、Gateway、Code Interpreter)は VPC 外のインフラストラクチャ上で実行される場合がありますが、エージェントからそれらのサービス API へのネットワーク経路はプライベートです。 + +#### 構成 + +```yaml +backend: + pattern: strands-single-agent + deployment_type: docker + network_mode: VPC + vpc: + vpc_id: vpc-0abc1234def56789a + subnet_ids: + - subnet-aaaa1111bbbb2222c + - subnet-cccc3333dddd4444e + security_group_ids: # 任意 - 省略時はデフォルトの SG が作成されます + - sg-0abc1234def56789a +``` + +`vpc_id` および `subnet_ids` フィールドは必須です。`security_group_ids` フィールドは任意で、省略した場合は CDK construct が runtime 用のデフォルトセキュリティグループを作成します。 + +#### 必要な VPC エンドポイント + +VPC モードでデプロイすると、runtime はインターネットアクセスのないプライベートサブネット内で動作します。エージェントが依存する AWS サービスに到達できるよう、VPC には以下の VPC エンドポイントを構成しておく必要があります。 + +| Endpoint | Service | Type | +| -------------------------------------------------- | -------------------------------- | --------- | +| `com.amazonaws.{region}.bedrock-runtime` | Bedrock model invocation | Interface | +| `com.amazonaws.{region}.bedrock-agentcore` | AgentCore Identity (Token Vault) | Interface | +| `com.amazonaws.{region}.bedrock-agentcore.gateway` | AgentCore Gateway (MCP tools) | Interface | +| `com.amazonaws.{region}.ssm` | SSM Parameter Store | Interface | +| `com.amazonaws.{region}.secretsmanager` | Secrets Manager | Interface | +| `com.amazonaws.{region}.logs` | CloudWatch Logs | Interface | +| `com.amazonaws.{region}.ecr.api` | ECR API (Docker deployment) | Interface | +| `com.amazonaws.{region}.ecr.dkr` | ECR Docker (Docker deployment) | Interface | +| `com.amazonaws.{region}.s3` | S3 (ZIP deployment, ECR layers) | Gateway | +| `com.amazonaws.{region}.dynamodb` | DynamoDB (feedback table) | Gateway | +| `com.amazonaws.{region}.xray` | X-Ray (OTel trace export) | Interface | +| `com.amazonaws.{region}.bedrock-mantle` | OpenAI GPT-5.x (Responses API) | Interface | + +`{region}` をデプロイリージョン(例: `us-east-1`)に置き換えてください。 + +すべての interface endpoint は private DNS を有効化し、AgentCore Runtime からのトラフィックを許可するサブネットおよびセキュリティグループに関連付ける必要があります。 + +#### サブネット要件 + +- CDK が管理する VPC は **完全に隔離されたプライベートサブネット**(`PRIVATE_ISOLATED`)を使用します。`0.0.0.0/0` ルートは一切ありません +- 高可用性のため、AgentCore がサポートする AZ(少なくとも 2 つ)にピン留めします +- runtime ENI のために十分な利用可能 IP アドレスを持つサブネットを使用してください + +#### NAT Gateway なし(完全閉域) + +デフォルトのデプロイには **NAT Gateway がなく**、アウトバウンドのインターネットアクセスもありません。すべての依存先に VPC エンドポイント経由で到達できるため、これで動作します。 + +- Gateway 用 M2M トークンは AgentCore Identity(Token Vault)経由で取得します。Cognito トークン交換は AWS 内のサーバーサイドで実行され、`bedrock-agentcore` VPC エンドポイント経由で到達可能なため、Runtime はパブリックな Cognito ホストドメインを呼び出しません。 +- ユーザーアイデンティティは `aws_client_metadata` で M2M トークンに伝播されます(追加の egress 不要)。 +- S3 Files(skills)は **VPC 内の** マウントターゲット ENI に NFS(ポート 2049)でマウントします。AgentCore の VPC ドキュメントによれば、マウントに必要なのは runtime ENI とマウントターゲット間の TCP 2049 接続のみ(self-reference のセキュリティグループで許可)で、専用の VPC エンドポイントも NAT も不要です(TLS と IAM 認証は自動で処理されます)。 + +> **補足:** アウトバウンドの _パブリックインターネット_ 呼び出しを行うカスタムツール(または Browser ツール)を追加する場合は、NAT Gateway を再導入する必要があります。AWS サービスであれば、対応する VPC エンドポイントを追加することで到達できます。 + +#### セキュリティグループの構成 + +CDK スタックは AgentCore Runtime 用のセキュリティグループを自動作成します。同じセキュリティグループは通常 VPC エンドポイントにも適用されます。runtime からエンドポイントへ到達できるように、自己参照のインバウンドルールを追加する必要があります。 + +- Protocol: TCP, Port: 443, Source: セキュリティグループ自身 + +### OpenAI モデル(GPT-5.x / bedrock-mantle 経由) + +ピッカーに表示される OpenAI モデル(GPT-5.4 / GPT-5.5)は `bedrock-mantle` エンドポイント(OpenAI Responses API)経由で提供され、2026-06 から us-east-1 でも利用可能になりました。CDK 管理の VPC は同リージョンの `bedrock-mantle` interface endpoint を常設します(上のエンドポイント表を参照)。追加スタック・フラグ・クロスリージョンネットワークは不要で、素の `cdk deploy` だけで GPT モデルも使えます(旧 `OPENAI_MANTLE` の us-east-2 ピアリングスタックは撤去済み)。 + +### 複数環境のデプロイ(同一アカウント・同一リージョン) + +第 2 の環境(本番と並存する開発スタックなど)にコード変更は不要です。config ファイルを別途作成し、`CONFIG_FILE` 環境変数で選択します。 + +```yaml +# infra-cdk/config.dev.yaml(gitignore 対象 — 実在の管理者メールを含むため) +stack_name_base: FAST-dev # 必ず変える: CloudFormation エクスポートや Cognito ドメインがここから導出される +admin_user_email: you@example.com +backend: + pattern: strands-single-agent + deployment_type: docker + network_mode: VPC + vpc_management: CDK + vpc_cidr: 10.30.0.0/16 # 他環境と重複させない(本番は 10.20.0.0/16) + use_long_term_memory: true + skills: + enabled: true + mount_path: /mnt/skills +``` + +```bash +cd infra-cdk +# 全機能(VPC + skills + LTM + OpenAI モデル)を一括デプロイ: +CONFIG_FILE=config.dev.yaml npx cdk deploy --all --require-approval never +cd .. +python scripts/deploy-frontend.py FAST-dev # 指定したスタックの Outputs からフロントを構成 +``` + +並存のルール: + +- `stack_name_base` は環境ごとに一意にすること — すべての名前付きリソースと CloudFormation エクスポートがここから導出されます。 +- `vpc_cidr` は他環境と重複させないこと: ネットワークの区別が運用上明確に保たれます(将来ピアリングが必要になった場合にも張れる状態を保てます)。 +- `CONFIG_FILE` なしの素の `cdk deploy` は常に本番の `config.yaml` を対象とします — 切り替えは環境変数のみなので、「ファイルの戻し忘れ」が構造的に発生しません。 +- **別の AWS アカウント**にデプロイする場合は `backend.availability_zones` も設定してください: AgentCore Runtime の VPC モードはリージョンごとに特定の AZ _ID_(us-east-1 では use1-az1/az2/az4)しかサポートせず、AZ 名 → ID のマッピングはアカウント固有です。`aws ec2 describe-availability-zones` で正しい AZ 名を導出してください。 + +## デプロイ手順 + +### TL;DR 版 + +バックエンドおよびフロントエンドをデプロイするコマンドは以下のとおりです。 + +```bash +cd infra-cdk +npm install +cdk bootstrap # 一度だけ実行 +cdk deploy +cd .. +python scripts/deploy-frontend.py +``` + +### ローカルツールなしでデプロイ(CodeBuild 経由) + +ローカルに Node.js、Docker、または CDK がインストールされていない場合でも、一時的な CodeBuild プロジェクトを利用して完全にクラウド上でデプロイできます。必要なのは Python 3.8+ と AWS CLI のみです。 + +```bash +python scripts/deploy-with-codebuild.py +``` + +詳細および必要な IAM 権限については `scripts/README.md` を参照してください。 + +### 1. 依存関係のインストール + +インフラストラクチャの依存関係をインストールします。 + +```bash +cd infra-cdk +npm install +``` + +**補足**: フロントエンドの依存関係はデプロイ時に Docker bundling 経由で自動インストールされるため、別途フロントエンドの `npm install` を実行する必要はありません。 + +### 2. CDK のブートストラップ(初回のみ) + +この AWS アカウント/リージョンで初めて CDK を使用する場合は以下を実行します。 + +```bash +cdk bootstrap +``` + +### 3. CDK でバックエンドをデプロイ + +スタック全体をビルドおよびデプロイします。 + +```bash +cdk deploy +``` + +デプロイでは以下が実行されます。 + +1. 認証用の Cognito User Pool を作成 +1. agent コンテナをビルドして ECR にプッシュ +1. AgentCore runtime を作成 +1. フロントエンド用の CloudFront ディストリビューションを構成 + +**補足**: コンテナビルドおよび AgentCore のセットアップにより、デプロイには約 5〜10 分かかります。 + +**デプロイ前にスキル関連スクリプトを手動実行する必要はありません。** `skills/agent-toolkit-for-aws/` 配下のベンダリング済み AWS スキルはリポジトリにコミットされており、`fast-project-guide` スキルは synth 時に `cdk` が自動再生成します(skills-storage スタックの bundling 経由で `scripts/build-project-guide.py` を実行)。`scripts/vendor-skills.py` は上流の新しいコミットからベンダリング済みスキルを更新したいときだけ実行するメンテ用スクリプトで、デプロイ手順ではありません。`cdk deploy` だけで完結します。 + +### 4. フロントエンドをデプロイ + +```bash +# ルートディレクトリから実行 +python scripts/deploy-frontend.py +``` + +このスクリプトは自動的に以下を行います。 + +- CDK スタックの出力から最新の `aws-exports.json` を生成(`aws-exports.json` の詳細は後述) +- 必要に応じて npm 依存関係をインストール/更新 +- フロントエンドをビルド +- AWS Amplify Hosting にデプロイ + +スクリプトの出力にアプリケーションの URL が表示されます。次のような形式になります。 + +``` +ℹ App URL: https://main.d123abc456def7.amplifyapp.com +``` + +### 5. Cognito ユーザーの作成(必要な場合) + +**`admin_user_email` を config に指定した場合:** + +- 仮パスワードがメールで届きます +- サインインして初回ログイン時にパスワードを変更します + +**メールを指定しなかった場合:** + +1. [AWS Cognito Console](https://console.aws.amazon.com/cognito/) を開きます +2. 該当する User Pool(名前は `{stack_name_base}-user-pool`)を見つけます +3. User Pool をクリックします +4. "Users" タブに移動します +5. "Create user" をクリックします +6. ユーザー詳細を入力します: + - **Email**: メールアドレス + - **Temporary password**: 仮パスワードを作成 + - **Mark email as verified**: このボックスにチェック +7. "Create user" をクリックします + +### 6. アプリケーションへのアクセス + +1. Amplify Hosting の URL をブラウザで開きます +1. 作成した Cognito ユーザーでサインインします +1. 初回ログイン時に仮パスワードの変更を求められます + +## デプロイ後 + +### アプリケーションの更新 + +フロントエンドコードを更新する場合: + +```bash +# ルートディレクトリから実行 +python scripts/deploy-frontend.py +``` + +バックエンドエージェントを更新する場合: + +**Docker デプロイ:** + +```bash +cd infra-cdk +cdk deploy --all +``` + +### モニタリングとログ + +- **フロントエンドログ**: CloudFront アクセスログを確認 +- **バックエンドログ**: AgentCore runtime の CloudWatch logs を確認 +- **ビルドログ**: コンテナビルドの CodeBuild プロジェクトログを確認 + +## クリーンアップ + +すべてのリソースを削除するには以下を実行します。 + +```bash +cd infra-cdk +cdk destroy --force +``` + +**警告**: これによりデプロイ中に作成された S3 buckets および ECR images を含むすべてのデータが削除されます。 + +## トラブルシューティング + +### よくある問題 + +1. **`cdk deploy` が Docker エラーで失敗する** + - Docker がインストールされ、デーモンが動作していることを確認: `docker ps` + - Mac では Docker Desktop を開くか Finch を起動: `finch vm start` + - Linux では: `sudo systemctl start docker` + +2. **Docker ビルド中に "Architecture incompatible" や "exec format error" が出る** + - クロスプラットフォームビルドの設定なしに non-ARM マシンからデプロイした場合に発生します + - 前提条件セクションの "Docker Cross-Platform Build Setup" の手順に従ってください + - QEMU エミュレーションをインストール済みであることを確認: `docker run --privileged --rm tonistiigi/binfmt --install all` + - ARM64 サポートを確認: `docker buildx ls` でプラットフォームに `linux/arm64` が表示されるはずです + +3. **"Agent Runtime ARN not configured"** + - バックエンドスタックが正常にデプロイされたことを確認してください + - SSM パラメータが正しく作成されているか確認してください + +4. **認証エラー** + - Cognito ユーザーを作成したことを確認 + - ユーザーのメールアドレスが verified になっていることを確認 + +5. **ビルド失敗** + - AWS Console で CodeBuild ログを確認 + - `agent/` 内の agent コードが正しいことを確認 + +6. **権限エラー** + - AWS 認証情報に十分な権限があることを確認 + - スタックが作成した IAM ロールを確認 + +### サポートを得る + +- 詳細なエラーメッセージは CloudWatch logs を確認してください +- CDK デプロイ出力に警告がないか確認してください +- すべての前提条件が満たされていることを確認してください + +## セキュリティ上の考慮事項 + +- Cognito User Pool は強力なパスワードポリシーで構成されています +- すべての通信は CloudFront 経由で HTTPS を使用します +- AgentCore runtime は JWT 認証を使用します +- IAM ロールは最小権限の原則に従います + +本番環境のデプロイでは、以下の検討をお勧めします。 + +- Cognito ユーザーで MFA を有効にする +- 独自証明書を用いたカスタムドメインを設定する +- 追加のモニタリングとアラートを構成する +- 永続データに対するバックアップ戦略を実装する + +## Docker クロスプラットフォームビルド設定(non-ARM マシンで必要) + +**重要**: BedrockAgentCore Runtime は ARM64 アーキテクチャのみをサポートしています。non-ARM マシン(x86_64/amd64)からデプロイする場合は、Docker のクロスプラットフォームビルド機能を有効にする必要があります。 + +マシンのアーキテクチャを確認します。 + +```bash +uname -m +``` + +出力が `x86_64`(`aarch64` や `arm64` ではない)の場合は、以下のコマンドを実行してください。 + +1. **ARM64 エミュレーション用に QEMU をインストール:** + + ```bash + docker run --privileged --rm tonistiigi/binfmt --install all + ``` + +2. **Docker buildx を有効化し、マルチプラットフォームビルダーを作成:** + + ```bash + docker buildx create --use --name multiarch --driver docker-container + docker buildx inspect --bootstrap + ``` + +3. **ARM64 サポートが利用可能であることを確認:** + ```bash + docker buildx ls + ``` + プラットフォーム一覧に `linux/arm64` が表示されるはずです。 + +**補足**: この設定はマシンごとに 1 度だけ必要です。CDK デプロイは ARM64 コンテナをビルドするためにこれらの機能を自動的に使用します。 + +## aws-exports.json の理解 + +`aws-exports.json` ファイルは、React フロントエンドが AWS Cognito と通信して認証を行うための重要な構成ファイルです。このファイルはフロントエンドデプロイ時に自動生成され、Cognito 認証に必要な構成パラメータを含みます。 + +**aws-exports.json とは何か?** + +`aws-exports.json` ファイルは、React アプリケーションが Cognito Authentication を適切に構成するために読み込む認証構成を含みます。デプロイスクリプトによって自動的に作成され、`frontend/public/aws-exports.json` に配置されます。 + +**なぜ必要か?** + +この構成ファイルは以下の理由で不可欠です。 + +- React アプリケーションに正しい Cognito User Pool ID および Client ID を提供する +- 認証エンドポイントとリダイレクト URI を指定する +- 認証フローのパラメータを構成する +- このファイルがないと Cognito 認証は機能しない + +**どのように作成されるか?** + +このファイルは `deploy-frontend.py` によって自動生成され、以下の処理を行います。 + +1. デプロイ済み CDK スタックの出力から構成を抽出 +2. CloudFormation スタック ARN から AWS リージョンを自動検出 +3. 必要な値(`CognitoClientId`、`CognitoUserPoolId`、`AmplifyUrl`)を取得 +4. 以下の構造で構成ファイルを生成: + +```json +{ + "authority": "https://cognito-idp.region.amazonaws.com/user-pool-id", + "client_id": "your-client-id", + "redirect_uri": "https://your-amplify-url", + "post_logout_redirect_uri": "https://your-amplify-url", + "response_type": "code", + "scope": "email openid profile", + "automaticSilentRenew": true +} +``` + +**重要**: このファイルはデプロイのたびに再生成されるため、手動で編集しないでください。認証が機能しない場合は、フロントエンドを再デプロイして最新の構成を取得してください。 + +## Design notes + +本派生プロジェクトに固有の設計判断 (upstream にない補足): + +- **完全閉域 (NAT なし)**: AWS API への外向きトラフィックは全て interface VPC endpoint 経由。NAT gateway は意図的に未配置で、NAT の固定費を削減しつつ egress を明示的に許可した endpoint だけに制限する。 +- **AgentCore Gateway VPC endpoint は必須**: Runtime が VPC 内から Gateway を呼ぶ場合、`bedrock-agentcore` interface endpoint がないとツール呼び出しがネットワーク層で失敗する。 +- **endpoint 集合はキュレーション**: 各 interface endpoint は VPC 内からの実呼び出しコードに紐付けて配置している。使用しなくなった endpoint (例: 直接 Bedrock Agent 呼び出しを廃止した後の `bedrock-agent-runtime`) は削除しコストと攻撃面を抑える。 +- **VPC CIDR と AZ をパラメータ化**: `config.yaml` で `vpc_cidr` と AZ リストを公開し、同一アカウントに複数環境を共存させたり、必要なサービス非対応の AZ を回避したりできる。 +- **Cold-start 緩和**: AgentCore Runtime のコンテナ寿命を長く取り、フロントエンドから pre-warm ping を送る構成にしている。別途 warmer Lambda を運用せずに初トークン遅延を抑える狙い。 diff --git a/samples/aws-specialist-agent/docs-jp/GATEWAY.md b/samples/aws-specialist-agent/docs-jp/GATEWAY.md new file mode 100644 index 0000000..b28bc73 --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/GATEWAY.md @@ -0,0 +1,485 @@ +# AgentCore Gateway 実装 + +このドキュメントでは、FAST がスケーラブルで本番運用に耐えるツール実行アーキテクチャを提供するために、AgentCore Gateway と Lambda targets をどのように実装しているかを説明します。 + +## 概要 + +FAST は **AgentCore Gateway with Lambda Targets** を使用して、エージェントが外部のツールやサービスにアクセスできるようにしています。このアーキテクチャは、エージェントロジックとツール実装の明確な分離を提供し、個々のツールを独立してスケーリングおよびデプロイできるようにします。 + +### エージェントが利用できるもの + +デプロイされたエージェントは 3 つのケイパビリティソースを持ちます。 + +1. **Lambda ターゲット(`sample-tool-target`)** — デモ用の `text_analysis_tool`。詳細は後述。 +2. **AWS MCP Server ターゲット(`aws-mcp`)** — マネージドな Agent Toolkit for AWS の MCP Server(`https://aws-mcp..api.aws/mcp`)を MCP gateway ターゲットとして登録したもの。`aws___*` ツール(AWS の知識に加え `aws___call_aws` / `aws___run_script`)を公開します。Gateway はサービス名 `aws-mcp` にスコープした SigV4 でリクエストに署名します。 +3. **S3 Files 経由の Skills** — ベンダリングした AWS skills を S3 に同期し、S3 Files で Runtime の `/mnt/skills` にマウントして、Strands `AgentSkills` プラグインがエージェントに公開します(Gateway ターゲットではありません)。`infra-cdk/lib/skills-storage-stack.ts` を参照。 + +**ユーザーごとのツールアクセス:** Gateway の Cedar policy が、ユーザーの `department` クレーム(`cognito:groups` から解決。[Identity Propagation](IDENTITY_POLICY.md) 参照)に基づいて _誰が_ 各ツールを呼べるかを制御します。読み取り系ツールは finance + engineering に許可、破壊的な `aws___call_aws` / `aws___run_script` は finance のみ、guest は拒否です。拒否されたツールは `tools/list` の段階で非表示になります。 + +## アーキテクチャの比較 + +### スタンドアロン MCP Gateway と Lambda Targets + +AgentCore Gateway を実装するには 2 つの主要なアプローチがあります。 + +#### スタンドアロン MCP Gateway + +- Gateway が直接 MCP (Model Context Protocol) サーバーを実装 +- ツールが gateway インフラストラクチャに組み込まれている +- 基本的なシナリオではセットアップが簡単 +- クライアント → gateway の直接通信 + +#### Lambda Targets (FAST の選択) + +- Gateway が外部 Lambda 関数へのプロキシ/ルーターとして動作 +- 各ツールは別々の Lambda 関数として実装される +- クライアント → Gateway → Lambda → Gateway → クライアントの流れ +- エンタープライズ用途のメリットを備えた本番運用向けアーキテクチャ + +### FAST が Lambda Targets を採用する理由 + +以下の本番運用上の利点から Lambda targets を選択しました。 + +1. **関心の分離**: ビジネスロジックは Lambda 関数内にあり、gateway インフラストラクチャ側には存在しない +2. **独立したスケーリング**: 各ツールを利用パターンに応じて独立してスケールできる +3. **保守性**: gateway インフラストラクチャに触れることなくツールロジックを更新できる +4. **再利用性**: 同じ Lambda を複数の gateway や他のサービスから使用できる +5. **言語の柔軟性**: 各 Lambda が異なるプログラミング言語を使用できる +6. **独立したデプロイ**: gateway のダウンタイムなしでツール更新をデプロイできる +7. **コスト最適化**: 実際のツール実行時間に対してのみ料金が発生する +8. **セキュリティ**: 各 Lambda に必要な要件に応じた IAM 権限を個別に設定できる + +## 実装の詳細 + +### Gateway の構成 + +gateway は以下の構成で AWS CDK の L1 constructs を用いて作成されます。 + +- **Protocol Type**: MCP (Model Context Protocol) +- **Authorization**: Cognito 統合によるカスタム JWT +- **Authentication**: Machine-to-machine の client credentials フロー +- **Target Type**: AWS Lambda 関数 +- **Optional Features**: Semantic search(ツール検索のために有効化可能) + +### Lambda Target の構造 + +FAST における各 Lambda target は次のパターンに従います。 + +```python +def handler(event, context): + # context からツール名を取得(target prefix を除去) + delimiter = "___" + original_tool_name = context.client_context.custom['bedrockAgentCoreToolName'] + tool_name = original_tool_name[original_tool_name.index(delimiter) + len(delimiter):] + + # event にはツールの引数が直接入っている + arguments = event + + # 期待される形式でレスポンスを返す + return { + 'content': [ + { + 'type': 'text', + 'text': 'Tool response here' + } + ] + } +``` + +#### ツール呼び出しプロトコルの詳細 + +**重要な実装上の注意点:** + +ツール名は event の body には **渡されません**。Gateway は Lambda の context オブジェクト経由でツール名を渡します。 + +```python +# ツール名の取得場所 +original_tool_name = context.client_context.custom['bedrockAgentCoreToolName'] + +# 引数は event body にある +name = event.get('name', 'World') +``` + +**ツール名のフォーマット:** + +Gateway はターゲット名を 3 つのアンダースコアを区切り文字として prefix に含めます。 + +``` +{target_name}___{tool_name} +``` + +例: `sample_tool_target___sample_tool` + +**完全な動作実装例:** + +```python +import json +import logging + +logger = logging.getLogger() +logger.setLevel(logging.INFO) + +def lambda_handler(event, context): + try: + # context からツール名を取得 + original_tool_name = context.client_context.custom['bedrockAgentCoreToolName'] + logger.info(f"Received tool invocation: {original_tool_name}") + logger.info(f"Event: {json.dumps(event)}") + + # target prefix を除去 + delimiter = "___" + if delimiter in original_tool_name: + tool_name = original_tool_name[original_tool_name.index(delimiter) + len(delimiter):] + else: + tool_name = original_tool_name + + # 適切なツールハンドラーへルーティング + if tool_name == "sample_tool": + name = event.get('name', 'World') + result = f"Hello, {name}! This is a sample tool from FAST." + return {"result": result} + else: + raise ValueError(f"Unknown tool: {tool_name}") + + except Exception as e: + logger.error(f"Error in lambda_handler: {str(e)}", exc_info=True) + raise +``` + +**Lambda ごとに複数のツールを処理:** + +抽出したツール名でルーティングすることで、1 つの Lambda で複数のツールを処理できます。 + +```python +if tool_name == "tool_one": + # tool one を処理 + pass +elif tool_name == "tool_two": + # tool two を処理 + pass +``` + +これは AWS samples で使用されている有効な本番運用パターンです。 + +### ツールスキーマの定義 + +ツールは CDK スタック内で JSON schema を用いて定義されます。 + +```json +{ + "name": "sample_tool", + "description": "A sample tool that returns a greeting", + "inputSchema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name to greet" + } + }, + "required": ["name"] + } +} +``` + +**サポートされる JSON Schema 型:** + +Gateway 用のツール仕様を定義する際は、以下の型を使用します。 + +- `"integer"` - 整数用("int" ではない) +- `"number"` - 浮動小数点数用 +- `"string"` - 文字列用 +- `"boolean"` - 真偽値用 +- `"array"` - 配列用 +- `"object"` - オブジェクト用 + +### 認証フロー + +1. **Machine Client**: CDK が client credentials フロー対応の Cognito machine client を作成 +2. **Resource Server**: gateway アクセス用のスコープを定義(read/write) +3. **JWT Authorization**: Gateway が Cognito の OIDC discovery を用いてトークンを検証 +4. **SSM Parameters**: クライアント認証情報は SSM Parameter Store に安全に保管 + +## 主要コンポーネント + +### 1. Gateway L1 Construct + +gateway は `infra-cdk/lib/backend-stack.ts` 内でネイティブの CloudFormation L1 constructs を用いて作成されます。 + +- `CfnGateway`: MCP プロトコルで AgentCore Gateway を作成 +- `CfnGatewayTarget`: ツールスキーマと共に Lambda targets を構成 +- JWT authorization は Cognito 経由で構成 +- ライフサイクルは CloudFormation により自動管理 + +### 2. Sample Tool Lambda + +`gateway/tools/sample_tool/sample_tool_lambda.py` に配置されています。 + +- 適切な Lambda target 実装を示している +- AgentCore Gateway のイベント形式の解析方法を示している +- エラーハンドリングとロギングを含む + +### 3. IAM ロールと権限 + +**Gateway Role**: gateway が Lambda 関数を呼び出し、必要な AWS サービスにアクセスすることを許可します + +**Custom Resource Role**: gateway のライフサイクル操作を管理します + +### 4. SSM Parameter ストレージ + +Gateway 構成は容易にアクセスできるように SSM に格納されます。 + +- `/stack-name/gateway_url`: Gateway エンドポイント URL +- `/stack-name/machine_client_id`: Cognito client ID +- `/stack-name/machine_client_secret`: Cognito client secret +- `/stack-name/cognito_provider`: Cognito ドメイン URL + +## Gateway のテスト + +### 直接的な Gateway テスト + +提供されているテストスクリプトを使用して gateway の機能を検証します。 + +```bash +python3 scripts/test-gateway.py +``` + +このスクリプトは以下を実行します。 + +1. SSM から取得した machine client 認証情報で認証 +2. MCP プロトコル経由で利用可能なツールをリスト +3. テストパラメータで sample tool を呼び出し +4. 検証用のレスポンスを表示 + +### AgentCore Runtime との統合 + +gateway は以下を介して AgentCore Runtime と統合されます。 + +1. **Runtime Configuration**: Runtime に SSM 経由で gateway URL が設定される +2. **Authentication**: Runtime は JWT トークンに同じ Cognito user pool を使用する +3. **Tool Discovery**: Runtime は gateway の `tools/list` エンドポイント経由でツールを発見する +4. **Tool Execution**: Runtime は gateway の `tools/call` エンドポイント経由でツールを呼び出す + +### MCP 経由でのエージェントとの統合 + +エージェントは Model Context Protocol (MCP) を使用して Gateway に接続します。以下に 2 つの代表的な統合アプローチを示します。 + +#### LangGraph と MultiServerMCPClient の組み合わせ + +`langchain-mcp-adapters` の `MultiServerMCPClient` は、自動的なセッション管理を提供します。 + +```python +from langchain_mcp_adapters.client import MultiServerMCPClient +from langgraph.prebuilt import create_react_agent + +# Gateway 構成で MCP クライアントを作成 +mcp_client = MultiServerMCPClient({ + "gateway": { + "transport": "streamable_http", + "url": gateway_url, + "headers": { + "Authorization": f"Bearer {access_token}" + } + } +}) + +# Gateway からツールを読み込む +tools = await mcp_client.get_tools() + +# ツールを伴うエージェントを作成 +graph = create_react_agent( + model=bedrock_model, + tools=tools, + checkpointer=checkpointer +) +``` + +#### Strands と直接的な MCP セッションの組み合わせ + +Strands エージェントはより細かな制御のために MCP セッションを直接管理することができます。 + +```python +from mcp import ClientSession +from mcp.client.streamable_http import streamablehttp_client +from langchain_mcp_adapters.tools import load_mcp_tools + +async with streamablehttp_client( + gateway_url, + headers={"Authorization": f"Bearer {access_token}"} +) as (read, write, _): + async with ClientSession(read, write) as session: + await session.initialize() + tools = await load_mcp_tools(session) + # エージェントでツールを使用 +``` + +**例:** 完全な実装は `agent/strands-single-agent/basic_agent.py` を参照してください。 + +## 新しいツールの追加 + +gateway に新しいツールを追加するには以下を行います。 + +1. **Lambda 関数を作成**: Lambda target パターンに従ってツールロジックを実装 +2. **ツールスキーマを定義**: CDK スタックに JSON schema 定義を追加 +3. **Gateway 構成を更新**: gateway custom resource に新しい target を追加 +4. **デプロイ**: CDK deploy を実行してインフラストラクチャを更新 + +### 例: Weather ツールの追加 + +```typescript +// backend-stack.ts 内 +const weatherLambda = new lambda.Function(this, "WeatherToolLambda", { + runtime: lambda.Runtime.PYTHON_3_13, + handler: "weather_tool.handler", + code: lambda.Code.fromAsset(path.join(__dirname, "../../gateway/tools/sample_tool")), +}) + +const weatherToolSchema = { + name: "get_weather", + description: "Get current weather for a location", + inputSchema: { + type: "object", + properties: { + location: { + type: "string", + description: "City and state, e.g. 'Seattle, WA'", + }, + }, + required: ["location"], + }, +} +``` + +## セキュリティ上の考慮事項 + +### 認証 + +- Cognito client credentials を用いた machine-to-machine 認証 +- 設定可能な有効期限を持つ JWT トークン +- Cognito resource server を用いたスコープ付きアクセス + +### 認可 + +- Gateway はリクエストごとに JWT トークンを検証する +- Lambda 関数は gateway の IAM ロール権限を継承する +- すべてのコンポーネントで最小権限の原則 + +### ネットワークセキュリティ + +- Gateway エンドポイントは HTTPS のみ +- Lambda 関数は AWS マネージド VPC 内で動作する +- Lambda 関数は直接インターネットアクセスを必要としない + +## モニタリングとロギング + +### CloudWatch Logs + +- Gateway 操作は `/aws/bedrock-agentcore/gateway/*` に記録される +- Lambda 関数のログは `/aws/lambda/function-name` +- カスタムリソース操作は `/aws/lambda/gateway-custom-resource` + +### メトリクス + +- Gateway の呼び出しメトリクスは CloudWatch 経由で利用可能 +- Lambda 関数の duration およびエラーメトリクス +- Lambda 関数にカスタムメトリクスを追加することも可能 + +## トラブルシューティング + +### よくある問題 + +**"Unknown tool: None" エラー** + +- Lambda 関数が context を正しく解析していないことを示します +- Lambda が AgentCore Gateway の入力形式に従っているか確認してください +- 詳細なエラー情報は CloudWatch logs を確認してください + +**認証失敗** + +- SSM 内の Cognito client 認証情報を確認してください +- JWT トークンの有効期限を確認してください +- gateway authorization 構成が正しいことを確認してください + +**ツールが見つからない** + +- ツールスキーマが Lambda の実装と一致するか確認してください +- gateway target 構成を確認してください +- Lambda 関数がデプロイされアクセス可能であることを確認してください + +**Gateway が "An internal error occurred" を返す** + +- CDK construct で `exceptionLevel: 'DEBUG'` を設定するか、AWS CLI 経由で gateway を更新してデバッグを有効にし、詳細なエラーメッセージを確認できます。 + +```bash +# gateway のデバッグを有効化 +aws bedrock-agentcore-control update-gateway \ + --gateway-identifier \ + --name \ + --role-arn \ + --protocol-type MCP \ + --authorizer-type CUSTOM_JWT \ + --authorizer-configuration \ + --exception-level DEBUG +``` + +または CDK 内の gateway construct を更新します。 + +```typescript +const gateway = new bedrockagentcore.CfnGateway(this, "AgentCoreGateway", { + name: `${config.stack_name_base}-gateway`, + roleArn: gatewayRole.roleArn, + protocolType: "MCP", + exceptionLevel: "DEBUG", // 詳細エラーメッセージのためにこの行を追加 + // ... 残りの構成 +}) +``` + +### デバッグ手順 + +1. **SSM パラメータの確認**: すべての gateway 構成パラメータが存在するか検証 +2. **認証のテスト**: テストスクリプトでトークン生成を検証 +3. **CloudWatch Logs のレビュー**: gateway および Lambda 関数のログを確認 +4. **ツールスキーマの検証**: スキーマが期待される形式と一致するか確認 +5. **Lambda の直接テスト**: Lambda 関数を独立して呼び出してロジックを検証 + +## ベストプラクティス + +### Lambda 関数開発 + +- デバッグのために受信イベントを必ずログに記録する +- 適切なエラーハンドリングを実装し、意味のあるエラーメッセージを返す +- 構成には環境変数を使用する +- 関数は単一のツールに責任を集中させる + +### スキーマ設計 + +- ツールおよびパラメータの説明は明確かつ説明的に書く +- 適切な JSON schema 型と制約を使用する +- 役立つ場合は説明文に例を含める +- 入力スキーマはシンプルで焦点を絞ったものに保つ + +### デプロイ + +- gateway と統合する前に各ツールを個別にテストする +- Lambda 関数のデプロイにバージョンタグを使用する +- デプロイ後は CloudWatch メトリクスを監視する +- 本番環境への変更には段階的なロールアウトを実装する + +## 関連ドキュメント + +- [Identity Propagation & Cedar Policy Guide](IDENTITY_POLICY.md) - Gateway tools のためのユーザーレベルアクセス制御 +- [Cedar Policy Guide](CEDAR_POLICY_GUIDE.md) - Cedar policy の構文、機能、リファレンス +- [Replacing Cognito](REPLACING_COGNITO.md) - Identity provider の差し替えと Gateway interceptors のガイド +- [Runtime-Gateway Authentication](RUNTIME_GATEWAY_AUTH.md) - Runtime と Gateway 間の M2M トークンフロー +- [Deployment Guide](DEPLOYMENT.md) - FAST インフラストラクチャのデプロイ方法 +- [AWS AgentCore Gateway Documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/agentcore-gateway.html) - 公式 AWS ドキュメント +- [AWS Gateway Lambda Target Documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-add-target-lambda.html) - Lambda target 実装の詳細 + +## Design notes + +本派生プロジェクト固有の設計判断 (Gateway target まわり): + +- **Lambda だけでなく MCP server target**: AWS MCP server・Strands docs MCP server・長期記憶のメタ想起 MCP server を Gateway の MCP server target として公開する。agent 内に直接組み込むのではなく target 化することで、ネイティブツールと MCP ツールでツール面・認証・Cedar ポリシーを統一できる。 +- **AWS MCP target は広めの role を継承**: AWS MCP server の `call_aws` と `run_script` を成立させるには Gateway target role に AWS サービス列挙・呼び出し権限が必要。デモでは read-broad / write-narrow に絞ってある。プロダクション利用時は脅威モデルに応じて再評価する想定。 +- **SigV4 service name の固定**: Runtime 内から Gateway target endpoint を呼ぶ際、SigV4 署名の service identifier が重要なため、推論ではなくコードで固定している。軽微な API 変更に伴う認証無音失敗を避ける狙い。 +- **マネージド Web Search target**: GA された Web Search connector を Gateway target として配線し、別途検索 SDK やブラウザツールを抱え込まずに引用付きの一般質問応答ができるようにしている。 diff --git a/samples/aws-specialist-agent/docs-jp/IDENTITY_POLICY.md b/samples/aws-specialist-agent/docs-jp/IDENTITY_POLICY.md new file mode 100644 index 0000000..27341f3 --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/IDENTITY_POLICY.md @@ -0,0 +1,344 @@ +# Identity Propagation & Cedar Policy ガイド + +このドキュメントでは、FAST がフロントエンドから AgentCore Gateway の Cedar policy までユーザーアイデンティティをどのように伝搬し、Gateway ツール上できめ細かなユーザー単位のアクセス制御を実現するかを説明します。 + +## 概要 + +AgentCore Gateway は CUSTOM_JWT authorizer によって検証された OAuth2 トークンでリクエストを認証します。デフォルトでは、Runtime は Client Credentials フローで M2M トークンを取得し、すべてのリクエストが同じマシンアイデンティティを持つことになります。つまり Gateway は個々のユーザーを区別できません。 + +この機能は、既存の M2M フローの上に **アイデンティティ伝搬** を追加します。認証済みユーザーのアイデンティティと Cognito グループメンバーシップは、Cognito の `aws_client_metadata` パラメータと V3 Pre-Token Lambda トリガを使って M2M トークンに埋め込まれます。Runtime は M2M トークンを AgentCore Identity(Token Vault)経由で取得するため、パブリックな Cognito ホストドメインを直接呼び出すことはなく、Runtime を閉域(NAT 不要)に保てます。リッチ化されたトークンは Gateway で Cedar policy により評価され、「財務部門のユーザーのみが破壊的ツールを実行できる」といったアクセス制御ルールを実現します。 + +**こんな時に使う:** Gateway tool が、部門・役割・ユーザー ID といった属性に基づくユーザー単位のアクセス制御を必要とする場合。 + +> **このデモのスコープ:** この実装では、ユーザー → ツール のアクセス制御(例: 「ゲストユーザーは AgentCore Gateway から text_analysis_tool を利用できない」)を示します。AgentCore Policy は、入力検証、リクエストパラメータに基づく条件付きアクセス、複数ツールに渡るポリシーなど、追加の機能もサポートしており、これらは [Cedar Policy Capabilities](CEDAR_POLICY_GUIDE.md#cedar-policy-capabilities) に記載されています。 + +## AgentCore Policy とは + +AgentCore Policy は、AI エージェントが実行可能な操作を制御するサービスです。エージェントとそのツールの間に立つセキュリティガードのようなもので、エージェントがツールを使おうとするたびに、ガードがルールをチェックして許可するか拒否するかを判断します。 + +**シンプルに言うと:** + +- 誰がどのツールをどのような条件下で使えるかを定めるルール(Cedar policy)を書きます +- Policy Engine がツール呼び出しのたびにそのルールを自動的に強制します +- どのルールも明示的に許可しなければ、その操作は拒否されます(deny-by-default) +- 強制は決定的です — プロンプトエンジニアリングと違い、巧妙な言い回しでバイパスできません + +**制御できること:** + +| 機能 | ルール例 | このデモで実演しているか | +| -------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| ユーザー → ツール アクセス | 「財務ユーザーのみが billing tool にアクセスできる」 | はい | +| 入力検証 | 「返金額は $1000 を超えてはならない」 | いいえ([Cedar Policy Guide](CEDAR_POLICY_GUIDE.md#cedar-policy-capabilities) 参照) | +| 複数ツールポリシー | 「開発者は読み取りツールは使えるが書き込みツールは使えない」 | いいえ([Cedar Policy Guide](CEDAR_POLICY_GUIDE.md#cedar-policy-capabilities) 参照) | +| 環境分離 | 「本番 runtime のみが本番ツールにアクセスできる」 | いいえ([Runtime-Level Access Control](#runtime-level-access-control) 参照) | +| 条件付きアクセス | 「クエリが特定のアカウントを対象とする場合のみツールを許可」 | いいえ([Cedar Policy Guide](CEDAR_POLICY_GUIDE.md#cedar-policy-capabilities) 参照) | + +**このデモでは** カスタムの `department` クレームに基づくユーザー → ツール アクセス制御を実装します。他の機能も同じインフラ(Policy Engine + Cedar + Gateway)で異なるポリシー条件を使うだけで実現できます。各機能の例を含む完全な構文リファレンスは [Cedar Policy Capabilities](CEDAR_POLICY_GUIDE.md#cedar-policy-capabilities) を参照してください。 + +**主要コンセプト:** + +- **Policy Engine** — Cedar policy を処理する評価エンジン。1 つのエンジンは 1 つの Gateway にアタッチされます。 +- **Cedar Policy** — AWS のオープンソースポリシー言語 [Cedar](https://www.cedarpolicy.com/) で書かれた宣言的ルール。確率的ではなく決定的です。 +- **CUSTOM_JWT Authorizer** — トークンを検証し、JWT クレームを Cedar の principal タグにマッピングする Gateway コンポーネント。 +- **Deny-by-default** — どの `permit` 文にもマッチしなければ、リクエストは拒否されます。明示的な `forbid` は不要です。 +- **ツールフィルタリング** — 拒否されたツールは実行時にブロックされるだけでなく、ディスカバリー時(`tools/list`)にエージェントから隠されます。[Tool Discovery vs Execution](CEDAR_POLICY_GUIDE.md#tool-discovery-vs-execution) を参照してください。 + +## アーキテクチャ / フロー + +アイデンティティ伝搬フローは 6 ステップで構成されます。 + +``` +1. ユーザーがログイン → フロントエンドが Cognito から JWT を取得(access token は cognito:groups を含む) +2. フロントエンドがリクエストを送信 → Runtime が JWT を検証し user_id(sub)と cognito:groups を抽出 +3. Runtime が AgentCore Identity(Token Vault)経由で M2M トークンを要求し、aws_client_metadata に user_id + groups を載せる +4. Cognito V3 Pre-Token Lambda が発火 → グループを department/role クレームにマッピング → M2M トークンに注入 +5. Runtime がリッチ化された M2M トークンで Gateway tool を呼び出し +6. Gateway の CUSTOM_JWT Authorizer がトークンクレームを Cedar principal タグにマッピング → Policy Engine が Cedar policy を評価 → 許可または拒否 +``` + +主要なセキュリティ特性: `user_id`(`sub`)と `cognito:groups` はいずれも Runtime の Session Context で検証済みの JWT から取得され、LLM やリクエストペイロードからではありません。これにより、エンドツーエンドで暗号学的に安全なアイデンティティチェーンが保証されます。 + +## コンポーネント + +### Cognito ESSENTIALS Tier + +**ファイル:** `infra-cdk/lib/cognito-stack.ts` + +Cognito User Pool は `featurePlan: ESSENTIALS` で構成されます。これは、V3 Pre-Token Generation Lambda トリガが ESSENTIALS tier を有効にした場合にのみ Client Credentials(M2M)グラントで発火するため、必須となります。これがないと、M2M トークン生成時に Pre-Token Lambda が呼び出されません。 + +### V3 Pre-Token Lambda + +**ファイル:** `infra-cdk/lambdas/pretoken-v3/index.py` + +この Lambda はあらゆるトークン生成イベント(ユーザーログインと M2M の両方)で発火します。M2M フロー(`TokenGeneration_ClientCredentials`)のみを処理し、ユーザーログインフローはスキップします。 + +M2M フローでは、`clientMetadata` から `verified_groups`(ユーザーの `cognito:groups`、カンマ区切り)を読み取り、グループ名を department / role クレームにマッピングします。 + +| Cognito グループ | Department | Role | +| ---------------- | ----------- | --------- | +| `finance` | finance | admin | +| `engineering` | engineering | developer | +| (グループなし) | guest | viewer | + +これらのクレームは `claimsToAddOrOverride` 経由で M2M アクセストークンに注入されます。 + +- `user_id` — 認証済みユーザーの ID(`sub`) +- `department` — ユーザーの部門(Cognito グループ名) +- `role` — ユーザーの役割 + +> **補足:** これらのクレーム名(`user_id`、`department`、`role`)はカスタムのアプリケーション定義クレームで、標準的な JWT/OIDC クレームではありません。必要に応じて任意の名前を定義できます。詳細は [Understanding Claims](CEDAR_POLICY_GUIDE.md#understanding-claims-custom-vs-standard) を参照してください。 + +グループは検証済みの access token から直接読み取られるため、Lambda は `AdminListGroupsForUser` を呼び出しません。割り当てを変更するには、ユーザーを Cognito グループに追加・削除するか、Pre-Token Lambda 内の `GROUP_ROLES` マップを編集してください。 + +### Cedar Policy ファイル + +**ディレクトリ:** `gateway/policies/` + +Cedar policy は Gateway tool に対するアクセス制御ルールを定義します。1 ファイル = 1 Cedar ステートメント(AgentCore `CreatePolicy` は 1 ポリシーにつき 1 ステートメント)です。デプロイ時に CDK によって読み込まれ、`//` のコメント行が削除され、`{{GATEWAY_ARN}}` プレースホルダが実際の Gateway ARN に置換されます。 + +| ファイル | ツール | 許可される部門 | +| ------------------------------ | -------------------------------------------------------- | -------------------- | +| `01-sample-tool.cedar` | `sample-tool-target___text_analysis_tool` | finance, engineering | +| `02-aws-mcp-read.cedar` | AWS MCP の読み取り系ツール(`aws-mcp___aws___*`) | finance, engineering | +| `03-aws-mcp-destructive.cedar` | `aws-mcp___aws___call_aws`、`aws-mcp___aws___run_script` | finance のみ | + +guest(グループなし)はどの `permit` にもマッチせず、Cedar の deny-by-default により拒否されます。engineering は読み取り系ツールを使えますが、破壊的な `call_aws` / `run_script` は使えません。finance はすべて使えます。マトリクスを変更するには該当ファイルを編集し `cdk deploy` を実行します。 + +### Policy Engine カスタムリソース + +**ファイル:** + +- `infra-cdk/lambdas/cedar-policy/index.py` — Custom Resource Lambda +- `infra-cdk/lib/backend-stack.ts` — CDK リソース定義 + +AgentCore Policy には L1/L2 CDK construct が存在しないため、CloudFormation Custom Resource が Policy Engine のライフサイクル全体を管理します。Lambda は 3 つの CloudFormation イベントを処理します。 + +- **Create:** Policy Engine を作成 → Cedar Policy を作成 → Policy Engine を Gateway にアタッチ +- **Update:** 既存ポリシーを削除 → 更新されたドキュメントで新規ポリシーを作成 → エンジンが Gateway にアタッチされたままか確認 +- **Delete:** Policy Engine を Gateway からデタッチ → すべてのポリシーを削除 → Policy Engine を削除 + +すべての操作は公式の boto3 waiter(`policy_engine_active`、`policy_engine_deleted`、`policy_active`、`policy_deleted`)を使います。Gateway のステータス変更は公式 waiter が存在しないため、カスタムポーリングループを使います。 + +### Gateway Authorizer + +**ファイル:** `infra-cdk/lib/backend-stack.ts` + +Gateway は Cognito の OIDC discovery URL とマシンクライアント ID で構成された `CUSTOM_JWT` authorizer を使います。authorizer は M2M トークンを検証し、JWT クレームを Cedar の principal タグにマッピングします。 + +| JWT クレーム | Cedar Principal タグ | クレームタイプ | +| ------------ | -------------------------------- | ----------------------------------- | +| `department` | `principal.getTag("department")` | カスタム(Pre-Token Lambda が注入) | +| `role` | `principal.getTag("role")` | カスタム(Pre-Token Lambda が注入) | +| `user_id` | `principal.getTag("user_id")` | カスタム(Pre-Token Lambda が注入) | + +## Cedar Policy ガイド + +クレーム、アクションフォーマット、スキーマ制約、ツールディスカバリー vs 実行、ポリシー機能を含む完全な Cedar policy リファレンスについては [Cedar Policy Guide](CEDAR_POLICY_GUIDE.md) を参照してください。 + +## Gateway 認証: AgentCore Identity(Token Vault) + +Runtime は Gateway 用の M2M トークンを AgentCore Identity の `@requires_access_token` デコレータ経由で取得します(各パターンの `tools/gateway.py` を参照)。AgentCore Identity が Cognito トークン交換を AWS 内のサーバー側で実行し、`bedrock-agentcore` VPC エンドポイント経由で到達可能なため、Runtime はパブリックな Cognito ホストドメインを呼び出さず、NAT Gateway は不要です。 + +ユーザーアイデンティティの伝搬は、デコレータに `custom_parameters={"aws_client_metadata": json.dumps({"verified_user_id": , "verified_groups": })}` を渡すことで行います。`aws_client_metadata` は Cognito が Pre-Token Lambda に転送する唯一の `custom_parameters` キー(`ClientMetadata` として)であり、フラットな文字列マップである必要があるため、グループはカンマ区切り文字列に結合します。Lambda は `verified_groups` を読み取り、Cedar policy が評価する `department`/`role` クレームを注入します。 + +> **Cognito を置き換えるには?** Cognito を別の Identity Provider(Okta、Auth0、Entra ID など)に切り替える方法や、動的なアクセス制御に Gateway Interceptor を使う方法は [Replacing Cognito](REPLACING_COGNITO.md) を参照してください。 + +## カスタマイズ + +### グループ割り当ての変更 + +最も簡単な変更は、ユーザーを `finance` / `engineering` の Cognito グループに追加・削除することです(コード変更も再デプロイも不要)。グループとクレームのマッピングを変えるには、`infra-cdk/lambdas/pretoken-v3/index.py` の `GROUP_ROLES` マップを編集します。まったく別のアイデンティティソース(DynamoDB、LDAP など)を使う場合は、`verified_groups` の参照部分を独自の解決に置き換えてください。 + +### 新しいクレームの追加 + +M2M トークンに新しいクレームを追加するには: + +1. Pre-Token Lambda の `claimsToAddOrOverride` にクレームを追加 +2. Cedar policy で `principal.getTag("claim_name")` を使ってクレームを参照 +3. Gateway の構成変更は不要 — CUSTOM_JWT authorizer がすべての JWT クレームを Cedar タグに自動マッピングします + +### VPC モード + +VPC モードのデフォルトデプロイは **完全閉域(NAT Gateway なし)** です。M2M トークンを AgentCore Identity 経由で取得するため(Cognito トークン交換は AWS 内のサーバー側で実行され、`bedrock-agentcore` VPC エンドポイント経由で到達可能)、Runtime はアウトバウンドのインターネットアクセスを必要としません。プライベートサブネットは隔離(`0.0.0.0/0` ルートなし)され、すべての AWS アクセスは VPC エンドポイント経由で行われます。 + +VPC 構成の詳細は `docs/DEPLOYMENT.md` を参照してください。 + +### Runtime レベルのアクセス制御 + +デフォルトでは、Gateway 経由のすべてのリクエストは同じマシンクライアントアイデンティティを共有します。複数の AgentCore Runtime をデプロイし、どの runtime がどのツールにアクセスできるかを制御したい場合、Cognito の `clientId` を暗号学的に検証された runtime アイデンティティとして使えます。 + +**Cedar で `context.runtime.arn` を使えないのはなぜ?** +Cedar スキーマは `context.input`(ツールパラメータ)のみをサポートしており、`context.runtime.arn` のようなフィールドは存在しません。サポートされていない context フィールドを参照しようとするとポリシー作成が失敗します。 + +**runtime アイデンティティに Cognito Groups を使えないのはなぜ?** +Cognito User Pool Groups はユーザーアイデンティティに適用され、app client には適用されません。M2M トークン自体には `cognito:groups` クレームが付かないため、runtime を識別できません。(ユーザーアイデンティティには引き続きグループを使います — 上述のとおり Runtime はユーザーの access token から `cognito:groups` を読み取り `aws_client_metadata` で伝搬します。これはここで論じる runtime ごとの `clientId` アイデンティティとは別軸です。) + +**解決策: Runtime ごとに Cognito App Client を 1 つ用意する** + +各 CDK スタックは Cognito app client と AgentCore Runtime の両方を作成するため、`clientId` は runtime アイデンティティとして機能します — `client_secret` 経由で暗号学的に検証されます。Pre-Token Lambda は自己申告なしで `clientId` を `runtime_env` クレームにマッピングします。 + +**アーキテクチャ:** + +``` +Runtime A (production) → Client A (client_secret_A) で認証 + → Cognito が clientId = "abc123" を検証 + → Pre-Token Lambda が "abc123" → runtime_env: "production" にマッピング + → Cedar policy が principal.getTag("runtime_env") をチェック + +Runtime B (staging) → Client B (client_secret_B) で認証 + → Cognito が clientId = "def456" を検証 + → Pre-Token Lambda が "def456" → runtime_env: "staging" にマッピング + → Cedar policy が principal.getTag("runtime_env") をチェック +``` + +**ステップ 1: CDK で別々のマシンクライアントを作成** + +```typescript +// runtime 環境ごとに 1 つのマシンクライアントを作成 +const machineClientProd = new cognito.UserPoolClient(this, "MachineClientProd", { + userPool: this.userPool, + generateSecret: true, + oAuth: { + flows: { clientCredentials: true }, + // 既存のマシンクライアントと同じ resource server スコープを使用 + scopes: [ + cognito.OAuthScope.resourceServer( + resourceServer, + new cognito.ResourceServerScope({ scopeName: "read", scopeDescription: "Read access" }) + ), + cognito.OAuthScope.resourceServer( + resourceServer, + new cognito.ResourceServerScope({ scopeName: "write", scopeDescription: "Write access" }) + ), + ], + }, +}) + +const machineClientStaging = new cognito.UserPoolClient(this, "MachineClientStaging", { + userPool: this.userPool, + generateSecret: true, + oAuth: { + flows: { clientCredentials: true }, + scopes: [ + cognito.OAuthScope.resourceServer( + resourceServer, + new cognito.ResourceServerScope({ scopeName: "read", scopeDescription: "Read access" }) + ), + cognito.OAuthScope.resourceServer( + resourceServer, + new cognito.ResourceServerScope({ scopeName: "write", scopeDescription: "Write access" }) + ), + ], + }, +}) + +// マッピングを環境変数として Pre-Token Lambda に渡す +preTokenLambda.addEnvironment( + "CLIENT_RUNTIME_MAP", + JSON.stringify({ + [machineClientProd.userPoolClientId]: "production", + [machineClientStaging.userPoolClientId]: "staging", + }) +) +``` + +**ステップ 2: Pre-Token Lambda で clientId → runtime_env のマッピングを行う** + +```python +import os, json + +def lambda_handler(event, context): + if event["triggerSource"] != "TokenGeneration_ClientCredentials": + return event + + # clientId は Cognito によって検証済み + client_id = event["callerContext"]["clientId"] + + # CDK がデプロイ時にセットしたマッピング + client_runtime_map = json.loads(os.environ.get("CLIENT_RUNTIME_MAP", "{}")) + runtime_env = client_runtime_map.get(client_id, "unknown") + + # 既存のユーザーアイデンティティロジック(変更なし) + meta = event["request"].get("clientMetadata", {}) + user_id = meta.get("verified_user_id", "") + groups = [g for g in meta.get("verified_groups", "").split(",") if g] + + GROUP_ROLES = {"finance": "admin", "engineering": "developer"} + department = next((g for g in groups if g in GROUP_ROLES), "guest") + role = GROUP_ROLES.get(department, "viewer") + + event["response"]["claimsAndScopeOverrideDetails"] = { + "accessTokenGeneration": { + "claimsToAddOrOverride": { + "user_id": user_id, + "department": department, + "role": role, + "runtime_env": runtime_env, + } + } + } + return event +``` + +**ステップ 3: Cedar policy に runtime_env を追加** + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"sample-tool-target___text_analysis_tool", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("runtime_env") && + principal.getTag("runtime_env") == "production" && + principal.hasTag("department") && + (principal.getTag("department") == "finance" || + principal.getTag("department") == "engineering") +}; +``` + +**セキュリティモデル — 二層構造のアイデンティティ:** + +| レイヤー | クレーム | ソース | 信頼レベル | +| ------------------------ | ------------------------------- | ----------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| Runtime アイデンティティ | `runtime_env` | `callerContext.clientId`(Cognito 検証済み) | 暗号学的 — `client_secret` が必要 | +| ユーザーアイデンティティ | `user_id`、`department`、`role` | `clientMetadata.verified_user_id`(検証済み JWT の `sub` クレーム由来) | JWT 検証済み — Runtime が Cognito 検証済みトークンからサーバー側で抽出 | + +両レイヤーとも Cognito によって保護されています: `clientId` は client secret 交換で検証され、`user_id` は Runtime の `extract_user_id_from_context()` によって抽出された検証済み JWT の `sub` クレームに由来します。 + +> **補足:** このセクションでは runtime レベルのアクセス制御のアーキテクチャパターンを説明しています。現状の FAST 実装は単一のマシンクライアントを使っています。このパターンを実装するには、`cognito-stack.ts` で追加のマシンクライアントを作成し、上記のマッピングロジックで Pre-Token Lambda を更新してください。 + +## デプロイ済みポリシーの確認 + +Gateway に現在アクティブな Cedar policy を確認するには: + +1. **AWS Console → Bedrock AgentCore → Policy** に移動 +2. Policy engines セクションから対象の Policy Engine(例: `fast_aws_specialist_policy_engine`)をクリック +3. **Policies** セクションで対象のポリシー(例: `fast_aws_specialist_policy_engine_cp_`)をクリック +4. **Definition** セクションにポリシーの構成要素が表示されます: + - **Effect**: `permit` または `forbid` + - **Scope: Principal**: `AgentCore::OAuthUser` + - **Scope: Actions**: ツールアクション名(例: `sample-tool-target___text_analysis_tool`) + - **Scope: Resource**: Gateway 名 + - **Conditions**: `when` 句のロジック +5. **Cedar** セクションにはデプロイ済みの完全な Cedar policy 文が表示されます + +これを使って、`cdk deploy` で期待したポリシーバージョンが適用されたかを確認できます。 + +## トレースによるポリシー判定の検証 + +Cedar policy の許可/拒否判定を CloudWatch ログで確認するには: + +1. **AWS Console → Bedrock AgentCore → Runtimes** に移動 +2. Runtime resources セクションから対象の runtime(例: `fast_aws_specialist_FASTAgent`)をクリック +3. **Tracing** セクションまでスクロールし、**Edit** をクリックして **Enable tracing** を Enable に切り替え +4. **Bedrock AgentCore → Gateways** に移動 +5. 対象の gateway(例: `fast-aws-specialist-gateway`)をクリックし、**Tracing** までスクロールして **Edit** をクリック、**Enable tracing** を Enable に切り替え +6. フロントエンドからツール呼び出しをトリガーするクエリを実行 +7. **CloudWatch Console → Log Management → Log groups** に移動 +8. `aws/spans` ロググループを検索してクリックし、デフォルトのログストリームをクリック +9. **Filter events** 検索ボックスに `policy` と入力 +10. `AgentCore.Policy.PartiallyAuthorizeActions` スパンを探します — 含まれる情報: + - `aws.agentcore.policy.allowed_tools`: ユーザーが利用を許可されたツール + - `aws.agentcore.policy.denied_tools`: ユーザーがアクセスを拒否されたツール + - `aws.agentcore.gateway.policy.mode`: `ENFORCE` と表示されるはず diff --git a/samples/aws-specialist-agent/docs-jp/LOCAL_DEVELOPMENT.md b/samples/aws-specialist-agent/docs-jp/LOCAL_DEVELOPMENT.md new file mode 100644 index 0000000..1e5e9de --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/LOCAL_DEVELOPMENT.md @@ -0,0 +1,215 @@ +# Docker Compose を使用したローカル開発 + +このガイドでは、開発目的で Docker Compose を使用して FAST スタック全体をローカルで実行する方法について説明します。 + +## 前提条件 + +**重要**: ローカル開発でも、バックエンドの依存関係 (Memory、Gateway、SSM パラメータ) のために、AWS にデプロイされた FAST スタックが必要です。Docker Compose はフロントエンドとエージェントをコンテナ化するだけで、AWS サービスを置き換えるものではありません。 + +### 必須 + +1. **デプロイ済みの FAST スタック**: 以下を使用してすでに FAST を AWS にデプロイしている必要があります: + + ```bash + cd infra-cdk + cdk deploy + ``` + +2. **AWS 認証情報**: AWS 認証情報は **環境変数としてエクスポートする必要があります** — Docker コンテナは `~/.aws/credentials` や `~/.aws/config` を読み取れません: + + ```bash + # Option 1: 既存の aws configure プロファイルからエクスポート + export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) + export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key) + export AWS_SESSION_TOKEN=$(aws configure get aws_session_token) # 一時的な認証情報を使用する場合 + + # Option 2: 直接設定 + export AWS_ACCESS_KEY_ID=your-key + export AWS_SECRET_ACCESS_KEY=your-secret + export AWS_SESSION_TOKEN=your-token # 一時的な認証情報を使用する場合 + ``` + +3. **Docker と Docker Compose**: Compose サポートを備えた Docker Desktop または Docker Engine をインストールします + +4. **環境変数**: 以下の必須変数を設定します: + ```bash + export MEMORY_ID=your-memory-id + export STACK_NAME=your-stack-name + export AWS_DEFAULT_REGION=us-east-1 + ``` + +### 環境変数の検索 + +これらの値はデプロイ済みのスタックから取得します: + +```bash +# スタックの outputs を取得 +aws cloudformation describe-stacks --stack-name your-stack-name --query 'Stacks[0].Outputs' + +# MemoryArn から Memory ID を抽出 (最後の / 以降の部分) +# Stack Name を抽出 (デプロイ時に使用した名前) +# デプロイしたのと同じリージョンを使用 +``` + +## クイックスタート + +1. **環境変数を設定**: + + ```bash + export MEMORY_ID=your-memory-id-from-stack-outputs + export STACK_NAME=your-stack-name + export AWS_DEFAULT_REGION=us-east-1 + ``` + +2. **スタックを起動**: + + ```bash + cd docker && docker compose up --build + ``` + +3. **アプリケーションへのアクセス**: + - Frontend: http://localhost:3000 + - Agent API: http://localhost:8080 + - Agent Health: http://localhost:8080/ping + +## ローカルモードでの認証 + +本番環境では、AgentCore Runtime がユーザーの JWT を検証し、それをエージェントに渡します。エージェントは、リクエストペイロードを信頼するのではなく、JWT の `sub` クレームからユーザー ID を抽出します (プロンプトインジェクションによるなりすましを防止)。 + +Docker Compose 経由でローカル実行する場合、AgentCore Runtime はありません。テストスクリプトは、`sub` クレームとしてテストユーザー ID を持つモックの未署名 JWT を生成し、`Authorization: Bearer` ヘッダーで送信します。これにより、実際の Cognito トークンを必要とせずに、本番環境と同じコードパスが実行されます。 + +## 環境設定 + +利便性のために、リポジトリのルートに `.env` ファイルを作成します: + +```bash +# 必須 - デプロイされた AWS スタックから取得 +MEMORY_ID=your-memory-id +STACK_NAME=your-stack-name +AWS_DEFAULT_REGION=us-east-1 + +# AWS 認証情報 (必須 - Docker コンテナは ~/.aws/credentials を読み取れません) +AWS_ACCESS_KEY_ID=your-key +AWS_SECRET_ACCESS_KEY=your-secret +AWS_SESSION_TOKEN=your-token +``` + +その後、以下を実行: `cd docker && docker compose up --build` + +## 開発ワークフロー + +### 変更を加える + +- **フロントエンドの変更**: ファイルはボリュームとしてマウントされているため、変更はすぐに反映されます +- **エージェントの変更**: エージェントコンテナを再ビルドします: + ```bash + cd docker && docker compose up --build agent + ``` + +### 異なるエージェントパターンの使用 + +異なるエージェントパターンを使用するには: + +1. **docker/docker-compose.yml を編集**: + + ```yaml + agent: + build: + dockerfile: agent//Dockerfile + ``` + +2. **再ビルド**: + ```bash + cd docker && docker compose up --build agent + ``` + +### ログとデバッグ + +```bash +# すべてのログを表示 +docker compose logs -f + +# 特定のサービスのログを表示 +docker compose logs -f agent +docker compose logs -f frontend + +# コンテナのシェルにアクセス +docker compose exec agent bash +docker compose exec frontend sh +``` + +## トラブルシューティング + +### エージェントが起動しない + +**症状**: エージェントコンテナが終了するか、ヘルスチェックが失敗する + +**解決策**: + +1. AWS 認証情報を確認: `aws sts get-caller-identity` +2. 環境変数が正しく設定されていることを確認 +3. デプロイされたスタックが存在し、正常であることを確認 +4. エージェントログを確認: `docker compose logs agent` + +### フロントエンドがエージェントに接続できない + +**症状**: フロントエンドはロードされるが、バックエンドと通信できない + +**解決策**: + +1. エージェントが正常か確認: `curl http://localhost:8080/ping` +2. コンテナ間のネットワーク接続を確認 +3. フロントエンドがローカルエージェントエンドポイントを使用するように設定されていることを確認 + +### AWS 権限エラー + +**症状**: エージェントは起動するが、AWS API 呼び出しで失敗する + +**解決策**: + +1. AWS 認証情報の IAM 権限を確認 +2. デプロイされたスタックリソースにアクセスできることを確認 +3. 正しい AWS リージョンが設定されていることを確認 + +### Memory/Gateway が見つからない + +**症状**: エージェントが Memory または Gateway リソースの不足を報告する + +**解決策**: + +1. `MEMORY_ID` がデプロイされたスタックの Memory リソースと一致することを確認 +2. `STACK_NAME` が CloudFormation スタック名と一致することを確認 +3. スタックのデプロイが正常に完了したことを確認 + +## スタックの停止 + +```bash +# すべてのサービスを停止 +cd docker && docker compose down + +# 停止してボリュームも削除 +cd docker && docker compose down -v + +# 停止してイメージも削除 +cd docker && docker compose down --rmi all +``` + +## 本番環境へのデプロイ + +この Docker Compose のセットアップは開発専用です。本番環境のデプロイには以下を使用します: + +```bash +cd infra-cdk +cdk deploy +cd .. +python scripts/deploy-frontend.py +``` + +## 次のステップ + +- `agent/` のエージェントコードをカスタマイズする +- `frontend/src/` のフロントエンドを変更する +- `tools/` または `gateway/tools/` に新しいツールを追加する +- `infra-cdk/` のインフラストラクチャを更新する + +補足: インフラストラクチャの変更には、Docker Compose の再起動だけでなく、CDK 経由での再デプロイが必要です。 diff --git a/samples/aws-specialist-agent/docs-jp/LOCAL_DOCKER_TESTING.md b/samples/aws-specialist-agent/docs-jp/LOCAL_DOCKER_TESTING.md new file mode 100644 index 0000000..2bee4bc --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/LOCAL_DOCKER_TESTING.md @@ -0,0 +1,234 @@ +# ローカル Docker テストガイド + +AgentCore エージェントの Docker イメージをローカルでビルドおよびテストして、Dockerfile の設定と依存関係を検証します。 + +## 制限事項 + +**スタンドアロンの Docker テストでは Gateway ツールは動作しません**。理由: + +- `@requires_access_token` デコレーターには AgentCore Identity サービスが必要 +- AgentCore Identity は AgentCore Runtime コンテキスト内でのみ動作する +- OAuth2 M2M 認証は Runtime の外部ではモックできない + +**動作するもの:** Dockerfile のビルド、依存関係のインストール、Code Interpreter、Gateway 以外のツール +**動作しないもの:** AgentCore Gateway ツール (MCP ベースの Lambda ツール) + +**Gateway をサポートする完全なローカルテスト** には、`docker-compose` を使用してください ([Local Development Guide](LOCAL_DEVELOPMENT.md) を参照)。 + +## なぜ Docker テストを行うのか? + +| Testing Mode | Gateway Tools | Code Interpreter | Use Case | +| ------------------------ | ------------- | ---------------- | ---------------------------------- | +| `test-agent.py --local` | Yes | Yes | 高速な Python の反復開発 | +| **Manual Docker** | No | Yes | Dockerfile/依存関係の検証 | +| **`docker-compose`** | Yes | Yes | 完全なローカル開発 | +| `test-agent.py` (remote) | Yes | Yes | デプロイされたエージェントのテスト | + +Docker テストでは、以下を検証します: + +- Dockerfile が正しくビルドされること +- 依存関係がコンテナ内に適切にインストールされること +- コンテナが起動し、ヘルスチェックに応答すること +- エージェントコードがコンテナ化された環境で動作すること (Gateway ツールなし) + +## 前提条件 + +1. **Docker** がインストールされ、実行中であること (`docker ps` が動作する必要がある) +2. **デプロイ済みのスタック** - Memory ID と SSM パラメータに必要 +3. **AWS 認証情報** が環境に設定されていること + +## Docker イメージのビルド + +```bash +# エージェントパターン用のイメージをビルド +docker build -f agent/strands-single-agent/Dockerfile \ + -t fast-agent-local \ + --platform linux/arm64 . +``` + +### プラットフォーム要件 + +AgentCore Runtime には ARM64 アーキテクチャが必要です。x86/amd64 マシンでは、エミュレーションを有効にします: + +```bash +# ARM64 エミュレーションのワンタイムセットアップ +docker run --privileged --rm tonistiigi/binfmt --install all +``` + +## コンテナの実行 + +```bash +# CloudFormation の outputs から Memory ID を取得 +MEMORY_ID=$(aws cloudformation describe-stacks \ + --stack-name \ + --query 'Stacks[0].Outputs[?OutputKey==`MemoryArn`].OutputValue' \ + --output text | awk -F'/' '{print $NF}') + +# AWS 認証情報をエクスポート (コンテナに必要) +export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) +export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key) +export AWS_SESSION_TOKEN=$(aws configure get aws_session_token) # 一時的な認証情報を使用する場合 + +# コンテナを実行 +docker run --rm -it -p 8080:8080 \ + --platform linux/arm64 \ + -e MEMORY_ID=$MEMORY_ID \ + -e STACK_NAME= \ + -e AWS_DEFAULT_REGION=us-east-1 \ + -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ + -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ + -e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \ + fast-agent-local +``` + +**重要:** AWS 認証情報は環境変数としてエクスポートする必要があります。Docker コンテナは `~/.aws/credentials` または `~/.aws/config` から認証情報を読み取ることはできません。 + +## エージェントのテスト + +### ヘルスチェック + +```bash +curl http://localhost:8080/ping +# Returns: {"status":"Healthy","time_of_last_update":...} +``` + +### テスト用のモック JWT + +検証済みの JWT を提供する AgentCore Runtime がないため、モックの未署名 JWT を作成します: + +```bash +# sub=test-user でモック JWT を生成 +MOCK_JWT=$(python3 -c "import base64,json; h=base64.urlsafe_b64encode(json.dumps({'alg':'none','typ':'JWT'}).encode()).rstrip(b'=').decode(); p=base64.urlsafe_b64encode(json.dumps({'sub':'test-user'}).encode()).rstrip(b'=').decode(); print(f'{h}.{p}.')") + +# エージェントをテスト (Gateway ツールでは失敗するが、Code Interpreter は動作するはず) +curl -X POST http://localhost:8080/invocations \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $MOCK_JWT" \ + -d '{"prompt": "Execute Python: print(2+2)", "runtimeSessionId": "test-123"}' +``` + +**期待される動作:** + +- Code Interpreter のリクエストは動作する +- Gateway ツールのリクエストは認証エラーで失敗する + +## アーキテクチャ + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Local Machine │ +│ ┌─────────────────────────────────────────────────────┐ │ +│ │ Docker Container (ARM64) │ │ +│ │ ┌─────────────────────────────────────────────┐ │ │ +│ │ │ Agent (basic_agent.py / langgraph_agent.py)│ │ │ +│ │ │ - :8080 をリッスン │ │ │ +│ │ │ - 渡された AWS 認証情報を使用 │ │ │ +│ │ │ - Gateway 認証は失敗する │ │ │ +│ │ └─────────────────────────────────────────────┘ │ │ +│ └─────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ http://localhost:8080/invocations │ +└─────────────────────────────────────────────────────────────┘ + │ + ▼ + ┌─────────────────────────────────┐ + │ AWS (デプロイされたリソース) │ + │ - AgentCore Memory (Yes) │ + │ - Code Interpreter (Yes) │ + │ - AgentCore Gateway (No) │ + │ - SSM Parameters (Yes) │ + └─────────────────────────────────┘ +``` + +## トラブルシューティング + +### コンテナは起動するが Gateway 認証が失敗する + +これは **想定通りの動作** です。`@requires_access_token` デコレーターには AgentCore Identity サービスが必要であり、これは AgentCore Runtime 内でのみ動作します。 + +**解決策:** 完全なローカルテストには `docker-compose` を使用してください ([Local Development Guide](LOCAL_DEVELOPMENT.md) を参照)。 + +### コンテナは起動するがエージェントがすぐに失敗する + +コンテナのログを確認します: + +```bash +# コンテナ ID を見つける +docker ps + +# ログを表示 +docker logs +``` + +よくある問題: + +- **AWS 認証情報の不足**: `AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` が設定されていることを確認 +- **期限切れのセッショントークン**: AWS 認証情報を更新 +- **スタックがデプロイされていない**: スクリプトは Memory ID を取得するためにデプロイされたスタックが必要 + +### "platform mismatch" でビルドが失敗する + +ARM64 エミュレーションを有効にします (上記のプラットフォーム要件を参照)。 + +### localhost:8080 で "Connection refused" になる + +エージェントがまだ起動中の可能性があります。10〜30 秒待ってから再試行してください。問題が続く場合はログを確認してください。 + +### ログ内の ECS/EKS 警告 + +これらの警告はローカル実行時に予想されるものです: + +``` +AwsEcsResourceDetector failed: Missing ECS_CONTAINER_METADATA_URI... +AwsEksResourceDetector failed: No such file or directory... +``` + +OpenTelemetry インストルメンテーションは、ローカルには存在しない ECS/EKS メタデータを探します。これらは安全に無視できます。 + +## 高度な使い方 + +### コンテナログをリアルタイムで表示する + +```bash +# コンテナをフォアグラウンドで起動 (デタッチしない) +docker run --rm -p 8080:8080 \ + --platform linux/arm64 \ + -e MEMORY_ID= \ + -e STACK_NAME= \ + -e AWS_DEFAULT_REGION=us-east-1 \ + -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ + -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ + -e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \ + fast-agent-local +``` + +### ビルドのみの検証 + +実行せずに Dockerfile を検証するには: + +```bash +docker build -f agent/strands-single-agent/Dockerfile \ + -t fast-agent-local \ + --platform linux/arm64 . + +# ビルドが成功したか確認 +echo $? # 0 を返すはず +``` + +## 各テストモードを使用するタイミング + +| Scenario | Recommended Mode | +| -------------------------------------- | --------------------------------------- | +| エージェントロジックの高速な反復開発 | `test-agent.py --local` | +| Dockerfile が正しくビルドされるか検証 | Manual Docker build | +| Gateway ツールでローカルテスト | `docker-compose` (LOCAL_DEVELOPMENT.md) | +| デプロイされた本番エージェントのテスト | `test-agent.py` (remote) | +| CI/CD パイプライン検証 | Manual Docker build | + +## 関連ドキュメント + +- [Local Development Guide](LOCAL_DEVELOPMENT.md) - `docker-compose` と Gateway サポートを使用した完全なローカル開発 +- [Deployment Guide](DEPLOYMENT.md) - フルスタックデプロイ手順 +- [Agent Configuration](AGENT_CONFIGURATION.md) - エージェントパターンの設定 +- [Streaming Guide](STREAMING.md) - ストリーミングイベントの理解 diff --git a/samples/aws-specialist-agent/docs-jp/MEMORY_INTEGRATION.md b/samples/aws-specialist-agent/docs-jp/MEMORY_INTEGRATION.md new file mode 100644 index 0000000..c20463e --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/MEMORY_INTEGRATION.md @@ -0,0 +1,408 @@ +# AgentCore Memory 統合ガイド + +AWS Bedrock AgentCore Memory をエージェントに統合するための、簡潔で実践的なガイドです。 + +AgentCore は 2 種類のメモリを提供します。**short-term memory** は生の会話履歴を保存し、エージェントに最近のやり取りからのコンテキストを提供します。**Long-term memory** は AI による戦略を用いて、セッション要約、ユーザーの好み、重要な事実といった意味のあるインサイトを抽出・保存し、エージェントが時間とともに深い理解を構築できるようにします。詳細は [Amazon Bedrock AgentCore Memory blog post](https://aws.amazon.com/blogs/machine-learning/amazon-bedrock-agentcore-memory-building-context-aware-agents/) を参照してください。 + +--- + +## Long-Term Memory の有効化 + +short-term memory(STM — セッション内の生の会話履歴)と long-term memory(LTM — セッションを跨いで思い出せる事実)の両方が利用可能です。LTM は **`strands-single-agent`** パターンでサポートされ、`SemanticMemoryStrategy` を使用して会話から事実を自動的に抽出・保存します。`actorId` はユーザーの検証済み JWT `sub`(Runtime がアイデンティティ伝搬のために抽出するのと同じ識別子)であるため、ユーザーごとに固有の永続メモリが提供されます。 + +### 動作の仕組み + +1. **インフラストラクチャ**: CDK スタックは常にメモリリソース上に `SemanticMemoryStrategy` を作成します(戦略を定義するだけではコストは発生しません)。`USE_LONG_TERM_MEMORY` 環境変数が agent runtime に渡されます。 +2. **エージェントの動作**: `USE_LONG_TERM_MEMORY` が `"true"` の場合、Strands エージェントの `AgentCoreMemorySessionManager` は、ターンごとに `/facts/{actorId}` 名前空間から読み取る `retrieval_config` を伴って構成されます。`"false"`(デフォルト)の場合は、short-term の会話履歴のみが有効になります。 +3. **事実抽出**: AgentCore は会話イベントを非同期に処理し、事実情報(例: 「ユーザーは Seattle に住んでいる」、「ユーザーは Python を好む」)を抽出します。これらの事実は `/facts/{actorId}` の下に保存され、以降のターンで取得されてレスポンスをパーソナライズします。 + +### 構成 + +`infra-cdk/config.yaml` で LTM を切り替えます。 + +```yaml +backend: + use_long_term_memory: true # long-term semantic memory 取得を有効化 +``` + +その後、再デプロイします。 + +```bash +cd infra-cdk && cdk deploy --all +``` + +### コストに関する考慮事項 + +LTM は short-term memory に加えて追加料金が発生します。 + +- **Storage**: $0.75 per 1,000 memory records stored +- **Retrieval**: $0.50 per 1,000 retrieval calls + +`use_long_term_memory` が `false` の場合はどちらの料金も発生せず、short-term memory(会話履歴)のみが有効な機能となります。 + +--- + +## ステップ 1: CDK によるメモリの構成 + +メモリリソースは [CloudFormation L1 constructs](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-bedrockagentcore-memory.html) を使用して作成します。**L2 constructs は将来のリリースで提供される予定です。** + +### 基本的なメモリ(Short-Term のみ) + +```typescript +const memory = new cdk.CfnResource(this, "AgentMemory", { + type: "AWS::BedrockAgentCore::Memory", + properties: { + Name: "MyAgentMemory", + EventExpiryDuration: 7, // 保持日数(7-365) + MemoryStrategies: [], // 空 = short-term のみ + MemoryExecutionRoleArn: executionRole.roleArn, + }, +}) +``` + +### 高度なメモリ(戦略あり) + +```typescript +const memory = new cdk.CfnResource(this, "AgentMemory", { + type: "AWS::BedrockAgentCore::Memory", + properties: { + Name: "MyAgentMemory", + EventExpiryDuration: 30, + Description: "Memory with intelligent extraction", + MemoryStrategies: [ + { + SummaryMemoryStrategy: { + Name: "SessionSummarizer", + Namespaces: ["/summaries/{actorId}/{sessionId}"], + }, + }, + { + UserPreferenceMemoryStrategy: { + Name: "PreferenceLearner", + Namespaces: ["/preferences/{actorId}"], + }, + }, + { + SemanticMemoryStrategy: { + Name: "FactExtractor", + Namespaces: ["/facts/{actorId}"], + }, + }, + ], + MemoryExecutionRoleArn: executionRole.roleArn, + }, +}) +``` + +### 必要な IAM 権限 + +```typescript +new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + actions: [ + "bedrock-agentcore:CreateEvent", + "bedrock-agentcore:GetEvent", + "bedrock-agentcore:ListEvents", + "bedrock-agentcore:RetrieveMemoryRecords", + ], + resources: [memoryArn], +}) +``` + +**権限の内訳:** + +- `CreateEvent`、`GetEvent`、`ListEvents`: short-term memory(会話履歴)用 +- `RetrieveMemoryRecords`: long-term memory(戦略から得られる要約、好み、事実)用 + +### メモリ構成の理解 + +詳細な構成内容については、[AgentCore Memory Overview](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/memory.html) および [Memory API Reference](https://docs.aws.amazon.com/bedrock-agentcore/latest/APIReference/welcome.html) を参照してください。 + +**メモリパラメータ** + +- **EventExpiryDuration**: 7-365 日 +- **MemoryStrategies**: short-term の場合は空、long-term の場合は配列 +- **actor_id**: ユーザー識別子 +- **session_id/thread_id**: 会話識別子 + +**メモリ戦略** + +| 戦略 | 目的 | 名前空間 | +| ------------------------------ | -------------------- | ---------------------------------- | +| `summaryMemoryStrategy` | セッションを自動要約 | `/summaries/{actorId}/{sessionId}` | +| `userPreferenceMemoryStrategy` | 好みを学習 | `/preferences/{actorId}` | +| `semanticMemoryStrategy` | 事実を抽出 | `/facts/{actorId}` | + +--- + +## ステップ 2: フレームワークとの統合 + +### Strands を使用する場合 + +Strands 統合の完全なドキュメントは、[official Strands Memory Integration guide](https://strandsagents.com/latest/documentation/docs/community/session-managers/agentcore-memory/) を参照してください。 + +**インストール:** + +```bash +pip install bedrock-agentcore[strands-agents] +``` + +**コード:** + +```python +import os +from strands import Agent +from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager +from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig + +memory_id = os.environ.get("MEMORY_ID") +if not memory_id: + raise ValueError("MEMORY_ID environment variable is required") + +# 基本構成 +config = AgentCoreMemoryConfig( + memory_id=memory_id, + session_id=session_id, + actor_id=user_id +) + +session_manager = AgentCoreMemorySessionManager( + agentcore_memory_config=config, + region_name=os.environ.get("AWS_DEFAULT_REGION", "us-east-1") +) + +agent = Agent( + system_prompt="You are a helpful assistant.", + model=bedrock_model, + session_manager=session_manager +) +``` + +**戦略を伴う場合(CDK で構成済みの場合):** + +```python +from bedrock_agentcore.memory.integrations.strands.config import RetrievalConfig + +config = AgentCoreMemoryConfig( + memory_id=memory_id, + session_id=session_id, + actor_id=user_id, + retrieval_config={ + "/preferences/{actorId}": RetrievalConfig(top_k=5, relevance_score=0.7), + "/facts/{actorId}": RetrievalConfig(top_k=10, relevance_score=0.3) + } +) +``` + +**long-term memory を有効化した場合**(上記の [Enabling Long-Term Memory](#enabling-long-term-memory) を参照): + +`strands-single-agent` パターンは、`USE_LONG_TERM_MEMORY` 環境変数に基づいて条件付きで LTM の取得を有効にします。有効化されると、エージェントはターンごとに `/facts/{actorId}` 名前空間から事実を取得します。 + +```python +use_ltm = os.environ.get("USE_LONG_TERM_MEMORY", "false").lower() == "true" + +retrieval_config = ( + { + "/facts/{actorId}": RetrievalConfig( + top_k=10, + relevance_score=0.3, + ) + } + if use_ltm + else None +) + +config = AgentCoreMemoryConfig( + memory_id=memory_id, + session_id=session_id, + actor_id=user_id, + retrieval_config=retrieval_config, +) +``` + +**ヒント 例:** このアプローチの実装は `agent/strands-single-agent/basic_agent.py` を参照してください。 + +**公式 AWS ガイド:** [Strands SDK Memory Integration](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/strands-sdk-memory.html) + +#### 代替案: フックベースのアプローチ + +メモリのライフサイクルやカスタムなメモリ操作をより細かく制御したい場合は、Strands hooks を MemorySession と組み合わせて使用できます。 + +```python +from strands import Agent +from strands.hooks import AgentInitializedEvent, HookProvider, HookRegistry, MessageAddedEvent +from bedrock_agentcore.memory.session import MemorySession, MemorySessionManager +from bedrock_agentcore.memory.constants import ConversationalMessage, MessageRole + +# session manager を初期化してセッションを作成 +session_manager = MemorySessionManager(memory_id=memory_id, region_name="us-east-1") +user_session = session_manager.create_memory_session( + actor_id=user_id, + session_id=session_id +) + +# カスタムフックプロバイダを作成 +class MemoryHookProvider(HookProvider): + def __init__(self, memory_session: MemorySession): + self.memory_session = memory_session + + def on_agent_initialized(self, event: AgentInitializedEvent): + """エージェント開始時に最近の会話履歴をロード""" + recent_turns = self.memory_session.get_last_k_turns(k=5) + if recent_turns: + # 整形してエージェントの context に追加 + context_messages = [] + for turn in recent_turns: + for message in turn: + role = message['role'] + content = message['content']['text'] + context_messages.append(f"{role}: {content}") + + context = "\n".join(context_messages) + event.agent.system_prompt += f"\n\nRecent conversation:\n{context}" + + def on_message_added(self, event: MessageAddedEvent): + """新しいメッセージをメモリに保存""" + messages = event.agent.messages + if messages and len(messages) > 0: + message_text = messages[-1]["content"][0]["text"] + message_role = MessageRole.USER if messages[-1]["role"] == "user" else MessageRole.ASSISTANT + + self.memory_session.add_turns( + messages=[ConversationalMessage(message_text, message_role)] + ) + + def register_hooks(self, registry: HookRegistry): + registry.add_callback(MessageAddedEvent, self.on_message_added) + registry.add_callback(AgentInitializedEvent, self.on_agent_initialized) + +# メモリフックを伴うエージェントを作成 +agent = Agent( + system_prompt="You are a helpful assistant.", + model=bedrock_model, + hooks=[MemoryHookProvider(user_session)], + tools=[...] +) +``` + +**使用するケース:** カスタムなメモリロードロジック、複数のフックの組み合わせ、細かな制御が必要な場合に使用します。 + +**ヒント 完全な例:** 動作するコードサンプルについては、[AWS AgentCore Samples repository](https://github.com/awslabs/amazon-bedrock-agentcore-samples) を参照してください。例えば、この [Strands with hooks tutorial](https://github.com/awslabs/amazon-bedrock-agentcore-samples/blob/main/01-tutorials/04-AgentCore-memory/01-short-term-memory/01-single-agent/with-strands-agent/) があります。 + +### LangGraph を使用する場合 + +LangGraph 統合の完全なドキュメントは [official LangGraph Memory Integration guide](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/memory-integrate-lang.html) を参照してください。動作するコードサンプルについては、[LangChain AWS Integration samples](https://github.com/langchain-ai/langchain-aws/tree/main/samples/memory) を参照してください。 + +**インストール:** + +```bash +pip install langgraph-checkpoint-aws langchain-mcp-adapters +``` + +**Gateway tools を伴う完全な統合:** + +```python +from langchain_aws import ChatBedrock +from langgraph.prebuilt import create_react_agent +from langgraph_checkpoint_aws import AgentCoreMemorySaver +from langchain_mcp_adapters.client import MultiServerMCPClient + +# memory checkpointer を構成 +checkpointer = AgentCoreMemorySaver( + memory_id=memory_id, + region_name="us-east-1" +) + +# Bedrock model を作成 +bedrock_model = ChatBedrock( + model_id="us.anthropic.claude-sonnet-4-5-20250929-v1:0", + temperature=0.1, + streaming=True +) + +# Gateway tools 用の MCP クライアントを作成 +mcp_client = MultiServerMCPClient({ + "gateway": { + "transport": "streamable_http", + "url": gateway_url, + "headers": { + "Authorization": f"Bearer {access_token}" + } + } +}) + +# Gateway からツールを読み込む +tools = await mcp_client.get_tools() + +# memory とツールを伴うエージェントを作成 +graph = create_react_agent( + model=bedrock_model, + tools=tools, + checkpointer=checkpointer +) + +# actor と session を指定して invoke +config = { + "configurable": { + "thread_id": session_id, + "actor_id": user_id + } +} + +# レスポンスをストリーム +async for event in graph.astream( + {"messages": [("user", "Hello")]}, + config=config, + stream_mode="messages" +): + message_chunk, metadata = event + # ストリーミングチャンクを処理 +``` + +**Long-term memory (Store):** + +```python +from langgraph_checkpoint_aws import AgentCoreMemoryStore +from langchain_core.runnables import RunnableConfig +import uuid + +store = AgentCoreMemoryStore(MEMORY_ID, region_name="us-west-2") + +def pre_model_hook(state, config: RunnableConfig, *, store): + """抽出のためにメッセージを保存""" + actor_id = config["configurable"]["actor_id"] + thread_id = config["configurable"]["thread_id"] + namespace = (actor_id, thread_id) + + messages = state.get("messages", []) + for msg in reversed(messages): + if isinstance(msg, HumanMessage): + store.put(namespace, str(uuid.uuid4()), {"message": msg}) + break + + return {"llm_input_messages": messages} + +graph = create_react_agent( + model=llm, + tools=tools, + checkpointer=checkpointer, + store=store, + pre_model_hook=pre_model_hook +) +``` + +--- + +## 追加リソース + +詳細情報やコミュニティサポートについては以下を参照してください。 + +- **Community Slack**: `#bedrock-agentcore-memory-interest` +- **All Code Examples**: [AgentCore Samples Repository](https://github.com/awslabs/amazon-bedrock-agentcore-samples) + +## Design notes + +本派生プロジェクト固有の設計判断: + +- **長期記憶 (LTM) をデモで有効化**: Memory リソースには常に semantic memory strategy をプロビジョンし、Runtime の env var `USE_LONG_TERM_MEMORY` で `AgentCoreMemorySessionManager` を retrieval 付きで構築するかを切り替える。LTM 常時保持の追加コストは小さく、「セッションを跨いで記憶する」というデモ価値の方が大きいと判断した。 +- **意味検索を補うメタ想起ツール**: ベクトル類似度では「過去に何を話したか」のようなメタ質問にヒットしない。クエリ無しで Memory レコードを列挙する `list_long_term_memories` ツールを別途用意し、エージェント自身の履歴に関するメタ質問に答えられるようにしている。 diff --git a/samples/aws-specialist-agent/docs-jp/REPLACING_COGNITO.md b/samples/aws-specialist-agent/docs-jp/REPLACING_COGNITO.md new file mode 100644 index 0000000..b9550bb --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/REPLACING_COGNITO.md @@ -0,0 +1,841 @@ +# Cognito の置き換え: Identity Provider の交換と Gateway Interceptors ガイド + +このドキュメントでは、FAST AgentCore アーキテクチャにおいて Amazon Cognito を別の Identity Provider (IdP) に置き換える方法と、アクセス制御において Cedar Policy の代替もしくは補完として Gateway Interceptors を活用する方法を説明します。 + +--- + +## 1. 概要 + +### 現在のアーキテクチャの概要 + +FAST デモでは、Amazon Cognito を Identity Provider として使用しており、次のフローで動作します。 + +``` +User JWT → Runtime (validates user) → Runtime gets M2M token from Cognito → Pre-Token Lambda injects user claims into M2M token → Gateway authorizer validates M2M token → Cedar Policy Engine evaluates user claims → allows/denies tool access → Target Lambda receives tool input only +``` + +**このドキュメントは、次の 2 つの問いに答えます。** Gateway がアクセス制御の実施のためにユーザーをどのように識別するか、そして異なる IdP でこれをどのように実現するか、です。 + +### 2 つのアプローチ + +| アプローチ | 利用するタイミング | +| ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | +| **アプローチ A: IdP を交換し、Cedar Policy を維持する** | 新しい IdP がトークンの拡張 (発行時に M2M トークンへカスタムクレームを注入する機能) をサポートしている場合 | +| **アプローチ B: Gateway Interceptors** | 新しい IdP がトークンの拡張をサポートしていない場合、または完全に動的なアクセス制御が必要な場合 | + +--- + +## 2. アプローチ A — IdP を交換し、Cedar Policy を維持する + +**対象:** トークンの拡張をサポートする IdP (Okta (Token Inline Hooks)、Auth0 (Actions)、Entra ID (Claims Mapping Policies) など)。 + +### 2a. 仕組み + +アーキテクチャは現在の Cognito フローと同じままです。Cognito 固有のコンポーネントは新しい IdP の同等機能に置き換えられます。 + +``` +User JWT → Runtime (validates user via new IdP's OIDC) → Runtime gets M2M token from new IdP's token endpoint → IdP's token enrichment hook injects user claims (replaces Pre-Token Lambda) → Gateway authorizer validates M2M token (via new IdP's OIDC discovery URL) → Cedar Policy Engine evaluates user claims → allows/denies (UNCHANGED) → Target Lambda receives tool input only (UNCHANGED) +``` + +**重要なポイント:** AgentCore Gateway の CUSTOM_JWT authorizer は **IdP に依存しません**。AWS 公式ドキュメントには次のように記載されています。 + +> "The inbound authorizer is Identity Provider (IdP) agnostic and works with any OAuth 2.0 compatible identity provider." + +有効な OIDC discovery URL のみが必要であり、Gateway はあらゆる発行者からのトークンを検証します。 + +### 2b. 変更が必要な箇所 (コンポーネントマッピング) + +| コンポーネント | 現在 (Cognito) | 新しい構成 (サードパーティ IdP) | +| ------------------------------------ | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| Gateway authorizer の discovery URL | `https://cognito-idp.{region}.amazonaws.com/{pool_id}/.well-known/openid-configuration` | `https://{your-idp}/.well-known/openid-configuration` | +| Token endpoint | `POST https://{cognito_domain}/oauth2/token` | IdP の token endpoint (例: `https://{okta_domain}/oauth2/v1/token`) | +| トークン拡張へのアイデンティティ伝播 | `aws_client_metadata: {"verified_user_id": "..."}` (Cognito 固有) | IdP 固有の仕組み (下記参照) | +| トークン拡張の仕組み | Pre-Token Lambda (V3、Cognito トリガー) | IdP のネイティブフック (下記参照) | +| Cedar Policy | **変更なし** — 引き続き `principal.getTag("department")` などを参照 | **変更なし** | +| Target Lambda | **変更なし** — ツール入力のみを受け取る | **変更なし** | + +### IdP 固有のトークン拡張の仕組み + +| IdP | トークン拡張機能 | アイデンティティの伝播方法 | +| ------------ | --------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| **Okta** | Token Inline Hooks | フックがクライアントコンテキストを受け取り、トークンリクエストに渡されたカスタムパラメータに基づいて拡張可能 | +| **Auth0** | Actions (post-client-credentials) | Actions は M2M アプリケーションに紐づくメタデータを参照したり、カスタム `audience` パラメータを使用可能 | +| **Entra ID** | Claims Mapping Policies | アプリケーションロールとクレームマッピング。グループメンバーシップを直接トークンに含めることが可能 | +| **Cognito** | Pre-Token Lambda (V3) | `aws_client_metadata` が Lambda へ user_id を渡す | + +### 2c. よくある懸念点 + +**Q: LLM はトークンを参照することがありますか?** + +ありません。トークンは Python エージェントコードと MCP クライアントライブラリが管理する HTTP トランスポート層に存在します。LLM はツールスキーマとツールの実行結果のみを操作し、HTTP ヘッダーやトークンへのアクセスは持ちません。 + +**Q: IdP が M2M トークンに任意のクレームを注入できない場合はどうしますか?** + +次のセクションで説明するアプローチ B (Gateway Interceptors) を使用してください。 + +--- + +## 3. アプローチ B — Gateway Interceptors (トークン拡張不要) + +**対象:** OIDC 準拠の任意の IdP。トークン拡張フックを持たないものでも対応可能です。完全に動的なアクセス制御が必要な場合 (実行時に変化する権限がデータベースに格納されている場合など) にも有用です。 + +### 3a. 仕組み + +M2M トークンをユーザークレームで拡張する代わりに、Runtime はユーザーアイデンティティを **別のカスタムヘッダー** として渡します。Gateway Interceptor Lambda がこのヘッダーを読み取り、アクセス制御の判断を下します。 + +Runtime が Gateway へユーザーアイデンティティを渡す方法は 2 つあります。 + +#### オプション 1: ユーザー ID のみを渡す + +Runtime は検証済みのユーザー JWT から user_id を取り出し、プレーンな文字列ヘッダーとして渡します。 + +``` +User JWT → Runtime (validates user JWT via any IdP's OIDC) + → Runtime extracts user_id from validated JWT + → Runtime gets a plain M2M token from IdP (no user claims needed) + → Runtime sends to Gateway: + - Authorization: Bearer ← proves machine trust + - X-User-Id: alice@company.com ← carries user identity (plain string) + → Gateway authorizer validates M2M token only (machine trust) + → Request Interceptor Lambda fires: + - Reads X-User-Id from custom header + - Looks up user's permissions (from IdP groups, DB, YAML, etc.) + - Allows or denies the tools/call request + → Response Interceptor Lambda fires (for tools/list): + - Same permission lookup + - Filters the tool list to only show permitted tools + → Target receives tool input only (no tokens, no headers) +``` + +**Runtime 側のコード:** + +```python +# エージェントコード内 (AgentCore Runtime で実行) +user_id = extract_user_id_from_context(context) # 検証済みユーザー JWT から取得 +m2m_token = await get_m2m_token() # ユーザークレームを含まないプレーンな M2M + +mcp_client = MCPClient( + gateway_url=GATEWAY_URL, + headers={ + "Authorization": f"Bearer {m2m_token}", # マシンの信頼性 + "X-User-Id": user_id, # ユーザーアイデンティティ (プレーン文字列) + } +) +``` + +**Interceptor 側の読み取り:** + +```python +def lambda_handler(event, context): + """Request interceptor: プレーン文字列ヘッダーからユーザーアイデンティティを読み取る。""" + gateway_request = event['mcp']['gatewayRequest'] + headers = gateway_request.get('headers', {}) + + # シンプルな文字列抽出 — JWT のデコードは不要 + user_id = headers.get('X-User-Id', '') + + # このユーザーの権限を検索 (DB、YAML、IdP API など) + permissions = get_user_permissions(user_id) + # ... 権限に基づいて許可または拒否 +``` + +| 利点 | 欠点 | +| -------------------------------------------- | --------------------------------------------------------------------------------------- | +| シンプル — interceptor で JWT デコードが不要 | Gateway 境界の信頼に依存する | +| 低レイテンシ — 署名検証なし | interceptor がユーザー属性を取得するために外部ソース (DB、IdP API) を呼び出す必要がある | +| データの露出が最小限 | interceptor 内で user_id が真正であることを検証できない | + +**利用するタイミング:** Gateway 境界が信頼境界であり、(M2M トークンで検証された) 正規の Runtime のみがこのヘッダーを設定できる場合。 + +--- + +#### オプション 2: ユーザー JWT 全体を渡す + +Runtime は元のユーザー JWT を別のヘッダーとして渡します。これにより、interceptor は **JWT 署名を検証** して改ざんされていないことを証明し、すべてのユーザークレームを直接抽出できます。 + +``` +User JWT → Runtime (validates user JWT via any IdP's OIDC) + → Runtime keeps the original user JWT + → Runtime gets a plain M2M token from IdP (no user claims needed) + → Runtime sends to Gateway: + - Authorization: Bearer ← proves machine trust + - X-User-Token: ← carries full user identity (verifiable) + → Gateway authorizer validates M2M token only (machine trust) + → Request Interceptor Lambda fires: + - Reads X-User-Token from custom header + - Verifies the JWT signature (using IdP's public keys from JWKS endpoint) + - Extracts claims: user_id, email, groups, department, etc. + - Decides allow/deny based on claims + → Response Interceptor Lambda fires (for tools/list): + - Same JWT verification and claim extraction + - Filters the tool list based on user's claims + → Target receives tool input only (no tokens, no headers) +``` + +**Runtime 側のコード:** + +```python +# エージェントコード内 (AgentCore Runtime で実行) +user_jwt = get_user_jwt_from_request(context) # 元のユーザー JWT (Runtime の authorizer で検証済み) +m2m_token = await get_m2m_token() # ユーザークレームを含まないプレーンな M2M + +mcp_client = MCPClient( + gateway_url=GATEWAY_URL, + headers={ + "Authorization": f"Bearer {m2m_token}", # マシンの信頼性 + "X-User-Token": user_jwt, # 完全なユーザー JWT (検証可能) + } +) +``` + +**Interceptor 側の読み取りと検証:** + +```python +import jwt +import requests +from functools import lru_cache + +# IdP から取得した JWKS (公開鍵) をキャッシュ +@lru_cache(maxsize=1) +def get_jwks(jwks_url): + """IdP から JWKS 公開鍵を取得してキャッシュする。""" + response = requests.get(jwks_url) + return response.json() + +def lambda_handler(event, context): + """Request interceptor: ユーザー JWT を検証してクレームを抽出する。""" + gateway_request = event['mcp']['gatewayRequest'] + headers = gateway_request.get('headers', {}) + + # 完全なユーザー JWT を抽出 + user_token = headers.get('X-User-Token', '') + + if not user_token: + return deny_request("No user token provided") + + # JWT 署名を検証してクレームを抽出 + try: + # IdP の JWKS エンドポイントから公開鍵を取得 + jwks = get_jwks(IDP_JWKS_URL) # 例: https://the-idp/.well-known/jwks.json + + # JWT をデコードして検証 + claims = jwt.decode( + user_token, + jwks, + algorithms=["RS256"], + audience=EXPECTED_AUDIENCE, + issuer=EXPECTED_ISSUER + ) + except jwt.ExpiredSignatureError: + return deny_request("User token expired") + except jwt.InvalidTokenError as e: + return deny_request(f"Invalid user token: {e}") + + # 検証済みクレームから直接ユーザー属性を抽出 + user_id = claims.get('sub', '') + department = claims.get('department', '') + groups = claims.get('groups', []) # Cognito の場合は 'cognito:groups' + role = claims.get('role', 'viewer') + + # 検証済みクレームに基づいてアクセス制御を判断 + tool_name = gateway_request['body'].get('params', {}).get('name', '') + + if not is_authorized(user_id, department, groups, role, tool_name): + return deny_request(f"User {user_id} ({department}) not authorized for {tool_name}") + + # 認可済み — そのまま通過 + return { + "interceptorOutputVersion": "1.0", + "mcp": { + "transformedGatewayRequest": gateway_request + } + } +``` + +| 利点 | 欠点 | +| ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- | +| 暗号学的に検証可能 — interceptor が JWT の真正性を証明できる | より複雑 — interceptor 内で JWT ライブラリと JWKS の取得が必要 | +| すべてのユーザークレームが直接利用可能 (外部参照不要) | レイテンシがやや高い (署名検証 + JWKS キャッシュ) | +| 多層防御 — M2M トークンが侵害されてもユーザー JWT も有効である必要がある | ヘッダーサイズが大きい (完全な JWT 対 シンプルな文字列) | +| Runtime 境界が完全に信頼されていない場合でも動作する | トークンの有効期限を扱う必要がある (ユーザー JWT が M2M トークンより先に期限切れする可能性) | + +**利用するタイミング:** 多層防御が必要な場合 (2 つの独立した検証)、外部サービスを呼び出さずに interceptor 内で複数のユーザークレームが必要な場合、もしくはセキュリティ要件として Gateway レベルでユーザーアイデンティティの暗号学的証明が求められる場合。 + +--- + +#### 比較: オプション 1 とオプション 2 + +| 観点 | オプション 1: X-User-Id (文字列) | オプション 2: X-User-Token (完全な JWT) | +| ------------------------------ | --------------------------------------------------------------- | ----------------------------------------------------------- | +| **セキュリティモデル** | Gateway 境界を信頼する (M2M トークンで呼び出し元の正当性を証明) | 独立して検証する (JWT 署名でユーザーアイデンティティを証明) | +| **interceptor が受け取るもの** | プレーンな user_id 文字列 | すべてのクレームを含む完全な JWT | +| **interceptor の複雑さ** | シンプル — ヘッダーを読み、権限を検索するだけ | より複雑 — JWT を検証し、クレームを抽出 | +| **必要となる外部参照** | あり — ユーザー属性のために DB/IdP に問い合わせる必要 | なし — クレームは JWT 内に存在 | +| **レイテンシ** | より低い (暗号処理なし) + 検索時間 | より高い (暗号検証あり) だが検索は不要 | +| **トークン有効期限の懸念** | なし (単なる文字列) | 必要 — ユーザー JWT が期限切れする可能性 | +| **なりすましリスク** | 低い (正規の Runtime のみが Gateway に到達可能) | なし (JWT 署名は暗号学的証明) | +| **適している用途** | 信頼された Runtime 境界を持つ内部システム | 高セキュリティ環境、ゼロトラストアーキテクチャ | + +--- + +**重要なポイント (両オプションに共通):** M2M トークンとユーザーアイデンティティは **別々の関心事** です。 + +- **M2M トークン** (`Authorization` ヘッダー内) → Runtime が正規の呼び出し元であることを証明 → Gateway authorizer によって検証 +- **ユーザーアイデンティティ** (`X-User-Id` または `X-User-Token` ヘッダー内) → リクエストが誰のためのものかを interceptor に伝える → アクセス制御判断に使用 + +interceptor は、Pre-Token Lambda と Cedar Policy Engine がユーザーアイデンティティをチェックする役割の **両方** を置き換えます。Gateway authorizer は引き続き M2M トークンを検証 (呼び出しが正規であることを保証) しますが、アクセス制御判断は Cedar Policy から Interceptor Lambda に移ります。 + +> **補足:** どちらのオプションでも、LLM がトークンやヘッダーにアクセスすることはありません。これらはエージェントの Python コードと MCP クライアントライブラリが管理する HTTP トランスポート層にのみ存在します。LLM はツールスキーマとツールの実行結果のみを操作します。 + +### 3b. Request Interceptor (`tools/call` を制御) + +request interceptor は target Lambda が実行される **前** に発火します。ツール呼び出しを許可するか拒否するかを判断します。 + +**フロー:** + +``` +Agent calls tools/call → Gateway → Request Interceptor Lambda → (if allowed) → Target +``` + +**動作内容:** + +1. カスタムヘッダー (例: `X-User-Id`) からユーザーアイデンティティを抽出する +2. 呼び出されているツールを特定する +3. ユーザーが権限を持っているかを確認する (スコープ、DB 検索、YAML など) +4. **認可されている場合** → リクエストをターゲットに通過させる +5. **認可されていない場合** → 構造化された MCP エラーを返し、ターゲットは実行されない + +**サンプルコード:** + +```python +def lambda_handler(event, context): + """Request interceptor: tools/call のアクセスを制御する。""" + gateway_request = event['mcp']['gatewayRequest'] + + # カスタムヘッダーからユーザーアイデンティティを抽出 + headers = gateway_request.get('headers', {}) + user_id = headers.get('X-User-Id', '') + + # 呼び出されているツールを特定 + tool_name = gateway_request['body'].get('params', {}).get('name', '') + target = gateway_request.get('target', '') + + # 権限を検索 (DB、YAML、IdP groups など) + if not check_tool_authorization(user_id, tool_name, target): + return { + "interceptorOutputVersion": "1.0", + "mcp": { + "transformedGatewayRequest": { + "statusCode": 403, + "body": { + "error": { + "code": "UNAUTHORIZED", + "message": f"User {user_id} is not authorized to call {tool_name}" + } + } + } + } + } + + # 認可済み — ターゲットへ通過 + return { + "interceptorOutputVersion": "1.0", + "mcp": { + "transformedGatewayRequest": gateway_request + } + } + + +def check_tool_authorization(user_id, tool, target): + """ユーザーがこのツールを呼び出す権限を持つかチェックする。 + + データベースへの問い合わせ、YAML 設定の読み込み、IdP API の呼び出しなどが可能。 + """ + user_scopes = get_user_scopes(user_id) # DB または IdP から取得 + if target in user_scopes: + return True + return f"{target}:{tool}" in user_scopes +``` + +### 3c. Response Interceptor (`tools/list` を制御) + +response interceptor はターゲットが応答した **後** に発火します。エージェントがユーザーに認可されたツールのみを参照するように、ツールリストをフィルタリングします。 + +**フロー:** + +``` +Agent calls tools/list → Gateway → Target returns ALL tools → Response Interceptor → Filtered list +``` + +**動作内容:** + +1. ターゲットからツールリスト全体を受け取る +2. レスポンスペイロードのヘッダーからユーザーアイデンティティを抽出する +3. 各ツールについて、ユーザーが認可されているかを確認する +4. 許可されたツールのみを含むよう変換されたレスポンスを返す + +**サンプルコード:** + +```python +def lambda_handler(event, context): + """Response interceptor: tools/list の結果をフィルタリングする。""" + # gateway response と Authorization ヘッダーを抽出 + gateway_response = event['mcp']['gatewayResponse'] + auth_header = gateway_response['headers'].get('Authorization', '') + + # ユーザーアイデンティティを抽出 (透過したカスタムヘッダーから) + user_id = gateway_response['headers'].get('X-User-Id', '') + + # gateway response からツールを取得 + tools = gateway_response['body']['result'].get('tools', []) + # structuredContent も確認 (セマンティック検索のレスポンス用) + if not tools: + tools = gateway_response['body']['result'].get('structuredContent', {}).get('tools', []) + + # ユーザー権限を検索してツールをフィルタリング + user_scopes = get_user_scopes(user_id) # DB、YAML、IdP などから取得 + filtered_tools = filter_tools_by_scope(tools, user_scopes) + + # フィルタリング済みツールを含む変換済みレスポンスを返す + return { + "interceptorOutputVersion": "1.0", + "mcp": { + "transformedGatewayResponse": { + "statusCode": 200, + "headers": {"Authorization": auth_header}, + "body": { + "result": {"tools": filtered_tools} + } + } + } + } + + +def filter_tools_by_scope(tools, allowed_scopes): + """ユーザーの許可スコープに基づきツールをフィルタリングする。""" + filtered_tools = [] + for tool in tools: + target, action = tool['name'].split('___') + # ユーザーがターゲット全体へのアクセス、または特定ツールへのアクセスを持つか確認 + if target in allowed_scopes or f"{target}:{action}" in allowed_scopes: + filtered_tools.append(tool) + return filtered_tools +``` + +### 3d. CDK 設定 + +```typescript +import { LambdaInterceptor } from "aws-cdk-lib/aws-bedrockagentcore" + +// Request interceptor — ターゲットの前に発火 +const requestInterceptor = LambdaInterceptor.forRequest(requestInterceptorLambda, { + passRequestHeaders: true, // 必須: カスタムヘッダー (X-User-Id など) の読み取りを有効化 +}) + +// Response interceptor — ターゲット応答の後に発火 +const responseInterceptor = LambdaInterceptor.forResponse(responseInterceptorLambda, { + passRequestHeaders: true, // 必須: レスポンスペイロード内でヘッダーの読み取りを有効化 +}) + +// Gateway にアタッチ +const gateway = new Gateway(this, "MyGateway", { + // ... その他の設定 + interceptors: [requestInterceptor, responseInterceptor], +}) +``` + +**重要:** `passRequestHeaders: true` は必須です。デフォルトでは、セキュリティ上の理由 (ヘッダーには機密性のあるクレデンシャルが含まれる可能性があるため) からヘッダーは interceptor へ転送されません。明示的にオプトインする必要があります。 + +### 3e. セキュリティとよくある懸念点 + +**Q: LLM がユーザートークンに触れることはありますか?** + +ありません。トークンとユーザーアイデンティティは完全に HTTP トランスポート層に存在します。 + +``` +┌─────────────────────────────────────────────────────────┐ +│ AgentCore Runtime │ +│ │ +│ ┌──────────────────┐ ┌───────────────────────────┐ │ +│ │ Agent Code │ │ LLM (Bedrock) │ │ +│ │ (Python) │◄──►│ │ │ +│ │ │ │ Only sees: │ │ +│ │ Has access to: │ │ - Tool schemas │ │ +│ │ - User JWT │ │ - Tool results │ │ +│ │ - M2M token │ │ - Conversation text │ │ +│ │ - HTTP headers │ │ │ │ +│ └────────┬─────────┘ └───────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌──────────────────┐ │ +│ │ MCP Client │ ← handles HTTP transport │ +│ │ (tokens, headers │ (invisible to LLM) │ +│ │ live here) │ │ +│ └──────────────────┘ │ +└─────────────────────────────────────────────────────────┘ +``` + +LLM は「ツール X を入力 Y で呼び出す」と指示するだけで、トークンやヘッダーを含むすべての HTTP 通信は MCP クライアントが処理します。 + +**Q: 何が何を検証するのですか?** + +| コンポーネント | 検証内容 | 目的 | +| ------------------------------- | ------------------------------------------------ | -------------------------------------------------------------------- | +| Gateway Authorizer (CUSTOM_JWT) | IdP からの M2M トークン | 「私を呼び出しているのは正規の Runtime か?」(マシンの信頼性) | +| Request Interceptor Lambda | X-User-Id ヘッダーからのユーザーアイデンティティ | 「このユーザーはこのツールの利用を許可されているか?」(アクセス制御) | + +これらは順次動作します。 + +1. authorizer が最初に発火 → M2M トークンが無効ならリクエストは拒否 (401) +2. interceptor が次に発火 → ユーザーが権限を持たなければリクエストは拒否 (403) +3. ターゲットが最後に発火 → ツール入力のみを受け取る (トークンもユーザーコンテキストもなし) + +**Q: interceptor と Cedar Policy は共存できますか?** + +はい。両者は補完的な役割を果たします。 + +- **Cedar Policy** は静的・宣言的なルール (例: 「finance 部門は財務ツールへアクセス可能」) を扱う +- **Interceptors** は動的なケース (例: 実行時に変化する DB 内の権限) を扱う + +両方が有効な場合の評価順序は次のとおりです。 + +1. Gateway authorizer がトークンを検証 +2. (設定されていれば) Cedar Policy Engine が評価 +3. interceptor が発火 (request はターゲット前、response はターゲット後) + +リクエストはすべてのチェックを通過する必要があります。 + +--- + +## 4. Cedar Policy 対 Interceptors — どちらをいつ使うか + +| 機能 | Cedar Policy | Gateway Interceptors | +| --------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------ | +| フィルタリングが行われる場所 | Policy Engine (組み込み、マネージド) | Lambda コード | +| チェックする内容 | JWT クレーム (タグ) + context.input | ユーザーアイデンティティ (ヘッダーから) + 任意の外部ソース (DB、YAML、IdP API) | +| 動的か? | 静的ルール (変更にはポリシーの再デプロイが必要) | 完全に動的 (Lambda は実行時に何でも問い合わせ可能) | +| ツールフィルタリング (tools/list) | PartiallyAuthorizeActions により自動 | response interceptor で実装 | +| ツール実行 (tools/call) | AuthorizeAction により自動 | request interceptor で実装 | +| トークン拡張が必要か? | 必要 — クレームが JWT に含まれている必要がある | 不要 — ヘッダーを読み、外部ソースを問い合わせ可能 | +| 入力バリデーション | 可能 — `context.input.amount < 1000` | 可能 — Lambda はリクエストペイロード全体にアクセス可能 | +| スキーマ変換 / PII マスキング | 不可 | 可能 — interceptor がリクエスト/レスポンスを変換可能 | +| マルチテナント分離 | 限定的 (クレームベースのみ) | 完全な柔軟性 (テナント DB へ問い合わせ可能) | +| コード不要 | はい — 宣言的な Cedar ポリシー | いいえ — Lambda コードが必要 | + +### ガイダンス + +- **Cedar Policy を使うとき:** アクセスルールが頻繁に変化しないユーザー属性 (department、role) に基づいており、コードを書かずにシンプルかつ監査可能で宣言的なポリシーを使いたい場合。 +- **Interceptors を使うとき:** 権限が動的 (DB に保存されている)、認可判断のために外部サービスを呼び出す必要がある、スキーマ変換や PII マスキングが必要、または IdP がトークン拡張をサポートしていない場合。 +- **両方を使うとき:** Cedar が基本ルール (例: 「finance のみが財務ツールへアクセス可能」) を扱い、interceptor がエッジケース (例: 「ただしメンテナンス中は除く」「特定テナントのみ」) を扱う場合。 + +--- + +## 5. Cognito User Groups と Cedar Policy の連携 + +ハードコードされたマッピングではなくネイティブの Cognito グループを活用したい、Cognito を継続して利用するチーム向けの内容です。 + +### 5a. Cognito User Groups とは何か + +Cognito User Groups は、ユーザーを論理的なグループ (例: finance、engineering、admin) に整理するための組み込み機能です。次の機能を提供します。 + +- ロール、部門、アクセスレベル別にユーザーを分類する手段 +- ユーザー認証トークンへのグループ名の自動的な含有 (`cognito:groups` クレーム) +- グループごとの IAM ロール関連付け (AWS リソースアクセス用) + +**ユーザーがグループに割り当てられる方法:** + +| 方法 | 発生タイミング | ユースケース | +| -------------------------------- | -------------------------------- | ------------------------------------------ | +| AWS Console | 管理者の手動操作 | アドホックなグループ管理 | +| AdminAddUserToGroup API | プログラム経由 (例: Lambda 内) | 登録時の自動割り当て | +| Post-Confirmation Lambda Trigger | ユーザーがメール確認した後に自動 | 新規ユーザーへのデフォルトグループ割り当て | +| Admin SDK / CLI | バッチ処理 | 一括ユーザー管理 | + +**例: 登録時にグループを自動割り当て (Post-Confirmation Lambda):** + +```python +import boto3 + +cognito = boto3.client('cognito-idp') + +def lambda_handler(event, context): + """Post-Confirmation トリガー: 新規ユーザーをデフォルトグループへ割り当てる。""" + user_pool_id = event['userPoolId'] + username = event['userName'] + + # メールドメインなどのロジックに基づきデフォルトグループを割り当て + email = event['request']['userAttributes'].get('email', '') + + if email.endswith('@finance.company.com'): + group = 'finance' + elif email.endswith('@eng.company.com'): + group = 'engineering' + else: + group = 'general' + + cognito.admin_add_user_to_group( + UserPoolId=user_pool_id, + Username=username, + GroupName=group + ) + + return event +``` + +### 5b. 課題: グループは M2M トークンに含まれない + +`cognito:groups` クレームは、ユーザー認証トークン (Authorization Code フロー) には自動的に含まれます。しかし、M2M トークン (Client Credentials フロー) には含まれません。 + +現在のアーキテクチャでは Gateway が M2M トークンを受け取るため、Cedar Policy はネイティブにユーザーのグループを参照できません。 + +``` +User Auth Token (has groups): M2M Token (NO groups): +{ { + "sub": "alice", "sub": "machine-client-id", + "cognito:groups": [ "scope": "gateway/read gateway/write", + "finance", "token_use": "access" + "admin" // No user context! + ] } +} +``` + +### 5c. 解決策: Pre-Token Lambda がグループを読み取る + +現在の実装では、Runtime が検証済みの access token からユーザーの `cognito:groups` を読み取り、`aws_client_metadata` 経由で Pre-Token Lambda に渡すため、Lambda は API 呼び出しを必要としません。access token にグループメンバーシップが含まれない IdP に切り替える場合は、以下のように Lambda が Cognito の `AdminListGroupsForUser` などの API を呼び出してグループを取得し、カスタムクレームとして M2M トークンに注入することもできます。 + +```python +import boto3 +import os +import logging + +logger = logging.getLogger() +cognito = boto3.client('cognito-idp') + +USER_POOL_ID = os.environ.get('USER_POOL_ID') + +def lambda_handler(event, context): + """V3 Pre-Token Lambda: 実際の Cognito グループ情報を M2M トークンに注入する。""" + trigger_source = event.get("triggerSource", "") + + # M2M (Client Credentials) フローのみ処理 + if trigger_source != "TokenGeneration_ClientCredentials": + return event + + # Runtime から渡された検証済み user_id を取得 + client_metadata = event.get("request", {}).get("clientMetadata", {}) + verified_user_id = client_metadata.get("verified_user_id", "") + + if not verified_user_id: + logger.warning("No verified_user_id in clientMetadata") + return event + + # --- ハードコードされたマッピングを置き換え --- + # ユーザーの実際の Cognito グループを取得 + user_groups = get_user_groups(verified_user_id) + + # グループから department と role を決定 + department = resolve_department(user_groups) + role = resolve_role(user_groups) + + # M2M アクセストークンに注入 + event["response"]["claimsAndScopeOverrideDetails"] = { + "accessTokenGeneration": { + "claimsToAddOrOverride": { + "user_id": verified_user_id, + "department": department, + "role": role, + "user_groups": ",".join(user_groups), # 例: "finance,admin" + } + } + } + + return event + + +def get_user_groups(username): + """Admin API 経由でユーザーの Cognito グループを取得する。""" + try: + response = cognito.admin_list_groups_for_user( + UserPoolId=USER_POOL_ID, + Username=username, + ) + return [group['GroupName'] for group in response.get('Groups', [])] + except Exception as e: + logger.error("Failed to fetch groups for user %s: %s", username, str(e)) + return [] + + +def resolve_department(groups): + """グループメンバーシップから department を解決する。""" + if 'finance' in groups: + return 'finance' + elif 'engineering' in groups: + return 'engineering' + return 'guest' + + +def resolve_role(groups): + """グループメンバーシップから role を解決する。""" + if 'admin' in groups: + return 'admin' + elif 'developer' in groups: + return 'developer' + return 'viewer' +``` + +### 5d. グループを使った Cedar Policy の例 + +グループ情報がクレームとして注入されると、Cedar はそれをアクセス制御に利用できます。 + +**オプション 1: department を確認する (グループから解決)** + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"finance-target___generate_report", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("department") && + principal.getTag("department") == "finance" +}; +``` + +**オプション 2: role を確認する (グループから解決)** + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"admin-target___delete_records", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("role") && + principal.getTag("role") == "admin" +}; +``` + +**オプション 3: `like` を用いて生のグループメンバーシップを確認する** + +```cedar +// user_groups claim contains: "finance,admin,reporting" +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"finance-target___view_reports", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("user_groups") && + principal.getTag("user_groups") like "*finance*" +}; +``` + +> **カンマ区切りグループに対する `like` の注意点:** パターン `like "*finance*"` は "refinance" という名前のグループにもマッチしてしまいます。厳密な一致のためには `like "finance,*"`、`like "*,finance,*"`、`like "*,finance"` のようなパターンを利用するか、より望ましい方法として Lambda 内で boolean に事前解決してください (オプション 4 参照)。 + +**オプション 4: 事前解決した boolean (複雑なグループロジックには推奨)** + +Pre-Token Lambda 内でグループメンバーシップをシンプルな boolean クレームに解決します。 + +```python +claims["is_finance_team"] = "true" if "finance" in user_groups else "false" +claims["is_admin"] = "true" if "admin" in user_groups else "false" +claims["can_delete"] = "true" if "admin" in user_groups and "finance" in user_groups else "false" +``` + +そして Cedar 側では次のように記述します。 + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"admin-target___delete_records", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("is_admin") && + principal.getTag("is_admin") == "true" +}; +``` + +このアプローチでは複雑なグループロジックを Lambda に閉じ込め、Cedar ポリシーはシンプルで読みやすい状態を保てます。 + +--- + +## 6. 進化のパス + +現在のデモアーキテクチャから派生する 3 つのパスのまとめです。 + +``` +Current Demo (Cognito + hardcoded user mapping in Pre-Token Lambda) + │ + ├── Path 1: Keep Cognito, use real groups + │ ├── Replace hardcoded mapping with AdminListGroupsForUser + │ ├── Cedar Policy checks group-based claims + │ └── See: Section 5 + │ + ├── Path 2: Swap IdP that supports token enrichment + │ ├── Replace Cognito with Okta/Auth0/Entra + │ ├── Use IdP's native token hook (replaces Pre-Token Lambda) + │ ├── Cedar Policy remains unchanged + │ └── See: Section 2 + │ + └── Path 3: Swap to any IdP + Gateway Interceptors + ├── No token enrichment needed + ├── Interceptors handle all access control dynamically + ├── Works with ANY OIDC-compliant IdP + └── See: Section 3 +``` + +--- + +## 7. FAQ / クイックリファレンス + +**Q1: AgentCore Gateway は任意の IdP で利用できますか?** + +はい。Gateway の CUSTOM_JWT authorizer は OAuth 2.0 / OIDC 準拠の任意のアイデンティティプロバイダーで動作します。有効な OIDC discovery URL (`.well-known/openid-configuration`) のみが必要です。Gateway はこれを利用して動的に公開鍵を取得し、トークンを検証します。 + +**Q2: IdP を交換するための最小限の変更は何ですか?** + +新しい IdP がトークン拡張をサポートしている場合は次の通りです。 + +1. Gateway authorizer の discovery URL を変更 +2. Runtime のトークンエンドポイント呼び出しを変更 +3. Pre-Token Lambda を IdP のネイティブなトークンフックに置き換える +4. その他 (Cedar Policy、ターゲット) はそのまま + +**Q3: interceptor は Cedar Policy を置き換えますか?** + +置き換えることは可能ですが、必須ではありません。interceptor と Cedar Policy は補完的な役割を持ちます。 + +- **Cedar Policy** = JWT クレームに基づく静的・宣言的・コード不要のルール +- **Interceptors** = 外部ソースを問い合わせられる動的・コードベースのロジック + +どちらか単独でも、多層防御のために両方を併用することも可能です。 + +**Q4: アプローチ A と B のどちらを選ぶか?** + +- **アプローチ A を選ぶケース** IdP がトークン拡張をサポートしており、アクセスルールが (department/role などのユーザー属性に基づく) 比較的静的な場合 +- **アプローチ B を選ぶケース** IdP がトークン拡張をサポートしていない、もしくは動的な権限・スキーマ変換・PII マスキング・マルチテナント分離が必要な場合 + +**Q5: Cedar Policy と interceptor を同時に使えますか?** + +はい。両方が有効な場合は次の通りです。 + +1. Gateway authorizer がまずトークンを検証 +2. 次に Cedar Policy Engine が評価 (設定されていれば) +3. interceptor が発火 (request はターゲット前、response はターゲット後) + +リクエストはすべてのチェックを通過する必要があります。これにより多層防御を実現できます。 + +**Q6: Cognito user groups は Cedar から利用できますか?** + +はい。`cognito:groups` クレームは M2M トークン自体には現れませんが、ユーザーの access token には含まれます。Runtime がそこから読み取り、`aws_client_metadata` 経由で Pre-Token Lambda に渡し、Lambda が結果の `department`/`role` をカスタムクレームとして注入します — `AdminListGroupsForUser` の呼び出しは不要です。詳細とコード例はセクション 5 を参照してください。 + +**Q7: カスタムヘッダー経由でのユーザーアイデンティティの受け渡しは安全ですか?** + +はい、その理由は次の通りです。 + +1. Gateway authorizer が最初に M2M トークンを検証する (呼び出し元が正規の Runtime であることを証明) +2. カスタムヘッダー (`X-User-Id`) は (`passRequestHeaders: true` を設定した) interceptor Lambda のみが読み取れる +3. LLM は HTTP ヘッダーへアクセスできない — それらはトランスポート層にのみ存在する + +セキュリティ境界は Gateway レベルで強制されます。誰かが (有効な M2M トークンなしで) 直接 Gateway を呼び出そうとした場合、interceptor が発火する前に authorizer がそれを拒否します。 diff --git a/samples/aws-specialist-agent/docs-jp/RUNTIME_GATEWAY_AUTH.md b/samples/aws-specialist-agent/docs-jp/RUNTIME_GATEWAY_AUTH.md new file mode 100644 index 0000000..beb7d49 --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/RUNTIME_GATEWAY_AUTH.md @@ -0,0 +1,591 @@ +# AgentCore M2M 認証ワークフロー + +**AgentCore Runtime <--> OAuth Provider <--> Cognito <--> AgentCore Gateway** + +このドキュメントでは、AgentCore Runtime が OAuth2 Credential Provider(AgentCore Identity が管理)を使用して Cognito M2M トークンを取得し、AgentCore Gateway へのリクエストを認証するための完全なワークフローを説明します。内容は **Deployment**(インフラのセットアップ)と **Runtime**(実行時のトークンとリクエストフロー)の 2 フェーズに分かれています。 + +## 背景: 2 つの Secret + +認証ワークフローでは 2 つの Secret が登場します。 + +**Secret 1:** `//machine_client_secret` + +- 作成元: CDK (`secretsmanager.Secret`) + +**Secret 2:** `bedrock-agentcore-identity!default/oauth2/-runtime-gateway-auth` + +- 作成元: デプロイ時の `oauth2ProviderLambda` Custom Resource + +Secret 1 は `secretsmanager.Secret` で作成され、Cognito machine client が生成した secret から値が投入されます。Secret 2 は `oauth2ProviderLambda` がデプロイ時に `secretsmanager:CreateSecret` および `secretsmanager:PutSecretValue` を使って作成します。 + +**補足:** `bedrock-agentcore-identity!default/oauth2/-runtime-gateway-auth` という名前空間は、デフォルトの Token Vault における OAuth2 認証情報用の AgentCore Identity の規約であり、本スタックの実装に由来しています。 + +## 背景: 3 つの IAM Role + +1. **AgentCoreRole** + - 作成元: CDK construct `createAgentCoreRuntime()` + - 引き受け元: AgentCore Runtime + +2. **GatewayRole** + - 作成元: `createAgentCoreGateway()` + - 引き受け元: AgentCore Gateway サービス + +3. **oauth2ProviderLambda Role** + - 作成元: CDK(Lambda 関数用に自動生成) + - 引き受け元: `oauth2ProviderLambda` 関数 + +`GatewayRole` は trust principal として `new iam.ServicePrincipal("bedrock-agentcore.amazonaws.com")` を使用します。 + +## 重要: User Auth と M2M Auth は別物 + +このスタックには相互に独立した 2 つの認証フローが存在します。両者は同じ Cognito User Pool を使いますが、用途は異なります。 + +**Flow 1 -- Human User --> AgentCore Runtime(Runtime への inbound):** + +- 人間向けの Cognito app client (`userPoolClientId`) を使用 +- User Pool の discovery URL を指す `RuntimeAuthorizerConfiguration.usingJWT(...)` で Runtime に設定 +- Authorization Code grant を使用(フロントエンド経由の人間によるログイン) +- ユーザーの JWT トークン(`sub` クレームを含む)は Runtime に渡され、許可リスト化された `Authorization` ヘッダー (`requestHeaderConfiguration`) 経由でエージェントコードから利用可能になります + +**Flow 2 -- AgentCore Runtime --> AgentCore Gateway(M2M、Runtime からの outbound):** + +- `machineClient` を使用 — `clientCredentials: true` および `generateSecret: true` を持つ別の Cognito app client +- Client Credentials grant を使用(人間ユーザーは関与しない) +- M2M トークンは AgentCore Identity の Token Vault 経由で Runtime が取得し、Gateway 呼び出しの認証に使用します +- Runtime はユーザーのアイデンティティ(および `cognito:groups`)を `aws_client_metadata` でこの M2M トークンに伝播し、Gateway の Cedar policy がユーザーごとに認可できるようにします — [Identity Propagation & Cedar Policy Guide](IDENTITY_POLICY.md) を参照してください + +2 つのフローはネストではなく並列の関係です。 + +``` +Human User + --> Cognito (Authorization Code, userPoolClientId) + --> User JWT token + --> AgentCore Runtime (validates via userPoolClientId authorizer) + --> Agent code runs... + --> Needs to call Gateway + --> AgentCore Identity Token Vault (Client Credentials, machineClient) + --> Cognito issues M2M JWT (machineClient.userPoolClientId) + --> AgentCore Gateway (validates via machineClient.userPoolClientId authorizer) + --> Tool Lambda +``` + +ユーザーの Cognito Pool と machine client は CDK 上の利便性の都合から同じ Cognito User Pool を共有しており、認証目的は異なります。ユーザーの検証済みアイデンティティは M2M トークンの _取得方法_(常に Token Vault 経由の Client Credentials)は変えませんが、`aws_client_metadata` 経由でトークンのクレームに _載せられ_、Gateway がユーザーごとに認可できるようにします([Identity Propagation](IDENTITY_POLICY.md) を参照)。 + +## PHASE 1: DEPLOYMENT WORKFLOW + +このフェーズは `cdk deploy` 時に一度だけ実行されます。目的は、Runtime が実行時に利用できるように OAuth2 Credential Provider を AgentCore Identity に登録することです。 + +### Step D1 -- Cognito M2M インフラのセットアップ + +CDK が M2M 認証に必要な Cognito リソースをプロビジョニングします。 + +**作成されるリソース:** + +- `UserPoolResourceServer` -- 識別子 `-gateway` のもとで API スコープ(read、write)を定義 +- `UserPoolClient`(Machine Client)-- `clientCredentials: true` および `generateSecret: true` を持つ confidential app client +- `secretsmanager.Secret`(Secret 1)-- machine client の `client_id` と `client_secret` を保存 + +**アクティブな IAM Role:** なし(CDK CloudFormation の execution role がプロビジョニングを担う) + +**データフロー:** + +``` +CDK CloudFormation + --> Creates Cognito User Pool Resource Server + --> Identifier: -gateway + --> Scopes: read, write + --> Creates Cognito Machine Client + --> Grant type: CLIENT_CREDENTIALS + --> generateSecret: true --> Cognito generates client_id + client_secret + --> Stores client_secret in Secrets Manager as Secret 1 + --> Path: //machine_client_secret +``` + +**理由:** Machine Client は Cognito から M2M トークンを要求する際に使用される OAuth2 アイデンティティです。Resource Server はそれらのトークンが有効となるスコープを定義します。Secret 1 は次のステップで使用される認証情報を保管する、CDK 管理下の安全なストアです。 + +### Step D2 -- Cognito JWT Authorizer 付きの AgentCore Gateway デプロイ + +CDK が `CUSTOM_JWT` authorizer を Cognito User Pool に向けて構成した状態で AgentCore Gateway (`CfnGateway`) をデプロイします。 + +**主要な構成:** + +``` +authorizerType: "CUSTOM_JWT" +authorizerConfiguration: + customJwtAuthorizer: + discoveryUrl: https://cognito-idp..amazonaws.com//.well-known/openid-configuration + allowedClients: [ machineClient.userPoolClientId ] +``` + +**アクティブな IAM Role:** GatewayRole + +**GatewayRole の権限:** + +- `lambda:InvokeFunction` on `toolLambda` -- MCP tool Lambda ターゲットを呼び出す +- `bedrock:InvokeModel`, `bedrock:InvokeModelWithResponseStream` +- `ssm:GetParameter`, `ssm:GetParameters` +- `cognito-idp:DescribeUserPoolClient` on User Pool ARN -- JWT 検証のため Cognito app client 設定を内省する +- `cognito-idp:InitiateAuth` on User Pool ARN -- トークン関連の操作のために Cognito 認証フローを開始する +- `logs:CreateLogGroup`, `logs:CreateLogStream`, `logs:PutLogEvents` + +**データフロー:** + +``` +CDK CloudFormation + --> Creates CfnGateway + --> authorizerType: CUSTOM_JWT + --> discoveryUrl: Cognito OIDC discovery URL (for JWKS fetching at runtime) + --> allowedClients: [ machineClient.userPoolClientId ] + --> Creates CfnGatewayTarget + --> Protocol: MCP + --> Target: toolLambda ARN + --> Credential provider: GATEWAY_IAM_ROLE + --> Stores Gateway URL in SSM: //gateway_url +``` + +**理由:** `discoveryUrl` はトークン検証で信頼する Cognito User Pool を指定し、実行時に JWT 署名検証用の JWKS(公開鍵)を取得するために使用されます。`allowedClients` 制限により、machine client に発行されたトークンのみが受け入れられるようになります。 + +### Step D3 -- OAuth2 Credential Provider の登録(Custom Resource) + +`oauth2ProviderLambda`(CDK Custom Resource により駆動)が実行され、AgentCore Identity の Token Vault に OAuth2 Credential Provider を登録します。 + +**アクティブな IAM Role:** oauth2ProviderLambda execution role(CDK により自動作成) + +**oauth2ProviderLambda Role の権限:** + +- `secretsmanager:GetSecretValue` on Secret 1 (`//machine_client_secret`) -- CDK 管理ストレージから Cognito machine client の `client_id` と `client_secret` を読み取る。これらの認証情報は信頼の起点であり、AgentCore Identity に登録するためにはまず読み出す必要があります。 +- `secretsmanager:CreateSecret` on Secret 2 (`bedrock-agentcore-identity!default/oauth2/*`) -- Secrets Manager 内の AgentCore Identity 名前空間に新しい secret を作成する。この名前空間は Token Vault が実行時に認証情報を見つけることを想定する場所です。 +- `secretsmanager:PutSecretValue` on Secret 2 -- 新しく作成された AgentCore Identity 管理の secret に `client_id` と `client_secret` の値を書き込み、M2M トークン取得時に Token Vault が読み取れるようにする。 +- `secretsmanager:DescribeSecret` on Secret 2 -- 作成を試みる前に Secret 2 が既に存在するかを確認する。これによりべき等性が確保され、スタックを再デプロイしても既存の secret を再作成しようとして失敗することはなくなります。 +- `secretsmanager:DeleteSecret` on Secret 2 -- CDK スタックが破棄されるときに Secret 2 を削除する。これがないと、スタック削除後も AgentCore Identity 管理の secret が Secrets Manager に取り残されてしまいます。 +- `bedrock-agentcore:CreateOauth2CredentialProvider` on `token-vault/default` and `token-vault/default/oauth2credentialprovider/*` -- Token Vault に OAuth2 Credential Provider を登録し、provider 名 (`-runtime-gateway-auth`) を Cognito の discovery URL、`client_id`、Secret 2 に紐付ける。これは Provider を実行時に Runtime から利用可能にするコアな登録ステップです。 +- `bedrock-agentcore:GetOauth2CredentialProvider` on `token-vault/default` and `token-vault/default/oauth2credentialprovider/*` -- 登録後に Provider が正常に作成されたことを確認する。再デプロイ時にも Provider が既に存在するかを作成前に確認する用途で使用されます(べき等性)。 +- `bedrock-agentcore:DeleteOauth2CredentialProvider` on `token-vault/default` and `token-vault/default/oauth2credentialprovider/*` -- CDK スタックが破棄されるときに Token Vault から Provider 登録を削除する。これがないと、スタック削除後も Provider のエントリが Token Vault に残り続けてしまいます。 +- `bedrock-agentcore:CreateTokenVault` on `token-vault/default` and `token-vault/default/*` -- Provider 登録を試みる前に default Token Vault が存在することを保証する。Token Vault がまだ作成されていない場合、この権限により Lambda が前提条件として作成できます。 +- `bedrock-agentcore:GetTokenVault` on `token-vault/default` and `token-vault/default/*` -- 操作の前に default Token Vault のステータスを確認する。Provider 登録の前に Vault が利用可能かつ準備完了であることを確認するために使用されます。 +- `bedrock-agentcore:DeleteTokenVault` on `token-vault/default` and `token-vault/default/*` -- 必要に応じてスタック破棄時に Token Vault をクリーンアップする。完全な解体シナリオに備えた防御的なクリーンアップ権限です。 + +**データフロー:** + +``` +oauth2ProviderLambda + | + |-- 1. Reads Secret 1 + | --> Gets: client_id, client_secret + | + |-- 2. Creates Secret 2 in Secrets Manager + | --> Namespace: bedrock-agentcore-identity!default/oauth2/-runtime-gateway-auth + | --> Stores: { client_id, client_secret } + | + |-- 3. Calls bedrock-agentcore:CreateOauth2CredentialProvider + | --> Provider name: -runtime-gateway-auth + | --> discoveryUrl: Cognito OIDC discovery URL + | --> clientId: machineClient.userPoolClientId + | --> secretArn: Secret 2 ARN + | --> grantType: CLIENT_CREDENTIALS (M2M / 2LO) + | + └-- 4. Provider is now registered in Token Vault (default) + --> Provider ARN: arn:aws:bedrock-agentcore:::token-vault/default/oauth2credentialprovider/-runtime-gateway-auth +``` + +**理由:** この登録ステップにより、論理的な provider 名 (`GATEWAY_CREDENTIAL_PROVIDER_NAME` 環境変数) と実際の Cognito OAuth2 構成が結び付けられ、Runtime が AgentCore Identity を介して M2M トークンを取得できるようになります。 + +### Step D4 -- AgentCore Runtime のデプロイ + +CDK が AgentCoreRole と環境変数(`GATEWAY_CREDENTIAL_PROVIDER_NAME` を含む)を伴って AgentCore Runtime をデプロイします。 + +**アクティブな IAM Role:** AgentCoreRole + +**AgentCoreRole の権限(M2M 関連):** + +- `bedrock-agentcore:GetOauth2CredentialProvider` on `oauth2-credential-provider/*` -- 論理名(`GATEWAY_CREDENTIAL_PROVIDER_NAME` の値)から登録済みの OAuth2 Credential Provider のメタデータを参照する。これは実行時に `@requires_access_token` デコレーター内部で呼ばれ、Provider 名を Cognito トークン URL、`client_id`、および Secret 2 への参照に解決します。この権限がないとデコレーターはトークン取得プロセスを開始できません。 +- `bedrock-agentcore:GetResourceOauth2Token` on `token-vault/*` -- Token Vault から M2M アクセストークンを要求する。これは実行時に Cognito JWT を取得するための主要な権限です。Token Vault はキャッシュされた有効なトークンを返すか、Client Credentials grant を使って Cognito から新しいトークンを取得します。 +- `bedrock-agentcore:GetResourceOauth2Token` on `workload-identity-directory/*` -- 呼び出し元の IAM アイデンティティ (AgentCoreRole) を AgentCore Identity ディレクトリに登録された Workload Identity に解決する。Token Vault はこの Workload Identity を使ってキャッシュされたトークンを当該エージェント固有にスコープし、同じ IAM ロールを共有していてもエージェント間でトークンが分離されるようにします。 +- `secretsmanager:GetSecretValue` on Secret 2 (`bedrock-agentcore-identity!default/oauth2/-runtime-gateway-auth`) -- IAM 委譲のために必要: Token Vault が Cognito から新しいトークンを取得する必要があるとき(cache miss)、AgentCore Identity は自身のサービスロールではなく Runtime の IAM ロールで Secret 2 を読み取ります。つまり Runtime は Secret 2 への `GetSecretValue` を持つ必要がありますが、これは Runtime が直接読み取るからではなく、AgentCore Identity が Runtime のロールを代行して認証情報にアクセスするためです。この設計は権限昇格を防ぎます: 呼び出し元は AgentCore Identity を踏み台として、本来直接アクセス権を持たない secret に到達することはできません。 +- `secretsmanager:GetSecretValue` on Secret 1 (`//machine_client_secret`) -- 防御的/テスト用途のみ。標準的な Token Vault フローでは Secret 2 へのアクセスのみで十分です(IAM 委譲経由)。Secret 1 へのアクセスは、Runtime またはその内部で動作するテストスクリプトが Token Vault フロー外で直接 Cognito トークンエンドポイントを呼び出す必要があるときのために用意されています。標準の M2M パスでは不要です。 +- `ssm:GetParameter`, `ssm:GetParameters` on `//*` -- 実行時に Gateway URL (`//gateway_url`) やその他の構成値を SSM Parameter Store から読み取る。Gateway URL は `create_gateway_mcp_client()` が呼ばれた際に一度だけ取得され、以降の MCP 接続すべてで使用されます。 + +**データフロー:** + +``` +CDK CloudFormation + --> Creates AgentCore Runtime + --> Assigns AgentCoreRole as execution role + --> Sets environment variables: + GATEWAY_CREDENTIAL_PROVIDER_NAME = -runtime-gateway-auth + STACK_NAME = + MEMORY_ID = + --> Configures inbound JWT authorizer (for human users calling the Runtime): + discoveryUrl: Cognito User Pool discovery URL + allowedAudiences: [ userPoolClientId ] <-- human-facing app client, NOT machine client + --> Configures requestHeaderConfiguration: + allowlistedHeaders: [ "Authorization" ] <-- so agent code can read the user's JWT +``` + +**`GATEWAY_CREDENTIAL_PROVIDER_NAME` 環境変数を使う理由:** エージェントコードを特定の Provider ARN から切り離すためです。エージェントコードは論理名さえ知っていればよく、Provider 構成の解決は AgentCore Identity が行います。これにより、エージェントコードは環境やスタックを跨いでポータブルになります。 + +## PHASE 2: RUNTIME WORKFLOW + +このフェーズは、エージェントコードが AgentCore Gateway を呼び出す必要があるたびに実行されます。目的は、有効な Cognito M2M トークンを取得し、それを使って Gateway リクエストを認証することです。 + +### Step R1 -- MCP Client の作成とトークン取得のセットアップ + +`create_gateway_mcp_client()` が呼び出され、Gateway 通信用の MCP クライアントをセットアップします。Gateway URL はこの時点で SSM から一度だけ読み取られます(安定しており変化しないため)。トークン取得は lambda factory 内に遅延され、MCP の接続および再接続のたびに最新のものが取得されます。 + +**アクティブな IAM Role:** AgentCoreRole + +**使用される権限:** `ssm:GetParameter` on `//*`(Gateway URL の参照のため) + +**データフロー:** + +``` +create_gateway_mcp_client() is called + | + |-- 1. Reads STACK_NAME from env var + | + |-- 2. Reads Gateway URL from SSM: + | ssm:GetParameter --> //gateway_url + | <-- Returns: Gateway URL (stable, fetched once) + | + └-- 3. Creates MCPClient with lambda factory: + MCPClient( + lambda: streamablehttp_client( + url=gateway_url, + headers={"Authorization": f"Bearer {_fetch_gateway_token()}"} + ), + prefix="gateway", + ) + --> Token is NOT fetched here -- deferred into the lambda + --> _fetch_gateway_token() will be called on every MCP connection/reconnection +``` + +**lambda factory パターンの理由:** 「クロージャの罠」を避けるためです。`_fetch_gateway_token()` を lambda の外で呼び出すと、Python のクロージャはクライアント作成時のトークン値をキャプチャしてしまいます。そのトークンは 60 分間有効です。MCP クライアントが期限切れ後に再接続すると、キャプチャされた古いトークンを使用して Gateway から 401 を受け取ることになります。lambda 内部で `_fetch_gateway_token()` を呼ぶことで、すべての MCP 接続時に最新のトークンが取得されます。Token Vault のキャッシュ層(`@requires_access_token` デコレーター内)により、これは効率的です -- トークンがまだ有効ならキャッシュされたものが Cognito を呼ばずに即座に返されます。 + +**SSM 読み取りが lambda の外にある理由:** Gateway URL は接続ごとに変化しない安定したインフラエンドポイントです。再接続のたびではなく、クライアント作成時に一度読み取るのが安全かつ効率的です。 + +### Step R2 -- @requires_access_token デコレーターによるトークン取得 + +MCP の接続または再接続のたびに lambda factory が実行され、`_fetch_gateway_token()` が呼び出されます。`@requires_access_token` デコレーター(AgentCore Identity Python SDK の一部)がこの呼び出しを横取りし、すべての OAuth メカニクスを内部で処理します。 + +**アクティブな IAM Role:** AgentCoreRole + +**データフロー:** + +``` +Lambda factory executes (on each MCP connection/reconnection) + --> _fetch_gateway_token() is called + --> @requires_access_token decorator intercepts: + --> provider_name = GATEWAY_CREDENTIAL_PROVIDER_NAME env var + --> auth_flow = "M2M" (Client Credentials grant) + --> scopes = [] (Cognito embeds scopes based on machine client authorization) + --> custom_parameters = {"aws_client_metadata": json({verified_user_id, verified_groups})} + (Pre-Token Lambda 向けのユーザーアイデンティティ -- Identity Propagation guide 参照) + --> Decorator calls AgentCore Identity API internally (see R3 for details) + --> Decorator injects the obtained JWT as access_token argument + --> _fetch_gateway_token(access_token=) returns the JWT string + --> MCPClient uses JWT in Authorization: Bearer header +``` + +**auth_flow="M2M" と scopes=[] の理由:** `auth_flow="M2M"` はデコレーターに対し、Client Credentials grant(ユーザーの介在なし)を使うよう指示します。`scopes=[]` は M2M では正しい設定です -- スコープ (`-gateway/read`、`-gateway/write`) は、machine client が認可されている内容に基づき Cognito によってトークンに埋め込まれるため、呼び出し側で指定する必要はありません。 + +**デコレーター内部に関する補足:** `@requires_access_token` デコレーターは AgentCore Identity Python SDK の一部です。その内部のトークン取得は、後述の R3 で説明する 2 段階のサブステップで構成されます。これはエージェントコードからは見えません -- エージェント側から見ると、デコレーターはトークンを返す単一の呼び出しに過ぎません。 + +### Step R3 -- デコレーター内部: Token Vault からのトークン取得 + +`@requires_access_token` デコレーターの内部で、AgentCore Identity は 2 段階のサブステップでトークンを取得します。AgentCore Identity は Token Vault にキャッシュされた有効なトークンがあるかを確認し、なければ、または期限切れの場合は Cognito から新しいトークンを取得します。 + +**アクティブな IAM Role:** AgentCoreRole + +**使用される権限:** + +- `bedrock-agentcore:GetOauth2CredentialProvider` on `oauth2-credential-provider/*` -- Provider メタデータの参照(サブステップ 3a) +- `bedrock-agentcore:GetResourceOauth2Token` on `token-vault/*` -- Token Vault からのトークン取得(サブステップ 3b) +- `bedrock-agentcore:GetResourceOauth2Token` on `workload-identity-directory/*` -- トークンスコープのための Workload Identity 解決(サブステップ 3b) +- `secretsmanager:GetSecretValue` on Secret 2 -- client_secret アクセスのための IAM 委譲(cache miss 時のみ、サブステップ 3b) + +**データフロー -- サブステップ 3a: Provider メタデータの参照:** + +``` +@requires_access_token decorator (SDK internals) + --> bedrock-agentcore:GetOauth2CredentialProvider + --> Input: provider_name = -runtime-gateway-auth + --> AgentCore Identity looks up the provider registered in Token Vault (Step D3) + <-- Returns: + --> Provider ARN + --> Cognito token URL (derived from discoveryUrl registered in D3) + --> client_id (machineClient.userPoolClientId) + --> Reference to Secret 2 (where client_secret lives) + --> Grant type: CLIENT_CREDENTIALS +``` + +**データフロー -- サブステップ 3b: Token Vault チェックとトークン発行:** + +**Cache Hit(トークンがまだ有効):** + +``` + --> bedrock-agentcore:GetResourceOauth2Token + --> Resolves Workload Identity from AgentCoreRole ARN via workload-identity-directory + --> Checks Token Vault: token for this Workload Identity + provider = VALID (< 60 min old) + <-- Returns: cached JWT access token (no Cognito call needed) +``` + +**Cache Miss(トークン未取得または期限切れ):** + +``` + --> bedrock-agentcore:GetResourceOauth2Token + --> Resolves Workload Identity from AgentCoreRole ARN via workload-identity-directory + --> Checks Token Vault: no valid token found + --> Reads Secret 2 using AgentCoreRole (IAM delegation) + --> Gets: client_secret + --> Calls Cognito token endpoint: + POST https://.auth..amazoncognito.com/oauth2/token + grant_type=client_credentials + client_id= + client_secret= + scope=-gateway/read -gateway/write + aws_client_metadata= + --> Cognito が V3 Pre-Token Lambda を呼び出し、グループを読み取って + department/role クレームを注入(Identity Propagation guide 参照) + <-- Cognito returns: JWT access token (valid 60 minutes by default) + --> Stores token in Token Vault, scoped to this Workload Identity + <-- Returns: new JWT access token +``` + +**Workload Identity が重要な理由:** Token Vault はトークンを IAM ロール単位ではなく Workload Identity 単位で保存します。つまり、2 つの異なるエージェントランタイムが同じ IAM ロールを共有していたとしても、Vault 内では別々のトークンエントリを持ちます。Workload Identity は、エージェント間でのトークン分離を保証する、エージェントレベルのきめ細かなプリンシパルです。 + +**Secret 2 で IAM 委譲を行う理由:** AgentCore Identity は自身のサービスロールではなく、呼び出し元の IAM ロール (AgentCoreRole) を使って Secret 2 を読み取ります。これは意図的なセキュリティ設計です: secret にアクセスできるのは、呼び出し元が `GetResourceOauth2Token` API 権限と Secret 2 への `secretsmanager:GetSecretValue` 権限の両方を持つ場合に限ります。これにより権限昇格を防ぎます -- 呼び出し元は AgentCore Identity を踏み台にして、自身が直接読む権限を持たない secret にアクセスすることはできません。 + +**Token Vault のキャッシュにより lambda factory が効率的になる理由:** `_fetch_gateway_token()` は MCP 接続のたびに呼ばれますが、Token Vault のキャッシュにより、Cognito が呼ばれるのはトークン期限切れ時(およそ 60 分ごと)だけです。それ以外の呼び出しはすべてキャッシュされたトークンを即座に返すため、このパターンは「常に最新」と「効率」の両方を実現します。 + +### Step R4 -- エージェントコードが Gateway へリクエストを送信 + +MCPClient は `_fetch_gateway_token()` から返された JWT を使い、AgentCore Gateway に対して認証付きの HTTP リクエストを送信します。 + +**アクティブな IAM Role:** AgentCoreRole + +**データフロー:** + +``` +MCPClient lambda factory + --> streamablehttp_client( + url=gateway_url, <-- read from SSM in Step R1, stable + headers={"Authorization": f"Bearer {jwt}"} <-- fresh token from Step R2/R3 + ) + --> Sends HTTP request: + POST /mcp + Authorization: Bearer + Content-Type: application/json + { ... MCP tool invocation payload ... } +``` + +**理由:** Gateway URL は安定しており(R1 で一度だけ読み取り)、トークンは最新(R2/R3 で接続ごとに取得)です。`Authorization: Bearer` ヘッダーは、保護されたリソースへトークンを提示する OAuth2 の標準的なメカニズムです。 + +### Step R5 -- Gateway が JWT トークンを検証 + +AgentCore Gateway がリクエストを受信し、`CUSTOM_JWT` authorizer が Bearer トークンを検証します。 + +**アクティブな IAM Role:** GatewayRole + +**データフロー:** + +``` +AgentCore Gateway (CUSTOM_JWT authorizer) + | + |-- 1. Extracts Bearer token from Authorization header + | + |-- 2. Fetches JWKS from Cognito discovery URL: + | GET https://cognito-idp..amazonaws.com//.well-known/openid-configuration + | --> Gets JWKS URI + | GET + | --> Gets Cognito public keys for signature verification + | + |-- 3. Verifies JWT signature using JWKS public keys + | + |-- 4. Checks token claims: + | --> client_id claim ∈ allowedClients (machineClient.userPoolClientId) + | --> token not expired + | --> issuer matches Cognito User Pool + | + └-- 5. Authorization decision: + --> VALID --> forwards request to Gateway Target (Step R6) + --> INVALID --> returns 401 Unauthorized +``` + +**allowedClients によるスコープ制限の理由:** AgentCore Gateway は、ユーザーが作成した特定の machine client に発行されたトークンのみを受け入れます。同じ User Pool に存在する別の Cognito クライアントがトークンを取得したとしても、それは拒否されます。これは意図的な厳格なスコープ設定であり、この AgentCore Gateway を呼び出せるのは AgentCore Runtime の machine client だけになります。 + +### Step R6 -- Gateway が MCP Tool Lambda へ転送 + +検証済みのリクエストは Gateway Target(MCP tool Lambda)に転送されます。 + +**アクティブな IAM Role:** GatewayRole + +**使用される権限:** `lambda:InvokeFunction` on `toolLambda` + +**データフロー:** + +``` +AgentCore Gateway (GatewayRole) + --> lambda:InvokeFunction on toolLambda + --> MCP tool invocation payload + <-- Lambda returns tool result + <-- AgentCore Gateway returns MCP response to AgentCore Runtime + <-- MCPClient delivers result to agent code + <-- Agent code continues execution with tool result +``` + +--- + +## APPENDIX: M2M 認証の Cognito を別の IdP に置き換える + +このセクションでは、Runtime --> Gateway 間の M2M 認証フローにおいて、Cognito を別の identity provider (IdP) に置き換える方法を説明します。Client --> Runtime 間のユーザー認証フローは独立しており、変更されません(上述の「User Auth と M2M Auth は別物」を参照)。 + +### この変更の範囲 + +M2M フローは OAuth2 Client Credentials grant を使用します: Runtime は IdP に登録された `client_id` と `client_secret` で machine トークンを取得し、Gateway は IdP の JWKS を使ってそのトークンを検証します。ユーザーアイデンティティもユーザートークンもこのフローには関与しません — Runtime はユーザーの代理ではなく、自分自身として認証します。 + +**将来のユーザー委譲フローに関する補足:** このドキュメントは現行の Phase 1 実装(Runtime から Gateway へのフローが純粋な M2M、Client Credentials grant)を扱います。将来の Phase では、Runtime が認証済みユーザーの代理でトークンを取得し、Gateway がユーザーアイデンティティを含むトークンを受け取るユーザー委譲フロー(3-legged OAuth / Authorization Code grant)が導入される可能性があります。AgentCore Identity は両方のフローをサポートします。その Phase が実装される際には、Gateway authorizer の構成と `@requires_access_token` デコレーターの `auth_flow` パラメータを更新する必要があります — このセクションの IdP 置き換えガイドはどちらのフローにも適用されます。 + +このフローで Cognito を置き換えるには、2 つの信頼関係を更新する必要があります。 + +1. **AgentCore Gateway の JWT authorizer** — 新しい IdP の discovery URL を指し、新しいクライアントの `client_id` を受け入れる必要があります +2. **AgentCore Identity の OAuth2 Credential Provider** — 新しい IdP の discovery URL、`client_id`、`client_secret` を構成する必要があります + +Token Vault、`@requires_access_token` デコレーター、Workload Identity、AgentCore Runtime コードは IdP 非依存であり、変更は必要ありません。 + +### サポートされる IdP + +AgentCore Identity は OAuth2 Provider について 2 つのモードをサポートします。 + +1. **組み込みのマネージド Provider**(AWS が事前構成・保守): Amazon Cognito, Auth0 by Okta, Atlassian, CyberArk, Dropbox, Facebook, FusionAuth, GitHub, Google, HubSpot, LinkedIn, Microsoft, Notion, Okta, OneLogin, Ping Identity, Reddit, Salesforce, Slack, Spotify, Twitch, X, Yandex, Zoom + +2. **CustomOauth2**(このスタックで使用): `.well-known/openid-configuration` の discovery エンドポイントを公開している任意の OIDC 準拠 IdP。これは汎用的なパスであり、上記すべての IdP に対して機能します。 + +**Cognito が組み込みベンダーであるにもかかわらず、このスタックが CustomOauth2 を使う理由:** AgentCore Identity の組み込みベンダー `AmazonCognito` は、エージェントが人間ユーザーの代理として動作するユーザー委譲フロー(3-legged OAuth / Authorization Code grant)向けに設計されています。ここで使用する M2M Client Credentials grant ではユーザーは関与しません — Runtime は自分自身として認証します。`discoveryUrl` 付きの `CustomOauth2` は、どの IdP がバックエンドにあっても Client Credentials / M2M フローにとっては正しい選択肢であり、Cognito を標準的な OIDC Provider として扱います。この選択により、スタックは設計上 IdP 移植可能になります: 別の IdP に切り替える際には、`discoveryUrl` とクライアント認証情報の値を変更するだけでよく、Custom Lambda コードを変更する必要はありません。 + +M2M(Client Credentials grant)の場合、置き換える IdP は次をサポートする必要があります。 + +- OAuth 2.0 Client Credentials grant (`grant_type=client_credentials`) +- JWKS ベースの JWT 検証のための OIDC Discovery (`.well-known/openid-configuration`) +- クライアントアプリケーションでの設定可能なスコープ +- client secret を持つ confidential client + +ほとんどのエンタープライズ IdP はこれらをネイティブにサポートしています。例として Microsoft Entra ID、Okta、Auth0 などがあります — 進める前に、IdP のドキュメントを参照して Client Credentials grant と OIDC Discovery のサポートを確認してください。 + +### 必要な CDK スタックの修正 + +#### 1. createMachineAuthentication() — 全面置き換え + +このメソッドは Cognito 固有です。`UserPoolResourceServer`、`UserPoolClient`(machine client)、`MachineClientSecret` を作成します。これらのリソースは OAuth2 machine client のアイデンティティを確立し、要求できるスコープを定義します。別の IdP の場合は、その IdP 自身のコンソールや管理ツールで同等のセットアップを行います。 + +**このステップが後続のステップに対して提供すべき内容:** + +- **`client_id`**: machine client の OAuth2 クライアント識別子 + - 利用先: Gateway authorizer (`allowedClients`)、Custom Resource (`properties.ClientId`) +- **`client_secret`**: machine client の OAuth2 クライアントシークレット + - 利用先: Secret 1 (`//machine_client_secret`) として Secrets Manager に保存 +- **Discovery URL**: IdP の OIDC discovery エンドポイント + - 利用先: Gateway authorizer (`discoveryUrl`)、Custom Resource (`properties.DiscoveryUrl`) + +オリジナルと同じ `secretsmanager.Secret` パターンを使い、`//machine_client_secret` に `client_id` と `client_secret` を保存します。Discovery URL は静的な文字列です — 以降のステップで使えるよう、変数または SSM パラメータとして保管してください。 + +IdP 固有のセットアップ(confidential client の作成、Client Credentials grant の有効化、スコープの定義)については、IdP のドキュメントを参照してください。 + +#### 2. createAgentCoreGateway() — Discovery URL と allowedClients の値 + +**変更 A — Discovery URL 変数:** + +```typescript +// Current (Cognito): +const cognitoIssuer = `https://cognito-idp.${this.region}.amazonaws.com/${this.userPool.userPoolId}` +const cognitoDiscoveryUrl = `${cognitoIssuer}/.well-known/openid-configuration` + +// Any OIDC-compliant IdP: +const discoveryUrl = `/.well-known/openid-configuration` +``` + +**変更 B — CfnGateway authorizer 構成:** + +```typescript +authorizerConfiguration: { + customJwtAuthorizer: { + allowedClients: [], // replace machineClient.userPoolClientId + discoveryUrl: discoveryUrl, // replace cognitoDiscoveryUrl + }, +}, +``` + +**変更 C — GatewayRole から Cognito 固有の IAM 権限を削除:** + +```typescript +// Remove these — they are Cognito-specific and not needed for other IdPs: +// cognito-idp:DescribeUserPoolClient +// cognito-idp:InitiateAuth +``` + +**理由**: Gateway は実行時に `discoveryUrl` を使って IdP の JWKS を取得し、JWT 署名の検証に使用します。`allowedClients` の制限により、特定の machine client に発行されたトークンだけが受け入れられるようになります。Cognito の IAM 権限は Cognito 固有の API 呼び出しにのみ必要なものであり、他の IdP は AWS IAM 権限を必要としない標準的な OIDC/JWKS エンドポイントを使用します。 + +#### 3. Custom Resource プロパティ — 値のみ変更、Lambda コードは不要 + +`oauth2ProviderLambda` のコードは既に IdP 非依存です。汎用的な `discoveryUrl` を伴う `credentialProviderVendor="CustomOauth2"` を使用しているため、コード変更は不要です。Custom Resource に渡されるプロパティのみ変更します。 + +```typescript +const runtimeCredentialProvider = new cdk.CustomResource(this, "RuntimeCredentialProvider", { + serviceToken: oauth2Provider.serviceToken, + properties: { + ProviderName: providerName, + ClientSecretArn: this.machineClientSecret.secretArn, // same pattern, new IdP secret + DiscoveryUrl: discoveryUrl, // new IdP discovery URL + ClientId: , // new IdP client_id + }, +}) +``` + +**理由**: Lambda は渡された `DiscoveryUrl` と `ClientId` をそのまま読み取り、`CustomOauth2` プロバイダーとして AgentCore Identity に登録します。Token Vault は実行時にこれらの値を使って正しい IdP のトークンエンドポイントを呼び出します。Lambda の `handle_create`、`handle_update`、`handle_delete` ハンドラーには変更は一切不要です。 + +**組み込みベンダーに関する補足**: `CustomOauth2` の代わりに組み込みベンダー(上述「サポートされる IdP」セクションを参照)を使いたい場合は、Lambda の `handle_create` と `handle_update` で `credentialProviderVendor` を変更します。組み込みベンダーは AWS が管理するエンドポイント構成を持ち、プロバイダー固有のクセを自動的に処理する場合があります。ただし、`discoveryUrl` 付きの `CustomOauth2` はすべての OIDC 準拠 IdP に対して機能し、環境を跨いで保守しやすいです。 + +#### 4. createAgentCoreRuntime() — 変更不要 + +Runtime は `GATEWAY_CREDENTIAL_PROVIDER_NAME` 環境変数のみを把握しています。どの IdP がプロバイダーをバックアップしているかは関知しません。Token Vault が、Step D3 で登録された構成を使って IdP との対話を透過的に解決します。 + +#### 5. createCognitoSSMParameters() — Cognito 固有のパラメータ名を変更(任意) + +SSM パラメータ `cognito-user-pool-id`、`cognito-user-pool-client-id`、`cognito_provider` は名前的に Cognito 固有です。別の IdP の場合は、これらを IdP 非依存の名称(例: `idp-discovery-url`、`machine-client-id`)にリネームします。`gateway_url` と `machine_client_id` のパラメータは既に IdP 非依存です。 + +--- + +### サマリー: 何が変わり、何が変わらないか + +**変更が必要なコンポーネント:** + +- **createMachineAuthentication()** — 全面置き換えが必要 + - Cognito 固有のリソースを同等の IdP クライアントセットアップに置き換える + - 提供すべきもの: `client_id`、`client_secret`、Discovery URL +- **CfnGateway authorizerConfiguration** — 値の更新 + - `discoveryUrl` を新しい IdP の OIDC discovery エンドポイントに変更 + - `allowedClients` を新しい IdP の `client_id` に変更 +- **GatewayRole IAM 権限** — Cognito 固有の権限を削除 + - `cognito-idp:DescribeUserPoolClient` を削除 + - `cognito-idp:InitiateAuth` を削除 +- **Custom Resource プロパティ** — 値のみ更新 + - `DiscoveryUrl` を新しい IdP の discovery エンドポイントに変更 + - `ClientId` を新しい IdP の `client_id` に変更 + - `ClientSecretArn` を Secrets Manager の新しい IdP secret に向ける +- **SSM パラメータ名** — 任意のリネーム(見た目のみ) + - 必要に応じて Cognito 固有のパラメータ名を IdP 非依存の名称にリネーム + +**変更が不要なコンポーネント:** + +- **oauth2ProviderLambda コード** — 既に IdP 非依存 + - 汎用的な `CustomOauth2` ベンダーを `discoveryUrl` パラメータと共に使用 + - `handle_create`、`handle_update`、`handle_delete` のコード変更は不要 + - **任意**: Lambda コードで `credentialProviderVendor` を変更することで組み込みベンダーに切り替え可能。ただし `CustomOauth2` はすべての OIDC 準拠 IdP に対して機能する +- **createAgentCoreRuntime()** — 既に IdP 非依存 + - `GATEWAY_CREDENTIAL_PROVIDER_NAME` 環境変数のみを把握 + - Token Vault が IdP との対話を透過的に解決 +- **エージェントコード** — 既に IdP 非依存 + - IdP 非依存の `@requires_access_token` デコレーターを使用 + - 採用しているエージェントパターンに関わらずエージェントコードに変更は不要 +- **Client → Runtime ユーザー認証** — 独立したフロー + - Runtime → Gateway の M2M 認証とは別の関心事 + - M2M IdP の変更による影響を受けない diff --git a/samples/aws-specialist-agent/docs-jp/SKILLS.md b/samples/aws-specialist-agent/docs-jp/SKILLS.md new file mode 100644 index 0000000..ef0f146 --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/SKILLS.md @@ -0,0 +1,19 @@ +# Skills + +このデプロイでは、キュレーション済みの「スキル」(自己記述型の機能バンドル) を S3 Files 経由で Runtime にマウントしています。モデルの system prompt を肥大化させずにドメイン知識を持たせるためのしくみです。 + +## スキルのマウント方法 + +- スキルは `skills/agent-toolkit-for-aws/` (ピン留めされた第三者コンテンツ。LICENSE/NOTICE 付きでそのまま保持) と `skills/aws-specialist-agent/` (本プロジェクト独自スキル) の配下に置く。 +- ビルドステップ (`scripts/build-project-guide.py`) がプロジェクト固有のガイドを組み立てて全体を S3 バケットにアップロードする。 +- AgentCore Runtime コンテナは S3 Files でこのバケットを既知のパスにマウントする。エージェントは必要な機能の `SKILL.md` を遅延読み込みする。 + +## Design notes + +- **イメージ同梱ではなく S3 Files**: スキルは Runtime イメージより更新頻度が高い。S3 Files でマウントすることで、Runtime を再デプロイせずにスキル更新を反映できる。 +- **submodule ではなく vendored**: 第三者スキルは当初 git submodule で取り込んでいたが、コミットハッシュをピン留めしたコピー (LICENSE 同梱) に切り替えた。サプライチェーンの予期せぬ変化を避け、submodule init 無しでもビルドできる利点がある。 +- **マウントパス vs. VPC のトレードオフ**: S3 Files は Runtime が S3 に到達できる必要がある。閉域構成では S3 (Gateway) endpoint の追加コストを払う必要があるが、スキルを別経路で更新できる柔軟性とのトレードオフで S3 Files を選択した。 +- **S3 Files 用 IAM ロールを厳格化**: Runtime がスキルを取得する execution role はスキル用 bucket/prefix に限定し、AgentCore 側の IAM 要件をデプロイ時に検証する。 +- **自己説明型プロジェクトガイド**: `skills/aws-specialist-agent/fast-project-guide/` はライブのソースツリーから (サニタイズしたうえで) 生成する。デプロイ済みエージェントが「このアプリはどう組み立てられているか」という質問に、ドキュメントではなく実コードに基づいて答えられる。 +- **公式 Code Interpreter**: 独自サンドボックスを再実装せず AgentCore 提供の Code Interpreter ツールを直接使う。フレームワーク固有のラッパ (`tools/code_interpreter/`) で選択したエージェント SDK に橋渡しする。 +- **補助 Lambda も閉域 VPC に接続**: 補助 Lambda (feedback / history / session / oauth2-provider / zip-packager / pre-token) はすべて Runtime と同じ VPC で動かし、トラフィックをプライベート経路に閉じる。各 SG は必要な endpoint だけを許可する。 diff --git a/samples/aws-specialist-agent/docs-jp/STREAMING.md b/samples/aws-specialist-agent/docs-jp/STREAMING.md new file mode 100644 index 0000000..0d3f36d --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/STREAMING.md @@ -0,0 +1,331 @@ +# エージェント向けストリーミングガイド + +## 概要 + +エージェントはストリーミングイベントを SSE 形式で送信します。このガイドでは、ストリーミングをフロントエンドと統合する方法について説明します。 + +## 統合手順 + +1. **エージェントがストリーミングイベントを送信** (SSE 形式) +2. **`agentcore-client` ライブラリ** が SSE ストリームを読み取り、適切なパーサーにルーティング: + - **Strands エージェント (デフォルト)** の場合: `frontend/src/lib/agentcore-client/parsers/strands.ts` — Strands スキーマイベントを解析 + - **LangGraph エージェント** の場合: `frontend/src/lib/agentcore-client/parsers/langgraph.ts` + - **Bedrock Converse (汎用)** の場合: `frontend/src/lib/agentcore-client/parsers/converse.ts` — 生の Bedrock Converse ストリームイベントを解析 + - **その他のエージェントフレームワーク** の場合: 新しいパーサーを作成し、`frontend/src/lib/agentcore-client/client.ts` に登録 +3. **パーサーが型付けされた `StreamEvent` を発行** (text、tool_use_start、tool_use_delta、tool_result、message、result、lifecycle) +4. **`ChatInterface.tsx`** がイベントを処理し、メッセージセグメント (テキスト + ツール呼び出しのインターリーブ) を構築 +5. **`ChatMessage.tsx`** がセグメントを Markdown フォーマットとツール呼び出しコンポーネントとともにインラインでレンダリング + +--- + +## 現在の実装 + +### バックエンド: Strands エージェント + +**ファイル:** `agent/strands-single-agent/basic_agent.py` + +バックエンドは、JSON 安全な dict にシリアライズされたすべての生の Strands ストリーミングイベントを yield します: + +```python +async for event in agent.stream_async(user_query): + yield json.loads(json.dumps(dict(event), default=str)) +``` + +**補足:** Strands イベントには JSON シリアライズできない Python オブジェクト (エージェントインスタンス、UUID、`ModelStopReason` タプルなど) が含まれることがあります。`json.dumps(default=str)` 呼び出しはこれらを文字列に変換し、すべてのイベントが SSE 経由で安全に送信できることを保証します。 + +### フロントエンド: イベントパーサー + +**ファイル:** `frontend/src/lib/agentcore-client/parsers/strands.ts` + +`strands-single-agent` のデフォルトパーサーは、Strands スキーマイベントを処理します: + +```typescript +export const parseStrandsChunk: ChunkParser = (line, callback) => { + if (!line.startsWith("data: ")) return; + const json = JSON.parse(line.substring(6).trim()); + + // テキストトークン: {"data": "Hello"} + if (typeof json.data === "string") { + callback({ type: "text", content: json.data }); + } + + // ツール使用: {"current_tool_use": {...}, "delta": {"toolUse": {"input": "..."}}} + if (json.current_tool_use) { + // 最初のデルタ (空の入力) → tool_use_start + // 後続のデルタ → tool_use_delta + } + + // ツール結果: {"message": {"role": "user", "content": [{"toolResult": {...}}]}} + if (json.message?.role === "user") { + // toolResult ブロックを抽出 → callback({ type: "tool_result", ... }) + } + + // 完了: {"result": {"stop_reason": "end_turn"}} + if (json.result) { + callback({ type: "result", stopReason: "end_turn" }); + } + + // ライフサイクル: {"init_event_loop": true} + if (json.init_event_loop || json.start_event_loop) { ... } +}; +``` + +エッジケースを含む完全な実装はソースファイルを参照してください。 + +### イベント構造 + +Strands は以下のイベントタイプを提供します: + +- `data`: テキストチャンク (到着すると蓄積される) +- `current_tool_use`: ツール名、ID、入力パラメータ (ストリーミング用の `delta` を含む) +- `message`: 完全なコンテンツを持つ最終的な構造化メッセージ (`toolUse` を持つ assistant、`toolResult` を持つ user) +- `result`: 停止理由とメトリクスを持つ AgentResult +- `init_event_loop`、`start_event_loop`、`complete`: ライフサイクルマーカー +- `tool_stream_event`: ツール実行からストリーミングされるイベント +- `event`: 生の Bedrock Converse イベント (以下の代替 converse パーサーで使用) + +```javascript +// テキストストリーミング +data: {"data": "Hello"} +data: {"data": " there"} + +// ツール使用開始 — 最初のデルタは空の入力を持つ +data: {"current_tool_use": {"toolUseId": "tool_abc123", "name": "text_analysis"}, "delta": {"toolUse": {"input": ""}}} + +// ツール入力ストリーミング +data: {"current_tool_use": {"toolUseId": "tool_abc123", "name": "text_analysis"}, "delta": {"toolUse": {"input": "{\"text\": \"hello\"}"}}} + +// 完全な assistant メッセージ +data: {"message": {"role": "assistant", "content": [{"toolUse": {"toolUseId": "tool_abc123", "name": "text_analysis", "input": {"text": "hello"}}}]}} + +// ツール結果 (toolResult ブロックを持つ user メッセージ) +data: {"message": {"role": "user", "content": [{"toolResult": {"toolUseId": "tool_abc123", "content": [{"text": "Analysis complete: 1 word"}]}}]}} + +// 最終結果 +data: {"result": {"stop_reason": "end_turn"}} + +// ライフサイクルイベント +data: {"init_event_loop": true} +data: {"start_event_loop": true} +``` + +**参考:** [Strands Streaming Documentation](https://strandsagents.com/latest/documentation/docs/user-guide/concepts/streaming/overview/) + +--- + +## 代替: 生の Converse イベントを使用する + +Strands スキーマイベントを解析する代わりに、`event` キーの下にネストされた生の Bedrock Converse イベントを解析することもできます。これにより、Converse ストリーム API 構造への低レベルアクセスが得られます。 + +**補足:** ツール結果は Converse ストリームイベントとしては発行されません — それらは次の `converse_stream` 呼び出しへの入力となります。Strands はこれを内部で処理し、ツール結果を `message` イベントとして発行します。converse パーサーはツール結果を処理しません。代わりに、`ChatInterface.tsx` は次のテキストセグメントがストリーミングを開始したときにツールを完了としてマークします。 + +### フロントエンドパーサー + +**ファイル:** `frontend/src/lib/agentcore-client/parsers/converse.ts` + +デフォルトの strands パーサーの代わりにこのパーサーを使用するには、`client.ts` を更新します: + +```typescript +import { parseConverseChunk } from "./parsers/converse"; + +const PARSERS: Record = { + "strands-single-agent": parseConverseChunk, // Converse パーサーに切り替える + ... +}; +``` + +このパーサーは生の Bedrock Converse イベントを処理します: + +```typescript +export const parseConverseChunk: ChunkParser = (line, callback) => { + if (!line.startsWith("data: ")) return; + const json = JSON.parse(line.substring(6).trim()); + + const event = json.event; + if (event) { + // テキストストリーミング + if (event.contentBlockDelta?.delta?.text) { + callback({ type: "text", content: event.contentBlockDelta.delta.text }); + } + + // ツール使用開始 + if (event.contentBlockStart?.start?.toolUse) { + const toolUse = event.contentBlockStart.start.toolUse; + callback({ type: "tool_use_start", toolUseId: toolUse.toolUseId, name: toolUse.name }); + } + + // ツール使用入力ストリーミング + if (event.contentBlockDelta?.delta?.toolUse?.input) { + callback({ type: "tool_use_delta", toolUseId: currentToolUseId, input: ... }); + } + + // メッセージ停止 + if (event.messageStop?.stopReason) { + callback({ type: "result", stopReason: event.messageStop.stopReason }); + } + } +}; +``` + +エッジケースを含む完全な実装はソースファイルを参照してください。 + +### イベント構造 + +Converse イベントは `event` キーの下にネストされます: + +```javascript +// メッセージライフサイクル +data: {"event": {"messageStart": {"role": "assistant"}}} + +// テキストストリーミング +data: {"event": {"contentBlockDelta": {"contentBlockIndex": 0, "delta": {"text": "Hello"}}}} +data: {"event": {"contentBlockDelta": {"contentBlockIndex": 0, "delta": {"text": " there"}}}} + +// ツール使用開始 +data: {"event": {"contentBlockStart": {"contentBlockIndex": 1, "start": {"toolUse": {"toolUseId": "tool_abc123", "name": "text_analysis"}}}}} + +// ツール使用入力ストリーミング +data: {"event": {"contentBlockDelta": {"contentBlockIndex": 1, "delta": {"toolUse": {"input": "{\"text\": \"hello\"}"}}}}} + +// コンテンツブロックとメッセージの完了 +data: {"event": {"contentBlockStop": {"contentBlockIndex": 0}}} +data: {"event": {"messageStop": {"stopReason": "end_turn"}}} + +// メタデータ +data: {"event": {"metadata": {"usage": {"inputTokens": 88, "outputTokens": 30}}}} +``` + +**参考:** [Bedrock Converse Stream API](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock-runtime/client/converse_stream.html) + +--- + +## LangGraph/LangChain 実装 + +**補足:** LangGraph はタプルベースのストリーミング `(message_chunk, metadata)` を使用し、コンテンツが配列となる LangChain メッセージオブジェクトを返します。 + +### バックエンド + +LangGraph エージェントを `messages` モードでストリーミングすると、生の LangChain メッセージチャンクが yield されます: + +```python +# messages モードでストリーミング - 生の LangChain メッセージチャンクを yield する +async for event in graph.astream( + {"messages": [("user", user_query)]}, + config=config, + stream_mode="messages" +): + message_chunk, metadata = event + yield message_chunk.model_dump() # JSON 安全な dict にシリアライズ +``` + +### イベント構造 + +LangGraph は LangChain メッセージオブジェクトを発行し、これらは **コンテンツブロックの配列** をコンテンツとして JSON にシリアライズされます: + +```javascript +// テキストストリーミング (AIMessageChunk) +data: {"content": [{"type": "text", "text": "Hello", "index": 0}], "type": "AIMessageChunk", ...} +data: {"content": [{"type": "text", "text": " there", "index": 0}], "type": "AIMessageChunk", ...} + +// ツール使用開始 — コンテンツブロックは id と name を持つ +data: {"content": [{"type": "tool_use", "id": "tool_abc123", "name": "text_analysis", "input": {}, "index": 1}], "type": "AIMessageChunk", ...} + +// ツール入力ストリーミング — partial_json が増分入力を運ぶ +data: {"content": [{"type": "tool_use", "partial_json": "{\"text\":", "index": 1}], "type": "AIMessageChunk", ...} +data: {"content": [{"type": "tool_use", "partial_json": " \"hello\"}", "index": 1}], "type": "AIMessageChunk", ...} + +// ツールレスポンス (ToolMessage — 別のメッセージタイプ) +data: {"content": "Tool result text", "type": "tool", "name": "text_analysis", "tool_call_id": "tool_abc123", ...} + +// 停止理由 +data: {"content": [], "type": "AIMessageChunk", "response_metadata": {"stop_reason": "end_turn"}, ...} + +// 使用量メタデータを含む最終チャンク +data: {"content": [], "type": "AIMessageChunk", "chunk_position": "last", "usage_metadata": {"input_tokens": 88, "output_tokens": 30}} +``` + +**現在のパーサーが処理するもの:** + +- `content[].type === "text"` を持つ `AIMessageChunk`: 表示用のテキストトークン +- `content[].type === "tool_use"` + `id` + `name` を持つ `AIMessageChunk`: ツール呼び出し開始 +- `content[].type === "tool_use"` + `partial_json` を持つ `AIMessageChunk`: ストリーミングツール入力 +- `type === "tool"` (ToolMessage): ツール実行結果 +- `response_metadata.stop_reason`: ストリーム完了 + +**Strands との主な違い:** LangGraph の `content` は常に型付けされたブロック (text、tool_use) の配列であり、フラットな文字列ではありません。ツール結果は user メッセージ内にネストされるのではなく、別の `ToolMessage` オブジェクトとして提供されます。 + +### フロントエンドパーサー + +**ファイル:** `frontend/src/lib/agentcore-client/parsers/langgraph.ts` + +同じパターンで、SSE 行を解析し、型付けされたイベントを発行します。LangGraph は LangChain メッセージタイプを使用します: + +```typescript +export const parseLanggraphChunk: ChunkParser = (line, callback) => { + if (!line.startsWith("data: ")) return + const json = JSON.parse(line.substring(6).trim()) + + // ツール結果: {"type": "tool", "tool_call_id": "...", "content": "result"} + if (json.type === "tool") { + callback({ type: "tool_result", toolUseId: json.tool_call_id, result: json.content }) + } + + // AIMessageChunk — コンテンツはブロックの配列 + if (json.type === "AIMessageChunk" && Array.isArray(json.content)) { + for (const block of json.content) { + if (block.type === "text" && block.text) { + callback({ type: "text", content: block.text }) + } + if (block.type === "tool_use" && block.id && block.name) { + callback({ type: "tool_use_start", toolUseId: block.id, name: block.name }) + } + } + + // レスポンスメタデータからの停止理由 + if (json.response_metadata?.stop_reason) { + callback({ type: "result", stopReason: json.response_metadata.stop_reason }) + } + } +} +``` + +ツール入力デルタストリーミングとエッジケースを含む完全な実装を参照してください。 + +**重要なポイント:** + +- アシスタントレスポンスのみを処理するために `type === 'AIMessageChunk'` でフィルタリングする +- `ToolMessage` やその他の内部メッセージタイプは無視する +- `content` は文字列ではなく **コンテンツブロックの配列** である +- 各ブロックには `type`、`text`、`index` フィールドがある +- テキストコンテンツを抽出するために `type === 'text'` でフィルタリングする +- 複数のテキストブロックがある場合は結合する + +**コンテンツが配列である理由:** +LangChain は、Anthropic/OpenAI のメッセージ形式に従って、マルチモーダルメッセージ (テキスト、画像、ツール呼び出し) をサポートするためにコンテンツブロックを使用します。 + +**参考:** + +- [LangGraph Streaming](https://docs.langchain.com/oss/python/langgraph/streaming) +- [LangChain Streaming](https://docs.langchain.com/oss/python/langchain/streaming) + +--- + +## 新しいエージェントパターンの追加 + +1. エージェントコードを含む `agent/my-pattern/` を作成する +2. パーサーを作成する: `frontend/src/lib/agentcore-client/parsers/my-pattern.ts` + - `callback()` を介して SSE 行を `StreamEvent` に変換する `ChunkParser` 関数をエクスポートする +3. `frontend/src/lib/agentcore-client/client.ts` に登録する (コンストラクタのパーサーマップに追加) +4. `infra-cdk/config.yaml` で `pattern: my-pattern` を設定する + +--- + +## デバッグ + +パーサーでコンソールロギングを有効にします: + +```javascript +console.log("[Streaming Event]", data) +``` + +ブラウザコンソール (F12) を開いて、エージェントからのすべてのイベントを確認します。 diff --git a/samples/aws-specialist-agent/docs-jp/TOOL_AC_CODE_INTERPRETER.md b/samples/aws-specialist-agent/docs-jp/TOOL_AC_CODE_INTERPRETER.md new file mode 100644 index 0000000..949d59a --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/TOOL_AC_CODE_INTERPRETER.md @@ -0,0 +1,171 @@ +# AgentCore Code Interpreter 統合 + +このドキュメントでは、Amazon Bedrock AgentCore Code Interpreter を FAST に統合するためのアーキテクチャ上の決定について説明します。 + +## AgentCore Code Interpreter とは? + +Amazon Bedrock AgentCore Code Interpreter は、AI エージェントが分離されたサンドボックス環境でコードを安全に実行できるようにするフルマネージド機能です。主な機能: + +- コンテナ化された環境での安全なコード実行 +- 複数言語のサポート (Python、JavaScript、TypeScript) +- 一般的なライブラリを含む事前構築済みランタイム +- 状態の永続化を伴うセッション管理 +- 長い実行時間 (デフォルト 15 分、最大 8 時間) + +**ドキュメント**: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-tool.html + +## なぜ Gateway ではなく直接統合なのか? + +FAST は Code Interpreter を Gateway 経由ではなく **エージェントに直接統合** しています。理由は以下の通りです: + +### アプローチ 1: 直接統合 ✅ (採用) + +**アーキテクチャ**: `Agent → Code Interpreter SDK → Code Interpreter Service` + +**長所**: + +- **シンプルな実装** - 最小限のコード、追加のインフラ不要 +- **低レイテンシ** - Gateway/Lambda のホップなし +- **低コスト** - Lambda 呼び出しなし +- **セッション管理** - Code Interpreter が呼び出し間で状態を維持 +- **AWS のパターンに準拠** - 公式ドキュメントの例と一致 +- **より良いエラー処理** - Code Interpreter のエラーへの直接アクセス + +**短所**: + +- Gateway 経由で発見できない +- 更新にはエージェントの再デプロイが必要 +- ツールロジックがエージェントコード内に存在する + +### アプローチ 2: Gateway 統合 ❌ (不採用) + +**アーキテクチャ**: `Agent → Gateway → Lambda → Code Interpreter SDK → Code Interpreter Service` + +**長所**: + +- Gateway パターンとの一貫性 +- MCP 経由で発見可能 +- 独立したデプロイ + +**短所**: + +- **より複雑** - Lambda ラッパー + Gateway ターゲット + IAM ロール +- **より高いレイテンシ** - リクエストパスでの追加のホップ +- **より高いコスト** - Lambda 呼び出し + Code Interpreter 使用料 +- **セッションの複雑さ** - Lambda がコールドスタートをまたいでセッションを管理する必要がある +- **AWS 参照なし** - このパターンの公式な例がない +- **意図された使用例ではない** - Code Interpreter は組み込みサービスであり、カスタムツールではない + +### 決定の根拠 + +Code Interpreter は **組み込みの AgentCore サービス** であり、Bedrock モデルや AgentCore Memory に類似しています。AWS は Gateway 経由でプロキシするのではなく、直接統合のために設計しました。Gateway は組み込みサービスではなく、**カスタム Lambda ベースのツール** を対象としています。 + +**比較**: + +| Aspect | Direct | Gateway | +| ------------ | --------------------- | -------------- | +| 複雑さ | 低 | 高 | +| レイテンシ | ~100ms | ~300-500ms | +| コスト | CI のみ | Lambda + CI | +| AWS パターン | ✅ ドキュメント化済み | ❌ 例なし | +| 使用例 | 組み込みサービス | カスタムツール | + +## 実装アーキテクチャ + +エージェントは、自前のラッパーではなく公式の Strands Code Interpreter ツール +(`strands_tools.code_interpreter.AgentCoreCodeInterpreter`) を直接使用します。 +統合はエージェントのエントリポイントに完結しています: + +``` +agent/strands-single-agent/ +└── basic_agent.py # AgentCoreCodeInterpreter をインポートしツールを登録 +``` + +### 主要コンポーネント + +**エージェント統合** (`agent/strands-single-agent/basic_agent.py`): + +```python +from strands_tools.code_interpreter import AgentCoreCodeInterpreter + +# サンドボックスを会話セッションに紐づけることで、同一会話内の 2 回目以降の +# 呼び出しは新規にコールドクリエイトせず、同じ AgentCore サンドボックスへ +# 再接続する (warm reconnect)。 +code_interpreter_tool = AgentCoreCodeInterpreter( + region=region, session_name=session_id +) + +# Gateway MCP クライアントと file_read と並べてツールを登録する。 +tools = [gateway_client, code_interpreter_tool.code_interpreter, file_read] +``` + +### 設計原則 + +1. **保守されているツールを使う** - 公式の `strands_tools` Code Interpreter が + AgentCore Code Interpreter API に追従するため、同期を取り続ける自前ラッパーは不要。 +2. **セッションに紐づくサンドボックス** - `session_name` に会話の `session_id` を + 設定するため、ツールのモジュールレベルキャッシュが呼び出しをまたいで同じ + サンドボックスへ再接続する (warm reconnect)。VPC コールドスタート緩和と相乗する。 +3. **直接統合** - 上の意思決定のとおり、Gateway/Lambda を挟まず Code Interpreter + サービスへ直接アクセスする。 + +## このアーキテクチャの利点 + +1. **保守コストの低減**: 自前ラッパーが無く、API 表面は公式ツールが担う。 +2. **パフォーマンス**: 直接統合 = 低レイテンシ。warm reconnect により会話内の + 繰り返しコールドスタートを避ける。 +3. **コスト**: Lambda のオーバーヘッドなし。 +4. **シンプルさ**: AWS のドキュメント化されたパターンに従う。 + +## 使い方 + +エージェントは、ユーザーがコード実行を要求したときに自動的に Code Interpreter を使用します: + +**プロンプトの例**: + +- "Calculate the factorial of 20" +- "Create a list of the first 50 Fibonacci numbers" +- "Generate 100 random numbers and calculate statistics" + +このツールは `execute_python_securely` として登録され、組み込みの Python 実行と比較してセキュリティを強調しています。 + +## セッション管理 + +- **自動**: Code Interpreter が初回使用時にセッションを作成する +- **永続化**: セッションは複数の呼び出しをまたいで状態を維持する (`clearContext=False`) +- **クリーンアップ**: AgentCore はタイムアウト後に非アクティブなセッションを自動的にクリーンアップする +- **手動クリーンアップ**: 即時のリソース解放のために `cleanup()` メソッドでオプションで実行可能 + +## テスト + +**ローカル Docker ビルド**: + +```bash +docker build -f agent/strands-single-agent/Dockerfile -t test-agent . +docker run --rm test-agent python -c "from strands_tools.code_interpreter import AgentCoreCodeInterpreter; print('✓ Import successful')" +``` + +**デプロイ**: + +```bash +cd infra-cdk +cdk deploy +``` + +**フロントエンドテスト**: 機能を検証するために、コード実行を必要とするプロンプトを使用します。 + +## 将来の拡張 + +潜在的な改善: + +- ファイル操作のための `write_files` ツールを追加 +- サンドボックスの内容を確認するための `list_files` ツールを追加 +- JavaScript/TypeScript の実行をサポート +- S3 からのファイルアップロードを追加 +- カスタムタイムアウト設定を実装 + +## 参考資料 + +- [AgentCore Code Interpreter Documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-tool.html) +- [AWS IDP Reference Implementation](https://github.com/aws-solutions-library-samples/accelerated-intelligent-document-processing-on-aws) +- [FAST Gateway Documentation](./GATEWAY.md) diff --git a/samples/aws-specialist-agent/docs-jp/VERSION_BUMP_PLAYBOOK.md b/samples/aws-specialist-agent/docs-jp/VERSION_BUMP_PLAYBOOK.md new file mode 100644 index 0000000..9a76935 --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/VERSION_BUMP_PLAYBOOK.md @@ -0,0 +1,69 @@ +# バージョンバンプ Playbook + +このドキュメントでは、FAST (Fullstack AgentCore Solution Template) のバージョンをバンプするためのチェックリストを提供します。 + +## 手動更新が必要なファイル (6 ファイル) + +1. **`VERSION`** - ルートのバージョンファイル +2. **`pyproject.toml`** - Python パッケージのバージョン (`version = "X.Y.Z"`) +3. **`frontend/package.json`** - フロントエンドパッケージのバージョン (`"version": "X.Y.Z"`) +4. **`infra-cdk/package.json`** - CDK パッケージのバージョン (`"version": "X.Y.Z"`) +5. **`infra-cdk/lib/fast-main-stack.ts`** - スタックの説明文 (`(vX.Y.Z)`) +6. **`CHANGELOG.md`** - 先頭に新しいバージョンエントリを追加 + +## 自動生成ファイル (手動で更新しない) + +- `frontend/package-lock.json` +- `infra-cdk/package-lock.json` +- `infra-cdk/lib/fast-main-stack.js` + +## 手順 + +### 1. ソースファイルを更新する + +上記の 7 ファイルを新しいバージョン番号で手動で更新します。 + +### 2. 自動生成ファイルを再生成する + +```bash +# Frontend +cd frontend && npm install + +# Infrastructure +cd infra-cdk && npm install && npm run build +``` + +### 3. 検証 + +古いバージョンへの参照が残っていないか検索します: + +```bash +find . -type f \( -name "*.md" -o -name "*.py" -o -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.json" -o -name "*.yaml" -o -name "*.yml" -o -name "VERSION" \) | grep -v node_modules | grep -v cdk.out | grep -v ".next" | grep -v "dist" | grep -v "build" | grep -v "__pycache__" | xargs grep -n "OLD_VERSION" 2>/dev/null +``` + +### 4. テスト + +```bash +make all # lint を実行 +cd infra-cdk && cdk synth # CDK の synth をテスト +cd frontend && npm run build # フロントエンドのビルドをテスト +``` + +### 5. Git 操作 + +```bash +git add . +git commit -m "Bump version to X.Y.Z" +git push origin main + +# タグを作成してプッシュ +git tag vX.Y.Z +git push origin vX.Y.Z +``` + +## 補足 + +- セマンティックバージョニング (MAJOR.MINOR.PATCH) に従う +- git タグには `v` プレフィックスを使用 (例: `v0.1.3`) +- プロジェクトのバージョンのみを更新し、依存関係のバージョンは更新しない +- 過去の changelog エントリはそのまま変更しない diff --git a/samples/aws-specialist-agent/docs-jp/index.md b/samples/aws-specialist-agent/docs-jp/index.md new file mode 100644 index 0000000..6aa810d --- /dev/null +++ b/samples/aws-specialist-agent/docs-jp/index.md @@ -0,0 +1,9 @@ + + +# Fullstack AgentCore Solution Template ドキュメント + +Fullstack AgentCore Solution Template (FAST) のドキュメントへようこそ! + +実際のドキュメントを読むには、ブラウザの左側にあるナビゲーションバーをご覧ください! + +_この index.md ファイルは、mkdocs がドキュメントページの index.html を生成するために必要なため存在しています。_ diff --git a/samples/aws-specialist-agent/docs/.nav.yml b/samples/aws-specialist-agent/docs/.nav.yml new file mode 100644 index 0000000..a7f988c --- /dev/null +++ b/samples/aws-specialist-agent/docs/.nav.yml @@ -0,0 +1,5 @@ +# This file is only used for the mkdocs documentation hosting webpage +nav: + - " ": # This an empty section header, which makes every .md file its own subsection + - index.md + - "*" \ No newline at end of file diff --git a/samples/aws-specialist-agent/docs/AGENTCORE_EVALUATIONS_GUIDE.md b/samples/aws-specialist-agent/docs/AGENTCORE_EVALUATIONS_GUIDE.md new file mode 100644 index 0000000..ded7bf0 --- /dev/null +++ b/samples/aws-specialist-agent/docs/AGENTCORE_EVALUATIONS_GUIDE.md @@ -0,0 +1,1317 @@ +# Amazon Bedrock AgentCore Evaluations Guide + +This guide covers how to use Amazon Bedrock AgentCore's evaluation capabilities to assess and monitor AI agent performance. It includes instructions for launching on-demand evaluations, configuring online (live) evaluations, understanding available metrics, downloading results, using AI-powered analysis to improve your agent, and building dashboards. + +--- + +## Table of Contents + +1. [Prerequisites](#prerequisites) +2. [SDK Installation](#sdk-installation) +3. [Online (Live) Evaluations](#online-live-evaluations) +4. [On-Demand Evaluations](#on-demand-evaluations) +5. [Built-in Evaluators Reference](#built-in-evaluators-reference) +6. [Custom Evaluators](#custom-evaluators) +7. [Evaluation Results & Format](#evaluation-results--format) +8. [Downloading & Querying Results](#downloading--querying-results) +9. [AI-Powered Analysis](#ai-powered-analysis) +10. [Retrieving Sessions, Traces & Spans (Observability)](#retrieving-sessions-traces--spans-observability) +11. [Building a Dashboard](#building-a-dashboard) +12. [Best Practices](#best-practices) +13. [References](#references) + +--- + +## Prerequisites + +- An Amazon Bedrock AgentCore runtime with a deployed agent +- AWS credentials with permissions for: + - `bedrock-agentcore:*` (control and data plane) + - `iam:CreateRole`, `iam:AttachRolePolicy`, `iam:PutRolePolicy`, `iam:GetRole`, `iam:PassRole` (scoped to `AgentCoreEvalsSDK-*` roles) + - `logs:DescribeLogGroups`, `logs:FilterLogEvents`, `logs:GetLogEvents` (for evaluation result log groups) + - `bedrock:InvokeModel` (for LLM-as-judge evaluations) +- Python 3.10+ with boto3 + +> **Region availability:** Cross-region inference profiles (e.g., `us.anthropic.claude-sonnet-4-5-20250929-v1:0`) are system-defined and use an empty account ID in the ARN. Your IAM policy must include both `arn:aws:bedrock:*:*:inference-profile/*` and `arn:aws:bedrock:*::inference-profile/*` to cover account-level and system-level profiles. Check [Bedrock supported regions](https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-regions.html) for model availability. + +### IAM Policy Example + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "bedrock-agentcore:CreateEvaluator", + "bedrock-agentcore:ListEvaluators", + "bedrock-agentcore:GetEvaluator", + "bedrock-agentcore:UpdateEvaluator", + "bedrock-agentcore:DeleteEvaluator", + "bedrock-agentcore:CreateOnlineEvaluation", + "bedrock-agentcore:ListOnlineEvaluations", + "bedrock-agentcore:GetOnlineEvaluation", + "bedrock-agentcore:UpdateOnlineEvaluation", + "bedrock-agentcore:DeleteOnlineEvaluation", + "bedrock-agentcore:Evaluate", + "bedrock-agentcore:ListEvaluationResults" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "iam:CreateRole", + "iam:AttachRolePolicy", + "iam:PutRolePolicy", + "iam:GetRole", + "iam:PassRole" + ], + "Resource": "arn:aws:iam::*:role/AgentCoreEvalsSDK-*" + }, + { + "Effect": "Allow", + "Action": [ + "logs:DescribeLogGroups", + "logs:FilterLogEvents", + "logs:GetLogEvents" + ], + "Resource": "arn:aws:logs:*:*:log-group:/aws/bedrock-agentcore/evaluations/*" + }, + { + "Effect": "Allow", + "Action": [ + "bedrock:InvokeModel" + ], + "Resource": [ + "arn:aws:bedrock:*:*:inference-profile/*", + "arn:aws:bedrock:*::inference-profile/*" + ] + } + ] +} +``` + +--- + +## SDK Installation + +Install the AgentCore starter toolkit: + +```bash +pip install bedrock-agentcore-starter-toolkit +``` + +Initialize the evaluation client: + +```python +from bedrock_agentcore_starter_toolkit import Evaluation + +eval_client = Evaluation(region="us-east-1") +``` + +--- + +## Online (Live) Evaluations + +Online evaluations continuously monitor your agent by sampling a percentage of live sessions and running evaluators automatically. Results are written to CloudWatch Logs. + +```mermaid +sequenceDiagram + participant You + participant SDK as Evaluation SDK + participant AC as AgentCore + participant CW as CloudWatch Logs + + You->>SDK: create_online_config(agent_id, evaluators, sampling_rate) + SDK->>AC: CreateOnlineEvaluationConfig + AC-->>SDK: config_id, execution_status + SDK-->>You: Config created ✓ + + loop Every sampled session + AC->>CW: Read agent runtime logs + AC->>AC: Run LLM-as-judge evaluators + AC->>CW: Write evaluation results + end + + You->>SDK: list_online_configs() + SDK->>AC: ListOnlineEvaluationConfigs + AC-->>You: configs[] +``` + +### Create an Online Evaluation Config + +Use this when you want to start continuously monitoring your agent's quality in a given environment. + +> **Note:** `auto_create_execution_role=True` is what triggers automatic IAM role creation. The SDK creates a role named `AgentCoreEvalsSDK-{region}-{hash}` with permissions to read your agent's CloudWatch logs and invoke Bedrock models for LLM-as-judge scoring. + +```python +from bedrock_agentcore_starter_toolkit import Evaluation + +eval_client = Evaluation(region="us-east-1") + +# agent_id is the last segment of your runtime ARN +# e.g., "my-agent-abc123" from "arn:aws:bedrock-agentcore:us-east-1:123456789:runtime/my-agent-abc123" +agent_id = "my-agent-abc123" # Replace with your actual agent ID + +response = eval_client.create_online_config( + agent_id=agent_id, + config_name="production_eval", + sampling_rate=10.0, # Evaluate 10% of sessions + evaluator_list=[ + "Builtin.Helpfulness", + "Builtin.Correctness", + "Builtin.GoalSuccessRate", + ], + config_description="Production evaluation with core metrics", + auto_create_execution_role=True, # Creates IAM role automatically + enable_on_create=True, # Start evaluating immediately +) + +config_id = response["onlineEvaluationConfigId"] # Save this — you'll need it to query metrics +print(f"Created config: {config_id}") +print(f"Status: {response['executionStatus']}") +``` + +> **Timing:** Config creation typically completes in 10–30 seconds. Evaluation results start appearing in CloudWatch 2–5 minutes after your agent handles its next session. + +### Enable / Disable an Online Evaluation + +Use this to temporarily pause evaluations without losing the configuration (e.g., during maintenance windows or cost control). + +```python +# Disable evaluation (pause without deleting) +eval_client.update_online_config( + config_id="your-config-id", # Replace with actual config ID + execution_status="DISABLED" +) + +# Re-enable evaluation +eval_client.update_online_config( + config_id="your-config-id", + execution_status="ENABLED" +) +``` + +### Update Sampling Rate + +Use this to adjust cost vs. coverage tradeoff without recreating the config. + +```python +eval_client.update_online_config( + config_id="your-config-id", + sampling_rate=5.0 # Reduce to 5% for cost savings +) +``` + +### List All Configs + +```python +configs = eval_client.list_online_configs() +for config in configs.get("onlineEvaluationConfigs", []): + print(f"{config['onlineEvaluationConfigName']}: {config['executionStatus']} " + f"(sampling: {config.get('samplingRate', 'N/A')}%)") +``` + +### Delete a Config + +```python +eval_client.delete_online_config(config_id="your-config-id") +``` + +--- + +## On-Demand Evaluations + +On-demand evaluations let you evaluate a specific session immediately and get results back synchronously. The SDK retrieves the session's traces from AgentCore Observability automatically. + +```mermaid +sequenceDiagram + participant You + participant SDK as Evaluation SDK + participant Obs as Observability + participant AC as AgentCore + + You->>SDK: eval_client.run(agent_id, session_id, evaluators) + SDK->>Obs: Retrieve session traces & spans + Obs-->>SDK: trace_data + SDK->>AC: Evaluate(spans, evaluator_id) + AC->>AC: Run LLM-as-judge + AC-->>SDK: score, label, explanation + SDK-->>You: Results (synchronous) +``` + +### Evaluate a Single Session + +Use this to spot-check a specific conversation, debug a user-reported issue, or validate agent behavior after a prompt change. + +> **Timing:** Each evaluator takes 5–15 seconds per session. Running 3 evaluators on one session typically completes in 15–45 seconds. + +```python +from bedrock_agentcore_starter_toolkit import Evaluation + +eval_client = Evaluation(region="us-east-1") + +agent_id = "my-agent-abc123" # Replace with your actual agent ID +session_id = "session-456" # Replace with actual session ID + +# Run one or more evaluators against a session +results = eval_client.run( + agent_id=agent_id, + session_id=session_id, + evaluators=["Builtin.Helpfulness", "Builtin.Correctness"] +) + +for result in results.results: + print(f"Evaluator: {result.evaluator_name}") + print(f" Score: {result.value:.2f}") + print(f" Label: {result.label}") + print(f" Explanation: {result.explanation}") + if hasattr(result, 'token_usage') and result.token_usage: + print(f" Tokens: {result.token_usage}") + print() +``` + +### Evaluate Using the Low-Level boto3 API + +Use this when you need fine-grained control — for example, evaluating specific spans rather than an entire session, or when you've already retrieved spans yourself. + +```python +import boto3 + +bedrock_agentcore = boto3.client("bedrock-agentcore") + +response = bedrock_agentcore.evaluate( + evaluatorId="Builtin.Helpfulness", + evaluationInput={ + "sessionSpans": [ + { + "traceId": "abc123", + "spanId": "def456", + "name": "agent_response", + "startTimeUnixNano": 1708128000000000000, + "endTimeUnixNano": 1708128001000000000, + "attributes": { + "session.id": "session-456" + }, + "status": {"code": "OK"}, + "scope": {"name": "bedrock-agentcore"} + } + ] + }, + evaluationTarget={ + "traceIds": ["abc123"], # Optional: scope to specific traces + "spanIds": ["def456"] # Optional: scope to specific spans + } +) + +for result in response.get("evaluationResults", []): + print(f"Score: {result['value']}, Label: {result['label']}") + print(f"Explanation: {result['explanation']}") +``` + +### Batch Evaluation (Multiple Sessions) + +Use this to evaluate a set of sessions after a prompt change or deployment, to compare before/after quality. + +> **Timing:** Batch evaluation is sequential — expect ~10 seconds per session per evaluator. Evaluating 10 sessions with 2 evaluators takes roughly 3–4 minutes. + +```python +agent_id = "my-agent-abc123" +session_ids = ["session-001", "session-002", "session-003"] # Replace with actual IDs +evaluators = ["Builtin.Helpfulness", "Builtin.Correctness"] + +all_results = [] +for session_id in session_ids: + try: + results = eval_client.run( + agent_id=agent_id, + session_id=session_id, + evaluators=evaluators + ) + all_results.append({ + "session_id": session_id, + "results": [ + { + "evaluator": r.evaluator_name, + "score": r.value, + "label": r.label, + "explanation": r.explanation + } + for r in results.results + ] + }) + except Exception as e: + print(f"Failed to evaluate {session_id}: {e}") + +print(f"Evaluated {len(all_results)} sessions successfully") +``` + +--- + +## Built-in Evaluators Reference + +AgentCore provides 15 built-in evaluators across three evaluation levels. + +### Evaluation Level Decision Tree + +| Your Goal | Use This Level | Why | +|---|---|---| +| Measure overall task completion | SESSION | Evaluates the entire conversation end-to-end | +| Assess individual response quality | TRACE | Evaluates each agent turn independently | +| Validate tool usage correctness | TOOL_CALL | Evaluates specific tool invocations | + +### Quality & Relevance (TRACE level) + +| Evaluator ID | What It Measures | +|---|---| +| `Builtin.Helpfulness` | How useful and valuable the response is from the user's perspective | +| `Builtin.Correctness` | Whether the information in the response is factually accurate | +| `Builtin.Faithfulness` | Whether the response stays true to the provided context without hallucination | +| `Builtin.Coherence` | Logical flow and consistency of the response | +| `Builtin.Conciseness` | Whether the response is appropriately brief without unnecessary information | +| `Builtin.InstructionFollowing` | Whether the response adheres to all explicit instructions in the user's input | +| `Builtin.ContextRelevance` | How relevant the retrieved context is to the user's query | +| `Builtin.ResponseRelevance` | How well the response addresses the specific question or request | + +### Safety (TRACE level) + +| Evaluator ID | What It Measures | +|---|---| +| `Builtin.Harmfulness` | Detects potentially harmful or unsafe content in responses | +| `Builtin.Maliciousness` | Identifies malicious intent or attempts to manipulate users | +| `Builtin.Stereotyping` | Detects stereotypical or biased language in responses | +| `Builtin.Refusal` | Tracks when the agent appropriately refuses inappropriate requests | + +### Tool Usage (TOOL_CALL level) + +| Evaluator ID | What It Measures | +|---|---| +| `Builtin.ToolSelectionAccuracy` | Whether the agent selected the correct tools for the task | +| `Builtin.ToolParameterAccuracy` | Whether the agent used tools with correct parameters | + +### Session-Level + +| Evaluator ID | What It Measures | +|---|---| +| `Builtin.GoalSuccessRate` | Whether the agent successfully completed all user goals in the conversation | + +### Evaluator Selection Guide + +Use this matrix to decide which evaluators to enable based on your use case: + +| Use Case | Recommended Evaluators | +|---|---| +| General-purpose chatbot | `Helpfulness`, `Correctness`, `GoalSuccessRate` | +| RAG / knowledge retrieval | `Faithfulness`, `ContextRelevance`, `Correctness` | +| Tool-using agent | `ToolSelectionAccuracy`, `ToolParameterAccuracy`, `GoalSuccessRate` | +| Safety-critical application | `Harmfulness`, `Maliciousness`, `Stereotyping`, `Refusal` | +| Instruction-following tasks | `InstructionFollowing`, `Coherence`, `Conciseness` | + +### Listing Available Evaluators Programmatically + +```python +evaluators = eval_client.list_evaluators() +for evaluator in evaluators.get("evaluatorSummaries", []): + print(f"{evaluator['evaluatorId']}: {evaluator.get('evaluatorName', '')}") +``` + +--- + +## Custom Evaluators + +Use custom evaluators when built-in ones don't cover your domain-specific quality criteria (e.g., financial accuracy, medical safety, brand voice compliance). + +### Placeholder Reference + +Each evaluation level supports a fixed set of placeholders (single braces) that get replaced with actual trace data: + +| Level | Placeholder | Description | +|---|---|---| +| SESSION | `{context}` | User prompts, assistant responses, and tool calls across all turns | +| SESSION | `{available_tools}` | Available tool calls including ID, parameters, and description | +| TRACE | `{context}` | Previous turns + current turn's user prompt and tool calls | +| TRACE | `{assistant_turn}` | The assistant response for the current turn | +| TOOL_CALL | `{context}` | Previous turns + current turn's user prompt and prior tool calls | +| TOOL_CALL | `{tool_turn}` | The tool call under evaluation | +| TOOL_CALL | `{available_tools}` | Available tool calls including ID, parameters, and description | + +> **Important:** Use single braces `{placeholder}`, not double braces `{{placeholder}}`. The instruction must include at least one placeholder. + +### Create a Custom Evaluator (AWS SDK) + +The `create_evaluator` API uses a nested `evaluatorConfig` structure with `llmAsAJudge` containing the instructions, rating scale, and model config: + +```python +import boto3 + +control_client = boto3.client("bedrock-agentcore-control") + +response = control_client.create_evaluator( + evaluatorName="domain_accuracy", + description="Evaluates domain-specific accuracy for financial queries", + level="TRACE", + evaluatorConfig={ + "llmAsAJudge": { + "instructions": ( + "You are evaluating the domain-specific accuracy of the assistant's response " + "in financial contexts. Consider:\n" + "1. Are financial terms used correctly?\n" + "2. Are calculations accurate?\n" + "3. Are regulatory references correct?\n\n" + "Context: {context}\n" + "Candidate Response: {assistant_turn}" + ), + "ratingScale": { + "numerical": [ + { + "value": 1.0, + "label": "Very Good", + "definition": "Completely accurate, all facts and calculations correct" + }, + { + "value": 0.75, + "label": "Good", + "definition": "Mostly accurate with minor issues" + }, + { + "value": 0.5, + "label": "OK", + "definition": "Partially correct with notable errors" + }, + { + "value": 0.25, + "label": "Poor", + "definition": "Significant errors or misconceptions" + }, + { + "value": 0.0, + "label": "Very Poor", + "definition": "Completely incorrect or irrelevant" + } + ] + }, + "modelConfig": { + "bedrockEvaluatorModelConfig": { + "modelId": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "inferenceConfig": { + "maxTokens": 500, + "temperature": 1.0 + } + } + } + } + } +) + +evaluator_arn = response["evaluatorArn"] +evaluator_id = evaluator_arn.split("/")[-1] +print(f"Created custom evaluator: {evaluator_id}") +``` + +### Create a Custom Evaluator (Starter Toolkit SDK) + +```python +import json +from bedrock_agentcore_starter_toolkit import Evaluation + +eval_client = Evaluation(region="us-east-1") + +# Load config from JSON file (see config format below) +with open("custom_evaluator_config.json") as f: + evaluator_config = json.load(f) + +custom_evaluator = eval_client.create_evaluator( + name="domain_accuracy", + level="TRACE", + description="Evaluates domain-specific accuracy for financial queries", + config=evaluator_config +) +``` + +### Custom Evaluator Config JSON Format + +Save this as `custom_evaluator_config.json` for use with the Starter Toolkit SDK or AWS CLI: + +```json +{ + "llmAsAJudge": { + "modelConfig": { + "bedrockEvaluatorModelConfig": { + "modelId": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "inferenceConfig": { + "maxTokens": 500, + "temperature": 1.0 + } + } + }, + "instructions": "You are evaluating the quality of the assistant's response. Context: {context}\nCandidate Response: {assistant_turn}", + "ratingScale": { + "numerical": [ + {"value": 1.0, "label": "Very Good", "definition": "Completely accurate"}, + {"value": 0.75, "label": "Good", "definition": "Mostly accurate with minor issues"}, + {"value": 0.5, "label": "OK", "definition": "Partially correct"}, + {"value": 0.25, "label": "Poor", "definition": "Significant errors"}, + {"value": 0.0, "label": "Very Poor", "definition": "Completely incorrect"} + ] + } + } +} +``` + +### Add a Custom Evaluator to an Online Config + +After creating the evaluator, add it to your online evaluation config: + +```python +import boto3 + +control_client = boto3.client("bedrock-agentcore-control") + +# Get current evaluators +config = control_client.get_online_evaluation_config( + onlineEvaluationConfigId="your-config-id" +) +current_evaluators = [e["evaluatorId"] for e in config.get("evaluators", [])] + +# Add the custom evaluator +current_evaluators.append("domain_accuracy-XXXXXXXXXX") # Use the ID from create_evaluator + +control_client.update_online_evaluation_config( + onlineEvaluationConfigId="your-config-id", + evaluators=[{"evaluatorId": eid} for eid in current_evaluators] +) +``` + +Custom evaluators can then be used in both online and on-demand evaluations just like built-in ones. + +> **Note:** The service automatically appends a standardization prompt to your instructions that enforces `reason` and `score` output fields. Do not include output formatting instructions in your evaluator instructions. + +--- + +## Evaluation Results & Format + +### Online Evaluation Results (CloudWatch Logs) + +Online evaluation results are written to CloudWatch Logs at: + +``` +/aws/bedrock-agentcore/evaluations/results/{config-id} +``` + +> **Note:** The log group name uses the config ID (e.g., `a1b2c3d4-...`), not the config name. You can find the config ID from `create_online_config()` response or `list_online_configs()`. + +Each log event contains a JSON object with OpenTelemetry-style attributes: + +```json +{ + "attributes": { + "gen_ai.evaluation.name": "Builtin.Helpfulness", + "gen_ai.evaluation.score.value": 0.83, + "gen_ai.evaluation.score.label": "Very Helpful", + "gen_ai.evaluation.explanation": "The response directly addresses the user's question with relevant and actionable information..." + }, + "traceId": "abc123def456", // pragma: allowlist secret (example placeholder, not a real secret) + "spanId": "789ghi", + "sessionId": "session-456", + "timestamp": "2026-02-17T00:42:42.086Z" +} +``` + +### Key Fields + +| Field | Description | +|---|---| +| `attributes.gen_ai.evaluation.name` | Evaluator ID (e.g., `Builtin.Helpfulness`) | +| `attributes.gen_ai.evaluation.score.value` | Numeric score from 0.0 to 1.0 | +| `attributes.gen_ai.evaluation.score.label` | Human-readable label (e.g., "Very Helpful") | +| `attributes.gen_ai.evaluation.explanation` | Detailed reasoning for the score | +| `traceId` | The trace that was evaluated | +| `spanId` | The specific span that was evaluated | +| `sessionId` | The agent session ID | + +### On-Demand Evaluation Results + +On-demand results are returned synchronously in the API response: + +```json +{ + "evaluatorId": "Builtin.Helpfulness", + "evaluatorName": "Builtin.Helpfulness", + "value": 0.83, + "label": "Very Helpful", + "explanation": "The response directly addresses...", + "tokenUsage": { + "inputTokens": 958, + "outputTokens": 211, + "totalTokens": 1169 + } +} +``` + +--- + +## Downloading & Querying Results + +### Query Results from CloudWatch (Python) + +Use this to pull evaluation results for analysis, export, or dashboard display. + +> **CloudWatch Logs quota:** `FilterLogEvents` is limited to 5 requests per second per account per region. For large result sets, add pagination delays or use CloudWatch Logs Insights for faster queries. + +```python +import boto3 +import json +from datetime import datetime, timedelta + +cloudwatch_logs = boto3.client("logs") + +config_id = "your-config-id" # Replace with actual config ID from create/list +log_group = f"/aws/bedrock-agentcore/evaluations/results/{config_id}" + +end_time = datetime.utcnow() +start_time = end_time - timedelta(days=7) + +results = [] +next_token = None + +while True: + params = { + "logGroupName": log_group, + "startTime": int(start_time.timestamp() * 1000), + "endTime": int(end_time.timestamp() * 1000), + "limit": 10000, + } + if next_token: + params["nextToken"] = next_token + + response = cloudwatch_logs.filter_log_events(**params) + + for event in response.get("events", []): + try: + log_data = json.loads(event["message"]) + results.append(log_data) + except json.JSONDecodeError: + continue + + next_token = response.get("nextToken") + if not next_token: + break + +print(f"Retrieved {len(results)} evaluation results") +``` + +### Export Results to CSV + +Use this to share results with stakeholders or import into spreadsheet tools. + +```python +import csv + +with open("evaluation_results.csv", "w", newline="") as f: + writer = csv.writer(f) + writer.writerow(["session_id", "trace_id", "evaluator", "score", "label", "explanation"]) + + for result in results: + attrs = result.get("attributes", {}) + writer.writerow([ + result.get("sessionId", ""), + result.get("traceId", ""), + attrs.get("gen_ai.evaluation.name", ""), + attrs.get("gen_ai.evaluation.score.value", ""), + attrs.get("gen_ai.evaluation.score.label", ""), + attrs.get("gen_ai.evaluation.explanation", ""), + ]) +``` + +### Compute Aggregate Metrics from Results + +Use this to build summary statistics for dashboards or reports. + +```python +from collections import defaultdict + +evaluator_metrics = defaultdict(lambda: {"count": 0, "total_score": 0.0}) + +for result in results: + attrs = result.get("attributes", {}) + evaluator = attrs.get("gen_ai.evaluation.name", "unknown") + score = attrs.get("gen_ai.evaluation.score.value", 0.0) + + evaluator_metrics[evaluator]["count"] += 1 + evaluator_metrics[evaluator]["total_score"] += score + +# Print per-evaluator averages +for evaluator, metrics in evaluator_metrics.items(): + avg = metrics["total_score"] / metrics["count"] if metrics["count"] > 0 else 0 + print(f"{evaluator}: avg={avg:.2f} ({metrics['count']} evaluations)") +``` + +### Score Distribution + +Use this to understand the shape of your score data — are most scores clustered high, or is there a long tail of low scores? + +```python +def compute_score_distribution(results): + """Compute score distribution across standard bins.""" + bins = { + "0.0-0.2": 0, + "0.2-0.4": 0, + "0.4-0.6": 0, + "0.6-0.8": 0, + "0.8-1.0": 0, + } + + for result in results: + score = result.get("attributes", {}).get("gen_ai.evaluation.score.value", 0.0) + if score < 0.2: + bins["0.0-0.2"] += 1 + elif score < 0.4: + bins["0.2-0.4"] += 1 + elif score < 0.6: + bins["0.4-0.6"] += 1 + elif score < 0.8: + bins["0.6-0.8"] += 1 + else: + bins["0.8-1.0"] += 1 + + return bins + +distribution = compute_score_distribution(results) +for range_label, count in distribution.items(): + print(f" {range_label}: {count}") +``` + +--- + +## AI-Powered Analysis + +Once you have evaluation results, you can use Amazon Bedrock foundation models to automatically analyze patterns in low-scoring evaluations and generate system prompt improvements. This closes the feedback loop: + +``` +┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ +│ Evaluate │────▶│ Identify │────▶│ Improve │────▶│ Deploy & │ +│ Agent │ │ Patterns │ │ Prompt │ │ Re-evaluate│ +└─────────────┘ └─────────────┘ └─────────────┘ └──────┬──────┘ + ▲ │ + └───────────────────────────────────────────────────────────┘ + Continuous improvement loop +``` + +```mermaid +sequenceDiagram + participant You + participant CW as CloudWatch Logs + participant FM as Foundation Model (Bedrock) + + You->>CW: Query low-scoring evaluation results + CW-->>You: Evaluation logs (scores, explanations) + You->>FM: Analyze patterns in low-scoring results + FM-->>You: Patterns, summary, recommendations + You->>FM: Generate improved prompt based on patterns + FM-->>You: Improved prompt + change explanations + You->>You: Review, apply, and re-evaluate +``` + +### Pattern Analysis + +Use this after you've accumulated evaluation results and want to understand why your agent is scoring low on certain evaluators. + +> **Timing:** Pattern analysis with ~50 evaluation results typically takes 15–30 seconds depending on model and input size. + +```python +import boto3 +import json + +bedrock_runtime = boto3.client("bedrock-runtime") + +def analyze_evaluation_patterns(low_scoring_results: list[dict]) -> dict: + """ + Analyze low-scoring evaluation results to identify failure patterns. + + Args: + low_scoring_results: Evaluation result logs from CloudWatch + (filtered to scores below your threshold, e.g., <= 0.5) + + Returns: + Analysis with patterns, summary, and recommendations + """ + # Format results for the model — include evaluator name, score, and explanation + formatted = [] + for result in low_scoring_results[:50]: # Limit to avoid token overflow + attrs = result.get("attributes", {}) + formatted.append({ + "session_id": attrs.get("session.id", "unknown"), + "evaluator": attrs.get("gen_ai.evaluation.name", "unknown"), + "score": attrs.get("gen_ai.evaluation.score.value", 0.0), + "label": attrs.get("gen_ai.evaluation.score.label", ""), + "explanation": attrs.get("gen_ai.evaluation.explanation", ""), + }) + + system_prompt = """You are an expert at analyzing agent evaluation data to identify +patterns and root causes of poor performance. For each pattern you identify: +1. Describe the pattern clearly +2. Count how frequently it occurs +3. List affected session IDs +4. Provide concrete evidence from the evaluation explanations + +Return JSON: {"patterns": [...], "summary": "...", "recommendations": [...]}""" + + response = bedrock_runtime.invoke_model( + modelId="us.anthropic.claude-sonnet-4-5-20250929-v1:0", + body=json.dumps({ + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 4096, + "system": system_prompt, + "messages": [{"role": "user", "content": f""" +Analyze these {len(formatted)} low-scoring evaluations and identify common patterns: + +{json.dumps(formatted, indent=2)} + +Focus on: which evaluators score low consistently, common issues in explanations, +and actionable patterns across sessions."""}], + "temperature": 0.7, + }), + ) + + response_body = json.loads(response["body"].read()) + analysis_text = response_body["content"][0]["text"] + + # Parse JSON from response (strip markdown fences if present) + analysis_text = analysis_text.strip().strip("`").removeprefix("json").strip() + return json.loads(analysis_text) +``` + +### System Prompt Improvement + +Use this after pattern analysis to automatically generate a better system prompt that addresses the identified issues. + +> **Timing:** Prompt improvement generation typically takes 20–60 seconds, as the model produces a complete revised prompt with explanations. + +```python +def generate_prompt_improvement(current_prompt: str, analysis: dict) -> dict: + """ + Generate an improved system prompt based on analysis of failure patterns. + + Args: + current_prompt: The agent's current system prompt + analysis: Output from analyze_evaluation_patterns() + + Returns: + Dict with improvedPrompt and list of changes with reasoning + """ + system_prompt = """You are an expert at improving system prompts for AI agents. +Generate specific improvements based on identified failure patterns. +For each change, explain the reasoning and expected impact. + +Return JSON: {"improvedPrompt": "...", "changes": [{"section": "...", +"reasoning": "...", "impact": "..."}]}""" + + # Truncate pattern evidence to stay within token limits + analysis_summary = { + "summary": analysis.get("summary", ""), + "patterns": [ + { + "pattern": p["pattern"], + "frequency": p["frequency"], + "evidence": p["evidence"][:500], + } + for p in analysis.get("patterns", [])[:10] + ], + "recommendations": analysis.get("recommendations", [])[:10], + } + + response = bedrock_runtime.invoke_model( + modelId="us.anthropic.claude-sonnet-4-5-20250929-v1:0", + body=json.dumps({ + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 8192, + "system": system_prompt, + "messages": [{"role": "user", "content": f""" +Current System Prompt: +{current_prompt} + +Performance Analysis: +{json.dumps(analysis_summary, indent=2)} + +Generate an improved prompt that addresses these issues."""}], + "temperature": 0.7, + }), + ) + + response_body = json.loads(response["body"].read()) + result_text = response_body["content"][0]["text"] + result_text = result_text.strip().strip("`").removeprefix("json").strip() + return json.loads(result_text) +``` + +### End-to-End Workflow + +Putting it all together — from querying results to generating an improved prompt: + +```python +# 1. Query low-scoring evaluation results (see "Downloading & Querying Results") +results = query_evaluation_results("your-config-id", days=30) +low_scoring = [ + r for r in results + if r.get("attributes", {}).get("gen_ai.evaluation.score.value", 1.0) <= 0.5 +] +print(f"Found {len(low_scoring)} low-scoring evaluations") + +# 2. Analyze patterns (~15-30 seconds) +analysis = analyze_evaluation_patterns(low_scoring) +print(f"Identified {len(analysis['patterns'])} patterns") +for pattern in analysis["patterns"]: + print(f" - {pattern['pattern']} (frequency: {pattern['frequency']})") + +# 3. Generate prompt improvement (~20-60 seconds) +current_prompt = "You are a helpful assistant..." # your agent's current prompt +improvement = generate_prompt_improvement(current_prompt, analysis) +print(f"\nSuggested {len(improvement['changes'])} changes:") +for change in improvement["changes"]: + print(f" Section: {change['section']}") + print(f" Reasoning: {change['reasoning']}") + print(f" Impact: {change['impact']}\n") + +# 4. Review and apply the improved prompt +print("Improved prompt:") +print(improvement["improvedPrompt"]) +``` + +--- + +## Retrieving Sessions, Traces & Spans (Observability) + +The `bedrock-agentcore-starter-toolkit` includes an Observability client that retrieves session data (traces and spans) from AgentCore. This is useful for building session explorers, trace viewers, and feeding data into evaluations. + +### Session / Trace / Span Hierarchy + +``` +Session (conversation) +├── Trace 1 (user turn) +│ ├── Span: agent_planning (root) +│ ├── Span: tool_call → search_api +│ ├── Span: tool_result ← search_api +│ └── Span: agent_response +├── Trace 2 (user turn) +│ ├── Span: agent_planning (root) +│ └── Span: agent_response +└── Trace 3 (user turn) + ├── Span: agent_planning (root) + ├── Span: tool_call → database_query + ├── Span: tool_result ← database_query + └── Span: agent_response +``` + +### Initialize the Observability Client + +```python +from bedrock_agentcore_starter_toolkit import Observability + +agent_id = "my-agent-abc123" # Replace with your actual agent ID +obs_client = Observability(agent_id=agent_id, region="us-east-1") +``` + +### List Traces and Spans for a Session + +Use this to inspect what happened during a specific conversation — which tools were called, how long each step took, and whether any errors occurred. + +```python +trace_data = obs_client.list(session_id="session-456") # Replace with actual session ID + +# trace_data.traces → dict: {trace_id: [list of spans]} +# trace_data.spans → flat list of all spans across all traces +# trace_data.start_time → session start time in nanoseconds + +print(f"Traces: {len(trace_data.traces)}") +print(f"Total spans: {len(trace_data.spans)}") + +for trace_id, spans in trace_data.traces.items(): + print(f"\nTrace {trace_id}: {len(spans)} spans") + for span in sorted(spans, key=lambda s: s.start_time_unix_nano or 0): + print(f" {span.span_name} ({span.duration_ms}ms) " + f"parent={span.parent_span_id or 'root'}") +``` + +### Span Properties + +Each span object returned by the SDK has these key properties: + +| Property | Type | Description | +|---|---|---| +| `span_id` | `str` | Unique span identifier | +| `trace_id` | `str` | Parent trace identifier | +| `parent_span_id` | `str \| None` | Parent span ID (`None` for root spans) | +| `span_name` | `str` | Name of the operation (e.g., `"agent_response"`, `"tool_call"`) | +| `start_time_unix_nano` | `int` | Start time in nanoseconds since epoch | +| `end_time_unix_nano` | `int` | End time in nanoseconds since epoch | +| `duration_ms` | `float` | Duration in milliseconds | +| `status_code` | `str` | Status (`"OK"`, `"ERROR"`, `"UNSET"`) | +| `attributes` | `dict` | OpenTelemetry attributes (model ID, token counts, etc.) | + +### Formatting Trace Data for Display + +Use this helper to convert SDK trace data into a JSON-serializable structure suitable for API responses or UI rendering. + +```python +from datetime import datetime + +def format_session_for_display(trace_data) -> dict: + """Format SDK trace data into a JSON-serializable structure.""" + formatted_traces = [] + + for trace_id, spans in trace_data.traces.items(): + if not spans: + continue + + spans.sort(key=lambda s: s.start_time_unix_nano or 0) + + trace_start = min(s.start_time_unix_nano for s in spans if s.start_time_unix_nano) + trace_end = max(s.end_time_unix_nano for s in spans if s.end_time_unix_nano) + + formatted_traces.append({ + "traceId": trace_id, + "startTime": datetime.fromtimestamp(trace_start / 1e9).isoformat(), + "endTime": datetime.fromtimestamp(trace_end / 1e9).isoformat(), + "durationMs": (trace_end - trace_start) / 1e6, + "spans": [ + { + "spanId": s.span_id, + "traceId": s.trace_id, + "parentSpanId": s.parent_span_id, + "name": s.span_name, + "startTime": datetime.fromtimestamp(s.start_time_unix_nano / 1e9).isoformat(), + "endTime": datetime.fromtimestamp(s.end_time_unix_nano / 1e9).isoformat(), + "durationMs": s.duration_ms, + "status": s.status_code or "UNSET", + "attributes": s.attributes or {}, + } + for s in spans + ], + }) + + formatted_traces.sort(key=lambda t: t["startTime"]) + return { + "traceCount": len(formatted_traces), + "spanCount": len(trace_data.spans), + "traces": formatted_traces, + } +``` + +--- + +## Building a Dashboard + +With evaluation results and observability data, you can build a dashboard to monitor agent performance. Here's a high-level overview of the key components and data flow. + +### Architecture Overview + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ Dashboard UI │ +│ │ +│ ┌───────────────┐ ┌──────────────┐ ┌────────────────────┐ │ +│ │ Summary Tiles │ │ Score Dist. │ │ Per-Evaluator │ │ +│ │ • Total evals │ │ Chart │ │ Metrics │ │ +│ │ • Avg score │ │ (bar chart) │ │ (color-coded) │ │ +│ │ • Low/High │ │ │ │ │ │ +│ └───────────────┘ └──────────────┘ └────────────────────┘ │ +│ │ +│ ┌──────────────────────────┐ ┌───────────────────────────┐ │ +│ │ Session Explorer │ │ On-Demand Eval Panel │ │ +│ │ • Browse sessions │ │ • Select evaluators │ │ +│ │ • Filter by score/date │ │ • Run against session │ │ +│ │ • View trace timeline │ │ • View scores/explanations│ │ +│ └──────────────────────────┘ └───────────────────────────┘ │ +│ │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ AI Analysis Panel │ │ +│ │ • Trigger pattern analysis on low-scoring results │ │ +│ │ • View identified patterns and recommendations │ │ +│ │ • Generate and review prompt improvements │ │ +│ └──────────────────────────────────────────────────────────┘ │ +└──────────────────────────────┬──────────────────────────────────┘ + │ + ▼ +┌──────────────────────────────────────────────────────────────────┐ +│ Backend API │ +│ │ +│ Evaluation SDK CloudWatch Logs Observability SDK │ +│ • list_online_configs • filter_log_events • obs.list() │ +│ • run() (on-demand) • (eval results) • (traces/spans) │ +│ • create/update/delete │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### Key Dashboard Components + +| Component | Data Source | What It Shows | +|---|---|---| +| Summary Tiles | Aggregated CloudWatch results | Total evaluations, average score, low-score count (< 0.5), high-score count (≥ 0.8) | +| Score Distribution | Aggregated CloudWatch results | Bar chart of scores across bins (0.0–0.2, 0.2–0.4, etc.) | +| Per-Evaluator Metrics | Aggregated CloudWatch results | Each evaluator's average score and count, color-coded (green ≥ 0.8, yellow ≥ 0.6, red < 0.6) | +| Session Explorer | Observability SDK | Browsable list of sessions with scores, trace counts, timestamps | +| Trace Viewer | Observability SDK | Timeline visualization of traces and spans, showing parent-child hierarchy | +| On-Demand Eval Panel | Evaluation SDK `run()` | Select evaluators, run against a session, display scores and explanations | +| AI Analysis Panel | Bedrock `invoke_model` | Pattern analysis, recommendations, prompt improvement suggestions | + +### Data Flow + +```mermaid +graph TD + A[Dashboard loads] --> B[Fetch evaluation configs] + B --> C{Configs found?} + C -->|Yes| D[Fetch metrics per config from CloudWatch] + C -->|No| E[Show setup banner] + D --> F[Aggregate across configs] + F --> G[Display summary tiles + charts + evaluator breakdown] + + H[User selects session] --> I[Fetch traces via Observability SDK] + I --> J[Display trace timeline viewer] + + K[User clicks Run Evaluation] --> L[Call eval_client.run per evaluator] + L --> M[Display scores + explanations] + + N[User triggers AI Analysis] --> O[Query low-scoring results from CloudWatch] + O --> P[Send to foundation model for pattern analysis] + P --> Q[Display patterns + recommendations] + Q --> R[Generate prompt improvement] +``` + +### Aggregating Metrics Across Configs + +If you have multiple evaluation configs (e.g., separate configs for different evaluator sets), aggregate their metrics for a unified dashboard view. + +```python +def aggregate_metrics(all_config_metrics: list[dict]) -> dict: + """Combine metrics from multiple evaluation configs.""" + total_evals = 0 + weighted_score_sum = 0.0 + combined_distribution = {} + combined_evaluators = {} + + for metrics in all_config_metrics: + count = metrics["totalEvaluations"] + if count == 0: + continue + + total_evals += count + weighted_score_sum += metrics["averageScore"] * count + + for bin_key, bin_count in metrics.get("scoreDistribution", {}).items(): + combined_distribution[bin_key] = combined_distribution.get(bin_key, 0) + bin_count + + for eval_id, eval_metrics in metrics.get("evaluatorMetrics", {}).items(): + if eval_id not in combined_evaluators: + combined_evaluators[eval_id] = {"count": 0, "totalScore": 0.0} + combined_evaluators[eval_id]["count"] += eval_metrics["count"] + combined_evaluators[eval_id]["totalScore"] += eval_metrics["totalScore"] + + # Compute averages + for eval_id in combined_evaluators: + m = combined_evaluators[eval_id] + m["averageScore"] = m["totalScore"] / m["count"] if m["count"] > 0 else 0.0 + + return { + "totalEvaluations": total_evals, + "averageScore": weighted_score_sum / total_evals if total_evals > 0 else 0.0, + "scoreDistribution": combined_distribution, + "evaluatorMetrics": combined_evaluators, + } +``` + +--- + +## Best Practices + +### Cost Optimization + +#### Sampling Rate Strategy + +| Environment | Recommended Rate | Rationale | +|---|---|---| +| Development | 100% | Full visibility during testing | +| Staging | 25–50% | Good coverage for QA | +| Production | 5–10% | Cost-effective monitoring | + +#### Evaluator Selection Strategy + +Start with a small set of core evaluators and expand as needed: + +1. **Start with 3 core evaluators**: `Helpfulness`, `Correctness`, `GoalSuccessRate` +2. **Add safety evaluators for production**: `Harmfulness`, `Maliciousness` +3. **Add quality evaluators as needed**: `Faithfulness`, `Coherence`, `InstructionFollowing` +4. **Add tool evaluators if using tools**: `ToolSelectionAccuracy`, `ToolParameterAccuracy` + +Each online evaluation config supports up to 10 evaluators. + +#### Token Usage + +- Built-in evaluators use efficient prompts (~1,000 tokens per evaluation) +- SESSION-level evaluators cost more (evaluate entire conversation) +- TRACE-level evaluators are more granular (per response) +- TOOL_CALL-level evaluators are the most targeted (per tool invocation) + +#### CloudWatch Logs Costs + +Online evaluation results are stored in CloudWatch Logs, which incurs: +- **Ingestion:** $0.50 per GB ingested +- **Storage:** $0.03 per GB per month (default retention: never expire) + +To control costs, set a retention policy on evaluation log groups: + +```python +cloudwatch_logs.put_retention_policy( + logGroupName=f"/aws/bedrock-agentcore/evaluations/results/{config_id}", + retentionInDays=90 # Keep results for 90 days +) +``` + +### Operational Tips + +#### Time Estimates for Common Operations + +| Operation | Typical Duration | +|---|---| +| Create online evaluation config | 10–30 seconds | +| First results appear in CloudWatch | 2–5 minutes after next agent session | +| On-demand evaluation (1 evaluator, 1 session) | 5–15 seconds | +| On-demand evaluation (3 evaluators, 1 session) | 15–45 seconds | +| Batch evaluation (10 sessions × 2 evaluators) | 3–4 minutes | +| AI pattern analysis (~50 results) | 15–30 seconds | +| AI prompt improvement generation | 20–60 seconds | + +#### Naming Conventions + +Use consistent naming across your codebase: + +| Concept | Python (SDK) | JSON (API responses) | +|---|---|---| +| Agent identifier | `agent_id` | `agentId` | +| Config identifier | `config_id` | `onlineEvaluationConfigId` | +| Session identifier | `session_id` | `sessionId` | +| Evaluator identifier | `evaluator_id` | `evaluatorId` | + +> **Note:** The SDK uses `snake_case` for parameters. API responses from AgentCore use `camelCase`. The examples in this guide use `snake_case` for Python variables and `camelCase` when showing JSON responses. + +#### Troubleshooting + +| Symptom | Likely Cause | Fix | +|---|---|---| +| No metrics appearing | Results take 2–5 min to appear | Wait and refresh; verify `executionStatus` is `ENABLED` | +| 403 on evaluation API calls | Missing IAM permissions | Add `bedrock-agentcore:*` to your role | +| `ResourceNotFoundException` on log group | No evaluations have run yet | Invoke your agent to generate sessions, then wait | +| Low evaluation counts vs. session count | Sampling rate too low | Increase `sampling_rate` or generate more agent traffic | +| `FilterLogEvents` throttled | CloudWatch 5 req/sec limit | Add pagination delays or use CloudWatch Logs Insights | + +--- + +## References + +- [AgentCore Evaluations Documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/evaluations.html) +- [CreateOnlineEvaluationConfig API](https://docs.aws.amazon.com/bedrock-agentcore-control/latest/APIReference/API_CreateOnlineEvaluationConfig.html) +- [Evaluate API](https://docs.aws.amazon.com/bedrock-agentcore/latest/APIReference/API_Evaluate.html) +- [AgentCore Samples Repository](https://github.com/awslabs/amazon-bedrock-agentcore-samples) +- [Fullstack Solution Template for AgentCore](https://github.com/awslabs/amazon-bedrock-agentcore-samples/tree/main/fullstack-solution-template-for-agentcore) +- [CloudWatch Logs Pricing](https://aws.amazon.com/cloudwatch/pricing/) +- [Bedrock Supported Regions](https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-regions.html) diff --git a/samples/aws-specialist-agent/docs/AGENT_CONFIGURATION.md b/samples/aws-specialist-agent/docs/AGENT_CONFIGURATION.md new file mode 100644 index 0000000..0712fec --- /dev/null +++ b/samples/aws-specialist-agent/docs/AGENT_CONFIGURATION.md @@ -0,0 +1,185 @@ +# Agent Configuration Guide + +FAST supports any agent framework that can run in a container. This guide covers how to use existing patterns, create your own, and configure agent behavior. + +--- + +## Existing Patterns + +### Strands Single Agent Pattern + +**Location**: `agent/strands-single-agent/` + +A basic conversational agent using the Strands framework with AgentCore Memory integration. + +**What This Agent Does**: + +- Multi-turn conversational chat +- Maintains conversation history with short-term memory +- **Optional long-term memory**: When `use_long_term_memory: true` is set in `config.yaml`, the agent uses a `SemanticMemoryStrategy` to extract and recall facts across sessions (keyed by Cognito user ID). See [Memory Integration Guide](MEMORY_INTEGRATION.md#enabling-long-term-memory) for details. +- Streams responses for better UX +- Authenticated via Cognito (user identity tracked in memory) + +**Key Configuration Files**: + +- **Agent Logic**: `agent/strands-single-agent/basic_agent.py` - Main agent implementation with memory integration, model configuration, and streaming logic +- **Python Dependencies**: `agent/strands-single-agent/requirements.txt` - Required Python packages (Strands, bedrock-agentcore, etc.) +- **Container Config**: `agent/strands-single-agent/Dockerfile` - Docker container definition (only used for `deployment_type: docker`) +- **Infrastructure**: `infra-cdk/lib/backend-stack.ts` - CDK configuration for memory resource and runtime deployment + +**Model Configuration** (registry-driven): + +The chat model is no longer hardcoded in `basic_agent.py`. Users pick a model in +the UI, and the selectable list is defined once in the registry: + +```typescript +// infra-cdk/lib/utils/model-registry.ts +export const SELECTABLE_MODELS: readonly SelectableModel[] = [ + { + key: "opus-4.8", + label: "Claude Opus 4.8", + id: "global.anthropic.claude-opus-4-8", + provider: "anthropic", + }, + { + key: "sonnet-5", + label: "Claude Sonnet 5", + id: "global.anthropic.claude-sonnet-5", + provider: "anthropic", + }, + { + key: "sonnet-4.6", + label: "Claude Sonnet 4.6", + id: "global.anthropic.claude-sonnet-4-6", + provider: "anthropic", + default: true, + }, + // ...add a model here (one line) and redeploy +] +``` + +The CDK derives the backend allowlist (`MODEL_MAP` / `DEFAULT_MODEL_KEY` env vars) +and the frontend picker options (`aws-exports.json`) from this single source, so +they cannot drift. To change or add a model, edit this array and redeploy; no +change to `basic_agent.py` is needed. `agent/strands-single-agent/models.py` +resolves the selected logical key to the physical model. Both providers are +live: Claude models run on bedrock-runtime (Converse) and OpenAI GPT models on +the bedrock-mantle OpenAI Responses API. The registry has no `available` flag — +every entry is selectable. + +**System Prompt** (`agent/strands-single-agent/basic_agent.py`): + +```python +system_prompt = """You are a helpful assistant. Answer questions clearly and concisely.""" +``` + +**After making changes**: See [Deployment Guide](DEPLOYMENT.md) for redeployment instructions. + +--- + +## Creating Your Own Agent Pattern + +### Step 1: Create Pattern Directory + +```bash +mkdir -p agent/my-custom-agent +cd agent/my-custom-agent +``` + +### Step 2: Implement Your Agent + +Create your agent code that: + +- Accepts HTTP requests from AgentCore Runtime +- Processes user queries +- Returns responses (streaming or non-streaming) +- Integrates with AgentCore Memory (optional) + +**Example Structure**: + +```python +from bedrock_agentcore.runtime import BedrockAgentCoreApp, RequestContext +from utils.auth import extract_user_id_from_context + +app = BedrockAgentCoreApp() + +@app.entrypoint +async def agent_handler(payload, context: RequestContext): + """Main entrypoint for the agent""" + user_query = payload.get("prompt") + session_id = payload.get("runtimeSessionId") + + # Extract user ID securely from the validated JWT token + # instead of trusting the payload body (which could be manipulated) + user_id = extract_user_id_from_context(context) + + # Your agent logic here + # ... + + yield response + +if __name__ == "__main__": + app.run() +``` + +### Step 3: Create Dockerfile (for Docker deployment only) + +If using `deployment_type: docker` in your config, create a Dockerfile: + +```dockerfile +FROM public.ecr.aws/docker/library/python:3.13-slim + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +EXPOSE 8080 + +CMD ["python", "your_agent.py"] +``` + +**For ZIP deployment**: No Dockerfile is needed. The ZIP packager automatically bundles your `agent//` directory along with `agent/utils/`, `gateway/`, and `tools/` directories, plus dependencies from `requirements.txt`. + +### Step 4: Update CDK Configuration + +In `infra-cdk/config.yaml`: + +```yaml +backend: + pattern: "my-custom-agent" # Your pattern directory name +``` + +**If your agent needs additional AWS services** (Knowledge Bases, DynamoDB, S3, etc.), modify the CDK stacks in `infra-cdk/lib/`: + +**Example**: Adding a Knowledge Base + +```typescript +// Create your knowledge base construct +const knowledgeBase = new bedrock.CfnKnowledgeBase(this, "KB", { + name: "MyKnowledgeBase", + // ... configuration +}); + +// Add to agent environment variables in backend-stack.ts +EnvironmentVariables: { + KNOWLEDGE_BASE_ID: knowledgeBase.attrKnowledgeBaseId, + // ... other vars +} +``` + +### Step 5: Deploy + +See the [Deployment Guide](DEPLOYMENT.md) for complete deployment instructions. + +## Design notes + +Decisions specific to this derivative: + +- **Selectable models, single source of truth**: the model picker is driven by a registry rather than inferring availability from arbitrary IDs. The registry declares display name, provider, inference profile or endpoint, and capability flags; the frontend and backend both read from it so the picker and the runtime stay in sync. +- **OpenAI models served via Bedrock**: GPT models are added as registry entries and called through the OpenAI Responses API endpoint that Bedrock exposes. This keeps a single authentication and observability path; there is no separate OpenAI key wiring. +- **Direct call simplification**: the OpenAI integration calls the in-region endpoint directly. The earlier cross-region peering setup was removed once the in-region endpoint became available, simplifying the network model and lowering latency. +- **No temperature flag at construction**: some reasoning-tier endpoints reject `temperature`, so the model construction path never sets it; per-model registry flags govern any parameters that vary by endpoint. +- **System prompt is sectioned**: the system prompt is split into well-named sections (Language, Skills first, AWS guidance, Tool routing) so additions land in the right place and the prompt stays maintainable across model providers. diff --git a/samples/aws-specialist-agent/docs/CEDAR_POLICY_GUIDE.md b/samples/aws-specialist-agent/docs/CEDAR_POLICY_GUIDE.md new file mode 100644 index 0000000..35a59fa --- /dev/null +++ b/samples/aws-specialist-agent/docs/CEDAR_POLICY_GUIDE.md @@ -0,0 +1,415 @@ +# Cedar Policy Guide + +This document covers how to write, manage, and extend Cedar policies for AgentCore Gateway. For the identity propagation architecture and component setup, see [Identity Propagation & Cedar Policy Guide](IDENTITY_POLICY.md). + +## Understanding Claims (Custom vs. Standard) + +Cedar policies reference JWT claims via `principal.getTag("claim_name")`. These claims come in two categories: + +### Custom Claims (Application-Defined) + +Custom claims are injected by the V3 Pre-Token Lambda via `claimsToAddOrOverride`. They are not part of the standard JWT/OIDC claim set — they are defined based on the application's access control needs. + +**Claims in this demo:** + +| Claim | Purpose | Example Value | +| ------------ | ----------------------------- | ------------------------ | +| `user_id` | Authenticated user's identity | `"yourname@company.com"` | +| `department` | User's organizational unit | `"finance"` | +| `role` | User's permission level | `"admin"` | + +**Additional custom claim examples:** + +| Claim | Use Case | Cedar Usage | +| ----------------- | ----------------------- | ---------------------------------------------------- | +| `tenant_id` | Multi-tenant isolation | `principal.getTag("tenant_id") == "example-corp"` | +| `clearance_level` | Tiered data access | `principal.getTag("clearance_level") == "top-level"` | +| `region` | Geo-restricted access | `principal.getTag("region") == "us-east-1"` | +| `runtime_env` | Runtime-level isolation | `principal.getTag("runtime_env") == "production"` | + +To add a custom claim: inject it in the Pre-Token Lambda's `claimsToAddOrOverride` dict, then reference it in Cedar via `principal.getTag("claim_name")`. No Gateway configuration change is needed — the CUSTOM_JWT authorizer maps all JWT claims to Cedar tags automatically. + +### Standard Claims (Cognito-Managed) + +Standard claims are automatically included in every token by Cognito. They cannot be overridden by the Pre-Token Lambda. + +| Claim | Description | Modifiable? | +| --------------------- | ------------------------------------------ | ----------- | +| `sub` | Subject identifier (app client ID for M2M) | No | +| `iss` | Token issuer (Cognito user pool URL) | No | +| `client_id` | The app client ID | No | +| `token_use` | Always `"access"` | No | +| `scope` | OAuth scopes granted | No | +| `exp` / `iat` / `jti` | Token timing and ID | No | + +Standard claims are also accessible via `principal.getTag()` in Cedar but are typically used for infrastructure-level checks rather than business logic. + +### What's NOT Available as a Claim + +| Data | Why Not Available | Alternative | +| --------------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| Request headers / IP | Not exposed to Cedar | N/A (not supported) | +| Runtime ARN | Not in Cedar schema | Inject `runtime_env` via Pre-Token Lambda (see [Runtime-Level Access Control](IDENTITY_POLICY.md#runtime-level-access-control)) | +| Tool input parameters | Not a claim | Use `context.input.` in Cedar | + +## Policy File Location + +`gateway/policies/` — one Cedar statement per file (AgentCore `CreatePolicy` accepts one statement per policy). The shipped set is: + +| File | Tools | Permitted departments | +| ------------------------------ | -------------------------------------------------------- | --------------------- | +| `01-sample-tool.cedar` | `sample-tool-target___text_analysis_tool` | finance, engineering | +| `02-aws-mcp-read.cedar` | AWS MCP read tools | finance, engineering | +| `03-aws-mcp-destructive.cedar` | `aws-mcp___aws___call_aws`, `aws-mcp___aws___run_script` | finance only | + +Edit a file and run `cdk deploy` to apply changes. The Custom Resource Lambda updates the policies in-place without recreating the Policy Engine. Guest (no group) matches no `permit` and is denied by deny-by-default. + +## Action Name Format + +Cedar action names follow the format: `___` (triple underscore). + +- **TargetName** comes from the `CfnGatewayTarget` name in `backend-stack.ts` (e.g., `sample-tool-target`) +- **tool_name** comes from `tool_spec.json` (e.g., `text_analysis_tool`) +- Combined: `sample-tool-target___text_analysis_tool` + +These are case-sensitive. A mismatch silently denies all requests even when the policy logic looks correct. + +## Deny-by-Default + +Cedar is deny-by-default: if no `permit` statement matches a request, it is automatically denied. An explicit `forbid` statement is not needed to block access — simply omit the department from the permit's conditions. + +For example, to deny guests, remove `"guest"` from the department list. No `forbid` statement is required. + +## Tool Discovery vs Execution + +The AgentCore Policy Engine enforces authorization at **two points** in the tool lifecycle: + +### 1. Discovery (`tools/list`) — Tool Filtering + +When the Runtime calls `tools/list` on the Gateway, the Policy Engine evaluates **every tool** against the caller's identity using `PartiallyAuthorizeActions`. Tools that the caller is not permitted to use are **removed from the response**. The agent never sees them. + +``` +Agent → Runtime → Gateway tools/list → Policy Engine (PartiallyAuthorizeActions) + ↓ + Evaluates each tool against principal's claims + ↓ + Returns ONLY permitted tools + ↓ + Agent receives filtered tool list +``` + +**Effect:** If a user with `department=guest` calls `tools/list` while Version 2 (guest denied) is active, the `text_analysis_tool` will NOT appear in the response. The agent has no knowledge the tool exists and will not attempt to call it. + +### 2. Execution (`tools/call`) — Full Context Enforcement + +When the agent calls a specific tool, the Policy Engine evaluates the request with **full context** — including the tool's input parameters (`context.input`). This is a stricter evaluation than discovery because it has access to the actual request payload. + +``` +Agent → Runtime → Gateway tools/call → Policy Engine (AuthorizeAction) + ↓ + Evaluates principal claims + context.input + ↓ + Allow → execute tool + Deny → return authorization error +``` + +**Why both?** A tool might pass discovery filtering (the user is generally allowed to use it) but fail at execution time due to input-specific conditions. For example: + +```cedar +// User can discover the refund tool (passes tools/list filtering) +// But execution is denied if amount > 1000 (fails tools/call check) +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"billing-target___process_refund", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("department") && + principal.getTag("department") == "finance" && + context.input.amount < 1000 +}; +``` + +In this example, a finance user would see `process_refund` in `tools/list` (they're in the finance department), but if they try to process a refund of $5000, the `tools/call` would be denied because `context.input.amount < 1000` fails. + +### Verifying Discovery Filtering in CloudWatch + +To confirm that denied tools are being filtered from `tools/list`: + +1. Enable tracing on both the Runtime and Gateway (see [Verifying Policy Decisions via Tracing](IDENTITY_POLICY.md#verifying-policy-decisions-via-tracing)) +2. Trigger a query from the frontend +3. In CloudWatch → `aws/spans` log group, filter for `PartiallyAuthorizeActions` +4. The span contains: + - `aws.agentcore.policy.allowed_tools`: tools returned to the agent + - `aws.agentcore.policy.denied_tools`: tools filtered out + - `aws.agentcore.gateway.policy.mode`: should show `ENFORCE` + +> **Verifying at the Runtime level:** Add a log line in the agent code to confirm which tools the agent received after Cedar policy filtering. Example for the Strands agent pattern: +> +> **Strands pattern** (`agent/strands-single-agent/basic_agent.py`) — add after `Agent()` creation: +> +> ```python +> agent = Agent( +> name="strands_agent", +> tools=[gateway_client, code_tools.execute_python_securely], +> ... +> ) +> specs = agent.tool_registry.get_all_tool_specs() +> logger.info(f"[GATEWAY] Raw tool specs: {specs}") +> return agent +> ``` +> +> **Where to find:** CloudWatch → Log groups → `/aws/bedrock-agentcore/runtimes/{runtime_name}` → log stream `otel-rt-logs`. Search for `[GATEWAY] Raw tool specs`. + +### Summary + +| Stage | API | Evaluation | What Happens on Deny | +| ------------------------ | --------------------------- | ---------------------------------------- | ------------------------------------------------- | +| Discovery (`tools/list`) | `PartiallyAuthorizeActions` | Principal claims only (no input context) | Tool is hidden — agent never sees it | +| Execution (`tools/call`) | `AuthorizeAction` | Principal claims + `context.input` | Request rejected — agent gets authorization error | + +## Adding New Tools + +When adding a new Gateway target and tool: + +1. Create the new Lambda tool and `CfnGatewayTarget` in `backend-stack.ts` +2. Add a new policy file (one statement) under `gateway/policies/` with the correct action name +3. Run `cdk deploy` + +Each `create_policy` call creates one policy containing one Cedar statement. The Custom Resource currently creates a single policy per deploy. To add multiple policies (e.g., separate permit and forbid statements), update the Custom Resource Lambda to call `create_policy()` once per statement. + +## Cedar Schema Constraints + +AgentCore Gateway validates Cedar policies against an auto-generated schema derived from the Gateway's MCP tool manifest. Policies that reference unsupported fields will fail during creation, causing CloudFormation rollback. + +**Supported in Cedar policies:** + +| Element | What Can Be Referenced | Example | +| ------------------------------------------- | ---------------------------------------------------- | -------------------------------------------------------------- | +| `principal` | Must be `AgentCore::OAuthUser` | `principal is AgentCore::OAuthUser` | +| `principal.hasTag()` / `principal.getTag()` | Any JWT claim mapped by the CUSTOM_JWT authorizer | `principal.getTag("department")` | +| `action` | Tool actions in `___` format | `AgentCore::Action::"sample-tool-target___text_analysis_tool"` | +| `resource` | The Gateway ARN | `AgentCore::Gateway::"arn:aws:..."` | +| `context.input` | Tool input parameters as defined in the MCP manifest | `context.input.query` | + +**NOT supported in Cedar policies:** + +| Element | Why | +| ------------------------------------ | ----------------------------------------------------------- | +| `context.runtime.arn` | Not in the schema — only `context.input` is available | +| Custom entity types | Cannot define entities outside the `AgentCore` namespace | +| Custom attributes on `OAuthUser` | Use `hasTag()`/`getTag()` instead of direct property access | +| Request metadata (headers, IP, etc.) | Not exposed to Cedar | + +If access control decisions depend on information not available in `context.input`, inject it as a JWT claim via the Pre-Token Lambda and access it via `principal.getTag()`. See [Runtime-Level Access Control](IDENTITY_POLICY.md#runtime-level-access-control) for an example of this pattern. + +## Cedar Policy Capabilities + +Cedar is a purpose-built policy language designed for authorization. This section documents what can be expressed in Cedar policies for AgentCore Gateway, with practical examples for each capability. + +> **Already demonstrated in this project:** +> +> - Identity-based access (`principal.getTag("department") == "finance"`) — see [Cedar Policy File](IDENTITY_POLICY.md#cedar-policy-file) Version 1 & 2 +> - Multi-value OR conditions (`department == "finance" || department == "engineering"`) — see Version 1 policy +> +> The capabilities below show **additional patterns** that can be implemented using the same infrastructure. + +### Capability 1: Input Validation (`context.input`) + +**Scenario:** Finance users can process refunds, but only up to $1000. Refunds above $1000 require a different approval workflow. + +**How it works:** `context.input` gives Cedar access to the tool's input parameters (as defined in the MCP tool manifest). Conditions can be written against these values. The tool still appears in `tools/list` for finance users (discovery only checks principal claims), but the $1000 limit is enforced at `tools/call` time when the actual input is available. + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"billing-target___process_refund", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("department") && + principal.getTag("department") == "finance" && + context.input.amount < 1000 +}; +``` + +**Result:** + +- Finance user, amount=500 → permitted +- Finance user, amount=5000 → denied (exceeds limit) +- Engineering user, amount=100 → denied (wrong department) + +**Important:** This is where [Tool Discovery vs Execution](#tool-discovery-vs-execution) matters most. The tool passes discovery filtering (finance user is generally permitted), but execution is denied when the input violates the condition. + +--- + +### Capability 2: Multi-Tool Policies (`action in [...]`) + +**Scenario:** Developers can use all read-only tools (list, get, search) but cannot use write tools (create, update, delete). + +**How it works:** Use `action in [...]` to apply one policy to multiple tools at once, instead of writing separate `permit` statements for each tool. + +```cedar +permit( + principal is AgentCore::OAuthUser, + action in [ + AgentCore::Action::"data-target___list_records", + AgentCore::Action::"data-target___get_record", + AgentCore::Action::"data-target___search_records" + ], + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("role") && + principal.getTag("role") == "developer" +}; +``` + +**Result:** + +- Developer calls `list_records` → permitted +- Developer calls `search_records` → permitted +- Developer calls `delete_record` → denied (not in the action list) + +> **Note:** Separate `permit` statements can also be written for each tool. The `action in [...]` syntax is a convenience for grouping related tools under the same conditions. + +--- + +### Capability 3: Explicit Deny (`forbid`) + +**Scenario:** All departments are allowed to use a tool, EXCEPT a specific user (e.g., a compromised account) needs to be explicitly blocked regardless of their department. + +**How it works:** `forbid` statements override `permit` statements. Cedar's conflict resolution is "forbid wins" — if both a `permit` and `forbid` match, the request is denied. + +```cedar +// Allow all departments +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"sample-tool-target___text_analysis_tool", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("department") +}; + +// But explicitly block a specific user +forbid( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"sample-tool-target___text_analysis_tool", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("user_id") && + principal.getTag("user_id") == "compromised-user@example.com" +}; +``` + +**Result:** + +- Any user with a department → permitted +- `compromised-user@example.com` → denied (forbid wins over permit) + +> **Note:** Cedar's deny-by-default means simply omitting a user/department from the `permit` +> is often sufficient to deny access. Use `forbid` when overriding a broad `permit` +> for specific cases — such as blocking a compromised user, disabling a tool during an incident, +> or implementing an emergency shutdown. + +--- + +### Capability 4: Wildcard String Matching (`like`) + +**Scenario:** Only users with an `@example.com` email domain can access internal tools. External contractors with other email domains are denied. + +**How it works:** Use `like` with `*` wildcard for pattern matching on string claim values. + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"internal-target___internal_tool", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("user_id") && + principal.getTag("user_id") like "*@example.com" +}; +``` + +**Result:** + +- `alice@example.com` → permitted +- `bob@example.com` → permitted +- `contractor@external.com` → denied (doesn't match pattern) + +> **Note:** `like` only supports `*` as a wildcard, which matches zero or more characters +> of any kind (letters, numbers, symbols, dots, etc.). It does not support regex, +> single-character wildcards, character classes, or other pattern syntax. + +--- + +### Capability 5: Environment-Based Access Control + +**Scenario:** Production tools should only be accessible from the production runtime. Staging runtimes should not be able to call production tools even if the user has the right department/role. + +**How it works:** The Pre-Token Lambda maps the Cognito `clientId` to a `runtime_env` claim (see [Runtime-Level Access Control](IDENTITY_POLICY.md#runtime-level-access-control)). Cedar checks both user identity AND runtime environment. + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"prod-target___production_tool", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("runtime_env") && + principal.getTag("runtime_env") == "production" && + principal.hasTag("department") && + principal.getTag("department") == "finance" +}; +``` + +**Result:** + +- Finance user from production runtime → permitted +- Finance user from staging runtime → denied (wrong environment) +- Engineering user from production runtime → denied (wrong department) + +--- + +### Quick Reference: Cedar Operators + +| Operator | Meaning | Example | +| -------------------- | ----------------------- | ---------------------------------------------------- | +| `==` | Equals | `principal.getTag("role") == "admin"` | +| `!=` | Not equals | `principal.getTag("department") != "restricted"` | +| `&&` | AND (both must be true) | `condition_a && condition_b` | +| `\|\|` | OR (either can be true) | `value == "a" \|\| value == "b"` | +| `<`, `>`, `<=`, `>=` | Numeric comparison | `context.input.amount < 1000` | +| `in [...]` | Action is one of a set | `action in [Action::"a", Action::"b"]` | +| `like` | Wildcard string match | `principal.getTag("email") like "*@example.com"` | +| `hasTag()` | Claim exists in token | `principal.hasTag("department")` | +| `getTag()` | Get claim value | `principal.getTag("department")` | +| `has` | Field/attribute exists | `context.input has shippingAddress` | +| `.contains()` | Set membership | `["US", "CA", "MX"].contains(context.input.country)` | + +### What Cedar CANNOT Do + +| Limitation | Workaround | +| ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Regular expressions | Use `like` with `*` wildcard for simple patterns | +| Arithmetic operations (e.g., `a + b > c`) | Pre-compute in the Pre-Token Lambda and inject as a claim | +| External data lookups (e.g., query a database) | Resolve in the Pre-Token Lambda and inject as a claim | +| Time-based rules (e.g., "only during business hours") | Inject a `time_window` claim from the Pre-Token Lambda | +| Array/list membership (e.g., "user in allowed_list") | Use `.contains()` for hardcoded lists: `["a", "b"].contains(context.input.x)`. For dynamic lists (loaded from a database), resolve in the Pre-Token Lambda and inject as a boolean claim | +| Request headers, IP address, or network context | Not exposed to Cedar — not available | + +> **Architecture Pattern:** When Cedar cannot evaluate something directly (time, +> external data, complex logic), resolve it in the Pre-Token Lambda and inject the +> result as a custom claim. Cedar then checks the pre-resolved value. This keeps +> policies simple, deterministic, and auditable. + +## Design notes + +Decisions specific to this derivative: + +- **Cedar v2 with guest denied by default**: the policy set rejects unauthenticated callers and requires an authenticated principal to invoke any tool, instead of relying on application-level filtering after the fact. +- **Per-user ABAC via Cognito groups**: department-style group membership is mapped into Cedar attributes through a pre-token Lambda, so tool access can be allowed/denied per user without rewriting policies. Closed-network deployments still work because the resolution happens server-side in Cognito. +- **Cedar policy Lambda permissions**: the Custom Resource that generates the Cedar policy needs `bedrock-agentcore:ListGatewayTargets` and `bedrock-agentcore:InvokeGateway` to enumerate and verify the target catalog. Missing either permission produces a deployment-time error rather than a runtime failure, which makes the regression easy to diagnose. diff --git a/samples/aws-specialist-agent/docs/CONTEXT_MANAGEMENT.md b/samples/aws-specialist-agent/docs/CONTEXT_MANAGEMENT.md new file mode 100644 index 0000000..a634406 --- /dev/null +++ b/samples/aws-specialist-agent/docs/CONTEXT_MANAGEMENT.md @@ -0,0 +1,618 @@ +# Context Management Guide + +Practical guide for managing LLM context windows in long-running or multi-turn agent conversations within FAST. + +As agents handle longer conversations — especially those involving many tool calls, large tool results, or iterative workflows — the conversation history can grow to exceed the model's context window. Even before overflow, large contexts degrade model performance, increase latency, and balloon costs. Context management strategies address this by proactively or reactively compressing, trimming, or summarizing conversation history. + +This guide covers the built-in options available in Strands and LangGraph, when to use each, and how to implement a fully custom solution when the built-in options don't fit your use case. + +--- + +## When Do You Need Context Management? + +You likely need context management if your agent: + +- Runs **multi-turn conversations** that accumulate many messages over time +- Performs **iterative workflows** with many sequential tool calls (e.g., code generation loops, data analysis pipelines) +- Returns **large tool results** (e.g., file contents, API responses, screenshots) +- Runs **autonomously for extended periods** without human intervention + +For simple single-turn or short multi-turn chat agents, the default behavior (no explicit context management) is usually sufficient, especially with the most powerful LLMs with large (200k+ token) context windows. + +--- + +## Strategy Comparison + +| Strategy | Information Loss | Complexity | Best For | +| ------------------------- | ----------------------------------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Sliding Window** | High — older messages are dropped entirely | Low | Simple chat bots, short conversations, user experiences which don't require referencing older messages, or applications with long term memory built-in to handle referencing older topics | +| **Summarization** | Low — key information is preserved in compressed form | Medium | Multi-turn assistants, iterative workflows, user experiences where pausing for several seconds when the context window overflows (to generate the summary) are acceptable. | +| **Proactive Compression** | Low–Medium — triggers before overflow | Medium | Long-running autonomous agents, applications using weaker LLMs which struggle to return high quality results when their context window is over 50% full. | +| **Custom Hook-Based** | Configurable — full control over what is preserved | High | Specialized long-running agents with external memory | + +--- + +## Option 1: Sliding Window (Strands) + +The simplest approach. Keeps the N most recent messages and discards older ones. Strands provides `SlidingWindowConversationManager` out of the box. + +### How It Works + +- Maintains a fixed window of messages (default: 40) +- When the window is exceeded, the oldest messages are removed +- Preserves tool use/result pairs to avoid invalid conversation state +- Optionally truncates large tool results (keeping first/last 200 characters) + +### Configuration + +```python +from strands import Agent +from strands.agent.conversation_manager import SlidingWindowConversationManager + +agent = Agent( + model=model, + tools=tools, + conversation_manager=SlidingWindowConversationManager( + window_size=40, # Max messages to keep (default: 40) + should_truncate_results=True, # Truncate large tool results (default: True) + ), +) +``` + +### Proactive Compression + +The sliding window manager also supports proactive compression, which triggers context reduction before the context window overflows rather than waiting for an error: + +```python +conversation_manager=SlidingWindowConversationManager( + window_size=40, + proactive_compression=True, # Compress at 70% context usage (default threshold) +) + +# Or with a custom threshold: +conversation_manager=SlidingWindowConversationManager( + window_size=40, + proactive_compression={"compression_threshold": 0.5}, # Compress at 50% +) +``` + +### Per-Turn Management + +For agents that perform many tool operations in loops (e.g., web browsing with frequent screenshots), enable per-turn management to proactively trim before every model call: + +```python +conversation_manager=SlidingWindowConversationManager( + window_size=40, + per_turn=True, # Apply before every model call + # per_turn=5, # Or apply every 5 model calls +) +``` + +### Applying to FAST Strands Pattern + +To add sliding window management to the `agent/strands-single-agent/basic_agent.py`, pass the `conversation_manager` parameter when constructing the `Agent`: + +```python +from strands.agent.conversation_manager import SlidingWindowConversationManager + +# In create_strands_agent(): +agent = Agent( + model=model, + system_prompt=SYSTEM_PROMPT, + tools=[gateway_client, code_tools.execute_python_securely], + conversation_manager=SlidingWindowConversationManager(window_size=40), + session_manager=session_manager, +) +``` + +### Pros and Cons + +| Pros | Cons | +| ------------------------- | ---------------------------------------------------------- | +| Zero additional LLM calls | Complete loss of older context | +| No added latency or cost | Agent "forgets" earlier conversation | +| Simple to configure | Not suitable for long-running tasks requiring full history | + +📚 **Strands Docs**: [SlidingWindowConversationManager API](https://strandsagents.com/docs/api/python/strands.agent.conversation_manager.sliding_window_conversation_manager/) + +--- + +## Option 2: Summarizing Conversation Manager (Strands) + +Summarizes older messages using an LLM call instead of discarding them entirely. This preserves key information while reducing token count. + +### How It Works + +- When context overflow occurs (or proactive threshold is reached), the oldest N% of messages are summarized +- The summary replaces the original messages as a single user message +- Recent messages are preserved verbatim +- A separate LLM call generates the summary + +### Configuration + +```python +from strands import Agent +from strands.agent.conversation_manager import SummarizingConversationManager + +agent = Agent( + model=model, + tools=tools, + conversation_manager=SummarizingConversationManager( + summary_ratio=0.3, # Summarize oldest 30% of messages (default) + preserve_recent_messages=10, # Always keep last 10 messages (default) + proactive_compression=True, # Compress at 70% context usage + ), +) +``` + +### Using a Separate Summarization Agent + +By default, the summarizing manager uses the parent agent (with its tools) to generate summaries. For more control, you can provide a dedicated summarization agent: + +```python +from strands import Agent +from strands.agent.conversation_manager import SummarizingConversationManager + +# Lightweight agent just for summarization — no tools needed +summarizer = Agent( + model="us.anthropic.claude-sonnet-4-20250514-v1:0", + system_prompt="You are a conversation summarizer. Create concise bullet-point summaries.", +) + +agent = Agent( + model=model, + tools=tools, + conversation_manager=SummarizingConversationManager( + summary_ratio=0.3, + preserve_recent_messages=10, + summarization_agent=summarizer, + proactive_compression={"compression_threshold": 0.5}, + ), +) +``` + +### Applying to FAST Strands Pattern + +```python +from strands.agent.conversation_manager import SummarizingConversationManager + +# In create_strands_agent(): +agent = Agent( + model=model, + system_prompt=SYSTEM_PROMPT, + tools=[gateway_client, code_tools.execute_python_securely], + conversation_manager=SummarizingConversationManager( + summary_ratio=0.3, + preserve_recent_messages=10, + proactive_compression=True, + ), + session_manager=session_manager, +) +``` + +### Pros and Cons + +| Pros | Cons | +| -------------------------------------------- | ----------------------------------------- | +| Preserves key information from older context | Additional LLM call adds latency and cost | +| Configurable compression ratio | Summary quality depends on the model | +| Built-in, no custom code needed | May lose nuance or specific details | + +📚 **Strands Docs**: [SummarizingConversationManager API](https://strandsagents.com/docs/api/python/strands.agent.conversation_manager.summarizing_conversation_manager/) + +--- + +## Option 3: LangGraph Middleware (Trim / Summarize) + +LangGraph provides middleware-based approaches for context management using `@before_model` decorators. + +### Trim Messages + +Remove older messages before each model call, keeping only recent ones: + +```python +from langchain.messages import RemoveMessage +from langgraph.graph.message import REMOVE_ALL_MESSAGES +from langchain.agents import create_agent, AgentState +from langchain.agents.middleware import before_model +from langgraph.runtime import Runtime +from typing import Any + + +@before_model +def trim_messages(state: AgentState, runtime: Runtime) -> dict[str, Any] | None: + """Keep only the last few messages to fit context window.""" + messages = state["messages"] + if len(messages) <= 10: + return None + + first_msg = messages[0] + recent_messages = messages[-10:] + return { + "messages": [ + RemoveMessage(id=REMOVE_ALL_MESSAGES), + first_msg, + *recent_messages, + ] + } +``` + +### Summarize Messages + +Use the built-in `SummarizationMiddleware` for automatic summarization: + +```python +from langchain.agents import create_agent +from langchain.agents.middleware import SummarizationMiddleware +from langgraph.checkpoint.memory import InMemorySaver + +agent = create_agent( + model="us.anthropic.claude-sonnet-4-20250514-v1:0", + tools=tools, + middleware=[ + SummarizationMiddleware( + model="us.anthropic.claude-sonnet-4-20250514-v1:0", + trigger=("tokens", 4000), # Trigger when token count exceeds 4000 + keep=("messages", 20), # Keep last 20 messages verbatim + ) + ], + checkpointer=InMemorySaver(), +) +``` + +### Pros and Cons + +| Pros | Cons | +| -------------------------------------------- | ------------------------------------ | +| Native LangGraph integration | Requires LangGraph-specific patterns | +| Composable with other middleware | Different API than Strands | +| `SummarizationMiddleware` handles complexity | Token counting adds minor overhead | + +📚 **LangGraph Docs**: [Short-term Memory & Summarization](https://docs.langchain.com/oss/python/langchain/short-term-memory) + +--- + +## Option 4: Custom Hook-Based Context Management (Strands) + +For advanced use cases — particularly long-running autonomous agents — the built-in managers may not provide enough control. You can implement a fully custom solution using Strands hooks. + +This approach is ideal when you need to: + +- Trigger summarization at a specific **percentage** of context window usage (not just on overflow) +- **Re-inject external memory** (e.g., a log file, knowledge base, or structured state) after compression +- Use a **raw Bedrock Converse call** for summarization (avoiding the agent loop and tool invocations) +- Emit **custom stream events** to notify the frontend about context management activity +- Implement **fallback strategies** when summarization fails + +### Architecture + +The pattern uses two components working together: + +1. **A no-op `ConversationManager`** — Disables Strands' built-in context management entirely +2. **A `HookProvider`** — Registers on `BeforeModelCallEvent` to perform proactive context management before every LLM call + +### Implementation + +#### Step 1: Create a No-Op Conversation Manager inheriting from `strands.agent.conversation_manager.ConversationManager` + +```python +from strands.agent.conversation_manager import ConversationManager + + +class NoOpConversationManager(ConversationManager): + """Disables built-in context management. + + Strands requires a ConversationManager but we handle context reduction + ourselves via a hook. Both methods are intentionally empty. + """ + + def apply_management(self, agent, **kwargs): + """No-op: context management is handled by the hook.""" + pass + + def reduce_context(self, agent, **kwargs): + """No-op: context management is handled by the hook.""" + pass +``` + +#### Step 2: Create the Context Check Hook + +```python +import logging +import os + +import boto3 +from strands.hooks import HookProvider, HookRegistry, BeforeModelCallEvent + +logger = logging.getLogger(__name__) + +# Set this to your model's context window size +CONTEXT_WINDOW_TOKENS = 200_000 # e.g., Claude Sonnet + +SUMMARIZATION_PROMPT = """You are a conversation summarizer. Provide a concise summary. + +Format Requirements: +- Create a structured summary in bullet-point format +- Do NOT respond conversationally +- Include: key decisions, tool executions and results, current state, next steps +""" + + +class ContextCheckHook(HookProvider): + """Proactively summarize conversation when context usage exceeds threshold. + + Fires on BeforeModelCallEvent. When context exceeds threshold_pct, + summarizes older messages via a direct Bedrock Converse call (no agent + loop, no tools), preserving the most recent messages verbatim. + + Args: + threshold_pct: Percentage of context window that triggers summarization. + preserve_recent: Number of most recent messages to keep verbatim. + model_id: Model ID to use for the summarization call. + """ + + def __init__( + self, + threshold_pct: float = 50.0, + preserve_recent: int = 6, + model_id: str = "us.anthropic.claude-sonnet-4-20250514-v1:0", + ): + self.threshold_pct = threshold_pct + self.preserve_recent = preserve_recent + self._model_id = model_id + self._bedrock = None + + def register_hooks(self, registry: HookRegistry, **kwargs) -> None: + """Register the before-model-call check.""" + registry.add_callback(BeforeModelCallEvent, self._check) + + def _check(self, event: BeforeModelCallEvent) -> None: + """Check context usage and trigger summarization if threshold exceeded.""" + agent = event.agent + # Walk backward to find the last assistant message with usage metadata + for msg in reversed(agent.messages): + if msg.get("role") == "assistant": + usage = msg.get("metadata", {}).get("usage", {}) + if usage: + input_tokens = usage.get("inputTokens", 0) + cache_tokens = usage.get("cacheReadInputTokens", 0) + pct = (input_tokens + cache_tokens) / CONTEXT_WINDOW_TOKENS * 100 + if pct >= self.threshold_pct: + logger.info("Context at %.1f%% — summarizing", pct) + self._summarize_and_replace(agent) + return # Only check the most recent assistant message + + def _summarize_and_replace(self, agent) -> None: + """Summarize older messages and replace them with the summary.""" + messages = agent.messages + if len(messages) <= self.preserve_recent: + return + + # Find split point — avoid breaking tool_use/tool_result pairs + split = len(messages) - self.preserve_recent + while split > 0 and self._is_tool_result(messages[split]): + split -= 1 + if split <= 0: + return + + to_summarize = messages[:split] + to_keep = messages[split:] + + # Convert to text-only format for the summarization call + converse_messages = self._to_text_only(to_summarize) + converse_messages.append({ + "role": "user", + "content": [{"text": "Please summarize this conversation."}], + }) + + # Direct Bedrock Converse call — no agent loop, no tools + if not self._bedrock: + self._bedrock = boto3.client( + "bedrock-runtime", + region_name=os.environ.get("AWS_DEFAULT_REGION", "us-east-1"), + ) + + try: + response = self._bedrock.converse( + modelId=self._model_id, + system=[{"text": SUMMARIZATION_PROMPT}], + messages=converse_messages, + inferenceConfig={"maxTokens": 4096}, + ) + summary_text = response["output"]["message"]["content"][0]["text"] + except Exception as e: + logger.error("Summarization failed: %s — falling back to truncation", e) + summary_text = "(conversation history truncated due to context limits)" + + # Replace agent messages in-place + agent.messages[:] = [ + {"role": "user", "content": [{"text": f"## Previous Conversation Summary\n\n{summary_text}"}]}, + {"role": "assistant", "content": [{"text": "Understood. I'll continue from where we left off."}]}, + ] + to_keep + + def _is_tool_result(self, msg: dict) -> bool: + """Check if a message contains a toolResult block.""" + content = msg.get("content", []) + if isinstance(content, list): + return any(isinstance(b, dict) and "toolResult" in b for b in content) + return False + + def _to_text_only(self, messages: list[dict]) -> list[dict]: + """Convert messages to text-only format (strips toolUse/toolResult blocks). + + This is necessary because Bedrock Converse API doesn't allow toolUse + blocks without corresponding tool definitions in the request. + """ + result = [] + for msg in messages: + role = msg.get("role") + if role not in ("user", "assistant"): + continue + content = msg.get("content", []) + if isinstance(content, str): + result.append({"role": role, "content": [{"text": content}]}) + continue + text_blocks = [] + for block in content: + if isinstance(block, dict): + if "text" in block: + text_blocks.append({"text": block["text"]}) + elif "toolUse" in block: + name = block["toolUse"].get("name", "unknown") + text_blocks.append({"text": f"[Called tool: {name}]"}) + elif "toolResult" in block: + tr_content = block["toolResult"].get("content", []) + snippet = next( + (c["text"][:200] for c in tr_content if isinstance(c, dict) and "text" in c), + "result received", + ) + text_blocks.append({"text": f"[Tool result: {snippet}]"}) + if text_blocks: + result.append({"role": role, "content": text_blocks}) + + # Ensure alternating user/assistant (Bedrock requirement) + cleaned = [] + for msg in result: + if cleaned and cleaned[-1]["role"] == msg["role"]: + cleaned[-1]["content"].extend(msg["content"]) + else: + cleaned.append(msg) + if cleaned and cleaned[0]["role"] == "assistant": + cleaned.insert(0, {"role": "user", "content": [{"text": "(start of conversation)"}]}) + + return cleaned +``` + +#### Step 3: Wire It Into the Agent + +```python +from strands import Agent + +agent = Agent( + model=model, + system_prompt=SYSTEM_PROMPT, + tools=tools, + hooks=[ContextCheckHook(threshold_pct=50.0, preserve_recent=6)], + conversation_manager=NoOpConversationManager(), + session_manager=session_manager, +) +``` + +### Advanced: Re-Injecting External Memory After Summarization + +For long-running agents that maintain structured state outside the conversation (e.g., a progress log, a results file, or a knowledge base), you can re-inject that state after summarization to restore critical context that may have been compressed: + +```python +def _summarize_and_replace(self, agent) -> None: + # ... (summarization logic as above) ... + + # After replacing messages, re-inject external state + self._inject_external_state(agent) + +def _inject_external_state(self, agent) -> None: + """Re-inject structured external state after context compression.""" + state_path = os.environ.get("AGENT_STATE_FILE", "") + if not state_path: + return + try: + with open(state_path) as f: + state_content = f.read() + except FileNotFoundError: + return + + agent.messages.append({ + "role": "user", + "content": [{"text": ( + "Context was compressed. Here is the current state log — " + "use it to recall what has been done and the current status:\n\n" + + state_content + )}], + }) +``` + +This pattern is particularly powerful for agents that: + +- Maintain a running log of actions taken and results observed +- Need to preserve structured data (tables, configurations) across compressions +- Operate in iterative optimization loops where history of attempts matters + +### Pros and Cons + +| Pros | Cons | +| -------------------------------------------------------------- | --------------------------------------------------- | +| Full control over trigger timing and compression behavior | More code to write and maintain | +| Can integrate external memory re-injection | Must handle Bedrock API format constraints manually | +| Proactive — fires before overflow, preserving more detail | Requires understanding of message format internals | +| Direct Bedrock call avoids agent loop / tool invocation issues | Must handle tool_use/tool_result pair splitting | + +--- + +## Design Decisions and Best Practices + +### Choosing a Threshold + +- **70%** (default for built-in proactive compression) — Good for most multi-turn chat agents. Leaves headroom for the model's response. +- **50%** — Better for long-running autonomous agents that accumulate context rapidly. Triggers earlier, preserving more detail in the summary. +- **On overflow only** (reactive) — Simplest, but risks losing information if the overflow error discards the last request. + +Overall the threshold is a metric that can be quantitatively determined if you have data to test on. For example try running with a variety of thresholds and see at what threshold hallucinations start to happen and be sure to set a threshold below that. This can also be done with A/B testing and collecting user feedback signals. + +### Preserving Tool Pairs + +When trimming or splitting messages, never break a `toolUse` block from its corresponding `toolResult`. This creates an invalid conversation state that will cause API errors. Always walk backward from your split point to find a clean boundary. + +### Text-Only Conversion for Summarization + +When making a separate Bedrock Converse call for summarization, you cannot include `toolUse` or `toolResult` blocks without also providing the corresponding tool definitions. The simplest solution is to convert these blocks to text descriptions (e.g., `[Called tool: analyze_data]`, `[Tool result: 42 records processed]`). + +### Cost Considerations + +Each summarization call is an additional LLM invocation: + +- A summarization of ~50K tokens of context using Claude Sonnet costs approximately $0.15–$0.25 +- For agents that trigger summarization frequently, consider using a smaller/cheaper model for the summarization call +- The sliding window approach has zero additional cost but loses information + +### Conversation Validity Rules (Bedrock Converse API) + +When manipulating `agent.messages` directly, ensure: + +1. Messages alternate between `user` and `assistant` roles +2. The conversation starts with a `user` message +3. Every `toolUse` block has a corresponding `toolResult` in the next user message +4. No empty content blocks + +--- + +## Quick Reference: Which Option to Choose + +| Use Case | Recommended Approach | +| --------------------------------------------- | --------------------------------------------------------- | +| Simple chatbot, short conversations | Sliding Window (Option 1) | +| Multi-turn assistant, moderate length | Summarizing Manager (Option 2) with proactive compression | +| LangGraph-based agent | LangGraph Middleware (Option 3) | +| Long-running autonomous agent (hours) | Custom Hook (Option 4) with external memory re-injection | +| Agent with large tool results (images, files) | Sliding Window with `per_turn=True` and truncation | + +--- + +## Further Reading + +- [Strands ConversationManager API](https://strandsagents.com/docs/api/python/strands.agent.conversation_manager.conversation_manager/) +- [Strands SlidingWindowConversationManager](https://strandsagents.com/docs/api/python/strands.agent.conversation_manager.sliding_window_conversation_manager/) +- [Strands SummarizingConversationManager](https://strandsagents.com/docs/api/python/strands.agent.conversation_manager.summarizing_conversation_manager/) +- [Strands Hooks API](https://strandsagents.com/docs/api/python/strands.hooks.events/) +- [LangGraph Short-term Memory](https://docs.langchain.com/oss/python/langchain/short-term-memory) +- [LangMem Summarization Guide](https://langchain-ai.github.io/langmem/guides/summarization/) +- [FAST Memory Integration Guide](./MEMORY_INTEGRATION.md) + +## Design notes + +Chat UX decisions specific to this derivative: + +- **Chat history sidebar with Lambda-backed restore**: previous conversations are listed by hitting a dedicated history API and individual sessions are restored by querying a DynamoDB index. Storing only an index in DDB (not the full messages) keeps writes cheap and avoids duplicating Memory state. +- **Slim streaming events**: streaming payloads are minimised to avoid hitting the AgentCore Runtime per-event size limit. Diagnostic data is omitted from the wire format and reconstructed client-side. +- **Sticky auto-scroll**: the chat view auto-scrolls during streaming only while the user is at the bottom, so reading earlier messages mid-stream is not interrupted. +- **Cmd+Enter to send, IME-safe**: composition events from Japanese/Chinese input methods are detected so Enter during conversion does not submit. Cmd/Ctrl+Enter is the canonical submit binding. +- **Tolerate OpenAI tool-use ID reuse**: OpenAI re-uses `toolUseId` values across rounds in the same turn while Anthropic does not. The chat UI tracks tool calls without assuming IDs are globally unique. +- **Mermaid rendering**: fenced ` ```mermaid ` blocks in agent responses are rendered to SVG client-side so architecture answers can include diagrams without extra tooling. diff --git a/samples/aws-specialist-agent/docs/DEPLOYMENT.md b/samples/aws-specialist-agent/docs/DEPLOYMENT.md new file mode 100644 index 0000000..4608e6d --- /dev/null +++ b/samples/aws-specialist-agent/docs/DEPLOYMENT.md @@ -0,0 +1,520 @@ +# Deployment Guide + +This guide walks you through deploying the Fullstack AgentCore Solution Template (FAST) to AWS. + +## Prerequisites + +Before deploying, ensure you have: + +- **Node.js 20+** installed (see [AWS guide for installing Node.js on EC2](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html)) +- **AWS CLI** configured with credentials (`aws configure`) - see [AWS CLI Configuration guide](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html) +- **AWS CDK CLI** installed: `npm install -g aws-cdk` (see [CDK Getting Started guide](https://docs.aws.amazon.com/cdk/v2/guide/getting-started.html)) +- **Python 3.11 or above+** (standard library only - no virtual environment needed for deployment) +- **Docker** - Required for all deployments. See [Install Docker Engine](https://docs.docker.com/engine/install/). Verify with `docker ps`. Alternatively, [Finch](https://github.com/runfinch/finch) can be used on Mac. See below if you have a non-ARM machine. +- An AWS account with sufficient permissions to create: + - S3 buckets + - CloudFront distributions + - Cognito User Pools + - Amplify Hosting projects + - Bedrock AgentCore resources + - IAM roles and policies + +### Deploying to a different account or region + +The committed `config.yaml` is validated for **us-east-1**. Within the same account and region you can deploy as-is — just give the stack a non-overlapping `vpc_cidr` and a real `admin_user_email`. Deploying into a **different account or region** additionally requires: + +1. **Region must be us-east-1 (for now).** AgentCore Web Search is only available in us-east-1, and the deploy intentionally fails fast elsewhere. The OpenAI (GPT) models are also reached through the in-region `bedrock-mantle` endpoint. To deploy to another region you would need to remove the Web Search target and the OpenAI models first. +2. **Pin account-correct AZs.** AgentCore Runtime VPC mode only supports specific AZ **ids** (us-east-1: `use1-az1`, `use1-az2`, `use1-az4`), and the AZ name → id mapping is account-specific. The default `availability_zones: [us-east-1b, us-east-1d]` maps to supported ids in the validation account, but may not in yours. Re-derive the right names with `aws ec2 describe-availability-zones --query "AvailabilityZones[].[ZoneName,ZoneId]" --output table` and set `backend.availability_zones` to two names that map to supported ids; otherwise subnet creation fails. +3. **Enable Bedrock model access.** The selectable models (Claude Fable 5 / Opus / Sonnet / Haiku and OpenAI GPT) must be enabled in your account. Claude Fable 5 additionally needs the account's Bedrock data retention mode set to `provider_data_share` in the calling region (see "Enabling Claude Fable 5" below). Models you do not have access to should be set `available: false` in `infra-cdk/lib/utils/model-registry.ts`. + +## Configuration + +### 1. Update Configuration File + +Edit `infra-cdk/config.yaml` to customize your deployment: + +```yaml +stack_name_base: your-project-name # Change this to your preferred stack name (max 35 chars) + +admin_user_email: null # Optional: admin@example.com (auto-creates user & emails credentials) + +backend: + pattern: strands-single-agent # Available patterns: strands-single-agent + deployment_type: docker # Available deployment types: docker (default), zip +``` + +**Important**: + +- Change `stack_name_base` to a unique name for your project to avoid conflicts +- Maximum length is 35 characters (due to AWS AgentCore runtime naming constraints) +- The committed `infra-cdk/config.yaml` ships `admin_user_email` as a placeholder (`your-email+fastprojectadmin@example.com`). **Replace it with your own real, reachable address before deploying** — the admin user's temporary password is emailed there, so a placeholder leaves you unable to sign in. +- Department/role authorization is driven by Cognito **group membership**, not the email address. Group membership is operational data that CDK does not manage, so after deploying, add the admin user to a group (e.g. `aws cognito-idp admin-add-user-to-group --user-pool-id --username --group-name finance`) — otherwise every Gateway tool call is denied as "guest". + +### Deployment Types + +FAST supports two deployment types for AgentCore Runtime. Set `deployment_type` in `infra-cdk/config.yaml`: + +| Type | Description | +| ------------------ | --------------------------------------- | +| `docker` (default) | Builds container image, pushes to ECR | +| `zip` | Packages code via Lambda, uploads to S3 | + +**Note**: Docker is required for both deployment types. The `zip` option only affects how the agent runtime is packaged. Other Lambda functions in the stack still use Docker for dependency bundling. + +**Use Docker (default) when:** + +- You need native C/C++ libraries without ARM64 wheels on PyPI +- Your deployment package exceeds 250 MB +- You need custom OS-level dependencies +- You want maximum compatibility + +**Use ZIP when:** + +- You want faster iteration during development +- Your dependencies are pure Python or have ARM64 wheels available +- You need higher session throughput + +**ZIP packaging includes**: The `agent//`, `agent/utils/`, `gateway/`, and `tools/` directories are bundled together with dependencies from `requirements.txt`. This matches the `COPY` commands in the Docker deployment's Dockerfile. + +### VPC Deployment (Private Network) + +By default, the AgentCore Runtime runs in PUBLIC network mode with internet access. To deploy the runtime into an existing VPC for private network isolation, set `network_mode: VPC` in `infra-cdk/config.yaml` and provide your VPC details. + +#### What runs inside vs outside the VPC + +When VPC mode is enabled, the **AgentCore Runtime** (your agent code) runs inside your VPC's private subnets. All network calls the agent makes are subject to VPC networking rules and reach AWS services through VPC endpoints — the agent never makes direct internet calls. + +The following components run **outside** the VPC in AWS-managed infrastructure: + +- **Gateway tool Lambdas** — The agent calls the Gateway through the `bedrock-agentcore.gateway` VPC endpoint (private networking). The Gateway then invokes Lambda functions on AWS-managed infrastructure. The agent's network call stays private; only the Lambda execution happens outside the VPC. +- **Code Interpreter** — The agent calls the Code Interpreter API through the `bedrock-agentcore` VPC endpoint. The sandbox execution happens in Bedrock's managed environment. +- **Bedrock model invocations** — Model calls go through the `bedrock-runtime` VPC endpoint to Bedrock's managed infrastructure. +- **Frontend (Amplify/CloudFront)** — Entirely separate, public-facing, and not part of the VPC deployment. + +In short: the agent's outbound network traffic stays on private AWS networking via VPC endpoints. The services it calls (Bedrock, Gateway, Code Interpreter) may execute on infrastructure outside the VPC, but the network path from the agent to those service APIs is private. + +#### Configuration + +```yaml +backend: + pattern: strands-single-agent + deployment_type: docker + network_mode: VPC + vpc: + vpc_id: vpc-0abc1234def56789a + subnet_ids: + - subnet-aaaa1111bbbb2222c + - subnet-cccc3333dddd4444e + security_group_ids: # Optional - a default SG is created if omitted + - sg-0abc1234def56789a +``` + +The `vpc_id` and `subnet_ids` fields are required. The `security_group_ids` field is optional — if omitted, the CDK construct will create a default security group for the runtime. + +#### Required VPC Endpoints + +When deploying in VPC mode, the runtime runs in private subnets without internet access. Your VPC must have the following VPC endpoints configured so the agent can reach the AWS services it depends on: + +| Endpoint | Service | Type | +| -------------------------------------------------- | -------------------------------- | --------- | +| `com.amazonaws.{region}.bedrock-runtime` | Bedrock model invocation | Interface | +| `com.amazonaws.{region}.bedrock-agentcore` | AgentCore Identity (Token Vault) | Interface | +| `com.amazonaws.{region}.bedrock-agentcore.gateway` | AgentCore Gateway (MCP tools) | Interface | +| `com.amazonaws.{region}.ssm` | SSM Parameter Store | Interface | +| `com.amazonaws.{region}.secretsmanager` | Secrets Manager | Interface | +| `com.amazonaws.{region}.logs` | CloudWatch Logs | Interface | +| `com.amazonaws.{region}.ecr.api` | ECR API (Docker deployment) | Interface | +| `com.amazonaws.{region}.ecr.dkr` | ECR Docker (Docker deployment) | Interface | +| `com.amazonaws.{region}.s3` | S3 (ZIP deployment, ECR layers) | Gateway | +| `com.amazonaws.{region}.dynamodb` | DynamoDB (feedback table) | Gateway | +| `com.amazonaws.{region}.xray` | X-Ray (OTel trace export) | Interface | +| `com.amazonaws.{region}.bedrock-mantle` | OpenAI GPT-5.x (Responses API) | Interface | + +Replace `{region}` with your deployment region (e.g. `us-east-1`). + +All interface endpoints must have private DNS enabled and must be associated with the same subnets and security groups that allow traffic from the AgentCore Runtime. + +#### Subnet Requirements + +- The CDK-managed VPC uses **fully isolated private subnets** (`PRIVATE_ISOLATED`): no `0.0.0.0/0` route at all +- Subnets are pinned to AgentCore-supported AZs (at least two) for high availability +- Subnets must have sufficient available IP addresses for the runtime ENIs + +#### No NAT Gateway (fully closed network) + +The default deployment has **no NAT Gateway** and no outbound internet access. This works because every dependency is reached through a VPC endpoint: + +- The Gateway M2M token is obtained through AgentCore Identity (the Token Vault), which runs the Cognito token exchange server-side and is reachable via the `bedrock-agentcore` VPC endpoint — the Runtime never calls the public Cognito hosted domain. +- User identity is propagated into the M2M token via `aws_client_metadata` (no extra egress). +- S3 Files (skills) mount over NFS (port 2049) to the mount-target ENI **inside the VPC**. Per the AgentCore VPC docs, the mount only needs TCP 2049 connectivity between the runtime ENIs and the mount targets (allowed by the self-referencing security group) — no dedicated VPC endpoint and no NAT. (TLS and IAM auth are handled automatically.) + +> **Note:** If you add custom tools that make outbound _public-internet_ calls (or use the Browser tool), you would need to reintroduce a NAT Gateway. AWS services can instead be reached by adding the corresponding VPC endpoint. + +#### Security Group Configuration + +The CDK stack auto-creates a security group for the AgentCore Runtime. This same security group is typically applied to your VPC endpoints. You must add a self-referencing inbound rule to allow the runtime to reach the endpoints: + +- Protocol: TCP, Port: 443, Source: the security group itself + +### OpenAI models (GPT-5.x via bedrock-mantle) + +The OpenAI models in the picker (GPT-5.4 / GPT-5.5) are served from the `bedrock-mantle` endpoint (OpenAI Responses API), available in us-east-1 since 2026-06. The CDK-managed VPC always provisions the in-region `bedrock-mantle` interface endpoint (see the endpoint table above), so no extra stacks, flags, or cross-region networking are needed — a plain `cdk deploy` covers GPT models (the former `OPENAI_MANTLE` us-east-2 peering stacks are gone). + +### Enabling Claude Fable 5 (data retention prerequisite) + +Before Claude Fable 5 can be used, the account's Bedrock data retention mode must be set to `provider_data_share` via the Data Retention API. Fable 5 declares `allowed_modes: ["provider_data_share"]` — with any other effective mode (`default` / `none`) the model is reported as unavailable and invocations fail with `ValidationException: data retention mode 'default' is not available for this model` (the agent then looks silently unresponsive in the UI; the error only shows in the Runtime logs). Setting this mode explicitly acknowledges that prompts and outputs sent to Fable 5 are shared with Anthropic and retained for up to 30 days ([data retention docs](https://docs.aws.amazon.com/bedrock/latest/userguide/data-retention.html)). + +Operational notes: + +- **Set it in the region the runtime calls Bedrock from** (us-east-1 for this stack). The check is evaluated against the account setting of the source region — the bedrock-runtime endpoint that receives the request — not the regions the `global.` inference profile routes to, so configuring other regions is unnecessary. +- There is no console UI for this; use the API. It is a one-time account-level runtime setting outside CloudFormation/CDK, so re-creating the stack keeps it, but moving to a **new account or a different source region requires setting it again** — a forgotten setting resurfaces as the silent failure above. +- The caller needs `bedrock:PutAccountDataRetention` / `bedrock:GetAccountDataRetention` (account-level, `Resource: "*"`). The effective mode resolves as project -> account -> model default; an account-level setting is sufficient here. +- Models whose `allowed_modes` include `default` (e.g. Claude Opus 4.8) keep their data inside AWS even after this change — the account mode only sets what you allow, each model's `allowed_modes` decides what actually happens. + +```bash +# Using a Bedrock API key (bearer token): +curl -X PUT https://bedrock.us-east-1.amazonaws.com/data-retention \ + -H "Authorization: Bearer $AWS_BEARER_TOKEN_BEDROCK" \ + -H "Content-Type: application/json" \ + -d '{ "mode": "provider_data_share" }' + +# Or with SigV4 credentials via boto3 (the AWS CLI does not expose these +# operations yet as of v2.31): +python3 -c " +import boto3 +c = boto3.client('bedrock', region_name='us-east-1') +print(c.put_account_data_retention(mode='provider_data_share'))" + +# Verify: +python3 -c " +import boto3 +print(boto3.client('bedrock', region_name='us-east-1').get_account_data_retention()['mode'])" +``` + +### Deploying Multiple Environments (same account/region) + +A second environment (e.g. a dev stack alongside production) needs no code changes. Create a sibling config file and select it with the `CONFIG_FILE` env var: + +```yaml +# infra-cdk/config.dev.yaml (gitignored — embeds a real admin email) +stack_name_base: FAST-dev # MUST differ: CloudFormation exports, Cognito domain etc. derive from it +admin_user_email: you@example.com +backend: + pattern: strands-single-agent + deployment_type: docker + network_mode: VPC + vpc_management: CDK + vpc_cidr: 10.30.0.0/16 # MUST not overlap other environments (prod uses 10.20.0.0/16) + use_long_term_memory: true + skills: + enabled: true + mount_path: /mnt/skills +``` + +```bash +cd infra-cdk +# Everything (VPC + skills + LTM + OpenAI models) in one shot: +CONFIG_FILE=config.dev.yaml npx cdk deploy --all --require-approval never +cd .. +python scripts/deploy-frontend.py FAST-dev # frontend reads outputs from the named stack +``` + +Rules for coexistence: + +- `stack_name_base` must be unique per environment — every named resource and CloudFormation export derives from it. +- `vpc_cidr` must not overlap any other environment, so the networks stay unambiguous to operate (and remain peerable should that ever be needed). +- A plain `cdk deploy` (no `CONFIG_FILE`) always targets production's `config.yaml` — the env var is the only switch, so there is no file to forget to revert. +- When deploying into a **different AWS account**, also set `backend.availability_zones`: AgentCore Runtime VPC mode only supports specific AZ _ids_ per region (us-east-1: use1-az1/az2/az4), and the AZ name -> id mapping is account-specific. Derive the right names with `aws ec2 describe-availability-zones`. + +## Deployment Steps + +### TL;DR version + +Here are the commands to deploy backend and frontend: + +```bash +cd infra-cdk +npm install +cdk bootstrap # Once ever +cdk deploy +cd .. +python scripts/deploy-frontend.py +``` + +### Deploy Without Local Tooling (via CodeBuild) + +If you don't have Node.js, Docker, or CDK installed locally, you can deploy entirely in the cloud using a temporary CodeBuild project. Requires only Python 3.8+ and AWS CLI: + +```bash +python scripts/deploy-with-codebuild.py +``` + +See `scripts/README.md` for details and required IAM permissions. + +### 1. Install Dependencies + +Install infrastructure dependencies: + +```bash +cd infra-cdk +npm install +``` + +**Note**: Frontend dependencies are automatically installed during deployment via Docker bundling, so no separate frontend `npm install` is required. + +### 2. Bootstrap CDK (First Time Only) + +If this is your first time using CDK in this AWS account/region: + +```bash +cdk bootstrap +``` + +### 3. Deploy backend with CDK + +Build and deploy the complete stack: + +```bash +cdk deploy +``` + +The deployment will: + +1. Create a Cognito User Pool for authentication +1. Build and push the agent container to ECR +1. Create the AgentCore runtime +1. Set up CloudFront distribution for the frontend + +**Note**: The deployment takes approximately 5-10 minutes due to container building and AgentCore setup. + +**You do not need to run the skill scripts by hand before deploying.** The vendored AWS skills under `skills/agent-toolkit-for-aws/` are committed to the repo, and `cdk` regenerates the `fast-project-guide` skill automatically at synth time (it runs `scripts/build-project-guide.py` through the skills-storage stack's bundling). `scripts/vendor-skills.py` is only needed to refresh the vendored skills from a newer upstream commit — a maintenance task, not a deployment step. `cdk deploy` is self-contained. + +### 4. Deploy frontend + +```bash +# From root directory +python scripts/deploy-frontend.py +``` + +This script automatically: + +- Generates fresh `aws-exports.json` from CDK stack outputs (see below for more information about `aws-exports.json`) +- Installs/updates npm dependencies if needed +- Builds the frontend +- Deploys to AWS Amplify Hosting + +You will see the URL for application in the script's output, which will look similar to this: + +``` +ℹ App URL: https://main.d123abc456def7.amplifyapp.com +``` + +### 5. Create a Cognito User (if necessary) + +**If you provided `admin_user_email` in config:** + +- Check your email for temporary password +- Sign in and change password on first login + +**If you didn't provide email:** + +1. Go to the [AWS Cognito Console](https://console.aws.amazon.com/cognito/) +2. Find your User Pool (named `{stack_name_base}-user-pool`) +3. Click on the User Pool +4. Go to "Users" tab +5. Click "Create user" +6. Fill in the user details: + - **Email**: Your email address + - **Temporary password**: Create a temporary password + - **Mark email as verified**: Check this box +7. Click "Create user" + +**For a demo: create role users in bulk with a script** + +`scripts/create-demo-users.py` provisions one user per role (`finance`, `engineer`, `guest`) across several "sets" (one set per demo PC) with a shared password, and assigns each user to the right Cognito group. `engineer` is mapped to the `engineering` group; `guest` is left group-less on purpose so Cedar denies it every Gateway tool. The secrets (email prefix, domain, password) live in `scripts/.env` (git-ignored), and the User Pool / Client IDs are resolved from the target stack's CloudFormation outputs, so nothing sensitive or environment-specific is hard-coded. + +```bash +cp scripts/.env.example scripts/.env # then fill in real values +uv run scripts/create-demo-users.py create # provision all users (idempotent) +uv run scripts/create-demo-users.py verify # log in as each user, check groups +uv run scripts/create-demo-users.py cleanup # delete demo users after the demo +``` + +`create` is idempotent: re-running it never creates duplicates (existing users are reported as `exists` and only their password/group are re-applied). `cleanup` never touches the `admin_user_email` account. + +### 6. Access the Application + +1. Open the Amplify Hosting URL in your browser +1. Sign in with the Cognito user you created +1. You'll be prompted to change your temporary password on first login + +## Post-Deployment + +### Updating the Application + +To update the frontend code: + +```bash +# From root directory +python scripts/deploy-frontend.py +``` + +To update the backend agent: + +**Docker deployment:** + +```bash +cd infra-cdk +cdk deploy --all +``` + +### Monitoring and Logs + +- **Frontend logs**: Check CloudFront access logs +- **Backend logs**: Check CloudWatch logs for the AgentCore runtime +- **Build logs**: Check CodeBuild project logs for container builds + +## Cleanup + +To remove all resources: + +```bash +cd infra-cdk +cdk destroy --force +``` + +**Warning**: This will delete all data including S3 buckets created during deployment and ECR images. + +## Troubleshooting + +### Common Issues + +1. **`cdk deploy` fails with Docker errors** + - Ensure Docker is installed and the daemon is running: `docker ps` + - On Mac, open Docker Desktop or start Finch: `finch vm start` + - On Linux: `sudo systemctl start docker` + +2. **"Architecture incompatible" or "exec format error" during Docker build** + - This occurs when deploying from a non-ARM machine without cross-platform build setup + - Follow the "Docker Cross-Platform Build Setup" instructions in the Prerequisites section + - Ensure you've installed QEMU emulation: `docker run --privileged --rm tonistiigi/binfmt --install all` + - Verify ARM64 support: `docker buildx ls` should show `linux/arm64` in platforms + +3. **"Agent Runtime ARN not configured"** + - Ensure the backend stack deployed successfully + - Check that SSM parameters were created correctly + +4. **Authentication errors** + - Verify you created a Cognito user + - Check that the user's email is verified + +5. **Build failures** + - Check CodeBuild logs in the AWS Console + - Ensure your agent code in `agent/` is valid + +6. **Permission errors** + - Verify your AWS credentials have sufficient permissions + - Check IAM roles created by the stack + +### Getting Help + +- Check CloudWatch logs for detailed error messages +- Review the CDK deployment output for any warnings +- Ensure all prerequisites are met + +## Security Considerations + +- The Cognito User Pool is configured with strong password policies +- All communication uses HTTPS via CloudFront +- AgentCore runtime uses JWT authentication +- IAM roles follow least-privilege principles + +For production deployments, consider: + +- Enabling MFA on Cognito users +- Setting up custom domains with your own certificates +- Configuring additional monitoring and alerting +- Implementing backup strategies for any persistent data + +## Docker Cross-Platform Build Setup (Required for non-ARM machines) + +**Important**: BedrockAgentCore Runtime only supports ARM64 architecture. If you're deploying from a non-ARM machine (x86_64/amd64), you need to enable Docker's cross-platform building capabilities. + +Check your machine architecture: + +```bash +uname -m +``` + +If the output is `x86_64` (not `aarch64` or `arm64`), run these commands: + +1. **Install QEMU for ARM64 emulation:** + + ```bash + docker run --privileged --rm tonistiigi/binfmt --install all + ``` + +2. **Enable Docker buildx and create a multi-platform builder:** + + ```bash + docker buildx create --use --name multiarch --driver docker-container + docker buildx inspect --bootstrap + ``` + +3. **Verify ARM64 support is available:** + ```bash + docker buildx ls + ``` + You should see `linux/arm64` in the platforms list. + +**Note**: This setup is only required once per machine. The CDK deployment will automatically use these capabilities to build ARM64 containers. + +## Understanding aws-exports.json + +The `aws-exports.json` file is a critical configuration file that enables the React frontend to communicate with AWS Cognito for authentication. This file is automatically generated during frontend deployment and contains the necessary configuration parameters for Cognito authentication. + +**What is aws-exports.json?** + +The `aws-exports.json` file contains authentication configuration that the React application reads to properly configure Cognito Authentication. It's created automatically by the deployment script and placed in `frontend/public/aws-exports.json`. + +**Why is it necessary?** + +This configuration file is essential because: + +- It provides the React application with the correct Cognito User Pool and Client IDs +- It specifies the authentication endpoints and redirect URIs +- It configures the authentication flow parameters +- Without this file, Cognito authentication will not work + +**How is it created?** + +The file is automatically generated by `deploy-frontend.py` which: + +1. Extracts configuration from your deployed CDK stack outputs +2. Automatically detects the AWS region from the CloudFormation stack ARN +3. Retrieves the required values: `CognitoClientId`, `CognitoUserPoolId`, and `AmplifyUrl` +4. Generates the configuration file with the following structure: + +```json +{ + "authority": "https://cognito-idp.region.amazonaws.com/user-pool-id", + "client_id": "your-client-id", + "redirect_uri": "https://your-amplify-url", + "post_logout_redirect_uri": "https://your-amplify-url", + "response_type": "code", + "scope": "email openid profile", + "automaticSilentRenew": true +} +``` + +**Important**: You should not manually edit this file as it's regenerated on each deployment. If authentication isn't working, redeploy the frontend to ensure you have the latest configuration. + +## Design notes + +Selected design decisions specific to this derivative (rationale beyond the upstream baseline): + +- **Fully closed network (no NAT)**: outbound traffic to AWS APIs goes through interface VPC endpoints exclusively. A NAT gateway is intentionally not provisioned, eliminating the recurring NAT cost and limiting egress to the explicitly configured endpoint set. +- **AgentCore Gateway VPC endpoint is mandatory**: when the runtime calls Gateway from inside the VPC, the `bedrock-agentcore` interface endpoint must be present, or tool invocations fail at network level. +- **Endpoint set is curated**: each interface endpoint is justified by an actual code path that calls it from the VPC. Unused endpoints (e.g. `bedrock-agent-runtime` once direct Bedrock Agent calls were removed) are pruned to reduce cost and attack surface. +- **VPC CIDR and AZ are parameterized**: `config.yaml` exposes `vpc_cidr` and the AZ list so multiple environments can coexist in one account without overlap, and so AZ selection can avoid AZs that lack required service support. +- **Cold-start mitigation**: the AgentCore Runtime is configured with a long-running container lifecycle and a frontend pre-warm ping. This keeps first-token latency low without a separately scheduled warmer Lambda. diff --git a/samples/aws-specialist-agent/docs/GATEWAY.md b/samples/aws-specialist-agent/docs/GATEWAY.md new file mode 100644 index 0000000..da71844 --- /dev/null +++ b/samples/aws-specialist-agent/docs/GATEWAY.md @@ -0,0 +1,485 @@ +# AgentCore Gateway Implementation + +This document describes how FAST implements AgentCore Gateway with Lambda targets to provide a scalable, production-ready tool execution architecture. + +## Overview + +FAST uses **AgentCore Gateway with Lambda Targets** to enable agents to access external tools and services. This architecture provides a clean separation between agent logic and tool implementation, allowing for independent scaling and deployment of individual tools. + +### What the agent can reach + +The deployed agent has three sources of capability: + +1. **Lambda target (`sample-tool-target`)** — the demo `text_analysis_tool`, described in detail below. +2. **AWS MCP Server target (`aws-mcp`)** — the managed Agent Toolkit for AWS MCP Server at `https://aws-mcp..api.aws/mcp`, registered as an MCP gateway target. It exposes `aws___*` tools (AWS knowledge plus `aws___call_aws` / `aws___run_script`). The Gateway signs requests with SigV4 scoped to the service name `aws-mcp`. +3. **Skills via S3 Files** — vendored AWS skills are synced to S3, mounted into the Runtime at `/mnt/skills` through S3 Files, and surfaced to the agent by the Strands `AgentSkills` plugin (not a Gateway target). See `infra-cdk/lib/skills-storage-stack.ts`. + +**Per-user tool access:** the Gateway's Cedar policy gates _who_ can call each tool by the user's `department` claim (resolved from `cognito:groups`; see [Identity Propagation](IDENTITY_POLICY.md)). Read tools are allowed for finance + engineering; the destructive `aws___call_aws` / `aws___run_script` tools are restricted to finance; guest is denied. Denied tools are hidden at `tools/list`. + +## Architecture Comparison + +### Standalone MCP Gateway vs Lambda Targets + +There are two primary approaches to implementing AgentCore Gateway: + +#### Standalone MCP Gateway + +- Gateway directly implements MCP (Model Context Protocol) server +- Tools are built into the gateway infrastructure +- Simpler setup for basic scenarios +- Direct client → gateway communication + +#### Lambda Targets (FAST's Choice) + +- Gateway acts as a proxy/router to external Lambda functions +- Each tool is implemented as a separate Lambda function +- Client → Gateway → Lambda → Gateway → Client flow +- Production-ready architecture with enterprise benefits + +### Why FAST Uses Lambda Targets + +We chose Lambda targets for the following production advantages: + +1. **Separation of Concerns**: Business logic lives in Lambda functions, not gateway infrastructure +2. **Independent Scaling**: Each tool can scale independently based on usage patterns +3. **Maintainability**: Update tool logic without touching gateway infrastructure +4. **Reusability**: Same Lambda can be used by multiple gateways or other services +5. **Language Flexibility**: Each Lambda can use different programming languages +6. **Independent Deployment**: Deploy tool updates without gateway downtime +7. **Cost Optimization**: Pay only for actual tool execution time +8. **Security**: Each Lambda can have specific IAM permissions for its requirements + +## Implementation Details + +### Gateway Configuration + +The gateway is created using AWS CDK L1 constructs with the following configuration: + +- **Protocol Type**: MCP (Model Context Protocol) +- **Authorization**: Custom JWT with Cognito integration +- **Authentication**: Machine-to-machine client credentials flow +- **Target Type**: AWS Lambda functions +- **Optional Features**: Semantic search (can be enabled for tool discovery) + +### Lambda Target Structure + +Each Lambda target in FAST follows this pattern: + +```python +def handler(event, context): + # Get tool name from context (strip target prefix) + delimiter = "___" + original_tool_name = context.client_context.custom['bedrockAgentCoreToolName'] + tool_name = original_tool_name[original_tool_name.index(delimiter) + len(delimiter):] + + # Event contains tool arguments directly + arguments = event + + # Return response in expected format + return { + 'content': [ + { + 'type': 'text', + 'text': 'Tool response here' + } + ] + } +``` + +#### Tool Invocation Protocol Details + +**Critical Implementation Notes:** + +The tool name is **NOT** passed in the event body. Gateway passes it via the Lambda context object: + +```python +# Tool name location +original_tool_name = context.client_context.custom['bedrockAgentCoreToolName'] + +# Arguments are in event body +name = event.get('name', 'World') +``` + +**Tool Name Format:** + +Gateway includes the target name as a prefix with three underscores as delimiter: + +``` +{target_name}___{tool_name} +``` + +Example: `sample_tool_target___sample_tool` + +**Complete Working Implementation:** + +```python +import json +import logging + +logger = logging.getLogger() +logger.setLevel(logging.INFO) + +def lambda_handler(event, context): + try: + # Get tool name from context + original_tool_name = context.client_context.custom['bedrockAgentCoreToolName'] + logger.info(f"Received tool invocation: {original_tool_name}") + logger.info(f"Event: {json.dumps(event)}") + + # Strip target prefix + delimiter = "___" + if delimiter in original_tool_name: + tool_name = original_tool_name[original_tool_name.index(delimiter) + len(delimiter):] + else: + tool_name = original_tool_name + + # Route to appropriate tool handler + if tool_name == "sample_tool": + name = event.get('name', 'World') + result = f"Hello, {name}! This is a sample tool from FAST." + return {"result": result} + else: + raise ValueError(f"Unknown tool: {tool_name}") + + except Exception as e: + logger.error(f"Error in lambda_handler: {str(e)}", exc_info=True) + raise +``` + +**Multiple Tools Per Lambda:** + +A single Lambda can handle multiple tools by routing on the extracted tool name: + +```python +if tool_name == "tool_one": + # Handle tool one + pass +elif tool_name == "tool_two": + # Handle tool two + pass +``` + +This is a valid production pattern used in AWS samples. + +### Tool Schema Definition + +Tools are defined using JSON schema in the CDK stack: + +```json +{ + "name": "sample_tool", + "description": "A sample tool that returns a greeting", + "inputSchema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name to greet" + } + }, + "required": ["name"] + } +} +``` + +**Supported JSON Schema Types:** + +When defining tool specs for Gateway, use these types: + +- `"integer"` - for integers (not "int") +- `"number"` - for floats +- `"string"` - for strings +- `"boolean"` - for booleans +- `"array"` - for arrays +- `"object"` - for objects + +### Authentication Flow + +1. **Machine Client**: CDK creates a Cognito machine client with client credentials flow +2. **Resource Server**: Defines scopes for gateway access (read/write) +3. **JWT Authorization**: Gateway validates tokens using Cognito's OIDC discovery +4. **SSM Parameters**: Client credentials stored securely in SSM Parameter Store + +## Key Components + +### 1. Gateway L1 Construct + +The gateway is created using native CloudFormation L1 constructs in `infra-cdk/lib/backend-stack.ts`: + +- `CfnGateway`: Creates AgentCore Gateway with MCP protocol +- `CfnGatewayTarget`: Configures Lambda targets with tool schemas +- JWT authorization configured via Cognito +- Automatic lifecycle management by CloudFormation + +### 2. Sample Tool Lambda + +Located in `gateway/tools/sample_tool/sample_tool_lambda.py`: + +- Demonstrates proper Lambda target implementation +- Shows how to parse AgentCore Gateway event format +- Includes error handling and logging + +### 3. IAM Roles and Permissions + +**Gateway Role**: Allows gateway to invoke Lambda functions and access required AWS services + +**Custom Resource Role**: Manages gateway lifecycle operations + +### 4. SSM Parameter Storage + +Gateway configuration is stored in SSM for easy access: + +- `/stack-name/gateway_url`: Gateway endpoint URL +- `/stack-name/machine_client_id`: Cognito client ID +- `/stack-name/machine_client_secret`: Cognito client secret +- `/stack-name/cognito_provider`: Cognito domain URL + +## Testing the Gateway + +### Direct Gateway Testing + +Use the provided test script to verify gateway functionality: + +```bash +python3 scripts/test-gateway.py +``` + +This script: + +1. Authenticates using machine client credentials from SSM +2. Lists available tools via MCP protocol +3. Calls the sample tool with test parameters +4. Displays responses for verification + +### Integration with AgentCore Runtime + +The gateway integrates with AgentCore Runtime through: + +1. **Runtime Configuration**: Runtime is configured with gateway URL via SSM +2. **Authentication**: Runtime uses same Cognito user pool for JWT tokens +3. **Tool Discovery**: Runtime discovers tools via gateway's `tools/list` endpoint +4. **Tool Execution**: Runtime calls tools via gateway's `tools/call` endpoint + +### Integration with Agents via MCP + +Agents connect to the Gateway using the Model Context Protocol (MCP). Two common integration approaches are shown below: + +#### LangGraph with MultiServerMCPClient + +The `MultiServerMCPClient` from `langchain-mcp-adapters` provides automatic session management: + +```python +from langchain_mcp_adapters.client import MultiServerMCPClient +from langgraph.prebuilt import create_react_agent + +# Create MCP client with Gateway configuration +mcp_client = MultiServerMCPClient({ + "gateway": { + "transport": "streamable_http", + "url": gateway_url, + "headers": { + "Authorization": f"Bearer {access_token}" + } + } +}) + +# Load tools from Gateway +tools = await mcp_client.get_tools() + +# Create agent with tools +graph = create_react_agent( + model=bedrock_model, + tools=tools, + checkpointer=checkpointer +) +``` + +#### Strands with Direct MCP Session + +Strands agents can use direct MCP session management for more control: + +```python +from mcp import ClientSession +from mcp.client.streamable_http import streamablehttp_client +from langchain_mcp_adapters.tools import load_mcp_tools + +async with streamablehttp_client( + gateway_url, + headers={"Authorization": f"Bearer {access_token}"} +) as (read, write, _): + async with ClientSession(read, write) as session: + await session.initialize() + tools = await load_mcp_tools(session) + # Use tools with agent +``` + +**Example:** See `agent/strands-single-agent/basic_agent.py` for complete implementation. + +## Adding New Tools + +To add a new tool to the gateway: + +1. **Create Lambda Function**: Implement tool logic following the Lambda target pattern +2. **Define Tool Schema**: Add JSON schema definition to CDK stack +3. **Update Gateway Configuration**: Add new target to gateway custom resource +4. **Deploy**: Run CDK deploy to update infrastructure + +### Example: Adding a Weather Tool + +```typescript +// In backend-stack.ts +const weatherLambda = new lambda.Function(this, "WeatherToolLambda", { + runtime: lambda.Runtime.PYTHON_3_13, + handler: "weather_tool.handler", + code: lambda.Code.fromAsset(path.join(__dirname, "../../gateway/tools/sample_tool")), +}) + +const weatherToolSchema = { + name: "get_weather", + description: "Get current weather for a location", + inputSchema: { + type: "object", + properties: { + location: { + type: "string", + description: "City and state, e.g. 'Seattle, WA'", + }, + }, + required: ["location"], + }, +} +``` + +## Security Considerations + +### Authentication + +- Machine-to-machine authentication using Cognito client credentials +- JWT tokens with configurable expiration +- Scoped access using Cognito resource server + +### Authorization + +- Gateway validates JWT tokens on every request +- Lambda functions inherit gateway's IAM role permissions +- Principle of least privilege for all components + +### Network Security + +- Gateway endpoints use HTTPS only +- Lambda functions run in AWS managed VPC +- No direct internet access required for Lambda functions + +## Monitoring and Logging + +### CloudWatch Logs + +- Gateway operations logged to `/aws/bedrock-agentcore/gateway/*` +- Lambda function logs in `/aws/lambda/function-name` +- Custom resource operations in `/aws/lambda/gateway-custom-resource` + +### Metrics + +- Gateway invocation metrics via CloudWatch +- Lambda function duration and error metrics +- Custom metrics can be added to Lambda functions + +## Troubleshooting + +### Common Issues + +**"Unknown tool: None" Error** + +- Indicates Lambda function isn't parsing context correctly +- Verify Lambda follows AgentCore Gateway input format +- Check CloudWatch logs for detailed error information + +**Authentication Failures** + +- Verify Cognito client credentials in SSM +- Check JWT token expiration +- Ensure gateway authorization configuration is correct + +**Tool Not Found** + +- Verify tool schema matches Lambda implementation +- Check gateway target configuration +- Ensure Lambda function is deployed and accessible + +**Gateway returns "An internal error occurred"** + +- Enable debugging to see detailed error messages by updating the gateway to set `exceptionLevel: 'DEBUG'` in the CDK construct or via AWS CLI. + +```bash +# Enable debugging on gateway +aws bedrock-agentcore-control update-gateway \ + --gateway-identifier \ + --name \ + --role-arn \ + --protocol-type MCP \ + --authorizer-type CUSTOM_JWT \ + --authorizer-configuration \ + --exception-level DEBUG +``` + +Or update the gateway construct in CDK: + +```typescript +const gateway = new bedrockagentcore.CfnGateway(this, "AgentCoreGateway", { + name: `${config.stack_name_base}-gateway`, + roleArn: gatewayRole.roleArn, + protocolType: "MCP", + exceptionLevel: "DEBUG", // Add this line for detailed error messages + // ... rest of configuration +}) +``` + +### Debug Steps + +1. **Check SSM Parameters**: Verify all gateway configuration parameters exist +2. **Test Authentication**: Use test script to verify token generation +3. **Review CloudWatch Logs**: Check gateway and Lambda function logs +4. **Validate Tool Schema**: Ensure schema matches expected format +5. **Test Lambda Directly**: Invoke Lambda function independently to verify logic + +## Best Practices + +### Lambda Function Development + +- Always log incoming events for debugging +- Implement proper error handling and return meaningful error messages +- Use environment variables for configuration +- Keep functions focused on single tool responsibility + +### Schema Design + +- Provide clear, descriptive tool and parameter descriptions +- Use appropriate JSON schema types and constraints +- Include examples in descriptions where helpful +- Keep input schemas simple and focused + +### Deployment + +- Test tools individually before gateway integration +- Use version tags for Lambda function deployments +- Monitor CloudWatch metrics after deployment +- Implement gradual rollout for production changes + +## Related Documentation + +- [Identity Propagation & Cedar Policy Guide](IDENTITY_POLICY.md) - User-level access control for Gateway tools +- [Cedar Policy Guide](CEDAR_POLICY_GUIDE.md) - Cedar policy syntax, capabilities, and reference +- [Replacing Cognito](REPLACING_COGNITO.md) - Identity provider swap and Gateway interceptors guide +- [Runtime-Gateway Authentication](RUNTIME_GATEWAY_AUTH.md) - M2M token flow between Runtime and Gateway +- [Deployment Guide](DEPLOYMENT.md) - How to deploy FAST infrastructure +- [AWS AgentCore Gateway Documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/agentcore-gateway.html) - Official AWS documentation +- [AWS Gateway Lambda Target Documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-add-target-lambda.html) - Lambda target implementation details + +## Design notes + +Decisions specific to this derivative around Gateway targets: + +- **MCP server targets, not just Lambda**: the AWS MCP server, a Strands docs MCP server, and a long-term-memory meta-recall MCP server are exposed as Gateway MCP server targets. Hosting them as targets (rather than embedding their tools in the agent) keeps tool surface, authentication, and Cedar policy unified across native and MCP tools. +- **AWS MCP target inherits a broader role**: the AWS MCP server's `call_aws` and `run_script` capabilities require the Gateway target role to enumerate and call AWS services. The role is scoped read-broad / write-narrow for the demo; production deployments should re-evaluate against their threat model. +- **SigV4 service name pinned**: when calling Gateway target endpoints from inside the runtime, the SigV4 signing service identifier matters and is pinned in code rather than inferred, to avoid silent auth failures on minor API changes. +- **Managed Web Search target**: the GA Web Search connector is wired in as a Gateway target so the agent can answer general questions with citations without bringing along a separate search SDK or browser tool. diff --git a/samples/aws-specialist-agent/docs/IDENTITY_POLICY.md b/samples/aws-specialist-agent/docs/IDENTITY_POLICY.md new file mode 100644 index 0000000..fe6d5a6 --- /dev/null +++ b/samples/aws-specialist-agent/docs/IDENTITY_POLICY.md @@ -0,0 +1,344 @@ +# Identity Propagation & Cedar Policy Guide + +This document describes how FAST propagates user identity from the frontend through to AgentCore Gateway Cedar policies, enabling fine-grained, user-level access control on Gateway tools. + +## Overview + +AgentCore Gateway authenticates requests using OAuth2 tokens validated by a CUSTOM_JWT authorizer. By default, the Runtime obtains M2M tokens via the Client Credentials flow, and all requests carry the same machine identity. This means the Gateway cannot distinguish between individual users. + +This feature adds **identity propagation** on top of the existing M2M flow: the authenticated user's identity and Cognito group membership are embedded into the M2M token using Cognito's `aws_client_metadata` parameter and a V3 Pre-Token Lambda trigger. The Runtime obtains the M2M token through AgentCore Identity (the Token Vault), so it never calls the public Cognito hosted domain directly — which keeps the Runtime closed-network (no NAT). The enriched token is then evaluated by Cedar policies at the Gateway, enabling access control rules like "only users in the finance department can run destructive tools." + +**Use this when:** Gateway tools need user-level access control based on attributes like department, role, or user ID. + +> **Scope of this demo:** This implementation demonstrates user-to-tool access control (e.g., "guest users cannot use the text_analysis_tool from the AgentCore Gateway"). AgentCore Policy supports additional capabilities — including input validation, conditional access based on request parameters, and multi-tool policies — which are documented in [Cedar Policy Capabilities](CEDAR_POLICY_GUIDE.md#cedar-policy-capabilities). + +## What is AgentCore Policy? + +AgentCore Policy is a service that controls what your AI agents are allowed to do. Think of it as a security guard sitting between your agent and its tools — every time the agent tries to use a tool, the guard checks the rules and decides: allow or deny. + +**The simple version:** + +- You write rules (Cedar policies) that say who can use which tools, and under what conditions +- The Policy Engine enforces those rules automatically on every single tool call +- If no rule explicitly allows an action, it's denied (deny-by-default) +- Enforcement is deterministic — unlike prompt engineering, policies cannot be bypassed by clever phrasing + +**What it can control:** + +| Capability | Example Rule | Demonstrated in This Demo? | +| --------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------ | +| User-to-tool access | "Only finance users can access the billing tool" | Yes | +| Input validation | "Refund amount cannot exceed $1000" | No (see [Cedar Policy Guide](CEDAR_POLICY_GUIDE.md#cedar-policy-capabilities)) | +| Multi-tool policies | "Developers can use read tools but not write tools" | No (see [Cedar Policy Guide](CEDAR_POLICY_GUIDE.md#cedar-policy-capabilities)) | +| Environment isolation | "Only production runtime can access production tools" | No (see [Runtime-Level Access Control](#runtime-level-access-control)) | +| Conditional access | "Allow tool only when query targets a specific account" | No (see [Cedar Policy Guide](CEDAR_POLICY_GUIDE.md#cedar-policy-capabilities)) | + +**This demo implements** user-to-tool access control based on custom `department` claims. The other capabilities use the same infrastructure (Policy Engine + Cedar + Gateway) with different policy conditions. See [Cedar Policy Capabilities](CEDAR_POLICY_GUIDE.md#cedar-policy-capabilities) for the full syntax reference with examples of each capability. + +**Key concepts:** + +- **Policy Engine** — The evaluation engine that processes Cedar policies. One engine attaches to one Gateway. +- **Cedar Policy** — A declarative rule written in [Cedar](https://www.cedarpolicy.com/), AWS's open-source policy language. Deterministic, not probabilistic. +- **CUSTOM_JWT Authorizer** — The Gateway component that validates tokens and maps JWT claims to Cedar principal tags. +- **Deny-by-default** — If no `permit` statement matches, the request is denied. No explicit `forbid` needed. +- **Tool filtering** — Denied tools are hidden from the agent at discovery time (`tools/list`), not just blocked at execution time. See [Tool Discovery vs Execution](CEDAR_POLICY_GUIDE.md#tool-discovery-vs-execution). + +## Architecture / Flow + +The identity propagation flow has six steps: + +``` +1. User logs in → Frontend gets JWT from Cognito (access token carries cognito:groups) +2. Frontend sends request → Runtime validates JWT, extracts user_id (sub) and cognito:groups +3. Runtime requests an M2M token via AgentCore Identity (Token Vault), passing user_id + groups in aws_client_metadata +4. Cognito V3 Pre-Token Lambda fires → maps the group to department/role claims → injects them into the M2M token +5. Runtime calls Gateway tool with the enriched M2M token +6. Gateway's CUSTOM_JWT Authorizer maps token claims to Cedar principal tags → Policy Engine evaluates Cedar policy → allow or deny +``` + +Key security property: both `user_id` (`sub`) and `cognito:groups` come from the validated JWT in the Runtime's Session Context, not from the LLM or request payload. This ensures the identity chain is cryptographically secure end-to-end. + +## Components + +### Cognito ESSENTIALS Tier + +**File:** `infra-cdk/lib/cognito-stack.ts` + +The Cognito User Pool is configured with `featurePlan: ESSENTIALS`. This is required because V3 Pre-Token Generation Lambda triggers only fire on Client Credentials (M2M) grants when the ESSENTIALS tier is enabled. Without it, the Pre-Token Lambda would not be invoked during M2M token generation. + +### V3 Pre-Token Lambda + +**File:** `infra-cdk/lambdas/pretoken-v3/index.py` + +This Lambda fires on every token generation event (both user login and M2M). It only processes M2M flows (`TokenGeneration_ClientCredentials`) and skips user login flows. + +For M2M flows, it reads `verified_groups` (the user's `cognito:groups`, comma-separated) from `clientMetadata` and maps the group name to department/role claims: + +| Cognito Group | Department | Role | +| ------------- | ----------- | --------- | +| `finance` | finance | admin | +| `engineering` | engineering | developer | +| (no group) | guest | viewer | + +These claims are injected into the M2M access token via `claimsToAddOrOverride`: + +- `user_id` — the authenticated user's ID (`sub`) +- `department` — the user's department (the Cognito group name) +- `role` — the user's role + +> **Note:** These claim names (`user_id`, `department`, `role`) are custom, application-defined claims — not standard JWT/OIDC claims. You can define any claim names you need. See [Understanding Claims](CEDAR_POLICY_GUIDE.md#understanding-claims-custom-vs-standard) for details. + +The group is read straight from the validated access token, so the Lambda needs no `AdminListGroupsForUser` call. To change the assignment, add or remove users from Cognito groups, or edit the `GROUP_ROLES` map in the Pre-Token Lambda. + +### Cedar Policy Files + +**Directory:** `gateway/policies/` + +The Cedar policies define access control rules for Gateway tools. Each file holds one Cedar statement (AgentCore `CreatePolicy` accepts one statement per policy), loaded by CDK at deploy time with `//` comment lines stripped and the `{{GATEWAY_ARN}}` placeholder replaced with the actual Gateway ARN. + +| File | Tools | Permitted departments | +| ------------------------------ | -------------------------------------------------------- | --------------------- | +| `01-sample-tool.cedar` | `sample-tool-target___text_analysis_tool` | finance, engineering | +| `02-aws-mcp-read.cedar` | AWS MCP read tools (`aws-mcp___aws___*` read) | finance, engineering | +| `03-aws-mcp-destructive.cedar` | `aws-mcp___aws___call_aws`, `aws-mcp___aws___run_script` | finance only | + +Guest (no group) matches no `permit` and is denied by Cedar's deny-by-default. Engineering can use read tools but not the destructive `call_aws` / `run_script` tools. Finance can use everything. To change the matrix, edit the relevant file and run `cdk deploy`. + +### Policy Engine Custom Resource + +**Files:** + +- `infra-cdk/lambdas/cedar-policy/index.py` — Custom Resource Lambda +- `infra-cdk/lib/backend-stack.ts` — CDK resource definition + +A CloudFormation Custom Resource manages the full Policy Engine lifecycle because no L1/L2 CDK construct exists for AgentCore Policy. The Lambda handles three CloudFormation events: + +- **Create:** Creates Policy Engine → creates Cedar Policy → attaches Policy Engine to Gateway +- **Update:** Deletes existing policies → creates new policy with updated document → verifies engine is still attached to Gateway +- **Delete:** Detaches Policy Engine from Gateway → deletes all policies → deletes Policy Engine + +All operations use official boto3 waiters (`policy_engine_active`, `policy_engine_deleted`, `policy_active`, `policy_deleted`). Gateway status changes use a custom polling loop as no official waiter exists. + +### Gateway Authorizer + +**File:** `infra-cdk/lib/backend-stack.ts` + +The Gateway uses a `CUSTOM_JWT` authorizer configured with the Cognito OIDC discovery URL and the machine client ID. The authorizer validates M2M tokens and maps JWT claims to Cedar principal tags: + +| JWT Claim | Cedar Principal Tag | Claim Type | +| ------------ | -------------------------------- | ------------------------------------- | +| `department` | `principal.getTag("department")` | Custom (injected by Pre-Token Lambda) | +| `role` | `principal.getTag("role")` | Custom (injected by Pre-Token Lambda) | +| `user_id` | `principal.getTag("user_id")` | Custom (injected by Pre-Token Lambda) | + +## Cedar Policy Guide + +For the full Cedar policy reference — including claims, action format, schema constraints, tool discovery vs execution, and policy capabilities — see [Cedar Policy Guide](CEDAR_POLICY_GUIDE.md). + +## Gateway Authentication: AgentCore Identity (Token Vault) + +The Runtime obtains its Gateway M2M token through AgentCore Identity using the `@requires_access_token` decorator (see each pattern's `tools/gateway.py`). AgentCore Identity performs the Cognito token exchange server-side, reachable through the `bedrock-agentcore` VPC endpoint — the Runtime never calls the public Cognito hosted domain, so no NAT Gateway is required. + +User identity is propagated by passing `custom_parameters={"aws_client_metadata": json.dumps({"verified_user_id": , "verified_groups": })}` to the decorator. `aws_client_metadata` is the only `custom_parameters` key Cognito forwards to the Pre-Token Lambda (as `ClientMetadata`); it must be a flat string map, which is why groups are joined into a comma-separated string. The Lambda reads `verified_groups` and injects the `department`/`role` claims the Cedar policy evaluates. + +> **Replacing Cognito?** For swapping Cognito with another Identity Provider (Okta, Auth0, Entra ID, etc.) or using Gateway Interceptors for dynamic access control, see [Replacing Cognito](REPLACING_COGNITO.md). + +## Customization + +### Changing Group Assignment + +The simplest change is to add or remove users from the `finance` / `engineering` Cognito groups — no code change or redeploy needed. To change how groups map to claims, edit the `GROUP_ROLES` map in `infra-cdk/lambdas/pretoken-v3/index.py`. For a fully different identity source (DynamoDB, LDAP, etc.), replace the `verified_groups` lookup with your own resolution. + +### Adding New Claims + +To add new claims to the M2M token: + +1. Add the claim to `claimsToAddOrOverride` in the Pre-Token Lambda +2. Reference the claim in Cedar policy using `principal.getTag("claim_name")` +3. No Gateway configuration change is needed — the CUSTOM_JWT authorizer maps all JWT claims to Cedar tags automatically + +### VPC Mode + +In VPC mode the default deployment is **fully closed (no NAT Gateway)**. Because the M2M token is obtained through AgentCore Identity — which runs the Cognito token exchange server-side, reachable via the `bedrock-agentcore` VPC endpoint — the Runtime needs no outbound internet access. The private subnets are isolated (no `0.0.0.0/0` route) and all AWS access flows through VPC endpoints. + +See `docs/DEPLOYMENT.md` for full VPC configuration details. + +### Runtime-Level Access Control + +By default, all requests through a Gateway share the same machine client identity. If you deploy multiple AgentCore Runtimes and need to control which runtime can access which tools, you can use the Cognito `clientId` as a cryptographically verified runtime identity. + +**Why not use `context.runtime.arn` in Cedar?** +The Cedar schema only supports `context.input` (tool parameters) — there is no `context.runtime.arn` or similar field. Attempting to reference unsupported context fields will cause policy creation to fail. + +**Why not use Cognito Groups for the runtime identity?** +Cognito User Pool Groups apply to user identities, not app clients. The M2M token itself has no `cognito:groups` claim, so it cannot identify the runtime. (User groups are still used for the _user_ identity — the Runtime reads `cognito:groups` from the user's access token and forwards them via `aws_client_metadata`, as described above. That is a separate axis from the per-runtime `clientId` identity discussed here.) + +**Solution: One Cognito App Client Per Runtime** + +Since each CDK stack creates both the Cognito app client and the AgentCore Runtime, the `clientId` serves as the runtime identity — verified cryptographically via the `client_secret`. The Pre-Token Lambda maps the `clientId` to a `runtime_env` claim without any self-reporting. + +**Architecture:** + +``` +Runtime A (production) → authenticates with Client A (client_secret_A) + → Cognito verifies clientId = "abc123" + → Pre-Token Lambda maps "abc123" → runtime_env: "production" + → Cedar policy checks principal.getTag("runtime_env") + +Runtime B (staging) → authenticates with Client B (client_secret_B) + → Cognito verifies clientId = "def456" + → Pre-Token Lambda maps "def456" → runtime_env: "staging" + → Cedar policy checks principal.getTag("runtime_env") +``` + +**Step 1: Create separate machine clients in CDK** + +```typescript +// Create one machine client per runtime environment +const machineClientProd = new cognito.UserPoolClient(this, "MachineClientProd", { + userPool: this.userPool, + generateSecret: true, + oAuth: { + flows: { clientCredentials: true }, + // Use the same resource server scopes as the existing machine client + scopes: [ + cognito.OAuthScope.resourceServer( + resourceServer, + new cognito.ResourceServerScope({ scopeName: "read", scopeDescription: "Read access" }) + ), + cognito.OAuthScope.resourceServer( + resourceServer, + new cognito.ResourceServerScope({ scopeName: "write", scopeDescription: "Write access" }) + ), + ], + }, +}) + +const machineClientStaging = new cognito.UserPoolClient(this, "MachineClientStaging", { + userPool: this.userPool, + generateSecret: true, + oAuth: { + flows: { clientCredentials: true }, + scopes: [ + cognito.OAuthScope.resourceServer( + resourceServer, + new cognito.ResourceServerScope({ scopeName: "read", scopeDescription: "Read access" }) + ), + cognito.OAuthScope.resourceServer( + resourceServer, + new cognito.ResourceServerScope({ scopeName: "write", scopeDescription: "Write access" }) + ), + ], + }, +}) + +// Pass the mapping to the Pre-Token Lambda as an environment variable +preTokenLambda.addEnvironment( + "CLIENT_RUNTIME_MAP", + JSON.stringify({ + [machineClientProd.userPoolClientId]: "production", + [machineClientStaging.userPoolClientId]: "staging", + }) +) +``` + +**Step 2: Map clientId → runtime_env in the Pre-Token Lambda** + +```python +import os, json + +def lambda_handler(event, context): + if event["triggerSource"] != "TokenGeneration_ClientCredentials": + return event + + # clientId is Cognito-verified + client_id = event["callerContext"]["clientId"] + + # Mapping set at deploy time by CDK + client_runtime_map = json.loads(os.environ.get("CLIENT_RUNTIME_MAP", "{}")) + runtime_env = client_runtime_map.get(client_id, "unknown") + + # Existing user identity logic (unchanged) + meta = event["request"].get("clientMetadata", {}) + user_id = meta.get("verified_user_id", "") + groups = [g for g in meta.get("verified_groups", "").split(",") if g] + + GROUP_ROLES = {"finance": "admin", "engineering": "developer"} + department = next((g for g in groups if g in GROUP_ROLES), "guest") + role = GROUP_ROLES.get(department, "viewer") + + event["response"]["claimsAndScopeOverrideDetails"] = { + "accessTokenGeneration": { + "claimsToAddOrOverride": { + "user_id": user_id, + "department": department, + "role": role, + "runtime_env": runtime_env, + } + } + } + return event +``` + +**Step 3: Add runtime_env to Cedar policy** + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"sample-tool-target___text_analysis_tool", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("runtime_env") && + principal.getTag("runtime_env") == "production" && + principal.hasTag("department") && + (principal.getTag("department") == "finance" || + principal.getTag("department") == "engineering") +}; +``` + +**Security model — two-layer identity:** + +| Layer | Claim | Source | Trust Level | +| ---------------- | ------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------- | +| Runtime identity | `runtime_env` | `callerContext.clientId` (Cognito-verified) | Cryptographic — requires `client_secret` | +| User identity | `user_id`, `department`, `role` | `clientMetadata.verified_user_id` (from validated JWT `sub` claim) | JWT-verified — extracted server-side by Runtime from Cognito-validated token | + +Both layers are secured by Cognito: the `clientId` is verified through the client secret exchange, and the `user_id` originates from the validated JWT `sub` claim extracted by `extract_user_id_from_context()` in the Runtime. + +> **Note:** This section documents the architecture pattern for runtime-level access control. The current FAST implementation uses a single machine client. To implement this pattern, create additional machine clients in `cognito-stack.ts` and update the Pre-Token Lambda with the mapping logic above. + +## Verifying the Deployed Policy + +To check which Cedar policy is currently active on the Gateway: + +1. Go to **AWS Console → Bedrock AgentCore → Policy** +2. Click on your Policy Engine (e.g., `fast_aws_specialist_policy_engine`) from the Policy engines section +3. In the **Policies** section, click on your policy (e.g., `fast_aws_specialist_policy_engine_cp_`) +4. The **Definition** section shows the policy breakdown: + - **Effect**: `permit` or `forbid` + - **Scope: Principal**: `AgentCore::OAuthUser` + - **Scope: Actions**: the tool action name (e.g., `sample-tool-target___text_analysis_tool`) + - **Scope: Resource**: the Gateway name + - **Conditions**: the `when` clause logic +5. The **Cedar** section shows the full Cedar policy statement as deployed + +Use this to confirm that a `cdk deploy` applied the expected policy version. + +## Verifying Policy Decisions via Tracing + +To verify Cedar policy allow/deny decisions in CloudWatch logs: + +1. Go to **AWS Console → Bedrock AgentCore → Runtimes** +2. Click on your runtime (e.g., `fast_aws_specialist_FASTAgent`) from the Runtime resources section +3. Scroll down to **Tracing**, click **Edit**, and toggle **Enable tracing** to Enable +4. Go to **Bedrock AgentCore → Gateways** +5. Click on your gateway (e.g., `fast-aws-specialist-gateway`), scroll down to **Tracing**, click **Edit**, and toggle **Enable tracing** to Enable +6. Run a query from the frontend that triggers a tool call +7. Go to **CloudWatch Console → Log Management → Log groups** +8. Find and click on the `aws/spans` log group, then click on the default log stream +9. In the **Filter events** search box, type `policy` +10. Look for the `AgentCore.Policy.PartiallyAuthorizeActions` span — it contains: + - `aws.agentcore.policy.allowed_tools`: tools the user is permitted to use + - `aws.agentcore.policy.denied_tools`: tools the user is denied access to + - `aws.agentcore.gateway.policy.mode`: should show `ENFORCE` diff --git a/samples/aws-specialist-agent/docs/LOCAL_DEVELOPMENT.md b/samples/aws-specialist-agent/docs/LOCAL_DEVELOPMENT.md new file mode 100644 index 0000000..9064540 --- /dev/null +++ b/samples/aws-specialist-agent/docs/LOCAL_DEVELOPMENT.md @@ -0,0 +1,215 @@ +# Local Development with Docker Compose + +This guide explains how to run the full FAST stack locally using Docker Compose for development purposes. + +## Prerequisites + +**Important**: Local development still requires a deployed FAST stack in AWS for backend dependencies (Memory, Gateway, SSM parameters). Docker Compose only containerizes the frontend and agent - it doesn't replace AWS services. + +### Required + +1. **Deployed FAST Stack**: You must have already deployed FAST to AWS using: + + ```bash + cd infra-cdk + cdk deploy + ``` + +2. **AWS Credentials**: AWS credentials **must be exported as environment variables** — the Docker containers cannot read from `~/.aws/credentials` or `~/.aws/config`: + + ```bash + # Option 1: Export from your existing aws configure profile + export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) + export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key) + export AWS_SESSION_TOKEN=$(aws configure get aws_session_token) # if using temporary credentials + + # Option 2: Set directly + export AWS_ACCESS_KEY_ID=your-key + export AWS_SECRET_ACCESS_KEY=your-secret + export AWS_SESSION_TOKEN=your-token # if using temporary credentials + ``` + +3. **Docker & Docker Compose**: Install Docker Desktop or Docker Engine with Compose support + +4. **Environment Variables**: Set the following required variables: + ```bash + export MEMORY_ID=your-memory-id + export STACK_NAME=your-stack-name + export AWS_DEFAULT_REGION=us-east-1 + ``` + +### Finding Your Environment Variables + +Get these values from your deployed stack: + +```bash +# Get stack outputs +aws cloudformation describe-stacks --stack-name your-stack-name --query 'Stacks[0].Outputs' + +# Extract Memory ID from MemoryArn (last part after the final /) +# Extract Stack Name (the name you used when deploying) +# Use the same region where you deployed +``` + +## Quick Start + +1. **Set Environment Variables**: + + ```bash + export MEMORY_ID=your-memory-id-from-stack-outputs + export STACK_NAME=your-stack-name + export AWS_DEFAULT_REGION=us-east-1 + ``` + +2. **Start the Stack**: + + ```bash + cd docker && docker compose up --build + ``` + +3. **Access the Application**: + - Frontend: http://localhost:3000 + - Agent API: http://localhost:8080 + - Agent Health: http://localhost:8080/ping + +## Authentication in Local Mode + +In production, AgentCore Runtime validates the user's JWT and passes it to the agent. The agent extracts the user ID from the JWT's `sub` claim rather than trusting the request payload (preventing impersonation via prompt injection). + +When running locally via Docker Compose, there is no AgentCore Runtime. The test scripts generate a mock unsigned JWT with a test user ID as the `sub` claim and send it in the `Authorization: Bearer` header. This exercises the same code path as production without requiring a real Cognito token. + +## Environment Configuration + +Create a `.env` file in the repository root for convenience: + +```bash +# Required - from your deployed AWS stack +MEMORY_ID=your-memory-id +STACK_NAME=your-stack-name +AWS_DEFAULT_REGION=us-east-1 + +# AWS Credentials (required - Docker containers cannot read ~/.aws/credentials) +AWS_ACCESS_KEY_ID=your-key +AWS_SECRET_ACCESS_KEY=your-secret +AWS_SESSION_TOKEN=your-token +``` + +Then run: `cd docker && docker compose up --build` + +## Development Workflow + +### Making Changes + +- **Frontend Changes**: Files are mounted as volumes, so changes appear immediately +- **Agent Changes**: Rebuild the agent container: + ```bash + cd docker && docker compose up --build agent + ``` + +### Using Different Agent Patterns + +To use a different agent pattern: + +1. **Edit docker/docker-compose.yml**: + + ```yaml + agent: + build: + dockerfile: agent//Dockerfile + ``` + +2. **Rebuild**: + ```bash + cd docker && docker compose up --build agent + ``` + +### Logs and Debugging + +```bash +# View all logs +docker compose logs -f + +# View specific service logs +docker compose logs -f agent +docker compose logs -f frontend + +# Access container shell +docker compose exec agent bash +docker compose exec frontend sh +``` + +## Troubleshooting + +### Agent Won't Start + +**Symptoms**: Agent container exits or health check fails + +**Solutions**: + +1. Verify AWS credentials: `aws sts get-caller-identity` +2. Check environment variables are set correctly +3. Ensure deployed stack exists and is healthy +4. Check agent logs: `docker compose logs agent` + +### Frontend Can't Connect to Agent + +**Symptoms**: Frontend loads but can't communicate with backend + +**Solutions**: + +1. Verify agent is healthy: `curl http://localhost:8080/ping` +2. Check network connectivity between containers +3. Ensure frontend is configured to use local agent endpoint + +### AWS Permission Errors + +**Symptoms**: Agent starts but fails on AWS API calls + +**Solutions**: + +1. Verify IAM permissions for your AWS credentials +2. Check that the deployed stack resources are accessible +3. Ensure correct AWS region is set + +### Memory/Gateway Not Found + +**Symptoms**: Agent reports missing Memory or Gateway resources + +**Solutions**: + +1. Verify `MEMORY_ID` matches the deployed stack's Memory resource +2. Check `STACK_NAME` matches your CloudFormation stack name +3. Ensure stack deployment completed successfully + +## Stopping the Stack + +```bash +# Stop all services +cd docker && docker compose down + +# Stop and remove volumes +cd docker && docker compose down -v + +# Stop and remove images +cd docker && docker compose down --rmi all +``` + +## Production Deployment + +This Docker Compose setup is for development only. For production deployment, use: + +```bash +cd infra-cdk +cdk deploy +cd .. +python scripts/deploy-frontend.py +``` + +## Next Steps + +- Customize the agent code in `agent/` +- Modify the frontend in `frontend/src/` +- Add new tools in `tools/` or `gateway/tools/` +- Update infrastructure in `infra-cdk/` + +Remember: Changes to infrastructure require redeployment via CDK, not just Docker Compose restart. diff --git a/samples/aws-specialist-agent/docs/LOCAL_DOCKER_TESTING.md b/samples/aws-specialist-agent/docs/LOCAL_DOCKER_TESTING.md new file mode 100644 index 0000000..f2bbcea --- /dev/null +++ b/samples/aws-specialist-agent/docs/LOCAL_DOCKER_TESTING.md @@ -0,0 +1,234 @@ +# Local Docker Testing Guide + +Build and test your AgentCore agent Docker image locally to validate Dockerfile configuration and dependencies. + +## LIMITATIONS + +**Gateway tools will NOT work in standalone Docker testing** because: + +- The `@requires_access_token` decorator requires AgentCore Identity service +- AgentCore Identity only operates within AgentCore Runtime context +- OAuth2 M2M authentication cannot be mocked outside Runtime + +**What works:** Dockerfile builds, dependency installation, Code Interpreter, non-Gateway tools +**What doesn't work:** AgentCore Gateway tools (MCP-based Lambda tools) + +**For full local testing with Gateway support**, use `docker-compose` (see [Local Development Guide](LOCAL_DEVELOPMENT.md)). + +## Why Docker Testing? + +| Testing Mode | Gateway Tools | Code Interpreter | Use Case | +| ------------------------ | ------------- | ---------------- | -------------------------------- | +| `test-agent.py --local` | Yes | Yes | Quick Python iteration | +| **Manual Docker** | No | Yes | Validate Dockerfile/dependencies | +| **`docker-compose`** | Yes | Yes | Full local development | +| `test-agent.py` (remote) | Yes | Yes | Test deployed agent | + +Docker testing validates: + +- Dockerfile builds correctly +- Dependencies install properly in container +- Container starts and responds to health checks +- Agent code runs in containerized environment (without Gateway tools) + +## Prerequisites + +1. **Docker** installed and running (`docker ps` should work) +2. **Deployed stack** - Required for Memory ID and SSM parameters +3. **AWS credentials** configured in your environment + +## Building the Docker Image + +```bash +# Build image for your agent pattern +docker build -f agent/strands-single-agent/Dockerfile \ + -t fast-agent-local \ + --platform linux/arm64 . +``` + +### Platform Requirements + +AgentCore Runtime requires ARM64 architecture. On x86/amd64 machines, enable emulation: + +```bash +# One-time setup for ARM64 emulation +docker run --privileged --rm tonistiigi/binfmt --install all +``` + +## Running the Container + +```bash +# Get Memory ID from CloudFormation outputs +MEMORY_ID=$(aws cloudformation describe-stacks \ + --stack-name \ + --query 'Stacks[0].Outputs[?OutputKey==`MemoryArn`].OutputValue' \ + --output text | awk -F'/' '{print $NF}') + +# Export AWS credentials (required for container) +export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) +export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key) +export AWS_SESSION_TOKEN=$(aws configure get aws_session_token) # if using temporary credentials + +# Run container +docker run --rm -it -p 8080:8080 \ + --platform linux/arm64 \ + -e MEMORY_ID=$MEMORY_ID \ + -e STACK_NAME= \ + -e AWS_DEFAULT_REGION=us-east-1 \ + -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ + -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ + -e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \ + fast-agent-local +``` + +**Important:** AWS credentials must be exported as environment variables. The Docker container cannot read credentials from `~/.aws/credentials` or `~/.aws/config`. + +## Testing the Agent + +### Health Check + +```bash +curl http://localhost:8080/ping +# Returns: {"status":"Healthy","time_of_last_update":...} +``` + +### Mock JWT for Testing + +Since there's no AgentCore Runtime to provide a validated JWT, create a mock unsigned JWT: + +```bash +# Generate mock JWT with sub=test-user +MOCK_JWT=$(python3 -c "import base64,json; h=base64.urlsafe_b64encode(json.dumps({'alg':'none','typ':'JWT'}).encode()).rstrip(b'=').decode(); p=base64.urlsafe_b64encode(json.dumps({'sub':'test-user'}).encode()).rstrip(b'=').decode(); print(f'{h}.{p}.')") + +# Test agent (will fail on Gateway tools but Code Interpreter should work) +curl -X POST http://localhost:8080/invocations \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $MOCK_JWT" \ + -d '{"prompt": "Execute Python: print(2+2)", "runtimeSessionId": "test-123"}' +``` + +**Expected behavior:** + +- Code Interpreter requests will work +- Gateway tool requests will fail with authentication errors + +## Architecture + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Local Machine │ +│ ┌─────────────────────────────────────────────────────┐ │ +│ │ Docker Container (ARM64) │ │ +│ │ ┌─────────────────────────────────────────────┐ │ │ +│ │ │ Agent (basic_agent.py / langgraph_agent.py)│ │ │ +│ │ │ - Listens on :8080 │ │ │ +│ │ │ - Uses passed AWS credentials │ │ │ +│ │ │ - Gateway auth will FAIL │ │ │ +│ │ └─────────────────────────────────────────────┘ │ │ +│ └─────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ http://localhost:8080/invocations │ +└─────────────────────────────────────────────────────────────┘ + │ + ▼ + ┌─────────────────────────────────┐ + │ AWS (Deployed Resources) │ + │ - AgentCore Memory (Yes) │ + │ - Code Interpreter (Yes) │ + │ - AgentCore Gateway (No) │ + │ - SSM Parameters (Yes) │ + └─────────────────────────────────┘ +``` + +## Troubleshooting + +### Container starts but Gateway authentication fails + +This is **expected behavior**. The `@requires_access_token` decorator requires AgentCore Identity service, which only works within AgentCore Runtime. + +**Solution:** Use `docker-compose` for full local testing (see [Local Development Guide](LOCAL_DEVELOPMENT.md)). + +### Container starts but agent fails immediately + +Check container logs: + +```bash +# Find container ID +docker ps + +# View logs +docker logs +``` + +Common issues: + +- **Missing AWS credentials**: Ensure `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` are set +- **Expired session token**: Refresh your AWS credentials +- **Stack not deployed**: The script needs a deployed stack to fetch Memory ID + +### Build fails with "platform mismatch" + +Enable ARM64 emulation (see Platform Requirements above). + +### "Connection refused" on localhost:8080 + +The agent may still be starting. Wait 10-30 seconds and try again. Check logs if it persists. + +### ECS/EKS warnings in logs + +These warnings are expected when running locally: + +``` +AwsEcsResourceDetector failed: Missing ECS_CONTAINER_METADATA_URI... +AwsEksResourceDetector failed: No such file or directory... +``` + +The OpenTelemetry instrumentation looks for ECS/EKS metadata which doesn't exist locally. These can be safely ignored. + +## Advanced Usage + +### Viewing Container Logs in Real-Time + +```bash +# Start container in foreground (not detached) +docker run --rm -p 8080:8080 \ + --platform linux/arm64 \ + -e MEMORY_ID= \ + -e STACK_NAME= \ + -e AWS_DEFAULT_REGION=us-east-1 \ + -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ + -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ + -e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \ + fast-agent-local +``` + +### Build-Only Validation + +To validate Dockerfile without running: + +```bash +docker build -f agent/strands-single-agent/Dockerfile \ + -t fast-agent-local \ + --platform linux/arm64 . + +# Check if build succeeded +echo $? # Should return 0 +``` + +## When to Use Each Testing Mode + +| Scenario | Recommended Mode | +| ---------------------------------- | --------------------------------------- | +| Quick iteration on agent logic | `test-agent.py --local` | +| Verify Dockerfile builds correctly | Manual Docker build | +| Test with Gateway tools locally | `docker-compose` (LOCAL_DEVELOPMENT.md) | +| Test deployed production agent | `test-agent.py` (remote) | +| CI/CD pipeline validation | Manual Docker build | + +## Related Documentation + +- [Local Development Guide](LOCAL_DEVELOPMENT.md) - Full local development with `docker-compose` and Gateway support +- [Deployment Guide](DEPLOYMENT.md) - Full stack deployment instructions +- [Agent Configuration](AGENT_CONFIGURATION.md) - Configuring agent patterns +- [Streaming Guide](STREAMING.md) - Understanding streaming events diff --git a/samples/aws-specialist-agent/docs/MEMORY_INTEGRATION.md b/samples/aws-specialist-agent/docs/MEMORY_INTEGRATION.md new file mode 100644 index 0000000..b468ec5 --- /dev/null +++ b/samples/aws-specialist-agent/docs/MEMORY_INTEGRATION.md @@ -0,0 +1,408 @@ +# AgentCore Memory Integration Guide + +Quick, practical guide for integrating AWS Bedrock AgentCore Memory with your agents. + +AgentCore provides two types of memory: **short-term memory** stores raw conversation history, providing agents with context from recent interactions. **Long-term memory** uses AI-powered strategies to extract and store meaningful insights—such as session summaries, user preferences, and important facts—enabling agents to build deeper understanding over time. Learn more in the [Amazon Bedrock AgentCore Memory blog post](https://aws.amazon.com/blogs/machine-learning/amazon-bedrock-agentcore-memory-building-context-aware-agents/). + +--- + +## Enabling Long-Term Memory + +Both short-term memory (STM — raw conversation history within a session) and long-term memory (LTM — facts recalled across sessions) are available. LTM is supported on the **`strands-single-agent`** pattern and uses a `SemanticMemoryStrategy` to automatically extract and store facts from conversations. The `actorId` is the user's validated JWT `sub` (the same identifier the Runtime extracts for identity propagation), so each user gets their own persistent memory. + +### How It Works + +1. **Infrastructure**: The CDK stack always creates the `SemanticMemoryStrategy` on the memory resource (there is no cost to simply define the strategy). A `USE_LONG_TERM_MEMORY` environment variable is passed to the agent runtime. +2. **Agent behavior**: When `USE_LONG_TERM_MEMORY` is `"true"`, the Strands agent's `AgentCoreMemorySessionManager` is configured with a `retrieval_config` that reads from the `/facts/{actorId}` namespace on each turn. When `"false"` (the default), only short-term conversation history is active. +3. **Fact extraction**: AgentCore processes conversation events asynchronously and extracts factual information (e.g., "the user lives in Seattle", "the user prefers Python"). These facts are stored under `/facts/{actorId}` and retrieved on subsequent turns to personalize responses. + +### Configuration + +Toggle LTM in `infra-cdk/config.yaml`: + +```yaml +backend: + use_long_term_memory: true # Enable long-term semantic memory retrieval +``` + +Then redeploy: + +```bash +cd infra-cdk && cdk deploy --all +``` + +### Cost Considerations + +LTM incurs additional charges beyond short-term memory: + +- **Storage**: $0.75 per 1,000 memory records stored +- **Retrieval**: $0.50 per 1,000 retrieval calls + +When `use_long_term_memory` is `false`, neither cost applies — short-term memory (conversation history) is the only active feature. + +--- + +## Step 1: Configure Memory with CDK + +Memory resources are created using [CloudFormation L1 constructs](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-bedrockagentcore-memory.html). **L2 constructs will be available in future releases.** + +### Basic Memory (Short-Term Only) + +```typescript +const memory = new cdk.CfnResource(this, "AgentMemory", { + type: "AWS::BedrockAgentCore::Memory", + properties: { + Name: "MyAgentMemory", + EventExpiryDuration: 7, // Days to retain (7-365) + MemoryStrategies: [], // Empty = short-term only + MemoryExecutionRoleArn: executionRole.roleArn, + }, +}) +``` + +### Advanced Memory (With Strategies) + +```typescript +const memory = new cdk.CfnResource(this, "AgentMemory", { + type: "AWS::BedrockAgentCore::Memory", + properties: { + Name: "MyAgentMemory", + EventExpiryDuration: 30, + Description: "Memory with intelligent extraction", + MemoryStrategies: [ + { + SummaryMemoryStrategy: { + Name: "SessionSummarizer", + Namespaces: ["/summaries/{actorId}/{sessionId}"], + }, + }, + { + UserPreferenceMemoryStrategy: { + Name: "PreferenceLearner", + Namespaces: ["/preferences/{actorId}"], + }, + }, + { + SemanticMemoryStrategy: { + Name: "FactExtractor", + Namespaces: ["/facts/{actorId}"], + }, + }, + ], + MemoryExecutionRoleArn: executionRole.roleArn, + }, +}) +``` + +### Required IAM Permissions + +```typescript +new iam.PolicyStatement({ + effect: iam.Effect.ALLOW, + actions: [ + "bedrock-agentcore:CreateEvent", + "bedrock-agentcore:GetEvent", + "bedrock-agentcore:ListEvents", + "bedrock-agentcore:RetrieveMemoryRecords", + ], + resources: [memoryArn], +}) +``` + +**Permission Breakdown:** + +- `CreateEvent`, `GetEvent`, `ListEvents`: For short-term memory (conversation history) +- `RetrieveMemoryRecords`: For long-term memory (summaries, preferences, facts from strategies) + +### Understanding Memory Configuration + +For complete configuration details, see the [AgentCore Memory Overview](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/memory.html) and [Memory API Reference](https://docs.aws.amazon.com/bedrock-agentcore/latest/APIReference/welcome.html). + +**Memory Parameters** + +- **EventExpiryDuration**: 7-365 days +- **MemoryStrategies**: Empty for short-term, array for long-term +- **actor_id**: User identifier +- **session_id/thread_id**: Conversation identifier + +**Memory Strategies** + +| Strategy | Purpose | Namespace | +| ------------------------------ | ----------------------- | ---------------------------------- | +| `summaryMemoryStrategy` | Auto-summarize sessions | `/summaries/{actorId}/{sessionId}` | +| `userPreferenceMemoryStrategy` | Learn preferences | `/preferences/{actorId}` | +| `semanticMemoryStrategy` | Extract facts | `/facts/{actorId}` | + +--- + +## Step 2: Integrate with Your Framework + +### Using Strands? + +For complete Strands integration documentation, see the [official Strands Memory Integration guide](https://strandsagents.com/latest/documentation/docs/community/session-managers/agentcore-memory/). + +**Install:** + +```bash +pip install bedrock-agentcore[strands-agents] +``` + +**Code:** + +```python +import os +from strands import Agent +from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager +from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig + +memory_id = os.environ.get("MEMORY_ID") +if not memory_id: + raise ValueError("MEMORY_ID environment variable is required") + +# Basic configuration +config = AgentCoreMemoryConfig( + memory_id=memory_id, + session_id=session_id, + actor_id=user_id +) + +session_manager = AgentCoreMemorySessionManager( + agentcore_memory_config=config, + region_name=os.environ.get("AWS_DEFAULT_REGION", "us-east-1") +) + +agent = Agent( + system_prompt="You are a helpful assistant.", + model=bedrock_model, + session_manager=session_manager +) +``` + +**With strategies (if configured in CDK):** + +```python +from bedrock_agentcore.memory.integrations.strands.config import RetrievalConfig + +config = AgentCoreMemoryConfig( + memory_id=memory_id, + session_id=session_id, + actor_id=user_id, + retrieval_config={ + "/preferences/{actorId}": RetrievalConfig(top_k=5, relevance_score=0.7), + "/facts/{actorId}": RetrievalConfig(top_k=10, relevance_score=0.3) + } +) +``` + +**With long-term memory enabled** (see [Enabling Long-Term Memory](#enabling-long-term-memory) above): + +The `strands-single-agent` pattern conditionally enables LTM retrieval based on the `USE_LONG_TERM_MEMORY` environment variable. When enabled, the agent retrieves facts from the `/facts/{actorId}` namespace on each turn: + +```python +use_ltm = os.environ.get("USE_LONG_TERM_MEMORY", "false").lower() == "true" + +retrieval_config = ( + { + "/facts/{actorId}": RetrievalConfig( + top_k=10, + relevance_score=0.3, + ) + } + if use_ltm + else None +) + +config = AgentCoreMemoryConfig( + memory_id=memory_id, + session_id=session_id, + actor_id=user_id, + retrieval_config=retrieval_config, +) +``` + +**💡 Example:** See this approach implemented in `agent/strands-single-agent/basic_agent.py` + +**📚 Official AWS Guide:** [Strands SDK Memory Integration](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/strands-sdk-memory.html) + +#### Alternative: Hook-Based Approach + +For more control over memory lifecycle and custom memory operations, you can use Strands hooks with MemorySession: + +```python +from strands import Agent +from strands.hooks import AgentInitializedEvent, HookProvider, HookRegistry, MessageAddedEvent +from bedrock_agentcore.memory.session import MemorySession, MemorySessionManager +from bedrock_agentcore.memory.constants import ConversationalMessage, MessageRole + +# Initialize session manager and create session +session_manager = MemorySessionManager(memory_id=memory_id, region_name="us-east-1") +user_session = session_manager.create_memory_session( + actor_id=user_id, + session_id=session_id +) + +# Create custom hook provider +class MemoryHookProvider(HookProvider): + def __init__(self, memory_session: MemorySession): + self.memory_session = memory_session + + def on_agent_initialized(self, event: AgentInitializedEvent): + """Load recent conversation history when agent starts""" + recent_turns = self.memory_session.get_last_k_turns(k=5) + if recent_turns: + # Format and add to agent context + context_messages = [] + for turn in recent_turns: + for message in turn: + role = message['role'] + content = message['content']['text'] + context_messages.append(f"{role}: {content}") + + context = "\n".join(context_messages) + event.agent.system_prompt += f"\n\nRecent conversation:\n{context}" + + def on_message_added(self, event: MessageAddedEvent): + """Store new messages in memory""" + messages = event.agent.messages + if messages and len(messages) > 0: + message_text = messages[-1]["content"][0]["text"] + message_role = MessageRole.USER if messages[-1]["role"] == "user" else MessageRole.ASSISTANT + + self.memory_session.add_turns( + messages=[ConversationalMessage(message_text, message_role)] + ) + + def register_hooks(self, registry: HookRegistry): + registry.add_callback(MessageAddedEvent, self.on_message_added) + registry.add_callback(AgentInitializedEvent, self.on_agent_initialized) + +# Create agent with memory hooks +agent = Agent( + system_prompt="You are a helpful assistant.", + model=bedrock_model, + hooks=[MemoryHookProvider(user_session)], + tools=[...] +) +``` + +**Use when:** Custom memory loading logic, combining multiple hooks, or fine-grained control needed. + +**💡 Complete Example:** See the [AWS AgentCore Samples repository](https://github.com/awslabs/amazon-bedrock-agentcore-samples) for working code examples, including this [Strands with hooks tutorial](https://github.com/awslabs/amazon-bedrock-agentcore-samples/blob/main/01-tutorials/04-AgentCore-memory/01-short-term-memory/01-single-agent/with-strands-agent/). + +### Using LangGraph? + +For complete LangGraph integration documentation, see the [official LangGraph Memory Integration guide](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/memory-integrate-lang.html). For working code examples, explore the [LangChain AWS Integration samples](https://github.com/langchain-ai/langchain-aws/tree/main/samples/memory). + +**Install:** + +```bash +pip install langgraph-checkpoint-aws langchain-mcp-adapters +``` + +**Complete Integration with Gateway Tools:** + +```python +from langchain_aws import ChatBedrock +from langgraph.prebuilt import create_react_agent +from langgraph_checkpoint_aws import AgentCoreMemorySaver +from langchain_mcp_adapters.client import MultiServerMCPClient + +# Configure memory checkpointer +checkpointer = AgentCoreMemorySaver( + memory_id=memory_id, + region_name="us-east-1" +) + +# Create Bedrock model +bedrock_model = ChatBedrock( + model_id="us.anthropic.claude-sonnet-4-5-20250929-v1:0", + temperature=0.1, + streaming=True +) + +# Create MCP client for Gateway tools +mcp_client = MultiServerMCPClient({ + "gateway": { + "transport": "streamable_http", + "url": gateway_url, + "headers": { + "Authorization": f"Bearer {access_token}" + } + } +}) + +# Load tools from Gateway +tools = await mcp_client.get_tools() + +# Create agent with memory and tools +graph = create_react_agent( + model=bedrock_model, + tools=tools, + checkpointer=checkpointer +) + +# Invoke with actor and session +config = { + "configurable": { + "thread_id": session_id, + "actor_id": user_id + } +} + +# Stream responses +async for event in graph.astream( + {"messages": [("user", "Hello")]}, + config=config, + stream_mode="messages" +): + message_chunk, metadata = event + # Process streaming chunks +``` + +**Long-term memory (Store):** + +```python +from langgraph_checkpoint_aws import AgentCoreMemoryStore +from langchain_core.runnables import RunnableConfig +import uuid + +store = AgentCoreMemoryStore(MEMORY_ID, region_name="us-west-2") + +def pre_model_hook(state, config: RunnableConfig, *, store): + """Save messages for extraction""" + actor_id = config["configurable"]["actor_id"] + thread_id = config["configurable"]["thread_id"] + namespace = (actor_id, thread_id) + + messages = state.get("messages", []) + for msg in reversed(messages): + if isinstance(msg, HumanMessage): + store.put(namespace, str(uuid.uuid4()), {"message": msg}) + break + + return {"llm_input_messages": messages} + +graph = create_react_agent( + model=llm, + tools=tools, + checkpointer=checkpointer, + store=store, + pre_model_hook=pre_model_hook +) +``` + +--- + +## Additional Resources + +For more information and community support: + +- **Community Slack**: `#bedrock-agentcore-memory-interest` +- **All Code Examples**: [AgentCore Samples Repository](https://github.com/awslabs/amazon-bedrock-agentcore-samples) + +## Design notes + +Decisions specific to this derivative: + +- **Long-term memory (LTM) is enabled in the demo**: semantic memory strategy is always provisioned on the Memory resource; the runtime env var `USE_LONG_TERM_MEMORY` selects whether to attach an `AgentCoreMemorySessionManager` with retrieval. The cost of keeping LTM provisioned is small enough that the demo value of "the agent remembers across sessions" justifies it. +- **A meta-recall tool augments semantic search**: vector similarity does not match questions like "what did we discuss before?". A dedicated `list_long_term_memories` tool enumerates Memory records without a query so the agent can answer meta questions about its own history. diff --git a/samples/aws-specialist-agent/docs/REPLACING_COGNITO.md b/samples/aws-specialist-agent/docs/REPLACING_COGNITO.md new file mode 100644 index 0000000..046352d --- /dev/null +++ b/samples/aws-specialist-agent/docs/REPLACING_COGNITO.md @@ -0,0 +1,841 @@ +# Replacing Cognito: Identity Provider Swap & Gateway Interceptors Guide + +This document explains how to replace Amazon Cognito with another Identity Provider (IdP) in the FAST AgentCore architecture, and how to use Gateway Interceptors as an alternative or complement to Cedar Policy for access control. + +--- + +## 1. Overview + +### Current Architecture Summary + +The FAST demo uses Amazon Cognito as the Identity Provider with the following flow: + +``` +User JWT → Runtime (validates user) → Runtime gets M2M token from Cognito → Pre-Token Lambda injects user claims into M2M token → Gateway authorizer validates M2M token → Cedar Policy Engine evaluates user claims → allows/denies tool access → Target Lambda receives tool input only +``` + +**This document addresses two questions:** how the Gateway identifies the user for access control enforcement, and how to achieve this with a different IdP. + +### Two Approaches + +| Approach | When to Use | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------ | +| **Approach A: Swap IdP, Keep Cedar Policy** | The new IdP supports token enrichment (injecting custom claims into M2M tokens at issuance time) | +| **Approach B: Gateway Interceptors** | The new IdP does NOT support token enrichment, OR fully dynamic access control is needed | + +--- + +## 2. Approach A — Swap IdP, Keep Cedar Policy + +**For:** IdPs that support token enrichment — Okta (Token Inline Hooks), Auth0 (Actions), Entra ID (Claims Mapping Policies), or similar. + +### 2a. How It Works + +The architecture remains the same as the current Cognito flow. Cognito-specific components are replaced with equivalents from the new IdP: + +``` +User JWT → Runtime (validates user via new IdP's OIDC) → Runtime gets M2M token from new IdP's token endpoint → IdP's token enrichment hook injects user claims (replaces Pre-Token Lambda) → Gateway authorizer validates M2M token (via new IdP's OIDC discovery URL) → Cedar Policy Engine evaluates user claims → allows/denies (UNCHANGED) → Target Lambda receives tool input only (UNCHANGED) +``` + +**Key insight:** The AgentCore Gateway's CUSTOM_JWT authorizer is **IdP-agnostic**. The official AWS documentation states: + +> "The inbound authorizer is Identity Provider (IdP) agnostic and works with any OAuth 2.0 compatible identity provider." + +Only a valid OIDC discovery URL is needed, and the Gateway will validate tokens from any issuer. + +### 2b. What Needs to Change (Component Mapping) + +| Component | Current (Cognito) | New (Third-Party IdP) | +| ---------------------------------------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | +| Gateway authorizer discovery URL | `https://cognito-idp.{region}.amazonaws.com/{pool_id}/.well-known/openid-configuration` | `https://{your-idp}/.well-known/openid-configuration` | +| Token endpoint | `POST https://{cognito_domain}/oauth2/token` | IdP's token endpoint (e.g., `https://{okta_domain}/oauth2/v1/token`) | +| Identity propagation to token enrichment | `aws_client_metadata: {"verified_user_id": "..."}` (Cognito-specific) | IdP-specific mechanism (see below) | +| Token enrichment mechanism | Pre-Token Lambda (V3, Cognito trigger) | IdP's native hook (see below) | +| Cedar Policy | **Unchanged** — still reads `principal.getTag("department")` etc. | **Unchanged** | +| Target Lambda | **Unchanged** — receives tool input only | **Unchanged** | + +### IdP-Specific Token Enrichment Mechanisms + +| IdP | Token Enrichment Feature | How Identity Is Propagated | +| ------------ | --------------------------------- | ----------------------------------------------------------------------------------------------- | +| **Okta** | Token Inline Hooks | Hook receives client context; can enrich based on custom parameters passed in the token request | +| **Auth0** | Actions (post-client-credentials) | Actions can read metadata attached to the M2M application or use a custom `audience` parameter | +| **Entra ID** | Claims Mapping Policies | Application roles + claims mapping; can include group memberships directly in the token | +| **Cognito** | Pre-Token Lambda (V3) | `aws_client_metadata` passes user_id to the Lambda | + +### 2c. Common Concerns + +**Q: Does the LLM ever see the token?** + +No. Tokens live in the HTTP transport layer managed by the Python agent code and the MCP client library. The LLM only interacts with tool schemas and tool results — it has no access to HTTP headers or tokens. + +**Q: What if the IdP doesn't support injecting arbitrary claims into M2M tokens?** + +Use Approach B (Gateway Interceptors) described in the next section. + +--- + +## 3. Approach B — Gateway Interceptors (No Token Enrichment Needed) + +**For:** Any OIDC-compliant IdP, even those without token enrichment hooks. Also useful when fully dynamic access control is needed (e.g., permissions stored in a database that change at runtime). + +### 3a. How It Works + +Instead of enriching the M2M token with user claims, the Runtime passes user identity as a **separate custom header**. The Gateway Interceptor Lambda reads this header and makes access control decisions. + +There are two options for how the Runtime passes user identity to the Gateway: + +#### Option 1: Pass User ID Only + +The Runtime extracts the user_id from the validated user JWT and passes it as a plain string header: + +``` +User JWT → Runtime (validates user JWT via any IdP's OIDC) + → Runtime extracts user_id from validated JWT + → Runtime gets a plain M2M token from IdP (no user claims needed) + → Runtime sends to Gateway: + - Authorization: Bearer ← proves machine trust + - X-User-Id: alice@company.com ← carries user identity (plain string) + → Gateway authorizer validates M2M token only (machine trust) + → Request Interceptor Lambda fires: + - Reads X-User-Id from custom header + - Looks up user's permissions (from IdP groups, DB, YAML, etc.) + - Allows or denies the tools/call request + → Response Interceptor Lambda fires (for tools/list): + - Same permission lookup + - Filters the tool list to only show permitted tools + → Target receives tool input only (no tokens, no headers) +``` + +**Runtime code:** + +```python +# In the agent code (runs in AgentCore Runtime) +user_id = extract_user_id_from_context(context) # from validated user JWT +m2m_token = await get_m2m_token() # plain M2M, no user claims + +mcp_client = MCPClient( + gateway_url=GATEWAY_URL, + headers={ + "Authorization": f"Bearer {m2m_token}", # machine trust + "X-User-Id": user_id, # user identity (plain string) + } +) +``` + +**Interceptor reads it:** + +```python +def lambda_handler(event, context): + """Request interceptor: reads user identity from plain string header.""" + gateway_request = event['mcp']['gatewayRequest'] + headers = gateway_request.get('headers', {}) + + # Simple string extraction — no JWT decoding needed + user_id = headers.get('X-User-Id', '') + + # Look up permissions for this user (from DB, YAML, IdP API, etc.) + permissions = get_user_permissions(user_id) + # ... allow or deny based on permissions +``` + +| Pros | Cons | +| --------------------------------------- | ----------------------------------------------------------------------------- | +| Simple — no JWT decoding in interceptor | Relies on trust in the Gateway boundary | +| Low latency — no signature verification | Interceptor must call an external source (DB, IdP API) to get user attributes | +| Minimal data exposure | Cannot verify the user_id is authentic within the interceptor itself | + +**When to use:** When the Gateway boundary is the trust boundary and only a legitimate Runtime (validated by the M2M token) can set this header. + +--- + +#### Option 2: Pass Full User JWT + +The Runtime passes the original user JWT as a separate header. The interceptor can then **verify the JWT signature** to prove it hasn't been tampered with, and extract all user claims directly from it. + +``` +User JWT → Runtime (validates user JWT via any IdP's OIDC) + → Runtime keeps the original user JWT + → Runtime gets a plain M2M token from IdP (no user claims needed) + → Runtime sends to Gateway: + - Authorization: Bearer ← proves machine trust + - X-User-Token: ← carries full user identity (verifiable) + → Gateway authorizer validates M2M token only (machine trust) + → Request Interceptor Lambda fires: + - Reads X-User-Token from custom header + - Verifies the JWT signature (using IdP's public keys from JWKS endpoint) + - Extracts claims: user_id, email, groups, department, etc. + - Decides allow/deny based on claims + → Response Interceptor Lambda fires (for tools/list): + - Same JWT verification and claim extraction + - Filters the tool list based on user's claims + → Target receives tool input only (no tokens, no headers) +``` + +**Runtime code:** + +```python +# In the agent code (runs in AgentCore Runtime) +user_jwt = get_user_jwt_from_request(context) # the original user JWT (already validated by Runtime's authorizer) +m2m_token = await get_m2m_token() # plain M2M, no user claims + +mcp_client = MCPClient( + gateway_url=GATEWAY_URL, + headers={ + "Authorization": f"Bearer {m2m_token}", # machine trust + "X-User-Token": user_jwt, # full user JWT (verifiable) + } +) +``` + +**Interceptor reads and verifies it:** + +```python +import jwt +import requests +from functools import lru_cache + +# Cache the JWKS (public keys) from the IdP +@lru_cache(maxsize=1) +def get_jwks(jwks_url): + """Fetch and cache JWKS public keys from the IdP.""" + response = requests.get(jwks_url) + return response.json() + +def lambda_handler(event, context): + """Request interceptor: verifies user JWT and extracts claims.""" + gateway_request = event['mcp']['gatewayRequest'] + headers = gateway_request.get('headers', {}) + + # Extract the full user JWT + user_token = headers.get('X-User-Token', '') + + if not user_token: + return deny_request("No user token provided") + + # Verify JWT signature and extract claims + try: + # Get public keys from the IdP's JWKS endpoint + jwks = get_jwks(IDP_JWKS_URL) # e.g., https://the-idp/.well-known/jwks.json + + # Decode and verify the JWT + claims = jwt.decode( + user_token, + jwks, + algorithms=["RS256"], + audience=EXPECTED_AUDIENCE, + issuer=EXPECTED_ISSUER + ) + except jwt.ExpiredSignatureError: + return deny_request("User token expired") + except jwt.InvalidTokenError as e: + return deny_request(f"Invalid user token: {e}") + + # Extract user attributes directly from verified claims + user_id = claims.get('sub', '') + department = claims.get('department', '') + groups = claims.get('groups', []) # or 'cognito:groups' for Cognito + role = claims.get('role', 'viewer') + + # Make access control decision based on verified claims + tool_name = gateway_request['body'].get('params', {}).get('name', '') + + if not is_authorized(user_id, department, groups, role, tool_name): + return deny_request(f"User {user_id} ({department}) not authorized for {tool_name}") + + # Authorized — pass through + return { + "interceptorOutputVersion": "1.0", + "mcp": { + "transformedGatewayRequest": gateway_request + } + } +``` + +| Pros | Cons | +| -------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| Cryptographically verifiable — interceptor can prove the JWT is authentic | More complex — requires JWT library and JWKS fetching in the interceptor | +| All user claims available directly (no external lookup needed) | Slightly higher latency (signature verification + JWKS cache) | +| Defense-in-depth — even if M2M token is compromised, user JWT must also be valid | Larger header size (full JWT vs. simple string) | +| Works even when the Runtime boundary is not fully trusted | Must handle token expiry (user JWT may expire before M2M token) | + +**When to use:** When defense-in-depth is needed (two independent verifications), when multiple user claims are needed in the interceptor without calling an external service, or when security requirements demand cryptographic proof of user identity at the Gateway level. + +--- + +#### Comparison: Option 1 vs. Option 2 + +| Aspect | Option 1: X-User-Id (string) | Option 2: X-User-Token (full JWT) | +| ----------------------------- | ------------------------------------------------------------------ | --------------------------------------------------------- | +| **Security model** | Trust the Gateway boundary (M2M token proves caller is legitimate) | Verify independently (JWT signature proves user identity) | +| **What interceptor receives** | Plain user_id string | Full JWT with all claims | +| **Interceptor complexity** | Simple — just read header, look up permissions | More complex — verify JWT, extract claims | +| **External lookups needed** | Yes — must query DB/IdP for user attributes | No — claims are in the JWT | +| **Latency** | Lower (no crypto) + lookup time | Higher (crypto verification) but no lookup needed | +| **Token expiry concern** | None (it's just a string) | Must handle — user JWT may expire | +| **Spoofing risk** | Low (only valid Runtimes can reach Gateway) | None (JWT signature is cryptographic proof) | +| **Best for** | Internal systems with trusted Runtime boundary | High-security environments, zero-trust architectures | + +--- + +**Key insight (applies to both options):** The M2M token and user identity are **separate concerns**: + +- **M2M token** (in `Authorization` header) → proves the Runtime is a legitimate caller → validated by Gateway authorizer +- **User identity** (in `X-User-Id` or `X-User-Token` header) → tells the interceptor WHO the request is for → used for access control decisions + +The interceptor replaces BOTH the Pre-Token Lambda AND the Cedar Policy Engine's role in checking user identity. The Gateway authorizer still validates the M2M token (to ensure the call is legitimate), but the access control decision moves from Cedar Policy to the Interceptor Lambda. + +> **Note:** In both options, the LLM never has access to either token or header. They exist only in the HTTP transport layer managed by the agent's Python code and MCP client library. The LLM only interacts with tool schemas and tool results. + +### 3b. Request Interceptor (Controls `tools/call`) + +The request interceptor fires **BEFORE** the target Lambda executes. It decides whether to allow or deny the tool invocation. + +**Flow:** + +``` +Agent calls tools/call → Gateway → Request Interceptor Lambda → (if allowed) → Target +``` + +**What it does:** + +1. Extracts the user identity from the custom header (e.g., `X-User-Id`) +2. Identifies which tool is being invoked +3. Checks if the user has permission (via scopes, DB lookup, YAML, etc.) +4. **If authorized** → passes request through to the target +5. **If unauthorized** → returns a structured MCP error, target never executes + +**Example code:** + +```python +def lambda_handler(event, context): + """Request interceptor: controls tools/call access.""" + gateway_request = event['mcp']['gatewayRequest'] + + # Extract user identity from custom header + headers = gateway_request.get('headers', {}) + user_id = headers.get('X-User-Id', '') + + # Identify which tool is being called + tool_name = gateway_request['body'].get('params', {}).get('name', '') + target = gateway_request.get('target', '') + + # Look up permissions (from DB, YAML, IdP groups, etc.) + if not check_tool_authorization(user_id, tool_name, target): + return { + "interceptorOutputVersion": "1.0", + "mcp": { + "transformedGatewayRequest": { + "statusCode": 403, + "body": { + "error": { + "code": "UNAUTHORIZED", + "message": f"User {user_id} is not authorized to call {tool_name}" + } + } + } + } + } + + # Authorized — pass through to target + return { + "interceptorOutputVersion": "1.0", + "mcp": { + "transformedGatewayRequest": gateway_request + } + } + + +def check_tool_authorization(user_id, tool, target): + """Check if user has permission to call this tool. + + This can query a database, read a YAML config, call an IdP API, etc. + """ + user_scopes = get_user_scopes(user_id) # from DB or IdP + if target in user_scopes: + return True + return f"{target}:{tool}" in user_scopes +``` + +### 3c. Response Interceptor (Controls `tools/list`) + +The response interceptor fires **AFTER** the target responds. It filters the tool list so the agent only sees tools the user is authorized to use. + +**Flow:** + +``` +Agent calls tools/list → Gateway → Target returns ALL tools → Response Interceptor → Filtered list +``` + +**What it does:** + +1. Receives the full tool list from the target +2. Extracts user identity from the response payload headers +3. For each tool, checks if the user is authorized +4. Returns a transformed response with only permitted tools + +**Example code:** + +```python +def lambda_handler(event, context): + """Response interceptor: filters tools/list results.""" + # Extract gateway response and authorization header + gateway_response = event['mcp']['gatewayResponse'] + auth_header = gateway_response['headers'].get('Authorization', '') + + # Extract user identity (from custom header passed through) + user_id = gateway_response['headers'].get('X-User-Id', '') + + # Get tools from gateway response + tools = gateway_response['body']['result'].get('tools', []) + # Also check structuredContent (for semantic search responses) + if not tools: + tools = gateway_response['body']['result'].get('structuredContent', {}).get('tools', []) + + # Look up user permissions and filter tools + user_scopes = get_user_scopes(user_id) # from DB, YAML, IdP, etc. + filtered_tools = filter_tools_by_scope(tools, user_scopes) + + # Return transformed response with filtered tools + return { + "interceptorOutputVersion": "1.0", + "mcp": { + "transformedGatewayResponse": { + "statusCode": 200, + "headers": {"Authorization": auth_header}, + "body": { + "result": {"tools": filtered_tools} + } + } + } + } + + +def filter_tools_by_scope(tools, allowed_scopes): + """Filter tools based on user's allowed scopes.""" + filtered_tools = [] + for tool in tools: + target, action = tool['name'].split('___') + # Check if user has full target access or specific tool access + if target in allowed_scopes or f"{target}:{action}" in allowed_scopes: + filtered_tools.append(tool) + return filtered_tools +``` + +### 3d. CDK Configuration + +```typescript +import { LambdaInterceptor } from "aws-cdk-lib/aws-bedrockagentcore" + +// Request interceptor — fires BEFORE target +const requestInterceptor = LambdaInterceptor.forRequest(requestInterceptorLambda, { + passRequestHeaders: true, // Required: enables reading custom headers (X-User-Id, etc.) +}) + +// Response interceptor — fires AFTER target responds +const responseInterceptor = LambdaInterceptor.forResponse(responseInterceptorLambda, { + passRequestHeaders: true, // Required: enables reading headers in the response payload +}) + +// Attach to Gateway +const gateway = new Gateway(this, "MyGateway", { + // ... other config + interceptors: [requestInterceptor, responseInterceptor], +}) +``` + +**Important:** `passRequestHeaders: true` is required. By default, headers are NOT forwarded to interceptors for security reasons (headers may contain sensitive credentials). This must be explicitly opted in. + +### 3e. Security & Common Concerns + +**Q: Does the LLM ever touch the user token?** + +No. The token and user identity live entirely in the HTTP transport layer: + +``` +┌─────────────────────────────────────────────────────────┐ +│ AgentCore Runtime │ +│ │ +│ ┌──────────────────┐ ┌───────────────────────────┐ │ +│ │ Agent Code │ │ LLM (Bedrock) │ │ +│ │ (Python) │◄──►│ │ │ +│ │ │ │ Only sees: │ │ +│ │ Has access to: │ │ - Tool schemas │ │ +│ │ - User JWT │ │ - Tool results │ │ +│ │ - M2M token │ │ - Conversation text │ │ +│ │ - HTTP headers │ │ │ │ +│ └────────┬─────────┘ └───────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌──────────────────┐ │ +│ │ MCP Client │ ← handles HTTP transport │ +│ │ (tokens, headers │ (invisible to LLM) │ +│ │ live here) │ │ +│ └──────────────────┘ │ +└─────────────────────────────────────────────────────────┘ +``` + +The LLM only says "call tool X with input Y" — the MCP client handles all HTTP communication including tokens and headers. + +**Q: Who validates what?** + +| Component | What It Validates | Purpose | +| ------------------------------- | ----------------------------------- | ---------------------------------------------------------- | +| Gateway Authorizer (CUSTOM_JWT) | M2M token from IdP | "Is this a legitimate Runtime calling me?" (machine trust) | +| Request Interceptor Lambda | User identity from X-User-Id header | "Is THIS USER allowed to use THIS TOOL?" (access control) | + +They work in sequence: + +1. Authorizer fires first → if M2M token is invalid, request is rejected (401) +2. Interceptor fires second → if user doesn't have permission, request is denied (403) +3. Target fires last → only receives tool input (no tokens, no user context) + +**Q: Can interceptors and Cedar Policy coexist?** + +Yes. They serve complementary purposes: + +- **Cedar Policy** handles static, declarative rules (e.g., "finance department can access financial tools") +- **Interceptors** handle dynamic cases (e.g., permissions from a database that change at runtime) + +When both are active, the evaluation order is: + +1. Gateway authorizer validates the token +2. Cedar Policy Engine evaluates (if configured) +3. Interceptors fire (request before target, response after target) + +A request must pass ALL checks to succeed. + +--- + +## 4. Cedar Policy vs. Interceptors — When to Use Which + +| Feature | Cedar Policy | Gateway Interceptors | +| ---------------------------------- | ---------------------------------------- | --------------------------------------------------------------------- | +| Where filtering happens | Policy Engine (built-in, managed) | Lambda code | +| What it checks | JWT claims (tags) + context.input | User identity (from header) + any external source (DB, YAML, IdP API) | +| Dynamic? | Static rules (redeploy policy to change) | Fully dynamic (Lambda can query anything at runtime) | +| Tool filtering (tools/list) | Automatic via PartiallyAuthorizeActions | Implemented in response interceptor | +| Tool execution (tools/call) | Automatic via AuthorizeAction | Implemented in request interceptor | +| Requires token enrichment? | Yes — claims must be in the JWT | No — can read headers, query external sources | +| Input validation | Yes — `context.input.amount < 1000` | Yes — Lambda has access to the full request payload | +| Schema translation / PII redaction | No | Yes — interceptor can transform request/response | +| Multi-tenant isolation | Limited (claim-based only) | Full flexibility (can query tenant DB) | +| No code needed | Yes — declarative Cedar policies | No — requires Lambda code | + +### Guidance + +- **Use Cedar Policy when:** Access rules are based on user attributes (department, role) that don't change frequently, and simple, auditable, declarative policies are preferred without writing code. +- **Use Interceptors when:** Permissions are dynamic (stored in a DB), external services need to be called for authorization decisions, schema translation or PII redaction is needed, or the IdP doesn't support token enrichment. +- **Use both when:** Cedar handles the base rules (e.g., "only finance can access financial tools"), and interceptors handle edge cases (e.g., "but not during maintenance windows" or "only for specific tenants"). + +--- + +## 5. Using Cognito User Groups with Cedar Policy + +For teams staying with Cognito who want to leverage native Cognito groups instead of hardcoded mappings. + +### 5a. What Are Cognito User Groups? + +Cognito User Groups are a built-in feature for organizing users into logical groups (e.g., finance, engineering, admin). They provide: + +- A way to categorize users by role, department, or access level +- Automatic inclusion of group names in user authentication tokens (`cognito:groups` claim) +- IAM role association per group (for AWS resource access) + +**How users get assigned to groups:** + +| Method | When It Happens | Use Case | +| -------------------------------- | --------------------------------------- | ---------------------------------------- | +| AWS Console | Manual admin action | Ad-hoc group management | +| AdminAddUserToGroup API | Programmatic (e.g., in a Lambda) | Automated assignment during registration | +| Post-Confirmation Lambda Trigger | Automatically after user confirms email | Default group assignment for new users | +| Admin SDK / CLI | Batch operations | Bulk user management | + +**Example: Auto-assign group on registration (Post-Confirmation Lambda):** + +```python +import boto3 + +cognito = boto3.client('cognito-idp') + +def lambda_handler(event, context): + """Post-Confirmation trigger: assign new users to a default group.""" + user_pool_id = event['userPoolId'] + username = event['userName'] + + # Assign to default group based on email domain or other logic + email = event['request']['userAttributes'].get('email', '') + + if email.endswith('@finance.company.com'): + group = 'finance' + elif email.endswith('@eng.company.com'): + group = 'engineering' + else: + group = 'general' + + cognito.admin_add_user_to_group( + UserPoolId=user_pool_id, + Username=username, + GroupName=group + ) + + return event +``` + +### 5b. The Problem: Groups Aren't in M2M Tokens + +The `cognito:groups` claim is automatically included in user authentication tokens (Authorization Code flow). However, it is NOT included in M2M tokens (Client Credentials flow). + +Since the Gateway receives M2M tokens in the current architecture, Cedar Policy never sees the user's groups natively. + +``` +User Auth Token (has groups): M2M Token (NO groups): +{ { + "sub": "alice", "sub": "machine-client-id", + "cognito:groups": [ "scope": "gateway/read gateway/write", + "finance", "token_use": "access" + "admin" // No user context! + ] } +} +``` + +### 5c. The Solution: Pre-Token Lambda Reads Groups + +In the current implementation the Runtime reads the user's `cognito:groups` from the validated access token and forwards them to the Pre-Token Lambda via `aws_client_metadata`, so the Lambda needs no API call. If you switch to an IdP whose access token does not carry group memberships, the Lambda can instead call an API such as Cognito `AdminListGroupsForUser` to fetch them and inject them as custom claims in the M2M token, as shown below. + +```python +import boto3 +import os +import logging + +logger = logging.getLogger() +cognito = boto3.client('cognito-idp') + +USER_POOL_ID = os.environ.get('USER_POOL_ID') + +def lambda_handler(event, context): + """V3 Pre-Token Lambda: injects real Cognito group info into M2M token.""" + trigger_source = event.get("triggerSource", "") + + # Only process M2M (Client Credentials) flows + if trigger_source != "TokenGeneration_ClientCredentials": + return event + + # Get the verified user_id passed from the Runtime + client_metadata = event.get("request", {}).get("clientMetadata", {}) + verified_user_id = client_metadata.get("verified_user_id", "") + + if not verified_user_id: + logger.warning("No verified_user_id in clientMetadata") + return event + + # --- REPLACES HARDCODED MAPPING --- + # Fetch user's ACTUAL Cognito groups + user_groups = get_user_groups(verified_user_id) + + # Determine department and role from groups + department = resolve_department(user_groups) + role = resolve_role(user_groups) + + # Inject into M2M access token + event["response"]["claimsAndScopeOverrideDetails"] = { + "accessTokenGeneration": { + "claimsToAddOrOverride": { + "user_id": verified_user_id, + "department": department, + "role": role, + "user_groups": ",".join(user_groups), # e.g., "finance,admin" + } + } + } + + return event + + +def get_user_groups(username): + """Fetch user's Cognito groups via Admin API.""" + try: + response = cognito.admin_list_groups_for_user( + UserPoolId=USER_POOL_ID, + Username=username, + ) + return [group['GroupName'] for group in response.get('Groups', [])] + except Exception as e: + logger.error("Failed to fetch groups for user %s: %s", username, str(e)) + return [] + + +def resolve_department(groups): + """Resolve department from group membership.""" + if 'finance' in groups: + return 'finance' + elif 'engineering' in groups: + return 'engineering' + return 'guest' + + +def resolve_role(groups): + """Resolve role from group membership.""" + if 'admin' in groups: + return 'admin' + elif 'developer' in groups: + return 'developer' + return 'viewer' +``` + +### 5d. Cedar Policy Examples Using Groups + +Once group information is injected as claims, Cedar can use them for access control: + +**Option 1: Check department (resolved from groups)** + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"finance-target___generate_report", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("department") && + principal.getTag("department") == "finance" +}; +``` + +**Option 2: Check role (resolved from groups)** + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"admin-target___delete_records", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("role") && + principal.getTag("role") == "admin" +}; +``` + +**Option 3: Check raw group membership using `like`** + +```cedar +// user_groups claim contains: "finance,admin,reporting" +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"finance-target___view_reports", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("user_groups") && + principal.getTag("user_groups") like "*finance*" +}; +``` + +> **Caution with `like` on comma-separated groups:** The pattern `like "*finance*"` would also match a group named "refinance". For precise matching, use patterns like `like "finance,*"` or `like "*,finance,*"` or `like "*,finance"` — or better yet, pre-resolve to a boolean in the Lambda (see Option 4). + +**Option 4: Pre-resolved boolean (Recommended for complex group logic)** + +In the Pre-Token Lambda, resolve group membership to simple boolean claims: + +```python +claims["is_finance_team"] = "true" if "finance" in user_groups else "false" +claims["is_admin"] = "true" if "admin" in user_groups else "false" +claims["can_delete"] = "true" if "admin" in user_groups and "finance" in user_groups else "false" +``` + +Then in Cedar: + +```cedar +permit( + principal is AgentCore::OAuthUser, + action == AgentCore::Action::"admin-target___delete_records", + resource == AgentCore::Gateway::"{{GATEWAY_ARN}}" +) +when { + principal.hasTag("is_admin") && + principal.getTag("is_admin") == "true" +}; +``` + +This approach keeps complex group logic in the Lambda, while Cedar policies remain simple and readable. + +--- + +## 6. Evolution Paths + +A summary of the three paths from the current demo architecture: + +``` +Current Demo (Cognito + hardcoded user mapping in Pre-Token Lambda) + │ + ├── Path 1: Keep Cognito, use real groups + │ ├── Replace hardcoded mapping with AdminListGroupsForUser + │ ├── Cedar Policy checks group-based claims + │ └── See: Section 5 + │ + ├── Path 2: Swap IdP that supports token enrichment + │ ├── Replace Cognito with Okta/Auth0/Entra + │ ├── Use IdP's native token hook (replaces Pre-Token Lambda) + │ ├── Cedar Policy remains unchanged + │ └── See: Section 2 + │ + └── Path 3: Swap to any IdP + Gateway Interceptors + ├── No token enrichment needed + ├── Interceptors handle all access control dynamically + ├── Works with ANY OIDC-compliant IdP + └── See: Section 3 +``` + +--- + +## 7. FAQ / Quick Reference + +**Q1: Can any IdP be used with AgentCore Gateway?** + +Yes. The Gateway's CUSTOM_JWT authorizer works with any OAuth 2.0 / OIDC-compliant identity provider. Only a valid OIDC discovery URL (`.well-known/openid-configuration`) is needed. The Gateway uses this to dynamically fetch public keys and validate tokens. + +**Q2: What's the minimum change to swap IdPs?** + +If the new IdP supports token enrichment: + +1. Change the Gateway authorizer's discovery URL +2. Change the Runtime's token endpoint call +3. Replace the Pre-Token Lambda with the IdP's native token hook +4. Everything else (Cedar Policy, targets) stays the same + +**Q3: Do interceptors replace Cedar Policy?** + +They can, but they don't have to. Interceptors and Cedar Policy serve complementary purposes: + +- **Cedar Policy** = static, declarative, no-code rules based on JWT claims +- **Interceptors** = dynamic, code-based logic that can query external sources + +Either can be used alone, or both together for defense-in-depth. + +**Q4: How to choose between Approach A and B?** + +- **Choose Approach A** if the IdP supports token enrichment and access rules are relatively static (based on user attributes like department/role) +- **Choose Approach B** if the IdP doesn't support token enrichment, OR if dynamic permissions, schema translation, PII redaction, or multi-tenant isolation is needed + +**Q5: Can both Cedar Policy and interceptors be used together?** + +Yes. When both are active: + +1. Gateway authorizer validates the token first +2. Cedar Policy Engine evaluates next (if configured) +3. Interceptors fire (request before target, response after target) + +A request must pass ALL checks. This provides defense-in-depth. + +**Q6: What about Cognito user groups — can Cedar use them?** + +Yes. The `cognito:groups` claim does not appear in the M2M token itself, but it _is_ present in the user's access token. The Runtime reads it there and forwards it to the Pre-Token Lambda via `aws_client_metadata`, which injects the resulting `department`/`role` as custom claims — no `AdminListGroupsForUser` call needed. See Section 5 for full details and code examples. + +**Q7: Is passing user identity via custom header secure?** + +Yes, because: + +1. The Gateway authorizer validates the M2M token first (proving the caller is a legitimate Runtime) +2. The custom header (`X-User-Id`) is only readable by the interceptor Lambda (with `passRequestHeaders: true`) +3. The LLM do not have access to HTTP headers — they exist only in the transport layer + +The security boundary is enforced at the Gateway level. If someone tries to call the Gateway directly (without a valid M2M token), the authorizer rejects them before the interceptor even fires. diff --git a/samples/aws-specialist-agent/docs/RUNTIME_GATEWAY_AUTH.md b/samples/aws-specialist-agent/docs/RUNTIME_GATEWAY_AUTH.md new file mode 100644 index 0000000..d1da6f9 --- /dev/null +++ b/samples/aws-specialist-agent/docs/RUNTIME_GATEWAY_AUTH.md @@ -0,0 +1,591 @@ +# AgentCore M2M Authentication Workflow + +**AgentCore Runtime <--> OAuth Provider <--> Cognito <--> AgentCore Gateway** + +This document describes the complete workflow for how the AgentCore Runtime uses an OAuth2 Credential Provider (managed by AgentCore Identity) to obtain a Cognito M2M token and authenticate requests to the AgentCore Gateway. It is split into two phases: **Deployment** (infrastructure setup) and **Runtime** (live token and request flow). + +## Background: The Two Secrets + +The authentication workflow involves two secrets: + +**Secret 1:** `//machine_client_secret` + +- Created by: CDK (`secretsmanager.Secret`) + +**Secret 2:** `bedrock-agentcore-identity!default/oauth2/-runtime-gateway-auth` + +- Created by: `oauth2ProviderLambda` Custom Resource during deployment + +Secret 1 is created via `secretsmanager.Secret` and populated from the Cognito machine client's generated secret. Secret 2 is created by the `oauth2ProviderLambda` during deployment using `secretsmanager:CreateSecret` and `secretsmanager:PutSecretValue`. + +**Note:** The `bedrock-agentcore-identity!default/oauth2/-runtime-gateway-auth` namespace is the AgentCore Identity convention for OAuth2 credentials in the default Token Vault, derived from this stack's implementation. + +## Background: The Three IAM Roles + +1. **AgentCoreRole** + - Created in: CDK construct `createAgentCoreRuntime()` + - Assumed by: AgentCore Runtime + +2. **GatewayRole** + - Created in: `createAgentCoreGateway()` + - Assumed by: AgentCore Gateway service + +3. **oauth2ProviderLambda Role** + - Created by: CDK (auto-generated for Lambda function) + - Assumed by: `oauth2ProviderLambda` function + +The `GatewayRole` uses `new iam.ServicePrincipal("bedrock-agentcore.amazonaws.com")` as its trust principal. + +## Important: User Auth vs. M2M Auth -- They Are Separate + +The stack contains two distinct authentication flows that are independent of each other. Both use the same Cognito User Pool but serve different purposes. + +**Flow 1 -- Human User --> AgentCore Runtime (inbound to Runtime):** + +- Uses the human-facing Cognito app client (`userPoolClientId`) +- Configured on the Runtime via `RuntimeAuthorizerConfiguration.usingJWT(...)` pointing to the User Pool discovery URL +- Uses the Authorization Code grant (human login via frontend) +- The user's JWT token (including their `sub` claim) is passed to the Runtime and made available to agent code via the allowlisted `Authorization` header (`requestHeaderConfiguration`) + +**Flow 2 -- AgentCore Runtime --> AgentCore Gateway (M2M, outbound from Runtime):** + +- Uses the `machineClient` — a separate Cognito app client with `clientCredentials: true` and `generateSecret: true` +- Uses the Client Credentials grant (no human user involved) +- The M2M token is obtained by the Runtime via AgentCore Identity's Token Vault and used to authenticate calls to the Gateway +- The Runtime propagates the user's identity (and `cognito:groups`) into this M2M token via `aws_client_metadata` so the Gateway's Cedar policy can authorize per user — see [Identity Propagation & Cedar Policy Guide](IDENTITY_POLICY.md) + +The two flows are parallel, not nested: + +``` +Human User + --> Cognito (Authorization Code, userPoolClientId) + --> User JWT token + --> AgentCore Runtime (validates via userPoolClientId authorizer) + --> Agent code runs... + --> Needs to call Gateway + --> AgentCore Identity Token Vault (Client Credentials, machineClient) + --> Cognito issues M2M JWT (machineClient.userPoolClientId) + --> AgentCore Gateway (validates via machineClient.userPoolClientId authorizer) + --> Tool Lambda +``` + +The user's Cognito pool and the machine client both use the same Cognito User Pool for CDK convenience, and serve different authentication purposes. The user's validated identity does not change _how_ the M2M token is obtained (always Client Credentials via the Token Vault), but it _is_ carried into the token's claims via `aws_client_metadata` so the Gateway can authorize per user (see [Identity Propagation](IDENTITY_POLICY.md)). + +## PHASE 1: DEPLOYMENT WORKFLOW + +This phase runs once during `cdk deploy`. Its goal is to register the OAuth2 Credential Provider in AgentCore Identity so the Runtime can use it at runtime. + +### Step D1 -- Cognito M2M Infrastructure Setup + +CDK provisions the Cognito resources needed for M2M authentication. + +**Resources created:** + +- `UserPoolResourceServer` -- defines API scopes (read, write) under identifier `-gateway` +- `UserPoolClient` (Machine Client) -- confidential app client with `clientCredentials: true` and `generateSecret: true` +- `secretsmanager.Secret` (Secret 1) -- stores the machine client's `client_id` and `client_secret` + +**IAM Role Active:** None (CDK CloudFormation execution role handles provisioning) + +**Data Flow:** + +``` +CDK CloudFormation + --> Creates Cognito User Pool Resource Server + --> Identifier: -gateway + --> Scopes: read, write + --> Creates Cognito Machine Client + --> Grant type: CLIENT_CREDENTIALS + --> generateSecret: true --> Cognito generates client_id + client_secret + --> Stores client_secret in Secrets Manager as Secret 1 + --> Path: //machine_client_secret +``` + +**Why:** The Machine Client is the OAuth2 identity used to request M2M tokens from Cognito. The Resource Server defines what scopes those tokens are valid for. Secret 1 is the secure, CDK-managed store for the credentials that will be used in the next step. + +### Step D2 -- AgentCore Gateway Deployment with Cognito JWT Authorizer + +CDK deploys the AgentCore Gateway (`CfnGateway`) configured with a `CUSTOM_JWT` authorizer pointing to the Cognito User Pool. + +**Key configuration:** + +``` +authorizerType: "CUSTOM_JWT" +authorizerConfiguration: + customJwtAuthorizer: + discoveryUrl: https://cognito-idp..amazonaws.com//.well-known/openid-configuration + allowedClients: [ machineClient.userPoolClientId ] +``` + +**IAM Role Active:** GatewayRole + +**GatewayRole Permissions:** + +- `lambda:InvokeFunction` on `toolLambda` -- Invoke MCP tool Lambda targets +- `bedrock:InvokeModel`, `bedrock:InvokeModelWithResponseStream` +- `ssm:GetParameter`, `ssm:GetParameters` +- `cognito-idp:DescribeUserPoolClient` on User Pool ARN -- Introspect Cognito app client configuration for JWT validation +- `cognito-idp:InitiateAuth` on User Pool ARN -- Initiate Cognito auth flows for token-related operations +- `logs:CreateLogGroup`, `logs:CreateLogStream`, `logs:PutLogEvents` + +**Data Flow:** + +``` +CDK CloudFormation + --> Creates CfnGateway + --> authorizerType: CUSTOM_JWT + --> discoveryUrl: Cognito OIDC discovery URL (for JWKS fetching at runtime) + --> allowedClients: [ machineClient.userPoolClientId ] + --> Creates CfnGatewayTarget + --> Protocol: MCP + --> Target: toolLambda ARN + --> Credential provider: GATEWAY_IAM_ROLE + --> Stores Gateway URL in SSM: //gateway_url +``` + +**Why:** The `discoveryUrl` specifies which Cognito User Pool to trust for token validation and is used at runtime to fetch the JWKS (public keys) for JWT signature verification. The `allowedClients` restriction ensures only tokens issued to the machine client are accepted. + +### Step D3 -- OAuth2 Credential Provider Registration (Custom Resource) + +The `oauth2ProviderLambda` (backed by a CDK Custom Resource) runs and registers the OAuth2 Credential Provider in AgentCore Identity's Token Vault. + +**IAM Role Active:** oauth2ProviderLambda execution role (auto-created by CDK) + +**oauth2ProviderLambda Role Permissions:** + +- `secretsmanager:GetSecretValue` on Secret 1 (`//machine_client_secret`) -- Read the Cognito machine client's `client_id` and `client_secret` from CDK-managed storage. These credentials are the source of truth and must be read before they can be registered with AgentCore Identity. +- `secretsmanager:CreateSecret` on Secret 2 (`bedrock-agentcore-identity!default/oauth2/*`) -- Create a new secret in the AgentCore Identity namespace in Secrets Manager. This namespace is where the Token Vault expects to find credentials at runtime. +- `secretsmanager:PutSecretValue` on Secret 2 -- Write the `client_id` and `client_secret` values into the newly created AgentCore Identity-managed secret, so the Token Vault can read them during M2M token retrieval. +- `secretsmanager:DescribeSecret` on Secret 2 -- Check whether Secret 2 already exists before attempting to create it. This enables idempotency -- if the stack is redeployed, the Lambda will not fail trying to create a secret that already exists. +- `secretsmanager:DeleteSecret` on Secret 2 -- Remove Secret 2 when the CDK stack is destroyed. Without this, the AgentCore Identity-managed secret would remain orphaned in Secrets Manager after stack deletion. +- `bedrock-agentcore:CreateOauth2CredentialProvider` on `token-vault/default` and `token-vault/default/oauth2credentialprovider/*` -- Register the OAuth2 Credential Provider in the Token Vault, linking the provider name (`-runtime-gateway-auth`) to the Cognito discovery URL, `client_id`, and Secret 2. This is the core registration step that makes the provider available to the Runtime at runtime. +- `bedrock-agentcore:GetOauth2CredentialProvider` on `token-vault/default` and `token-vault/default/oauth2credentialprovider/*` -- Verify that the provider was successfully created after registration. Also used on re-deploy to check whether the provider already exists before attempting to create it again (idempotency). +- `bedrock-agentcore:DeleteOauth2CredentialProvider` on `token-vault/default` and `token-vault/default/oauth2credentialprovider/*` -- Remove the provider registration from the Token Vault when the CDK stack is destroyed. Without this, the provider entry would remain orphaned in the Token Vault after stack deletion. +- `bedrock-agentcore:CreateTokenVault` on `token-vault/default` and `token-vault/default/*` -- Ensure the default Token Vault exists before attempting to register the provider. If the Token Vault has not been created yet, this permission allows the Lambda to create it as a prerequisite. +- `bedrock-agentcore:GetTokenVault` on `token-vault/default` and `token-vault/default/*` -- Check the status of the default Token Vault before operating on it. Used to confirm the vault is available and ready before registering the provider. +- `bedrock-agentcore:DeleteTokenVault` on `token-vault/default` and `token-vault/default/*` -- Clean up the Token Vault on stack destruction if needed. This is a defensive cleanup permission for full teardown scenarios. + +**Data Flow:** + +``` +oauth2ProviderLambda + | + |-- 1. Reads Secret 1 + | --> Gets: client_id, client_secret + | + |-- 2. Creates Secret 2 in Secrets Manager + | --> Namespace: bedrock-agentcore-identity!default/oauth2/-runtime-gateway-auth + | --> Stores: { client_id, client_secret } + | + |-- 3. Calls bedrock-agentcore:CreateOauth2CredentialProvider + | --> Provider name: -runtime-gateway-auth + | --> discoveryUrl: Cognito OIDC discovery URL + | --> clientId: machineClient.userPoolClientId + | --> secretArn: Secret 2 ARN + | --> grantType: CLIENT_CREDENTIALS (M2M / 2LO) + | + └-- 4. Provider is now registered in Token Vault (default) + --> Provider ARN: arn:aws:bedrock-agentcore:::token-vault/default/oauth2credentialprovider/-runtime-gateway-auth +``` + +**Why:** This registration step connects the logical provider name (`GATEWAY_CREDENTIAL_PROVIDER_NAME` env var) to the actual Cognito OAuth2 configuration, enabling the Runtime to obtain M2M tokens through AgentCore Identity. + +### Step D4 -- AgentCore Runtime Deployment + +CDK deploys the AgentCore Runtime with the AgentCoreRole and environment variables, including `GATEWAY_CREDENTIAL_PROVIDER_NAME`. + +**IAM Role Active:** AgentCoreRole + +**AgentCoreRole Permissions (M2M-relevant):** + +- `bedrock-agentcore:GetOauth2CredentialProvider` on `oauth2-credential-provider/*` -- Look up the registered OAuth2 Credential Provider metadata by logical name (the value of `GATEWAY_CREDENTIAL_PROVIDER_NAME`). This is called inside the `@requires_access_token` decorator at runtime to resolve the provider name to its Cognito token URL, `client_id`, and Secret 2 reference. Without this permission, the decorator cannot initiate the token retrieval process. +- `bedrock-agentcore:GetResourceOauth2Token` on `token-vault/*` -- Request the M2M access token from the Token Vault. This is the primary permission for obtaining the Cognito JWT at runtime. The Token Vault either returns a cached valid token or fetches a new one from Cognito using the Client Credentials grant. +- `bedrock-agentcore:GetResourceOauth2Token` on `workload-identity-directory/*` -- Resolve the caller's IAM identity (AgentCoreRole) to a Workload Identity registered in the AgentCore Identity directory. The Token Vault uses this Workload Identity to scope the cached token to this specific agent, ensuring token isolation between agents even if they share the same IAM role. +- `secretsmanager:GetSecretValue` on Secret 2 (`bedrock-agentcore-identity!default/oauth2/-runtime-gateway-auth`) -- Required for IAM delegation: when the Token Vault needs to fetch a new token from Cognito (cache miss), AgentCore Identity reads Secret 2 using the Runtime's IAM role rather than its own service role. This means the Runtime must have `GetSecretValue` on Secret 2 -- not because the Runtime reads it directly, but because AgentCore Identity acts on behalf of the Runtime's role to access the credential. This design prevents privilege escalation: a caller cannot use AgentCore Identity as a proxy to access secrets it does not have direct permission to read. +- `secretsmanager:GetSecretValue` on Secret 1 (`//machine_client_secret`) -- Defensive / testing use only. The standard Token Vault flow only requires Secret 2 access (via IAM delegation). Secret 1 access allows the Runtime or test scripts running inside it to call the Cognito token endpoint directly if needed outside the Token Vault flow. This permission is not required for the standard M2M path. +- `ssm:GetParameter`, `ssm:GetParameters` on `//*` -- Read the Gateway URL (`//gateway_url`) and other configuration values from SSM Parameter Store at runtime. The Gateway URL is fetched once when `create_gateway_mcp_client()` is called and used for all subsequent MCP connections. + +**Data Flow:** + +``` +CDK CloudFormation + --> Creates AgentCore Runtime + --> Assigns AgentCoreRole as execution role + --> Sets environment variables: + GATEWAY_CREDENTIAL_PROVIDER_NAME = -runtime-gateway-auth + STACK_NAME = + MEMORY_ID = + --> Configures inbound JWT authorizer (for human users calling the Runtime): + discoveryUrl: Cognito User Pool discovery URL + allowedAudiences: [ userPoolClientId ] <-- human-facing app client, NOT machine client + --> Configures requestHeaderConfiguration: + allowlistedHeaders: [ "Authorization" ] <-- so agent code can read the user's JWT +``` + +**Why the `GATEWAY_CREDENTIAL_PROVIDER_NAME` env var:** Decouples agent code from the specific provider ARN. Agent code only needs the logical name; AgentCore Identity resolves the provider configuration. This makes agent code portable across environments and stacks. + +## PHASE 2: RUNTIME WORKFLOW + +This phase runs every time the agent code needs to call the AgentCore Gateway. Its goal is to obtain a valid Cognito M2M token and use it to authenticate the Gateway request. + +### Step R1 -- MCP Client Creation and Token Retrieval Setup + +`create_gateway_mcp_client()` is called to set up the MCP client for Gateway communication. The Gateway URL is read from SSM once at this point (it is stable and does not change). The token retrieval is deferred into a lambda factory so it runs fresh on every MCP connection and reconnection. + +**IAM Role Active:** AgentCoreRole + +**Permission Used:** `ssm:GetParameter` on `//*` (for Gateway URL lookup) + +**Data Flow:** + +``` +create_gateway_mcp_client() is called + | + |-- 1. Reads STACK_NAME from env var + | + |-- 2. Reads Gateway URL from SSM: + | ssm:GetParameter --> //gateway_url + | <-- Returns: Gateway URL (stable, fetched once) + | + └-- 3. Creates MCPClient with lambda factory: + MCPClient( + lambda: streamablehttp_client( + url=gateway_url, + headers={"Authorization": f"Bearer {_fetch_gateway_token()}"} + ), + prefix="gateway", + ) + --> Token is NOT fetched here -- deferred into the lambda + --> _fetch_gateway_token() will be called on every MCP connection/reconnection +``` + +**Why the lambda factory pattern:** This avoids the "closure trap". If `_fetch_gateway_token()` were called outside the lambda, Python's closure would capture the token value at client creation time. That token is valid for 60 minutes. If the MCP client reconnects after expiry, it would use the stale captured token and receive a 401 from the Gateway. By calling `_fetch_gateway_token()` inside the lambda, a fresh token is obtained on every MCP connection. The Token Vault's caching layer (inside the `@requires_access_token` decorator) ensures this is efficient -- if the token is still valid, the cached one is returned immediately without calling Cognito. + +**Why the SSM read is outside the lambda:** The Gateway URL is a stable infrastructure endpoint that does not change between connections. It is safe and efficient to read it once at client creation time rather than on every reconnection. + +### Step R2 -- Token Retrieval via @requires_access_token Decorator + +On each MCP connection or reconnection, the lambda factory executes and calls `_fetch_gateway_token()`. The `@requires_access_token` decorator (part of the AgentCore Identity Python SDK) intercepts this call and handles all OAuth mechanics internally. + +**IAM Role Active:** AgentCoreRole + +**Data Flow:** + +``` +Lambda factory executes (on each MCP connection/reconnection) + --> _fetch_gateway_token() is called + --> @requires_access_token decorator intercepts: + --> provider_name = GATEWAY_CREDENTIAL_PROVIDER_NAME env var + --> auth_flow = "M2M" (Client Credentials grant) + --> scopes = [] (Cognito embeds scopes based on machine client authorization) + --> custom_parameters = {"aws_client_metadata": json({verified_user_id, verified_groups})} + (user identity for the Pre-Token Lambda -- see Identity Propagation guide) + --> Decorator calls AgentCore Identity API internally (see R3 for details) + --> Decorator injects the obtained JWT as access_token argument + --> _fetch_gateway_token(access_token=) returns the JWT string + --> MCPClient uses JWT in Authorization: Bearer header +``` + +**Why auth_flow="M2M" and scopes=[]:** `auth_flow="M2M"` tells the decorator to use the Client Credentials grant (no user interaction). `scopes=[]` is correct for M2M -- the scopes (`-gateway/read`, `-gateway/write`) are embedded in the token by Cognito based on what the machine client is authorized for, so they do not need to be specified at the call site. + +**Note on decorator internals:** The `@requires_access_token` decorator is part of the AgentCore Identity Python SDK. Its internal token retrieval is a two-sub-step process described in R3 below. This is not visible in the agent code -- from the agent's perspective, the decorator is a single call that returns a token. + +### Step R3 -- Inside the Decorator: Token Retrieval from Token Vault + +Inside the `@requires_access_token` decorator, AgentCore Identity performs a two-sub-step process to obtain the token. AgentCore Identity checks the Token Vault for a cached, valid token. If none exists or the token is expired, it fetches a new one from Cognito. + +**IAM Role Active:** AgentCoreRole + +**Permissions Used:** + +- `bedrock-agentcore:GetOauth2CredentialProvider` on `oauth2-credential-provider/*` -- Provider metadata lookup (Sub-step 3a) +- `bedrock-agentcore:GetResourceOauth2Token` on `token-vault/*` -- Token retrieval from Token Vault (Sub-step 3b) +- `bedrock-agentcore:GetResourceOauth2Token` on `workload-identity-directory/*` -- Workload Identity resolution for token scoping (Sub-step 3b) +- `secretsmanager:GetSecretValue` on Secret 2 -- IAM delegation for client_secret access (cache miss only, Sub-step 3b) + +**Data Flow -- Sub-step 3a: Provider Metadata Lookup:** + +``` +@requires_access_token decorator (SDK internals) + --> bedrock-agentcore:GetOauth2CredentialProvider + --> Input: provider_name = -runtime-gateway-auth + --> AgentCore Identity looks up the provider registered in Token Vault (Step D3) + <-- Returns: + --> Provider ARN + --> Cognito token URL (derived from discoveryUrl registered in D3) + --> client_id (machineClient.userPoolClientId) + --> Reference to Secret 2 (where client_secret lives) + --> Grant type: CLIENT_CREDENTIALS +``` + +**Data Flow -- Sub-step 3b: Token Vault Check and Token Issuance:** + +**Cache Hit (token still valid):** + +``` + --> bedrock-agentcore:GetResourceOauth2Token + --> Resolves Workload Identity from AgentCoreRole ARN via workload-identity-directory + --> Checks Token Vault: token for this Workload Identity + provider = VALID (< 60 min old) + <-- Returns: cached JWT access token (no Cognito call needed) +``` + +**Cache Miss (no token or expired):** + +``` + --> bedrock-agentcore:GetResourceOauth2Token + --> Resolves Workload Identity from AgentCoreRole ARN via workload-identity-directory + --> Checks Token Vault: no valid token found + --> Reads Secret 2 using AgentCoreRole (IAM delegation) + --> Gets: client_secret + --> Calls Cognito token endpoint: + POST https://.auth..amazoncognito.com/oauth2/token + grant_type=client_credentials + client_id= + client_secret= + scope=-gateway/read -gateway/write + aws_client_metadata= + --> Cognito invokes the V3 Pre-Token Lambda, which reads the groups + and injects department/role claims (see Identity Propagation guide) + <-- Cognito returns: JWT access token (valid 60 minutes by default) + --> Stores token in Token Vault, scoped to this Workload Identity + <-- Returns: new JWT access token +``` + +**Why the Workload Identity matters:** The Token Vault stores tokens per Workload Identity, not per IAM role. This means even if two different agent runtimes shared the same IAM role, they would get separate token entries in the vault. The Workload Identity is the fine-grained, agent-level principal that ensures token isolation between agents. + +**Why IAM delegation for Secret 2:** AgentCore Identity reads Secret 2 using the caller's IAM role (AgentCoreRole), not its own service role. This is a deliberate security design: the secret is only accessible if the caller has both the `GetResourceOauth2Token` API permission AND the `secretsmanager:GetSecretValue` permission on Secret 2. This prevents privilege escalation -- a caller cannot use AgentCore Identity as a proxy to access secrets it doesn't have direct permission to read. + +**Why the Token Vault cache makes the lambda factory efficient:** Even though `_fetch_gateway_token()` is called on every MCP connection, the Token Vault cache means Cognito is only called when the token is expired (every ~60 minutes). All other calls return the cached token immediately, making the pattern both fresh and efficient. + +### Step R4 -- Agent Code Sends Request to Gateway + +The MCPClient uses the JWT returned by `_fetch_gateway_token()` to send an authenticated HTTP request to the AgentCore Gateway. + +**IAM Role Active:** AgentCoreRole + +**Data Flow:** + +``` +MCPClient lambda factory + --> streamablehttp_client( + url=gateway_url, <-- read from SSM in Step R1, stable + headers={"Authorization": f"Bearer {jwt}"} <-- fresh token from Step R2/R3 + ) + --> Sends HTTP request: + POST /mcp + Authorization: Bearer + Content-Type: application/json + { ... MCP tool invocation payload ... } +``` + +**Why:** The Gateway URL is stable (read once in R1) while the token is fresh (fetched on each connection in R2/R3). The `Authorization: Bearer` header is the standard OAuth2 mechanism for presenting a token to a protected resource. + +### Step R5 -- Gateway Validates the JWT Token + +The AgentCore Gateway receives the request and its `CUSTOM_JWT` authorizer validates the Bearer token. + +**IAM Role Active:** GatewayRole + +**Data Flow:** + +``` +AgentCore Gateway (CUSTOM_JWT authorizer) + | + |-- 1. Extracts Bearer token from Authorization header + | + |-- 2. Fetches JWKS from Cognito discovery URL: + | GET https://cognito-idp..amazonaws.com//.well-known/openid-configuration + | --> Gets JWKS URI + | GET + | --> Gets Cognito public keys for signature verification + | + |-- 3. Verifies JWT signature using JWKS public keys + | + |-- 4. Checks token claims: + | --> client_id claim ∈ allowedClients (machineClient.userPoolClientId) + | --> token not expired + | --> issuer matches Cognito User Pool + | + └-- 5. Authorization decision: + --> VALID --> forwards request to Gateway Target (Step R6) + --> INVALID --> returns 401 Unauthorized +``` + +**Why allowedClients scoping:** The AgentCore Gateway only accepts tokens issued to the specific machine client you created. Even if another Cognito client in the same User Pool obtained a token, it would be rejected. This is intentional tight scoping -- only the AgentCore Runtime's machine client can call this AgentCore Gateway. + +### Step R6 -- Gateway Forwards to MCP Tool Lambda + +The validated request is forwarded to the Gateway Target (the MCP tool Lambda). + +**IAM Role Active:** GatewayRole + +**Permission Used:** `lambda:InvokeFunction` on `toolLambda` + +**Data Flow:** + +``` +AgentCore Gateway (GatewayRole) + --> lambda:InvokeFunction on toolLambda + --> MCP tool invocation payload + <-- Lambda returns tool result + <-- AgentCore Gateway returns MCP response to AgentCore Runtime + <-- MCPClient delivers result to agent code + <-- Agent code continues execution with tool result +``` + +--- + +## APPENDIX: Replacing Cognito with an Alternative IdP for M2M Auth + +This section describes how to replace Cognito with an alternative identity provider (IdP) for the Runtime --> Gateway M2M authentication flow. The Client --> Runtime user authentication flow is independent and remains unchanged (see "User Auth vs. M2M Auth -- They Are Separate" above). + +### Scope of This Change + +The M2M flow uses the OAuth2 Client Credentials grant: the Runtime obtains a machine token using a `client_id` and `client_secret` registered with an IdP, and the Gateway validates that token using the IdP's JWKS. Neither the user's identity nor the user's token is involved at any point — the Runtime authenticates as itself, not on behalf of the user. + +**Note on future user-delegated flows:** This document covers the current Phase 1 implementation, where the Runtime-to-Gateway flow is pure M2M (Client Credentials grant). A future phase may introduce user-delegated (3-legged OAuth / Authorization Code grant) flows, where the Runtime obtains a token on behalf of the authenticated user and the Gateway receives a token carrying the user's identity. AgentCore Identity supports both flows. When that phase is implemented, the Gateway authorizer configuration and the `@requires_access_token` decorator's `auth_flow` parameter will need to be updated accordingly — the IdP swap guidance in this section applies to both flows. + +To replace Cognito in this flow, two trust relationships must be updated: + +1. **AgentCore Gateway's JWT authorizer** — must point to the new IdP's discovery URL and accept the new client's `client_id` +2. **AgentCore Identity's OAuth2 Credential Provider** — must be configured with the new IdP's discovery URL, `client_id`, and `client_secret` + +The Token Vault, `@requires_access_token` decorator, Workload Identity, and AgentCore Runtime code are IdP-agnostic and require no changes. + +### Supported IdPs + +AgentCore Identity supports two modes for OAuth2 providers: + +1. **Built-in managed providers** (pre-configured and maintained by AWS): Amazon Cognito, Auth0 by Okta, Atlassian, CyberArk, Dropbox, Facebook, FusionAuth, GitHub, Google, HubSpot, LinkedIn, Microsoft, Notion, Okta, OneLogin, Ping Identity, Reddit, Salesforce, Slack, Spotify, Twitch, X, Yandex, Zoom + +2. **CustomOauth2** (what this stack uses): Any OIDC-compliant IdP that exposes a `.well-known/openid-configuration` discovery endpoint. This is the generic path and works for all IdPs listed above. + +**Why this stack uses CustomOauth2 even though Cognito is a built-in vendor:** The built-in `AmazonCognito` vendor in AgentCore Identity is designed for user-delegated (3-legged OAuth / Authorization Code grant) flows, where an agent acts on behalf of a human user. The M2M Client Credentials grant used here does not involve a user — the Runtime authenticates as itself. `CustomOauth2` with a `discoveryUrl` is the correct path for Client Credentials / M2M flows regardless of which IdP is backing it, and it treats Cognito as a standard OIDC provider. This choice also makes the stack IdP-portable by design: swapping to a different IdP only requires changing the `discoveryUrl` and client credentials values, not the Custom Lambda code. + +For M2M (Client Credentials grant), the replacement IdP must support: + +- OAuth 2.0 Client Credentials grant (`grant_type=client_credentials`) +- OIDC Discovery (`.well-known/openid-configuration`) for JWKS-based JWT validation +- Configurable scopes on the client application +- Confidential client with a client secret + +Most enterprise IdPs support these requirements natively. Examples include Microsoft Entra ID, Okta, and Auth0 — refer to your IdP's documentation to confirm Client Credentials grant and OIDC Discovery support before proceeding. + +### CDK Stack Modifications Required + +#### 1. createMachineAuthentication() — Full replacement + +This method is Cognito-specific. It creates the `UserPoolResourceServer`, `UserPoolClient` (machine client), and `MachineClientSecret`. These resources establish the OAuth2 machine client identity and define the scopes it can request. For a different IdP, the equivalent setup is done in the IdP's own console or management tooling. + +**What this step must produce for the following steps:** + +- **`client_id`**: The OAuth2 client identifier for the machine client + - Used by: Gateway authorizer (`allowedClients`), Custom Resource (`properties.ClientId`) +- **`client_secret`**: The OAuth2 client secret for the machine client + - Used by: Stored in Secrets Manager as Secret 1 (`//machine_client_secret`) +- **Discovery URL**: The IdP's OIDC discovery endpoint + - Used by: Gateway authorizer (`discoveryUrl`), Custom Resource (`properties.DiscoveryUrl`) + +Store the `client_id` and `client_secret` in Secrets Manager at `//machine_client_secret` using the same `secretsmanager.Secret` pattern as the original. The discovery URL is a static string — store it as a variable or SSM parameter for use in the steps below. + +For IdP-specific setup (creating a confidential client, enabling Client Credentials grant, defining scopes), refer to your IdP's documentation. + +#### 2. createAgentCoreGateway() — Discovery URL and allowedClients values + +**Change A — Discovery URL variable:** + +```typescript +// Current (Cognito): +const cognitoIssuer = `https://cognito-idp.${this.region}.amazonaws.com/${this.userPool.userPoolId}` +const cognitoDiscoveryUrl = `${cognitoIssuer}/.well-known/openid-configuration` + +// Any OIDC-compliant IdP: +const discoveryUrl = `/.well-known/openid-configuration` +``` + +**Change B — CfnGateway authorizer configuration:** + +```typescript +authorizerConfiguration: { + customJwtAuthorizer: { + allowedClients: [], // replace machineClient.userPoolClientId + discoveryUrl: discoveryUrl, // replace cognitoDiscoveryUrl + }, +}, +``` + +**Change C — Remove Cognito-specific IAM permissions from GatewayRole:** + +```typescript +// Remove these — they are Cognito-specific and not needed for other IdPs: +// cognito-idp:DescribeUserPoolClient +// cognito-idp:InitiateAuth +``` + +**Why**: The Gateway uses the `discoveryUrl` to fetch the IdP's JWKS at runtime for JWT signature verification. The `allowedClients` restriction ensures only tokens issued to your specific machine client are accepted. The Cognito IAM permissions are only needed for Cognito-specific API calls; other IdPs use standard OIDC/JWKS endpoints that do not require AWS IAM permissions. + +#### 3. Custom Resource properties — Values only, no Lambda code change + +The `oauth2ProviderLambda` code is already IdP-agnostic. It uses `credentialProviderVendor="CustomOauth2"` with a generic `discoveryUrl` — no code changes are required. Only the properties passed to the Custom Resource change: + +```typescript +const runtimeCredentialProvider = new cdk.CustomResource(this, "RuntimeCredentialProvider", { + serviceToken: oauth2Provider.serviceToken, + properties: { + ProviderName: providerName, + ClientSecretArn: this.machineClientSecret.secretArn, // same pattern, new IdP secret + DiscoveryUrl: discoveryUrl, // new IdP discovery URL + ClientId: , // new IdP client_id + }, +}) +``` + +**Why**: The Lambda reads whatever `DiscoveryUrl` and `ClientId` are passed in and registers them with AgentCore Identity as a `CustomOauth2` provider. The Token Vault then uses these values to call the correct IdP token endpoint at runtime. The Lambda's `handle_create`, `handle_update`, and `handle_delete` handlers require zero changes. + +**Note on built-in vendors**: If you want to use a built-in vendor (listed in the Supported IdPs section above) instead of `CustomOauth2`, change `credentialProviderVendor` in `handle_create` and `handle_update` in the Lambda. Built-in vendors have AWS-managed endpoint configurations and may handle provider-specific quirks automatically. However, `CustomOauth2` with a discovery URL works for all OIDC-compliant IdPs and is simpler to maintain across environments. + +#### 4. createAgentCoreRuntime() — No changes required + +The Runtime only knows the `GATEWAY_CREDENTIAL_PROVIDER_NAME` environment variable. It does not know or care which IdP backs the provider. The Token Vault resolves the IdP interaction transparently using the configuration registered in Step D3. + +#### 5. createCognitoSSMParameters() — Rename Cognito-specific parameters (optional) + +The SSM parameters `cognito-user-pool-id`, `cognito-user-pool-client-id`, and `cognito_provider` are Cognito-specific by name. For a different IdP, rename these to IdP-agnostic equivalents (e.g., `idp-discovery-url`, `machine-client-id`). The `gateway_url` and `machine_client_id` parameters are already IdP-agnostic. + +--- + +### Summary: What Changes vs. What Does Not + +**Components that require changes:** + +- **createMachineAuthentication()** — Full replacement required + - Cognito-specific resources must be replaced with equivalent IdP client setup + - Must produce: `client_id`, `client_secret`, Discovery URL +- **CfnGateway authorizerConfiguration** — Update values + - Change `discoveryUrl` to new IdP's OIDC discovery endpoint + - Change `allowedClients` to new IdP's `client_id` +- **GatewayRole IAM permissions** — Remove Cognito-specific permissions + - Remove `cognito-idp:DescribeUserPoolClient` + - Remove `cognito-idp:InitiateAuth` +- **Custom Resource properties** — Update values only + - Change `DiscoveryUrl` to new IdP's discovery endpoint + - Change `ClientId` to new IdP's `client_id` + - Change `ClientSecretArn` to point to new IdP secret in Secrets Manager +- **SSM parameter names** — Optional rename (cosmetic only) + - Rename Cognito-specific parameter names to IdP-agnostic equivalents if desired + +**Components that require NO changes:** + +- **oauth2ProviderLambda code** — Already IdP-agnostic + - Uses generic `CustomOauth2` vendor with `discoveryUrl` parameter + - No code changes needed in `handle_create`, `handle_update`, or `handle_delete` + - **Optional**: Can switch to built-in vendor by changing `credentialProviderVendor` in Lambda code, but `CustomOauth2` works for all OIDC-compliant IdPs +- **createAgentCoreRuntime()** — Already IdP-agnostic + - Only knows `GATEWAY_CREDENTIAL_PROVIDER_NAME` environment variable + - Token Vault resolves IdP interaction transparently +- **Agent code** — Already IdP-agnostic + - Uses `@requires_access_token` decorator which is IdP-agnostic + - No changes needed in agent code regardless of which agent pattern is used +- **Client → Runtime user authentication** — Independent flow + - Separate concern from Runtime → Gateway M2M authentication + - Not affected by M2M IdP changes diff --git a/samples/aws-specialist-agent/docs/SKILLS.md b/samples/aws-specialist-agent/docs/SKILLS.md new file mode 100644 index 0000000..0baf9a2 --- /dev/null +++ b/samples/aws-specialist-agent/docs/SKILLS.md @@ -0,0 +1,19 @@ +# Skills + +This deployment mounts a curated set of "skills" (self-describing capability bundles) into the runtime via S3 Files. Skills are how the agent gains domain knowledge without bloating the model's system prompt. + +## How skills are mounted + +- Skills live under `skills/agent-toolkit-for-aws/` (pinned third-party content, kept verbatim with their LICENSE/NOTICE) and `skills/aws-specialist-agent/` (skills authored for this project). +- A build step (`scripts/build-project-guide.py`) assembles the project-specific guide and uploads everything to an S3 bucket. +- The AgentCore Runtime container mounts the bucket via S3 Files at a known path. The agent loads skills lazily by reading `SKILL.md` for each capability it needs. + +## Design notes + +- **S3 Files over a packed image**: skills change more often than the runtime image. Mounting via S3 Files lets a skill update propagate without redeploying the runtime. +- **Vendored, not submoduled**: third-party skills were originally consumed via a git submodule, then switched to a vendored copy with a pinned commit hash recorded next to the LICENSE. Vendoring avoids supply-chain surprises and lets the build run without submodule init. +- **Mount path vs. VPC trade-off**: S3 Files requires the runtime to reach S3. In closed-network deployments this means provisioning an S3 (Gateway) endpoint. The trade-off (extra endpoint vs. ability to update skills out of band) was resolved in favour of S3 Files. +- **Strict IAM on the S3 Files execution role**: the role that the runtime uses to fetch skills is scoped to the specific bucket/prefix used for skills and validated against AgentCore's IAM requirements at deploy time. +- **Self-describing project guide**: `skills/aws-specialist-agent/fast-project-guide/` is generated from the live source tree (sanitized) so the deployed agent can answer questions like "how is this app put together?" against the actual code, not a stale doc. +- **Official Code Interpreter**: the AgentCore-provided Code Interpreter tool is used directly rather than reimplementing a sandbox; framework-specific wrappers (`tools/code_interpreter/`) bridge it to the chosen agent SDK. +- **Auxiliary Lambdas attached to the closed VPC**: helper Lambdas (feedback, history, session, oauth2-provider, zip-packager, pre-token) all run inside the same VPC as the runtime to keep traffic on the private path; their security groups allow only the explicit endpoints they need. diff --git a/samples/aws-specialist-agent/docs/STREAMING.md b/samples/aws-specialist-agent/docs/STREAMING.md new file mode 100644 index 0000000..2fa8448 --- /dev/null +++ b/samples/aws-specialist-agent/docs/STREAMING.md @@ -0,0 +1,331 @@ +# Streaming Guide for Agents + +## Overview + +Your agent sends streaming events in SSE format. This guide explains how to integrate streaming with frontend. + +## Integration Steps + +1. **Your agent sends streaming events** (SSE format) +2. **The `agentcore-client` library** reads the SSE stream and routes it to the appropriate parser: + - For **Strands agents (default)**: `frontend/src/lib/agentcore-client/parsers/strands.ts` — parses Strands schema events + - For **LangGraph agents**: `frontend/src/lib/agentcore-client/parsers/langgraph.ts` + - For **Bedrock Converse (generic)**: `frontend/src/lib/agentcore-client/parsers/converse.ts` — parses raw Bedrock Converse stream events + - For **other agent frameworks**: Create a new parser and register it in `frontend/src/lib/agentcore-client/client.ts` +3. **Parsers emit typed `StreamEvent`s** (text, tool_use_start, tool_use_delta, tool_result, message, result, lifecycle) +4. **`ChatInterface.tsx`** handles events and builds message segments (interleaved text + tool calls) +5. **`ChatMessage.tsx`** renders segments inline with markdown formatting and tool call components + +--- + +## Current Implementation + +### Backend: Strands Agent + +**File:** `agent/strands-single-agent/basic_agent.py` + +The backend yields all raw Strands streaming events, serialized to JSON-safe dicts: + +```python +async for event in agent.stream_async(user_query): + yield json.loads(json.dumps(dict(event), default=str)) +``` + +**Note:** Strands events can contain non-JSON-serializable Python objects (agent instances, UUIDs, `ModelStopReason` tuples, etc.). The `json.dumps(default=str)` call converts these to strings, ensuring all events are safe to send over SSE. + +### Frontend: Event Parser + +**File:** `frontend/src/lib/agentcore-client/parsers/strands.ts` + +The default parser for `strands-single-agent` handles Strands schema events: + +```typescript +export const parseStrandsChunk: ChunkParser = (line, callback) => { + if (!line.startsWith("data: ")) return; + const json = JSON.parse(line.substring(6).trim()); + + // Text token: {"data": "Hello"} + if (typeof json.data === "string") { + callback({ type: "text", content: json.data }); + } + + // Tool use: {"current_tool_use": {...}, "delta": {"toolUse": {"input": "..."}}} + if (json.current_tool_use) { + // First delta (empty input) → tool_use_start + // Subsequent deltas → tool_use_delta + } + + // Tool result: {"message": {"role": "user", "content": [{"toolResult": {...}}]}} + if (json.message?.role === "user") { + // Extract toolResult blocks → callback({ type: "tool_result", ... }) + } + + // Completion: {"result": {"stop_reason": "end_turn"}} + if (json.result) { + callback({ type: "result", stopReason: "end_turn" }); + } + + // Lifecycle: {"init_event_loop": true} + if (json.init_event_loop || json.start_event_loop) { ... } +}; +``` + +See the full implementation in the source file for edge cases. + +### Event Structure + +Strands provides these event types: + +- `data`: Text chunks (accumulate as they arrive) +- `current_tool_use`: Tool name, ID, and input parameters (with `delta` for streaming) +- `message`: Final structured message with full content (assistant with `toolUse`, user with `toolResult`) +- `result`: AgentResult with stop reason and metrics +- `init_event_loop`, `start_event_loop`, `complete`: Lifecycle markers +- `tool_stream_event`: Events streamed from tool execution +- `event`: Raw Bedrock Converse events (used by the alternative converse parser below) + +```javascript +// Text streaming +data: {"data": "Hello"} +data: {"data": " there"} + +// Tool use start — first delta has empty input +data: {"current_tool_use": {"toolUseId": "tool_abc123", "name": "text_analysis"}, "delta": {"toolUse": {"input": ""}}} + +// Tool input streaming +data: {"current_tool_use": {"toolUseId": "tool_abc123", "name": "text_analysis"}, "delta": {"toolUse": {"input": "{\"text\": \"hello\"}"}}} + +// Complete assistant message +data: {"message": {"role": "assistant", "content": [{"toolUse": {"toolUseId": "tool_abc123", "name": "text_analysis", "input": {"text": "hello"}}}]}} + +// Tool result (user message with toolResult blocks) +data: {"message": {"role": "user", "content": [{"toolResult": {"toolUseId": "tool_abc123", "content": [{"text": "Analysis complete: 1 word"}]}}]}} + +// Final result +data: {"result": {"stop_reason": "end_turn"}} + +// Lifecycle events +data: {"init_event_loop": true} +data: {"start_event_loop": true} +``` + +**Reference:** [Strands Streaming Documentation](https://strandsagents.com/latest/documentation/docs/user-guide/concepts/streaming/overview/) + +--- + +## Alternative: Using Raw Converse Events + +Instead of parsing Strands schema events, you can parse the raw Bedrock Converse events nested under the `event` key. This gives you lower-level access to the Converse stream API structures. + +**Note:** Tool results are not emitted as Converse stream events — they are an input to the next `converse_stream` call. Strands handles this internally and emits tool results as `message` events. The converse parser does not handle tool results; instead, `ChatInterface.tsx` marks tools as complete when the next text segment starts streaming. + +### Frontend Parser + +**File:** `frontend/src/lib/agentcore-client/parsers/converse.ts` + +To use this parser instead of the default strands parser, update `client.ts`: + +```typescript +import { parseConverseChunk } from "./parsers/converse"; + +const PARSERS: Record = { + "strands-single-agent": parseConverseChunk, // Switch to Converse parser + ... +}; +``` + +The parser handles raw Bedrock Converse events: + +```typescript +export const parseConverseChunk: ChunkParser = (line, callback) => { + if (!line.startsWith("data: ")) return; + const json = JSON.parse(line.substring(6).trim()); + + const event = json.event; + if (event) { + // Text streaming + if (event.contentBlockDelta?.delta?.text) { + callback({ type: "text", content: event.contentBlockDelta.delta.text }); + } + + // Tool use start + if (event.contentBlockStart?.start?.toolUse) { + const toolUse = event.contentBlockStart.start.toolUse; + callback({ type: "tool_use_start", toolUseId: toolUse.toolUseId, name: toolUse.name }); + } + + // Tool use input streaming + if (event.contentBlockDelta?.delta?.toolUse?.input) { + callback({ type: "tool_use_delta", toolUseId: currentToolUseId, input: ... }); + } + + // Message stop + if (event.messageStop?.stopReason) { + callback({ type: "result", stopReason: event.messageStop.stopReason }); + } + } +}; +``` + +See the full implementation in the source file for edge cases. + +### Event Structure + +Converse events are nested under the `event` key: + +```javascript +// Message lifecycle +data: {"event": {"messageStart": {"role": "assistant"}}} + +// Text streaming +data: {"event": {"contentBlockDelta": {"contentBlockIndex": 0, "delta": {"text": "Hello"}}}} +data: {"event": {"contentBlockDelta": {"contentBlockIndex": 0, "delta": {"text": " there"}}}} + +// Tool use start +data: {"event": {"contentBlockStart": {"contentBlockIndex": 1, "start": {"toolUse": {"toolUseId": "tool_abc123", "name": "text_analysis"}}}}} + +// Tool use input streaming +data: {"event": {"contentBlockDelta": {"contentBlockIndex": 1, "delta": {"toolUse": {"input": "{\"text\": \"hello\"}"}}}}} + +// Content block and message completion +data: {"event": {"contentBlockStop": {"contentBlockIndex": 0}}} +data: {"event": {"messageStop": {"stopReason": "end_turn"}}} + +// Metadata +data: {"event": {"metadata": {"usage": {"inputTokens": 88, "outputTokens": 30}}}} +``` + +**Reference:** [Bedrock Converse Stream API](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock-runtime/client/converse_stream.html) + +--- + +## LangGraph/LangChain Implementation + +**Note:** LangGraph uses tuple-based streaming `(message_chunk, metadata)` and returns LangChain message objects with content as an array. + +### Backend + +When a LangGraph agent streams with `messages` mode, it yields raw LangChain message chunks: + +```python +# Stream with messages mode - yields raw LangChain message chunks +async for event in graph.astream( + {"messages": [("user", user_query)]}, + config=config, + stream_mode="messages" +): + message_chunk, metadata = event + yield message_chunk.model_dump() # Serialize to JSON-safe dict +``` + +### Event Structure + +LangGraph emits LangChain message objects that serialize to JSON with content as an **array of content blocks**: + +```javascript +// Text streaming (AIMessageChunk) +data: {"content": [{"type": "text", "text": "Hello", "index": 0}], "type": "AIMessageChunk", ...} +data: {"content": [{"type": "text", "text": " there", "index": 0}], "type": "AIMessageChunk", ...} + +// Tool use start — content block has id and name +data: {"content": [{"type": "tool_use", "id": "tool_abc123", "name": "text_analysis", "input": {}, "index": 1}], "type": "AIMessageChunk", ...} + +// Tool input streaming — partial_json carries incremental input +data: {"content": [{"type": "tool_use", "partial_json": "{\"text\":", "index": 1}], "type": "AIMessageChunk", ...} +data: {"content": [{"type": "tool_use", "partial_json": " \"hello\"}", "index": 1}], "type": "AIMessageChunk", ...} + +// Tool response (ToolMessage — separate message type) +data: {"content": "Tool result text", "type": "tool", "name": "text_analysis", "tool_call_id": "tool_abc123", ...} + +// Stop reason +data: {"content": [], "type": "AIMessageChunk", "response_metadata": {"stop_reason": "end_turn"}, ...} + +// Final chunk with usage metadata +data: {"content": [], "type": "AIMessageChunk", "chunk_position": "last", "usage_metadata": {"input_tokens": 88, "output_tokens": 30}} +``` + +**Current parser handles:** + +- `AIMessageChunk` with `content[].type === "text"`: Text tokens for display +- `AIMessageChunk` with `content[].type === "tool_use"` + `id` + `name`: Tool call start +- `AIMessageChunk` with `content[].type === "tool_use"` + `partial_json`: Streaming tool input +- `type === "tool"` (ToolMessage): Tool execution result +- `response_metadata.stop_reason`: Stream completion + +**Key difference from Strands:** LangGraph's `content` is always an array of typed blocks (text, tool_use), not a flat string. Tool results come as separate `ToolMessage` objects, not nested in user messages. + +### Frontend Parser + +**File:** `frontend/src/lib/agentcore-client/parsers/langgraph.ts` + +Same pattern — parses SSE lines and emits typed events. LangGraph uses LangChain message types: + +```typescript +export const parseLanggraphChunk: ChunkParser = (line, callback) => { + if (!line.startsWith("data: ")) return + const json = JSON.parse(line.substring(6).trim()) + + // Tool result: {"type": "tool", "tool_call_id": "...", "content": "result"} + if (json.type === "tool") { + callback({ type: "tool_result", toolUseId: json.tool_call_id, result: json.content }) + } + + // AIMessageChunk — content is an array of blocks + if (json.type === "AIMessageChunk" && Array.isArray(json.content)) { + for (const block of json.content) { + if (block.type === "text" && block.text) { + callback({ type: "text", content: block.text }) + } + if (block.type === "tool_use" && block.id && block.name) { + callback({ type: "tool_use_start", toolUseId: block.id, name: block.name }) + } + } + + // Stop reason from response metadata + if (json.response_metadata?.stop_reason) { + callback({ type: "result", stopReason: json.response_metadata.stop_reason }) + } + } +} +``` + +See the full implementation for tool input delta streaming and edge cases. + +**Key Points:** + +- Filter by `type === 'AIMessageChunk'` to only process assistant responses +- Ignore `ToolMessage` and other internal message types +- `content` is an **array of content blocks**, not a string +- Each block has `type`, `text`, and `index` fields +- Filter for `type === 'text'` to extract text content +- Join multiple text blocks if present + +**Why Content is an Array:** +LangChain uses content blocks to support multimodal messages (text, images, tool calls) following the Anthropic/OpenAI message format. + +**References:** + +- [LangGraph Streaming](https://docs.langchain.com/oss/python/langgraph/streaming) +- [LangChain Streaming](https://docs.langchain.com/oss/python/langchain/streaming) + +--- + +## Adding a New Agent Pattern + +1. Create `agent/my-pattern/` with your agent code +2. Create a parser: `frontend/src/lib/agentcore-client/parsers/my-pattern.ts` + - Export a `ChunkParser` function that converts SSE lines into `StreamEvent`s via `callback()` +3. Register it in `frontend/src/lib/agentcore-client/client.ts` (add to the parser map in the constructor) +4. Set `pattern: my-pattern` in `infra-cdk/config.yaml` + +--- + +## Debugging + +Enable console logging in the parser: + +```javascript +console.log("[Streaming Event]", data) +``` + +Open browser console (F12) to see all events from your agent. diff --git a/samples/aws-specialist-agent/docs/TOOL_AC_CODE_INTERPRETER.md b/samples/aws-specialist-agent/docs/TOOL_AC_CODE_INTERPRETER.md new file mode 100644 index 0000000..9970ecf --- /dev/null +++ b/samples/aws-specialist-agent/docs/TOOL_AC_CODE_INTERPRETER.md @@ -0,0 +1,175 @@ +# AgentCore Code Interpreter Integration + +This document explains the architectural decisions for integrating Amazon Bedrock AgentCore Code Interpreter into FAST. + +## What is AgentCore Code Interpreter? + +Amazon Bedrock AgentCore Code Interpreter is a fully managed capability that enables AI agents to execute code securely in isolated sandbox environments. Key features: + +- Secure code execution in containerized environments +- Multiple language support (Python, JavaScript, TypeScript) +- Pre-built runtimes with common libraries +- Session management with state persistence +- Long execution duration (default 15 minutes, up to 8 hours) + +**Documentation**: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-tool.html + +## Why Direct Integration (Not Gateway)? + +FAST integrates Code Interpreter **directly into agents** rather than through the Gateway. Here's why: + +### Approach 1: Direct Integration ✅ (Chosen) + +**Architecture**: `Agent → Code Interpreter SDK → Code Interpreter Service` + +**Pros**: + +- **Simpler implementation** - Minimal code, no additional infrastructure +- **Lower latency** - No Gateway/Lambda hops +- **Lower cost** - No Lambda invocations +- **Session management** - Code Interpreter maintains state across calls +- **Follows AWS patterns** - Matches official documentation examples +- **Better error handling** - Direct access to Code Interpreter errors + +**Cons**: + +- Not discoverable through Gateway +- Requires agent redeployment for updates +- Tool logic lives in agent code + +### Approach 2: Gateway Integration ❌ (Not Chosen) + +**Architecture**: `Agent → Gateway → Lambda → Code Interpreter SDK → Code Interpreter Service` + +**Pros**: + +- Consistent with Gateway pattern +- Discoverable through MCP +- Independent deployment + +**Cons**: + +- **More complex** - Lambda wrapper + Gateway target + IAM roles +- **Higher latency** - Additional hops in request path +- **Higher cost** - Lambda invocations + Code Interpreter usage +- **Session complexity** - Lambda must manage sessions across cold starts +- **No AWS references** - No official examples of this pattern +- **Not intended use case** - Code Interpreter is a built-in service, not a custom tool + +### Decision Rationale + +Code Interpreter is a **built-in AgentCore service**, similar to Bedrock models or AgentCore Memory. AWS designed it for direct integration, not to be proxied through Gateway. Gateway is meant for **custom Lambda-based tools**, not built-in services. + +**Comparison**: + +| Aspect | Direct | Gateway | +| ----------- | ---------------- | -------------- | +| Complexity | Low | High | +| Latency | ~100ms | ~300-500ms | +| Cost | CI only | Lambda + CI | +| AWS Pattern | ✅ Documented | ❌ No examples | +| Use Case | Built-in service | Custom tools | + +## Implementation Architecture + +The agent uses the official Strands Code Interpreter tool +(`strands_tools.code_interpreter.AgentCoreCodeInterpreter`) directly, rather +than a hand-written wrapper. The integration lives entirely in the agent +entrypoint: + +``` +agent/strands-single-agent/ +└── basic_agent.py # Imports AgentCoreCodeInterpreter and registers its tool +``` + +### Key Components + +**Agent Integration** (`agent/strands-single-agent/basic_agent.py`): + +```python +from strands_tools.code_interpreter import AgentCoreCodeInterpreter + +# Bind the sandbox to the conversation session so repeat calls in the same +# conversation reconnect to the same AgentCore sandbox (warm reconnect) +# instead of cold-creating a new one. +code_interpreter_tool = AgentCoreCodeInterpreter( + region=region, session_name=session_id +) + +# Register the tool alongside the Gateway MCP client and file_read. +tools = [gateway_client, code_interpreter_tool.code_interpreter, file_read] +``` + +### Design Principles + +1. **Use the maintained tool** - the official `strands_tools` Code Interpreter + tracks the AgentCore Code Interpreter API, so there is no in-repo wrapper to + keep in sync. +2. **Session-bound sandbox** - `session_name` is set to the conversation + `session_id`, so the tool's module-level cache reconnects to the same + sandbox across invocations (warm reconnect vs cold create). This compounds + with the VPC cold-start mitigation. +3. **Direct integration** - the tool talks to the Code Interpreter service + directly (no Gateway/Lambda hop), as argued in the decision above. + +## Benefits of This Architecture + +1. **Less code to maintain**: no hand-written wrapper; the official tool owns + the API surface. +2. **Performance**: direct integration = lower latency; warm reconnect avoids + repeated cold starts within a conversation. +3. **Cost**: no Lambda overhead. +4. **Simplicity**: follows AWS documented patterns. + +## Usage + +The agent automatically uses Code Interpreter when users request code execution: + +**Example prompts**: + +- "Calculate the factorial of 20" +- "Create a list of the first 50 Fibonacci numbers" +- "Generate 100 random numbers and calculate statistics" + +The tool is registered as `execute_python_securely` to emphasize security vs built-in Python execution. + +## Session Management + +- **Automatic**: Code Interpreter creates sessions on first use +- **Persistence**: Sessions maintain state across multiple calls (`clearContext=False`) +- **Cleanup**: AgentCore automatically cleans up inactive sessions after timeout +- **Manual cleanup**: Optional via `cleanup()` method for immediate resource release + +## Testing + +**Local Docker Build**: + +```bash +docker build -f agent/strands-single-agent/Dockerfile -t test-agent . +docker run --rm test-agent python -c "from strands_tools.code_interpreter import AgentCoreCodeInterpreter; print('✓ Import successful')" +``` + +**Deployment**: + +```bash +cd infra-cdk +cdk deploy +``` + +**Frontend Testing**: Use prompts that require code execution to verify functionality. + +## Future Enhancements + +Potential improvements: + +- Add `write_files` tool for file operations +- Add `list_files` tool to see sandbox contents +- Support JavaScript/TypeScript execution +- Add file upload from S3 +- Implement custom timeout configuration + +## References + +- [AgentCore Code Interpreter Documentation](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-tool.html) +- [AWS IDP Reference Implementation](https://github.com/aws-solutions-library-samples/accelerated-intelligent-document-processing-on-aws) +- [FAST Gateway Documentation](./GATEWAY.md) diff --git a/samples/aws-specialist-agent/docs/VERSION_BUMP_PLAYBOOK.md b/samples/aws-specialist-agent/docs/VERSION_BUMP_PLAYBOOK.md new file mode 100644 index 0000000..9dbd88d --- /dev/null +++ b/samples/aws-specialist-agent/docs/VERSION_BUMP_PLAYBOOK.md @@ -0,0 +1,69 @@ +# Version Bump Playbook + +This document provides a checklist for bumping the version of FAST (Fullstack AgentCore Solution Template). + +## Files Requiring Manual Updates (6 files) + +1. **`VERSION`** - Root version file +2. **`pyproject.toml`** - Python package version (`version = "X.Y.Z"`) +3. **`frontend/package.json`** - Frontend package version (`"version": "X.Y.Z"`) +4. **`infra-cdk/package.json`** - CDK package version (`"version": "X.Y.Z"`) +5. **`infra-cdk/lib/fast-main-stack.ts`** - Stack description (`(vX.Y.Z)`) +6. **`CHANGELOG.md`** - Add new version entry at top + +## Auto-Generated Files (DO NOT manually update) + +- `frontend/package-lock.json` +- `infra-cdk/package-lock.json` +- `infra-cdk/lib/fast-main-stack.js` + +## Procedure + +### 1. Update Source Files + +Manually update the 7 files listed above with the new version number. + +### 2. Regenerate Auto-Generated Files + +```bash +# Frontend +cd frontend && npm install + +# Infrastructure +cd infra-cdk && npm install && npm run build +``` + +### 3. Verification + +Search for any remaining old version references: + +```bash +find . -type f \( -name "*.md" -o -name "*.py" -o -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.json" -o -name "*.yaml" -o -name "*.yml" -o -name "VERSION" \) | grep -v node_modules | grep -v cdk.out | grep -v ".next" | grep -v "dist" | grep -v "build" | grep -v "__pycache__" | xargs grep -n "OLD_VERSION" 2>/dev/null +``` + +### 4. Testing + +```bash +make all # Run linting +cd infra-cdk && cdk synth # Test CDK synthesis +cd frontend && npm run build # Test frontend build +``` + +### 5. Git Operations + +```bash +git add . +git commit -m "Bump version to X.Y.Z" +git push origin main + +# Create and push tag +git tag vX.Y.Z +git push origin vX.Y.Z +``` + +## Notes + +- Follow semantic versioning (MAJOR.MINOR.PATCH) +- Use `v` prefix for git tags (e.g., `v0.1.3`) +- Only update project version, not dependency versions +- Keep historical changelog entries unchanged diff --git a/samples/aws-specialist-agent/docs/architecture-diagram/aws-specialist-agent-architecture.drawio b/samples/aws-specialist-agent/docs/architecture-diagram/aws-specialist-agent-architecture.drawio new file mode 100644 index 0000000..9a1e0b4 --- /dev/null +++ b/samples/aws-specialist-agent/docs/architecture-diagram/aws-specialist-agent-architecture.drawio @@ -0,0 +1,528 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/aws-specialist-agent/docs/architecture-diagram/aws-specialist-agent-architecture.png b/samples/aws-specialist-agent/docs/architecture-diagram/aws-specialist-agent-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..e07e73b555bad51c0bffb5cc21d88c9266e9eb91 GIT binary patch literal 623644 zcmeFZWn7eN*e{B@EKpcV8H9>-gOrqtfOHKAL#cFk=Mt4ADc#+Tzz|Z3QbS31mvn>l zzD8i}{hqJq)A^n4hqb7g=Xvh?iho@9e3X?Iy^ehc8w(5Ty4Z{7@>p2cX0foYVqG~8 zKRHsQQ^CUe8%yl@Q-po=;_zjAg6@&}wIJgcGB2Lp3&8piOLOb_J*7x%;d?}0_tKTI z3|=CBoTqu9^u()I`tz!n{Bwf89=?*oN}(lvc9kR9*s*_#e{tMza+xZ5kxA^gYplyQ z54)4@%wqH62dACc<5EIG!mDuI|KneDjpG0D9eg>)klgb>f6^*sc>RC;WQ_0s{s}C| z|6LbMRQ%sy_>&v|{|tsnsy`2(Ua*c=M?^C4P`102V_7yyO!ObaAGg8+$l_>ayMLoL z*8H~#|NJ4AyHx=40_ID^>x-V8I(ab4_WCtqX+(J7C)68f zIonJuS*A;F9-`spqRQ91Ked^YUH6KmY0x65)Hr=^YR+{r?G zC3}(c=Sx{SS3D-Jcc`1vdRMTyS{EK-1-}*Lw_CX)>fNVXmA zs1BUMZS5ve(>GPlM5il?_UpRy=gSmJl?O(Fs*`>kk=D(Ex9G9@Cdii-NXO@hmlj4_ z>-}zX7+KD)D;M18tJTbr<0W?I%nL+x-HF#*Xaqswde)bnrFt zV6f_iW~SsH1H12VvzB^W(9!|>FU&q=Y zaw?|!&X@nrVl%EQ^+}$l6>F0J>*PvUs%NXFyL(v+2e%em6g^m3Qz@)ToQH+_HDXJX z!J*c8?dZeLgm3E>jcCKNj}9tMmd$Pb>paY?f;;a>>Eax^tnBcz#_`9eHQI)GYdWbr zvfc%xpEo8@{}c6CSYD^i)E%8p!^@$!VVt)d)SU=VBTch<3GpnYF)O8BPj|Ud+P{gV zPA~JZp>3Gc0~vviNj4M*+3V$zfLOy&dDuDcqq@>-4^9LBiN)ESi%lEHPWQWJE160a z7b^J>e+_wPt#97<>+dKBj-dA7f)Rb6woh%i;+Y`~T&ywzQ|<40zReIX;rFGay77{8 z46x$_ovw!ao3nKfq(e)$3>SPYJmf~DqjMTV&X=CQb#UERw+nA^!t7Aq(OGvQnmxj) zfLTJhB^Bptv5o^Qsx~h-6-&N^REX~BlfMeeI$7rs#nzdA zITS|lB3tW$a=q32T52NGAG1|HdGN8YJw4qV8nO(IKVQ=2)l9t`V#FyDK75z(#Af=& z4B46i#csA{M8QaDQs>BbeE(UhnKPK9NOJZvR0SgrigUWhoHGC4YzUG{AzboX5l=Ku zu}wPX*&1d{llw4o6J#;Un_ll$HJ6MRC@I5HC@X(C$1R3HV4&!*==4+qlnr zo@Q4_3|+}gPiYcz(^!yGZzDT#5pfQ|?Ak7{_spnXgGa^Sf-1bnT@rj663JL!k-Y9v z_TQgQZzYph_sT`g*YVg58oY`|<@Oiti%6;54eMLl;xYFj-*Z;D! zRVN$rgyYBY(w`STA&f`o7>fe0kS3(mUCVRINM|C-32I zc=p7K9%oOi&lTKtCzI8q`o6XP>fC#=#K3l9WRp}gZ{a;L0i6A-P7`s5cPH5v%dJk{ zBR=re2iZSgX8H{Mevcf?v8cZz^%y&T4;Fsn#tai3zV|asFfB&W1?}(nZy)L%Hz}M( zwJhmr|A|L83>U<+@H|!BoEK2R>JIxh`Zt8p3i^>^x^Mz2S;tm7gvastd7mxGHFk{5`wZ!m54wm&Coko z^?S%YW9t`Pb^m^4I+`f3w7y?77XIYWC;g*U>y^`oi+pg>-kvDR2git)aj5;nS2GmV ziswIYD|Mm z$YHwgjrD%s4himnB%GYak{R-)EJiBEl8v*Mi`Pp1xx72u`Z8;OFkg{m6af`E&*#%MZq7!FAwzG%VjWgQ)R3&M|63-z3)O^Kr;=621qn-F{*amg zX=P1^d-6=_h_lSnHTC8F!a<}n-EONtpxV38lpLZ8_X~md#r|Tt@J_LiSWW^GE!8~O zZeV6E`3mZm_hKZAXX7)^OHH1Q`sksc7_vA6pSFg9APVC5>KxH>GJ+39pQAC0Uz{Xl ze{#XEI-;lBB~Oc%?v{TuJ$Z*o=&F5DW_Ui?b_v9H`gXc66hB-b1yY_AA&G-ajx}mcC4Y3^J37 zYb=btbBb)zbLU`;bgz7F+83hO^GgUuGEbuTPX!b5H6KsJH06wHMI`sEPYXA)5C1r_yz@pt!IOZZ?bmvvyQ>izABZ zui+Xmm#v|7?S;~C;RFuR=RH&DM~Y1*Wru0xe+mK?7Tw*`@D28IkZ)B6$O< zM-2@aGop0s`AB3bwU-)0{X21j-l0QL8(T)RllXHwt6W$1KhqS27BwFQ6y&$#3ZCU% z|7kb*Iu2cY>u$dsO1KEGe>uJ@qh^%&9Q&j5ZKHmNXCHyT&N#5%&oEW1|EiwcYt9XGNVhF~&c{C}n)#vS@iVbov_?qi z_A*Sx(x|$PXFoIgc6c6T+Y@U%Zh8NeU1JWm4^>e6!;?35r}I9|+iOYg2~N9e|?|KxZ;E5mL^=6iO#q2X2%0!b4?%HRljd_x4_!9!LG? z95cIem-J10r{F+IyU(87U5W=pT-c;{7NK!1qQ&0#yg4uI&}cP5I!Af(?(Uf%Pj6j1 z(2b?|td#bB6u_IEARHS>%)`ozf4k`>kBRw9R^~0*kCuKFm6Xcs9ko|okIl-;^VTJn zrYTagki2xsi_x0oA6CY({43tl$hP_WxmEx!=@1bg1`e4*A7FX|-&!d;w?F#k zBO^1veDYbyMrmfrj_T7pdP)ppsc0-veB1(x2@f?}yf-0}tVYTDD)q4P$bpfm0hxKlOVBl&R?jtNy1KJuR~5yIkB$}!Ib%yGH4308_mQu-$mZOI2ZItXOQ?@gl`5zpr)K2RhH zaH;U*9I$gT8X}#0dY}MM6`YVU_xW!pEd*;8-Otx_5?rWX-7c0#-;`hDK~XY%%@N{R z*c*FJPdwTx)wcSHi!UqOj|ls`r!Q^*b4oVXz~|D)SYf%6G1q?pUgt>8y{BF1TvQEd z(bYC-`}7^xaq@I&gU;5VA5q5PQqjyoqozrfGei>Rc_DgkUd(1IfWsG^J54o{Qm+%M z8p{y({_wZ({x5|$fmO@MMgae_lrw-R-tqsfateh|XEamo5>J#KA*NezN49iYbo!r{ z?i?%ove)<|CkY90Tp%+c_~lRkdL$ESu+0KS&pp6E|&A-WuTk7E>dI%NBM->VKq zEuNR4xJ| z72GIoYFZ|*`@y3(C4}$+_Rv*##bj;u$0R_$?0wkizjkoCZffbgk#NWX4k^Gww z|8r>o=OrF#9;Dp4OKw8IH)6mAU~z2=1iy9mRsh@ldq)~#LtjduU=J1m7MF! z=P=?$NivRMpUNI%2(5a*>sLy{ z<1=0RIeOz)p=uj?hh0k~q@w<%ccWY87V;?($H-!cr;v^ORY9M&t|*4{w(CC=D-haHsU%c|v`-07ckI(6!N8N}*IV1%Y;I}s z_4V!UNlr~g*M`u)Oif97@9Am88rea^U6e54s=hc^nPVy1v&wCId;INMq&H~+j&-}_>$XOLQXE=Ppp0YD6gP!m(!RgE=Lm^509MFxbJ6zkWLbT z(@h9FU67mTF2j1d&-yFpRZrbJ6g9Cn8j?eK7bqyCaRj&3j7(-AX3<&u1i;EKGI8;` z-ol@a4#1OReVrsUC8RpUJC)DMB-96>VeH0?>1y>S^&nqtCD9N66dzwL>wv>Vz%vx;An@Fvu%Z z*{Q~jl4mXgy{R!Yxf|KNXdF2GVxi`I9?E6e9DWFVPXaw0d@H{S%)}p+}b`ASywKn7Nt89-69ZVs5 zoY71!@~1c4?WZr*75#%((2hxs`ZslYfj*3dyKPh073f_FIAP#eYP6>)l*!{J9iKs_ zl5I=kPvjo;;pWpKiPjGWH<;;prj;E1n!YCtq)+{MZzB4r`A+q)7+5(B`$)}}!Pn7a zF9=0ZtDf97*2_z0x1BVFEfYx>pk4?-vRvmWtcbwBy6xX0Z7L-Dt^$D<3px0%zsmI} zQm%ULU{ze+T1qf2Etu@(%-qxOBA#bO{VUPb%KFO0fhuNYO3Jo!`~ckv?=bR0lHbkKZt*pw?xfe{VtxMn zIf~QdW{4z|xQM;1(&o1paXwtX%W3`V=jy7t+|@pYqSOJ1yglE=bepX9WUZrbeG}VB z6FR28%-cKqT!>}yJ`dMhhI?{OOJze-*KZ$}Kbe+;lvZ&n@Lh{Y5c1ff_s}{&EmURg z_*&jkO;-h9%XWOURn&-@QRaruYf=>q5`vICTf8TIuaRu2Au)*;N9zKjCU;16bIV1)tTNp+cCN>4jIzW^q6@+8^z-!|b+ z(y*}dKnnmwjlQjkvp6wo?OIxlQDr*F2XwU=4OIFq&207f=}zwV>(%i4e}Yz)GNVKG z+_`fT1#HB~yP1shI61U?4uZgg?q?yXOayB zBPaU_i>PrHXrzE8L`{5TgFG+Q|Ml4M=%=L&9+HRRR3rO3U2`HOo9oQ!Q_*?8d-v`l z4$;4C*jKLH;xZlT`>dry;k49cY{Ap5KO{$=LUlxntAN3cAP+213{r;41UaqV{{7J~ zD>zCWRInHVD(Ya@TYfzWLZW%gq!;OYz1%R>qLD!FofhP1fd5$dR}2zc$ZZTEV_h!r zFply`ZRYQH__zzZ3%U$6r|Cj9+Qs|%-p7JTbX%M8Jpm{v-4D+I1pVz3?W(lEda=)9 zUAtUyH8URCduT?rzyk`p%Pu^Ryu}S7*)F!9;M-1+)CQ|7|0H#Ye+8bCZ63qU{pW_aTCvNj8n8uTcSw~{uLIc1R9EwpTI#tK_d13y=yC{e zFHz?tn=q}iXb&)co=O(6vlwIfFHa>=F?6prq}Bn{XzDZSbs9$vqwhR#>gQ9%`QFc} zF;mJ%lKCZb>$RkR6T;#%CB<~_9HutlQ3|7Oua2UCdpNyhS($qV=VsK&`Tk?K^{+M-*I{~AF2 zEk(e5BA-QxX2i2yzwpwJZtpepLO#B=-+t0g(?Xn6Zvb4k+%jG*Tyu*AHm|?b(Y%t8 z`lvha{^`17(R7_i)oPbgGL{fL3t0vX*f~0Rj0SIOqgx932K^azVhS;EIYgDdlg0df z`X%zZp&u1PIu1ymX6Au<>YAp?*mApfX;IbRpydX~i1IgO8WRZ*`>ch9lRe_5$_IkA z$MO8kXT5&1&0lq7EltwI$pYjyDSu)I;fvE0QK8A6Tgg^5TR3nd)D@?{r{B~{i3nDR zdbSy7vQSp;*)7W}x8J_5N34s>5vItVLLBKsg(|o=9Bfy!{$y|N=`@RY?t;i!$EP`s zC-=e-*})9)sqW{uAA}gBY4JJB>1i`5rE6QE+4zDO8z zt5ZMSpAJ9?tO+ZMV=oBI9)K3Kl9Bc2a8dZ(!Bl!XunwXhK$YqqK{#X59^Zur5 znO@m*mm^TrgO3YlNau9grH-XfaJW1DX+pXO{q@&h*Y0v=d(CtcfTq01r!oiPDsZ^$ zDG=JewA%WFHLgMD>;}4QD~v%=T55HGWd{;ZXo<^5HYv2@Ow!txhk=!_rZ~PLI@VF6?1@agZx2Ae1zD$q#XLE_-X=Jqcm+ zi>K1|*Ax|ae?bCOOwGBM#<1b~IASyF{yS^-E zhD?+?+rPRun61p(U-o&}kV#{OsrLQ)1iYKldi9Ex*`p*^(BuK3qGLw_G-_BGQZFl_ zPB^vzL)_M2tVTFu$P|OaoK6GuE1}P+_7(O@PM^`P=`A)9QUU#FB~7@Z`GK%r-fQIw zg|E9H-EVzl3Tn3oh_ajC@QxPV9+a=aH#(hni!}ye{eJy?Rjp4RB|Lx@735E66;KGL zPYIzaNEL}S9eG~$u-@&J_S>qPQO^E*bf%|u=nQ?j-|Vma8JP&q4J~WiwpL-UG;KmP zU+!pwU*;0X-6M%+Bg=$|H3+iS91Bs@uXfY)sw*U8+89E?ynNe|8^kSRz$sV#t}^5n zM1uVRMOUCJap)lz>*zr=H93`5!hl$WvJ4)b|IM;eL;%P1FM8@q3jXN^)XoF0-e)$z zi2(WiKkG#NLtMI|)bN{j{}vMuGHIM!mkW+Ts_A*#N9cKewiU|}ao*}1Mw-RAx*hXzw>hutwTZ;(rzB|WmMTueFd}-v>#?-Am7}17!XLR|Q3b)HS&XbiJL!Y@gfy&L{ z26<4x^!7g^d5>QiUk%`( zW3t8u#URcNmaj;57n_xFtSm;r{tWcdlzeDvO42aESBK164*;o^=rGY`=-`@bdlg1` zKe`0kMNYBG+-}JR?YQ~0-&qHiJ@X}UfUC)eb)VN!s)vZGQ3^dS?7bJ|L6Q!eE9cB3;UtUeMTZ;C8 ztFy^5c(Qr!^hBpdu5sa&&}rjH#>INzoSwmWDMNSY{6DbIFD+Yr)qeER zE5NCNP2);Rig&ZTX<{51qB;)hZI~08yhn8c;DFQEb^rSmx%4ICg<=rp^tITOaiz~6 zMKQt@Mq}NY%)S!h3AhDQJN!=^>*+%CT-e#3ATK4B0;*AAzz(f$%qMsIWcqmy2Ufa| zmzUSk-a;NBy%Gtx`PgEAp-57DOA8|lOFl?+q>rtC4V4vESG!pZE{|3VvTr;)bRR$& z^=7@4L0lxfZ6z-5HPF-9$fR;IVg;A=^YRESnGZK+(6MdysKgFfv4yQm#p zWi+dzep!DsSB&~%FzRvMY!}tE zAHOIlD7b)oxW6-6u;P2n|5M{5ZiN3Mz z6Cpc$S?D#%TA!}5dGkes3KTY!JT{hEkh<*7R`$1=>JW{AiZ~1gKv31J!B#T#ki^#Yt-4QGgay$mTJ|(deh<}j^L1purSK7TO8{N zYVzkZBeJCrhD(+NNQLZ49m`LaW?%uXn}=P?ZNx1o91_R!BLG{ST)H6_$bd3|Fosa` z<Q6?>X&i3owli$U@3c*zC@UgTcL9$teqg0y12=;s zp4*>q{oi)|VBf3wRA7_IGAf#1YP$&~Xu;|gU}mrNf`7vrZF{`d5^KB)6sGsLj0JNy zqe?mE?!CzQHd3&yt+&(&WxOk|tH5YBlp2(O?91u)+AV?uT;O9sA6^IpV`KQcA&cVa zP|Xv7&U6=p8m-|W<|vE~_qL)~wL}VaTQ-M%L?#Dy=jP@t*Fg4k+20;6Hi?QF4B2;a z9k%Jsc&MqZoeaU4f7z1=S*S(Us$0fUCXWao%E2J`AXzrzHmq}fs{j0Hd0NgQ7zZ~z z?EetsqfylL+K;aCim8|dJB5k{@AExA)TX5{f)OW~KoFII2%6IqoWg^&8Ugl|#^4cP-HkO9Utd@t$ zChI~HZi;ZQ+hp>)34=}XX=rfZ^(C1oAam2?UO8jYv7q%EWN?5D2G|`8p&Nu$qB_x| zVww#tk*dQ=A6U>PHRFMyDarLZpaOlS`9jq!3@+SIw<8RwI69}Y3M5Tj{^(nxHuYzxgwsiHIk!AS6iwx zSG{~^)XlBo(|tpW)@UBBIv)!g8;q@-&QelG3iebw0HID>;**!0Z^KuypfV1n)@#+~49797~Asfd2?JUor4MXH%gh9y${ zlPR61UyI|OoP*jQOh6OB~k&oIrn`gAUU~VS$+sd_okI3e*tuJ#c%Hy z``b$p%`S~n%hkt6phS@I*~=E=kqcDVt&AAumZg@qrpd$|jeC-7mlPEh#mC?4FND7r z5D=gwe`ZQZOl&vy^&f>aX$J>~?mW%vryiF|MjW%^;^KtcHfG!ObaW`GsOC%fT@Ol) zL7pis57S$Y>hR|g6s(Sqf5Lg~l1GacB_*XvU;gWQKhlhh3{z865RGz>sClTP#=puN zUv_qOD#*)k-p#a=%Ti)AGc)rZM*oweQaIx;c=TylO-*fT#I$t$gX!>>#@6DIpS6cg zAM*0dUX8ss{Cl=FX0X&EiA1^5aqAK;NxDYJd{@Tg`1pMS%SypjC^EZIqAzK^8EQPt^nrRx;iw@{QSJ*R`*L-9Cg3^ zsiX$GorSz=bh$9DOssal<_II#u(g7@xp`yK`p!W+B&IdAbNg}>e z7TxYk_Grlp~Ef_1}_2y&N#q#avVEj3T*iDh~H%pfzhthAJG zyHATFhj47O~>efecpvjdXXf4%(3ex?ObJ$zUJc*2{Q zIW(&=@fMwjo`xd^y2Z%~LdM{&uJ9hS|;^12;WRQZ2NJbfg*!-QUkH4Hl^n-Txy^%HyPwqY{(b(CW34(-WZSUGIP6GW^A6`hAdA zu3XXwnwi7LzvvL=2%Rt3W|dn#!L$mSE&?n;*LmEb^D1CHA)LKKpz$6%hZd^QMb9^& z*&@7c8A@Q75j+b66)$J|cV+v3T)EAUn_skJC2d!?cW&ZR)rX?EJo8VcOR;3{NK#+M z3R97n?^qr#SLEg9F4b#`O&Kz;d3ROpSj#HQ$Hxbk^s)2ranGJ{_T7$O?Mb7q`z8xH zRl74$fJ|Js`}KNM#h`DIyKKsVCU2bTK$lCRrS!gj^ExFI5Y-Y>Sn%T3P%+D6v#MQP ze=`0eI=hsIZQD5|BYPk*3=HL{@mS3?L%5N0o5#P4X^vo@{dSogh>yZq@+=o z9rcA@;Vf}eloFvs&KoUsO8N?bUtr6Re^2_u>mLR+KFkXsDRl97g0^+ntU^xXsf)H0 zsr1OUWr^i%gf0;&fx~4qzpCf=*^P=(sN0W`YkX6 zWYVqy8i@;*bcibc6PvK8@US8Vot01DPn|)q^MSLqws|#Dq}J=9lbQmIS1Rn<#)O(L zpTeBrOTZt-*gC^5mrsYP4h=1Cw`5aB4-F3w0y2fT{_*3vLupr+_j@iXsmMq6t7D%& z{cREy931RP?yB6RB`hLh3l9PCHX2C`|U}h-Dpfqfyup2V8F}3z(4}V zV}GGucOstzzvJd7YN=S?$$I~$o%9E?>j=U128wl<3S5xOxT7v^ZC%6{!NbF|(3{u$ zOdV5D7C+aUR;-DXlf2Xz1!%B5fRa!JfExvll7olINQH{2CDbN^&eV@@nqzo(8mZ&D zh^7x|+qBKiSHF2&hE1Xnyl6Qc=XOMkM`y+uWu-H4NY|%>NnqG9xeK2tuO|!uAt!sy0RW!AW=Ka!Ak09w zEfB_M-&!m5#6|-(&*tw34i2K<>8O``0Y*m(>kpt1EwY8S^uE$&u0v;}!T}likd{^~ zSFS9pqM`yQ(XT8T7wC>iX`SY9Rzka@kUR(hA;kGhZ!u;UDvtmt` zEyZ1iUQuD;j9AO>9mKv_W8o&~wzl54+_1jND8mo|TpCeV*sTmMHb~;MIM;!;HnV6I z@a0~;il66nJ+MFg5#Ql+o4wd{ICB6RZxG2xfl%tvE&iRMq)crL7t2VC-TRf~pIx6y z`RT*8+c)v?I}?R*I3(ucpL!q+rNTR%Wcb$J)qa4e?y>v_Ff+YrYD1u~s3@~qsjLo$ z>rqKZ{|1t^z}vvz7QFFgj;=8k68r65F_0U-k!Im2&2szA5Kg}y& zevGn*JcFXIU-rbP+-?QB>sv!72ZzQce#@yBCRGFY)Y1*CS%!KAX?$6f$)k(*gp1sn z@*3~=Ti)@Y3?ALl(faCsZoTw8R_4WeLL@%1ypa&9*aZxMQ@?T`a|j6oljqY#VC21{ ziv?yt7|CfDeD|({2sC_fjqV#2Iq@CW<7UAzT@Bj1dsmPeZ(N^#5hG*eVr{D!BvJVC z(dV?fzhZ9w8yi9bI$Dt}EZlo_08J(>ksN#HUwr%aZSN`#V=946mG3sG3S^K>HuU?N&2ha3Wp7cjhPHvUELW-!soONvFv)S zh^3!De=24vsUQM_CWGl=6d;|5m`P2!CfWx>eF0+ZZ7&Tbi{UGVEe8g@bKRW|LprUF zeM?;I>I$M`pagJI0UdnrtvN8Y1K3MNW%0n-rIauY!=Lg0AiGiv6pOB?!<`H6{i1NO zmR#T5j23jODo)qg%7$r)V}NN$W%2dx?NB|L^24I!R~P-GVq*oIwvD@Sad3jto_S}B z!FGr0mCD2kB;Eon+>QPl-NXf0hmnM;d8-b<4ezc-*97lMMNmwPiIw1XCHD3mMU}ks zSO^KgZ0mTn1FXtaI}AH{j5BqEgb11Oj8p>VT5(-qZ}##7MP^ zGb=tnpT&iiwh|g=_X}z1p1k9!Aeq+4NRiG<~M z0LTb$m3DkGE0YLg>RCW#Cx?Z-1ay?m+m)@NzyZTDTMKE@F`3JufK9HbLffQZsvR6G z2P(~}*&&W+SlFYqT8in(Jyn3ajkg2r;#&%fEG9*A_^p4*%3V7&HJSOo=tQ{4k!h(0 zFvJzeb-&#u8E{LsTfWb!OpP;G+CK>);(Ywv$mv~K))%82-gjXb_on8_3qa~(K!o5MjB`V6dMX|QAkEdA%t-w88jbpXr~L?i*urEH$QbMvM= zRA#_Y*jBU*uNQpv3;#v_>dhPd_Xb5lLBYGSf&rkrnU%?LWY)mQ6Bi@7%uMAbBr*UC zbFN#y8-E1NDacOZ*|WENOY5f4<=bXjqL|ARp+$T1>eJ@g&-s^I%}RHFDiOVEb6pi> zh_YQmdWTq8SRl*u^JSw_x+1^5`cx84ql>M+uW`}IH*@0UIjqccm-{G4q?Bc z)58^ce?~@>&ml<5J{}+RQju*j)wP4GaF}R9@B#)dLh$-w6h5Y4BpfEk)3JvRj%k;( z+^SCk@9Q7OQcc%pzN>wJS~~jgZH47s5g=Nn`t6CJ@2$ZC)s!uAh-Q9!rCgvb))vc; zGPn*FUs(9n4Yg=k^HNY)%Hi(!-u;YVCw9BgDHCKEG*m5~6C>z0vZq+)U=e{K=K?N! z&TF;AHGE>}Luyf;*8K%KnE)>~dU8~~3p!^hOz5U1Gl*P|4|kx+HI>)uK3@r(Qe|3B z2@HBa&7G^nnEmc&0?o|c{OokaY^>9B+P-TE13PqmMu_PuY%Ez5g#R-mahM}jn6MR6 zrpHW`vSn}}7~$+yQ8Ap0b1TYYWuo9>HG_G(Z>;~o^pc`v%UiqTmvE3R9UFklls-!M z)D^-ieZwk5gQcds_iwWwDX(~C47c;|RmNj>s~O1!TuzC{Aqp8<3K4x384-hGJ=Ld zd~%s`2!!^bVIyliz_P3ljoKYlSEXLO_!k zleE@bE2gB;tn{X3{#h-Is($9lwTtN~0Z~y#l^sh4u2Vz(2kG{Sw0J3JV8T!#7^lpb+FT4Fde!M}b zgg{t>m}%CR|5O$K=FJD57-9gF{R?znIXO9CZXw=@URQ8%_E*2->9t1hLjGa4e|>X# zuta8b{Odm#K*{y@_6}NE4s_~dQqY~DbXD%4dd(pEIMb*%7cc?c{SxQh_3`hXO?4e9 z5-3~%gVpIIv9S0MlQODsJzZ;SYi(_9P-~D8ySuv%j*i$)^g9-n6%~k-&(YD*H@D*g z1K(82$1OM>tkp~4lQ6VMDLxIcLSV^GhvVd2?s>Qq@)xlu1v-1%F@aB%AW9kx^fh2RY84qms9&Q`;*emDq~Vt=`O1<<-e17KiI{$GqGLmfbuTt)w91`( z5;6&c{gZEXmcQ^tTLJ0EOm=gOz#R5lqx5GmgO9z4?93akjp$VDqlfYFWS!%^JRBHt zpB4(A9oqc3iXPB9c5@yGfTXQ5jb^D|nc_V?K=U=k3&xno*2^dTc#F0{d{&Ii)D}EG zDC9)x=^Q^ zfgGko${e7WFe_TOP`P~mlAcZ@XDjsKn%s2<>TI>Lb*O+C=>y6B>MNEU&jIuaq|;1u zgulRE`W8bF#4+KvQotkzO>j&tf!m;8C?hA=Za3LqsUF%y zqj~7C(k)>?sCxixJzZAbG|UqHnJ7PI4=8dCm5&$aK4`W$B#AeCBenZ8t?ChQtPq|f z%KD)bGo2^^1rr)LCk1>A8*{3KsTx53Ul%WCYy+d)t-EU$JS51=>$KSC=BnWWk)1QC zGaavZCFqOw+?&ES5X0_ez6E7f-Hg+rU};o8uW}p7crG<{vLYFzjSLYGp93i+ycSa3 z=C%jTh;@2_+5(eL-!9N;Dtc@VslV>>5&as-I`R(;*oRaTL8ML=8+3|rv;wQKoEDFA z>B&`hn)q>bVG9)Zt^p9Fh-zgETQZ$i_E)Njag}&PFJdWr*ItV)TLWroZ~J?e+_;sY zhzcg_LAuUiL{81Rqh;QIfjJRcI5T6Y_1vN#CH}&%@SBy5YPRtmu%fF+X39@7LN3O? z8e8Ak**R`=J4#{{*k3FJk_Qv!1^qnq^hO}hU>H2|+SRM=W~w(h47+{~l$DkBkOI`_ zG8^HO!>+wPVt~;L?-=!DgM?VpFPhbm5;9isYK>{rrd78!T18g&Rb?Z{IjDXMXX48?wWp}Ti#P?4QD=GDT zgb_?IPzDkOgl0%!oI)sbXz zWpE_*>{`k1)jTYh^#Xj~nJ}rLI zDNy|=WKsMBNhRaDgo9;tLvl@u^~bmub2_AQ+IeOmq(FJH#FTwam1 zzP1LrJ}=Im$BKn`2K;G}*CS1UQYk$8Q;E}ib0#>AbEg5$6S1(3!wG_(+sr3pq@(#; z$Xyb!P#)a2RcT;_i6Qh_(cap#^wzu>f8opEP{X{9(!+@}+S<@xSn)T_?d&wG zoOfHeM!^x$K+TAd|5zm+@i+T)v3MRU9Af z4;Gu0L$jF1!dQurV<9uFx2_@irnh=Ek0Gg?FzT5iec3G{qSPhvO5ncp8M>yCmEY~pF)z3cgA`sjV<={b4tm+nYwGu}rqNrjae36m92k72GQ z+dC^GJ{$>WY#Romf|%lVrnqwg``;HBE;$39ba_yjtz~!zqQLQWp!27fr)BDo%U*Eh z+O-478_2w3%)+O%>kom0YBL+jVFZaME1a>I0@wxUhbutl?g>tIm&;(jJNyJ~Eb^?YH1RsLasWnbe zQ?p9q3qYgU=7^*L!0dr-F8dnMBU#WAo5Gk^dh_D2b4dkV4YE~aXdMbUa162>A<`=%}bf%7yX5)d6FIAcYHDsBphkLMBAD^Ag2q0ZF4y zW7|2x;HYpr`-wGBGk{*hK_5VAsyp!6A|d`i6Nu@WBL9q6t2kK!{B1JXxVd2^(|5mq zMy_pmOb=#wHvKjOwLV>sqG+ecJ2|w5MSwYtj(7lwhyG=*8t6-)4#~#KJr=1vxOAkgc-=8cEdJdwR^xSm4Km%bNqql2mX>BRkhFT&hH!~V6QaDWp7C}uOX$G13r=9*#>6#E8 z|7MqhOk-18Pgka5(;L+?UEs0M&fFGqN`MYCXoO5UuYS8con>jC;>_GbigqLo*|Mnk0*7PKU@0K-9H9f6@8&>nn5l1MZ_0lfQ2|6ZFms3${1UQ%Y{ob0!*-M@by zeo?r*+pFo8qfz-7zUSfTZ)?j_%0Vs-pcbIs8sqR9j8yExjEGJWobp=t`d6G58eXi1 zLkS75t>j3``p}5OY|OgK!l%&CZ7BTIR8(ko2cQj&0ySidmP1fEz@`v!jW>+SSht5_ zjPX`kUJmcWz=;VNKP9EG#v!0)1y>@-$J{UTnUJFZU4|e3nvo3CL9CN3W6bI)J7MU) zo}QjqvLB^l9^1gIcESBPMngp3 z@$5AU2IAK5pXy?>7{2sGr^sdB)}*Qy1gOoGQO&QkU{WT{)R98(fiaGYSO|*bo=2@$ zEw5T7pqiP<2*N^)WbMChh`#d(Kzf)v8cMan#C>&49*i(-;2TpVHQtJgAPWmXan;`n zyPtXQKiiW6`_>_aFlb) z^i=F1f9!h9ARBn(YNlXt&Nw_Hjq0H1E)v5Elfj(EO2;S=cFAdQdFNXPYA#cShn8>` zwD5TdMl#Ypv5Ppql{|($a;ML%BMgY%U3?b&ONmehxh3jY`$Q4nJLd^|(&dtdhSa)U zA@5A94{bRp)2RU3{$3r=T$-Hh%u(e!ht=Jr&3^7aocj%I<3MiSz*PtiiX^UHU2naf z2_}9wdrZWGkf5p(g~t2RhXugr zIk0K`?zQ>Sa5`0sMRysqT?iuJ6Rph$y?6$|qOF0uy2pUCy;3}A+SF9e;@v629yJVe zayt{=%%`R$W_8`QO5r&~=* zz(BT!#j$T5iFE(^`YK)+DYHsDxd!GkSSKkk_9ROwXAhQ4DO>r*ojY`yZ(+F0<#lLy z_~}d-{4L4XlY?y}y3^>8^)m3xtE#I0_g!P=ujtS%EgTV&(A0q`!mki-R8&-eRR#D0 zu=k=%1m&2{063-Uf6qSlXKu@j2M7VkHI|m^aHGV`8VtEu&}n!bH`7^;ZI8fr^UBP2 zUeVcJ?1xet>I)SUWDN0mM+Xp^z$eG+*YC?8PZkS$u9!63&0O{S4fseG-Q6(M4Eofy zOF}@;gbC$FCI5SJZl9BLp$JlsOV=?^uB`v2)F<4?2=IgXvrUy(Zk&b@U zX|6q~9^y)8vXys54LrpsTOBZ^1Wx4@t58+}0SyFgV`C$zsjLx_Fwz9#4!FQKv5riB z{Y(IS`vuc>^EC5%8ji0PgLVaNhYUi7oxKp^u)V##KoyLLt(o;8%Hw5#NR0ga!@a#+ zbadiJ5@VTJxdqD(FmD7h*DM2$X}2-!Xj~PKB72FLBnJyw7|Z2EQZZ<#Z_fpkVlQoW9q z`P6Xd6{Db_W{NMsS|$_~Si!|^`%7FdB`FeNXl75S|N3q?!7>87+6TYa3=9kgB5S>g zWuRZz0!9KuR9#&iwMFi{`p;rS#BN@G1K=%iYbfj%=H^sVlQ2bRt)4v07i@}L5N-^0 zq@`OiAP#uWLWw$vLoipt`nu-bOHG&VmZgc~FFwA$kkZL4y~g{XDp-wuJ(p8`pw}D) zh#PKw&~CXMj$Pk$Jx_PxSYNY7<}|FtF&}z?xD7}HsJ_w?$ko#E@_~Z$D&^pI}GSn;g z0G9gSVy)3;bFjB>z|(>u005vpd75z{At>OHyJjCS_%mCy_%N?l3F?Ak(ic$8rt`av8)n<$++ga)Zh7eRlP$2YPEJ1{ zZm-vmfqJIOIVDpIs_%r?8f?H_nDn@E_38~pH5*6f{4fl$yvrrcY1orZoB6+}dJm|k z((Mlv_3DfbY=DA-10qVb0a9ZH1u4=AU8RO1y$2O5h)4%PK#&%yKONo@Mgcv5`eVNB2cwJ<^l#M2ktAq^Q#z5%Ha(VgP~=(I}Cit^4<9Ocg2fxR)SW0?t007OAOpKK~57u9_?fT({rTnp+>< zh}c3$I503!)R|{o_T&lM(<7%w#j(Z$TI&bS1={Bo7Cr_d?}owK$MCChof+!9oIH^x zrlv3xtU=1l$jpSs5El)Kte6e|8lbGvkJKxnk402b_-Q!(AcZL{HFkDh<`QR~z(Aka z013&5`e;DObI}kcb=5$34E&e&K_4ygqO-$5Y`7}Gh{84PU31$$52SKA1_iwt957F; zKZG%QI>EV_1~kUqe-;bE7kw<`#tE~v1&lHP@gJT(Un2*<+0}+2PlvY-D$J>6a_ZZA z)~Rosz3PJBcAsU0Y(ivCIj=&+NUe5tb-kshPY|881h^v<*N{Ab{5h*@`PhC`y1hun>3DSDu=h9TU=Gqla56iO>^kCSLuc6&2I+ zhtaau(hLmrP^*XtbQz5(VPVoA`qXwr3sFjKy)ctr0@wr+bz|~8oa9=6hO2Dp;-UlK z2oUV>qHJKqf%!Mp9lkQ&kM0y;G6sUU2w{Ec?_vCb6nr1aUow4QKB75bx8xj*yUTFm zAt@!le?K-qPXc8Ow1F+%T~L_8R**F?0ac36du&HS0t=`gs82o)4!Qn)XCt%W{Q$%m zHM0fe8l6rrTaqmJ3MAwoydd)8yJD-Quipz?w(uzFpAoC7$`4`|5p#CDC3I=lhgEs6 zOu#d1Qif@nAEb8xYC=Z1&1W#eK~=RQzKMdtsM!U~0~$$BqoR&kwudxc?*4T1w~D;m zbEok(dKc~*7e8!ZA2_byU8tIZ=mn_1*{R>WYkg^W z69ozdJp)s#nkLrvD68r4zSWP?5FUV$06}nPp*yw9J{FdX%P(q`PPrj!m&xk2+;a*)iwd%fW+ zfU?+AM#}?zeFoT@d`kX?;t;7U$TLx)x2=(86d`b+9T@n*+Ix=NnTLc7&IOnvK^h7jHO}06PjV;juau4vkT8@l|$W|7Q zWT3H8z+={P4n)-6gWjl*+J{+)g+Gsa)c7839|^qDPD8)oER`4y=lQFMHRvPREcoEC zTZbZmQTYBTKrfQ6*lD}0=fm?+0)3OCz4StWMzYd2pjf=1YlWncCj-JGHM&V?hI}}p zAzgAU2wv4?z#{d&m2&a$$N|%}kfj4~v+fb6y4QzYSAqYqi$9>~V?+*ku&N%tTn;a6 z7SZjt_E~|#9tK`gl~;jpwpB}vyw{R0Te z0>6b(4~VAfv`%1-S)4R z7PWW!1d(RQp&sy`$b*ch+jE)8|C1p13AG+V3k_enHe`|%*0>uc33({^TO;0(0PxYE zUx-fLfFZs+)eVq3ND+uQW+2A=dV2g-L+o=rDHZVi4Md51!pM@ntiG=9UV^l`+D6Ru zY!@7&OoAcEh^n9hG#8jK*3Y$8%(J#;P`!fTfq4WL({JD^$b+|nd!4$=F>G(rE!GqB~a*%>QL*Qmh?H>n{+v%nM?eOy-7&B=pcohw=1G0?17O zY2r@^mzo2S*RDMWvRcjSP4^LS6{#zC4g>egSQ`&ePHcfsxG&IPyWfN zJo!hBhXNh}v#p65HiNta%8#>}NhU*lNMWdOvw;s}nUwAYvv>W+nFu=>qN&%g5St+b z5;FVAtEXFC47WFc?e>L;fKiwSh4t6fjVd+6CZo1~ew*K~noxE5+_`fZ-W!^u-I^%a z{Pc5_#WY|NyKyni%Ox<54giUq3#q<6NiiWN zCMGg+6&@|3Qbl(l_(Zu$AJhtB*b0nMB#0RQO*k`&SL`DGvd}sOXlWIEx-2!Jm=>(ObPLL@+Ft3B|y85O{I#dX?7@t^RyF_namHS?Vl@|km7x|Os; zsv~8K_MX2I@(%?}2GFB(u(Ru*x^($6A_}~({Nlw6oKm8NuU5)&kpUz4Fi;|mtEVO= zx?om=vu4a>Luf}^gn@6gvM=wo~j;`N6-{&M5WDF8Spu>XN>-b1+;(r_TM%bHrV!@03*7SaI0<= z*h+d&0RVg^Fj=1h=h!eot*50$R7AvneVzy?@DJf+e}TS6^CCAlH@tZiVhYUr-UWKS zOORdj>~;N$0aU$7ZUvcuIjDW$P^Sv0h|#Y)M%0Ff!K98qxaS)T&&Vu@KNlDl_V%qm zJR0K?+l$Z@R-BcT)MR>_58Xhd zL&Nv?B2*?oc?KAuw%5RkcTDDhBfGkgfIupAwihp6w0D7!*>Ffb6(;K3h_p(;$!tVZ znVq$Z)JL^arv`G%oFU6OnzsLky7UUM)!F*DVq!L8>N-DV@0v~!?w4hp` zSwKQUqh5$yVc(M#&Sr6&NjWtA;Q5B{L)bnB=eGq8e0tj{G1gF{CjH5dUBGMs1>X$z zDu9orY=4|SckT|hjR~!QYbewC`2_2jsTh{Ll~<+Z`ene@1FP5 z#9HE7hY%56;2LBx(nO8zWviCjQmSOg?cI22*^B~OhGBgAzm7J=9qDMJKW?NOb!wmW z-QYn(#1t>3kg@m9LWlKAR~|rT(LzuZ79(oKd+z7d<1T!H9FMDU7$|}i6@2oGzcHr` zcwWH5be{rmvB&zroh7XhE*O3C%ipMEswY@q3`ihl>dT2IF&|swp1^^Fx zgvSFtu)y-oy!p5n&|Dx#2sE_$HMX4s;&K_`n+ScXw+Ri2xRY-)$j+hEsDhCd5&x3F zDCSn@^6lFFx)ZGN>5~%s`>oNe(M;q_AjTr=y0A3&vWJFymy;l%YMw)jH;CTQG z9hY!Wis4^&1&598@{P@N(Mi&ZS=9nNpF{&z2obS2XYP7rM8w~sU5exVl6%-2WUpBJ z-}dZjzP%nTP+LastEz7&_YDKvHigx#Hl(rITjf6FQgk@gM9G~mqJgT#&E0~}lGo+! z3naMCK@rLS9{iIoL`Wa~QE4$||}sTsSxrEQT9KN6k@t)4qe$ z6Mg~Cbme~$g1S@tV(um1iG#%6rUb><76i}h8!%5&;E3WB0XhMQX<*2IsxcfrIPGzG zdcv|-lq}z6&q!4C>pk2+?6`^RgF{(ijU?H&gK8)Ci3x4LP2QMO7e4^36$YcT*Vudf z1-F<0COGC9bk2CDLd?BQHv9BtXq3YWw~CCldKp!5IGLp6I`WP=PS|Ddrua^y%!G+^R?vC?igATHFrZ&2&Rf`_ z0(;; zg218;_%3jNj5@pA)K2TV~X1<*Y_4cIXbz;5N%><-kTcqY zaMUvWB3V;!BmRQUN~+-I79!29&_FxoCZm=gNDO27pl&@VKe5 zb|HCdLPM%qQ@XmkpYfW&OhaemESj)y|9*U9_?9K%c@m^i2L|ad{MoMKxLO4*N-am0&JStfN+16Hv#l* zlk?Yx4(C>dKNJVtAE-|0obnw8+#PY*v7k9t0!3=T zJ^;DKse%enLZ$vFqMZnP{n{IxQ6+m*(!n#;B!%!JXfz_L0ik+&Z%e^zm=^uv!Oo|l zH_|ZX^5`yu4LC;R*eN(RF$oExwQ8D43faBjr1{$lxzCcTtfF2mdMixqza#MY3RVP& zG7a-x+2uY}Q(-@-1{4mZU)O52nT<7#_u>LO_@wNkwiqTMakDlx2u^7>oBRlCe{o%y|Q!ZT$~8WTh^a#-KN&Zlq{=4)6>@OwjdzB4>TwWVy%-MUAAM;FQt+U>S;YaD@jbLSIIDDnXh z`fu3UW^H{S)%ek&f=9%~85$Y_HZut&e+cSVuMyI3(SVtU?g?Z^Ra^8YTQ@-Zd>cgL zc`Q|!2-Bcy50%(;1IYu>?arM$;kl3C^k6kHq4K0kV1Mhxp*=yChzPK3L`L)?ld>ZoTNYrie;P7C;E{l zC&7qcJ^CXdRSz_zFf<1*3_y{WX@fL~1wIXqOaSzFK!kMv?aYL{w+S7}^Zd6lLo6tv zusqJ@L9=_^KBx3dl<>wuL^iGj=>+kV+>&|_D{8BwrS%?1vT|cr4{bA87iIuBmVQ27 zzqiO6|wV4x;;^{q%kF z(9|rzr=HNB@r1CFE+dk__eedmKlAaL3(y;70IA|=fZG&VxA83eo`StJ8oYn+-uu~7 zh-lYeFXwV!iJi{4H{edXp)lbXr!?b6Zp>24C3x(ki)OQ6a9iY-|{TC!*@wPhA_ znN{KmDwXF!AE8482qhvEKp^B(r0j#QJ0wH-I!S8h7I>ie{dIF%_qU1Z9o&0*XN*=F zH@W|{kimD(%173OSY>hu!*BUsdDGv2YhN+6F9Sn2A-lpa%pf^AapyR|NUFE+69DVr z2h|`r6J>%>x*TSeQT_V4AD@EkfrUgQEz+A))6-ahx^Sm>cyPOiaj$|+{)#|4U!3Ko z_z}R-69O{s#S56@&5##~p~PRd;o{;V4Q;{V31fnP1y8got`5GqeY0+Q`3)yfq#mZF z4Uc!h5pke_I2EBBbqBwF13mN7A@&STbQNI07@1?yDvHB@ZY`MH z=?VYuhM52RqF!xMea8>%Au{2m=E>WhNCV|pt97n8FlW&!5s<3#c@R(pum}4MsffnL-eLD(t)o<+`U@$*u|xjw2>7# zT!xfGBRI3$TU)xDFw-tWMt#sZ4uGGS#3xQZJ_(M`B$!vqhK4G`szWpH#ix>};}oBrFsZblM(EKV9%lnlc9(cZZnnNM|>M$p`?W66kdH z{?@IH3D{UWoF(TlO~n1L=-(}!NN95+Qr1NUMMY$eB9_XokH7!prtUY}E1t7Ifcn7x z2)5wl;sT^MA0{A3K025^2YEj8fW{P2xt2yEga9&bRU)<_z}pBw;1E-*sy0F0CF1?} zLn$mQbea5~O@odJ@wCG*DUX?W(ElI(rNZXzM=szsLzQxjuLh?Yo zx2Y>IApn@N1<8t-3Og_63Y;sN(g2S&i(9B%UmVa$5y^rrdy40fC7d9#}ufnP4zGkfc>=$1|c|efN&zJ%$^(=uhE)!32V)w1zDv-6lfV2da?y& z_JY#|=3_`qCAvU`u0lU4>Rsm=R(ut7097!p>dIfd=mNS5XuM%Yj`qX!WOV|pS6~M7 z47$WNyr7`q@jf4RXvai|BOuTL@DG&!zu<4mJ;*_@CPd8q8wX!53HT%Mf;zwq2>9Fv zeYw_m-5zhYUk7bFP?S#S8Gv4>H|6>+*)y_*pagdSFId26i{3_IpkFOHC+Ne8 zND^SN)E(o8m*U&w>@d)JaY>rx-ac^39(GOPI-%-3Rn2`~jdsfT&OI^9<- z_|`_eFVZyUG-LPd18cgo1*D6=f1X@|JJg=27QnOsc<5-gPq9M**gHTmR6MH%x)-EV z0kJrc?ZIK7qIB5nmi`4$BoBBdh@heE{9%>1$AJ^~Le^`5NdC^fd%B{-!^6PcY|@um zKn}iq`4a7{M?i`uAPjKOw58D{g>Nl>F&Ib>+m=NLXU_UvvrU!r!NJz2%l0pva@L;pPS|2`q zxc8OlC};H<*_WW}hQh78M1u}X-fjBrkPYxRZ?^ zx$sJ(0p3s3uWx;!uk5NVRAp$g;dM{9f2;z25e6PgI!L%_OT)%yf)%2c3t}*(?_GVB zUk-o12lxzKV}5_JPb{fE6G2{R|Bq%x&6gdLIap|FA}*ujU@XKm^!RjN4_C0gKKY^n z|FOPpm&9}8ny#mMKFg!&h0=fF045w0u;YUwzstDjQ4_QyFJy(>wtl(5+LsC6>8Yti zr2vxcm1a)>0ikO%PE$U3e;-xy2DCKV+7Ymj4TiQHjNO7u%<^k8pN$K3b(K5@#z^wW z)GxKGw~2Zc1s04oUl|}<_t@JO8L+umglU&D+0X!lN zgU=O9Nk32y;oc`fBC95V5Pzp$bAei&v)c2Zs7nPI9t3Any(h_NWjrl4;y9C##i(^B z#dd^DRkMy7;pd;b>etuS)(&uRa9hnxOdPQ|+nfa)9{p;F4pgL^*1Blikin0y!0rQcf+GPK ztOYZUM>1e-i2oT6CB}@(zTNt~TXv}&lwXjYIoqu+9KX@}zZ5senf)Aax!mNyejj`- zc1yTG-{Zd5L0W{n(rxD6quk7aF@4cN*m(gHQ=hUV8LATWj^Y;y`ZO5ht z`z=RyaATQx2a~{Iyc%~KH!a3o>qiyq8*ckA`O9+n+Pf(|eEckvp#eO^6T_i-QLY7)p} z5~h`J0XKo27_dy^76>i)pcjXweV5HDs;UCP8?f_9vB~&9eTYbLL9NllFV^+*{Qtv! z2u%oFP_+0p>c{cB?rvI*8E@bQ<&CiURG|AmW6{-PtFVno?+6!{G&Gh#TnQ*CVPQN& zAYHbT$Tn)2K)O^n94{2lPR`8Gp?@kvmIOYo7JaPrqsyXQi!EBq(sG>Y+=tFJ;omI2 zsQ7KP!yv`gu<|jXpdbvZ?&(QmMD?7iqC33aw(1}R*;}DMxXey!N-!R2OujVOZ=&Q` zZPw|Cu36nUw*4VBb-$n5Y#RToV;2Hor*T*@gdM>AlnZ?-~zQ5xZa%l9Oyx)BYtz~v9M@NfbHsWAH14C)t(gX zH>0J3D^qqv_8eXubUuvHf)EP7Tjn+LkIydUqqRC(s+ogMJe$9QM*YjM&2Nq7=1zQ7 zu$sCYY2#mEk(494%4s4EpW7@c3IA+op8jvW+^O|aZLbc@(v$B>23Ac^pm<{ZYl8pX zcl%@#0XRgInaRuGE8%_;bmG8EKLikX7nh!%PL#q7SK`CM!q~GP?T5D5V9_KN`0w>!@7oIYq$JDVwfRL%$nSYNgZ1^d<8E?R(HBtx zG?T|#7Tw>+WlC#CEH2n4e71Syz!WlDLWv5)4Q*o{;sR(DycTba*qlF=1I2V-tZT~6 zUHl-mogZrJ*%IpLz;&(*=(G(?2UAcbEb~NnKtKRbPYy3pKpVv;pA>2@DR>#vwxNz2 zuGnsKG**#v9Qyg^C&7su2TLK2HD3`A;wwJ6Ek#1sbsY2(J}K|ARoC=vr_M(bK7U`{ z(Sho_-a)?7n=SGpsM>2$&;A-iXL=T{Z@{Dn5xKR7@$X_p4Gk$sN_Ie&@hDIKs34wN zx0*6KKK}fni*Z@9T!217UUphKuK+VrH!fqCuweYo`xnz_6{R1N99VH9J!MK(AvP*k zzq#zFR(EZ=Vk1Y?))`!>za;h4z{0RzyYr_aGt8#Ql5g})$`~3QU8iI7i~FCm_hi>U z%c@1V6NGvjbE3_f2JpPTA))+xQ%+J>_Y;22C)Bgb7Vms@Suij*>8=iJ{kZ+mx2lpU z+W%!Pw*2s9vJPcbCikk(MypyuO>w}C`G!&`k8~Vu>$#`QEi!qgc6CXZKXAj!%#2wp z_gp4UYO)?9@PSLFv^6(Z#-_IR7fVc(>g(sHDCaOX$uYbId|9y;pF4M9{kfVR-M<@MF z^-Zq8FAggaWSe#&qgtNf4B~s{wy!(I_6swA$G46oc}dloF`7CTrniB))y(S_CY)4c zh?=A@C{DKPi-F1|)zV)lgeVH-ReitYvD<`Qugv3Uz5Mc?#_kv*^+TDN4|9Hx<=1dN zYzj*ygej>gs8h-!`B`)@gTmWBBq{`yu72F5_bR6EiaC?9S?|c~@3$#qR;b|v2Men` z^HPFqt5i3|b>Cqey`&3b&&6(Sg)G-t2K~3ymVHtLNiw=;xvu9-R@Fl%!NDg~q%Tc% zZ;C9PKGo7}kNO~M+r(aS}$c2v%b^ABuey z=o%Mn;KNSLfo@0f>VvO=C}yjGm_RErZi!z>dZouMp-Nr-GW&69l3dYQD=Vvx53Ciz zhe>ViO<%n4zFTF)j`~m68^HeVuDQz~o1JTe_a+={8C!f`T-+S5FSXNt!>fE1!{u3#n~joln-gcmr?U zH@c~DY;{jZqI#DArfj4?!!z%62s_!^E1G7UHPJ_sa4;)yeJ^}{KStWg9sf_pe)3HV zgUn}H)l9?NmWBK7d-VCft znl&Z9l(1oE=h2)53ap)1paEzvL8 zpD?wcM|xoKVCuo4|FD2-ZL`vSe%|FRbl2I&`xVn^_2&Cjl0xTaW>@OO0~fU@Nv86Z zeOZ6-jvt)IS7$IJR%K-qA3M;Kwq3tWZTD|0#jnu(rPQ*gCMm=C)jU^SC>S=8?X2=S z0}3;|?0L0W-?n6g&R*y4yVI zQHRtF{OOBPeLWK#C?|=Hbb6hw{Ux#$w(&MH%cBzS0R-zLk z?@2j9?f;dV>o71<$mpxy@{fK|q+j4P`!@Tivx8ra^mIpTJ{;~0^wva<^G3taz(k-= z_N1@|VRclq#4-8gcH_@ayX=vh2Bj8c)Dsm11uv^z{pFy0*}P!O3^O`Blg!W~pXgt& zz12z8!$`!Vk9yWB2TH!{9K7q<_%=+i zx`Y$s;mmuLhJ<@(@mU=PLMIhhHWouxtv5EjJA59_JIa)Gn+5m|P4Wj;t`WZ!7E7 zy5(W=2%(0Aw@W8wY9xy~q4orgPx=&KEDvXU7<1hruc~v4v>w3PRErM5TJ5^KR2&a^AEY@pxdMaPdZRizIES%@L&x~ zQ+q|X*5s})>>J3k2BOg*mw6rkjkhPH>xJpk?26`>2I!7K|8>sCfL5bPJ9RbJbRoOr z9o*6NoS}4LeRh|@3$w%z8$+zK$~|WI^D8~^!e^_qZud@YcQ3aGzNC+*3c>OM?y#$K zsEy;1q?vCwm;4^hvf<;b@3FRWqEn9-TUTFo|1pftQk(a)q4Tl!KNZUS%qep{v&MuI zZH#I8gj0U3H3n}|j{^Bm$)}mB<3k%_{Bq>ZS@NKG=fDcYwvVxMNJalc-V9S!=u;!+ zFv_5tZogtJT(tO=@~Yu2)}Cr(p8rDtbM(7{NGl-=z2WQ7=Ng=C&$ml zc{gi+YV_&LqMPBJ9k%01gYrX{usz>MIkK`9XkW=(C)?$uvcaLI*W))!N_t=Rn>*6x zJpDEy6`~9JIxfXWSRZ>gMcLLI6YDl{xHmUEnS2+5k{|OW8teN5n%ASHQR~BcU;loN ze&?Yx`sTb6xVVA&S48j>zVybtxW15k|_=CxQWk|(f`HtiI8#StFc^Dr;A8j-Ka1)O0{Sg6j+nyFU@L5u3@y4_EeujT&mdNm+Z_nisfq zEVgT*>wC_FwEKUpm)rJj1?gANHfoOqqxg zh^XoIiHzkn`f3d&!xQC1cyAdY^T^35A0z^|ljVcsC$(Gp@7l3z|*7ah0>6Kqzvm@>#XUJ1Q&h$(F*@f`BMSoLj_l z$h}*Aqvylr4&(GnWyG)zbTUHwh#6i0mG};}KchutWR~liblwPeoK#GT^PXR8(y_sY z4#uE^*Y0(n9q$!|mCkN2d)T>zM2o&GRbm9!*t-E*()_c>gnK9qmif} zUJzStD11b-Wg$KNxTM{5br^QY{fmiyUdj`W>DHes%)Y?ZLTI4TRoiV8)qcI=vj_De znjT&HsChS!m*+v}Crj^u1m1b!p(}IRs_z~v3Ec)^g{d0GFCi^elu)B(=P*bc&g@9q zpXcV{)a-V*31){J&yM_4!J7{HKZo^R{$H@qc~q}|=a?Z_*8muEVa~sK*_egYe5inj zr#lH(w<%{s^PLQ~=wQ}Heng(Z4Ed*$M&i{Ku$*VpK(FcthMc`oH#p^-5tBA-<8g3U zL=0MBcdY%>L4c23V}mS;E@tx@bkvD;poxL%aL-iHs9-7GBv= z*52N;Y|ppD%)cUvJAM1W#KJ&3Fd!>!p7(1YOM|d!`Os;pK2;}hS@Fl*yB$LAF^bSR z_?g$r2QQ4h-aG@JUN~7ibZ}#a_AxMoie^$sUZ@RSJf`Py!sc|#`ut1uTIX+>H*VU; z7Rm(F99en#BIQkCp@?wCW^j*k`36qBq615I$a9s8xPg*=CR+Wfv9kA*16GspKI&X~rC@W}HY}{8gIg zxHZGIQPtwhr>qz>h@v}MehQs`>?9?@V%gxyVW-gYpWADL-w(srh3Q(G`eMRtL7MqF zy%+myMVM%-g%ZPAJ#z7rXsF6@7`@?H-AmK{x-Oy!(7?=Dg)i3I8BwMbCy@Gg!^0_eRfIjrM$=7CcJA7>TeU5ICa=g8;7p!jSg{O<$pYvr0r$2)8?&3u z`?%vn%oU?7vV;F6SBOQ;Wy_Ro?N9mIfHaOEVl>_@UXT5h;21xSE{P ztKmC$(D94%!LpdXTU#hU`VIpeuX(wh&Z{iFIZ7W9Y-?_Ay-$;DbB(gH zCg%@{8nh4bx`6OP|JsRQhhHda|D1cp;vbDO+Y|K*UP-Hopm~Yaqc1F$Q}`unIJ z6V=Xef3uT8bzhLb!0aIjI*&4MD%);PZLH1qqz9;_U0y%Y323J3=RZZc6MT z^sZE!-F;wXWt3*0e$d!6IL_k+zt1N8`8)r-h|_pvvt@41tv5$@-i=M7i|-;RgPmuj zHn3IrJ@ zEOUo)?CI7qFTw3Rld8KpDE_tUFJzj(OSui;JOZ7E^5>;^OR;NCn&ID5Q&YcdZrmJP z97v~(g^juu%9sdV5|I;0ihTb3C5`vWy%1DyzL`&dCV#z@Y?Vah+K<7^JD;Apw5|1$ z&%1pe%wEu|2%s}ZcB$x6v@Zk>Xuk}MFLNg9ruW`z{hH$JwNPj`DBsOF)e z#^6LkSn_LwsYQkw?4vF2w(4AKPpr+_*O180pjO*1>Gh{S!8*rl*N5_XZw%G<2c2L! zeJ*Zn%+gyhli;wA9WM2vv-j$|cqSH=lmJqPk#SIa)k8`b?Zcn7SLY@2GRPKbfw8`R zo8LWN&d$zCs=Sl;8ZRP=q5G|KYu62O8tR!2zX%xuT#L3COn;p<$g^BOhy`;? z!lI9xK{epOLsz(xf$f8?Aw_v=Ks8!K5B_~%;$}O}^53_LD+vb`7AP zOQ;U6%bKjGeNN`+{>8Au)2@8*8}<~B_#!*dGM0nQ5pdHTo0!^2mG16 zHIUh>Q%!uPaeV!>|@F8KogHE`uX zbU?O*-_g=HJTjt`FD&3Z2CCwB{HUdc1&qD@2T5}!8JRL#$-YmpkoFMU-CNgnDT6c3 z(F?ievYTh#!c5284m{;|_+Y}q$zT_50^IYVFGhILh* z^NYJz<{egt1_^rI{gZTl-{qkib0RTESGN`~YT&PvQ0QJ?*-m*Yx&Dj(-SNwBm+Ob` zXl`=wck83pY;`4*8b7?gdx_kVu=&?F?!aNw8tm%OixzTo)G@ocPi0~HeOc(H*hg5kcGrs<|Hee;eo ze1*E6erxD3uTGtRwwr3zqU>k)_hEf<1-UNFj33k-yl{;ImJtDar4}y2mY_?Zh2CPY zR-Nl)9Qq%x&+8fW!x6)=l{+x!-46%kWs zfp$d+k1Pp*=JLCl1=;=pBLy^|FRm-A24ankjeSaiRNVMg?Y}85CntC2%p;fr?2F+& z!OAD@?~6kfItejftz^1aVU>;{h}GF<(YeNmsT087Ay1jn2t`x%1hGHFSju^9p*S9#klq@K3dGIw9hFx z?xp>2VToC0>8XD`wUIRG5;*M}KjHK_Q?HVIeGtF)I{y#;IBw6RCo)fG1@TdH1?{Wt96S&l2XZwc3FE8ACI$XBVb1%=T zb-C&Q6)ilsuKKo^TOv?y%h<8lCf4)6L=l7}inCx3ECx|_P<7Na;sW^oHXc^AWoO$x z%LMP!BrG~v7X;N%AZ;12{}tQ!RK(W>ic+?}*du3Cgi=jH8N zSfWtG&FLpDTgN4^W@HE_jX)~hd2_1eB5;`8vA;&b#7xQyKYsk^U-PI26aw0qYtx)O zXY%x!|f?<|wC4kga|_MNX{dRa% zqu*_8G*IPms$Y$SN##bZGxmqHpVzWhuI(qtDG>b?i6_ZrZ^brf^SR_Qr4t)%i*}Qy zAzZx~O$DuXm$~PS*LCre8v^XZJFsZp&@CN{h6QhG2wpi0eT z=6oE=Il8QwU)EE#ms_%Sk!`rKMqlIANrCl8{mWJEet9|z>qjnzF3?UX@c3={JpLK< zYUDTeNY3Eb<<0X*+1C}@ zS{J2v2B`f&cFcCd8Z6k(LI(N|tVbhRATh`~HwcOkvRi>}c7!M5&;uMTKHezpczb(0 z$jt|!9)Wj?Twaay=F=q*O<_eMh_;*2ijr*cx_939E65V|8gQI=gP%*E7+-EXjeofY z>$-|RnTM)B{*X=%>G^=iM{iYIZ-+z;cH3NctfDXcXin3;+xKT?M|)CjNjE0Y`&Y>C zgsnUrmSINl4fr~BLgSt6=-j~F&uKa~59&k1vj^p~ha>5alkAG9h~Efv`lRMA>Q=g_Ypk#K7ps`6a3$tQxhck?7iW}K zx3zhwtSH@N-*l}Tosi3qT8Wj^sX-HOeL!M}9PG@exH2I*{u@V)BB^HhlX`LL3se8( zUmve}ICU_;*?*w<)n-&~f~{LMyeu4+V_x?1wb2!~?delh z)$Fh16s&S2mVK|}8mzRrQhDdY%a&=Tev&2x9DBIA#zVq}ZuP!x)TZ3UZk%5Jug!u{ zqqqioUPxe|!r zNa5PwC2!rj)e0J35X!rlT0%Gym>U>IbxAl(bTCu{p)dfFzo47Yn4~9*bzMUbmEF1| zBNHq0*{sHw^tw8pot+&$DZ{A5WJ?iM)#V?->BQuGH}~?%|y`Z{FlC_%gTkY?L0jyhPqMPxMrXF- zQO-&3Ep}4*<}=e2d4v4n0~}%fm2R4gdnX$Xh%VETxm2jmg?CZ!76+Ug86gI@TFo(o ziu7iV?L@k-*Ra>m*%xXC2is%*T2}T&=PdO15u#Ndu)i@nQ!?__N3Cc2!@6#c)U;lX$#r(+y3RJ4>r`2$ zf@hsP|3O6$+OyY2@$SPJ6zVsN59#Uk%SRiyU|M^0r*xpmW1)Y(SaYQ8wcTm%uo%9B zgiX6(t~K{|vaZZQv+lQyfLIr^g}Pd^H@Y>d>7CzxTQF|;M^kf}D73ZwWCvUPZLmPV z$<6==Gg@LE%rkqFZY>O)m6exoNcuqt@Y8Gbl7Stkl1GpQ-{1?^@&FrB=$>L|PBVpa z-oX}%lx|U9)~4r*G(MZ7mt=)Jj<_ zc`&~Aa^3!WlFn)Kq~%(M|I%9Wd`~W^-O#D&9zDhSyTqTZtyh?$Jscl+5)uVp4R=-O zDDw1%1~}~P6L2+1;0k@XTvS$Oe91<&L&6dM`O6nRDgQ?9AXE?EjlhHFD|ibcH#zt| zUJcM7LhmYOmU~Bl!-2RsN}MmFkkXj=YovgW@ISkgzmAF+T%mG%yYvavYM$JjoRu6b zvDHo^8NUpRt6S#Y4k8U&nP0(7ybAC$MDv6lB4(lOC=o{Z9D_GA*C#8VuoSvKn>>2f zaR;kY9({h`^Y!7wtj$NGy`1J)66)gNtdp{f3w;ba>Y`k!owbv7%-HTT>jPG;$u|Uc z7kE6=rmtVRtY&fEZ2$gMe;>Elz%++szEj*CN!7N~1-JgWD3+~@rv~;bOIbQOjpW9M zN83)Z$|bc@{)7x~b?VTe_hUY5ESW&&7DG_^?FH8IPElCNU|!{!hl2$G5=X8}k+s2a z^w1qP!@qg;ssRx3RoJFg_Sh0#02BVkHY4P zrx}$wnToeWS9VPhgkD151R9+OVL5!xRHxT0!qUcWMYu}y!CE3nj7uBM}v_G!dHMHI*#kllW02#w*8UMO{bdsFclCoMlaw zSGE6oW%`TTFwPP!f_$Y4l7>!o#A9^xqN?|rA3Sv$RnlgM3iR8ara+T9T*JBm{C8~R z!}Vs)k#h!UGkX)8(l+bM_Wkd%0hP|AX`cmJ&Df7a!VQV(YUR>SS}IEsM|&mW&ugzc zRclaZT8^^zbH`pvSFKaJKp|+H=}UbP+ZylxtG}suMsl>$t)scQOEy-g4d+}D9l%&V zG}Sm{H`$R`&-vEW0&2> z)o5Jn)OKU{DzBo*Uz?{NxOz8Lt-58f&UC%p+Sf-q>FLxbkZ*V1-}A)J%=Z!1eR9{c zH+@azO8>o$@^la)E-rWjJC?pjH-N2Mryk7aw{NJ%O5_niod_2bIf4He8VYC#a`up` z1VJ8u=x-O4wqm>@-u zJvir^t{RO4*=DH^=uVp=g+Vuu2M;;2(E(bQWCb6A2mv{{4H$}X61wLIW%u2t8b6uN z!z}es^BkztO&aub^wsyzfb@LM%dRB|$oqP;>r(j78<5VxIr<&nGP{s3u7R%h_7~Tj z2u!aF9IQVP@C8QAC%I#@Z!U97nCp3PJXAxL>LEWD5XDvXSulW~)oubK%`n(;g092i z0h8-nUYUFl;KL&O6}X4&-8+refwhAp6K{Iousj7XlepSRB)R;DP=Mh+#LRgRK-v!1 z0?+9R8{74etA@gGzIy**0krwl>~kK=#sWrY^jWOyKXVIi(megjUy{PSyu9L^+{ce2 zD*~V7sxTc{n~Aq^653f7(C+;2@6XBhr0(xH+6x!xgsXzv8)lu#$Kzi?=y#k_;Q?1? zg7*a3J^f~{#fz6O=Q~bz-1CtZXC2eLCN9Cp$A_lO&Dm+aE-~TLy*s=abLVdJxLvqZ zxYiJS{Cj84zyk3TeaIhrk{M-9IY`gzkKX~T~^WZtQ(>q`tHC)-oKzil^Ger<4f*%`Gwf3=f;sNJP z;>gIzN^7;pLX1AQn4#90@HcPnLMNpc0G|c4y`U{Wg~FPI+E#U`?^`xTUyza_PCNk} z;7Y3kY~Xlp0PZ>c%!&CD_#oFZCf|Q!#xB>EUYJRK`ELx}{gb7&i){;8GSxHx9@OSI z{k#v@SokY&uwfqRc>g?oaVART<5ia%bgo$UXz0L7v~arTqo=AKkKX{naHq5#RREqIH_K;gA&ZEx6UYaP zxu1h33uBpo{qf1ObU-y$WCVbtM0VN#!sqj8NJGEEU?u|G*qjTD-FxOl>*0lfHZQ%P z^=O|)3IHV{c&?KttHGuW+UoB~NBQ^&u&hc?UQRCNypHl2)A6q_V4tcFgKBlSSUM{P z?FVaA6F+{ujaCiWjNzIJ)yu}ia#Dx^_t_tR&=O&$I^)gfQ?B1KBgA%%dFAm@uXeCK zn)w}^Cr0uA`}D5uE4*=zZ4A{MBc2ls%3G8V^$hJf{2Dm)IcR=^E*a@=nTZH=se_%h zb;dlbF@!Bg7ie}fZ3&sXKdr4s;y~q(y9zfJK{?d@$lel^0lm$B@JIicN0z`;xT)02 z$jPAzhhT60ou3LDLbueS&i%pm$cI*OduF+A^YX3krvhI0|LMYzAg@CpiZRsxL)&}D zW4-_J!_Mh6RZ3A*NTNhS$W~b;4cQrm>``Q|#wp6C2%!+UtiqM-qsS(EkLo&a#MigIVXIG@Xb?3p4*x4up@sLP3NmLJX;k+myWLOR{`^q?9 zx{Tr$Oa@DpGHG$WMV(hM93KlMy)gj6pmVm0(lm!g<`-;gKw-;+`8YWHe5Mp`ycK%{ z6St#-Xff3*`zZ26eMi3DQVYk6^7ieg{zn8#miLtE!e3--H%O*dA(ljNRfklUM&N-y zCe@+RiV{6at$VR8*>qiUtrMi#<(~!C{U@%AX!YgTeg9q(Zj~&=SRlu_F7TB^+ zbG=1=da$8Q;bC=kb)WiLGOVu+9SYbToA`I4I7-J-9<&Mw&JmL9^<*3IWMt1vd%HEe zoi+-x5cIR9Bki4EFP**9=s%RkBb)-WYtjjoBpo#ilqlqbiqT^1|Afn^_G)f!2JI$B z6=X4foMtnj1ysvboKEE$8Aoc`t=`+v;pmiU{X zfDMpXE7l5^gFKL^J~?SvO8~T1kiVdRCg7CPRchpSl+QsEb;QDA%GGt-Obw>9kNF-? zD3Gmy>ah0lUQ1{Ty#sl=>rA@L^xDwK#>!Mx9G8By`dEq&+7A_5l!0mQuB04qepF> z<&8R_TYo= zTGlSb(_E2Rw*7Ot-j?Vmk>#O=#|08hMq*%auweckgATCtDN5ilV`=kZy|Lqa;Eo?m z_uo*k9&V`YXM6{Y9fZKHTVf7n*DSb@Dhdjur~&OlXCaVG1H%J6#K8ASMvEU*9;>yi zCL8?FFC)w4`SZQoP~du4e+A)q-S#*HeekD$3jjM0D-cD%Ngk|=KV)Byl9K|G3MA;3 zPqJhJvUdh&BC(s`^WLPf3Ev>ASeTIS8FxgPR)`lDzKUn|FLkPd7XU02b<2npobZI0(9(A07jT6o?U(`oQS?h)lzJ%SheX z#QRq4F+My?EsUuNEM2u1C42X%Z5pRND4;c*E-MH^LkeTfkXGJco7NFQn+MHnlY65tV#~mU`UM&>=qu%n4`NAM!a6TNu)nS)QryOugJPs@7<;? z=_8e+CMph7`EOG*hzHi!L;5e$YFrsZSsFX27|t8D6!>FWV=!$YZQHzh3Y!CgPea;N zzP&f(+8qFQ!Ah&V75nSZpXU0yE z#jj2ut&*G!C3=nR8~I>*{OFZz3*NXKWz8-u{R!OQI#F4(%$E?uab#L0`|RH)}X0#M_YTvDa`cm zAJ08KSJ7HH^m+6}))3lPtxLOGK5AXfU0x73_gMT{-)gUUmWy2}s=H>pcGdKU`if~4 zw^h|F4QdiW60x7c=kl}Zu?$NWNT-}f%Y$nsx^g4vD7uTOZJVr2P`Q#|ALl!F& zoV*!DqCiH}z>}T|?~BYk;rhGBxe2(pl8cCy&}KOHFir>DJlo4}G!l`Mp~j_J$C!Ll zgPq@pXugYdvM$}resixQ$6_#NsgsG!+ox=0DzVvmtR(!FOPweGk$>JM8w5vFtDJf* z+K#~5X(j(Z$x&jB^pB}NP3Ji`>A&dPS*%Bez3D0F7b0hFB!;m#ISq=mq%Da>hN5wR z^2w|GUX##J``sH15=;kBS0D=v4GC#QWsgqO$=J|v5NK61GmbqRFsrB{6O9`uQ7$Cy zNoY8Nzyk>x;xzLIUm~3D_SKAx$XQh}NxuEa!MQAK^i9c)x~vS#gTkg&U*E^-WUc-91oq(+ zWvv-15hI6bjYM|AOdU?UmONU81Ij8Yzi;&jX%i0pcl4Q<-0Rn`_q!h@Vq~8|l6xyQl;gy-G9?QZ}uIGnm ztrXe`3>r_l`#564FFg@pO^QO3<bs&wwbba#k7 z1^P0TiPx;x&EvyJ?WfmqNFv$&N)r)2F+S(24|=zS+`6ux)zC_|W6y!qHRCq^Qu#T{QcvDYrgH_0%ce5H<<}f76+O=)B`&$RuytOnZ|0X;^V`(&u)=Tnrha{YVrO`{KwRa(_HKeuL6eycsvSa z?5L;JA|GLZ025}%Cl_W1n>47BdpXFr@1oi;W&)&miY$_TpWn_lC44O`<3mrvWKWrThFy<_dUF7~I%DXRW}4Mh zBF~}OVNvs;@>UGcVA2X@8``?q)_0cG%L|ivmh!my7^x$Iwz>tQ7|#hitu-z+rmB2! zbu8lJ`1t!%t8FP|Q-u@NO}EiG8nqpeT1dzhB`vuX8gyx?5R z7h4vF@fdZhTLF(3aNZ1>tG=}eNv!FWz8A|z)3jJ?DItqKr(I@A#;iFZi%{ra#%xxV zG2NOrcY85zbJ97>*>Kvl`%9xAD@BXLujl?vpVe%6%K8sR;O0U5y660?oTH*PDGz!C z5*=L<+P+XxQlbj05PAKP08gxyVRH*n|BjE^Nn5I~-;VK`G!yMssBMQ^mneE%GYO9u zrl>g-zg!H~oh1JbUlzPPt@2||^xCWZ3BSG?>5gi>K@pu);)-EE*-BtUc(~9Uom#fx zw^v4d-GM#UF3W}$VH{?a7dGGGGwZJW5c=x=RwX6jG7dMoRIJ ziKMuIy+XBhs|&!Z6trjimvvn>9gvXpkL(CS{7ZFVm#0Tq& zHPg8|lFdvD1m1-?|2JrPs~a#Q6UpVVeKO?aD{X>vbjw7$2sQ|gW*=Ox9Oo2`Z_m6a z`g3AmPFb^ciI=s#CC#jgvyXngXwXA?K(Eipv$fW+O4?fpZ1W=6-*r!{L$ON9q+ zB==vN9kOQJY^Z22^S-WJ;|rEA9o{qNOX#80sAbM;viB0zg=yCGa|`-Dr7HzJd?>~v z*B0+y9G34yT5%`n6HLDGTYF7UFrs4~!t*HcQke>v9c}xW{MVRXiS9Aq6UP(3jyk$z zA6|&?8q;2Ro5^Y$)>GhrL}OvHH*~tI@N$pl=SRDC*qPp=@8%1lEgJB?7^doXjj*Pt z+5WQ|Uba~X11H}UNzgvhtLVQS@9;;W z*jcVuV6A-4WPb17LCC>iM3f{zV&p^fra7?T{e=>q`PALhS8Z&6H2Cl=h!xatCoBBu z86woRH2<6sD{sd=`wyOu%f*=+XAnU?c~C!QvHFJJ?0N2^J3oJ}h^~kX1!9Qc`0@a^$>Jv`)I5@>P2K3i0rUd2zZ#MCG@EO|bW=(yxeM^}&(jWLBW$H}MX zb!5$EzurCcIr3`4Lhp!umgxKydjG|-wv4gqHMK~wc8w5XFu&E;8q69T5wRi^WIU;% z^q*98UKo&K^z(KecVAu&2xG3;=3$>zf{xMbFdtJ4xmHxS!a4g@xtvGe&>-RF=DyWz zyvR>MXO|<`;f9X)^GKWV!i)m@Cp#I9tQyyn-^5~X6@)n+OU&)3NqN(@`cpYL-%WE45Pzx6;{jkBfLn)^)1b?8z-K) zSZ4lS``YWt0tfcGxbbX?WBWz4k`k*w z^i@3B>c}Z@W;~|JSS@GvA;scLc7>L_Jf`u1WXs^s*WQQ}REUa=3Se|+UekGLaO#>? z7;OCH_@|pmC%i?+GR&-FRA$(XjABca60R+ql;bJZypbqTOdZ!}kdqWCJFn?(*V&iI z8)Ctq)t+I5mR?*OTg984v)ZFt3-{pZT=$=l`_O^bOJOjZku6Kc^a2xHT*)y{I$kE{ zHld<(CIh|+GQC%P^8YPzJ}hXfDExyWB6|;qmcr*4`g4S^cj#zo zKac&mvC#V9XO%+Q5ct@gPv4qacuS$fp7XWV@%3Dv<}E9m=db5GS_by%+_}48ww4n( z<-fS~AHrh%4l^VIV)a^2EnQicpj| zk@LH3;Y%9CM(KjS;^1>gyiXYh{qw}Ahj!bkR{QpXPLn`Mon2zgmWwSVmLW0$4~WSn zboO7r$8$8_`#i2co|8*YXsW3>s~Os|(l(&+vn;8#{RorP<51D|0n4{Hn|lqvrnxDl zB-%%Pkd-Lao%{5W#v%~b+&D9Y%vOLY^C|tK!mj>meNcDZ@KVlx)z1PoLUQM_3 zR=B0gP+Lq{Kd=}*93vx1C9&~Jv8qd<^gOhe%d$7mgctAbrF+s0R$)!nGrU%uv! z?pCl_6|!m1)h3uWCly_5-(8>Gh7EYACSD~b^H%b1NBK9S4p$sx(Z{}7VOQeWYMA%E zNnqBoVdk1miruRhQ_gFRaH1xv%CD8s?sYPH(7*6AzocILN)BH{fKrkT=fZ{9Y&*5tj;qV=?LJyJ?+ulcT5wl?R|F?Vb&TB7c(1bK!7=lmuGQF6QNRtwF` zbexU#2J*_v^S)FZ_V@X_Khld#YqMX7JgLmke&C5_!gHuLr0G1J(6+B3U~i9?HfPo0V- z%IF;zOq#vSrk1Yi*0N$YF7;`Nyw|*#e>T{;enKtzPOS8smzg^#=xmKV>e>b>PtMi{ z3*D+sEsj++`s?*U4EeA=VwoANy6P5Z5XZ)DRR1A-@Zq^~V_jXrae~ z((6}GNbC)zamuXSw33@_`+Zbgk}KGe35Hmmez%+Fe#llbuB5kb`>ikEn+<Z}jjwXn^O{F726JhlHmduH1B zvo`S>pO0-^bLK@VbSACzTWk8?&?=mwIw?O66Wl4moq6*)zsU~G&1hXlJlmycSwxxd zE|NFZaoguX6f<*#3kA|!f6E!dEBEpnn%^c$2FAJmohuZ4e^lnzCVR-{x^6$BZD`}O z5^Q-q{LfTNm9-hpm>r>gdC!nNVG23(Y+->?>_}4c_fT|B)V~r75#-$+8JYTWv4TQ? zXjB>JvvjEEa$s=IvMBo&k38`!Yo8HuD+E}dI@Wnx+hhe1`_|n#%J(N1;{{LJ=5-&T z3W#7S*S9R-E$d2K9aLZ)ofKerKpszP6Z`d$WWf>h?jIOu^YfFeIxK3b7#qw>I8c9f zPN3E=K-Eu^DXWd%e5Kcfh)R83lED+=q0cd86Z@Pw6dT^(SZPYyy?s}FXPfHG&S0LN zf}q+qN}5s()eEk%EvtTVNNZp(+t06&)_I7PXocd2&$g2eRENzQ=7y`v`;S&Uc`}A@ z`L0XA;$<0DWVLi5&9tplw6wDwK6BYmq?F=XnJB~Gt2#P_iAzWX1|@x1AGr~uB$e*S z$lTpxE1QhMl&bT}1E~^c%^YXErDtu)7>0hZ`u3U^$GQMyYU}_#}Ug!xTh~wym%q! zb76B=U|_*Qk6|P@E{?u?_bDT($Gq5JTFkp;x*3n(pWjndxO95^Uk}B&o9htX2$TINi(&AGs5wPWnP;2>B z)wmLYlCArN3#;lhKRBZ&=;!Hn4P8CVXI|>%H$4#8(Xl6S#igg90wVJj!5P{a)ML~A zk(NeNj>FMqnfIqWm-lSnUZ;ME3zkiahH8E~aK0~8Stb8~QdQzA&Hia2D?|3&l$*ty zMH~sWyYK5gFD)%iYSty+=D_N!HS*m=wg031gciB(a%cBEqs!dHl9^_@xnni&wY}A+ zMxW$Gc6lacxU`|I@G{`Y(Yku6l|X7R5un3~kUvKhgu z1=R&UugRI9cy7j-0bX_j8Z^vB7;)r(_AIc4g}rX^nk_mOv(9Mh5$VT|#jqx12V zx>9uG)6;+dC46l=o#9$v?L2AXOC(wjZ)Y~h@eW@#l`4uhrq(-<3Wh%)@z{D3#ixOR zjU1v5@r*`{y1U9Iw4bTx++V7y9WtLY zbY6A(XS1*<2G%j(O>tPj3emdB*O8359Ga!6;h3(wBi>!@yLCjpj@*c~yX&(jS@~ob zld#qfFD~zuFkRz0dJ(kNJy{<1j4UZBe&1~ z$uxRFTgh6Fq59Jb;jf(%Gi$k{-HqD2HnqRrt)W-0USnl@HtrM`lcQN??n?Ve(>sO7 zE`rdyId<4&=q1~f4 zt*Pz&fp-mz_4sn0hNrPC}X+0M6bpN@XRxS4XwHOBI#?^KvNYzfj(;uh^K;SmuW>S+ms zs03;#SaUi?k#^jdNjVJiQ(fARbF>^rXOpk)mKW-cVcC=WzGtrFdf!uz70MX?JZfp^ zy0hp~>Q2*+>gbcp#WgZTv3vH?q-m8&D(Iz_@fr<+4JVt%KFEoxHSZRjKPwI)v*%Kj zing`3-qkOgLst8qWJ>?8dXXB+WMl`?!>WR?Lt!kC`&QG;_E}hTsr)etx`pn-J8Qa)a!rRF z$rBo~SME=)xOnN@crUkr+=ylASNy7^kYIc%z6}$Bsh;s3R|PFrt6J?TQsvbTK$0wIlIO~g~_=DqA$PalXBwM&r20GIu;+qW2a!!M=6i! zj-1@$)h9uVQ8^)QBu*c)A0Vz=Uii<6@hGYb< zD^YAGv++<-QT0EeC|(O})hCt~=l(2{dX0sNzDXh&=_IeoCE47F=k+S$PupLr$)HKc zlVn=$xs}4B&-q$N)*0ub%a*I&KYqLv(wg*qAv42DMYPNHRX}w?GCE!*M-B1(X%FD<^qA^{Hh#$l5d5eum1Ot5ROuY5S6> zT?*`Bt6wyo-GuuJG@VJ~#M0?@#Ml_pNJ*Dd2okTE;8gqBLx;m}X-&eo((hhnWfM|k za;vjs^Y9$3C59-j%@3J9%x|%pk=|dqPcJ-tXO2pO zM$XK@M>C0*lv;zZtu7zxo?o_VHl7TYsg=6=X7{dL+~>yMrH;XUyZu{e5xN>}pw(D) ze529ryB_gD`p;RvWbfjw>Ra=WNaw2Q^*Xl$CK zMDEiUMV#tOhwqAht`xnpyxM1=TJWW#!@DPzZ`#JpyDr}_@5f)dx`~r(g1Z*SkHB~k zG}6smrNTVVIZwPuZ%!R;IkepK8kGQ7oq^`$WW@^gX{FTcu;E7MJQNe!G#2(~JH2U% zYF?^O$Ql02A8kC+V)K~~b1fw)vQJmEeKy}Y z<`c8w9%{&bQ0xe48+Bf;QQ>)KQo>AvFFp4gRyyisk-+$roUqv8)1~Q2+t;-uUN_l* za++7j8KOc!wwHqgaRC-_*Y52%>f_G!IxKkYxp47f!RpzWAC-PAS9A1_=@}ZTMi?F^ z4t*~Zq~A^FB-m@O7OJ9A71`d)YqU07JH$tvDpaa#?)$V_T8yXC9gsz6Cv-6X+R9|! z;-n!c(o4Xj#mHmc>M?=hh@e6tV0?-1pXPtOCQ3VvE;)K>y6O&}y zC82Elu}8esM_pFdwm82v(M|poI6L)vbZqw|#kQBh8MBAI=`o04)tJ1nuywHcyh5zp zMAw}C`|-Vgjv@E&pSn3&a+Ka9d=iISf8{7L7z7UDQ2%IF7|l;T6Do7Il?`dgn$Hm@9uae5gOGtfN| zAuu!QJhpl<&33t_F=1>cPVT*rsdMDpe)zh|VaoSd&Os(hc2qV0qi9=rFkfP77`xiW zCi>=$xrpQ96{7`RU0ubTs~#hv_Lzd5Pq`4^yD)jq-c&7WHvJX*`w+w2Duu~o(HA|B zg>u;aMZ%b(cvhPryw&rpexvND9o=C{+C?+_Oy*sK`XSrEAjBc6DU|-LWx0LrmECYR zO?-lS*DE5``T;AZ4< zOfwPMhfc{#U)-f5&1X+3rRRBRKQrjkb`DDK`){w$Ig?v<`>(VN`A$Zd3kt?7pUL_f ze3$5hT+Xb$V6jm3*j$rL-&GWmPWv)8CSDlo_1NMx?djA#p)Jaug!JpbuQWMMqLWj@ zYt!a_n*T076*p2!R6FhYR1gXoqO-vj@o{k}dqvmCpi*g;|8jc-%j!8U=eD)DK%@YJrvsr~Aye6>SGL98(j=_v?1J#5YUeCs(XqQ++4 zpZuvRE*SkJE94AwYO)`1v~uMI#{1KHR-RN&hOL~|Yb#-Sz*>}5UWkcuCC)tqXo8ZAjhn(cg0}wEkVdVaE?3ohz6wa!uZv7` z^A9`cc>2T%pq>Fqmi%DXzc z9CGizO!=edM=RJW692JrQ&|z;GSRlvrz_05BEV~pb@>Z<`H0vLjWc)I@s2R}O`4ma zAKQD=Jmh}J^-xGRw3oIB!B7l;ZWP}_O+_^`|J)hl z8Gbj*jd^*I?um;F*;Bv7SZ`jAD~+0s&Ahhg8qQ*$nrB^lsLsikzDnnvxQlb%TQoEu z=iom;v2d47^ZWwOn|W>ym5I6f_7yg_W!tG?wH)OfbJCzLUX;(*-mm+C+lAl1r<)~~ zi(U&nIfN|pyPqmICuh;fFq5cw6+%7QxC^fjqI>mHO;3%b^p07;G0*P?G#)WAF&0VG zn`C!_mvO7M;|v$6U!R#4B4LQo+?%^>^rItXy^sgSAS@PW6)5K4^7)WrD6B&_=f={w zzQ5+>xp}hZRX%zW<(ip{WMZzcj-((cFRr?H^6jtplNCt_ONmi#>%@3?pw27JB?;9>@DpuT|NZtPPwCPt7>o+bki&6pLPNY$c zwqoygA@e5UFj`j^+ip1Tm`A^^+FL@U@kP|8U0VaZ=J}KrGlQ^OMeTbM1dmbL+oWxI z7ISXpr`+(j^}GjH;7vuESp7d=3@htZrvLq2Bt0hI@ncc~+1UK-vn@1Ny^k3@u<>l! z_-g#quOT?hHoNT@r%qnX=leOIet`b|_ACA4>dBf8c^94M?YXxl{P|WLs`aAt|Gq<7 z^!Ic8{dWT-S*8E;_5XHZzZ-xX?|V3Xabs)z{zY%6(qF|h2J(Y6r0MJRSEeC`8h`)r z>(5B~{|_Ivo+Q&KjfQ^}Nfo=S+?f5veVrQ-7k&nHxQ}(m#&f2H(>Zfh_-nU2dCMAs``7XQrZk~zz z+W0hT{#>XHapOKJYcFz$Sd}@^X!_Ah-YuI~?fhnlceYU5vTTq2-&!61wK5OgPo3?T z=)dfw+{nzHJ*(QAqLK44C@icUsyu9NoSY7hjt8!PU;bSSI3@pK9JBx|HXRTNoCJa$ zm=O$CUjB0xI=t&2dxe2!f~PiqgvT{8CR#1wQK9;@#1XG60S(XuYQ--Z8yoAEzWxO4 z0?5fBp~lqvA82lii!jD1BWY*?tVwQeF2)cotgSbO+wc{MfB!o54BVBSMzd*}k=4aK zuE`Ux{f$c^Cx}c>YrB*E=9sE`rs@*ZPl@sY8x5#CW7hOYb3Jr$F!u7lz4%}3gAk0#HaTimln^1G&qa=fI{jpSHq z@}EC{+D>*)Oihu#9ixR3SKbU^R%3K@6xr=rn zj+yu~=gvSd5STxx&cwvEwzL3!b71LmX_@A-1&QZ>4yxLiG2XK81vPs*G!Y?{VR&p% z2=DfZK62)^80MA_FE8|kft{XPrLfO(ZPgJZ?kkr-O|t?y$)Zl|=`c?1XTNWeOy$t8 z@bO{2;&N-fgQ=_gMGb-oady#Ck-MV@EVO+rZh*lK6$on=hGX~`*y%4oy5LHBdhzTr zr zClMMvtg`ml0wBnT*g)|jrWNB9V*TT=D;+S(2yM`sM9nokAxym2iGC2$0Ya%MDmK;# zrv|(YYrwA99-rK~SOj)|ISFi#KUSr1a$_HgIy%IY?3oB(-X}}Ot_Gn62_+D&|HLqz zWih!^R=o133r-0@UFJUCyvvIJ+_@`ZB3YmZV`k>C)25)|(t$RbIYw%G?!T|Y82%?v zsHr>{ZLx)p9;+)N8y-md0PVwk;zU10ujnBZf-~R!B_bjsEKC#hDwy_<*$rjTVF(wz zi1Ppf5cfN{6MF<^r3e7`y?gfj$Z>Wy$(|hld2t~P+aSzwR%N0yA0P#@_UtU@H7EWP z^wJnCp-8=3Lanm@q+BF~1^&1$9os0<|BLzW?PrIjERk|mPv%zSx}s6qTckBY!Qn6G zIC9JgL%^|0iT)BGPS+a4$gClZlf3B_Cn$Ktfy6qFLo@qu{dSU0+6xj|=hWWdpdgau z+x2%BFu$2;Jr?TP3{V)55GUNgLzaN<8{|v(C?Wrg~4-9Zti4Q5nl2KY# z20_MzK^PC3;T7PsXHKSIbe+enO^q6?gTfB;A9)klDVmb?uKn>4V(UJ)Do~X!95b3f!G*l;k8O2t`3l11$+2}r~ahdM+7hyWxQ-w4|) zQUPt_o<-6sC6Jg9oJe>c5%1h?z<@t!VGj|;r=~~>$^u>vzbQBnK5jgNWXSftIOo5W zn3{UvlAehPX&2&n6J!B^gNV%(@F))~E#t4h`-+kCPSIryFAu)+5U~S$hXVL>xL3aT z`Q02Y!hk7&jehx9Mr^{n6WEopnd(^XKL8G~o$H~3w-byDG*GBWQ^B0G8aJzTR{2x` zEAl!bNRoCudhyvy4o!_iqJW%0w?)vPD$>T&!`cAfXJ$@K52alYJE&l<$-hH3-U|ja9_N{)4s9X$7w&1a&q>QSn72R(ZS_ zR+eGmCN1EjWUpKiXQkmWln15_rcc-;udy)=dj>~9ZpeGfKmUL(LNMVQ@Y=C2;0+4e zF#c<&AfKqA&h!{~j~yT4F~tu7TQK>ysCQ^618xlC z*kJHc5;fJ*>Kq=98^k&dTEo#9Sc3Flo)Z*0MQh>399h0HPUXsh5$#A`qY&X!SEq8!L_x0-55`6vL4ItY(N*iAtZ2EZdUr*zcc zUDymn29K$p9*ZcTfW_6-K(Yo8o~Sh)0VoG|=!p^+ zpo?@`)VlviZe5+?#?6wEEq`05@v3_IS?EKWt>J2_GR}HSYpbxZFsy|NW|xI*CxImD zz~uvU$QZTIh^0v>0+Kq%ap`jlFglKV_nG<~NCuQHjb_gt5*!PX&Ln=nh6WH*8THk3 zhz2n%>;dKu=Sd+LQdS9nzW>L&`d>kGqzlxjFhYEbS~8$So*&{x$qgAbZ=C{ib-=4Y z;^WvKG!5hu5RkEjsxfl!f#On1)|DM;03fZWBCNgRD63-JiA333o8&bJFXDjwbXw>M zfTOMDQ+0C`{uCo|;XN!jtGzR>4CztI?LHLoFK}Sn^YX<1Jc9n$c~c3bY)~$My0ydXW1Q}q-2K}zVo^6q zsk{OM4WPK6?srK7)_}O?96$d?=7`@ovOWt(CRYs>6Oz)VR^9gFNx$|J>EpH51N2D# z1AIsI8((eDvia$)k3~c@QH0xrzb$Scagb1T{meAR1FOcDIkx66bw*QB)-ea2$w%^JM$gPI;!}QK^^nsA0FrAk}(kf z)tqtv^7$4+GN*OC-i;RZ-|tRh+PD|4Pp(E8Pg30}3yqD1B-c6k@ur7tCGx-DyZ)!Q z#(D@K=6}X+THo(r5@vokUWvPZC)FE&A-1@2%znRv?Ek-fZvCqMd=Xg{NpkG}eEomA zn1c0l`B40fC7V_kXVqD~y*{4d%cdfl+)M%un!i79Jbk@0NG2BEkd@pNC$`yVwDhps zKUZTpe!s;={dWfaeDX4*k#AaThQ$4iae9;}hSn$N$jE3yJPJ1Yjlcey1Z>1hI;n#_ zA|kY9zd=!^jc_chqedO)NZr>&yFa#>OLQYOWm1_}sBkq3Wn_OEqOLtqSC{wwyosvf zfb5@~ciiswukn2{GOqCc+iQCgFEvFeyb_7>l=$Pl0_is%7uSb9iO(x@SDT_NThIRv zhaQ%Ct?xZD8uH%S!%K*-w!N&Gb43zL%YLUe<$}0$s2D}1IR}Glh#vG={gOv z?D*L2f?S%h2C2VKoDGQ!5nsTS0HDh$BsQW+aDJrs91K@2f*LzWM{OGzK$p7U(C- zui$t~N=R%cQ*l3^!Gp#7-(&VmBRvW42~6+++n)^_Il=$~u<*gq_w+)%3of5U%AM{Y zE$!gQNIZz-$b(+LF6>0K4ilFHs4~!lz!5jYRk3ek+5FEx#sGx_#(Mtzd2l2_#4;Xe zG_Z^<2f*pPgC#DC0LmQBQ9V+6uWc`1o6WcWWfuziXD%*o;@$`RfyHg;^6~M(U$rIO zb#t(q+-qWD0_P4Yj%tKl&uzw@to}Rs7@i4i8^_FKK)KW{>^}7P(N1aNEpBT|rQkZt ztxs)a|M*s&jRe=d5N;9^S@ZUC81;RA;pwBsUjJF&^%(nuzAoya_Ga?WAuP?BX#JlmHgTqy$PhP!J zkd`h4fu0CB8i0d3bOleb3EmV8j;9}%GGJ>!{ei#>lc4ba8aDs`j>WTI$MvDRK6IoB zXSlgZ3fgQW5)+WkY*C6+-b+d8+i?k%01{^ZNny|fWFXY+swCAg$a#Vw>5OaK^Vgv| zh;{3=ENJ;}(sAAE5R35P89=57A-H#$9iaKpIfQr%5w11}-@x04(BB?-=7~3V5WFA> z^gN>C2QEn_iu&~Gzi8eVrbd~lDvYrIK5~WsuD67A&H+hEO6e@|#7Pv9Y(WRZgB60?%pU{LsQ;mm0q=b9&KV-C!DY-HN7_16JJK;&=j_8|)Hmpq-`m+Z+ zSs)EWsl1LCg$lUpBMYv`Kfwqyf;dOw%2FyW37kNXh2)*x4n8HI%cDXqu>pY!HPY4w zzaY(sVUGzAZe~tvE7pJMYXXN&8@z?M#_VWsVQW3GJ3yCCW!0=54zl{2fLcIT0 zg=zjXPXP8Y?=9umD}Mv}QwaT;BiqH-7yBG@ak}8cD8Xye^Z*+R{7=Ksr^6wHbyLc~ zrj9oIMt$Unu=e+z3K?I%0QGnqZ$qHDFq~Y0OwJn54R1B_!|siDeo3m#bDB8D-x4r-ZY#Btk~DrB$4wye$2Azwo_4= zygNp~&PD%<^i6C(1%=H}Uez2?| zPK+Jo)c!6XBbVRtb8&X$7WTA4JBfUtglYHWGQ_xQD7A5l>leRW+Q)ol+wR?pGtdeZ z782T7z5uOBC#1KA)exW#buz#n@~J4Ps**e8LlMan>t{WQ=kRwS(}hfC1EOIn^PkNt zzwX#+N`QMunI>WoJ00Y!?`ASEezS|jt^>P;e^7lOnsPhbRV2SE~afL*ob z_G71>>yBqmpE>hmfqwCAaHyM`8!Kd+B`yHnN)jdp0T8hfBmyYAC^jEDd^m2#@047m zG%`E)P#vf`s#1>t1I;TS)#d^M?R>g=)2QkB3GKghC`nI!>ylA$%B|m-w~oNN6Li0e zEJhV4)$Bq-%vW+>S(3M)4V@(lD!WdiqrCAk|4Z z@mLbS%)={;0u5nS8z2|}dOdzQZ|_IqcvSFUwE)c%Zbp0N{tH%}?$W@UwWy(Hn)h55 z(nFKRO<4cVop-f3CI==+V{1lAFpeM_5KBuIpAxg*|2@KavBC%*rykS>LP*Y_$yZY|J)1Ax*yMI2E_lX}UEM&>@dmvro zcWeFBoRqslyjA_xkkG37e_9OP_3A~T7!)UC+cS{}EKgxSoz*Qph>~c8J$lLF1XU!U zkSWJv={+z50A5yBHc>r;dhHTwJj=OT>GgvllkCwdcQr4sD@6b`D@N1a-nCV0S$TQ+ z;q8mF=3<7N)|PzMRG025ytn?Zf@;R3%9lOQC>)^|Gw*K0>ZHqN8$ljI@zTc|&V~{7 zSk%BS33TJkKvnd>fEHW=>G&}k!N9;HIQ4~Cg9D8S+l94KN2wSGVhW$|cWfCf_mU=o*2l5 zl{6u^oqZsv_vbg4`yodK1kzzP@Xt!YIHc}FOfMWfRRQxK04F#uAG{SeECadjf?eSs zZ{5&x13iWJUMi0!8J}M-4}W-}yZ5lDQcKjL7Qty0whKSECCDJP*EhFQQY%n6a!y*pn61W|( ztFd?rmZ(HQSiY~LgP}9ZjA0H!#-wsW|5@98C~!m$qH;mbz@E=m%zuN)ZKWV1MZ_eg z$<)NxUsWbw=14Q3l@$ea@G;0odRs10IJ7j0sU zM6fChRwAcFFRyEf8d*+DBYY;^ut%znAi~B-jean?8LaB*(<5KN14RggQh1D&JTiS4 zx3|tezzz;$ZiRa^Ohy2K7-^rFB$ZPwcV|%aX9IO>Z|UQAqrg1WTM6%q zT70oz$s(2qVb?IYrf|YxWJqk|DE`8Z#9V~0fFR|AzjTaqZ%H=KSSt}@wD%&rn1{JA%MsGYGo-YYM_7|$hs$U5Seftg+DuL@Z+Y+DID8w(lGYNl z7s0Hez?y`ai+!)o+=K+N%kzCK#f&7Jw%haPMc~*(=t$rtv08Fy2q8$P5ShP?DCZYn ztRYHZxB+Uh@BUUJbvym(-~TU@da|C!Wokiu2E}qkOBA=j0rjSE6Dict1>X@uZq#lx z^BxFRGxr-sJc){uTy+x@{SfvB^>gs7qaw#TdlZH~6h(79AOsX`*c3K&oSf5BM-Cqb zlP8aH!x#pu*R^|QH2V#y|(Ul`L{{4u&Zv=`< zNs;>Pk>oJx3gdhSxrpoJ+T9>DpOg^*Qz3kI9Jt*4E&VjxSfDooLLX!c2!l&NGb2Z0 z2IE772nq;<5qtNIokGzFsS{*5HdE^1;o!vkK3x_v@0OlO-`2(@U{i9!$M&52mpg;X z;cj?X+;?W&vXiaruPz$$y_d6?WSTfd0lq(y>{u|B^{79o6tl zQ6=8m7jtx(px2${*Tg(z#wasTpBSd@j@`pLAvMyPQ7`Ze@y*6BdwZ@QDooT+b@EiE zk235#wDs3TDNt|s;Gc?2QFhudeGT-U$aP%UlJqLtkSK}MQ5`vAa-B)i#>NJ$Fw(nV zf+r>>d?c{NKo(FUB z&b&$=Mn!#NNSAE;Mo~)4j(j5M;E~}(lPIlBw&_BL_^U9Omwp0f%!Pvascq z73_BKA5Ng~t`H;FgGwo~Lce_^Jpr7~hOOv386yrsrj_Bmmi_dp1V~%3gBQvL$1oP8 zC~ATv1r3E)Ug5l(Hf@5xWOc*uT8_1;Gv$LP9!de`FtJc+2K|!kYALBMf%pbhfcIfm z$X;N_O1^&o-s`-!6qb7l*7nSuum3D8;Ix1RXtIIpZt+=@rs)VT5fGj#Su8IvfA>6c z$_?e+SRWWQwG1m+YM6QpbMvZlaImc`q+_eBV+4edI^iY@GbW}7Zu0x$+@l^+vh)LK zf5Wvq2>AxzAku|6b_d!N-P{6bP$8=8E`$^BIgL^^+5{Nx$rn)*A;N4C(h*yu@VyZy z6iQ!_n+tn^pBU&SLnKHi{oyp99Y~BKB#SOM(eZOxHrX8?Xy0gQ{TeUZoplodV?K8o{M? z5HHr_dFHW|Er78NO)nJ*Wo6~!g$vymUxE^i)cNZKn_8#n6QM!K$}7x( z-VYRcCphNewlEcQGwRAGv@*MJW(_^TjFv7vax{BsRFEg!++gw~!Wi}ARd_~-%!a@; zk7k_hR~+G-mD%RO4+!IpMyhwlVM{rECV~MzEqVFVNwa{62yFy1wQWe^Q23-dY>rML zd}&NNDj&a3q0L5#zN!`%l=5_3BWE}W0gPMcXp`>a^C_qSS0}UvIdKyw?-d#X1eCKl zcuFDQ(ndx`Jfr>nA0)5HYA&0l zVt;la5;v^JGsXl=1o4u^{riDf$@Xl=+FsNWL7S#C?TgCoDYF@DQ}9p3^v?BHUK~kB zWd&wzS8qvk><$u5D#L~=(K)f5-ZwytFoF; zuJChPo^0PziKd36+EfkiO->E!%)1XdIX0a!L_SNnXKrqY`rz<(67wm%+VBKU&xdeC z-S9(R!bg!$H*F{Ou-!~R=t|-N{GM==3U=@L+D=^5&3xPln$k#o6;?EC=@koBFo8OFuO3qI(7JBS=wQcB7w!xYO0Iw=Js z_Qv&FdFcLZy_h0_HXTgp5Q01`pfCbM^d47*%@}0!O~Eo%(@1RasM|l3{-jg*bbROC z8`n&uZqV&kDS*k6uSD^lR7J4RvOY33F_Ct^>lqiWd!p%Exoc}tOt%DxHI)cAh%C$hQz}UcX8@Hyo6l&YCNR>xB2)v)} zduL1!S<+q~sVh})ttB;}j%w_Sc(Nk#VzU{INqxI|#!fs?QkPOJ+#sZ=b8**kDmLXG zx5aaI^i3aR)R?S)BYm92Eq&4t7Y$cpiOhh3LCoW@$3zK7PN8Nank@rA-aT1P)6vrl z=!nV8$|6w+Xn*`d2u)5-W(Bj@VS6(S$GFoeAYZ!hbVtm8VVNCh6nvO~7Y7kXfv4)} zjnJ@Af8C%x=Rqie1kE5AwZ0e_yk!^oOlQ&n&HZlspO{_pHhUq+&rdUKhXu0=h08fE zNc@bC!YBxa8NT5owHkT0+B(Pi5%-&>tCSv1-gH zt9`6*ZYC7Nv-gw+sTP7#nva%2fXhYdz5Dk^zOcEViX>~xu}l9KZSNh=W&gj8tLsWv zMH8V&lx&%0ga+9wTPWE=gCeAo3JKXGWN(pChz2sV387(2^d?#5cbufF&*#3sf84*v zeS2JwOTFX$KF`@4<?YwdcMxHd$*#Pe3?nffqf=0R?O~D+pdRebc1`{wom!)F3A!+ zv^k!5D3l_9M=wKdVPE4$rUd(6G3F@6V%;zp)E{E2Ry6x9`mH4+~Z903XJVOM`l{Mczb3TwMg1}Xn zw($TZx6Y#&3`DJrR8&;tD4PK+6e&BZO>k-j7YCJ}a-w($^9Y!nocL|)(qTj!KcQUt z_L)Wy^eod}wzg{Sk%p)CbYnmTE|3WVl-*tGtGE(SzHt z`0Xjx5`$;9-Gy+`-eq)>S6z^g-2FlVRP*5ZkA!6O0Bi$vsT&IHjQr)NzjV(djI@Y= z5>u$yWn0uva{W_?u<861M_-Lx7iLl*DiB|urVBVX^v!v09iNl|YVBQ7+l5JPR)*VQm z5>G`*H1!}_falJg`<$M?6U!aJO_M-MfHkj%g*?kvk2%y$HB7x>boIOKwvQ`%u%$26Yvb zjNTSt(DgXroL4)C8hM?0NJ8~$RR@^(a1Y9#ENN>Z&jYMO$?QjM*IUZd>e!j4%2&$VG>`)5pTa)aMlrc4t z-_gdgVsluSL{Xc_c%Ar1Y5|?O6Q#`NzziVbQeyB4mS?k{S(25!*)MKlMb?m$S4ili zP1T~_iL%&E0W-xY@mswqNNsTV&Z1b~kYOLT1q=SFrbdAVtpv{>Md0eh0{9B4|Iry0 z&1BVwTldPN3nyJ>^8U*AFAPPC9mow*e%w>8=!nqwne4c z(7t3qgoEz*5^#bne$9!cj>2w4=qCXC>V`$&?akDR0Pc0_>(?zQCK#TCGI^@Rm8oRe zy@XA~!A*t0X9;}S6J~2KmrYj@ZcI;4TU|sPf{x_&b?Y{5IuNcWOHJxSKl!7kLi6Aq z6IIvFojZ4yaZ)#1WEAA5*ySb;9X$*5YJJDcH<^vQY#&Wn$Pe)zb#UD##f%F0aq9wM zzztvvEQ|V728NrHtbLA9RvKBQqEQBSSn#609`!L4APuG4pgoV`V8&PzO(mv>2E6vN z*UmPU)>I7Lznh8a`KfV4e0f@$or+r?PvvuH+!j$njI4Pcc`_bHX6OPlLrdR&AbS)`nwd`KjmFh-{*Ro{IYE+VQvG+8Wfol1Pu?U0z4yeSFIVM#E z+S&@?ST*2FC{?z&BQ{D}pnQo&6|!xs2;!ikbi7Sm{>?D9WMsN9Vl&IBALH8At$6FZ1dR}+>s2L_isDIBrM3wK^^ z=FjN4;UH47a=}R>h#&DBwbNFQ{sb#rf~(iWiv0{wk=Sy620+KWQ?bR|+4`FkJg~>g zTMhfE?_btb@L-K{cYlR+axEqO9&gkJj1H$tzkbd=+3H)T{`4vv$#-Yli^Xt2G+qAtO!2Tj1(DLqe0+2E#3suQX!)KkRu40d&)to$nxNU({ z!%MymID{hedPZH;DgndM-Sb`K*3FxJbrIVAoB9-Hfun~2)!XCXI(@%UH)M8b;Gkze@Ksw|6bHVAe0Rjh%TIokrY4QU_ zzvLt9Hf%uf(S-*0N0G-1*B46{f2c?@`w}xoOX|#F-a@!^nLoC|J0fDMJo2+ztLnmE zfXau>&GKexjnWoaxAT14p#1Ymu;eRj3pgMo#0>SXP;IN~-Of>)q=*%Mer?s92$bqo zZASXCT3~B>3mrJ49#{3U5>3fX=qJsh#LJxcA$R zQp6=ie|ia~#2bL_*1hd%p0iRkI;!!{mnMbQM^=gk$4 zPEIM9KWgb05X53FXO%nf{{4QdmSp&t%B(8w5{~2wG{aou^8C6h^!Iu&hHWS6%&ehp z>%Y!@7hlK25$-7Wj6$jzH7W!dRrPbb+;hG_bqNt{p70s+-Uw7F;L{g@ngB3l%X}nh zJL=!okZK%BMl?!)Xb&T39^}#|x8){?f6IHJhAMX}ihpNqYCsEBay@UZLCYX z_llB=L^Fs|z(@29^`JgcW7J0OFZ3gC?~L`!o}LmQ|2q>$&ircDnVehZ;FS#$T$4AE zY7Q_ad6)ArJ&7O9Z%qOMr@x(lZ^`Vy4lvJ)@?|OKB+em}+nhqoEg)LH!Q+986R$R* zWr({#LP8h}l|BTS%&bp^VEAF_st8ib6p6HzZ#1szz_@g6(F~NRY4~iaas_H;OBa6@ zrS|Wbh8rN->Ie`~OD0-syJX8NiQanEzG#eiQ>dGom{8r|J2yWMu*4S(6=+aSX4F7= zXp58P+;O62Ien54;J-h}hHjd|sK699FTq(T%R%U!aj(?%jkO(WN><&iGv!~hg3k}R z8-36|#FFV$AtX>{eP3AQg@feLVphF&hWI>vh4NPM0DHP?h5%#$3P43ea|vi6#N8;n z041RRQzNhl@n35sP9Ocwy>9ohX{X#bN%%>M^k-?zzB>8yZxpak^;ZX_X{2n`eyR9# zVhY&<$}pI|63OdkbmwNR&zAa|(Z;kCgsHZeXG3Khn-H)U!eEiU-$6qZV|Cza`-9q1 zEJP-mo%Id{d35mzurv@Db#-+cP$y1S-EEWg4v|zp;K6<4If$bXpH&YAp(2ZZ!;_~^ z>FNSUi~Lw+N7FdmG|_rqBAyaJjOBJ++3`i1ClaSxFe;BbkF~cv#NlICXgOn#NcWZK4+l0CjRk%E86oW<&j$|-=4qK5`~K1-{EIq5L!~o&e)`?u``F28_h7+*Rb3yG1A=e= z9E$T*C$0Sj75B4UE)bkwPf2Nj;!|qB^B_?xyHr&O>J!}mR=y7rh^OfPeq>Al;BfEX zSV%Tzl9Hvkwc(IQRD5*lEmncC8OPX-x!)y*VUxo(9eW3i=~7dC5($^ywj4wxudiNy z*VveiFk*zke)ezaSR864{qGlv?t+ODN<>kx8dlypKv>mJHMS8@;u?GUu^ zyL6|`TFI~#KWBm#z(!XqCH-TX=p5%n#{o(TFQF;6OQZy@;D==bJgtS2Cwwta&ZC(f z8Kx7(;jwnPG~fEn#C_V1HMv_@Qt>JjiSIPjM$Fd~`y2xx;EPP+f-sH1T z7d!V74W*p!Y$wh#YDr``>mgAw~nx2Jt&(WdnjC^A=)&j$L8!k`qP)>@M_sHSBG| z+QE?KgEq0H*%~vE_4;d31%i6fKI5KB%p5HBdV)r#wpc_~);NM&4b=Fo{pst!qQ}ri z^Kc$jRto-|bNz?UxT%>kd==EIp>h)PFO#vBU*DBcb=&*Og%k0iFHCh>8ID;|e)W^Q zKv<*Ao0+Uy9<_ey)n~G?Fb)Q#R}ETWr|(!_7Z5Q-n5cXOB6bc3T zb2AL5o?|Esm{=Nl3t_sbZ?5`_9FxgxF?kcwy1(StKHpU)8;#f-2m zkG+!h_GnmNYe(cCcVM4WeKu;PshfI%B#&5 zw!pw#{eVq#E_It-?{Rk+8_57I@b~81sLW#2mN8GKkn@Ix>pS*cVakq0AON2n52XV_*jl^49eOTwgd!I~vJimjGFWgxG;|)D`Md*9tVlis9i$UV7FgvMVJApC`!fP~3sM*7 zMtQmO^6iJ!HFfm#%=%lxOB(eOYtq<*HLqAZFz?7<&u;&b%l3s)c!YT-fGEz|yz$2nd%k;(+ zIzMQk;}O<}2_%6k$?OT}y>!!Xdv8l;#u#W;SEs*y!w{L=JC>_~qTRdYFRop50z`Z#5!`A5MT0GoDWyY=-msgv|m>l(@I?5B}2HNy_ zOU=uw;sO1Nu6vY;c50ugMV@#PR%7*@h=pOyRC1neChGEt&EKLW2l}q`T&jGMvE17!5}QZIdGg7*Y~%8e;ZC0_C|iX% z`1vpV!a>o=p>T_PjvYZ=!xi{mPx1W+59*X`u(fYTH!g0?d-S^6h}v6SL@99EnC%3V z{E1JU)e)XaMhW&f;mBQJ91!UsTCt2ki>Hg{`}|5RV5bO4dOVpZJGb{^vso3x!+`~s zW6>1vN$;PP<&xwE7iKkyrw4oBC)+ysHbeh_!&M`KwDG;LsAwD$iMqP<$FTZEm8oDH z@Y?+ZsDR(VO~|KYR`)(VHq(4$m?(|^pr`fKiQq;p&ADW~@*4HD?(pIZW3}Km(3K67 z#UZd(c)i)NwQoFbr^tn09Xh6q%X0&0`H+2P{6tSAm(?)a2J~X=yHrEO5;6)IttkDZ z5g{C^AV5g$8F&slD=MeujJ|j7grc&X3T!NbAc6t-wi)GEp8J&@9lB}g>H6@P(U+oq zR~axfGgH|KIt55_OKXtoSAPhlK451ygBC=LGOnNuUaJ&D1ntLX%VX#(v5>XIP+Z2A z7cU+nL1tFCpLG_OVE68czuctN{ggBQfv773Z#`0!*x`7WLXV_;G60Mt3bCS!ri_eE z#d1eo`u-0~nHl~kyLlN0bL+^FBj^xij=G}(i(dtgF0 z34<&DxNIjiBjeBR%e{2n4)fDCZi^x3!?4qL_*|3&ii}Ebir}v6>7~x0i}tm4C(49H zv_Ob7`$mL^TUkCj#HW$L-DYWQ9Q!OBNksFN3?%LHZc!Re_Yi`ibffhRiESTuYw+4J zbanFb@+$A6BnR|nfD?-~vsPT*qsP|Ano=%Vukf8dhV4p?i1bQxsvh-yGLT}E_>r^% zS0XE029ur|LNtw{+X)B6J#}@Ttkt-_6Ggc$9D;|Hr=}V+iP#E-xSzAA1)|>e6_NPe zFRsv8(Av(X`g~}oib_2Spm+9Q)NcxS_o=A9f7FYfLffMkVOuyYu#UoSyHNJm#9Sq{ zjLqSoX(KJO-bOEI5#t5y{|O<3fNiPTS(%b@R)=1rHkbSod$?yBt|Fxl3Bx}o$^hu* z4w$G9`Oj8;aWZS*tt(5q%hlF7FbAj^cj zyZn57Y94L%ig89pnug{;YQ6Z|se@!|{fS_$yts)X0N|rlN4)Q#A86#mrq?Tk*~^;1 z2erI>dBp90pycs#jC6xAMk}&BZE2)=dFL4U8Qf*80kiS!^8!3=mn~Xc3x{)mh3LO_ z;x)(RV)@TcNR0^AvBPq=BJ}-kbobz-d{dDFTzda}mH!Jwgn4M$ zDQ^}FDVT0Yt_8 zIP?XLl!kz=LCitHQx7o4slzI>BSQx;=`43t8*mj4^?4Bvq|I~vx!b8H*V=|`8~_oZgYu4|Uke|R1ImzIjiA$eY-4QwbYX(V13nK1+~I9% z0tilZZJ2m$j4^=}*&baxC((AW2;Hy-?en_k>M`-|)AP1KNJqq(5XIu=nAMq8+RU5#SA)|V^On6y7VHI%W_R7NhE?U)F=Q- zu6i0cNy7sJX8R9EpGm`%)V6)R)X{N?5W<)f)JH^wy8hq%yO%e4!lTCU`|%EvlpjsW z*$Z0=DcsF}1E%%%FF_}MZlR%RLkg}rxRk{n@f3fA>=;%gL$5|1S$9}aP!Ja?Tu}&c zg+lK?x$o}oP7}+4DyJ+B6cItzp};-_mO*QE)(V6 zWukYa@^-VW8G_A^qAK!HaWaPHz#h5Hd{~<|`=w}ny@_&4kA;%jSX*vjC?Ej{^vVT{ zBr*-$E^9`J(q!9P@3?fyN0u+>_7WKpZNSlp=R^mH`0^W31d@n|=$br&AAhjhZ}KLAzV3Ub{ss`1S9f-Fnt>2_SV7$;K^xeF$9X?AyQbzj%)ycspB$6yNhq&j&U7LN zF<9L_LBH#>tG0E7N>V$zmh4UUeO@PPoZY^bOqOL~AH~x3%CanzD{|N{&+;ALvFg6+ zAcc53JWI?Syra$CQQuf!ZwG^y`lUTx&n=VI?;8KKi z0eV&ma@2j>Aq4PAxG0TUgfJsZv*<5*NHVg@YQ?2cm&v9!>d-vwUJgRD`S1NE)H>Q+P8Gc_@C^KWuy|55Y~=Jl8~xx!}#G7 z?&#SOj1VbSlMf?NEvIxp4hxv$YJm4qtW_fbbE4FrOi!D)4~ad?c3F8prmjRdU2_Je!A8Wkr=?!z^(4?~;8sV85Z7Io4G0puN^~T2*WJJ8u*!7d>cy#QaXF<0yEu&f|X@t$_rbn!by!_P~53Q4ejoSA8|SC$QV9q zR#o!~6x-ZPvC3cMZicI^C^S^RvaIh0&hYO|o=*zJQc`}2S3-OE_%HJJQA_0HsUxM7 zwZuYsGVlg$XRl{fuVva4a_XFtvR^>|zigVa*g(@$yewz*7p0)C*$Yce75tJ5=hYJ&olO_6TYLq#CwwX1>Cc@KUM0^EK&g8wq zL;v|IN1h}7y=5Sv9uwA4>?fO1Z;hpK7sx*UC{yepfs;2TrLInDZ_nCBAK~r&_E$okgtZqC0t z1hO>Cs&!=VjZ&W6NLmG3OsZu+i{@>dU21pu?`LslxeiM9TmhjLzgnEo-jS+0uZd;|58}L*6CF1a25@k87toJFBPY)M!QPbt>H{YIE`Ke0PUvHQriiJoix{-tj z(o*+on6B>w#RbQeA2V4Ndjp5SpioE;MJ@p!Bu;aj2SADbLruc(>#sX7vCKM-6y&}~~jS5m==C=ChP66Y^U_6%VOI^VTE0B7-9;GLiU>EH3G+KO>`J)LHWwn%!# z*ZjdAWLn;R*V1d6GHg26)NnaCJ(;r1O}xn%meu+PF;nUnlu|bY+gR^Gp-&sdN8{mU zn2ui*fIl8X87vY@izb4AD@GjTk0NoX&8^_ zlp%@APpS7y*!0Ks@~>QPWlUq|Vn@-YWVTFUisvCchc_R7euK@+>)C;_9%mK7;N6_6#EAUSFCKa+_lTQ zgN%&LFfi?280B2Z0$=q?Ex^71-U3H%MMC-U>P%a~>CoDJl-M>uP$BSV!9Xsjj>~AWN&4B>?dXo1ywEqet&TXm*8_dbB;kg57*vqsyak^~$Y3 z-qM6#W=Z4{zxvT5=?TR<=SL?4f;Wdbnw}`xuJ`HVvw@M&z=pg_W=~mWhr`7GsrdJI zrPNk5KFFxV)|rQFkB-sQb20fm{bAYHFI`p4^XLCO{P+4+{^WOgo)LVUkgOpI;+ zU%vVnTvwzp@NY4DxVe2+uA*;s%YP|a62JXFzR#~y@*khTH2zEL-@fM=2jid9A z>NOeS;rsu%MD9k@KmNAzN2fI_Ms?*C;`{%V&Gh@AnkYjpbgXDo)Uye<54-%B0)le0 zc|PeB-uJ#pt-U?y2dcY0H;=~`*y~spsl)2G6gv#QI28T*@a~8C!flz<4|W_#j!R0~ zN8@?VQ^fhh`V2{)-6ipP4oa5`3iIC0-U#=2wodX2DRMFG`I9G(oSfbxwm}g>nRcgb z6P;3Wb93h*_+RQcE6maP?p^vxy4QMNG!y3I%H#gnlFxsKfPUHW@qJ@%!K;gx}R-3!Rve++hRS#mI&qlt(lV|-?}Z}mT$y} z>sWB%#_x>cu{D_15W+j7Y+#T(8IpB%@`rJlV&eWqpafJTqf4xt!*|hSYCQEczxs2R zZ>0UXcJh6Nl}^sYTUz&4PB8WimHBVuZgQ%-VvIRHAt|Xn+oooHe~n&fgvaq?h7%=M z$6v5qZQY#}z|iSvZ`&*1FQ0f-!1qA4sEEeJizp4T&SOr+}!S%mPYQk>T9@8zUad|H~v+?sNQh%wjHl8 z%v$_=-BQ^JHNXBQ_3VAaBRrU%DE^-(EM>h%+aF(iHJ9f!@1UAo_-$x-*k;D`;hl8< z!n|&0hfyY0?7p8TOHUqalg*&lyuEScRTm#$_Vw#8INDEERGl85{>GdmV{dOS@um0T z=gJqxZ-Psw?@aTK9@xjq`gJwNC^%+UIlhPK9kFYDSzir+>>$=KM~ zCS75|TTq>~-@@+oj;gAvk+$X%2k%ayRQB5RenZXNqRUqLZB>UK9&P0aIwmI0e?Nua zwaI*MI#-D1k+|YhadQrZmu+8bH2&Ae zvn*4Y$;d3!tIB7qQ(WmqkG(E4EONSSTK3rKOn;bG@OZOXld{An*8WXi>PWYFLX>U7VM2O*)ZZ?S|71hn{l_Fl*Q$od>4dXk zW|kZSt?6G_4LoniQ$LUv6Z~vorBrJ<)vFp+ZN*0UBSk&m_kTEKT&%*j&H1IgPQ6dA z&fBW1Um`Eb-Cxk~?nUL>JEjk81^c7R*W*(b`ggxRllLS>1A2jK?#Y& z{dppie}s#wk^h>&>t~YQ)X!Qvos&(jwyrrSGBi9=;z$?cwD;C6a<1(|qr;X@+TPV_ zvO|`J(chx0SM{R!W>pw#wrV*Y3CBx2tXFBeh0EtNh^EyVpZyWO!IJL%k{^ z$NS816E$Zb?4w>udULMsrR zuJ^>ptbDCs^E(g`)XlMa_K#(r-58&F#hxPd{PnKtlUYUgXU-aCg@2?SMH%j~b#+6!|df`v!;<5U7Bx~hy>)DnunQx;* zqoeHKG5_+ZYyIv1XiV@;i`+#^b%9hX-DCSM2EsZUg+|&_*hN3j%wH>X_#)||=w$Zr z;GfTH;`j5436AQSKcyARrDhskp4Rrdy!`RPV^X{1$4}b=2Nz2$Z(Bf}$^QU{cItb* z#;}6%cW#ceBTD^i#%IMlFUv|>WvK34sWM@Jm4?mw3c~x#-=X)ozz%ftoJ#{qG8K*CrryAZj2DllB)@N$SN$lh1 z9`lvFY}5I3Q*`>kz(`~6ZoAQ;p}Vy2+$!FAxRAWVB-8b01DsnqjBR{fqJ6>^e5xs_ zz5ZOiHNQpnRf~@uf35h#%1!eOI>xv4QsmtRprULct70=fD%6uPgdnn)UrPj!Y z=OgMgZ46Hmuzk0JoZQ2TGri{C+L@e|XAZfXlMKFX+xyM3Id1m-Z-s_0>NwLA7Be#w)*;`&P#ccK_=wgOvMjcDl`prYHI(ls8UKmPSm!4wvQ* z7yjIu;qDbAE1a5SwRURCUTFNGePU+n8!aswv7b8K4}ETvau9qCr!pFJvKyINT4uYx zN`3Ly6%Hd)V`Fjifxs+Q-z^b-UydphVE~n==;BHaMW&Y!@GEg=Qn|zHJRwO-CUx3= z^ozR~rX7BFmdhHPPLOX)={GD@Rx;@Ro;8M-oj%XkHaw593X+F8Fn1aai(Z7u%v$ZP ze&U3ULMMh27RfjiP+TOxp5^YlQ|!k}NhZT!)uxKhx;*2eHg0ofiHwz6K&_$@|GSf` z2=f+0J@e0sv3UCTl3PN4o8_`(Jz_S$IKGlrRqmx-5_wrME5E+~Pg&@1tMpwp6*B}3X)C2sufmKG*!sQ(q z8Ht^y^8%U+J85ZUDIxNut*tEqf*&F0Q>-K~%%Sz@nbRbzghUiQc*6i#tk}n2A0Kn7 zp-SdG{=&q}jF#dp({9jafUwqmAq*%OP$W=i{4ocnPrpFIf!Rub7T~^3)gT)M5TB>ArSj)$$rJMFRvB5JH}gE+zVpe+Ei*kyp=l{xBdRT z)P`X86SqwDFm;AW;M(8W?x*D^DC#%#cI;1{pdJtSeA1yuzw-jn?U1CQ-M zQ_dFcd(0T{_TFG~;MI=MfO(I5gx(S;$;!TauWW{TGpB<4ho&3of&&wnbSPPg)>)NU&C{ zfXMF$iwdO5P&CxRh09d|q8qYa=BB3oqoWG9htM8h&q*hI_AUC&b+xsD?a|LZu}oW` zQ*G~JF={V}$Idc#^tc%m&2kHJ8EtGrpkz1?K*KN%+TRKX4lL^c7(p1k(r>rm>+bF! z*f`bRMv%1t_c^|F{Uj=B`;@|u&8J5mUx3;pU<`6T__W@l%f6Q)Yobmj;!Z==g*#!5`m!KOM=pdvAQ^InjL$C_w@B?hQS zJVRTJn){_wK*;~61@U4gLO7;gJZwV76>vgrr!jP$WqcW*p;L_iJnwpI1wRAG8&F1S zb)|QJPym+;si#mGV56Z97*d@E=m`O00i`Sr@+a%HyFuOreFA`3j_t_A-vPS})XK0O zP775gfNf{7l`cs5PEJn3c(mZaL73%xEmfG=W;ddEW9 z7eFTs3-jpalr=Y>pzqrXTox@Oqw-~+mkW_QckzgbEUC@T8_cG{S>p|Fdw4YZw0^t< zjx8Zf0hDcjoej9~*l_^$^f|oOVDy6NYkH;Ae`%O;aU?CvA`bINz@;;`s)f!D$iLN- zzy}SjdJNVp@cit@Ux$i+l`9Bm6sVqkyz>k7A>rhDkYhEG+Dr}rG!-fCq^@1?*5||` z$#8DX`Ug2*hPSi5zwe^5Px257p^aH@n_}+ob7$UDEyg-0&*lEIBKBdJDa%E2GF87a zqtb|TKX~xk6GO^?D?-bjQEFhQ;ea=u7n3*SzRDcEi*vWu6avX2XU*Pq-&tjg3t-3~p~7RFEDqPanOp+ABvkW2SI zY9iSm@zlYv;i5@8^c2n}Lu(2oxC}5z?i>K9m|)xj)hny4oM^iEbKcHBHqN1GCsY!$ z(-m2*fzQnrx?n_3i_hr@us%6w)XZA#@yKTF-1l5&@hWXV+uH`r?yZ4Bse!7>H)gT z9=wIbn_pN9!+_KK1{*G6{1ZTBAh5%nou#{nhGi58SW0iNQEe}17En(~&UP5pieeEz z|MBlqFGdB;RE^W5SXWpdGwI55hR;nK$vu<JVXYVdtiH9_=SWV0Flq-mUs$; zzrWrI&r6=76H-A@QG~Ww{B52zps)avW{u*D<=tNbZmP$6eOPuqNMy#vu>@>C5&?b# zFiW$9{=@ymwhI?rs2YAYbaRkT-Szg4>v9}w*qv=)X~n&-ix`6&~M z6My9MT|v8^1<;g}FgoTyaK4YgApEfo921X|5U45&wXN%41=!dU*U9z{I0y@(%A~?2-liB*1w)SQC z6)@r76QamL!Tu+t3NnE#63;QSumHQ~P2{mQ@F}5eO~`%gh;~9j8hueZrZp#~uKq6c#U*UTVX1q9dRaJRz z^thAGH+#l&qa8pXq4fA1YL;A}h#j!VO%Dx*v+W@VQONBAk+Y!nnq(eunsAwN$J&S) z4Tiw5@yU$=2{lJOicDXIC@;=%4HW&W1DKX1!!MR zQ;Q?FyM6PfY*zL3SG7mR=!xh}Tsfv2Y& zqRAjJ9bMh8G7!PAznbssiy6U|z^iE*YC_|@=bsH5nyW8?B+1k{BHtz=BGRb#@vpn` zKt#*uA^@*$iD`w5q<_Kis+64dr$F@%H1~48e&OU790#jRbDSQsfr+2R7p;h(F>J$w#-v%U4D8ySn#rKNI_2%)Zp z$7b>tR6wQNgg8OgJ$vq`(NoL5-sJ+m^~Mk-Wo4QNh&?iM{-M!ExLB8x2TEXaQ7VwK zAeEj!f4*ho`t|DV+=7Br2yqY)Lq7!z2Jr+D=jrt7C~ye-C;{z6@{{)YXn`pJlUBmz z#l^+Y=3`|Y8ymx{0NpnLmr6gqv7K-K{>}Q0?e#xP>B1x>)bWT$ggI8LPwhX|`SuIk znqwSxM^j+v>cX196V^RFJ+TkM!&ATT)%Jbos;6&y!)9b{VWCsv;?zIes ziKRc%vPReqOEa1+aeQXZ9RTZYF@nm}3y; zz_^{~{KwxBRN6GoiNp>N*W&{);6)PS1K>JzH?nQYOuZH|UY&Y&=Pq_jHu>uVM?-wZ zyuxi_y&~jcXHG=1GcXWxW9ZjK#YdpnW9b1V#mfN`MgbuC^dJI2xIF zj)4cjU(nqc8WG`5){JOUdR@V1HC+qteL1c!@#wAS(wI6IeLSE1upwNu`g{dNl?i`; z7@dUb<74{H3Ey7-QJ%(yP%ZazXQkr35p)Ca85|}JIPZlg>9oc7O{rYHy}XR+Q@Hr{ z{!LC!x&?%4D3LP3YkA2PrUC_u^otuBbT%STA468$pXUj@NI?iCXk9oVq5xtd6AN=W zSD^yL9z=IU=*mtM;X+B)MN<=>Ho4!t`8VY#xD%>T>`Lu`Ub719oob=nm?pjEVivJl zzrSK+m(#<;AgegB?A>dM5G`z1+5UYs^47+1`tnEXk-Q7|2-?dkDSi9?eb7csOsvNd zgkS*SYrAq^;j)pDg&sM*pYKY_YWQJENlDgS9Ra4^Ad5ka3y%_Z>lwlci7Ug9r2v1|^uSEP(iVx2LzH3}rLnLki=e#A{`PImwb?c!3bNC>_u9@6VV4C)j? zGYhC?>)uR~y7E1ht2V^Uh~h0k+=EsX6E)advwKC}K6gVAIcAn?ov&RGweZ?U7vOCkb-L2cUQHw5X^7|DG zS6C@$Z0Yn%76IN^#PVC-!u^0x0Y+WW;EJ#ShE`HUMEBue-MkpAp!)PI4)##g$1&`= zG{yXc_;{DE<=cyuHqGGtJUXc*HSHDU{$H`+(r5yvUEl_~V)RKd13i5ww7`%G$%_H8 zi_e@zkmzy&+!^LmfdQrjVH8u(dL*#1;^hM3cR%Xu>qAaB)>|5Fx|(|)!jf_q?QmV= zO$pwzjfC3!M~(vr4m1*_5_R?a_L`VF2Gu@~=;-KB7N3ur={jmR#|R1nl*KJepjjG^ zQU&uVLBQ|fE)xCo^1ea%zr61*qy`59Rvsn_De&n1V>o7DoZn{j`Phj94xu&JeK0~s zMuvH(obPiukTq-8$cbU54#rgL%E3`iV*Oi&W?_Viaug}Vc+gonJjeTiobp7 z*0(1FoPvU=RoXG|3k5hz2GLx&O_!J^Bunh+E>JL9w{Bf-G|o~&70f24oQm$*bF&lw zdg%PeW5BROD|UEr@VGaUqFcNmr$5Cb%2u3#!1sZ(Z_kaiuv;}7x=weP=T34h_DvAS z8_e9dP(~@40ec2Vy&2?s9Q7;v#T_TE@fxELc#_e#>Vz*?bs)X&%(Fb2I}9v;Te6xv zV=RuvJfh-buoO7n6XL$Ry8*=Rx9r3Tu8d#eL-&SW?_&BXB=k04k=Er>{_==43 zEg5C<;=^v=xSQODPY;>I*!l+!wFD+p=}OH>UYH8uVOL8bmELLpUE#G@OSIqoBr&BD z`Ak#F3Cy&IJeDD7rWXpJ(THuQih6~94XV{=5yRslehNTbgOEGm5*xA{kJ(iJGJsL&y$EZY5Q*Ed`Yi*K2;i-z|i%58z+;VYj{)w%hUmm zJ%`jTFYft^&4TOJc;m&?I#Ohm&&3wr3|cai8)|e%PaHVIvhQefDr=&qkCUR0rJTHm ze7cH@yuDSVinxKvD!HkU-|>l5+v%IYS5|IBlV_ZXZlhd^GBjI=`uo)d#~^EDr{N+O zSsk#*ftNy1UL3-0g6tHSWz`s4j+g-B11t9>aEA2sfkS&1wLkE3)_d=urzgsUgrtnJ zFRbWi)E)5ePDgTwt;c&Tdz(;<&h7S5#Dz}^y9;$2{4?!9W$|ynpSv?hQ>ZT&c+Cs-8VF zCTT=oaJzT!A`T~AUm~8sqVMqbExIfT9FK0q-8Fg5HKz00^K47uWf9?PH&~327?;K- z9p0-#PG+Se%+GtMrOmj(C6GEePx+BoY+XbCkMoA^}Kbo5-Jmdm!XYP=e%YHsS98vmRmyD#Qa!1!)3O4ggLFac$kP!x`ibn1-48 z`L4Hb32{)Ilqqd{M?4ukB4mT0hG9hW5m&0ViMemqoi+$S5VC>K0+)vas5mLJ!9Q|W zw97l&Q>RXyJNM|}!_({{QRGCG7q!LYM(BqkFGziN1q5?c(J>KJ&iC|{cTH#Bwzd)i z{ndvHiUWC_rC&F^etnxBIuKC$hAT+_=jju7gU%Nuk0Y)^DFwSf7c{0{qkYQb>Zocu ztAE*Nqe1g^iuF$%vz~r6yr>iPNH^RrIwl}GipRLW4RtZT;r$VZw`_gH5z51rHKaQd zG-7JgSotpJVc4ZO%Z}i!L0cX63V)pGvKZHqD71L^UhqW}4}}!v*Q47bWo{KyW!vhP z&5fbTHmc^He%!5$j4X$TSF+Qc=0n^eph!0_;{%>1AUZ+JnN$H<2&y1;F|;)yE#bF{ z>9yI^txsMxZTHjTq#|+V$#f}Een0b6u2fwij{H@b$yB(OTuG9y+VvA%(keaiZB1zp zgakPcr3XsCN^cboShFYbSVHCM`$KjY?AQP37YK5u7oj6j4(kumiPG(#O^$Oh8<2K- zeRIt7pDu&4^Sqy*yIn2h@N=OtR7HdD{Kl_`>XDm9pXTLcyD{h1lMW@362Qx~o# zexi|)jO>E!61-E229C;el|JF`@@@3{C6Ip)_zN{*I5oN7ZT{Lc>T@|dW>X)wE4tJ+ zB>pw|_zV5D8+&@2t5j4TzYBD<%X;Xn!Vs|4rRmX&hS)&8zbZKnDLiXBYBPNQw5gD; zlyRiWjRiaLA4(Lm_n$Q#=@*FOzjaHQ+{~8smMMi&_uV?djgnR!m61FiX+!j6Qd?ri zE$qH`?|D_tQ%G|s-IQt8LAI>Wrg5#xezI%EGH@|24Z8~4-f(S7xH(_`g*K{7@+y1= zoBeWYw~~MR_U&Pc6NQ^rDl{)rp?57!OV6 z%r3qc-d1I}w`p&um{u*{1%AN{tJ>r2LK#-E4U*Mj&|v}^+oUm1sft%-cUG|6+{Q}@ zW-9sgEr-t4*0v1kplp9uhoU!bP$QzBn=#0HE`geGd+U}FF*&t362z9uG>DsqYEl;t z5G24bZ0^}H&#lnD_(~!n+KYw*d@crk-}17uo2&YAC?>5AY>Yp!USU=K{Jv)1R(+Nt z@^XWh9sL!I0mq&SS-l>6@RH0c01xH?>)W*2w1i^`$9DR96>dH1c9A_LF^r4JpC{LW zRppVcApc`qYtxQ~yW=(!iTjZ!I+a_ge!p*Y*Vs?`R**sUS%cY;PoDo|u9Eud|J`3m zdD+&rsIG;(UP{i$n8XN6k9>R&Yhru-!M#a2`f$%^<6=ie@P}!0-t{y1OV-;r(4gDm zGhdhr>4LRjz$&W05Ge3$sMagU)6nv35?QGQlyJ<+pM9SC9?S2tE-fW6>QvVQ+I+Da zo%zo)GP?A>3ht0P9YO#X){DCycOF&S#a^rEvcR=Qj!W~d#LmN-y)W+F>xoDhMLngD zKVakIB@WH+E2S4c>j>+IHd9a0WfcQVe6N6_T+4IlpY`1v$!O-~n6y&cJ?xY>zi)%J zq0;&eA+~|7Z!$Nh2w~H=-1{E>ip)zCuC+kYU?}V5!lUjjtI}?4n5m4&4G=FO7Vp)S z7A8vy&bjxV2Nc@l97D-jzgY!_AJXmp&^^eRcDVb~o0IoSufqFM37mIM+OzhZ@zbhD zGMm0WWb7y41XRngWIrY31*J%!;A>G~np>E?2pf!0U$nYW6S{tC$Xn^8zNpfD_!xV{ z%k1U`TxY)es~;xX2k3=pEB5&uVg+mC-UVyb+?2cN(mQ=g(c5*NPg>!beV<|&<1WnK z5`aT?^Nqn9skoWZ%YVJD<(eE^?>{Xt-bs!WknPs}zijtP9;&-=LjFDX+_9`P>Niwk z-vO&}jcVBrb|l5cH7nm+)fZ$OsvU6T5~WvCSy}`XbNbt24yxWs$A%N9TV$>lBd8c` zd@1uKbM~ZBKcYQha^%9PiLSBv^y8&FbX(I+KdEBjItdoXxl0~$w>w<6E-gj;uO>bf zd8__owb3Sb-D>~5zr$4&WECyh(Q1&p;v@yY&t%fS6zQW!M|^=VSbZeA&uGGy=kOc z7p@;Ew`cK{BeJeO)#cG1F)^G2-&$J^cMGv;fheMPce2kWP~Sba&hq7aR;}qO&rNG3 zIYZ-ajKJGO4_h==-tA}YNGlsODt-ARnT(8nD7@5-UHLg}h_3%m+DLi^PV#lFmmeJ+ z*hI#3fDK$7`|%X(Pm%OrUgI;p4lP>*vh_TDt^7AX(^G9LeiwdKT1CPV?3)h-on+GP z(kud&4}}(;uCEb(qDt^NACtV-z#k^fA$Ku1*Y^nIGZtGpT_2q|)+fOzo3Uq@;#CMJPc<&LFT-?`|*Ks=6 zP5Mki*W$?6uTC1r?*QR^z|dAnv1#8G|5Jn&esivK1MzaqsqEaNhTIYS0R|^@pKOd# zec#_!7N7lk54mbzsFu(cn~t;_VqA&#w9W5m1_PcGzd{z{7hurM)+x%m_wFH9B7rmB z^a~J5#l>;^?{deOuq3D2hAZ7~Q+ny7c2kcFwHrt7vm5O^xI>7R_0TA#YFVh<*0XE8 zjy%kZQ98ZlHI!kpZLKx0Bxi(D=up>^k$e%Z+r=j&@R3#i4gYfK@xDeQEx$byS84b! zulWHCmY)hv%n(a)as=p2>>oapa%W_*gsOLcf%a4%vHhK4*mEZ2Qv9L^ms*Gcr{?ul zRE8@LrR5wPzUs|kJbFf}9l7jxsrNS>A$Hq)pVLzzmcGq{ zg?sny6JR5^-FZsPe0NT;t4pnFOR{_Hu}h`_7Ngozg2{bVWL`W;>!y)+r8B9q<x{-MMJhy?;ODfBD_JcSys6(-iu}!W8o{X%KV?TF3*39Zp0dG!8q} z0zGD0qF1{Q8JMKQNZ_+)KhSVhQd~b&sT;$+E}P=Q7n^_nV&jLA0_7*e`cv(`6eaU# zbW;BxQSTkk_1^!FJ9Vm)lv8O@+Oi@mBO}QsD`ZEuP`vF`NwPxrmMtqgGAc<{W)vYZ z%ii1X{_0$x-}n4?-Ojm+_xtsFJ|BE_)EP}InfLgBYv<&!aslUIj}xlzRa}|G zK7egKK@2$IQT=L6&cHgF26?NUWwKgQ^9Y0mTYE&F7DUu`T$Xt%JJrIpPZqB}SD8(L^{b(kjyW$HvCS#~ZvuF*^bm@hdiJ2vePklEtt|&rf+863XHV?-Lwgk4rqp45MF2RgLoY& z&OX91f1F45Rq=%Rgb?ec0eh-?p%Sfs{45el*V`Zc+fMxT5{@UH9}kaX9hN+Lh>9%! zhXQ@EVf*b{7#N6S;Z`dlN#qT9{``GS+6pZtp#FK`c!^&N1|bR{j0s3%4le*2^;^JJoBcJ(i^_0>^rqf=tz**Ue7;SP1OhgKt(P{1@U?+vBijqKN*O4gr*c-P;zqeF&diu%%@OR z`T4;=QJ9xk*P2(rtKR(f?OPPfh>Lq3y6ikHZazda`Ux4-4~wk@`Hc}zgcVjLEWst7 zCS+;IdEnk1zmV;K@lYDj2VGp#5&@qYU!{?*6t z$xbbesfVlW9k<|0+r@R$_ENg4J4tLq8PW3? zAbWzYp??ArH^#r;1GWZ;_^HXFje8zw4Un;Q@TPzR0awyQn&|4bpf3^GH8(Rm69;5bQOd7QZv=ai1A* z>S?f58|WOm)5R20dIYfGe|5@zdUTGV<;d!biG$ zJBrFPldFu$v37CBvD{!T*E>d;TP+|X;T&>w?ULYmM&-i+;S=;xqG$6dKTbAyTr(rJ zB}J4yP)`XRXWOeh>5l>@#-&`@>P+SR-?DKikoID@z%VBfH#)}rS6tF% z;`NlL_%lR(BOz`sR_M;lm$tR~c{p8WY(XtS$yv2a>L6sha-WcIY==StMl&x+h^=vc zN=izS&$$d4dms;48DCweAf*?nmu|TvLpeVza(RhOaES5E@o-cD=u>wQL|NGSAS}jBZ zA^j#?(8Y0>shi}02ri0@d>rB%^p&Xn_Tl_ z-vyDu?33?U*+IWw-z7iP0fkB_GXH3KeqIw1A+kt8Jp;dM8@4yhfM|p~y%5$lfTojO zh0^`H(<+k~oJfay{6RJqrl&Jh{=%aPL#6t1v(w(7N-HEX>+tDlg>X6MI?fF2DE}T26&1#$`WgFhdRX%3 zd3Mnp4hUSp>qeyil(6JRH`9x-CFt~Czcya&^0j^2*B7UK6M6x(8h)rxmztjx%Sc9n zz(Z7pA7pv}uNayT6^C9I@ zoKffVp_!BKLg1G8uT!w_16egCH8yPJk1f%HTertQe}5YMZP8I^-8k6Jw?pYZ9<ba+ z4)zKF%xkJwN}mU#*>>a?p1P3t>j12YGnxY7Z(Vm8hw=mxrq z3GQNyh|aH?4|^oGJe4|hWhTc8RYy{)rTHJqsH!w4nSV~VUb z5OM-2N6>yIVG3CtxDTb`A2`<2+0WHLg=vdXq?H#qYQfyVOx57SviA0NgxduUUB!D+ zbobjCl{A(@TPP%3Cc*d_j|@WQr`h!W{iD=XkQEQxsr5qwk7e|#-yhxxn!00@%t&wh zs%%MkT;{jWkz@1ZVs7AeanTl{@Yw6fB5Dg7;)LR~S5z}^y&Gx1(hjcwdQM!~Yr3Gy zT-W&)ai{M{${@G_T;2A!St4{2SD%ksMZt3C4_;;Y(AK|K&!r$W|Ke ztjCAQT4)@PaUD$=x#?pN_)K!Q$Wm-VR<)HGW+D@FXGI?eo(GR)4hI~?s>YI{EXzz2 z8Deafp0^q)H73lxaB|zVrN>M))l}qJLt^@Vi@)5}Eu0F3*6GQvvgvl^<<>2$K1^oM zJM1!j9pgz}O_RN;-_gzt-Il_=TD`2{3qK;WJxUhRgzGp6!Xr_SX1Zjb@3-Q%Ri@nms-F(6YKM>|%Z&Bk-=*_R6t8Zz!4>}FXj{JfG zihuq=wNLZI?NhBxcr0Gt%1tPE@}0;R%+_R}gO+@hO&)J8UlNQA-$0dFS+Sou9P&o0 zMu$R2+CL8Dual!=*VnJj=T7wE{6|0JL)rr}vCK(T?>)(h*5ol^32xJmzQ>%uLH1i@ z5fhudbTEL=58JW@atdbN7<%_)8#X z?BWAz2;TjkJqrzO8Z6{M8vOeU?vH>`nmcW6x{M9<_xEE>Na211-C-M(Z+INe((IN> zH#d{^a7Q9S9xw7Q+o)c)>VTT#6ArjFhz=>+@mp*`+L6K5cMDEC8l-TO9Nkl5sOC(D z(cqfo&dT91>5O|zTU#3<@|)b_T;-|FOqblc6YS=2n&dwc7Nj4s3cVQmQ_hReT>WBk z(Y2(Gf^g66^iR&A;#OtEz23P5@ zQ|{(y`bg6C5FZoeNDeIgP}B4%rBQWX!g^`gKOLzFU;SSoS3MDha8ce zH=>s%te)o+h52>j;;mw8w4vvc))E-o9u?~xK(j8i}51hiNzus+4VXk{oT4xEw)eYN zStWSKwgXZoZjJ6%lHrYK{->@nBD^wT@c`K%D{XXPQ4zNLG^Nzf5ET%GKdy($xmyO| z9SC3F$Od1_?;&QHf=_8gS~o>(!6wsKqw;rt2LedhWFlh0lZWmJ}O zc!w3}B(K%u+R9B_7R)*o{B1>8*x$hCx5HZb69iv>3iCbS`}8#+wwu zX>y>cTM`Q59}v`#;+LiL*&_l2_t$goXMmnc{~J46&4*ry;#x0q-Eh<{m5Gc@I9rB} zfZh}hi1=inD)BJTC^Qvysus_|kx$z*h10wpDdm9@63xA>bX13v#7~?!W8>~L8^1kB zwK}N7^&pXe+I40)+#J*X2E@b5UlU1{6vx=Fzo-KKWiP^a>MowXn;028rd0K6vq+`;JSP-H?&dEV_G4E*vuF;Lg9%m1{{*SiM2L_e|PA zlBU?*v$ULoen6{dzE8X*gR^h%D)$3hFFRXn>kPP4KzT(t2Tx<3XByvGzN7g@>y;}( zp6jl7PZJ;>0QU=~T7|y&W5MZ}Uvz;FMM}8n--Dr`;XU?b;+Z_{2PI*MGz#o8udUao z`M!wth>cCouJEAE5?A+^ef;IXb}F}y=es;QmM0Dbl~DNt)Y~SZzQPQ`babh{Iw1a+ zyeGD?`ny^TjM*XUdV?AM7ubND78ERhI&S#6V7cYL5jgyhjy6w(dLM4v_V3?nYttoz z=ooVnSi3~I^6-MswNsy*4EPOMQ{9fSJ$F}s#iYV9puI;fYiz81YZjNfETn4#I$!oc zVRhhakSTpc=t0aRsX2p4pZzrGe)(f{wPc$FsLTCtdXQh9>xApd*WXR`Z#^hH>H@jw zD!)Ly|1+HsW4S>NXZ(3(C+Wnu9S$Mpv?Qcn%GvfJC=b!v!a z%1Zh8_-m?OS2UaFYs!DgsKb$b{YwM>su?P3@tj3STMx2+wS^CZ_Ikauk>j`iv&?P3 z7oVS(PMUI`ualfAJHwuF8)_87Ua-Jb9a+6+e|b8gfveSdomAgyG5sz$eY;#%%UU~* z1(RnlUi1?Yl@s3qHBwUgL(%R%lefb$!?Z1BFJ%r&kc%N05@1sQKORbp#t4*kl0j>p ztO4x}rYiq!RP;9vj{8MZKyWgbXL`)Alj@VUL6%T`#x*nS{-RgPnWJwwzGbOOex9hP zn4ky+oily^YEM$s1qk1yJMLnc-J!breu)+@ti!IXTUOkn)Jod%m6Q3X z({SEcn~UCcQ=VjG?4E*NKphNu6RZ7u3usMxNL4#U2*UNj!1g~v(tRd8Pb#Q7 zzn9=r{q-{G^_w@aU(T>=LAm8j*CfQ|u%7`8zD>p<<+|{s#VFF%CYXlS*47Z+T!<&l z`4T(bmb%u5CsuN}_3TYAGBAumvJIH!uxbqdN=04($-Wr}leaDOnqRWi)Ey=9eYv0E($0=$2m2&(y4^bO=OGJ8wwjop?n*^=C5BJ{|v?AhZ3ugObI zc~w^e4eVymme>0Mj!67wE^;m1MBGJiqGEweG)($H~F7tPZ))y@RM zW(3~msxb1RwO7qdO&NFksxZKKHc~|Nlxr3SYg-XIuYu}4o3Y`^p8N3FZ}a&vZ`F?b`YKN`+G#yV*B->-56#<`VBhSJ}l4B3Xrsn;^BS7NJ?L&DmM`f$!Kbh(V zDxaLr6-b+?6=FD>H1wNL`C2rRoUgB81Y&MO0o*4VsPdRKAc*>+mCU~LLb)hp-BAVX z0oz>T|M6G*S3%hC+4Cn4``bel4{qDO9f|w>u=p}jkdr4!(gwEkIckQ`E1Y3x-$=C~ z`AaLAok^A072yB0W@vC(LNe~bfEO9r%2P_pF6bDCbls9iZ5Y_t1Pq096sWaF?H@Bq z$A~`H80tXh9Jd^w|lQutlm#jo`ed_cECpj6f(XEn4#x**XHF@-l zzQteSC#O`Ds}aq3Rpnf7cm3pqftrzgx`BoBJnk^DiPz;yI6khjJs^Di`ktJti7Ofo z37Wd1QZHmwH8rDO*L8HLR6Qy)MemM8*ec;w&QiBQ>xRilK)}DOymUDmMCS}dBgV@E zLY~GoaL&K4vc_dBB_Z)6BI(DEA5KfXF;CHx=uQeuOQUZ&yqlxZ{?Ta;*e&XroFc-* z+cQ-C4SZhce%yXY(reqD>lEHEBVLOR7~i^e3$}_EpLMQYeM?x#TF+2Irw$bb>PUOq zUEvjzm;aa2tyzn8vJv~XWX)JT-r$6_n;*E7{m+nnIx^qBi8(gC1zN&J0gjc&Lzef{ zelh=If0=plr3JsjRicLgvt=VlG0eu&%&(PMKyCY^)_`w8o z`($sqH1`Um%t~tV`LCpB1wfdj63nM8UqeU7+mqx&9TYuIrWpY=SGA>{xyGr3c5KgY zmky-#aCq}Y1Yaa0hcMHB3O>E9&h{QfQC6~ z2nf28Liv0+d0ENQA9UVPI!sHOJ-c@UJ3-kyj#2D@7yUDVG@-d=1U@=q^{|!M>+$Yc zwZ+qA^(UjRiIHypfT>Z~W)=b8q2>3Z_Zhwg=C0L40(%)9*vY@XHzgW z!zf+#W#^mlNaj;B-#S@A+(3tPZ73lAKIOsi#X;E@T-d2)9E0*p?@szXBR+iD&h?G4 zyx>vhusyPVUdknm7{HXtPnIX|XtkmT64^5B!1L!6jPLmGwRw8@#EC53aft&o8Ds5H z%j{9AU!G^H4Ruaza}ke?j?OF-(!`KjQ`gct2f`+PYPP(*Jei3f<;U0;lJ3}TYb6LCR5&z?V#ty*;{kt~24Te!Fzob-t+F@e*!4+m8S!-1|;QiV%< zwA#C}-6%c(sPY^>|2hHS<4re#_rJ&({i4Xn!NA}Z_A5#C(x%EA>>zY*yx{cjVoykp zIi#ICHWbDUdqxO1x6QAcj+O~Fv{!6p8sH6|MnHp5FaFo8B8KewkXt@arZ&s%B5$9xIj=(Ts5alM{gs88Nl%CO z=C2KIZ{rU$4Tkz0XPd~gS|(iBKeJX@;BtIvaeqH|Xfw-7(;i4SE6ZL*bFdcP~F^ljR^OM>au_zNMLVW%1d@-ZIpjGP+Zc1b>cTLM63u*{E& z9rhnN%PV-{-1Rm|?%Y#B<OPu<7FCkA*M|02P5a!{2v5g#Kv=4Fv^-y`o?39*dTX zE|_<)>#rO)(PFvbn@CMVBQ5@x?;!gz1#f@WXqIIOiot7$pDqQf(YMNH~ zU@&3itm=3C>y&DX*`AYed{x)XWMUO8zP>sgR2eg~KRFp-8gpd2Su71KP&r)0?8j6!JQ;ek`z2PU6G1L3Kg~o3S?m?N8+@tw1Dx+R zgF*j$r)xmQKa`ZIJ@GxE&!QU6i724=)7LVvNYKHmW!*e?{z7}##p2Kd_oQVYOQTY3 zeQyX}OS$;9M1Aaih?inrHf9|+)&xajcbb#?%z63GwWwzm@-r2LN|-;muqTF8NN~_MA|%{cl~mO30}4s(Lp!(sL=4%*teZq(B%PF}Jg` z>rEq^LD)roj(k@fgB-Z7o&as~2S3C||M3bqz$*l%^M^I(hp~cdzW+$-%%R+O0*8}x zEBu1gu|GAnv_v%wY>q#xSdLpb8S=#}xaEa}lvKh_^P6+VSzXG>QiobpRJ%NDMO2CN ztx^=6!w?75_x3-ra)B6SJmTx^UFtBGGVAR4_35HfoJ&gH8KT7T7K<_PC1aF>timn0 z{s~Sk>6`(0;ggb@_AB`9CY#+MFyru73;w-+$`+V0hdaD7t>eDaG23 z)9Jt#<@8^#5#eF{+nF0*Y)HT~i|q68a2}M7YhO_0ZK-e3SOln6CvulC!#FQrVzQ!g zy_AK{A{KNO%_@T7xpuG7+{dTw?=O9g;!ZWIO?%2Zf5OT@-u9gMCXeBpv~Y9%SM8^l z0KPj9&4EOt1oPpDp_9j?j(A%A1oM5xTJKP)(2SN`7%$^6IBeI;o>Q{x?; z=MbW#H+Z%bcR9ziWn()a-@7UmbtFq66!LmF*?Wu70R&r&r4R}=%A(WmCtn5rYm z4Tx=0HYmoNPGCWOXA~G^&K*%wR5Vr#*#p^1V778BYnFft;fSrr{17#?4MuKl3a?tq zH?M0@Bz8J${v$DHda>C?=<^F=VnL(;yQz!2^^B9#|53kwdYaP zyS~t=qvU>)-f=3$;LC&zaD$4~UrfC?!S6oVzjBRG{)7z}fTmHZ+W2s;E=&0IAxKD! z+ja?Q-HW`f^E)`|kIvEf;EvR0YX8g@9kvUfFVGUY>x9$&9|c-2XO8PB=7^;nF*vN% zEm5CejVTtGG$q4_df*-!r-=;+2ln89lypDtEGt#$-S)!=gn;akwXI_YM6E#lcdk6!R)~pQQ>@Z+us%%+U z7O@=SMg7veg_MJS)G`80Iw(>fG2zl{oXrvllp%rv~4bGZq4niInC$HP4 zbI6sSKYldBR&NU9|47YAH$oJMg)H3puKZY}iL&!ei!RS&9EPv}8Un6GZ^wM;MeWdZ zN=rCRP`KRk`O?asE==VF$LF-vTB(reb}r3-m^{9~RogMBD4Ew%RboiHgeyW{Vn2ko z@0o5Zzq+=<39cCGCo9JFCPYlf5FB=_ZUP;Z2u zIY`IzX{}=Zh2QG>FRxZqB$h9X`hPf=b#7*c11E)pG&O5m;r)&dam!#00<563Gi$(z ztY842I&4R==Ld9z%xvd|Wmm0S(1?r%`XmD#8}Y*KAM&7%969TWz?B=%Gc<~`vn?E@t{}Dz%1DAC zvYGu1oV4*?Q}RN?D3db~R|G9XMFSo_UnYKI1)xuoHO>td@>h~$qod7sTY$HI1`&ff z8sv%B)$SAzk3DeU1kM9YSYSLEsl?mCxUbo zm;u_4{q+j&N7swTxGkb3e9>#N7ta`gIT`IWBO;>eHe^1&etxh6;lXCyrdx+Rpi14U zoxR#13wx$OkhHh8A!4fxL<1htG2K%WThOV~x!F(G?Cz;X(wVcqoMSjNI=I0>bVw+h zid~U33;5V$ENr62m4&&2EtYvgzqhZN?9{n)=X_5J#Zu4DCOcm&H~AdF;aS_aBWZ3- z%U8R3G)8Z2@$vPg#s9+sCe{x{^`1>@A|61HYMZ6O<)85YCl`+qWp4Oj2!&y1D4uSa zXr5fChWNz^0bg%EZW>aSpWoi{?$+P1L2j-r&)ji5PqMbAxpbSX+)lbvM!=+yr12TH z%p4)SquI(C9pEBb@x(j&C8+iwNUW8Kk#$eapoo26rCVIDGm@W-xiNvGN()FiGOFkW z$>_Q5CN=pUkXISC(Xf=ywLWT337f$f6vFE6afG#)?!75Cjxo;S0vYup$Rbz-a%7|8 z^Lr`cUoi-^DHw428FlLa|JUewk#$N~VOwsoSc*-qgNp8#d9t-ub>^@{J_)$OQ+82mYC$aq8dSTY<`4C|qv2 z(rcDo%_G;F;=lN0Qoul!n_%Y7kpDsK=r(P5f>h-KYxVgRQy%*J`#;rZILd9INzCEa zV$Y5{K+A*@JB2IE%;TOXU7I^Qi}UiNZrlic<|#oF1EZiz#>L@gyJiX~|91dgeawzTR9}@E<#T@T3?Q-x4Y{A8%iBO5q-FnBr@YB);gK1kC@L>huenGHA z>oYp)5RvF8#J)0ZP2NH@2%{!6`iN-anoC&p`&GPrELof%2_Yy3VE)L%Cr?(QGaAoI zi&(PAH@+)ZQj?OJ&pxhAG||TeNScn|7nJZ9tLOqU@h!it>hFUWZs1VmuK)Yaou5!3 zNga$}-1WF|Wu_lB0M}3Rc@*rr+ROC&v-aVi_f61Pyv+1O>JXF4O}mTb@B9MqLKS$mkE?pHXJ|pg3K6y~-}em!pZr-{OVrHGEE%LoBU+Ixb0WiO6`oy8p@k zYk!fQiUL*pj%HphvZlWM7aw*pW%E}x`yc9e*6TP7*cB8mi; zAj>{~RbgDW${3zs=T_Ps>eihrA25;Rdcn_@f)$sro5_DIsnm^3(#b5vp z6eAm>gV6&C3jh)@k1*9ghV%u?>Rgeh=dOD2VWeeRK)XQ0Et}nYQ@t(>I znD|+>SN*?(gfKE0m|k}^JW$Eew(&p9XipLGowk%_C7XP?`=sgG()H%y zTehNFwOOCKs@^@#gl$OnbYG5ypQ{e{&AxZp-z)m08e^Fg?#gKEG$v{9U90X3Ua|Jz z%nM!T8*I$$J36>4LdMY4)Rg&x>$C8Kq({Ly7lVwLUr4+}Xq(4(Tv^Acc4F{KKGcSD zK|^<00iqdjpz%+y5m}j^QZN>_zf}H>rM_Jd_dmv(FAGU>go9rYNj@N7&_GRRh>SgZ zaPyE)GlnH72_bzkiR&bs!ibk~{vehO@dW;l;B<~GC}=mgwmz@eCuBAFG%TzW46l-6 zuiKkD`uaBk4`GkAcXVW2*Up0e0^5y@_NJ7s2Pq^gYXTW#(4jUCn($t@kV+ADz*ytm zyD8VRzkmD)=xgxw*}q{9K6uGkr3&B;L}y7(HW$9W(-4 zRzF&aY3X0QpvDLL&S#t=wG3w?7C*$!xaN}t+IDK~;qYO}3K`KLnTs4ToxVzAqg4L7 z={LXkI(`twVioCU95eUgcp8@6)3-HZbVs%FSL_R<`P z`ppuC{|%aeCd&0$6Hagd+B!N5PI1G(44k?1N~w(W^sebN28qmNxw-dMxU-l!id&FFX}znoQ>+$BbwC}h&%hmAQ{`6T(iyuE_DuW2Au6g5 zG$d!L?1T{MlUDQgO0*w}{G;pqE(a*Z#`Rw`n0?hl=ppjXIMsMsbp4TiLPC9%=jxl$ z-Nb+nXFGP3{oe{3?u9vj8Tjq@iP~84c&tw8<XfE zOZ&x1rB94Q{=MpwS^K|*$et-ospiL+e^uE1&t0>|FCgG>BK_&pr-;%qG~5rn1-50h zEi#|K3lt2-U^NU0t5Lf8vUSbPL7HCVGD1O7&)H&uZqM=-8Vo*bwnK@|pYp=X8D1V95_ClmRa)jOW(Vj0 z^@@w@1AvOdjtf~VdORt*Fd2tYgxJXCifCN8%BFy?#c=!9zvg^KSq|Uj#!kIx zS339AivG{dpnTY`*G(V}KJ_Av>dHrX53WaU-TRc^okc6SwrT((CseFy@EuRv%a6=P z#saNhHF3`~@0w>`cxfSwPe1-vvt0pezD+WAoq_`o+U#EC({iPK-|Q=-`RvZ$@%sMH zO)Cf>VD7M|cb*@fVNcmx!VP&N+0}=CdXx0yva=_FVmUa$i=6O;_v$_bN*ivt5dl1l z--<0yZYi7%qRgxHj>G6b{ShnS9@R7XufjP^o*#8CvN!CE+@~))7)G((=*xMJj)ZGp z>z%%7Qc|51U0X>u`^hXI8Ke8J-whFI@%tF3c}FAn*xpfw z0kh8EeM`q?+ugKpgP@Z6Se8dcQj$Da%98XRQC+fy&tPiF*#3Uy`9I>F#($ zeNIh-^TJHh{C*)FPkPqy<42F@TF@-)j=k*9$D}FEL|X527R)vdq++P?&W7V_^ZZha z_(?W0`kPdYDQ0ZibZ<%}3ko5Y179LPz2gG*NC~L4AUMP>0PKv&5yCog>A`V8;apr? zevnoYNs(xZRY4rleRC)@ai8JBThYg;?9f<=OoA-JWgjmFxKq8@qVd#`X)Ae%V)t9y z7o~*z9;-_oMC8yz$t?m@N)RJ!d%VuqP$Cw6F z8kSEB3O=Mhx$wKcCG&J!k&kM&Wp7aw_3&_tkK6i_za;*U)Vy5x2R>l`sQLI20Tu+o zC2Ghl{YiZOMK-1rm#1yk({QXFY+c&$}m!?D?Ru@{g3FvpEpHO@7fb#PQIz= z^?A;iuHhhc-!Nz@8~yl?Q|+B+hR;M<*!APgX`aNgJGTzQXFdII6e*?m&3Gh>j`cpX zER*~8@&HTrtD%fa07hq$?v4jm`WGSe2$)h$`(BPnf>M>LF5~p(lKQh9mUehEOolF3 zcqQ!D{OQ28ncfdS#BGlcKm!31q_aT>hWs2*oWK{yfLb8iqo|-D6NTfz84&(#jwnj4 zU&t@#o@WxbYcKWnp3x`tnW3dP!hETL zyd=jY9ee<~B9XVi35Fo7WF%+&lH%OghqU2X!GA^|XGN&ew&r_xOFJ9*JCQlbGtB(k z?r;`iW@(S-=y(1MAX{opX4f3ZsJcOke@Opgkj%k!+vX=FD|->Y9>z6sKWfq98*`6{ zsE4Y}>3$Kuu7d42ED}XWb*B;WfV6orQvJG%)CH}v2+=jU8gD^g++}TiOgGcsPMy#{ z&bxZmTs~2}wa2CPz*rsCfI<7S|F;ktDeTQgixS`c;en{>e+0jEUCTi}JqJRGl z8*NweiAXC$oAV>|&gE_5|AY+eky3s7gZduvB3aP?i%XW5e0=5wo3VB}lg;M?031aejV2DZLQV--oa__1;_oy|WOQcGt z(rIn@myf!9Ol|tfT;nZQ!sX&po_#{YvTKntj-NEIZ>VTC!lJo9u<-fijz;QAxo&hz zxvu>jaNlyB{@~@~voz->8YZHh8oH6EyE$$`D_f|eBvrR%@b$w`*;t-0%s>S382*DvUKR-WE-y%lo-XlN4 zN!rh2ElB$0Et1{ueQxvA~*ee@7_6SWOxXLsp&539j0+Gs5QTp_xea(@*7>`sQk5Vv^Z|3lR@>> zC^|6c1?;x-VTUe}SGgPJSVh%8$}1}G%kfkh;P^X`i~b&Ivx@B08$^FdyDYuix;l@My1lP2Pshy@ec1&{1uUV3Ewdp#Q;o+@ZDi%bI1aj^;4;19$D(44w zT$>e$Z)*J%i6z^sc8xI$soUlthq+fm~-e=v*hff>PVxqlbmLn3*3mKPd})Xg@?Xm5>W0!?bYp3uIg*udkdAgr@Ks;|d=8hQ+ z>W@}5DMwD$*@0l^JxP1hK>y)fL@iH}=pA zV!>-8EF)pu^{#hzgx8f(Gu`#*NSZ_(ncExEm=($;($dnP`^Whe%&6?Gv-V#Aw$bb7 zxJcE5InCNq8bO>OTlVL`03H`$FFJx-_&s4D4rUPzY7Z&~Ik^d_28;$lt~t)98PwZV zjc9>2g})5nFhu}V*?e(Z(1OqMBD0v<_AV}vcJaH#(4sms@afcyAktfoNOFdMacoiS z`t@eP$DW?7XpU%a53WsA2iX5?E$7Dbc7y?pT4DnP%(V;?7fk&pPsZUnnlUpuk3q-3 zU<(vb^z-MNOxpk+@R^8-kKy!%tD0i>Znamp|C$1yie(^mc36M*^X&BW4{oK${hRA^ za*;^_gT)f=ghJvRk^d;S?-={z#Y=2#fs<5SD5MbSa*MpFJ&mR8O!rdlg}7$jB)4|U zo>I|_go9HFinG9h>?zndmKaW63+CbB0pZF+M@I;^zyy&*K8$U=di4tDex9B$Weo!z z$NJt|>dr|dDg^}kWcl}!JG`c7x=5w{<+~=6s^ijc1QLI>4$C&4j5`$+!*8u1vpCtS zP~g_L-uZ=QN_*$R{QT;|_i*%FBRQI>yiCzyI~OJ@93~V)!q}hfONc5J{3*6i7ui35 z(h3F-ub-kRNXCXvn#}-^i&s7|M*&tHle>2j=i)tVC4Wt~Dcj&|o>-lf_vwnV)b!N4 zAL>086y7BX^TeYpW|RR2IZ2q)V_#kHPXifgd5gWA@+{hlWO4WL@FHxgH2XfwDbdcP zJC4tdr#02J>;RVa>AF2o(dg4@xB&8F22hE%3Zw#Tp|uh z{F*h@Jbkg?BY_&D0tASomxqT(V4wo%HyncXIZ|N5>}L{&t6?L51zxpx6P+Z$F{DO5 zEME$S6&VK(HT$5J#Sc91NLA>cc<|r>D2N%tx(O@q#K6G&!BkTq&d!6M_6thdPJWl< zI5G4g{W2g-LGiiKV<@9&7pLGhF*U6VW9N1Y8&7R=4NNl#u*uBoxn96$5EeNzKeFwzCurnpxTbR;dJlGBbE znwYG>L*)lOm7Ji%?Bn#nh%5DQ1oz48cgW4pPn7Hu3Ef|M_WJVpo2iO!h|MrZ7<-UX zn`x08E2TB*mp$MIBo?vUlFpA();_njSwmImJd0_+j8px|5<^ckR)gt`QMP7G>i4%* z5|IK&SX1`S)WW5huP4KMJhb2PZIWmU!QR8net7QQ4tf926W7;Xbuu)@Bv-ksWZ!(D z9%5G_<2du}^@L?F`a3p%`zs4IuDr}Lnv49>qh4q{+t}VzZfnV?-1@}M{={*s{#mXR z^ZA08s&77q+SK38?CViOahWsi3USZ>uQ~bwT?E6f^Hid9i?yfT$7V+60I1?ajB z{ZP-4Yg64;t)}4U$`IW$EX?L{Ns#JkTj;~adIBVjiURJoH*q$k1_jMPo6As!v}|6^QR{BAg3Scz3BrlnZeaa_%5aiN}m>L{pQ(ZCf?kB)6fmnvbv;br`*Y_RiP`|TYx zF63C*t1%sMxgDo(_vpYrf$+}wOF_e!xCs%POZXeb+WLAQZsbj{nube$`}Pe1_nW}^ zWCYKQU`)H_M^I{JfJAiC70(YPgBh8d9g;SE`bbyZ4zlW8PtY*(-#njD=DfCrD0r1c z^E8{-mMy3idRFBZ@87g+ua=K`Oqo-wnh-saxS|)VY-8nWWD*(>aBuu8TQ5$Jmvv_$ zv$_{TxlA~=K19|1vIDBS5-bJy%^^>C=n?}kpn=mjqtn-FBM>m=K^Ec2LO%0H@~mi3c23icsItY0z}Hum(6RX3sF`E&HrWb;Q6138a=;pF?p zYm|Me%Hus*iFMU99T^w9_FMMlX)4twml=DO?>;i&r?KTaxE4%JD@$WzI&$p9!8iI} zR`ZXPZRqSMTDZH28!?$lQdV|tX?e`eKd!{}x5YgPM`cl`E8Q=ZHQ(5nw&lu7pG{n6 zklbYav0xcx7tLcmW7E8*`pHyTv%A=0rdHgA`C>zUDN0|H3@X0**X zdDr$eTkHEQsbx=Ji_ViR>))RG`jscrdb%%2Ze!hmJtFAN7|MWUm+yw#|In&%46U7Z-dj;uR9w|~f+o_Soim8jS_>{YqZa7VNm)P0a7;axI*2&6%M9RAyqH1CXtbu zKJn7!G!x~6z|bPf+SR_sJ}vXjQ7bNN&v(|zKPO$~{?a$oW8$;=Bq0p_fHXI?dNDQi zbF0mg3ds!(`MEF5b_@x6$;BEOzLf>T-kY=d!;7EZH58ewOkWX)dB>xynHq}1mvt*= z+#oVc(w%8;ZXRiho3n*+;?qNhOPtP2LeDEJg)B8IU1PXGC?s3$-?hsVaC5{^3Us~G zPYMeQO9kKt9rQz4U1_eZ?a2>2kdmBf#lVzdci!^QvseidvXGFJvkcq;sU0(6bBl|I zcZtUw?^Qci>b6xu|Df~r{W~Epb)grf?fmE;)1krs=_3bWVPVpn<*dZ*%Sh&@sEJUP z%p}H9m23W-e8$jYK(Idqd-Lez?dquaO|1u}Cb&p$s-rAbry}2rTVDKFKgus+G1yNY zZxPcy-A>KxJRgh@47jw0WvRb*mv7}N8Gn6q?`R{lNn+{u7_XVN>9mscWA$7uY*Rv) zr1DdZSnT88glkW?zHj(msOO=3r;>u)b*Wt`&17M{x<0+H;f+g^I3EYkIbW94CM|UZ z!zwxJ3e%gFm+LiXipDj|Otth92F!lCi_4A9))ZB`#m*^rt2C;m)E+okb0flL@%p!*_iL77W&FPB=_WoZ*~wMmv%1x=NsvmW=IpED zu3RZFS(#hXiHLHUUZyHeQ}&@-_}#vIcc7v3-IS91Uk`;zyn{AYW9yc0NX8o*kA^ht zCW2Tt`RMgWVnx>ckL%>#wxww@WL)x_?C@$EY0j6^r4uk7%QNq+&nrH*ymW%EBgbeYa`I)LskIen{HH(iWoRLf%p9CiIWP5h-lN~G`#SCq ztVwF`k+m)7B+5YMB<~pOowJT>W^rO~&7vHS17R1B*XyzoQvBUwp}DBIu!j} zsK1cF{tdtY$`YUJZXp=Zqdl@TG4(I=-+eeR_Pd_<1`GJZ5kE^$iihBLN z$5F4S2qGdaT_PpjV9*_s64Kq>UIA$V>F(~52BjN^loq6skZ!(b?!E8N`mNvm=UO_> z%n_6GV%!KO-yCeQLHA(GMre_p%Zg|^#sMo<~2D&B|i$NwM`U-g~PlRs>l z4{8SC6(19{=)r0n=1hTzmDM1dx@uWVfz^vDesXew6T7|N9VaJ$VPoqrTMfgdl4@Ej5h}*nDpy;B+boD5BeS{mtjmKU!u} zO-cmUiWk4#@CNm~v&G2g<>+N|FP$cOeHH9|?lklHw~XyZOy&!DLiHV2bIa8=EF@)i8; zkWB4}2n1kBc7~KTKKj=R*BCBhNS*qUw`OJqd;L%b)qrG>VO=fg4OW{VK3MVfWx#+0 z_|`96n<26L`-_3kLyhw{LG{Q)P^_UAkhy-6oK2>&9sM>kSu5hSz}hc1KHl_vobiZM zaB$e1g(ivDIp5yBqc;MgQ${*uy5=g4K%e4$$Y?uP9FsXf;hNXmJfrN^gKTG-Z z-@NBBf4wc0#aI@+b1m?V2yEr8qUn|G=yYZWqK5)Q0S_C-1QdZmylJcP>q6CH3nR0$ zrS<)RX=lA z+%tz$RAjasMEK0Y79dO}?O?6LvR1?(Z}rTzTBW>(B0UeaVQbYSMTN?jkY7u-lx7X8 zj0&wA9ewY$+#gt7pU;w!2{CAjbjcg`RNc7_C6aPJ?z(gzwvFj|B$rfIw&?A>>#Jg8 z@}s3|$bi)-_BD8gb6TD!)~w^prXHy09;IYUPL&;ew!=DqK&*AOiQ25%C7bNMvRZ0q zBW?S_&B=7W$$onH$O%#`9@91H?86xCY>pJMacHfhVy;bAsO!IdyV-C|T5`HI^#1Ds z+2M4J0%UN~D_fyuj(wSt51IZL8Ewmo>6*ez(@l56N-p*3!y*KZJewU3t=U?hFyq3N z0nJh93(kfA-BkFd;2~bB&Bej#Jm*$GV5kz_z-TYxed`0{_ypzs6T06mmwx?_eXU~7 zr1sg1!n+l1ii_OO?xwe1Ml!s9R#;?c^zCA7c%*Xug&b;K{#|}>k8N9t9*#OUpbLOm zH==5lmG=(gcqzyu)kXOGWRSBVv-dy=$br+3^?kf52r0#aMN;keq2zoQX!LtwL_yrF@QxCBx?=*E7h-Cj)6i1hkue0|9v!xNCh z!;}+l$7c4NVd1wOOsQl2=}q9d4=I^1b(fFy=5ws?rV(qn$Hga@XzPNN{f|T&;xl0a z64!;jYU1lBcQM>mqip*F!lb6ng?=R_CB1ToN9$Ie8oDt-x4D#7;+=U`9m{-D618AN)`ZrHio0CRrnVXj*jfdPDDmeSix=&R6Ls#`IDAk zb3Hckm~~X+H7I2tWP58J=~rLhj8cigjqD1|Q=Rr)@-01W*cwkh?+ksS*t#(rcDBN( z%@~u+ZFJ&0^f5>;8*-7;`ggb8yq<65x^-^sY4ZOFTR;ark^$$#vk+H~g)0do!{e7< zq_u2{-8PT6^1?&>k+BK}6QHDwBJvaNi_~nt@kfJ2@{^2(FROej>D%k<0K?ibW5!xe z5!&AYBMPU1_wi-?uq@yAOK;qg5ftc614<=8^cg|TCLrRyJgSke&6zQ9zs|6hBszkl z{`vb?H(&F-){VX3r2-Ln2FA~Xmx57AHkT#6f*UJ^l%{a7|SeKa|a|Wb~M~y=&Flb^G{^Z_f^1bbdAXcCb_w*np-EpYvR( z{s{~fm^7-y7j6`3<}kemz9YRgHxCc7kk<@&4Z6x@MFK^B_KPJ^Uv+L=+;5}h5rGz= zP5Q?gnR4G3jZJ%Bve&E3y1nV_i{o4x-p#x%GtzlzX<6hNS{`Z44E(l4FMR#a(8Q^H z+sVv&=hKsGt2sr#c&J0MyUF#t=YdT@wbe>vZ z>%+UL$|R5fkQ1(#wwUBbOMNXpL>QZhfy~-W^H|^r-Vw2&=oV4UPLs!By#)czjc?y> zxk*x*Yc{Ab_Hy$yexA>JpT>Wdbaimrz_kXI`EYp5_s)IK%a-mMg^lt3$=xtvgHR}| zSGBA61X8;^?DlH0Kn_H?NWM8CakH3jo$iHOTEW}>pwt%Z2#$1-k&jw@RV!WbbDj@K z1r8NjNI-07DZU%j`^HTc<8;yPt31^?%AJJXtdPv|mnz5qZ`eb^MAYmNIMI)~a{PT~ zloh>1`SV35UmLlgvgkP4NqBy^anRR&sWUzcFFg&dA%@$CwGhtaiNVl+7Vgrxe@#|H zn!HkTeo43Tbx*$i&(r$nu8!9Hxe2*<3kb4E8n-Ube>b68AND)+|h*JwgLzKT;KQrtD!BpgNBq+5q$VD;1 zN&E)JQwKW;7#fO&;HOti1Kk6;B4Bo~IbjX#?oktPsRvQFeA`9e4gYOO=Sb@=no^q> zsr+gvjKMV6mk{PZpMrytOLg1!5a%MnxGb(2oA6G?JT}MM4XY>N9$Y09p6x21is(usKh43y zvii2YWotc`(W#VSI)^NIfT#ep7C>2nmE_~dj8G(?%i{3iiIL5z{DIEmbsyAWpQEM8 z;9)EwXjsQoRGSW`J?M+c%3A7b9=hrCD(T7Z%IcfAxFohe=cO+rpPNsuR-3CRxo;iZ zLyO?BTkP+st#uBZHpLbLE2XE*;-&X)ojWY&bJX+HZ1c+#oB??_cQE(}U{2oe*Y0D5 zZ^c*^S3Bq@lyk=Q^nZN}OLY2m)Ij>0%UsiYE9kUSR1|I2YPRm0_e3khdG!0=JAXKg-_2XdneSgvpC%0k7I?zsB3>=`Pro-Y2vX00TN zj$Zh^B^fxX0mw0$kDDiICBK?$p}^Yu7pkM#L{Z6J0dgwz%i}x+Q?7W6&*6DH1{6}E6%Kw$3g9gJytaxz##a z9>UNK^lGP>X**GIss}(cyo7&H-_EWgARxbA)>H&WJg$@!6nZe%>LrFH5io7+JLU%= z<7M=rqjJpqqxXPz4g(^+)85wB*0wgEnsp@`Y3UHVRN%l1X=YQFE{)YEi2FZ%SI!(72!1tnZfzSM3b1YAldYbj-1= zoJpawKImetI?-9U!K!#;1Gkhp-|6VbF@beb)6XWakq6Ou5yrhKM9$m$qK5_1g|#Yg zCW;L!k6T1nc`T5p8RSNbw**~YFxOX^Ov&@6YLCtPifPt)o%dO<7}kFN%t@W}M2dch zi^Eg3sKh|RoX8x9Tu7kF`3Ct}?2F|D4g=EJLS@^hmR-}$Ll-W;wtbw{R~5fdD+|We z8OdxECY45K-tZ$v8Xv$bFT3vH8$@1dj&$8(LKL*CVvmQ#?hfz^kH08Dg69Zk-sEEV zY0sGhVs@6tE9!~rfPBGoKRljZd~G@(wuTK&vHVs|8Tw}Vapgh`jpSuneAmtm`|t^Q z33j7*4+AdL&$`q1D$M8*`E&|9&23VjWF#-YWaMm%4a;AF`f;@Bp1U44!$$e{$X7bom#S5;g{b%mpH(8_3v3s| z>Y?AKtlDSfjjwv6!M9qic^~% zP_CoN`RhCj9gz6&g%rB|VY z!&dJSU6n~p_3iAeHlMu+iLvxcB=Zg>>wvhD^GwamLD~#>u9Xgq{S5VASU_(i%L>D+ zP)E1u_n*o*AKFFhnZCXS$;xD{L?Lf4NTh0ikksrmXY-Dr1Hyi7ZEe_dKLNW6u&5`( z#{RXn)#S9Lp-_P&)KZ9vT&ExvM!|boTF}7=DBB=epj@oM!FvMCF9Gn;+!?Phlv3ym z<>qN3iZKTU3&=DBIR|*D^6K@{1)6ov`F_yEhc)tY_@}_SfYZk2X?h95p|(hXR&&0JD)h_P}yE{eWaVbu3gA!=x2fRko%$K>rOEA}Zi`f{YD>`E-+e z%>myI^!~p~*T+1d?7LCFV7-(d05Oda1)p2w(xWMwj52arg2Ms5HK zgdi1)K_ZjQTod)#(AGlZ*rWTZMTYAN6Is}~%m-_quehbddt@)T_)W&1MHd)E`6vKU zaCK30dy~1-Y3qmE&j4^tT`$FqEuCw$AIi;fSB?=;)}$Z2a%1fy01e3KeaiV}oGol) zrZRY=&uUhWsJ8<=>E2=ptZRL(_f>|<+^nnJXyZDbz#eydx_s{Y3tO@`SfLbpqY48C ztT;lBusx`EyXXG(`#PagZuf7AhR`a@UwJSo`%678(Y$tiZdNM^{9$EQ_MC4O<(09y{DGhMLg2OfnXn`7_d)68{6FJ+dJO_#AYYiKoF z`t~F_E6guau|bJKr4jg}yFgb2s+7@Qg)Wqbirf28L>`0DCa*DwF#;IZZ02ur2nRKQ znt89nGVyH5Xb4Ig#(-fM?gKmPxvLiF*pBE^0E4doc{Ng{SV?Jw+x62zUJ~dtft0gp z1;n$14pMX?&<>a@Z?qd>Ow<^s`2Y$MOZW@UJ2^sGrJ8lD@4lj}S08Ykf{COc_#V)d z+K&S{8y0gB1I9exK~hRv0!fqwQDEIYo%bfP#Rx=B=ofH5yShC1a|p|s9KfbE^@pU+ z$HRkQi5hf(jo&|Aq~M_QatlIyF8mDkf7d>e^2KPs0Y0^t-a6$>$8d7%=zK2RB71v# zXz1t$*R$rsIKzV9Ez?t^Nko5xvM;d6)>%4(c(3Zzqzlf~HB@{|sz{LIjxV_M$*bBV zB`?F9RQ2sWM* z$K1~%f9I&n$Hd6EWjWeF>K30@sxVcol!$kA!+BdM>nJjJXu|3T??R<6n&+bmZA<#o zmJD;n`uaLM>5A2FZM3(M(4a(nred>Y1NrSCvfTA)nFN-4jmRmeHtB5hf;r z;KC#9+U)0Gx6B4bcY!80rHhh-=#0oYgrCg?cOunI?IgX*^5q1cZc;EbT$*O6cn3*IS8MVldut zL}Z9SA=K;#w9Q?58r1-}r z8$iGWa^Sl7GmF?BHrFagx9z7-4C=kXLE;BYOo8zPbY_v$h4gJfM)is%Kt{-YfcuiG zBc3c4KgvM25*7y$ACLt=$34#%xR#E7KQ>cekD-463e2OmB8qC<6JD3i5@*U)r_CRo#dac&o273H>rGnF(DiPIWG^=? z5DyFteA<~#h!^RXo^Q$+yj%$`ZNbm22=l8W=wq_)A?ixBky*{5m=_Iv9+~a8(W=!Z zxXriUHf`>QC0&ya|jm3=&p^wVES)9??oCGQQHl z>5bi*sI6T9CK#7L#MV~yYgE-CoV%y25H8hMHM!#8j z{@IOMwllY-nd)hKsT-x6Uft-CB59s0VV($WX{UsD%*k!A&YF8avTK6mK~KldtZO!x ztk$43PX+j-wR&r(y{g$`BNic@oCxG0sCo>FU1>{Se-?eZli>P~z`5YCd|l|5lmlKW z4jN7lUX^+B%l$+JL%e88|KV!GFC_tjE>P7Sec&-NdC62`WMB{#6O*%7U_8Wn;=cq6 z`wa9@wdKerp8=yExljU8f`x?z@|K{{oDZ9vKByR@*$oa34j`|<1EBz+g0utxxB$*Z zuq_PcxM2R+MUcZ-pK4ipjJtsOK1}dz4YrAZ-YOfgOz?#Hxha;Liaf!2}MoWXezMdZN_xlG}4=LK>;}Zh@O2kE2J=C_{ zaRiTBl^#+|C;fqgF!=X*#eAizt1&im4P0ARXUfvm?wXw73zAf_=W#? zo%CUzZgp5np34y9iP)_@RHU5_yn=+upDvAM71Vgme?rq`-eGxf@$}{pvsZ??v{CbS z!d&^){%-xxD|Y4%tOcKM*i@G4JaeervSi%C{>Qs9&E(#x zmmfG7V$e4{x6E{m(Z0YK%8VVp&M-1r{Xx@;F-%=e?I5OaSP{157?)WmTSA`nQ2=`nx^s>bunx}|u3sm&|8ZtH zE(Ulh+`Z*Rg^Jm|a8XxQ-L=eXN$NG<`u)2e*!z3W9Dz^DOmc0!!}K*nV~YEI*f8-h z8HHZjkH2RbohGWAoaWCbXJ>6?es9ZKbZo0UHVxlCLq+xfgrl>PweGe9IJC54%V$At~3viYOZasi?=8v4vG8iry<9a4Z^I z_hV-c9I8hA?^x2g!e#iXv+-hK1do6oPte>VYLiJi+LmF#X_JJ$#pUpeXtm^{LeKpJ zjWQ1b`Y^)bq4KO-3OQ)YlJnl-tb%)&{&H=tlv&FPe6B~V%&O0r7knm0sV>*(j3JWWp5_b2#{iMOUJvAxIh9VE29_AaW$X*ikqDfYm*rtJM5N%Hh~e!P2|<&Ka? zYu|MU2?I;>_g~Y_d*?ImyTVgSH9G?6_hg99$9h;8Wt);BDT6ik{~UT>ZCKW^W@ji^d;;^?wYmkS=!ZAQP0OI2Yi_Q%m1=Cu>Osx{hImB zZICx-D>RgF^L|@P>kMVU@S3WWoWg6a*ZdO+AFJK+X9@g^5N56EvW6gP8t%TUu$yIw za}x!NB~066hbQ4_LW)%8t6!*r1~QqYI9_LxONZ`{e8#xXEV8Br&faaZ5YD{DZ;1Kq zV0m1Sww$8P)wWF}TNjwN4I3`$>iz3vMfP z%p^?5-x1?x<7L}{m9gTzWa-Dhuot}tC#&>*u*P)#Cd#agN(zrDgF=N_bZ=!|bza`u zEipOFjS-nfSxt`%Amgb|j<(l&sEbW*jt-9|v6%L!MO^Dg_KjPC=x0o5G<9OpdJ>6X zgXP3GSqt+-Y&iM+6GJkeh{rd+?J(*UjlN5Xp1p2<@<`N4LFZ;OM zG2@?jodx|4=fJAEs^PqK)2LW_SAujpxFo(LwHfV{SPekE`NSIYLk(P46;Z_>7vvxt z4!gK;0U1WtqTL8@6Sk7-dyXJHB?#!G6&WrM?id3-?zeU z;z6;p@*7r7OCR2`M6Udy-h(2U_@<~-4kG$s(L?j{y{;jW^9QMqbuQNTRSP+@vV|Cw zGt~Sl>b5P=?sf4uQO9_NY@Zy>`hQBT6Zb02w~xL3SI|lvu-9lj`^xQn>N$!ShONMH zvmk$N=*M@Z)sk8vw`UbU!+wUF+Q&$`B{$l#lieXhDqW(W{KPvTv;{z6o2@oeSh)1_ zO@-@oo^mqk01Pssy>HjC-8h!I{OT)#nwq$EHE%VG(kkHO3zu}$KPP#xhZX^cUqCzb zUIXbj(c6aXMPq$B^wiP{ows!!obx00)qQG)2%8Pd&3j*Py_jb4j6#c8cuD=SsA-+i z4YOQ?6uV2S<;{J5LTS>!;K@_+9u_7Jo-D8GNb=TbXTCm8rkaG~9&{Yu;~>x)-@;-O zDjud48H2~^{iDH|dF#sA#%A~E$jH7xxv$A5;l`5CqF`RT%#Ch?7u(xr3%yzpuN zfb`kXT6gbDp;z@s#9kY4nf*}X>>BAa-bl(Os@c+w#9hhpIdd9XO31xrQ&bg8jJBS4 zcR6Y2xf-p-y2ZghEV~wRN{?GQv-B&`NjD)y<;ngs9Mo`@!lbkJU8HBRf!Cl0e& z%C@cqnUX3y#?@yY-zI}qi20pp$jKvOV0ns3tKoEF{?`hl7QN=_c^F+R-sjJs#UGqq zEWgd2dwu+be|zg!*OhHd$(41xkZJ1kgWSIM^4G40#Kc<)ug}Wuz)kmh0cN=6VNI&* zSjsF}HDP`Cv=g9wYr(}{uQOSS-Q{xja zljBqWlQ64$sWWTYmfGqHnXbdZdv0wTl@&KZ%AoNBE%T|?ufHYtEmLX=Qi7hh#UF~> z^GdAV(RqMfN_wuPPHrBRV(+Gx*j^^ATf$*VZeB&0nz>UX#id<3#hf|(-ArfI9UJCI z>=8HE_irfE+mEcb_!jwX^AS{eutmK6P?HMLBI@Igk0H6Ez{GAPfAA~zfNn2Q{0Ups zm0nM&k8fwk zJU|5#MMVWZ6n_U{c6xfb!}eoh%VO!0@tJ;u{<0hPu|>L(!73Ie^0~bC)fm>_2^nwH zdgn5}le?_ZXZFNj+sw~NvhxzH#%M#8z?hRR4?L#DV1T)8^JR+oRs7EARdSpFVUpQ6fo88?{ zPX^;!^ib8wwRJaIC`IP1J>4AYkAL<+QZ(hEp>aa=h90D6X3BW4ws+B%@hXXeVU)8_6h^f zdFS8apNlBIZVxK0p|9?n%PSY`c}cT1;(qa0>Qn&@JhW?U7P0Rug3bmyu$yoCtbNtv;wOPV~m|@tU zW$q=PqR7gRsDsJtP-5P#c?BvwBHpx#qMlzaIV_)9f9T~sHyHT(!h7Jex)xt;cv41s zNwe{OZ+&&rX%etTufLM%b|=*3_v9$=7pNACS7bQX92rXD7%zu^FN?pgvX{$SWz}po z`NY#xK+vD$FZjy|3C{!)GyR{D;j`Z<(qLEO4xtlx-%7?9yMl3S`F6I(*m!}Whbn$4 zY8_i_qCi_@QR#qt$DeqMttt5g94Wp?p-@`Tg=4 z>*U71upHozpohm-Y~-fN2E2y_ch=Xb{KP(cd`okGt1QJPNKn6Hu2ovxK+ zg}9QG{b+b|5rdpt<%8lxWd>DVHv09+Y)iOSucn)ihpXRuUEQ$ANk}O0Y0@gp!Qibn zrxW~8z`tgDj+OL?Ei0#hrWoSt=!;|U`q2}9x3i;5e_Pu>7x@7Gxk^+EoogQO3i+Qu z-k2#dJS?Dd-Fp`8{K#8HM8xpVOb_&VR_)gk#>PfCGu1Qe0bu6R9?Vd4dA(YvfU|hG z`R2ONy{mORW^vPEq#{sX;*Q2s#UBac3N5l2KBF$&mc{)>AEngOi#fb$4IYIJuyV3; zuhm-}fBPjSn{>XrexL8XUq~q7crl``Nh*8KP~2?E(8Hq@aK^>Ot@}8v&$KFBXpZv? zBT+?yALra2dF4l?VuHx}JGmG`LLjX5l=5mD)}(b*hQFnx%mc9aE$H%lph3>!K>2KF zxJ))wP=HUuy{n)wzgX>ga*4-kGvzS}|HA(IwZ_B)CdP!(Ypf@&pW?c0V^&RGG%Jwt z5Tpkn<4#>A?Zpk1ucdU|A$;dOvzPJ3GloobzoU|Gv-u!l-n~QGx2TbtdOy9}e;PaY zf6H&*r&dTKoE0CiGBvC>s=u;exLc=k;HS>RmX|Giyw#dl9bPB0OzQl)R@O~DzC@|B z!_e)vru7dFL4vx{RQ{eh-vfW0Uw>>Ia@UL=E{~XTvgyp-PEqys&1xKZOjNp3-5Dkr zK%o}Ko*ULb8sdgc?8467FYp;R;8C2z^9micxM=LQN2JQGB3ZsgO0O|Vr%gD*ico-CCh*=pXt#Ytb!#0pbiI4YK|+E>@Z?cJ zVWz%?!B_9>Yi$^~2z_|nMoDqt;24U2I5s*Ou!q1tqvRHrQmPCu*VP_UNB}W3{KppW z(sJYJ=VK1E#IBtks;Vm-i~wca{P1D)%@`U1QGP*zf!8-pFZLI%;b!0uf_#zPq6i#c zTediTJuZ&hb@`ZJKrYt2jncp312c}wjR^x zVt3FBF(`R7B?BxJFeVO^n5q!t<~NCRms}yK-|P1+Drdx$)AAJ*skv@@j;Tw-Ss&KQ zUmREoP2KHHXPp+pDMUA0lE>jye|qaN4sa#4XLI&qnU1~V@{CxUhcIZPNI zi~mR)6wTleHJFi$v62zJWYD_NJ#2KhMkfw|fv-huX)a|y-8v2!-j&@TG;2;eqcrzz zR+%HYew*f_3Q_ph3Gukk;1<73WFt4HI`o~IQj1T(U-i+gR(|tlZJKog)fC~Jkp42p z2aAJ!)Ut?S-OG^9Aav<0^G5GKGG_n$QmkZ;C}H8&YMbQ>!_GU9P55DK5yhD1Z&7RE85JQ;8PsF>(2co#1(pALN=+o&LrFx@k zse(VKw5Z1E1rM#Ccv5|&Hl!p-JlRbmly~Uuv_hm6&pci|H)cU4i7APb z&<7aq&RiImR!lYpi4_nySidH<-4UW)@k@WDPtx+3^jK-ESF_MgU67#BRp&#E9h<}O zq5n4DH@0k36(%VzGL451?xKWS=c%ba{21Fa@)eKZSgFa3l)%R~NasdcFg?{Q;q2{Z z4P4CF$aSzrMOpeg56NgozSN_lOhP3N+(Zj$QE__-wR%@H|n6?$xBmG>xB3%9cyM^{$Sp zvT6MbtZ^QqqWbZZf174@*`I@M!#!iPu7>`BM;;d)#)KFfOhsfQ<21C%XJeGJ+kyS) zv);pSRgqleYL)V4jH8h03>PJ)^s`O}j^oEzh0d>vG7}5y#8LkWdO34T)zCK@5BK(Wrmi$A;y))_)_2Oi@;w-V=4Z-$}v-6h0^AjsIt%Lb@SN<$o?w!*m? zvGO}zN5-L1HnS786_2sGL_FrzI8}x_6}l33U?J#WTil;@W_>p<`B`Uev~aKw4O5+s zaHh?p=kW+Z2IUB~pV&uu)U=11gv&mEtK2{l4w#KukzAsDL`u`ZF<>R~D-!L=fRY3l zk%5RB5&Q=KzOp2nGG_hdo^c`wn^a^chG^NaF=;DqprJEkH`m|%wSZC~jE{>OkBCcI zIHpuTA@ub4r#Zk))b?Jo?c)<1tGEkta}Raxmj*gg8#g-6zNrj3ja2Yr?soobO}^Pb$hAVFpH+5^3x;*et2`S(w`I6>tA%k zt$GdKXh&AHBZjo{%T?_NB2PEgk=7 zSu+);J{l!4^?`kb_b4by(62g?vqGz5WL)W#)Q!St6eA|3FJ`^Ztkh|ea^U7SS9VrZ z^z|Q$gD5nG|6y#!d$;<8KO&-(I3cLYF`d2_E4sK4G`vjODgEci7i-hdnpfxg?e$kr z#_lS`^(H&Ox(xCO}f1qcp^0a%yxFC0r-KfL?Xf z(zJ?0W_q39oY3<32uI&tVeEU%nTPsTPv3=`N4Ri@7I;2HLeM(W|BE6j?0XEsbmKcVjGy*Pym&A^bR*r@h3{rKtAO%>&S+?n&OKjfmG2=H}0{5wLdi9z5dC zdUp2g=>B~u6H($7*^;sYJ+J+qerONp2+YhE6_O+ke>2wGn3nQ@l|zx3J^#EESw>gSbYH0L6I?yMje@d=tJ_UTopPU% zh?TU0<|^p+p~F3t7tLu|!sa3MN_^U%pa^Zl67nl$dL&DW8F3$vaO~_MGCyO~{d=^o z;!+!lc)N1;r@CA<{?UHz&&}PZ(O8C!;EJs0ruJ~GX90(z zFJim>A;@aRj$t;zZA=jP8^-?Ab3M|b@fzxsPoJa#0Xf%K;|Ix(!Aw;zf!~W_ke8AKlBuHU*Ntg%;imSB4Qy{ST=}@;8#ckRa`&mSdErK@?3iHI|0&yxMI~1w!r%4X9h)tYWbS}E7C=u z(3?x-x6vNI^8+23n<%}i@>~LDj4YaVqX};J+zUhZ?{BPs7yHVP-}0>juY%^6;|-L( zr&INK1mBcg1IJmt58qp%S|aEv8$+yo0NECWIKW8{@57<`FDiHGdBk?3URr2=4)K2w zL9^1?yR`ODkj`$$pZwIZC2;M~_rj{%~=Lnn5| zE4(NRfj&$`c(u)Ocaj9&9dO2ZpO77YB27{u+ULd;Ds3DRQELHNKvTPzM{d$yF_jChOY2AkXUE*RT?of7Vb-0`)=taguCsDsN zF0TGYJe;QKw4EYzzK#L_+SyK%o66W21)1i649;ar<;v%=kU2!rkV8^h?`Hx(Is8ti zVWM;nl0*ON1&kedtkzK>2(e)X@VT|mcLMD(J|=wGG#h+!m;*yI6ccAd?hAU1^1`3| zD1UZc0!A-O^WN8}3yZg|DN&97B8!zTEqIT`PyI-u3irB4X0UIWg-c~`bLw^#I>+Xx zz~<+X-Jw>>Kh98FZC`cdYbeW?m%KoUV%RmYIk^;vK!vMWIAyp@WnwLDaK(Q%?5=Yd zx_wxH8#Z7V@ue4d-s3-uQz~UY7DD_WY)6NgvQ03Q{7!6FGsX7|y=HMLTg zvsl4Lt=N@#UASI4Rgo#pB_FHnzhvgX{r-#Qi$n|C6b*(`S4x8WtOwOkstHxJnCjbV=3LK17)ILwE+# zgIN5AN{}|6NI_ePEWPSxameO9ILdAR;lG+Ut#PpVl%XftuD4yyw`BP@g6hfOj5Y3C?7SFsKk8-5IObcM_vUWxVy z`8nVvo;@mTz9GAHlJyTZ-TcKcOL(Ju2huOV&6cgpQ-x?%xNP?vG0+=GBlgSn4shCL zDc1`}7+t4!w-U8epOZkZxSQ_PL$e(9ItENh?5>*=0313}d$qe03Zm;&mMc71H_ikA zA{ZlctZ21hBg5+0EnMwR+V$*P3r2mEkjfaeT%V?yio*x8!?pXr0DVaGZ6x~X11+`| z`-G=wcCHsuu&+lDbmT2%;v2hhLii)+j$?ZTKAQX$&17J`OO z!F>H#mmc6Swx@0k614RX7mMh`Nucau;dn;(FFl9kEQ3UrzW2@e%nCO0%kFZXiPNoR zhY6)6@J8bLlAHV+kq0>XO^b@EQ17G!;B%bZqNb(AhJc4L*+On9zJqle4Mu$p#;i98 z%5r?XU82sAoMC1vT6mjrJ_&A0=#`&oc(9%!?*H#MZ-s9YvLeAH2ZqRAdqlA9qO!&RqLl#bg4E?R3Z=M- zYYD}igLs24Ga!aW9t(b;%^fYgLs64qI!^o={*yhv|0Uk9sZ3puiV=O2l9E-OcWaWg zrB&_oc zhOSO2DO;8EwQqU2eMYULkD?~-){+<0#D0Hkir`J{-gt5A-y8+g$0{k7C-oH%!Q+=KzOMiu^0982hR+Q;e_7!;p&JjO z1WxuMbxM(i(fRM2!^JOCe$`Nh$8r>nNo{>u{Tr_7;Z2x~8)M9Q;jfUR>)f{=+FHbpjj}19!W^g6PKA`sT_^=GC^%02>AUo6$TOLom=#ToV*` zo+!&ssqjXe$8lCdDf1Vc9psRwUvzQK`$1gOu)|s02RBol zPX#eXUueJlWjz<$l+M5I7J_>Cd~HtDK+qFs;e8g;u;|}nx3__j@t^eK3m9=K#yB#; zQA`Y(D&e5e{dZ87m~^iU_J2m9Fq}Odk+&oEEoF&ER|yW4<`E8)!@6dsGejYGyNr#+ zaWAauUQ6PMGzkr?D_7(W2~ep7u8U9O^8PiypJ~sJuL)4G1ALJnBw}af3agahnsW+@ zhGe!NU5{t&PR@X`_YsD_Wv}e)SZ}GGD%zd z4L(%CX-A!%f;8NB>t|fnuJ{glBvu6~ifgiXiERgGn;$(ML6_3PTFfR!;ZSdtX{kcB z^{3g}fP4NA0fZBIHm2^?e&JyB2oC*N(Z~)SS48jtF<^mR8CS0D0X4 z@KlaSSSQVXdFcKmWK0|sC*WZ^Lj(tmsOrsoN8r06(NM))*o z&nh}6wsI_a>Q7G`QK9(Yt9p*^O*NBPml#&u23#j0ie0s`?zr?i-=OB8Pnj`Lg9vu# z%h$Ruo$HdoosA>~1jAuyt|oZLUh9uY+oq5+Rc0zYWTOaGkqQcsMh|;~7@^B6%rrA( z(oar5mqlfqmxfqrej-&BbI|rWAHbAuJ%^JY`S!9c65;Ip$9f>c>=r#C>>H24q^SA9 z6l*HpACwbi*xiNYo`x>jq^z+Ng4H#)NT z1G7II0}T7Hi!IxC&~XqAJv=O2A8w)O8N;vlgOlQ+bqkKd`zIf+r-{7I(1=Lh=-r;w zHPh_R#Jj3gCGQ}FPSq)rR`uCR2HKv;@P5(k`(N?Y=<8p)o|rA18*TcO;}3qAMPKHE zxjLFkrn^|!y$@q#Qc=zj-phN)4pF0KiYvwXILyHSdMt^+MclR{rU9UQ{TArZQ5|2k7gmb!+_=9kO{v{$KNIu5rjj z-Z|NA49W}xugR?4?%fg9jFS0auY(V8b>db1p-+0VVQI?4sb*Z%Kp&>jR%`;lu@3pa z%n~v=wEZF36GE+L$C+>6W)giEdr@b{fFSJ2KQHSD1Q^vIU9(ivK6Im-Zk&D_MuGq$ z=-RA!Hv^Wm^wo|yf(2=)I3yYNWE@7P;~>j8Omdf={MbPY&>tyNP(>&~OLWv}G-LY3 z{YN#zcmJ3{9mmh$#Q6Rp^k}O$l_#Dmyn)_ZNG~Exr<30e%k@%Qky}F^CA_rk2K#B2 z9`KepRy{H}K5pN&MC_~P8vgSDuKriOHZn>rn7h8p9ytH_6XAprnXdGy~g+zagYFI^V7t8(l1 zqq+>4b%%M`s9(<18v36zU$0R+4*Wmn-ZHAIxBDB!L_tA7Ktw_sDM3OSk?v4BL_iv( zJCqLTknWOhX$9%-lJ4%V+4zgO|M&CEtTk)Ri|4$sILP^)bDe$d_(X-~a0)b=rtdEy z*uH@&!b$g4PBBQYZ1Y`WH@u;gCCrKiUw~#9A<&d zMtTJsxqPOKtLL43Fm91!9L-o9nF;!zKTf%@e&~8l;BQysZ=V!TNMNyL20J;BwhGeG zUQX~C+^f!yW8IEY~aVQ^7q8ucJ-A5I}| zCMFb9xoRR=+z0~%e!7p?jD^IlL0ijg>?sK4uS8Io^S)2DX*l>p%!GQ{$LST95XEVh zaSoXgDbxvjCcHL8$g-m6xLrtp-$6te>iblii#cF5$lt7#0O^Xq>abtLWa z99&^L%|=TevFhRoX0W)zoFx)4s~hp4(z$jdOX@)?;LhL2`|{Ow$*Ygf`D?3 zJ_;q8D&H%{ZwK@95Q=KIOBsVK45Gw!GO)5FAM%wbK!Jy_b^3SIz533-j-7jOP0%!P ze`V;CI!tY>ND4u);HNEowO0NWe9wO#fr1$d5#+2y2S5EMzy8_H8Ccoe;EXx;e~bOU z&v)S;S%m&@uiT2 zZ;}7Fb5%V2*AZwQXz&Ma_t(FZP)H>pP?22KZ+{;RuX16%{P)q!`rjY$>I|2dzk}5O zJpKQdlaodM{HHuENbG36UwGm|%w`COWNG9ivqr?O+ur9iy}5&3tjI&fjNG9ZFG+e@pnp^r=dq zAq^c;pQp1T{yTX2kADs{|KFc181^40 zc~SnKx(5C~t**Zp%wHeu*MBZ)Ql9^#mNX%@ub0=IyLUCTF)=YgxBWW82>PRkF@b?R z$bh^9RE!Y*BEf@44<3pkvyCcQl``|)ov1qf8X6;pY*jkQHadEffrf*Fh~ZgO*ucPm z-dvlKk06{7+9l}%($N3yJT;=qCRO@<)D zr;D<|Z)&MVS!DNDrZ7-1bOBlU(cD~f9w_=fx4qcjvzcQ!J6{TikgZQtv(wT_D8+)7 zOGgZA5tuBIsK0bNvjNVt;xXu6NJt#{L#_ckC;8uKQ=Sb>e0(R68|DHrvG2e-g4a+{uFl| zp2T$23ecJUifucO|4DDuJW=p`{QMqvjsO%Hv>a5{nuU8L`et=#(VGo&$G?wNjQtog z;eODJ{LsE8cf5-I{h7tw8xL*_$=!Ci4beOs`HrUt_?&iNi?GFNXJ-dL9*@i62>6Y_ z+?rilqR8e3UpcsGK@LVhS$C9$8y0ePYoLqkx=s1#PiA?s?AAW*rqcyCIv2Y5hl6c$DMXJh@*jxIjGZo zbUrrpkV?r7#+W~L=T%ZcZ107;d2opAAl757i>2i@&GfEXhx53OTBp;CFYFup`m7i( z+;`8hFic!xUYY`r;8%Bd;13f^V9H;dpY967j0q$wF2M>Out;_KEMW2ru8BZ@ADK(y z_k9L-*{Pz~!4Y75&7#}w5(aJqaP4r+VgHRr3>0+)bsr$lWgF_~G%aq9miWR)&z-wi zii{|uqf%B@%;!~6IV%@6zG-&f^SxDrvty{anW0pAHX)krKV;oHV+FOJ*U)qGu+skY0<*P$%a2(-I8kiTFv${NcQFw>T6{JFgM9= z$0aN%D1hfow59Cs;Q^e}K*?}A^$TFc0f!I$u3|Ds3)llA6zKKateTB}-v0h%wu&H+ zpL_8pOV_H2FQR@^YFyJWn|><0P(Hc5d|TT9goX29J9awO+;sG`(pe{ zb8j9sARv4y&51Hps}5|s#^HEz(!E`D(~PtsF7NX#WQoYR8*V>LKs=J@iV9v@R8;A7UIBcw;?})BzqlGO?Jf`o8w+3n!cZ9wm*3E@{1Z~< z1nPQhK}}dCT_P5XMk$8NF-ih>fBPUqVB!Dk7J!(~&(9S{8XG+h7JBPIGYX&E>FoT} z+T45>H27EyhXb2_1oh({cExjF0?ie?Qb&)aK~VwhT)J~nMxw1RFV2CB(UY2#oZQjg zt~+^G^@{sTI(WFh|0N)RJd%f{y|q=u!Rh_`q{_-ucqNx6dgS|idMH7l0Tg!HLMdNs z;Ui8XE#IyzFYmd)w^INE?q&MW(w_*uB&4L=_S+}BLni9Awhg};u^5;O3kpBxmr*JH zR(pT`{rgb@!B5K6>%Z#SL(fII;8xB@AJ$x4BWo0B@Ev)ZrzCwuhl7u1I$O%F>ikB` z;wf>mnM5kYxA(}cSdaE*X9l7H04>PRkNapTjPh-g-2OAWT9hnuS}=GWh(1)WvGee7 zhu}Lrst{&v_Ru)sI+#Xdqv2Rym?`erF)3+E-4FUiT=7nd9QMZx z3wVb=5~e_^n}$Xl*PzX=Om-abL)zr;|C+&~^D=3iIcID6Q-QZ7fW zw@8I6CXUo|DH~4T)6^A@a3%~IMFCG(>srC~7Yu?@Ym3#Z?f7NP^Lv=Ril4|AqixR$ zw(1aHPK$G6ED^zCINaS$77vDn2hmIPh@RIuqwjWe1f4qAvr$u1>w|+v!F&FZXhCI+ zVzfQb+k$WDlhi!XoERJ|1)EdY4I&h{xtVx?l)!8<(N3;6^5X~30nzB_C5s`MPfG1k;gG=cZM~Y+|C-lbP_-Am#W6YN~-WT^&Zeyf~{Co_;6jq5qc}0bYuTnA| zIz%uX?a{Zp@H+@0fSQh^LOQ6wf>cK~7;3DOMu9ymsP5YmAjra=0wG>_jV;L+3~u#6 zqodgM)!7J8c2Px0(f8y)Revxu5U2R^wN|G$2Kki_9eW1fLSNjY3T!Ykz0wSCmOXo^ ztE<~>90&B+dpHbpU^GKC5EBb33lr;8Q#=R^=mhckn_DeF4RPAudU(YYY=MVdVWq2@ zKSk$gIbHQ6*v8`wx))ryor3ru?<&K(^`wd z(Xo+Sm6z2PnKLrXU-$(0X;k+ob8j^9Ef^RW+}{{;6uON2_ANO2QcxmJz1ozWpeMNC zISbygbv%lZ(u3tfYsQ`GBJ8||Un!0;rRI7fm!SC*Pgq|`K@F^}IqLA)8%etfi7(HzreT(&@?xVlVwG7S>* zC;DMjVvkvh4I^cUB)4Z1a&r$x&vz zBe595oj1+a)1{a@OX`F<)Jc?WzKTkZ)!m$uGy|o&j0_4n@L*y&zjD?9wpkG?F!`fE zh3wZY@JqM^=eFQ@?yBX@k0(^;`>R8BY9-hMz?R@PIGkayDbm<%!{HopemLw9*u>D_DZJy zW&@R$CP6uPBz0>~);iP02#*C6TaKiO<3h|HHB2!F4UM;nytfXrIhs82KY`Fk;SRXI zh(yq?Z)~V#$ zX$IZi6u}Lm1&H)=+xI;4{z=pibeXgcRc5PRLmZO}Pkq1vel#jk%y*);L~f zPIlh~vK880tf!eHUm>GipP!{NErCRR{KOxa55$zLXQMTSMcnGruW{9xcgbmh6D^Bd~6)JCkH2j^!FS2C^5<^EtApX+XUN#IY zeWg-EN`NcNI9syl_0EB;4@d+|7HaznH9yYc!6gJsH=pts%8f{#J6ZyXQt zMKX%fn?l0az@=M$ZXUEm;) z1!xydO-(hw0dxiEUrWl!1phMo(Cp0oCkFz2_+RZ0!lAp!$jL+7isj&<2S+hz0ZoE- z5v=%-etJ%@LZOM1=DFDx#DfXSMeiGYoSdA%RQDYxVli?eYzkE$ywORY;Nji4e%+?) znxi-P-E>b-P9s5d6svSsP~_)#H%3tH2KORb8?Y{b1yzs^d0RJVZ-d$V)~(ceTXaEo zdAAT)v7k$X6%THM(y?roOH{pTSs3IJ`ElqKg5dwf%*2#hjW$E&_vOn~%`#>H4%2X% z`g(fRHrt;~XgH~XUX@uDtp*j7)#a75J1FIjmpyGmdZsZt zv?@k}8OFdUCCSyQ3$@Lb8Xhf#0Q>3H&o1?94dUklf=%Bomb(mk!?26!c4h_dpz7ZZ z@KUMy&{lYiZWiNk9ED#u^QJ;;IT&SSMIQ(i=SL&19aXkXju*X_=4t-ev?Y3{6X${w z+rq@JZ!A8;1km|%jl)SWdO?Nd(5s~Ow3vavPHWqhEu{u*x17j_+m zTj}dd@WK>p%s@7T7kDj0{Zh_{(=Rw(vU%Ti2LO@GyDAGaH{3i7Jb{aLvdZ-6)_aqB zpiWUZUL!60=~(GYXR{HEOIKO^pu;Pqy1Feko_8nS;8w6rO(Drkl0D}aSUW9Foa|^W z+>M~8Zu0y4&sIpaKUlXtq*JQ`Sq%_BBFQW(>7MMekZBZILf!my1F_I-`3+RysrMf+ zHw_KRzl=%`2?=p^y^*suC#>|9k_OD-v_Pt+&hi3elng^M_3d-J@^AfLoh@5XS9Yly~JT?Bb5fqIMn)I zQa-RZKZoDcI?~UPAWhc{fih8Vq%ifl=cm}%aZu$0p|4Idy?`r2>yeiX#ROgl6k9h< zT3T8z&m)*0Doxk9Lmo%O5ZDSk0@womXoXD$LmmPUdI`~8fM*|u1Abx z`g9;*Kv1~+blSYrlVt!CSF$J`RF*e+Y>e?tKN2g!=0G{T!xuq zux|&V>tLplDD&~ra@#fH3+>mV^n-F(=4pO;%2YXB`y;+Az=*}g#1wCnH~#JI8=zAl zHDj1fjnx^YP_55j(_xPq`<34LRy6SCwSaIW!9APGQEQ(!@jaG~9Y~p<94j)<*M4(4 zAD{ffK_(_j_6iOV;4+{4#j3V3%W3=~dQ)3xsXXzLt>+A#6BavSkSU{6!k-`s#05DzbAxU&WFY!*k2lX}&&^)_C4 zL3>~TTI#1YJvd|k&|Et1iAAj(QF`qK)?kJmkG#C#87auDE;a4UZP(jd7-yx0A1rV< zoz%Hy?kXPFg{>Bm1z_R?Diw%?Q8c!3)#wSUE0yV1eLTKhx{00lJMdA7z~pguLS|-9 zQi0pn=j@HE>|Lh6T<)Rwq9~t`!tkm!fm39d*iw^fcfgcAYFtd^+yU`Rw~mdzR@vOY1h4L>;%t%OHfH>VE^ zdc05@Ip8@vm}U^1ZG&qDP_4GMwxB93EDQ<3FnWIn(O>JSvBN#tQ4e&1ocZ*tlwYrB zvAE_r36(v(6X2*U9vRHM!Z=P>fei1B_O;K@uK-OtXoVEpkeQh75D*9oHnl~_I!#-w z4F`>H^H0hf`v3b@+!na=CtYv0JX+$|ODf;;*aTYQ^2$o#4y0i>Zrsq$^HiJXwm-m>OC&G&Jfu@#*ODHYaO~c0m1-pLbAb#oftiwKjc` zZZ-ll@N;f0SYTH*>F&(6aBx2<0hdA$%aprv*UJz1lwCM zU2@vSM+=Vf^7lONAzq%Ieua>-g?wjkANk#UK|SIfSN^Y^>q>H2GM~a69d4xLcwUGa zE0=vm^py&G_Oiqz_M#E2{zj{9Nl~#9TO%yj`l^Yk1o`;v>`#SNioTT0Z#zcYHa`|V zM+7S3c=xAeO`*G<4^+!+$qBA~T;V2$8ZVWsS+Ey2An~jP49bU=j5|1^vi4`~{Ll+1 zp`^QGr8iLZlrEmjne^$?R|nr7o^shj_~jldBKv{~Xt(~umaU)8ib`J#T3q695bx-a z?(A&i(rd6?E~Rb8AJ8sGmuW9LO{j7j?7Y-?grU3$Quep^g>lVj8L1sMr!n|^!jRJs zmwSQ`Ev460qL?mmZo*P~Gl~%F^IlJ*war3S5wyEABsz*sex%c>*`In{$U~xE&Mneb zF_hwDgokJ3P1V&qG2bcq^j4gKd!S7XA2dEH#D_lBa#Y-3qkq@m?EGPk)h5O>Tl^8z zS0`q47w+5VLX#y1*i^9lt2{a-eL@m?k>no`5K;Z?#tqjiiTVeSRfTif)5=xtGI;p4*IkZ1`Z~t?%bu#N6BQnl13DQAMszj zz2|%EA@b)aGX{STPP}2itD8e*Y)vw#H=1D#wn`0)$bymgQ0^1Al011q3oZEwWfn<- zz1`p1EJ3Mm^{%Bx1EE5}1J!Nr@w`YJLq0_74%+pqhfQ>9)uaf{_gGj!L%gQI3=FQ^ zCf|cNXNf_&BV$k6Pv|*l=jnGRygE2IAbJ5VmThfd0gX=d+2LV+M|(kmm%Oh zdh{7`c1ZGxB11w$uc|4Cr3Ebv+O6POFaNT84F2Wlc_wuDLYdj_t(Q-;bWB!S2TY35 zkvz$I<7I6s4ShR81euq^W991XKk>=j{Tis;1o^leb~x(y`}0&)9nwC%dqSj9$oT3O zr&{<+{q*qg4}Bh%UL*nnw`n_id4+)_d@lP!kJE9RZD)~NzKOZRowJV@Pl+YurMk2r zaXhOThoeom)%#B(9k;fH$vd^WC-a66g=3=zhFdC3FA{#C%BXW+mThtewD!qo0Qz@qwZbDyqJgu2iMRT;g6~g?0Istk9=LCFzt{ zIy8=p0PZCLpZ;>kO^rpa`a}FT#%3>Ferui{>^(hu_b)EMwBFsj=~3K;&x{67FIXjd zburS@PtV`OB?J+-DlzB9qQNGp@Za9D)hLJUgWEZ7L>V}+AMJ3m?eBl`%(1Qu(S2=c^To*1OHA<0|VuBe_aw02s~f>{64$73a`A~ zzmm*{fHpcB6GM_RAT299s|~ggM6w_)UYriiuo{PBUiLsP$CJ6~>22sEK<1@WW1s;Y zCTQTk*M9M$2x^nvpOQEg)>YIrCAhDxLvnoZt6f|W?0)k-3#C?+nfYvIw>-Y(EFnM< zs1DVmwFv>8No`)7ni^Nl1eX)&RU)|M_hOlgY4O}sJOh%iJCo!o{;_Vwum@7{D!ZIn5(5~)p6mpS%C%93rxtC z#U*Z-aa_&~ZO};#Dfott!k;%Gq=Q>s5V|JN<|8^&ZvNui-nDfY+0 z>6vJLwT)&bCN)W>-z4O+JLw(b{!vG5WZ3HRgW!;WOM4zmd`0+lGSqz2tUf*PdRIx3 z5W70>z5$fSRzXK+q1TQ+f8OMDn5j72D#A7qS{amxul@bAMu=%SJ_O48(Hf|3$?q!uF&2uE?qIG!B^m2&B7 z&OrmPZp=`tE&2X~QHNyFg7JGn!B#B0kQ_n1x~+rDY)E1BO2gPh?|&?ue}G9Ub0Bx* zV1cjn@#Dt_c^K47q2uM|=^v$V(V$htM>f5c9LZOiDFk+CR*`}O-7(p;hGJ?Ho>uTZqK>(~1(%aN2t@2fI(4}s9QpTB?5QTCZ2F*mFI z_G3xTos)IX+c_028Da);)pLWXj#PS>q1#+{?;%apEOtZ71fHvS;p*@*GHz*F>M$&H z)k+KhFJZb9;u=$-?&X<&B{;aL0j4m3qQ!4XNlq1aVhN86q(9#$$N}L6D23RpdvetC ziZwbR|Sb7z&t*hpqJd~M&92jSj>NRwu7+=uzr}57YcHnk^gvn-NF|~mK%jR$I z45sEy6nu{6T~SaOX*P&(OEF71!Q> z_|TX%xRfX)Bot^`$?GvUA~-#j!w}xF)kzUd{2vJb{yzx-5zJOHpex;+TMNR{(4iK^ zoszsj)8c!=?d0&w3k_td(c_`jL9xDfzPB8*7WTce@)B|i2Qz4o%}~w@>DxS^>vMWc z6q`RrMkν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�T3vBkIAb)>b!T@T&t$8m?K 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%0D!Pri_I#@jQWd^$wR@9@Xhos>K+^NG(kM3< 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�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

-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 z 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/samples/aws-specialist-agent/docs/img/screenshot.png b/samples/aws-specialist-agent/docs/img/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ae98f45b490c2d17889850184505716ac4a7a7 GIT binary patch literal 66581 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

EThi45?w8?Hv)F@V%Imn)cRrTVMC<*x*)c(|vB$ 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 f5g$TnSA^&eBy)*Hv(B~R7v0pi?URqZ + +# Fullstack AgentCore Solution Template Documentation + +Welcome to the Fullstack AgentCore Solution Template (FAST) documentation! + +Have a look at the navigation bar on the left hand side of your browser to read through the actual documentation! + +_This index.md file exists only because is required for mkdocs to generate an index.html for documentation pages._ \ No newline at end of file diff --git a/samples/aws-specialist-agent/frontend/README.md b/samples/aws-specialist-agent/frontend/README.md new file mode 100644 index 0000000..16c16a7 --- /dev/null +++ b/samples/aws-specialist-agent/frontend/README.md @@ -0,0 +1,200 @@ +# Frontend - Local Development Guide + +This is the React + Vite frontend for the Fullstack AgentCore Solution Template (FAST). This README focuses on local development setup and workflows. + +For full stack deployment instructions, see the [top-level README](../README.md) and [deployment documentation](../docs/DEPLOYMENT.md). + +![Chat example](readme-imgs/fast-chat-screenshot.png) + +## Local Development Setup + +### Prerequisites + +- Node.js (20+ recommended) +- npm + +### Quick Start + +1. Navigate to the frontend directory: + +```bash +cd frontend +``` + +2. Install dependencies: + +```bash +npm install +``` + +3. Start the development server: + +```bash +npm run dev +``` + +4. Open [http://localhost:3000](http://localhost:3000) in your browser + +## Development Options + +### Option 1: With Authentication (Default) + +By default, the app uses Cognito authentication. To test this locally: + +1. First deploy the full stack (see [deployment docs](../docs/DEPLOYMENT.md)) +2. Set the redirect URI for local development: + +```bash +export VITE_COGNITO_REDIRECT_URI=http://localhost:3000 +npm run dev +``` + +### Option 2: Disable Authentication (ONLY for Local Development!!!) + +For faster local development without needing to deploy Cognito, you can disable authentication: + +**⚠️ IMPORTANT: Remove the AuthProvider wrapper from `src/App.tsx`** + +Change this: + +```tsx +export default function App() { + return ( + + + + + + ) +} +``` + +To this: + +```tsx +export default function App() { + return ( + + + + ) +} +``` + +This bypasses all authentication flows and lets you develop the UI directly. + +## UI Components + +This project uses [shadcn/ui](https://ui.shadcn.com/docs/components) for UI components. + +### Adding New Components + +Install additional shadcn components as needed: + +```bash +npx shadcn@latest add calendar +npx shadcn@latest add dialog +npx shadcn@latest add form +``` + +### Available Components + +Browse the full component library at: https://ui.shadcn.com/docs/components + +Popular components include: + +- Button, Input, Textarea +- Dialog, Sheet, Popover +- Table, Card, Badge +- Form, Calendar, Select +- And many more... + +## Icons + +This project includes [Lucide React](https://lucide.dev/) icons, providing a comprehensive set of beautiful, customizable icons. + +### Using Icons + +Import and use any icon from the Lucide library: + +```tsx +import { Camera } from "lucide-react" + +// Usage +const App = () => { + return +} + +export default App +``` + +### Available Icons + +Browse all available icons at: https://lucide.dev/ + +Popular icons include Camera, Search, Menu, User, Settings, Download, Upload, and hundreds more. + +## Project Structure + +``` +frontend/ +├── src/ +│ ├── main.tsx # Application entry point +│ ├── App.tsx # Root component with routing +│ ├── routes/ # Route components +│ ├── components/ +│ │ ├── ui/ # shadcn components +│ │ ├── chat/ # Chat UI +│ │ └── auth/ # Authentication components +│ ├── hooks/ # Custom hooks (useToolRenderer) +│ ├── lib/ # Utilities and configurations +│ │ └── agentcore-client/ # AgentCore streaming client, parsers, types +│ ├── services/ # API service layers +│ └── styles/ # Global styles +├── public/ # Static assets +├── index.html # HTML entry point +└── package.json +``` + +## Environment Variables + +The application uses Vite environment variables with the `VITE_` prefix: + +- `VITE_COGNITO_USER_POOL_ID` - Cognito User Pool ID +- `VITE_COGNITO_CLIENT_ID` - Cognito Client ID +- `VITE_COGNITO_REGION` - AWS Region +- `VITE_COGNITO_REDIRECT_URI` - Redirect URI after authentication +- `VITE_COGNITO_POST_LOGOUT_REDIRECT_URI` - Redirect URI after logout + +These can be set in a `.env` file or as environment variables. The application will fall back to `aws-exports.json` if environment variables are not set. + +## Available Scripts + +- `npm run dev` - Start the Vite development server +- `npm run build` - Build for production (runs TypeScript check + Vite build) +- `npm run preview` - Preview the production build locally +- `npm run lint` - Run ESLint +- `npm run lint:fix` - Run ESLint with auto-fix +- `npm run clean` - Clean build artifacts and dependencies + +## Development Tips + +- **Hot Reload**: Changes auto-reload in the browser with Vite's fast HMR +- **TypeScript**: Full type safety with strict mode enabled +- **Vibe Coding**: Optimized for AI-assisted development +- **Tailwind CSS**: Utility-first styling with Tailwind CSS 4 + +## Building with AI Assistants + +This stack is designed for AI-assisted development: + +1. **Describe your vision**: "Create a document upload component with drag-and-drop" +2. **Leverage shadcn components**: Rich building blocks that AI understands +3. **Iterate quickly**: Make changes and see results instantly + +### Example AI Prompts + +- "Add a file upload component to the chat interface" +- "Create a sidebar with navigation using shadcn components" +- "Build a settings page with form validation" +- "Add a data table with sorting and filtering" diff --git a/samples/aws-specialist-agent/frontend/components.json b/samples/aws-specialist-agent/frontend/components.json new file mode 100644 index 0000000..3289f23 --- /dev/null +++ b/samples/aws-specialist-agent/frontend/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/samples/aws-specialist-agent/frontend/eslint.config.mjs b/samples/aws-specialist-agent/frontend/eslint.config.mjs new file mode 100644 index 0000000..b14a666 --- /dev/null +++ b/samples/aws-specialist-agent/frontend/eslint.config.mjs @@ -0,0 +1,27 @@ +import tseslint from "@typescript-eslint/eslint-plugin" +import tsparser from "@typescript-eslint/parser" + +const eslintConfig = [ + { + files: ["**/*.ts", "**/*.tsx"], + languageOptions: { + parser: tsparser, + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + }, + }, + plugins: { + "@typescript-eslint": tseslint, + }, + rules: { + "@typescript-eslint/no-explicit-any": "warn", + "@typescript-eslint/no-unused-vars": "warn", + }, + }, + { + ignores: ["node_modules/**", "build/**", "delete/**", "tmp/**", ".vite/**", "src/app/**"], + }, +] + +export default eslintConfig diff --git a/samples/aws-specialist-agent/frontend/index.html b/samples/aws-specialist-agent/frontend/index.html new file mode 100644 index 0000000..acfc35d --- /dev/null +++ b/samples/aws-specialist-agent/frontend/index.html @@ -0,0 +1,18 @@ + + + + + + + + AgentCore AWS Specialist Agent + + + + + + +
+ + + diff --git a/samples/aws-specialist-agent/frontend/package-lock.json b/samples/aws-specialist-agent/frontend/package-lock.json new file mode 100644 index 0000000..02e6542 --- /dev/null +++ b/samples/aws-specialist-agent/frontend/package-lock.json @@ -0,0 +1,17226 @@ +{ + "name": "fullstack-agentcore-solution-template-frontend", + "version": "0.4.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fullstack-agentcore-solution-template-frontend", + "version": "0.4.1", + "dependencies": { + "@radix-ui/react-alert-dialog": "^1.1.15", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-progress": "^1.1.7", + "@radix-ui/react-select": "^2.2.5", + "@radix-ui/react-slot": "^1.2.4", + "@types/react-syntax-highlighter": "^15.5.13", + "aws-amplify": "^6.16.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.562.0", + "mermaid": "^11.15.0", + "radix-ui": "^1.4.3", + "react": "^19.2.1", + "react-dom": "^19.2.1", + "react-dropzone": "^14.3.8", + "react-markdown": "^10.1.0", + "react-oidc-context": "^3.3.0", + "react-router-dom": "^6.21.0", + "react-spinners": "^0.17.0", + "react-syntax-highlighter": "^16.1.0", + "react-zoom-pan-pinch": "^4.0.3", + "remark-gfm": "^4.0.1", + "tailwind-merge": "^3.2.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@shadcn/ui": "^0.0.4", + "@tailwindcss/postcss": "^4", + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.5.1", + "@types/node": "^25.0.3", + "@types/react": "^19", + "@types/react-dom": "^19", + "@typescript-eslint/eslint-plugin": "^8.55.0", + "@typescript-eslint/parser": "^8.55.0", + "@vitejs/plugin-react": "^4.2.0", + "eslint": "^9.39.2", + "fast-check": "^4.5.3", + "jsdom": "^23.0.1", + "prettier": "^3.8.1", + "shadcn": "^3.0.0", + "tailwindcss": "^4", + "tw-animate-css": "^1.2.9", + "typescript": "^5", + "vite": "^7.3.2", + "vitest": "^4.0.18" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/ni": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-25.0.0.tgz", + "integrity": "sha512-9q/yCljni37pkMr4sPrI3G4jqdIk074+iukc5aFJl7kmDCCsiJrbZ6zKxnES1Gwg+i9RcDZwvktl23puGslmvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansis": "^4.0.0", + "fzf": "^0.5.2", + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "bin": { + "na": "bin/na.mjs", + "nci": "bin/nci.mjs", + "ni": "bin/ni.mjs", + "nlx": "bin/nlx.mjs", + "nr": "bin/nr.mjs", + "nun": "bin/nun.mjs", + "nup": "bin/nup.mjs" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-2.0.2.tgz", + "integrity": "sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.3", + "css-tree": "^2.3.1", + "is-potential-custom-element-name": "^1.0.1" + } + }, + "node_modules/@aws-amplify/analytics": { + "version": "7.0.93", + "resolved": "https://registry.npmjs.org/@aws-amplify/analytics/-/analytics-7.0.93.tgz", + "integrity": "sha512-3WoB0VzATJyupTNQ+ZnzE0pLYnpZPtqNN4deZ8gadG5uzGhhvkt9uZtgVnn/QFGb35DnP8qNDTRiM0rL3vjyZQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-firehose": "3.982.0", + "@aws-sdk/client-kinesis": "3.982.0", + "@aws-sdk/client-personalize-events": "3.982.0", + "@smithy/util-utf8": "2.0.0", + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/api": { + "version": "6.3.24", + "resolved": "https://registry.npmjs.org/@aws-amplify/api/-/api-6.3.24.tgz", + "integrity": "sha512-19CVHj+0J35aHMPNzy12nO1mJS4oP68yFUfiMnulSsiVGV5XhUDc/bkdcX0uI7U1SsUSs+9TOBwZg27bzYIGkg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-amplify/api-graphql": "4.8.5", + "@aws-amplify/api-rest": "4.6.3", + "@aws-amplify/data-schema": "^1.7.0", + "rxjs": "^7.8.1", + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/api-graphql": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/@aws-amplify/api-graphql/-/api-graphql-4.8.5.tgz", + "integrity": "sha512-Xu45+MizoethsRfCFIdN9RORenCu0e41tMkiTFVE5oKC76eoOlYHg2LlhG2Lmmasby/Ggi5bZouVxJIcP4IeIA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-amplify/api-rest": "4.6.3", + "@aws-amplify/core": "6.16.1", + "@aws-amplify/data-schema": "^1.7.0", + "@aws-sdk/types": "3.973.1", + "graphql": "15.8.0", + "rxjs": "^7.8.1", + "tslib": "^2.5.0", + "uuid": "^11.0.0" + } + }, + "node_modules/@aws-amplify/api-rest": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@aws-amplify/api-rest/-/api-rest-4.6.3.tgz", + "integrity": "sha512-SPhttyB9SR2p5PkUPmUPfkXNqGrgvdqiNHNHhx7FjHnqFBXLDRtGhzqRbE7faDeAwrcWz1HCtcpk7MLHYt94yg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/auth": { + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@aws-amplify/auth/-/auth-6.19.1.tgz", + "integrity": "sha512-N6bqBUEly/xUiho0X5oGhLEDlQTWsj1i0FquDYsyuav5e9HHQBLNgG1zmpq28lyxtDaUREi/IDx+CD10EpcPcQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "5.2.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0", + "@aws-amplify/react-native": "^1.1.10" + }, + "peerDependenciesMeta": { + "@aws-amplify/react-native": { + "optional": true + } + } + }, + "node_modules/@aws-amplify/core": { + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/@aws-amplify/core/-/core-6.16.1.tgz", + "integrity": "sha512-WHO6yYegmnZ+K3vnYzVwy+wnxYqSkdFakBIlgm4922QXHOQYWdIl/rrTcaagrpJEGT6YlTnqx1ANIoPojNxWmw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/types": "3.973.1", + "@smithy/util-hex-encoding": "2.0.0", + "@types/uuid": "^9.0.0", + "js-cookie": "^3.0.5", + "rxjs": "^7.8.1", + "tslib": "^2.5.0", + "uuid": "^11.0.0" + } + }, + "node_modules/@aws-amplify/data-schema": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@aws-amplify/data-schema/-/data-schema-1.24.0.tgz", + "integrity": "sha512-nly/+w3R2JIq6qxsw7io2nGxliSswBO9FQqzckpTnpUAd+oMe06HoTyDvQG6hxozQc9Woy0tT375WIJp4C84Uw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-amplify/data-schema-types": "*", + "@smithy/util-base64": "^3.0.0", + "@types/aws-lambda": "^8.10.134", + "@types/json-schema": "^7.0.15", + "rxjs": "^7.8.1" + } + }, + "node_modules/@aws-amplify/data-schema-types": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@aws-amplify/data-schema-types/-/data-schema-types-1.2.1.tgz", + "integrity": "sha512-SuYVcy9Hg8Ox9P0QCXEPwqHxX5zVPgVo2YvNBOm5TpkZr4UK6ir3USame7dELZsk5/9f6KoP70QAYhTvp/j1Og==", + "license": "Apache-2.0", + "dependencies": { + "graphql": "15.8.0", + "rxjs": "^7.8.1" + } + }, + "node_modules/@aws-amplify/datastore": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@aws-amplify/datastore/-/datastore-5.1.5.tgz", + "integrity": "sha512-/9o4eYqWOlxVxe/riDd282FmUHHSiGUEAwle464T8wzNSqPTB7yTeQfzt2LFYTWsrYLCSR0OtOM1bY5VPSVmew==", + "license": "Apache-2.0", + "dependencies": { + "@aws-amplify/api": "6.3.24", + "@aws-amplify/api-graphql": "4.8.5", + "buffer": "4.9.2", + "idb": "5.0.6", + "immer": "9.0.6", + "rxjs": "^7.8.1", + "ulid": "^2.3.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/notifications": { + "version": "2.0.93", + "resolved": "https://registry.npmjs.org/@aws-amplify/notifications/-/notifications-2.0.93.tgz", + "integrity": "sha512-NtHKusaiWzkPXuaKsTyvKAWE8JnQcXmQoaidQ5/a9/nWWTzs983l5xgc4OPvfVR+3N63K+3iTmYHtKcEbhgS6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.973.1", + "lodash": "^4.17.21", + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/storage": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@aws-amplify/storage/-/storage-6.13.1.tgz", + "integrity": "sha512-iNDUmdvevcujcW4PBY7IGBMeTm+nohsZgswH6k99tG0myVsZRg0lVC4l5lcwoXoyVLpQjOmfZ0JgwV0oQbZ6zg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.973.1", + "@smithy/md5-js": "2.0.7", + "buffer": "4.9.2", + "crc-32": "1.2.2", + "fast-xml-parser": "^5.3.4", + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-firehose": { + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-firehose/-/client-firehose-3.982.0.tgz", + "integrity": "sha512-Qur2Siqep+gRReTjlKXcdpyX/MUnzm5OgNNudDPxzpmzdnc3ZKlUwGlbEoS1VA5cFS6N4zg6WfZqlwcXg//TSg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-node": "^3.972.5", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.982.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis": { + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kinesis/-/client-kinesis-3.982.0.tgz", + "integrity": "sha512-Gh3xyumdz3IRj91HIBR48TohQyA3VSn/blDcGXzl4dwQKXgM0ISdHgyniNo2GQNhORJF3d01MSMx72s5NNQxUA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-node": "^3.972.5", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.982.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/eventstream-serde-browser": "^4.2.8", + "@smithy/eventstream-serde-config-resolver": "^4.3.8", + "@smithy/eventstream-serde-node": "^4.2.8", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events": { + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-personalize-events/-/client-personalize-events-3.982.0.tgz", + "integrity": "sha512-JllssIZCPxAgYy4gkIM2e/kXxWT0xQzzZd5y9rRStm0bl5MiLAxzX4q9WhGG7glyB++EuhYskiT1N+DzyM5nTw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-node": "^3.972.5", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.982.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.985.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.985.0.tgz", + "integrity": "sha512-81J8iE8MuXhdbMfIz4sWFj64Pe41bFi/uqqmqOC5SlGv+kwoyLsyKS/rH2tW2t5buih4vTUxskRjxlqikTD4oQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.7", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.985.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.5", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-endpoints": { + "version": "3.985.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.985.0.tgz", + "integrity": "sha512-vth7UfGSUR3ljvaq8V4Rc62FsM7GUTH/myxPWkaEgOrprz1/Pc72EgTXxj+cPPPDAfHFIpjhkB7T7Td0RJx+BA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.973.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.7.tgz", + "integrity": "sha512-wNZZQQNlJ+hzD49cKdo+PY6rsTDElO8yDImnrI69p2PLBa7QomeUKAJWYp9xnaR38nlHqWhMHZuYLCQ3oSX+xg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/xml-builder": "^3.972.4", + "@smithy/core": "^3.22.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.5.tgz", + "integrity": "sha512-LxJ9PEO4gKPXzkufvIESUysykPIdrV7+Ocb9yAhbhJLE4TiAYqbCVUE+VuKP1leGR1bBfjWjYgSV5MxprlX3mQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.7.tgz", + "integrity": "sha512-L2uOGtvp2x3bTcxFTpSM+GkwFIPd8pHfGWO1764icMbo7e5xJh0nfhx1UwkXLnwvocTNEf8A7jISZLYjUSNaTg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/types": "^3.973.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.9", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.11", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.5.tgz", + "integrity": "sha512-SdDTYE6jkARzOeL7+kudMIM4DaFnP5dZVeatzw849k4bSXDdErDS188bgeNzc/RA2WGrlEpsqHUKP6G7sVXhZg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-env": "^3.972.5", + "@aws-sdk/credential-provider-http": "^3.972.7", + "@aws-sdk/credential-provider-login": "^3.972.5", + "@aws-sdk/credential-provider-process": "^3.972.5", + "@aws-sdk/credential-provider-sso": "^3.972.5", + "@aws-sdk/credential-provider-web-identity": "^3.972.5", + "@aws-sdk/nested-clients": "3.985.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.5.tgz", + "integrity": "sha512-uYq1ILyTSI6ZDCMY5+vUsRM0SOCVI7kaW4wBrehVVkhAxC6y+e9rvGtnoZqCOWL1gKjTMouvsf4Ilhc5NCg1Aw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/nested-clients": "3.985.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.6.tgz", + "integrity": "sha512-DZ3CnAAtSVtVz+G+ogqecaErMLgzph4JH5nYbHoBMgBkwTUV+SUcjsjOJwdBJTHu3Dm6l5LBYekZoU2nDqQk2A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.5", + "@aws-sdk/credential-provider-http": "^3.972.7", + "@aws-sdk/credential-provider-ini": "^3.972.5", + "@aws-sdk/credential-provider-process": "^3.972.5", + "@aws-sdk/credential-provider-sso": "^3.972.5", + "@aws-sdk/credential-provider-web-identity": "^3.972.5", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.5.tgz", + "integrity": "sha512-HDKF3mVbLnuqGg6dMnzBf1VUOywE12/N286msI9YaK9mEIzdsGCtLTvrDhe3Up0R9/hGFbB+9l21/TwF5L1C6g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.5.tgz", + "integrity": "sha512-8urj3AoeNeQisjMmMBhFeiY2gxt6/7wQQbEGun0YV/OaOOiXrIudTIEYF8ZfD+NQI6X1FY5AkRsx6O/CaGiybA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.985.0", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/token-providers": "3.985.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.5.tgz", + "integrity": "sha512-OK3cULuJl6c+RcDZfPpaK5o3deTOnKZbxm7pzhFNGA3fI2hF9yDih17fGRazJzGGWaDVlR9ejZrpDef4DJCEsw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/nested-clients": "3.985.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.3.tgz", + "integrity": "sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.3.tgz", + "integrity": "sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.3.tgz", + "integrity": "sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.7.tgz", + "integrity": "sha512-HUD+geASjXSCyL/DHPQc/Ua7JhldTcIglVAoCV8kiVm99IaFSlAbTvEnyhZwdE6bdFyTL+uIaWLaCFSRsglZBQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.985.0", + "@smithy/core": "^3.22.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/util-endpoints": { + "version": "3.985.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.985.0.tgz", + "integrity": "sha512-vth7UfGSUR3ljvaq8V4Rc62FsM7GUTH/myxPWkaEgOrprz1/Pc72EgTXxj+cPPPDAfHFIpjhkB7T7Td0RJx+BA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.985.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.985.0.tgz", + "integrity": "sha512-TsWwKzb/2WHafAY0CE7uXgLj0FmnkBTgfioG9HO+7z/zCPcl1+YU+i7dW4o0y+aFxFgxTMG+ExBQpqT/k2ao8g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.7", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.985.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.5", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-endpoints": { + "version": "3.985.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.985.0.tgz", + "integrity": "sha512-vth7UfGSUR3ljvaq8V4Rc62FsM7GUTH/myxPWkaEgOrprz1/Pc72EgTXxj+cPPPDAfHFIpjhkB7T7Td0RJx+BA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.3.tgz", + "integrity": "sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.985.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.985.0.tgz", + "integrity": "sha512-+hwpHZyEq8k+9JL2PkE60V93v2kNhUIv7STFt+EAez1UJsJOQDhc5LpzEX66pNjclI5OTwBROs/DhJjC/BtMjQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/nested-clients": "3.985.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.982.0.tgz", + "integrity": "sha512-M27u8FJP7O0Of9hMWX5dipp//8iglmV9jr7R8SR8RveU+Z50/8TqH68Tu6wUWBGMfXjzbVwn1INIAO5lZrlxXQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.4.tgz", + "integrity": "sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.3.tgz", + "integrity": "sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.5.tgz", + "integrity": "sha512-GsUDF+rXyxDZkkJxUsDxnA67FG+kc5W1dnloCFLl6fWzceevsCYzJpASBzT+BPjwUgREE6FngfJYYYMQUY5fZQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "^3.972.7", + "@aws-sdk/types": "^3.973.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.22", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.22.tgz", + "integrity": "sha512-PMYKKtJd70IsSG0yHrdAbxBr+ZWBKLvzFZfD3/urxgf6hXVMzuU5M+3MJ5G67RpOmLBu1fAUN65SbWuKUCOlAA==", + "license": "Apache-2.0", + "dependencies": { + "@nodable/entities": "2.1.0", + "@smithy/types": "^4.14.1", + "fast-xml-parser": "5.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder/node_modules/@smithy/types": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.1.tgz", + "integrity": "sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", + "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT" + }, + "node_modules/@chevrotain/types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", + "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", + "license": "Apache-2.0" + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@dotenvx/dotenvx": { + "version": "1.51.4", + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.51.4.tgz", + "integrity": "sha512-AoziS8lRQ3ew/lY5J4JSlzYSN9Fo0oiyMBY37L3Bwq4mOQJT5GSrdZYLFPt6pH1LApDI3ZJceNyx+rHRACZSeQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "commander": "^11.1.0", + "dotenv": "^17.2.1", + "eciesjs": "^0.4.10", + "execa": "^5.1.1", + "fdir": "^6.2.0", + "ignore": "^5.3.0", + "object-treeify": "1.1.33", + "picomatch": "^4.0.2", + "which": "^4.0.0" + }, + "bin": { + "dotenvx": "src/cli/dotenvx.js" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@ecies/ciphers": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.5.tgz", + "integrity": "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==", + "dev": true, + "license": "MIT", + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + }, + "peerDependencies": { + "@noble/ciphers": "^1.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@hono/node-server": { + "version": "1.19.13", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.13.tgz", + "integrity": "sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.3.tgz", + "integrity": "sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.0" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.1.1.tgz", + "integrity": "sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==", + "license": "MIT", + "dependencies": { + "@chevrotain/types": "~11.1.1" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", + "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@mswjs/interceptors": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.40.0.tgz", + "integrity": "sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodable/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accessible-icon": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz", + "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", + "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", + "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", + "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-form": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.8.tgz", + "integrity": "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", + "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menubar": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", + "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-one-time-password-field": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.8.tgz", + "integrity": "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-password-toggle-field": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.3.tgz", + "integrity": "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-is-hydrated": "0.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", + "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.3", + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", + "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", + "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", + "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", + "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", + "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", + "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toolbar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.11.tgz", + "integrity": "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-toggle-group": "1.1.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", + "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@remix-run/router": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", + "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shadcn/ui": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@shadcn/ui/-/ui-0.0.4.tgz", + "integrity": "sha512-0dtu/5ApsOZ24qgaZwtif8jVwqol7a4m1x5AxPuM1k5wxhqU7t/qEfBGtaSki1R8VlbTQfCj5PAlO45NKCa7Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "5.2.0", + "commander": "^10.0.0", + "execa": "^7.0.0", + "fs-extra": "^11.1.0", + "node-fetch": "^3.3.0", + "ora": "^6.1.2", + "prompts": "^2.4.2", + "zod": "^3.20.2" + }, + "bin": { + "ui": "dist/index.js" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/abort-controller/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", + "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.0.tgz", + "integrity": "sha512-Yq4UPVoQICM9zHnByLmG8632t2M0+yap4T7ANVw482J0W7HW0pOuxwVmeOwzJqX2Q89fkXz0Vybz55Wj2Xzrsg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.12", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", + "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.8.tgz", + "integrity": "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.8.tgz", + "integrity": "sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.8.tgz", + "integrity": "sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.8.tgz", + "integrity": "sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.8.tgz", + "integrity": "sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", + "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", + "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.7.tgz", + "integrity": "sha512-2i2BpXF9pI5D1xekqUsgQ/ohv5+H//G9FlawJrkOJskV18PgJ8LiNbLiskMeYt07yAsSTZR7qtlcAaa/GQLWww==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.3.1", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/md5-js/node_modules/@smithy/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", + "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", + "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.4.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.14.tgz", + "integrity": "sha512-FUFNE5KVeaY6U/GL0nzAAHkaCHzXLZcY1EhtQnsAqhD8Du13oPKtMB9/0WK4/LK6a/T5OZ24wPoSShff5iI6Ag==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.23.0", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.4.31", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.31.tgz", + "integrity": "sha512-RXBzLpMkIrxBPe4C8OmEOHvS8aH9RUuCOH++Acb5jZDEblxDjyg6un72X9IcbrGTJoiUwmI7hLypNfuDACypbg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/service-error-classification": "^4.2.8", + "@smithy/smithy-client": "^4.11.3", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.10.tgz", + "integrity": "sha512-u4YeUwOWRZaHbWaebvrs3UhwQwj+2VNmcVCwXcYTvPIuVyM7Ex1ftAj+fdbG/P4AkBwLq/+SKn+ydOI4ZJE9PA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", + "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz", + "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.3.tgz", + "integrity": "sha512-Q7kY5sDau8OoE6Y9zJoRGgje8P4/UY0WzH8R2ok0PDh+iJ+ZnEKowhjEqYafVcubkbYxQVaqwm3iufktzhprGg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.23.0", + "@smithy/middleware-endpoint": "^4.4.14", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.12", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-base64/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-base64/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.30", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.30.tgz", + "integrity": "sha512-cMni0uVU27zxOiU8TuC8pQLC1pYeZ/xEMxvchSK/ILwleRd1ugobOcIRr5vXtcRqKd4aBLWlpeBoDPJJ91LQng==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.11.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.33", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.33.tgz", + "integrity": "sha512-LEb2aq5F4oZUSzWBG7S53d4UytZSkOEJPXcBq/xbG2/TmK9EW5naUZ8lKu1BEyWMzdHIzEVN16M3k8oxDq+DJA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.6", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.11.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", + "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.12.tgz", + "integrity": "sha512-D8tgkrmhAX/UNeCZbqbEO3uqyghUnEmmoO9YEvRuwxjlkKKUE7FOgCJnqpTlQPe9MApdWPky58mNQQHbnCzoNg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.10", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.8.tgz", + "integrity": "sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter/node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.7.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.7.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", + "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "postcss": "^8.4.41", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz", + "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.3", + "minimatch": "^10.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.160", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.160.tgz", + "integrity": "sha512-uoO4QVQNWFPJMh26pXtmtrRfGshPUSpMZGUyUQY20FhfHEElEBOPKgVmFs1z+kbpyBsRs2JnoOPT7++Z4GA9pA==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "15.5.13", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz", + "integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz", + "integrity": "sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/type-utils": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.55.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz", + "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz", + "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz", + "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz", + "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz", + "integrity": "sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz", + "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz", + "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.55.0", + "@typescript-eslint/tsconfig-utils": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz", + "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz", + "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "license": "MIT", + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", + "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.10", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", + "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", + "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.10", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", + "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "@vitest/utils": "4.1.10", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", + "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.10", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/attr-accept": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", + "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/aws-amplify": { + "version": "6.16.2", + "resolved": "https://registry.npmjs.org/aws-amplify/-/aws-amplify-6.16.2.tgz", + "integrity": "sha512-7CHwfH5QxZ0rzCws/DNy5VLVcIIZWd9iUTtV1Oj6kPzpkFhCJ2I8gTvhFdh61HLhrg2lShcPQ8cecBIQS/ZJ0A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-amplify/analytics": "7.0.93", + "@aws-amplify/api": "6.3.24", + "@aws-amplify/auth": "6.19.1", + "@aws-amplify/core": "6.16.1", + "@aws-amplify/datastore": "5.1.5", + "@aws-amplify/notifications": "2.0.93", + "@aws-amplify/storage": "6.13.1", + "tslib": "^2.5.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.0.tgz", + "integrity": "sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", + "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/dayjs": { + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/dompurify": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", + "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eciesjs": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.16.tgz", + "integrity": "sha512-dS5cbA9rA2VR4Ybuvhg6jvdmp46ubLn3E+px8cG/35aEDNclrqoCjg6mt0HYZ/M+OoESS3jSkCrqk1kWAEhWAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ecies/ciphers": "^0.2.4", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.9.7", + "@noble/hashes": "^1.8.0" + }, + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.0.tgz", + "integrity": "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-toolkit": { + "version": "1.47.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.1.tgz", + "integrity": "sha512-5RAqEwf4P4E17p+W75KLOWw/nOvKZzSQpxM32IpI2KZLaVonjTrZ0Ai5ghMaVI9eKC2p8eoQgcBdkEDgzFk6+Q==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.1.tgz", + "integrity": "sha512-5O6KYmyJEpuPJV5hNTXKbAHWRqrzyu+OI3vUnSd2kXFubIVpG7ezpgxQy76Zo5GQZtrQBg86hF+CM/NX+cioiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-check": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.5.3.tgz", + "integrity": "sha512-IE9csY7lnhxBnA8g/WI5eg/hygA6MGWJMSNfFRrBlXUciADEhS1EDB0SIsMSvzubzIlOBbVITSsypCsW717poA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^7.0.0" + }, + "engines": { + "node": ">=12.17.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-builder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz", + "integrity": "sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.5", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-selector": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", + "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", + "license": "MIT", + "dependencies": { + "tslib": "^2.7.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzysort": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.1.0.tgz", + "integrity": "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fzf": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fzf/-/fzf-0.5.2.tgz", + "integrity": "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-own-enumerable-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-own-enumerable-keys/-/get-own-enumerable-keys-1.0.0.tgz", + "integrity": "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphql": { + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", + "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", + "license": "MIT", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0" + }, + "node_modules/hono": { + "version": "4.12.28", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.28.tgz", + "integrity": "sha512-YwUvVpSF7m1yOblFPrU3Hbo8XhPheBoiyfGuII6z19LnOr6JpDnyyp7LFNrfV56wS8tpvtBFGRISHN02pDdLOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/idb": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/idb/-/idb-5.0.6.tgz", + "integrity": "sha512-/PFvOWPzRcEPmlDt5jEvzVZVs0wyd/EvGvkDIcbBpGuMMLQKrTPG0TxvE2UJtgZtCQCmOtM2QD7yQJBVEjKGOw==", + "license": "ISC" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.6.tgz", + "integrity": "sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-cookie": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz", + "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.2.0.tgz", + "integrity": "sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/dom-selector": "^2.0.1", + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.3", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.16.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/katex": { + "version": "0.16.47", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", + "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/lucide-react": { + "version": "0.562.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz", + "integrity": "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.15.0.tgz", + "integrity": "sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.2", + "@mermaid-js/parser": "^1.1.1", + "@types/d3": "^7.4.3", + "@upsetjs/venn.js": "^2.0.0", + "cytoscape": "^3.33.1", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.14", + "dayjs": "^1.11.19", + "dompurify": "^3.3.1", + "es-toolkit": "^1.45.1", + "katex": "^0.16.25", + "khroma": "^2.1.0", + "marked": "^16.3.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/msw": { + "version": "2.12.7", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.7.tgz", + "integrity": "sha512-retd5i3xCZDVWMYjHEVuKTmhqY8lSsxujjVrZiGbbdoxxIBg5S7rCuYy/YQpfrTYIxpd/o0Kyb/3H+1udBMoYg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.40.0", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.7.0", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/msw/node_modules/graphql": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", + "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-treeify": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/oidc-client-ts": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-3.4.1.tgz", + "integrity": "sha512-jNdst/U28Iasukx/L5MP6b274Vr7ftQs6qAhPBCvz6Wt5rPCA+Q/tUmCzfCHHWweWw5szeMy2Gfrm1rITwUKrw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "jwt-decode": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", + "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/radix-ui": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz", + "integrity": "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-accessible-icon": "1.1.7", + "@radix-ui/react-accordion": "1.2.12", + "@radix-ui/react-alert-dialog": "1.1.15", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-aspect-ratio": "1.1.7", + "@radix-ui/react-avatar": "1.1.10", + "@radix-ui/react-checkbox": "1.3.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-context-menu": "2.2.16", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-dropdown-menu": "2.1.16", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-form": "0.1.8", + "@radix-ui/react-hover-card": "1.1.15", + "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-menubar": "1.1.16", + "@radix-ui/react-navigation-menu": "1.2.14", + "@radix-ui/react-one-time-password-field": "0.1.8", + "@radix-ui/react-password-toggle-field": "0.1.3", + "@radix-ui/react-popover": "1.1.15", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-progress": "1.1.7", + "@radix-ui/react-radio-group": "1.3.8", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-scroll-area": "1.2.10", + "@radix-ui/react-select": "2.2.6", + "@radix-ui/react-separator": "1.1.7", + "@radix-ui/react-slider": "1.3.6", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-switch": "1.2.6", + "@radix-ui/react-tabs": "1.1.13", + "@radix-ui/react-toast": "1.2.15", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-toggle-group": "1.1.11", + "@radix-ui/react-toolbar": "1.1.11", + "@radix-ui/react-tooltip": "1.2.8", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-escape-keydown": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/radix-ui/node_modules/@radix-ui/react-progress": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", + "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/radix-ui/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.3" + } + }, + "node_modules/react-dropzone": { + "version": "14.3.8", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.8.tgz", + "integrity": "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.4", + "file-selector": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-oidc-context": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/react-oidc-context/-/react-oidc-context-3.3.0.tgz", + "integrity": "sha512-302T/ma4AOVAxrHdYctDSKXjCq9KNHT564XEO2yOPxRfxEP58xa4nz+GQinNl8x7CnEXECSM5JEjQJk3Cr5BvA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "oidc-client-ts": "^3.1.0", + "react": ">=16.14.0" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", + "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", + "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.3", + "react-router": "6.30.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-spinners": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.17.0.tgz", + "integrity": "sha512-L/8HTylaBmIWwQzIjMq+0vyaRXuoAevzWoD35wKpNTxxtYXWZp+xtgkfD7Y4WItuX0YvdxMPU79+7VhhmbmuTQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-syntax-highlighter": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.0.tgz", + "integrity": "sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^5.0.0" + }, + "engines": { + "node": ">= 16.20.2" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-zoom-pan-pinch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-4.0.3.tgz", + "integrity": "sha512-N2Hi6L78fFmhRra+ORpFSW7WST5x6kxpOPplIvtB0b7b+U2anpo1z1wLgaWRPS2kUSqcraRG+JgBCIlDJnqqAg==", + "license": "MIT", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/recast": { + "version": "0.23.11", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/refractor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz", + "integrity": "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/prismjs": "^1.0.0", + "hastscript": "^9.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rettime": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.7.0.tgz", + "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shadcn": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/shadcn/-/shadcn-3.6.2.tgz", + "integrity": "sha512-2g48/7UsXTSWMFU9GYww85AN5iVTkErbeycrcleI55R+atqW8HE1M/YDFyQ+0T3Bwsd4e8vycPu9gmwODunDpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/ni": "^25.0.0", + "@babel/core": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/plugin-transform-typescript": "^7.28.0", + "@babel/preset-typescript": "^7.27.1", + "@dotenvx/dotenvx": "^1.48.4", + "@modelcontextprotocol/sdk": "^1.17.2", + "browserslist": "^4.26.2", + "commander": "^14.0.0", + "cosmiconfig": "^9.0.0", + "dedent": "^1.6.0", + "deepmerge": "^4.3.1", + "diff": "^8.0.2", + "execa": "^9.6.0", + "fast-glob": "^3.3.3", + "fs-extra": "^11.3.1", + "fuzzysort": "^3.1.0", + "https-proxy-agent": "^7.0.6", + "kleur": "^4.1.5", + "msw": "^2.10.4", + "node-fetch": "^3.3.2", + "open": "^11.0.0", + "ora": "^8.2.0", + "postcss": "^8.5.6", + "postcss-selector-parser": "^7.1.0", + "prompts": "^2.4.2", + "recast": "^0.23.11", + "stringify-object": "^5.0.0", + "ts-morph": "^26.0.0", + "tsconfig-paths": "^4.2.0", + "zod": "^3.24.1", + "zod-to-json-schema": "^3.24.6" + }, + "bin": { + "shadcn": "dist/index.js" + } + }, + "node_modules/shadcn/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/shadcn/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/shadcn/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/shadcn/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/shadcn/node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/shadcn/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/shadcn/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/shadcn/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shadcn/node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/shadcn/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shadcn/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-5.0.0.tgz", + "integrity": "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-keys": "^1.0.0", + "is-obj": "^3.0.0", + "is-regexp": "^3.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/stringify-object?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", + "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.19.tgz", + "integrity": "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.19" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz", + "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-dedent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", + "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-morph": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-26.0.0.tgz", + "integrity": "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.27.0", + "code-block-writer": "^13.0.3" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.1.tgz", + "integrity": "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ulid": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.4.0.tgz", + "integrity": "sha512-fIRiVTJNcSRmXKPZtGzFQv9WRrZ3M9eoptl/teFJvjOzmpU+/K/JH6HZ8deBfb5vMEpicJcLn7JmvdknlMq7Zg==", + "license": "MIT", + "bin": { + "ulid": "bin/cli.js" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.10", + "@vitest/mocker": "4.1.10", + "@vitest/pretty-format": "4.1.10", + "@vitest/runner": "4.1.10", + "@vitest/snapshot": "4.1.10", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.10", + "@vitest/browser-preview": "4.1.10", + "@vitest/browser-webdriverio": "4.1.10", + "@vitest/coverage-istanbul": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "@vitest/ui": "4.1.10", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/samples/aws-specialist-agent/frontend/package.json b/samples/aws-specialist-agent/frontend/package.json new file mode 100644 index 0000000..65f46ff --- /dev/null +++ b/samples/aws-specialist-agent/frontend/package.json @@ -0,0 +1,64 @@ +{ + "name": "fullstack-agentcore-solution-template-frontend", + "version": "0.4.1", + "private": true, + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "test": "vitest --run", + "test:watch": "vitest", + "lint": "eslint src/", + "lint:fix": "eslint src/ --fix", + "clean": "rm -rf build/ node_modules/ .vite/" + }, + "dependencies": { + "@radix-ui/react-alert-dialog": "^1.1.15", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-progress": "^1.1.7", + "@radix-ui/react-select": "^2.2.5", + "@radix-ui/react-slot": "^1.2.4", + "@types/react-syntax-highlighter": "^15.5.13", + "aws-amplify": "^6.16.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.562.0", + "mermaid": "^11.15.0", + "radix-ui": "^1.4.3", + "react": "^19.2.1", + "react-dom": "^19.2.1", + "react-dropzone": "^14.3.8", + "react-markdown": "^10.1.0", + "react-oidc-context": "^3.3.0", + "react-router-dom": "^6.21.0", + "react-spinners": "^0.17.0", + "react-syntax-highlighter": "^16.1.0", + "react-zoom-pan-pinch": "^4.0.3", + "remark-gfm": "^4.0.1", + "tailwind-merge": "^3.2.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@shadcn/ui": "^0.0.4", + "@tailwindcss/postcss": "^4", + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.5.1", + "@types/node": "^25.0.3", + "@types/react": "^19", + "@types/react-dom": "^19", + "@typescript-eslint/eslint-plugin": "^8.55.0", + "@typescript-eslint/parser": "^8.55.0", + "@vitejs/plugin-react": "^4.2.0", + "eslint": "^9.39.2", + "fast-check": "^4.5.3", + "jsdom": "^23.0.1", + "prettier": "^3.8.1", + "shadcn": "^3.0.0", + "tailwindcss": "^4", + "tw-animate-css": "^1.2.9", + "typescript": "^5", + "vite": "^7.3.2", + "vitest": "^4.0.18" + } +} diff --git a/samples/aws-specialist-agent/frontend/postcss.config.mjs b/samples/aws-specialist-agent/frontend/postcss.config.mjs new file mode 100644 index 0000000..30563c7 --- /dev/null +++ b/samples/aws-specialist-agent/frontend/postcss.config.mjs @@ -0,0 +1,7 @@ +import tailwindcss from "@tailwindcss/postcss" + +const config = { + plugins: [tailwindcss], +} + +export default config diff --git a/samples/aws-specialist-agent/frontend/public/favicon.ico b/samples/aws-specialist-agent/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..129ee136870848270517aeee93fed8b4d148e065 GIT binary patch literal 370070 zcmeF42iP4&)%XL1g!GU`3MDs6QxuS*0xF<1=}mg?y`xftO6VPebVBc;ccgb|N>Qyz|aGyL)!;?tSmQ**wpiy?5{Klrv|}oPGujm~X(K0i#C`kbhGL z>^pG4fW7%NHU55++<#T>t+2wJ?@JCCaP;^A1J+zK{=UrG0|qR<`hWq`r_cGm(0l{d zJ)Y0}n>t{bsRIWbeDZt)mXU9CF;)KNGyh8)(ysq++O%m=S$`j2c4~C_j8V~5r;Uuh z{KYAA+x_y|Q=+R+9~oVG@~CK;rKirl@AvzyBgRBKY(6Ra^h%3ISDrdDI^$~#N2eS$ z#=N_#+}nMdMWW*m8k_k34d;xA7=vy1fh&eak6b-;?)T-FTOzvV%#m}y+vn`{l5dTQ zR$FCp^ZS9jOo%QzX>@eKiK8Pv^UP=EH=eQ2yVuWucCqN*ONT|z-Mmor^o>KJ@83Hp zy6&tI(e-DKh~BzyQ1s;WL!xJHTqwHp;^EO}R*w7N{f|s*m_DwRaeZauNzqN`jfif$ zV0g6prx%MhUUy2g;g_aFUs!Fi=%#Z=L^sOc&Rb55ZkA`x`1-;!jz)CY9^<30?mKSo znC`e}cy#^=qod8%pB(+)+XJHil|S0J_#305+bO~#ZVeefZEUvQN<9cj5HW zX5RbmxQKavO@Slp>AvHBX04X{n8lxl!JUV$?7^RvS6Cvt;*@0k`R3tcqMf#wC~LR4 zS@&-oHa0r>$T88ZGe#Pm-fO!>qGR^&fwkK=pFbwJdztK!%VZC&^Z7;Rj&uFBrkFhi z?k%%)WA1(b{UYB742Ys;{-85c-vvg*

1-*`B!9Y^U^z?`1sUl*R3Z;I|}}M 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

EThi45?w8?Hv)F@V%Imn)cRrTVMC<*x*)c(|vB$ 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 literal 0 HcmV?d00001 diff --git a/samples/aws-specialist-agent/frontend/src/App.tsx b/samples/aws-specialist-agent/frontend/src/App.tsx new file mode 100644 index 0000000..f105bfe --- /dev/null +++ b/samples/aws-specialist-agent/frontend/src/App.tsx @@ -0,0 +1,16 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { BrowserRouter } from "react-router-dom" +import { AuthProvider } from "@/components/auth/AuthProvider" +import AppRoutes from "./routes" + +export default function App() { + return ( + + + + + + ) +} diff --git a/samples/aws-specialist-agent/frontend/src/app/context/GlobalContext.tsx b/samples/aws-specialist-agent/frontend/src/app/context/GlobalContext.tsx new file mode 100644 index 0000000..da4ece5 --- /dev/null +++ b/samples/aws-specialist-agent/frontend/src/app/context/GlobalContext.tsx @@ -0,0 +1,74 @@ +"use client" +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +/** + * Global context provider for the application + * Provides shared state and functionality across components + */ + +import { createContext, useContext, PropsWithChildren, useState, useCallback } from "react" + +// localStorage key for the user's selected model. We persist the +// stable logical key (e.g. "opus-4.8"), never the physical Bedrock id, so the +// saved choice survives model/version/routing changes on the backend. +const MODEL_KEY_STORAGE = "fast.selectedModelKey" + +interface GlobalContextType { + isLoading: boolean + setIsLoading: (loading: boolean) => void + // The user's selected model logical key, persisted to localStorage. + // null until a model list is loaded or a choice is made; ChatInterface seeds + // it with the default once aws-exports models are available. + selectedModelKey: string | null + setSelectedModelKey: (key: string) => void +} + +const GlobalContext = createContext(undefined) + +/** + * Hook to access the global context + * @returns The global context value + * @throws Error if used outside of GlobalContextProvider + */ +export function useGlobal(): GlobalContextType { + const context = useContext(GlobalContext) + if (context === undefined) { + throw new Error("useGlobal must be used within a GlobalContextProvider") + } + return context +} + +/** + * Global context provider component + * Wraps the application to provide global state + * @param children - Child components to wrap + */ +export function GlobalContextProvider({ children }: PropsWithChildren) { + const [isLoading, setIsLoading] = useState(false) + + // Lazy initializer reads the persisted choice once. Guarded for SSR, where + // window/localStorage do not exist. + const [selectedModelKey, setSelectedModelKeyState] = useState(() => { + if (typeof window === "undefined") return null + return window.localStorage.getItem(MODEL_KEY_STORAGE) + }) + + // Update state and persist. Wrapped in useCallback so it is stable across + // renders (it is read in effect dependency lists downstream). + const setSelectedModelKey = useCallback((key: string) => { + setSelectedModelKeyState(key) + if (typeof window !== "undefined") { + window.localStorage.setItem(MODEL_KEY_STORAGE, key) + } + }, []) + + const value: GlobalContextType = { + isLoading, + setIsLoading, + selectedModelKey, + setSelectedModelKey, + } + + return {children} +} diff --git a/samples/aws-specialist-agent/frontend/src/components/auth/AuthProvider.tsx b/samples/aws-specialist-agent/frontend/src/components/auth/AuthProvider.tsx new file mode 100644 index 0000000..ab319b6 --- /dev/null +++ b/samples/aws-specialist-agent/frontend/src/components/auth/AuthProvider.tsx @@ -0,0 +1,71 @@ +"use client" + +import { createCognitoAuthConfig, cognitoAuthConfig } from "@/lib/auth" +import { useEffect, useState, PropsWithChildren } from "react" +import { AuthProvider as OidcAuthProvider } from "react-oidc-context" +import { WebStorageStateStore } from "oidc-client-ts" +import { AutoSignin } from "./AutoSignin" + +interface CognitoAuthConfig { + authority?: string + client_id?: string + redirect_uri?: string + post_logout_redirect_uri?: string + response_type?: string + scope?: string + automaticSilentRenew?: boolean + userStore?: WebStorageStateStore +} + +const AuthProvider = ({ children }: PropsWithChildren) => { + const [authConfig, setAuthConfig] = useState(null) + const [loading, setLoading] = useState(true) + + useEffect(() => { + async function loadConfig() { + try { + const config = await createCognitoAuthConfig() + setAuthConfig(config) + } catch (error) { + console.error("Failed to load auth configuration:", error) + console.error("Falling back to environment variables") + // Fallback to env vars on error + setAuthConfig(cognitoAuthConfig) + } finally { + setLoading(false) + } + } + + loadConfig() + }, []) + + if (loading) { + return ( +
+ Loading authentication configuration... +
+ ) + } + + if (!authConfig) { + return ( +
+ Failed to load authentication configuration +
+ ) + } + + return ( + { + window.history.replaceState({}, document.title, window.location.pathname) + }} + > + {children} + + ) +} + +export { AuthProvider } diff --git a/samples/aws-specialist-agent/frontend/src/components/auth/AutoSignin.tsx b/samples/aws-specialist-agent/frontend/src/components/auth/AutoSignin.tsx new file mode 100644 index 0000000..61dba08 --- /dev/null +++ b/samples/aws-specialist-agent/frontend/src/components/auth/AutoSignin.tsx @@ -0,0 +1,38 @@ +"use client" + +import { ReactNode, useEffect, useState, PropsWithChildren } from "react" +import { useAuth } from "react-oidc-context" +import { Button } from "@/components/ui/button" + +function AutoSigninContent({ children }: PropsWithChildren) { + const auth = useAuth() + + if (auth.isLoading) { + return
Loading...
+ } + + if (!auth.isAuthenticated) { + return ( +
+

Please sign in

+ +
+ ) + } + + return <>{children} +} + +export function AutoSignin({ children }: { children: ReactNode }) { + const [mounted, setMounted] = useState(false) + + useEffect(() => { + setMounted(true) + }, []) + + if (!mounted) { + return null + } + + return {children} +} diff --git a/samples/aws-specialist-agent/frontend/src/components/chat/ChatHeader.tsx b/samples/aws-specialist-agent/frontend/src/components/chat/ChatHeader.tsx new file mode 100644 index 0000000..6425c8b --- /dev/null +++ b/samples/aws-specialist-agent/frontend/src/components/chat/ChatHeader.tsx @@ -0,0 +1,66 @@ +import { Button } from "@/components/ui/button" +import { User } from "lucide-react" +import { useAuth } from "@/hooks/useAuth" +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, +} from "@/components/ui/alert-dialog" + +type ChatHeaderProps = { + title?: string | undefined +} + +export function ChatHeader({ title }: ChatHeaderProps) { + const { isAuthenticated, signOut, user } = useAuth() + + // The signed-in user's display name. Prefer the preferred_username claim + // (set at user creation); never show the full email — for users without a + // preferred_username, fall back to the email local part (before the @). + const profile = user?.profile as { email?: string; preferred_username?: string } | undefined + const displayName = profile?.preferred_username || profile?.email?.split("@")[0] + + return ( +
+
+

{title || "AgentCore AWS Specialist Agent"}

+
+
+ {isAuthenticated && displayName && ( + + + + {displayName} + + + )} + {isAuthenticated && ( + + + + + + + Confirm Logout + + Are you sure you want to log out? You will need to sign in again to access your + account. + + + + Cancel + signOut()}>Confirm + + + + )} +
+
+ ) +} diff --git a/samples/aws-specialist-agent/frontend/src/components/chat/ChatInput.tsx b/samples/aws-specialist-agent/frontend/src/components/chat/ChatInput.tsx new file mode 100644 index 0000000..d0f648d --- /dev/null +++ b/samples/aws-specialist-agent/frontend/src/components/chat/ChatInput.tsx @@ -0,0 +1,110 @@ +"use client" + +import { FormEvent, KeyboardEvent, useRef, useEffect } from "react" +import { Button } from "@/components/ui/button" +import { Textarea } from "@/components/ui/textarea" +import { Loader2Icon, Send } from "lucide-react" +import { ModelSelector } from "./ModelSelector" +import { SelectableModel } from "./types" + +interface ChatInputProps { + input: string + setInput: (input: string) => void + handleSubmit: (e: FormEvent) => void + isLoading: boolean + className?: string + // Model picker wiring. Optional so the input renders even before + // the model list loads; the selector hides itself when models is empty. + models?: SelectableModel[] + selectedModelKey?: string | null + onModelChange?: (key: string) => void +} + +export function ChatInput({ + input, + setInput, + handleSubmit, + isLoading, + className = "", + models = [], + selectedModelKey = null, + onModelChange, +}: ChatInputProps) { + const textareaRef = useRef(null) + + // Auto-resize the textarea based on content + useEffect(() => { + const textarea = textareaRef.current + if (textarea) { + textarea.style.height = "0px" + const scrollHeight = textarea.scrollHeight + textarea.style.height = scrollHeight + "px" + } + }, [input]) + + // Submit on Cmd+Enter (Mac) / Ctrl+Enter (Windows); plain Enter inserts a + // newline. This avoids accidental sends while composing Japanese (IME), where + // Enter is used to confirm a conversion: an Enter that confirms an IME + // composition is ignored entirely so it neither sends nor adds a stray newline. + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key !== "Enter") return + + // Ignore the Enter that confirms an IME conversion (isComposing is true + // mid-composition; keyCode 229 is the legacy signal for the same). + if (e.nativeEvent.isComposing || e.keyCode === 229) return + + if (e.metaKey || e.ctrlKey) { + // Send on Cmd/Ctrl+Enter. + e.preventDefault() + if (input.trim()) { + handleSubmit(e as unknown as FormEvent) + } + } + // Plain Enter / Shift+Enter: let the textarea insert a newline (default). + } + + return ( +
+
+

7#Ugl@R(zH;SCM$}*@nn+vW5v_mM1^}#Iy}hF? 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±d62PhP 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 A&Hw-a literal 0 HcmV?d00001 diff --git a/samples/aws-specialist-agent/docs/img/demo.webp b/samples/aws-specialist-agent/docs/img/demo.webp new file mode 100644 index 0000000000000000000000000000000000000000..5e29a58560fb88a74e73d4e1734363c7321b2dba GIT binary patch literal 458206 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ξ__8&{rXYx{pu)8E2A1xX0a%F z`s_7Zau;?G!C;REFuB4eQcTRTvkn=(smr-Mphl&-_3>gQF7VK3KApc67MUjDvrFD? zt)JLC(nR{*%PYiHK=HKLmynR-*bwG1vyWzo%x< z-q@M{_HA{s&`9%s#tE;&AAq&wn`mFHIozF{E&8QP!rXI{Q*=9g9Hx?=1YmO@lOfN# z{i1O9o&rzbzl$a!57|IGpOyelTs=*BG1F+E)t?Rpx|BsG!ItH*IvBrH+n^({$%jG} zVfT@uCikgRGsWvLf9qvLEo&_)0(@QX76vI7z||nZl1U9h7!TpJY0_)<{g9h^bUslZ zL$@0AsmmF|9@1?$9X&fH7nNZ`ThfI9S=;CREP8{AMSH8p1zPv3cUmd|9(!GErB8}@ zO)1}1yP(Re>h0!Pn6PPkcAT_WtCCQP_VV=1G-h60c$dh3?&QyVjJp|_kyim6kbZH1 z@gGz4AV!N;3L2hz#<$W{di91My^N6r6NkZJMMbS!SHQPs?+DfZ{y4ZLcP6-Y9f?^o z06&NaTuLpBwSiEJPc2r;_alDcZJ~n9m~M`JSG9o%4$3o{*{G5&)4CukX5ho1Xu9YZ zz6c%g`j7F_oPrh+SkD}@hS@?1952T*%hy?+tb<2S9lU7tK5XC1PJ5_r)(29WLjEax z0nGHH4*eJr31N;1t%MZ*&e?u*#jc)j*VRfls$IsNhRFNsXeZz~_w^|+Z+ zb3%_n2gKhVKc>1q3tUHTyHRj@-g9qWFBcIcTH!YkQ*EnCg;25ccm)wX*ONGifGptK zkX20I)oyYw0SF$}4XTzS9muj$zlc1#lZ$b1@N7u(GxD z4vBR%dOpc^Q3ye$jO_)RSA_-_cfPix=N-w$1}!5y+qe*3uDmF>q5*`rY+s*{%#i4RL*_>8nU$Z|vzQ;4u)VOgx6OVf z*>AGRUKR0-|M$$^^|X39he+F=rPgMg+xZCVF3tksa{ng>ur4JH34TVD$xJS87>Ph|N7VsspVe@f%Iopc(3lRCSM(ul~nGK<0M#55hk zcVj~OXps*X0ecGmOAr4)*D84sM!(W3bX0R-FNNT3S07}DBSnr*fg`eYEr&0x($`|> z;(_6BdN?5=|`%k_&QQv`+HDtR%{i0Jda!`LYHSQz)_?UED?R zD%Y+{;L!w#3bZ0IA)PXTKm~0qaxOUNzTVdzrD?TLS zGQI#fSG{r*x)wvs>HuN`2pA3+R|Y(3ExtH>cgGKLpSW~UV=XDJ2Kk&*DLLZJX2mnZ zwzWQS7BC8=P_Rpz6>`eG%9YTj$>8t|dcGdKRJZm_?=B8<0i#{uf=D1O%K66-0%g}@ ze?sVIEyB8i@8G`xZY+GWL3z&owtY<^?~rMyo-diu@9-u!W_U}C1UTg= zKkt~fLoSS`UexxBk$z8N^~f~pm6$V;pQLsi53Pa@jxo)*%9c^rE2W?~^4%&DW@h&2 z<}t``$S;Im%BV{s9XfGRoI-@L@;z0~&{KZu?)-dWLpquH?1UYXDdd{#M49kNA zgcR`5*E~y722eY%2rW(DePq6Gcf3*7GD;#>blyp^XEOT4NsZ;f0bX7_1idNX@L4`S ztI@Pe>ByH`d?mp<0-W>;OZevcl@^2tFeCkdRs27Ol`N2w!%tW#{%rApV-%&@d&2Z- zE$qHF`?tBVoR1?%QmRoB+|^IsYDhIF6;fFK?e3M;`h+qcR!?d2xRw^I>gzKZvM74= zGJN_EuyX|+3m{E$&iG8P6}{m#R6X{Fa+jVeLKK#U|cAO)SZ!jY!>`v&WqQn-^0!U_DD@cHBWjhSxD*|8~@$6H4_DXZO-(qYt zO+AZdXL-lPA7POE(Fy$Sa_b5I<(*wK-jZ)MC6-LsQu$C6IDf)s;Fj1bwCovbFOUvM zlk$Fn&ST(fes~aJ^L0^RxA(o=c`xj%IY2&y%zoxLq9#!xzE&7@&CQ*=4x8ln{4pr^ zr2G>?589OUn->8kBSck~iuCUG+1>)28tD<-f)Pm=TDSVs0r7=lX>w41_TN(`4SH9X z$7X1wtcq##1B=x>f!!YHN1sp|Gmerzy>`470s*vUv(YBUW;VWu2y@VHtpSrpL(C)Y zFCiYYOcMJRrZ6#??v$^|s;At4M)p;qxW8Wc$hF8#)4`J1iVpy65K{`fLMP6prp8*L zPaelO;@&z{w@Ln{&l=^3N1WGx(;J!v2OkgsP!79Hr^IbG4>NbbIysy7DVdsPK)N8be1ZHW`7OKO_D6n%1bF>BTAgO| z9GCYynUw_&sJ9saKW^5bBPBpPXzcp#)How4@|EB^BzDALjG+Q5EfQBxfg*OF}j^_Jq>t6f{LOTGgGXU!zRS^Z2zfg z3+b|9)B!iSik1W^k?HwP@Z2zw9;;OQ|Nx9c7+3a?#tHpSK2yVHkCvP?15_5C7^>#rT6?#FqUBh&QQC$ z5Q=9yJN;qrb|y3S70e=rUaiQ?O`=A1Q(xTfyKT2GmCaZ6@`S!jWIdb06j1zZ(kxkb zpxsO(Ga8A*Zb1)Om8(A4@8T7MB72?n*$-ASa4WadsNSktfa&uWtC6sp(^{PbgDf;L zu0p&G4{s1u04y$0WCTlh;0_sIeqcm=efIq8%45_)=GSUYqO|8?e90eJnpW%C8~g3$qc z!6LraPJwLOp8K6Tcgg06)9%zj_|+FH?0sE%s6&qcO&$I#cslC4R)jinabCw8_uqQI zK%HP|Ob0$-4;2wP@IYJW_(u*Hlz~Tm`!H4=_PkHq6o~NJdv(A>-f(HeBY18->DB3C zvyQ*4k-qUfYjo!p@lN{O64z_D1^Ys<0K5D=S_noi|03P**7}6?7W?)*cGS-+<{IF| ze7AkI_@(#e@IW%1vEbIXNe#@mw#(eZ8^>AV^@0@9Y-@wjTbC@I&ojv5;dtnG=#}u0 zqa0A@35mr*Nn0Il$KNo`pfrl>oV4v zdI!eX2dh+^g|s!4;@RIQ`?aY=dfcyx2>OT*4tcTvM(k%QNN8=q0~sl@fOl} zf77q{dt==H?}@F}|0H`q%gg06yTK3K|Mk`QS+cwN3Yj ze-eo}JeGM;Om{i!rt<1I0O}R1SmH*oef<1*BF=p4CUM2aRl5M;Ty#Xd8ZlM)YZ9>Z z;p!~}Emve~Mu3|7ZKW|#o8~NykuLm+T(C_E$#!Y7jw)Z1M1zc`TQGSI6PgcHd-p&ZovLH?(i*BPrj`@9mWt z=`C$rbLeef%e4?`4)!Aqq@omt?F{EY?tL&Gt`_G#z7@e1<|56D)F6@Io)0|jQ#M1b z%gji0skDMbwAPP~ymb7#y!Q>91*r}lAN7qkqox*c` zqFL{lhAgp@9U{H8&A49;=(%|T%aLRw3Q4Gy)1lL^xGb|U)152FY>SzY*6<=R5T^Hj z^djMd1%*{kCAboD-w}n!N{3dgkI!@0-ud0EbJk={QtS6~-tW)Jh+f2S|%Kvp3{yjudr04R9pRNr`k1eNY@!y1q~}=Ao^w{=@d&fb&m-Rsz5RvHxA4w3ds)}X zk20tHM5PmWX-WOHQvJd`p8M7IXI5ac%5>$kr`XML02{DlIo;=JCu3k!CuIjO(e%XL zs7Lu%<`P&AybzJzY2Fl_eQj(F3nq$@w)w=(MJI8|;0v)e7%w`Nz*|w6UI*|Fgygn( z)sC)5G;w4_u$q%mmmk-I(@1Zh2fw<8g2<9Fd7QFw9m1HHYBCV7Kj1qGH_Fp)Jr~(B zHQ2F&Rc4z$nVv~#gx@)+qi$@pAe5BJWeh<8HNx86{?+;McsiJO`^PEy&nD-( z$e~ZtU8e%HaZTMVXN~4a1{Hkj-7V`lG#%OB8z)t$`^(tP)gB0DCzad{epKtS6DBjv zo#v8D#(8E7|L#R(tDQpJF2N1)Xv`5W%!1kQURn?SR1ez7RxhnjG4l3p)Isd#T-)@= zlI+^@xBf%GzPBZe6>BW8AH_v-!u8&Igj5zpdWm5?l^pr0)HVdJV>+&ww z`p|QR1FWN`u53mCBCq(tOkrKVCO9;9muW2Q9EflK>cEkLUB>it*%|ttU1O81{MHuxgJxDL%go zu+7~OVc>EQc$-fw9d0Ng*TArO^y%=9b>MBD+9$zHrU7u|9+RegV8#sSgZ}vdtKN_f z#T5!PY>ubE=&&7MER7Q3oH6?{-2;}3i#>MLGyk$~A(C$8`%?@kv0#peKAUFXI%7eH z@40w;5a*$fdv`v0jMv*G6?LxHOZr`iNRE)gB1}%gmRi%MkQA6;9q<1l zj`<@?10FWV0e^8XC~)ME6kY&2WKnhNH0DREkfch#N>&u}jC zetB*GDjskdz^WvM$8UyuyorrnA5(c^5J}EKmjgFH)in9o3#Hi1 zOIGPL)t|W2tV27XY)xkIJi6AQVl!<@vp9%pjhaeo%eH(w>z7=M;BZv_=|eOn z1sqUzn@B4tbIQVZ8wlhlzKuFIUmIPVWyV5+pY^b`$3zPgr;agRe@w;1(^mto9JU5>r-@XeNSkK;u zrd!v%kj5Ie({CtePs)7lYP6{mazj;M{W5srSfj#;UtS91Il!<9x^bqkM(G||T=A$p ze>NFR)u*=j($b@Cx6&V`}4jZ5LA zf49FAe*lAlKa#z;I1yJ?Oq^iMoDrwHr9zM_AcPnGQG~-m2>(i} zx9nk?XqAy2_21m@8)86`9);b}v(njyX$IE5&!aB6ZH~0>%dKAwDQamuOOv7iaUTTO8L5H50k&0<&lHtP$8yJwJ;n4QMwhOUu7q%Ux_8JYKqzRLPA9M??p zon5_bMHpwyuyf(r_akH1#~ob}^Kb8ljxnuEsO!i63%-u(r}j39Y>*!S%>%l+g$uKST;hhD2-utflEz39FKiO)b> z2v%Dzp|8+|Jflr)U|>p5$4sN?yVs3`f@yB5(ML^TyQtkW^V^E1KNdFq^$Bgaq(>#a zXn(fm0zV+BO{m3p0&YcyPYDez=R-N%Oyvqtsg)`-2W~T0dV6>^v!46tAGK?b#Cq+) z8cBVI87{G^`??QFzogWUPq|Y?I1F1=vinNQdkRwyI&A#D2z(Ur3d=L5<`v#1j&aP zBuSbg>no<8hkHF;+Hz|hz}}ghZZUveoaeSwqP3b$v3Fx`4gc7J)_#JsxLnq$4v#7% z1jJz=6rau;^2>E`9AUz3x;kERB!$f-?%p}AW-cS|dSq?u zqXEd~_cO)Cv2S$?g!+_5JC#O1bPNC~fwX$&7l{AQ#_C`oHH^RD{hQs!y0H(D0OQDS z?-2A9q=CliPie1Z$=v-Sr(7+RRf}bOP^!EKXo;@0(73*-H%Zl~HW^LZKCZUnz6bRg><4!l}rEENFU z;spw4tykTN*WscUfR1|psYQaSD=+4AFU72QZ1?qQ1_wsI-0)GJwu zp7W;N4*E~gL1(rA8x|h$UHb*T%)slv&6rWpj;jvedkvuqLt2=K-9tf&Q@KPv3-x>2 zMM9`bWklJx{Arl!1r10%zH?9G^ZD{?j z-3+RX-g4`+U8`~pQbz@_H3nUL_5TxZEa>KLWYBFcPyf*_&>zdN>9e+er+NZCJH5VP z@}b<*dv3Y&IUjj>u65p2cRQtQ^yeqe!4d<3bKKQj%$2Bf>=w!Ly?na|1B4okk+iPt z)fh@mfq-Hu={19={;|{+!i%L|jMS={k z0SGqAXZSRJPXDmII-SVa@;IfxeIl+Yn4z%R#hP=fgVr|9{lC-SpHzIpnY14v!{u!f(&^^Trr(~Zreu#*fiBckam3b)wB2c z*Aw%8&tT*?$2v@A5ibxdqC4*oqo@^QOX{qvd~P==5zs=o@~B8d$paS)yJ(yZqf}j@ zJ-6(_G~m0-TxpH#0w(rS710Pi(}Ov2a6YjSWtP7AR!t!c70tdnk zj*NXWkO{ba90fkIbBktk&&+-Dm?@$3=!pRv*@;b=k`*fTqh8B)OW!sbTryPoFCdLXqT^9dbnvegQV1S$4s|Z3>bKk4pv?>-OD9APlH->idxgsCKL7|eZ_;J{96jFd*2FpA8 zfZF|5+{d5byTWk3emoLn_64AR*%C;$V<2=bF{94t79LcpGYfLhpa?`N8sRzZoqhk= z+n%Bd!5r88vNO{aKn(e5Xp|-a!@7x#{OJM-aDUwit0%#kV7%?%&}ZdmOA)u%B6H4Q7X_mq7XL)=Hm`p^@QM0g3Ws}zWN(PENSHEef3p+5{w;q1knP~6?~LEw&2Gm?7MaYhRY zdLZOJ)eK~UIUeZsdJ=!lBEIQ4KT@IY*ZRuHMI(SsNWKx0;6NX4FUD-eA8l-{il02d zR}+!=mR0~Yq3lD{F7j8O&@4P$obSjE{G&SS0i^cJ=;l zo}Xl4`epMP?sbI?w=R+Q>o%l4>UZ8CPiq4%qRYcv9SSM*`bL&jU+dW2d(mUQP)!yt zQY~Rrp!7DQt%2I7C3K{#$KyzxxfS5C%n?9%Bd_(Q>%7#dqbTsn9`jDh~srK#JmJDqM=SxIl_M(~q!s4Tn^Ne>m zPXX%t_30%1kj(U&Cc5(L<)e0Z!HI*yLO@7CNB=uzU=!;z&N`o}{D+un=bQ|0ZJ`<* zhKFGttrY8Mu&Q89OiNhxQe|itr6rj3sv!5eHkplbf(R^9=MHNFNCTv+OaCaMAg_w; zC(rp$84nm?q3!!Bd-@JAVi<5E`DultqkPm|HFxCru&PX}!SxGZ#>kAp^BT=VXJ`p?g)llW3x@GTkK z2hQJw23nGo>)QHU7K|&U($#+{N9D48Ty!yf9WXn~BGkL1S}yMKdCj!haknQE01)|N z-u1r!$l07oy~^PTI`L~(`P92}0t=^n)b-YkNo&Dn3AcgOVRC8R+s?tcD@tR2{4ej+M{WDcdc&utM~CRH4*lxa8(lIJ{aZ19%>s%`Re(zSBa%oo@@ z+N4_0)HE8v0;E4*W5qp0LQux05qzP zK;>h?!rrOvT^VDq3wQdHhU8OC-P!-`+6+n?M(7At2VC)-i?|!lraUK;1uP&&8iPjB4NdxbuTI94HG z;ZOU^A`Fv+#q`*lzLTdR)f_aE=2Vp~I#Yz^8Zf(Y>?~DPMyvY#X)T=k2|(jU;+wPj zOvPf4kZ}LY;U%N~noj$Lz%-rjVT}d4>#TPXVvn8;;G8j{vktqePDiMC6IAdqT z-53oo|h0yHsvP8Bs=2YDOp6 z3;hEL27RNabfFoof_ygap~dt{sfMn*f4D6f$qz*TFL+Ns=`E-p>UTuZQKM%K?q3W? z#o5x}f*Fn#IA~#uU&OzRpjqiqRF@a&s7^U9#|(w3R*fFnRwR{(gyR})to@sV?Gzou zw<}4sQI78c@HA^h0E$;x1aFYDXmrq>Drlq~Zxs=Xbd#CbD6;>Y{c2dD=KwcX5dE!R zk1LK|T}}MC1h-x8Y?E6KtybozwN|s1UGxnxh=NJ!H?4{(cqNN%BiL6TCNdogpnGx! z>?Gd|Y2p#m9Kn&j`=}B{TPcMy<1_V%?tR4~MVD^jvoKZbWmAM(Lvwi^We6k146b)w zCXbOG#kxR7>9n?C9w8P9z4<_VXigvk30e~a+!Evw|2DXO1`V!fXS;4ea`W96wGgz@ zi+~RPQO&wkNihGzszO1YT^yAJarYbI6OX2+-h$Vd@!81w+fzRXA?APaoO}(j&M~JaUKoEa?kHd=$&UmNy zf0BvbM-dnHp7X9Y0hYX7;C|56|3ohv-tOP(uAuS}MO8t_@C&S3x~keB$+NNMb9KU< zaBmL4E;-GN!{U@D_reMVJK+7s`ODhbQq|_Sd0CI1IHDf9lQ^tzo!;=+^ckrw*cTFJ zc=PM&eW~D`L@K_3RTnCgK;&Yz4so1{w!QjF%(i-k{9$_utx!!}m;-#)!1Zc;>-poy zR@WtuPP#1az_C#1D|YCUji~x_3*VYDb^m z*;)0_X26_iXOx@$=s5celsk|rO3ULoGgye9;da5?FE6jXL-s=7zZtP}B%vmI<{oi# zsMi+hY?f?|pv5 z!*lOR^5v7zoqL$SX7#5exNYKVx6Vuh1jtj=Q{J60x{kMp?Nh;@y>@H`{~z|=I;svN zZ6Cb2yGw8n0fGjHpuyeU-66PJaF;-ECpbZZJHb7;1$TG2dr5as_ssNs)4RX^&e^kP z`2!N9>Qp`TNmp;(J`nmiKHn7E>@fStJZ*T=A8U6Z;&u=?|syof5GSC zZ>-Bs*&vCo zT`UWeFgy289K^FNKy}u`T<2KZ7jkVkj970L*-Nb0Vy7BJk$hwvdU2EJ5>$KvRi>2^kcw zSF@&k<&jO<|gYkUsC`lXDPHX^aSpIJgmpq2%yGtrrpmPfG_^b0x!e zRJepichTPtiM(@lFrt?Rfet`?ss8L4?OsF@&ph2&1HF%~Nh3y$OC)bAjw8?gbWL2H zM@s2Sv*Y@8#c+cx7$%mof2a;wUO?0()nMOqq3{j5dBq4y9gf^0MpgBL27LB{|NeKs z|HMV$(4yY+@IWsjwcYQ)^a9x5A*or9whtuPv2PoMBj(IjcPZ1aT95SL%G7LKBsTx0 z=b&eA3KYM(GMzp@T%nAPUO$YT^{&~JofNZ zf2kBt@8w{1!BFHBmo^!cY9}q#NWT(5oW#|Qe5%{Ptf&EKV1((tE}~CGN)X2dNpoY+sY=4JbW6)-FL8GFoR39BQ3R|I&v!(X^@0?PwWy*45m}CUpzFu92@IqK6#UJY562xZu{vx#_ ze=DZG&zSzf2mU9Gje)wy#JQJ2f~dyf3&v#ZRBTmRVx%4{Z$Pw@U?%v8liau}?H+BH zz>sEbdtp<+uKnNH!(SQYpYodQ$7pj@JDx~nCgOZ&xV_v2+vy!pLoyWY3wWB|qCy8t zaJz7uz;v#~IoBas8D{l1yy(QOnViipJns z&*Vi;Kdh64`7>mQt4_&FHiYseN9|ln4B}}#{nl{vztBvpa;cjH(JoG+pMEllB%o^z zJZU?1txq9JkAF2tA3w%6^EX~U^+ZnWeWj#2;6)a#0*LB=4 zZjEJBRNQIp8CRnszVlSlEV)p|@-3?Eq$Ns_R9Y8iAJ*(?2i@W9ak7%`Hm>Gwb=`6&qcdUXmP5rnwT z5n2!VDz7>7N@P#9a8i64+>zR>p8zAf|9s(Lam+T?_qewedwP_9a21jgn)6A_d*_7= z9M3i`ZneXNjuY&ZY5?v`<{@Mm(A%Y=eo|(<^sKsb<~7_(>(YB2Vp8D$tk9qFJ^5Ru z_Bq=m;SW;#N5%>J>{)7o2kEg{<={#vF1|j|JLs#l4UwEW{EEYs1o%Dj3lo>*$UMoo zU(>#59z`pCu1c)<*-!PqzzZT1pP=9}JOyJ1*ICz>3!mf_W`Zl+oC+rK(3yngd0qPQLQ#cHLN@pWP72Ps{-T>z}#9MD7)<>V!UN!N4u5)}RJ0i#*7D zG5n!|r$kuh{157B#|lL{Iv2R}0JNjlBz)J_hQ$K7+8D~Sh5%5cCS=y)RX z^CeN}r_-;p=%&xyRf7tiHBdF<1sql&cOGz!cqlIfOk4dMGDi-0ZXO~`f;Jhd8=u|W zNY~P+dc#L9+u0v%bFVYKgJu))!3OHfkt)70_Cd@%OCR~q6jluB!z`;}p!E)L<*QfE zlv(1@B(8SP!FlLlM(tvlIr1HQJe7>4D|)nUCZn+59|)g zVxF2h(uoyN1xyuNsd?&#cbffwCBfCzdh>X13?o6kg8+P5vw!LQeP{I9383LiMq=xM zq@Ls(kpG;sT0%~l4l0D+G_3oOH}177L61fK`KcpzMCjE`M3}1-OHgPg8dMrtqu<2| zW^duXkjb{&5w9!oFsDQ3HYI}&^V@Qb{mHbU;CFAcQHJH7c3OD%b4GBD`)qnwU@yYR zcprd7%kZk^n~ETYN}7OUdhwoWf~XX36-iYNMs~9y^^$au8Ui&EbZ7WqlG^{sMqxGM`M|B$ z`g+Vl^b$MyhDDNoi>r^0AW$^~z~O#x}K%cdfgOAd{_6;@j*f(kI5B?)mMzk*p+2P1P3TC51f)0Er8K4*`y z`JkI~Jv{oYq}rGOIW9nLB10HD@%iB$t+Ch%R1<~Km#{1oWP~5@+tzE+1J&uH`71^h z0@R@b%D0ua=n=>I4|)N(9n{0H+29vEB(#+tK}>l_GgpGnjsXU>2dpQ*V)`84^nb=g ziGxOP`dQid_nM`@F;VFDI7~3uz8Ld8;TTcG*%V1(lXdTFLr})zBt^^@u$HPd%>Nq& zg%iAtpaIS^VLep-o+1&9NS6dfrzD(t?AdP`1iC%y_atF_4@LpDwe^S+Jy9=2IHqfh z!}Z7O`~Y%)|JvT_6?@`*UbeI0B?UP_a7FN;n6DnB4uZPt55V?sl(|%aZj+QcWURqkx!~q&d=nNfI2O- z5bQ=mKnxpi=omd@(+Hqy>qBg_r$MdxE?G1IutBz7yvpIw@UKOjJHv5e!HwUs>2Ba;4`LrC-#y zltsdyrgZluYPdElIF5Dw`=7BgjeSJTBW2}41BLB?SX!a*J7YP3SJGJJJM*W{3&1vm z2Ui5S-Uu}w{FaW;~bzTlK+8u;t3lt)Rhf2)^t$qoyy$O zJ$Y)c5z=6#CDLerwVg&urkp;L8~Jey9YY|qg4R}OBT@gugdiKuJ{EgP!Eu*zabX$f zElVg?2})%QN8yJniFR7)>7IptWG)%2L=>h505p7C=q5#nM?SpeF1wkeeDp3&>!y^B zrEfp80fZ%c1(EV46|3EFCH;$~Z#Na)0f{lbAXGSidP!*5%kzl`D?i5gZ^L9is_wFDoG}^3;}|(FPQ$fgrOV9U5KJn9Ag!yYBIyCRA2TmyN^Cb_N%~C>E()%_1TED zl;^#NmOd>6RRe)<(&?Zq{dsAPKV3t-KJs@C-!9DZxFK)3>fG~sdI-Ai0yz0b>ks%4 zA~^vhHCiKiyq^k0^g@P4I5u-K0++%qW@|@wg9| zU@V+YH_28&tu*wvLuJT#_ofOTBm4ujpV6n!kuOt!@N|FPT7Sh7dmD9+g!6=m1W{cb z`~m=zzcX_o8T&$eyonsykZq$Rt}onWGb;x-zxSn>ZWn(v)>!E6RWt?D&R=_R{nu=u z`1MxwMU+xeq+7rdw@d>_V5hf4#ELA+jU;?_>LhMsi;1enLdHa*ogF-s zzmhdq5tp`djGx??luT>4)$HAp31L4RmCYFD=0TVCeEtEKZZ6K;)rN0}|6aJ!-Wj>UKJc{E+jNF^AvdO zZV-)9qsT;YnPDa`;dO0EZ-PM|V5C+ncw7JdVUZ)WbzW z8mv6XxrXaoG3I_NBR2OeV&k>vqE%&`{J?nEs2n;N@jT4`4$t&Q9^#L87Z4Aj@DHBJ z7tegA2}yyV!`IK9!K>2BJ6BFIs_knKSFwd&OH`I3^os5hjHOuYe|x3-&HvRQaPzpU zh1|rp6K(&Za>fBl`SFRm5!*L-p{hupqyxh92G4G|rpSJGCL_CHzuE}ehR}m1@Q8T% zgxImaVw*Div;l!J=}h7~&qOD@Z26VB@!9vm*XJBCI}d_$tY^uuUjtg!hd&ZTwVFo~ zQ6mTScg?qrj=$ZgtO?VZveI?YFoUGx?(Y*DH50Par}8#mDC`nBn)nQ*iB3bmGr^_d zY>br;?@d>7*SL3MpqvFLH4z|vy&RpyRPj>P!_ zNAJ{%DWAjceGnd{8Xm1ZW8U+Z5(AziQvW2PmGTzOAj;n#5m(d#=J8d61dZ$>Z+%`qlLU(1X7u?hY)Tmp$LejYuReX5slF*;Yc>Enk&{v2_y6^+vu_Z5|1f=;7IBwida6`yR{f1>{PzX>?~!RG!GySR;d)Xvm4 zSP3w(4KYE#ld1`=kH=TCx)9i_zIza&cPR4`9r2Ja)P$5NJkPh^G5>2R0)wtKs-QwN zz;|w2%Sc289-xQ3ml(yw{ajaLcV^F?bKY35hwLJL<*FGvRdt<}p>%*UViVkmfdB6# z6N&yTS|k@#(RA+2(8_$c($*+@Kec4^`@;?t|IlTMc)u+1j{|d+)v-)~u*>@Q05Kn2 zIX%5>Yn*PUvKgtE1N7D~0lz}uUhbchDOxdz&&hC;i+iqJ9 z=g4rRMN_3xSU=p!46*$MV=DH{pmjZv(+7a0d^W*gi|Zp$eoePL#7_pAKi>tsFsjMS zQc)p(7KfY^CL)HSCA~;8&a{!DgX7b2p!sOx{ic*rbOOTys#WiZWa?L0{{MNV|F82* z{eP>rb_b27^q;i#GtXp!;tIV(Ee58jJnWWaWxzogZ!(+Ev7mkAD55RS`kA-tmk6k& zZ`&mFEln z=#~XYu$6ezfDfa6A?>|_y==8c6w4m|kndYTwnV2%OE_VG1*rE{C%HI9Rv$y(t{*<-|+-cM}hL=i@Op{ zf;zG=SwC}Y2xXxC#hm#dkqjU4b@i>`e}tXpWE@CU;dC+g;T@$s!)Sha@u7WZs7wce z_R%9_710dG5R>*L0JGv+mPOSL_e@=XRw$Q92XFP&mB+36%VrW;+4~O($p>+aZx>xh zoRUyf{NFd;pD5fHrk2)S1koj&=gr9BDJx|+3j}{=a5pP5u}+ATNmEb#z(Q4DR>nn9 zs>Szjzgq;`Am9r??3Zc~0Fl3ZGtV^;(6Zjii^pc?qaZJ;#|iv2sv|9FroEBgr%_M+T=EN_=3{xn4VOg<&!j7)`(g@x zI$Vo;*S;v~e~!xUWU{<-Ok(P;Qp%|XK!tNw@O?X7kq88(?(uS?vS5MYnliZ!D5ZH} z3(BIb>6z*jB!dEUSDTf7*v%JL&WI_j;j$f#%ikDhzVSi%z;kRft1j9f*&I&mF{9_v z$c|Gc{%MWY`Mv9rTmDB4@)I38`vz;JSxfR_y9oSiv!Vy)(e!Sm-D$0j5fyR9IGYLh==9Udz$^O8ab_ydh@zPX5fcx4ECXtIe9SI zlV$D5*hkt2S#Uf1{3-OzajpQmM}7QDGgrn8=}K%L9~%zk;5Py&rwh*yUmQ#nP}4ez<(n~)<&Uk- z0&-u=<>N)ty-AJICn*(d7ry((H4TUkRjkXg@Sh_e4b=B@)M z0=QCBl=m1I#Oag~s6+u^ylPDWmBtGMdU(3>^6LEc-ssiWnDFwDlZ9^QXL&+-qAaXFqOdNng?yKFM;gszO5}DOVTVn*{Pu z`_b*b%_&y(mE4nGaQ*vzDW^YJ+JD0J+0x=Tt4JZSU#$X$-fACHAM+i9w6X){8X4}a zQ?CHhhU&<40d{Lsv8ob9h&}64`hU-q{w+msUiO1--@@SJLj6b?n3AaLcRY=O!AsyNnR&qE4{(rSs8SUtTQ#Nop{GCx+-S} zBkMXt7q-$G$d60lgzv-a>uu&i9Rna5-sRMw=GrRYtR`*zf*>UwOCfhycpl&bBH8!* zk%@vDi6ZrE0%Qg5sCu8@>;MZtB{=5>Y+w!uN|at{dhE9dqwYGi=dLHdoQ__!7!-l4 zQ|(Z#I}P*dzRc8kjDLo2LD5( z@&B{T%23c~n17Jm=YGV$#k#R(_qVPg0oG%{-^x=)pp`(5;Ld(BsVB>Ac_(C>YOE7z zcgc+;>l6r;{MY=armvHtN^TYBvA@JKCM~~t8>&hj?03z!XrmDXYzKKzk9x!R)8)Gi zBS&rL?Y?afUwJexo8>oK!iB>!uXREMcF$A!pbwq9aM#rdclJ zBQZtnn7Bf?tUZL(>>$vTC*xzj+V*O~zM+0)j^gM~aE=AHkh3h}XhO^boRz)_@hLE>1W~w0IPc4RufW({809(Un3&zGu`C9iP7oFn!XgD zObLd*oR|*&Rz7qq6rehFDm1(m^QeG#oJ33j)oSuT{}ahEwPA6~x@pTQ_=nj9PfrvF zDZhG`FON2>&b=@T2==Eo%}0j-`G{|)5h)%n@`&?HMzMU-bQ(#5)v~Cy1~}~aKIw<+ z$pRLu&|DD``V$wvxMED4Sf)Lq>u?Z$vB@I3S7{t3&b_f~8_2=tVp4IJAK>>7KS&j3 zj+L8-PKCGxySI@*-jw~wXBdm19)ENZdaBj*!0~eOTK*P<+sorb@uETTiT>bRq^RT@ z&D?i2s36Hjlljb;dAbivm0yp~ooG<}bPwB_)p1Up&6~n)R*n(c@)0hC9U(p+a>97q zz9&god3Zh#09eUQhH%2?-gCtkA^U>-zKx3G17S~)^}r5dAbuYBaba%_2X&Fo^u_ff z|-*Kw;bhDsx=##?BSRi{krcjGXMN8DF6-t1u>$4;${H= zBhdeU<_v(og5H=w_@V-ynHK@dJOFsSUPY&u-p@Yh+M)rOURfbiymvD5saq=XJa~5H zlN(;8;G{8AZ85R^G-2-P{cbxQ$Ld|kj!uN{Xkg3=;d*s^f0@SC{&$I9JALauE;QZTsDDlU%Mpg3K=THF9N__=_fkM+0??-zpuJ%^E zV1O{F7=p>}>^!YFRlw=F?@p>TaU$KEjnad**AqgK)HKA32=CFzdmA3iL1RB_RlEN% zw;JgCnE$d?@GL-tp_C=)C)Y2-Y82`-N#l`N8QJZ!H8$!I^U6*zcHmGyE1S0aqM?lt zMXf2M1W2dKST05*inpV#GzJ0R#N}Z3F8s1)i~lgM!k^9Sl}PEdAP-87yJl#`9@$gh z{Jy~Zk)#cXRON~$-+Vr~4!p(8Rkm}uvw=(qr;IUO=)82eXzU_f2+{c1%q;uMN?raq zBl7QO2}C9XoPJ#?=!pG1ODG9dV5kbmZn>xq?I2he^VSY4I5ThJ9tsInee60aG+&ZR zFA4Q=W`t>W>1FyQLa@>oFepx(>~&L0N?gBsNIZcj9IOVAheOBE{4)FhbdvvVpL=B` zgUlr`K?qMR&&TJHyGD3J;fMlRZ6_;;Ump~`?wuQg)TFMwXxm&iz(LftPQrFXme5+~ z>MleHtkehEj4@IKOnFf#{~ZC+4^nA zf0JI6_*1u{$CGg;B#@LnO#7FzX$7>Ulc20`2MAZc%%wU*TWo{h##4 zpUlfo%pNMY^mAUzz1#7(YlP|j87u>AWDOq)^Zl-%s=dM}$r?rQ#QSl<8zu1GjJ#}A zmBZa0JtrOe@ALgTx~AXe>@SOcPUjfUjE-vX(AwL57wI2D9Pn(B?jZV7!Nd{jrF@Q zTd>zTX|dsU(<)%}DCImQ3!KeDtzy=l=f(2>@N^pPRFo;s8E5{&1k(D*Nv(9AB_a92!AEJX@1J&}gg@&wBj?Tn}`Yf9?SdrvU)d zOG-Mz@g_9+t%qZOk78+y(D@hgrK`=Lt2QRqgdZzo+dKmS0D6bowk(A@yQTo-2yq}l z9~qn*{HCm$a~9{fPKUuS7hsLQzmRdxmW7|fh_-?7t@)SMd0o&q3tyPBXvJ;c1Z9(q zl8y+(AZEqp`AXPmUG92x8PxS}|5IPZ-$ssdfjWI|G0PaXK>kmC9RHRUga5A|8S&(w zJ7WIc8g#>nWO(m85d4;8$cPNF z*MJn!gbcOUkQCK~84cR-HCm+O^{~!-4adKIN{Vk>6uRvLd*SE#hgO+bS(KU_`Z^4E zB!CC88y2`z;lrfpa{p8Ss<{s1iREhD(Sbjnhf!GwndPe6c@f_m--U*nUZa;KUr+Lg zyA$GeL>(TA^y81-_Fl!xMke1I3g4y`ATPCKT4)^G_E9D8>$bm8TL&AW5buH|ARzhF z5?iN!5IQppu1pK8erLLX_8HrULY41K$VjO3!$IM62CNAO^s=x->G?-m88WHkP-Js+ zuDje2=*UAD+xL%%5~#1oC#Pu`vcCH7Ar$?efAMl_(;J<~IVb1feywlSwxHb*UnPFB zdG0#nM)fuRVYgxHk!kPUIBf$rIfHAWyrOCEeX6tV^5?j1^Bipm*;aCycsSGZ&0|Rs z=B8#rSlDVJbnDlgutGx=+MPkmD+Nnq0E6=+J$9}$2+4$r%hW;Lc(@FHIKQWgLB=(k z2kP+a3+$NveuebUqg??2*E^RGj83!v5oXFylcC%Z?LE@@I zqDB5d)Y8!~iO+lzoOCim-y_(^r0&R~KPj0m&f?|0do?Ix5%%&bsKnh@@3e9WUG{`IO%A`TqL1tNddCuvn!N01@yU>18`0 z1X%uUf89bOZ}k*va<97XvMN9hOh;Q8sWG`je=Zg06-Z6@E!~h2=R+P1q0oieyt@KNA@l%4*;AA1p;YFRBDS3%fA{i zO9}(2Nf5knxGCIFTj9U%6{&fo~LYNkn1=yrn&U;u3eF1c264O!(f>ovqk;Ps zi4)e8bBrvB8v=E|U|ax2z5j_S`M5T}NEX7XVNtXe+BS_eiPV}Aj(|30O~KPzmWWDI z`qnv|hRGKpAdG{`ZMlnRspk~;HoZge1b;9GVp;XFaq6)JHOkxTYv_3&C2p8Vr<9Ol z_cx~Y{)P52$RxSQapRK$_nR{3<=#JU81yor?Rf+Ce1n8=eYOdCGTt_;C(rOMWQ&Gpd5)jIng2gobM7y>+-Z@|>c zcbD&I{93QDtsbxZ;jKWvzGt_RKl4}XU`Y#K)dp^zb+QXQF*_N)LYVpQ~>~^nQwqU{Q zrvg(2H7my#5v|+3`g`Q(kKVo>fQO8S!R#uSPUWBzq8X?c@rvFX3t%ann=W?>i&ps# z)29xAMRfqiPb;0K%}hGyzrz`Yi*b;aC35bIB)&Xkl-{i;pi-9r(% zR0mdhy#5%I-mZ*5_h2!P();0UXUh|gBdg>|tG>IU*VK2uE)niN4^EK_MS?p5IThP< zQ3&BNL4uz*Zm(xB6j-g$h%qace0+jJwJSxJLku(4RUM!fM1Zmc6&vzq+OXi`H@-W5 z9#?q|y-KsP($Lqe2MQVq>2;4_)MuX>JmPI_p5PpRkYBO;(#Dg|NXp-~>G1ipIRfdh z`}oj?Vq?&K=&-@NOo-*sIp1pyL36&-7(^MdXML&Of>xX|WyCTxg-p4< z*u(^}#5?s0;$n~BI&gp~d<7t|#aPUp2jc31PJKoCBg4oT{S{Qhp2I|Y8i|MnPUM$b z^!hIdvF|Jt92PDhGZ%=1W3N`B4kGWH5~)oU5h*In52J2l(wx4E%7-#8476c5 zWN}k@oAoH2W``r!w1Q5&vAZh^)<1vpcAe5E{(NuquGUVD|F>WaMH?JK&h zS5HOX?JVqjt6$SjDz!8+5b(Wy3NPy|)p+~qz5V!rBj4-qv{~tV8NEG$VP&q^n~5AR zj9h)?L~wi!xesjsv-SCKvGPmVlCj)Sw36~N_`|!M@x{iVzLJ;)id-Z@EA14K?D-R6 zFy!V1%mLML5QgpwYUZ%u%8^i^tS(>leY|ne`M!YG$)5-rpkC)qZMd~Uk@%&3F)s{t ztM7~@q%}xtVDEzjKu9(od1%}&*$ZshSaxj^)L$zkQq|t{DV^BVAdk&KG0&ytYIVi| z=%Wz;R7k?|V%4TeWMI30-u_}OzZJ<%ViP@o2M7p*_7??Ilq>ZvW;qgc-L&1TKcKk~ z8P93zj5P3%ocH{!vvVo@SPn*OnKmMl8HTU6e<1p!Txf*aq= z*2!JJ&k#qkXy=EQmJz*Oy7_{+VlcnQ?CzW4g@7J|jXqgGsp{%M6$>xS{Q5AYCwl%^ch#-!JN0p!dPi_>yht%SlTckL6x(Bisorsa znkp}6Bgo7F|5q;eXIrLl~<~lRTUOwJ{>G4xSW}J@#5)_irkYMNqcvB zAEZ11Nd9*%Ru3x-n7`v}>Of!cdLbg{Us03b`R??_R zj$)@RUw#m>7atL1EJ%a9T8+CJ#{S$ppSC!V8UPKg28ZB4t3z`Xp{QY74zaH`4}sL{ zJihj-+PuHnFzAaoR`LR%I@!ubWog~%RdrcJZMkwia?IDrcj%GGJ1)T=Y{*bOQHCl8 zWHh~f!>fdAy7!E)(axBQACZ%3>6LfPT`y6L4ovX2wu37QG1a&0^;Wnl9d!GHu*<&- zHD4FFlwUrU2D)rMalY9DU%1BaRGib>pF*;O%XJT?lCr`VBEEF*mI5OZ2jokMkkR&fj-+a8JYn4k9$IR2M~B*QoQNi~y|l8-7~DVq=e4DOIY_KRI)zph z+D>+;F&b2=b>dC~ZgJ)rRgcZ3o{MnczHD#xS*K>us%-D&>Ad`=hE0);-5qX~R2Jn) zsj17o-42FYzzZa9-0+*MZYi?SoX@BjD5H14%pi=Bm_9Cxi zAa~mh>@cM>2x$yd@Flm^zn&A0u}Xm5@aj#e-fh7lwm8-YLD0E6xR@HEcx!9~`YEDx zBdJ#jH5fF$w;Z6pQQ%OCQvBj5f^9P>jM~&(ru71ShYvsbsY7CjNc$ojVeCEvKJBpc zdP;nfG$b87$G@AqbUf3&<+UZMoz!BM5R8w}ZSbYrwO6x{V@*sf!^JU4WakQ3Lzt-;-vD-Q1e`te%ci(9`ZX`2 z_fJWa=sujL?+aatt4k>Cw6I2gd<-W-C%+vlR(++zT;M&f(`T+hZNk5N3wgq43K5Uz zAhk$jgduv)yj5DF_~iE#0{i`IDY3X11OABwJ}$H({xkzTWCBQWwW^#u(v1f+Kk6!k`L5p4I9)`td1w61L<$DD;RMi-hOq3 zq`EB4z4YoO?_8c7ObJr2O+7IRvK$k^DBFBmlcl~hFp#wp{&K>nD7}YiRv6V$66bXz zfW3)S;AR=07nMCqz>#yhtUn6JYc3Seyy)Eh;d4c%;i@u%6S0+fK)2ZI(IY*ok_Izu zx`~W&in{m=-IGs>cTD-M8@S8WL6dCY=TOt}pH5X&8@Z@fz&7e4e8~)=bJLJBu*arg zv#I0R?`4Dh?G@TG*VGbjaq5jK@usJiAd|cYsY(}wTH%IiGtlb}@e^awA734?bcza1 z;cTsjn5-a7nJcrj_l_L=NPPh4==Oj`}A_od?RDbw<$qz779Tg<95x^Q!asxR9iT;uTLLj-9Mmhv)rq z$Cw%{ZU@s#k}08SbsW#Og_)8h9f{1_4h=^NWX4HH?prSQEqY-M#0u}LAxNo?6!k!Q zDz>TKFe+qw{*I?em2pm&6O?o?(q{Bt;q_a)3jVaZY$6(>bJvuVx21iZRE~k!huS%V zi;(rTbGfy*WBNA+NO3ut5}ds>Fku_%VhYhsNbtHqFUHo#sjT20e%V!o5O_{5DOS8q zHsw)jH>sV$D%e+~?k(HM5(RxmnlKGEz+2bZxqT}0yy7#KBBzX+5%_r)115996%mVR zAn}7~kUF>w(W6|gZUW&_60%oF{w}l}8CdF?z9}Y z2Lk>dDlUlXbJ(_W+%MWZOKQmD_=FrDrZ)Cr-y6)Wjdr8WZ$I)-N#vgL!|A19E*LmK z52PGo%AndM66H+Z(gRY<#5r45_u^fx3-g2dErivS#3mWV|P#`;aMwS?+)YRg2`lH2bG zapfxNFZ7Vo=TF9rER^nRa+E(vOz>E37#lG0<69kO(C*a+cdy^!nkH%*F;XSd@>-YD zp7laT;Q!b$a7avCeQY=BZ?oN!XqvjxGxg3qd1Gbp| zmBu5iQB9W!R0G)#GHLszcVKC|2n=V3m)3XBE6EHv$ukHBu9gAHTCXJ#Py;McVR3 z6p*Ei3LvEjjUNF^P|r><8p5$;($l0G^^jyT6Ag7!%zwDRlzzhFPL2@e(ipJcdnH!6 zSpZ$$zAzNal+GPNu^)lP)j&r~1pk1i{BFdS_@r&dL3pLfVt;FW(!T(W|K;s5*JHpi zn~7(K(7nU1mU+X$gU@d8D-5N0LXYiC6knKcm-9{2F)PDP?z}+`s1O}K$JKqth;22G zGcnQW;WvepIPwP@Z|i=Te`RWd(X>kfSM~WmV&jt6u%Z0eHWO-4ouD8ZyvT3kPGj26 zB!Gmpa}T#&EuPc$Sjk^l)!+5CUhjLqFhKFF1X{zDXy22oaAJ3tlH5LPy&21NXUvbJ z)C4CUB~gm<9$8#!CP4Q)^~aN*y3G4L_1wlc0QxFtXe?H92qIP*Sp@D0fg+4;->M19 zj`n(R%Th$4ebiVQ=UD|)I|<@i^;V@~X06TiLs&c9;ojbWECyS%{ni_Adpha<(K#dCuW@V zIrN_n((-St?B{53fUq22yB}nR&;c*MYv=IteeAzn_;IkdbiD@+A8l={G)9BY*JjVl zokN;10hY9HzpiGLj9sxs7A63gp3~pw)@PT&$J&Z!b<2rC1wg~S9x{3a<3B=pEGRMm zV#whck#eFXrrhrS`WRk6j>gE;;9wTkL;qwjh8a$MQ;;Emjb=$ep?W}*QIn>)>0$_; z1vGm#&IIQr_WGT37T>2+Sis9b^_h2K)8S7GvKm)qO|`o9YXJe^_5kRL$4vY$o1aQVvpW8KIE|Tj#`vA zXcA>cY||AhFi;Xm%RqZt!_yOcYG zAZj~Z@!Ou^*ThLejqL4H_wisVUOWv8FysJx&zBO*>qN|Z5`BDz11*gF}1*ZE)ROMU}?*VDZ z%g@+RC3v`=;#T`QbzqIjK5L?;TfIMcXBGxSmo<#e{jv(+R@7=ld-yp5;$7wDDl%Xl z**uDG>=ZeSq+=u=GteR)w7k}sDn4zy$FOoy28w)vnY17sq$5;08AoV98*R#7fGqMa zm#%`+|5!{t#z3X$Q>%Z(|0DM#HWAZB`Zwkx1?=(nGIg8f1!H@K*wp9olgj zae6UM$Qkv^2vu^3(v0TyhUFD^FdsQB;1ZNnf>oEwF(-Ag((T-Ayp!8n{lD8&CcIIqIimKk@Peb{+&_a4Uf}o5M$!FHkP9~zU!rA zZ*rq`cbK=e^rLsABj8ektTaRh9vEh*d6hGOD}ERdIpj0Pq6mA9J+C! zsr_U?FXhX@ISZk*SSwgPJz{_OqUd~^-=ghD1sgeNnLuz#l_Q+ZsF}!!1TT$Tc;n@> z2k|?^M0U!->OSP5X6{<`O2e1c3aaz3D?fAcBMa+r4^I^D7}*jp7C`5%xG$Q7iDFT$ z^A=;n6-;nz5!m~=kkW2(RyFl&6Aq>jzQO5Ql*=o8`FUKuKb!_;K&em^lgEo}&mSV+ z;Jh}e*P!R+{ZCy`OZXeE2;nrlGLEljO%r_!63Jnk)Y#B~JR#F0wOtS0U%y&XC^pO69>7l{W>+sMQCN6knSIQ;u75b9Qv7HS@ zFi_6LW7@!*ke)<))~Nf+d@M0V#57U51};8kuw8M4ht^YPs8H7c@h zOcou~;1k6HJeY>L)?4p4mvx`DsG-#s5k_<}1PA4pJ_Szjo4TWIIfqh~7_BaF(&ua} z2?_!(57%cRSeVaLU2|m%gv zYYN>p2CnaE7UOx7ZQUfISJ(*>*^CIcu7ou%63es442kZ%I_&hp0ta*oAs}TF?Z?pG z0esL;uskg3aC4aj_IZX$n}Vsgs!DI;Hs6?KV_FbySj;iOfOB{<_iFlbx>^xs+h?@7 z&XRPOO~3mPW0ICalCH#0F$Q}ii!b*Do^Pl-*7Ze_tNr!7h&bE3h|Z^)Z|5%bs*&%F zmkKwx?yh;V<+U71z27plQcqcMxV+U)L!@}O~H&x1r^t7ylbIcm+Ce~XC zbiTJ~D*y6r2y+aZd=~)!Rt#^W1--OVA@@?)Xf=cJb{z-u>3!<%r)g;$E;dHZ~?x31x^-ZzkoQ_aUMX#HPI zokNf)N|3JGwr$(CZQFg?wr$(CZQHg_+qT}hGZ8PQHnpflMn+{u7Qa7F3m}Ggu1JNU zyqgm%*WbV`L#d?zD`EsMFlqb8&MlcNGi@`Foufqm`pIA#(g)lDv^2Q(%Fx#F4>4yo z5(+e6OxMmn5O9x7B^|aM=X`!2y&L$)MGccrWYG`u4U5$D9ps*1naRb6)SF8qr;umQ zAvVZd*wOeAZ~ZZU-NJIj!_szx9}())Q>&Ga3_usZ9&-@Aj-i#GuQ3bIn;TBn!|6Qh zHsVg$D$x$~eWM$z4esYQeDokYxH@o}d!AjTB?H0T$9mHzFu&J6gQwl5+ZW64 z##q1p+P6-(wM4X?p{WJp_5s=EUzf{Ps?P85Z=gK3uc53P$>|DVi71k@kWE%qJ^()c z7Wrnj-G3-ciVVIbLH3z3y8#(@E%;s=lNvaI*u2KYnBp6lEA>Qnj)^q)t5~>7Pa4Sv zza)kRJEaPd@FK_U5XjqOqS+LElP6eLm%PI7zmVKW-DxQ|(IiYLl;sDA!HN1bNbBu}y$T7X5h9?wM?}@`c*M(Jk zg4zl~Z2~5P_D#wHNdg=!xAS&99-NJuP^BH|;4F6ICuO5hOe?1>V|I0kwtt4zERR$l zs`Am8GfUf}HC2yv&Gd#}Y3|B9Pr#>S*AIY6*FNV!WFo7GJiFisU-c}}gBxul`| z*P*}3nI_FaptO#qI%Bas<#E_YPfAoCWEA0|C$LMESlBsjMiCACK1y|l4y80Qh{9Tbzm|MPY zPFSMo{Q=k>c_LnCE0)B!g`&5^ErP}ifUsK$Lnf~`bv@*YluWKAkWAydiK`1!%eaPf zG7eg8zX=VuS}xL2=ww#^gf1`J)CJKtgP8wWBy6a5eVF`s+pEY+DlJI?WV^z=!>be$tei`*NOLlj( z^^L3HZGx*p3j)OASlU9hNWqF>hu%PA1~2IyohDWkHPv(^`d;L_FRyk2hJU@HkDjje zA*5xS!#n0cai(?uu>+RuNTWO0v6)em&UNao)Ss{sQO}y4Hb05DQCQ~EDDoZZEG!W> zJYZ-yU`+CLS%Hy}q)B@hNe1ef4p+a(Fnr&x$=O$|ZttZ%9>bQu8`)n|kXr>YJ~UK+ zhyA&Phs30dUsN{qVqXzk96)jSLO;Q+w2&Wc&#F?~KcnOI~3O52Q*`JMZMPuA%QYuyjz?jCeL#)Y5G^+rh!X%Q0*j=Rz zBRXn}IT^j^z9!!@k~;UU&$({>aCn1EJHT-*Uzdw}i`Zh-v0v4Eni4u>t$LFY4mE;> zh@xz!uTu3wg)Ie5_GS=^kM0$WkK3(Dno2aDdne z?zFE2-Dwvo42p+p<`q8jAud*Ye9=8%-3)@pzXos>J*|ouh9@;^S83=70e~mTQS9Zj z|J0~<0bPadLht$7%~D+jC*QbQn%#&)W*I5^S|{lQb{3hI0)q%YokAu9a$XO;;O7UD z1;$(?Q<|MpT-Mr}vbSt`*Rb@Xb^`R0_nN=Fzm-}p z01b{JcUgHcTgdvHdOb9Zrb)h{4&Jt+%y^F=*-0KDp|bd3m3CT%g0ug5=b5OxuJAGe z!zKb*^AQz4q3$TWi*`}Ll8$jETPNyCMtori@*wY_m>hwm_$?)cJ-ynxH2d+c$_lfL z1;O4yMF}hjRJl)8L7!pJ{!Mu&X^>PO0fN%z*&7_z>Dn2~Dxj3zb0X)592C^c(zJ2h z7>}UuWBGgLhb2n`*FD2cF{?nWP3r8EY%v_-L{YXA@<~X)_U*1M7vpae$ef&<6QR(4 za~NT$OduzjXp0oPk-H!0Qp@BK@#&kPZo1X+xbIaGnJ&K#3@!G;v&U06a0 zA_p90K@e0KX}U~>sGfQnR}PM>?-=odZOy{_0dcFFJg)|L7;{>j^UxhFR z%bhCSQ>k>AT~7*)iB(NB?F>Q|Fp}-D-T=(k0y0(>^_ltJoMCP28WTJ0(!N6@IisEa z?CX}mW&Zg*HS#QiGWkct6s_AoAH#_(B|X)!+}{-_Ug*uFD7c0!*i|vu`}qEzVmBeO z@7nnq_9*g2mM2s8jBMN>6=L^xP||mYf%;H0GN&C>+X++tOXQ^fYy+N;0)F;7w&|eJ zz89x5TH|_eql3UhdP{BtUs(3Q9$;Q>U{J-Dll#S^$n??3FuZ@%6i=s$xR?Ty`rEMfaqn zSv!}WQyCL9b;mT&cFH#~P?BScNljpsMsBi8l7_@m^-fx>3cXx!us?B}D)c12ZN?h} zMiVC83VIa=*;i7|OHd?2$iJo7lsBaOv*q+WwEldGuq{S?0(3Wkg$UA3Lz`2C;K?j>%d^-8}esSIR>(n=o$J40=6R9BxaHe#_kd&+!5c2{(K;5-4u$Zu5}C z+|bHs+wJR08vm-^sIhPWCAeeUMm$J~`Kqzqk_IR>HZjvW#v=xiouVHI5uUjPx7kDrZhOQB8>W&~< zqv5dWW6ey7nWr1CEz3`?wN!#o7wxJQudm{8vNSNsh`-Ye!kJwrCl|{zSF1|8L|}?Q z54R`MK49h?@A$RMm~x*`Fuk|Ilu`VfZ_3*Y@u|-W9);$aSJjX$OypV zaZC7Tm=_+QptZq1)rESOClco)IBl3RVbzI8mAGc_mjUW;Cd!KNpVVMh6;yYFJ}_p- zvX0q0*s9iO>qdaq{#x{-_;N~>K8MP=$Tpaun=xn|t2S)3fp zP5}KpL@Y$u)IjsPs2}(F=T0KcxfYUI3m7e=tjriu!=7WtB_`2k!Jc-0Y08(%8NT zGj=NM8LPHmG`=%D8A4vAPa}c1Ngf~(5ZDSf~*syU(dd#(e^&Nzo_FET| zQD^xj47n2=Lg>Fnc+?81TT`l$1^n|}qmN3hVdTJ)gi{VKZp3hAYYaggFI$ zaeQggXqLiMXF^KN>JS@RhhVjJ+aN_3SLs4zx&vq8F~?g|5~)ipGYiLt)D zoj~i})EDsj0qe9)HHq_d{I7h?7xhZK3=P9~0Cc9drYIQBgw!%KHjC&Y`_a)Z^$mx| zGzizIohPwN(4cFUI1dBjT_bUq$RlG`@nLMS0#EVhR$uR%-ex4|`nUG^-MV}7+stZ#xQXDvPTh(~8BAfq2RZpY5^RBxQ_uymA zA3=J4b5qnB2*w>vO6w;N(bHitm%jv_``lSXfFrP5+Y_5siuPc^q(rIrFw10P+$Xfm z1fX1wnjec*wQ3Yg9&hU+;G65S*ET(V9%Hj8DH55bK2(_t;IcY+Aq?8m>IGB%e26l! zVj|)n%=b~(Qc3{yyMYga980*vPoW8;&F|>uB)Xy4!z3WE2KM#>Dolm^(QYa%W34X_mY=Fiq>_>%T3dP$X z;{;i6fHf7lzCP4i!|^(H$oF#JZ)4_U7}0AqQGio1&8JLa zAu@3~pxaUW3&}+|Y0f3>lrX)ey;Yqa^}B>|`82}EDK*2d3e|iX`V}8PJ2MRW+uFTd zF4LQM=neo_O;?nSu6|htV~FK5OmyvmDB^HSljCGhr!;$GsbJsRB!MS9OgkkNwg zxF$wUbF(c*bOoSLGCwTjPU;OWAyT+<`)c?>ok>-Jj=Zg1qrH_lRIY%jU)Zb`{YBud z_=4r8ZRj)mNz~}lro$SS$MKAKxroXGF{HLP#c)ic3N^RQ>xRrt+JaX=#D5Bt+)EC) zyvZm3afVt>hV?x~lDXw{V}mzI2d48ou1mLw7&%L|&O@ZxiZXN8sZ8(5x&mZ+Y3*>e zFqL*PgdQTLjohWc3|6~+L`@dOU*e<^AiWEOLh1SYZ?1IdR6h-YXCKwu;QxL~EIIe0 zdPbPi>Ty-3mB@>l(Zsc8igHJE}%*B;TtjQ;ed*TgVg-Z%Xmg$sjntrD#5?hrp#nGR`jq43iEMYVhZx$|O@8 z7iUYGAMc+$4N05|_J35O6DuV%!q5ergTuOFSvi1pz>)2$EiYC6splN!c>Y+y8h@4H z)*5{ZqBk*sl=ym_%?P({`4$`6{@Sv3T@&N!k)KeW7zx@*vo3Xy0@x`ZuO;V~p}VK~ zS@UBoR=ty%PxbgJFz?w7oWt+f5u{0itn5$MTJ1nAi7sYx75{5)drhlxo>TW{|G|bz zp-!+~7O4Lz$+6iL$obWDn`;&1;d&BNEZB+M)Aiwb2*FQ5lIDz#vo5k$*FGs zdl$D$%3$r;hKv!>^2apWrE!LGm4fV|S{%VXiDY`vY8_JpcquZghxQk1_bnAyon#XvtwI1#Be9uTv>4;&rrk!MJJF@(NSB4SQ%n!eu zLp7%fh#V550D2^{18+~2A@cG` z^&Tv6-t&2r$9UvUOGpUJLS0Hxp?$aeXB7ZJtz$huhXsdvkBgHUNW6(CGA!M{oeZkC0h-+rwckwzlb|m?@vDyJJ)IR z1#h)9jGV#|m%mHnJl1*(a7X&N)dZ$k5fMzVqLTO#{)P0PEbO9Z(!M24f8d2q zCNhjK9Tts%6##OWU-2$Ut?>-1il#YMoD-RM%gJAAnX_TN7qffZOM%O@cvMtAy)nrM zpnhDGm53;-*D4{d$u%;_9L_h#@=TQdCRHwPMJyI$=p%Lgs2QF#wgc^}gr29^sM2t85_v8qDPujhy}6eR9tG{+ag zI;M|MmwBx7R z7gGq$o`||SUxUlUuRn@yk7qLoQ)wM@$Jx!VuRH5Ryg$#^gY}_o|G3LGSkKVt+=n(m z_6!s#+`1i~oX+d+y1{?rxZyjq)AUvf6Ddw;nC8n7H6Ts68?FQ;MoeF+}(WTHk%A1~Wy&2`JorC_Uk6?OrYF@jJp`TcCQF18pR z*D~MlYp75>un0!)1iJf(sK`$v@8-|Z{%u2n4M+}2?TF^kntrc?J4bhN1XbE+19*r} zT_5eX&p$~(Bx3ekO)B3?(NMgOgZzE#NW2E>KrzN3 z$mMhWV8d?WgjBF&-7J~RebC}!4AETqdm36+Njj4fSO|0pNU-$%4KA-5f-FaOMDn*X zofu$A03y~uX`Ne)GSMrnirb_n$M2ZS6k)U{OE-@fxLQboW1ykIjt#% zcoqTT22Pf(McmlYFYSk-IrZMY)Z_q_mN{i~UK&tTW_r31EdN~04_}*aR=0t){zs`@ zyIo%hCRvN8dEX%y#iQVE1BEi(L0YT)#g0(9ibMS}IT9W^=BOH@tfE#h+Gn`;7$8*W z_A<={DApS@YRJ{eNw7}P-0^k4bXa4tIe}`<1&D_H3ILSK!C^0xmuO7kCRoF^i=ynp zxH?1+F9UyzYp&Y%0d@8;q|LKc8@$^*c~h)wthb!kQ%}EsSl;FqNV{-IzRB=gBys%URuQ0exE?Qce zBYKl*;4DRdX!_NSPnnrUBbcGCD67KP{d7zyIgvN&)`Q4uKKmMZ&VdsIJ*ec?2$RYtL!2kbRgC!_&{pJ4Rii3GKYYaUa_vsp^l;859|x>)-N>14gGZDXATdGSmTNkj)Oq zCHY#d&q?Q!*+VvcVP;~Gf4>l6!$fhdRpz;(MHSUPL3v*Qd!6sGIKD-3r>)y;4S6U))h??J<8 z5^%APe(wS1(Tt*HEjs^HrE&{MQ-OOO0^9B^G72R(28{UCLE$a5H#E5ZZSjDU-*=sN zAvAYhrX>jnF+C~L2E3e8CE}0D2*V61p5$8QH8^!}nL?Fex-eNs+Gg;xJ%x?45#q-4^7RkjXWPF){!D+Lr%pHK@RDy(6Hd>68cXTmn5!t< zbckr=Y1GY;3zi7(h^+$@CR_|C3P|XOkq>M6S}QyX*{MceT$RDu5gsNV(34E57I@Ed zCN<#sXmq`W=Y{)Ni2JJC?>XJ2^3}@r032E9^0iS29Id}zWn51~;_SJlzITJ`39d|Y zsI8-?L!uP4#1JvPW5_heBMD#$aSikugu3#%tt?4^?YTTs?cgd?jY;y(^HSMS_W0g8 zpfghoG#@`~@~t?RsaWd@A~k04^~M^^1 z{4Kw!WC=**4CkTwozoKYuLJJ1UI}b{&pOPE&{RmH$cUE%iJwsA2sg!A2y_iDgoXsI z0l=NTj?kHP4e`HYcHt|zq}vTnKaLj4Hmt}-r0&Wh7ZO*+_?^Ec2t~}uuLq7VlthPw zr7~C0;TpYC=QOY6Dc`IP5|fEb%wB)yN%cCT%@R+hmPsHDbm2+S8zI=zk%CG`%ha3> zox$eG0)DDE+A=!(V+29j zsJD9cVjvz&_``m(E?*emJor1%R4u1{erpK8FSpeYAxOi%VW?Rh5cS>}f1(7|3C#(M(Oe@X|c6 z+wv3wus!+S<@3W5UifLM1~lk1j#}+#UL9o*W!>7RCYaep7`baajXOjfyW~D?2VY)U zlNcC;b0);0_rf>PIhm+J#kgz0Bh^H4%Z88v5kqJhwnYZ)X$pB9f=;La4FUwT6Y)^G z#B~FPf}1r4pglDaBWlL|E09_I1y5V`A{PnQlDd=wu)o4al2b)Wi3D+w=3_p{*c~03 zr_g}3RO0AX2P%g29GScf9W<;pxsMwk8uw>EZtT$@n?a%O!nJ3r{a+*N`3zP6vz~wi_Bnqsg5G zFB2-S5$Fa8=a^x)_MR5P;>AxkxozNy!d?`#^Q=JJ_puw$vrpcq=zj8TJk?nbhJIEJ zUqj!zXC}!BiO!|uP~rw#k+_ncbZ#sxizd#CIUa{fZk~p_T!# z!EZEvByEO5;%4{XA?Pu9c=mrrAl%_i>(AjZ<&qzzcr+>Sf2dy;nxuZ#%*oCw)3@-Y z%)&#R%8Lq$%osjraN&yjPhsN;-L#a%^AOr}Xu=u0vbZO>^YWQq#{o#jC1oytt)P)} z;_YSNbonu#v5RB#GR!gNGTq^|2tCMhIoz?&b1!pjaO~Qy>=MGWiC59m6LW93-bCX* zsM7bpjCWKh;ZU%*!`LDaib=0p$9}4xPOw|V<7m4F1k67%+fgEw=0-XLr*9FF!iza7RD*N`ple0;ab9!jTZVEV5)_i_;LD2E@U;@1R zrCQLQ*2)BSLL_JN%tXCM^4J99%`^)!pw8?rlZ6KkBRohGYT)3tSG|kZccH->E{LdW zNx)p8S?06p{uB~1#IlmU+HaC(c6hkzk!?N;r&GMkfNtkKUwQZPGWaaMy^BS4>q-<|UnC<_$kt zia57Ll@n^m&V!fg6hgN{Ye~!;0+3g{;%ei%=k2pYo!G`t%GZ!dk5Pm;(v46hl z#elX(P(cW{0LnwIDC6rc%RvUR$Sy|^HDK8McGP;YYae_8LP*k+M;=7BcRah(uHq_( zkMZ-~&4NglRHSn=3dPpcjjx*JSI6Z6 zRW%PJj5&-?e3B7#;?XFW%xF;PWu<>=K*aHmSZXZjjmWh&iL!}nVm=Qt34DA&H6hIn8HC@EM)+dF4ozd zoMixT{a5>>sD<%?-y94)Gi6Q+EVp!xqSRVs!}d|`ckSO}rGE`ya@{?y?%P%RMfLny z#rvg?SlmN*^*Dz~?w6MQ4=6o0}#IJUFjTq!Un52yc#*XEAyrj-hLbMMdB_dkm29BSEEI&vI#Vys+8j*}0C zvkU967#ix^6sS=K?569YEh!}_;9edqy&y#@|b4a$>ZvK4g@jbW1Cdv6?uSEdJ9)vk>e9b&%?7Th>E{m*IehPs!jQ*orcPOo^zzyN~x`5KOW}QwVHwBAgZO%3WM2H1`1lP-ViFI3R zidS=^E-XqrvgIXoMAOSHqCp}$A7G%(r@Z$@pnKD)BQEUQce}WI3`OBjl0wIXFSDI0TyvSr zaQqYwIPBc(bPVq<7z1pbhR}6IKF};B-f1V?@#1ku+;)ihBHmx@DdrT_lt~+N&)zoZ z{-JUovQ*|PoGlsT4jR<96dBcIEO~Dr>CO$-Uz(Uwu4roAt5z{6dd-YEJOkMJ={eXr?+JLiYJrR0VRC1!^dVxWFfb zu1q%lWBfj?vwTmv2ECMS(JFxC1&D=IijyRptH-0>B=q%N&KhrDGbu%GcqzvIEGvpB z#}fPmXP@_Nnaetk%wU#T4UYN`@qKnU11W!4rPWSeq#h+;m$ zJ5iW)otPQI<5nS=UI4QT6~)Vr8qi@SR8TmJ4zibQTUMYS#>fd}4WS1kJ{vR8Yxti> zX3O4Np7@?_kWJfi!B$gObBAd%T)HWh(>d}d zN?m-{koq|qRctD{+i-mx%;KmLN={7jkkMF{H@k+3$0S4~q$NY~$$z_Ejz0xd=i*`j zze+J@cG!7DqGGmECO|C77u?Wd=n($+9w7dLGe@>z9FT6^xFzW;(c<-4m4=yO)Xx;> zM#7?ZVYW|Mf?LM!Ac%zhAs#wgU`A5(Z)&aUiLTj3?g~ge_KrOCv#2`ul_3+!RN$*a zsxgglx7w%b0q)31<#U0HfxfN|3&jOGnV}XCMF}6PtL&)u!fvXv0xzdct%cqK(t}bU zj>eT97S=S~+iajtUT(;rE=8B&nS&) zy#fFpwm)-#Ktabr4H`J>FkjdO0Kg)@PXqVvRb2)SA`vX%C`$1M{QJt;G2O^PewNNQ z;(99cfVwvBro4K6NPOwkN#k5glD+|Ome+g&>E9Lf~pyWO_0{ceeohwT&RS_Gz z5cAhaHb;z)_aKE?;%f;WApZ(e(sI5+ty-ghPfK&ducGNE30RiI!Z7%_bU||QQ{uJb z36qw&?K}ZTMyH{s#>rek-U(0^{StAmzKIV#!%wnQj`3UQY&{viGiw#qA{|r$jIk8pRsJMBe80EbWu$24y@(`Rn(;3EIz^oW3{Kg z2^!9!oLx75hj=LujDZ6nxjzTxDq6Awpx_G2rpT24wxeGd{ghG64BEt;v?u5b71P7M zQ*K%7@y`XHd(MI#czG9+y2B zfV-1@3Zi%{W#ae@0tCX+#+WN{frH;p) zHcRs8Z4Soi*ekKc$#3LCwXrada2e3|lG|R;&$TdXWlrn>i6iSH6RI?2Kq6(s6*!P4 zq>j&>HjS|mlQEohENiJZz8w2|5d>J2>-`b{`rp@Xap<)^p6@?A{)rcUiKeK*7bH6(|1Cg zgcd$-n}A)k4R}pqa^Oqp2*wXdpY~gy=V$L_?3Y*a?&R*P`zNh$tO)<1tJUw)S;Euo z=XUY*V(t62bZNEehfD@Oy|2mB?;kx7f6uSQ_pe{vQ{IDLt{><3+^hbV-MHNp{>5+3 zgWY*w@9)Vk;RXLgTxVX(&-qW-ulnm=W?$WJ&#(B~)>+@k?Tz2$kK9+_kKH%+_gcCB z{_pa&%nJYF@4>I#74)_GYTv z!-%RUUyPRzBTZL1b}8^jALAo60^Q3rF;w*OSz%^&jrt21CZ^SB5lnqy^ta6ZawEYc zhhlEXL*OL|z=-KAud7Q^0-zvLiaV%o|CzsID_4$v_x1jd+gKj0SG&@n2G`p{mTOS= z5WJXKC|y5=*Xef*T3JjRSBMW!)8@BOdW-##Z8>`jD=Ho%>0}-GB76l3vi5!Kl5_=7 zj6<`-_gYWpYL?i%R8IH~Z)^WeB~i5diy8{DdN#2$AWC_a>#K`^NV?>SG#0JYY|ibM zu-@y*P?Ou5=H-3j+4?Sx&-Nd7RlWG+h8e5^x}2S_*py-KqL6jlz2{IhhKl1M(#oF`AOyNTdZ@jYmnC@(huQMg zg5TFqpFW`2rhNsnkmX(ebi}gX=oOwH-YFF0X6@f1XVfZuU(xtf~!PBWuJIDYNJq+)?R&>a2FRCGW_T_icMK6BR zo>qZhK;m=oH%NR5E)Ef7bS~&M93%~$x&%q@5e(_{)SZ~E* zS|q;*3sl=|gOl?diH+{;rQMLv#4)U?pg%jMrzU;XkK9S--WiTtt$~7kBtwMvjK^!g z0f$-Fo-F^!y>qR!GbUj?M8|*BpspCZn6prjzw~a76I+T@@~>HPU}vJD1WY(51avuwHps zS#8%JNfB+TK?w0@<*1NhJ1ZZ21enX>aqZ#n`pPTX(VSmj)0M88F!}xF#rinHkCz-( z<@7rrs(`^*B_;Tm%=nE?#381Gufw8Rc<1D)nw_!J!ajw{aE=a<;UEWhvKX5LOmp>U z6-;F5$S~$t(><2_Ekh-84U1d&0*3xGR}dFIaRjdBsQ1B?RJHgX*U_HqD7jmRN6|20 z04Z97fx6Phr)*p>IBDN6Iqej>qw2wzVB+{MO_xF~$f+756|N~IwzdCc6Qb2(*sQ20 z{qNlH_e*>T0TOT>*!Y_*!;?)Hf2KJ5MqP4$qbc^RUdyOWhfJ1d>gAC)kJ`@{2P;va z@lmIu^7}JM;YuBI@Rpt$N^|Hcm8*w5_C2-5mbSGb;Oq;Z6ICEB69SmZns%9m2LE6i zgkp6Hj6{2jlEldc);?I9;QqS5swQbO!s!)P4f$voAB1vkHx|U<*u#x#qm~wSE#klHe3eXGui^+d}-(v7a(*;SA zX}j9^37ZX~a}3Qw%`k2{t)Zjjn*fy)!3m-D{|>oe9P(b= zRNKZ^BMzx~_fld+B8j>3AMy1LF^uxrnpoSC2fh=X<45#Zr8 zN|?V3^irVb+}s9IrzE#8v|(21H{QDTFcA2BYX6pKzTh1%g% z&LorZ(UYSwRmXY5dXK@dcY62=P~J#D#-oErX*J68%3Zu}Bu6NK)I zAIWVTKXFfl&-G!Aef;~Ry4is>P>)>X@rq>Ofy8A@ z>VO!tSOVh!4^EFv>*AY63L;`Df^w4i7LzOr)RCi|etXuL0E10IXj@axx+_g{e=H;C zuz^+G1x9&@Y-qp|LNz0G87~SO+BK&X5sPBnh1>`&j=*egtB6%U3X(Uj=mv4WXY&&WgXU!p$vd6p2UEP|Yc4>~d0p%^TNGejrbM5etbKO{ks)q7sQ^OhA$EeysAOLG%w9)}QZnb2_d{%ALnryD2XcCtnh z{lAI+uXfsTKY_{kq8t$n++wwiOf^I zc9nPjc77>KMAqdP%&$F4Ld&+N^Oc8pQC(VfZ+@Et%Bmdh@NXBVnY~yaGWa;xJg>gy z1{>g<*cy6-n%ku`Ix3n=gMgi;vad*#3k_hhA`gMw_r{0dnx1%m#^d;!mbZ1*ae&I9 zz=(eWA`hV>hi^$wxoJ00Vo;xXbGNMZjpV|mQtyP^&Z&NFABDsx7^S%xmQyc-5e!l~ zT{Xdb4Cr;Qz&U2SERLtbr58xAOutZuvmL=!FD)M-jF#7tx%WU!=h07*t>nd!dzZxk z3@Yd5$-q@+RMo^{&hHdO7D2M3Zr+tOhXickhEa2@r4B;9sW0 z>mp^z?)WQo+moV1+D~iibU`dFj&<*E_XOuQat%IZkF!F3Jo^U`UR-V4WTP?&!_RFS zpSzR?8Tdi6CfpuxDxra-BZDp@jmW`9DGLHs{_u{gp4ZjAl2IIpPy{{2xK~zU-Q2(o z{|}NtZNKrUtA-nORpz3rYda)ZFmT~X5-+8#wn^{sk>$14YIp}*=oKC^1{JG-Qv_3S z`Eq6oBa^*n>y4|{yEKxMe@i|Dsl!ph%p{iH-+Amr2Fk!qBFJ4b50d*;CS=WVfosO0 z*y5F3$?&zYsEvK@#Av1-MJ8a{Vdo0$No`#tlx4MtRVpE~dgPC!AK)Z?#*u%}j)2La z%uu%ug}X)f!bx$UG!|A3qUyh+_%=C*85O>J;050y)X9%24n3fy z9{h!6Z!0b8GrM1nCEo-M*z7gHc2cidh(EUfXM|p$U7Bgtz@5A+v?-{p=P~%)uc&Fg z8km>E8`WXtwPq1X>5ItX+ox@vGhwK8aUSrNsL3ly!MDz+CWiE}H(@Cd&pGHu<9mh| zI?cEJlw0Q5dRQItJTP6oRx?Lm&=r4CfFqg!!kK0-XT6=Bn7X76VG4+z5A=|a`3_|_ zQ~ce~<2Ey_f))SDP7*!3Nj{yJYmnbZrgu^ZdNDf=tALU8gZu_K0ILED~T&`OF|I2l5Ff?A+Pu6+TIOo1> z@J)w*Z_@-3#AA)_%x;k5g8l>EiR=f4owNaG@gZCOOo8^^s>$)$Jh&jL?5R6=m_r9- zVUTWoNUcj;`^yL4e!j-L;v|_nWtRhGL>acmX7hE=2f%g4AxHyrh$C;gIGkHh1C7x2 zFh^VswGRg5ZyD2r_iqdzR`E(X3HNYE82RY{b{`BeMObJgs8bfM7;QI>+Cc?ROwITM zo;y@blmvlSC`pc$b@&1Nq!MGKxx;jqI3dH|S+UkJVyBQDa0+Iv3gwMr48<8N;AAos zBERRES>;Fo(bV>BR--3>7N_2a5@kv7*vYQt9Xe3#zy>~2uE|4CAYXtVm;ED~>0B-~vfOW##0KSMttA-nRAgc0xApZd* zXi!byP^342M8reQS=a+@S+@bQ^@OU0a|=2K^l$P(1Ah>eZL5YGb+%r4K9GNa+)=+c zZPizk$pl}q*y?P7ADJTE(wQDaPGZc|MmL zbyej0J}Q}X34}}Met@au2T>(+a18XKXQk9S$}q!N8jr2u3Gw%g7YDeSi^_iTY=166 z2Ks@O&!F3?uP3LOj|?FH0VC+p0092}rF;`k95OJnaEMd|SDArjF&FohB~Q_n#yV4< zWj(pMR`!Ia(g~R)6((INfR*c9Xpc@_+@fjYhKg@-g2l;F=;dL(6Z+v+000Gkw9|w_ zpf6H-$oH!N#>mU!*v{zh&ZQfi(Q0HhSZEG=iJ{lHx45^sx4E1UXk)AnXX|cm-@D~8 zoMi{~ghfV`u#wLFXXk4|1&oeL6=W8Oo5r&Sg-M@eJ`P;$>t}7rE48+8smBt3IG2G# zkGo$t{Zb*8_Xu^v9rQXjQyKN9&swk(E;W!>Prme7AnCkzbgobnV{k^Xsf?t}mrRqw z#9NlRPb2W_#;@eLPE#84Te!pqieIY-kR7ld%5aHp;{y%laj=B_AmBAZ9J4)2(j~ZV zZLp+P*~1H<g%&klObNj6?MqV6PY~~}EBiywT7{rO@y*`xT zfUd_!K?WH4I#Y|{Dt2W8cP-8yFsLN0V@L9VRYys>rXBDvj}OXqB2Xfpm+0lLZat~E zJs}7@L4RL-qAu8!o!O5{!0Lg3B?iAXWHJ@YYR9hzxPxPztyco!3 z2W&FeG8huBhHr2pp4oF$rC1$~@hCTO2IM5iMXz#Yjy>S3c75tQA0DCWw^bv@nmMao5WW|ku1qCB~IKydmFbo|se z7cj=>3b3(zCa8iSWh;9t1g#$rZlf609L3MH@9Guw)Y8K%A3_*fy*)RBa<2(h$YQ5 zNx(dIXe>fSBh{EerD9?tKl6ybIhhdDuo%KbDx>X;dV)+k&(xb^6r;ZWs^yCN$077= zrpae8ZK4$Nh{=Z#zF)ey^~|^2#-V7&={0uc-gfWoNVaXtO zK5R8@zpJRpo8(TnL8mqm99M5xO7H|UTARvhp0$bD6uQmsx0T}-q(+PqgqJ@q#mci< z03x`-Okpj0HyEude!t!dn0`rV5svogmB$0YgAB^3#bdZcD>1)x+^WRTVtw2(Qpfna zrVKQ`Y?C}LJT=Nh(B2S;*>?A-yQ5|%*Bt2|_vId&39ASVAmX7m&`;d5UY9Ord0PfCnt zgflLEE_}>69W`iq`<3MlHNi4sryBlud~<^}&ox+@eJv$m32Xa~VT1Xa`d!??OiVZi z;#oPQ$Y2XjfLenI;p%CJS_H4+)HiQ`TC7fH>yK_6zM1t@C_$?uHprKok~%v}P^gIf zbripPk0fr<6g4X&vAs*fN$N+s0=e{^Nz^ePSc*1s<&0J@&X#3&L(vZ4cGHljEa%U^ zNf9qhWra4^0)nf&%<%SP2=V>DrUv~ZuYeoAGEt2*@AW~J%EZL@k0k$5EBn5Znh z7DzC>xvzb0{1R2e^!Sw{_TF-3Yp+9-1LZ2Ab{LxN&d}j{OIJV-;N6hs*Kuz!EHYeK z;ucow?~d9{bff$%cg?LD&j7QM^SwZrD9p|DNvKNUC|RqRim6XKAWz*eWVInaNpNsT z+^}gTZ+IhPm*r+63=1-~)MA)-HFT!@s^PJ!<+?jfvfmr|%joWFzAwq14gce~a`AW^ zMUEgwe?I4N^*CQHNY@&a-Nhg8L!&nVM=`tNiDaD(Fo{8r_lOOaMlSi71+6nZtd!cJ z605B41sg~pndV|4*68$f8PjOLd}Lf5UECP5#OC`x%xM6l5a{XlG&mx3(t+~tV2_4% z%hxh_xEd%*D8M0{EY{LQ#$jnF`oD6K`Bxp%((w4iS^IX^iod$G$xul%W)bP*ToQK# zc4-}B!>g#33+0Z!#lMWQ9UE9QiKg#5QGpf@Ih_v_eM==Y;EKY*mdNVd$*MOoKvS&0 zsmsWESf!-jG;r7IqiEMlpdD&_YEatIIhvrPK+Uw#O>1-4UV=hvol?p@HDSEbLivjh zU*z;yzi5$&9BxnaJw?wcGiiA(+mBKnPQ zmG6TnFUW6+l0czj7E1&X!ubW63K=h2@>M~Es&{NEkRXf>6{GO4*?Z3a2^J?Yb6tp_ z2?Zk-+Q8@Y#3$?Hd`W))ZnI%MEGPPlMaf*+LHugpc59B=rn!R*6UJI#7H*n4P@ z60@Kaj|#;DcA^$|PS48o5sRAyo)Kt5@lltm#ly2*#?$J(D;d8M2;@A(ilaBdc=O^qI5Q$O*JL=k*|>uK(f zT(7wq>2cB2Is1*}%{0*I7~OrnKRbQq?&V#?ps5oa*8k`41TgK1&KiCjMFAX*Tb?Sr zTycUeYkQ@xnG~5r7{jP&_~_u&P*USm^MCwpA*cdn*&Z=K=M=A0>S#y!Ib3jxonXl7 zXEhE7Ug?Dz8Un3#-@``-G00{u^Y_?f`(R0Ba72iO;IYAW{IKM{C7_ZgyLR58()5<# zLTxNJ17IQj4T8pTMBb@O4udg-2M0;YpyOnlz3ur*Z#p7RuwQZ&{|p8CG?dZ1Z?%`F zV?0kCqtn+s(75NyI3ne%vwE_|ic%8caM=f-4=~T>r24nuS}l;s7v_N!4ZH3LGR7%q zpb($X#wCwNRHei-oYF*76#h(_%QI{@MeJ3Q@2K0`&Fi|Bhq@=R(Yal;j4;s#jD>=v zrG6kek3_{%GL$Z^c6z`lHP;+f%;d^G>xz8#;Wu7%#u@AM+12Og>=9iNHR-{Av&OFb zkU^QWI-pGRWjMVjFX6sQ0w{1W(i{zn9YikVDAEdwGuyqWKEzt-usA!CRXeDD3o>eT zVg0FVDnlT{j=z>+S|k4QHq94`f8s0k(%*zrl*dq}g7zSI0ix8vE-Lf^rL10$1B{L; zqoTt3>hTH{H@@~E`PfsmF=d3FU3I7}s#8yYny`tBM zaB7?EIW?cWLd^@lqO#&zwUBNV{5r%(b)@5%a`9l3w=YeOwHNC#L#g`uUyg!8)Prq1 z&aBz9ZFa3II@~1gus-@5RUIxIzYo&9%g`#V{_srgx;Y;;q1Y=Tym zSsV`gonn*-;_YAQjKwRs<}{%9$}0cdMi3|GD17>G zh~(%|`VLNd;W*6j3Hc(ixyov|eW{hqM!FEC;3(lVxvNgRK+jWn00?5=@Vzp%HqoaK z#4rz-j?FA_C&R3TmE_*+!|*QJ<(vMl8%8)Z*r)T+AH3P$4%=Z^Oz{TC@T>DlGF; zG^XFN)@g6n>F#y1>E2#5kp+_h(Ap9VaTE{V_M}STixY>AV$KN)`V$jV^ae0j#bC>W zk%SdIW$Wp7dmx1be6P$g|LV}^v?J8uh$13z_T5S54rhv#Nnr;eVtyJt$fb)0)vP@V zM7&sxN#6r(OEo|f7%)8~iN?lluA`8_)>zs&7u0vNyrH2r%z-u46FATHmfr6@9Z}Nk zUy2Ip?g4EMDQ5%!#uB~}d=U}t< zaXYjYMU%;i-~wOU1DiAJ{gh>V#ss+6M!Z}^ng9qK@LSqDiRkwCnLK7&X@;%8xi}_^ ztxbAg#Rra{m6&4Rsi#@U$Kvydmdqk+oX`g|FSzU7FoQPxlv!m3{LD@iK4S3O;T`XS zu=-ivAZ07_MUou4<40pl(6RjC0U6ebbdePKy|Rx5JQXI;8b=%k$2jxF$NpMHy`9!(74JNIFR)FmHa25}r^NNxKDGMW3v-fnV<*;P6K>bm&SCNm1#pN~ zBlK(E-sv1eO_pmre%pBx>oLD8B#?H-QKUKw$L~cYj3G)ZEG-=nERT$6J%9K|<6?RK zr~;Rba=Lt0`mF_v${Nj(=h;t3iMakSOt_hXp3{`=;%SL|p--&no$k2sm)vOuymj(< z=IYW%{^RKIwWY8e5K>!dt{+H?I9toR_vcpX8h>G-Hf|vK*CJ{;=xIq#WD*{q#}5mW zQJ8f-3|wH9SLtbc5|W>17EgoXYXy3dI53}biAG;O_aQ?Pc>wbN?pMT<1r=Kc)PdDv z9nT>%V`B%|`F#1P#t6@W!WZitDk739|@?m+D4@;f`?H?@3lr&VeF z^a1YqxphLKEt5rRO4b}H9li@xOfjE#5Xhi;6T!**v+0pemlbS0A|8S=#-t`P=89slKrcsnYGF^!?8|D&1}%7nV{NneRB|B>+UDkPPwJ!mWJ2#j@M}mdh3NZBX9t& z(pP-duEjg}M0Egj^@J~(QGIEJNa|@ri zCzmdlIh2x3-?k09WEz2Bsg!$T*f?W^7F-Q~5BFr>OIoN`-IP?uj5~gWQX8(mCbBDU z?H%;%F1N+DZ+!)SSedPm{~jGTtcZF^V*(>rE4|{AV|~^+GK3(%aK*6TI=WCamZYow zlsI*=if<>#edX9)-PiDCZa7m7>3VobYkG2izR*KO)s?|*UggnAIkl z4+G8xi{-Sp;HfSM4wI%IQIA-ljDWysZWYqpG1IWuSaVBns+TaOuInM>IVZZO;Gd*l z3_em|f40{*gxp5q77-fDpPGJ64FhAb=-MT-J0mIOlT#;a0Cfgx9frgvEo8+M?mT)q zWX~(fJU~o;s+dAiKeXz8&MU_@cGNPb_IS?+w?A|1!_>9Er&(@}M}>NljR*@M@nkzU z74)T@@U_WQra*c=#QYSXn$KbsnaY_dLO*gSJs6k!qY1Lcu!0>ZS@I!`l2gfeT$FBd z&b`RE?naLRr)_&&AL;_ju{j*SWbM@*xyWPMXA<%$Y*Wub^7;{ z+AlTQTl!l_VG%RTcSIah9Eo{zzZ8+cZ&cE7c~*)A**TlM@RK-?-#S#5#Ir7-gyhX_ z*`yTxvk!Vj3bbr;fLHZyEO%7&OI@~)SU*;2IHgVgNP(tD=@pImQH>wDq=>@~&; z&-=$4$;Y1Z-#wlzE!0o1%6Zc=ieQci9I%H_^bMbz$Fhfb zfdTvB6P1D@DOELCaRQD(bptOD%jHKb$5Uhb1fnc`6OITNts?b^S3e0T@zwid?s>#M zcf<I=EPN)I?m>zgTT9WCgI3*z3oQu12_4sDn}o} z+6S!}XTr)y$9i`MCOjm3wD@HtN%7n+4A4WygyC@=I{^y(*cn}tIite-?}AR*ni6iG zmqz*LipacSNs(TX^NLS^6YM37xRVoZGw+0@hJqBtu@?Qo9#meup6rR$WEX?V)WPj| zWn6;x7|!?3&d8N_KrrCECXKYY2&xLfm^zsh{}c!B(EzfV50jFFlDC6lDG&1RbZ3n& z%29{MrUlEbwH1*W1D!FGFhg!u?EJHq;>mPQ0~ICHd{gjeTw@B3g^N)^qx#p%%&&7vXpqVR1Kdc|y$#x6p-nv~(r^Ksiqt zIym<}vCv&W+-iE){3iLNC`;r~)PqHWxudp{&`85ZdzwaHV)Ia+vp zWW_#aNO*lfaN3a*XxLTmfi>A?2Y-1(uS2&ymI0@u$8bz0(# z`Sxh6#E#rB7n}S1iW4Nutw*7)!PoQ3!-fPWJ<|uD=It8@>}TWTDRdETHL|*B(JfKd zPo|A*alzL?3tLXvCFUa~kItI1Ba=47m7-QZi7z3a&h65R^W7AC?AlXXW%Fm4QD%SU zF9E6Wo0|*)Epo6b|DagJ5Q;xttd`u15>%v*t)#I>j_AaeUPtB>TS%0IX7Bb#WA`+| zxXU)OaA*BIn%8nO+W4CN14U#X8&3l&9SdgPQuk!h%vl;{L3;g`&J=}2L4%Xu7>o>> z<IlY?y2PyQydW6X(uALD+FotjXco#u<%?|e^pC1sDw1hq-P^rkPPIXAQ-Qm+ec zQvhtSdz_qLcEk1L9$N!-MnWHnt%h2hS0@z&E7bL}BTVW00k|sUNA9Y1>lgR)$MFX> znk-~Uh=${5S~t;Cqt>7=(zZW09cS4woYZjs*z1%2!r_ua0op>9y~9KPWNl4a6WXPbmZ-;@6$bGz@ZSdlL)vlzpcpCrB zWeM>j8P|L97jpi2>sGHhqeqVsb84s19zAnY-BJjLyMTup(Jv&1Wf;eh8OZ2Ib1xMp zngW8%%kG1TDL{UZ#v4B1s-r#WRJ%8({p(IEndA}x_597EAzY@^D-~R*9 z)7&BjYR#k<>O{`9gl^g&1%Qc2`DuDS8nfr^SLUBwh@7D=-hdDYmz|1grROdlWNpUg509XP&B{(Y5V1hUC3OUKQ#_e!wH?p*^O$IaU;LnBW zsZWkzuH*(eKtMYAbR8=GgVXIb+^!cUbJ_(Cg{5%D5W-;UWCc651g=E?So?ZA2^Wa4)*x@)UdxL!14nrsXG-JkoTE4^w zv_iTTY`3+o&tKelzt71(ci9g!qv6OwU$2XO)O9@cu7M+nABKbC`9iTqTpQEvX#8?< z;%{nxBXLZXp+|sHfMo&wtUP8baO7`xN(FG3`Ac1+RE0#b?8s zT#T*OKsfZj6#gbI5_Ah^q~;GV-C2{w!60pm*j;x^y4BKE?UQ7uDfwCj*x zc;A3%<;-^%xDs7`E@Eh&t=m8#}-3uinAqcaBM zM_L?ZB;fkO+E0E0Pb7e^L8x=9(uaq~LvI=S?-sOX+*vk)eSjY|*|7{1>v)bAa_nmW z*5RENi8ZAx{#8#j1{j$!gaT{pNR?K1hE{jhnKU%|&)X1HA`C`f%_@@W;F0C63_0JY zmAV_Rv9nCmwbR_yrXL9v*}v|e+W)>=F`OF^aal~M5vJN$Tx1I^_pX8cvXm`c=Y~kd$P5S{xq&4^ZR%P6o1Jq2dzwG7XL$4?VK7p6H!=g zM01#BS_KBZ^6(?~tDO>MKplQVpB;sNC{Wq3w+NwFr_IaomT?o_C*qU0Yv7+onDPrR zg_8Nkg0adu#7$T>*kUGt-U_;SiFo!}qa=|DlFr#S77K!T72kllHHKJz+t2AK$m8Zn_)Dnscdyf~wgv4Oz7YD|Ni|7ZWJSB#CDGgO0 z!wFu2{NXU)BSvC}1k@ixnQRaBO_1jsK^C92;NvNGK>wEl;1;U@Xi7lST2++~jk+SIZwaNJmMz%^w}yzuWzue&eo(H$Fo-7QmWD8#7PA&m_N7i&ElZKJ9o~pP z1{)R5UJ&Ik%R5Dg(+>;Blru4A_qdzY(DkQkH2if<< z?v=1u`R5DF@vMjOb7qWevDjW`{;IJ4QY_{vRg2c8j4^M|U7i1gQ>D^5%N8by*92uq zUlI?gj!a_0twTdb;x?c0yHBhk$^tfRK|dJ&-DNQ7(i!aTu&qBU|HVqrrpHO!aHDVS z-mT{59XfzFt16fMkpjxblLMa(w)NV8FQF;$BE|z!`(60K<#~kZm=YoXc#O^bCn+}M zYmlWf&*Rc|#KOr0gSw<*k!9RT6#tdgbT>8_z4cNPz929tgy{@=f0iD6|< z>7nX`t*Qxu{xl6{#;m1~B{0R~mAngS+h9ondhG8*O2kX7!>@oKl57Xdz%$C_9}gaA zN+0w|5|}4SZ=+*96VP@ce8)U+fkd%u3rgOaVO#jW^@za!8}2jiiDdOa2~&W*#aNd! z^}@UM_|4sCyEV?Y>v_EkFi01#*XJ#3i{pU%X`M9hP1Tx>u??c30n0vpKG` z4Hk-$aW;ojjC;3Q;qBudmfM%X%dkr@ZRi7o`3jcgurUhHwj88M0f2~$BBS9%96Nn< zY!r=P4$PEGkVr}ZK-54zn7eJ<43jtAw$VIP4p)%Dwsj)_Qp3+1)SG*FHB-NfD~Jfd z4$Y5Buijl_d>j7_U_A|{NH+w#-@D%HSK00sgq*yr(ll=GVbC7DLf%J1^JocSie=C* zsqFuUBh~F+>3tK#Gb80s=mmMS8tToSgDhH4jFMJM1ItX_V`SMO{(UD~f%S7u@NeQ? z*~}~m1t~1j9=A*BY8Bdd-|)B^+Gv6<@W6(GSWpM$HmF@qBP}<)O)=NUl_*KdMu57z zT;grZNK|(yOIkgdyPvx#$;AP-+Yzm_Vr69?9Tk5A7UQi2WoxSsk5Vf21U)d_Ja-P2 z%5%hW4ES4YO=#(-Vg!Wp{y2MLF`5~f(TT!T}qAE+N<~5O%AB5ug6DN5b^fNt7#xS}n-6Afbiq2G(d#l)R8R<#$0h-pDwmzUl zL4Ed5B1w|4F8MHS!H%X*4O#Yn64y;o!gY;!>jA|Cpw@&yJmB00Lueg`Dfh@fZIQ_E z7Y<{`F|}MG6*&c{`uIW4(pwP2Rq9TdU29(`%&?5+C?dlfWH!|8nluc&7-EL_I-Y