@livestore/common 0.0.58-dev.1 → 0.0.58-dev.11

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 (142) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/adapter-types.d.ts +48 -6
  3. package/dist/adapter-types.d.ts.map +1 -1
  4. package/dist/adapter-types.js +16 -1
  5. package/dist/adapter-types.js.map +1 -1
  6. package/dist/bounded-collections.js.map +1 -1
  7. package/dist/derived-mutations.d.ts +5 -5
  8. package/dist/derived-mutations.d.ts.map +1 -1
  9. package/dist/derived-mutations.js +4 -2
  10. package/dist/derived-mutations.js.map +1 -1
  11. package/dist/derived-mutations.test.js +1 -0
  12. package/dist/derived-mutations.test.js.map +1 -1
  13. package/dist/devtools/devtools-bridge.d.ts +1 -1
  14. package/dist/devtools/devtools-bridge.d.ts.map +1 -1
  15. package/dist/devtools/devtools-messages.d.ts +91 -13
  16. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  17. package/dist/devtools/devtools-messages.js +13 -4
  18. package/dist/devtools/devtools-messages.js.map +1 -1
  19. package/dist/devtools/index.d.ts +1 -0
  20. package/dist/devtools/index.d.ts.map +1 -1
  21. package/dist/devtools/index.js +2 -0
  22. package/dist/devtools/index.js.map +1 -1
  23. package/dist/index.d.ts +4 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
  26. package/dist/rehydrate-from-mutationlog.js +11 -5
  27. package/dist/rehydrate-from-mutationlog.js.map +1 -1
  28. package/dist/schema/index.d.ts +2 -2
  29. package/dist/schema/index.d.ts.map +1 -1
  30. package/dist/schema/index.js +1 -1
  31. package/dist/schema/index.js.map +1 -1
  32. package/dist/schema/mutations.d.ts +137 -17
  33. package/dist/schema/mutations.d.ts.map +1 -1
  34. package/dist/schema/mutations.js +42 -16
  35. package/dist/schema/mutations.js.map +1 -1
  36. package/dist/schema/schema-helpers.js +1 -1
  37. package/dist/schema/schema-helpers.js.map +1 -1
  38. package/dist/schema/system-tables.d.ts +119 -6
  39. package/dist/schema/system-tables.d.ts.map +1 -1
  40. package/dist/schema/system-tables.js +22 -9
  41. package/dist/schema/system-tables.js.map +1 -1
  42. package/dist/schema/table-def.d.ts +3 -3
  43. package/dist/schema/table-def.d.ts.map +1 -1
  44. package/dist/schema/table-def.js +1 -1
  45. package/dist/schema/table-def.js.map +1 -1
  46. package/dist/schema-management/migrations.d.ts +1 -1
  47. package/dist/schema-management/migrations.d.ts.map +1 -1
  48. package/dist/schema-management/migrations.js +2 -2
  49. package/dist/schema-management/migrations.js.map +1 -1
  50. package/dist/sql-queries/sql-queries.d.ts +10 -3
  51. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  52. package/dist/sql-queries/sql-queries.js +8 -7
  53. package/dist/sql-queries/sql-queries.js.map +1 -1
  54. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  55. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  56. package/dist/sql-queries/types.d.ts +2 -2
  57. package/dist/sql-queries/types.d.ts.map +1 -1
  58. package/dist/sync/next/compact-events.d.ts +15 -0
  59. package/dist/sync/next/compact-events.d.ts.map +1 -0
  60. package/dist/sync/next/compact-events.js +176 -0
  61. package/dist/sync/next/compact-events.js.map +1 -0
  62. package/dist/sync/next/facts.d.ts +37 -0
  63. package/dist/sync/next/facts.d.ts.map +1 -0
  64. package/dist/sync/next/facts.js +156 -0
  65. package/dist/sync/next/facts.js.map +1 -0
  66. package/dist/sync/next/graphology.d.ts +8 -0
  67. package/dist/sync/next/graphology.d.ts.map +1 -0
  68. package/dist/sync/next/graphology.js +36 -0
  69. package/dist/sync/next/graphology.js.map +1 -0
  70. package/dist/sync/next/graphology_.d.ts +3 -0
  71. package/dist/sync/next/graphology_.d.ts.map +1 -0
  72. package/dist/sync/next/graphology_.js +3 -0
  73. package/dist/sync/next/graphology_.js.map +1 -0
  74. package/dist/sync/next/history-dag.d.ts +30 -0
  75. package/dist/sync/next/history-dag.d.ts.map +1 -0
  76. package/dist/sync/next/history-dag.js +69 -0
  77. package/dist/sync/next/history-dag.js.map +1 -0
  78. package/dist/sync/next/mod.d.ts +5 -0
  79. package/dist/sync/next/mod.d.ts.map +1 -0
  80. package/dist/sync/next/mod.js +5 -0
  81. package/dist/sync/next/mod.js.map +1 -0
  82. package/dist/sync/next/rebase-events.d.ts +27 -0
  83. package/dist/sync/next/rebase-events.d.ts.map +1 -0
  84. package/dist/sync/next/rebase-events.js +41 -0
  85. package/dist/sync/next/rebase-events.js.map +1 -0
  86. package/dist/sync/next/test/compact-events.calculator.test.d.ts +2 -0
  87. package/dist/sync/next/test/compact-events.calculator.test.d.ts.map +1 -0
  88. package/dist/sync/next/test/compact-events.calculator.test.js +101 -0
  89. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -0
  90. package/dist/sync/next/test/compact-events.test.d.ts +2 -0
  91. package/dist/sync/next/test/compact-events.test.d.ts.map +1 -0
  92. package/dist/sync/next/test/compact-events.test.js +201 -0
  93. package/dist/sync/next/test/compact-events.test.js.map +1 -0
  94. package/dist/sync/next/test/mod.d.ts +2 -0
  95. package/dist/sync/next/test/mod.d.ts.map +1 -0
  96. package/dist/sync/next/test/mod.js +2 -0
  97. package/dist/sync/next/test/mod.js.map +1 -0
  98. package/dist/sync/next/test/mutation-fixtures.d.ts +73 -0
  99. package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -0
  100. package/dist/sync/next/test/mutation-fixtures.js +161 -0
  101. package/dist/sync/next/test/mutation-fixtures.js.map +1 -0
  102. package/dist/sync/sync.d.ts +19 -6
  103. package/dist/sync/sync.d.ts.map +1 -1
  104. package/dist/sync/sync.js.map +1 -1
  105. package/dist/version.d.ts +8 -0
  106. package/dist/version.d.ts.map +1 -1
  107. package/dist/version.js +9 -0
  108. package/dist/version.js.map +1 -1
  109. package/package.json +21 -4
  110. package/src/adapter-types.ts +46 -7
  111. package/src/bounded-collections.ts +1 -1
  112. package/src/derived-mutations.test.ts +2 -1
  113. package/src/derived-mutations.ts +10 -10
  114. package/src/devtools/devtools-bridge.ts +1 -1
  115. package/src/devtools/devtools-messages.ts +12 -2
  116. package/src/devtools/index.ts +2 -0
  117. package/src/index.ts +6 -0
  118. package/src/rehydrate-from-mutationlog.ts +16 -7
  119. package/src/schema/index.ts +4 -3
  120. package/src/schema/mutations.ts +175 -30
  121. package/src/schema/schema-helpers.ts +1 -1
  122. package/src/schema/system-tables.ts +30 -9
  123. package/src/schema/table-def.ts +3 -3
  124. package/src/schema-management/migrations.ts +2 -2
  125. package/src/sql-queries/sql-queries.ts +21 -10
  126. package/src/sql-queries/sql-query-builder.ts +1 -1
  127. package/src/sql-queries/types.ts +2 -2
  128. package/src/sync/next/ambient.d.ts +3 -0
  129. package/src/sync/next/compact-events.ts +218 -0
  130. package/src/sync/next/facts.ts +229 -0
  131. package/src/sync/next/graphology.ts +49 -0
  132. package/src/sync/next/graphology_.ts +2 -0
  133. package/src/sync/next/history-dag.ts +109 -0
  134. package/src/sync/next/mod.ts +4 -0
  135. package/src/sync/next/rebase-events.ts +97 -0
  136. package/src/sync/next/test/compact-events.calculator.test.ts +121 -0
  137. package/src/sync/next/test/compact-events.test.ts +232 -0
  138. package/src/sync/next/test/mod.ts +1 -0
  139. package/src/sync/next/test/mutation-fixtures.ts +230 -0
  140. package/src/sync/sync.ts +30 -6
  141. package/src/version.ts +10 -0
  142. package/tsconfig.json +1 -1
