@tamagui/react-native-web-internals 1.129.13 → 1.129.14
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/dist/cjs/modules/InteractionManager.cjs +158 -37
- package/dist/cjs/modules/InteractionManager.js +117 -14
- package/dist/cjs/modules/InteractionManager.js.map +1 -1
- package/dist/cjs/modules/InteractionManager.native.js +208 -11
- package/dist/cjs/modules/InteractionManager.native.js.map +2 -2
- package/dist/esm/modules/InteractionManager.js +118 -14
- package/dist/esm/modules/InteractionManager.js.map +1 -1
- package/dist/esm/modules/InteractionManager.mjs +158 -36
- package/dist/esm/modules/InteractionManager.mjs.map +1 -1
- package/dist/esm/modules/InteractionManager.native.js +214 -12
- package/dist/esm/modules/InteractionManager.native.js.map +1 -1
- package/package.json +8 -8
- package/src/modules/InteractionManager.tsx +276 -24
- package/types/modules/InteractionManager.d.ts +24 -10
- package/types/modules/InteractionManager.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["requestIdleCallback","
|
|
1
|
+
{"version":3,"names":["invariant","requestIdleCallback","_class_call_check","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_create_class","protoProps","staticProps","prototype","_define_property","obj","value","EventEmitter","EventEmitter2","eventType","listener","context","registrations","_allocate","registration","remove","delete","add","_len","arguments","args","Array","_key","_registry","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","from","Symbol","iterator","_step","next","done","apply","err","return","Set","TaskQueue","TaskQueue2","param","onMoreTasks","_onMoreTasks","_queueStack","tasks","popable","_this","forEach","task","_enqueue","tasksToCancel","map","queue","filter","includes","idx","_getCurrentQueue","shift","_genPromise","run","JSON","stringify","e","Error","taskName","name","message","push"],"sources":["../../../src/modules/InteractionManager.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/react-native-web-internals",
|
|
3
|
-
"version": "1.129.
|
|
3
|
+
"version": "1.129.14",
|
|
4
4
|
"description": "React Native for Web",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "dist/cjs",
|
|
@@ -31,16 +31,16 @@
|
|
|
31
31
|
}
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@tamagui/normalize-css-color": "1.129.
|
|
35
|
-
"@tamagui/react-native-use-pressable": "1.129.
|
|
36
|
-
"@tamagui/react-native-use-responder-events": "1.129.
|
|
37
|
-
"@tamagui/simple-hash": "1.129.
|
|
38
|
-
"@tamagui/use-element-layout": "1.129.
|
|
39
|
-
"@tamagui/web": "1.129.
|
|
34
|
+
"@tamagui/normalize-css-color": "1.129.14",
|
|
35
|
+
"@tamagui/react-native-use-pressable": "1.129.14",
|
|
36
|
+
"@tamagui/react-native-use-responder-events": "1.129.14",
|
|
37
|
+
"@tamagui/simple-hash": "1.129.14",
|
|
38
|
+
"@tamagui/use-element-layout": "1.129.14",
|
|
39
|
+
"@tamagui/web": "1.129.14",
|
|
40
40
|
"react": "*"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@tamagui/build": "1.129.
|
|
43
|
+
"@tamagui/build": "1.129.14"
|
|
44
44
|
},
|
|
45
45
|
"license": "MIT",
|
|
46
46
|
"tags": [
|
|
@@ -4,43 +4,225 @@
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the MIT license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*
|
|
8
|
-
* @flow
|
|
9
7
|
*/
|
|
10
8
|
|
|
11
|
-
import
|
|
9
|
+
import { invariant } from './invariant'
|
|
10
|
+
import requestIdleCallback from './requestIdleCallback/index'
|
|
11
|
+
|
|
12
|
+
// Simple EventEmitter implementation for internal use
|
|
13
|
+
type EventMap = {
|
|
14
|
+
[K in string]: any[]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
type EventSubscription = {
|
|
18
|
+
remove: () => void
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
class EventEmitter<TEventMap extends EventMap = EventMap> {
|
|
22
|
+
private _registry: {
|
|
23
|
+
[K in keyof TEventMap]?: Set<{
|
|
24
|
+
context: any
|
|
25
|
+
listener: (...args: TEventMap[K]) => void
|
|
26
|
+
remove: () => void
|
|
27
|
+
}>
|
|
28
|
+
} = {}
|
|
29
|
+
|
|
30
|
+
addListener<K extends keyof TEventMap>(
|
|
31
|
+
eventType: K,
|
|
32
|
+
listener: (...args: TEventMap[K]) => void,
|
|
33
|
+
context?: any
|
|
34
|
+
): EventSubscription {
|
|
35
|
+
const registrations = this._allocate(eventType)
|
|
36
|
+
const registration = {
|
|
37
|
+
context,
|
|
38
|
+
listener,
|
|
39
|
+
remove: () => {
|
|
40
|
+
registrations.delete(registration)
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
registrations.add(registration)
|
|
44
|
+
return registration
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
emit<K extends keyof TEventMap>(eventType: K, ...args: TEventMap[K]): void {
|
|
48
|
+
const registrations = this._registry[eventType]
|
|
49
|
+
if (registrations != null) {
|
|
50
|
+
for (const registration of Array.from(registrations)) {
|
|
51
|
+
registration.listener.apply(registration.context, args)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private _allocate<K extends keyof TEventMap>(
|
|
57
|
+
eventType: K
|
|
58
|
+
): Set<{
|
|
59
|
+
context: any
|
|
60
|
+
listener: (...args: TEventMap[K]) => void
|
|
61
|
+
remove: () => void
|
|
62
|
+
}> {
|
|
63
|
+
let registrations = this._registry[eventType]
|
|
64
|
+
if (registrations == null) {
|
|
65
|
+
registrations = new Set()
|
|
66
|
+
this._registry[eventType] = registrations
|
|
67
|
+
}
|
|
68
|
+
return registrations
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// TaskQueue implementation
|
|
73
|
+
type SimpleTask = {
|
|
74
|
+
name: string
|
|
75
|
+
run: () => void
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
type PromiseTask = {
|
|
79
|
+
name: string
|
|
80
|
+
gen: () => Promise<void>
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export type Task = SimpleTask | PromiseTask | (() => void)
|
|
84
|
+
|
|
85
|
+
interface QueueItem {
|
|
86
|
+
tasks: Task[]
|
|
87
|
+
popable: boolean
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
class TaskQueue {
|
|
91
|
+
private _queueStack: QueueItem[]
|
|
92
|
+
private _onMoreTasks: () => void
|
|
93
|
+
|
|
94
|
+
constructor({ onMoreTasks }: { onMoreTasks: () => void }) {
|
|
95
|
+
this._onMoreTasks = onMoreTasks
|
|
96
|
+
this._queueStack = [{ tasks: [], popable: true }]
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
enqueueTasks(tasks: Task[]): void {
|
|
100
|
+
tasks.forEach((task) => this._enqueue(task))
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
cancelTasks(tasksToCancel: Task[]): void {
|
|
104
|
+
this._queueStack = this._queueStack
|
|
105
|
+
.map((queue) => ({
|
|
106
|
+
...queue,
|
|
107
|
+
tasks: queue.tasks.filter((task) => !tasksToCancel.includes(task)),
|
|
108
|
+
}))
|
|
109
|
+
.filter((queue, idx) => queue.tasks.length > 0 || idx === 0)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
hasTasksToProcess(): boolean {
|
|
113
|
+
return this._getCurrentQueue().length > 0
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
processNext(): void {
|
|
117
|
+
const queue = this._getCurrentQueue()
|
|
118
|
+
if (queue.length) {
|
|
119
|
+
const task = queue.shift()
|
|
120
|
+
try {
|
|
121
|
+
if (typeof task === 'object' && task && 'gen' in task) {
|
|
122
|
+
this._genPromise(task as PromiseTask)
|
|
123
|
+
} else if (typeof task === 'object' && task && 'run' in task) {
|
|
124
|
+
;(task as SimpleTask).run()
|
|
125
|
+
} else {
|
|
126
|
+
invariant(
|
|
127
|
+
typeof task === 'function',
|
|
128
|
+
'Expected Function, SimpleTask, or PromiseTask, but got:\n' +
|
|
129
|
+
JSON.stringify(task, null, 2)
|
|
130
|
+
)
|
|
131
|
+
;(task as () => void)()
|
|
132
|
+
}
|
|
133
|
+
} catch (e) {
|
|
134
|
+
if (e instanceof Error) {
|
|
135
|
+
const taskName =
|
|
136
|
+
task && typeof task === 'object' && 'name' in task ? task.name : ''
|
|
137
|
+
e.message = 'TaskQueue: Error with task ' + taskName + ': ' + e.message
|
|
138
|
+
}
|
|
139
|
+
throw e
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private _enqueue(task: Task): void {
|
|
145
|
+
this._getCurrentQueue().push(task)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
private _getCurrentQueue(): Task[] {
|
|
149
|
+
const stackIdx = this._queueStack.length - 1
|
|
150
|
+
const queue = this._queueStack[stackIdx]
|
|
151
|
+
if (queue.popable && queue.tasks.length === 0 && stackIdx > 0) {
|
|
152
|
+
this._queueStack.pop()
|
|
153
|
+
return this._getCurrentQueue()
|
|
154
|
+
} else {
|
|
155
|
+
return queue.tasks
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private _genPromise(task: PromiseTask) {
|
|
160
|
+
const length = this._queueStack.push({ tasks: [], popable: false })
|
|
161
|
+
const stackIdx = length - 1
|
|
162
|
+
const stackItem = this._queueStack[stackIdx]
|
|
163
|
+
task
|
|
164
|
+
.gen()
|
|
165
|
+
.then(() => {
|
|
166
|
+
stackItem.popable = true
|
|
167
|
+
if (this.hasTasksToProcess()) {
|
|
168
|
+
this._onMoreTasks()
|
|
169
|
+
}
|
|
170
|
+
})
|
|
171
|
+
.catch((ex) => {
|
|
172
|
+
setTimeout(() => {
|
|
173
|
+
if (ex instanceof Error) {
|
|
174
|
+
ex.message = `TaskQueue: Error resolving Promise in task ${task.name}: ${ex.message}`
|
|
175
|
+
}
|
|
176
|
+
throw ex
|
|
177
|
+
}, 0)
|
|
178
|
+
})
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const _emitter = new EventEmitter<{
|
|
183
|
+
interactionComplete: []
|
|
184
|
+
interactionStart: []
|
|
185
|
+
}>()
|
|
12
186
|
|
|
13
187
|
export const InteractionManager = {
|
|
14
188
|
Events: {
|
|
15
|
-
interactionStart: 'interactionStart',
|
|
16
|
-
interactionComplete: 'interactionComplete',
|
|
189
|
+
interactionStart: 'interactionStart' as const,
|
|
190
|
+
interactionComplete: 'interactionComplete' as const,
|
|
17
191
|
},
|
|
18
192
|
|
|
19
193
|
/**
|
|
20
194
|
* Schedule a function to run after all interactions have completed.
|
|
21
195
|
*/
|
|
22
|
-
runAfterInteractions(task): {
|
|
23
|
-
then:
|
|
24
|
-
|
|
25
|
-
|
|
196
|
+
runAfterInteractions(task?: Task): {
|
|
197
|
+
then: <TResult1 = void, TResult2 = never>(
|
|
198
|
+
onfulfilled?: ((value: void) => TResult1 | PromiseLike<TResult1>) | null,
|
|
199
|
+
onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null
|
|
200
|
+
) => Promise<TResult1 | TResult2>
|
|
201
|
+
done: <TResult1 = void, TResult2 = never>(
|
|
202
|
+
onfulfilled?: ((value: void) => TResult1 | PromiseLike<TResult1>) | null,
|
|
203
|
+
onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null
|
|
204
|
+
) => Promise<TResult1 | TResult2>
|
|
205
|
+
cancel: () => void
|
|
26
206
|
} {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
207
|
+
const tasks: Array<Task> = []
|
|
208
|
+
const promise = new Promise<void>((resolve) => {
|
|
209
|
+
_scheduleUpdate()
|
|
210
|
+
if (task) {
|
|
211
|
+
tasks.push(task)
|
|
212
|
+
}
|
|
213
|
+
tasks.push({
|
|
214
|
+
run: resolve,
|
|
215
|
+
name:
|
|
216
|
+
'resolve ' +
|
|
217
|
+
((task && typeof task === 'object' && 'name' in task && task.name) || '?'),
|
|
37
218
|
})
|
|
219
|
+
_taskQueue.enqueueTasks(tasks)
|
|
38
220
|
})
|
|
39
221
|
return {
|
|
40
222
|
then: promise.then.bind(promise),
|
|
41
223
|
done: promise.then.bind(promise),
|
|
42
224
|
cancel: () => {
|
|
43
|
-
|
|
225
|
+
_taskQueue.cancelTasks(tasks)
|
|
44
226
|
},
|
|
45
227
|
}
|
|
46
228
|
},
|
|
@@ -49,15 +231,85 @@ export const InteractionManager = {
|
|
|
49
231
|
* Notify manager that an interaction has started.
|
|
50
232
|
*/
|
|
51
233
|
createInteractionHandle(): number {
|
|
52
|
-
|
|
234
|
+
_scheduleUpdate()
|
|
235
|
+
const handle = ++_inc
|
|
236
|
+
_addInteractionSet.add(handle)
|
|
237
|
+
return handle
|
|
53
238
|
},
|
|
54
239
|
|
|
55
240
|
/**
|
|
56
241
|
* Notify manager that an interaction has completed.
|
|
57
242
|
*/
|
|
58
|
-
clearInteractionHandle(handle: number) {
|
|
243
|
+
clearInteractionHandle(handle: number): void {
|
|
244
|
+
invariant(!!handle, 'Must provide a handle to clear.')
|
|
245
|
+
_scheduleUpdate()
|
|
246
|
+
_addInteractionSet.delete(handle)
|
|
247
|
+
_deleteInteractionSet.add(handle)
|
|
248
|
+
},
|
|
249
|
+
|
|
250
|
+
addListener: _emitter.addListener.bind(_emitter) as (
|
|
251
|
+
eventType: 'interactionStart' | 'interactionComplete',
|
|
252
|
+
listener: () => void,
|
|
253
|
+
context?: any
|
|
254
|
+
) => EventSubscription,
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Set deadline for task processing
|
|
258
|
+
*/
|
|
259
|
+
setDeadline(deadline: number): void {
|
|
260
|
+
_deadline = deadline
|
|
261
|
+
},
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const _interactionSet = new Set<number>()
|
|
265
|
+
const _addInteractionSet = new Set<number>()
|
|
266
|
+
const _deleteInteractionSet = new Set<number>()
|
|
267
|
+
const _taskQueue = new TaskQueue({ onMoreTasks: _scheduleUpdate })
|
|
268
|
+
let _nextUpdateHandle: number | ReturnType<typeof setTimeout> | null = null
|
|
269
|
+
let _inc = 0
|
|
270
|
+
let _deadline = -1
|
|
59
271
|
|
|
60
|
-
|
|
272
|
+
/**
|
|
273
|
+
* Schedule an asynchronous update to the interaction state.
|
|
274
|
+
*/
|
|
275
|
+
function _scheduleUpdate(): void {
|
|
276
|
+
if (!_nextUpdateHandle) {
|
|
277
|
+
if (_deadline > 0) {
|
|
278
|
+
_nextUpdateHandle = setTimeout(_processUpdate)
|
|
279
|
+
} else {
|
|
280
|
+
_nextUpdateHandle = requestIdleCallback(_processUpdate)
|
|
281
|
+
}
|
|
282
|
+
}
|
|
61
283
|
}
|
|
62
284
|
|
|
63
|
-
|
|
285
|
+
/**
|
|
286
|
+
* Notify listeners, process queue, etc
|
|
287
|
+
*/
|
|
288
|
+
function _processUpdate(): void {
|
|
289
|
+
_nextUpdateHandle = null
|
|
290
|
+
const interactionCount = _interactionSet.size
|
|
291
|
+
_addInteractionSet.forEach((handle) => _interactionSet.add(handle))
|
|
292
|
+
_deleteInteractionSet.forEach((handle) => _interactionSet.delete(handle))
|
|
293
|
+
const nextInteractionCount = _interactionSet.size
|
|
294
|
+
|
|
295
|
+
if (interactionCount !== 0 && nextInteractionCount === 0) {
|
|
296
|
+
_emitter.emit('interactionComplete')
|
|
297
|
+
} else if (interactionCount === 0 && nextInteractionCount !== 0) {
|
|
298
|
+
_emitter.emit('interactionStart')
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (nextInteractionCount === 0) {
|
|
302
|
+
// It seems that we can't know the running time of the current event loop,
|
|
303
|
+
// we can only calculate the running time of the current task queue.
|
|
304
|
+
const begin = Date.now()
|
|
305
|
+
while (_taskQueue.hasTasksToProcess()) {
|
|
306
|
+
_taskQueue.processNext()
|
|
307
|
+
if (_deadline > 0 && Date.now() - begin >= _deadline) {
|
|
308
|
+
_scheduleUpdate()
|
|
309
|
+
break
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
_addInteractionSet.clear()
|
|
314
|
+
_deleteInteractionSet.clear()
|
|
315
|
+
}
|
|
@@ -4,21 +4,31 @@
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the MIT license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*
|
|
8
|
-
* @flow
|
|
9
7
|
*/
|
|
8
|
+
type EventSubscription = {
|
|
9
|
+
remove: () => void;
|
|
10
|
+
};
|
|
11
|
+
type SimpleTask = {
|
|
12
|
+
name: string;
|
|
13
|
+
run: () => void;
|
|
14
|
+
};
|
|
15
|
+
type PromiseTask = {
|
|
16
|
+
name: string;
|
|
17
|
+
gen: () => Promise<void>;
|
|
18
|
+
};
|
|
19
|
+
export type Task = SimpleTask | PromiseTask | (() => void);
|
|
10
20
|
export declare const InteractionManager: {
|
|
11
21
|
Events: {
|
|
12
|
-
interactionStart:
|
|
13
|
-
interactionComplete:
|
|
22
|
+
interactionStart: "interactionStart";
|
|
23
|
+
interactionComplete: "interactionComplete";
|
|
14
24
|
};
|
|
15
25
|
/**
|
|
16
26
|
* Schedule a function to run after all interactions have completed.
|
|
17
27
|
*/
|
|
18
|
-
runAfterInteractions(task
|
|
19
|
-
then:
|
|
20
|
-
done:
|
|
21
|
-
cancel:
|
|
28
|
+
runAfterInteractions(task?: Task): {
|
|
29
|
+
then: <TResult1 = void, TResult2 = never>(onfulfilled?: ((value: void) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null) => Promise<TResult1 | TResult2>;
|
|
30
|
+
done: <TResult1 = void, TResult2 = never>(onfulfilled?: ((value: void) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null) => Promise<TResult1 | TResult2>;
|
|
31
|
+
cancel: () => void;
|
|
22
32
|
};
|
|
23
33
|
/**
|
|
24
34
|
* Notify manager that an interaction has started.
|
|
@@ -28,7 +38,11 @@ export declare const InteractionManager: {
|
|
|
28
38
|
* Notify manager that an interaction has completed.
|
|
29
39
|
*/
|
|
30
40
|
clearInteractionHandle(handle: number): void;
|
|
31
|
-
addListener: () => void;
|
|
41
|
+
addListener: (eventType: "interactionStart" | "interactionComplete", listener: () => void, context?: any) => EventSubscription;
|
|
42
|
+
/**
|
|
43
|
+
* Set deadline for task processing
|
|
44
|
+
*/
|
|
45
|
+
setDeadline(deadline: number): void;
|
|
32
46
|
};
|
|
33
|
-
export
|
|
47
|
+
export {};
|
|
34
48
|
//# sourceMappingURL=InteractionManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractionManager.d.ts","sourceRoot":"","sources":["../../src/modules/InteractionManager.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"InteractionManager.d.ts","sourceRoot":"","sources":["../../src/modules/InteractionManager.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB,CAAA;AAsDD,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,IAAI,CAAA;CAChB,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,IAAI,GAAG,UAAU,GAAG,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,CAAA;AAwG1D,eAAO,MAAM,kBAAkB;;;;;IAM7B;;OAEG;gCACyB,IAAI,GAAG;QACjC,IAAI,EAAE,CAAC,QAAQ,GAAG,IAAI,EAAE,QAAQ,GAAG,KAAK,EACtC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EACxE,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,KACpE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAA;QACjC,IAAI,EAAE,CAAC,QAAQ,GAAG,IAAI,EAAE,QAAQ,GAAG,KAAK,EACtC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EACxE,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,KACpE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAA;QACjC,MAAM,EAAE,MAAM,IAAI,CAAA;KACnB;IAwBD;;OAEG;+BACwB,MAAM;IAOjC;;OAEG;mCAC4B,MAAM,GAAG,IAAI;iBAOQ,CAClD,SAAS,EAAE,kBAAkB,GAAG,qBAAqB,EACrD,QAAQ,EAAE,MAAM,IAAI,EACpB,OAAO,CAAC,EAAE,GAAG,KACV,iBAAiB;IAEtB;;OAEG;0BACmB,MAAM,GAAG,IAAI;CAGpC,CAAA"}
|