@outburn/fume-mapping-provider 0.2.0 → 1.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 +81 -36
- package/dist/FumeMappingProvider.d.ts +55 -11
- package/dist/FumeMappingProvider.d.ts.map +1 -1
- package/dist/FumeMappingProvider.js +619 -59
- package/dist/FumeMappingProvider.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +82 -3
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +397 -23
- package/dist/providers.js.map +1 -1
- package/dist/types.d.ts +57 -8
- package/dist/types.d.ts.map +1 -1
- package/package.json +11 -11
package/README.md
CHANGED
|
@@ -9,6 +9,7 @@ A TypeScript module for managing pre-defined, named FUME expressions (mappings)
|
|
|
9
9
|
- 🌐 **Server mappings**: Load from FHIR servers with automatic pagination
|
|
10
10
|
- 📦 **Package mappings**: Load from FHIR packages via `fhir-package-explorer`
|
|
11
11
|
- 🔄 **Smart collision handling**: File mappings override server mappings
|
|
12
|
+
- 🛰️ **Automatic change tracking**: Poll files and FHIR server resources with incremental updates
|
|
12
13
|
- 🔍 **Flexible search**: Find package mappings by URL, ID, or name
|
|
13
14
|
- 📝 **Structured logging**: Optional logger interface support
|
|
14
15
|
- ✅ **FUME validation**: Filters StructureMaps by FUME-specific extensions
|
|
@@ -21,7 +22,7 @@ The provider separates mappings into two categories:
|
|
|
21
22
|
- **Fast access**: Loaded once, cached in memory
|
|
22
23
|
- **Key-based lookup**: Use unique keys for instant retrieval
|
|
23
24
|
- **Collision resolution**: File mappings override server mappings with warnings
|
|
24
|
-
- **
|
|
25
|
+
- **Focused refresh by key**: Re-fetch a single mapping from its real source
|
|
25
26
|
|
|
26
27
|
### Package Mappings
|
|
27
28
|
- **Always fresh**: Queried from FPE on demand (FPE handles caching)
|
|
@@ -58,7 +59,11 @@ const provider = new FumeMappingProvider({
|
|
|
58
59
|
fileExtension: '.fume', // Optional, default is '.fume'
|
|
59
60
|
fhirClient: fhirClient,
|
|
60
61
|
packageExplorer: packageExplorer,
|
|
62
|
+
aliasConceptMapId: 'my-aliases-cm-id', // Optional, skips alias ConceptMap search
|
|
61
63
|
canonicalBaseUrl: 'http://example.com', // Optional, default is 'http://example.com'
|
|
64
|
+
filePollingIntervalMs: 5000, // Optional, default 5000 (set <= 0 to disable)
|
|
65
|
+
serverPollingIntervalMs: 30000, // Optional, default 30000 (set <= 0 to disable)
|
|
66
|
+
forcedResyncIntervalMs: 3600000, // Optional, default 1 hour (set <= 0 to disable)
|
|
62
67
|
logger: console // Optional
|
|
63
68
|
});
|
|
64
69
|
|
|
@@ -79,21 +84,17 @@ await provider.reloadUserMappings();
|
|
|
79
84
|
|
|
80
85
|
// Refresh specific mapping by key (fetches from source)
|
|
81
86
|
await provider.refreshUserMapping('my-mapping-key');
|
|
82
|
-
|
|
83
|
-
// Optimistic update - provide mapping directly to avoid roundtrip
|
|
84
|
-
// Useful after successfully updating the FHIR server
|
|
85
|
-
const updatedMapping = {
|
|
86
|
-
key: 'my-mapping-key',
|
|
87
|
-
expression: '$output = { updated: true }',
|
|
88
|
-
source: 'server',
|
|
89
|
-
sourceServer: 'http://my-server.com'
|
|
90
|
-
};
|
|
91
|
-
await provider.refreshUserMapping('my-mapping-key', updatedMapping);
|
|
92
|
-
|
|
93
|
-
// Optimistic delete - pass null to remove from cache
|
|
94
|
-
await provider.refreshUserMapping('deleted-key', null);
|
|
95
87
|
```
|
|
96
88
|
|
|
89
|
+
### JSON Mapping Files (*.json)
|
|
90
|
+
|
|
91
|
+
If `mappingsFolder` is configured, the provider also loads `*.json` files from that folder as **JSON-valued mappings**.
|
|
92
|
+
|
|
93
|
+
- The mapping key is the filename without `.json`
|
|
94
|
+
- The mapping value is the parsed JSON value (object/array/string/number/boolean/null)
|
|
95
|
+
- The reserved filename `aliases.json` is **never** treated as a mapping
|
|
96
|
+
- If both `myMap.json` and `myMap.fume` exist, the JSON mapping overrides the text mapping (a warning is logged if a logger is provided)
|
|
97
|
+
|
|
97
98
|
### Get User Mappings (Lightning Fast ⚡)
|
|
98
99
|
|
|
99
100
|
```typescript
|
|
@@ -114,15 +115,26 @@ const mapping = provider.getUserMapping('my-key');
|
|
|
114
115
|
// Returns: UserMapping | undefined
|
|
115
116
|
```
|
|
116
117
|
|
|
118
|
+
## Automatic Change Tracking
|
|
119
|
+
|
|
120
|
+
On `initialize()`, the provider automatically starts polling sources to keep the in-memory cache aligned with files and server resources.
|
|
121
|
+
|
|
122
|
+
- **File polling** (default: 5s): detects changes in mapping files and `aliases.json` incrementally.
|
|
123
|
+
- **Server polling** (default: 30s):
|
|
124
|
+
- Aliases: conditional read of the alias ConceptMap (ETag/Last-Modified).
|
|
125
|
+
- Mappings: StructureMap search with `_lastUpdated`.
|
|
126
|
+
- **Forced resync** (default: 1h): full refresh of aliases + mappings, applied incrementally.
|
|
127
|
+
|
|
128
|
+
Disable any polling loop by setting its interval to `<= 0`.
|
|
129
|
+
|
|
117
130
|
### UserMapping Structure
|
|
118
131
|
|
|
119
132
|
```typescript
|
|
120
133
|
interface UserMapping {
|
|
121
134
|
key: string; // Unique identifier
|
|
122
|
-
expression:
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
sourceServer?: string; // For server mappings
|
|
135
|
+
expression: unknown; // FUME expression (string) or JSON value for *.json
|
|
136
|
+
sourceType: 'file' | 'server'; // Origin
|
|
137
|
+
source: string; // Absolute file path or full server URL
|
|
126
138
|
name?: string; // StructureMap.name
|
|
127
139
|
url?: string; // StructureMap.url
|
|
128
140
|
}
|
|
@@ -150,9 +162,13 @@ const metadata = await provider.getPackageMappingsMetadata();
|
|
|
150
162
|
### Overview
|
|
151
163
|
|
|
152
164
|
Aliases are simple key-value string mappings stored in a special ConceptMap resource on the FHIR server. Unlike mappings, aliases are:
|
|
153
|
-
- **Server
|
|
165
|
+
- **Server + File**: Loaded from the FHIR server and/or an optional `aliases.json` file in `mappingsFolder`
|
|
154
166
|
- **Consolidated**: Always served as a single object
|
|
155
|
-
- **Cached**:
|
|
167
|
+
- **Cached**: Kept fresh via automatic change tracking
|
|
168
|
+
|
|
169
|
+
When both server and file sources are configured:
|
|
170
|
+
- **File aliases override server aliases** on key collision (a warning is logged if a logger is provided)
|
|
171
|
+
- **Server aliases override built-in aliases**
|
|
156
172
|
|
|
157
173
|
### Alias Resource Structure
|
|
158
174
|
|
|
@@ -182,6 +198,15 @@ The server is queried with: `GET [baseUrl]/ConceptMap?context=http://codes.fume.
|
|
|
182
198
|
const aliases = provider.getAliases();
|
|
183
199
|
// Returns: { [key: string]: string }
|
|
184
200
|
|
|
201
|
+
// Get all aliases with per-alias metadata (source + sourceType)
|
|
202
|
+
const aliasesWithMeta = provider.getAliasesWithMetadata();
|
|
203
|
+
// Returns: { [key: string]: { value: string; sourceType: 'file'|'server'|'builtIn'; source: string } }
|
|
204
|
+
|
|
205
|
+
// Get the ConceptMap id used for server aliases (if loaded)
|
|
206
|
+
// Downstream consumers can use this id when updating the alias ConceptMap
|
|
207
|
+
const aliasResourceId = provider.getAliasResourceId();
|
|
208
|
+
// Returns: string | undefined
|
|
209
|
+
|
|
185
210
|
// Example:
|
|
186
211
|
// {
|
|
187
212
|
// "patientSystemUrl": "http://example.com/patients",
|
|
@@ -190,21 +215,35 @@ const aliases = provider.getAliases();
|
|
|
190
215
|
// }
|
|
191
216
|
```
|
|
192
217
|
|
|
193
|
-
###
|
|
218
|
+
### File Aliases (`aliases.json`)
|
|
194
219
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
220
|
+
If `mappingsFolder` is configured, the provider will look for a special `aliases.json` file inside it.
|
|
221
|
+
|
|
222
|
+
Rules:
|
|
223
|
+
- If `mappingsFolder` is not set, file aliases are not supported.
|
|
224
|
+
- If `aliases.json` is missing, no file aliases are loaded.
|
|
225
|
+
- If `aliases.json` exists but is invalid, a warning is logged and the file is ignored.
|
|
226
|
+
|
|
227
|
+
Example `aliases.json`:
|
|
228
|
+
|
|
229
|
+
```json
|
|
230
|
+
{
|
|
231
|
+
"patientSystemUrl": "http://example.com/patients",
|
|
232
|
+
"defaultLanguage": "en-US",
|
|
233
|
+
"apiVersion": "v1"
|
|
234
|
+
}
|
|
198
235
|
```
|
|
199
236
|
|
|
200
|
-
|
|
237
|
+
Validation:
|
|
238
|
+
- Must be a JSON object
|
|
239
|
+
- Keys must match `^[A-Za-z0-9_]+$` (no whitespace or operators like `-` or `.`)
|
|
240
|
+
- Values must be strings
|
|
201
241
|
|
|
202
|
-
|
|
203
|
-
// Register or update a single alias (no server roundtrip)
|
|
204
|
-
provider.registerAlias('newKey', 'newValue');
|
|
242
|
+
### Reload Aliases
|
|
205
243
|
|
|
206
|
-
|
|
207
|
-
|
|
244
|
+
```typescript
|
|
245
|
+
// Reload from configured sources (server and/or mappingsFolder)
|
|
246
|
+
await provider.reloadAliases();
|
|
208
247
|
```
|
|
209
248
|
|
|
210
249
|
### Transforming Alias Resources
|
|
@@ -265,7 +304,7 @@ When a file mapping has the same key as a server mapping:
|
|
|
265
304
|
|
|
266
305
|
// After initialize():
|
|
267
306
|
const mapping = provider.getUserMapping('my-mapping');
|
|
268
|
-
// mapping.
|
|
307
|
+
// mapping.sourceType === 'file'
|
|
269
308
|
// mapping.expression === 'InstanceOf: Patient'
|
|
270
309
|
// Warning logged: "File mapping 'my-mapping' overrides server mapping"
|
|
271
310
|
```
|
|
@@ -285,7 +324,7 @@ const keys = provider.getUserMappingKeys();
|
|
|
285
324
|
// ['mapping1', 'mapping2', 'mapping3']
|
|
286
325
|
|
|
287
326
|
const mapping = provider.getUserMapping('mapping1');
|
|
288
|
-
// { key: 'mapping1', expression: '...',
|
|
327
|
+
// { key: 'mapping1', expression: '...', sourceType: 'file', source: '/abs/path/mapping1.fume' }
|
|
289
328
|
```
|
|
290
329
|
|
|
291
330
|
### Server-Only Setup
|
|
@@ -349,9 +388,11 @@ new FumeMappingProvider(config: FumeMappingProviderConfig)
|
|
|
349
388
|
#### Methods
|
|
350
389
|
|
|
351
390
|
**Initialization:**
|
|
352
|
-
- `initialize(): Promise<void>` - Load
|
|
391
|
+
- `initialize(): Promise<void>` - Load caches and start automatic change tracking
|
|
353
392
|
- `reloadUserMappings(): Promise<void>` - Reload all user mappings
|
|
354
393
|
- `refreshUserMapping(key: string): Promise<UserMapping | null>` - Refresh specific user mapping
|
|
394
|
+
- `startAutomaticChangeTracking(): void` - Start polling + forced resync
|
|
395
|
+
- `stopAutomaticChangeTracking(): void` - Stop polling + forced resync
|
|
355
396
|
|
|
356
397
|
**User Mappings (Cached, Fast):**
|
|
357
398
|
- `getUserMappings(): UserMapping[]` - Get all user mappings
|
|
@@ -366,9 +407,9 @@ new FumeMappingProvider(config: FumeMappingProviderConfig)
|
|
|
366
407
|
|
|
367
408
|
**Aliases (Cached, Fast):**
|
|
368
409
|
- `reloadAliases(): Promise<void>` - Reload all aliases from server
|
|
369
|
-
- `registerAlias(name: string, value: string): void` - Register/update a single alias (optimistic cache update)
|
|
370
|
-
- `deleteAlias(name: string): void` - Delete a specific alias from cache
|
|
371
410
|
- `getAliases(): AliasObject` - Get all cached aliases as single object
|
|
411
|
+
- `getAliasesWithMetadata(): AliasObjectWithMetadata` - Get all cached aliases with metadata
|
|
412
|
+
- `getAliasResourceId(): string | undefined` - Get ConceptMap id for server aliases (if loaded)
|
|
372
413
|
|
|
373
414
|
**Converters:**
|
|
374
415
|
- `getCanonicalBaseUrl(): string` - Get canonical base URL used for generated resources
|
|
@@ -382,11 +423,15 @@ new FumeMappingProvider(config: FumeMappingProviderConfig)
|
|
|
382
423
|
```typescript
|
|
383
424
|
interface FumeMappingProviderConfig {
|
|
384
425
|
mappingsFolder?: string; // Path to .fume files
|
|
385
|
-
fileExtension?: string; // Default: '.fume'
|
|
426
|
+
fileExtension?: string; // Default: '.fume' ('.json' is reserved for aliases.json)
|
|
386
427
|
fhirClient?: any; // FHIR client instance
|
|
387
428
|
packageExplorer?: any; // FPE instance
|
|
388
429
|
logger?: Logger; // Optional logger
|
|
430
|
+
aliasConceptMapId?: string; // Optional ConceptMap id for aliases (skips search)
|
|
389
431
|
canonicalBaseUrl?: string; // Default: 'http://example.com'
|
|
432
|
+
filePollingIntervalMs?: number; // Default: 5000 (set <= 0 to disable)
|
|
433
|
+
serverPollingIntervalMs?: number; // Default: 30000 (set <= 0 to disable)
|
|
434
|
+
forcedResyncIntervalMs?: number; // Default: 3600000 (set <= 0 to disable)
|
|
390
435
|
}
|
|
391
436
|
```
|
|
392
437
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FumeMappingProviderConfig, UserMapping, UserMappingMetadata, PackageMapping, PackageMappingMetadata, GetPackageMappingOptions, AliasObject, ConceptMap, StructureMap } from './types';
|
|
1
|
+
import { FumeMappingProviderConfig, UserMapping, UserMappingMetadata, PackageMapping, PackageMappingMetadata, GetPackageMappingOptions, AliasObject, AliasObjectWithMetadata, ConceptMap, StructureMap } from './types';
|
|
2
2
|
/**
|
|
3
3
|
* Main orchestrator for FUME mappings from multiple sources
|
|
4
4
|
* Separates user mappings (file + server) from package mappings
|
|
@@ -11,9 +11,28 @@ export declare class FumeMappingProvider {
|
|
|
11
11
|
private aliasProvider?;
|
|
12
12
|
private userMappingsCache;
|
|
13
13
|
private serverAliases;
|
|
14
|
-
private
|
|
14
|
+
private fileAliases;
|
|
15
|
+
private aliasResourceId?;
|
|
16
|
+
private aliasResourceMeta?;
|
|
17
|
+
private serverMappingsMeta;
|
|
18
|
+
private jsonMappingRawCache;
|
|
19
|
+
private filePollingState;
|
|
20
|
+
private filePollingTimer?;
|
|
21
|
+
private serverPollingTimer?;
|
|
22
|
+
private forcedResyncTimer?;
|
|
23
|
+
private filePollInProgress;
|
|
24
|
+
private serverPollInProgress;
|
|
25
|
+
private resyncInProgress;
|
|
26
|
+
private lastServerPollAt?;
|
|
27
|
+
private aliasesCacheWithMetadata;
|
|
15
28
|
private static readonly DEFAULT_CANONICAL_BASE_URL;
|
|
29
|
+
private static readonly ALIASES_FILENAME;
|
|
30
|
+
private static readonly DEFAULT_FILE_POLLING_INTERVAL_MS;
|
|
31
|
+
private static readonly DEFAULT_SERVER_POLLING_INTERVAL_MS;
|
|
32
|
+
private static readonly DEFAULT_FORCED_RESYNC_INTERVAL_MS;
|
|
33
|
+
private static readonly ALIAS_KEY_REGEX;
|
|
16
34
|
constructor(config: FumeMappingProviderConfig);
|
|
35
|
+
private validateConfig;
|
|
17
36
|
/**
|
|
18
37
|
* Initialize providers based on configuration
|
|
19
38
|
*/
|
|
@@ -29,10 +48,9 @@ export declare class FumeMappingProvider {
|
|
|
29
48
|
/**
|
|
30
49
|
* Refresh a specific user mapping by key
|
|
31
50
|
* @param key - The mapping key to refresh
|
|
32
|
-
* @param mapping - Optional mapping to use directly (avoids server roundtrip)
|
|
33
51
|
* @returns The refreshed mapping or null if not found
|
|
34
52
|
*/
|
|
35
|
-
refreshUserMapping(key: string
|
|
53
|
+
refreshUserMapping(key: string): Promise<UserMapping | null>;
|
|
36
54
|
/**
|
|
37
55
|
* Get all user mappings (lightning-fast - from cache)
|
|
38
56
|
*/
|
|
@@ -67,21 +85,47 @@ export declare class FumeMappingProvider {
|
|
|
67
85
|
*/
|
|
68
86
|
reloadAliases(): Promise<void>;
|
|
69
87
|
/**
|
|
70
|
-
*
|
|
71
|
-
* @param name - The alias name/key
|
|
72
|
-
* @param value - The alias value
|
|
88
|
+
* Start automatic change tracking (polling + forced resync).
|
|
73
89
|
*/
|
|
74
|
-
|
|
90
|
+
startAutomaticChangeTracking(): void;
|
|
75
91
|
/**
|
|
76
|
-
*
|
|
77
|
-
* @param name - The alias name/key to delete
|
|
92
|
+
* Stop automatic change tracking.
|
|
78
93
|
*/
|
|
79
|
-
|
|
94
|
+
stopAutomaticChangeTracking(): void;
|
|
95
|
+
private resolveInterval;
|
|
96
|
+
private refreshUserMappingsFromSources;
|
|
97
|
+
private refreshAliasesFromSources;
|
|
98
|
+
private rebuildAliasesCacheIfChanged;
|
|
99
|
+
private areAliasCachesEqual;
|
|
100
|
+
private isJsonFileMapping;
|
|
101
|
+
private mappingsEquivalent;
|
|
102
|
+
private applySingleMappingUpdate;
|
|
103
|
+
private applyMappingsIncrementally;
|
|
104
|
+
private readJsonRawForMappings;
|
|
105
|
+
private primeFilePollingState;
|
|
106
|
+
private pollFileMappings;
|
|
107
|
+
private pollServerResources;
|
|
108
|
+
private forcedResync;
|
|
109
|
+
/**
|
|
110
|
+
* Get the ConceptMap resource id used for server aliases (if loaded).
|
|
111
|
+
* Downstream consumers can use this id to update the alias ConceptMap.
|
|
112
|
+
*/
|
|
113
|
+
getAliasResourceId(): string | undefined;
|
|
80
114
|
/**
|
|
81
115
|
* Get all cached aliases as a single object (lightning-fast - from cache)
|
|
82
116
|
* @returns The alias object with all key-value mappings
|
|
83
117
|
*/
|
|
84
118
|
getAliases(): AliasObject;
|
|
119
|
+
/**
|
|
120
|
+
* Get all cached aliases with per-alias metadata (lightning-fast - from cache)
|
|
121
|
+
*/
|
|
122
|
+
getAliasesWithMetadata(): AliasObjectWithMetadata;
|
|
123
|
+
private getServerAliasSourceString;
|
|
124
|
+
private loadFileAliases;
|
|
125
|
+
private filterInvalidAliases;
|
|
126
|
+
private getFileAliasSourceString;
|
|
127
|
+
private rebuildAliasesCache;
|
|
128
|
+
private buildAliasesCache;
|
|
85
129
|
/**
|
|
86
130
|
* Get the canonical base URL used for generating FHIR resources.
|
|
87
131
|
* Defaults to 'http://example.com' if not provided.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FumeMappingProvider.d.ts","sourceRoot":"","sources":["../src/FumeMappingProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"FumeMappingProvider.d.ts","sourceRoot":"","sources":["../src/FumeMappingProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,WAAW,EAAE,uBAAuB,EAAqB,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAS3O;;;GAGG;AACH,qBAAa,mBAAmB;IAkClB,OAAO,CAAC,MAAM;IAjC1B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAsB;IAC3C,OAAO,CAAC,eAAe,CAAC,CAAyB;IACjD,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,iBAAiB,CAAuC;IAChE,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAAC,CAA+C;IACzE,OAAO,CAAC,kBAAkB,CAAwE;IAClG,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,gBAAgB,CACV;IACd,OAAO,CAAC,gBAAgB,CAAC,CAAiB;IAC1C,OAAO,CAAC,kBAAkB,CAAC,CAAiB;IAC5C,OAAO,CAAC,iBAAiB,CAAC,CAAiB;IAC3C,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAElC,OAAO,CAAC,wBAAwB,CAA6C;IAE7E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAwB;IAC1E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAQ;IAChE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kCAAkC,CAAS;IACnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAkB;IAI3E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAqB;gBAExC,MAAM,EAAE,yBAAyB;IAOrD,OAAO,CAAC,cAAc;IAmBtB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAWjC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IASzC;;;;OAIG;IACG,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqElE;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE;IAIhC;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;OAEG;IACH,uBAAuB,IAAI,mBAAmB,EAAE;IAUhD;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAMpD;;;OAGG;IACG,kBAAkB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAQvF;;OAEG;IACG,0BAA0B,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAYvG;;OAEG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAW/G;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACH,4BAA4B,IAAI,IAAI;IAsCpC;;OAEG;IACH,2BAA2B,IAAI,IAAI;IAenC,OAAO,CAAC,eAAe;YAOT,8BAA8B;YAiB9B,yBAAyB;IAyBvC,OAAO,CAAC,4BAA4B;IASpC,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,kBAAkB;IA6B1B,OAAO,CAAC,wBAAwB;IAkBhC,OAAO,CAAC,0BAA0B;YAmBpB,sBAAsB;YAmBtB,qBAAqB;YAoDrB,gBAAgB;YA2FhB,mBAAmB;YAiDnB,YAAY;IAe1B;;;OAGG;IACH,kBAAkB,IAAI,MAAM,GAAG,SAAS;IAMxC;;;OAGG;IACH,UAAU,IAAI,WAAW;IAQzB;;OAEG;IACH,sBAAsB,IAAI,uBAAuB;IAQjD,OAAO,CAAC,0BAA0B;YAapB,eAAe;IAqD7B,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,iBAAiB;IAyCzB;;;OAGG;IACH,mBAAmB,IAAI,MAAM;IAM7B;;;;OAIG;IACH,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW;IAI5D;;;;;OAKG;IACH,uBAAuB,CACrB,OAAO,EAAE,WAAW,EACpB,kBAAkB,CAAC,EAAE,UAAU,GAC9B,UAAU;IAIb;;;;OAIG;IACH,wBAAwB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI;IAInE;;;;;OAKG;IACH,wBAAwB,CACtB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,YAAY;CAGhB"}
|