@warp-drive/ember 5.4.1-beta.1 → 5.4.1-beta.2

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.
@@ -1,7 +1,6 @@
1
- /// <reference path="./-private/request-state.d.ts" />
2
- /// <reference path="./-private/promise-state.d.ts" />
3
- /// <reference path="./-private/await.d.ts" />
1
+ /// <reference path="./install.d.ts" />
4
2
  /// <reference path="./-private/request.d.ts" />
3
+ /// <reference path="./-private/await.d.ts" />
5
4
  declare module '@warp-drive/ember' {
6
5
  /**
7
6
  * <h3 align="center">⚛️ Data utilities for using <em style="color: lightgreen">Warp</em><strong style="color: magenta">Drive</strong> with 🐹 <em style="color: orange">Ember</em><em style="color: lightblue">.js</em></h3>
@@ -19,12 +18,211 @@ declare module '@warp-drive/ember' {
19
18
  * and components that enable you to build robust performant apps with
20
19
  * elegant control flow.
21
20
  *
21
+ * ## Using .hbs
22
+ *
23
+ * The components and utils this library exports are intended for use with Glimmer
24
+ * Flavored JavaScript (gjs). To use them in handlebars files, your app should re-
25
+ * export them. For instance:
26
+ *
27
+ * *app/components/await.ts*
28
+ * ```ts
29
+ * export { Await as default } from '@warp-drive/ember';
30
+ * ```
31
+ *
32
+ * ```hbs
33
+ * <Await @promise={{this.getTheData}}></Await>
34
+ * ```
35
+ *
36
+ * This allows renaming them to avoid conflicts just by using a different filename
37
+ * if desired:
38
+ *
39
+ * *app/components/warp-drive-await.ts*
40
+ * ```ts
41
+ * export { Await as default } from '@warp-drive/ember';
42
+ * ```
43
+ *
44
+ * ```hbs
45
+ * <WarpDriveAwait @promise={{this.getTheData}}></WarpDriveAwait>
46
+ * ```
47
+ *
22
48
  * @module @warp-drive/ember
23
49
  * @main @warp-drive/ember
24
50
  */
25
- export { getRequestState } from '@warp-drive/ember/-private/request-state';
26
- export { getPromiseState } from '@warp-drive/ember/-private/promise-state';
27
- export { Request } from '@warp-drive/ember/-private/request.gts';
28
- export { Await, Throw } from '@warp-drive/ember/-private/await.gts';
51
+ export { Request } from './-private/request';
52
+ export { Await, Throw } from './-private/await';
53
+ /**
54
+ * PromiseState provides a reactive wrapper for a promise which allows you write declarative
55
+ * code around a promise's control flow. It is useful in both Template and JavaScript contexts,
56
+ * allowing you to quickly derive behaviors and data from pending, error and success states.
57
+ *
58
+ * ```ts
59
+ * interface PromiseState<T = unknown, E = unknown> {
60
+ * isPending: boolean;
61
+ * isSuccess: boolean;
62
+ * isError: boolean;
63
+ * result: T | null;
64
+ * error: E | null;
65
+ * }
66
+ * ```
67
+ *
68
+ * To get the state of a promise, use `getPromiseState`.
69
+ *
70
+ * @class PromiseState
71
+ * @public
72
+ */
73
+ /**
74
+ * Returns a reactive state-machine for the provided promise or awaitable.
75
+ *
76
+ * Repeat calls to `getPromiseState` with the same promise will return the same state object
77
+ * making is safe and easy to use in templates and JavaScript code to produce reactive
78
+ * behaviors around promises.
79
+ *
80
+ * `getPromiseState` can be used in both JavaScript and Template contexts.
81
+ *
82
+ * ```ts
83
+ * import { getPromiseState } from '@warp-drive/ember';
84
+ *
85
+ * const state = getPromiseState(promise);
86
+ * ```
87
+ *
88
+ * For instance, we could write a getter on a component that updates whenever
89
+ * the promise state advances or the promise changes, by combining the function
90
+ * with the use of `@cached`
91
+ *
92
+ * ```ts
93
+ * class Component {
94
+ * @cached
95
+ * get title() {
96
+ * const state = getPromiseState(this.args.request);
97
+ * if (state.isPending) {
98
+ * return 'loading...';
99
+ * }
100
+ * if (state.isError) { return null; }
101
+ * return state.result.title;
102
+ * }
103
+ * }
104
+ * ```
105
+ *
106
+ * Or in a template as a helper:
107
+ *
108
+ * ```gjs
109
+ * import { getPromiseState } from '@warp-drive/ember';
110
+ *
111
+ * <template>
112
+ * {{#let (getPromiseState @request) as |state|}}
113
+ * {{#if state.isPending}} <Spinner />
114
+ * {{else if state.isError}} <ErrorForm @error={{state.error}} />
115
+ * {{else}}
116
+ * <h1>{{state.result.title}}</h1>
117
+ * {{/if}}
118
+ * {{/let}}
119
+ * </template>
120
+ * ```
121
+ *
122
+ * If looking to use in a template, consider also the `<Await />` component.
123
+ *
124
+ * @method getPromiseState
125
+ * @for @warp-drive/ember
126
+ * @static
127
+ * @public
128
+ * @param {Promise<T> | Awaitable<T, E>} promise
129
+ * @return {PromiseState<T, E>}
130
+ */
131
+ export { getPromiseState } from '@ember-data/store/-private';
132
+ /**
133
+ * Lazily consumes the stream of a request, providing a number of
134
+ * reactive properties that can be used to build UIs that respond
135
+ * to the progress of a request.
136
+ *
137
+ * @class RequestLoadingState
138
+ * @public
139
+ */
140
+ /**
141
+ * RequestState extends the concept of PromiseState to provide a reactive
142
+ * wrapper for a request `Future` which allows you write declarative code
143
+ * around a Future's control flow.
144
+ *
145
+ * It is useful in both Template and JavaScript contexts, allowing you
146
+ * to quickly derive behaviors and data from pending, error and success
147
+ * states.
148
+ *
149
+ * The key difference between a Promise and a Future is that Futures provide
150
+ * access to a stream of their content, the identity of the request (if any)
151
+ * as well as the ability to attempt to abort the request.
152
+ *
153
+ * ```ts
154
+ * interface Future<T> extends Promise<T>> {
155
+ * getStream(): Promise<ReadableStream>;
156
+ * abort(): void;
157
+ * lid: StableDocumentIdentifier | null;
158
+ * }
159
+ * ```
160
+ *
161
+ * These additional APIs allow us to craft even richer state experiences.
162
+ *
163
+ * To get the state of a request, use `getRequestState`.
164
+ *
165
+ * @class RequestState
166
+ * @public
167
+ */
168
+ /**
169
+ *
170
+ *
171
+ * `getRequestState` can be used in both JavaScript and Template contexts.
172
+ *
173
+ * ```ts
174
+ * import { getRequestState } from '@warp-drive/ember';
175
+ *
176
+ * const state = getRequestState(future);
177
+ * ```
178
+ *
179
+ * For instance, we could write a getter on a component that updates whenever
180
+ * the request state advances or the future changes, by combining the function
181
+ * with the use of `@cached`
182
+ *
183
+ * ```ts
184
+ * class Component {
185
+ * @cached
186
+ * get title() {
187
+ * const state = getRequestState(this.args.request);
188
+ * if (state.isPending) {
189
+ * return 'loading...';
190
+ * }
191
+ * if (state.isError) { return null; }
192
+ * return state.result.title;
193
+ * }
194
+ * }
195
+ * ```
196
+ *
197
+ * Or in a template as a helper:
198
+ *
199
+ * ```gjs
200
+ * import { getRequestState } from '@warp-drive/ember';
201
+ *
202
+ * <template>
203
+ * {{#let (getRequestState @request) as |state|}}
204
+ * {{#if state.isPending}}
205
+ * <Spinner />
206
+ * {{else if state.isError}}
207
+ * <ErrorForm @error={{state.error}} />
208
+ * {{else}}
209
+ * <h1>{{state.result.title}}</h1>
210
+ * {{/if}}
211
+ * {{/let}}
212
+ * </template>
213
+ * ```
214
+ *
215
+ * If looking to use in a template, consider also the `<Request />` component
216
+ * which offers a numbe of additional capabilities for requests *beyond* what
217
+ * `RequestState` provides.
218
+ *
219
+ * @method getRequestState
220
+ * @for @warp-drive/ember
221
+ * @static
222
+ * @public
223
+ * @param future
224
+ * @return {RequestState}
225
+ */
226
+ export { getRequestState, type RequestLoadingState } from '@ember-data/store/-private';
29
227
  }
