@agenticprimitives/agent-naming 0.1.0-alpha.2

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 (54) hide show
  1. package/AUDIT.md +86 -0
  2. package/CLAUDE.md +180 -0
  3. package/LICENSE +21 -0
  4. package/README.md +158 -0
  5. package/dist/abis.d.ts +1532 -0
  6. package/dist/abis.d.ts.map +1 -0
  7. package/dist/abis.js +417 -0
  8. package/dist/abis.js.map +1 -0
  9. package/dist/client.d.ts +102 -0
  10. package/dist/client.d.ts.map +1 -0
  11. package/dist/client.js +299 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/constants.d.ts +8 -0
  14. package/dist/constants.d.ts.map +1 -0
  15. package/dist/constants.js +7 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/custody.d.ts +133 -0
  18. package/dist/custody.d.ts.map +1 -0
  19. package/dist/custody.js +214 -0
  20. package/dist/custody.js.map +1 -0
  21. package/dist/errors.d.ts +15 -0
  22. package/dist/errors.d.ts.map +1 -0
  23. package/dist/errors.js +30 -0
  24. package/dist/errors.js.map +1 -0
  25. package/dist/index.d.ts +10 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +22 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/namehash.d.ts +31 -0
  30. package/dist/namehash.d.ts.map +1 -0
  31. package/dist/namehash.js +46 -0
  32. package/dist/namehash.js.map +1 -0
  33. package/dist/normalize.d.ts +28 -0
  34. package/dist/normalize.d.ts.map +1 -0
  35. package/dist/normalize.js +68 -0
  36. package/dist/normalize.js.map +1 -0
  37. package/dist/records.d.ts +88 -0
  38. package/dist/records.d.ts.map +1 -0
  39. package/dist/records.js +193 -0
  40. package/dist/records.js.map +1 -0
  41. package/dist/types.d.ts +117 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +2 -0
  44. package/dist/types.js.map +1 -0
  45. package/docs/api.md +110 -0
  46. package/docs/concepts.md +159 -0
  47. package/docs/migration.md +93 -0
  48. package/docs/security.md +127 -0
  49. package/docs/troubleshooting.md +116 -0
  50. package/examples/basic.ts +31 -0
  51. package/examples/custody-rotation.ts +44 -0
  52. package/examples/records.ts +41 -0
  53. package/package.json +71 -0
  54. package/spec.md +14 -0