@@ -0,0 +1,176 @@
1
+ import { replacesFacts } from './facts.js';
2
+ import { graphologyDag } from './graphology_.js';
3
+ import { emptyHistoryDag, eventIdToString } from './history-dag.js';
4
+ /**
5
+ * Idea:
6
+ * - iterate over all events from leaves to root
7
+ * - for each event
8
+ * - gradually make sub dags by following the event's fact dependencies
9
+ * - for each sub dag check and remove sub dags further up in the history dag that are a subset of the current sub dag
10
+ *
11
+ * TODO: try to implement this function on top of SQLite
12
+ */
13
+ export const compactEvents = (inputDag) => {
14
+ const dag = inputDag.copy();
15
+ const compactedEventCount = 0;
16
+ const orderedEventIdStrs = graphologyDag.topologicalSort(dag).reverse();
17
+ // drop root
18
+ orderedEventIdStrs.pop();
19
+ for (const eventIdStr of orderedEventIdStrs) {
20
+ if (dag.hasNode(eventIdStr) === false) {
21
+ continue;
22
+ }
23
+ const subDagsForEvent = Array.from(makeSubDagsForEvent(dag, eventIdStr));
24
+ for (const subDag of subDagsForEvent) {
25
+ let shouldRetry = true;
26
+ while (shouldRetry) {
27
+ const subDagsInHistory = findSubDagsInHistory(dag, subDag, eventIdStr);
28
+ // console.debug(
29
+ // 'subDagsInHistory',
30
+ // eventIdStr,
31
+ // 'target',
32
+ // subDag.nodes(),
33
+ // 'found',
34
+ // ...subDagsInHistory.subDags.map((_) => _.nodes()),
35
+ // )
36
+ for (const subDagInHistory of subDagsInHistory.subDags) {
37
+ if (dagDependsOnDag(subDag, subDagInHistory, dag) === false) {
38
+ dropFromDag(dag, subDagInHistory);
39
+ }
40
+ }
41
+ // Sometimes some sub dags are ommitted because they depended on other sub dags in same batch.
42
+ // We can retry to also remove those.
43
+ // Implementation: retry if outsideDependencies overlap with deleted sub dags
44
+ if (subDagsInHistory.allOutsideDependencies.some((outsideDependencies) => outsideDependencies.every((dep) => subDagsInHistory.subDags.some((subDag) => subDag.hasNode(dep)))) === false) {
45
+ shouldRetry = false;
46
+ }
47
+ }
48
+ }
49
+ }
50
+ return { dag, compactedEventCount };
51
+ };
52
+ function* makeSubDagsForEvent(inputDag, eventIdStr) {
53
+ /** Map from eventIdStr to array of eventIdStrs that are dependencies */
54
+ let nextIterationEls = new Map([[eventIdStr, []]]);
55
+ let previousDag;
56
+ while (nextIterationEls.size > 0) {
57
+ // start with a copy of the last sub dag to build on top of
58
+ const subDag = previousDag?.copy() ?? emptyHistoryDag();
59
+ const currentIterationEls = new Map(nextIterationEls);
60
+ nextIterationEls = new Map();
61
+ for (const [currentEventIdStr, edgeTargetIdStrs] of currentIterationEls) {
62
+ const node = inputDag.getNodeAttributes(currentEventIdStr);
63
+ if (subDag.hasNode(currentEventIdStr) === false) {
64
+ subDag.addNode(currentEventIdStr, { ...node });
65
+ }
66
+ for (const edgeTargetIdStr of edgeTargetIdStrs) {
67
+ subDag.addEdge(currentEventIdStr, edgeTargetIdStr, { type: 'facts' });
68
+ }
69
+ for (const depEdge of inputDag.outboundEdgeEntries(currentEventIdStr)) {
70
+ if (depEdge.attributes.type === 'facts') {
71
+ const depEventIdStr = depEdge.target;
72
+ nextIterationEls.set(depEventIdStr, [...(nextIterationEls.get(depEventIdStr) ?? []), currentEventIdStr]);
73
+ }
74
+ }
75
+ }
76
+ previousDag = subDag;
77
+ // console.debug('subDag yield', subDag.nodes())
78
+ yield subDag;
79
+ }
80
+ }
81
+ /**
82
+ * Iterates over all events from root to `upToExclEventIdStr`
83
+ * and collects all valid sub dags that are replaced by `targetSubDag`.
84
+ */
85
+ const findSubDagsInHistory = (inputDag, targetSubDag, upToExclEventIdStr) => {
86
+ const subDags = [];
87
+ const allOutsideDependencies = [];
88
+ for (const eventIdStr of graphologyDag.topologicalSort(inputDag)) {
89
+ if (eventIdStr === upToExclEventIdStr) {
90
+ break;
91
+ }
92
+ for (const subDag of makeSubDagsForEvent(inputDag, eventIdStr)) {
93
+ // console.debug('findSubDagsInHistory', 'target', targetSubDag.nodes(), 'subDag', subDag.nodes())
94
+ if (subDag.size < targetSubDag.size) {
95
+ continue;
96
+ }
97
+ const outsideDependencies = outsideDependenciesForDag(subDag, inputDag);
98
+ if (outsideDependencies.length > 0) {
99
+ allOutsideDependencies.push(outsideDependencies);
100
+ }
101
+ if (outsideDependencies.length === 0 && dagReplacesDag(subDag, targetSubDag)) {
102
+ subDags.push(subDag);
103
+ }
104
+ else {
105
+ break;
106
+ }
107
+ }
108
+ }
109
+ return { subDags, allOutsideDependencies };
110
+ };
111
+ const dropFromDag = (dag, subDag) => {
112
+ for (const nodeIdStr of subDag.nodes()) {
113
+ removeEvent(dag, nodeIdStr);
114
+ }
115
+ };
116
+ /** Returns outside dependencies of `subDag` (but inside `inputDag`) */
117
+ const outsideDependenciesForDag = (subDag, inputDag) => {
118
+ const outsideDependencies = [];
119
+ for (const nodeIdStr of subDag.nodes()) {
120
+ for (const edgeEntry of inputDag.outboundEdgeEntries(nodeIdStr)) {
121
+ if (edgeEntry.attributes.type === 'facts') {
122
+ const depEventIdStr = edgeEntry.target;
123
+ if (subDag.hasNode(depEventIdStr) === false) {
124
+ outsideDependencies.push(depEventIdStr);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ return outsideDependencies;
130
+ };
131
+ /** Checks whether dagA depends on dagB */
132
+ const dagDependsOnDag = (dagA, dagB, inputDag) => {
133
+ for (const nodeAIdStr of dagA.nodes()) {
134
+ for (const edgeEntryA of inputDag.inboundEdgeEntries(nodeAIdStr)) {
135
+ if (edgeEntryA.attributes.type === 'facts') {
136
+ const depNodeIdStr = edgeEntryA.target;
137
+ if (dagB.hasNode(depNodeIdStr)) {
138
+ return true;
139
+ }
140
+ }
141
+ }
142
+ }
143
+ return false;
144
+ };
145
+ /** Checks if dagA replaces dagB */
146
+ const dagReplacesDag = (dagA, dagB) => {
147
+ if (dagA.size !== dagB.size) {
148
+ return false;
149
+ }
150
+ // TODO write tests that covers deterministic order when DAGs have branches
151
+ const nodeEntriesA = graphologyDag.topologicalSort(dagA).map((nodeId) => dagA.getNodeAttributes(nodeId));
152
+ const nodeEntriesB = graphologyDag.topologicalSort(dagB).map((nodeId) => dagB.getNodeAttributes(nodeId));
153
+ for (let i = 0; i < nodeEntriesA.length; i++) {
154
+ const nodeA = nodeEntriesA[i];
155
+ const nodeB = nodeEntriesB[i];
156
+ if (replacesFacts(nodeA.factsGroup, nodeB.factsGroup) === false) {
157
+ return false;
158
+ }
159
+ }
160
+ return true;
161
+ };
162
+ const removeEvent = (dag, eventIdStr) => {
163
+ // console.debug('removing event', eventIdStr)
164
+ const event = dag.getNodeAttributes(eventIdStr);
165
+ const parentIdStr = eventIdToString(event.parentId);
166
+ const childEdges = dag.outboundEdgeEntries(eventIdStr);
167
+ for (const childEdge of childEdges) {
168
+ if (childEdge.attributes.type === 'parent') {
169
+ const childEvent = dag.getNodeAttributes(childEdge.target);
170
+ childEvent.parentId = { ...event.parentId };
171
+ dag.addEdge(parentIdStr, eventIdToString(childEvent.id), { type: 'parent' });
172
+ }
173
+ }
174
+ dag.dropNode(eventIdStr);
175
+ };
176
+ //# sourceMappingURL=compact-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact-events.js","sourceRoot":"","sources":["../../../src/sync/next/compact-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { EventId } from '../../adapter-types.js';
2
+ import type { FactsCallback, MutationEventFacts, MutationEventFactsGroup, MutationEventFactsSnapshot } from '../../schema/mutations.js';
3
+ import { type HistoryDag, type HistoryDagNode } from './history-dag.js';
4
+ export declare const factsSnapshotForEvents: (events: HistoryDagNode[], endEventId: EventId) => MutationEventFactsSnapshot;
5
+ export declare const factsSnapshotForDag: (dag: HistoryDag, endEventId: EventId | undefined) => MutationEventFactsSnapshot;
6
+ export type FactValidationResult = {
7
+ success: true;
8
+ } | {
9
+ success: false;
10
+ /** Index of the item that caused the validation to fail */
11
+ index: number;
12
+ requiredFacts: MutationEventFacts;
13
+ mismatch: {
14
+ existing: MutationEventFacts;
15
+ required: MutationEventFacts;
16
+ };
17
+ currentSnapshot: MutationEventFacts;
18
+ };
19
+ export declare const validateFacts: ({ factGroups, initialSnapshot, }: {
20
+ factGroups: MutationEventFactsGroup[];
21
+ initialSnapshot: MutationEventFactsSnapshot;
22
+ }) => FactValidationResult;
23
+ export declare const applyFactGroups: (factGroups: MutationEventFactsGroup[], snapshot: MutationEventFactsSnapshot) => void;
24
+ export declare const applyFactGroup: (factGroup: MutationEventFactsGroup, snapshot: MutationEventFactsSnapshot) => void;
25
+ /** Check if groupA depends on groupB */
26
+ export declare const dependsOn: (groupA: MutationEventFactsGroup, groupB: MutationEventFactsGroup) => boolean;
27
+ export declare const replacesFacts: (groupA: MutationEventFactsGroup, groupB: MutationEventFactsGroup) => boolean;
28
+ export declare const isSameMapByKey: (set: MutationEventFacts, otherSet: MutationEventFacts) => boolean;
29
+ export declare const factsToString: (facts: MutationEventFacts) => string;
30
+ export declare const factsIntersect: (setA: MutationEventFacts, setB: MutationEventFacts) => boolean;
31
+ export declare const getFactsGroupForMutationArgs: ({ factsCallback, args, currentFacts, }: {
32
+ factsCallback: FactsCallback<any> | undefined;
33
+ args: any;
34
+ currentFacts: MutationEventFactsSnapshot;
35
+ }) => MutationEventFactsGroup;
36
+ export declare const compareEventIds: (a: EventId, b: EventId) => number;
37
+ //# sourceMappingURL=facts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts.d.ts","sourceRoot":"","sources":["../../../src/sync/next/facts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,KAAK,EACV,aAAa,EAEb,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,EAC3B,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAoB,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEzF,eAAO,MAAM,sBAAsB,WAAY,cAAc,EAAE,cAAc,OAAO,KAAG,0BAYtF,CAAA;AAED,eAAO,MAAM,mBAAmB,QAAS,UAAU,cAAc,OAAO,GAAG,SAAS,KAAG,0BAetF,CAAA;AAED,MAAM,MAAM,oBAAoB,GAC5B;IACE,OAAO,EAAE,IAAI,CAAA;CACd,GACD;IACE,OAAO,EAAE,KAAK,CAAA;IACd,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,kBAAkB,CAAA;IACjC,QAAQ,EAAE;QACR,QAAQ,EAAE,kBAAkB,CAAA;QAC5B,QAAQ,EAAE,kBAAkB,CAAA;KAC7B,CAAA;IACD,eAAe,EAAE,kBAAkB,CAAA;CACpC,CAAA;AAEL,eAAO,MAAM,aAAa,qCAGvB;IACD,UAAU,EAAE,uBAAuB,EAAE,CAAA;IACrC,eAAe,EAAE,0BAA0B,CAAA;CAC5C,KAAG,oBA8BH,CAAA;AAED,eAAO,MAAM,eAAe,eAAgB,uBAAuB,EAAE,YAAY,0BAA0B,SAI1G,CAAA;AAED,eAAO,MAAM,cAAc,cAAe,uBAAuB,YAAY,0BAA0B,SAQtG,CAAA;AAsBD,wCAAwC;AACxC,eAAO,MAAM,SAAS,WAAY,uBAAuB,UAAU,uBAAuB,KAAG,OAItC,CAAA;AAEvD,eAAO,MAAM,aAAa,WAAY,uBAAuB,UAAU,uBAAuB,KAAG,OAYhG,CAAA;AAED,eAAO,MAAM,cAAc,QAAS,kBAAkB,YAAY,kBAAkB,YACrB,CAAA;AAE/D,eAAO,MAAM,aAAa,UAAW,kBAAkB,WAItD,CAAA;AAED,eAAO,MAAM,cAAc,SAAU,kBAAkB,QAAQ,kBAAkB,KAAG,OAOnF,CAAA;AAED,eAAO,MAAM,4BAA4B,2CAItC;IACD,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;IAC7C,IAAI,EAAE,GAAG,CAAA;IACT,YAAY,EAAE,0BAA0B,CAAA;CACzC,KAAG,uBAwCH,CAAA;AAED,eAAO,MAAM,eAAe,MAAO,OAAO,KAAK,OAAO,WAKrD,CAAA"}
@@ -0,0 +1,156 @@
1
+ import { notYetImplemented } from '@livestore/utils';
2
+ import { graphologyDag } from './graphology_.js';
3
+ import { EMPTY_FACT_VALUE } from './history-dag.js';
4
+ export const factsSnapshotForEvents = (events, endEventId) => {
5
+ const facts = new Map();
6
+ for (const event of events) {
7
+ if (compareEventIds(event.id, endEventId) > 0) {
8
+ return facts;
9
+ }
10
+ applyFactGroup(event.factsGroup, facts);
11
+ }
12
+ return facts;
13
+ };
14
+ export const factsSnapshotForDag = (dag, endEventId) => {
15
+ const facts = new Map();
16
+ const orderedEventIdStrs = graphologyDag.topologicalSort(dag);
17
+ for (let i = 0; i < orderedEventIdStrs.length; i++) {
18
+ const event = dag.getNodeAttributes(orderedEventIdStrs[i]);
19
+ if (endEventId !== undefined && compareEventIds(event.id, endEventId) > 0) {
20
+ return facts;
21
+ }
22
+ applyFactGroup(event.factsGroup, facts);
23
+ }
24
+ return facts;
25
+ };
26
+ export const validateFacts = ({ factGroups, initialSnapshot, }) => {
27
+ const currentSnapshot = new Map(initialSnapshot);
28
+ for (const [index, factGroup] of factGroups.entries()) {
29
+ if (isSubSetMapByValue(factGroup.depRequire, currentSnapshot) === false) {
30
+ const existing = new Map();
31
+ const required = new Map();
32
+ for (const [key, value] of factGroup.depRequire) {
33
+ if (currentSnapshot.get(key) !== value) {
34
+ existing.set(key, currentSnapshot.get(key));
35
+ required.set(key, value);
36
+ }
37
+ }
38
+ return {
39
+ success: false,
40
+ index,
41
+ requiredFacts: factGroup.depRequire,
42
+ currentSnapshot,
43
+ mismatch: { existing, required },
44
+ };
45
+ }
46
+ applyFactGroup(factGroup, currentSnapshot);
47
+ }
48
+ return {
49
+ success: true,
50
+ };
51
+ };
52
+ export const applyFactGroups = (factGroups, snapshot) => {
53
+ for (const factGroup of factGroups) {
54
+ applyFactGroup(factGroup, snapshot);
55
+ }
56
+ };
57
+ export const applyFactGroup = (factGroup, snapshot) => {
58
+ for (const [key, value] of factGroup.modifySet) {
59
+ snapshot.set(key, value);
60
+ }
61
+ for (const [key, _value] of factGroup.modifyUnset) {
62
+ snapshot.delete(key);
63
+ }
64
+ };
65
+ /** Check if setA is a subset of setB */
66
+ const isSubSetMapByValue = (setA, setB) => {
67
+ for (const [key, value] of setA) {
68
+ if (setB.get(key) !== value) {
69
+ return false;
70
+ }
71
+ }
72
+ return true;
73
+ };
74
+ /** Check if setA is a subset of setB */
75
+ const isSubSetMapByKey = (setA, setB) => {
76
+ for (const [key, _value] of setA) {
77
+ if (!setB.has(key)) {
78
+ return false;
79
+ }
80
+ }
81
+ return true;
82
+ };
83
+ /** Check if groupA depends on groupB */
84
+ export const dependsOn = (groupA, groupB) => factsIntersect(groupA.depRead, groupB.modifySet) ||
85
+ factsIntersect(groupA.depRead, groupB.modifyUnset) ||
86
+ factsIntersect(groupA.depRequire, groupB.modifySet) ||
87
+ factsIntersect(groupA.depRequire, groupB.modifyUnset);
88
+ export const replacesFacts = (groupA, groupB) => {
89
+ const replaces = (a, b) => a.size > 0 && b.size > 0 && isSameMapByKey(a, b);
90
+ const noFactsOrSame = (a, b) => a.size === 0 || b.size === 0 || isSameMapByKey(a, b);
91
+ return ((replaces(groupA.modifySet, groupB.modifySet) && noFactsOrSame(groupA.modifyUnset, groupB.modifyUnset)) ||
92
+ (replaces(groupA.modifySet, groupB.modifyUnset) && noFactsOrSame(groupA.modifyUnset, groupB.modifySet)) ||
93
+ (replaces(groupA.modifyUnset, groupB.modifySet) && noFactsOrSame(groupA.modifySet, groupB.modifyUnset)) ||
94
+ (replaces(groupA.modifyUnset, groupB.modifyUnset) && noFactsOrSame(groupA.modifySet, groupB.modifySet)));
95
+ };
96
+ export const isSameMapByKey = (set, otherSet) => set.size === otherSet.size && isSubSetMapByKey(set, otherSet);
97
+ export const factsToString = (facts) => {
98
+ return Array.from(facts)
99
+ .map(([key, value]) => (value === EMPTY_FACT_VALUE ? key : `${key}=${value}`))
100
+ .join(', ');
101
+ };
102
+ export const factsIntersect = (setA, setB) => {
103
+ for (const [key, _value] of setA) {
104
+ if (setB.has(key)) {
105
+ return true;
106
+ }
107
+ }
108
+ return false;
109
+ };
110
+ export const getFactsGroupForMutationArgs = ({ factsCallback, args, currentFacts, }) => {
111
+ const depRead = new Map();
112
+ const factsSnapshotProxy = new Proxy(currentFacts, {
113
+ get: (target, prop) => {
114
+ if (prop === 'has') {
115
+ return (key) => {
116
+ depRead.set(key, EMPTY_FACT_VALUE);
117
+ return target.has(key);
118
+ };
119
+ }
120
+ else if (prop === 'get') {
121
+ return (key) => {
122
+ depRead.set(key, EMPTY_FACT_VALUE);
123
+ return target.get(key);
124
+ };
125
+ }
126
+ notYetImplemented(`getFactsGroupForMutationArgs: ${prop.toString()} is not yet implemented`);
127
+ },
128
+ });
129
+ const factsRes = factsCallback?.(args, factsSnapshotProxy);
130
+ const iterableToMap = (iterable) => {
131
+ const map = new Map();
132
+ for (const item of iterable) {
133
+ if (typeof item === 'string') {
134
+ map.set(item, EMPTY_FACT_VALUE);
135
+ }
136
+ else {
137
+ map.set(item[0], item[1]);
138
+ }
139
+ }
140
+ return map;
141
+ };
142
+ const facts = {
143
+ modifySet: factsRes?.modify.set ? iterableToMap(factsRes.modify.set) : new Map(),
144
+ modifyUnset: factsRes?.modify.unset ? iterableToMap(factsRes.modify.unset) : new Map(),
145
+ depRequire: factsRes?.require ? iterableToMap(factsRes.require) : new Map(),
146
+ depRead,
147
+ };
148
+ return facts;
149
+ };
150
+ export const compareEventIds = (a, b) => {
151
+ if (a.global !== b.global) {
152
+ return a.global - b.global;
153
+ }
154
+ return a.local - b.local;
155
+ };
156
+ //# sourceMappingURL=facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts.js","sourceRoot":"","sources":["../../../src/sync/next/facts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type * as graphologyTypes from 'graphology-types';
2
+ export declare const graphology: any;
3
+ export declare class IGraph<NodeAttributes extends graphologyTypes.Attributes = graphologyTypes.Attributes, EdgeAttributes extends graphologyTypes.Attributes = graphologyTypes.Attributes, GraphAttributes extends graphologyTypes.Attributes = graphologyTypes.Attributes> extends graphologyTypes.AbstractGraph<NodeAttributes, EdgeAttributes, GraphAttributes> {
4
+ constructor(options?: graphologyTypes.GraphOptions);
5
+ }
6
+ export declare const DirectedGraph: typeof IGraph;
7
+ export declare const Graph: typeof IGraph;
8
+ //# sourceMappingURL=graphology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphology.d.ts","sourceRoot":"","sources":["../../../src/sync/next/graphology.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,eAAe,MAAM,kBAAkB,CAAA;AAExD,eAAO,MAAM,UAAU,EAAkB,GAAG,CAAA;AAE5C,MAAM,CAAC,OAAO,OAAO,MAAM,CACzB,cAAc,SAAS,eAAe,CAAC,UAAU,GAAG,eAAe,CAAC,UAAU,EAC9E,cAAc,SAAS,eAAe,CAAC,UAAU,GAAG,eAAe,CAAC,UAAU,EAC9E,eAAe,SAAS,eAAe,CAAC,UAAU,GAAG,eAAe,CAAC,UAAU,CAC/E,SAAQ,eAAe,CAAC,aAAa,CAAC,cAAc,EAAE,cAAc,EAAE,eAAe,CAAC;gBAC1E,OAAO,CAAC,EAAE,eAAe,CAAC,YAAY;CACnD;AAED,eAAO,MAAM,aAAa,EAIrB,OAAO,MAAM,CAAA;AAElB,eAAO,MAAM,KAAK,EAIb,OAAO,MAAM,CAAA"}
@@ -0,0 +1,36 @@
1
+ // TODO re-enable when `graphology` supports ESM `exports` and `.js` import/export syntax
2
+ // import {} from 'graphology'
3
+ import * as graphology_ from 'graphology';
4
+ export const graphology = graphology_;
5
+ export const DirectedGraph = class DirectedGraph extends graphology.DirectedGraph {
6
+ constructor(options) {
7
+ super(options);
8
+ }
9
+ };
10
+ export const Graph = class Graph extends graphology.Graph {
11
+ constructor(options) {
12
+ super(options);
13
+ }
14
+ };
15
+ // export const graphology = graphology_ as graphologyTypes
16
+ /*
17
+
18
+ Example usage:
19
+
20
+ const dag = new graphology.DirectedGraph({ allowSelfLoops: false })
21
+
22
+ nodes.forEach((node) => dag.addNode(node.id, { width: node.data.label.length * 100, height: 40 }))
23
+ edges.forEach((edge) => {
24
+ // TODO do this filtering earlier
25
+ if (!nodeIds.has(edge.source) || !nodeIds.has(edge.target)) return
26
+
27
+ dag.addEdge(edge.source, edge.target)
28
+ })
29
+
30
+ graphologyLayout.random.assign(dag) // needed for initial `x`, `y` values
31
+ const sensibleSettings = forceAtlas2.inferSettings(dag)
32
+ // forceAtlas2.assign(dag, { iterations: 100, settings: { adjustSizes: true, } })
33
+ forceAtlas2.assign(dag, { iterations: 100, settings: sensibleSettings })
34
+
35
+ */
36
+ //# sourceMappingURL=graphology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphology.js","sourceRoot":"","sources":["../../../src/sync/next/graphology.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,8BAA8B;AAC9B,OAAO,KAAK,WAAW,MAAM,YAAY,CAAA;AAGzC,MAAM,CAAC,MAAM,UAAU,GAAG,WAAkB,CAAA;AAU5C,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,aAAc,SAAQ,UAAU,CAAC,aAAa;IAC/E,YAAY,OAAsC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAA;IAChB,CAAC;CACe,CAAA;AAElB,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,KAAM,SAAQ,UAAU,CAAC,KAAK;IACvD,YAAY,OAAsC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAA;IAChB,CAAC;CACe,CAAA;AAElB,2DAA2D;AAE3D;;;;;;;;;;;;;;;;;;;EAmBE"}
@@ -0,0 +1,3 @@
1
+ export * as graphology from './graphology.js';
2
+ export { default as graphologyDag } from 'graphology-dag';
3
+ //# sourceMappingURL=graphology_.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphology_.d.ts","sourceRoot":"","sources":["../../../src/sync/next/graphology_.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * as graphology from './graphology.js';
2
+ export { default as graphologyDag } from 'graphology-dag';
3
+ //# sourceMappingURL=graphology_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphology_.js","sourceRoot":"","sources":["../../../src/sync/next/graphology_.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { type EventId } from '../../adapter-types.js';
2
+ import type { MutationEventFactsGroup } from '../../schema/mutations.js';
3
+ import { graphology } from './graphology_.js';
4
+ export declare const connectionTypeOptions: readonly ["parent", "facts"];
5
+ export type ConnectionType = (typeof connectionTypeOptions)[number];
6
+ /**
7
+ * Eventlog represented as a multi-DAG including edges for
8
+ * - total-order (parent) relationships
9
+ * - dependency (requires/reads facts) relationships
10
+ */
11
+ export type HistoryDag = graphology.IGraph<HistoryDagNode, {
12
+ type: ConnectionType;
13
+ }>;
14
+ export declare const emptyHistoryDag: () => HistoryDag;
15
+ export type HistoryDagNode = {
16
+ id: EventId;
17
+ parentId: EventId;
18
+ mutation: string;
19
+ args: any;
20
+ /** Facts are being used for conflict detection and history compaction */
21
+ factsGroup: MutationEventFactsGroup;
22
+ meta?: any;
23
+ };
24
+ export declare const rootEventNode: HistoryDagNode;
25
+ export declare const EMPTY_FACT_VALUE: unique symbol;
26
+ export declare const eventIdToString: (eventId: EventId) => string;
27
+ export declare const historyDagFromNodes: (dagNodes: HistoryDagNode[], options?: {
28
+ skipFactsCheck: boolean;
29
+ }) => HistoryDag;
30
+ //# sourceMappingURL=history-dag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-dag.d.ts","sourceRoot":"","sources":["../../../src/sync/next/history-dag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAW,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,eAAO,MAAM,qBAAqB,8BAA+B,CAAA;AACjE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnE;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC,CAAA;AAEpF,eAAO,MAAM,eAAe,QAAO,UAK/B,CAAA;AAKJ,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,GAAG,CAAA;IACT,yEAAyE;IACzE,UAAU,EAAE,uBAAuB,CAAA;IACnC,IAAI,CAAC,EAAE,GAAG,CAAA;CACX,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,cAO3B,CAAA;AAED,eAAO,MAAM,gBAAgB,eAA6B,CAAA;AAE1D,eAAO,MAAM,eAAe,YAAa,OAAO,WACwC,CAAA;AAExF,eAAO,MAAM,mBAAmB,aAAc,cAAc,EAAE,YAAY;IAAE,cAAc,EAAE,OAAO,CAAA;CAAE,eA2DpG,CAAA"}
@@ -0,0 +1,69 @@
1
+ import { ROOT_ID } from '../../adapter-types.js';
2
+ import { factsToString, validateFacts } from './facts.js';
3
+ import { graphology } from './graphology_.js';
4
+ export const connectionTypeOptions = ['parent', 'facts'];
5
+ export const emptyHistoryDag = () => new graphology.Graph({
6
+ allowSelfLoops: false,
7
+ multi: true,
8
+ type: 'directed',
9
+ });
10
+ // TODO consider making `ROOT_ID` parent to itself
11
+ const rootParentId = { global: ROOT_ID.global - 1, local: 0 };
12
+ export const rootEventNode = {
13
+ id: ROOT_ID,
14
+ parentId: rootParentId,
15
+ // unused below
16
+ mutation: '__Root__',
17
+ args: {},
18
+ factsGroup: { modifySet: new Map(), modifyUnset: new Map(), depRequire: new Map(), depRead: new Map() },
19
+ };
20
+ export const EMPTY_FACT_VALUE = Symbol('EMPTY_FACT_VALUE');
21
+ export const eventIdToString = (eventId) => eventId.local === 0 ? eventId.global.toString() : `${eventId.global}.${eventId.local}`;
22
+ export const historyDagFromNodes = (dagNodes, options) => {
23
+ if (options?.skipFactsCheck !== true) {
24
+ const validationResult = validateFacts({
25
+ factGroups: dagNodes.map((node) => node.factsGroup),
26
+ initialSnapshot: new Map(),
27
+ });
28
+ if (validationResult.success === false) {
29
+ throw new Error(`Mutation ${dagNodes[validationResult.index].mutation} requires facts that have not been set yet.\nRequires: ${factsToString(validationResult.requiredFacts)}\nFacts Snapshot: ${factsToString(validationResult.currentSnapshot)}`);
30
+ }
31
+ }
32
+ const dag = emptyHistoryDag();
33
+ dagNodes.forEach((node) => dag.addNode(eventIdToString(node.id), node));
34
+ dagNodes.forEach((node) => {
35
+ if (eventIdToString(node.parentId) !== eventIdToString(rootParentId)) {
36
+ dag.addEdge(eventIdToString(node.parentId), eventIdToString(node.id), { type: 'parent' });
37
+ }
38
+ });
39
+ dagNodes.forEach((node) => {
40
+ const factKeys = [...node.factsGroup.depRequire.keys(), ...node.factsGroup.depRead.keys()];
41
+ for (const factKey of factKeys) {
42
+ // Find the first ancestor node with a matching fact key (via modifySet or modifyUnset) by traversing the graph backwards via the parent edges
43
+ const depNode = (() => {
44
+ let currentIdStr = eventIdToString(node.id);
45
+ while (currentIdStr !== eventIdToString(rootParentId)) {
46
+ const parentEdge = dag.inEdges(currentIdStr).find((e) => dag.getEdgeAttribute(e, 'type') === 'parent');
47
+ if (!parentEdge)
48
+ return null;
49
+ const parentIdStr = dag.source(parentEdge);
50
+ const parentNode = dag.getNodeAttributes(parentIdStr);
51
+ if (parentNode.factsGroup.modifySet.has(factKey) || parentNode.factsGroup.modifyUnset.has(factKey)) {
52
+ return parentNode;
53
+ }
54
+ currentIdStr = parentIdStr;
55
+ }
56
+ return null;
57
+ })();
58
+ if (depNode) {
59
+ const depNodeIdStr = eventIdToString(depNode.id);
60
+ const nodeIdStr = eventIdToString(node.id);
61
+ if (dag.edges(depNodeIdStr, nodeIdStr).filter((e) => dag.getEdgeAttributes(e).type === 'facts').length === 0) {
62
+ dag.addEdge(depNodeIdStr, nodeIdStr, { type: 'facts' });
63
+ }
64
+ }
65
+ }
66
+ });
67
+ return dag;
68
+ };
69
+ //# sourceMappingURL=history-dag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-dag.js","sourceRoot":"","sources":["../../../src/sync/next/history-dag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './history-dag.js';
2
+ export * from './facts.js';
3
+ export * from './compact-events.js';
4
+ export * from './rebase-events.js';
5
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../src/sync/next/mod.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './history-dag.js';
2
+ export * from './facts.js';
3
+ export * from './compact-events.js';
4
+ export * from './rebase-events.js';
5
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../../src/sync/next/mod.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1,27 @@
1
+ import type { MutationDef, MutationEvent, MutationEventFactsSnapshot } from '../../schema/mutations.js';
2
+ import { type FactValidationResult } from './facts.js';
3
+ import type { HistoryDagNode } from './history-dag.js';
4
+ export type RebaseEventWithConflict = HistoryDagNode & {
5
+ conflictType: 'overlap' | 'missing-requirement';
6
+ conflictingEvents: HistoryDagNode[];
7
+ };
8
+ export type RebaseInput = {
9
+ newRemoteEvents: RebaseEventWithConflict[];
10
+ pendingLocalEvents: RebaseEventWithConflict[];
11
+ validate: (args: {
12
+ rebasedLocalEvents: MutationEvent.PartialAny[];
13
+ mutationDefs: Record<string, MutationDef.Any>;
14
+ }) => FactValidationResult;
15
+ };
16
+ export type RebaseOutput = {
17
+ rebasedLocalEvents: MutationEvent.PartialAny[];
18
+ };
19
+ export type RebaseFn = (input: RebaseInput) => RebaseOutput;
20
+ export declare const defaultRebaseFn: RebaseFn;
21
+ export declare const rebaseEvents: ({ rebaseFn, pendingLocalEvents, newRemoteEvents, currentFactsSnapshot, }: {
22
+ pendingLocalEvents: HistoryDagNode[];
23
+ newRemoteEvents: HistoryDagNode[];
24
+ rebaseFn: RebaseFn;
25
+ currentFactsSnapshot: MutationEventFactsSnapshot;
26
+ }) => MutationEvent.Any[];
27
+ //# sourceMappingURL=rebase-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebase-events.d.ts","sourceRoot":"","sources":["../../../src/sync/next/rebase-events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACvG,OAAO,EAGL,KAAK,oBAAoB,EAG1B,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,MAAM,MAAM,uBAAuB,GAAG,cAAc,GAAG;IACrD,YAAY,EAAE,SAAS,GAAG,qBAAqB,CAAA;IAC/C,iBAAiB,EAAE,cAAc,EAAE,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,eAAe,EAAE,uBAAuB,EAAE,CAAA;IAC1C,kBAAkB,EAAE,uBAAuB,EAAE,CAAA;IAC7C,QAAQ,EAAE,CAAC,IAAI,EAAE;QACf,kBAAkB,EAAE,aAAa,CAAC,UAAU,EAAE,CAAA;QAC9C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAA;KAC9C,KAAK,oBAAoB,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,kBAAkB,EAAE,aAAa,CAAC,UAAU,EAAE,CAAA;CAC/C,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,YAAY,CAAA;AAE3D,eAAO,MAAM,eAAe,EAAE,QAM7B,CAAA;AAED,eAAO,MAAM,YAAY,6EAKtB;IACD,kBAAkB,EAAE,cAAc,EAAE,CAAA;IACpC,eAAe,EAAE,cAAc,EAAE,CAAA;IACjC,QAAQ,EAAE,QAAQ,CAAA;IAClB,oBAAoB,EAAE,0BAA0B,CAAA;CACjD,KAAG,aAAa,CAAC,GAAG,EA+CpB,CAAA"}