dynim-core 1.0.4 → 1.0.5

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 (39) hide show
  1. package/README.md +9 -282
  2. package/dist/builder/builder-client.d.ts +1 -5
  3. package/dist/builder/builder-client.d.ts.map +1 -1
  4. package/dist/builder/builder-client.js +2 -22
  5. package/dist/builder/builder.d.ts +0 -4
  6. package/dist/builder/builder.d.ts.map +1 -1
  7. package/dist/builder/builder.js +21 -232
  8. package/dist/builder/editor-overlays.d.ts +1 -10
  9. package/dist/builder/editor-overlays.d.ts.map +1 -1
  10. package/dist/builder/editor-overlays.js +1 -103
  11. package/dist/builder/editor-state.d.ts +2 -21
  12. package/dist/builder/editor-state.d.ts.map +1 -1
  13. package/dist/builder/editor-state.js +2 -34
  14. package/dist/builder/element-utils.d.ts +0 -11
  15. package/dist/builder/element-utils.d.ts.map +1 -1
  16. package/dist/builder/element-utils.js +0 -58
  17. package/dist/builder/freeze-overlay.d.ts +1 -1
  18. package/dist/builder/freeze-overlay.d.ts.map +1 -1
  19. package/dist/builder/freeze-overlay.js +1 -2
  20. package/dist/builder/index.d.ts +5 -9
  21. package/dist/builder/index.d.ts.map +1 -1
  22. package/dist/builder/index.js +3 -7
  23. package/dist/builder/{drag-engine.d.ts → interaction-engine.d.ts} +6 -20
  24. package/dist/builder/interaction-engine.d.ts.map +1 -0
  25. package/dist/builder/interaction-engine.js +101 -0
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +1 -1
  28. package/package.json +1 -1
  29. package/src/README.md +10 -0
  30. package/src/styles/builder.css +0 -192
  31. package/src/styles/editor.css +2 -61
  32. package/dist/builder/diff-state.d.ts +0 -24
  33. package/dist/builder/diff-state.d.ts.map +0 -1
  34. package/dist/builder/diff-state.js +0 -134
  35. package/dist/builder/drag-engine.d.ts.map +0 -1
  36. package/dist/builder/drag-engine.js +0 -686
  37. package/dist/builder/history-state.d.ts +0 -41
  38. package/dist/builder/history-state.d.ts.map +0 -1
  39. package/dist/builder/history-state.js +0 -76
package/README.md CHANGED
@@ -1,290 +1,17 @@
1
1
  # dynim-core
2
2
 
3
- Framework-agnostic TypeScript library for visual page building, AI chat, and code generation.
3
+ Framework-agnostic TypeScript library for visual page building.
4
4
 
5
- ## Installation
5
+ ## Documentation
6
6
 
