veryfront 0.1.390 → 0.1.392

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/esm/cli/templates/manifest.js +1 -1
  2. package/esm/deno.d.ts +2 -0
  3. package/esm/deno.js +3 -1
  4. package/esm/extensions/ext-anthropic/src/anthropic-provider.d.ts +26 -0
  5. package/esm/extensions/ext-anthropic/src/anthropic-provider.d.ts.map +1 -0
  6. package/esm/extensions/ext-anthropic/src/anthropic-provider.js +832 -0
  7. package/esm/extensions/ext-anthropic/src/index.d.ts +12 -0
  8. package/esm/extensions/ext-anthropic/src/index.d.ts.map +1 -0
  9. package/esm/extensions/ext-anthropic/src/index.js +29 -0
  10. package/esm/extensions/ext-babel/src/index.d.ts +27 -0
  11. package/esm/extensions/ext-babel/src/index.d.ts.map +1 -0
  12. package/esm/extensions/ext-babel/src/index.js +79 -0
  13. package/esm/extensions/ext-babel/src/inject-node-positions.d.ts +16 -0
  14. package/esm/extensions/ext-babel/src/inject-node-positions.d.ts.map +1 -0
  15. package/esm/extensions/ext-babel/src/inject-node-positions.js +129 -0
  16. package/esm/extensions/ext-google/src/google-provider.d.ts +26 -0
  17. package/esm/extensions/ext-google/src/google-provider.d.ts.map +1 -0
  18. package/esm/extensions/ext-google/src/google-provider.js +597 -0
  19. package/esm/extensions/ext-google/src/index.d.ts +12 -0
  20. package/esm/extensions/ext-google/src/index.d.ts.map +1 -0
  21. package/esm/extensions/ext-google/src/index.js +26 -0
  22. package/esm/extensions/ext-node-compat/src/index.d.ts +11 -0
  23. package/esm/extensions/ext-node-compat/src/index.d.ts.map +1 -0
  24. package/esm/extensions/ext-node-compat/src/index.js +106 -0
  25. package/esm/extensions/ext-node-compat/src/kreuzberg.d.ts +3 -0
  26. package/esm/extensions/ext-node-compat/src/kreuzberg.d.ts.map +1 -0
  27. package/esm/extensions/ext-node-compat/src/kreuzberg.js +39 -0
  28. package/esm/src/agent/hosted-child-execution-logging.d.ts +7 -0
  29. package/esm/src/agent/hosted-child-execution-logging.d.ts.map +1 -1
  30. package/esm/src/agent/hosted-child-execution-logging.js +16 -0
  31. package/esm/src/agent/hosted-child-tool-input.d.ts +21 -0
  32. package/esm/src/agent/hosted-child-tool-input.d.ts.map +1 -1
  33. package/esm/src/agent/hosted-child-tool-input.js +27 -0
  34. package/esm/src/agent/index.d.ts +2 -2
  35. package/esm/src/agent/index.d.ts.map +1 -1
  36. package/esm/src/agent/index.js +2 -2
  37. package/esm/src/extensions/builtin-extensions.d.ts +5 -0
  38. package/esm/src/extensions/builtin-extensions.d.ts.map +1 -0
  39. package/esm/src/extensions/builtin-extensions.js +106 -0
  40. package/esm/src/extensions/discovery.d.ts +1 -1
  41. package/esm/src/extensions/discovery.d.ts.map +1 -1
  42. package/esm/src/extensions/discovery.js +4 -1
  43. package/esm/src/extensions/orchestrate.d.ts +5 -1
  44. package/esm/src/extensions/orchestrate.d.ts.map +1 -1
  45. package/esm/src/extensions/orchestrate.js +1 -1
  46. package/esm/src/extensions/registries/ai-provider-registry.d.ts +2 -2
  47. package/esm/src/extensions/registries/ai-provider-registry.d.ts.map +1 -1
  48. package/esm/src/extensions/registries/ai-provider-registry.js +3 -4
  49. package/esm/src/extensions/types.d.ts +1 -1
  50. package/esm/src/extensions/types.d.ts.map +1 -1
  51. package/esm/src/extensions/validation.d.ts.map +1 -1
  52. package/esm/src/extensions/validation.js +1 -0
  53. package/esm/src/provider/model-registry.d.ts.map +1 -1
  54. package/esm/src/provider/model-registry.js +7 -6
  55. package/esm/src/provider/shared/index.d.ts +1 -0
  56. package/esm/src/provider/shared/index.d.ts.map +1 -1
  57. package/esm/src/provider/shared/index.js +1 -0
  58. package/esm/src/provider/veryfront-cloud/provider.d.ts.map +1 -1
  59. package/esm/src/provider/veryfront-cloud/provider.js +11 -10
  60. package/esm/src/security/sandbox/project-worker.d.ts +2 -0
  61. package/esm/src/security/sandbox/project-worker.d.ts.map +1 -1
  62. package/esm/src/security/sandbox/project-worker.js +4 -0
  63. package/esm/src/security/sandbox/worker-pool.d.ts.map +1 -1
  64. package/esm/src/security/sandbox/worker-pool.js +5 -1
  65. package/esm/src/server/bootstrap.d.ts.map +1 -1
  66. package/esm/src/server/bootstrap.js +4 -0
  67. package/esm/src/utils/version-constant.d.ts +1 -1
  68. package/esm/src/utils/version-constant.js +1 -1
  69. package/package.json +11 -1
  70. package/src/cli/templates/manifest.js +1 -1
  71. package/src/deno.js +3 -1
  72. package/src/deps/esm.sh/@types/react-dom@19.2.3/client.d.ts +1 -1
  73. package/src/deps/esm.sh/@types/{react@19.2.14 → react@19.2.3}/global.d.ts +0 -1
  74. package/src/deps/esm.sh/@types/{react@19.2.14 → react@19.2.3}/index.d.ts +24 -93
  75. package/src/deps/esm.sh/react-dom@19.2.4/client.d.ts +1 -1
  76. package/src/extensions/ext-anthropic/src/anthropic-provider.ts +1202 -0
  77. package/src/extensions/ext-anthropic/src/index.ts +34 -0
  78. package/src/extensions/ext-babel/src/index.ts +108 -0
  79. package/src/extensions/ext-babel/src/inject-node-positions.ts +184 -0
  80. package/src/extensions/ext-google/src/google-provider.ts +862 -0
  81. package/src/extensions/ext-google/src/index.ts +31 -0
  82. package/src/extensions/ext-node-compat/src/index.ts +140 -0
  83. package/src/extensions/ext-node-compat/src/kreuzberg.ts +56 -0
  84. package/src/src/agent/hosted-child-execution-logging.ts +31 -0
  85. package/src/src/agent/hosted-child-tool-input.ts +60 -0
  86. package/src/src/agent/index.ts +7 -0
  87. package/src/src/extensions/builtin-extensions.ts +125 -0
  88. package/src/src/extensions/discovery.ts +4 -0
  89. package/src/src/extensions/orchestrate.ts +5 -0
  90. package/src/src/extensions/registries/ai-provider-registry.ts +3 -6
  91. package/src/src/extensions/types.ts +2 -1
  92. package/src/src/extensions/validation.ts +1 -0
  93. package/src/src/provider/model-registry.ts +7 -6
  94. package/src/src/provider/shared/index.ts +2 -0
  95. package/src/src/provider/veryfront-cloud/provider.ts +14 -15
  96. package/src/src/security/sandbox/project-worker.ts +5 -0
  97. package/src/src/security/sandbox/worker-pool.ts +12 -5
  98. package/src/src/server/bootstrap.ts +4 -0
  99. package/src/src/utils/version-constant.ts +1 -1
