@xmachines/play-dom 2.2.0 → 3.0.0
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.
- package/README.md +80 -14
- package/dist/PlayRenderer.d.ts +98 -0
- package/dist/PlayRenderer.d.ts.map +1 -1
- package/dist/PlayRenderer.js +317 -19
- package/dist/PlayRenderer.js.map +1 -1
- package/dist/create-play-ui.d.ts +37 -7
- package/dist/create-play-ui.d.ts.map +1 -1
- package/dist/create-play-ui.js +30 -14
- package/dist/create-play-ui.js.map +1 -1
- package/dist/create-renderer.d.ts +2 -1
- package/dist/create-renderer.d.ts.map +1 -1
- package/dist/create-renderer.js +2 -1
- package/dist/create-renderer.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +102 -10
- package/dist/types.d.ts.map +1 -1
- package/package.json +10 -10
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Vanilla DOM renderer for XMachines Play architecture with signal-driven rendering.
|
|
4
4
|
|
|
5
|
-
[](https://opensource.org/licenses/MIT) [](https://opensource.org/licenses/MIT) [](https://www.npmjs.com/package/@xmachines/play-dom)
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
@@ -114,7 +114,7 @@ disconnect();
|
|
|
114
114
|
|
|
115
115
|
Use `createPlayUI` when you need a render error handler, a fallback element, a navigation integration, a computed function, or a custom check. Use it also when your code needs the `registryResult` value, for example for `executeAction`.
|
|
116
116
|
|
|
117
|
-
The factory holds the factory options (`functions`, `validationFunctions`, `navigate`, `onRenderError`, and `fallback`) from the moment of its creation, and it applies them on every `mount()` call. Give the mount options (`store` and `loading`) to `mount()` itself.
|
|
117
|
+
The factory holds the factory options (`functions`, `validationFunctions`, `navigate`, `onRenderError`, `onError`, and `fallback`) from the moment of its creation, and it applies them on every `mount()` call. Give the mount options (`store` and `loading`) to `mount()` itself.
|
|
118
118
|
|
|
119
119
|
```typescript
|
|
120
120
|
import { defineRegistry, createPlayUI, schema } from "@xmachines/play-dom";
|
|
@@ -277,6 +277,69 @@ The order of the arguments is the same as in the `RenderErrorHandler` type of `@
|
|
|
277
277
|
|
|
278
278
|
Without `onRenderError`, the renderer writes all three types of error to `console.error`, then stops them. No exception goes to the caller, and no promise rejection stays unhandled.
|
|
279
279
|
|
|
280
|
+
### The renderer contains a failed rebuild — a change of behaviour in 2.3.0
|
|
281
|
+
|
|
282
|
+
**Read this if you catch what `mount()` or `connect()` throws.**
|
|
283
|
+
|
|
284
|
+
In 2.2.0 the renderer had no containment. A view that failed the rebuild threw out of
|
|
285
|
+
`mount()` and out of the callback of the signal watcher, so a `try` of the host, an error
|
|
286
|
+
boundary of the framework around it, or the global handler of the page received it.
|
|
287
|
+
|
|
288
|
+
In 2.3.0 the renderer contains such a failure ALWAYS. No option turns the containment on,
|
|
289
|
+
and no option turns it off. The renderer clears the container, it shows the `fallback`,
|
|
290
|
+
and `mount()` returns normally. A host that shows its own error page from a `catch` around
|
|
291
|
+
`mount()` sees that `catch` never again.
|
|
292
|
+
|
|
293
|
+
The four framework renderers contain a failed render always, because an error boundary of
|
|
294
|
+
a framework is not an option that a caller turns off. This change puts play-dom on the
|
|
295
|
+
same rule.
|
|
296
|
+
|
|
297
|
+
**To escalate a failure, raise it from a task of your own:**
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
const mount = createPlayUI(registryResult, {
|
|
301
|
+
onError: (err) => {
|
|
302
|
+
reportToSentry(err);
|
|
303
|
+
queueMicrotask(() => {
|
|
304
|
+
throw err; // the page keeps its own global handler
|
|
305
|
+
});
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
A throw that leaves the handler itself reaches no caller. The renderer contains it and
|
|
311
|
+
writes it to `console.error`, exactly as the four framework renderers do. The five hold
|
|
312
|
+
this one rule, so a host learns it one time and writes the same handler for each of them.
|
|
313
|
+
|
|
314
|
+
### `onError` — the failure of a complete rebuild
|
|
315
|
+
|
|
316
|
+
`onRenderError` covers one element: the inner renderer contains a render error of a component, and a rejection of an action handler, per element, and the rebuild continues. Some failures escape that boundary — a `$computed` function that throws during the resolution of a prop, for example — and they abort the complete rebuild.
|
|
317
|
+
|
|
318
|
+
`onError` receives such a failure. The renderer contains it with this option and without it: it resets the state of the failed rebuild, so that the next emission makes a complete render again, and it clears the container. `connect()` renders the first view synchronously, so a bad initial view makes `connect()` throw no more.
|
|
319
|
+
|
|
320
|
+
A write of the store takes the same path. The renderer resolves the props of every element that the write touched, so a `$computed` function that throws on the new state aborts that render too. The renderer contains such a failure as well, and the action handler that wrote the state receives no exception.
|
|
321
|
+
|
|
322
|
+
The second parameter is the **reset**, for a retry that the host starts. It renders the view that the actor holds at the moment of the call, so a retry cannot rewind the screen to the view that failed. A reset that the host calls from inside the handler does nothing, because no input changed between the two attempts, and a reset after the provider goes away does nothing. The five renderers hold the same three rules.
|
|
323
|
+
|
|
324
|
+
A reset of `PlayRenderer` belongs to ONE connection. `connect()` starts a connection, and the reset of a report of an older connection does nothing. A host that calls `connect()` again from inside the handler abandons the connection that reported. The "Retry" button of that report must not render into the connection that took its place. Call the reset of the newest report.
|
|
325
|
+
|
|
326
|
+
A fourth rule holds in all five: each of them CONTAINS a handler that throws, and writes the throw to `console.error`. A host that must escalate raises the failure from a task of its own, as the section above shows.
|
|
327
|
+
|
|
328
|
+
```typescript
|
|
329
|
+
const mount = createPlayUI(registryResult, {
|
|
330
|
+
onError: (err) => reportToSentry(err),
|
|
331
|
+
fallback: document.getElementById("crashed")!,
|
|
332
|
+
});
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
`createPlayUI` adds the parity with the framework providers: the renderer contains the failure, and it appends the `fallback` to the container that the failed rebuild left clear. A later view that renders clears the container again, which removes the fallback.
|
|
336
|
+
|
|
337
|
+
`onError` says WHERE the report goes, and `fallback` says what the empty container shows. Neither option turns the containment on. Without `onError` the renderer writes the contained error to `console.error`, in the same way as it does for a component that throws without an `onRenderError` handler. Give `onError` to send the failure to your own observability tool instead.
|
|
338
|
+
|
|
339
|
+
**One fallback element belongs to one mount.** `appendChild` moves a node. Two mounts of the same factory therefore take the element from each other on every null view, and the container of the first one goes empty without a notice. Build one element for each `mount()` call.
|
|
340
|
+
|
|
341
|
+
**A `fallback` producer that throws is contained too — on a null view and after a failed rebuild alike — and it reports to `console.error` and NOT to `onError`.** After a failed rebuild the renderer calls the producer from inside the containment of the view, so a second trip through `onError` would report the failure of your fallback as a failure of the view. The container stays empty, and the renderer renders the next view that works.
|
|
342
|
+
|
|
280
343
|
A component implementation can also read the handler at `ctx.ctx.onRenderError`. A component therefore sends its own internal errors through the same channel:
|
|
281
344
|
|
|
282
345
|
```typescript
|
|
@@ -296,14 +359,15 @@ const Home: ComponentFn<typeof catalog, "Home"> = ({ ctx }) => {
|
|
|
296
359
|
|
|
297
360
|
### XMachines Layer
|
|
298
361
|
|
|
299
|
-
| Export | Kind | Description
|
|
300
|
-
| ---------------------------------------- | -------- |
|
|
301
|
-
| `createRenderer(catalog, components)` | function | The one-call factory.
|
|
302
|
-
| `createPlayUI(registryResult, options?)` | function | The complete factory. It returns a `
|
|
303
|
-
| `PlayRenderer` | class | The renderer class, with a `connect()` and `disconnect()` lifecycle
|
|
304
|
-
| `defineRegistry(catalog, options)` | function | Build a catalog-typed `DomRegistry` with typed handlers
|
|
305
|
-
| `renderSpec(...)` | function | The pure low-level Spec → DOM renderer
|
|
306
|
-
| `schema` | const | The `@xmachines/json-render-dom` schema — pass to `defineCatalog()`
|
|
362
|
+
| Export | Kind | Description |
|
|
363
|
+
| ---------------------------------------- | -------- | ------------------------------------------------------------------- |
|
|
364
|
+
| `createRenderer(catalog, components)` | function | The one-call factory. Its `mount` hands a `Cleanup` back |
|
|
365
|
+
| `createPlayUI(registryResult, options?)` | function | The complete factory. It returns a `DisposablePlayUI` |
|
|
366
|
+
| `PlayRenderer` | class | The renderer class, with a `connect()` and `disconnect()` lifecycle |
|
|
367
|
+
| `defineRegistry(catalog, options)` | function | Build a catalog-typed `DomRegistry` with typed handlers |
|
|
368
|
+
| `renderSpec(...)` | function | The pure low-level Spec → DOM renderer |
|
|
369
|
+
| `schema` | const | The `@xmachines/json-render-dom` schema — pass to `defineCatalog()` |
|
|
370
|
+
| `Cleanup` | type | The release a mount returns, re-exported from `@xmachines/play` |
|
|
307
371
|
|
|
308
372
|
### Key Types
|
|
309
373
|
|
|
@@ -315,21 +379,23 @@ const Home: ComponentFn<typeof catalog, "Home"> = ({ ctx }) => {
|
|
|
315
379
|
| `EventHandle` | The handle that `on(eventName)` returns. It has `emit()`, `shouldPreventDefault`, and `bound` |
|
|
316
380
|
| `SetState` | State updater: `(prev => next) => void` |
|
|
317
381
|
| `DefineRegistryResult` | The result of `defineRegistry`. It has `registry`, `handlers`, and `executeAction` |
|
|
318
|
-
| `PlayDomOptions` | Options for `PlayRenderer` — extends `UIProviderOptions`
|
|
319
|
-
| `CreatePlayUIOptions` | Options for `createPlayUI` — extends `UIProviderOptions`, adds `fallback`
|
|
382
|
+
| `PlayDomOptions` | Options for `PlayRenderer` — extends `UIProviderOptions`, adds `fallback` and `onError` |
|
|
383
|
+
| `CreatePlayUIOptions` | Options for `createPlayUI` — extends `UIProviderOptions`, adds `fallback` and `onError` |
|
|
320
384
|
| `MountOptions` | Per-mount options for `MountFn`: `store`, `loading` |
|
|
321
|
-
| `MountFn` | The mount
|
|
385
|
+
| `MountFn` | The type of a mount that a consumer writes: `(actor, container, options?) → disconnect` |
|
|
386
|
+
| `DisposablePlayUI` | The mount that `createPlayUI` builds. It hands a `Cleanup` back, so `using` releases it |
|
|
322
387
|
| `UIProviderOptions` | Shared options: `functions`, `validationFunctions`, `navigate`, `onRenderError` |
|
|
323
388
|
| `BaseComponentProps<P>` | Catalog-agnostic component props for shared component libraries |
|
|
324
389
|
| `DomRegistry` | Raw registry type: `Record<string, DomComponentRenderer>` |
|
|
325
390
|
| `DomSchema` | Type of the `schema` export |
|
|
326
391
|
| `ComputedFunction` | The type of a named compute function for the `functions` option |
|
|
392
|
+
| `Cleanup` | The release of a mount, re-exported from `@xmachines/play` |
|
|
327
393
|
|
|
328
394
|
## Rendering Behavior
|
|
329
395
|
|
|
330
396
|
- **The first render is synchronous** — the renderer fills the container before `connect()` returns.
|
|
331
397
|
- **A signal-driven render waits for a microtask** — `watchSignal` puts each update on the next tick of the microtask queue.
|
|
332
|
-
- **A null view** clears the container
|
|
398
|
+
- **A null view** clears the container, and the renderer then shows the `fallback` element when you give one. It shows it for every null view, and not for the first mount only — the four framework providers hold the same rule for their placeholder content.
|
|
333
399
|
- **A second `connect()` is safe** — a `connect()` call on a connected renderer disconnects it first.
|
|
334
400
|
- **`disconnect()` clears the container** and cancels every signal watcher and store watcher.
|
|
335
401
|
|
package/dist/PlayRenderer.d.ts
CHANGED
|
@@ -64,6 +64,15 @@ export declare class PlayRenderer {
|
|
|
64
64
|
private readonly actor;
|
|
65
65
|
private readonly registry;
|
|
66
66
|
private readonly options;
|
|
67
|
+
/**
|
|
68
|
+
* True from the start of `connect()` to the end of `disconnect()`.
|
|
69
|
+
*
|
|
70
|
+
* The watcher cannot answer this question. `connect()` installs it AFTER the
|
|
71
|
+
* synchronous first render, so a host that calls `connect()` again from the `onError`
|
|
72
|
+
* of that render finds no watcher, and a test of the watcher alone would skip the
|
|
73
|
+
* `disconnect()` and leave the guard of the abandoned connection alive for ever.
|
|
74
|
+
*/
|
|
75
|
+
private connected;
|
|
67
76
|
private unwatch;
|
|
68
77
|
private storeUnsubscribe;
|
|
69
78
|
/**
|
|
@@ -88,6 +97,8 @@ export declare class PlayRenderer {
|
|
|
88
97
|
*/
|
|
89
98
|
private lastViewKey;
|
|
90
99
|
private currentStore;
|
|
100
|
+
/** The fallback element, built at the first moment that the renderer shows it. */
|
|
101
|
+
private fallbackElement;
|
|
91
102
|
/**
|
|
92
103
|
* The shared coordinator of the store lifecycle, from @xmachines/play-actor. It
|
|
93
104
|
* seeds the store again on a change of the viewKey, it refreshes /context in place
|
|
@@ -104,6 +115,25 @@ export declare class PlayRenderer {
|
|
|
104
115
|
* call, which is rare but correct, changes no detached DOM tree.
|
|
105
116
|
*/
|
|
106
117
|
private alive;
|
|
118
|
+
/**
|
|
119
|
+
* The report guard, from @xmachines/play-actor.
|
|
120
|
+
*
|
|
121
|
+
* It blocks a reset that the host calls from INSIDE the report, and every reset once
|
|
122
|
+
* the renderer is disconnected. The five renderers share the one implementation.
|
|
123
|
+
*
|
|
124
|
+
* `alive` cannot answer the second half. A contained failure sets that flag to `false`
|
|
125
|
+
* and the next emission sets it back, because it guards the callback of the store
|
|
126
|
+
* subscription — a reset that a host keeps outlives both.
|
|
127
|
+
*/
|
|
128
|
+
private guard;
|
|
129
|
+
/**
|
|
130
|
+
* The retry that every report of THIS connection hands the host.
|
|
131
|
+
*
|
|
132
|
+
* `connect()` builds one, beside the guard that it belongs to. The four framework
|
|
133
|
+
* renderers hand the host one reset for the life of the provider, and this field holds
|
|
134
|
+
* the same rule for the life of the connection.
|
|
135
|
+
*/
|
|
136
|
+
private retry;
|
|
107
137
|
/**
|
|
108
138
|
* @param container - The `HTMLElement` to render into. Each view transition clears it and fills it again.
|
|
109
139
|
* @param actor - The actor with the `currentView` signal. It must implement `Viewable`.
|
|
@@ -117,6 +147,8 @@ export declare class PlayRenderer {
|
|
|
117
147
|
* - `validationFunctions` — your own check functions. They are available at `ctx.ctx.validationFunctions`.
|
|
118
148
|
* - `navigate` — the navigation callback. The renderer calls it for `onSuccess: { navigate: "..." }`.
|
|
119
149
|
* - `onRenderError` — the `(error, name)` handler of a component render error and of an action handler rejection. It stops the `console.error` fallback.
|
|
150
|
+
* - `onError` — the `(error, reset)` handler of a failure of a complete rebuild. The renderer contains such a failure always, and this option says where the report goes.
|
|
151
|
+
* - `fallback` — the element to show for every null view, and after a contained failure.
|
|
120
152
|
*/
|
|
121
153
|
constructor(container: HTMLElement, actor: AbstractActor<AnyActorLogic> & Viewable, registry: DomRegistry, options?: PlayDomOptions);
|
|
122
154
|
/**
|
|
@@ -142,11 +174,77 @@ export declare class PlayRenderer {
|
|
|
142
174
|
*/
|
|
143
175
|
get watchCleanupCount(): number;
|
|
144
176
|
private render;
|
|
177
|
+
/**
|
|
178
|
+
* The end of a render that failed, in ONE place.
|
|
179
|
+
*
|
|
180
|
+
* Three paths render — the fast path of a slice, the complete rebuild, and the write
|
|
181
|
+
* of the store — and each one ends here. The ORDER is load-bearing: the reset takes
|
|
182
|
+
* the registrations of the dead tree down BEFORE the report, so a handler of the host
|
|
183
|
+
* that renders again meets a renderer that holds nothing of the failed attempt. A
|
|
184
|
+
* second copy of the pair is a second chance to put the two in the other order.
|
|
185
|
+
*
|
|
186
|
+
* @param error - The failure that the renderer contains.
|
|
187
|
+
*/
|
|
188
|
+
private failView;
|
|
189
|
+
/**
|
|
190
|
+
* Clears the screen of the failed view, shows the fallback, and reports the failure.
|
|
191
|
+
*
|
|
192
|
+
* The renderer contains such a failure ALWAYS. No option turns the containment on,
|
|
193
|
+
* and none turns it off: `onError` says where the report goes, and `fallback` says
|
|
194
|
+
* what the empty container shows. The four framework renderers hold the same rule,
|
|
195
|
+
* because an error boundary of a framework is not an option that a caller turns off.
|
|
196
|
+
* A host that must escalate a failure raises it from a task of its own —
|
|
197
|
+
* `queueMicrotask(() => { throw error; })` — because the guard contains a handler
|
|
198
|
+
* that throws, exactly as the four framework renderers do.
|
|
199
|
+
*
|
|
200
|
+
* The container is cleared FIRST. The fast path of a slice holds the live tree of the
|
|
201
|
+
* previous emission, and that tree is dead as soon as the refresh throws, so the
|
|
202
|
+
* renderer must not keep it on the screen. A clear container also lets the fallback
|
|
203
|
+
* stand alone.
|
|
204
|
+
*
|
|
205
|
+
* The SCREEN comes first, and the report second: a handler that throws — a reporter
|
|
206
|
+
* that fails, or one that re-raises to escalate — must not defeat the containment
|
|
207
|
+
* that it was given to observe. With the order reversed the container stays empty AND
|
|
208
|
+
* the error escapes, which is both outcomes that the containment exists to prevent.
|
|
209
|
+
*/
|
|
210
|
+
private contain;
|
|
211
|
+
/**
|
|
212
|
+
* Builds the retry that one report hands the host.
|
|
213
|
+
*
|
|
214
|
+
* The read of the signal happens at the moment of the CALL: a retry that held the view
|
|
215
|
+
* that failed would take a host off the healthy screen and back onto the one that
|
|
216
|
+
* threw.
|
|
217
|
+
*
|
|
218
|
+
* The retry belongs to the guard of ITS connection, and it asks that guard alone. A
|
|
219
|
+
* host may KEEP the callback — a "Retry" button of a toast outlives the route that
|
|
220
|
+
* opened it — and `disconnect()` disposes the guard that was live then. `connect()`
|
|
221
|
+
* disconnects a connected renderer first, so every guard that leaves the field is a
|
|
222
|
+
* disposed guard, and a retry of an older connection stays dead. The rule of the prop
|
|
223
|
+
* is one rule: a reset after `disconnect()` does nothing.
|
|
224
|
+
*
|
|
225
|
+
* @param guard - The guard of the connection that this retry belongs to.
|
|
226
|
+
*/
|
|
227
|
+
private retryOf;
|
|
228
|
+
/**
|
|
229
|
+
* Appends the fallback element to the container, which the caller cleared already.
|
|
230
|
+
* The renderer calls it for a null view, and after a failure of a rebuild that it
|
|
231
|
+
* contains. Both callers clear the container first. `appendChild` moves the node.
|
|
232
|
+
* Therefore a second call adds no copy.
|
|
233
|
+
*/
|
|
234
|
+
private showFallback;
|
|
145
235
|
/**
|
|
146
236
|
* A rebuild that fails must not leave the guard of the fast path armed on a dead
|
|
147
237
|
* tree, because the container is empty already. Therefore this code resets the view
|
|
148
238
|
* identity. The next emission, also one with the same viewKey, then makes a
|
|
149
239
|
* complete render again. It does not patch a store that nothing shows.
|
|
240
|
+
*
|
|
241
|
+
* It releases the watch subscriptions of the dead tree too. A complete rebuild
|
|
242
|
+
* releases them before it builds again, and disconnect() releases them at the end of
|
|
243
|
+
* the life of the renderer — but a failure takes the DOM down HERE, between those two
|
|
244
|
+
* moments. Without this step one update of the store of the host runs every watch
|
|
245
|
+
* action of a tree that nothing shows, against detached elements, with `send` still
|
|
246
|
+
* bound to the actor. The fast path of a slice leaves a live tree of its own, and it
|
|
247
|
+
* reaches this code only when it fails.
|
|
150
248
|
*/
|
|
151
249
|
private resetFailedRebuild;
|
|
152
250
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlayRenderer.d.ts","sourceRoot":"","sources":["../src/PlayRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"PlayRenderer.d.ts","sourceRoot":"","sources":["../src/PlayRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAYH,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAY,MAAM,uBAAuB,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAG5C,OAAO,KAAK,EAAE,WAAW,EAAY,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAyDjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,qBAAa,YAAY;IA+FvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjGzB;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,gBAAgB,CAA6B;IACrD;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa,CAAyB;IAC9C;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,YAAY,CAA2B;IAC/C,kFAAkF;IAClF,OAAO,CAAC,eAAe,CAA4B;IACnD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAE7B;IACF;;;;;OAKG;IACH,OAAO,CAAC,KAAK,CAAQ;IAErB;;;;;;;;;OASG;IAGH,OAAO,CAAC,KAAK,CAAkD;IAE/D;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,CAAwC;IAErD;;;;;;;;;;;;;;;OAeG;gBAEe,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,QAAQ,EAC9C,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE,cAAmB;IAG9C;;;;;;;;OAQG;IACH,OAAO,IAAI,IAAI;IAyCf;;OAEG;IACH,UAAU,IAAI,IAAI;IA4BlB;;;;;;OAMG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,OAAO,CAAC,MAAM;IAmGd;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ;IAKhB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,OAAO;IAiBf;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,OAAO;IAOf;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA4BpB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;;;;;;OAOG;IACH,OAAO,CAAC,UAAU;CA6HlB"}
|