@clawnch/clawtomaton 0.2.2 → 0.3.0

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 (61) hide show
  1. package/README.md +80 -8
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +12 -0
  4. package/dist/agent/index.js.map +1 -1
  5. package/dist/agent/prompt.d.ts +2 -0
  6. package/dist/agent/prompt.d.ts.map +1 -1
  7. package/dist/agent/prompt.js +43 -2
  8. package/dist/agent/prompt.js.map +1 -1
  9. package/dist/bunker/client.d.ts +113 -0
  10. package/dist/bunker/client.d.ts.map +1 -0
  11. package/dist/bunker/client.js +404 -0
  12. package/dist/bunker/client.js.map +1 -0
  13. package/dist/bunker/self-deploy.d.ts +54 -0
  14. package/dist/bunker/self-deploy.d.ts.map +1 -0
  15. package/dist/bunker/self-deploy.js +353 -0
  16. package/dist/bunker/self-deploy.js.map +1 -0
  17. package/dist/bunker/threat-monitor.d.ts +47 -0
  18. package/dist/bunker/threat-monitor.d.ts.map +1 -0
  19. package/dist/bunker/threat-monitor.js +173 -0
  20. package/dist/bunker/threat-monitor.js.map +1 -0
  21. package/dist/bunker/types.d.ts +320 -0
  22. package/dist/bunker/types.d.ts.map +1 -0
  23. package/dist/bunker/types.js +9 -0
  24. package/dist/bunker/types.js.map +1 -0
  25. package/dist/cli.js +207 -9
  26. package/dist/cli.js.map +1 -1
  27. package/dist/constants.d.ts +11 -0
  28. package/dist/constants.d.ts.map +1 -1
  29. package/dist/constants.js +10 -0
  30. package/dist/constants.js.map +1 -1
  31. package/dist/heartbeat/index.d.ts +10 -0
  32. package/dist/heartbeat/index.d.ts.map +1 -1
  33. package/dist/heartbeat/index.js +89 -11
  34. package/dist/heartbeat/index.js.map +1 -1
  35. package/dist/index.d.ts +8 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +7 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/market/index.d.ts +12 -0
  40. package/dist/market/index.d.ts.map +1 -1
  41. package/dist/market/index.js +48 -2
  42. package/dist/market/index.js.map +1 -1
  43. package/dist/skills/bunker.d.ts +29 -0
  44. package/dist/skills/bunker.d.ts.map +1 -0
  45. package/dist/skills/bunker.js +502 -0
  46. package/dist/skills/bunker.js.map +1 -0
  47. package/dist/skills/index.d.ts +2 -1
  48. package/dist/skills/index.d.ts.map +1 -1
  49. package/dist/skills/index.js +6 -1
  50. package/dist/skills/index.js.map +1 -1
  51. package/dist/state/index.d.ts +6 -0
  52. package/dist/state/index.d.ts.map +1 -1
  53. package/dist/state/index.js +55 -0
  54. package/dist/state/index.js.map +1 -1
  55. package/dist/survival/index.d.ts.map +1 -1
  56. package/dist/survival/index.js +3 -0
  57. package/dist/survival/index.js.map +1 -1
  58. package/dist/types.d.ts +3 -0
  59. package/dist/types.d.ts.map +1 -1
  60. package/dist/types.js.map +1 -1
  61. package/package.json +1 -1
