@xian-tech/client 0.1.5 → 0.1.6

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.
@@ -0,0 +1,476 @@
1
+ import { parseXianNumber } from "./encoding.js";
2
+ import { TransportError, XianClientError } from "./errors.js";
3
+ const ALL_RELAY_KINDS = [
4
+ "shielded_note_relay_transfer",
5
+ "shielded_command"
6
+ ];
7
+ function stripTrailingSlash(value) {
8
+ return value.replace(/\/+$/, "");
9
+ }
10
+ function jsonBody(value) {
11
+ return JSON.stringify(value, (_key, entry) => typeof entry === "bigint" ? entry.toString() : entry);
12
+ }
13
+ function asRecord(value) {
14
+ if (typeof value !== "object" || value === null) {
15
+ throw new TransportError("expected object response");
16
+ }
17
+ return value;
18
+ }
19
+ function asArrayOfStrings(value) {
20
+ if (!Array.isArray(value)) {
21
+ return [];
22
+ }
23
+ return value.filter((item) => typeof item === "string");
24
+ }
25
+ function normalizeMaybeString(value) {
26
+ if (value == null) {
27
+ return null;
28
+ }
29
+ return typeof value === "string" ? value : String(value);
30
+ }
31
+ function normalizeMaybeInteger(value) {
32
+ if (typeof value === "number" && Number.isInteger(value)) {
33
+ return value;
34
+ }
35
+ if (typeof value === "string" && /^-?\d+$/.test(value)) {
36
+ return Number(value);
37
+ }
38
+ return null;
39
+ }
40
+ function normalizeMaybeXianNumber(value) {
41
+ if (typeof value === "number" || typeof value === "bigint") {
42
+ return value;
43
+ }
44
+ if (typeof value === "string" && /^-?\d+$/.test(value)) {
45
+ return parseXianNumber(value);
46
+ }
47
+ return null;
48
+ }
49
+ function normalizeRelayKind(value) {
50
+ return value === "shielded_command" ||
51
+ value === "shielded_note_relay_transfer"
52
+ ? value
53
+ : null;
54
+ }
55
+ function normalizeAuthScheme(value) {
56
+ return value === "bearer" ? "bearer" : "none";
57
+ }
58
+ function normalizeBool(value, fallback) {
59
+ return typeof value === "boolean" ? value : fallback;
60
+ }
61
+ function normalizePriority(value) {
62
+ const parsed = normalizeMaybeInteger(value);
63
+ return parsed !== null && parsed >= 0 ? parsed : 100;
64
+ }
65
+ function uniqueRelayKinds(values) {
66
+ if (!Array.isArray(values) || values.length === 0) {
67
+ return [...ALL_RELAY_KINDS];
68
+ }
69
+ const unique = new Set();
70
+ for (const value of values) {
71
+ const normalized = normalizeRelayKind(value);
72
+ if (normalized !== null) {
73
+ unique.add(normalized);
74
+ }
75
+ }
76
+ return unique.size > 0 ? [...unique] : [...ALL_RELAY_KINDS];
77
+ }
78
+ function copyRelayerEntry(entry) {
79
+ return {
80
+ ...entry,
81
+ submissionKinds: [...entry.submissionKinds]
82
+ };
83
+ }
84
+ export function normalizeShieldedRelayerCatalogEntry(entry, index = 0) {
85
+ const relayerUrl = stripTrailingSlash(typeof entry.relayerUrl === "string"
86
+ ? entry.relayerUrl
87
+ : typeof entry.baseUrl === "string"
88
+ ? entry.baseUrl
89
+ : "");
90
+ if (!relayerUrl) {
91
+ throw new XianClientError("shielded relayer entry must define relayerUrl or baseUrl");
92
+ }
93
+ const id = normalizeMaybeString(entry.id)?.trim() || `relayer-${index + 1}`;
94
+ const authToken = normalizeMaybeString(entry.authToken)?.trim() || undefined;
95
+ return {
96
+ id,
97
+ relayerUrl,
98
+ authToken,
99
+ authScheme: normalizeAuthScheme(entry.authScheme),
100
+ publicInfo: normalizeBool(entry.publicInfo, true),
101
+ publicQuote: normalizeBool(entry.publicQuote, false),
102
+ publicJobLookup: normalizeBool(entry.publicJobLookup, false),
103
+ priority: normalizePriority(entry.priority),
104
+ submissionKinds: uniqueRelayKinds(entry.submissionKinds)
105
+ };
106
+ }
107
+ export function sortShieldedRelayerCatalog(entries) {
108
+ const normalized = entries.map((entry, index) => normalizeShieldedRelayerCatalogEntry(entry, index));
109
+ normalized.sort((left, right) => {
110
+ if (left.priority !== right.priority) {
111
+ return left.priority - right.priority;
112
+ }
113
+ if (left.id !== right.id) {
114
+ return left.id.localeCompare(right.id);
115
+ }
116
+ return left.relayerUrl.localeCompare(right.relayerUrl);
117
+ });
118
+ const seen = new Set();
119
+ for (const entry of normalized) {
120
+ if (seen.has(entry.id)) {
121
+ throw new XianClientError(`duplicate shielded relayer id: ${entry.id}`);
122
+ }
123
+ seen.add(entry.id);
124
+ }
125
+ return normalized;
126
+ }
127
+ function buildAggregateTransportError(action, failures) {
128
+ const detail = failures
129
+ .map(({ relayer, error }) => {
130
+ const message = error instanceof Error ? error.message : String(error);
131
+ return `${relayer.id}: ${message}`;
132
+ })
133
+ .join("; ");
134
+ return new TransportError(`${action} failed for all candidate relayers: ${detail}`);
135
+ }
136
+ function relayerSupportsKind(relayer, kind) {
137
+ return relayer.submissionKinds.includes(kind);
138
+ }
139
+ function normalizeSignedTransaction(value) {
140
+ if (typeof value !== "object" || value === null) {
141
+ return undefined;
142
+ }
143
+ const raw = value;
144
+ const payload = typeof raw.payload === "object" && raw.payload !== null
145
+ ? raw.payload
146
+ : null;
147
+ const metadata = typeof raw.metadata === "object" && raw.metadata !== null
148
+ ? raw.metadata
149
+ : null;
150
+ if (payload == null || metadata == null) {
151
+ return undefined;
152
+ }
153
+ return { payload, metadata };
154
+ }
155
+ function normalizeReceipt(value) {
156
+ if (typeof value !== "object" || value === null) {
157
+ return null;
158
+ }
159
+ const raw = value;
160
+ const txHash = normalizeMaybeString(raw.tx_hash ?? raw.txHash) ?? undefined;
161
+ return {
162
+ success: Boolean(raw.success),
163
+ txHash,
164
+ message: raw.message,
165
+ response: asRecord(raw.raw ?? raw.response ?? raw),
166
+ transaction: normalizeSignedTransaction(raw.transaction),
167
+ execution: raw.execution
168
+ };
169
+ }
170
+ function normalizeSubmission(value) {
171
+ if (typeof value !== "object" || value === null) {
172
+ return null;
173
+ }
174
+ const raw = value;
175
+ const modeValue = normalizeMaybeString(raw.mode);
176
+ const mode = modeValue === "async" || modeValue === "commit" || modeValue === "checktx"
177
+ ? modeValue
178
+ : "checktx";
179
+ const nonce = normalizeMaybeXianNumber(raw.nonce) ?? 0;
180
+ const chiSupplied = normalizeMaybeXianNumber(raw.chi_supplied ?? raw.chiSupplied) ?? 0;
181
+ const chiEstimated = normalizeMaybeInteger(raw.chi_estimated ?? raw.chiEstimated) ?? undefined;
182
+ return {
183
+ submitted: Boolean(raw.submitted),
184
+ accepted: typeof raw.accepted === "boolean" || raw.accepted == null
185
+ ? raw.accepted
186
+ : null,
187
+ finalized: Boolean(raw.finalized),
188
+ txHash: normalizeMaybeString(raw.tx_hash ?? raw.txHash) ?? undefined,
189
+ message: raw.message,
190
+ mode,
191
+ nonce,
192
+ chiSupplied,
193
+ chiEstimated,
194
+ response: asRecord(raw.response ?? raw),
195
+ receipt: normalizeReceipt(raw.receipt) ?? undefined
196
+ };
197
+ }
198
+ export class XianShieldedRelayerClient {
199
+ relayerUrl;
200
+ authToken;
201
+ fetchFn;
202
+ constructor(options) {
203
+ this.relayerUrl = stripTrailingSlash(options.relayerUrl);
204
+ this.authToken = options.authToken?.trim() || undefined;
205
+ this.fetchFn = options.fetchFn ?? globalThis.fetch.bind(globalThis);
206
+ }
207
+ async requestJson(method, path, body) {
208
+ const headers = {
209
+ accept: "application/json"
210
+ };
211
+ let payload;
212
+ if (body !== undefined) {
213
+ headers["content-type"] = "application/json";
214
+ payload = jsonBody(body);
215
+ }
216
+ if (this.authToken) {
217
+ headers.authorization = `Bearer ${this.authToken}`;
218
+ }
219
+ let response;
220
+ try {
221
+ response = await this.fetchFn(`${this.relayerUrl}${path}`, {
222
+ method,
223
+ headers,
224
+ body: payload
225
+ });
226
+ }
227
+ catch (error) {
228
+ throw new TransportError(`request failed for ${this.relayerUrl}${path}`, { cause: error });
229
+ }
230
+ let decoded;
231
+ try {
232
+ decoded = await response.json();
233
+ }
234
+ catch (error) {
235
+ throw new TransportError(`invalid JSON response from ${this.relayerUrl}${path}`, { cause: error });
236
+ }
237
+ const record = asRecord(decoded);
238
+ if (!response.ok) {
239
+ const message = normalizeMaybeString(record.error) ?? `relayer request failed with status ${response.status}`;
240
+ throw new TransportError(message);
241
+ }
242
+ return record;
243
+ }
244
+ async getInfo() {
245
+ const raw = await this.requestJson("GET", "/v1/info");
246
+ const policy = asRecord(raw.policy ?? {});
247
+ return {
248
+ service: normalizeMaybeString(raw.service) ?? "xian-shielded-relayer",
249
+ protocolVersion: normalizeMaybeString(raw.protocol_version) ?? "v1",
250
+ available: Boolean(raw.available),
251
+ chainId: normalizeMaybeString(raw.chain_id),
252
+ relayerAccount: normalizeMaybeString(raw.relayer_account),
253
+ submissionMode: raw.submission_mode === "async" ||
254
+ raw.submission_mode === "commit" ||
255
+ raw.submission_mode === "checktx"
256
+ ? raw.submission_mode
257
+ : "checktx",
258
+ waitForTx: Boolean(raw.wait_for_tx),
259
+ capabilities: typeof raw.capabilities === "object" && raw.capabilities !== null
260
+ ? Object.fromEntries(Object.entries(raw.capabilities).map(([key, value]) => [key, Boolean(value)]))
261
+ : {},
262
+ policy: {
263
+ quoteTtlSeconds: normalizeMaybeInteger(policy.quote_ttl_seconds) ?? 0,
264
+ defaultExpirySeconds: normalizeMaybeInteger(policy.default_expiry_seconds) ?? 0,
265
+ maxExpirySeconds: normalizeMaybeInteger(policy.max_expiry_seconds) ?? 0,
266
+ minNoteRelayerFee: normalizeMaybeXianNumber(policy.min_note_relayer_fee) ?? 0,
267
+ minCommandRelayerFee: normalizeMaybeXianNumber(policy.min_command_relayer_fee) ?? 0,
268
+ allowedNoteContracts: asArrayOfStrings(policy.allowed_note_contracts),
269
+ allowedCommandContracts: asArrayOfStrings(policy.allowed_command_contracts),
270
+ allowedCommandTargets: asArrayOfStrings(policy.allowed_command_targets)
271
+ },
272
+ raw
273
+ };
274
+ }
275
+ async getQuote(request) {
276
+ const raw = await this.requestJson("POST", "/v1/quote", {
277
+ kind: request.kind,
278
+ contract: request.contract,
279
+ target_contract: request.targetContract,
280
+ requested_relayer_fee: request.requestedRelayerFee,
281
+ requested_expires_in_seconds: request.requestedExpiresInSeconds
282
+ });
283
+ return {
284
+ kind: raw.kind === "shielded_command"
285
+ ? "shielded_command"
286
+ : "shielded_note_relay_transfer",
287
+ contract: normalizeMaybeString(raw.contract) ?? "",
288
+ targetContract: normalizeMaybeString(raw.target_contract),
289
+ chainId: normalizeMaybeString(raw.chain_id),
290
+ relayerAccount: normalizeMaybeString(raw.relayer_account),
291
+ relayerFee: normalizeMaybeXianNumber(raw.relayer_fee) ?? 0,
292
+ expiresAt: normalizeMaybeString(raw.expires_at),
293
+ issuedAt: normalizeMaybeString(raw.issued_at),
294
+ policyVersion: normalizeMaybeString(raw.policy_version),
295
+ raw
296
+ };
297
+ }
298
+ async submitShieldedNoteRelayTransfer(request) {
299
+ const raw = await this.requestJson("POST", "/v1/jobs/shielded-note-transfer", {
300
+ contract: request.contract,
301
+ old_root: request.oldRoot,
302
+ input_nullifiers: request.inputNullifiers,
303
+ output_commitments: request.outputCommitments,
304
+ proof_hex: request.proofHex,
305
+ relayer_fee: request.relayerFee,
306
+ expires_at: request.expiresAt ?? null,
307
+ output_payloads: request.outputPayloads ?? [],
308
+ client_request_id: request.clientRequestId
309
+ });
310
+ return this.normalizeJob(raw);
311
+ }
312
+ async submitShieldedCommand(request) {
313
+ const raw = await this.requestJson("POST", "/v1/jobs/shielded-command", {
314
+ contract: request.contract,
315
+ target_contract: request.targetContract,
316
+ old_root: request.oldRoot,
317
+ input_nullifiers: request.inputNullifiers,
318
+ output_commitments: request.outputCommitments,
319
+ proof_hex: request.proofHex,
320
+ relayer_fee: request.relayerFee,
321
+ public_amount: request.publicAmount ?? 0,
322
+ payload: request.payload ?? null,
323
+ expires_at: request.expiresAt ?? null,
324
+ output_payloads: request.outputPayloads ?? [],
325
+ client_request_id: request.clientRequestId
326
+ });
327
+ return this.normalizeJob(raw);
328
+ }
329
+ async getJob(jobId) {
330
+ const raw = await this.requestJson("GET", `/v1/jobs/${encodeURIComponent(jobId)}`);
331
+ return this.normalizeJob(raw);
332
+ }
333
+ normalizeJob(raw) {
334
+ return {
335
+ jobId: normalizeMaybeString(raw.job_id) ?? "",
336
+ kind: raw.kind === "shielded_command"
337
+ ? "shielded_command"
338
+ : "shielded_note_relay_transfer",
339
+ status: normalizeMaybeString(raw.status) ?? "unknown",
340
+ chainId: normalizeMaybeString(raw.chain_id),
341
+ relayerAccount: normalizeMaybeString(raw.relayer_account),
342
+ contract: normalizeMaybeString(raw.contract),
343
+ functionName: normalizeMaybeString(raw.function_name),
344
+ txHash: normalizeMaybeString(raw.tx_hash),
345
+ submittedAt: normalizeMaybeString(raw.submitted_at),
346
+ updatedAt: normalizeMaybeString(raw.updated_at),
347
+ error: normalizeMaybeString(raw.error),
348
+ submission: normalizeSubmission(raw.submission),
349
+ raw
350
+ };
351
+ }
352
+ }
353
+ export class XianShieldedRelayerPoolClient {
354
+ relayers;
355
+ clients;
356
+ constructor(options) {
357
+ this.relayers = sortShieldedRelayerCatalog(options.relayers);
358
+ if (this.relayers.length === 0) {
359
+ throw new XianClientError("shielded relayer pool requires at least one configured relayer");
360
+ }
361
+ this.clients = new Map(this.relayers.map((relayer) => [
362
+ relayer.id,
363
+ new XianShieldedRelayerClient({
364
+ relayerUrl: relayer.relayerUrl,
365
+ authToken: relayer.authToken,
366
+ fetchFn: options.fetchFn
367
+ })
368
+ ]));
369
+ }
370
+ listRelayers(kind) {
371
+ const relayers = kind == null
372
+ ? this.relayers
373
+ : this.relayers.filter((relayer) => relayerSupportsKind(relayer, kind));
374
+ return relayers.map(copyRelayerEntry);
375
+ }
376
+ getClient(relayerId) {
377
+ const client = this.clients.get(relayerId);
378
+ if (client == null) {
379
+ throw new XianClientError(`unknown shielded relayer id: ${relayerId}`);
380
+ }
381
+ return client;
382
+ }
383
+ async getInfo(options = {}) {
384
+ const candidates = this.selectCandidates(undefined, options);
385
+ return this.resolveWithFailover("getInfo", candidates, async (relayer) => ({
386
+ relayer,
387
+ info: await this.getClient(relayer.id).getInfo()
388
+ }));
389
+ }
390
+ async getQuote(request, options = {}) {
391
+ const candidates = this.selectCandidates(request.kind, options);
392
+ return this.resolveWithFailover("getQuote", candidates, async (relayer) => ({
393
+ relayer,
394
+ quote: await this.getClient(relayer.id).getQuote(request)
395
+ }));
396
+ }
397
+ async submitShieldedNoteRelayTransfer(request, options = {}) {
398
+ const relayer = this.resolveSubmissionRelayer("submitShieldedNoteRelayTransfer", "shielded_note_relay_transfer", options);
399
+ return {
400
+ relayer,
401
+ job: await this.getClient(relayer.id).submitShieldedNoteRelayTransfer(request)
402
+ };
403
+ }
404
+ async submitShieldedCommand(request, options = {}) {
405
+ const relayer = this.resolveSubmissionRelayer("submitShieldedCommand", "shielded_command", options);
406
+ return {
407
+ relayer,
408
+ job: await this.getClient(relayer.id).submitShieldedCommand(request)
409
+ };
410
+ }
411
+ async getJob(jobId, options = {}) {
412
+ const relayer = this.resolveJobRelayer("getJob", options);
413
+ return {
414
+ relayer,
415
+ job: await this.getClient(relayer.id).getJob(jobId)
416
+ };
417
+ }
418
+ selectCandidates(kind, options = {}) {
419
+ if (options.relayerId != null) {
420
+ const relayer = this.lookupRelayer(options.relayerId);
421
+ if (kind != null && !relayerSupportsKind(relayer, kind)) {
422
+ throw new XianClientError(`shielded relayer ${relayer.id} does not support ${kind}`);
423
+ }
424
+ return [relayer];
425
+ }
426
+ const relayers = kind == null
427
+ ? this.relayers
428
+ : this.relayers.filter((relayer) => relayerSupportsKind(relayer, kind));
429
+ if (relayers.length === 0) {
430
+ throw new XianClientError(kind == null
431
+ ? "no shielded relayers are configured"
432
+ : `no shielded relayers are configured for ${kind}`);
433
+ }
434
+ return relayers;
435
+ }
436
+ resolveSubmissionRelayer(action, kind, options) {
437
+ const candidates = this.selectCandidates(kind, options);
438
+ if (options.relayerId != null || candidates.length === 1) {
439
+ const [relayer] = candidates;
440
+ if (relayer != null) {
441
+ return relayer;
442
+ }
443
+ }
444
+ throw new XianClientError(`${action} requires relayerId when multiple shielded relayers are configured`);
445
+ }
446
+ resolveJobRelayer(action, options) {
447
+ const candidates = this.selectCandidates(undefined, options);
448
+ if (options.relayerId != null || candidates.length === 1) {
449
+ const [relayer] = candidates;
450
+ if (relayer != null) {
451
+ return relayer;
452
+ }
453
+ }
454
+ throw new XianClientError(`${action} requires relayerId when multiple shielded relayers are configured`);
455
+ }
456
+ lookupRelayer(relayerId) {
457
+ const relayer = this.relayers.find((entry) => entry.id === relayerId);
458
+ if (relayer == null) {
459
+ throw new XianClientError(`unknown shielded relayer id: ${relayerId}`);
460
+ }
461
+ return relayer;
462
+ }
463
+ async resolveWithFailover(action, candidates, fn) {
464
+ const failures = [];
465
+ for (const relayer of candidates) {
466
+ try {
467
+ return await fn(relayer);
468
+ }
469
+ catch (error) {
470
+ failures.push({ relayer, error });
471
+ }
472
+ }
473
+ throw buildAggregateTransportError(action, failures);
474
+ }
475
+ }
476
+ //# sourceMappingURL=relayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayer.js","sourceRoot":"","sources":["../src/relayer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function shieldedSyncHintFromViewingPublicKey(viewingPublicKey: string): string;
2
+ export declare function shieldedSyncHintFromViewingPrivateKey(viewingPrivateKey: string): string;
3
+ //# sourceMappingURL=shielded.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shielded.d.ts","sourceRoot":"","sources":["../src/shielded.ts"],"names":[],"mappings":"AAeA,wBAAgB,oCAAoC,CAClD,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAKR;AAED,wBAAgB,qCAAqC,CACnD,iBAAiB,EAAE,MAAM,GACxB,MAAM,CAIR"}
@@ -0,0 +1,19 @@
1
+ import { sha3_256 } from "@noble/hashes/sha3";
2
+ import { bytesToHex, hexToBytes, utf8ToBytes } from "./encoding.js";
3
+ import { publicKeyFromPrivateKey } from "./ed25519.js";
4
+ const SYNC_HINT_PREFIX = utf8ToBytes("xian-zk-note-sync-v1");
5
+ const SYNC_HINT_BYTES = 12;
6
+ function concatBytes(left, right) {
7
+ const out = new Uint8Array(left.length + right.length);
8
+ out.set(left, 0);
9
+ out.set(right, left.length);
10
+ return out;
11
+ }
12
+ export function shieldedSyncHintFromViewingPublicKey(viewingPublicKey) {
13
+ const digest = sha3_256(concatBytes(SYNC_HINT_PREFIX, hexToBytes(viewingPublicKey)));
14
+ return `0x${bytesToHex(digest.slice(0, SYNC_HINT_BYTES))}`;
15
+ }
16
+ export function shieldedSyncHintFromViewingPrivateKey(viewingPrivateKey) {
17
+ return shieldedSyncHintFromViewingPublicKey(publicKeyFromPrivateKey(viewingPrivateKey));
18
+ }
19
+ //# sourceMappingURL=shielded.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shielded.js","sourceRoot":"","sources":["../src/shielded.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,gBAAgB,GAAG,WAAW,CAAC,sBAAsB,CAAC,CAAC;AAC7D,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,SAAS,WAAW,CAAC,IAAgB,EAAE,KAAiB;IACtD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjB,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oCAAoC,CAClD,gBAAwB;IAExB,MAAM,MAAM,GAAG,QAAQ,CACrB,WAAW,CAAC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAC5D,CAAC;IACF,OAAO,KAAK,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,iBAAyB;IAEzB,OAAO,oCAAoC,CACzC,uBAAuB,CAAC,iBAAiB,CAAC,CAC3C,CAAC;AACJ,CAAC"}