@webda/models 0.0.0-stage → 4.0.0-beta.3

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 (51) hide show
  1. package/LICENSE +166 -0
  2. package/README.md +146 -2
  3. package/lib/index.d.ts +11 -0
  4. package/lib/index.d.ts.map +1 -0
  5. package/lib/index.js +11 -0
  6. package/lib/index.js.map +1 -0
  7. package/lib/mock.d.ts +72 -0
  8. package/lib/mock.d.ts.map +1 -0
  9. package/lib/mock.js +83 -0
  10. package/lib/mock.js.map +1 -0
  11. package/lib/model.model.d.ts +247 -0
  12. package/lib/model.model.d.ts.map +1 -0
  13. package/lib/model.model.js +277 -0
  14. package/lib/model.model.js.map +1 -0
  15. package/lib/relations.d.ts +705 -0
  16. package/lib/relations.d.ts.map +1 -0
  17. package/lib/relations.js +938 -0
  18. package/lib/relations.js.map +1 -0
  19. package/lib/repositories/abstract.d.ts +124 -0
  20. package/lib/repositories/abstract.d.ts.map +1 -0
  21. package/lib/repositories/abstract.js +249 -0
  22. package/lib/repositories/abstract.js.map +1 -0
  23. package/lib/repositories/conformance.d.ts +40 -0
  24. package/lib/repositories/conformance.d.ts.map +1 -0
  25. package/lib/repositories/conformance.js +38 -0
  26. package/lib/repositories/conformance.js.map +1 -0
  27. package/lib/repositories/event.d.ts +100 -0
  28. package/lib/repositories/event.d.ts.map +1 -0
  29. package/lib/repositories/event.js +226 -0
  30. package/lib/repositories/event.js.map +1 -0
  31. package/lib/repositories/hooks.d.ts +88 -0
  32. package/lib/repositories/hooks.d.ts.map +1 -0
  33. package/lib/repositories/hooks.js +105 -0
  34. package/lib/repositories/hooks.js.map +1 -0
  35. package/lib/repositories/memory.d.ts +208 -0
  36. package/lib/repositories/memory.d.ts.map +1 -0
  37. package/lib/repositories/memory.js +446 -0
  38. package/lib/repositories/memory.js.map +1 -0
  39. package/lib/repositories/repository.d.ts +238 -0
  40. package/lib/repositories/repository.d.ts.map +1 -0
  41. package/lib/repositories/repository.js +19 -0
  42. package/lib/repositories/repository.js.map +1 -0
  43. package/lib/storable.d.ts +200 -0
  44. package/lib/storable.d.ts.map +1 -0
  45. package/lib/storable.js +66 -0
  46. package/lib/storable.js.map +1 -0
  47. package/lib/types.d.ts +230 -0
  48. package/lib/types.d.ts.map +1 -0
  49. package/lib/types.js +12 -0
  50. package/lib/types.js.map +1 -0
  51. package/package.json +60 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/repositories/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,446 @@