@@ -0,0 +1,404 @@
1
+ /**
2
+ * MoltBunker API client — production-hardened HTTP client with wallet session auth.
3
+ *
4
+ * Auth: EIP-191 signed challenge → session token (wt_*). Auto-refreshes on 401.
5
+ * Rate limits: Exponential backoff on 429 with Retry-After header.
6
+ * Errors: Typed error hierarchy for structured handling.
7
+ * Timeouts: 30s default per request.
8
+ *
9
+ * This client is stateless except for the cached session token.
10
+ * All methods are safe to call concurrently (token refresh is serialized).
11
+ */
12
+ // ============================================================================
13
+ // Errors
14
+ // ============================================================================
15
+ export class BunkerError extends Error {
16
+ status;
17
+ body;
18
+ constructor(message, status, body) {
19
+ super(message);
20
+ this.status = status;
21
+ this.body = body;
22
+ this.name = 'BunkerError';
23
+ }
24
+ }
25
+ export class BunkerAuthError extends BunkerError {
26
+ constructor(message, body) {
27
+ super(message, 401, body);
28
+ this.name = 'BunkerAuthError';
29
+ }
30
+ }
31
+ export class BunkerInsufficientFundsError extends BunkerError {
32
+ required;
33
+ available;
34
+ constructor(message, body) {
35
+ super(message, 402, body);
36
+ this.name = 'BunkerInsufficientFundsError';
37
+ this.required = body?.required;
38
+ this.available = body?.available;
39
+ }
40
+ }
41
+ export class BunkerNotFoundError extends BunkerError {
42
+ constructor(message, body) {
43
+ super(message, 404, body);
44
+ this.name = 'BunkerNotFoundError';
45
+ }
46
+ }
47
+ export class BunkerRateLimitError extends BunkerError {
48
+ retryAfterMs;
49
+ constructor(message, retryAfterMs, body) {
50
+ super(message, 429, body);
51
+ this.name = 'BunkerRateLimitError';
52
+ this.retryAfterMs = retryAfterMs;
53
+ }
54
+ }
55
+ // ============================================================================
56
+ // Client
57
+ // ============================================================================
58
+ const DEFAULT_API_URL = 'https://api.moltbunker.com/v1';
59
+ const DEFAULT_TIMEOUT_MS = 30_000;
60
+ const MAX_RATE_LIMIT_RETRIES = 3;
61
+ const SESSION_REFRESH_BUFFER_MS = 60_000; // refresh 1 min before expiry
62
+ export class BunkerClient {
63
+ apiUrl;
64
+ walletClient;
65
+ timeoutMs;
66
+ // Session token state
67
+ sessionToken = null;
68
+ sessionExpiresAt = 0;
69
+ refreshPromise = null;
70
+ constructor(opts) {
71
+ this.apiUrl = (opts.apiUrl ?? DEFAULT_API_URL).replace(/\/+$/, '');
72
+ this.walletClient = opts.walletClient;
73
+ this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
74
+ }
75
+ // --------------------------------------------------------------------------
76
+ // Auth
77
+ // --------------------------------------------------------------------------
78
+ /**
79
+ * Get a valid session token. Uses cached token if still valid,
80
+ * otherwise authenticates via challenge-response.
81
+ *
82
+ * Concurrent calls are serialized — only one auth request at a time.
83
+ */
84
+ async getSessionToken() {
85
+ // Return cached token if valid
86
+ if (this.sessionToken && Date.now() < this.sessionExpiresAt - SESSION_REFRESH_BUFFER_MS) {
87
+ return this.sessionToken;
88
+ }
89
+ // Serialize concurrent refresh attempts
90
+ if (this.refreshPromise) {
91
+ return this.refreshPromise;
92
+ }
93
+ this.refreshPromise = this.authenticate();
94
+ try {
95
+ return await this.refreshPromise;
96
+ }
97
+ finally {
98
+ this.refreshPromise = null;
99
+ }
100
+ }
101
+ /**
102
+ * Full challenge-response auth flow. Signs with EIP-191 via viem wallet.
103
+ */
104
+ async authenticate() {
105
+ const account = this.walletClient.account;
106
+ if (!account) {
107
+ throw new BunkerAuthError('WalletClient has no account set');
108
+ }
109
+ const address = account.address;
110
+ // Step 1: Get challenge
111
+ const challengeResp = await this.rawRequest('POST', '/auth/challenge', { address }, false);
112
+ // Step 2: Sign challenge with EIP-191
113
+ const signature = await this.walletClient.signMessage({
114
+ account: account,
115
+ message: challengeResp.message,
116
+ });
117
+ // Step 3: Verify and get token
118
+ const verifyResp = await this.rawRequest('POST', '/auth/verify', { address, message: challengeResp.message, signature }, false);
119
+ this.sessionToken = verifyResp.access_token;
120
+ this.sessionExpiresAt = Date.now() + verifyResp.expires_in * 1000;
121
+ return this.sessionToken;
122
+ }
123
+ /**
124
+ * Invalidate the current session and force re-authentication on next request.
125
+ */
126
+ invalidateSession() {
127
+ this.sessionToken = null;
128
+ this.sessionExpiresAt = 0;
129
+ }
130
+ // --------------------------------------------------------------------------
131
+ // HTTP Layer
132
+ // --------------------------------------------------------------------------
133
+ /**
134
+ * Low-level request without auth retry logic. Used for auth endpoints.
135
+ */
136
+ async rawRequest(method, path, body, authenticated = false, timeoutMs) {
137
+ const url = `${this.apiUrl}${path}`;
138
+ const headers = {
139
+ 'Content-Type': 'application/json',
140
+ 'User-Agent': 'clawtomaton-bunker/1.0',
141
+ };
142
+ if (authenticated) {
143
+ const token = await this.getSessionToken();
144
+ headers['Authorization'] = `Bearer ${token}`;
145
+ }
146
+ const controller = new AbortController();
147
+ const timeout = setTimeout(() => controller.abort(), timeoutMs ?? this.timeoutMs);
148
+ try {
149
+ const response = await fetch(url, {
150
+ method,
151
+ headers,
152
+ body: body ? JSON.stringify(body) : undefined,
153
+ signal: controller.signal,
154
+ });
155
+ if (response.ok) {
156
+ // Handle 204 No Content
157
+ if (response.status === 204)
158
+ return undefined;
159
+ const text = await response.text();
160
+ if (!text)
161
+ return undefined;
162
+ return JSON.parse(text);
163
+ }
164
+ // Parse error body
165
+ let errorBody;
166
+ try {
167
+ errorBody = await response.json();
168
+ }
169
+ catch {
170
+ // Non-JSON error body
171
+ }
172
+ const errorMessage = errorBody?.error ?? `HTTP ${response.status} on ${method} ${path}`;
173
+ switch (response.status) {
174
+ case 401:
175
+ throw new BunkerAuthError(errorMessage, errorBody);
176
+ case 402:
177
+ throw new BunkerInsufficientFundsError(errorMessage, errorBody);
178
+ case 404:
179
+ throw new BunkerNotFoundError(errorMessage, errorBody);
180
+ case 429: {
181
+ const retryAfter = response.headers.get('Retry-After');
182
+ const retryMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 5000;
183
+ throw new BunkerRateLimitError(errorMessage, retryMs, errorBody);
184
+ }
185
+ default:
186
+ throw new BunkerError(errorMessage, response.status, errorBody);
187
+ }
188
+ }
189
+ catch (err) {
190
+ if (err instanceof BunkerError)
191
+ throw err;
192
+ if (err instanceof Error && err.name === 'AbortError') {
193
+ throw new BunkerError(`Request timed out after ${timeoutMs ?? this.timeoutMs}ms: ${method} ${path}`, 0);
194
+ }
195
+ throw new BunkerError(`Network error: ${err instanceof Error ? err.message : String(err)}`, 0);
196
+ }
197
+ finally {
198
+ clearTimeout(timeout);
199
+ }
200
+ }
201
+ /**
202
+ * Authenticated request with auto-refresh on 401 and rate limit retry.
203
+ *
204
+ * For mutating operations that can't be safely retried (deploy, clone),
205
+ * set `idempotent: false` to skip rate-limit retry.
206
+ */
207
+ async request(method, path, body, opts) {
208
+ const idempotent = opts?.idempotent ?? (method === 'GET' || method === 'DELETE');
209
+ // Rate limit retry loop
210
+ for (let attempt = 0; attempt <= (idempotent ? MAX_RATE_LIMIT_RETRIES : 0); attempt++) {
211
+ try {
212
+ return await this.rawRequest(method, path, body, true, opts?.timeoutMs);
213
+ }
214
+ catch (err) {
215
+ // Auto-refresh on 401 (only once)
216
+ if (err instanceof BunkerAuthError && attempt === 0) {
217
+ this.invalidateSession();
218
+ return this.rawRequest(method, path, body, true, opts?.timeoutMs);
219
+ }
220
+ // Rate limit retry with backoff
221
+ if (err instanceof BunkerRateLimitError && attempt < MAX_RATE_LIMIT_RETRIES && idempotent) {
222
+ const backoffMs = Math.min(err.retryAfterMs, 30_000) * Math.pow(2, attempt);
223
+ await sleep(backoffMs);
224
+ continue;
225
+ }
226
+ throw err;
227
+ }
228
+ }
229
+ // Should never reach here, but TypeScript needs it
230
+ throw new BunkerError('Max retries exceeded', 429);
231
+ }
232
+ // --------------------------------------------------------------------------
233
+ // Bots
234
+ // --------------------------------------------------------------------------
235
+ async createBot(req) {
236
+ return this.request('POST', '/bots', req, { idempotent: false });
237
+ }
238
+ async listBots() {
239
+ return this.request('GET', '/bots');
240
+ }
241
+ async getBot(id) {
242
+ return this.request('GET', `/bots/${enc(id)}`);
243
+ }
244
+ async updateBot(id, req) {
245
+ return this.request('PATCH', `/bots/${enc(id)}`, req);
246
+ }
247
+ async deleteBot(id) {
248
+ await this.request('DELETE', `/bots/${enc(id)}`);
249
+ }
250
+ async getBotStatus(id) {
251
+ return this.request('GET', `/bots/${enc(id)}/status`);
252
+ }
253
+ async enableCloning(botId, config) {
254
+ await this.request('POST', `/bots/${enc(botId)}/cloning`, config, { idempotent: false });
255
+ }
256
+ async syncClones(botId) {
257
+ await this.request('POST', `/bots/${enc(botId)}/clones/sync`, undefined, { idempotent: false });
258
+ }
259
+ // --------------------------------------------------------------------------
260
+ // Runtimes
261
+ // --------------------------------------------------------------------------
262
+ async reserveRuntime(req) {
263
+ return this.request('POST', '/runtimes/reserve', req, { idempotent: false });
264
+ }
265
+ async getRuntime(id) {
266
+ return this.request('GET', `/runtimes/${enc(id)}`);
267
+ }
268
+ async getRuntimeStatus(id) {
269
+ return this.request('GET', `/runtimes/${enc(id)}/status`);
270
+ }
271
+ async extendRuntime(id, req) {
272
+ await this.request('POST', `/runtimes/${enc(id)}/extend`, req, { idempotent: false });
273
+ }
274
+ async releaseRuntime(id) {
275
+ await this.request('DELETE', `/runtimes/${enc(id)}`);
276
+ }
277
+ // --------------------------------------------------------------------------
278
+ // Deployments
279
+ // --------------------------------------------------------------------------
280
+ async createDeployment(req) {
281
+ return this.request('POST', '/deployments', req, { idempotent: false });
282
+ }
283
+ async listDeployments(botId) {
284
+ const query = botId ? `?bot_id=${enc(botId)}` : '';
285
+ return this.request('GET', `/deployments${query}`);
286
+ }
287
+ async getDeployment(id) {
288
+ return this.request('GET', `/deployments/${enc(id)}`);
289
+ }
290
+ async stopDeployment(id) {
291
+ await this.request('POST', `/deployments/${enc(id)}/stop`, undefined, { idempotent: false });
292
+ }
293
+ // --------------------------------------------------------------------------
294
+ // Containers
295
+ // --------------------------------------------------------------------------
296
+ async listContainers(params) {
297
+ const query = new URLSearchParams();
298
+ if (params?.status)
299
+ query.set('status', params.status);
300
+ if (params?.owner)
301
+ query.set('owner', params.owner);
302
+ const qs = query.toString();
303
+ return this.request('GET', `/containers${qs ? '?' + qs : ''}`);
304
+ }
305
+ async getContainer(id) {
306
+ return this.request('GET', `/containers/${enc(id)}`);
307
+ }
308
+ async startContainer(id) {
309
+ await this.request('POST', `/containers/${enc(id)}/start`, undefined, { idempotent: false });
310
+ }
311
+ async stopContainer(id) {
312
+ await this.request('POST', `/containers/${enc(id)}/stop`, undefined, { idempotent: false });
313
+ }
314
+ async deleteContainer(id) {
315
+ await this.request('DELETE', `/containers/${enc(id)}`);
316
+ }
317
+ async getContainerLogs(id, tail = 100) {
318
+ return this.request('GET', `/containers/${enc(id)}/logs?tail=${tail}`);
319
+ }
320
+ async enableCheckpoints(id) {
321
+ await this.request('POST', `/containers/${enc(id)}/checkpoints`, undefined, { idempotent: false });
322
+ }
323
+ async enableContainerCloning(id, config) {
324
+ await this.request('POST', `/containers/${enc(id)}/cloning`, config, { idempotent: false });
325
+ }
326
+ // --------------------------------------------------------------------------
327
+ // Snapshots
328
+ // --------------------------------------------------------------------------
329
+ async createSnapshot(req) {
330
+ return this.request('POST', '/snapshots', req, { idempotent: false });
331
+ }
332
+ async listSnapshots(containerId) {
333
+ const query = containerId ? `?container_id=${enc(containerId)}` : '';
334
+ return this.request('GET', `/snapshots${query}`);
335
+ }
336
+ async getSnapshot(id) {
337
+ return this.request('GET', `/snapshots/${enc(id)}`);
338
+ }
339
+ async deleteSnapshot(id) {
340
+ await this.request('DELETE', `/snapshots/${enc(id)}`);
341
+ }
342
+ async restoreSnapshot(id, req) {
343
+ return this.request('POST', `/snapshots/${enc(id)}/restore`, req, { idempotent: false });
344
+ }
345
+ // --------------------------------------------------------------------------
346
+ // Clones
347
+ // --------------------------------------------------------------------------
348
+ async createClone(req) {
349
+ return this.request('POST', '/clones', req, { idempotent: false });
350
+ }
351
+ async listClones(params) {
352
+ const query = new URLSearchParams();
353
+ if (params?.bot_id)
354
+ query.set('bot_id', params.bot_id);
355
+ if (params?.active !== undefined)
356
+ query.set('active', String(params.active));
357
+ if (params?.limit !== undefined)
358
+ query.set('limit', String(params.limit));
359
+ const qs = query.toString();
360
+ return this.request('GET', `/clones${qs ? '?' + qs : ''}`);
361
+ }
362
+ async getClone(id) {
363
+ return this.request('GET', `/clones/${enc(id)}`);
364
+ }
365
+ async cancelClone(id) {
366
+ await this.request('POST', `/clones/${enc(id)}/cancel`, undefined, { idempotent: false });
367
+ }
368
+ // --------------------------------------------------------------------------
369
+ // Threat
370
+ // --------------------------------------------------------------------------
371
+ async getThreat() {
372
+ return this.request('GET', '/threat');
373
+ }
374
+ // --------------------------------------------------------------------------
375
+ // Migration
376
+ // --------------------------------------------------------------------------
377
+ async migrate(req) {
378
+ return this.request('POST', '/migrate', req, { idempotent: false });
379
+ }
380
+ // --------------------------------------------------------------------------
381
+ // Catalog
382
+ // --------------------------------------------------------------------------
383
+ async getCatalog() {
384
+ return this.request('GET', '/catalog');
385
+ }
386
+ // --------------------------------------------------------------------------
387
+ // Balance
388
+ // --------------------------------------------------------------------------
389
+ async getBalance(address) {
390
+ const query = address ? `?address=${enc(address)}` : '';
391
+ return this.request('GET', `/balance${query}`);
392
+ }
393
+ }
394
+ // ============================================================================
395
+ // Helpers
396
+ // ============================================================================
397
+ function sleep(ms) {
398
+ return new Promise((resolve) => setTimeout(resolve, ms));
399
+ }
400
+ /** URL-encode a path segment */
401
+ function enc(s) {
402
+ return encodeURIComponent(s);
403
+ }
404
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/bunker/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Self-deployment — packages the agent and deploys to MoltBunker.
3
+ *
4
+ * Flow:
5
+ * 1. Pre-flight checks (BUNKER balance, no duplicate deployments)
6
+ * 2. Register bot on MoltBunker (or reuse existing)
7
+ * 3. Reserve runtime with requested tier/region
8
+ * 4. Deploy container with agent config as env vars
9
+ * 5. Enable cloning if configured
10
+ * 6. Health verification (poll until running + heartbeat in logs)
11
+ * 7. Persist state (bot_id, runtime_id, deployment_id, container_id)
12
+ *
13
+ * Edge cases:
14
+ * - Existing running container → return status instead of re-deploying
15
+ * - Bot already registered → reuse it
16
+ * - Partial failure (runtime reserved, deploy fails) → release runtime
17
+ * - Env var size limits → config is small enough to fit, state stays in container volume
18
+ */
19
+ import type { ClawtomatonConfig, ClawtomatonIdentity } from '../types.js';
20
+ import type { StateStore } from '../state/index.js';
21
+ import type { BunkerClient } from './client.js';
22
+ import type { BunkerRegion } from './types.js';
23
+ export interface SelfDeployResult {
24
+ botId: string;
25
+ runtimeId: string;
26
+ deploymentId: string;
27
+ containerId: string;
28
+ expiresAt: number;
29
+ region: BunkerRegion;
30
+ onionAddress: string | null;
31
+ }
32
+ export interface SelfDeployOptions {
33
+ /** Override docker image (default: ghcr.io/clawnch/clawtomaton:latest) */
34
+ image?: string;
35
+ /** Override runtime duration in hours */
36
+ durationHours?: number;
37
+ /** Override region */
38
+ region?: BunkerRegion;
39
+ /** Skip health verification (useful for testing) */
40
+ skipHealthCheck?: boolean;
41
+ }
42
+ /**
43
+ * Deploy this agent to MoltBunker. Handles the full lifecycle:
44
+ * bot registration → runtime reservation → container deployment → health check.
45
+ *
46
+ * Idempotent: if already deployed and running, returns existing state.
47
+ */
48
+ export declare function selfDeploy(client: BunkerClient, config: ClawtomatonConfig, identity: ClawtomatonIdentity, state: StateStore, opts?: SelfDeployOptions): Promise<SelfDeployResult>;
49
+ /**
50
+ * Stop the bunker deployment and clean up state.
51
+ * Does NOT delete the bot — it can be reused for future deployments.
52
+ */
53
+ export declare function stopDeploy(client: BunkerClient, state: StateStore): Promise<void>;
54
+ //# sourceMappingURL=self-deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-deploy.d.ts","sourceRoot":"","sources":["../../src/bunker/self-deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAEV,YAAY,EAMb,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,oDAAoD;IACpD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAcD;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE,iBAAiB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAsI3B;AAMD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CAsCf"}