@adobe/data 0.9.55 → 0.9.57

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 (186) hide show
  1. package/dist/cache/blob-store.js +12 -7
  2. package/dist/cache/blob-store.js.map +1 -1
  3. package/dist/data.d.ts +1 -1
  4. package/dist/ecs/database/database.d.ts +50 -1
  5. package/dist/ecs/database/database.js.map +1 -1
  6. package/dist/ecs/database/database.reset.test.js +200 -0
  7. package/dist/ecs/database/database.reset.test.js.map +1 -0
  8. package/dist/ecs/database/deep-extends-chain.type-test.d.ts +208 -208
  9. package/dist/ecs/database/observed/create-observed-database.js +4 -0
  10. package/dist/ecs/database/observed/create-observed-database.js.map +1 -1
  11. package/dist/ecs/database/observed/observed-database.d.ts +5 -3
  12. package/dist/ecs/database/public/create-database.d.ts +32 -3
  13. package/dist/ecs/database/public/create-database.js +12 -69
  14. package/dist/ecs/database/public/create-database.js.map +1 -1
  15. package/dist/ecs/database/public/create-database.test.js +91 -5
  16. package/dist/ecs/database/public/create-database.test.js.map +1 -1
  17. package/dist/ecs/database/public/create-transaction-dispatcher.d.ts +60 -0
  18. package/dist/ecs/database/public/create-transaction-dispatcher.js +119 -0
  19. package/dist/ecs/database/public/create-transaction-dispatcher.js.map +1 -0
  20. package/dist/ecs/database/reconciling/create-reconciling-database.js +52 -18
  21. package/dist/ecs/database/reconciling/create-reconciling-database.js.map +1 -1
  22. package/dist/ecs/database/reconciling/create-reconciling-database.test.js +144 -0
  23. package/dist/ecs/database/reconciling/create-reconciling-database.test.js.map +1 -1
  24. package/dist/ecs/database/reconciling/reconciling-database.d.ts +8 -1
  25. package/dist/ecs/database/reconciling/reconciling-entry.d.ts +9 -3
  26. package/dist/ecs/database/reconciling/reconciling-entry.js.map +1 -1
  27. package/dist/ecs/database/transactional-store/create-transactional-store.js +3 -1
  28. package/dist/ecs/database/transactional-store/create-transactional-store.js.map +1 -1
  29. package/dist/ecs/database/transactional-store/transactional-store.d.ts +14 -1
  30. package/dist/ecs/entity-location-table/create-entity-location-table.js +6 -1
  31. package/dist/ecs/entity-location-table/create-entity-location-table.js.map +1 -1
  32. package/dist/ecs/entity-location-table/entity-location-table.d.ts +2 -0
  33. package/dist/ecs/store/core/core.d.ts +2 -0
  34. package/dist/ecs/store/core/create-core.js +8 -0
  35. package/dist/ecs/store/core/create-core.js.map +1 -1
  36. package/dist/ecs/store/public/create-store.js +6 -0
  37. package/dist/ecs/store/public/create-store.js.map +1 -1
  38. package/dist/ecs/store/store.d.ts +2 -0
  39. package/dist/ecs/store/store.js.map +1 -1
  40. package/dist/ecs/store/transaction-functions.d.ts +15 -4
  41. package/dist/ecs/store/transaction-functions.type-test.js +50 -0
  42. package/dist/ecs/store/transaction-functions.type-test.js.map +1 -0
  43. package/dist/is-data.d.ts +1 -1
  44. package/dist/observe/to-async-generator.js +18 -8
  45. package/dist/observe/to-async-generator.js.map +1 -1
  46. package/dist/observe/to-async-generator.test.js +24 -0
  47. package/dist/observe/to-async-generator.test.js.map +1 -1
  48. package/dist/service/async-data-service/async-data-service.d.ts +1 -0
  49. package/dist/service/async-data-service/async-data-service.js +3 -0
  50. package/dist/service/async-data-service/async-data-service.js.map +1 -0
  51. package/dist/service/async-data-service/create-lazy.test.js.map +1 -1
  52. package/dist/service/async-data-service/example.js +1 -1
  53. package/dist/service/async-data-service/example.js.map +1 -1
  54. package/dist/service/async-data-service/is-valid.d.ts +1 -1
  55. package/dist/service/index.d.ts +2 -1
  56. package/dist/service/index.js +2 -1
  57. package/dist/service/index.js.map +1 -1
  58. package/dist/service/{agentic-service/link.js → ui-service/example.js} +1 -1
  59. package/dist/service/ui-service/example.js.map +1 -0
  60. package/dist/service/ui-service/from-service.d.ts +35 -0
  61. package/dist/service/{async-data-service/is-valid.type-test.js → ui-service/from-service.js} +1 -1
  62. package/dist/service/ui-service/from-service.js.map +1 -0
  63. package/dist/service/ui-service/is-valid.d.ts +11 -0
  64. package/dist/service/ui-service/is-valid.js +3 -0
  65. package/dist/service/ui-service/is-valid.js.map +1 -0
  66. package/dist/service/ui-service/public.d.ts +2 -0
  67. package/dist/service/ui-service/public.js +4 -0
  68. package/dist/service/ui-service/public.js.map +1 -0
  69. package/dist/service/ui-service/ui-service.d.ts +1 -0
  70. package/dist/service/ui-service/ui-service.js +3 -0
  71. package/dist/service/ui-service/ui-service.js.map +1 -0
  72. package/dist/test-setup.js +90 -0
  73. package/dist/test-setup.js.map +1 -0
  74. package/dist/tsconfig.tsbuildinfo +1 -1
  75. package/package.json +2 -2
  76. package/references/data-lit/package.json +1 -1
  77. package/references/data-lit/src/elements/application-element.ts +11 -1
  78. package/references/data-lit/src/elements/database-element.ts +3 -2
  79. package/references/data-lit/src/elements/database-element.type-test.ts +85 -0
  80. package/references/data-lit/src/hooks/index.ts +2 -0
  81. package/references/data-lit/src/hooks/use-drag-generator.ts +43 -0
  82. package/references/data-lit/src/hooks/use-drag-observe.ts +8 -2
  83. package/references/data-lit/src/hooks/use-pointer-observe.ts +79 -0
  84. package/references/data-lit-tictactoe/package.json +4 -1
  85. package/references/data-lit-tictactoe/src/elements/tictactoe-app/tictactoe-app-element.ts +23 -0
  86. package/references/data-lit-tictactoe/src/elements/tictactoe-app/tictactoe-app-presentation.ts +12 -0
  87. package/references/data-lit-tictactoe/src/elements/tictactoe-app/tictactoe-app.ts +14 -18
  88. package/references/data-lit-tictactoe/src/elements/tictactoe-board/tictactoe-board-element.ts +23 -0
  89. package/references/data-lit-tictactoe/src/elements/tictactoe-board/tictactoe-board-presentation.ts +6 -7
  90. package/references/data-lit-tictactoe/src/elements/tictactoe-board/tictactoe-board.ts +5 -15
  91. package/references/data-lit-tictactoe/src/elements/tictactoe-cell/tictactoe-cell-element.ts +45 -0
  92. package/references/data-lit-tictactoe/src/elements/tictactoe-cell/tictactoe-cell-presentation.ts +2 -1
  93. package/references/data-lit-tictactoe/src/elements/tictactoe-cell/tictactoe-cell.ts +5 -38
  94. package/references/data-lit-tictactoe/src/elements/tictactoe-hud/tictactoe-hud-element.ts +57 -0
  95. package/references/data-lit-tictactoe/src/elements/tictactoe-hud/tictactoe-hud-presentation.ts +10 -2
  96. package/references/data-lit-tictactoe/src/elements/tictactoe-hud/tictactoe-hud.css.ts +36 -1
  97. package/references/data-lit-tictactoe/src/elements/tictactoe-hud/tictactoe-hud.ts +5 -41
  98. package/references/data-lit-tictactoe/src/index.ts +16 -0
  99. package/references/data-lit-tictactoe/src/main.ts +9 -3
  100. package/references/data-lit-tictactoe/src/state/tictactoe-plugin.ts +18 -10
  101. package/references/data-lit-tictactoe/src/tictactoe-element.ts +8 -3
  102. package/references/data-lit-tictactoe/src/types/board-state/current-player.ts +2 -2
  103. package/references/data-lit-tictactoe/src/types/player-mark/is.ts +8 -0
  104. package/references/data-lit-tictactoe/src/types/player-mark/mark-color.ts +12 -0
  105. package/references/data-lit-tictactoe/src/types/player-mark/opponent.ts +12 -0
  106. package/references/data-lit-tictactoe/src/types/player-mark/public.ts +4 -0
  107. package/references/data-lit-tictactoe/src/types/player-mark/values.ts +6 -0
  108. package/references/data-react/package.json +1 -1
  109. package/references/data-react-hello/package.json +1 -1
  110. package/references/data-react-pixie/package.json +1 -1
  111. package/dist/cache/blob-store.test.js +0 -122
  112. package/dist/cache/blob-store.test.js.map +0 -1
  113. package/dist/cache/data-cache.test.js +0 -41
  114. package/dist/cache/data-cache.test.js.map +0 -1
  115. package/dist/cache/expiring-data-cache.test.js +0 -42
  116. package/dist/cache/expiring-data-cache.test.js.map +0 -1
  117. package/dist/cache/functions/functions.test.js +0 -72
  118. package/dist/cache/functions/functions.test.js.map +0 -1
  119. package/dist/ecs/database/observe-select-deep.d.ts +0 -23
  120. package/dist/ecs/database/observe-select-deep.js +0 -15
  121. package/dist/ecs/database/observe-select-deep.js.map +0 -1
  122. package/dist/ecs/database/observe-select-deep.type-test.d.ts +0 -1
  123. package/dist/ecs/database/observe-select-deep.type-test.js +0 -111
  124. package/dist/ecs/database/observe-select-deep.type-test.js.map +0 -1
  125. package/dist/ecs/database/public/create-database-scheduler.test.d.ts +0 -1
  126. package/dist/ecs/database/public/create-database-scheduler.test.js +0 -67
  127. package/dist/ecs/database/public/create-database-scheduler.test.js.map +0 -1
  128. package/dist/ecs/database/public/create-database.type-test.d.ts +0 -1
  129. package/dist/ecs/database/public/create-database.type-test.js +0 -52
  130. package/dist/ecs/database/public/create-database.type-test.js.map +0 -1
  131. package/dist/ecs/entity.d.ts +0 -11
  132. package/dist/ecs/entity.js +0 -7
  133. package/dist/ecs/entity.js.map +0 -1
  134. package/dist/ecs/persistence-service/create-storage-persistence-service.test.d.ts +0 -1
  135. package/dist/ecs/persistence-service/create-storage-persistence-service.test.js +0 -52
  136. package/dist/ecs/persistence-service/create-storage-persistence-service.test.js.map +0 -1
  137. package/dist/functions/serialization/serialize-to-storage.test.d.ts +0 -1
  138. package/dist/functions/serialization/serialize-to-storage.test.js +0 -161
  139. package/dist/functions/serialization/serialize-to-storage.test.js.map +0 -1
  140. package/dist/math/aabb/face/aabb-face.test.d.ts +0 -1
  141. package/dist/math/aabb/face/aabb-face.test.js +0 -35
  142. package/dist/math/aabb/face/aabb-face.test.js.map +0 -1
  143. package/dist/math/aabb/face/functions.d.ts +0 -47
  144. package/dist/math/aabb/face/functions.js +0 -142
  145. package/dist/math/aabb/face/functions.js.map +0 -1
  146. package/dist/math/aabb/face/index.d.ts +0 -4
  147. package/dist/math/aabb/face/index.js +0 -3
  148. package/dist/math/aabb/face/index.js.map +0 -1
  149. package/dist/perftest/ecs-perf.d.ts +0 -49
  150. package/dist/perftest/ecs-perf.js +0 -210
  151. package/dist/perftest/ecs-perf.js.map +0 -1
  152. package/dist/service/agentic-service/link.d.ts +0 -15
  153. package/dist/service/agentic-service/link.js.map +0 -1
  154. package/dist/service/async-data-service/is-valid.type-test.d.ts +0 -1
  155. package/dist/service/async-data-service/is-valid.type-test.js.map +0 -1
  156. package/dist/service/dynamic-service/create-from-ecs.d.ts +0 -17
  157. package/dist/service/dynamic-service/create-from-ecs.js +0 -56
  158. package/dist/service/dynamic-service/create-from-ecs.js.map +0 -1
  159. package/dist/service/dynamic-service/create-from-ecs.test.d.ts +0 -1
  160. package/dist/service/dynamic-service/create-from-ecs.test.js +0 -636
  161. package/dist/service/dynamic-service/create-from-ecs.test.js.map +0 -1
  162. package/dist/service/dynamic-service/create.d.ts +0 -84
  163. package/dist/service/dynamic-service/create.js +0 -97
  164. package/dist/service/dynamic-service/create.js.map +0 -1
  165. package/dist/service/dynamic-service/create.test.d.ts +0 -1
  166. package/dist/service/dynamic-service/create.test.js +0 -688
  167. package/dist/service/dynamic-service/create.test.js.map +0 -1
  168. package/dist/service/dynamic-service/dynamic-service.d.ts +0 -29
  169. package/dist/service/dynamic-service/dynamic-service.js +0 -2
  170. package/dist/service/dynamic-service/dynamic-service.js.map +0 -1
  171. package/dist/service/dynamic-service/index.d.ts +0 -1
  172. package/dist/service/dynamic-service/index.js +0 -3
  173. package/dist/service/dynamic-service/index.js.map +0 -1
  174. package/dist/service/dynamic-service/public.d.ts +0 -2
  175. package/dist/service/dynamic-service/public.js +0 -3
  176. package/dist/service/dynamic-service/public.js.map +0 -1
  177. package/dist/service/dynamic-service/semantic-service.d.ts +0 -19
  178. package/dist/service/dynamic-service/semantic-service.js +0 -2
  179. package/dist/service/dynamic-service/semantic-service.js.map +0 -1
  180. package/dist/service/semantic-service/semantic-service.d.ts +0 -19
  181. package/dist/service/semantic-service/semantic-service.js +0 -2
  182. package/dist/service/semantic-service/semantic-service.js.map +0 -1
  183. /package/dist/{cache/blob-store.test.d.ts → ecs/database/database.reset.test.d.ts} +0 -0
  184. /package/dist/{cache/data-cache.test.d.ts → ecs/store/transaction-functions.type-test.d.ts} +0 -0
  185. /package/dist/{cache/expiring-data-cache.test.d.ts → service/ui-service/example.d.ts} +0 -0
  186. /package/dist/{cache/functions/functions.test.d.ts → test-setup.d.ts} +0 -0
