@spine-event-engine/storage-datastore 2.0.0-snapshot.21 → 2.0.0-snapshot.23

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.
@@ -11,8 +11,9 @@
11
11
  * or implied. See the License for the specific language governing permissions and limitations under
12
12
  * the License.
13
13
  */
14
+ import { Time } from "@spine-event-engine/core/time";
14
15
  import { Datastore } from "@google-cloud/datastore";
15
- import { TenantBoundary, } from "@spine-event-engine/storage/provider";
16
+ import { TenantBoundary, TenantCatalogReads, } from "@spine-event-engine/storage/provider";
16
17
  import { NamespaceAssignments } from "./namespace.js";
17
18
  const earlyTenantTtlMs = 60_000;
18
19
  const maxEarlyTenants = 1_000;
@@ -21,6 +22,7 @@ const maxEarlyTenants = 1_000;
21
22
  */
22
23
  export class DatastoreTenantCatalog {
23
24
  client;
25
+ #cursorIdentity = {};
24
26
  #kept = new Map();
25
27
  #converter;
26
28
  #now;
@@ -38,7 +40,7 @@ export class DatastoreTenantCatalog {
38
40
  this.client = client;
39
41
  this.#converter =
40
42
  converter instanceof NamespaceAssignments ? converter : new NamespaceAssignments(converter);
41
- this.#now = options.now ?? Date.now;
43
+ this.#now = options.now ?? (() => Time.currentTimeMillis());
42
44
  this.#earlyTenantTtlMs = options.earlyTenantTtlMs ?? earlyTenantTtlMs;
43
45
  this.#maxEarlyTenants = options.maxEarlyTenants ?? maxEarlyTenants;
44
46
  if (!Number.isFinite(this.#earlyTenantTtlMs) || this.#earlyTenantTtlMs <= 0)
@@ -89,6 +91,121 @@ export class DatastoreTenantCatalog {
89
91
  .sort((left, right) => left.namespace.localeCompare(right.namespace))
90
92
  .map(({ boundary }) => boundary);
91
93
  }
94
+ /**
95
+ * Reads one bounded early-admission or native namespace page.
96
+ *
97
+ * @param request Finite candidate limit and instance-bound continuation.
98
+ * @returns A possibly empty continuing tenant page.
99
+ */
100
+ async page(request) {
101
+ this.requireOpen();
102
+ TenantCatalogReads.require(request);
103
+ const prior = request.after;
104
+ if (prior !== undefined && !(prior instanceof DatastoreTenantCursor))
105
+ throw new TypeError("Datastore tenant catalog continuation is invalid.");
106
+ const cursor = prior?.state(this.#cursorIdentity);
107
+ if (cursor === undefined) {
108
+ this.purgeExpired();
109
+ const early = Object.freeze([...this.#kept.values()].map(({ boundary }) => boundary));
110
+ return this.#earlyPage(request, early, 0);
111
+ }
112
+ if (cursor.phase === "early")
113
+ return this.#earlyPage(request, cursor.early, cursor.index);
114
+ return this.#nativePage(request, cursor.early, cursor.nativeCursor);
115
+ }
116
+ /**
117
+ * Reads only a bounded part of the fixed early-admission snapshot.
118
+ */
119
+ #earlyPage(request, early, index) {
120
+ const end = Math.min(early.length, index + request.count);
121
+ if (index === end)
122
+ return {
123
+ boundaries: [],
124
+ after: new DatastoreTenantCursor(this.#cursorIdentity, early, "native", 0),
125
+ hasMore: true,
126
+ };
127
+ request.signal.throwIfAborted();
128
+ this.requireOpen();
129
+ return {
130
+ boundaries: early.slice(index, end),
131
+ after: new DatastoreTenantCursor(this.#cursorIdentity, early, end < early.length ? "early" : "native", end),
132
+ hasMore: true,
133
+ };
134
+ }
135
+ /**
136
+ * Converts one finite native metadata response without filling filtered pages.
137
+ */
138
+ async #nativePage(request, early, start) {
139
+ const boundaries = [];
140
+ let cursor = start;
141
+ let remaining = request.count;
142
+ for (;;) {
143
+ const limit = Math.min(128, remaining);
144
+ const query = this.client.createQuery("", "__namespace__").select("__key__").limit(limit);
145
+ if (cursor !== undefined)
146
+ query.start(cursor);
147
+ const result = await this.#nativeCandidates(query, request, limit);
148
+ request.signal.throwIfAborted();
149
+ this.requireOpen();
150
+ const chunk = this.#nativeResult(result, early, cursor, this.#nativeBoundaries(result.values));
151
+ boundaries.push(...chunk.boundaries);
152
+ remaining -= result.values.length;
153
+ if (!chunk.hasMore || remaining === 0)
154
+ return {
155
+ boundaries,
156
+ ...(chunk.after === undefined ? {} : { after: chunk.after }),
157
+ hasMore: chunk.hasMore,
158
+ };
159
+ cursor = result.endCursor;
160
+ }
161
+ }
162
+ /**
163
+ * Converts only this native page's recognized namespaces.
164
+ */
165
+ #nativeBoundaries(values) {
166
+ const boundaries = [];
167
+ for (const value of values) {
168
+ const namespace = namespaceName(value, this.client.KEY);
169
+ if (namespace === undefined || namespace.length === 0)
170
+ continue;
171
+ const tenantId = this.#converter.fromNamespace(namespace);
172
+ if (tenantId === undefined)
173
+ continue;
174
+ boundaries.push(TenantBoundary.from(tenantId));
175
+ this.#kept.delete(namespace);
176
+ }
177
+ return boundaries;
178
+ }
179
+ /**
180
+ * Validates the native continuation before exposing a catalog page.
181
+ */
182
+ #nativeResult(result, early, start, boundaries) {
183
+ const more = result.moreResults === Datastore.MORE_RESULTS_AFTER_LIMIT ||
184
+ result.moreResults === Datastore.MORE_RESULTS_AFTER_CURSOR;
185
+ if (result.moreResults === Datastore.MORE_RESULTS_AFTER_LIMIT &&
186
+ result.values.length === 0 &&
187
+ start !== undefined &&
188
+ result.endCursor === start)
189
+ return { boundaries, hasMore: false };
190
+ if (more &&
191
+ (result.endCursor === undefined ||
192
+ result.endCursor.length === 0 ||
193
+ result.endCursor === start))
194
+ throw new Error("Datastore tenant catalog returned a nonadvancing continuation.");
195
+ if (!more && result.moreResults !== Datastore.NO_MORE_RESULTS)
196
+ throw new Error("Datastore tenant catalog returned invalid continuation metadata.");
197
+ const after = more
198
+ ? new DatastoreTenantCursor(this.#cursorIdentity, early, "native", 0, result.endCursor)
199
+ : undefined;
200
+ return { boundaries, ...(after === undefined ? {} : { after }), hasMore: more };
201
+ }
202
+ /**
203
+ * Collects no more than one native query limit with caller cancellation.
204
+ */
205
+ #nativeCandidates(query, request, limit) {
206
+ const stream = this.client.runQueryStream(query);
207
+ return collectNativeCandidates(stream, request, limit);
208
+ }
92
209
  /**
93
210
  * Records an admitted tenant until native metadata becomes visible.
94
211
  *
@@ -103,6 +220,11 @@ export class DatastoreTenantCatalog {
103
220
  this.keepNow(boundary);
104
221
  });
105
222
  }
223
+ /**
224
+ * Stores a tenant namespace until native Datastore metadata becomes visible.
225
+ *
226
+ * @param boundary The tenant admitted for early reads.
227
+ */
106
228
  keepNow(boundary) {
107
229
  this.requireOpen();
108
230
  if (boundary.single || boundary.tenantId === undefined)
@@ -129,10 +251,16 @@ export class DatastoreTenantCatalog {
129
251
  this.#kept.clear();
130
252
  return Promise.resolve();
131
253
  }
254
+ /**
255
+ * Rejects catalog operations after closure.
256
+ */
132
257
  requireOpen() {
133
258
  if (!this.#open)
134
259
  throw new Error("Datastore tenant catalog is closed.");
135
260
  }
261
+ /**
262
+ * Removes early tenant admissions after their configured TTL.
263
+ */
136
264
  purgeExpired() {
137
265
  const now = this.#now();
138
266
  for (const [namespace, admission] of this.#kept) {
@@ -141,6 +269,113 @@ export class DatastoreTenantCatalog {
141
269
  }
142
270
  }
143
271
  }
272
+ /**
273
+ * Immutable phase and native cursor tied to one Datastore catalog.
274
+ */
275
+ class DatastoreTenantCursor {
276
+ [Symbol.toStringTag] = "TenantCatalogCursor";
277
+ #identity;
278
+ #early;
279
+ #phase;
280
+ #index;
281
+ #nativeCursor;
282
+ /**
283
+ * Captures one early-cache or native namespace continuation.
284
+ *
285
+ * @param identity Private catalog issuance identity.
286
+ * @param early Bounded early-admission snapshot.
287
+ * @param phase Current early or native phase.
288
+ * @param index Next early-admission position.
289
+ * @param nativeCursor Native namespace continuation, when present.
290
+ */
291
+ constructor(identity, early, phase, index, nativeCursor) {
292
+ this.#identity = identity;
293
+ this.#early = early;
294
+ this.#phase = phase;
295
+ this.#index = index;
296
+ this.#nativeCursor = nativeCursor;
297
+ Object.freeze(this);
298
+ }
299
+ /**
300
+ * Verifies issuance before exposing this catalog's sweep position.
301
+ *
302
+ * @param identity Private identity of the reading catalog.
303
+ * @returns Bounded early snapshot and phase-specific continuation.
304
+ */
305
+ state(identity) {
306
+ if (this.#identity !== identity)
307
+ throw new TypeError("Datastore tenant catalog continuation is invalid.");
308
+ return {
309
+ early: this.#early,
310
+ phase: this.#phase,
311
+ index: this.#index,
312
+ ...(this.#nativeCursor === undefined ? {} : { nativeCursor: this.#nativeCursor }),
313
+ };
314
+ }
315
+ }
316
+ /**
317
+ * Collects one finite native namespace query with caller cancellation.
318
+ *
319
+ * @param stream Public Datastore query stream.
320
+ * @param request Finite page request and cancellation.
321
+ * @returns Native candidates and continuation metadata.
322
+ */
323
+ function collectNativeCandidates(stream, request, limit) {
324
+ return new Promise((resolve, reject) => {
325
+ const state = { values: [], info: {}, settled: false };
326
+ const finish = (error) => {
327
+ if (state.settled)
328
+ return;
329
+ state.settled = true;
330
+ request.signal.removeEventListener("abort", onAbort);
331
+ if (error === undefined)
332
+ resolve({ values: state.values, ...state.info });
333
+ else
334
+ reject(error);
335
+ };
336
+ const onAbort = () => {
337
+ finish(new Error("Datastore tenant catalog discovery was cancelled."));
338
+ stream.destroy();
339
+ };
340
+ request.signal.addEventListener("abort", onAbort, { once: true });
341
+ observeNativeCandidates(stream, limit, state, finish);
342
+ if (request.signal.aborted)
343
+ onAbort();
344
+ });
345
+ }
346
+ /**
347
+ * Observes one bounded stream and ignores data after settlement.
348
+ *
349
+ * @param stream Public Datastore query stream.
350
+ * @param count Maximum native candidates.
351
+ * @param state Mutable state for this one page.
352
+ * @param onFinish Completes the page once.
353
+ */
354
+ function observeNativeCandidates(stream, count, state, onFinish) {
355
+ stream.on("data", (value) => {
356
+ if (state.settled)
357
+ return;
358
+ if (state.values.length >= count) {
359
+ onFinish(new Error("Datastore tenant catalog exceeded the page limit."));
360
+ stream.destroy();
361
+ }
362
+ else
363
+ state.values.push(value);
364
+ });
365
+ stream.on("info", (value) => {
366
+ if (!state.settled)
367
+ state.info = value;
368
+ });
369
+ stream.on("error", () => {
370
+ onFinish(new Error("Datastore namespace discovery failed."));
371
+ });
372
+ stream.on("end", () => {
373
+ onFinish();
374
+ });
375
+ stream.on("close", () => {
376
+ onFinish(new Error("Datastore namespace discovery closed before completion."));
377
+ });
378
+ }
144
379
  function namespaceName(value, keySymbol) {
145
380
  if (typeof value !== "object" || value === null)
146
381
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-catalog.js","sourceRoot":"","sources":["../../src/datastore/tenant-catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tenant-catalog.js","sourceRoot":"","sources":["../../src/datastore/tenant-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EACL,cAAc,EACd,kBAAkB,GAMnB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAA2B,MAAM,gBAAgB,CAAC;AAE/E,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,eAAe,GAAG,KAAK,CAAC;AAQ9B;;GAEG;AACH,MAAM,OAAO,sBAAsB;IA0Bd;IAzBV,eAAe,GAAG,EAAE,CAAC;IAErB,KAAK,GAAG,IAAI,GAAG,EAGrB,CAAC;IAEK,UAAU,CAAuB;IAEjC,IAAI,CAAe;IAEnB,iBAAiB,CAAS;IAE1B,gBAAgB,CAAS;IAElC,KAAK,GAAG,IAAI,CAAC;IAEb;;;;;;OAMG;IACH,YACmB,MAAiB,EAClC,SAA6B,EAC7B,UAA8B,EAAE;QAFf,WAAM,GAAN,MAAM,CAAW;QAIlC,IAAI,CAAC,UAAU;YACb,SAAS,YAAY,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC9F,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,IAAI,gBAAgB,CAAC;QACtE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,eAAe,IAAI,eAAe,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IAC3F,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7E,IAAI,QAAiB,CAAC;QACtB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAEpE,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAgE,CAAC;QAC3F,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAc,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,QAAQ,KAAK,SAAS;gBAAE,SAAS;YACrC,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;gBACtD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC/E,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;gBACtD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC/E,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;aAC5B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;aACpE,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,OAA0B;QACnC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,YAAY,qBAAqB,CAAC;YAClE,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,UAAU,CACR,OAA0B,EAC1B,KAAqC,EACrC,KAAa;QAEb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,KAAK,KAAK,GAAG;YACf,OAAO;gBACL,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,IAAI,qBAAqB,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC1E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;YACnC,KAAK,EAAE,IAAI,qBAAqB,CAC9B,IAAI,CAAC,eAAe,EACpB,KAAK,EACL,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EACvC,GAAG,CACJ;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,OAA0B,EAC1B,KAAqC,EACrC,KAAc;QAEd,MAAM,UAAU,GAA0B,EAAE,CAAC;QAC7C,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9B,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1F,IAAI,MAAM,KAAK,SAAS;gBAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACnE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAC9B,MAAM,EACN,KAAK,EACL,MAAM,EACN,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CACtC,CAAC;YACF,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;YACrC,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,SAAS,KAAK,CAAC;gBACnC,OAAO;oBACL,UAAU;oBACV,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;oBAC5D,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC;YACJ,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,MAA0B;QAC1C,MAAM,UAAU,GAA0B,EAAE,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,QAAQ,KAAK,SAAS;gBAAE,SAAS;YACrC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,aAAa,CACX,MAA2B,EAC3B,KAAqC,EACrC,KAAyB,EACzB,UAA0C;QAE1C,MAAM,IAAI,GACR,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,wBAAwB;YACzD,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,yBAAyB,CAAC;QAC7D,IACE,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,wBAAwB;YACzD,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,KAAK,KAAK,SAAS;YACnB,MAAM,CAAC,SAAS,KAAK,KAAK;YAE1B,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACxC,IACE,IAAI;YACJ,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS;gBAC7B,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAC7B,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC;YAE7B,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,eAAe;YAC3D,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;QACtF,MAAM,KAAK,GAAG,IAAI;YAChB,CAAC,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;YACvF,CAAC,CAAC,SAAS,CAAC;QACd,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,iBAAiB,CACf,KAA2C,EAC3C,OAA0B,EAC1B,KAAa;QAEb,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACjD,OAAO,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI,CAAC,QAA6B;QAChC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,OAAO,CAAC,QAA6B;QAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS;YACpD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;YAClE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,gBAAgB;YACpE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE;YACxB,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,iBAAiB;SAChD,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,WAAW;QACjB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChD,IAAI,SAAS,CAAC,SAAS,IAAI,GAAG;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,qBAAqB;IAChB,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,qBAA8B,CAAC;IAEtD,SAAS,CAAS;IAElB,MAAM,CAAiC;IAEvC,MAAM,CAAqB;IAE3B,MAAM,CAAS;IAEf,aAAa,CAAqB;IAE3C;;;;;;;;OAQG;IACH,YACE,QAAgB,EAChB,KAAqC,EACrC,KAAyB,EACzB,KAAa,EACb,YAAqB;QAErB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAgB;QAMpB,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ;YAC7B,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;QAC3E,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;SAClF,CAAC;IACJ,CAAC;CACF;AAcD;;;;;;GAMG;AACH,SAAS,uBAAuB,CAC9B,MAA+C,EAC/C,OAA0B,EAC1B,KAAa;IAEb,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAqB,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACzE,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC/B,IAAI,KAAK,CAAC,OAAO;gBAAE,OAAO;YAC1B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YACrB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrD,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;;gBACrE,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,MAAM,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;YACvE,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,uBAAuB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,uBAAuB,CAC9B,MAA+C,EAC/C,KAAa,EACb,KAAuB,EACvB,QAAiC;IAEjC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAc,EAAE,EAAE;QACnC,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;YACjC,QAAQ,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;YACzE,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;;YAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAA+B,EAAE,EAAE;QACpD,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACtB,QAAQ,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QACpB,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACtB,QAAQ,CAAC,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,SAAiB;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,GAAG,GAAI,KAAiC,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,MAAM,GAAG,GAAsE,CAAC;IACtF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC"}