@satoshibits/functional 1.0.3 → 1.1.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.
Files changed (134) hide show
  1. package/README.md +28 -145
  2. package/dist/array-utils.d.mts +13 -0
  3. package/dist/array-utils.d.mts.map +1 -1
  4. package/dist/array-utils.mjs +19 -3
  5. package/dist/array-utils.mjs.map +1 -1
  6. package/dist/array-utils.test.d.ts +2 -0
  7. package/dist/array-utils.test.d.ts.map +1 -0
  8. package/dist/array-utils.test.js +256 -0
  9. package/dist/array-utils.test.js.map +1 -0
  10. package/dist/composition.d.mts +53 -6
  11. package/dist/composition.d.mts.map +1 -1
  12. package/dist/composition.mjs +111 -22
  13. package/dist/composition.mjs.map +1 -1
  14. package/dist/composition.test.d.ts +2 -0
  15. package/dist/composition.test.d.ts.map +1 -0
  16. package/dist/composition.test.js +409 -0
  17. package/dist/composition.test.js.map +1 -0
  18. package/dist/index.d.mts +10 -5
  19. package/dist/index.d.mts.map +1 -1
  20. package/dist/index.mjs +10 -5
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/integration.test.d.mts +2 -0
  23. package/dist/integration.test.d.mts.map +1 -0
  24. package/dist/integration.test.mjs +486 -0
  25. package/dist/integration.test.mjs.map +1 -0
  26. package/dist/io.d.mts +338 -0
  27. package/dist/io.d.mts.map +1 -0
  28. package/dist/io.mjs +389 -0
  29. package/dist/io.mjs.map +1 -0
  30. package/dist/io.test.d.mts +2 -0
  31. package/dist/io.test.d.mts.map +1 -0
  32. package/dist/io.test.mjs +373 -0
  33. package/dist/io.test.mjs.map +1 -0
  34. package/dist/laws.test.d.mts +2 -0
  35. package/dist/laws.test.d.mts.map +1 -0
  36. package/dist/laws.test.mjs +614 -0
  37. package/dist/laws.test.mjs.map +1 -0
  38. package/dist/object-utils.d.mts +11 -0
  39. package/dist/object-utils.d.mts.map +1 -1
  40. package/dist/object-utils.mjs +11 -0
  41. package/dist/object-utils.mjs.map +1 -1
  42. package/dist/object-utils.test.d.ts +2 -0
  43. package/dist/object-utils.test.d.ts.map +1 -0
  44. package/dist/object-utils.test.js +286 -0
  45. package/dist/object-utils.test.js.map +1 -0
  46. package/dist/option-additions.test.d.mts +2 -0
  47. package/dist/option-additions.test.d.mts.map +1 -0
  48. package/dist/option-additions.test.mjs +325 -0
  49. package/dist/option-additions.test.mjs.map +1 -0
  50. package/dist/option.d.mts +202 -58
  51. package/dist/option.d.mts.map +1 -1
  52. package/dist/option.mjs +271 -63
  53. package/dist/option.mjs.map +1 -1
  54. package/dist/option.test.d.ts +6 -0
  55. package/dist/option.test.d.ts.map +1 -0
  56. package/dist/option.test.js +606 -0
  57. package/dist/option.test.js.map +1 -0
  58. package/dist/performance.d.mts +27 -10
  59. package/dist/performance.d.mts.map +1 -1
  60. package/dist/performance.mjs +42 -20
  61. package/dist/performance.mjs.map +1 -1
  62. package/dist/performance.test.d.ts +2 -0
  63. package/dist/performance.test.d.ts.map +1 -0
  64. package/dist/performance.test.js +424 -0
  65. package/dist/performance.test.js.map +1 -0
  66. package/dist/pipeline.d.mts +12 -0
  67. package/dist/pipeline.d.mts.map +1 -1
  68. package/dist/pipeline.mjs +12 -0
  69. package/dist/pipeline.mjs.map +1 -1
  70. package/dist/pipeline.test.d.ts +2 -0
  71. package/dist/pipeline.test.d.ts.map +1 -0
  72. package/dist/pipeline.test.js +445 -0
  73. package/dist/pipeline.test.js.map +1 -0
  74. package/dist/predicates.d.mts +12 -0
  75. package/dist/predicates.d.mts.map +1 -1
  76. package/dist/predicates.mjs +12 -0
  77. package/dist/predicates.mjs.map +1 -1
  78. package/dist/predicates.test.d.ts +2 -0
  79. package/dist/predicates.test.d.ts.map +1 -0
  80. package/dist/predicates.test.js +375 -0
  81. package/dist/predicates.test.js.map +1 -0
  82. package/dist/reader-result.d.mts +37 -16
  83. package/dist/reader-result.d.mts.map +1 -1
  84. package/dist/reader-result.mjs +37 -16
  85. package/dist/reader-result.mjs.map +1 -1
  86. package/dist/reader-result.test.d.ts +2 -0
  87. package/dist/reader-result.test.d.ts.map +1 -0
  88. package/dist/reader-result.test.js +1259 -0
  89. package/dist/reader-result.test.js.map +1 -0
  90. package/dist/reader.d.mts +443 -0
  91. package/dist/reader.d.mts.map +1 -0
  92. package/dist/reader.mjs +456 -0
  93. package/dist/reader.mjs.map +1 -0
  94. package/dist/reader.test.d.mts +2 -0
  95. package/dist/reader.test.d.mts.map +1 -0
  96. package/dist/reader.test.mjs +288 -0
  97. package/dist/reader.test.mjs.map +1 -0
  98. package/dist/result-additions.test.d.mts +2 -0
  99. package/dist/result-additions.test.d.mts.map +1 -0
  100. package/dist/result-additions.test.mjs +325 -0
  101. package/dist/result-additions.test.mjs.map +1 -0
  102. package/dist/result.d.mts +208 -0
  103. package/dist/result.d.mts.map +1 -1
  104. package/dist/result.mjs +287 -0
  105. package/dist/result.mjs.map +1 -1
  106. package/dist/result.test.d.ts +2 -0
  107. package/dist/result.test.d.ts.map +1 -0
  108. package/dist/result.test.js +453 -0
  109. package/dist/result.test.js.map +1 -0
  110. package/dist/task.d.mts +374 -0
  111. package/dist/task.d.mts.map +1 -0
  112. package/dist/task.mjs +386 -0
  113. package/dist/task.mjs.map +1 -0
  114. package/dist/task.test.d.mts +2 -0
  115. package/dist/task.test.d.mts.map +1 -0
  116. package/dist/task.test.mjs +1006 -0
  117. package/dist/task.test.mjs.map +1 -0
  118. package/dist/types.d.mts +12 -0
  119. package/dist/types.d.mts.map +1 -1
  120. package/dist/types.mjs +12 -0
  121. package/dist/types.mjs.map +1 -1
  122. package/dist/types.test.d.ts +6 -0
  123. package/dist/types.test.d.ts.map +1 -0
  124. package/dist/types.test.js +447 -0
  125. package/dist/types.test.js.map +1 -0
  126. package/dist/validation.d.mts +12 -0
  127. package/dist/validation.d.mts.map +1 -1
  128. package/dist/validation.mjs +22 -4
  129. package/dist/validation.mjs.map +1 -1
  130. package/dist/validation.test.d.ts +2 -0
  131. package/dist/validation.test.d.ts.map +1 -0
  132. package/dist/validation.test.js +518 -0
  133. package/dist/validation.test.js.map +1 -0
  134. package/package.json +77 -13
