@prisma-next/framework-components 0.12.0-dev.6 → 0.12.0-dev.61

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 (52) hide show
  1. package/dist/authoring.d.mts +1 -1
  2. package/dist/authoring.mjs +1 -1
  3. package/dist/{codec-BFOsuHKK.d.mts → codec-DCQAerzB.d.mts} +1 -1
  4. package/dist/{codec-BFOsuHKK.d.mts.map → codec-DCQAerzB.d.mts.map} +1 -1
  5. package/dist/codec.d.mts +1 -1
  6. package/dist/codec.d.mts.map +1 -1
  7. package/dist/components.d.mts +1 -1
  8. package/dist/components.mjs +1 -1
  9. package/dist/components.mjs.map +1 -1
  10. package/dist/control.d.mts +82 -11
  11. package/dist/control.d.mts.map +1 -1
  12. package/dist/control.mjs +82 -5
  13. package/dist/control.mjs.map +1 -1
  14. package/dist/{emission-types-CMv_053d.d.mts → emission-types-vfpSTe63.d.mts} +2 -2
  15. package/dist/{emission-types-CMv_053d.d.mts.map → emission-types-vfpSTe63.d.mts.map} +1 -1
  16. package/dist/emission.d.mts +3 -3
  17. package/dist/execution.d.mts +1 -1
  18. package/dist/execution.d.mts.map +1 -1
  19. package/dist/execution.mjs +1 -1
  20. package/dist/{framework-authoring-BPPe9C9D.d.mts → framework-authoring-Cv04iZjB.d.mts} +1 -1
  21. package/dist/{framework-authoring-BPPe9C9D.d.mts.map → framework-authoring-Cv04iZjB.d.mts.map} +1 -1
  22. package/dist/{framework-authoring-DcEZ5Lin.mjs → framework-authoring-Szvddbl3.mjs} +1 -1
  23. package/dist/{framework-authoring-DcEZ5Lin.mjs.map → framework-authoring-Szvddbl3.mjs.map} +1 -1
  24. package/dist/{framework-components-CuoUhyB5.d.mts → framework-components-Ce_Cdw76.d.mts} +6 -5
  25. package/dist/{framework-components-CuoUhyB5.d.mts.map → framework-components-Ce_Cdw76.d.mts.map} +1 -1
  26. package/dist/{framework-components-FdqmlGUj.mjs → framework-components-DbCS57go.mjs} +1 -1
  27. package/dist/{framework-components-FdqmlGUj.mjs.map → framework-components-DbCS57go.mjs.map} +1 -1
  28. package/dist/ir.d.mts +20 -18
  29. package/dist/ir.d.mts.map +1 -1
  30. package/dist/ir.mjs +17 -14
  31. package/dist/ir.mjs.map +1 -1
  32. package/dist/{psl-ast-BDXL7iCg.d.mts → psl-ast-CTuBYLYj.d.mts} +12 -3
  33. package/dist/psl-ast-CTuBYLYj.d.mts.map +1 -0
  34. package/dist/psl-ast.d.mts +1 -1
  35. package/dist/psl-ast.mjs.map +1 -1
  36. package/dist/runtime.d.mts +1 -1
  37. package/dist/runtime.d.mts.map +1 -1
  38. package/dist/runtime.mjs.map +1 -1
  39. package/dist/{types-import-spec-BxI5cSQy.d.mts → types-import-spec-DRKzrJ20.d.mts} +1 -1
  40. package/dist/{types-import-spec-BxI5cSQy.d.mts.map → types-import-spec-DRKzrJ20.d.mts.map} +1 -1
  41. package/dist/utils.mjs.map +1 -1
  42. package/package.json +9 -9
  43. package/src/control/control-instances.ts +15 -5
  44. package/src/control/control-migration-types.ts +12 -0
  45. package/src/control/control-stack.ts +98 -3
  46. package/src/control/psl-ast.ts +11 -2
  47. package/src/control/verifier-disposition.ts +62 -0
  48. package/src/exports/control.ts +7 -0
  49. package/src/ir/namespace.ts +15 -13
  50. package/src/ir/storage.ts +8 -7
  51. package/src/shared/framework-components.ts +2 -0
  52. package/dist/psl-ast-BDXL7iCg.d.mts.map +0 -1