7
- ```bash
8
- npm install dynim-core
9
- ```
10
-
11
- ## Features
12
-
13
- - **Visual Page Builder** - Drag-and-drop editing with undo/redo history
14
- - **AI Chat Integration** - SSE-based streaming chat with element context awareness
15
- - **Code Generation** - Flexcode integration for AI-powered code changes
16
- - **Element Classification** - Semantic, visual, and size analysis of DOM elements
17
- - **DOM Utilities** - Tree scanning, stable IDs, selector generation
18
-
19
- ## Quick Start
20
-
21
- ### Chat Widget
22
-
23
- ```typescript
24
- import { createState, createClient, createWidget } from 'dynim-core';
25
-
26
- const state = createState();
27
- const client = createClient({
28
- endpoint: '/api/chat',
29
- apiKey: 'your-api-key',
30
- onMessage: (data) => state.updateMessage(data.id, data.text),
31
- onError: (error) => console.error(error),
32
- });
33
-
34
- const widget = createWidget({
35
- state,
36
- client,
37
- position: 'bottom-right', // or 'inline'
38
- });
39
-
40
- widget.mount(document.body);
41
- ```
42
-
43
- ### Visual Builder
44
-
45
- ```typescript
46
- import { createBuilder, createBuilderClient } from 'dynim-core';
47
-
48
- const builderClient = createBuilderClient({
49
- apiBase: 'https://api.example.com',
50
- sessionToken: 'jwt-token',
51
- onMessage: (msg) => console.log('AI response:', msg),
52
- onError: (err) => console.error(err),
53
- });
54
-
55
- const builder = createBuilder({
56
- contentRoot: document.getElementById('app'),
57
- client: builderClient,
58
- });
59
-
60
- // Enter edit mode
61
- builder.enter();
62
-
63
- // Save changes
64
- await builder.save();
65
-
66
- // Exit without saving
67
- builder.exit();
68
- ```
69
-
70
- ### Code Generation (Flexcode)
71
-
72
- ```typescript
73
- import { createCodeClient } from 'dynim-core';
74
-
75
- const codeClient = createCodeClient({
76
- apiBase: 'https://api.example.com',
77
- sessionToken: 'jwt-token',
78
- onMessage: (event) => {
79
- switch (event.type) {
80
- case 'text':
81
- console.log('Response:', event.content);
82
- break;
83
- case 'thinking':
84
- console.log('Thinking:', event.content);
85
- break;
86
- case 'edit':
87
- console.log('Code edit:', event.edit);
88
- break;
89
- case 'done':
90
- console.log('Complete');
91
- break;
92
- }
93
- },
94
- });
95
-
96
- // Send code generation request
97
- await codeClient.sendCode('project-id', 'Add a dark mode toggle');
98
-
99
- // Get pending edits
100
- const edits = codeClient.getEdits();
101
-
102
- // Save or abandon
103
- await codeClient.saveCode('project-id');
104
- await codeClient.abandonCode('project-id');
105
- ```
106
-
107
- ## API Reference
108
-
109
- ### State Management
110
-
111
- ```typescript
112
- createState(): StateStore
113
-
114
- interface StateStore {
115
- getState(): ChatState;
116
- setState(state: Partial<ChatState>): void;
117
- subscribe(listener: (state: ChatState) => void): () => void;
118
- addMessage(message: Message): void;
119
- updateMessage(id: string, text: string): void;
120
- clearMessages(): void;
121
- }
122
- ```
123
-
124
- ### Streaming Client
125
-
126
- ```typescript
127
- createClient(config: ClientConfig): StreamClient
128
-
129
- interface ClientConfig {
130
- endpoint: string;
131
- apiKey?: string;
132
- onMessage: (data: MessageData) => void;
133
- onError?: (error: Error) => void;
134
- }
135
-
136
- interface StreamClient {
137
- send(message: string): Promise<void>;
138
- }
139
- ```
140
-
141
- ### Builder
7
+ See [SDK Core Documentation](../../utils/docs/sdk/CORE.md)
142
8
 