@@ -83,7 +83,7 @@ export default {
83
83
  "content/architecture.md": "# Architecture\n\nAcme Platform uses a modular, event-driven architecture.\n\n## Core Components\n\n### API Gateway\nRoutes incoming requests to the appropriate microservice. Handles authentication, rate limiting, and request validation.\n\n### Event Bus\nAsynchronous message broker connecting all services. Supports pub/sub and point-to-point messaging patterns.\n\n### Data Layer\nMulti-tenant data storage with automatic sharding. Supports PostgreSQL for relational data and Redis for caching.\n\n## Request Flow\n\n1. Client sends request to API Gateway\n2. Gateway validates authentication token\n3. Request is routed to the target service\n4. Service processes request and publishes events\n5. Response is returned through the gateway\n\n## Scaling\n\nEach component scales independently. The API Gateway uses horizontal scaling with load balancing. Services auto-scale based on queue depth and CPU utilization.\n\n## Security\n\n- All inter-service communication uses mTLS\n- API tokens are rotated every 24 hours\n- Data at rest is encrypted with AES-256\n- Audit logs are retained for 90 days\n",
84
84
  "content/getting-started.md": "# Getting Started\n\nWelcome to Acme Platform. This guide covers initial setup and core concepts.\n\n## Installation\n\nInstall the CLI globally:\n\n```bash\nnpm install -g @acme/cli\n```\n\n## Creating a Project\n\nRun the init command to scaffold a new project:\n\n```bash\nacme init my-project\ncd my-project\n```\n\n## Project Structure\n\n- `src/` — Application source code\n- `config/` — Configuration files\n- `tests/` — Test suite\n- `docs/` — Documentation\n\n## Configuration\n\nCreate an `acme.config.ts` file in your project root:\n\n```ts\nexport default {\n name: \"my-project\",\n region: \"us-east-1\",\n features: [\"auth\", \"storage\"],\n};\n```\n\n## Next Steps\n\n- Read the [Architecture Guide](./architecture) to understand the system design\n- Check [API Reference](./api-reference) for available endpoints\n- Join our Discord community for support\n",
85
85
  "globals.css": "@import \"tailwindcss\";\n",
86
- "app/page.tsx": "'use client'\n\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { ChatWithSidebar, useChat, type QuickAction } from 'veryfront/chat'\n\nconst UPLOAD_API = '/api/uploads'\nconst ACCEPT = '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.csv,.txt,.md,.mdx,.html,.rtf,.epub,.json,.xml'\n\nconst QUICK_ACTIONS: QuickAction[] = [\n { id: 'ask-question', label: 'Ask Question', prompt: 'I have a question about this document: ' },\n { id: 'extract-insights', label: 'Extract Insights', prompt: 'Extract the key insights from the uploaded documents.' },\n { id: 'find-sources', label: 'Find Sources', prompt: 'Find relevant sources and references in the documents for: ' },\n]\n\ninterface Doc { id: string; title: string; source: string; url?: string }\n\nfunction useUploads(api: string) {\n const [docs, setDocs] = useState<Doc[]>([])\n const [uploading, setUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const refresh = useCallback(async () => {\n try {\n const res = await fetch(api)\n if (res.ok) {\n const data = await res.json()\n setDocs(Array.isArray(data) ? data : data.uploads ?? [])\n }\n } catch { /* ignore */ }\n }, [api])\n\n useEffect(() => { refresh() }, [refresh])\n\n const upload = useCallback(async (file: File) => {\n setUploading(true)\n setError(null)\n try {\n const form = new FormData()\n form.append('file', file)\n const res = await fetch(api, { method: 'POST', body: form })\n if (!res.ok) throw new Error(await res.text())\n await refresh()\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Upload failed')\n } finally {\n setUploading(false)\n }\n }, [api, refresh])\n\n const remove = useCallback(async (id: string) => {\n await fetch(`${api}/${id}`, { method: 'DELETE' })\n await refresh()\n }, [api, refresh])\n\n const uploads = useMemo(\n () => docs.filter((d) => d.source.startsWith('upload:')),\n [docs],\n )\n\n return { uploads, uploading, error, upload, remove }\n}\n\nexport default function DocsChat() {\n const chat = useChat({ api: '/api/chat' })\n const docs = useUploads(UPLOAD_API)\n\n const attachmentItems = useMemo(() => {\n const items = docs.uploads.map((d) => ({\n id: d.id,\n name: d.title,\n status: 'ready' as const,\n }))\n if (docs.uploading) {\n items.push({ id: '__uploading', name: 'Uploading...', status: 'uploading' as const })\n }\n return items\n }, [docs.uploads, docs.uploading])\n\n const uploadFiles = useMemo(\n () => docs.uploads.map((d) => ({ id: d.id, name: d.title, url: d.url })),\n [docs.uploads],\n )\n\n const handleAttach = useCallback((files: FileList) => {\n for (const file of Array.from(files)) {\n docs.upload(file)\n }\n }, [docs.upload])\n\n const handleQuickAction = useCallback((action: QuickAction) => {\n if (action.prompt) chat.setInput(action.prompt)\n }, [chat.setInput])\n\n return (\n <ChatWithSidebar\n chat={chat}\n sidebar={{ storageKey: 'rag-threads' }}\n features={{ steps: true, tabs: true, sources: true, export: true }}\n models={{\n options: [\n {\n value: 'veryfront-cloud/anthropic/claude-sonnet-4-6',\n label: 'Claude Sonnet',\n provider: 'Veryfront Cloud',\n },\n {\n value: 'veryfront-cloud/openai/gpt-5.2',\n label: 'GPT-5.2',\n provider: 'Veryfront Cloud',\n },\n {\n value: 'veryfront-cloud/google/gemini-2.5-flash',\n label: 'Gemini 2.5 Flash',\n provider: 'Veryfront Cloud',\n badge: 'Fast',\n },\n ],\n }}\n attachments={{\n uploads: uploadFiles,\n onRemoveUpload: docs.remove,\n onAttach: handleAttach,\n accept: ACCEPT,\n items: attachmentItems,\n onRemoveItem: docs.remove,\n }}\n quickActions={{\n actions: QUICK_ACTIONS,\n onAction: handleQuickAction,\n }}\n message={{\n renderTool: () => null,\n }}\n className=\"flex-1 min-h-0\"\n placeholder=\"Ask anything about your documents...\"\n emptyState={{ title: 'Docs Agent', description: 'Upload files and ask questions' }}\n />\n )\n}\n",
86
+ "app/page.tsx": "'use client'\n\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { ChatWithSidebar, useChat, type QuickAction } from 'veryfront/chat'\n\nconst UPLOAD_API = '/api/uploads'\nconst ACCEPT = '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.csv,.txt,.md,.mdx,.html,.rtf,.epub,.json,.xml'\n\nconst QUICK_ACTIONS: QuickAction[] = [\n { id: 'ask-question', label: 'Ask Question', prompt: 'I have a question about this document: ' },\n { id: 'extract-insights', label: 'Extract Insights', prompt: 'Extract the key insights from the uploaded documents.' },\n { id: 'find-sources', label: 'Find Sources', prompt: 'Find relevant sources and references in the documents for: ' },\n]\n\ninterface Doc { id: string; title: string; source: string; url?: string }\n\nfunction useUploads(api: string) {\n const [docs, setDocs] = useState<Doc[]>([])\n const [uploading, setUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const refresh = useCallback(async () => {\n try {\n const res = await fetch(api)\n if (res.ok) {\n const data = await res.json()\n setDocs(Array.isArray(data) ? data : data.uploads ?? [])\n }\n } catch { /* ignore */ }\n }, [api])\n\n useEffect(() => { refresh() }, [refresh])\n\n const upload = useCallback(async (file: File) => {\n setUploading(true)\n setError(null)\n try {\n const form = new FormData()\n form.append('file', file)\n const res = await fetch(api, { method: 'POST', body: form })\n if (!res.ok) throw new Error(await res.text())\n await refresh()\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Upload failed')\n } finally {\n setUploading(false)\n }\n }, [api, refresh])\n\n const remove = useCallback(async (id: string) => {\n await fetch(`${api}/${id}`, { method: 'DELETE' })\n await refresh()\n }, [api, refresh])\n\n const uploads = useMemo(\n () => docs.filter((d) => d.source.startsWith('upload:')),\n [docs],\n )\n\n return { uploads, uploading, error, upload, remove }\n}\n\nexport default function DocsChat() {\n const chat = useChat({ api: '/api/chat' })\n const docs = useUploads(UPLOAD_API)\n\n const attachmentItems = useMemo(() => {\n const items = docs.uploads.map((d) => ({\n id: d.id,\n name: d.title,\n status: 'ready' as const,\n }))\n if (docs.uploading) {\n items.push({ id: '__uploading', name: 'Uploading...', status: 'uploading' as const })\n }\n return items\n }, [docs.uploads, docs.uploading])\n\n const uploadFiles = useMemo(\n () => docs.uploads.map((d) => ({ id: d.id, name: d.title, url: d.url })),\n [docs.uploads],\n )\n\n const handleAttach = useCallback((files: FileList) => {\n for (const file of Array.from(files)) {\n docs.upload(file)\n }\n }, [docs.upload])\n\n const handleQuickAction = useCallback((action: QuickAction) => {\n if (action.prompt) chat.setInput(action.prompt)\n }, [chat.setInput])\n\n return (\n <ChatWithSidebar\n chat={chat}\n sidebar={{ storageKey: 'rag-threads' }}\n features={{ steps: true, tabs: true, sources: true, export: true }}\n models={{\n options: [\n {\n value: 'anthropic/claude-sonnet-4-6',\n label: 'Claude Sonnet',\n },\n {\n value: 'openai/gpt-4.1-mini',\n label: 'GPT-4.1 Mini',\n },\n {\n value: 'google/gemini-2.5-flash',\n label: 'Gemini 2.5 Flash',\n badge: 'Fast',\n },\n ],\n }}\n attachments={{\n uploads: uploadFiles,\n onRemoveUpload: docs.remove,\n onAttach: handleAttach,\n accept: ACCEPT,\n items: attachmentItems,\n onRemoveItem: docs.remove,\n }}\n quickActions={{\n actions: QUICK_ACTIONS,\n onAction: handleQuickAction,\n }}\n message={{\n renderTool: () => null,\n }}\n className=\"flex-1 min-h-0\"\n placeholder=\"Ask anything about your documents...\"\n emptyState={{ title: 'Docs Agent', description: 'Upload files and ask questions' }}\n />\n )\n}\n",
87
87
  "app/layout.tsx": "import \"../globals.css\";\nimport { Head } from \"veryfront/head\";\n\nexport default function RootLayout({ children }: { children: React.ReactNode }): React.ReactNode {\n return (\n <>\n <Head><title>Docs Agent</title></Head>\n <div className=\"flex flex-col h-screen\">\n {children}\n </div>\n </>\n );\n}\n",
88
88
  "app/api/uploads/route.ts": "import { createUploadHandler } from \"veryfront/embedding\";\nimport { store } from \"../../../store.ts\";\n\nexport const { POST, GET } = createUploadHandler(store);\n",
89
89
  "app/api/uploads/[id]/route.ts": "import { createUploadHandler } from \"veryfront/embedding\";\nimport { store } from \"../../../../store.ts\";\n\nexport const { DELETE } = createUploadHandler(store);\n",
package/esm/deno.d.ts CHANGED
@@ -37,6 +37,7 @@ declare namespace _default {
37
37
  "./utils": string;
38
38
  "./oauth": string;
39
39
  "./provider": string;
40
+ "./provider/shared": string;
40
41
  "./fs": string;
41
42
  "./integrations": string;
42
43
  "./sandbox": string;
@@ -117,6 +118,7 @@ declare namespace _default {
117
118
  "veryfront/issues": string;
118
119
  "veryfront/discovery": string;
119
120
  "veryfront/observability": string;
121
+ "veryfront/provider/shared": string;
120
122
  "veryfront/tool/schema": string;
121
123
  "veryfront/agent/composition": string;
122
124
  "veryfront/extensions": string;
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.390",
3
+ "version": "0.1.392",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "workspace": [
@@ -60,6 +60,7 @@ export default {
60
60
  "./utils": "./src/utils/index.ts",
61
61
  "./oauth": "./src/oauth/index.ts",
62
62
  "./provider": "./src/provider/index.ts",
63
+ "./provider/shared": "./src/provider/shared/index.ts",
63
64
  "./fs": "./src/fs/index.ts",
64
65
  "./integrations": "./src/integrations/index.ts",
65
66
  "./sandbox": "./src/sandbox/index.ts",
@@ -140,6 +141,7 @@ export default {
140
141
  "veryfront/issues": "./src/issues/index.ts",
141
142
  "veryfront/discovery": "./src/discovery/index.ts",
142
143
  "veryfront/observability": "./src/observability/index.ts",
144
+ "veryfront/provider/shared": "./src/provider/shared/index.ts",
143
145
  "veryfront/tool/schema": "./src/tool/schema/index.ts",
144
146
  "veryfront/agent/composition": "./src/agent/composition/index.ts",
145
147
  "veryfront/extensions": "./src/extensions/index.ts",
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Anthropic provider — implements the {@link AIProvider} contract for
3
+ * Anthropic's Messages API (direct + via Veryfront Cloud / Bedrock-compatible
4
+ * proxies).
5
+ *
6
+ * Ported from `src/provider/runtime-loader.ts` as part of PR 12.
7
+ *
8
+ * @module extensions/ext-anthropic/anthropic-provider
9
+ */
10
+ import type { AIProvider, AIProviderConfig } from "../../../src/extensions/interfaces/index.js";
11
+ import type { ModelRuntime } from "../../../src/provider/types.js";
12
+ import { buildProviderError, isNumberArray, mergeUsage, parseRetryAfterMs, ProviderError, ProviderOverloadedError, ProviderQuotaError, ProviderRateLimitError, ProviderRequestError, TOOL_INPUT_PENDING_THRESHOLD_MS, withToolInputStatusTransitions } from "../../../src/provider/shared/index.js";
13
+ export { buildProviderError, isNumberArray, mergeUsage, parseRetryAfterMs, ProviderError, ProviderOverloadedError, ProviderQuotaError, ProviderRateLimitError, ProviderRequestError, TOOL_INPUT_PENDING_THRESHOLD_MS, withToolInputStatusTransitions, };
14
+ export interface AnthropicRuntimeConfig {
15
+ apiKey?: string;
16
+ authToken?: string;
17
+ baseURL?: string;
18
+ name?: string;
19
+ fetch?: typeof globalThis.fetch;
20
+ }
21
+ export declare function createAnthropicModelRuntime(config: AnthropicRuntimeConfig, modelId: string): ModelRuntime;
22
+ export declare class AnthropicProvider implements AIProvider {
23
+ readonly id = "anthropic";
24
+ createModel(modelId: string, config: AIProviderConfig): ModelRuntime;
25
+ }
26
+ //# sourceMappingURL=anthropic-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../../../src/extensions/ext-anthropic/src/anthropic-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EACL,kBAAkB,EAIlB,aAAa,EACb,UAAU,EACV,iBAAiB,EAEjB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EAOpB,+BAA+B,EAE/B,8BAA8B,EAC/B,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,+BAA+B,EAC/B,8BAA8B,GAC/B,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AA0hCD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,MAAM,GACd,YAAY,CAyEd;AAED,qBAAa,iBAAkB,YAAW,UAAU;IAClD,QAAQ,CAAC,EAAE,eAAe;IAE1B,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,YAAY;CAYrE"}