@opensourcekd/ng-common-libs 1.1.8

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.
@@ -0,0 +1,592 @@
1
+ 'use strict';
2
+
3
+ var rxjs = require('rxjs');
4
+ var operators = require('rxjs/operators');
5
+
6
+ /**
7
+ * EventBus - A centralized event bus for application-wide communication
8
+ * Framework-agnostic implementation using only RxJS
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // Create an instance
13
+ * const eventBus = new EventBus();
14
+ *
15
+ * // Emit an event
16
+ * eventBus.emit('user:login', { userId: '123', username: 'john' });
17
+ *
18
+ * // Subscribe to an event
19
+ * eventBus.on('user:login').subscribe(data => {
20
+ * console.log('User logged in:', data);
21
+ * });
22
+ * ```
23
+ */
24
+ class EventBus {
25
+ eventSubject = new rxjs.Subject();
26
+ /**
27
+ * Emit an event with optional data
28
+ * @param eventType - The type/name of the event
29
+ * @param data - Optional data to send with the event
30
+ */
31
+ emit(eventType, data) {
32
+ this.eventSubject.next({
33
+ type: eventType,
34
+ data,
35
+ timestamp: Date.now()
36
+ });
37
+ }
38
+ /**
39
+ * Subscribe to a specific event type
40
+ * @param eventType - The type/name of the event to listen for
41
+ * @returns Observable that emits the event data
42
+ */
43
+ on(eventType) {
44
+ return this.eventSubject.asObservable().pipe(operators.filter(event => event.type === eventType), operators.map(event => event.data));
45
+ }
46
+ /**
47
+ * Subscribe to multiple event types
48
+ * @param eventTypes - Array of event types to listen for
49
+ * @returns Observable that emits the full event payload
50
+ */
51
+ onMultiple(eventTypes) {
52
+ return this.eventSubject.asObservable().pipe(operators.filter(event => eventTypes.includes(event.type)));
53
+ }
54
+ /**
55
+ * Subscribe to all events
56
+ * @returns Observable that emits all event payloads
57
+ */
58
+ onAll() {
59
+ return this.eventSubject.asObservable();
60
+ }
61
+ }
62
+
63
+ /**
64
+ * TokenManager - Manages authentication tokens
65
+ * Framework-agnostic implementation using browser storage APIs
66
+ * Handles storage, retrieval, and validation of JWT tokens
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * const tokenManager = new TokenManager();
71
+ *
72
+ * // Store a token
73
+ * tokenManager.setToken('your-jwt-token');
74
+ *
75
+ * // Check if authenticated
76
+ * if (tokenManager.isAuthenticated()) {
77
+ * const userData = tokenManager.getUserFromToken();
78
+ * }
79
+ * ```
80
+ */
81
+ class TokenManager {
82
+ TOKEN_KEY = 'auth_token';
83
+ REFRESH_TOKEN_KEY = 'refresh_token';
84
+ useSessionStorage = false;
85
+ /**
86
+ * Configure token manager
87
+ */
88
+ configure(config) {
89
+ if (config.tokenKey) {
90
+ this.TOKEN_KEY = config.tokenKey;
91
+ }
92
+ if (config.refreshTokenKey) {
93
+ this.REFRESH_TOKEN_KEY = config.refreshTokenKey;
94
+ }
95
+ if (config.useSessionStorage !== undefined) {
96
+ this.useSessionStorage = config.useSessionStorage;
97
+ }
98
+ }
99
+ /**
100
+ * Get the storage mechanism based on configuration
101
+ */
102
+ getStorage() {
103
+ return this.useSessionStorage ? sessionStorage : localStorage;
104
+ }
105
+ /**
106
+ * Set authentication token
107
+ */
108
+ setToken(token) {
109
+ this.getStorage().setItem(this.TOKEN_KEY, token);
110
+ }
111
+ /**
112
+ * Get authentication token
113
+ */
114
+ getToken() {
115
+ return this.getStorage().getItem(this.TOKEN_KEY);
116
+ }
117
+ /**
118
+ * Remove authentication token
119
+ */
120
+ removeToken() {
121
+ this.getStorage().removeItem(this.TOKEN_KEY);
122
+ }
123
+ /**
124
+ * Set refresh token
125
+ */
126
+ setRefreshToken(token) {
127
+ this.getStorage().setItem(this.REFRESH_TOKEN_KEY, token);
128
+ }
129
+ /**
130
+ * Get refresh token
131
+ */
132
+ getRefreshToken() {
133
+ return this.getStorage().getItem(this.REFRESH_TOKEN_KEY);
134
+ }
135
+ /**
136
+ * Remove refresh token
137
+ */
138
+ removeRefreshToken() {
139
+ this.getStorage().removeItem(this.REFRESH_TOKEN_KEY);
140
+ }
141
+ /**
142
+ * Clear all tokens
143
+ */
144
+ clearTokens() {
145
+ this.removeToken();
146
+ this.removeRefreshToken();
147
+ }
148
+ /**
149
+ * Check if token exists
150
+ */
151
+ hasToken() {
152
+ return !!this.getToken();
153
+ }
154
+ /**
155
+ * Decode JWT token (without verification)
156
+ * @param token - JWT token to decode
157
+ * @returns Decoded token payload or null if invalid
158
+ */
159
+ decodeToken(token) {
160
+ const tokenToDecode = token || this.getToken();
161
+ if (!tokenToDecode)
162
+ return null;
163
+ try {
164
+ const parts = tokenToDecode.split('.');
165
+ if (parts.length !== 3)
166
+ return null;
167
+ const payload = parts[1];
168
+ const decoded = JSON.parse(atob(payload.replace(/-/g, '+').replace(/_/g, '/')));
169
+ return decoded;
170
+ }
171
+ catch (error) {
172
+ console.error('Error decoding token:', error);
173
+ return null;
174
+ }
175
+ }
176
+ /**
177
+ * Check if token is expired
178
+ * @param token - Optional token to check (defaults to stored token)
179
+ * @returns true if token is expired or invalid
180
+ */
181
+ isTokenExpired(token) {
182
+ const decoded = this.decodeToken(token);
183
+ if (!decoded || !decoded.exp)
184
+ return true;
185
+ const expirationDate = new Date(decoded.exp * 1000);
186
+ return expirationDate <= new Date();
187
+ }
188
+ /**
189
+ * Check if user is authenticated (has valid, non-expired token)
190
+ */
191
+ isAuthenticated() {
192
+ return this.hasToken() && !this.isTokenExpired();
193
+ }
194
+ /**
195
+ * Get token expiration date
196
+ */
197
+ getTokenExpirationDate(token) {
198
+ const decoded = this.decodeToken(token);
199
+ if (!decoded || !decoded.exp)
200
+ return null;
201
+ return new Date(decoded.exp * 1000);
202
+ }
203
+ /**
204
+ * Get user data from token
205
+ */
206
+ getUserFromToken(token) {
207
+ return this.decodeToken(token);
208
+ }
209
+ }
210
+
211
+ /**
212
+ * StorageManager - Type-safe wrapper for browser storage
213
+ * Framework-agnostic implementation using browser storage APIs
214
+ * Provides JSON serialization/deserialization and error handling
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * const storage = new StorageManager();
219
+ *
220
+ * // Store data
221
+ * storage.setLocal('user-prefs', { theme: 'dark', lang: 'en' });
222
+ *
223
+ * // Retrieve data
224
+ * const prefs = storage.getLocal('user-prefs');
225
+ *
226
+ * // With expiration
227
+ * storage.setWithExpiration('temp-data', someData, 3600000); // 1 hour
228
+ * ```
229
+ */
230
+ class StorageManager {
231
+ /**
232
+ * Set item in localStorage with JSON serialization
233
+ */
234
+ setLocal(key, value) {
235
+ try {
236
+ const serialized = JSON.stringify(value);
237
+ localStorage.setItem(key, serialized);
238
+ return true;
239
+ }
240
+ catch (error) {
241
+ console.error('Error setting localStorage item:', error);
242
+ return false;
243
+ }
244
+ }
245
+ /**
246
+ * Get item from localStorage with JSON deserialization
247
+ */
248
+ getLocal(key, defaultValue) {
249
+ try {
250
+ const item = localStorage.getItem(key);
251
+ if (item === null) {
252
+ return defaultValue !== undefined ? defaultValue : null;
253
+ }
254
+ return JSON.parse(item);
255
+ }
256
+ catch (error) {
257
+ console.error('Error getting localStorage item:', error);
258
+ return defaultValue !== undefined ? defaultValue : null;
259
+ }
260
+ }
261
+ /**
262
+ * Remove item from localStorage
263
+ */
264
+ removeLocal(key) {
265
+ try {
266
+ localStorage.removeItem(key);
267
+ }
268
+ catch (error) {
269
+ console.error('Error removing localStorage item:', error);
270
+ }
271
+ }
272
+ /**
273
+ * Clear all localStorage items
274
+ */
275
+ clearLocal() {
276
+ try {
277
+ localStorage.clear();
278
+ }
279
+ catch (error) {
280
+ console.error('Error clearing localStorage:', error);
281
+ }
282
+ }
283
+ /**
284
+ * Check if key exists in localStorage
285
+ */
286
+ hasLocal(key) {
287
+ try {
288
+ return localStorage.getItem(key) !== null;
289
+ }
290
+ catch (error) {
291
+ console.error('Error checking localStorage key:', error);
292
+ return false;
293
+ }
294
+ }
295
+ /**
296
+ * Get all localStorage keys
297
+ */
298
+ getLocalKeys() {
299
+ try {
300
+ return Object.keys(localStorage);
301
+ }
302
+ catch (error) {
303
+ console.error('Error getting localStorage keys:', error);
304
+ return [];
305
+ }
306
+ }
307
+ /**
308
+ * Set item in sessionStorage with JSON serialization
309
+ */
310
+ setSession(key, value) {
311
+ try {
312
+ const serialized = JSON.stringify(value);
313
+ sessionStorage.setItem(key, serialized);
314
+ return true;
315
+ }
316
+ catch (error) {
317
+ console.error('Error setting sessionStorage item:', error);
318
+ return false;
319
+ }
320
+ }
321
+ /**
322
+ * Get item from sessionStorage with JSON deserialization
323
+ */
324
+ getSession(key, defaultValue) {
325
+ try {
326
+ const item = sessionStorage.getItem(key);
327
+ if (item === null) {
328
+ return defaultValue !== undefined ? defaultValue : null;
329
+ }
330
+ return JSON.parse(item);
331
+ }
332
+ catch (error) {
333
+ console.error('Error getting sessionStorage item:', error);
334
+ return defaultValue !== undefined ? defaultValue : null;
335
+ }
336
+ }
337
+ /**
338
+ * Remove item from sessionStorage
339
+ */
340
+ removeSession(key) {
341
+ try {
342
+ sessionStorage.removeItem(key);
343
+ }
344
+ catch (error) {
345
+ console.error('Error removing sessionStorage item:', error);
346
+ }
347
+ }
348
+ /**
349
+ * Clear all sessionStorage items
350
+ */
351
+ clearSession() {
352
+ try {
353
+ sessionStorage.clear();
354
+ }
355
+ catch (error) {
356
+ console.error('Error clearing sessionStorage:', error);
357
+ }
358
+ }
359
+ /**
360
+ * Check if key exists in sessionStorage
361
+ */
362
+ hasSession(key) {
363
+ try {
364
+ return sessionStorage.getItem(key) !== null;
365
+ }
366
+ catch (error) {
367
+ console.error('Error checking sessionStorage key:', error);
368
+ return false;
369
+ }
370
+ }
371
+ /**
372
+ * Get all sessionStorage keys
373
+ */
374
+ getSessionKeys() {
375
+ try {
376
+ return Object.keys(sessionStorage);
377
+ }
378
+ catch (error) {
379
+ console.error('Error getting sessionStorage keys:', error);
380
+ return [];
381
+ }
382
+ }
383
+ /**
384
+ * Set item with expiration time
385
+ * @param key - Storage key
386
+ * @param value - Value to store
387
+ * @param expirationMs - Expiration time in milliseconds
388
+ * @param useSession - Use sessionStorage instead of localStorage
389
+ */
390
+ setWithExpiration(key, value, expirationMs, useSession = false) {
391
+ const item = {
392
+ value,
393
+ expiration: Date.now() + expirationMs
394
+ };
395
+ return useSession
396
+ ? this.setSession(key, item)
397
+ : this.setLocal(key, item);
398
+ }
399
+ /**
400
+ * Get item with expiration check
401
+ * Returns null if item is expired
402
+ */
403
+ getWithExpiration(key, useSession = false) {
404
+ const item = useSession
405
+ ? this.getSession(key)
406
+ : this.getLocal(key);
407
+ if (!item)
408
+ return null;
409
+ if (Date.now() > item.expiration) {
410
+ // Item expired, remove it
411
+ if (useSession) {
412
+ this.removeSession(key);
413
+ }
414
+ else {
415
+ this.removeLocal(key);
416
+ }
417
+ return null;
418
+ }
419
+ return item.value;
420
+ }
421
+ }
422
+
423
+ /**
424
+ * Log level enum
425
+ */
426
+ exports.LogLevel = void 0;
427
+ (function (LogLevel) {
428
+ LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
429
+ LogLevel[LogLevel["INFO"] = 1] = "INFO";
430
+ LogLevel[LogLevel["WARN"] = 2] = "WARN";
431
+ LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
432
+ LogLevel[LogLevel["NONE"] = 4] = "NONE";
433
+ })(exports.LogLevel || (exports.LogLevel = {}));
434
+ /**
435
+ * Logger - Centralized logging utility
436
+ * Framework-agnostic implementation using browser console APIs
437
+ * Supports different log levels and can be configured globally
438
+ *
439
+ * @example
440
+ * ```typescript
441
+ * const logger = new Logger();
442
+ *
443
+ * // Configure
444
+ * logger.configure({
445
+ * level: LogLevel.DEBUG,
446
+ * enableTimestamp: true,
447
+ * prefix: 'MyApp'
448
+ * });
449
+ *
450
+ * // Use
451
+ * logger.info('User logged in', { userId: '123' });
452
+ * logger.error('Failed to load data', error);
453
+ * ```
454
+ */
455
+ class Logger {
456
+ config = {
457
+ level: exports.LogLevel.INFO,
458
+ enableTimestamp: true,
459
+ enableStackTrace: false,
460
+ prefix: ''
461
+ };
462
+ /**
463
+ * Configure the logger
464
+ */
465
+ configure(config) {
466
+ this.config = { ...this.config, ...config };
467
+ }
468
+ /**
469
+ * Set log level
470
+ */
471
+ setLevel(level) {
472
+ this.config.level = level;
473
+ }
474
+ /**
475
+ * Get current log level
476
+ */
477
+ getLevel() {
478
+ return this.config.level;
479
+ }
480
+ /**
481
+ * Format log message with timestamp and prefix
482
+ */
483
+ formatMessage(message, level) {
484
+ const parts = [];
485
+ if (this.config.enableTimestamp) {
486
+ parts.push(`[${new Date().toISOString()}]`);
487
+ }
488
+ if (this.config.prefix) {
489
+ parts.push(`[${this.config.prefix}]`);
490
+ }
491
+ parts.push(`[${level}]`);
492
+ parts.push(message);
493
+ return parts.join(' ');
494
+ }
495
+ /**
496
+ * Check if log level should be logged
497
+ */
498
+ shouldLog(level) {
499
+ return level >= this.config.level;
500
+ }
501
+ /**
502
+ * Log debug message
503
+ */
504
+ debug(message, ...args) {
505
+ if (this.shouldLog(exports.LogLevel.DEBUG)) {
506
+ console.debug(this.formatMessage(message, 'DEBUG'), ...args);
507
+ }
508
+ }
509
+ /**
510
+ * Log info message
511
+ */
512
+ info(message, ...args) {
513
+ if (this.shouldLog(exports.LogLevel.INFO)) {
514
+ console.info(this.formatMessage(message, 'INFO'), ...args);
515
+ }
516
+ }
517
+ /**
518
+ * Log warning message
519
+ */
520
+ warn(message, ...args) {
521
+ if (this.shouldLog(exports.LogLevel.WARN)) {
522
+ console.warn(this.formatMessage(message, 'WARN'), ...args);
523
+ }
524
+ }
525
+ /**
526
+ * Log error message
527
+ */
528
+ error(message, error, ...args) {
529
+ if (this.shouldLog(exports.LogLevel.ERROR)) {
530
+ console.error(this.formatMessage(message, 'ERROR'), ...args);
531
+ if (error) {
532
+ console.error(error);
533
+ if (this.config.enableStackTrace && error?.stack) {
534
+ console.error('Stack trace:', error.stack);
535
+ }
536
+ }
537
+ }
538
+ }
539
+ /**
540
+ * Log a group of messages
541
+ */
542
+ group(label, callback) {
543
+ if (this.shouldLog(exports.LogLevel.INFO)) {
544
+ console.group(this.formatMessage(label, 'GROUP'));
545
+ callback();
546
+ console.groupEnd();
547
+ }
548
+ }
549
+ /**
550
+ * Log a collapsed group of messages
551
+ */
552
+ groupCollapsed(label, callback) {
553
+ if (this.shouldLog(exports.LogLevel.INFO)) {
554
+ console.groupCollapsed(this.formatMessage(label, 'GROUP'));
555
+ callback();
556
+ console.groupEnd();
557
+ }
558
+ }
559
+ /**
560
+ * Log a table (useful for arrays of objects)
561
+ */
562
+ table(data, columns) {
563
+ if (this.shouldLog(exports.LogLevel.INFO)) {
564
+ console.table(data, columns);
565
+ }
566
+ }
567
+ /**
568
+ * Log execution time of a function
569
+ */
570
+ async time(label, fn) {
571
+ const start = performance.now();
572
+ try {
573
+ const result = await fn();
574
+ const end = performance.now();
575
+ const duration = (end - start).toFixed(2);
576
+ this.info(`${label} completed in ${duration}ms`);
577
+ return result;
578
+ }
579
+ catch (error) {
580
+ const end = performance.now();
581
+ const duration = (end - start).toFixed(2);
582
+ this.error(`${label} failed after ${duration}ms`, error);
583
+ throw error;
584
+ }
585
+ }
586
+ }
587
+
588
+ exports.EventBus = EventBus;
589
+ exports.Logger = Logger;
590
+ exports.StorageManager = StorageManager;
591
+ exports.TokenManager = TokenManager;
592
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/core/event-bus.ts","../../src/core/token-manager.ts","../../src/core/storage-manager.ts","../../src/core/logger.ts"],"sourcesContent":["import { Subject, Observable } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\n\n/**\n * Event payload interface\n */\nexport interface EventPayload<T = any> {\n type: string;\n data: T;\n timestamp?: number;\n}\n\n/**\n * EventBus - A centralized event bus for application-wide communication\n * Framework-agnostic implementation using only RxJS\n * \n * @example\n * ```typescript\n * // Create an instance\n * const eventBus = new EventBus();\n * \n * // Emit an event\n * eventBus.emit('user:login', { userId: '123', username: 'john' });\n * \n * // Subscribe to an event\n * eventBus.on('user:login').subscribe(data => {\n * console.log('User logged in:', data);\n * });\n * ```\n */\nexport class EventBus {\n private eventSubject = new Subject<EventPayload>();\n\n /**\n * Emit an event with optional data\n * @param eventType - The type/name of the event\n * @param data - Optional data to send with the event\n */\n emit<T = any>(eventType: string, data?: T): void {\n this.eventSubject.next({\n type: eventType,\n data,\n timestamp: Date.now()\n });\n }\n\n /**\n * Subscribe to a specific event type\n * @param eventType - The type/name of the event to listen for\n * @returns Observable that emits the event data\n */\n on<T = any>(eventType: string): Observable<T> {\n return this.eventSubject.asObservable().pipe(\n filter(event => event.type === eventType),\n map(event => event.data as T)\n );\n }\n\n /**\n * Subscribe to multiple event types\n * @param eventTypes - Array of event types to listen for\n * @returns Observable that emits the full event payload\n */\n onMultiple(eventTypes: string[]): Observable<EventPayload> {\n return this.eventSubject.asObservable().pipe(\n filter(event => eventTypes.includes(event.type))\n );\n }\n\n /**\n * Subscribe to all events\n * @returns Observable that emits all event payloads\n */\n onAll(): Observable<EventPayload> {\n return this.eventSubject.asObservable();\n }\n}\n","/**\n * Token configuration interface\n */\nexport interface TokenConfig {\n tokenKey?: string;\n refreshTokenKey?: string;\n useSessionStorage?: boolean;\n}\n\n/**\n * TokenManager - Manages authentication tokens\n * Framework-agnostic implementation using browser storage APIs\n * Handles storage, retrieval, and validation of JWT tokens\n * \n * @example\n * ```typescript\n * const tokenManager = new TokenManager();\n * \n * // Store a token\n * tokenManager.setToken('your-jwt-token');\n * \n * // Check if authenticated\n * if (tokenManager.isAuthenticated()) {\n * const userData = tokenManager.getUserFromToken();\n * }\n * ```\n */\nexport class TokenManager {\n private TOKEN_KEY = 'auth_token';\n private REFRESH_TOKEN_KEY = 'refresh_token';\n private useSessionStorage = false;\n\n /**\n * Configure token manager\n */\n configure(config: TokenConfig): void {\n if (config.tokenKey) {\n this.TOKEN_KEY = config.tokenKey;\n }\n if (config.refreshTokenKey) {\n this.REFRESH_TOKEN_KEY = config.refreshTokenKey;\n }\n if (config.useSessionStorage !== undefined) {\n this.useSessionStorage = config.useSessionStorage;\n }\n }\n\n /**\n * Get the storage mechanism based on configuration\n */\n private getStorage(): Storage {\n return this.useSessionStorage ? sessionStorage : localStorage;\n }\n\n /**\n * Set authentication token\n */\n setToken(token: string): void {\n this.getStorage().setItem(this.TOKEN_KEY, token);\n }\n\n /**\n * Get authentication token\n */\n getToken(): string | null {\n return this.getStorage().getItem(this.TOKEN_KEY);\n }\n\n /**\n * Remove authentication token\n */\n removeToken(): void {\n this.getStorage().removeItem(this.TOKEN_KEY);\n }\n\n /**\n * Set refresh token\n */\n setRefreshToken(token: string): void {\n this.getStorage().setItem(this.REFRESH_TOKEN_KEY, token);\n }\n\n /**\n * Get refresh token\n */\n getRefreshToken(): string | null {\n return this.getStorage().getItem(this.REFRESH_TOKEN_KEY);\n }\n\n /**\n * Remove refresh token\n */\n removeRefreshToken(): void {\n this.getStorage().removeItem(this.REFRESH_TOKEN_KEY);\n }\n\n /**\n * Clear all tokens\n */\n clearTokens(): void {\n this.removeToken();\n this.removeRefreshToken();\n }\n\n /**\n * Check if token exists\n */\n hasToken(): boolean {\n return !!this.getToken();\n }\n\n /**\n * Decode JWT token (without verification)\n * @param token - JWT token to decode\n * @returns Decoded token payload or null if invalid\n */\n decodeToken(token?: string): any {\n const tokenToDecode = token || this.getToken();\n if (!tokenToDecode) return null;\n\n try {\n const parts = tokenToDecode.split('.');\n if (parts.length !== 3) return null;\n\n const payload = parts[1];\n const decoded = JSON.parse(atob(payload.replace(/-/g, '+').replace(/_/g, '/')));\n return decoded;\n } catch (error) {\n console.error('Error decoding token:', error);\n return null;\n }\n }\n\n /**\n * Check if token is expired\n * @param token - Optional token to check (defaults to stored token)\n * @returns true if token is expired or invalid\n */\n isTokenExpired(token?: string): boolean {\n const decoded = this.decodeToken(token);\n if (!decoded || !decoded.exp) return true;\n\n const expirationDate = new Date(decoded.exp * 1000);\n return expirationDate <= new Date();\n }\n\n /**\n * Check if user is authenticated (has valid, non-expired token)\n */\n isAuthenticated(): boolean {\n return this.hasToken() && !this.isTokenExpired();\n }\n\n /**\n * Get token expiration date\n */\n getTokenExpirationDate(token?: string): Date | null {\n const decoded = this.decodeToken(token);\n if (!decoded || !decoded.exp) return null;\n return new Date(decoded.exp * 1000);\n }\n\n /**\n * Get user data from token\n */\n getUserFromToken(token?: string): any {\n return this.decodeToken(token);\n }\n}\n","/**\n * StorageManager - Type-safe wrapper for browser storage\n * Framework-agnostic implementation using browser storage APIs\n * Provides JSON serialization/deserialization and error handling\n * \n * @example\n * ```typescript\n * const storage = new StorageManager();\n * \n * // Store data\n * storage.setLocal('user-prefs', { theme: 'dark', lang: 'en' });\n * \n * // Retrieve data\n * const prefs = storage.getLocal('user-prefs');\n * \n * // With expiration\n * storage.setWithExpiration('temp-data', someData, 3600000); // 1 hour\n * ```\n */\nexport class StorageManager {\n /**\n * Set item in localStorage with JSON serialization\n */\n setLocal<T>(key: string, value: T): boolean {\n try {\n const serialized = JSON.stringify(value);\n localStorage.setItem(key, serialized);\n return true;\n } catch (error) {\n console.error('Error setting localStorage item:', error);\n return false;\n }\n }\n\n /**\n * Get item from localStorage with JSON deserialization\n */\n getLocal<T>(key: string, defaultValue?: T): T | null {\n try {\n const item = localStorage.getItem(key);\n if (item === null) {\n return defaultValue !== undefined ? defaultValue : null;\n }\n return JSON.parse(item) as T;\n } catch (error) {\n console.error('Error getting localStorage item:', error);\n return defaultValue !== undefined ? defaultValue : null;\n }\n }\n\n /**\n * Remove item from localStorage\n */\n removeLocal(key: string): void {\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.error('Error removing localStorage item:', error);\n }\n }\n\n /**\n * Clear all localStorage items\n */\n clearLocal(): void {\n try {\n localStorage.clear();\n } catch (error) {\n console.error('Error clearing localStorage:', error);\n }\n }\n\n /**\n * Check if key exists in localStorage\n */\n hasLocal(key: string): boolean {\n try {\n return localStorage.getItem(key) !== null;\n } catch (error) {\n console.error('Error checking localStorage key:', error);\n return false;\n }\n }\n\n /**\n * Get all localStorage keys\n */\n getLocalKeys(): string[] {\n try {\n return Object.keys(localStorage);\n } catch (error) {\n console.error('Error getting localStorage keys:', error);\n return [];\n }\n }\n\n /**\n * Set item in sessionStorage with JSON serialization\n */\n setSession<T>(key: string, value: T): boolean {\n try {\n const serialized = JSON.stringify(value);\n sessionStorage.setItem(key, serialized);\n return true;\n } catch (error) {\n console.error('Error setting sessionStorage item:', error);\n return false;\n }\n }\n\n /**\n * Get item from sessionStorage with JSON deserialization\n */\n getSession<T>(key: string, defaultValue?: T): T | null {\n try {\n const item = sessionStorage.getItem(key);\n if (item === null) {\n return defaultValue !== undefined ? defaultValue : null;\n }\n return JSON.parse(item) as T;\n } catch (error) {\n console.error('Error getting sessionStorage item:', error);\n return defaultValue !== undefined ? defaultValue : null;\n }\n }\n\n /**\n * Remove item from sessionStorage\n */\n removeSession(key: string): void {\n try {\n sessionStorage.removeItem(key);\n } catch (error) {\n console.error('Error removing sessionStorage item:', error);\n }\n }\n\n /**\n * Clear all sessionStorage items\n */\n clearSession(): void {\n try {\n sessionStorage.clear();\n } catch (error) {\n console.error('Error clearing sessionStorage:', error);\n }\n }\n\n /**\n * Check if key exists in sessionStorage\n */\n hasSession(key: string): boolean {\n try {\n return sessionStorage.getItem(key) !== null;\n } catch (error) {\n console.error('Error checking sessionStorage key:', error);\n return false;\n }\n }\n\n /**\n * Get all sessionStorage keys\n */\n getSessionKeys(): string[] {\n try {\n return Object.keys(sessionStorage);\n } catch (error) {\n console.error('Error getting sessionStorage keys:', error);\n return [];\n }\n }\n\n /**\n * Set item with expiration time\n * @param key - Storage key\n * @param value - Value to store\n * @param expirationMs - Expiration time in milliseconds\n * @param useSession - Use sessionStorage instead of localStorage\n */\n setWithExpiration<T>(\n key: string,\n value: T,\n expirationMs: number,\n useSession = false\n ): boolean {\n const item = {\n value,\n expiration: Date.now() + expirationMs\n };\n return useSession\n ? this.setSession(key, item)\n : this.setLocal(key, item);\n }\n\n /**\n * Get item with expiration check\n * Returns null if item is expired\n */\n getWithExpiration<T>(key: string, useSession = false): T | null {\n const item = useSession\n ? this.getSession<{ value: T; expiration: number }>(key)\n : this.getLocal<{ value: T; expiration: number }>(key);\n\n if (!item) return null;\n\n if (Date.now() > item.expiration) {\n // Item expired, remove it\n if (useSession) {\n this.removeSession(key);\n } else {\n this.removeLocal(key);\n }\n return null;\n }\n\n return item.value;\n }\n}\n","/**\n * Log level enum\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4\n}\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n level?: LogLevel;\n enableTimestamp?: boolean;\n enableStackTrace?: boolean;\n prefix?: string;\n}\n\n/**\n * Logger - Centralized logging utility\n * Framework-agnostic implementation using browser console APIs\n * Supports different log levels and can be configured globally\n * \n * @example\n * ```typescript\n * const logger = new Logger();\n * \n * // Configure\n * logger.configure({\n * level: LogLevel.DEBUG,\n * enableTimestamp: true,\n * prefix: 'MyApp'\n * });\n * \n * // Use\n * logger.info('User logged in', { userId: '123' });\n * logger.error('Failed to load data', error);\n * ```\n */\nexport class Logger {\n private config: LoggerConfig = {\n level: LogLevel.INFO,\n enableTimestamp: true,\n enableStackTrace: false,\n prefix: ''\n };\n\n /**\n * Configure the logger\n */\n configure(config: LoggerConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Set log level\n */\n setLevel(level: LogLevel): void {\n this.config.level = level;\n }\n\n /**\n * Get current log level\n */\n getLevel(): LogLevel {\n return this.config.level!;\n }\n\n /**\n * Format log message with timestamp and prefix\n */\n private formatMessage(message: string, level: string): string {\n const parts: string[] = [];\n\n if (this.config.enableTimestamp) {\n parts.push(`[${new Date().toISOString()}]`);\n }\n\n if (this.config.prefix) {\n parts.push(`[${this.config.prefix}]`);\n }\n\n parts.push(`[${level}]`);\n parts.push(message);\n\n return parts.join(' ');\n }\n\n /**\n * Check if log level should be logged\n */\n private shouldLog(level: LogLevel): boolean {\n return level >= this.config.level!;\n }\n\n /**\n * Log debug message\n */\n debug(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.debug(this.formatMessage(message, 'DEBUG'), ...args);\n }\n }\n\n /**\n * Log info message\n */\n info(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.info(this.formatMessage(message, 'INFO'), ...args);\n }\n }\n\n /**\n * Log warning message\n */\n warn(message: string, ...args: any[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n console.warn(this.formatMessage(message, 'WARN'), ...args);\n }\n }\n\n /**\n * Log error message\n */\n error(message: string, error?: any, ...args: any[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(this.formatMessage(message, 'ERROR'), ...args);\n \n if (error) {\n console.error(error);\n \n if (this.config.enableStackTrace && error?.stack) {\n console.error('Stack trace:', error.stack);\n }\n }\n }\n }\n\n /**\n * Log a group of messages\n */\n group(label: string, callback: () => void): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.group(this.formatMessage(label, 'GROUP'));\n callback();\n console.groupEnd();\n }\n }\n\n /**\n * Log a collapsed group of messages\n */\n groupCollapsed(label: string, callback: () => void): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.groupCollapsed(this.formatMessage(label, 'GROUP'));\n callback();\n console.groupEnd();\n }\n }\n\n /**\n * Log a table (useful for arrays of objects)\n */\n table(data: any, columns?: string[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.table(data, columns);\n }\n }\n\n /**\n * Log execution time of a function\n */\n async time<T>(label: string, fn: () => Promise<T> | T): Promise<T> {\n const start = performance.now();\n try {\n const result = await fn();\n const end = performance.now();\n const duration = (end - start).toFixed(2);\n this.info(`${label} completed in ${duration}ms`);\n return result;\n } catch (error) {\n const end = performance.now();\n const duration = (end - start).toFixed(2);\n this.error(`${label} failed after ${duration}ms`, error);\n throw error;\n }\n }\n}\n"],"names":["Subject","filter","map","LogLevel"],"mappings":";;;;;AAYA;;;;;;;;;;;;;;;;;AAiBG;MACU,QAAQ,CAAA;AACX,IAAA,YAAY,GAAG,IAAIA,YAAO,EAAgB;AAElD;;;;AAIG;IACH,IAAI,CAAU,SAAiB,EAAE,IAAQ,EAAA;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,EAAE,SAAS;YACf,IAAI;AACJ,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG;AACpB,SAAA,CAAC;IACJ;AAEA;;;;AAIG;AACH,IAAA,EAAE,CAAU,SAAiB,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,IAAI,CAC1CC,gBAAM,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,EACzCC,aAAG,CAAC,KAAK,IAAI,KAAK,CAAC,IAAS,CAAC,CAC9B;IACH;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAAC,UAAoB,EAAA;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,IAAI,CAC1CD,gBAAM,CAAC,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CACjD;IACH;AAEA;;;AAGG;IACH,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AACD;;ACnED;;;;;;;;;;;;;;;;;AAiBG;MACU,YAAY,CAAA;IACf,SAAS,GAAG,YAAY;IACxB,iBAAiB,GAAG,eAAe;IACnC,iBAAiB,GAAG,KAAK;AAEjC;;AAEG;AACH,IAAA,SAAS,CAAC,MAAmB,EAAA;AAC3B,QAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ;QAClC;AACA,QAAA,IAAI,MAAM,CAAC,eAAe,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,eAAe;QACjD;AACA,QAAA,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,EAAE;AAC1C,YAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB;QACnD;IACF;AAEA;;AAEG;IACK,UAAU,GAAA;QAChB,OAAO,IAAI,CAAC,iBAAiB,GAAG,cAAc,GAAG,YAAY;IAC/D;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC;IAClD;AAEA;;AAEG;IACH,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;IAClD;AAEA;;AAEG;IACH,WAAW,GAAA;QACT,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;IAC9C;AAEA;;AAEG;AACH,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC;IAC1D;AAEA;;AAEG;IACH,eAAe,GAAA;QACb,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC1D;AAEA;;AAEG;IACH,kBAAkB,GAAA;QAChB,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACtD;AAEA;;AAEG;IACH,WAAW,GAAA;QACT,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,kBAAkB,EAAE;IAC3B;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE;IAC1B;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,KAAc,EAAA;QACxB,MAAM,aAAa,GAAG,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC9C,QAAA,IAAI,CAAC,aAAa;AAAE,YAAA,OAAO,IAAI;AAE/B,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC;AACtC,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,IAAI;AAEnC,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/E,YAAA,OAAO,OAAO;QAChB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;AAC7C,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;;;AAIG;AACH,IAAA,cAAc,CAAC,KAAc,EAAA;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;QAEzC,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;AACnD,QAAA,OAAO,cAAc,IAAI,IAAI,IAAI,EAAE;IACrC;AAEA;;AAEG;IACH,eAAe,GAAA;QACb,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;IAClD;AAEA;;AAEG;AACH,IAAA,sBAAsB,CAAC,KAAc,EAAA;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;QACzC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IACrC;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,KAAc,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IAChC;AACD;;ACxKD;;;;;;;;;;;;;;;;;;AAkBG;MACU,cAAc,CAAA;AACzB;;AAEG;IACH,QAAQ,CAAI,GAAW,EAAE,KAAQ,EAAA;AAC/B,QAAA,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACxC,YAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;AACrC,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;AACxD,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,QAAQ,CAAI,GAAW,EAAE,YAAgB,EAAA;AACvC,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;AACtC,YAAA,IAAI,IAAI,KAAK,IAAI,EAAE;gBACjB,OAAO,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,IAAI;YACzD;AACA,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM;QAC9B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;YACxD,OAAO,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,IAAI;QACzD;IACF;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,GAAW,EAAA;AACrB,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;QAC9B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC;QAC3D;IACF;AAEA;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,IAAI;YACF,YAAY,CAAC,KAAK,EAAE;QACtB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;QACtD;IACF;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,GAAW,EAAA;AAClB,QAAA,IAAI;YACF,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI;QAC3C;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;AACxD,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;QAClC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;AACxD,YAAA,OAAO,EAAE;QACX;IACF;AAEA;;AAEG;IACH,UAAU,CAAI,GAAW,EAAE,KAAQ,EAAA;AACjC,QAAA,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACxC,YAAA,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;AACvC,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;AAC1D,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,UAAU,CAAI,GAAW,EAAE,YAAgB,EAAA;AACzC,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC;AACxC,YAAA,IAAI,IAAI,KAAK,IAAI,EAAE;gBACjB,OAAO,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,IAAI;YACzD;AACA,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM;QAC9B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;YAC1D,OAAO,YAAY,KAAK,SAAS,GAAG,YAAY,GAAG,IAAI;QACzD;IACF;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,GAAW,EAAA;AACvB,QAAA,IAAI;AACF,YAAA,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC;QAChC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC;QAC7D;IACF;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,IAAI;YACF,cAAc,CAAC,KAAK,EAAE;QACxB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC;QACxD;IACF;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,GAAW,EAAA;AACpB,QAAA,IAAI;YACF,OAAO,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI;QAC7C;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;AAC1D,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;QACpC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;AAC1D,YAAA,OAAO,EAAE;QACX;IACF;AAEA;;;;;;AAMG;IACH,iBAAiB,CACf,GAAW,EACX,KAAQ,EACR,YAAoB,EACpB,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,MAAM,IAAI,GAAG;YACX,KAAK;AACL,YAAA,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG;SAC1B;AACD,QAAA,OAAO;cACH,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI;cACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IAC9B;AAEA;;;AAGG;AACH,IAAA,iBAAiB,CAAI,GAAW,EAAE,UAAU,GAAG,KAAK,EAAA;QAClD,MAAM,IAAI,GAAG;AACX,cAAE,IAAI,CAAC,UAAU,CAAmC,GAAG;AACvD,cAAE,IAAI,CAAC,QAAQ,CAAmC,GAAG,CAAC;AAExD,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;QAEtB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;;YAEhC,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YACzB;iBAAO;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YACvB;AACA,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,IAAI,CAAC,KAAK;IACnB;AACD;;ACzND;;AAEG;AACSE;AAAZ,CAAA,UAAY,QAAQ,EAAA;AAClB,IAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;AACT,IAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACR,IAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACR,IAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;AACT,IAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACV,CAAC,EANWA,gBAAQ,KAARA,gBAAQ,GAAA,EAAA,CAAA,CAAA;AAkBpB;;;;;;;;;;;;;;;;;;;;AAoBG;MACU,MAAM,CAAA;AACT,IAAA,MAAM,GAAiB;QAC7B,KAAK,EAAEA,gBAAQ,CAAC,IAAI;AACpB,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,gBAAgB,EAAE,KAAK;AACvB,QAAA,MAAM,EAAE;KACT;AAED;;AAEG;AACH,IAAA,SAAS,CAAC,MAAoB,EAAA;AAC5B,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE;IAC7C;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,KAAe,EAAA;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK;IAC3B;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAM;IAC3B;AAEA;;AAEG;IACK,aAAa,CAAC,OAAe,EAAE,KAAa,EAAA;QAClD,MAAM,KAAK,GAAa,EAAE;AAE1B,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;AAC/B,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA,CAAA,CAAG,CAAC;QAC7C;AAEA,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACtB,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;QACvC;AAEA,QAAA,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAA,CAAA,CAAG,CAAC;AACxB,QAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;AAEnB,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB;AAEA;;AAEG;AACK,IAAA,SAAS,CAAC,KAAe,EAAA;AAC/B,QAAA,OAAO,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAM;IACpC;AAEA;;AAEG;AACH,IAAA,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW,EAAA;QACnC,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,KAAK,CAAC,EAAE;AAClC,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC;QAC9D;IACF;AAEA;;AAEG;AACH,IAAA,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW,EAAA;QAClC,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;QAC5D;IACF;AAEA;;AAEG;AACH,IAAA,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW,EAAA;QAClC,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;QAC5D;IACF;AAEA;;AAEG;AACH,IAAA,KAAK,CAAC,OAAe,EAAE,KAAW,EAAE,GAAG,IAAW,EAAA;QAChD,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,KAAK,CAAC,EAAE;AAClC,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC;YAE5D,IAAI,KAAK,EAAE;AACT,gBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBAEpB,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,KAAK,EAAE,KAAK,EAAE;oBAChD,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC;gBAC5C;YACF;QACF;IACF;AAEA;;AAEG;IACH,KAAK,CAAC,KAAa,EAAE,QAAoB,EAAA;QACvC,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACjD,YAAA,QAAQ,EAAE;YACV,OAAO,CAAC,QAAQ,EAAE;QACpB;IACF;AAEA;;AAEG;IACH,cAAc,CAAC,KAAa,EAAE,QAAoB,EAAA;QAChD,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC1D,YAAA,QAAQ,EAAE;YACV,OAAO,CAAC,QAAQ,EAAE;QACpB;IACF;AAEA;;AAEG;IACH,KAAK,CAAC,IAAS,EAAE,OAAkB,EAAA;QACjC,IAAI,IAAI,CAAC,SAAS,CAACA,gBAAQ,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;QAC9B;IACF;AAEA;;AAEG;AACH,IAAA,MAAM,IAAI,CAAI,KAAa,EAAE,EAAwB,EAAA;AACnD,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;AAC/B,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE;AACzB,YAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAC7B,YAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,CAAA,EAAG,KAAK,CAAA,cAAA,EAAiB,QAAQ,CAAA,EAAA,CAAI,CAAC;AAChD,YAAA,OAAO,MAAM;QACf;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAC7B,YAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,KAAK,CAAA,cAAA,EAAiB,QAAQ,CAAA,EAAA,CAAI,EAAE,KAAK,CAAC;AACxD,YAAA,MAAM,KAAK;QACb;IACF;AACD;;;;;;;"}