@@ -345,12 +345,107 @@ export function validateScalarTypeCodecIds(
345
345
  return errors;
346
346
  }
347
347
 
348
+ interface DependencyDeclaringDescriptor {
349
+ readonly id: string;
350
+ readonly contractSpace?: {
351
+ readonly contractJson?: {
352
+ readonly extensionPacks?: Readonly<Record<string, unknown>>;
353
+ };
354
+ };
355
+ }
356
+
357
+ function readDeclaredDependencyIds(descriptor: DependencyDeclaringDescriptor): readonly string[] {
358
+ const packs = descriptor.contractSpace?.contractJson?.extensionPacks;
359
+ if (packs === null || typeof packs !== 'object') return [];
360
+ return Object.keys(packs);
361
+ }
362
+
363
+ /**
364
+ * Builds a dependency-respecting load order for the given extension descriptors
365
+ * using Kahn's topological sort algorithm. Dependencies (packs declared in
366
+ * `contractSpace.contractJson.extensionPacks`) are placed before the extensions
367
+ * that depend on them.
368
+ *
369
+ * Throws if the dependency graph contains a cycle, with an error message that
370
+ * names every extension involved in the cycle.
371
+ *
372
+ * Throws if any extension declares a dependency on a pack ID that is not present
373
+ * in the provided list — add the missing pack to the `extensionPacks` list to
374
+ * resolve the error.
375
+ */
376
+
377
+ export function buildExtensionLoadOrder(
378
+ extensions: ReadonlyArray<DependencyDeclaringDescriptor>,
379
+ ): readonly string[] {
380
+ if (extensions.length === 0) return [];
381
+
382
+ const idSet = new Set(extensions.map((e) => e.id));
383
+ const inDegree = new Map<string, number>();
384
+ const dependents = new Map<string, string[]>();
385
+
386
+ for (const ext of extensions) {
387
+ if (!inDegree.has(ext.id)) inDegree.set(ext.id, 0);
388
+ if (!dependents.has(ext.id)) dependents.set(ext.id, []);
389
+ }
390
+
391
+ for (const ext of extensions) {
392
+ for (const depId of readDeclaredDependencyIds(ext)) {
393
+ if (!idSet.has(depId)) {
394
+ throw new Error(
395
+ `Extension "${ext.id}" declares a dependency on "${depId}", but "${depId}" is not in the provided extension set. Add the missing space to extensionPacks.`,
396
+ );
397
+ }
398
+ inDegree.set(ext.id, (inDegree.get(ext.id) ?? 0) + 1);
399
+ const list = dependents.get(depId);
400
+ if (list !== undefined) list.push(ext.id);
401
+ }
402
+ }
403
+
404
+ const queue: string[] = [];
405
+ for (const [id, deg] of inDegree) {
406
+ if (deg === 0) queue.push(id);
407
+ }
408
+ queue.sort();
409
+
410
+ const result: string[] = [];
411
+ while (queue.length > 0) {
412
+ const id = queue.shift();
413
+ if (id === undefined) break;
414
+ result.push(id);
415
+ const children = dependents.get(id) ?? [];
416
+ children.sort();
417
+ for (const childId of children) {
418
+ const newDeg = (inDegree.get(childId) ?? 1) - 1;
419
+ inDegree.set(childId, newDeg);
420
+ if (newDeg === 0) queue.push(childId);
421
+ }
422
+ }
423
+
424
+ if (result.length < extensions.length) {
425
+ const cycleMembers = extensions
426
+ .map((e) => e.id)
427
+ .filter((id) => !result.includes(id))
428
+ .sort();
429
+ throw new Error(
430
+ `Extension dependency cycle detected. Cycle members: ${cycleMembers.map((id) => `"${id}"`).join(', ')}.`,
431
+ );
432
+ }
433
+
434
+ return result;
435
+ }
436
+
348
437
  export function createControlStack<TFamilyId extends string, TTargetId extends string>(
349
438
  input: CreateControlStackInput<TFamilyId, TTargetId>,
350
439
  ): ControlStack<TFamilyId, TTargetId> {
351
440
  const { family, target, adapter, driver, extensionPacks = [] } = input;
352
441
 
353
- const allDescriptors = [family, target, ...(adapter ? [adapter] : []), ...extensionPacks];
442
+ const orderedIds = buildExtensionLoadOrder(extensionPacks);
443
+ const extensionById = new Map(extensionPacks.map((ext) => [ext.id, ext]));
444
+ const orderedExtensionPacks = orderedIds
445
+ .map((id) => extensionById.get(id))
446
+ .filter((ext): ext is ControlExtensionDescriptor<TFamilyId, TTargetId> => ext !== undefined);
447
+
448
+ const allDescriptors = [family, target, ...(adapter ? [adapter] : []), ...orderedExtensionPacks];
354
449
 
355
450
  const codecLookup = extractCodecLookup(allDescriptors);
356
451
  const scalarTypeDescriptors = assembleScalarTypeDescriptors(allDescriptors);
@@ -360,11 +455,11 @@ export function createControlStack<TFamilyId extends string, TTargetId extends s
360
455
  target,
361
456
  adapter,
362
457
  driver,
363
- extensionPacks: extensionPacks as readonly ControlExtensionDescriptor<TFamilyId, TTargetId>[],
458
+ extensionPacks: orderedExtensionPacks,
364
459
 
365
460
  codecTypeImports: extractCodecTypeImports(allDescriptors),
366
461
  queryOperationTypeImports: extractQueryOperationTypeImports(allDescriptors),
367
- extensionIds: extractComponentIds(family, target, adapter, extensionPacks),
462
+ extensionIds: extractComponentIds(family, target, adapter, orderedExtensionPacks),
368
463
  codecLookup,
369
464
  authoringContributions: assembleAuthoringContributions(allDescriptors),
370
465
  scalarTypeDescriptors,
@@ -82,10 +82,19 @@ export type PslFieldAttribute = PslAttribute;
82
82
  export interface PslField {
83
83
  readonly kind: 'field';
84
84
  readonly name: string;
85
- /** Unqualified type name, e.g. `"User"` for both `User` and `auth.User`. */
85
+ /** Unqualified type name, e.g. `"User"` for both `User`, `auth.User`, and `supabase:auth.User`. */
86
86
  readonly typeName: string;
87
- /** Namespace qualifier from a dot-qualified type reference, e.g. `"auth"` for `auth.User`. Absent for unqualified types. */
87
+ /** Namespace qualifier from a dot-qualified type reference, e.g. `"auth"` for `auth.User` or `supabase:auth.User`. Absent for unqualified types. */
88
88
  readonly typeNamespaceId?: string;
89
+ /**
90
+ * Contract-space qualifier from a colon-prefix type reference, e.g. `"supabase"` for
91
+ * `supabase:auth.User` or `supabase:User`. Absent for local (same-space) type references.
92
+ *
93
+ * When present, the field references a model from a different contract space. The namespace
94
+ * (`typeNamespaceId`) and model name (`typeName`) identify the target within that space.
95
+ * Physical table resolution against the extension contract is deferred to the aggregate stage (M3).
96
+ */
97
+ readonly typeContractSpaceId?: string;
89
98
  readonly typeConstructor?: PslTypeConstructorCall;
90
99
  readonly optional: boolean;
91
100
  readonly list: boolean;
@@ -0,0 +1,62 @@
1
+ import type { ControlPolicy } from '@prisma-next/contract/types';
2
+ import type { SchemaVerificationNode } from './control-result-types';
3
+
4
+ export type VerificationStatus = SchemaVerificationNode['status'];
5
+
6
+ export type VerifierOutcome = VerificationStatus | 'suppress';
7
+
8
+ /**
9
+ * Target-neutral classification of a verifier finding, abstracted away from any
10
+ * one storage model's vocabulary. Each family classifies its own concrete issue
11
+ * kinds into these categories; the framework only grades the category against a
12
+ * control policy.
13
+ *
14
+ * - `declaredMissing` — a declared object/element is absent from the database.
15
+ * - `declaredIncompatible` — a declared object/element exists but its shape diverges.
16
+ * - `valueDrift` — the value set of an existing type drifted (e.g. enum values).
17
+ * - `extraNestedElement` — an undeclared element nested inside a declared object
18
+ * (a SQL column, a document field).
19
+ * - `extraAuxiliary` — an undeclared auxiliary attached to a declared object
20
+ * (a SQL constraint/index, a Mongo index/validator).
21
+ * - `extraTopLevelObject` — an undeclared top-level object (a SQL table, a
22
+ * Mongo collection).
23
+ */
24
+ export type VerifierIssueCategory =
25
+ | 'declaredMissing'
26
+ | 'declaredIncompatible'
27
+ | 'valueDrift'
28
+ | 'extraNestedElement'
29
+ | 'extraAuxiliary'
30
+ | 'extraTopLevelObject';
31
+
32
+ /**
33
+ * Grades a target-neutral issue category against a control policy.
34
+ *
35
+ * - `observed` warns on everything.
36
+ * - `tolerated` suppresses only an extra nested element (everything else fails).
37
+ * - `external` suppresses every extra category and value drift (existence and
38
+ * declared-shape divergences still fail).
39
+ * - `managed` (and any other) fails.
40
+ */
41
+ export function dispositionForCategory(
42
+ controlPolicy: ControlPolicy,
43
+ category: VerifierIssueCategory,
44
+ ): VerifierOutcome {
45
+ if (controlPolicy === 'observed') {
46
+ return 'warn';
47
+ }
48
+ if (controlPolicy === 'tolerated' && category === 'extraNestedElement') {
49
+ return 'suppress';
50
+ }
51
+ if (controlPolicy === 'external') {
52
+ if (
53
+ category === 'extraNestedElement' ||
54
+ category === 'extraAuxiliary' ||
55
+ category === 'extraTopLevelObject' ||
56
+ category === 'valueDrift'
57
+ ) {
58
+ return 'suppress';
59
+ }
60
+ }
61
+ return 'fail';
62
+ }
@@ -95,6 +95,7 @@ export {
95
95
  assembleControlMutationDefaults,
96
96
  assembleScalarTypeDescriptors,
97
97
  assertUniqueCodecOwner,
98
+ buildExtensionLoadOrder,
98
99
  createControlStack,
99
100
  extractCodecLookup,
100
101
  extractCodecTypeImports,
@@ -106,6 +107,12 @@ export type {
106
107
  SchemaVerifyOptions,
107
108
  SchemaVerifyResult,
108
109
  } from '../control/schema-verifier';
110
+ export type {
111
+ VerificationStatus,
112
+ VerifierIssueCategory,
113
+ VerifierOutcome,
114
+ } from '../control/verifier-disposition';
115
+ export { dispositionForCategory } from '../control/verifier-disposition';
109
116
  export type {
110
117
  ControlMutationDefaultEntry,
111
118
  ControlMutationDefaultRegistry,
@@ -41,28 +41,30 @@ export const UNBOUND_NAMESPACE_ID = '__unbound__' as const;
41
41
  *
42
42
  * The framework promises only the coordinate (`id`) — the named storage
43
43
  * entities a namespace contains are family-typed (SQL contributes
44
- * `tables`, Mongo contributes `collections`, future families pick their
45
- * own native idiom). Generic consumers walking "all named entries" go
46
- * through a family-typed namespace, not the framework `Namespace`.
44
+ * `table` / `type`, Mongo contributes `collection`, future families pick
45
+ * their own native idiom under `entries`). Generic consumers walking "all
46
+ * named entries" go through a family-typed namespace, not the framework
47
+ * `Namespace`.
47
48
  *
48
49
  * Every namespace concretion (e.g. family-built SQL namespaces,
49
50
  * `MongoUnboundNamespace`, target-promoted namespaces like
50
- * `PostgresSchema`) carries exactly: `id` (enumerable string), `kind`
51
- * (non-enumerable string discriminator set via `Object.defineProperty`),
52
- * and one or more entity-kind slot maps each an own-enumerable property
53
- * whose key is the entity kind (`tables`, `types`, `collections`,
54
- * target-pack-contributed slot names) and whose value is a
55
- * `Record<entityName, EntityIRClass>`. No other own-enumerable data lives
56
- * on a namespace; non-entity computed data lives on the surrounding storage
57
- * or contract IR. The framework's `elementCoordinates(storage)` walk relies
58
- * on this invariant to enumerate entities structurally without
59
- * family-specific knowledge.
51
+ * `PostgresSchema`) carries exactly: `id` (enumerable string),
52
+ * `entries` (frozen object holding entity-kind slot maps), and `kind`
53
+ * (non-enumerable string discriminator set via `Object.defineProperty`).
54
+ * Each slot map under `entries` uses a singular essence key (`table`,
55
+ * `type`, `collection`, ) mapping entity names to IR classes. No other
56
+ * own-enumerable data lives on a namespace; non-entity computed data lives
57
+ * on the surrounding storage or contract IR. The framework's
58
+ * `elementCoordinates(storage)` walk relies on this invariant to enumerate
59
+ * entities structurally without family-specific knowledge.
60
60
  */
61
61
  export interface Namespace extends IRNode, StorageNamespace {
62
62
  readonly kind: string;
63
+ readonly entries: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
63
64
  }
64
65
 
65
66
  export abstract class NamespaceBase extends IRNodeBase implements Namespace {
66
67
  abstract readonly id: string;
68
+ abstract readonly entries: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
67
69
  abstract override readonly kind: string;
68
70
  }
package/src/ir/storage.ts CHANGED
@@ -30,18 +30,19 @@ export interface EntityCoordinate {
30
30
  * value, yielded as {@link EntityCoordinate} tuples with
31
31
  * `plane: 'storage'` (the parameter type binds the plane).
32
32
  *
33
- * Iterates each namespace's own-enumerable properties structurally.
34
- * Skips `id` (known scalar); `kind` is non-enumerable on namespace
35
- * concretions and does not appear in `Object.entries`. For every other
36
- * property whose value is a non-null object, yields one coordinate per
37
- * entry key in that map. No family-specific slot vocabulary is required.
33
+ * Iterates each namespace's `entries` slot maps structurally. Skips
34
+ * non-object `entries`; `id` and `kind` are not walked (`kind` is
35
+ * non-enumerable on concretions). For every entity-kind key under
36
+ * `entries` whose value is a non-null object, yields one coordinate per
37
+ * entity name in that map. No family-specific slot vocabulary is required.
38
38
  */
39
39
  export function* elementCoordinates(
40
40
  storage: Pick<StorageBase, 'namespaces'>,
41
41
  ): Generator<EntityCoordinate> {
42
42
  for (const [namespaceId, ns] of Object.entries(storage.namespaces)) {
43
- for (const [entityKind, slot] of Object.entries(ns)) {
44
- if (entityKind === 'id') continue;
43
+ const entries = ns.entries;
44
+ if (entries === null || typeof entries !== 'object') continue;
45
+ for (const [entityKind, slot] of Object.entries(entries)) {
45
46
  if (slot === null || typeof slot !== 'object') continue;
46
47
  for (const entityName of Object.keys(slot)) {
47
48
  yield { plane: 'storage', namespaceId, entityKind, entityName };
@@ -227,6 +227,8 @@ export type TargetPackRef<
227
227
  TTargetId extends string = string,
228
228
  > = PackRefBase<'target', TFamilyId> & {
229
229
  readonly targetId: TTargetId;
230
+ /** The namespace a bare (un-namespaced) entity name resolves to for this target (e.g. Postgres `'public'`). */
231
+ readonly defaultNamespaceId: string;
230
232
  };
231
233
 
232
234
  export type AdapterPackRef<
@@ -1 +0,0 @@
1
- {"version":3,"file":"psl-ast-BDXL7iCg.d.mts","names":[],"sources":["../src/control/psl-ast.ts"],"mappings":";UAAiB,WAAA;EAAA,SACN,MAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA;AAAA;AAAA,UAGM,OAAA;EAAA,SACN,KAAA,EAAO,WAAA;EAAA,SACP,GAAA,EAAK,WAAW;AAAA;AAAA,KAGf,iBAAA;AAAA,UAeK,aAAA;EAAA,SACN,IAAA,EAAM,iBAAA;EAAA,SACN,OAAA;EAAA,SACA,QAAA;EAAA,SACA,IAAA,EAAM,OAAO;AAAA;AAAA,UAGP,uBAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAI;AAAA;AAAA,UAGE,sBAAA;EAAA,SACN,IAAA;EAAA,SACA,KAAK;AAAA;AAAA,KAGJ,eAAA,GAAkB,uBAAA,GAA0B,sBAAsB;AAAA,KAElE,kBAAA;AAAA,UAEK,8BAAA;EAAA,SACN,IAAA;EAAA,SACA,KAAA;EAAA,SACA,IAAA,EAAM,OAAO;AAAA;AAAA,UAGP,yBAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA;EAAA,SACA,IAAA,EAAM,OAAO;AAAA;AAAA,KAGZ,oBAAA,GAAuB,8BAAA,GAAiC,yBAAyB;AAAA,UAE5E,sBAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAAA,SACA,IAAA,WAAe,oBAAA;EAAA,SACf,IAAA,EAAM,OAAO;AAAA;AAAA,UAGP,YAAA;EAAA,SACN,IAAA;EAAA,SACA,MAAA,EAAQ,kBAAA;EAAA,SACR,IAAA;EAAA,SACA,IAAA,WAAe,oBAAA;EAAA,SACf,IAAA,EAAM,OAAA;AAAA;AAAA,KAGL,oBAAA;AAAA,KAEA,iBAAA,GAAoB,YAAY;AAAA,UAE3B,QAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAtCmB;EAAA,SAwCnB,QAAA;EAtCoC;EAAA,SAwCpC,eAAA;EAAA,SACA,eAAA,GAAkB,sBAAA;EAAA,SAClB,QAAA;EAAA,SACA,IAAA;EAAA,SACA,OAAA;EAAA,SACA,UAAA,WAAqB,iBAAA;EAAA,SACrB,IAAA,EAAM,OAAA;AAAA;AAAA,UAGA,mBAAA;EAAA,SACN,IAAA;EAAA,SACA,MAAA;EAAA,SACA,IAAA,EAAM,OAAO;AAAA;AAAA,UAGP,kBAAA;EAAA,SACN,IAAA;EAAA,SACA,MAAA;EAAA,SACA,IAAA,EAAM,OAAO;AAAA;AAAA,KAGZ,iBAAA,GAAoB,YAAY;AAAA,UAE3B,QAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA,WAAiB,QAAA;EAAA,SACjB,UAAA,WAAqB,iBAAA;EAAA,SACrB,IAAA,EAAM,OAAA;EArDsB;;;;;;;EAAA,SA6D5B,OAAA;AAAA;AAAA,UAGM,YAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EA3DkB;;;;;;;;;EAAA,SAqElB,OAAA;EAAA,SACA,IAAA,EAAM,OAAO;AAAA;AAAA,UAGP,OAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA,WAAiB,YAAA;EAAA,SACjB,UAAA,WAAqB,YAAA;EAAA,SACrB,IAAA,EAAM,OAAA;AAAA;AAAA,UAGA,gBAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA,WAAiB,QAAA;EAAA,SACjB,UAAA,WAAqB,YAAA;EAAA,SACrB,IAAA,EAAM,OAAA;AAAA;AAAA,UAGA,uBAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;;;;;;WAMA,QAAA;EAAA,SACA,eAAA,GAAkB,sBAAA;EAAA,SAClB,UAAA,WAAqB,YAAA;EAAA,SACrB,IAAA,EAAM,OAAA;AAAA;AAAA,UAGA,aAAA;EAAA,SACN,IAAA;EAAA,SACA,YAAA,WAAuB,uBAAA;EAAA,SACvB,IAAA,EAAM,OAAO;AAAA;;;;;;AAlFA;AAGxB;;;;;;cA8Fa,4BAAA;;;AA3FW;AAGxB;;;;UAiGiB,YAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA,WAAiB,QAAA;EAAA,SACjB,KAAA,WAAgB,OAAA;EAAA,SAChB,cAAA,WAAyB,gBAAA;EAAA,SACzB,IAAA,EAAM,OAAA;AAAA;AAAA,UAGA,cAAA;EAAA,SACN,IAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA,WAAqB,YAAA;EAAA,SACrB,KAAA,GAAQ,aAAA;EAAA,SACR,IAAA,EAAM,OAAA;AAAA;;;;;iBAOD,aAAA,CAAc,GAAA,EAAK,cAAA,YAA0B,QAAQ;;;;iBAOrD,YAAA,CAAa,GAAA,EAAK,cAAA,YAA0B,OAAO;;;;iBAOnD,qBAAA,CAAsB,GAAA,EAAK,cAAA,YAA0B,gBAAgB;AAAA,UAIpE,qBAAA;EAAA,SACN,MAAA;EAAA,SACA,QAAQ;AAAA;AAAA,UAGF,sBAAA;EAAA,SACN,GAAA,EAAK,cAAA;EAAA,SACL,WAAA,WAAsB,aAAa;EAAA,SACnC,EAAA;AAAA"}