@@ -1,4 +1,3 @@
1
- // © 2026 Adobe. MIT License. See /LICENSE for details.
2
1
  import { getManagedPersistentCache } from "./get-persistent-cache.js";
3
2
  import { blobToHash } from "./functions/hashing/blob-to-hash.js";
4
3
  import { preventParallelExecution } from "./functions/prevent-parallel-execution.js";
@@ -49,16 +48,22 @@ export const hasBlobInternalDoNotUse = Symbol("hasBlob");
49
48
  * Creates a new blob store instance.
50
49
  */
51
50
  export function createBlobStore() {
52
- const cachePromise = getManagedPersistentCache("blobstore", {
51
+ // Lazy-init the persistent cache so that importing this module on a
52
+ // runtime without `globalThis.caches` (e.g. Node) does not produce an
53
+ // unhandled rejection. The cache promise is only kicked off the first
54
+ // time a blob store method actually needs it. See CLAUDE.md for the
55
+ // rationale behind the lazy-init pattern.
56
+ let cachePromiseInternal;
57
+ const cachePromise = () => (cachePromiseInternal ??= getManagedPersistentCache("blobstore", {
53
58
  maximumMemoryEntries: 10,
54
59
  maximumStorageEntries: 1000,
55
- });
60
+ }));
56
61
  // Track borrowed URLs and their reference counts
57
62
  const borrowedUrls = new Map();
58
63
  // Reverse mapping for O(1) lookup
59
64
  const urlToKey = new Map();
60
65
  async function getRef(blob) {
61
- const cache = await cachePromise;
66
+ const cache = await cachePromise();
62
67
  if (typeof blob === "string") {
63
68
  // if this is not a remote url, then we can assume it is a data url and fetch the blob from it.
64
69
  blob = await (await fetch(blob)).blob();
@@ -75,7 +80,7 @@ export function createBlobStore() {
75
80
  if (isRemoteBlobRef(r)) {
76
81
  return true;
77
82
  }
78
- const cache = await cachePromise;
83
+ const cache = await cachePromise();
79
84
  const response = await cache.match(toRequest(r));
80
85
  return response !== undefined;
81
86
  }
@@ -85,7 +90,7 @@ export function createBlobStore() {
85
90
  }
86
91
  const response = await (isRemoteBlobRef(r)
87
92
  ? fetch(r.remoteBlobRef)
88
- : (await cachePromise).match(toRequest(r)));
93
+ : (await cachePromise()).match(toRequest(r)));
89
94
  if (!response) {
90
95
  return null;
91
96
  }
@@ -97,7 +102,7 @@ export function createBlobStore() {
97
102
  }
98
103
  async function releaseBlob(r) {
99
104
  if (isLocalBlobRef(r)) {
100
- const cache = await cachePromise;
105
+ const cache = await cachePromise();
101
106
  cache.delete(toRequest(r));
102
107
  }
103
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"blob-store.js","sourceRoot":"","sources":["../../src/cache/blob-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blob-store.js","sourceRoot":"","sources":["../../src/cache/blob-store.ts"],"names":[],"mappings":"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"}
package/dist/data.d.ts CHANGED
@@ -6,6 +6,6 @@
6
6
  * It also allows us to strongly define contracts between our application and external services.
7
7
  * Validation of input arguments and output results allows strict enforcement of agreed upon contracts.
8
8
  */
9
- export type Data = string | number | boolean | null | undefined | ReadonlyArray<Data> | {
9
+ export type Data = string | number | boolean | null | ReadonlyArray<Data> | {
10
10
  readonly [K in string]?: Data;
11
11
  } | Blob;
@@ -5,13 +5,14 @@ import { Entity } from "../entity/entity.js";
5
5
  import { EntityReadValues } from "../store/core/index.js";
6
6
  import { Observe } from "../../observe/index.js";
7
7
  import { TransactionResult } from "./transactional-store/index.js";
8
+ import { TransactionEnvelope } from "./reconciling/reconciling-database.js";
8
9
  import { StringKeyof, RemoveIndex } from "../../types/types.js";
9
10
  import { Components } from "../store/components.js";
10
11
  import { ArchetypeComponents } from "../store/archetype-components.js";
11
12
  import { RequiredComponents } from "../required-components.js";
12
13
  import { EntitySelectOptions } from "../store/entity-select-options.js";
13
14
  import type { Service } from "../../service/index.js";
14
- import { createDatabase } from "./public/create-database.js";
15
+ import { createDatabase, type DatabaseSyncOptions } from "./public/create-database.js";
15
16
  import { ResourceSchemas } from "../resource-schemas.js";
16
17
  import { ComponentSchemas } from "../component-schemas.js";
17
18
  import { FromSchemas } from "../../schema/index.js";
@@ -90,11 +91,59 @@ export interface Database<C extends Components = {}, R extends ResourceComponent
90
91
  readonly [K in StringKeyof<R>]: Observe<R[K]>;
91
92
  };
92
93
  readonly transactions: Observe<TransactionResult<C>>;
94
+ /**
95
+ * Fires once for every locally-initiated envelope produced by the
96
+ * transaction wrappers (`db.transactions.X(args)`). Replays inside the
97
+ * reconciler and inbound `db.apply()` calls do NOT fire it. The
98
+ * `intent` reflects the wrapper's decision regardless of whether the
99
+ * envelope was applied locally as a transient (deferred-commit / sync
100
+ * mode) or as a commit (local-only mode).
101
+ *
102
+ * Sync services route forwarding by `intent`:
103
+ * - `"commit"` → propose to the server (reliable)
104
+ * - `"transient"` → relay to peers (lossy)
105
+ * - `"cancel"` → cancel a pending transient (reliable)
106
+ */
107
+ readonly envelopes: Observe<{
108
+ envelope: TransactionEnvelope;
109
+ result: TransactionResult<C> | undefined;
110
+ intent: "commit" | "transient" | "cancel";
111
+ }>;
93
112
  entity<T extends RequiredComponents>(id: Entity, minArchetype?: ReadonlyArchetype<T> | Archetype<T>): Observe<Readonly<T> & EntityReadValues<C> | null>;
94
113
  entity(id: Entity): Observe<EntityReadValues<C> | null>;
95
114
  archetype(id: ArchetypeId): Observe<void>;
96
115
  select<Include extends StringKeyof<C>, T extends Include>(include: readonly Include[] | ReadonlySet<string>, options?: EntitySelectOptions<C, Pick<C & RequiredComponents, T>>): Observe<readonly Entity[]>;
97
116
  };
117
+ /**
118
+ * Wipes all entities and resets all resources to their plugin defaults,
119
+ * preserving database identity (observers, transaction wrappers, sync
120
+ * options stay intact). Equivalent in observable state to a freshly
121
+ * constructed Database with the same plugin.
122
+ *
123
+ * O(num_archetypes + num_resources) — does not walk individual entities.
124
+ * Clears any in-flight reconciler transient queue.
125
+ */
126
+ readonly reset: () => void;
127
+ /**
128
+ * Apply a remotely-originated transaction envelope to the database. Used
129
+ * by sync services to feed in inbound commits and transients. Does not
130
+ * fire `observe.envelopes`.
131
+ */
132
+ readonly apply: (envelope: TransactionEnvelope) => TransactionResult<C> | undefined;
133
+ /**
134
+ * Cancel a previously-applied transient envelope by its compound
135
+ * `(userId, id)` key. Used by sync services to forward server-broadcast
136
+ * cancellations.
137
+ */
138
+ readonly cancel: (id: number, userId?: number | string) => void;
139
+ /**
140
+ * The sync options the database was created with, or `undefined` for a
141
+ * local-only database. Sync services read this to (a) confirm the
142
+ * database was created in sync mode and (b) recover the `userId` for
143
+ * authentication / logging without having to thread it through
144
+ * separately.
145
+ */
146
+ readonly sync: DatabaseSyncOptions | undefined;
98
147
  readonly system: {
99
148
  /** System create() return value, or null when create() returns void. Key is always present. */
100
149
  readonly functions: {
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/ecs/database/database.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAevD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAc1F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA0GtD,MAAM,KAAW,QAAQ,CA6DxB;AA7DD,WAAiB,QAAQ;IAkBV,eAAM,GAAG,cAAc,CAAC;IAExB,WAAE,GAAG,CAAC,KAAc,EAAqB,EAAE;QACtD,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC;IAC1L,CAAC,CAAA;IAEY,0BAAiB,GAAG,kBAAkB,CAAC;IAsBpD,IAAiB,MAAM,CAatB;IAbD,WAAiB,MAAM;QACR,aAAM,GAAG,YAAY,CAAC;QACtB,cAAO,GAAG,cAAc,CAAC;IAWxC,CAAC,EAbgB,MAAM,GAAN,eAAM,KAAN,eAAM,QAatB;AAEH,CAAC,EA7DgB,QAAQ,KAAR,QAAQ,QA6DxB"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/ecs/database/database.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAgBvD,OAAO,EAAE,cAAc,EAA4B,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAc1F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA0JtD,MAAM,KAAW,QAAQ,CA6DxB;AA7DD,WAAiB,QAAQ;IAkBV,eAAM,GAAG,cAAc,CAAC;IAExB,WAAE,GAAG,CAAC,KAAc,EAAqB,EAAE;QACtD,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC;IAC1L,CAAC,CAAA;IAEY,0BAAiB,GAAG,kBAAkB,CAAC;IAsBpD,IAAiB,MAAM,CAatB;IAbD,WAAiB,MAAM;QACR,aAAM,GAAG,YAAY,CAAC;QACtB,cAAO,GAAG,cAAc,CAAC;IAWxC,CAAC,EAbgB,MAAM,GAAN,eAAM,KAAN,eAAM,QAatB;AAEH,CAAC,EA7DgB,QAAQ,KAAR,QAAQ,QA6DxB"}
@@ -0,0 +1,200 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ //
3
+ // Red/green equivalence tests for Database.reset().
4
+ //
5
+ // Strategy: create two databases from the same plugin — `fresh` and `mutated`.
6
+ // Mutate the second with a representative workload, call reset(), then assert
7
+ // every observable property equals the fresh baseline.
8
+ import { describe, it, expect, vi } from "vitest";
9
+ import { Database } from "./database.js";
10
+ // ---------------------------------------------------------------------------
11
+ // Shared plugin
12
+ // ---------------------------------------------------------------------------
13
+ const plugin = Database.Plugin.create({
14
+ components: {
15
+ x: { type: "number", default: 0 },
16
+ label: { type: "string" },
17
+ },
18
+ resources: {
19
+ score: { default: 0 },
20
+ banner: { default: "", ephemeral: true },
21
+ },
22
+ archetypes: {
23
+ Point: ["x", "label"],
24
+ },
25
+ transactions: {
26
+ addPoint(s, args) {
27
+ return s.archetypes.Point.insert(args);
28
+ },
29
+ bumpScore(s, args) {
30
+ s.resources.score = s.resources.score + args.delta;
31
+ },
32
+ setBanner(s, args) {
33
+ s.resources.banner = args.text;
34
+ },
35
+ deletePoint(s, args) {
36
+ s.delete(args.entity);
37
+ },
38
+ },
39
+ });
40
+ const makeFresh = () => Database.create(plugin);
41
+ // ---------------------------------------------------------------------------
42
+ // Helpers
43
+ // ---------------------------------------------------------------------------
44
+ const entityCount = (db) => db.select(["x", "label"]).length;
45
+ // ---------------------------------------------------------------------------
46
+ // Reset equivalence
47
+ // ---------------------------------------------------------------------------
48
+ describe("Database.reset()", () => {
49
+ it("select returns 0 entities after reset", () => {
50
+ const db = makeFresh();
51
+ db.transactions.addPoint({ x: 1, label: "a" });
52
+ db.transactions.addPoint({ x: 2, label: "b" });
53
+ expect(entityCount(db)).toBe(2);
54
+ db.reset();
55
+ expect(entityCount(db)).toBe(0);
56
+ });
57
+ it("resources revert to plugin defaults after reset", () => {
58
+ const db = makeFresh();
59
+ db.transactions.bumpScore({ delta: 42 });
60
+ db.transactions.setBanner({ text: "hello" });
61
+ expect(db.resources.score).toBe(42);
62
+ expect(db.resources.banner).toBe("hello");
63
+ db.reset();
64
+ expect(db.resources.score).toBe(0);
65
+ expect(db.resources.banner).toBe("");
66
+ });
67
+ it("resources and entity count match a fresh database after reset", () => {
68
+ const fresh = makeFresh();
69
+ const mutated = makeFresh();
70
+ mutated.transactions.addPoint({ x: 5, label: "x" });
71
+ mutated.transactions.bumpScore({ delta: 7 });
72
+ mutated.reset();
73
+ // Logical state matches — raw column buffers may retain stale bytes
74
+ // beyond rowCount (zeroing would be O(capacity), not O(archetypes)).
75
+ expect(entityCount(mutated)).toBe(entityCount(fresh));
76
+ expect(mutated.resources.score).toBe(fresh.resources.score);
77
+ expect(mutated.resources.banner).toBe(fresh.resources.banner);
78
+ });
79
+ it("is idempotent (double reset is a no-op)", () => {
80
+ const db = makeFresh();
81
+ db.transactions.addPoint({ x: 1, label: "a" });
82
+ db.reset();
83
+ db.reset();
84
+ expect(entityCount(db)).toBe(0);
85
+ expect(db.resources.score).toBe(0);
86
+ expect(db.resources.banner).toBe("");
87
+ });
88
+ it("new entities can be inserted after reset and entity IDs restart", () => {
89
+ const db = makeFresh();
90
+ const e1 = db.transactions.addPoint({ x: 1, label: "old" });
91
+ db.reset();
92
+ const e2 = db.transactions.addPoint({ x: 2, label: "new" });
93
+ expect(db.read(e2)?.label).toBe("new");
94
+ // entity IDs restart from the same base, so e2 should equal e1
95
+ expect(e2).toBe(e1);
96
+ expect(entityCount(db)).toBe(1);
97
+ });
98
+ it("transactions continue to work normally after reset", () => {
99
+ const db = makeFresh();
100
+ db.transactions.addPoint({ x: 9, label: "pre" });
101
+ db.reset();
102
+ db.transactions.addPoint({ x: 3, label: "post" });
103
+ db.transactions.bumpScore({ delta: 5 });
104
+ expect(entityCount(db)).toBe(1);
105
+ expect(db.resources.score).toBe(5);
106
+ });
107
+ });
108
+ // ---------------------------------------------------------------------------
109
+ // Observer fan-out
110
+ // ---------------------------------------------------------------------------
111
+ describe("Database.reset() — observer notification", () => {
112
+ it("resource observer fires after reset and sees default value", () => {
113
+ const db = makeFresh();
114
+ db.transactions.bumpScore({ delta: 10 });
115
+ const observed = [];
116
+ const unsub = db.observe.resources.score((v) => observed.push(v));
117
+ // initial callback
118
+ expect(observed).toEqual([10]);
119
+ db.reset();
120
+ // must fire again with default
121
+ expect(observed.at(-1)).toBe(0);
122
+ unsub();
123
+ });
124
+ it("ephemeral resource observer fires after reset", () => {
125
+ const db = makeFresh();
126
+ db.transactions.setBanner({ text: "hi" });
127
+ const observed = [];
128
+ const unsub = db.observe.resources.banner((v) => observed.push(v));
129
+ expect(observed).toEqual(["hi"]);
130
+ db.reset();
131
+ expect(observed.at(-1)).toBe("");
132
+ unsub();
133
+ });
134
+ it("entity observer fires null after reset for entities that no longer exist", () => {
135
+ const db = makeFresh();
136
+ const entity = db.transactions.addPoint({ x: 1, label: "a" });
137
+ const observed = [];
138
+ const unsub = db.observe.entity(entity)((v) => observed.push(v));
139
+ expect(observed.at(-1)).not.toBeNull();
140
+ db.reset();
141
+ expect(observed.at(-1)).toBeNull();
142
+ unsub();
143
+ });
144
+ it("component observer fires after reset", () => {
145
+ const db = makeFresh();
146
+ const fn = vi.fn();
147
+ const unsub = db.observe.components.x(fn);
148
+ db.transactions.addPoint({ x: 1, label: "a" });
149
+ fn.mockClear();
150
+ db.reset();
151
+ expect(fn).toHaveBeenCalled();
152
+ unsub();
153
+ });
154
+ });
155
+ // ---------------------------------------------------------------------------
156
+ // Reconciler transient queue cleared
157
+ // ---------------------------------------------------------------------------
158
+ describe("Database.reset() — reconciler queue", () => {
159
+ it("in-flight transients are discarded on reset", () => {
160
+ const db = Database.create(plugin, { sync: { userId: "u1" } });
161
+ // In sync mode, transactions apply as transients locally.
162
+ db.transactions.addPoint({ x: 1, label: "transient" });
163
+ expect(entityCount(db)).toBe(1);
164
+ db.reset();
165
+ expect(entityCount(db)).toBe(0);
166
+ // After reset, a fresh apply with the same transaction id should behave
167
+ // as if it were a first-time application.
168
+ db.apply({ id: 1, name: "addPoint", args: { x: 2, label: "from-apply" }, time: 1 });
169
+ expect(entityCount(db)).toBe(1);
170
+ expect(db.select(["label"])[0]).toBeDefined();
171
+ });
172
+ });
173
+ // ---------------------------------------------------------------------------
174
+ // Performance: O(archetypes) not O(entities)
175
+ // ---------------------------------------------------------------------------
176
+ describe("Database.reset() — performance", () => {
177
+ it("reset 10k entities faster than proportional construction time", () => {
178
+ const db = makeFresh();
179
+ for (let i = 0; i < 10_000; i++) {
180
+ db.transactions.addPoint({ x: i, label: String(i) });
181
+ }
182
+ const t0 = performance.now();
183
+ db.reset();
184
+ const resetMs = performance.now() - t0;
185
+ // Build a fresh DB as baseline — reset must be at least 10x faster per entity
186
+ const t1 = performance.now();
187
+ const fresh = makeFresh();
188
+ const constructMs = performance.now() - t1;
189
+ _ = fresh;
190
+ // Reset should take well under 10 ms regardless of entity count.
191
+ // (Construction of an empty DB is sub-millisecond; 10x still << 10 ms.)
192
+ expect(resetMs).toBeLessThan(10);
193
+ // Sanity: reset should be faster than inserting even one entity-worth
194
+ // of work relative to construction * 10k.
195
+ expect(resetMs).toBeLessThan(constructMs * 10_000);
196
+ });
197
+ });
198
+ // Suppress unused-variable lint for the fresh db in the perf test.
199
+ let _;
200
+ //# sourceMappingURL=database.reset.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.reset.test.js","sourceRoot":"","sources":["../../../src/ecs/database/database.reset.test.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,EAAE;AACF,oDAAoD;AACpD,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IAClC,UAAU,EAAE;QACR,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QACjC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACnB;IACV,SAAS,EAAE;QACP,KAAK,EAAE,EAAE,OAAO,EAAE,CAAW,EAAE;QAC/B,MAAM,EAAE,EAAE,OAAO,EAAE,EAAY,EAAE,SAAS,EAAE,IAAI,EAAE;KACrD;IACD,UAAU,EAAE;QACR,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC;KACf;IACV,YAAY,EAAE;QACV,QAAQ,CAAC,CAAC,EAAE,IAAkC;YAC1C,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,SAAS,CAAC,CAAC,EAAE,IAAuB;YAChC,CAAC,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvD,CAAC;QACD,SAAS,CAAC,CAAC,EAAE,IAAsB;YAC/B,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;QACnC,CAAC;QACD,WAAW,CAAC,CAAC,EAAE,IAAwB;YACnC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;KACJ;CACJ,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAEhD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,WAAW,GAAG,CAAC,EAAgC,EAAE,EAAE,CACrD,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AAErC,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC7C,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhC,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE1C,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACrE,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,oEAAoE;QACpE,qEAAqE;QACrE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,KAAK,EAAE,CAAC;QAEX,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACvE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,EAAE,CAAC,KAAK,EAAE,CAAC;QAEX,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,+DAA+D;QAC/D,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAExC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QAClE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,mBAAmB;QACnB,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE/B,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,+BAA+B;QAC/B,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhC,KAAK,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEjC,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEjC,KAAK,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAChF,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAE9D,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAEvC,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEnC,KAAK,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,SAAS,EAAE,CAAC;QAEf,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC9B,KAAK,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAE/D,0DAA0D;QAC1D,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhC,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhC,wEAAwE;QACxE,0CAA0C;QAC1C,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACpF,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAE9E,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACrE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QAEvC,8EAA8E;QAC9E,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QAC3C,CAAC,GAAG,KAAK,CAAC;QAEV,iEAAiE;QACjE,wEAAwE;QACxE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACjC,sEAAsE;QACtE,0CAA0C;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,mEAAmE;AACnE,IAAI,CAAU,CAAC"}