@gnwebsoft/ui 4.0.1 → 4.0.3

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,2512 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3;// src/core/api/CorrelationIdGenerator.ts
2
+ function generateUUID() {
3
+ if (typeof crypto !== "undefined" && crypto.randomUUID) {
4
+ return crypto.randomUUID();
5
+ }
6
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
7
+ const r = Math.random() * 16 | 0;
8
+ const v = c === "x" ? r : r & 3 | 8;
9
+ return v.toString(16);
10
+ });
11
+ }
12
+ function generateCorrelationId(prefix) {
13
+ const uuid = generateUUID();
14
+ return prefix ? `${prefix}-${uuid}` : uuid;
15
+ }
16
+
17
+ // src/core/api/Errors/ErrorNormalizer.ts
18
+ var ErrorNormalizer = class {
19
+ /**
20
+ * Maps an HTTP status code to a standardized error type category.
21
+ *
22
+ * This categorization helps consumers handle different error classes appropriately:
23
+ * - `validation_error` (400): Client sent invalid data
24
+ * - `client_error` (401-499): Client-side issues (auth, permissions, not found, etc.)
25
+ * - `server_error` (500-599): Server-side failures
26
+ * - `unknown_error`: Unrecognized status codes
27
+ *
28
+ * @param status - HTTP status code from the response
29
+ * @returns The error type category as a string
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * normalizer.getErrorType(400); // => 'validation_error'
34
+ * normalizer.getErrorType(404); // => 'client_error'
35
+ * normalizer.getErrorType(500); // => 'server_error'
36
+ * normalizer.getErrorType(0); // => 'unknown_error'
37
+ * ```
38
+ */
39
+ getErrorType(status) {
40
+ if (status >= 400 && status < 500) {
41
+ return status === 400 ? "validation_error" : "client_error";
42
+ } else if (status >= 500) {
43
+ return "server_error";
44
+ }
45
+ return "unknown_error";
46
+ }
47
+ /**
48
+ * Maps an HTTP status code to a human-readable error title.
49
+ *
50
+ * Provides user-friendly error messages for common HTTP status codes.
51
+ * Falls back to a generic "HTTP Error {status}" format for unmapped codes.
52
+ *
53
+ * @param status - HTTP status code from the response
54
+ * @returns A human-readable error title
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * normalizer.getErrorTitle(404); // => 'Not Found'
59
+ * normalizer.getErrorTitle(500); // => 'Internal Server Error'
60
+ * normalizer.getErrorTitle(999); // => 'HTTP Error 999'
61
+ * ```
62
+ */
63
+ getErrorTitle(status) {
64
+ const titles = {
65
+ 400: "Bad Request",
66
+ 401: "Unauthorized",
67
+ 403: "Forbidden",
68
+ 404: "Not Found",
69
+ 405: "Method Not Allowed",
70
+ 408: "Request Timeout",
71
+ 409: "Conflict",
72
+ 422: "Unprocessable Entity",
73
+ 429: "Too Many Requests",
74
+ 500: "Internal Server Error",
75
+ 502: "Bad Gateway",
76
+ 503: "Service Unavailable",
77
+ 504: "Gateway Timeout"
78
+ };
79
+ return titles[status] || `HTTP Error ${status}`;
80
+ }
81
+ /**
82
+ * Normalizes any error into a consistent, structured ApiError format.
83
+ *
84
+ * This method handles various error scenarios and ensures they all conform to
85
+ * the {@link ApiError} interface with appropriate categorization and metadata:
86
+ *
87
+ * - **Existing ApiErrors**: Enhances with missing fields (traceId, config)
88
+ * - **AbortErrors**: Marks as `request_cancelled` with isAborted flag
89
+ * - **Timeout Errors**: Categorizes as `timeout_error` with 408 status
90
+ * - **Network Errors**: Categorizes as `network_error` with 0 status
91
+ * - **Unknown Errors**: Fallback category for unexpected error types
92
+ *
93
+ * All normalized errors include:
94
+ * - `type`: Error category for programmatic handling
95
+ * - `title`: Human-readable error title
96
+ * - `status`: HTTP status code (or 0 for non-HTTP errors)
97
+ * - `traceId`: Correlation ID for distributed tracing
98
+ * - `isAborted`: Boolean flag indicating if request was cancelled
99
+ * - `config`: Original request configuration for debugging
100
+ *
101
+ * @param error - The error to normalize (can be any type)
102
+ * @param config - The request configuration that led to this error
103
+ * @param correlationId - Optional correlation ID for tracing
104
+ * @returns A fully structured ApiError instance
105
+ *
106
+ * @example
107
+ * Normalizing a fetch AbortError:
108
+ * ```typescript
109
+ * try {
110
+ * await fetch(url, { signal });
111
+ * } catch (error) {
112
+ * const apiError = normalizer.normalizeError(error, config, 'req-123');
113
+ * // apiError.type === 'request_cancelled'
114
+ * // apiError.isAborted === true
115
+ * }
116
+ * ```
117
+ *
118
+ * @example
119
+ * Normalizing a timeout:
120
+ * ```typescript
121
+ * const timeoutError = new Error('Request timeout after 30000ms');
122
+ * const apiError = normalizer.normalizeError(timeoutError, config);
123
+ * // apiError.type === 'timeout_error'
124
+ * // apiError.status === 408
125
+ * ```
126
+ */
127
+ normalizeError(error, config, correlationId) {
128
+ if (error === null || error === void 0) {
129
+ return Object.assign(new Error("An unknown error occurred"), {
130
+ type: "unknown_error",
131
+ title: "Unknown Error",
132
+ status: 0,
133
+ traceId: correlationId,
134
+ isAborted: false,
135
+ config
136
+ });
137
+ }
138
+ if (typeof error === "string") {
139
+ return Object.assign(new Error(error), {
140
+ type: "unknown_error",
141
+ title: "Unknown Error",
142
+ status: 0,
143
+ traceId: correlationId,
144
+ isAborted: false,
145
+ config
146
+ });
147
+ }
148
+ const err = error;
149
+ if (err.type || err.title || err.errors) {
150
+ return Object.assign(
151
+ error instanceof Error ? error : new Error(_nullishCoalesce(err.message, () => ( "Unknown error"))),
152
+ {
153
+ type: err.type,
154
+ title: err.title,
155
+ status: err.status,
156
+ traceId: err.traceId || correlationId,
157
+ errors: err.errors,
158
+ isAborted: err.isAborted || false,
159
+ config
160
+ }
161
+ );
162
+ }
163
+ if (err.name === "AbortError" || err.isAborted) {
164
+ return Object.assign(new Error(_nullishCoalesce(err.message, () => ( "Request was aborted"))), {
165
+ type: "request_cancelled",
166
+ title: "Request was cancelled",
167
+ status: 0,
168
+ traceId: correlationId,
169
+ isAborted: true,
170
+ config
171
+ });
172
+ }
173
+ if (_optionalChain([err, 'access', _ => _.message, 'optionalAccess', _2 => _2.includes, 'call', _3 => _3("timeout")])) {
174
+ return Object.assign(new Error(err.message), {
175
+ type: "timeout_error",
176
+ title: "Request Timeout",
177
+ status: 408,
178
+ traceId: correlationId,
179
+ isAborted: true,
180
+ config
181
+ });
182
+ }
183
+ if (_optionalChain([err, 'access', _4 => _4.message, 'optionalAccess', _5 => _5.includes, 'call', _6 => _6("network")])) {
184
+ return Object.assign(new Error(_nullishCoalesce(err.message, () => ( "Network request failed"))), {
185
+ type: "network_error",
186
+ title: "Network Error",
187
+ status: 0,
188
+ traceId: correlationId,
189
+ isAborted: false,
190
+ config
191
+ });
192
+ }
193
+ return Object.assign(
194
+ new Error(_nullishCoalesce(err.message, () => ( "An unknown error occurred"))),
195
+ {
196
+ type: "unknown_error",
197
+ title: "Unknown Error",
198
+ status: 0,
199
+ traceId: correlationId,
200
+ isAborted: false,
201
+ config
202
+ }
203
+ );
204
+ }
205
+ };
206
+
207
+ // src/core/api/Interceptors/InterceptorManager.ts
208
+ var InterceptorManager = (_class = class {constructor() { _class.prototype.__init.call(this);_class.prototype.__init2.call(this);_class.prototype.__init3.call(this); }
209
+ /**
210
+ * Array of registered request interceptors
211
+ * @private
212
+ */
213
+ __init() {this.requestInterceptors = []}
214
+ /**
215
+ * Array of registered response interceptors
216
+ * @private
217
+ */
218
+ __init2() {this.responseInterceptors = []}
219
+ /**
220
+ * Array of registered error interceptors
221
+ * @private
222
+ */
223
+ __init3() {this.errorInterceptors = []}
224
+ /**
225
+ * Registers a request interceptor to modify requests before they are sent.
226
+ *
227
+ * Request interceptors can:
228
+ * - Add or modify headers
229
+ * - Transform request bodies
230
+ * - Add query parameters
231
+ * - Implement request signing
232
+ * - Log outgoing requests
233
+ *
234
+ * @param interceptor - Async function that receives and returns RequestConfig
235
+ * @returns Cleanup function to unregister this interceptor
236
+ *
237
+ * @example
238
+ * ```typescript
239
+ * // Add authentication header
240
+ * const unregister = manager.addRequestInterceptor(async (config) => {
241
+ * const token = await getAuthToken();
242
+ * config.headers = config.headers || new Headers();
243
+ * config.headers.set('Authorization', `Bearer ${token}`);
244
+ * return config;
245
+ * });
246
+ *
247
+ * // Later, remove the interceptor
248
+ * unregister();
249
+ * ```
250
+ */
251
+ addRequestInterceptor(interceptor) {
252
+ this.requestInterceptors.push(interceptor);
253
+ return () => {
254
+ const index = this.requestInterceptors.indexOf(interceptor);
255
+ if (index > -1) this.requestInterceptors.splice(index, 1);
256
+ };
257
+ }
258
+ /**
259
+ * Registers a response interceptor to transform responses before they are returned.
260
+ *
261
+ * Response interceptors can:
262
+ * - Transform response data format
263
+ * - Extract nested data structures
264
+ * - Add computed properties
265
+ * - Cache responses
266
+ * - Log successful responses
267
+ *
268
+ * @param interceptor - Async function that receives and returns ApiResponse
269
+ * @returns Cleanup function to unregister this interceptor
270
+ *
271
+ * @example
272
+ * ```typescript
273
+ * // Extract data from envelope
274
+ * manager.addResponseInterceptor(async (response) => {
275
+ * if (response.apiData?.result) {
276
+ * response.apiData = response.apiData.result;
277
+ * }
278
+ * return response;
279
+ * });
280
+ *
281
+ * // Add timestamps
282
+ * manager.addResponseInterceptor(async (response) => {
283
+ * return {
284
+ * ...response,
285
+ * receivedAt: new Date().toISOString()
286
+ * };
287
+ * });
288
+ * ```
289
+ */
290
+ addResponseInterceptor(interceptor) {
291
+ this.responseInterceptors.push(interceptor);
292
+ return () => {
293
+ const index = this.responseInterceptors.indexOf(interceptor);
294
+ if (index > -1) this.responseInterceptors.splice(index, 1);
295
+ };
296
+ }
297
+ /**
298
+ * Registers an error interceptor to handle or transform errors before they are thrown.
299
+ *
300
+ * Error interceptors can:
301
+ * - Log errors to monitoring services
302
+ * - Transform error formats
303
+ * - Implement retry logic
304
+ * - Show user notifications
305
+ * - Extract validation errors
306
+ *
307
+ * **Note:** Error interceptors should re-throw the error (or a transformed version)
308
+ * to maintain the error flow. The final error is always thrown.
309
+ *
310
+ * @param interceptor - Async function that receives and returns (or throws) ApiError
311
+ * @returns Cleanup function to unregister this interceptor
312
+ *
313
+ * @example
314
+ * ```typescript
315
+ * // Log to monitoring service
316
+ * manager.addErrorInterceptor(async (error) => {
317
+ * if (error.status >= 500) {
318
+ * await Sentry.captureException(error, {
319
+ * extra: { traceId: error.traceId }
320
+ * });
321
+ * }
322
+ * throw error; // Re-throw to continue error flow
323
+ * });
324
+ *
325
+ * // Transform error messages
326
+ * manager.addErrorInterceptor(async (error) => {
327
+ * if (error.status === 404) {
328
+ * error.title = 'Resource not found';
329
+ * }
330
+ * throw error;
331
+ * });
332
+ * ```
333
+ */
334
+ addErrorInterceptor(interceptor) {
335
+ this.errorInterceptors.push(interceptor);
336
+ return () => {
337
+ const index = this.errorInterceptors.indexOf(interceptor);
338
+ if (index > -1) this.errorInterceptors.splice(index, 1);
339
+ };
340
+ }
341
+ /**
342
+ * Applies all registered request interceptors in sequential order.
343
+ *
344
+ * Each interceptor receives the config modified by the previous interceptor,
345
+ * forming a processing pipeline. If any interceptor throws an error,
346
+ * the pipeline stops and the error propagates.
347
+ *
348
+ * @param config - The initial request configuration
349
+ * @returns The modified request configuration after all interceptors
350
+ *
351
+ * @example
352
+ * ```typescript
353
+ * const config = { method: 'GET', url: '/users' };
354
+ * const finalConfig = await manager.applyRequestInterceptors(config);
355
+ * // finalConfig has been processed by all registered interceptors
356
+ * ```
357
+ */
358
+ async applyRequestInterceptors(config) {
359
+ let modifiedConfig = { ...config };
360
+ for (const interceptor of this.requestInterceptors) {
361
+ modifiedConfig = await interceptor(modifiedConfig);
362
+ }
363
+ return modifiedConfig;
364
+ }
365
+ /**
366
+ * Applies all registered response interceptors in sequential order.
367
+ *
368
+ * Each interceptor receives the response modified by the previous interceptor,
369
+ * forming a processing pipeline. If any interceptor throws an error,
370
+ * the pipeline stops and the error propagates.
371
+ *
372
+ * @template T - The type of the response data
373
+ * @param response - The initial API response
374
+ * @returns The modified response after all interceptors
375
+ *
376
+ * @example
377
+ * ```typescript
378
+ * const response = { data: { id: 1, name: 'John' } };
379
+ * const finalResponse = await manager.applyResponseInterceptors(response);
380
+ * // finalResponse has been processed by all registered interceptors
381
+ * ```
382
+ */
383
+ async applyResponseInterceptors(response) {
384
+ let modifiedResponse = response;
385
+ for (const interceptor of this.responseInterceptors) {
386
+ modifiedResponse = await interceptor(modifiedResponse);
387
+ }
388
+ return modifiedResponse;
389
+ }
390
+ /**
391
+ * Applies all registered error interceptors in sequential order and re-throws.
392
+ *
393
+ * Each interceptor receives the error (potentially modified by previous interceptors).
394
+ * Interceptors can transform the error before re-throwing it. The final error
395
+ * is always thrown to maintain error flow.
396
+ *
397
+ * If an interceptor itself throws an error, that becomes the new error to process
398
+ * by subsequent interceptors.
399
+ *
400
+ * @param error - The initial API error
401
+ * @returns Never returns (always throws)
402
+ * @throws The final error after all interceptors have processed it
403
+ *
404
+ * @example
405
+ * ```typescript
406
+ * try {
407
+ * await manager.applyErrorInterceptors(error);
408
+ * } catch (finalError) {
409
+ * // finalError has been processed by all registered error interceptors
410
+ * }
411
+ * ```
412
+ */
413
+ async applyErrorInterceptors(error) {
414
+ let modifiedError = error;
415
+ for (const interceptor of this.errorInterceptors) {
416
+ try {
417
+ modifiedError = await interceptor(modifiedError);
418
+ } catch (e) {
419
+ modifiedError = e;
420
+ }
421
+ }
422
+ throw modifiedError;
423
+ }
424
+ }, _class);
425
+
426
+ // src/core/api/RequestManager.ts
427
+ var RequestManager = (_class2 = class {constructor() { _class2.prototype.__init4.call(this);_class2.prototype.__init5.call(this); }
428
+ /**
429
+ * Map of active request keys to their abort controllers
430
+ * @private
431
+ */
432
+ __init4() {this.activeRequests = /* @__PURE__ */ new Map()}
433
+ /**
434
+ * Map of request keys to their correlation IDs for tracing
435
+ * @private
436
+ */
437
+ __init5() {this.correlationMap = /* @__PURE__ */ new Map()}
438
+ /**
439
+ * Registers a new request for tracking and cancellation management.
440
+ *
441
+ * If a request with the same key already exists, it will be automatically
442
+ * cancelled before the new one is registered (request deduplication).
443
+ *
444
+ * @param key - Unique identifier for the request (typically method + URL + timestamp)
445
+ * @param controller - AbortController for cancelling the request
446
+ * @param correlationId - Correlation ID for distributed tracing
447
+ *
448
+ * @example
449
+ * ```typescript
450
+ * const controller = new AbortController();
451
+ * manager.add('GET_/api/users_1699999999', controller, 'api-abc123');
452
+ * ```
453
+ */
454
+ add(key, controller, correlationId) {
455
+ this.cancel(key);
456
+ this.activeRequests.set(key, controller);
457
+ this.correlationMap.set(key, correlationId);
458
+ }
459
+ /**
460
+ * Removes a request from tracking without cancelling it.
461
+ *
462
+ * This is typically called when a request completes successfully or fails.
463
+ * Use {@link cancel} instead if you need to abort the request.
464
+ *
465
+ * @param key - Unique identifier for the request to remove
466
+ *
467
+ * @example
468
+ * ```typescript
469
+ * // Called automatically after request completes
470
+ * manager.remove('GET_/api/users_1699999999');
471
+ * ```
472
+ */
473
+ remove(key) {
474
+ this.activeRequests.delete(key);
475
+ this.correlationMap.delete(key);
476
+ }
477
+ /**
478
+ * Cancels a specific request and removes it from tracking.
479
+ *
480
+ * If the request doesn't exist or was already cancelled, this operation is a no-op.
481
+ * The associated AbortController's signal will be triggered, causing any active
482
+ * fetch operations to abort.
483
+ *
484
+ * @param key - Unique identifier for the request to cancel
485
+ *
486
+ * @example
487
+ * ```typescript
488
+ * // User navigates away, cancel the pending request
489
+ * manager.cancel('GET_/api/users_1699999999');
490
+ * ```
491
+ */
492
+ cancel(key) {
493
+ const controller = this.activeRequests.get(key);
494
+ if (controller) {
495
+ controller.abort();
496
+ this.activeRequests.delete(key);
497
+ this.correlationMap.delete(key);
498
+ }
499
+ }
500
+ /**
501
+ * Cancels all active requests and clears all tracking data.
502
+ *
503
+ * This is useful for cleanup scenarios such as:
504
+ * - User logout
505
+ * - Component unmount
506
+ * - Navigation to a different part of the application
507
+ * - Error recovery that requires a clean slate
508
+ *
509
+ * @example
510
+ * ```typescript
511
+ * // Cancel all pending requests on logout
512
+ * function handleLogout() {
513
+ * apiClient.cancelAllRequests();
514
+ * // ... rest of logout logic
515
+ * }
516
+ * ```
517
+ */
518
+ cancelAll() {
519
+ this.activeRequests.forEach((controller) => controller.abort());
520
+ this.activeRequests.clear();
521
+ this.correlationMap.clear();
522
+ }
523
+ /**
524
+ * Checks if a request with the given key is currently being tracked.
525
+ *
526
+ * @param key - Unique identifier for the request
527
+ * @returns `true` if the request is active, `false` otherwise
528
+ *
529
+ * @example
530
+ * ```typescript
531
+ * if (manager.has('GET_/api/users_1699999999')) {
532
+ * console.log('Request is still pending');
533
+ * }
534
+ * ```
535
+ */
536
+ has(key) {
537
+ return this.activeRequests.has(key);
538
+ }
539
+ /**
540
+ * Retrieves the correlation ID for a given request key.
541
+ *
542
+ * Correlation IDs are used for distributed tracing and request tracking
543
+ * across services and logs.
544
+ *
545
+ * @param key - Unique identifier for the request
546
+ * @returns The correlation ID if found, `undefined` otherwise
547
+ *
548
+ * @example
549
+ * ```typescript
550
+ * const correlationId = manager.getCorrelationId('GET_/api/users_1699999999');
551
+ * if (correlationId) {
552
+ * console.log('Trace request with ID:', correlationId);
553
+ * }
554
+ * ```
555
+ */
556
+ getCorrelationId(key) {
557
+ return this.correlationMap.get(key);
558
+ }
559
+ }, _class2);
560
+
561
+ // src/core/api/Retry/RetryHandler.ts
562
+ var RetryHandler = class {
563
+ /**
564
+ * Retries a failed request with exponential backoff strategy.
565
+ *
566
+ * The retry logic works as follows:
567
+ * 1. Attempts the request immediately
568
+ * 2. On failure, checks if the error is retryable
569
+ * 3. If retryable and retries remain, waits for the current delay
570
+ * 4. Doubles the delay for the next attempt
571
+ * 5. Repeats until success or retries exhausted
572
+ *
573
+ * **Non-Retryable Errors:**
574
+ * - Validation errors (400) - Client sent bad data
575
+ * - AbortErrors - Request was explicitly cancelled
576
+ * - Requests with aborted signals
577
+ *
578
+ * **Abort Handling:**
579
+ * If the signal is aborted during a retry delay, the retry is immediately
580
+ * cancelled and an AbortError is thrown.
581
+ *
582
+ * @template T - The return type of the function being retried
583
+ * @param fn - Async function to retry on failure
584
+ * @param retries - Number of retry attempts remaining (decrements each retry)
585
+ * @param delay - Current delay in milliseconds before next retry
586
+ * @param signal - Optional AbortSignal to cancel retries
587
+ * @returns Promise resolving to the function's result on success
588
+ * @throws The last error encountered if all retries are exhausted
589
+ * @throws AbortError if the signal is aborted during execution or delay
590
+ *
591
+ * @example
592
+ * Basic retry usage:
593
+ * ```typescript
594
+ * const handler = new RetryHandler();
595
+ * const fetchUser = () => fetch('/api/users/123').then(r => r.json());
596
+ *
597
+ * try {
598
+ * const user = await handler.retryRequest(
599
+ * fetchUser,
600
+ * 3, // 3 retries
601
+ * 1000 // Start with 1s delay
602
+ * );
603
+ * console.log('User:', user);
604
+ * } catch (error) {
605
+ * console.error('Failed after all retries:', error);
606
+ * }
607
+ * ```
608
+ *
609
+ * @example
610
+ * With cancellation support:
611
+ * ```typescript
612
+ * const controller = new AbortController();
613
+ * const signal = controller.signal;
614
+ *
615
+ * // Cancel after 5 seconds
616
+ * setTimeout(() => controller.abort(), 5000);
617
+ *
618
+ * try {
619
+ * await handler.retryRequest(fetchUser, 5, 1000, signal);
620
+ * } catch (error) {
621
+ * if (error.name === 'AbortError') {
622
+ * console.log('Retry cancelled');
623
+ * }
624
+ * }
625
+ * ```
626
+ */
627
+ async retryRequest(fn, retries, delay, signal) {
628
+ try {
629
+ if (_optionalChain([signal, 'optionalAccess', _7 => _7.aborted])) {
630
+ throw new Error(signal.reason || "Request aborted");
631
+ }
632
+ return await fn();
633
+ } catch (error) {
634
+ const err = error;
635
+ if (err.name === "AbortError" || _optionalChain([signal, 'optionalAccess', _8 => _8.aborted])) {
636
+ throw error;
637
+ }
638
+ if (err.type === "validation_error" || err.status === 400) {
639
+ throw error;
640
+ }
641
+ if (retries === 0) throw error;
642
+ await new Promise((resolve, reject) => {
643
+ const timeoutId = setTimeout(resolve, delay);
644
+ if (signal) {
645
+ signal.addEventListener(
646
+ "abort",
647
+ () => {
648
+ clearTimeout(timeoutId);
649
+ reject(new Error(signal.reason || "Request aborted"));
650
+ },
651
+ { once: true }
652
+ );
653
+ }
654
+ });
655
+ return this.retryRequest(fn, retries - 1, delay * 2, signal);
656
+ }
657
+ }
658
+ };
659
+
660
+ // src/core/api/Signals/SignalManager.ts
661
+ var SignalManager = class {
662
+ /**
663
+ * Creates a combined AbortController that aborts when any source signal aborts.
664
+ *
665
+ * This method implements the "any" pattern for cancellation: the combined signal
666
+ * will abort as soon as ANY of the source signals abort. This is useful for
667
+ * coordinating multiple cancellation conditions:
668
+ * - User clicks cancel button
669
+ * - Request timeout expires
670
+ * - Component unmounts
671
+ * - Parent request is cancelled
672
+ *
673
+ * **Early Abort Optimization:**
674
+ * If any source signal is already aborted when this method is called,
675
+ * the returned controller is immediately aborted without setting up listeners.
676
+ *
677
+ * **Memory Management:**
678
+ * Event listeners are registered with `{ once: true }` to prevent memory leaks,
679
+ * as they automatically clean up after firing.
680
+ *
681
+ * @param signals - Array of AbortSignals to combine (undefined values are ignored)
682
+ * @returns A new AbortController that aborts when any source signal aborts
683
+ *
684
+ * @example
685
+ * User cancellation + timeout:
686
+ * ```typescript
687
+ * const userController = new AbortController();
688
+ * const timeout = manager.createTimeoutSignal(30000);
689
+ *
690
+ * const combined = manager.createCombinedSignal([
691
+ * userController.signal,
692
+ * timeout.signal
693
+ * ]);
694
+ *
695
+ * // Request will be cancelled after 30s OR when user clicks cancel
696
+ * fetch('/api/data', { signal: combined.signal });
697
+ * ```
698
+ *
699
+ * @example
700
+ * React component with cleanup:
701
+ * ```typescript
702
+ * useEffect(() => {
703
+ * const controller = new AbortController();
704
+ *
705
+ * const combined = manager.createCombinedSignal([
706
+ * controller.signal,
707
+ * unmountSignal // From component lifecycle
708
+ * ]);
709
+ *
710
+ * fetchData(combined.signal);
711
+ *
712
+ * return () => controller.abort(); // Cleanup
713
+ * }, []);
714
+ * ```
715
+ */
716
+ createCombinedSignal(signals) {
717
+ const controller = new AbortController();
718
+ for (const signal of signals) {
719
+ if (signal) {
720
+ if (signal.aborted) {
721
+ controller.abort(signal.reason);
722
+ break;
723
+ }
724
+ signal.addEventListener(
725
+ "abort",
726
+ () => {
727
+ controller.abort(signal.reason);
728
+ },
729
+ { once: true }
730
+ );
731
+ }
732
+ }
733
+ return controller;
734
+ }
735
+ /**
736
+ * Creates an AbortController that automatically aborts after a specified timeout.
737
+ *
738
+ * This method creates a time-based cancellation mechanism useful for implementing
739
+ * request timeouts and deadlines. The signal will automatically abort after the
740
+ * specified duration, providing a consistent timeout experience.
741
+ *
742
+ * **Automatic Cleanup:**
743
+ * If the signal is aborted by other means before the timeout expires, the internal
744
+ * setTimeout is automatically cleared to prevent memory leaks.
745
+ *
746
+ * **Abort Reason:**
747
+ * The abort reason includes the timeout duration for debugging purposes:
748
+ * `"Request timeout after {timeout}ms"`
749
+ *
750
+ * @param timeout - Timeout duration in milliseconds
751
+ * @returns An AbortController that will abort after the timeout
752
+ *
753
+ * @example
754
+ * Simple request timeout:
755
+ * ```typescript
756
+ * const manager = new SignalManager();
757
+ * const timeout = manager.createTimeoutSignal(5000); // 5 seconds
758
+ *
759
+ * try {
760
+ * const response = await fetch('/api/slow-endpoint', {
761
+ * signal: timeout.signal
762
+ * });
763
+ * const data = await response.json();
764
+ * } catch (error) {
765
+ * if (error.name === 'AbortError') {
766
+ * console.error('Request timed out after 5 seconds');
767
+ * }
768
+ * }
769
+ * ```
770
+ *
771
+ * @example
772
+ * Different timeouts for different operations:
773
+ * ```typescript
774
+ * // Short timeout for quick operations
775
+ * const quickTimeout = manager.createTimeoutSignal(2000);
776
+ * await fetch('/api/health', { signal: quickTimeout.signal });
777
+ *
778
+ * // Long timeout for heavy operations
779
+ * const longTimeout = manager.createTimeoutSignal(60000);
780
+ * await fetch('/api/export', { signal: longTimeout.signal });
781
+ * ```
782
+ *
783
+ * @example
784
+ * Manual cancellation before timeout:
785
+ * ```typescript
786
+ * const timeout = manager.createTimeoutSignal(30000);
787
+ *
788
+ * // If user cancels, timeout is automatically cleaned up
789
+ * timeout.abort('User cancelled');
790
+ * // Internal setTimeout is cleared, no memory leak
791
+ * ```
792
+ */
793
+ createTimeoutSignal(timeout) {
794
+ const controller = new AbortController();
795
+ const timeoutId = setTimeout(() => {
796
+ controller.abort(`Request timeout after ${timeout}ms`);
797
+ }, timeout);
798
+ controller.signal.addEventListener(
799
+ "abort",
800
+ () => {
801
+ clearTimeout(timeoutId);
802
+ },
803
+ { once: true }
804
+ );
805
+ return controller;
806
+ }
807
+ };
808
+
809
+ // src/core/api/Utils/ResponseParser.ts
810
+ var ResponseParser = class {
811
+ /**
812
+ * Parses the HTTP response body into an appropriate JavaScript type.
813
+ *
814
+ * The parsing strategy is determined by the Content-Type header:
815
+ * 1. **JSON** (application/json): Calls `response.json()`
816
+ * 2. **Text** (text/*): Calls `response.text()`
817
+ * 3. **Binary** (application/octet-stream): Calls `response.blob()`
818
+ * 4. **Unknown**: Reads as text, attempts JSON parse, falls back to raw text
819
+ *
820
+ * **Fallback Behavior:**
821
+ * For responses without a Content-Type header or with unknown types, the parser
822
+ * attempts to parse as JSON first (common for APIs that don't set proper headers).
823
+ * If JSON parsing fails, it returns the raw text.
824
+ *
825
+ * @param response - The Fetch API Response object to parse
826
+ * @returns Promise resolving to the parsed response data
827
+ * @returns Can be: JSON object/array, string, or Blob depending on Content-Type
828
+ *
829
+ * @example
830
+ * API response parsing:
831
+ * ```typescript
832
+ * const response = await fetch('/api/users');
833
+ * const data = await parser.parseResponse(response);
834
+ *
835
+ * if (typeof data === 'string') {
836
+ * console.log('Text response:', data);
837
+ * } else if (data instanceof Blob) {
838
+ * console.log('Binary response:', data.size, 'bytes');
839
+ * } else {
840
+ * console.log('JSON response:', data);
841
+ * }
842
+ * ```
843
+ *
844
+ * @example
845
+ * Handling different content types:
846
+ * ```typescript
847
+ * // CSV file download
848
+ * const csvResponse = await fetch('/api/export.csv');
849
+ * const blob = await parser.parseResponse(csvResponse);
850
+ * // Returns Blob for download
851
+ *
852
+ * // JSON API
853
+ * const jsonResponse = await fetch('/api/users');
854
+ * const users = await parser.parseResponse(jsonResponse);
855
+ * // Returns parsed JSON array
856
+ *
857
+ * // Plain text logs
858
+ * const logResponse = await fetch('/api/logs');
859
+ * const logs = await parser.parseResponse(logResponse);
860
+ * // Returns string
861
+ * ```
862
+ */
863
+ async parseResponse(response) {
864
+ const contentType = response.headers.get("content-type");
865
+ if (_optionalChain([contentType, 'optionalAccess', _9 => _9.includes, 'call', _10 => _10("application/json")])) {
866
+ return response.json();
867
+ } else if (_optionalChain([contentType, 'optionalAccess', _11 => _11.includes, 'call', _12 => _12("text/")])) {
868
+ return response.text();
869
+ } else if (_optionalChain([contentType, 'optionalAccess', _13 => _13.includes, 'call', _14 => _14("application/octet-stream")])) {
870
+ return response.blob();
871
+ } else {
872
+ const text = await response.text();
873
+ try {
874
+ return JSON.parse(text);
875
+ } catch (e2) {
876
+ return text;
877
+ }
878
+ }
879
+ }
880
+ };
881
+
882
+ // src/core/api/Utils/UrlBuilder.ts
883
+ var UrlBuilder = class {
884
+ /**
885
+ * Builds a complete URL by combining base URL, endpoint, and query parameters.
886
+ *
887
+ * The URL construction process:
888
+ * 1. Combines `baseURL` and `endpoint` using URL API
889
+ * 2. Iterates through query parameters
890
+ * 3. Skips null/undefined values
891
+ * 4. Handles arrays by appending multiple values with same key
892
+ * 5. Converts all values to strings
893
+ * 6. Returns fully-qualified URL string
894
+ *
895
+ * **Path Handling:**
896
+ * The endpoint can be either relative or absolute:
897
+ * - Relative: `/users` → Combined with baseURL
898
+ * - Absolute: `https://other-api.com/users` → Uses absolute URL
899
+ *
900
+ * **Encoding:**
901
+ * All parameter values are automatically URL-encoded by the URL API,
902
+ * so special characters (spaces, &, =, etc.) are safely handled.
903
+ *
904
+ * @param baseURL - Base URL for the API (e.g., 'https://api.example.com')
905
+ * @param endpoint - API endpoint path relative to baseURL (e.g., '/users/123')
906
+ * @param params - Optional query parameters as key-value pairs
907
+ * @returns The fully-qualified URL string with encoded query parameters
908
+ *
909
+ * @example
910
+ * Basic URL construction:
911
+ * ```typescript
912
+ * const url = builder.buildURL(
913
+ * 'https://api.example.com',
914
+ * '/search',
915
+ * { q: 'hello world', limit: 10 }
916
+ * );
917
+ * // => "https://api.example.com/search?q=hello+world&limit=10"
918
+ * ```
919
+ *
920
+ * @example
921
+ * Array parameters:
922
+ * ```typescript
923
+ * const url = builder.buildURL(
924
+ * 'https://api.example.com',
925
+ * '/posts',
926
+ * { tags: ['javascript', 'typescript', 'react'] }
927
+ * );
928
+ * // => "https://api.example.com/posts?tags=javascript&tags=typescript&tags=react"
929
+ * ```
930
+ *
931
+ * @example
932
+ * Null/undefined handling:
933
+ * ```typescript
934
+ * const url = builder.buildURL(
935
+ * 'https://api.example.com',
936
+ * '/users',
937
+ * {
938
+ * name: 'John',
939
+ * age: null, // Skipped
940
+ * email: undefined // Skipped
941
+ * }
942
+ * );
943
+ * // => "https://api.example.com/users?name=John"
944
+ * ```
945
+ *
946
+ * @example
947
+ * Special characters encoding:
948
+ * ```typescript
949
+ * const url = builder.buildURL(
950
+ * 'https://api.example.com',
951
+ * '/search',
952
+ * { q: 'foo & bar', category: 'code/examples' }
953
+ * );
954
+ * // => "https://api.example.com/search?q=foo+%26+bar&category=code%2Fexamples"
955
+ * ```
956
+ */
957
+ buildURL(baseURL, endpoint, params) {
958
+ const url = new URL(endpoint, baseURL);
959
+ if (params) {
960
+ Object.keys(params).forEach((key) => {
961
+ const value = params[key];
962
+ if (value !== void 0 && value !== null) {
963
+ if (Array.isArray(value)) {
964
+ value.forEach((v) => url.searchParams.append(key, String(v)));
965
+ } else {
966
+ url.searchParams.append(key, String(value));
967
+ }
968
+ }
969
+ });
970
+ }
971
+ return url.toString();
972
+ }
973
+ };
974
+
975
+ // src/core/api/ApiClient.ts
976
+ var ApiClient = (_class3 = class {
977
+
978
+
979
+ __init6() {this.interceptorManager = new InterceptorManager()}
980
+ __init7() {this.signalManager = new SignalManager()}
981
+ __init8() {this.errorNormalizer = new ErrorNormalizer()}
982
+ __init9() {this.responseParser = new ResponseParser()}
983
+ __init10() {this.urlBuilder = new UrlBuilder()}
984
+ __init11() {this.retryHandler = new RetryHandler()}
985
+ __init12() {this.requestManager = new RequestManager()}
986
+ __init13() {this.authToken = null}
987
+ __init14() {this.correlationIdPrefix = "api"}
988
+ __init15() {this.includeCorrelationId = true}
989
+ /**
990
+ * Creates a new API client instance
991
+ * @param baseURL - Base URL for all API requests (default: empty string for relative URLs)
992
+ * @param defaultTimeout - Default request timeout in milliseconds (default: 30000)
993
+ */
994
+ constructor(baseURL = "", defaultTimeout = 3e4) {;_class3.prototype.__init6.call(this);_class3.prototype.__init7.call(this);_class3.prototype.__init8.call(this);_class3.prototype.__init9.call(this);_class3.prototype.__init10.call(this);_class3.prototype.__init11.call(this);_class3.prototype.__init12.call(this);_class3.prototype.__init13.call(this);_class3.prototype.__init14.call(this);_class3.prototype.__init15.call(this);
995
+ this.baseURL = baseURL;
996
+ this.defaultTimeout = defaultTimeout;
997
+ }
998
+ /**
999
+ * Sets the prefix for auto-generated correlation IDs
1000
+ * @param prefix - The prefix to use for correlation IDs (e.g., 'api', 'web', 'mobile')
1001
+ */
1002
+ setCorrelationIdPrefix(prefix) {
1003
+ this.correlationIdPrefix = prefix;
1004
+ }
1005
+ /**
1006
+ * Enables or disables automatic correlation ID generation
1007
+ * @param include - Whether to include correlation IDs in requests
1008
+ */
1009
+ setIncludeCorrelationId(include) {
1010
+ this.includeCorrelationId = include;
1011
+ }
1012
+ /**
1013
+ * Registers a request interceptor to modify requests before they're sent
1014
+ * @param interceptor - Function to intercept and potentially modify request config
1015
+ * @returns Function to unregister this interceptor
1016
+ *
1017
+ * @example
1018
+ * ```typescript
1019
+ * const unregister = client.addRequestInterceptor(async (config) => {
1020
+ * config.headers = config.headers || new Headers();
1021
+ * config.headers.set('X-Client-Version', '1.0.0');
1022
+ * return config;
1023
+ * });
1024
+ *
1025
+ * // Later, to remove the interceptor:
1026
+ * unregister();
1027
+ * ```
1028
+ */
1029
+ addRequestInterceptor(interceptor) {
1030
+ return this.interceptorManager.addRequestInterceptor(interceptor);
1031
+ }
1032
+ /**
1033
+ * Registers a response interceptor to modify responses before they're returned
1034
+ * @param interceptor - Function to intercept and potentially modify responses
1035
+ * @returns Function to unregister this interceptor
1036
+ *
1037
+ * @example
1038
+ * ```typescript
1039
+ * client.addResponseInterceptor(async (response) => {
1040
+ * // Transform data format
1041
+ * if (response.apiData) {
1042
+ * response.apiData = camelCaseKeys(response.apiData);
1043
+ * }
1044
+ * return response;
1045
+ * });
1046
+ * ```
1047
+ */
1048
+ addResponseInterceptor(interceptor) {
1049
+ return this.interceptorManager.addResponseInterceptor(interceptor);
1050
+ }
1051
+ /**
1052
+ * Registers an error interceptor to handle or transform errors
1053
+ * @param interceptor - Function to intercept and potentially modify errors
1054
+ * @returns Function to unregister this interceptor
1055
+ *
1056
+ * @example
1057
+ * ```typescript
1058
+ * client.addErrorInterceptor(async (error) => {
1059
+ * // Log errors to monitoring service
1060
+ * if (error.status >= 500) {
1061
+ * await monitoringService.logError(error);
1062
+ * }
1063
+ * return error; // Re-throw the error
1064
+ * });
1065
+ * ```
1066
+ */
1067
+ addErrorInterceptor(interceptor) {
1068
+ return this.interceptorManager.addErrorInterceptor(interceptor);
1069
+ }
1070
+ /**
1071
+ * Sets the authentication token for subsequent requests
1072
+ * @param token - JWT token or null to clear authentication
1073
+ *
1074
+ * @example
1075
+ * ```typescript
1076
+ * // Set token after login
1077
+ * client.setAuthToken(loginResponse.accessToken);
1078
+ *
1079
+ * // Clear token on logout
1080
+ * client.setAuthToken(null);
1081
+ * ```
1082
+ */
1083
+ setAuthToken(token) {
1084
+ this.authToken = token;
1085
+ }
1086
+ /**
1087
+ * Retrieves the current authentication token
1088
+ * @returns The current auth token or null if not set
1089
+ */
1090
+ getAuthToken() {
1091
+ return this.authToken;
1092
+ }
1093
+ /**
1094
+ * Cancels a specific request by its key
1095
+ * @param key - The unique key identifying the request to cancel
1096
+ */
1097
+ cancelRequest(key) {
1098
+ this.requestManager.cancel(key);
1099
+ }
1100
+ /**
1101
+ * Cancels all pending requests
1102
+ * Useful for cleanup on navigation or component unmount
1103
+ */
1104
+ cancelAllRequests() {
1105
+ this.requestManager.cancelAll();
1106
+ }
1107
+ /**
1108
+ * Core request method that handles all HTTP operations
1109
+ * @template T - The expected response data type
1110
+ * @param endpoint - API endpoint relative to baseURL
1111
+ * @param config - Request configuration options
1112
+ * @returns Promise resolving to ApiResponse with data or error
1113
+ *
1114
+ * @example
1115
+ * ```typescript
1116
+ * const response = await client.request<User>('/users/123', {
1117
+ * method: 'GET',
1118
+ * timeout: 5000,
1119
+ * throwErrors: false
1120
+ * });
1121
+ * ```
1122
+ */
1123
+ async request(endpoint, config = {}) {
1124
+ const correlationId = config.correlationId || (!config.skipCorrelationId && this.includeCorrelationId ? generateCorrelationId(this.correlationIdPrefix) : void 0);
1125
+ const requestKey = `${config.method || "GET"}_${endpoint}_${Date.now()}`;
1126
+ const masterController = new AbortController();
1127
+ try {
1128
+ const signals = [
1129
+ config.signal,
1130
+ _optionalChain([config, 'access', _15 => _15.cancelToken, 'optionalAccess', _16 => _16.signal]),
1131
+ masterController.signal
1132
+ ];
1133
+ const timeout = config.timeout || this.defaultTimeout;
1134
+ const timeoutController = this.signalManager.createTimeoutSignal(timeout);
1135
+ signals.push(timeoutController.signal);
1136
+ const combinedController = this.signalManager.createCombinedSignal(signals);
1137
+ if (correlationId) {
1138
+ this.requestManager.add(requestKey, masterController, correlationId);
1139
+ }
1140
+ const finalConfig = await this.interceptorManager.applyRequestInterceptors({
1141
+ ...config,
1142
+ signal: combinedController.signal,
1143
+ correlationId
1144
+ });
1145
+ const url = this.urlBuilder.buildURL(
1146
+ this.baseURL,
1147
+ endpoint,
1148
+ finalConfig.params
1149
+ );
1150
+ const headers = new Headers(finalConfig.headers);
1151
+ if (correlationId) {
1152
+ headers.set("X-Correlation-Id", correlationId);
1153
+ headers.set("X-Request-Id", correlationId);
1154
+ }
1155
+ if (this.authToken && !finalConfig.skipAuthRefresh) {
1156
+ headers.set("Authorization", `Bearer ${this.authToken}`);
1157
+ }
1158
+ let fetchBody = finalConfig.body;
1159
+ if (finalConfig.body && typeof finalConfig.body === "object" && !(finalConfig.body instanceof FormData) && !(finalConfig.body instanceof Blob) && !(finalConfig.body instanceof ArrayBuffer) && !(finalConfig.body instanceof URLSearchParams) && !(finalConfig.body instanceof ReadableStream)) {
1160
+ headers.set("Content-Type", "application/json");
1161
+ fetchBody = JSON.stringify(finalConfig.body);
1162
+ }
1163
+ finalConfig.headers = headers;
1164
+ const fetchPromise = async () => {
1165
+ try {
1166
+ const response = await fetch(url, {
1167
+ ...finalConfig,
1168
+ body: fetchBody,
1169
+ signal: combinedController.signal
1170
+ });
1171
+ const responseData = await this.responseParser.parseResponse(response);
1172
+ if (!response.ok) {
1173
+ const errorData = responseData;
1174
+ const error = Object.assign(
1175
+ new Error(
1176
+ errorData.title || `HTTP ${response.status}: ${response.statusText}`
1177
+ ),
1178
+ {
1179
+ type: errorData.type || this.errorNormalizer.getErrorType(response.status),
1180
+ title: errorData.title || this.errorNormalizer.getErrorTitle(response.status),
1181
+ status: response.status,
1182
+ traceId: errorData.traceId || correlationId,
1183
+ errors: errorData.errors,
1184
+ isAborted: false,
1185
+ config: finalConfig
1186
+ }
1187
+ );
1188
+ if (finalConfig.throwErrors !== false) {
1189
+ throw error;
1190
+ } else {
1191
+ return await this.interceptorManager.applyResponseInterceptors({
1192
+ error
1193
+ });
1194
+ }
1195
+ }
1196
+ const apiResponse = {
1197
+ data: responseData
1198
+ };
1199
+ return await this.interceptorManager.applyResponseInterceptors(
1200
+ apiResponse
1201
+ );
1202
+ } catch (error) {
1203
+ if (error.name === "AbortError") {
1204
+ const abortError = Object.assign(
1205
+ new Error(error.message || "Request aborted"),
1206
+ {
1207
+ type: "request_cancelled",
1208
+ title: "Request was cancelled",
1209
+ status: 0,
1210
+ traceId: correlationId,
1211
+ isAborted: true,
1212
+ config: finalConfig
1213
+ }
1214
+ );
1215
+ if (finalConfig.throwErrors !== false) {
1216
+ throw abortError;
1217
+ } else {
1218
+ return await this.interceptorManager.applyResponseInterceptors({
1219
+ error: abortError
1220
+ });
1221
+ }
1222
+ }
1223
+ throw error;
1224
+ }
1225
+ };
1226
+ if (finalConfig.retries && finalConfig.retries > 0) {
1227
+ return await this.retryHandler.retryRequest(
1228
+ fetchPromise,
1229
+ finalConfig.retries,
1230
+ finalConfig.retryDelay || 1e3,
1231
+ combinedController.signal
1232
+ );
1233
+ }
1234
+ return await fetchPromise();
1235
+ } catch (error) {
1236
+ const apiError = this.errorNormalizer.normalizeError(
1237
+ error,
1238
+ config,
1239
+ correlationId
1240
+ );
1241
+ if (config.throwErrors !== false) {
1242
+ await this.interceptorManager.applyErrorInterceptors(apiError);
1243
+ throw apiError;
1244
+ } else {
1245
+ return {
1246
+ error: apiError
1247
+ };
1248
+ }
1249
+ } finally {
1250
+ this.requestManager.remove(requestKey);
1251
+ }
1252
+ }
1253
+ /**
1254
+ * Performs a GET request
1255
+ * @template T - The expected response data type
1256
+ * @param endpoint - API endpoint
1257
+ * @param config - Optional request configuration
1258
+ * @returns Promise resolving to ApiResponse
1259
+ *
1260
+ * @example
1261
+ * ```typescript
1262
+ * const { apiData, error } = await client.get<User[]>('/users', {
1263
+ * params: { active: true },
1264
+ * timeout: 5000
1265
+ * });
1266
+ * ```
1267
+ */
1268
+ get(endpoint, config) {
1269
+ return this.request(endpoint, { ...config, method: "GET" });
1270
+ }
1271
+ /**
1272
+ * Performs a POST request
1273
+ * @template T - The expected response data type
1274
+ * @template TData - The request body data type
1275
+ * @param endpoint - API endpoint
1276
+ * @param data - Request body data
1277
+ * @param config - Optional request configuration
1278
+ * @returns Promise resolving to ApiResponse
1279
+ *
1280
+ * @example
1281
+ * ```typescript
1282
+ * const { apiData, error } = await client.post<User, CreateUserDto>('/users', {
1283
+ * name: 'John Doe',
1284
+ * email: 'john@example.com'
1285
+ * });
1286
+ * ```
1287
+ */
1288
+ post(endpoint, data, config) {
1289
+ return this.request(endpoint, { ...config, method: "POST", body: data });
1290
+ }
1291
+ /**
1292
+ * Performs a PUT request
1293
+ * @template T - The expected response data type
1294
+ * @template TData - The request body data type
1295
+ * @param endpoint - API endpoint
1296
+ * @param data - Request body data
1297
+ * @param config - Optional request configuration
1298
+ * @returns Promise resolving to ApiResponse
1299
+ *
1300
+ * @example
1301
+ * ```typescript
1302
+ * const { apiData, error } = await client.put<User, UpdateUserDto>(
1303
+ * '/users/123',
1304
+ * { name: 'Jane Doe' }
1305
+ * );
1306
+ * ```
1307
+ */
1308
+ put(endpoint, data, config) {
1309
+ return this.request(endpoint, { ...config, method: "PUT", body: data });
1310
+ }
1311
+ /**
1312
+ * Performs a PATCH request
1313
+ * @template T - The expected response data type
1314
+ * @template TData - The request body data type
1315
+ * @param endpoint - API endpoint
1316
+ * @param data - Request body data
1317
+ * @param config - Optional request configuration
1318
+ * @returns Promise resolving to ApiResponse
1319
+ *
1320
+ * @example
1321
+ * ```typescript
1322
+ * const { apiData, error } = await client.patch<User>(
1323
+ * '/users/123',
1324
+ * { status: 'active' }
1325
+ * );
1326
+ * ```
1327
+ */
1328
+ patch(endpoint, data, config) {
1329
+ return this.request(endpoint, {
1330
+ ...config,
1331
+ method: "PATCH",
1332
+ body: data
1333
+ });
1334
+ }
1335
+ /**
1336
+ * Performs a DELETE request
1337
+ * @template T - The expected response data type
1338
+ * @param endpoint - API endpoint
1339
+ * @param config - Optional request configuration
1340
+ * @returns Promise resolving to ApiResponse
1341
+ *
1342
+ * @example
1343
+ * ```typescript
1344
+ * const { error } = await client.delete('/users/123');
1345
+ * if (!error) {
1346
+ * console.log('User deleted successfully');
1347
+ * }
1348
+ * ```
1349
+ */
1350
+ delete(endpoint, config) {
1351
+ return this.request(endpoint, { ...config, method: "DELETE" });
1352
+ }
1353
+ /**
1354
+ * Performs a filtered list request with pagination and sorting
1355
+ * @template TListModel - The type of individual list items
1356
+ * @template TFilter - The filter criteria type
1357
+ * @param url - API endpoint
1358
+ * @param data - Pagination and filter data
1359
+ * @param config - Optional request configuration
1360
+ * @returns Promise resolving to paginated list response
1361
+ *
1362
+ * @example
1363
+ * ```typescript
1364
+ * const { apiData, error } = await client.filter<User, UserFilter>(
1365
+ * '/users/filter',
1366
+ * {
1367
+ * pageOffset: 0,
1368
+ * pageSize: 20,
1369
+ * sortField: 'createdAt',
1370
+ * sortOrder: 'desc',
1371
+ * filterModel: { status: 'active' }
1372
+ * }
1373
+ * );
1374
+ *
1375
+ * if (apiData) {
1376
+ * console.log(`Found ${apiData.Total} users`);
1377
+ * console.log('Users:', apiData.Data);
1378
+ * }
1379
+ * ```
1380
+ */
1381
+ filter(url, data, config) {
1382
+ const mergedData = { ...data, ...data.filterModel };
1383
+ return this.request(url, {
1384
+ ...config,
1385
+ method: "POST",
1386
+ body: mergedData
1387
+ });
1388
+ }
1389
+ }, _class3);
1390
+
1391
+ // src/core/api/createApiClient.ts
1392
+ var globalApiClient = null;
1393
+ function createApiClient(config = {}) {
1394
+ const {
1395
+ baseURL = "",
1396
+ timeout = 3e4,
1397
+ correlationIdPrefix = "web",
1398
+ includeCorrelationId = true,
1399
+ requestInterceptors = [],
1400
+ responseInterceptors = [],
1401
+ errorInterceptors = []
1402
+ } = config;
1403
+ const client = new ApiClient(baseURL, timeout);
1404
+ client.addRequestInterceptor((config2) => {
1405
+ const token = localStorage.getItem("serviceToken");
1406
+ if (token && !config2.skipAuthRefresh) {
1407
+ config2.headers = {
1408
+ ...config2.headers,
1409
+ Authorization: `Bearer ${token}`
1410
+ };
1411
+ }
1412
+ return config2;
1413
+ });
1414
+ client.setCorrelationIdPrefix(correlationIdPrefix);
1415
+ client.setIncludeCorrelationId(includeCorrelationId);
1416
+ requestInterceptors.forEach((interceptor) => {
1417
+ client.addRequestInterceptor(interceptor);
1418
+ });
1419
+ responseInterceptors.forEach((interceptor) => {
1420
+ client.addResponseInterceptor(interceptor);
1421
+ });
1422
+ errorInterceptors.forEach((interceptor) => {
1423
+ client.addErrorInterceptor(interceptor);
1424
+ });
1425
+ return client;
1426
+ }
1427
+ function getGlobalApiClient(config) {
1428
+ if (!globalApiClient) {
1429
+ globalApiClient = createApiClient(config);
1430
+ }
1431
+ return globalApiClient;
1432
+ }
1433
+ function setGlobalApiClient(client) {
1434
+ globalApiClient = client;
1435
+ }
1436
+ function resetGlobalApiClient() {
1437
+ globalApiClient = null;
1438
+ }
1439
+
1440
+ // src/core/api/types/CancelToken.ts
1441
+ var CancelToken = class _CancelToken {
1442
+
1443
+
1444
+
1445
+ constructor() {
1446
+ this.abortController = new AbortController();
1447
+ this.cancelPromise = new Promise((resolve) => {
1448
+ this.cancelResolve = resolve;
1449
+ });
1450
+ }
1451
+ get signal() {
1452
+ return this.abortController.signal;
1453
+ }
1454
+ cancel(reason) {
1455
+ this.abortController.abort(reason);
1456
+ _optionalChain([this, 'access', _17 => _17.cancelResolve, 'optionalCall', _18 => _18()]);
1457
+ }
1458
+ get isCancelled() {
1459
+ return this.abortController.signal.aborted;
1460
+ }
1461
+ throwIfCancelled() {
1462
+ if (this.isCancelled) {
1463
+ throw new Error("Request cancelled");
1464
+ }
1465
+ }
1466
+ static source() {
1467
+ const token = new _CancelToken();
1468
+ return {
1469
+ token,
1470
+ cancel: (reason) => token.cancel(reason)
1471
+ };
1472
+ }
1473
+ };
1474
+
1475
+ // src/core/api/useValidationErrors.ts
1476
+ var _react = require('react');
1477
+ function useValidationErrors(error) {
1478
+ const getFieldError = _react.useCallback.call(void 0,
1479
+ (field) => {
1480
+ if (!_optionalChain([error, 'optionalAccess', _19 => _19.errors]) || !error.errors[field]) return null;
1481
+ const fieldError = error.errors[field];
1482
+ if (typeof fieldError === "string") return fieldError;
1483
+ if (Array.isArray(fieldError)) return fieldError[0];
1484
+ if (typeof fieldError === "object" && "message" in fieldError) {
1485
+ return fieldError.message;
1486
+ }
1487
+ return null;
1488
+ },
1489
+ [error]
1490
+ );
1491
+ const hasFieldError = _react.useCallback.call(void 0,
1492
+ (field) => {
1493
+ return !!getFieldError(field);
1494
+ },
1495
+ [getFieldError]
1496
+ );
1497
+ const getAllErrors = _react.useCallback.call(void 0, () => {
1498
+ if (!_optionalChain([error, 'optionalAccess', _20 => _20.errors])) return {};
1499
+ const result = {};
1500
+ Object.entries(error.errors).forEach(([key, value]) => {
1501
+ if (typeof value === "string") {
1502
+ result[key] = value;
1503
+ } else if (Array.isArray(value)) {
1504
+ result[key] = value.join(", ");
1505
+ } else if (typeof value === "object" && value && "message" in value) {
1506
+ result[key] = value.message;
1507
+ }
1508
+ });
1509
+ return result;
1510
+ }, [error]);
1511
+ return {
1512
+ getFieldError,
1513
+ hasFieldError,
1514
+ getAllErrors,
1515
+ hasErrors: _optionalChain([error, 'optionalAccess', _21 => _21.errors])
1516
+ };
1517
+ }
1518
+
1519
+ // src/core/components/AuthorizedView/AuthorizedView.tsx
1520
+ var _jsxruntime = require('react/jsx-runtime');
1521
+ var AuthorizedView = ({ children, show }) => {
1522
+ if (!show) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, {});
1523
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children });
1524
+ };
1525
+
1526
+ // src/core/components/CancelButton/CancelButton.tsx
1527
+ var _material = require('@mui/material');
1528
+
1529
+ var CancelButton = ({
1530
+ children = "Cancel",
1531
+ variant = "outlined",
1532
+ sx,
1533
+ ...rest
1534
+ }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Button, { variant, sx: { width: "6rem", ...sx }, ...rest, children });
1535
+
1536
+ // src/core/components/ClearButton/ClearButton.tsx
1537
+
1538
+
1539
+ var ClearButton = ({
1540
+ isSubmitting,
1541
+ handleClear,
1542
+ sx,
1543
+ storeKey
1544
+ }) => {
1545
+ const onClick = () => {
1546
+ handleClear();
1547
+ if (storeKey != null) {
1548
+ localStorage.removeItem(storeKey);
1549
+ }
1550
+ };
1551
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1552
+ _material.Button,
1553
+ {
1554
+ variant: "outlined",
1555
+ onClick,
1556
+ disabled: isSubmitting,
1557
+ sx,
1558
+ children: "Clear"
1559
+ }
1560
+ );
1561
+ };
1562
+
1563
+ // src/core/components/Containers/SimpleContainer.tsx
1564
+
1565
+
1566
+ var SimpleContainer = ({
1567
+ children,
1568
+ className,
1569
+ sx
1570
+ }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Container, { className, sx: { ...sx }, children });
1571
+
1572
+ // src/core/components/FilterButton/FilterButton.tsx
1573
+ var _FilterAlt = require('@mui/icons-material/FilterAlt'); var _FilterAlt2 = _interopRequireDefault(_FilterAlt);
1574
+ var _lab = require('@mui/lab');
1575
+
1576
+
1577
+ var FilterButton = ({
1578
+ isSubmitting,
1579
+ show,
1580
+ title,
1581
+ icon,
1582
+ sx,
1583
+ iconSx
1584
+ }) => {
1585
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1586
+ _lab.LoadingButton,
1587
+ {
1588
+ type: "submit",
1589
+ variant: "contained",
1590
+ loading: isSubmitting,
1591
+ disabled: !show,
1592
+ disableRipple: true,
1593
+ color: "primary",
1594
+ sx: {
1595
+ display: "flex",
1596
+ alignItems: "center",
1597
+ ...sx
1598
+ },
1599
+ startIcon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Badge, { color: "error", variant: "standard", children: icon ? icon : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _FilterAlt2.default, { width: "20", height: "20", sx: iconSx }) }),
1600
+ children: _optionalChain([title, 'optionalAccess', _22 => _22.trim, 'call', _23 => _23()]) === "" || !title ? "Filter" : title
1601
+ }
1602
+ );
1603
+ };
1604
+
1605
+ // src/core/components/FilterDisplay/FilterChip.tsx
1606
+ var _Chip = require('@mui/material/Chip'); var _Chip2 = _interopRequireDefault(_Chip);
1607
+
1608
+
1609
+ var FilterChip = _react.memo.call(void 0,
1610
+ ({
1611
+ fieldKey,
1612
+ filter,
1613
+ onDelete
1614
+ }) => {
1615
+ const hasValue = filter.Value !== null && filter.Value !== void 0 && filter.Value !== "";
1616
+ const label = `${fieldKey.replace("PK", "")}: ${filter.Label}`;
1617
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1618
+ _Chip2.default,
1619
+ {
1620
+ label,
1621
+ variant: hasValue ? "filled" : "outlined",
1622
+ size: "small",
1623
+ onDelete: hasValue ? onDelete : void 0
1624
+ },
1625
+ fieldKey
1626
+ );
1627
+ }
1628
+ );
1629
+ FilterChip.displayName = "FilterChip";
1630
+
1631
+ // src/core/components/FilterDisplay/FilterDisplay.tsx
1632
+
1633
+
1634
+
1635
+ var ProgramsFilterDisplay = _react.memo.call(void 0,
1636
+ (props) => {
1637
+ const { friendlyFilter, onFriendlyFilterChange } = props;
1638
+ const deleteHandlers = _react.useMemo.call(void 0, () => {
1639
+ if (!onFriendlyFilterChange) return {};
1640
+ const handlers = {};
1641
+ for (const key of Object.keys(friendlyFilter)) {
1642
+ handlers[key] = () => onFriendlyFilterChange(key);
1643
+ }
1644
+ return handlers;
1645
+ }, [onFriendlyFilterChange, friendlyFilter]);
1646
+ const chipList = _react.useMemo.call(void 0, () => {
1647
+ return Object.entries(friendlyFilter).map(([key, filter]) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1648
+ FilterChip,
1649
+ {
1650
+ fieldKey: key,
1651
+ filter,
1652
+ onDelete: deleteHandlers[key]
1653
+ },
1654
+ key
1655
+ ));
1656
+ }, [friendlyFilter, deleteHandlers]);
1657
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Card, { sx: { mb: 2 }, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.CardContent, { children: [
1658
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "h6", gutterBottom: true, children: "Active Filters" }),
1659
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Box, { display: "flex", gap: 1, flexWrap: "wrap", children: chipList })
1660
+ ] }) });
1661
+ }
1662
+ );
1663
+ ProgramsFilterDisplay.displayName = "FilterDisplay";
1664
+
1665
+ // src/core/components/FilterWrapper/FilterWrapper.tsx
1666
+ var _ManageSearch = require('@mui/icons-material/ManageSearch'); var _ManageSearch2 = _interopRequireDefault(_ManageSearch);
1667
+
1668
+
1669
+
1670
+
1671
+
1672
+
1673
+
1674
+
1675
+
1676
+
1677
+
1678
+ var FilterWrapper = ({
1679
+ children,
1680
+ title,
1681
+ filterCount,
1682
+ cardSx,
1683
+ textSx,
1684
+ icon,
1685
+ iconSx,
1686
+ showCount
1687
+ }) => {
1688
+ const theme = _material.useTheme.call(void 0, );
1689
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1690
+ _material.Card,
1691
+ {
1692
+ sx: {
1693
+ position: "relative",
1694
+ borderRadius: "0px",
1695
+ mb: 2,
1696
+ ...cardSx
1697
+ },
1698
+ children: [
1699
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1700
+ _material.CardHeader,
1701
+ {
1702
+ sx: {
1703
+ display: "flex",
1704
+ flexWrap: "wrap",
1705
+ p: "1rem",
1706
+ ".MuiCardHeader-action": {
1707
+ margin: 0,
1708
+ alignSelf: "center"
1709
+ },
1710
+ alignItems: "center"
1711
+ },
1712
+ title: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Box, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: [
1713
+ icon ? icon : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1714
+ _ManageSearch2.default,
1715
+ {
1716
+ sx: {
1717
+ height: "2.5rem",
1718
+ color: theme.palette.primary.main,
1719
+ ...iconSx
1720
+ }
1721
+ }
1722
+ ),
1723
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1724
+ _material.Typography,
1725
+ {
1726
+ variant: "h5",
1727
+ sx: {
1728
+ fontWeight: "bold",
1729
+ color: theme.palette.primary.main,
1730
+ ...textSx
1731
+ },
1732
+ children: [
1733
+ title ? title : "Filter",
1734
+ " ",
1735
+ showCount ? `(${filterCount ? filterCount : 0})` : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, {})
1736
+ ]
1737
+ }
1738
+ )
1739
+ ] })
1740
+ }
1741
+ ),
1742
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Divider, {}),
1743
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CardContent, { sx: { py: 2 }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { container: true, spacing: 2, children }) })
1744
+ ]
1745
+ }
1746
+ );
1747
+ };
1748
+
1749
+ // src/core/components/Footer/Footer.tsx
1750
+
1751
+
1752
+ var Footer = () => {
1753
+ const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
1754
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1755
+ _material.Box,
1756
+ {
1757
+ component: "footer",
1758
+ sx: {
1759
+ py: 2,
1760
+ px: 4,
1761
+ mt: "auto",
1762
+ backgroundColor: (theme) => theme.palette.mode === "light" ? theme.palette.grey[200] : theme.palette.grey[800]
1763
+ },
1764
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { variant: "body2", color: "text.secondary", align: "center", children: `\xA9 Copyright ${currentYear} GN. All rights reserved by Parul University.` })
1765
+ }
1766
+ );
1767
+ };
1768
+
1769
+ // src/core/components/LabelText/LabelText.tsx
1770
+
1771
+
1772
+ var LabelText = ({
1773
+ label,
1774
+ value,
1775
+ gridSize,
1776
+ containerSize,
1777
+ labelSx,
1778
+ valueSx
1779
+ }) => {
1780
+ const defaultGridSize = {
1781
+ labelSize: { xs: 6, sm: 6, md: 6 },
1782
+ valueSize: { xs: 12, sm: 6, md: 6 }
1783
+ };
1784
+ const defaultContainerSize = { xs: 12, sm: 6, md: 6 };
1785
+ const size = gridSize || defaultGridSize;
1786
+ const container = containerSize || defaultContainerSize;
1787
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1788
+ _material.Grid,
1789
+ {
1790
+ size: container,
1791
+ sx: {
1792
+ display: "flex",
1793
+ flexDirection: { xs: "column", sm: "row", md: "row" },
1794
+ "&:hover": { bgcolor: "#efefef", overflow: "hidden" }
1795
+ },
1796
+ children: [
1797
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1798
+ _material.Grid,
1799
+ {
1800
+ size: size.labelSize,
1801
+ sx: {
1802
+ padding: "5px",
1803
+ fontSize: "14px",
1804
+ textAlign: { xs: "left", sm: "right", md: "right" },
1805
+ ...labelSx
1806
+ },
1807
+ children: [
1808
+ label,
1809
+ " :"
1810
+ ]
1811
+ }
1812
+ ),
1813
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1814
+ _material.Grid,
1815
+ {
1816
+ size: size.valueSize,
1817
+ sx: { padding: "5px", display: "flex", flexWrap: "wrap" },
1818
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Tooltip, { title: value, arrow: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1819
+ _material.Typography,
1820
+ {
1821
+ sx: {
1822
+ fontSize: "14px",
1823
+ wordBreak: "break-word",
1824
+ overflow: "hidden",
1825
+ display: "-webkit-box",
1826
+ textOverflow: "ellipsis",
1827
+ WebkitLineClamp: 2,
1828
+ WebkitBoxOrient: "vertical",
1829
+ ...valueSx,
1830
+ color: "#078dee"
1831
+ },
1832
+ children: value ? value : "-"
1833
+ }
1834
+ ) })
1835
+ }
1836
+ )
1837
+ ]
1838
+ }
1839
+ );
1840
+ };
1841
+
1842
+ // src/core/components/RenderIf/RenderIf.tsx
1843
+
1844
+ var RenderIf = ({
1845
+ show,
1846
+ children
1847
+ }) => {
1848
+ return show ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children }) : null;
1849
+ };
1850
+
1851
+ // src/core/components/SectionBox/SectionBox.tsx
1852
+
1853
+
1854
+
1855
+ var getSectionTheme = (variant = "default") => {
1856
+ const themes = {
1857
+ default: {
1858
+ bgcolor: "#faebd7",
1859
+ color: "#925d21"
1860
+ },
1861
+ form: {
1862
+ bgcolor: "#cdced1",
1863
+ color: "black"
1864
+ },
1865
+ info: {
1866
+ bgcolor: "#e3f2fd",
1867
+ color: "#1976d2"
1868
+ },
1869
+ warning: {
1870
+ bgcolor: "#fff3e0",
1871
+ color: "#f57c00"
1872
+ },
1873
+ error: {
1874
+ bgcolor: "#ffebee",
1875
+ color: "#d32f2f"
1876
+ }
1877
+ };
1878
+ return themes[variant];
1879
+ };
1880
+ var SectionBox = _react.memo.call(void 0,
1881
+ ({
1882
+ title,
1883
+ children,
1884
+ spacing = 0,
1885
+ containerSx,
1886
+ titleSx,
1887
+ variant = "default",
1888
+ icon,
1889
+ actions
1890
+ }) => {
1891
+ const themeColors = _react.useMemo.call(void 0, () => getSectionTheme(variant), [variant]);
1892
+ const headerSx = _react.useMemo.call(void 0,
1893
+ () => ({
1894
+ px: 1.5,
1895
+ py: 0.1,
1896
+ width: "fit-content",
1897
+ ...themeColors,
1898
+ ...titleSx
1899
+ }),
1900
+ [themeColors, titleSx]
1901
+ );
1902
+ const contentSx = _react.useMemo.call(void 0,
1903
+ () => ({
1904
+ padding: "16px",
1905
+ ...containerSx
1906
+ }),
1907
+ [containerSx]
1908
+ );
1909
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
1910
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Box, { sx: { display: "flex", flexDirection: "column", width: "100%" }, children: [
1911
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1912
+ _material.Stack,
1913
+ {
1914
+ direction: "row",
1915
+ justifyContent: "space-between",
1916
+ alignItems: "center",
1917
+ sx: headerSx,
1918
+ children: [
1919
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.Stack, { direction: "row", alignItems: "center", spacing: 1, children: [
1920
+ icon,
1921
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Typography, { sx: { fontSize: "15px", fontWeight: 400 }, children: title })
1922
+ ] }),
1923
+ actions
1924
+ ]
1925
+ }
1926
+ ),
1927
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Divider, {})
1928
+ ] }),
1929
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { container: true, spacing, sx: contentSx, children })
1930
+ ] });
1931
+ }
1932
+ );
1933
+
1934
+ // src/core/components/SimpleTabs/SimpleTabs.tsx
1935
+
1936
+
1937
+
1938
+
1939
+ var SimpleTabs = ({
1940
+ tabs,
1941
+ defaultValue = 1,
1942
+ onTabChange,
1943
+ children,
1944
+ tabSx,
1945
+ tabsSx
1946
+ }) => {
1947
+ const [value, setValue] = _react.useState.call(void 0, defaultValue);
1948
+ const handleChange = (event, newValue) => {
1949
+ setValue(newValue);
1950
+ if (onTabChange) onTabChange(newValue);
1951
+ };
1952
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _lab.TabContext, { value, children: [
1953
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Box, { sx: { borderBottom: 1, borderColor: "divider", width: "100%" }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1954
+ _material.Tabs,
1955
+ {
1956
+ value,
1957
+ onChange: handleChange,
1958
+ sx: { px: 2, py: 0, ...tabsSx },
1959
+ children: tabs.map((tab) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1960
+ _material.Tab,
1961
+ {
1962
+ label: tab.label,
1963
+ value: tab.value,
1964
+ disabled: tab.permission === false,
1965
+ sx: { fontSize: "1rem", ...tabSx }
1966
+ },
1967
+ tab.value
1968
+ ))
1969
+ }
1970
+ ) }),
1971
+ children
1972
+ ] });
1973
+ };
1974
+
1975
+ // src/core/components/SubmitButton/SubmitButton.tsx
1976
+
1977
+
1978
+ var SubmitButton = ({
1979
+ loading = false,
1980
+ ...rest
1981
+ }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1982
+ _lab.LoadingButton,
1983
+ {
1984
+ loading,
1985
+ variant: "contained",
1986
+ color: "primary",
1987
+ type: "submit",
1988
+ ...rest,
1989
+ sx: { fontWeight: 400 },
1990
+ children: "Submit"
1991
+ }
1992
+ );
1993
+
1994
+ // src/core/components/WithRef/WithRef.tsx
1995
+
1996
+ function withDataModal(component) {
1997
+ return _react.forwardRef.call(void 0,
1998
+ (props, ref) => component({ ...props, ref })
1999
+ );
2000
+ }
2001
+
2002
+ // src/core/config.ts
2003
+ var Config = {
2004
+ defaultPageSize: 20,
2005
+ apiBaseUrl: "http://localhost:5143"
2006
+ // apiBaseUrl: 'http://192.168.1.246:5143',
2007
+ };
2008
+ var dateTimePatterns = {
2009
+ dateTime: "DD MMM YYYY h:mm A",
2010
+ // 17 Apr 2022 12:00 am
2011
+ date: "DD MMM YYYY",
2012
+ // 17 Apr 2022
2013
+ month_year_short_format: "MMM YYYY",
2014
+ month_year_full_format: "MMMM YYYY",
2015
+ year: "YYYY",
2016
+ time: "h:mm a",
2017
+ // 12:00 am
2018
+ split: {
2019
+ dateTime: "DD/MM/YYYY h:mm A",
2020
+ // 17/04/2022 12:00 am
2021
+ date: "DD/MM/YYYY"
2022
+ // 17/04/2022
2023
+ },
2024
+ paramCase: {
2025
+ dateTime: "DD-MM-YYYY h:mm A",
2026
+ // 17-04-2022 12:00 am
2027
+ date: "DD-MM-YYYY",
2028
+ // 17-04-2022
2029
+ dateReverse: "YYYY-MM-DD",
2030
+ // 2022-04-17 for compare date
2031
+ MonthYear: "MMM-YYYY"
2032
+ }
2033
+ };
2034
+
2035
+ // src/core/hooks/useApiClient.ts
2036
+
2037
+ function useApiClient(config = {}) {
2038
+ return _react.useMemo.call(void 0,
2039
+ () => createApiClient(config),
2040
+ // eslint-disable-next-line react-hooks/exhaustive-deps
2041
+ [
2042
+ config.baseURL,
2043
+ config.timeout,
2044
+ config.correlationIdPrefix,
2045
+ config.includeCorrelationId,
2046
+ config.authToken,
2047
+ config.requestInterceptors,
2048
+ config.responseInterceptors,
2049
+ config.errorInterceptors
2050
+ ]
2051
+ );
2052
+ }
2053
+
2054
+ // src/core/hooks/useFormErrorHandler.ts
2055
+
2056
+ var _sonner = require('sonner');
2057
+ var useFormErrorHandler = ({
2058
+ setError,
2059
+ successMessage = {
2060
+ create: "Created successfully",
2061
+ update: "Updated successfully"
2062
+ },
2063
+ errorMessage = {
2064
+ noChanges: "No changes were made",
2065
+ general: "Failed to save. Please try again."
2066
+ }
2067
+ }) => {
2068
+ const getFieldError = _react.useCallback.call(void 0,
2069
+ (fields, fieldName) => {
2070
+ if (!fields || !fields[fieldName]) return void 0;
2071
+ const fieldError = fields[fieldName];
2072
+ if (typeof fieldError === "string") {
2073
+ return fieldError;
2074
+ }
2075
+ if (Array.isArray(fieldError)) {
2076
+ return fieldError.join(", ");
2077
+ }
2078
+ if (typeof fieldError === "object" && "message" in fieldError) {
2079
+ return fieldError.message;
2080
+ }
2081
+ return void 0;
2082
+ },
2083
+ []
2084
+ );
2085
+ const handleSuccess = _react.useCallback.call(void 0,
2086
+ (isEditing, rowsAffected) => {
2087
+ if (rowsAffected !== void 0 && rowsAffected > 0) {
2088
+ _sonner.toast.success(
2089
+ isEditing ? successMessage.update : successMessage.create
2090
+ );
2091
+ return true;
2092
+ } else if (rowsAffected === 0) {
2093
+ _sonner.toast.error(errorMessage.noChanges);
2094
+ return false;
2095
+ }
2096
+ _sonner.toast.success(isEditing ? successMessage.update : successMessage.create);
2097
+ return true;
2098
+ },
2099
+ [successMessage, errorMessage]
2100
+ );
2101
+ const handleError = _react.useCallback.call(void 0,
2102
+ (processedError) => {
2103
+ if (processedError.type === "validation_error" && processedError.errors && setError) {
2104
+ Object.keys(processedError.errors).forEach((fieldName) => {
2105
+ const fieldError = getFieldError(processedError.errors, fieldName);
2106
+ if (fieldError) {
2107
+ setError(fieldName, {
2108
+ type: "server",
2109
+ message: fieldError
2110
+ });
2111
+ }
2112
+ });
2113
+ _sonner.toast.error(
2114
+ processedError.title || "Please check the form for validation errors"
2115
+ );
2116
+ } else {
2117
+ _sonner.toast.error(processedError.title || errorMessage.general);
2118
+ }
2119
+ },
2120
+ [errorMessage.general, getFieldError, setError]
2121
+ );
2122
+ return {
2123
+ handleSuccess,
2124
+ handleError
2125
+ };
2126
+ };
2127
+ var useDeleteHandler = ({
2128
+ successMessage = "Deleted successfully",
2129
+ errorMessage = "Failed to delete. Please try again."
2130
+ } = {}) => {
2131
+ return useFormErrorHandler({
2132
+ successMessage: {
2133
+ create: successMessage,
2134
+ // Not used for delete, but required for type
2135
+ update: successMessage
2136
+ },
2137
+ errorMessage: {
2138
+ noChanges: "No changes were made",
2139
+ // Not typically used for delete
2140
+ general: errorMessage
2141
+ }
2142
+ // setError is omitted (undefined) for delete operations
2143
+ });
2144
+ };
2145
+
2146
+ // src/core/utils/CacheUtility/index.ts
2147
+ var _reactquery = require('@tanstack/react-query');
2148
+
2149
+ var CacheUtility = class {
2150
+ constructor(queryClient) {
2151
+ this.queryClient = queryClient;
2152
+ }
2153
+ /**
2154
+ * Get cached data using only the queryKey from query factory
2155
+ */
2156
+ getCachedData(queryKey) {
2157
+ return this.queryClient.getQueryData(queryKey);
2158
+ }
2159
+ /**
2160
+ * Get cached data with transformation using select function
2161
+ */
2162
+ getCachedDataWithSelect(queryKey, select) {
2163
+ const cachedData = this.queryClient.getQueryData(queryKey);
2164
+ if (cachedData === void 0) {
2165
+ return void 0;
2166
+ }
2167
+ return select(cachedData);
2168
+ }
2169
+ };
2170
+ function useCacheUtility() {
2171
+ const queryClient = _reactquery.useQueryClient.call(void 0, );
2172
+ return _react.useMemo.call(void 0, () => new CacheUtility(queryClient), [queryClient]);
2173
+ }
2174
+
2175
+ // src/core/utils/watch/core.ts
2176
+ var _reacthookform = require('react-hook-form');
2177
+ var useWatchForm = (control) => _reacthookform.useWatch.call(void 0, { control });
2178
+ var useWatchField = (control, name) => _reacthookform.useWatch.call(void 0, { control, name });
2179
+ var useWatchFields = (control, names) => _reacthookform.useWatch.call(void 0, { control, name: names });
2180
+
2181
+ // src/core/utils/watch/utilities.ts
2182
+
2183
+
2184
+ var useWatchTransform = (control, name, transform) => {
2185
+ const value = _reacthookform.useWatch.call(void 0, { control, name });
2186
+ return _react.useMemo.call(void 0, () => transform(value), [value, transform]);
2187
+ };
2188
+ var useWatchDefault = (control, name, defaultValue) => {
2189
+ const value = _reacthookform.useWatch.call(void 0, { control, name });
2190
+ return _nullishCoalesce(value, () => ( defaultValue));
2191
+ };
2192
+ var useWatchBoolean = (control, name, defaultValue = false) => {
2193
+ const value = _reacthookform.useWatch.call(void 0, { control, name });
2194
+ return Boolean(_nullishCoalesce(value, () => ( defaultValue)));
2195
+ };
2196
+ var useWatchBatch = (control, fields) => {
2197
+ const values = _reacthookform.useWatch.call(void 0, { control, name: fields });
2198
+ return _react.useMemo.call(void 0, () => {
2199
+ const result = {};
2200
+ fields.forEach((field, index) => {
2201
+ result[field] = values[index];
2202
+ });
2203
+ return result;
2204
+ }, [values, fields]);
2205
+ };
2206
+ var useWatchConditional = (control, name, shouldWatch, fallback) => {
2207
+ const activeValue = _reacthookform.useWatch.call(void 0, {
2208
+ control,
2209
+ name,
2210
+ disabled: !shouldWatch
2211
+ });
2212
+ return shouldWatch ? activeValue : fallback;
2213
+ };
2214
+ var useWatchDebounced = (control, name, delay = 300) => {
2215
+ const value = _reacthookform.useWatch.call(void 0, { control, name });
2216
+ const [debouncedValue, setDebouncedValue] = _react.useState.call(void 0, value);
2217
+ _react.useEffect.call(void 0, () => {
2218
+ const timer = setTimeout(() => {
2219
+ setDebouncedValue(value);
2220
+ }, delay);
2221
+ return () => clearTimeout(timer);
2222
+ }, [value, delay]);
2223
+ return debouncedValue;
2224
+ };
2225
+ var useWatchSelector = (control, name, selector, deps = []) => {
2226
+ const value = _reacthookform.useWatch.call(void 0, { control, name });
2227
+ return _react.useMemo.call(void 0,
2228
+ () => selector(value),
2229
+ [value, selector, ...deps]
2230
+ // eslint-disable-line react-hooks/exhaustive-deps
2231
+ );
2232
+ };
2233
+
2234
+ // src/core/utils/watch/index.ts
2235
+ var typedWatch = {
2236
+ // === CORE FUNCTIONS ===
2237
+ /** Watch entire form */
2238
+ form: useWatchForm,
2239
+ /** Watch single field */
2240
+ field: useWatchField,
2241
+ /** Watch multiple fields */
2242
+ fields: useWatchFields,
2243
+ // === UTILITY FUNCTIONS ===
2244
+ /** Watch with transformation */
2245
+ transform: useWatchTransform,
2246
+ /** Watch with default value */
2247
+ withDefault: useWatchDefault,
2248
+ /** Watch as boolean */
2249
+ boolean: useWatchBoolean,
2250
+ /** Watch multiple with custom keys */
2251
+ batch: useWatchBatch,
2252
+ /** Watch conditionally */
2253
+ conditional: useWatchConditional,
2254
+ /** Watch with debouncing */
2255
+ debounced: useWatchDebounced,
2256
+ /** Watch with selector */
2257
+ selector: useWatchSelector
2258
+ };
2259
+
2260
+ // src/core/utils/calculateFilterCount.ts
2261
+ var calculateFilterCount = (model) => Object.values(model).filter(
2262
+ (v) => v !== null && v !== void 0 && String(v).trim() !== ""
2263
+ ).length;
2264
+
2265
+ // src/core/utils/format-time.ts
2266
+ var _dayjs = require('dayjs'); var _dayjs2 = _interopRequireDefault(_dayjs);
2267
+ var _duration = require('dayjs/plugin/duration'); var _duration2 = _interopRequireDefault(_duration);
2268
+ var _relativeTime = require('dayjs/plugin/relativeTime'); var _relativeTime2 = _interopRequireDefault(_relativeTime);
2269
+ _dayjs2.default.extend(_duration2.default);
2270
+ _dayjs2.default.extend(_relativeTime2.default);
2271
+ var formatPatterns = {
2272
+ dateTime: "DD MMM YYYY h:mm A",
2273
+ // 17 Apr 2022 12:00 am
2274
+ date: "DD MMM YYYY",
2275
+ // 17 Apr 2022
2276
+ month_year_short_format: "MMM YYYY",
2277
+ month_year_full_format: "MMMM YYYY",
2278
+ year: "YYYY",
2279
+ time: "h:mm a",
2280
+ // 12:00 am
2281
+ split: {
2282
+ dateTime: "DD/MM/YYYY h:mm A",
2283
+ // 17/04/2022 12:00 am
2284
+ date: "DD/MM/YYYY"
2285
+ // 17/04/2022
2286
+ },
2287
+ paramCase: {
2288
+ dateTime: "DD-MM-YYYY h:mm A",
2289
+ // 17-04-2022 12:00 am
2290
+ date: "DD-MM-YYYY",
2291
+ // 17-04-2022
2292
+ dateReverse: "YYYY-MM-DD",
2293
+ // 2022-04-17 for compare date
2294
+ MonthYear: "MMM-YYYY"
2295
+ }
2296
+ };
2297
+ var isValidDate = (date) => date !== null && date !== void 0 && _dayjs2.default.call(void 0, date).isValid();
2298
+ function today(template) {
2299
+ return _dayjs2.default.call(void 0, /* @__PURE__ */ new Date()).startOf("day").format(template);
2300
+ }
2301
+ function fDateTime(date, template) {
2302
+ if (!isValidDate(date)) {
2303
+ return "Invalid date";
2304
+ }
2305
+ return _dayjs2.default.call(void 0, date).format(_nullishCoalesce(template, () => ( formatPatterns.dateTime)));
2306
+ }
2307
+ function fDate(date, template) {
2308
+ if (!isValidDate(date)) {
2309
+ return "Invalid date";
2310
+ }
2311
+ return _dayjs2.default.call(void 0, date).format(_nullishCoalesce(template, () => ( formatPatterns.date)));
2312
+ }
2313
+ function fTime(date, template) {
2314
+ if (!isValidDate(date)) {
2315
+ return "Invalid date";
2316
+ }
2317
+ return _dayjs2.default.call(void 0, date).format(_nullishCoalesce(template, () => ( formatPatterns.time)));
2318
+ }
2319
+ function fTimestamp(date) {
2320
+ if (!isValidDate(date)) {
2321
+ return "Invalid date";
2322
+ }
2323
+ return _dayjs2.default.call(void 0, date).valueOf();
2324
+ }
2325
+ function fToNow(date) {
2326
+ if (!isValidDate(date)) {
2327
+ return "Invalid date";
2328
+ }
2329
+ return _dayjs2.default.call(void 0, date).toNow(true);
2330
+ }
2331
+ function fIsBetween(inputDate, startDate, endDate) {
2332
+ if (!isValidDate(inputDate) || !isValidDate(startDate) || !isValidDate(endDate)) {
2333
+ return false;
2334
+ }
2335
+ const formattedInputDate = fTimestamp(inputDate);
2336
+ const formattedStartDate = fTimestamp(startDate);
2337
+ const formattedEndDate = fTimestamp(endDate);
2338
+ if (formattedInputDate === "Invalid date" || formattedStartDate === "Invalid date" || formattedEndDate === "Invalid date") {
2339
+ return false;
2340
+ }
2341
+ return formattedInputDate >= formattedStartDate && formattedInputDate <= formattedEndDate;
2342
+ }
2343
+ function fIsAfter(startDate, endDate) {
2344
+ if (!isValidDate(startDate) || !isValidDate(endDate)) {
2345
+ return false;
2346
+ }
2347
+ return _dayjs2.default.call(void 0, startDate).isAfter(endDate);
2348
+ }
2349
+ function fIsSame(startDate, endDate, unitToCompare) {
2350
+ if (!isValidDate(startDate) || !isValidDate(endDate)) {
2351
+ return false;
2352
+ }
2353
+ return _dayjs2.default.call(void 0, startDate).isSame(endDate, _nullishCoalesce(unitToCompare, () => ( "year")));
2354
+ }
2355
+ function fDateRangeShortLabel(startDate, endDate, initial) {
2356
+ if (!isValidDate(startDate) || !isValidDate(endDate) || fIsAfter(startDate, endDate)) {
2357
+ return "Invalid date";
2358
+ }
2359
+ let label = `${fDate(startDate)} - ${fDate(endDate)}`;
2360
+ if (initial) {
2361
+ return label;
2362
+ }
2363
+ const isSameYear = fIsSame(startDate, endDate, "year");
2364
+ const isSameMonth = fIsSame(startDate, endDate, "month");
2365
+ const isSameDay = fIsSame(startDate, endDate, "day");
2366
+ if (isSameYear && !isSameMonth) {
2367
+ label = `${fDate(startDate, "DD MMM")} - ${fDate(endDate)}`;
2368
+ } else if (isSameYear && isSameMonth && !isSameDay) {
2369
+ label = `${fDate(startDate, "DD")} - ${fDate(endDate)}`;
2370
+ } else if (isSameYear && isSameMonth && isSameDay) {
2371
+ label = `${fDate(endDate)}`;
2372
+ }
2373
+ return label;
2374
+ }
2375
+ function fAdd({
2376
+ years = 0,
2377
+ months = 0,
2378
+ days = 0,
2379
+ hours = 0,
2380
+ minutes = 0,
2381
+ seconds = 0,
2382
+ milliseconds = 0
2383
+ }) {
2384
+ const result = _dayjs2.default.call(void 0, ).add(
2385
+ _dayjs2.default.duration({
2386
+ years,
2387
+ months,
2388
+ days,
2389
+ hours,
2390
+ minutes,
2391
+ seconds,
2392
+ milliseconds
2393
+ })
2394
+ ).format();
2395
+ return result;
2396
+ }
2397
+ function fSub({
2398
+ years = 0,
2399
+ months = 0,
2400
+ days = 0,
2401
+ hours = 0,
2402
+ minutes = 0,
2403
+ seconds = 0,
2404
+ milliseconds = 0
2405
+ }) {
2406
+ const result = _dayjs2.default.call(void 0, ).subtract(
2407
+ _dayjs2.default.duration({
2408
+ years,
2409
+ months,
2410
+ days,
2411
+ hours,
2412
+ minutes,
2413
+ seconds,
2414
+ milliseconds
2415
+ })
2416
+ ).format();
2417
+ return result;
2418
+ }
2419
+
2420
+ // src/core/utils/getEmptyObject.ts
2421
+ function getEmptyObject(data, defaultValues = {}) {
2422
+ const obj = {};
2423
+ for (const key of Object.keys(data)) {
2424
+ const value = data[key];
2425
+ const type = typeof value;
2426
+ if (type === "number") {
2427
+ obj[key] = 0;
2428
+ } else if (type === "string" || type === "boolean") {
2429
+ obj[key] = null;
2430
+ } else if (value instanceof Date) {
2431
+ obj[key] = null;
2432
+ } else {
2433
+ obj[key] = null;
2434
+ }
2435
+ }
2436
+ return { ...obj, ...defaultValues };
2437
+ }
2438
+
2439
+ // src/core/utils/useStableRowCount.ts
2440
+
2441
+ function useStableRowCount(currentTotal) {
2442
+ const rowCountRef = _react.useRef.call(void 0, currentTotal || 0);
2443
+ const stableRowCount = _react.useMemo.call(void 0, () => {
2444
+ if (currentTotal !== void 0) {
2445
+ rowCountRef.current = currentTotal;
2446
+ }
2447
+ return rowCountRef.current;
2448
+ }, [currentTotal]);
2449
+ return stableRowCount;
2450
+ }
2451
+
2452
+
2453
+
2454
+
2455
+
2456
+
2457
+
2458
+
2459
+
2460
+
2461
+
2462
+
2463
+
2464
+
2465
+
2466
+
2467
+
2468
+
2469
+
2470
+
2471
+
2472
+
2473
+
2474
+
2475
+
2476
+
2477
+
2478
+
2479
+
2480
+
2481
+
2482
+
2483
+
2484
+
2485
+
2486
+
2487
+
2488
+
2489
+
2490
+
2491
+
2492
+
2493
+
2494
+
2495
+
2496
+
2497
+
2498
+
2499
+
2500
+
2501
+
2502
+
2503
+
2504
+
2505
+
2506
+
2507
+
2508
+
2509
+
2510
+
2511
+ exports.generateCorrelationId = generateCorrelationId; exports.RequestManager = RequestManager; exports.ApiClient = ApiClient; exports.createApiClient = createApiClient; exports.getGlobalApiClient = getGlobalApiClient; exports.setGlobalApiClient = setGlobalApiClient; exports.resetGlobalApiClient = resetGlobalApiClient; exports.CancelToken = CancelToken; exports.useValidationErrors = useValidationErrors; exports.AuthorizedView = AuthorizedView; exports.CancelButton = CancelButton; exports.ClearButton = ClearButton; exports.SimpleContainer = SimpleContainer; exports.FilterButton = FilterButton; exports.FilterChip = FilterChip; exports.ProgramsFilterDisplay = ProgramsFilterDisplay; exports.FilterWrapper = FilterWrapper; exports.Footer = Footer; exports.LabelText = LabelText; exports.RenderIf = RenderIf; exports.SectionBox = SectionBox; exports.SimpleTabs = SimpleTabs; exports.SubmitButton = SubmitButton; exports.withDataModal = withDataModal; exports.Config = Config; exports.dateTimePatterns = dateTimePatterns; exports.useApiClient = useApiClient; exports.useFormErrorHandler = useFormErrorHandler; exports.useDeleteHandler = useDeleteHandler; exports.CacheUtility = CacheUtility; exports.useCacheUtility = useCacheUtility; exports.useWatchForm = useWatchForm; exports.useWatchField = useWatchField; exports.useWatchFields = useWatchFields; exports.useWatchTransform = useWatchTransform; exports.useWatchDefault = useWatchDefault; exports.useWatchBoolean = useWatchBoolean; exports.useWatchBatch = useWatchBatch; exports.useWatchConditional = useWatchConditional; exports.useWatchDebounced = useWatchDebounced; exports.useWatchSelector = useWatchSelector; exports.typedWatch = typedWatch; exports.calculateFilterCount = calculateFilterCount; exports.formatPatterns = formatPatterns; exports.today = today; exports.fDateTime = fDateTime; exports.fDate = fDate; exports.fTime = fTime; exports.fTimestamp = fTimestamp; exports.fToNow = fToNow; exports.fIsBetween = fIsBetween; exports.fIsAfter = fIsAfter; exports.fIsSame = fIsSame; exports.fDateRangeShortLabel = fDateRangeShortLabel; exports.fAdd = fAdd; exports.fSub = fSub; exports.getEmptyObject = getEmptyObject; exports.useStableRowCount = useStableRowCount;
2512
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImM6XFxVdHRhbVxcUHJvamVjdHNcXEdOV2ViU29mdC5VSVxccGFja2FnZXNcXHVpXFxkaXN0XFxjaHVuay1NM05WT1o3TC5janMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxTQUFTLFlBQVksQ0FBQyxFQUFFO0FBQ3hCLEVBQUUsR0FBRyxDQUFDLE9BQU8sT0FBTyxJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFO0FBQzFELElBQUksT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDOUIsRUFBRTtBQUNGLEVBQUUsT0FBTyxzQ0FBc0MsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUc7QUFDeEUsSUFBSSxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNwQyxJQUFJLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUN2QyxJQUFJLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFDekIsRUFBRSxDQUFDLENBQUM7QUFDSjtBQUNBLFNBQVMscUJBQXFCLENBQUMsTUFBTSxFQUFFO0FBQ3ZDLEVBQUUsTUFBTSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDN0IsRUFBRSxPQUFPLE9BQU8sRUFBRSxDQUFDLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLGNBQUE7QUFDQSxjQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsWUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0Esa0JBQUE7QUFDQSxrQkFBQTtBQUNBLGtCQUFBO0FBQ0Esa0JBQUE7QUFDQSxtQkFBQTtBQUNBLG1CQUFBO0FBQ0EsbUJBQUE7QUFDQSxtQkFBQTtBQUNBLG1CQUFBO0FBQ0EsbUJBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0Esd0JBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLGNBQUE7QUFDQSxnQkFBQTtBQUNBLGNBQUE7QUFDQSxjQUFBO0FBQ0EsZ0JBQUE7QUFDQSxnQkFBQTtBQUNBLGdCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxnQkFBQTtBQUNBLGdCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxjQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxjQUFBO0FBQ0EsWUFBQTtBQUNBLGNBQUE7QUFDQSxnQkFBQTtBQUNBLGNBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSxVQUFBO0FBQ0EsWUFBQTtBQUNBLGNBQUE7QUFDQSxjQUFBO0FBQ0EsZ0JBQUE7QUFDQSxnQkFBQTtBQUNBLGdCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxnQkFBQTtBQUNBLGdCQUFBO0FBQ0EsY0FBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsY0FBQTtBQUNBLFlBQUE7QUFDQSxjQUFBO0FBQ0EsZ0JBQUE7QUFDQSxjQUFBO0FBQ0EsWUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxvQkFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0Esc0JBQUE7QUFDQSxzQkFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLHdCQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxjQUFBO0FBQ0EsY0FBQTtBQUNBLGdCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxjQUFBO0FBQ0EsY0FBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsY0FBQTtBQUNBLGdCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxrQkFBQTtBQUNBLG9CQUFBO0FBQ0Esb0JBQUE7QUFDQSxvQkFBQTtBQUNBLGtCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxjQUFBO0FBQ0EsOEJBQUE7QUFDQSxnQkFBQTtBQUNBLGdCQUFBO0FBQ0Esa0JBQUE7QUFDQSxrQkFBQTtBQUNBLG9CQUFBO0FBQ0Esb0JBQUE7QUFDQSxvQkFBQTtBQUNBLGtCQUFBO0FBQ0Esa0JBQUE7QUFDQSxvQkFBQTtBQUNBLG9CQUFBO0FBQ0Esb0JBQUE7QUFDQSxrQkFBQTtBQUNBLGdCQUFBO0FBQ0EsY0FBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLHdCQUFBO0FBQ0Esd0JBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSx3QkFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxjQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxjQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxjQUFBO0FBQ0EsY0FBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLHdCQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxjQUFBO0FBQ0EsY0FBQTtBQUNBLGdCQUFBO0FBQ0Esa0JBQUE7QUFDQSxrQkFBQTtBQUNBLGtCQUFBO0FBQ0Esa0JBQUE7QUFDQSxrQkFBQTtBQUNBLGtCQUFBO0FBQ0Esa0JBQUE7QUFDQSxrQkFBQTtBQUNBLGtCQUFBO0FBQ0EsZ0JBQUE7QUFDQSxnQkFBQTtBQUNBLGNBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0Esc0JBQUE7QUFDQSx3QkFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSw4QkFBQTtBQUNBLGdCQUFBO0FBQ0EsZ0NBQUE7QUFDQSxjQUFBO0FBQ0EsY0FBQTtBQUNBLFlBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLHdCQUFBO0FBQ0EsTUFBQTtBQUNBLHNCQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxvQkFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsWUFBQTtBQUNBLFlBQUE7QUFDQSxZQUFBO0FBQ0EsWUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQTtBQUNBLElBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBO0FBQ0EsSUFBQTtBQUNBO0FBQ0EsSUFBQTtBQUNBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLFFBQUE7QUFDQSxVQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxRQUFBO0FBQ0EsVUFBQTtBQUNBLFVBQUE7QUFDQSxZQUFBO0FBQ0EsY0FBQTtBQUNBLGNBQUE7QUFDQSxZQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSxRQUFBO0FBQ0EsVUFBQTtBQUNBLFFBQUE7QUFDQSxNQUFBO0FBQ0EsUUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0E7QUFDQSxJQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQTtBQUNBLElBQUE7QUFDQTtBQUNBLElBQUE7QUFDQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBLEVBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLE1BQUE7QUFDQSxJQUFBO0FBQ0EsTUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLElBQUE7QUFDQSxNQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiQzpcXFV0dGFtXFxQcm9qZWN0c1xcR05XZWJTb2Z0LlVJXFxwYWNrYWdlc1xcdWlcXGRpc3RcXGNodW5rLU0zTlZPWjdMLmNqcyIsInNvdXJjZXNDb250ZW50IjpbbnVsbF19