UNPKG

angular-indexed-db-helper

Version:

A powerful and flexible Angular library for managing client-side storage using IndexedDB with support for cache expiration and CRUD operations.

1 lines 20.6 kB
{"version":3,"file":"angular-indexed-db-helper.mjs","sources":["../../../projects/indexed-db/src/lib/indexed-db.tokens.ts","../../../projects/indexed-db/src/lib/indexed-db.model.ts","../../../projects/indexed-db/src/lib/indexed-db.service.ts","../../../projects/indexed-db/src/public-api.ts","../../../projects/indexed-db/src/angular-indexed-db-helper.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n// Define InjectionTokens for dbName and storeName\r\nexport const DB_NAME = new InjectionToken<string>('DB_NAME');\r\nexport const STORE_NAME = new InjectionToken<string>('STORE_NAME');\r\nexport const CACHED_TIME = new InjectionToken<number>('CACHED_TIME'); // Add new token for cached time\r\n","export class DataToStore {\r\n id: string;\r\n value: any;\r\n savedTime: string;\r\n cachedTime: number | null = null;\r\n\r\n constructor(id: string, value: any) {\r\n this.id = id;\r\n this.value = value;\r\n this.savedTime = new Date().toISOString(); // Generate the current timestamp\r\n }\r\n}\r\n","import {Injectable, Inject} from '@angular/core';\r\n\r\n// Injection tokens for dbName and storeName (these will be injected dynamically)\r\nimport {DB_NAME, STORE_NAME, CACHED_TIME} from './indexed-db.tokens';\r\nimport {DataToStore} from './indexed-db.model'; // Import the tokens\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class IndexedDbHandler {\r\n private dbName: string;\r\n private storeName: string;\r\n private cachedTime: number;\r\n private dbInitialized: Promise<IDBDatabase>;\r\n\r\n constructor(\r\n @Inject(DB_NAME) dbName: string,\r\n @Inject(STORE_NAME) storeName: string,\r\n @Inject(CACHED_TIME) cachedTime: number\r\n ) {\r\n this.dbName = dbName;\r\n this.storeName = storeName;\r\n this.cachedTime = cachedTime;\r\n this.dbInitialized = this.initDB();\r\n }\r\n\r\n /**\r\n * Ensures that the database is fully set up before performing any operations.\r\n * @returns A promise that resolves when the IndexedDB is initialized.\r\n */\r\n public async whenInitialized(): Promise<IDBDatabase> {\r\n return this.dbInitialized;\r\n }\r\n\r\n /**\r\n * Initializes the IndexedDB and creates the object store if it doesn't exist.\r\n * @returns A promise that resolves to the IndexedDB instance.\r\n */\r\n private initDB(): Promise<IDBDatabase> {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(this.dbName);\r\n\r\n request.onupgradeneeded = (event: IDBVersionChangeEvent) => {\r\n const db = (event.target as IDBOpenDBRequest).result;\r\n if (!db.objectStoreNames.contains(this.storeName)) {\r\n db.createObjectStore(this.storeName, {keyPath: 'id'});\r\n console.info(`Object store '${this.storeName}' created.`);\r\n }\r\n };\r\n\r\n request.onsuccess = (event: Event) => {\r\n const db = (event.target as IDBOpenDBRequest).result;\r\n resolve(db);\r\n };\r\n\r\n request.onerror = (event: Event) => {\r\n console.error('Error opening IndexedDB:', event);\r\n reject((event.target as IDBOpenDBRequest).error);\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Saves data to the IndexedDB.\r\n * @param key The key used to store the data.\r\n * @param value The data to be saved.\r\n * @param cacheTime Optional parameter to specify the cache time for the data.\r\n * @returns A promise that resolves when the data is saved.\r\n */\r\n public async saveData(key: string, value: any, cacheTime: number | null = null): Promise<void> {\r\n await this.whenInitialized(); // Ensure DB is initialized\r\n const db = await this.whenInitialized();\r\n const transaction = db.transaction(this.storeName, 'readwrite');\r\n const store = transaction.objectStore(this.storeName);\r\n\r\n // Create a new instance of the DataToStore class\r\n const dataToStore = new DataToStore(key, value);\r\n dataToStore.cachedTime = cacheTime; // Set the cacheTime (null if not provided)\r\n return new Promise((resolve, reject) => {\r\n const request = store.put(dataToStore); // Save the object\r\n\r\n request.onsuccess = () => {\r\n resolve();\r\n };\r\n\r\n request.onerror = (event) => {\r\n reject(`Error saving data: ${event}`);\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves data from the IndexedDB by key.\r\n * @param key The key of the data to retrieve.\r\n * @returns A promise that resolves to the data or null if not found or expired.\r\n */\r\n public async getData(key: string): Promise<any> {\r\n await this.whenInitialized(); // Ensure DB is initialized\r\n const db = await this.whenInitialized();\r\n const transaction = db.transaction(this.storeName, 'readonly');\r\n const store = transaction.objectStore(this.storeName);\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = store.get(key); // Retrieve data by key\r\n\r\n request.onsuccess = async () => {\r\n if (request.result === undefined) {\r\n resolve(null); // Return null if no data found\r\n } else {\r\n // Check expiration based on cachedTime or CACHED_TIME\r\n const cachedTime = request.result.cachedTime;\r\n let isExpired = false;\r\n\r\n if (cachedTime === null) {\r\n // If cachedTime is null, use the default CACHED_TIME for expiration check\r\n isExpired = await this.checkIfExpired(request.result.savedTime, this.cachedTime);\r\n } else {\r\n // If cachedTime exists, check against it\r\n isExpired = await this.checkIfExpired(request.result.savedTime, cachedTime);\r\n }\r\n\r\n if (isExpired) {\r\n resolve(null); // Return null if data is expired\r\n } else {\r\n resolve(request.result.value); // Return the value if not expired\r\n }\r\n }\r\n };\r\n\r\n request.onerror = (event) => {\r\n reject(`Error retrieving data: ${event}`);\r\n };\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Removes data from the IndexedDB by key.\r\n * @param key The key of the data to remove.\r\n * @returns A promise that resolves when the data is removed.\r\n */\r\n public async removeData(key: string): Promise<void> {\r\n await this.whenInitialized(); // Ensure DB is initialized\r\n const db = await this.whenInitialized();\r\n const transaction = db.transaction(this.storeName, 'readwrite');\r\n const store = transaction.objectStore(this.storeName);\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = store.delete(key); // Delete data by key\r\n\r\n request.onsuccess = () => {\r\n resolve(); // Resolve when the data is removed\r\n };\r\n\r\n request.onerror = (event) => {\r\n reject(`Error removing data: ${event}`);\r\n };\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Updates data in the IndexedDB by key.\r\n * @param key The key of the data to update.\r\n * @param value The new data to update.\r\n * @returns A promise that resolves when the data is updated.\r\n */\r\n public async updateData(key: string, value: any): Promise<void> {\r\n await this.whenInitialized(); // Ensure DB is initialized\r\n const db = await this.whenInitialized();\r\n const transaction = db.transaction(this.storeName, 'readwrite');\r\n const store = transaction.objectStore(this.storeName);\r\n\r\n // Create a new instance of the DataToStore class\r\n const dataToStore = new DataToStore(key, value);\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = store.put(dataToStore); // Save the object\r\n\r\n request.onsuccess = () => {\r\n resolve();\r\n };\r\n\r\n request.onerror = (event) => {\r\n reject(`Error saving data: ${event}`);\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves all data from the IndexedDB store.\r\n * Filters out expired data based on the cache time or default expiration time.\r\n * @returns A promise that resolves to an array of all valid data items.\r\n */\r\n public async getAll(): Promise<any[]> {\r\n await this.whenInitialized(); // Ensure DB is initialized\r\n\r\n const db = await this.whenInitialized();\r\n const transaction = db.transaction(this.storeName, 'readonly');\r\n const store = transaction.objectStore(this.storeName);\r\n\r\n return new Promise((resolve, reject) => {\r\n const getRequest = store.getAll(); // Get all records from the store\r\n\r\n // Handle success\r\n getRequest.onsuccess = async () => {\r\n const result = getRequest.result;\r\n if (result === undefined || result.length === 0) {\r\n resolve([]); // Return an empty array if no data found\r\n } else {\r\n // Filter out expired items using cachedTime or CACHED_TIME\r\n const filteredResults = await Promise.all(result.map(async (item) => {\r\n let isExpired = false;\r\n\r\n const cachedTime = item.cachedTime;\r\n if (cachedTime === null) {\r\n // If cachedTime is null, compare against CACHED_TIME\r\n isExpired = await this.checkIfExpired(item.savedTime, this.cachedTime);\r\n } else {\r\n // Compare against cachedTime\r\n isExpired = await this.checkIfExpired(item.savedTime, cachedTime);\r\n }\r\n\r\n return isExpired ? null : item.value; // Exclude expired items\r\n }));\r\n\r\n // Filter out null values (expired data)\r\n resolve(filteredResults.filter(item => item !== null));\r\n }\r\n };\r\n\r\n // Handle error\r\n getRequest.onerror = (event) => {\r\n reject(`Error retrieving all data from IndexedDB: ${event}`);\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Clears all data in the IndexedDB store.\r\n * @returns A promise that resolves when the store is cleared.\r\n */\r\n public async clearStore(): Promise<void> {\r\n await this.whenInitialized(); // Ensure DB is initialized\r\n const db = await this.whenInitialized();\r\n const transaction = db.transaction(this.storeName, 'readwrite'); // Open a transaction in 'readwrite' mode\r\n const store = transaction.objectStore(this.storeName);\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = store.clear(); // Clear all records in the store\r\n\r\n request.onsuccess = () => {\r\n resolve(); // Resolve if the store is cleared successfully\r\n };\r\n\r\n request.onerror = (event) => {\r\n reject(`Error clearing the store: ${event}`); // Reject if there's an error\r\n };\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Getter for the cached time value.\r\n * @returns The current cached time value.\r\n */\r\n public getCachedTime(): number {\r\n return this.cachedTime;\r\n }\r\n\r\n /**\r\n * Setter for the cached time value.\r\n * @param newCachedTime The new cached time value to set.\r\n */\r\n public setCachedTime(newCachedTime: number): void {\r\n this.cachedTime = newCachedTime; // Update the cachedTime value\r\n }\r\n\r\n /**\r\n * Checks if the data has expired based on the saved time and comparison time.\r\n * @param savedTime The saved time of the data.\r\n * @param comparisonTimeInMs The comparison time in milliseconds.\r\n * @returns A promise that resolves to a boolean indicating if the data is expired.\r\n */\r\n private async checkIfExpired(savedTime: string, comparisonTimeInMs: number): Promise<boolean> {\r\n if (comparisonTimeInMs === 0) {\r\n return false; // If comparisonTime is 0, data never expires\r\n }\r\n\r\n const currentTime = new Date().getTime(); // Get current time in milliseconds\r\n const savedTimeStamp = new Date(savedTime).getTime(); // Convert savedTime to milliseconds\r\n\r\n const difference = currentTime - savedTimeStamp; // Calculate time difference\r\n\r\n // Check if the time difference exceeds the comparisonTime (in milliseconds)\r\n return difference > comparisonTimeInMs;\r\n }\r\n\r\n}\r\n","/*\r\n * Public API Surface of indexed-db\r\n */\r\n\r\nexport * from './lib/indexed-db.service';\r\nexport * from './lib/indexed-db.tokens'; // Export any tokens like dbName/storeName\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;AAEA;MACa,OAAO,GAAG,IAAI,cAAc,CAAS,SAAS,EAAE;MAChD,UAAU,GAAG,IAAI,cAAc,CAAS,YAAY,EAAE;AACtD,MAAA,WAAW,GAAG,IAAI,cAAc,CAAS,aAAa,EAAE;;MCLxD,WAAW,CAAA;AACtB,IAAA,EAAE,CAAS;AACX,IAAA,KAAK,CAAM;AACX,IAAA,SAAS,CAAS;IAClB,UAAU,GAAkB,IAAI,CAAC;IAEjC,WAAY,CAAA,EAAU,EAAE,KAAU,EAAA;AAChC,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;AACb,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;KAC3C;AACF;;MCFY,gBAAgB,CAAA;AACnB,IAAA,MAAM,CAAS;AACf,IAAA,SAAS,CAAS;AAClB,IAAA,UAAU,CAAS;AACnB,IAAA,aAAa,CAAuB;AAE5C,IAAA,WAAA,CACmB,MAAc,EACX,SAAiB,EAChB,UAAkB,EAAA;AAEvC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;KACpC;AAED;;;AAGG;AACI,IAAA,MAAM,eAAe,GAAA;QAC1B,OAAO,IAAI,CAAC,aAAa,CAAC;KAC3B;AAED;;;AAGG;IACK,MAAM,GAAA;QACZ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAE5C,YAAA,OAAO,CAAC,eAAe,GAAG,CAAC,KAA4B,KAAI;AACzD,gBAAA,MAAM,EAAE,GAAI,KAAK,CAAC,MAA2B,CAAC,MAAM,CAAC;AACrD,gBAAA,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AACjD,oBAAA,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;oBACtD,OAAO,CAAC,IAAI,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAC,SAAS,CAAY,UAAA,CAAA,CAAC,CAAC;iBAC3D;AACH,aAAC,CAAC;AAEF,YAAA,OAAO,CAAC,SAAS,GAAG,CAAC,KAAY,KAAI;AACnC,gBAAA,MAAM,EAAE,GAAI,KAAK,CAAC,MAA2B,CAAC,MAAM,CAAC;gBACrD,OAAO,CAAC,EAAE,CAAC,CAAC;AACd,aAAC,CAAC;AAEF,YAAA,OAAO,CAAC,OAAO,GAAG,CAAC,KAAY,KAAI;AACjC,gBAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;AACjD,gBAAA,MAAM,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC,CAAC;AACnD,aAAC,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAED;;;;;;AAMG;IACI,MAAM,QAAQ,CAAC,GAAW,EAAE,KAAU,EAAE,YAA2B,IAAI,EAAA;AAC5E,QAAA,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AAC7B,QAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AACxC,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;QAGtD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAChD,QAAA,WAAW,CAAC,UAAU,GAAG,SAAS,CAAC;QACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAEvC,YAAA,OAAO,CAAC,SAAS,GAAG,MAAK;AACvB,gBAAA,OAAO,EAAE,CAAC;AACZ,aAAC,CAAC;AAEF,YAAA,OAAO,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;AAC1B,gBAAA,MAAM,CAAC,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAE,CAAC,CAAC;AACxC,aAAC,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAED;;;;AAIG;IACI,MAAM,OAAO,CAAC,GAAW,EAAA;AAC9B,QAAA,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AAC7B,QAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AACxC,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE/B,YAAA,OAAO,CAAC,SAAS,GAAG,YAAW;AAC7B,gBAAA,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE;AAChC,oBAAA,OAAO,CAAC,IAAI,CAAC,CAAC;iBACf;qBAAM;;AAEL,oBAAA,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;oBAC7C,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,oBAAA,IAAI,UAAU,KAAK,IAAI,EAAE;;AAEvB,wBAAA,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;qBAClF;yBAAM;;AAEL,wBAAA,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;qBAC7E;oBAED,IAAI,SAAS,EAAE;AACb,wBAAA,OAAO,CAAC,IAAI,CAAC,CAAC;qBACf;yBAAM;wBACL,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;qBAC/B;iBACF;AACH,aAAC,CAAC;AAEF,YAAA,OAAO,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;AAC1B,gBAAA,MAAM,CAAC,CAAA,uBAAA,EAA0B,KAAK,CAAA,CAAE,CAAC,CAAC;AAC5C,aAAC,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAGD;;;;AAIG;IACI,MAAM,UAAU,CAAC,GAAW,EAAA;AACjC,QAAA,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AAC7B,QAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AACxC,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAElC,YAAA,OAAO,CAAC,SAAS,GAAG,MAAK;gBACvB,OAAO,EAAE,CAAC;AACZ,aAAC,CAAC;AAEF,YAAA,OAAO,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;AAC1B,gBAAA,MAAM,CAAC,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAC,CAAC;AAC1C,aAAC,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAGD;;;;;AAKG;AACI,IAAA,MAAM,UAAU,CAAC,GAAW,EAAE,KAAU,EAAA;AAC7C,QAAA,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AAC7B,QAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AACxC,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;QAGtD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAEhD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAEvC,YAAA,OAAO,CAAC,SAAS,GAAG,MAAK;AACvB,gBAAA,OAAO,EAAE,CAAC;AACZ,aAAC,CAAC;AAEF,YAAA,OAAO,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;AAC1B,gBAAA,MAAM,CAAC,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAE,CAAC,CAAC;AACxC,aAAC,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAED;;;;AAIG;AACI,IAAA,MAAM,MAAM,GAAA;AACjB,QAAA,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AAE7B,QAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AACxC,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;;AAGlC,YAAA,UAAU,CAAC,SAAS,GAAG,YAAW;AAChC,gBAAA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;gBACjC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/C,oBAAA,OAAO,CAAC,EAAE,CAAC,CAAC;iBACb;qBAAM;;AAEL,oBAAA,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,KAAI;wBAClE,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,wBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;AACnC,wBAAA,IAAI,UAAU,KAAK,IAAI,EAAE;;AAEvB,4BAAA,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;yBACxE;6BAAM;;AAEL,4BAAA,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;yBACnE;AAED,wBAAA,OAAO,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;qBACtC,CAAC,CAAC,CAAC;;AAGJ,oBAAA,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;iBACxD;AACH,aAAC,CAAC;;AAGF,YAAA,UAAU,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;AAC7B,gBAAA,MAAM,CAAC,CAAA,0CAAA,EAA6C,KAAK,CAAA,CAAE,CAAC,CAAC;AAC/D,aAAC,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAED;;;AAGG;AACI,IAAA,MAAM,UAAU,GAAA;AACrB,QAAA,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AAC7B,QAAA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AACxC,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;AAE9B,YAAA,OAAO,CAAC,SAAS,GAAG,MAAK;gBACvB,OAAO,EAAE,CAAC;AACZ,aAAC,CAAC;AAEF,YAAA,OAAO,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;AAC1B,gBAAA,MAAM,CAAC,CAA6B,0BAAA,EAAA,KAAK,EAAE,CAAC,CAAC;AAC/C,aAAC,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAGD;;;AAGG;IACI,aAAa,GAAA;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;KACxB;AAED;;;AAGG;AACI,IAAA,aAAa,CAAC,aAAqB,EAAA;AACxC,QAAA,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC;KACjC;AAED;;;;;AAKG;AACK,IAAA,MAAM,cAAc,CAAC,SAAiB,EAAE,kBAA0B,EAAA;AACxE,QAAA,IAAI,kBAAkB,KAAK,CAAC,EAAE;YAC5B,OAAO,KAAK,CAAC;SACd;QAED,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;AACzC,QAAA,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;AAErD,QAAA,MAAM,UAAU,GAAG,WAAW,GAAG,cAAc,CAAC;;QAGhD,OAAO,UAAU,GAAG,kBAAkB,CAAC;KACxC;AA/RU,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,EAOjB,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,OAAO,EACP,EAAA,EAAA,KAAA,EAAA,UAAU,aACV,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AATV,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA;;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;0BAQI,MAAM;2BAAC,OAAO,CAAA;;0BACd,MAAM;2BAAC,UAAU,CAAA;;0BACjB,MAAM;2BAAC,WAAW,CAAA;;;AClBvB;;AAEG;;ACFH;;AAEG;;;;"}