143
- ```typescript
144
- createBuilder(config: BuilderConfig): Builder
9
+ Related:
10
+ - [SDK Overview](../../utils/docs/sdk/README.md)
11
+ - [UI Builder](../../utils/docs/ui-builder/README.md)
145
12
 
146
- interface BuilderConfig {
147
- contentRoot?: HTMLElement;
148
- client: BuilderClient;
149
- }
13
+ ## Install
150
14
 
151
- interface Builder {
152
- enter(): void;
153
- exit(): void;
154
- save(): Promise<void>;
155
- isActive(): boolean;
156
- getChanges(): DiffEntry[];
157
- getEditorState(): EditorState;
158
- getTreeState(): TreeState;
159
- destroy(): void;
160
- }
161
- ```
162
-
163
- ### Builder Client
164
-
165
- ```typescript
166
- createBuilderClient(config: BuilderClientConfig): BuilderClient
167
-
168
- interface BuilderClientConfig {
169
- apiBase?: string;
170
- sessionToken?: string;
171
- refreshToken?: string;
172
- getSession?: () => Promise<{ token: string }>;
173
- onMessage?: (data: BuilderMessage) => void;
174
- onError?: (error: Error) => void;
175
- }
176
-
177
- interface BuilderClient {
178
- sendChat(message: string): Promise<void>;
179
- sendElementChat(message: string, element: HTMLElement): Promise<void>;
180
- saveDiffs(diffs: DiffEntry[]): Promise<void>;
181
- setSessionToken(token: string): void;
182
- isAuthenticated(): boolean;
183
- }
184
- ```
185
-
186
- ### Code Client
187
-
188
- ```typescript
189
- createCodeClient(config: CodeClientConfig): CodeClient
190
-
191
- interface CodeClientConfig {
192
- apiBase?: string;
193
- sessionToken?: string;
194
- getSession?: () => Promise<{ token: string }>;
195
- onMessage?: (event: CodeEvent) => void;
196
- }
197
-
198
- interface CodeClient {
199
- sendCode(projectId: string, prompt: string): Promise<void>;
200
- saveCode(projectId: string): Promise<void>;
201
- abandonCode(projectId: string): Promise<void>;
202
- getEdits(): CodeEdit[];
203
- }
204
-
205
- type CodeEvent =
206
- | { type: 'text'; content: string }
207
- | { type: 'thinking'; content: string }
208
- | { type: 'edit'; edit: CodeEdit }
209
- | { type: 'question'; content: string }
210
- | { type: 'done' }
211
- | { type: 'error'; content: string };
212
- ```
213
-
214
- ### DOM Utilities
215
-
216
- ```typescript
217
- // Scan DOM tree
218
- scanDOM(root: HTMLElement): DOMNode[]
219
-
220
- // Create debounced scanner
221
- createDebouncedScanner(callback: (nodes: DOMNode[]) => void): Scanner
222
-
223
- // Element queries
224
- getElementAtPath(root: HTMLElement, path: number[]): HTMLElement | null
225
- queryElements(root: HTMLElement, selector: string): HTMLElement[]
226
- generateSelector(element: HTMLElement): string
227
-
228
- // Stable IDs for tracking elements across changes
229
- getStableId(element: HTMLElement): string
230
- findByStableId(root: HTMLElement, id: string): HTMLElement | null
231
-
232
- // Build element context for AI
233
- buildElementIdentifier(element: HTMLElement): ElementIdentifier
234
- ```
235
-
236
- ### Element Classifier
237
-
238
- ```typescript
239
- createClassifier(): Classifier
240
-
241
- interface Classifier {
242
- classify(element: HTMLElement): Classification;
243
- }
244
-
245
- interface Classification {
246
- semantic: SemanticInfo; // HTML tag, ARIA roles, attributes
247
- classes: ClassInfo; // CSS class patterns
248
- visual: VisualInfo; // Colors, fonts, spacing
249
- size: SizeInfo; // Dimensions, viewport relation
250
- }
251
- ```
252
-
253
- ## Styling
254
-
255
- Import base styles for the chat widget and builder UI:
256
-
257
- ```typescript
258
- import 'dynim-core/styles/base.css';
259
- import 'dynim-core/styles/builder.css';
260
- import 'dynim-core/styles/editor.css';
261
-
262
- // Themes
263
- import 'dynim-core/styles/themes/light.css';
264
- import 'dynim-core/styles/themes/dark.css';
265
- ```
266
-
267
- ## Browser Global API
268
-
269
- For non-module usage, `dynim-core` exposes global helpers:
270
-
271
- ```html
272
- <script src="dynim-core/dist/index.js"></script>
273
- <script>
274
- // Quick chatbot setup
275
- window.Chatbot.init({
276
- endpoint: '/api/chat',
277
- position: 'bottom-right',
278
- });
279
-
280
- // Quick builder setup
281
- window.Builder.create({
282
- apiBase: 'https://api.example.com',
283
- sessionToken: 'jwt-token',
284
- });
285
- </script>
15
+ ```bash
16
+ npm install dynim-core
286
17
  ```
287
-
288
- ## License
289
-
290
- MIT
@@ -3,13 +3,11 @@
3
3
  *
4
4
  * NOTE: For AI chat/code operations, use code-client.ts instead.
5
5
  * This client handles visual builder-specific operations:
6
- * - saveDiffs: Save visual DOM changes
7
6
  * - preview: Generate preview URL
8
7
  * - exit: Notify server of builder exit
9
8
  *
10
9
  * Authentication uses JWT session tokens.
11
10
  */
12
- import type { DiffEntry } from './diff-state';
13
11
  export interface BuilderClientConfig {
14
12
  apiBase?: string;
15
13
  /** JWT session token for authentication */
@@ -28,10 +26,8 @@ export interface BuilderClientConfig {
28
26
  onAuthError?: (error: Error) => void;
29
27
  }
30
28
  export interface BuilderClient {
31
- /** Save visual DOM diffs to backend */
32
- saveDiffs: (pageId: string, diffs: DiffEntry[]) => Promise<unknown>;
33
29
  /** Generate preview URL for current changes */
34
- preview: (pageId: string, diffs?: DiffEntry[]) => Promise<{
30
+ preview: (pageId: string) => Promise<{
35
31
  success: boolean;
36
32
  previewUrl?: string;
37
33
  message?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"builder-client.d.ts","sourceRoot":"","sources":["../../src/builder/builder-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,uCAAuC;IACvC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,uCAAuC;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACtC;AAGD,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,+CAA+C;IAC/C,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvH,oCAAoC;IACpC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7F,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,eAAe,EAAE,MAAM,OAAO,CAAC;CAChC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,mBAAwB,GAAG,aAAa,CAyKnF"}
1
+ {"version":3,"file":"builder-client.d.ts","sourceRoot":"","sources":["../../src/builder/builder-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,uCAAuC;IACvC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,uCAAuC;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACtC;AAGD,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClG,oCAAoC;IACpC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7F,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,eAAe,EAAE,MAAM,OAAO,CAAC;CAChC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,mBAAwB,GAAG,aAAa,CAoJnF"}
@@ -3,7 +3,6 @@
3
3
  *
4
4
  * NOTE: For AI chat/code operations, use code-client.ts instead.
5
5
  * This client handles visual builder-specific operations:
6
- * - saveDiffs: Save visual DOM changes
7
6
  * - preview: Generate preview URL
8
7
  * - exit: Notify server of builder exit
9
8
  *
@@ -84,30 +83,12 @@ export function createBuilderClient(config = {}) {
84
83
  headers.set('Authorization', `Bearer ${token}`);
85
84
  return fetch(url, { ...options, headers });
86
85
  }
87
- async function saveDiffs(pageId, diffs) {
88
- try {
89
- const response = await authenticatedFetch(`${apiBase}/api/builder/save`, {
90
- method: 'POST',
91
- headers: { 'Content-Type': 'application/json' },
92
- body: JSON.stringify({ pageId, diffs })
93
- });
94
- if (!response.ok) {
95
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
96
- }
97
- return response.json();
98
- }
99
- catch (error) {
100
- console.error('[BuilderClient] Save error:', error);
101
- onError?.(error);
102
- throw error;
103
- }
104
- }
105
- async function preview(pageId, diffs) {
86
+ async function preview(pageId) {
106
87
  try {
107
88
  const response = await authenticatedFetch(`${apiBase}/api/builder/preview`, {
108
89
  method: 'POST',
109
90
  headers: { 'Content-Type': 'application/json' },
110
- body: JSON.stringify({ pageId, diffs: diffs || [] })
91
+ body: JSON.stringify({ pageId })
111
92
  });
112
93
  if (!response.ok) {
113
94
  throw new Error(`HTTP ${response.status}: ${response.statusText}`);
@@ -148,7 +129,6 @@ export function createBuilderClient(config = {}) {
148
129
  }
149
130
  }
150
131
  return {
151
- saveDiffs,
152
132
  preview,
153
133
  exit,
154
134
  setSessionToken,
@@ -3,11 +3,9 @@
3
3
  * Manages the floating pill bar, chat widget, and visual editor
4
4
  */
5
5
  import { type WidgetConfig } from './widget';
6
- import { type DiffEntry } from './diff-state';
7
6
  import { type CodeClient } from './code-client';
8
7
  export interface BuilderConfig {
9
8
  logo?: string;
10
- onSave?: (diffs: DiffEntry[]) => void;
11
9
  onExit?: () => void;
12
10
  onEnter?: () => void;
13
11
  chatConfig?: WidgetConfig;
@@ -29,9 +27,7 @@ export interface BuilderConfig {
29
27
  export interface Builder {
30
28
  enter: () => void;
31
29
  exit: () => void;
32
- save: () => Promise<void>;
33
30
  isActive: () => boolean;
34
- getChanges: () => DiffEntry[];
35
31
  getEditorState: () => unknown;
36
32
  getTreeState: () => unknown;
37
33
  destroy: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/builder/builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxE,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAO/E,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAIlE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,+FAA+F;IAC/F,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,SAAS,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,OAAO,CAAC;IAC9B,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,MAAM,GAAE,aAAkB,GAAG,OAAO,CAwlBjE;;;;AAMD,wBAAyC"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/builder/builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAQxE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAIlE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,+FAA+F;IAC/F,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,cAAc,EAAE,MAAM,OAAO,CAAC;IAC9B,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,MAAM,GAAE,aAAkB,GAAG,OAAO,CAmXjE;;;;AAMD,wBAAyC"}