@@ -0,0 +1,374 @@
1
+ /**
2
+ * @module task
3
+ * @description Task represents a lazy asynchronous computation.
4
+ * A Task is simply a thunk that returns a Promise. This provides a lazy, composable
5
+ * wrapper around async operations, ensuring referential transparency and making
6
+ * async code more predictable and testable. Note that Tasks can reject - for
7
+ * explicit error handling, consider using Task<Result<T, E>> pattern.
8
+ *
9
+ * ### For Dummies
10
+ * - A `Task<T>` is `() => Promise<T>`—build your async pipeline today, execute tomorrow.
11
+ * - Nothing runs until you call `Task.run(task)` (or call the function yourself).
12
+ * - Great for retries, composition, and testing because you control when effects fire.
13
+ *
14
+ * ### Decision Tree
15
+ * - Have a value already? Start with `Task.of(value)`.
16
+ * - Need to wrap an async function? Use `Task.fromPromise(() => promise)`.
17
+ * - Transforming results? Apply `Task.map(fn)`.
18
+ * - Next step returns another Task? Chain with `Task.chain(nextTask)`.
19
+ * - Working with multiple tasks together? Use helpers like `Task.ap`, `Task.sequence`, etc., inside the module.
20
+ * - When it’s go time, run with `await Task.run(task)`.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * import { Task } from './task.mts';
25
+ *
26
+ * // basic usage
27
+ * const readFile = (path: string): Task<string> =>
28
+ * () => fs.promises.readFile(path, 'utf-8');
29
+ *
30
+ * // composing tasks
31
+ * const processFile = Task.chain((content: string) =>
32
+ * Task.of(content.toUpperCase())
33
+ * )(readFile('data.txt'));
34
+ *
35
+ * // running tasks
36
+ * const result = await Task.run(processFile);
37
+ * ```
38
+ *
39
+ * @category Core
40
+ * @since 2025-09-18
41
+ */
42
+ /**
43
+ * Task type representing a lazy async computation that always succeeds.
44
+ * @description A Task is a function that returns a Promise. This lazy evaluation
45
+ * allows for composition and transformation before execution, making async code
46
+ * more predictable and easier to test.
47
+ *
48
+ * @template A - The type of the value the task will produce
49
+ *
50
+ * @category Types
51
+ * @example
52
+ * ```typescript
53
+ * // Simple task
54
+ * const delay: Task<void> = () => new Promise(resolve =>
55
+ * setTimeout(resolve, 1000)
56
+ * );
57
+ *
58
+ * // Task returning a value
59
+ * const fetchUser: Task<User> = () =>
60
+ * fetch('/api/user').then(r => r.json());
61
+ * ```
62
+ *
63
+ * @since 2025-09-18
64
+ */
65
+ export type Task<A> = () => Promise<A>;
66
+ /**
67
+ * Task utility functions for working with Task types.
68
+ * @description Provides a functional API for creating, transforming, and composing Tasks.
69
+ * All functions are curried to support functional composition and partial application.
70
+ *
71
+ * @category Utilities
72
+ * @since 2025-09-18
73
+ */
74
+ export declare const Task: {
75
+ /**
76
+ * Creates a Task that immediately resolves with the given value.
77
+ * @description Factory function for creating tasks from values. The resulting
78
+ * task will always succeed with the provided value.
79
+ *
80
+ * @template A - The type of the value
81
+ * @param {A} value - The value to wrap in a Task
82
+ * @returns {Task<A>} A Task that resolves to the value
83
+ *
84
+ * @category Constructors
85
+ * @example
86
+ * ```typescript
87
+ * const task = Task.of(42);
88
+ * await Task.run(task); // => 42
89
+ *
90
+ * // Useful for starting chains
91
+ * const result = await Task.run(
92
+ * Task.chain((n: number) => Task.of(n * 2))(
93
+ * Task.of(21)
94
+ * )
95
+ * ); // => 42
96
+ * ```
97
+ *
98
+ * @since 2025-09-18
99
+ */
100
+ of: <A>(value: A) => Task<A>;
101
+ /**
102
+ * Creates a Task from a Promise.
103
+ * @description Wraps a Promise in a Task, making it lazy. The Promise
104
+ * won't execute until the Task is run.
105
+ *
106
+ * @template A - The type of the value the Promise resolves to
107
+ * @param {() => Promise<A>} f - A function that returns a Promise
108
+ * @returns {Task<A>} A Task wrapping the Promise
109
+ *
110
+ * @category Constructors
111
+ * @example
112
+ * ```typescript
113
+ * const fetchData = Task.fromPromise(() =>
114
+ * fetch('/api/data').then(r => r.json())
115
+ * );
116
+ *
117
+ * // Promise doesn't execute until run
118
+ * const result = await Task.run(fetchData);
119
+ * ```
120
+ *
121
+ * @since 2025-09-18
122
+ */
123
+ fromPromise: <A>(f: () => Promise<A>) => Task<A>;
124
+ /**
125
+ * Transforms the value inside a Task using the given function.
126
+ * @description Applies a pure function to the eventual value of a Task,
127
+ * creating a new Task with the transformed value. This is the functor
128
+ * map operation for Task types.
129
+ *
130
+ * @template A - The input type
131
+ * @template B - The output type
132
+ * @param {function(A): B} f - Function to transform the value
133
+ * @returns {function(Task<A>): Task<B>} A function that transforms Tasks
134
+ *
135
+ * @category Transformations
136
+ * @example
137
+ * ```typescript
138
+ * const double = Task.map((n: number) => n * 2);
139
+ * const task = Task.of(21);
140
+ * const doubled = double(task);
141
+ * await Task.run(doubled); // => 42
142
+ * ```
143
+ *
144
+ * @since 2025-09-18
145
+ */
146
+ map: <A, B>(f: (value: A) => B) => (task: Task<A>) => Task<B>;
147
+ /**
148
+ * Chains Task-returning operations.
149
+ * @description Sequences two Tasks where the second depends on the result
150
+ * of the first. This is the monadic bind operation for Task types.
151
+ *
152
+ * @template A - The input type
153
+ * @template B - The output type
154
+ * @param {function(A): Task<B>} f - Function that returns a new Task
155
+ * @returns {function(Task<A>): Task<B>} A function that chains Tasks
156
+ *
157
+ * @category Combinators
158
+ * @example
159
+ * ```typescript
160
+ * const readFile = (path: string): Task<string> =>
161
+ * () => fs.promises.readFile(path, 'utf-8');
162
+ *
163
+ * const parseJson = <T>(content: string): Task<T> =>
164
+ * Task.of(JSON.parse(content));
165
+ *
166
+ * const loadConfig = Task.chain(parseJson<Config>)(
167
+ * readFile('config.json')
168
+ * );
169
+ * ```
170
+ *
171
+ * @since 2025-09-18
172
+ */
173
+ chain: <A, B>(f: (value: A) => Task<B>) => (task: Task<A>) => Task<B>;
174
+ /**
175
+ * Alias for chain to match fp-ts naming.
176
+ * @description See {@link chain} for details.
177
+ *
178
+ * @category Combinators
179
+ * @since 2025-09-18
180
+ */
181
+ flatMap: <A, B>(f: (value: A) => Task<B>) => (task: Task<A>) => Task<B>;
182
+ /**
183
+ * Applies a Task of a function to a Task of a value.
184
+ * @description Enables applying functions wrapped in Tasks to values wrapped
185
+ * in Tasks. This is the applicative apply operation for Task types.
186
+ *
187
+ * @template A - The input type
188
+ * @template B - The output type
189
+ * @param {Task<A>} taskValue - Task containing a value
190
+ * @returns {function(Task<function(A): B>): Task<B>} A function that applies Task functions
191
+ *
192
+ * @category Combinators
193
+ * @example
194
+ * ```typescript
195
+ * const add = (a: number) => (b: number) => a + b;
196
+ * const taskAdd = Task.of(add);
197
+ * const task5 = Task.of(5);
198
+ * const task3 = Task.of(3);
199
+ *
200
+ * const result = await Task.run(
201
+ * Task.ap(task3)(
202
+ * Task.ap(task5)(
203
+ * Task.map(add)(Task.of(10))
204
+ * )
205
+ * )
206
+ * ); // => 18
207
+ * ```
208
+ *
209
+ * @since 2025-09-18
210
+ */
211
+ ap: <A, B>(taskValue: Task<A>) => (taskFn: Task<(a: A) => B>) => Task<B>;
212
+ /**
213
+ * Runs a Task to completion and returns its Promise.
214
+ * @description Executes a Task, triggering the async computation and
215
+ * returning the resulting Promise.
216
+ *
217
+ * @template A - The type of the value
218
+ * @param {Task<A>} task - The Task to run
219
+ * @returns {Promise<A>} The result of running the Task
220
+ *
221
+ * @category Execution
222
+ * @example
223
+ * ```typescript
224
+ * const task = Task.of(42);
225
+ * const result = await Task.run(task); // => 42
226
+ * ```
227
+ *
228
+ * @since 2025-09-18
229
+ */
230
+ run: <A>(task: Task<A>) => Promise<A>;
231
+ /**
232
+ * Converts an array of Tasks into a Task of an array.
233
+ * @description Runs all Tasks in parallel and collects their results.
234
+ * All Tasks must succeed for the resulting Task to succeed.
235
+ *
236
+ * @template A - The type of values in the Tasks
237
+ * @param {Task<A>[]} tasks - Array of Tasks to sequence
238
+ * @returns {Task<A[]>} A Task containing an array of results
239
+ *
240
+ * @category Combinators
241
+ * @example
242
+ * ```typescript
243
+ * const tasks = [
244
+ * Task.of(1),
245
+ * Task.of(2),
246
+ * Task.of(3)
247
+ * ];
248
+ * const combined = Task.sequence(tasks);
249
+ * await Task.run(combined); // => [1, 2, 3]
250
+ * ```
251
+ *
252
+ * @since 2025-09-18
253
+ */
254
+ sequence: <A>(tasks: Task<A>[]) => Task<A[]>;
255
+ /**
256
+ * Maps a function returning a Task over an array and sequences the results.
257
+ * @description Applies a Task-returning function to each element of an array
258
+ * and runs all resulting Tasks in parallel.
259
+ *
260
+ * @template A - The input type
261
+ * @template B - The output type
262
+ * @param {function(A): Task<B>} f - Function that returns a Task
263
+ * @returns {function(A[]): Task<B[]>} A function that traverses arrays with Tasks
264
+ *
265
+ * @category Combinators
266
+ * @example
267
+ * ```typescript
268
+ * const fetchUser = (id: string): Task<User> =>
269
+ * () => fetch(`/api/users/${id}`).then(r => r.json());
270
+ *
271
+ * const fetchAllUsers = Task.traverse(fetchUser);
272
+ * const users = await Task.run(
273
+ * fetchAllUsers(['1', '2', '3'])
274
+ * );
275
+ * ```
276
+ *
277
+ * @since 2025-09-18
278
+ */
279
+ traverse: <A, B>(f: (a: A) => Task<B>) => (as: A[]) => Task<B[]>;
280
+ /**
281
+ * Creates a Task that delays for the specified milliseconds.
282
+ * @description Returns a Task that waits for the given duration before
283
+ * resolving with void.
284
+ *
285
+ * @param {number} ms - Number of milliseconds to delay
286
+ * @returns {Task<void>} A Task that delays
287
+ *
288
+ * @category Utilities
289
+ * @example
290
+ * ```typescript
291
+ * const delayed = Task.chain(() => Task.of('done'))(
292
+ * Task.delay(1000)
293
+ * );
294
+ * await Task.run(delayed); // => 'done' (after 1 second)
295
+ * ```
296
+ *
297
+ * @since 2025-09-18
298
+ */
299
+ delay: (ms: number) => Task<void>;
300
+ /**
301
+ * Combines the results of a tuple of Tasks into a Task of a tuple.
302
+ * @description Takes multiple Tasks and returns a Task containing a tuple
303
+ * of their results. All Tasks run in parallel.
304
+ *
305
+ * @template T - Tuple type of Tasks
306
+ * @param {...T} tasks - Tasks to combine
307
+ * @returns {Task<{ [K in keyof T]: T[K] extends Task<infer U> ? U : never }>} Task of tuple
308
+ *
309
+ * @category Combinators
310
+ * @example
311
+ * ```typescript
312
+ * const task1 = Task.of(1);
313
+ * const task2 = Task.of('hello');
314
+ * const task3 = Task.of(true);
315
+ *
316
+ * const combined = Task.sequenceT(task1, task2, task3);
317
+ * await Task.run(combined); // => [1, 'hello', true]
318
+ * ```
319
+ *
320
+ * @since 2025-09-18
321
+ */
322
+ sequenceT: <T extends readonly Task<unknown>[]>(...tasks: T) => Task<{ [K in keyof T]: T[K] extends Task<infer U> ? U : never; }>;
323
+ /**
324
+ * Combines the results of a record of Tasks into a Task of a record.
325
+ * @description Takes an object with Task values and returns a Task containing
326
+ * an object with the results. All Tasks run in parallel.
327
+ *
328
+ * @template R - Record type with Task values
329
+ * @param {R} tasks - Record of Tasks to combine
330
+ * @returns {Task<{ [K in keyof R]: R[K] extends Task<infer U> ? U : never }>} Task of record
331
+ *
332
+ * @category Combinators
333
+ * @example
334
+ * ```typescript
335
+ * const tasks = {
336
+ * user: Task.of({ name: 'Alice' }),
337
+ * count: Task.of(42),
338
+ * enabled: Task.of(true)
339
+ * };
340
+ *
341
+ * const combined = Task.sequenceS(tasks);
342
+ * await Task.run(combined);
343
+ * // => { user: { name: 'Alice' }, count: 42, enabled: true }
344
+ * ```
345
+ *
346
+ * @since 2025-09-18
347
+ */
348
+ sequenceS: <R extends Record<string, Task<unknown>>>(tasks: R) => Task<{ [K in keyof R]: R[K] extends Task<infer U> ? U : never; }>;
349
+ /**
350
+ * Executes a Task for its side effects, discarding the result.
351
+ * @description Runs a Task but returns void, useful for Tasks that
352
+ * perform side effects where the result isn't needed.
353
+ *
354
+ * @template A - The type of the value (discarded)
355
+ * @param {function(A): Task<unknown>} f - Function that returns a Task (result discarded)
356
+ * @returns {function(Task<A>): Task<A>} A function that executes side effects
357
+ *
358
+ * @category Combinators
359
+ * @example
360
+ * ```typescript
361
+ * const log = (msg: string): Task<void> =>
362
+ * () => Promise.resolve(console.log(msg));
363
+ *
364
+ * const task = Task.chainFirst((n: number) => log(`Got: ${n}`))(
365
+ * Task.of(42)
366
+ * );
367
+ * await Task.run(task); // logs "Got: 42", returns 42
368
+ * ```
369
+ *
370
+ * @since 2025-09-18
371
+ */
372
+ chainFirst: <A>(f: (a: A) => Task<unknown>) => (task: Task<A>) => Task<A>;
373
+ };
374
+ //# sourceMappingURL=task.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.mts","sourceRoot":"","sources":["../src/task.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,IAAI,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;AAEvC;;;;;;;GAOG;AACH,eAAO,MAAM,IAAI;IACf;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;SACE,CAAC,SAAU,CAAC,KAAG,IAAI,CAAC,CAAC,CAAC;IAE3B;;;;;;;;;;;;;;;;;;;;;OAqBG;kBACW,CAAC,KAAM,MAAM,OAAO,CAAC,CAAC,CAAC,KAAG,IAAI,CAAC,CAAC,CAAC;IAE/C;;;;;;;;;;;;;;;;;;;;;OAqBG;UACG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,KAAG,IAAI,CAAC,CAAC,CAAC;IAG3D;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;YACK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,KAAG,IAAI,CAAC,CAAC,CAAC;IAGnE;;;;;;OAMG;cACO,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,KAAG,IAAI,CAAC,CAAC,CAAC;IAGrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;SACE,CAAC,EAAE,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAG,IAAI,CAAC,CAAC,CAAC;IAGtE;;;;;;;;;;;;;;;;;OAiBG;UACG,CAAC,QAAS,IAAI,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAAC;IAEpC;;;;;;;;;;;;;;;;;;;;;;OAsBG;eACQ,CAAC,SAAU,IAAI,CAAC,CAAC,CAAC,EAAE,KAAG,IAAI,CAAC,CAAC,EAAE,CAAC;IAG3C;;;;;;;;;;;;;;;;;;;;;;;OAuBG;eACQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,KAAG,IAAI,CAAC,CAAC,EAAE,CAAC;IAG9D;;;;;;;;;;;;;;;;;;OAkBG;gBACS,MAAM,KAAG,IAAI,CAAC,IAAI,CAAC;IAG/B;;;;;;;;;;;;;;;;;;;;;OAqBG;gBACS,CAAC,SAAS,SAAS,IAAI,CAAC,OAAO,CAAC,EAAE,YAClC,CAAC,KACV,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,GAAE,CAAC;IAGnE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;gBACS,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,SAC1C,CAAC,KACP,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,GAAE,CAAC;IAWnE;;;;;;;;;;;;;;;;;;;;;;OAsBG;iBACU,CAAC,KAAM,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,KAAG,IAAI,CAAC,CAAC,CAAC;CAEzE,CAAC"}