agent0-sdk 0.2.1

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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/dist/core/agent.d.ts +76 -0
  4. package/dist/core/agent.d.ts.map +1 -0
  5. package/dist/core/agent.js +477 -0
  6. package/dist/core/agent.js.map +1 -0
  7. package/dist/core/contracts.d.ts +688 -0
  8. package/dist/core/contracts.d.ts.map +1 -0
  9. package/dist/core/contracts.js +348 -0
  10. package/dist/core/contracts.js.map +1 -0
  11. package/dist/core/endpoint-crawler.d.ts +44 -0
  12. package/dist/core/endpoint-crawler.d.ts.map +1 -0
  13. package/dist/core/endpoint-crawler.js +280 -0
  14. package/dist/core/endpoint-crawler.js.map +1 -0
  15. package/dist/core/feedback-manager.d.ts +98 -0
  16. package/dist/core/feedback-manager.d.ts.map +1 -0
  17. package/dist/core/feedback-manager.js +543 -0
  18. package/dist/core/feedback-manager.js.map +1 -0
  19. package/dist/core/indexer.d.ts +37 -0
  20. package/dist/core/indexer.d.ts.map +1 -0
  21. package/dist/core/indexer.js +189 -0
  22. package/dist/core/indexer.js.map +1 -0
  23. package/dist/core/ipfs-client.d.ts +88 -0
  24. package/dist/core/ipfs-client.d.ts.map +1 -0
  25. package/dist/core/ipfs-client.js +334 -0
  26. package/dist/core/ipfs-client.js.map +1 -0
  27. package/dist/core/sdk.d.ts +177 -0
  28. package/dist/core/sdk.d.ts.map +1 -0
  29. package/dist/core/sdk.js +544 -0
  30. package/dist/core/sdk.js.map +1 -0
  31. package/dist/core/subgraph-client.d.ts +68 -0
  32. package/dist/core/subgraph-client.d.ts.map +1 -0
  33. package/dist/core/subgraph-client.js +635 -0
  34. package/dist/core/subgraph-client.js.map +1 -0
  35. package/dist/core/web3-client.d.ts +94 -0
  36. package/dist/core/web3-client.d.ts.map +1 -0
  37. package/dist/core/web3-client.js +197 -0
  38. package/dist/core/web3-client.js.map +1 -0
  39. package/dist/index.d.ts +20 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +20 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/models/enums.d.ts +22 -0
  44. package/dist/models/enums.d.ts.map +1 -0
  45. package/dist/models/enums.js +24 -0
  46. package/dist/models/enums.js.map +1 -0
  47. package/dist/models/generated/subgraph-types.d.ts +208 -0
  48. package/dist/models/generated/subgraph-types.d.ts.map +1 -0
  49. package/dist/models/generated/subgraph-types.js +2 -0
  50. package/dist/models/generated/subgraph-types.js.map +1 -0
  51. package/dist/models/index.d.ts +8 -0
  52. package/dist/models/index.d.ts.map +1 -0
  53. package/dist/models/index.js +8 -0
  54. package/dist/models/index.js.map +1 -0
  55. package/dist/models/interfaces.d.ts +125 -0
  56. package/dist/models/interfaces.d.ts.map +1 -0
  57. package/dist/models/interfaces.js +5 -0
  58. package/dist/models/interfaces.js.map +1 -0
  59. package/dist/models/types.d.ts +11 -0
  60. package/dist/models/types.d.ts.map +1 -0
  61. package/dist/models/types.js +5 -0
  62. package/dist/models/types.js.map +1 -0
  63. package/dist/utils/constants.d.ts +24 -0
  64. package/dist/utils/constants.d.ts.map +1 -0
  65. package/dist/utils/constants.js +28 -0
  66. package/dist/utils/constants.js.map +1 -0
  67. package/dist/utils/id-format.d.ts +30 -0
  68. package/dist/utils/id-format.d.ts.map +1 -0
  69. package/dist/utils/id-format.js +67 -0
  70. package/dist/utils/id-format.js.map +1 -0
  71. package/dist/utils/index.d.ts +7 -0
  72. package/dist/utils/index.d.ts.map +1 -0
  73. package/dist/utils/index.js +7 -0
  74. package/dist/utils/index.js.map +1 -0
  75. package/dist/utils/validation.d.ts +25 -0
  76. package/dist/utils/validation.d.ts.map +1 -0
  77. package/dist/utils/validation.js +61 -0
  78. package/dist/utils/validation.js.map +1 -0
  79. package/package.json +71 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Marco De Rossi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,234 @@