30
228
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,OAAO,EAAE,eAAe,EAAE,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,17 @@
1
+ declare module '@warp-drive/ember/install' {
2
+ import { tagForProperty } from '@ember/-internals/metal';
3
+ type Tag = ReturnType<typeof tagForProperty>;
4
+ export function buildSignalConfig(options: {
5
+ wellknown: {
6
+ Array: symbol | string;
7
+ };
8
+ }): {
9
+ createSignal(obj: object, key: string | symbol): import("@glimmer/validator").Tag | [import("@glimmer/validator").Tag, import("@glimmer/validator").Tag, import("@glimmer/validator").Tag];
10
+ consumeSignal(signal: Tag | [Tag, Tag, Tag]): void;
11
+ notifySignal(signal: Tag | [Tag, Tag, Tag]): void;
12
+ createMemo: <F>(object: object, key: string | symbol, fn: () => F) => (() => F);
13
+ willSyncFlushWatchers: () => boolean;
14
+ };
15
+ export {};
16
+ }
17
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQzD,KAAK,GAAG,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAG7C,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;KACxB,CAAC;CACH;sBAIqB,MAAM,OAAO,MAAM,GAAG,MAAM;0BAQxB,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;yBAYtB,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;iBAW7B,CAAC,UAAU,MAAM,OAAO,MAAM,GAAG,MAAM,MAAM,MAAM,CAAC,KAAG,CAAC,MAAM,CAAC,CAAC;;EAwBhF"}
@@ -1,91 +0,0 @@
1
- declare module '@warp-drive/ember/-private/promise-state' {
2
- import type { Awaitable } from '@ember-data/request';
3
- /**
4
- * PromiseState provides a reactive wrapper for a promise which allows you write declarative
5
- * code around a promise's control flow. It is useful in both Template and JavaScript contexts,
6
- * allowing you to quickly derive behaviors and data from pending, error and success states.
7
- *
8
- * ```ts
9
- * interface PromiseState<T = unknown, E = unknown> {
10
- * isPending: boolean;
11
- * isSuccess: boolean;
12
- * isError: boolean;
13
- * result: T | null;
14
- * error: E | null;
15
- * }
16
- * ```
17
- *
18
- * To get the state of a promise, use `getPromiseState`.
19
- *
20
- * @class PromiseState
21
- * @public
22
- */
23
- export class PromiseState<T = unknown, E = unknown> {
24
- result: T | null;
25
- error: E | null;
26
- isPending: boolean;
27
- isSuccess: boolean;
28
- isError: boolean;
29
- constructor(promise: Promise<T> | Awaitable<T, E>);
30
- }
31
- /**
32
- * Returns a reactive state-machine for the provided promise or awaitable.
33
- *
34
- * Repeat calls to `getPromiseState` with the same promise will return the same state object
35
- * making is safe and easy to use in templates and JavaScript code to produce reactive
36
- * behaviors around promises.
37
- *
38
- * `getPromiseState` can be used in both JavaScript and Template contexts.
39
- *
40
- * ```ts
41
- * import { getPromiseState } from '@warp-drive/ember';
42
- *
43
- * const state = getPromiseState(promise);
44
- * ```
45
- *
46
- * For instance, we could write a getter on a component that updates whenever
47
- * the promise state advances or the promise changes, by combining the function
48
- * with the use of `@cached`
49
- *
50
- * ```ts
51
- * class Component {
52
- * @cached
53
- * get title() {
54
- * const state = getPromiseState(this.args.request);
55
- * if (state.isPending) {
56
- * return 'loading...';
57
- * }
58
- * if (state.isError) { return null; }
59
- * return state.result.title;
60
- * }
61
- * }
62
- * ```
63
- *
64
- * Or in a template as a helper:
65
- *
66
- * ```gjs
67
- * import { getPromiseState } from '@warp-drive/ember';
68
- *
69
- * <template>
70
- * {{#let (getPromiseState @request) as |state|}}
71
- * {{#if state.isPending}} <Spinner />
72
- * {{else if state.isError}} <ErrorForm @error={{state.error}} />
73
- * {{else}}
74
- * <h1>{{state.result.title}}</h1>
75
- * {{/if}}
76
- * {{/let}}
77
- * </template>
78
- * ```
79
- *
80
- * If looking to use in a template, consider also the `<Await />` component.
81
- *
82
- * @method getPromiseState
83
- * @for @warp-drive/ember
84
- * @static
85
- * @public
86
- * @param {Promise<T> | Awaitable<T, E>} promise
87
- * @return {PromiseState<T, E>}
88
- */
89
- export function getPromiseState<T = unknown, E = unknown>(promise: Promise<T> | Awaitable<T, E>): PromiseState<T, E>;
90
- }
91
- //# sourceMappingURL=promise-state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"promise-state.d.ts","sourceRoot":"","sources":["../../src/-private/promise-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKrD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACvC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAQ;IACxB,KAAK,EAAE,CAAC,GAAG,IAAI,CAAQ;IACvB,SAAS,UAAQ;IACjB,SAAS,UAAS;IAClB,OAAO,UAAS;gBAEb,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;CA8BlD;AAaD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAUnH"}
@@ -1,149 +0,0 @@
1
- declare module '@warp-drive/ember/-private/request-state' {
2
- import type { Future, ImmutableRequestInfo, ResponseInfo, StructuredErrorDocument } from '@ember-data/request';
3
- /**
4
- * Lazily consumes the stream of a request, providing a number of
5
- * reactive properties that can be used to build UIs that respond
6
- * to the progress of a request.
7
- *
8
- * @class RequestLoadingState
9
- * @public
10
- */
11
- export class RequestLoadingState {
12
- _stream: TransformStream | null;
13
- _future: Future<unknown>;
14
- _triggered: boolean;
15
- _trigger(): void;
16
- promise: Promise<void> | null;
17
- _sizeHint: number;
18
- _bytesLoaded: number;
19
- _startTime: number;
20
- _endTime: number;
21
- _lastPacketTime: number;
22
- _isPending: boolean;
23
- _isStarted: boolean;
24
- _isComplete: boolean;
25
- _isCancelled: boolean;
26
- _isErrored: boolean;
27
- _error: Error | null;
28
- get isPending(): boolean;
29
- get sizeHint(): number;
30
- get stream(): ReadableStream | null;
31
- get isStarted(): boolean;
32
- get bytesLoaded(): number;
33
- get startTime(): number;
34
- get endTime(): number;
35
- get lastPacketTime(): number;
36
- get isComplete(): boolean;
37
- get isCancelled(): boolean;
38
- get isErrored(): boolean;
39
- get error(): Error | null;
40
- get elapsedTime(): number;
41
- get completedRatio(): number;
42
- get remainingRatio(): number;
43
- get duration(): number;
44
- get speed(): number;
45
- constructor(future: Future<unknown>);
46
- abort: () => void;
47
- }
48
- /**
49
- * RequestState extends the concept of PromiseState to provide a reactive
50
- * wrapper for a request `Future` which allows you write declarative code
51
- * around a Future's control flow.
52
- *
53
- * It is useful in both Template and JavaScript contexts, allowing you
54
- * to quickly derive behaviors and data from pending, error and success
55
- * states.
56
- *
57
- * The key difference between a Promise and a Future is that Futures provide
58
- * access to a stream of their content, the identity of the request (if any)
59
- * as well as the ability to attempt to abort the request.
60
- *
61
- * ```ts
62
- * interface Future<T> extends Promise<T>> {
63
- * getStream(): Promise<ReadableStream>;
64
- * abort(): void;
65
- * lid: StableDocumentIdentifier | null;
66
- * }
67
- * ```
68
- *
69
- * These additional APIs allow us to craft even richer state experiences.
70
- *
71
- * To get the state of a request, use `getRequestState`.
72
- *
73
- * @class RequestState
74
- * @public
75
- */
76
- export class RequestState<T = unknown, RT = unknown> {
77
- #private;
78
- result: RT | null;
79
- error: StructuredErrorDocument | null;
80
- isLoading: boolean;
81
- isSuccess: boolean;
82
- isError: boolean;
83
- request: ImmutableRequestInfo<T, RT> | null;
84
- response: Response | ResponseInfo | null;
85
- get isCancelled(): boolean;
86
- get loadingState(): RequestLoadingState;
87
- constructor(future: Future<RT>);
88
- }
89
- /**
90
- *
91
- *
92
- * `getRequestState` can be used in both JavaScript and Template contexts.
93
- *
94
- * ```ts
95
- * import { getRequestState } from '@warp-drive/ember';
96
- *
97
- * const state = getRequestState(future);
98
- * ```
99
- *
100
- * For instance, we could write a getter on a component that updates whenever
101
- * the request state advances or the future changes, by combining the function
102
- * with the use of `@cached`
103
- *
104
- * ```ts
105
- * class Component {
106
- * @cached
107
- * get title() {
108
- * const state = getRequestState(this.args.request);
109
- * if (state.isPending) {
110
- * return 'loading...';
111
- * }
112
- * if (state.isError) { return null; }
113
- * return state.result.title;
114
- * }
115
- * }
116
- * ```
117
- *
118
- * Or in a template as a helper:
119
- *
120
- * ```gjs
121
- * import { getRequestState } from '@warp-drive/ember';
122
- *
123
- * <template>
124
- * {{#let (getRequestState @request) as |state|}}
125
- * {{#if state.isPending}}
126
- * <Spinner />
127
- * {{else if state.isError}}
128
- * <ErrorForm @error={{state.error}} />
129
- * {{else}}
130
- * <h1>{{state.result.title}}</h1>
131
- * {{/if}}
132
- * {{/let}}
133
- * </template>
134
- * ```
135
- *
136
- * If looking to use in a template, consider also the `<Request />` component
137
- * which offers a numbe of additional capabilities for requests *beyond* what
138
- * `RequestState` provides.
139
- *
140
- * @method getRequestState
141
- * @for @warp-drive/ember
142
- * @static
143
- * @public
144
- * @param future
145
- * @return {RequestState}
146
- */
147
- export function getRequestState<RT, T>(future: Future<RT>): RequestState<T, RT>;
148
- }
149
- //# sourceMappingURL=request-state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-state.d.ts","sourceRoot":"","sources":["../../src/-private/request-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,MAAM,EACN,oBAAoB,EACpB,YAAY,EAEZ,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAiE7B;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,EAAE,eAAe,GAAG,IAAI,CAAQ;IACvC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,UAAU,UAAS;IACnB,QAAQ;IAgCR,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC5B,SAAS,SAAK;IACd,YAAY,SAAK;IAEjB,UAAU,SAAK;IACf,QAAQ,SAAK;IACb,eAAe,SAAK;IAEpB,UAAU,UAAQ;IAClB,UAAU,UAAS;IACnB,WAAW,UAAS;IACpB,YAAY,UAAS;IACrB,UAAU,UAAS;IACnB,MAAM,EAAE,KAAK,GAAG,IAAI,CAAQ;IAErC,IAAI,SAAS,IAAI,OAAO,CAGvB;IAED,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED,IAAI,MAAM,IAAI,cAAc,GAAG,IAAI,CASlC;IAED,IAAI,SAAS,IAAI,OAAO,CAGvB;IAED,IAAI,WAAW,IAAI,MAAM,CAGxB;IAED,IAAI,SAAS,IAAI,MAAM,CAGtB;IAED,IAAI,OAAO,IAAI,MAAM,CAGpB;IAED,IAAI,cAAc,IAAI,MAAM,CAG3B;IAED,IAAI,UAAU,IAAI,OAAO,CAGxB;IAED,IAAI,WAAW,IAAI,OAAO,CAGzB;IAED,IAAI,SAAS,IAAI,OAAO,CAGvB;IAED,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI,CAGxB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,KAAK,IAAI,MAAM,CAGlB;gBAEW,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC;IAInC,KAAK,QAAO,IAAI,CAEd;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO;;IAIxC,MAAM,EAAE,EAAE,GAAG,IAAI,CAAQ;IACzB,KAAK,EAAE,uBAAuB,GAAG,IAAI,CAAQ;IAC7C,SAAS,UAAQ;IACjB,SAAS,UAAS;IAClB,OAAO,UAAS;IAChB,OAAO,EAAE,oBAAoB,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAQ;IACnD,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,IAAI,CAAQ;IAEzD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,YAAY,wBAMf;gBAEW,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CAqC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAS9E"}