@adcp/sdk 9.2.2 → 9.4.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.
- package/README.md +23 -0
- package/dist/lib/discovery/inline-publisher-properties.js +10 -3
- package/dist/lib/discovery/inline-publisher-properties.js.map +1 -1
- package/dist/lib/discovery/resolve-agent-properties.d.ts +39 -11
- package/dist/lib/discovery/resolve-agent-properties.d.ts.map +1 -1
- package/dist/lib/discovery/resolve-agent-properties.js +136 -16
- package/dist/lib/discovery/resolve-agent-properties.js.map +1 -1
- package/dist/lib/discovery/types.d.ts +9 -2
- package/dist/lib/discovery/types.d.ts.map +1 -1
- package/dist/lib/discovery/validate-adagents.d.ts +2 -0
- package/dist/lib/discovery/validate-adagents.d.ts.map +1 -1
- package/dist/lib/discovery/validate-adagents.js +14 -6
- package/dist/lib/discovery/validate-adagents.js.map +1 -1
- package/dist/lib/index.d.ts +4 -3
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +24 -12
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/registry/feed-stream.d.ts +147 -0
- package/dist/lib/registry/feed-stream.d.ts.map +1 -0
- package/dist/lib/registry/feed-stream.js +378 -0
- package/dist/lib/registry/feed-stream.js.map +1 -0
- package/dist/lib/registry/index.d.ts +52 -3
- package/dist/lib/registry/index.d.ts.map +1 -1
- package/dist/lib/registry/index.js +205 -2
- package/dist/lib/registry/index.js.map +1 -1
- package/dist/lib/registry/sync.d.ts +175 -10
- package/dist/lib/registry/sync.d.ts.map +1 -1
- package/dist/lib/registry/sync.js +601 -43
- package/dist/lib/registry/sync.js.map +1 -1
- package/dist/lib/registry/types.d.ts +38 -2
- package/dist/lib/registry/types.d.ts.map +1 -1
- package/dist/lib/registry/types.generated.d.ts +231 -8
- package/dist/lib/registry/types.generated.d.ts.map +1 -1
- package/dist/lib/registry/types.generated.js +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/signing/agent-fetch.d.ts +5 -4
- package/dist/lib/signing/agent-fetch.d.ts.map +1 -1
- package/dist/lib/signing/agent-fetch.js +31 -4
- package/dist/lib/signing/agent-fetch.js.map +1 -1
- package/dist/lib/signing/verifier.d.ts.map +1 -1
- package/dist/lib/signing/verifier.js +10 -37
- package/dist/lib/signing/verifier.js.map +1 -1
- package/dist/lib/signing/webhook-auth-detection.d.ts +10 -0
- package/dist/lib/signing/webhook-auth-detection.d.ts.map +1 -0
- package/dist/lib/signing/webhook-auth-detection.js +37 -0
- package/dist/lib/signing/webhook-auth-detection.js.map +1 -0
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
|
@@ -1,18 +1,67 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
2
|
import type { RegistryClient } from './index';
|
|
3
|
-
import type { CatalogEvent, AgentSearchResult, AgentCompliance, AuthorizationEntry } from './types.generated';
|
|
3
|
+
import type { CatalogEvent, AgentSearchResult, AgentCompliance, AuthorizationEntry, FeedFreshness } from './types.generated';
|
|
4
|
+
import type { ResolvedBrand } from './types';
|
|
4
5
|
import type { CursorStore } from './cursor-store';
|
|
5
6
|
export interface RegistrySyncConfig {
|
|
6
7
|
/** RegistryClient instance to use for API calls. */
|
|
7
8
|
client: RegistryClient;
|
|
9
|
+
/**
|
|
10
|
+
* Feed transport for tailing changes after bootstrap:
|
|
11
|
+
* - `'auto'` (default): try the SSE stream, fall back to polling on an
|
|
12
|
+
* unsupported endpoint (404/406), proxy/network failure, or stream parse
|
|
13
|
+
* failure.
|
|
14
|
+
* - `'stream'`: SSE only; reconnect on failure and never fall back to polling.
|
|
15
|
+
* - `'poll'`: polling only.
|
|
16
|
+
*/
|
|
17
|
+
transport?: 'auto' | 'stream' | 'poll';
|
|
8
18
|
/** Polling interval in milliseconds. Default: 30000 (30s). */
|
|
9
19
|
pollIntervalMs?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Comma-separated event type filter (glob, e.g. `authorization.*`) applied to
|
|
22
|
+
* every feed read (bootstrap drain, polling, and SSE).
|
|
23
|
+
*
|
|
24
|
+
* A persisted cursor is scoped to the logical `types` subscription it was
|
|
25
|
+
* minted under: a cursor from a broader subscription can skip events that were
|
|
26
|
+
* filtered out previously. This is NOT enforced by the cursor store (the store
|
|
27
|
+
* holds only the cursor string), so if you change `types` you must
|
|
28
|
+
* `reset()` before `start()`. With a persistent {@link FileCursorStore} that
|
|
29
|
+
* survives restarts, changing `types` between deploys against the same store
|
|
30
|
+
* path will silently resume from a foreign cursor — point each subscription at
|
|
31
|
+
* its own store path, or clear the store when the filter changes.
|
|
32
|
+
*/
|
|
33
|
+
types?: string;
|
|
34
|
+
/** Max events requested per feed page (polling and SSE). Default: 1000. */
|
|
35
|
+
feedPageLimit?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Server-side caught-up interval hint for the SSE stream, in **seconds** (5–60,
|
|
38
|
+
* default 15) — maps to the `poll_interval_seconds` query param. Note the unit:
|
|
39
|
+
* `pollIntervalMs` and `streamIdleTimeoutMs` are milliseconds.
|
|
40
|
+
*/
|
|
41
|
+
streamPollIntervalSeconds?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Client-side idle watchdog: reconnect the stream if no feed page or heartbeat
|
|
44
|
+
* arrives within this window. Must exceed the server poll interval.
|
|
45
|
+
* Default: 90000 (90s).
|
|
46
|
+
*/
|
|
47
|
+
streamIdleTimeoutMs?: number;
|
|
48
|
+
/** Reconnect backoff floor in ms. Default: 1000. */
|
|
49
|
+
streamReconnectMinMs?: number;
|
|
50
|
+
/** Reconnect backoff ceiling in ms. Default: 30000. */
|
|
51
|
+
streamReconnectMaxMs?: number;
|
|
52
|
+
/**
|
|
53
|
+
* Consecutive stream failures (with no successful message in between) before
|
|
54
|
+
* `'auto'` mode falls back to polling. Default: 3. Ignored in `'stream'` mode.
|
|
55
|
+
*/
|
|
56
|
+
maxStreamFailures?: number;
|
|
10
57
|
/** Choose which indexes to maintain. */
|
|
11
58
|
indexes?: {
|
|
12
59
|
/** Agent inventory profiles. Default: true. */
|
|
13
60
|
agents?: boolean;
|
|
14
61
|
/** Authorization entries (agent→domain mappings). Default: true. */
|
|
15
62
|
authorizations?: boolean;
|
|
63
|
+
/** Ordered brand hierarchy chains (self → parents → house). Default: true. */
|
|
64
|
+
brandHierarchies?: boolean;
|
|
16
65
|
};
|
|
17
66
|
/** Optional cursor store for persisting the feed cursor between restarts. */
|
|
18
67
|
cursorStore?: CursorStore;
|
|
@@ -20,6 +69,8 @@ export interface RegistrySyncConfig {
|
|
|
20
69
|
onError?: (error: Error) => void;
|
|
21
70
|
}
|
|
22
71
|
export type RegistrySyncState = 'idle' | 'bootstrapping' | 'syncing' | 'error';
|
|
72
|
+
/** Active feed transport once syncing. */
|
|
73
|
+
export type RegistrySyncTransport = 'stream' | 'poll';
|
|
23
74
|
export interface RegistrySyncEvents {
|
|
24
75
|
bootstrap: [{
|
|
25
76
|
agentCount: number;
|
|
@@ -48,6 +99,14 @@ export interface RegistrySyncEvents {
|
|
|
48
99
|
from: RegistrySyncState;
|
|
49
100
|
to: RegistrySyncState;
|
|
50
101
|
}];
|
|
102
|
+
/** Emitted whenever a feed page or heartbeat carries freshness metadata, for lag monitoring. */
|
|
103
|
+
freshness: [{
|
|
104
|
+
freshness: FeedFreshness;
|
|
105
|
+
}];
|
|
106
|
+
/** Emitted when the active feed transport changes (e.g. stream → polling fallback). */
|
|
107
|
+
transport: [{
|
|
108
|
+
transport: RegistrySyncTransport;
|
|
109
|
+
}];
|
|
51
110
|
}
|
|
52
111
|
export interface AgentFilter {
|
|
53
112
|
type?: string;
|
|
@@ -64,44 +123,93 @@ export interface AgentFilter {
|
|
|
64
123
|
/**
|
|
65
124
|
* In-memory replica of the AdCP registry.
|
|
66
125
|
*
|
|
67
|
-
* Bootstraps from the agent search endpoint, then
|
|
68
|
-
*
|
|
126
|
+
* Bootstraps from the agent search endpoint, then tails the change feed —
|
|
127
|
+
* Server-Sent Events by default (`transport: 'auto'`), falling back to polling
|
|
128
|
+
* `/api/registry/feed` when streaming is unavailable — to keep its indexes
|
|
129
|
+
* current for zero-latency lookups.
|
|
130
|
+
*
|
|
131
|
+
* **Staleness:** lookups (`getAgent`, `isAuthorized`, the authorization getters)
|
|
132
|
+
* return the last synced state. After a transient failure the engine keeps
|
|
133
|
+
* reconnecting/polling, but a fatal error (e.g. `401`) leaves `state === 'error'`
|
|
134
|
+
* while the indexes still hold their last values. For decisions where staleness
|
|
135
|
+
* is unsafe (e.g. authorization enforcement), gate on `state` and
|
|
136
|
+
* `getLagSeconds()` / `getFreshness()` rather than trusting a lookup blindly.
|
|
137
|
+
* Index size is bounded only by registry trust — a replica mirrors the whole
|
|
138
|
+
* registry, so an untrusted/compromised feed could grow memory without limit.
|
|
69
139
|
*
|
|
70
140
|
* @example
|
|
71
141
|
* ```ts
|
|
72
142
|
* const client = new RegistryClient({ apiKey: 'sk_...' });
|
|
73
|
-
* const sync = new RegistrySync({ client });
|
|
74
|
-
* await sync.start();
|
|
143
|
+
* const sync = new RegistrySync({ client }); // transport: 'auto' (SSE, polling fallback)
|
|
75
144
|
*
|
|
76
145
|
* // Zero-latency lookups
|
|
146
|
+
* sync.on('event', ({ event }) => console.log('registry change:', event.event_type));
|
|
147
|
+
*
|
|
148
|
+
* // Lag monitoring for the SSE feed
|
|
149
|
+
* sync.on('transport', ({ transport }) => console.log('feed transport:', transport));
|
|
150
|
+
* sync.on('freshness', ({ freshness }) => {
|
|
151
|
+
* if ((freshness.lag_seconds ?? 0) > 300) console.warn('registry feed lag > 5m');
|
|
152
|
+
* });
|
|
153
|
+
*
|
|
154
|
+
* await sync.start();
|
|
77
155
|
* const agent = sync.getAgent('https://ads.example.com');
|
|
78
156
|
* const authorized = sync.isAuthorized('https://ads.example.com', 'publisher.com');
|
|
79
157
|
* const ctv = sync.findAgents({ channels: ['ctv'], markets: ['US'] });
|
|
80
|
-
*
|
|
81
|
-
* sync.on('event', ({ event }) => console.log('registry change:', event.event_type));
|
|
82
158
|
* sync.stop();
|
|
83
159
|
* ```
|
|
84
160
|
*/
|
|
85
161
|
export declare class RegistrySync extends EventEmitter<RegistrySyncEvents> {
|
|
86
162
|
private readonly client;
|
|
163
|
+
private readonly transportMode;
|
|
87
164
|
private readonly pollIntervalMs;
|
|
165
|
+
private readonly types;
|
|
166
|
+
private readonly feedPageLimit;
|
|
167
|
+
private readonly streamPollIntervalSeconds;
|
|
168
|
+
private readonly streamIdleTimeoutMs;
|
|
169
|
+
private readonly streamReconnectMinMs;
|
|
170
|
+
private readonly streamReconnectMaxMs;
|
|
171
|
+
private readonly maxStreamFailures;
|
|
88
172
|
private readonly indexAgents;
|
|
89
173
|
private readonly indexAuthorizations;
|
|
174
|
+
private readonly indexBrandHierarchies;
|
|
90
175
|
private readonly errorHandler;
|
|
91
176
|
private readonly cursorStore;
|
|
92
177
|
private _state;
|
|
93
178
|
private cursor;
|
|
94
179
|
private pollTimer;
|
|
180
|
+
private activeTransport;
|
|
181
|
+
private streamController;
|
|
182
|
+
private streamIdleTimer;
|
|
183
|
+
private lastFreshness;
|
|
184
|
+
/**
|
|
185
|
+
* Incremented by stop()/reset() and each start(). Async work (bootstrap,
|
|
186
|
+
* rebootstrap, the stream loop) captures its generation and bails the moment
|
|
187
|
+
* it no longer matches — so a stop() that lands mid-bootstrap is honored and
|
|
188
|
+
* a stale loop can never resume after the caller stopped or restarted.
|
|
189
|
+
*/
|
|
190
|
+
private generation;
|
|
95
191
|
private agents;
|
|
96
192
|
private authByDomain;
|
|
97
193
|
private authByAgent;
|
|
194
|
+
private brandAncestorsByDomain;
|
|
195
|
+
private brandHierarchyByDomain;
|
|
196
|
+
private brandHierarchyKeysByEntity;
|
|
197
|
+
private brandHierarchyEntityByKey;
|
|
98
198
|
constructor(config: RegistrySyncConfig);
|
|
99
|
-
/** Bootstrap from the registry and begin
|
|
199
|
+
/** Bootstrap from the registry and begin tailing the event feed. */
|
|
100
200
|
start(): Promise<void>;
|
|
101
|
-
/** Stop
|
|
201
|
+
/** Stop tailing the feed. In-memory state is preserved. */
|
|
102
202
|
stop(): void;
|
|
103
|
-
/**
|
|
203
|
+
/**
|
|
204
|
+
* Stop, clear all in-memory state, and drop the persisted cursor. Call start()
|
|
205
|
+
* again to re-bootstrap from scratch. Because this clears the stored cursor,
|
|
206
|
+
* it is the correct way to switch the `types` subscription: `reset()` then
|
|
207
|
+
* `start()` begins a fresh subscription rather than resuming a cursor minted
|
|
208
|
+
* under the previous filter.
|
|
209
|
+
*/
|
|
104
210
|
reset(): Promise<void>;
|
|
211
|
+
/** Begin tailing the feed using the configured transport. Bootstrap leaves state at 'syncing'. */
|
|
212
|
+
private beginSync;
|
|
105
213
|
/** Get an agent by URL. */
|
|
106
214
|
getAgent(url: string): AgentSearchResult | undefined;
|
|
107
215
|
/** Get all agents in the index. */
|
|
@@ -116,15 +224,42 @@ export declare class RegistrySync extends EventEmitter<RegistrySyncEvents> {
|
|
|
116
224
|
* Check if an agent has any authorization for a publisher domain.
|
|
117
225
|
* Does not evaluate property_id scoping, time bounds, or effective dates.
|
|
118
226
|
* For scoped checks, use getAuthorizationsForDomain() and inspect entries directly.
|
|
227
|
+
*
|
|
228
|
+
* Returns the last synced state — see the class-level staleness note. For
|
|
229
|
+
* enforcement, confirm `state === 'syncing'` and an acceptable `getLagSeconds()`
|
|
230
|
+
* before trusting an allow decision, so a stalled feed can't serve a stale
|
|
231
|
+
* authorization after a missed revocation.
|
|
119
232
|
*/
|
|
120
233
|
isAuthorized(agentUrl: string, domain: string): boolean;
|
|
234
|
+
/**
|
|
235
|
+
* Get the ordered corporate ancestor domain chain for a brand domain.
|
|
236
|
+
*
|
|
237
|
+
* The returned array includes the resolved brand itself as the first entry and
|
|
238
|
+
* the house domain as the last entry when known.
|
|
239
|
+
*/
|
|
240
|
+
getAncestors(domain: string): string[];
|
|
241
|
+
/** Get the ordered resolved brand chain for a brand domain, when the feed supplied it. */
|
|
242
|
+
getBrandHierarchy(domain: string): ResolvedBrand[];
|
|
121
243
|
get state(): RegistrySyncState;
|
|
122
244
|
getCursor(): string | null;
|
|
123
245
|
getStats(): {
|
|
124
246
|
agents: number;
|
|
125
247
|
authorizations: number;
|
|
248
|
+
brandHierarchies: number;
|
|
126
249
|
};
|
|
250
|
+
/** The active feed transport once syncing, or null when idle. */
|
|
251
|
+
getTransport(): RegistrySyncTransport | null;
|
|
252
|
+
/**
|
|
253
|
+
* Latest feed freshness metadata, or null if the registry has not reported it
|
|
254
|
+
* yet (e.g. before the first feed page/heartbeat lands). For push updates,
|
|
255
|
+
* prefer the `freshness` event over polling this right after `start()`.
|
|
256
|
+
*/
|
|
257
|
+
getFreshness(): FeedFreshness | null;
|
|
258
|
+
/** Latest feed lag in seconds, or null when unavailable. Convenience over getFreshness(). */
|
|
259
|
+
getLagSeconds(): number | null;
|
|
127
260
|
private bootstrap;
|
|
261
|
+
/** Clear all state, drop the persisted cursor, and bootstrap again from scratch. */
|
|
262
|
+
private rebootstrap;
|
|
128
263
|
private schedulePoll;
|
|
129
264
|
private pollLoop;
|
|
130
265
|
private poll;
|
|
@@ -132,8 +267,38 @@ export declare class RegistrySync extends EventEmitter<RegistrySyncEvents> {
|
|
|
132
267
|
* Drain all available feed pages. Used during bootstrap (does not emit 'event' per event).
|
|
133
268
|
*/
|
|
134
269
|
private drainFeed;
|
|
270
|
+
private runStream;
|
|
271
|
+
/**
|
|
272
|
+
* Consume one SSE connection. Invokes `onMessage(isFeed)` for each feed page
|
|
273
|
+
* (true) or heartbeat (false) received. Returns the disposition for the
|
|
274
|
+
* reconnect loop: `closed` on a clean server EOF, `reconnect` on a server
|
|
275
|
+
* `feed_stream_error`, `rebootstrap` on `cursor_expired`, `stopped` if the
|
|
276
|
+
* engine was stopped mid-stream.
|
|
277
|
+
*/
|
|
278
|
+
private streamConnection;
|
|
279
|
+
/** Apply one SSE feed page: events, freshness, then advance + persist the cursor. */
|
|
280
|
+
private applyStreamPage;
|
|
281
|
+
private classifyStreamError;
|
|
282
|
+
private shouldFallBack;
|
|
283
|
+
private fallBackToPolling;
|
|
284
|
+
private armStreamIdleTimer;
|
|
285
|
+
private clearStreamIdleTimer;
|
|
286
|
+
private abortStream;
|
|
287
|
+
private reconnectBackoffMs;
|
|
288
|
+
private delay;
|
|
289
|
+
private feedQuery;
|
|
290
|
+
private observeFreshness;
|
|
291
|
+
private persistCursor;
|
|
292
|
+
private setTransport;
|
|
135
293
|
private applyEvent;
|
|
136
294
|
private clearIndexes;
|
|
295
|
+
private applyBrandHierarchyEvent;
|
|
296
|
+
private deleteBrandHierarchy;
|
|
297
|
+
private clearBrandHierarchyEntity;
|
|
298
|
+
private extractResolvedBrandChain;
|
|
299
|
+
private extractDomainChain;
|
|
300
|
+
private domainFromBrand;
|
|
301
|
+
private normalizeDomainKey;
|
|
137
302
|
private setState;
|
|
138
303
|
}
|
|
139
304
|
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/lib/registry/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,kBAAkB,
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/lib/registry/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAGlB,aAAa,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAQ7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,MAAM,EAAE,cAAc,CAAC;IACvB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oDAAoD;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uDAAuD;IACvD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wCAAwC;IACxC,OAAO,CAAC,EAAE;QACR,+CAA+C;QAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,oEAAoE;QACpE,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,8EAA8E;QAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;IACF,6EAA6E;IAC7E,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/E,0CAA0C;AAC1C,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAYtD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,mFAAmF;IACnF,KAAK,EAAE,CAAC;QAAE,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACjC,KAAK,EAAE,CAAC;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC;IAC1B,yDAAyD;IACzD,kBAAkB,EAAE;QAClB;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;YAAC,aAAa,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;SAAE;KAC1G,CAAC;IACF,WAAW,EAAE,CAAC;QAAE,IAAI,EAAE,iBAAiB,CAAC;QAAC,EAAE,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IAClE,gGAAgG;IAChG,SAAS,EAAE,CAAC;QAAE,SAAS,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IAC1C,uFAAuF;IACvF,SAAS,EAAE,CAAC;QAAE,SAAS,EAAE,qBAAqB,CAAA;KAAE,CAAC,CAAC;CACnD;AAID,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;CACjD;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,qBAAa,YAAa,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAS;IACnD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IACpE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAE1C,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAA8C;IAG/D,OAAO,CAAC,eAAe,CAAsC;IAC7D,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,aAAa,CAA8B;IACnD;;;;;OAKG;IACH,OAAO,CAAC,UAAU,CAAK;IAGvB,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,sBAAsB,CAA+B;IAC7D,OAAO,CAAC,sBAAsB,CAAsC;IACpE,OAAO,CAAC,0BAA0B,CAAkC;IACpE,OAAO,CAAC,yBAAyB,CAA6B;gBAElD,MAAM,EAAE,kBAAkB;IAiCtC,oEAAoE;IAC9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,2DAA2D;IAC3D,IAAI,IAAI,IAAI;IAeZ;;;;;;OAMG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,kGAAkG;IAClG,OAAO,CAAC,SAAS;IAajB,2BAA2B;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIpD,mCAAmC;IACnC,SAAS,IAAI,iBAAiB,EAAE;IAIhC,oGAAoG;IACpG,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,EAAE;IAsBpD,qDAAqD;IACrD,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAIhE,2CAA2C;IAC3C,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAIjE;;;;;;;;;OASG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAOvD;;;;;OAKG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAItC,0FAA0F;IAC1F,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE;IAMlD,IAAI,KAAK,IAAI,iBAAiB,CAE7B;IAED,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B,QAAQ,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE;IAUhF,iEAAiE;IACjE,YAAY,IAAI,qBAAqB,GAAG,IAAI;IAI5C;;;;OAIG;IACH,YAAY,IAAI,aAAa,GAAG,IAAI;IAIpC,6FAA6F;IAC7F,aAAa,IAAI,MAAM,GAAG,IAAI;YAMhB,SAAS;IA8CvB,oFAAoF;YACtE,WAAW;IASzB,OAAO,CAAC,YAAY;YAIN,QAAQ;YAeR,IAAI;IA0ClB;;OAEG;YACW,SAAS;YA6BT,SAAS;IA8GvB;;;;;;OAMG;YACW,gBAAgB;IA4C9B,qFAAqF;YACvE,eAAe;IA4B7B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,KAAK;IAkBb,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,gBAAgB;YAMV,aAAa;IAM3B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;IAiJlB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,wBAAwB;IAwChC,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,yBAAyB;IAWjC,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,QAAQ;CAMjB"}
|