1
+ # Agent0 SDK
2
+
3
+ Agent0 is the TypeScript SDK for agentic economies. It enables agents to register, advertise their capabilities and how to communicate with them, and give each other feedback and reputation signals. All this using blockchain infrastructure (ERC-8004) and decentralized storage, enabling permissionless discovery without relying on proprietary catalogues or intermediaries.
4
+
5
+ ## What Does Agent0 SDK Do?
6
+
7
+ Agent0 SDK v0.21 enables you to:
8
+
9
+ - **Create and manage agent identities** - Register your AI agent on-chain with a unique identity, configure presentation fields (name, description, image), set wallet addresses, and manage trust models with x402 support
10
+ - **Advertise agent capabilities** - Publish MCP and A2A endpoints, with automated extraction of MCP tools and A2A skills from endpoints
11
+ - **Enable permissionless discovery** - Make your agent discoverable by other agents and platforms using rich search by attributes, capabilities, skills, tools, tasks, and x402 support
12
+ - **Build reputation** - Give and receive feedback, retrieve feedback history, and search agents by reputation with cryptographic authentication
13
+ - **Cross-chain registration** - One-line registration with IPFS nodes, Pinata, Filecoin, or HTTP URIs
14
+ - **Public indexing** - Subgraph indexing both on-chain and IPFS data for fast search and retrieval
15
+
16
+ ## ⚠️ Alpha Release
17
+
18
+ Agent0 SDK v0.21 is in **alpha** with bugs and is not production ready. We're actively testing and improving it.
19
+
20
+ **Bug reports & feedback:** GitHub: [Report issues](https://github.com/agent0lab/agent0-ts/issues) | Telegram: [@marcoderossi](https://t.me/marcoderossi) | Email: marco.derossi@consensys.net
21
+
22
+ ## Installation
23
+
24
+ ### Prerequisites
25
+
26
+ - Node.js 18 or higher
27
+ - npm or yarn package manager
28
+ - Private key for signing transactions (or run in read-only mode)
29
+ - Access to an Ethereum RPC endpoint (e.g., Alchemy, Infura)
30
+ - (Optional) IPFS provider account (Pinata, Filecoin, or local IPFS node)
31
+
32
+ ### Install from npm
33
+
34
+ ```bash
35
+ npm install agent0-sdk
36
+ ```
37
+
38
+ ### Install from Source
39
+
40
+ ```bash
41
+ git clone https://github.com/agent0lab/agent0-ts.git
42
+ cd agent0-ts
43
+ npm install
44
+ npm run build
45
+ ```
46
+
47
+ ## Quick Start
48
+
49
+ ### 1. Initialize SDK
50
+
51
+ ```typescript
52
+ import { SDK } from 'agent0-sdk';
53
+
54
+ // Initialize SDK with IPFS and subgraph
55
+ const sdk = new SDK({
56
+ chainId: 11155111, // Ethereum Sepolia testnet
57
+ rpcUrl: process.env.RPC_URL!,
58
+ signer: process.env.PRIVATE_KEY, // Optional: for write operations
59
+ ipfs: 'pinata', // Options: 'pinata', 'filecoinPin', 'node'
60
+ pinataJwt: process.env.PINATA_JWT // For Pinata
61
+ // Subgraph URL auto-defaults from DEFAULT_SUBGRAPH_URLS
62
+ });
63
+ ```
64
+
65
+ ### 2. Create and Register Agent
66
+
67
+ ```typescript
68
+ // Create agent
69
+ const agent = sdk.createAgent(
70
+ 'My AI Agent',
71
+ 'An intelligent assistant for various tasks. Skills: data analysis, code generation.',
72
+ 'https://example.com/agent-image.png'
73
+ );
74
+
75
+ // Configure endpoints (automatically extracts capabilities)
76
+ await agent.setMCP('https://mcp.example.com/'); // Extracts tools, prompts, resources
77
+ await agent.setA2A('https://a2a.example.com/agent-card.json'); // Extracts skills
78
+ agent.setENS('myagent.eth');
79
+
80
+ // Configure wallet and trust
81
+ agent.setAgentWallet('0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb', 11155111);
82
+ agent.setTrust(true, true, false); // reputation, cryptoEconomic, teeAttestation
83
+
84
+ // Add metadata and set status
85
+ agent.setMetadata({ version: '1.0.0', category: 'ai-assistant' });
86
+ agent.setActive(true);
87
+
88
+ // Register on-chain with IPFS
89
+ const registrationFile = await agent.registerIPFS();
90
+ console.log(`Agent registered: ${registrationFile.agentId}`); // e.g., "11155111:123"
91
+ console.log(`Agent URI: ${registrationFile.agentURI}`); // e.g., "ipfs://Qm..."
92
+ ```
93
+
94
+ ### 3. Load and Edit Agent
95
+
96
+ ```typescript
97
+ // Load existing agent for editing
98
+ const agent = await sdk.loadAgent('11155111:123'); // Format: "chainId:agentId"
99
+
100
+ // Edit agent properties
101
+ agent.updateInfo(undefined, 'Updated description with new capabilities', undefined);
102
+ await agent.setMCP('https://new-mcp.example.com/');
103
+
104
+ // Re-register to update on-chain
105
+ await agent.registerIPFS();
106
+ console.log(`Updated: ${agent.agentURI}`);
107
+ ```
108
+
109
+ ### 4. Search Agents
110
+
111
+ ```typescript
112
+ // Search by name, capabilities, or attributes
113
+ const results = await sdk.searchAgents({
114
+ name: 'AI', // Substring search
115
+ mcpTools: ['code_generation'], // Specific MCP tools
116
+ a2aSkills: ['python'], // Specific A2A skills
117
+ active: true, // Only active agents
118
+ x402support: true // Payment support
119
+ });
120
+
121
+ for (const agent of results.items) {
122
+ console.log(`${agent.name}: ${agent.description}`);
123
+ console.log(` Tools: ${agent.mcpTools?.join(', ')}`);
124
+ console.log(` Skills: ${agent.a2aSkills?.join(', ')}`);
125
+ }
126
+
127
+ // Get single agent (read-only, faster)
128
+ const agentSummary = await sdk.getAgent('11155111:123');
129
+ ```
130
+
131
+ ### 5. Give and Retrieve Feedback
132
+
133
+ ```typescript
134
+ // Prepare feedback (only score is mandatory)
135
+ const feedbackFile = sdk.prepareFeedback(
136
+ '11155111:123',
137
+ 85, // 0-100 (mandatory)
138
+ ['data_analyst', 'finance'], // Optional: tags
139
+ undefined, // Optional: text
140
+ 'tools', // Optional: capability (MCP capability)
141
+ 'code_generation', // Optional: name (MCP tool name)
142
+ 'python' // Optional: skill (A2A skill)
143
+ );
144
+
145
+ // Give feedback
146
+ const feedback = await sdk.giveFeedback('11155111:123', feedbackFile);
147
+
148
+ // Search feedback
149
+ const feedbackResults = await sdk.searchFeedback(
150
+ '11155111:123',
151
+ undefined, // tags
152
+ ['tools'], // capabilities
153
+ undefined, // skills
154
+ 80, // minScore
155
+ 100 // maxScore
156
+ );
157
+
158
+ // Get reputation summary
159
+ const summary = await sdk.getReputationSummary('11155111:123');
160
+ console.log(`Average score: ${summary.averageScore}`);
161
+ ```
162
+
163
+ ## IPFS Configuration Options
164
+
165
+ ```typescript
166
+ // Option 1: Filecoin Pin (free for ERC-8004 agents)
167
+ const sdk = new SDK({
168
+ chainId: 11155111,
169
+ rpcUrl: '...',
170
+ signer: privateKey,
171
+ ipfs: 'filecoinPin',
172
+ filecoinPrivateKey: 'your-filecoin-private-key'
173
+ });
174
+
175
+ // Option 2: IPFS Node
176
+ const sdk = new SDK({
177
+ chainId: 11155111,
178
+ rpcUrl: '...',
179
+ signer: privateKey,
180
+ ipfs: 'node',
181
+ ipfsNodeUrl: 'https://ipfs.infura.io:5001'
182
+ });
183
+
184
+ // Option 3: Pinata (free for ERC-8004 agents)
185
+ const sdk = new SDK({
186
+ chainId: 11155111,
187
+ rpcUrl: '...',
188
+ signer: privateKey,
189
+ ipfs: 'pinata',
190
+ pinataJwt: 'your-pinata-jwt-token'
191
+ });
192
+
193
+ // Option 4: HTTP registration (no IPFS)
194
+ const sdk = new SDK({ chainId: 11155111, rpcUrl: '...', signer: privateKey });
195
+ await agent.registerHTTP('https://example.com/agent-registration.json');
196
+ ```
197
+
198
+ ## 🚀 Coming Soon
199
+
200
+ - More chains (currently Ethereum Sepolia only)
201
+ - Support for validations
202
+ - Multi-chain agents search
203
+ - Enhanced x402 payments
204
+ - Semantic/Vectorial search
205
+ - Advanced reputation aggregation
206
+ - Import/Export to centralized catalogues
207
+
208
+ ## Examples
209
+
210
+ Complete working examples are available in the `examples/` directory:
211
+
212
+ - `quick-start.ts` - Basic agent creation and registration
213
+ - `agent-update.ts` - Agent registration with IPFS
214
+ - `feedback-usage.ts` - Complete feedback flow with IPFS storage
215
+ - `search-agents.ts` - Agent search and discovery
216
+ - `transfer-agent.ts` - Agent ownership transfer
217
+
218
+ ## Documentation
219
+
220
+ Full documentation is available at [sdk.ag0.xyz](https://sdk.ag0.xyz), including:
221
+
222
+ - [Installation Guide](https://sdk.ag0.xyz/2-usage/2-1-install/)
223
+ - [Agent Configuration](https://sdk.ag0.xyz/2-usage/2-2-configure-agents/)
224
+ - [Registration](https://sdk.ag0.xyz/2-usage/2-3-registration-ipfs/)
225
+ - [Search](https://sdk.ag0.xyz/2-usage/2-5-search/)
226
+ - [Feedback](https://sdk.ag0.xyz/2-usage/2-6-use-feedback/)
227
+ - [Key Concepts](https://sdk.ag0.xyz/1-welcome/1-2-key-concepts/)
228
+ - [API Reference](https://sdk.ag0.xyz/5-reference/5-1-sdk/)
229
+
230
+ ## License
231
+
232
+ Agent0 SDK is MIT-licensed public good brought to you by Marco De Rossi in collaboration with Consensys, 🦊 MetaMask and Agent0, Inc. We are looking for co-maintainers. Please reach out if you want to help.
233
+
234
+ Thanks also to Edge & Node (The Graph), Protocol Labs and Pinata for their support.
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Agent class for managing individual agents
3
+ */
4
+ import type { RegistrationFile } from '../models/interfaces';
5
+ import type { AgentId, Address, URI } from '../models/types';
6
+ import type { SDK } from './sdk';
7
+ /**
8
+ * Agent class for managing individual agents
9
+ */
10
+ export declare class Agent {
11
+ private sdk;
12
+ private registrationFile;
13
+ private _endpointCrawler;
14
+ private _dirtyMetadata;
15
+ private _lastRegisteredWallet?;
16
+ private _lastRegisteredEns?;
17
+ constructor(sdk: SDK, registrationFile: RegistrationFile);
18
+ get agentId(): AgentId | undefined;
19
+ get agentURI(): URI | undefined;
20
+ get name(): string;
21
+ get description(): string;
22
+ get image(): URI | undefined;
23
+ get mcpEndpoint(): string | undefined;
24
+ get a2aEndpoint(): string | undefined;
25
+ get ensEndpoint(): string | undefined;
26
+ get walletAddress(): Address | undefined;
27
+ get mcpTools(): string[] | undefined;
28
+ get mcpPrompts(): string[] | undefined;
29
+ get mcpResources(): string[] | undefined;
30
+ get a2aSkills(): string[] | undefined;
31
+ setMCP(endpoint: string, version?: string, autoFetch?: boolean): Promise<this>;
32
+ setA2A(agentcard: string, version?: string, autoFetch?: boolean): Promise<this>;
33
+ setENS(name: string, version?: string): this;
34
+ setAgentWallet(address: Address, chainId: number): this;
35
+ setActive(active: boolean): this;
36
+ setX402Support(x402Support: boolean): this;
37
+ setTrust(reputation?: boolean, cryptoEconomic?: boolean, teeAttestation?: boolean): this;
38
+ setMetadata(kv: Record<string, unknown>): this;
39
+ getMetadata(): Record<string, unknown>;
40
+ delMetadata(key: string): this;
41
+ getRegistrationFile(): RegistrationFile;
42
+ /**
43
+ * Update basic agent information
44
+ */
45
+ updateInfo(name?: string, description?: string, image?: URI): this;
46
+ /**
47
+ * Register agent on-chain with IPFS flow
48
+ */
49
+ registerIPFS(): Promise<RegistrationFile>;
50
+ /**
51
+ * Register agent on-chain with HTTP URI
52
+ */
53
+ registerHTTP(agentUri: string): Promise<RegistrationFile>;
54
+ /**
55
+ * Set agent URI (for updates)
56
+ */
57
+ setAgentUri(agentUri: string): Promise<void>;
58
+ /**
59
+ * Transfer agent ownership
60
+ */
61
+ transfer(newOwner: Address): Promise<{
62
+ txHash: string;
63
+ from: Address;
64
+ to: Address;
65
+ agentId: AgentId;
66
+ }>;
67
+ /**
68
+ * Private helper methods
69
+ */
70
+ private _registerWithoutUri;
71
+ private _registerWithUri;
72
+ private _updateMetadataOnChain;
73
+ private _collectMetadataForRegistration;
74
+ private _extractAgentIdFromReceipt;
75
+ }
76
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,gBAAgB,EAEjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAKjC;;GAEG;AACH,qBAAa,KAAK;IAOJ,OAAO,CAAC,GAAG;IANvB,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,qBAAqB,CAAC,CAAU;IACxC,OAAO,CAAC,kBAAkB,CAAC,CAAS;gBAEhB,GAAG,EAAE,GAAG,EAAE,gBAAgB,EAAE,gBAAgB;IAMhE,IAAI,OAAO,IAAI,OAAO,GAAG,SAAS,CAEjC;IAED,IAAI,QAAQ,IAAI,GAAG,GAAG,SAAS,CAE9B;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,KAAK,IAAI,GAAG,GAAG,SAAS,CAE3B;IAED,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAGpC;IAED,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAGpC;IAED,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAGpC;IAED,IAAI,aAAa,IAAI,OAAO,GAAG,SAAS,CAEvC;IAED,IAAI,QAAQ,IAAI,MAAM,EAAE,GAAG,SAAS,CAGnC;IAED,IAAI,UAAU,IAAI,MAAM,EAAE,GAAG,SAAS,CAGrC;IAED,IAAI,YAAY,IAAI,MAAM,EAAE,GAAG,SAAS,CAGvC;IAED,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG,SAAS,CAGpC;IAGK,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAqB,EAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAiClG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,MAAe,EAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BnG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,IAAI;IAuBnD,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAavD,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAMhC,cAAc,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI;IAM1C,QAAQ,CACN,UAAU,GAAE,OAAe,EAC3B,cAAc,GAAE,OAAe,EAC/B,cAAc,GAAE,OAAe,GAC9B,IAAI;IAWP,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAW9C,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAItC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAS9B,mBAAmB,IAAI,gBAAgB;IAIvC;;OAEG;IACH,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI;IAelE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA2F/C;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgB/D;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBlD;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAgD5G;;OAEG;YACW,mBAAmB;YAuCnB,gBAAgB;YA6BhB,sBAAsB;IA6BpC,OAAO,CAAC,+BAA+B;IA6BvC,OAAO,CAAC,0BAA0B;CA2CnC"}