1
+ var _a;
2
+ import { deserialize, serialize, serializeRaw } from "@webda/serialize";
3
+ import { AbstractRepository } from "./abstract.js";
4
+ import { WEBDA_TEST } from "./repository.js";
5
+ /** Lazily-loaded WebdaQL module for query parsing */
6
+ let WebdaQL = null;
7
+ /**
8
+ * This is a simple in-memory repository implementation
9
+ * It is used for testing purposes only
10
+ */
11
+ export class MemoryRepository extends AbstractRepository {
12
+ static { _a = WEBDA_TEST; }
13
+ /**
14
+ * @param model - The model class constructor
15
+ * @param pks - Primary key field names
16
+ * @param separator - Composite key separator (default: "_")
17
+ * @param map - Optional pre-existing Map to use as storage backend
18
+ */
19
+ constructor(model, pks, separator, map) {
20
+ super(model, pks, separator);
21
+ /** Test utilities - clears all stored data */
22
+ this[_a] = {
23
+ clear: async () => {
24
+ this.storage.clear();
25
+ }
26
+ };
27
+ this.storage = map || new Map();
28
+ }
29
+ /** @override */
30
+ async get(primaryKey) {
31
+ const key = this.getPrimaryKey(primaryKey).toString();
32
+ const item = this.storage.get(key);
33
+ if (!item)
34
+ throw new Error(`Not found: ${key}`);
35
+ return this.deserialize(item);
36
+ }
37
+ /** @override */
38
+ async create(data, save = true) {
39
+ const item = this.buildItem(data);
40
+ // The key is read from the built item: a primary key generated by the model
41
+ // (e.g. UuidModel) must be the one used for storage
42
+ const key = this.getPrimaryKey(item).toString();
43
+ if (this.storage.has(key)) {
44
+ throw new Error(`Already exists: ${key}`);
45
+ }
46
+ if (save !== false) {
47
+ this.storage.set(key, this.serialize(item));
48
+ }
49
+ return item;
50
+ }
51
+ /** @override */
52
+ async update(data, conditionField, condition) {
53
+ const item = (await this.get(this.getPrimaryKey(data)));
54
+ this.checkCondition(item, conditionField, condition);
55
+ this.storage.set(this.getPrimaryKey(data).toString(), this.serialize(new this.model(data)));
56
+ }
57
+ /**
58
+ * Verify an optimistic locking condition on an item
59
+ * @param item - The item to check
60
+ * @param conditionField - Field to validate
61
+ * @param condition - Expected value
62
+ * @throws Error if the condition does not match
63
+ */
64
+ checkCondition(item, conditionField, condition) {
65
+ if (conditionField) {
66
+ if (item[conditionField] !== condition) {
67
+ throw new Error(`Condition failed: ${conditionField} !== ${condition}`);
68
+ }
69
+ }
70
+ }
71
+ /** @override */
72
+ async patch(primaryKey, data, conditionField, condition) {
73
+ const item = (await this.get(primaryKey));
74
+ this.checkCondition(item, conditionField, condition);
75
+ item.load(data);
76
+ this.storage.set(item.getPrimaryKey().toString(), this.serialize(item));
77
+ }
78
+ /**
79
+ * Serialize the object to a string
80
+ *
81
+ * This method is used to allow switching between different serialization methods
82
+ *
83
+ * The serialized payload is also stamped with a top-level `__type` field
84
+ * carrying the concrete model identifier when available
85
+ * (`item.constructor.Metadata?.Identifier`). This lets `query()` and external
86
+ * storage backends filter results by class without re-instantiating every
87
+ * item — important when a single underlying storage map is shared across a
88
+ * model and its subclasses (the common case in production where each
89
+ * registered model owns its own MemoryRepository pointing at the same Map).
90
+ *
91
+ * The stamp lives on the serializer envelope (sibling of `value` /
92
+ * `$serializer`), not inside `value`. `deserialize()` re-surfaces it on the
93
+ * reconstructed instance as a non-enumerable `__type` property so WebdaQL's
94
+ * filter eval can read it without it ever leaking into `JSON.stringify` or
95
+ * `Object.keys` output — keeping API responses and re-serialize cycles
96
+ * byte-identical for the model's own fields.
97
+ *
98
+ * Models that don't carry Metadata (plain unit-test classes that don't go
99
+ * through Application.setModelMetadata) simply skip the stamp; the resulting
100
+ * payload is byte-identical to the previous implementation.
101
+ *
102
+ * @param item to serialize
103
+ * @returns serialized object
104
+ */
105
+ serialize(item) {
106
+ const typeIdentifier = item?.constructor?.Metadata?.Identifier;
107
+ if (!typeIdentifier) {
108
+ return serialize(item);
109
+ }
110
+ const raw = serializeRaw(item);
111
+ // serializeRaw returns either { value, $serializer } for objects with
112
+ // metadata, or just the raw value for primitives. Models always come back
113
+ // in the former shape; stamp __type at the envelope level (sibling of
114
+ // value/$serializer) so the deserializer never copies it onto the model.
115
+ if (raw && typeof raw === "object" && raw.value !== undefined) {
116
+ if (raw.__type === undefined) {
117
+ raw.__type = typeIdentifier;
118
+ }
119
+ }
120
+ return JSON.stringify(raw);
121
+ }
122
+ /**
123
+ * Unserialize the object from a string
124
+ *
125
+ * Beyond restoring the concrete type via `@webda/serialize`'s
126
+ * `$serializer.type` typeKey, this also surfaces the storage envelope's
127
+ * `__type` stamp on the in-memory instance as a NON-ENUMERABLE property. The
128
+ * non-enumerable bit keeps `__type` invisible to `JSON.stringify` and
129
+ * `Object.keys` (so API responses and re-serialize cycles are byte-identical
130
+ * for the model's own fields), while still being readable via direct
131
+ * property access — which is exactly how WebdaQL's filter eval reads it
132
+ * (`ComparisonExpression.getAttributeValue` walks `obj[name]`).
133
+ *
134
+ * Backward-compat: legacy rows written before the envelope-stamping was
135
+ * introduced won't carry `__type`. In that case we backfill from the
136
+ * repository's own `model.Metadata.Identifier` so they look like records of
137
+ * the parent class — which is exactly what `query()`'s prepended class
138
+ * filter expects (parent + descendants). Plain unit-test classes without
139
+ * Metadata get no stamp at all; their repos opt out of class filtering on
140
+ * the query side too (see `query`).
141
+ *
142
+ * @param item - the serialized string
143
+ * @returns the deserialized model instance
144
+ */
145
+ deserialize(item) {
146
+ const instance = deserialize(item);
147
+ // Re-parse the envelope to read `__type` (the serializer's deserialize
148
+ // path strips it because it's not in `value`). This is cheap relative to
149
+ // deserialize itself.
150
+ let typeFromEnvelope;
151
+ try {
152
+ const raw = JSON.parse(item);
153
+ if (raw && typeof raw === "object") {
154
+ typeFromEnvelope = raw.__type;
155
+ }
156
+ }
157
+ catch {
158
+ // Non-JSON or malformed; skip the stamp — instance is still usable.
159
+ }
160
+ const stamped = typeFromEnvelope ?? this.model?.Metadata?.Identifier;
161
+ if (stamped) {
162
+ Object.defineProperty(instance, "__type", {
163
+ value: stamped,
164
+ enumerable: false,
165
+ configurable: true,
166
+ writable: true
167
+ });
168
+ }
169
+ return instance;
170
+ }
171
+ /**
172
+ * Collect the WebdaQL class-filter identifier list — `this.model`'s
173
+ * identifier and every transitive descendant carried in `Metadata.Subclasses`.
174
+ *
175
+ * Returns `undefined` when the model carries no `Metadata` (plain unit-test
176
+ * classes that didn't go through `Application.setModelMetadata`). In that
177
+ * case `query()` skips the prepend and returns everything in storage,
178
+ * preserving the pre-fix behavior for those bare classes.
179
+ *
180
+ * @returns the list of identifiers to match, or `undefined` when no Metadata
181
+ */
182
+ buildClassFilterIdentifiers() {
183
+ const meta = this.model?.Metadata;
184
+ if (!meta?.Identifier)
185
+ return undefined;
186
+ const ids = [meta.Identifier];
187
+ const subclasses = Array.isArray(meta.Subclasses) ? meta.Subclasses : [];
188
+ for (const sub of subclasses) {
189
+ const id = sub?.Metadata?.Identifier;
190
+ if (typeof id === "string" && !ids.includes(id))
191
+ ids.push(id);
192
+ }
193
+ return ids;
194
+ }
195
+ /**
196
+ * Build the WebdaQL class-filter clause `__type IN ['A', 'B', ...]` covering
197
+ * `this.model`'s identifier and every transitive descendant.
198
+ *
199
+ * Returns `undefined` when the model carries no `Metadata`.
200
+ *
201
+ * @returns the class-filter WebdaQL clause, or `undefined` when no Metadata
202
+ */
203
+ buildClassFilter() {
204
+ const ids = this.buildClassFilterIdentifiers();
205
+ if (!ids)
206
+ return undefined;
207
+ // Single-quote each id; escape embedded single quotes by doubling them.
208
+ const literals = ids.map(id => `'${id.replace(/'/g, "''")}'`).join(", ");
209
+ return `__type IN [${literals}]`;
210
+ }
211
+ /**
212
+ * Add query support
213
+ *
214
+ * Class filtering: when several model classes share the same underlying
215
+ * storage Map (e.g. a model and its subclasses each registering their own
216
+ * repository pointing at the same `Map` via `MemoryStore.getRepository`),
217
+ * results are restricted to instances of `this.model` and its transitive
218
+ * descendants. The filter is applied as a real WebdaQL clause —
219
+ * `__type IN ['Webda/Post', 'Webda/BlogPost', ...]` — prepended to the
220
+ * caller's query via `WebdaQL.PrependCondition` (string path) or merged
221
+ * directly into the AST (parsed-Query path used by `iterate`). Each stored
222
+ * item carries its `__type` as a non-enumerable property courtesy of
223
+ * `deserialize`, so the WebdaQL filter eval reads it directly without
224
+ * leaking it to JSON serialization. There is no post-filter step.
225
+ *
226
+ * Models without `Metadata` (plain unit-test classes) opt out of the
227
+ * prepend — `buildClassFilterIdentifiers` returns `undefined` and the query
228
+ * runs as given. External storage backends that adopt the same `__type`
229
+ * stamping convention can use `buildClassFilter` to produce the equivalent
230
+ * server-side WHERE clause.
231
+ *
232
+ * @param query - the query string or parsed query
233
+ * @param params - values for the `?` or `:name` placeholders of a query string
234
+ * @returns the query results with optional continuation token
235
+ */
236
+ async query(query, params) {
237
+ WebdaQL ??= await import("@webda/ql");
238
+ if (typeof query === "string" && params !== undefined) {
239
+ query = WebdaQL.bind(query, params);
240
+ }
241
+ const ids = this.buildClassFilterIdentifiers();
242
+ let parsed;
243
+ if (typeof query === "string") {
244
+ const merged = ids ? WebdaQL.PrependCondition(query, this.buildClassFilter()) : query;
245
+ parsed = WebdaQL.parse(merged);
246
+ }
247
+ else {
248
+ parsed = query;
249
+ if (ids) {
250
+ // Merge the class filter directly into the AST so callers like
251
+ // `iterate()` keep their per-page mutations on the parsed Query
252
+ // (notably `continuationToken`) — re-stringifying via toString() loses
253
+ // those because parse-tree-backed toString reflects the original
254
+ // source, not later runtime mutations.
255
+ const classClause = new WebdaQL.ComparisonExpression("IN", "__type", ids);
256
+ const current = parsed.filter;
257
+ if (current instanceof WebdaQL.AndExpression) {
258
+ // Avoid double-prepend across pages of `iterate()`.
259
+ const already = current.children.some((c) => c instanceof WebdaQL.ComparisonExpression && c.operator === "IN" && c.attribute?.[0] === "__type");
260
+ if (!already) {
261
+ current.children.unshift(classClause);
262
+ }
263
+ }
264
+ else {
265
+ parsed.filter = new WebdaQL.AndExpression([classClause, current]);
266
+ }
267
+ }
268
+ }
269
+ return MemoryRepository.simulateFind(parsed, [...this.storage.keys()], this);
270
+ }
271
+ /**
272
+ * Allow to simulate a find on a list of uuids
273
+ * It is static to be reusable by other repository like FileRepository
274
+ * @param query - the parsed query
275
+ * @param uuids - the list of UIDs to search
276
+ * @param repository - the repository to fetch objects from
277
+ * @returns the query results with optional continuation token
278
+ */
279
+ static async simulateFind(query, uuids, repository) {
280
+ const result = {
281
+ results: [],
282
+ continuationToken: undefined,
283
+ filter: true
284
+ };
285
+ let count = 0;
286
+ let limit = query.limit;
287
+ let offset = parseInt(query.continuationToken || "0");
288
+ const originalOffset = offset;
289
+ if (query.orderBy && query.orderBy.length) {
290
+ offset = 0;
291
+ // We need to retrieve everything to orderBy after
292
+ limit = Number.MAX_SAFE_INTEGER;
293
+ }
294
+ // Need to transfert to Array
295
+ for (const uuid of uuids) {
296
+ count++;
297
+ // Offset start
298
+ if (offset >= count) {
299
+ continue;
300
+ }
301
+ const obj = (await repository.get(uuid));
302
+ if (obj && query.filter.eval(obj)) {
303
+ result.results.push(obj);
304
+ if (result.results.length >= limit) {
305
+ result.continuationToken = count.toString();
306
+ return result;
307
+ }
308
+ }
309
+ }
310
+ // Order by
311
+ if (query.orderBy && query.orderBy.length) {
312
+ // Sorting the results
313
+ result.results.sort((a, b) => {
314
+ let valA, valB;
315
+ for (const orderBy of query.orderBy) {
316
+ const invert = orderBy.direction === "ASC" ? 1 : -1;
317
+ valA = WebdaQL.ComparisonExpression.getAttributeValue(a, orderBy.field.split("."));
318
+ valB = WebdaQL.ComparisonExpression.getAttributeValue(b, orderBy.field.split("."));
319
+ if (valA === valB) {
320
+ continue;
321
+ }
322
+ if (typeof valA === "string") {
323
+ return valA.localeCompare(valB) * invert;
324
+ }
325
+ return (valA < valB ? -1 : 1) * invert;
326
+ }
327
+ return -1;
328
+ });
329
+ result.results = result.results.slice(originalOffset, query.limit + originalOffset);
330
+ if (result.results.length >= query.limit) {
331
+ result.continuationToken = (query.limit + originalOffset).toString();
332
+ }
333
+ }
334
+ return result;
335
+ }
336
+ /**
337
+ * Add iterator support
338
+ * @param query - the query string
339
+ * @param params - values for the `?` or `:name` placeholders
340
+ */
341
+ async *iterate(query, params) {
342
+ WebdaQL ??= await import("@webda/ql");
343
+ if (params !== undefined) {
344
+ query = WebdaQL.bind(query, params);
345
+ }
346
+ /* c8 ignore next */
347
+ const q = WebdaQL.parse(query); // Ensure it is valid
348
+ if (!q.limit) {
349
+ q.limit = 100; // Default pagination size
350
+ }
351
+ do {
352
+ const res = await this.query(q);
353
+ for (const i of res.results) {
354
+ yield i;
355
+ }
356
+ q.continuationToken = res.continuationToken;
357
+ } while (q.continuationToken);
358
+ }
359
+ /** @override */
360
+ async delete(primaryKey, _conditionField, _condition) {
361
+ this.storage.delete(this.getPrimaryKey(primaryKey).toString());
362
+ }
363
+ /** @override */
364
+ async exists(primaryKey) {
365
+ return this.storage.has(this.getPrimaryKey(primaryKey).toString());
366
+ }
367
+ /** @override */
368
+ async incrementAttributes(primaryKey, info, _conditionField, _condition) {
369
+ const item = (await this.get(primaryKey));
370
+ if (Array.isArray(info)) {
371
+ for (const entry of info) {
372
+ const prop = typeof entry === "string" ? entry : entry.property;
373
+ const inc = typeof entry === "string" ? 1 : (entry.value ?? 1);
374
+ const parts = prop.split(".");
375
+ let current = item;
376
+ for (let i = 0; i < parts.length - 1; i++) {
377
+ const part = parts[i];
378
+ current[part] ??= {};
379
+ current = current[part];
380
+ }
381
+ const lastPart = parts[parts.length - 1];
382
+ current[lastPart] = (current[lastPart] || 0) + inc;
383
+ }
384
+ }
385
+ else {
386
+ for (const prop in info) {
387
+ const parts = prop.split(".");
388
+ let current = item;
389
+ for (let i = 0; i < parts.length - 1; i++) {
390
+ const part = parts[i];
391
+ current[part] ??= {};
392
+ current = current[part];
393
+ }
394
+ const lastPart = parts[parts.length - 1];
395
+ current[lastPart] = (current[lastPart] || 0) + info[prop];
396
+ }
397
+ }
398
+ this.storage.set(this.getPrimaryKey(primaryKey).toString(), this.serialize(item));
399
+ }
400
+ /**
401
+ * Verify a write condition on a collection item
402
+ * @param item - The array to check
403
+ * @param index - Index of the item in the array
404
+ * @param itemWriteConditionField - Field name to check on the item
405
+ * @param itemWriteCondition - Expected value for the field
406
+ * @throws Error if the condition does not match
407
+ */
408
+ checkItemWriteCondition(item, index, itemWriteConditionField, itemWriteCondition) {
409
+ if ((Array.isArray(item) && index < item.length && item[index][itemWriteConditionField] === itemWriteCondition) ||
410
+ !itemWriteCondition) {
411
+ return;
412
+ }
413
+ throw new Error("Item write condition failed");
414
+ }
415
+ /** @override */
416
+ async upsertItemToCollection(primaryKey, collection, item, index, itemWriteConditionField, itemWriteCondition) {
417
+ const obj = (await this.get(primaryKey));
418
+ obj[collection] ??= [];
419
+ this.checkItemWriteCondition(obj[collection], index, itemWriteConditionField, itemWriteCondition);
420
+ const arr = obj[collection];
421
+ if (typeof index === "number") {
422
+ arr[index] = item;
423
+ }
424
+ else {
425
+ arr.push(item);
426
+ }
427
+ this.storage.set(this.getPrimaryKey(primaryKey).toString(), this.serialize(obj));
428
+ }
429
+ /** @override */
430
+ async deleteItemFromCollection(primaryKey, collection, index, itemWriteConditionField, itemWriteCondition) {
431
+ const obj = (await this.get(primaryKey));
432
+ const arr = obj[collection];
433
+ this.checkItemWriteCondition(obj[collection], index, itemWriteConditionField, itemWriteCondition);
434
+ if (Array.isArray(arr) && index >= 0 && index < arr.length) {
435
+ arr.splice(index, 1);
436
+ this.storage.set(this.getPrimaryKey(primaryKey).toString(), this.serialize(obj));
437
+ }
438
+ }
439
+ /** @override */
440
+ async removeAttribute(primaryKey, attribute, _conditionField, _condition) {
441
+ const obj = (await this.get(primaryKey));
442
+ delete obj[attribute];
443
+ this.storage.set(this.getPrimaryKey(primaryKey).toString(), this.serialize(obj));
444
+ }
445
+ }
446
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/repositories/memory.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAc,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAiBzD,qDAAqD;AACrD,IAAI,OAAO,GAEP,IAAI,CAAC;AAQT;;;GAGG;AACH,MAAM,OAAO,gBAGX,SAAQ,kBAAqB;kBA0gB5B,UAAU;IAvgBX;;;;;OAKG;IACH,YAAY,KAAQ,EAAE,GAAa,EAAE,SAAkB,EAAE,GAAO;QAC9D,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QA+f/B,8CAA8C;QAC9C,QAAY,GAAG;YACb,KAAK,EAAE,KAAK,IAAI,EAAE;gBAChB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;SACF,CAAC;QAngBA,IAAI,CAAC,OAAO,GAAG,GAAG,IAAK,IAAI,GAAG,EAAwB,CAAC;IACzD,CAAC;IACD,gBAAgB;IAChB,KAAK,CAAC,GAAG,CACP,UAA2F;QAE3F,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAA6B,CAAC;IAC5D,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,MAAM,CAAC,IAA8B,EAAE,IAAI,GAAY,IAAI;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,4EAA4E;QAC5E,oDAAoD;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,MAAM,CACV,IAA8B,EAC9B,cAAyB,EACzB,SAAe;QAEf,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAoB,CAAC;QAC3E,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC,CAAC,CAAC;IACjH,CAAC;IAED;;;;;;OAMG;IACO,cAAc,CACtB,IAAqB,EACrB,cAAyB,EACzB,SAAe;QAEf,IAAI,cAAc,EAAE,CAAC;YACnB,IAAK,IAAY,CAAC,cAAwB,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,qBAAqB,cAAwB,QAAQ,SAAS,EAAE,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;IACH,CAAC;IACD,gBAAgB;IAChB,KAAK,CAAC,KAAK,CACT,UAA2F,EAC3F,IAA8B,EAC9B,cAAyB,EACzB,SAAe;QAEf,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAoB,CAAC;QAC7D,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,SAAS,CAAC,IAAqB;QAC7B,MAAM,cAAc,GAAI,IAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC;QACxE,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC/B,sEAAsE;QACtE,0EAA0E;QAC1E,sEAAsE;QACtE,yEAAyE;QACzE,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9D,IAAK,GAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACrC,GAAW,CAAC,MAAM,GAAG,cAAc,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,WAAW,CAAC,IAAY;QACtB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAoB,CAAC;QACtD,uEAAuE;QACvE,yEAAyE;QACzE,sBAAsB;QACtB,IAAI,gBAAoC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACnC,gBAAgB,GAAI,GAAW,CAAC,MAAM,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;QACtE,CAAC;QACD,MAAM,OAAO,GAAG,gBAAgB,IAAK,IAAI,CAAC,KAAa,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC9E,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE;gBACxC,KAAK,EAAE,OAAO;gBACd,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;;;;;OAUG;IACO,2BAA2B;QACnC,MAAM,IAAI,GAAS,IAAI,CAAC,KAAa,EAAE,QAAQ,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,UAAU;YAAE,OAAO,SAAS,CAAC;QAExC,MAAM,GAAG,GAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,UAAU,GAAU,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC;YACrC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;;OAOG;IACO,gBAAgB;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAC/C,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,wEAAwE;QACxE,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,OAAO,cAAc,QAAQ,GAAG,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,KAAK,CAAC,KAAK,CACT,KAAqB,EACrB,MAAwB;QAExB,OAAO,KAAK,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACtD,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAC/C,IAAI,MAAa,CAAC;QAElB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACvF,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,KAAc,CAAC;YACxB,IAAI,GAAG,EAAE,CAAC;gBACR,+DAA+D;gBAC/D,gEAAgE;gBAChE,uEAAuE;gBACvE,iEAAiE;gBACjE,uCAAuC;gBACvC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAC1E,MAAM,OAAO,GAAS,MAAc,CAAC,MAAM,CAAC;gBAC5C,IAAI,OAAO,YAAY,OAAO,CAAC,aAAa,EAAE,CAAC;oBAC7C,oDAAoD;oBACpD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CACnC,CAAC,CAAM,EAAE,EAAE,CACT,CAAC,YAAY,OAAO,CAAC,oBAAoB,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,CACpG,CAAC;oBACF,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACL,MAAc,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,gBAAgB,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CACvB,KAAY,EACZ,KAAY,EACZ,UAAyB;QAEzB,MAAM,MAAM,GAAgC;YAC1C,OAAO,EAAE,EAAE;YACX,iBAAiB,EAAE,SAAS;YAC5B,MAAM,EAAE,IAAI;SACb,CAAC;QACF,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,IAAI,GAAG,CAAC,CAAC;QACtD,MAAM,cAAc,GAAG,MAAM,CAAC;QAE9B,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,GAAG,CAAC,CAAC;YACX,kDAAkD;YAClD,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAClC,CAAC;QACD,6BAA6B;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,EAAE,CAAC;YACR,eAAe;YACf,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;gBACpB,SAAS;YACX,CAAC;YACD,MAAM,GAAG,GAAG,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,IAAW,CAAC,CAAoB,CAAC;YACnE,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzB,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;oBACnC,MAAM,CAAC,iBAAiB,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAC5C,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QAED,WAAW;QACX,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1C,sBAAsB;YACtB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC3B,IAAI,IAAI,EAAE,IAAI,CAAC;gBACf,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,OAAQ,EAAE,CAAC;oBACrC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACpD,IAAI,GAAG,OAAO,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;oBACnF,IAAI,GAAG,OAAO,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;oBACnF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBAClB,SAAS;oBACX,CAAC;oBACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC7B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;oBAC3C,CAAC;oBACD,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;gBACzC,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC;YACpF,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACzC,MAAM,CAAC,iBAAiB,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvE,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,OAAO,CAAC,KAAa,EAAE,MAAwB;QACpD,OAAO,KAAK,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,oBAAoB;QACpB,MAAM,CAAC,GAAU,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,qBAAqB;QAC5D,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACb,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,0BAA0B;QAC3C,CAAC;QACD,GAAG,CAAC;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC5B,MAAM,CAAoB,CAAC;YAC7B,CAAC;YACD,CAAC,CAAC,iBAAiB,GAAG,GAAG,CAAC,iBAAiB,CAAC;QAC9C,CAAC,QAAQ,CAAC,CAAC,iBAAiB,EAAE;IAChC,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,MAAM,CACV,UAAkF,EAClF,eAA0B,EAC1B,UAAgB;QAEhB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,MAAM,CACV,UAA2F;QAE3F,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,mBAAmB,CACvB,UAA2F,EAC3F,IAAiE,EACjE,eAA0B,EAC1B,UAAgB;QAEhB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAoB,CAAC;QAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,KAAa,CAAC,QAAQ,CAAC;gBACzE,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,KAAa,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;gBACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,OAAO,GAAQ,IAAI,CAAC;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtB,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACrB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;gBACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACxC,OAAe,CAAC,QAAQ,CAAC,GAAG,CAAE,OAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YACvE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,OAAO,GAAQ,IAAI,CAAC;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtB,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACrB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;gBACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACxC,OAAe,CAAC,QAAQ,CAAC,GAAG,CAAE,OAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAE,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACpF,CAAC;IAED;;;;;;;OAOG;IACO,uBAAuB,CAC/B,IAAW,EACX,KAAa,EACb,uBAA+B,EAC/B,kBAAuB;QAEvB,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,uBAAuB,CAAC,KAAK,kBAAkB,CAAC;YAC3G,CAAC,kBAAkB,EACnB,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,sBAAsB,CAI1B,UAAkF,EAClF,UAAa,EACb,IAAiF,EACjF,KAAc,EACd,uBAA6B,EAC7B,kBAAwB;QAExB,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAoB,CAAC;QAC3D,GAAW,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,uBAAuB,CAC1B,GAAG,CAAC,UAAU,CAAe,EAC7B,KAAe,EACf,uBAAuB,EACvB,kBAAkB,CACnB,CAAC;QACF,MAAM,GAAG,GAAI,GAAW,CAAC,UAAU,CAAe,CAAC;QACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,wBAAwB,CAI5B,UAAkF,EAClF,UAAa,EACb,KAAa,EACb,uBAA6B,EAC7B,kBAAwB;QAExB,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAoB,CAAC;QAC5D,MAAM,GAAG,GAAI,GAAW,CAAC,UAAU,CAAe,CAAC;QACnD,IAAI,CAAC,uBAAuB,CAC1B,GAAG,CAAC,UAAU,CAAe,EAC7B,KAAe,EACf,uBAAuB,EACvB,kBAAkB,CACnB,CAAC;QACF,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YAC3D,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,eAAe,CACnB,UAAkF,EAClF,SAAY,EACZ,eAA0B,EAC1B,UAAgB;QAEhB,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAoB,CAAC;QAC5D,OAAQ,GAAW,CAAC,SAAmB,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,CAAC;CAQF"}