package/dist/client.js ADDED
@@ -0,0 +1,299 @@
1
+ import { createPublicClient, http } from 'viem';
2
+ import { agentNameAttributeResolverAbi, agentNameRegistryAbi, agentNameUniversalResolverAbi, } from './abis';
3
+ import { PREDICATE_ID, decodeRecords, } from './records';
4
+ import { buildRegisterSubnameCall, buildRecordCalls, buildSetPrimaryNameCall, buildSetSubregistryCall, } from './custody';
5
+ import { namehash, ZERO_NODE } from './namehash';
6
+ /**
7
+ * Read + write client for the Agent Naming Service.
8
+ *
9
+ * Phase 2 lands the read paths (resolveName / reverseResolve /
10
+ * getRecords) against the live AgentNameUniversalResolver +
11
+ * AgentNameAttributeResolver. Write methods still throw `NS Phase 4`
12
+ * — they need ERC-1271 auth + the agent-naming/custody call builders.
13
+ *
14
+ * Round-trip discipline (security invariant from spec § 10):
15
+ * `reverseResolve(agent)` returns a name ONLY when the on-chain
16
+ * `resolveName(name) === agent`. The universal resolver enforces this
17
+ * on chain and returns the full dotted name in a single view call.
18
+ *
19
+ * NO-FALLBACK DOCTRINE (ADR-0012 + ADR-0013): every read here is one
20
+ * `readContract`. There is NO `eth_getLogs` walk, no "try fast path then
21
+ * fall back to log scan." If the resolver has no answer, the read returns
22
+ * null/empty — it does not reach for an alternative path.
23
+ */
24
+ export class AgentNamingClient {
25
+ opts;
26
+ publicClient;
27
+ constructor(opts) {
28
+ this.opts = opts;
29
+ if (!opts.rpcUrl)
30
+ throw new Error('[agent-naming] rpcUrl required');
31
+ if (!opts.registry)
32
+ throw new Error('[agent-naming] registry address required');
33
+ if (!opts.universalResolver) {
34
+ throw new Error('[agent-naming] universalResolver address required');
35
+ }
36
+ this.publicClient = createPublicClient({ transport: http(opts.rpcUrl) });
37
+ }
38
+ // ─── Reads (Phase 2 — live) ─────────────────────────────────────
39
+ /**
40
+ * Resolve an agent name to its forward-record address. Returns
41
+ * `null` when the name is unregistered OR no `addr` record is set.
42
+ *
43
+ * Reads via `UniversalResolver.resolveName(node)` which:
44
+ * 1. Tries `resolver.getAddress(node, ATL_ADDR)`.
45
+ * 2. Falls back to `registry.owner(node)` if no resolver-addr set.
46
+ */
47
+ async resolveName(name) {
48
+ const node = namehash(name);
49
+ if (node === ZERO_NODE)
50
+ return null;
51
+ const addr = await this.publicClient.readContract({
52
+ address: this.opts.universalResolver,
53
+ abi: agentNameUniversalResolverAbi,
54
+ functionName: 'resolveName',
55
+ args: [node],
56
+ });
57
+ if (addr === '0x0000000000000000000000000000000000000000')
58
+ return null;
59
+ return addr;
60
+ }
61
+ /**
62
+ * Reverse-resolve a Smart Agent address to its primary name string.
63
+ * Returns `null` when no primary name is set OR the round-trip
64
+ * check fails on chain (squat protection).
65
+ *
66
+ * Single on-chain read: `reverseResolveString` returns the full
67
+ * dotted name; the resolver concatenates ancestor labels via view
68
+ * calls. No SDK-side log walk, no fallback path (ADR-0013).
69
+ */
70
+ async reverseResolve(agent) {
71
+ const fullName = (await this.publicClient.readContract({
72
+ address: this.opts.universalResolver,
73
+ abi: agentNameUniversalResolverAbi,
74
+ functionName: 'reverseResolveString',
75
+ args: [agent],
76
+ }));
77
+ return fullName && fullName.length > 0 ? fullName : null;
78
+ }
79
+ /**
80
+ * Read the full typed record bundle for a name. Returns an empty
81
+ * bundle when the name has no resolver / no records set.
82
+ */
83
+ async getRecords(name) {
84
+ const node = namehash(name);
85
+ if (node === ZERO_NODE)
86
+ return {};
87
+ // Read the resolver address from the registry; if none, return empty.
88
+ const resolverAddr = await this.publicClient.readContract({
89
+ address: this.opts.registry,
90
+ abi: agentNameRegistryAbi,
91
+ functionName: 'resolver',
92
+ args: [node],
93
+ });
94
+ if (resolverAddr === '0x0000000000000000000000000000000000000000')
95
+ return {};
96
+ // String predicates batched through the universal resolver
97
+ // (single multi-call for everything that's stored as string).
98
+ const stringPreds = [
99
+ PREDICATE_ID.displayName,
100
+ PREDICATE_ID.a2aEndpoint,
101
+ PREDICATE_ID.mcpEndpoint,
102
+ PREDICATE_ID.metadataUri,
103
+ PREDICATE_ID.nativeId,
104
+ ];
105
+ const stringValues = await this.publicClient.readContract({
106
+ address: this.opts.universalResolver,
107
+ abi: agentNameUniversalResolverAbi,
108
+ functionName: 'resolveStringBatch',
109
+ args: [node, stringPreds],
110
+ });
111
+ // Address + bytes32 predicates — direct getter calls against the
112
+ // resolver (no batch path on chain yet; per-call is cheap for the
113
+ // small constant set we have).
114
+ const [addr, custodyPolicy] = await Promise.all([
115
+ this.publicClient.readContract({
116
+ address: resolverAddr,
117
+ abi: agentNameAttributeResolverAbi,
118
+ functionName: 'getAddress',
119
+ args: [node, PREDICATE_ID.addr],
120
+ }),
121
+ this.publicClient.readContract({
122
+ address: resolverAddr,
123
+ abi: agentNameAttributeResolverAbi,
124
+ functionName: 'getAddress',
125
+ args: [node, PREDICATE_ID.custodyPolicy],
126
+ }),
127
+ ]);
128
+ const [agentKind, metadataHash, passkeyDigest] = await Promise.all([
129
+ this.publicClient.readContract({
130
+ address: resolverAddr,
131
+ abi: agentNameAttributeResolverAbi,
132
+ functionName: 'getBytes32',
133
+ args: [node, PREDICATE_ID.agentKind],
134
+ }),
135
+ this.publicClient.readContract({
136
+ address: resolverAddr,
137
+ abi: agentNameAttributeResolverAbi,
138
+ functionName: 'getBytes32',
139
+ args: [node, PREDICATE_ID.metadataHash],
140
+ }),
141
+ this.publicClient.readContract({
142
+ address: resolverAddr,
143
+ abi: agentNameAttributeResolverAbi,
144
+ functionName: 'getBytes32',
145
+ args: [node, PREDICATE_ID.passkeyCredentialDigest],
146
+ }),
147
+ ]);
148
+ const input = { strings: {}, addresses: {}, bytes32s: {} };
149
+ input.strings[PREDICATE_ID.displayName] = stringValues[0];
150
+ input.strings[PREDICATE_ID.a2aEndpoint] = stringValues[1];
151
+ input.strings[PREDICATE_ID.mcpEndpoint] = stringValues[2];
152
+ input.strings[PREDICATE_ID.metadataUri] = stringValues[3];
153
+ input.strings[PREDICATE_ID.nativeId] = stringValues[4];
154
+ if (addr !== '0x0000000000000000000000000000000000000000') {
155
+ input.addresses[PREDICATE_ID.addr] = addr;
156
+ }
157
+ if (custodyPolicy !== '0x0000000000000000000000000000000000000000') {
158
+ input.addresses[PREDICATE_ID.custodyPolicy] = custodyPolicy;
159
+ }
160
+ if (agentKind !== ZERO_NODE)
161
+ input.bytes32s[PREDICATE_ID.agentKind] = agentKind;
162
+ if (metadataHash !== ZERO_NODE)
163
+ input.bytes32s[PREDICATE_ID.metadataHash] = metadataHash;
164
+ if (passkeyDigest !== ZERO_NODE)
165
+ input.bytes32s[PREDICATE_ID.passkeyCredentialDigest] = passkeyDigest;
166
+ return decodeRecords(input);
167
+ }
168
+ // ─── Writes (Phase 4 — live) ─────────────────────────────────────
169
+ /**
170
+ * Register `<label>.<parent>` under the parent namespace. The
171
+ * provided `walletClient`'s account MUST be authorized to register
172
+ * children under `parent` (either direct owner OR subregistry
173
+ * delegate). Returns the registration tx hash; the new child node
174
+ * can be computed off-chain as
175
+ * `keccak256(parentNode || keccak256(label))` — equal to
176
+ * `namehash(label + '.' + parentName)`.
177
+ *
178
+ * For PSA-controlled registrations (where the parent's owner is a
179
+ * Smart Agent gated by CustodyPolicy), use the builders in
180
+ * `./custody` directly and compose them into the appropriate
181
+ * AgentAccount.execute / CustodyPolicy ceremony instead.
182
+ */
183
+ async registerSubname(input, ctx) {
184
+ const parentNode = namehash(input.parent);
185
+ const call = buildRegisterSubnameCall({
186
+ registry: this.opts.registry,
187
+ parentNode,
188
+ label: input.label,
189
+ newOwner: input.owner,
190
+ resolver: input.resolver,
191
+ });
192
+ const hash = await this._submit(ctx, call);
193
+ if (input.initialRecords) {
194
+ // Compute the new child node off-chain so we don't have to
195
+ // re-read against a possibly-lagging RPC.
196
+ const childNode = namehash(`${input.label}.${input.parent}`);
197
+ const resolver = input.resolver ?? this.opts.universalResolver; // best-effort default
198
+ const calls = buildRecordCalls({ resolver, node: childNode, records: input.initialRecords });
199
+ for (const c of calls)
200
+ await this._submit(ctx, c);
201
+ }
202
+ return hash;
203
+ }
204
+ /**
205
+ * Set the caller's primary name (reverse record). The wallet
206
+ * client's account MUST equal `input.agent` — the contract enforces
207
+ * `msg.sender == agent` (i.e. an agent sets its OWN primary name;
208
+ * authority over reverse records is per-account by construction).
209
+ */
210
+ async setPrimaryName(input, ctx) {
211
+ const node = namehash(input.name);
212
+ const call = buildSetPrimaryNameCall({ registry: this.opts.registry, node });
213
+ return await this._submit(ctx, call);
214
+ }
215
+ /**
216
+ * Write the typed record bundle for `input.name`. The
217
+ * `walletClient`'s account MUST be the current name owner
218
+ * (`REGISTRY.owner(node) == msg.sender`). Returns one tx hash per
219
+ * record set — the caller may parallelize submission via a multi-call
220
+ * upstream if/when one becomes available.
221
+ */
222
+ async setAgentRecords(input, ctx) {
223
+ const node = namehash(input.name);
224
+ // Resolve the resolver address for this name via the registry.
225
+ const resolverAddr = await this.publicClient.readContract({
226
+ address: this.opts.registry,
227
+ abi: agentNameRegistryAbi,
228
+ functionName: 'resolver',
229
+ args: [node],
230
+ });
231
+ if (resolverAddr === '0x0000000000000000000000000000000000000000') {
232
+ throw new Error(`[agent-naming] no resolver set for "${input.name}"; install one via setResolver first`);
233
+ }
234
+ const calls = buildRecordCalls({
235
+ resolver: resolverAddr,
236
+ node,
237
+ records: input.records,
238
+ });
239
+ const hashes = [];
240
+ for (const c of calls)
241
+ hashes.push(await this._submit(ctx, c));
242
+ return hashes;
243
+ }
244
+ /**
245
+ * Delegate child-name issuance authority for the subtree at
246
+ * `input.name` to a subregistry contract. The wallet client's
247
+ * account MUST be the current name owner.
248
+ */
249
+ async setSubregistry(input, ctx) {
250
+ const node = namehash(input.name);
251
+ const call = buildSetSubregistryCall({
252
+ registry: this.opts.registry,
253
+ node,
254
+ subregistry: input.subregistry,
255
+ });
256
+ return await this._submit(ctx, call);
257
+ }
258
+ /**
259
+ * Submit a single ContractCall via the bound walletClient. Uses
260
+ * explicit nonce fetch + retry on "replacement underpriced" to
261
+ * tolerate Base Sepolia's read-after-write lag.
262
+ */
263
+ async _submit(ctx, call) {
264
+ const { walletClient } = ctx;
265
+ const account = walletClient.account;
266
+ if (!account)
267
+ throw new Error('[agent-naming] walletClient has no account; cannot sign tx');
268
+ let lastErr;
269
+ for (let attempt = 0; attempt < 3; attempt++) {
270
+ try {
271
+ const nonce = await this.publicClient.getTransactionCount({
272
+ address: account.address,
273
+ blockTag: 'pending',
274
+ });
275
+ const hash = await walletClient.sendTransaction({
276
+ to: call.to,
277
+ value: call.value,
278
+ data: call.data,
279
+ nonce,
280
+ account: walletClient.account,
281
+ chain: walletClient.chain ?? null,
282
+ });
283
+ await this.publicClient.waitForTransactionReceipt({ hash });
284
+ return hash;
285
+ }
286
+ catch (err) {
287
+ lastErr = err;
288
+ const msg = err.message ?? '';
289
+ if (msg.includes('replacement') || msg.includes('underpriced')) {
290
+ await new Promise((r) => setTimeout(r, 2000));
291
+ continue;
292
+ }
293
+ throw err;
294
+ }
295
+ }
296
+ throw lastErr instanceof Error ? lastErr : new Error('[agent-naming] _submit: exceeded retries');
297
+ }
298
+ }
299
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The TLD for Smart Agent names. Phase 1 ships `.agent` only; the
3
+ * underlying registry contract is multi-root, but the package surface
4
+ * restricts to `.agent` until additional TLDs are spec'd.
5
+ */
6
+ export declare const AGENT_TLD: "agent";
7
+ export type AgentTld = typeof AGENT_TLD;
8
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAG,OAAgB,CAAC;AAC1C,MAAM,MAAM,QAAQ,GAAG,OAAO,SAAS,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The TLD for Smart Agent names. Phase 1 ships `.agent` only; the
3
+ * underlying registry contract is multi-root, but the package surface
4
+ * restricts to `.agent` until additional TLDs are spec'd.
5
+ */
6
+ export const AGENT_TLD = 'agent';
7
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,OAAgB,CAAC"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Subpath `@agenticprimitives/agent-naming/custody`.
3
+ *
4
+ * Pure encoded call builders for name-registry + resolver writes.
5
+ * Compose these into a custody ceremony, a direct EOA tx, an
6
+ * ERC-4337 UserOp, or anything else that submits a transaction.
7
+ * The package boundary (spec 215 § 3) prohibits importing
8
+ * `@agenticprimitives/account-custody` from here — these builders MUST stay
9
+ * pure encode-only.
10
+ *
11
+ * Each builder returns a `ContractCall` shape (`{ to, value, data }`)
12
+ * matching the standard "compose-then-submit" pattern used across
13
+ * other agenticprimitives packages.
14
+ *
15
+ * Phase 4 lands the encoders; the client (`AgentNamingClient`) layers
16
+ * walletClient submission on top.
17
+ */
18
+ import type { Address, Hex } from '@agenticprimitives/types';
19
+ import { type EncodedRecord } from './records';
20
+ /** Minimal call-shape: the standard `{ to, value, data }` triple. */
21
+ export interface ContractCall {
22
+ to: Address;
23
+ value: bigint;
24
+ data: Hex;
25
+ }
26
+ /**
27
+ * Build a call to register `<label>.<parent>` under the parent
28
+ * namespace. Caller MUST be the parent's owner OR subregistry
29
+ * delegate (msg.sender check on chain).
30
+ */
31
+ export declare function buildRegisterSubnameCall(args: {
32
+ registry: Address;
33
+ parentNode: Hex;
34
+ label: string;
35
+ newOwner: Address;
36
+ resolver?: Address;
37
+ expiry?: bigint;
38
+ }): ContractCall;
39
+ /**
40
+ * Build a call to rotate the owner Smart Agent for a name.
41
+ * Caller MUST be the current owner.
42
+ */
43
+ export declare function buildRotateNameOwnerCall(args: {
44
+ registry: Address;
45
+ node: Hex;
46
+ newOwner: Address;
47
+ }): ContractCall;
48
+ /**
49
+ * Build a call to swap the resolver contract for a name.
50
+ * Caller MUST be the current owner.
51
+ */
52
+ export declare function buildRotateNameResolverCall(args: {
53
+ registry: Address;
54
+ node: Hex;
55
+ newResolver: Address;
56
+ }): ContractCall;
57
+ /**
58
+ * Build a call to delegate child-name issuance authority for a
59
+ * subtree to a subregistry contract. Setting `subregistry = address(0)`
60
+ * reverts to "owner-only" issuance.
61
+ */
62
+ export declare function buildSetSubregistryCall(args: {
63
+ registry: Address;
64
+ node: Hex;
65
+ subregistry: Address;
66
+ }): ContractCall;
67
+ /**
68
+ * Build a call to set the caller's primary name (reverse record).
69
+ * Caller MUST be the agent for which the primary name is being set
70
+ * (msg.sender == agent on chain). Setting `node = bytes32(0)` clears
71
+ * the primary name.
72
+ */
73
+ export declare function buildSetPrimaryNameCall(args: {
74
+ registry: Address;
75
+ node: Hex;
76
+ }): ContractCall;
77
+ /** Build a typed `setStringAttribute(node, predicate, value)` call. */
78
+ export declare function buildSetStringAttributeCall(args: {
79
+ resolver: Address;
80
+ node: Hex;
81
+ predicate: Hex;
82
+ value: string;
83
+ }): ContractCall;
84
+ /** Build a typed `setAddressAttribute(node, predicate, value)` call. */
85
+ export declare function buildSetAddressAttributeCall(args: {
86
+ resolver: Address;
87
+ node: Hex;
88
+ predicate: Hex;
89
+ value: Address;
90
+ }): ContractCall;
91
+ /** Build a typed `setBytes32Attribute(node, predicate, value)` call. */
92
+ export declare function buildSetBytes32AttributeCall(args: {
93
+ resolver: Address;
94
+ node: Hex;
95
+ predicate: Hex;
96
+ value: Hex;
97
+ }): ContractCall;
98
+ /**
99
+ * Translate an `AgentNameRecords` bundle into N typed-attribute
100
+ * calls. Caller submits them via walletClient OR composes them into
101
+ * a single AgentAccount.execute / CustodyPolicy ceremony.
102
+ *
103
+ * Mirrors `encodeRecords` from `agent-naming/records` but produces
104
+ * full `ContractCall` shapes instead of `EncodedRecord` shapes.
105
+ */
106
+ export declare function buildRecordCalls(args: {
107
+ resolver: Address;
108
+ node: Hex;
109
+ records: import('./types').AgentNameRecords;
110
+ }): ContractCall[];
111
+ /**
112
+ * Build a call to claim `<label>.<parent>` through a deployed
113
+ * PermissionlessSubregistry instance. The caller pays gas; the
114
+ * registered child name is owned by `newOwner` (typically the
115
+ * caller's own PSA OR an account they control).
116
+ *
117
+ * Anti-spam: one claim per `msg.sender` is enforced on chain; the
118
+ * call reverts with `AlreadyClaimed(existingNode)` if the caller
119
+ * has previously claimed a name through this subregistry instance.
120
+ */
121
+ export declare function buildSubregistryRegisterCall(args: {
122
+ subregistry: Address;
123
+ label: string;
124
+ newOwner: Address;
125
+ }): ContractCall;
126
+ /**
127
+ * Convenience: re-export the encoded-record shape from records.ts so
128
+ * downstream callers can pick whichever level of abstraction fits
129
+ * (EncodedRecord = pre-typed-setter args; ContractCall = full
130
+ * encoded call).
131
+ */
132
+ export type { EncodedRecord };
133
+ //# sourceMappingURL=custody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custody.d.ts","sourceRoot":"","sources":["../src/custody.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAM7D,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAG5E,qEAAqE;AACrE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,CAAC;CACX;AAID;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,GAAG,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,YAAY,CAgBf;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,OAAO,CAAC;CACnB,GAAG,YAAY,CAUf;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC;IACV,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG,YAAY,CAUf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC;IACV,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG,YAAY,CAUf;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC;CACX,GAAG,YAAY,CAUf;AAID,uEAAuE;AACvE,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,EAAE,GAAG,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,YAAY,CAUf;AAED,wEAAwE;AACxE,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,EAAE,GAAG,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,YAAY,CAUf;AAED,wEAAwE;AACxE,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,EAAE,GAAG,CAAC;IACf,KAAK,EAAE,GAAG,CAAC;CACZ,GAAG,YAAY,CAUf;AAID;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,OAAO,SAAS,EAAE,gBAAgB,CAAC;CAC7C,GAAG,YAAY,EAAE,CAsCjB;AAID;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB,GAAG,YAAY,CAUf;AAED;;;;;GAKG;AACH,YAAY,EAAE,aAAa,EAAE,CAAC"}