@signaltree/core 1.1.3 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1000,24 +1000,24 @@ Extend the core with optional feature packages:
1000
1000
 
1001
1001
  ### Performance & Optimization
1002
1002
 
1003
- - **[@signaltree/batching](../batching)** (+3.7KB) - Batch multiple updates for better performance
1004
- - **[@signaltree/memoization](../memoization)** (+2KB) - Intelligent caching & performance optimization
1003
+ - **[@signaltree/batching](../batching)** (+1.1KB gzipped) - Batch multiple updates for better performance
1004
+ - **[@signaltree/memoization](../memoization)** (+1.7KB gzipped) - Intelligent caching & performance optimization
1005
1005
 
1006
1006
  ### Advanced Features
1007
1007
 
1008
- - **[@signaltree/middleware](../middleware)** (+1KB) - Middleware system & state interceptors
1009
- - **[@signaltree/async](../async)** (+2KB) - Advanced async operations & loading states
1010
- - **[@signaltree/entities](../entities)** (+2KB) - Enhanced CRUD operations & entity management
1008
+ - **[@signaltree/middleware](../middleware)** (+1.2KB gzipped) - Middleware system & state interceptors
1009
+ - **[@signaltree/async](../async)** (+1.7KB gzipped) - Advanced async operations & loading states
1010
+ - **[@signaltree/entities](../entities)** (+929B gzipped) - Enhanced CRUD operations & entity management
1011
1011
 
1012
1012
  ### Development Tools
1013
1013
 
1014
- - **[@signaltree/devtools](../devtools)** (+1KB) - Development tools & Redux DevTools integration
1015
- - **[@signaltree/time-travel](../time-travel)** (+3KB) - Undo/redo functionality & state history
1014
+ - **[@signaltree/devtools](../devtools)** (+2.3KB gzipped) - Development tools & Redux DevTools integration
1015
+ - **[@signaltree/time-travel](../time-travel)** (+1.5KB gzipped) - Undo/redo functionality & state history
1016
1016
 
1017
1017
  ### Integration & Convenience
1018
1018
 
1019
- - **[@signaltree/presets](../presets)** (+0.5KB) - Pre-configured setups for common patterns
1020
- - **[@signaltree/ng-forms](../ng-forms)** (+3KB) - Complete Angular Forms integration
1019
+ - **[@signaltree/presets](../presets)** (+0.5KB gzipped) - Pre-configured setups for common patterns
1020
+ - **[@signaltree/ng-forms](../ng-forms)** (+3.4KB gzipped) - Complete Angular Forms integration
1021
1021
 
1022
1022
  ### Quick Start with Extensions
1023
1023
 
@@ -1 +1 @@
1
- {"version":3,"file":"signaltree-core.mjs","sources":["../tmp-esm2022/lib/utils.js","../tmp-esm2022/lib/signal-tree.js"],"sourcesContent":["import { signal, isSignal } from '@angular/core';\nexport function equal(a, b) {\n if (a === b)\n return true;\n if (a == null || b == null)\n return a === b;\n const typeA = typeof a;\n const typeB = typeof b;\n if (typeA !== typeB)\n return false;\n if (typeA !== 'object')\n return false;\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size)\n return false;\n for (const [key, value] of a) {\n if (!b.has(key) || !equal(value, b.get(key)))\n return false;\n }\n return true;\n }\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size)\n return false;\n for (const value of a) {\n if (!b.has(value))\n return false;\n }\n return true;\n }\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length)\n return false;\n return a.every((item, index) => equal(item, b[index]));\n }\n if (Array.isArray(b))\n return false;\n const objA = a;\n const objB = b;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length)\n return false;\n return keysA.every((key) => key in objB && equal(objA[key], objB[key]));\n}\nexport function terminalSignal(value, customEqual) {\n return signal(value, {\n equal: customEqual || equal,\n });\n}\nclass LRUCache {\n maxSize;\n cache = new Map();\n constructor(maxSize) {\n this.maxSize = maxSize;\n }\n set(key, value) {\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n get(key) {\n const value = this.cache.get(key);\n if (value !== undefined) {\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n return value;\n }\n clear() {\n this.cache.clear();\n }\n size() {\n return this.cache.size;\n }\n}\nconst MAX_CACHE_SIZE = 1000;\nconst pathCache = new LRUCache(MAX_CACHE_SIZE);\nexport function parsePath(path) {\n const cached = pathCache.get(path);\n if (cached) {\n return cached;\n }\n const parts = path.split('.');\n pathCache.set(path, parts);\n return parts;\n}\nexport function createLazySignalTree(obj, equalityFn, basePath = '') {\n const signalCache = new Map();\n const nestedProxies = new Map();\n const nestedCleanups = new Map();\n const cleanup = () => {\n nestedCleanups.forEach((cleanupFn) => {\n try {\n cleanupFn();\n }\n catch (error) {\n console.warn('Error during nested cleanup:', error);\n }\n });\n nestedCleanups.clear();\n signalCache.clear();\n nestedProxies.clear();\n };\n const isBuiltInObject = (v) => {\n if (v === null || v === undefined)\n return false;\n return (v instanceof Date ||\n v instanceof RegExp ||\n typeof v === 'function' ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n v instanceof Error ||\n v instanceof Promise ||\n v instanceof URL ||\n v instanceof URLSearchParams ||\n v instanceof FormData ||\n v instanceof Blob ||\n (typeof File !== 'undefined' && v instanceof File));\n };\n const proxy = new Proxy(obj, {\n get(target, prop) {\n if (prop === '__cleanup__') {\n return cleanup;\n }\n if (typeof prop === 'symbol') {\n return target[prop];\n }\n if (prop === 'valueOf' || prop === 'toString') {\n return target[prop];\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n if (!(key in target)) {\n return undefined;\n }\n const value = target[key];\n if (isSignal(value)) {\n return value;\n }\n if (signalCache.has(path)) {\n return signalCache.get(path);\n }\n if (nestedProxies.has(path)) {\n return nestedProxies.get(path);\n }\n if (value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !isSignal(value) &&\n !isBuiltInObject(value)) {\n try {\n const nestedProxy = createLazySignalTree(value, equalityFn, path);\n nestedProxies.set(path, nestedProxy);\n const proxyWithCleanup = nestedProxy;\n if (typeof proxyWithCleanup.__cleanup__ === 'function') {\n nestedCleanups.set(path, proxyWithCleanup.__cleanup__);\n }\n return nestedProxy;\n }\n catch (error) {\n console.warn(`Failed to create lazy proxy for path \"${path}\":`, error);\n const fallbackSignal = signal(value, ...(ngDevMode ? [{ debugName: \"fallbackSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, fallbackSignal);\n return fallbackSignal;\n }\n }\n try {\n const newSignal = signal(value, ...(ngDevMode ? [{ debugName: \"newSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, newSignal);\n return newSignal;\n }\n catch (error) {\n console.warn(`Failed to create signal for path \"${path}\":`, error);\n return value;\n }\n },\n set(target, prop, value) {\n if (typeof prop === 'symbol') {\n target[prop] = value;\n return true;\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n try {\n target[key] = value;\n const cachedSignal = signalCache.get(path);\n if (cachedSignal && 'set' in cachedSignal) {\n cachedSignal.set(value);\n }\n if (nestedProxies.has(path)) {\n const nestedCleanup = nestedCleanups.get(path);\n if (nestedCleanup) {\n nestedCleanup();\n nestedCleanups.delete(path);\n }\n nestedProxies.delete(path);\n }\n return true;\n }\n catch (error) {\n console.warn(`Failed to set value for path \"${path}\":`, error);\n return false;\n }\n },\n has(target, prop) {\n return prop in target;\n },\n ownKeys(target) {\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n });\n return proxy;\n}\nexport const deepEqual = equal;\nexport function shallowEqual(a, b) {\n if (a === b)\n return true;\n if (a == null || b == null)\n return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (a[key] !==\n b[key])\n return false;\n }\n return true;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLE1BQU0sRUFBa0IsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBaURqRSxNQUFNLFVBQVUsS0FBSyxDQUFJLENBQUksRUFBRSxDQUFJO0lBRWpDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUd6QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUk7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFHM0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkIsSUFBSSxLQUFLLEtBQUssS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBR2xDLElBQUksS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUdyQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBR0QsSUFBSSxDQUFDLFlBQVksTUFBTSxJQUFJLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQztRQUMvQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEQsQ0FBQztJQUdELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJO1lBQUUs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LENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztRQUV4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3hCLElBQ0csQ0FBNkIsQ0FBQyxHQUFHLENBQUM7Z0JBQ2xDLENBQTZCLENBQUMsR0FBRyxDQUFDO2dCQUVuQyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaWduYWxUcmVlIFV0aWxpdHkgRnVuY3Rpb25zIHYxLjEuMSAtIEZhaXIgU291cmNlIExpY2Vuc2VcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0pCb3JnaWEvc2lnbmFsdHJlZS9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmltcG9ydCB7IHNpZ25hbCwgV3JpdGFibGVTaWduYWwsIGlzU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IERlZXBTaWduYWxpZnkgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBFbmhhbmNlZCBkZWVwIGVxdWFsaXR5IGZ1bmN0aW9uIG9wdGltaXplZCBmb3IgU2lnbmFsVHJlZSBvcGVyYXRpb25zLlxuICpcbiAqIFBlcmZvcm1zIGNvbXByZWhlbnNpdmUgZXF1YWxpdHkgY2hlY2tpbmcgZm9yIGFsbCBKYXZhU2NyaXB0IHR5cGVzIGluY2x1ZGluZ1xuICogcHJpbWl0aXZlcywgb2JqZWN0cywgYXJyYXlzLCBEYXRlLCBSZWdFeHAsIE1hcCwgU2V0LCBhbmQgb3RoZXIgYnVpbHQtaW5zLlxuICogT3B0aW1pemVkIHdpdGggZWFybHkgZXhpdHMgYW5kIHR5cGUtc3BlY2lmaWMgY29tcGFyaXNvbnMgZm9yIG1heGltdW0gcGVyZm9ybWFuY2UuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB2YWx1ZXMgYmVpbmcgY29tcGFyZWRcbiAqIEBwYXJhbSBhIC0gRmlyc3QgdmFsdWUgdG8gY29tcGFyZVxuICogQHBhcmFtIGIgLSBTZWNvbmQgdmFsdWUgdG8gY29tcGFyZVxuICogQHJldHVybnMgVHJ1ZSBpZiB2YWx1ZXMgYXJlIGRlZXBseSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFByaW1pdGl2ZSBjb21wYXJpc29uc1xuICogZXF1YWwoNDIsIDQyKTsgICAgICAgICAgIC8vIHRydWVcbiAqIGVxdWFsKCdoZWxsbycsICdoZWxsbycpOyAvLyB0cnVlXG4gKiBlcXVhbChudWxsLCB1bmRlZmluZWQpOyAgLy8gZmFsc2VcbiAqXG4gKiAvLyBPYmplY3QgY29tcGFyaXNvbnNcbiAqIGVxdWFsKHsgYTogMSwgYjogMiB9LCB7IGE6IDEsIGI6IDIgfSk7IC8vIHRydWVcbiAqIGVxdWFsKHsgYTogMSB9LCB7IGE6IDEsIGI6IDIgfSk7ICAgICAgIC8vIGZhbHNlXG4gKlxuICogLy8gQXJyYXkgY29tcGFyaXNvbnNcbiAqIGVxdWFsKFsxLCAyLCAzXSwgWzEsIDIsIDNdKTsgICAgICAgICAgIC8vIHRydWVcbiAqIGVxdWFsKFsxLCBbMiwgM11dLCBbMSwgWzIsIDNdXSk7ICAgICAgIC8vIHRydWUgKGRlZXApXG4gKlxuICogLy8gQ29tcGxleCB0eXBlc1xuICogZXF1YWwobmV3IERhdGUoJzIwMjMtMDEtMDEnKSwgbmV3IERhdGUoJzIwMjMtMDEtMDEnKSk7IC8vIHRydWVcbiAqIGVxdWFsKC9hYmMvZ2ksIC9hYmMvZ2kpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBlcXVhbChuZXcgU2V0KFsxLCAyXSksIG5ldyBTZXQoWzEsIDJdKSk7ICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZXF1YWwobmV3IE1hcChbWydhJywgMV1dKSwgbmV3IE1hcChbWydhJywgMV1dKSk7ICAgICAgIC8vIHRydWVcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBVc2FnZSBpbiBTaWduYWxUcmVlIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gKiBjb25zdCBzdGF0ZSA9IHNpZ25hbFRyZWUoe1xuICogICB1c2VyOiB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCB9XG4gKiB9KTtcbiAqXG4gKiAvLyBJbnRlcm5hbCBlcXVhbCgpIHVzYWdlIHByZXZlbnRzIHVubmVjZXNzYXJ5IHVwZGF0ZXNcbiAqIHN0YXRlLnVzZXIuc2V0KHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH0pOyAvLyBObyBjaGFuZ2UgZGV0ZWN0ZWRcbiAqIHN0YXRlLnVzZXIuc2V0KHsgbmFtZTogJ0phbmUnLCBhZ2U6IDMwIH0pOyAvLyBDaGFuZ2UgZGV0ZWN0ZWRcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBGYXN0IHBhdGggZm9yIHJlZmVyZW5jZSBlcXVhbGl0eVxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIGNhc2VzXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PT0gYjtcblxuICAvLyBUeXBlIGNoZWNrIGZpcnN0IC0gbW9zdCBlZmZpY2llbnQgZWFybHkgZXhpdFxuICBjb25zdCB0eXBlQSA9IHR5cGVvZiBhO1xuICBjb25zdCB0eXBlQiA9IHR5cGVvZiBiO1xuICBpZiAodHlwZUEgIT09IHR5cGVCKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gRm9yIHByaW1pdGl2ZXMsID09PSBjaGVjayBhYm92ZSBpcyBzdWZmaWNpZW50XG4gIGlmICh0eXBlQSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcblxuICAvLyBIYW5kbGUgRGF0ZSBvYmplY3RzIHNwZWNpZmljYWxseVxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIFJlZ0V4cCBvYmplY3RzIHNwZWNpZmljYWxseVxuICBpZiAoYSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiBiIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICB9XG5cbiAgLy8gSGFuZGxlIG90aGVyIGJ1aWx0LWluIG9iamVjdHMgdGhhdCBuZWVkIHNwZWNpYWwgY29tcGFyaXNvblxuICBpZiAoYSBpbnN0YW5jZW9mIE1hcCAmJiBiIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYSkge1xuICAgICAgaWYgKCFiLmhhcyhrZXkpIHx8ICFlcXVhbCh2YWx1ZSwgYi5nZXQoa2V5KSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIFNldCAmJiBiIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhKSB7XG4gICAgICBpZiAoIWIuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBhcnJheXMgd2l0aCBvcHRpbWl6ZWQgY29tcGFyaXNvblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShiKSB8fCBhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYS5ldmVyeSgoaXRlbSwgaW5kZXgpID0+IGVxdWFsKGl0ZW0sIGJbaW5kZXhdKSk7XG4gIH1cblxuICAvLyBBcnJheXMgY2hlY2sgYWJvdmUgaGFuZGxlcyBhcnJheSB2cyBvYmplY3QgbWlzbWF0Y2hcbiAgaWYgKEFycmF5LmlzQXJyYXkoYikpIHJldHVybiBmYWxzZTtcblxuICAvLyBIYW5kbGUgcmVndWxhciBvYmplY3RzIHdpdGggb3B0aW1pemVkIGNvbXBhcmlzb25cbiAgY29uc3Qgb2JqQSA9IGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG9iakIgPSBiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGtleXNBLmV2ZXJ5KChrZXkpID0+IGtleSBpbiBvYmpCICYmIGVxdWFsKG9iakFba2V5XSwgb2JqQltrZXldKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRlcm1pbmFsIHNpZ25hbCB3aXRoIGVuaGFuY2VkIGRlZXAgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqXG4gKiBBbHRlcm5hdGl2ZSB0byBBbmd1bGFyJ3Mgc2lnbmFsKCkgdGhhdCB1c2VzIFNpZ25hbFRyZWUncyBkZWVwIGVxdWFsaXR5XG4gKiBmdW5jdGlvbiBmb3IgY2hhbmdlIGRldGVjdGlvbi4gVXNlZnVsIHdoZW4geW91IG5lZWQgc3RhbmRhbG9uZSBzaWduYWxzXG4gKiB3aXRoIHRoZSBzYW1lIGVxdWFsaXR5IHNlbWFudGljcyBhcyBTaWduYWxUcmVlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIHNpZ25hbCB2YWx1ZVxuICogQHBhcmFtIHZhbHVlIC0gSW5pdGlhbCB2YWx1ZSBmb3IgdGhlIHNpZ25hbFxuICogQHBhcmFtIGN1c3RvbUVxdWFsIC0gT3B0aW9uYWwgY3VzdG9tIGVxdWFsaXR5IGZ1bmN0aW9uIChkZWZhdWx0cyB0byBkZWVwIGVxdWFsKVxuICogQHJldHVybnMgQSBXcml0YWJsZVNpZ25hbCB3aXRoIGRlZXAgZXF1YWxpdHkgY29tcGFyaXNvblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBTdGFuZGFyZCBBbmd1bGFyIHNpZ25hbCB3aXRoIHJlZmVyZW5jZSBlcXVhbGl0eVxuICogY29uc3Qgc3RhbmRhcmRTaWduYWwgPSBzaWduYWwoeyBjb3VudDogMCB9KTtcbiAqIHN0YW5kYXJkU2lnbmFsLnNldCh7IGNvdW50OiAwIH0pOyAvLyBUcmlnZ2VycyB1cGRhdGUgKGRpZmZlcmVudCByZWZlcmVuY2UpXG4gKlxuICogLy8gVGVybWluYWwgc2lnbmFsIHdpdGggZGVlcCBlcXVhbGl0eVxuICogY29uc3QgdGVybWluYWxTaWcgPSB0ZXJtaW5hbFNpZ25hbCh7IGNvdW50OiAwIH0pO1xuICogdGVybWluYWxTaWcuc2V0KHsgY291bnQ6IDAgfSk7IC8vIE5vIHVwZGF0ZSAoc2FtZSB2YWx1ZSlcbiAqIHRlcm1pbmFsU2lnLnNldCh7IGNvdW50OiAxIH0pOyAvLyBUcmlnZ2VycyB1cGRhdGUgKGRpZmZlcmVudCB2YWx1ZSlcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDdXN0b20gZXF1YWxpdHkgZnVuY3Rpb25cbiAqIGNvbnN0IHVzZXJTaWduYWwgPSB0ZXJtaW5hbFNpZ25hbChcbiAqICAgeyBpZDogMSwgbmFtZTogJ0pvaG4nIH0sXG4gKiAgIChhLCBiKSA9PiBhLmlkID09PSBiLmlkIC8vIE9ubHkgY29tcGFyZSBieSBJRFxuICogKTtcbiAqXG4gKiB1c2VyU2lnbmFsLnNldCh7IGlkOiAxLCBuYW1lOiAnSmFuZScgfSk7IC8vIE5vIHVwZGF0ZSAoc2FtZSBJRClcbiAqIHVzZXJTaWduYWwuc2V0KHsgaWQ6IDIsIG5hbWU6ICdKYW5lJyB9KTsgLy8gVHJpZ2dlcnMgdXBkYXRlIChkaWZmZXJlbnQgSUQpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlcm1pbmFsU2lnbmFsPFQ+KFxuICB2YWx1ZTogVCxcbiAgY3VzdG9tRXF1YWw/OiAoYTogVCwgYjogVCkgPT4gYm9vbGVhblxuKTogV3JpdGFibGVTaWduYWw8VD4ge1xuICByZXR1cm4gc2lnbmFsKHZhbHVlLCB7XG4gICAgZXF1YWw6IGN1c3RvbUVxdWFsIHx8IGVxdWFsLFxuICB9KTtcbn1cblxuLyoqXG4gKiBMUlUgQ2FjaGUgaW1wbGVtZW50YXRpb24gZm9yIGVmZmljaWVudCBtZW1vcnkgbWFuYWdlbWVudFxuICovXG5jbGFzcyBMUlVDYWNoZTxLLCBWPiB7XG4gIHByaXZhdGUgY2FjaGUgPSBuZXcgTWFwPEssIFY+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXhTaXplOiBudW1iZXIpIHt9XG5cbiAgc2V0KGtleTogSywgdmFsdWU6IFYpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYWNoZS5zaXplID49IHRoaXMubWF4U2l6ZSkge1xuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLmNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNhY2hlLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJlbW92ZSBpZiBleGlzdHMgdG8gdXBkYXRlIHBvc2l0aW9uXG4gICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTsgLy8gQWRkIHRvIGVuZCAobW9zdCByZWNlbnQpXG4gIH1cblxuICBnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBNb3ZlIHRvIGVuZCAobWFyayBhcyByZWNlbnRseSB1c2VkKVxuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuc2l6ZTtcbiAgfVxufVxuXG4vLyBQYXRoIHBhcnNpbmcgY2FjaGUgd2l0aCBwcm9wZXIgTFJVIGV2aWN0aW9uIHN0cmF0ZWd5XG5jb25zdCBNQVhfQ0FDSEVfU0laRSA9IDEwMDA7XG5jb25zdCBwYXRoQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBzdHJpbmdbXT4oTUFYX0NBQ0hFX1NJWkUpO1xuXG4vKipcbiAqIFBhcnNlcyBhIGRvdC1ub3RhdGlvbiBwYXRoIGludG8gYW4gYXJyYXkgb2Yga2V5cyB3aXRoIGludGVsbGlnZW50IGNhY2hpbmcuXG4gKlxuICogQ29udmVydHMgc3RyaW5nIHBhdGhzIGxpa2UgJ3VzZXIucHJvZmlsZS5uYW1lJyBpbnRvIGFycmF5cyBbJ3VzZXInLCAncHJvZmlsZScsICduYW1lJ11cbiAqIGZvciBlZmZpY2llbnQgbmVzdGVkIHByb3BlcnR5IGFjY2Vzcy4gVXNlcyBMUlUgY2FjaGluZyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZVxuICogZm9yIGZyZXF1ZW50bHkgYWNjZXNzZWQgcGF0aHMgd2hpbGUgcHJldmVudGluZyBtZW1vcnkgbGVha3MuXG4gKlxuICogQHBhcmFtIHBhdGggLSBEb3Qtbm90YXRpb24gcGF0aCBzdHJpbmcgdG8gcGFyc2VcbiAqIEByZXR1cm5zIEFycmF5IG9mIHByb3BlcnR5IGtleXMgZm9yIG5lc3RlZCBhY2Nlc3NcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQmFzaWMgcGF0aCBwYXJzaW5nXG4gKiBwYXJzZVBhdGgoJ3VzZXIubmFtZScpOyAgICAgICAgICAgLy8gWyd1c2VyJywgJ25hbWUnXVxuICogcGFyc2VQYXRoKCdkYXRhLml0ZW1zLjAudGl0bGUnKTsgIC8vIFsnZGF0YScsICdpdGVtcycsICcwJywgJ3RpdGxlJ11cbiAqIHBhcnNlUGF0aCgnc2V0dGluZ3MnKTsgICAgICAgICAgICAvLyBbJ3NldHRpbmdzJ11cbiAqXG4gKiAvLyBDYWNoZWQgZm9yIHBlcmZvcm1hbmNlXG4gKiBwYXJzZVBhdGgoJ3VzZXIucHJvZmlsZS5uYW1lJyk7ICAgLy8gUGFyc2VzIGFuZCBjYWNoZXNcbiAqIHBhcnNlUGF0aCgndXNlci5wcm9maWxlLm5hbWUnKTsgICAvLyBSZXR1cm5zIGNhY2hlZCByZXN1bHRcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBVc2VkIGludGVybmFsbHkgZm9yIG5lc3RlZCBzdGF0ZSBhY2Nlc3NcbiAqIGNvbnN0IHN0b3JlID0gc2lnbmFsVHJlZSh7XG4gKiAgIHVzZXI6IHsgcHJvZmlsZTogeyBuYW1lOiAnSm9obicgfSB9XG4gKiB9KTtcbiAqXG4gKiAvLyBJbnRlcm5hbGx5IHVzZXMgcGFyc2VQYXRoIGZvciBlZmZpY2llbnQgYWNjZXNzXG4gKiBzdG9yZS51c2VyLnByb2ZpbGUubmFtZS5zZXQoJ0phbmUnKTtcbiAqXG4gKiAvLyBPciB3aXRoIHN0cmluZyBwYXRocyBpbiBleHRlbnNpb25zXG4gKiBzZXROZXN0ZWRWYWx1ZShzdG9yZSwgJ3VzZXIucHJvZmlsZS5uYW1lJywgJ0JvYicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjYWNoZWQgPSBwYXRoQ2FjaGUuZ2V0KHBhdGgpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICBwYXRoQ2FjaGUuc2V0KHBhdGgsIHBhcnRzKTtcbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXp5IHNpZ25hbCB0cmVlIHVzaW5nIFByb3h5IGZvciBvbi1kZW1hbmQgc2lnbmFsIGNyZWF0aW9uLlxuICogT25seSBjcmVhdGVzIHNpZ25hbHMgd2hlbiBwcm9wZXJ0aWVzIGFyZSBmaXJzdCBhY2Nlc3NlZC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9KQm9yZ2lhL3NpZ25hbHRyZWUvYmxvYi9tYWluL2RvY3MvYXBpL2NyZWF0ZS1sYXp5LXNpZ25hbC10cmVlLm1kXG4gKiBAcGFyYW0gb2JqIC0gU291cmNlIG9iamVjdCB0byBsYXppbHkgc2lnbmFsaWZ5XG4gKiBAcGFyYW0gZXF1YWxpdHlGbiAtIEVxdWFsaXR5IGZ1bmN0aW9uIGZvciBzaWduYWwgY29tcGFyaXNvblxuICogQHBhcmFtIGJhc2VQYXRoIC0gQmFzZSBwYXRoIGZvciBuZXN0ZWQgb2JqZWN0cyAoaW50ZXJuYWwgdXNlKVxuICogQHJldHVybnMgUHJveGllZCBvYmplY3QgdGhhdCBjcmVhdGVzIHNpZ25hbHMgb24gZmlyc3QgYWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYXp5U2lnbmFsVHJlZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb2JqOiBULFxuICBlcXVhbGl0eUZuOiAoYTogdW5rbm93biwgYjogdW5rbm93bikgPT4gYm9vbGVhbixcbiAgYmFzZVBhdGggPSAnJ1xuKTogRGVlcFNpZ25hbGlmeTxUPiB7XG4gIC8vIFVzZSBNYXAgaW5zdGVhZCBvZiBXZWFrTWFwIGZvciBiZXR0ZXIgY29udHJvbCBvdmVyIGNsZWFudXBcbiAgY29uc3Qgc2lnbmFsQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgV3JpdGFibGVTaWduYWw8dW5rbm93bj4+KCk7XG4gIGNvbnN0IG5lc3RlZFByb3hpZXMgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcblxuICAvLyBUcmFjayBjbGVhbnVwIGZ1bmN0aW9ucyBmb3IgbmVzdGVkIHByb3hpZXNcbiAgY29uc3QgbmVzdGVkQ2xlYW51cHMgPSBuZXcgTWFwPHN0cmluZywgKCkgPT4gdm9pZD4oKTtcblxuICAvLyBFbmhhbmNlZCBjbGVhbnVwIGZ1bmN0aW9uXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgLy8gQ2xlYW4gdXAgYWxsIG5lc3RlZCBwcm94aWVzIGZpcnN0XG4gICAgbmVzdGVkQ2xlYW51cHMuZm9yRWFjaCgoY2xlYW51cEZuKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjbGVhbnVwRm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgZHVyaW5nIG5lc3RlZCBjbGVhbnVwOicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZXN0ZWRDbGVhbnVwcy5jbGVhcigpO1xuXG4gICAgLy8gQ2xlYXIgY2FjaGVzXG4gICAgc2lnbmFsQ2FjaGUuY2xlYXIoKTtcbiAgICBuZXN0ZWRQcm94aWVzLmNsZWFyKCk7XG4gIH07XG5cbiAgLy8gRW5oYW5jZWQgYnVpbHQtaW4gb2JqZWN0IGRldGVjdGlvblxuICBjb25zdCBpc0J1aWx0SW5PYmplY3QgPSAodjogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHYgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICB2IGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgICB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdiBpbnN0YW5jZW9mIE1hcCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFNldCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBXZWFrU2V0IHx8XG4gICAgICB2IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBEYXRhVmlldyB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICAgICB2IGluc3RhbmNlb2YgUHJvbWlzZSB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFVSTCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcyB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8XG4gICAgICB2IGluc3RhbmNlb2YgQmxvYiB8fFxuICAgICAgKHR5cGVvZiBGaWxlICE9PSAndW5kZWZpbmVkJyAmJiB2IGluc3RhbmNlb2YgRmlsZSlcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgICAvLyBIYW5kbGUgY2xlYW51cCBtZXRob2RcbiAgICAgIGlmIChwcm9wID09PSAnX19jbGVhbnVwX18nKSB7XG4gICAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3ltYm9sIHByb3BlcnRpZXMgKGxpa2UgU3ltYm9sLml0ZXJhdG9yKSBub3JtYWxseVxuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBpbnNwZWN0aW9uIG1ldGhvZHNcbiAgICAgIGlmIChwcm9wID09PSAndmFsdWVPZicgfHwgcHJvcCA9PT0gJ3RvU3RyaW5nJykge1xuICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHByb3AgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoID8gYCR7YmFzZVBhdGh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIC8vIFNhZmV0eSBjaGVjayBmb3IgcHJvcGVydHkgZXhpc3RlbmNlXG4gICAgICBpZiAoIShrZXkgaW4gdGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG5cbiAgICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIHNpZ25hbCwgcmV0dXJuIGl0XG4gICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc2lnbmFsIGZvciB0aGlzIHBhdGhcbiAgICAgIGlmIChzaWduYWxDYWNoZS5oYXMocGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIG5lc3RlZCBwcm94eSBjYWNoZWRcbiAgICAgIGlmIChuZXN0ZWRQcm94aWVzLmhhcyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gbmVzdGVkUHJveGllcy5nZXQocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgb2JqZWN0cyAtIGNyZWF0ZSBsYXp5IHByb3h5XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc1NpZ25hbCh2YWx1ZSkgJiZcbiAgICAgICAgIWlzQnVpbHRJbk9iamVjdCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG5lc3RlZFByb3h5ID0gY3JlYXRlTGF6eVNpZ25hbFRyZWUoXG4gICAgICAgICAgICB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIGVxdWFsaXR5Rm4sXG4gICAgICAgICAgICBwYXRoXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIG5lc3RlZFByb3hpZXMuc2V0KHBhdGgsIG5lc3RlZFByb3h5KTtcblxuICAgICAgICAgIC8vIFN0b3JlIGNsZWFudXAgZnVuY3Rpb24gZm9yIG5lc3RlZCBwcm94eVxuICAgICAgICAgIGNvbnN0IHByb3h5V2l0aENsZWFudXAgPSBuZXN0ZWRQcm94eSBhcyB7IF9fY2xlYW51cF9fPzogKCkgPT4gdm9pZCB9O1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJveHlXaXRoQ2xlYW51cC5fX2NsZWFudXBfXyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVzdGVkQ2xlYW51cHMuc2V0KHBhdGgsIHByb3h5V2l0aENsZWFudXAuX19jbGVhbnVwX18pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuZXN0ZWRQcm94eTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBsYXp5IHByb3h5IGZvciBwYXRoIFwiJHtwYXRofVwiOmAsXG4gICAgICAgICAgICBlcnJvclxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IGNyZWF0ZSBhIHNpZ25hbCBmb3IgdGhlIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrU2lnbmFsID0gc2lnbmFsKHZhbHVlLCB7IGVxdWFsOiBlcXVhbGl0eUZuIH0pO1xuICAgICAgICAgIHNpZ25hbENhY2hlLnNldChwYXRoLCBmYWxsYmFja1NpZ25hbCk7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrU2lnbmFsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBzaWduYWwgZm9yIHByaW1pdGl2ZSB2YWx1ZXMsIGFycmF5cywgYW5kIGJ1aWx0LWluIG9iamVjdHNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5ld1NpZ25hbCA9IHNpZ25hbCh2YWx1ZSwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KTtcbiAgICAgICAgc2lnbmFsQ2FjaGUuc2V0KHBhdGgsIG5ld1NpZ25hbCk7XG4gICAgICAgIHJldHVybiBuZXdTaWduYWw7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBjcmVhdGUgc2lnbmFsIGZvciBwYXRoIFwiJHtwYXRofVwiOmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlOyAvLyBSZXR1cm4gcmF3IHZhbHVlIGFzIGZhbGxiYWNrXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldCh0YXJnZXQ6IG9iamVjdCwgcHJvcDogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogdW5rbm93bikge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gcHJvcCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW5hbCBvYmplY3RcbiAgICAgICAgKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWNoZWQgc2lnbmFsLCB1cGRhdGUgaXRcbiAgICAgICAgY29uc3QgY2FjaGVkU2lnbmFsID0gc2lnbmFsQ2FjaGUuZ2V0KHBhdGgpO1xuICAgICAgICBpZiAoY2FjaGVkU2lnbmFsICYmICdzZXQnIGluIGNhY2hlZFNpZ25hbCkge1xuICAgICAgICAgIChjYWNoZWRTaWduYWwgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pLnNldCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBuZXN0ZWQgcHJveHkgY2FjaGUgaWYgdGhlIHZhbHVlIHR5cGUgY2hhbmdlZFxuICAgICAgICBpZiAobmVzdGVkUHJveGllcy5oYXMocGF0aCkpIHtcbiAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgbmVzdGVkIHByb3h5XG4gICAgICAgICAgY29uc3QgbmVzdGVkQ2xlYW51cCA9IG5lc3RlZENsZWFudXBzLmdldChwYXRoKTtcbiAgICAgICAgICBpZiAobmVzdGVkQ2xlYW51cCkge1xuICAgICAgICAgICAgbmVzdGVkQ2xlYW51cCgpO1xuICAgICAgICAgICAgbmVzdGVkQ2xlYW51cHMuZGVsZXRlKHBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXN0ZWRQcm94aWVzLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gc2V0IHZhbHVlIGZvciBwYXRoIFwiJHtwYXRofVwiOmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQ7XG4gICAgfSxcblxuICAgIG93bktleXModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gICAgfSxcblxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBwcm94eSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xufVxuXG4vKipcbiAqIE5hdGl2ZSBkZWVwIGVxdWFsaXR5IGNoZWNrIGZvciBhcnJheXMgYW5kIG9iamVjdHMuXG4gKiBBbGlhcyBmb3IgdGhlIGVuaGFuY2VkIGVxdWFsIGZ1bmN0aW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgY29uc3QgZGVlcEVxdWFsID0gZXF1YWw7XG5cbi8qKlxuICogU2hhbGxvdyBlcXVhbGl0eSBjaGVjayBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsPFQ+KGE6IFQsIGI6IFQpOiBib29sZWFuIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzQSkge1xuICAgICAgaWYgKFxuICAgICAgICAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSAhPT1cbiAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV1cbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==","import { signal, computed, effect, inject, DestroyRef, isSignal, } from '@angular/core';\nimport { createLazySignalTree, equal } from './utils';\nfunction estimateObjectSize(obj, maxDepth = 3, currentDepth = 0) {\n if (currentDepth >= maxDepth)\n return 1;\n if (obj === null || obj === undefined)\n return 0;\n if (typeof obj !== 'object')\n return 1;\n let size = 0;\n try {\n if (Array.isArray(obj)) {\n size = obj.length;\n const sampleSize = Math.min(3, obj.length);\n for (let i = 0; i < sampleSize; i++) {\n size += estimateObjectSize(obj[i], maxDepth, currentDepth + 1) * 0.1;\n }\n }\n else {\n const keys = Object.keys(obj);\n size = keys.length;\n const sampleSize = Math.min(5, keys.length);\n for (let i = 0; i < sampleSize; i++) {\n const value = obj[keys[i]];\n size += estimateObjectSize(value, maxDepth, currentDepth + 1) * 0.5;\n }\n }\n }\n catch {\n return 1;\n }\n return Math.floor(size);\n}\nfunction shouldUseLazy(obj, config) {\n if (config.useLazySignals !== undefined) {\n return config.useLazySignals;\n }\n if (config.debugMode || config.enableDevTools) {\n return false;\n }\n if (config.batchUpdates && config.useMemoization) {\n return true;\n }\n const estimatedSize = estimateObjectSize(obj);\n return estimatedSize > 50;\n}\nfunction createEqualityFn(useShallowComparison) {\n return useShallowComparison ? Object.is : equal;\n}\nfunction isBuiltInObject(v) {\n if (v === null || v === undefined)\n return false;\n if (v instanceof Date ||\n v instanceof RegExp ||\n typeof v === 'function' ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n v instanceof Error ||\n v instanceof Promise) {\n return true;\n }\n if (v instanceof Int8Array ||\n v instanceof Uint8Array ||\n v instanceof Uint8ClampedArray ||\n v instanceof Int16Array ||\n v instanceof Uint16Array ||\n v instanceof Int32Array ||\n v instanceof Uint32Array ||\n v instanceof Float32Array ||\n v instanceof Float64Array ||\n v instanceof BigInt64Array ||\n v instanceof BigUint64Array) {\n return true;\n }\n if (typeof window !== 'undefined') {\n if (v instanceof URL ||\n v instanceof URLSearchParams ||\n v instanceof FormData ||\n v instanceof Blob ||\n (typeof File !== 'undefined' && v instanceof File) ||\n (typeof FileList !== 'undefined' && v instanceof FileList) ||\n (typeof Headers !== 'undefined' && v instanceof Headers) ||\n (typeof Request !== 'undefined' && v instanceof Request) ||\n (typeof Response !== 'undefined' && v instanceof Response) ||\n (typeof AbortController !== 'undefined' &&\n v instanceof AbortController) ||\n (typeof AbortSignal !== 'undefined' && v instanceof AbortSignal)) {\n return true;\n }\n }\n try {\n const NodeBuffer = globalThis?.Buffer;\n if (NodeBuffer && v instanceof NodeBuffer) {\n return true;\n }\n }\n catch {\n }\n return false;\n}\nfunction create(obj, config = {}) {\n if (obj === null || obj === undefined) {\n throw new Error('Cannot create SignalTree from null or undefined');\n }\n const equalityFn = createEqualityFn(config.useShallowComparison ?? false);\n const useLazy = shouldUseLazy(obj, config);\n if (config.debugMode) {\n const estimatedSize = estimateObjectSize(obj);\n console.log(`[SignalTree] Creating tree with ${useLazy ? 'lazy' : 'eager'} strategy (estimated size: ${estimatedSize})`);\n }\n let signalState;\n try {\n if (useLazy && typeof obj === 'object') {\n signalState = createLazySignalTree(obj, equalityFn);\n }\n else {\n signalState = createSignalStore(obj, equalityFn);\n }\n }\n catch (error) {\n if (useLazy) {\n console.warn('[SignalTree] Lazy creation failed, falling back to eager:', error);\n signalState = createSignalStore(obj, equalityFn);\n }\n else {\n throw error;\n }\n }\n const resultTree = {\n state: signalState,\n $: signalState,\n };\n enhanceTree(resultTree, config);\n return resultTree;\n}\nfunction createSignalStore(obj, equalityFn) {\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return signal(obj, { equal: equalityFn });\n }\n if (Array.isArray(obj)) {\n return signal(obj, { equal: equalityFn });\n }\n if (isBuiltInObject(obj)) {\n return signal(obj, { equal: equalityFn });\n }\n const store = {};\n const processedObjects = new WeakSet();\n if (processedObjects.has(obj)) {\n console.warn('[SignalTree] Circular reference detected, creating reference signal');\n return signal(obj, { equal: equalityFn });\n }\n processedObjects.add(obj);\n try {\n for (const [key, value] of Object.entries(obj)) {\n try {\n if (typeof key === 'symbol')\n continue;\n if (isSignal(value)) {\n store[key] = value;\n continue;\n }\n if (value === null || value === undefined) {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else if (typeof value !== 'object') {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else if (Array.isArray(value) || isBuiltInObject(value)) {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else {\n store[key] = createSignalStore(value, equalityFn);\n }\n }\n catch (error) {\n console.warn(`[SignalTree] Failed to create signal for key \"${key}\":`, error);\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n const symbols = Object.getOwnPropertySymbols(obj);\n for (const sym of symbols) {\n const value = obj[sym];\n try {\n if (isSignal(value)) {\n store[sym] = value;\n }\n else {\n store[sym] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n catch (error) {\n console.warn(`[SignalTree] Failed to create signal for symbol key:`, error);\n }\n }\n }\n catch (error) {\n throw new Error(`Failed to create signal store: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n return store;\n}\nfunction enhanceTree(tree, config = {}) {\n const isLazy = config.useLazySignals ?? shouldUseLazy(tree.state, config);\n tree.unwrap = () => {\n const unwrapObject = (obj) => {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n if (isSignal(obj)) {\n return obj();\n }\n if (isSignal(obj)) {\n const value = obj();\n if (Array.isArray(value)) {\n return value;\n }\n }\n const result = {};\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key))\n continue;\n const value = obj[key];\n if (isSignal(value)) {\n result[key] = value();\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n !isBuiltInObject(value)) {\n result[key] = unwrapObject(value);\n }\n else {\n result[key] = value;\n }\n }\n const symbols = Object.getOwnPropertySymbols(obj);\n for (const sym of symbols) {\n const value = obj[sym];\n if (isSignal(value)) {\n result[sym] = value();\n }\n else {\n result[sym] = value;\n }\n }\n return result;\n };\n return unwrapObject(tree.state);\n };\n tree.update = (updater) => {\n const transactionLog = [];\n try {\n const currentValue = tree.unwrap();\n const partialObj = updater(currentValue);\n if (!partialObj || typeof partialObj !== 'object') {\n throw new Error('Updater must return an object');\n }\n const updateObject = (target, updates, path = '') => {\n for (const key in updates) {\n if (!Object.prototype.hasOwnProperty.call(updates, key))\n continue;\n const updateValue = updates[key];\n const currentPath = path ? `${path}.${key}` : key;\n const currentSignalOrState = target[key];\n try {\n if (isSignal(currentSignalOrState)) {\n const originalValue = currentSignalOrState();\n transactionLog.push({\n path: currentPath,\n oldValue: originalValue,\n newValue: updateValue,\n });\n currentSignalOrState.set(updateValue);\n }\n else if (typeof updateValue === 'object' &&\n updateValue !== null &&\n !Array.isArray(updateValue) &&\n !isBuiltInObject(updateValue) &&\n typeof currentSignalOrState === 'object' &&\n currentSignalOrState !== null &&\n !isSignal(currentSignalOrState)) {\n updateObject(currentSignalOrState, updateValue, currentPath);\n }\n else if (currentSignalOrState === undefined) {\n console.warn(`[SignalTree] Cannot update non-existent path: ${currentPath}`);\n }\n }\n catch (error) {\n console.error(`[SignalTree] Failed to update path \"${currentPath}\":`, error);\n throw error;\n }\n }\n };\n updateObject(tree.state, partialObj);\n if (config.debugMode && transactionLog.length > 0) {\n console.log('[SignalTree] Update transaction:', transactionLog);\n }\n }\n catch (error) {\n console.error('[SignalTree] Update failed, attempting rollback:', error);\n for (const { path, oldValue } of transactionLog.reverse()) {\n try {\n const pathParts = path.split('.');\n let current = tree.state;\n for (let i = 0; i < pathParts.length - 1; i++) {\n current = current[pathParts[i]];\n if (!current)\n break;\n }\n if (current) {\n const lastKey = pathParts[pathParts.length - 1];\n const targetSignal = current[lastKey];\n if (isSignal(targetSignal)) {\n targetSignal.set(oldValue);\n }\n }\n }\n catch (rollbackError) {\n console.error('[SignalTree] Rollback failed for path:', path, rollbackError);\n }\n }\n throw error;\n }\n };\n tree.pipe = ((...fns) => {\n if (fns.length === 0) {\n return tree;\n }\n return fns.reduce((acc, fn) => {\n if (typeof fn !== 'function') {\n throw new Error('All pipe arguments must be functions');\n }\n try {\n return fn(acc);\n }\n catch (error) {\n console.error('[SignalTree] Pipe function failed:', error);\n throw error;\n }\n }, tree);\n });\n tree.destroy = () => {\n try {\n if (isLazy) {\n const state = tree.state;\n if (state && typeof state === 'object' && '__cleanup__' in state) {\n const cleanup = state.__cleanup__;\n if (typeof cleanup === 'function') {\n cleanup();\n }\n }\n }\n if (config.debugMode) {\n console.log('[SignalTree] Tree destroyed');\n }\n }\n catch (error) {\n console.error('[SignalTree] Error during cleanup:', error);\n }\n };\n addStubMethods(tree, config);\n return tree;\n}\nfunction addStubMethods(tree, config) {\n tree.batchUpdate = (updater) => {\n console.warn('⚠️ batchUpdate() called but batching is not enabled.', 'To enable batch updates, install @signaltree/batching');\n tree.update(updater);\n };\n tree.memoize = (fn, cacheKey) => {\n console.warn('⚠️ memoize() called but memoization is not enabled.', 'To enable memoized computations, install @signaltree/memoization');\n void cacheKey;\n return computed(() => fn(tree.unwrap()));\n };\n tree.effect = (fn) => {\n try {\n effect(() => fn(tree.unwrap()));\n }\n catch (error) {\n if (config.debugMode) {\n console.warn('Effect requires Angular injection context', error);\n }\n }\n };\n tree.subscribe = (fn) => {\n try {\n const destroyRef = inject(DestroyRef);\n let isDestroyed = false;\n const effectRef = effect(() => {\n if (!isDestroyed) {\n fn(tree.unwrap());\n }\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n const unsubscribe = () => {\n isDestroyed = true;\n effectRef.destroy();\n };\n destroyRef.onDestroy(unsubscribe);\n return unsubscribe;\n }\n catch (error) {\n if (config.debugMode) {\n console.warn('Subscribe requires Angular injection context', error);\n }\n fn(tree.unwrap());\n return () => {\n };\n }\n };\n tree.optimize = () => {\n if (config.debugMode) {\n console.warn('⚠️ optimize() called but tree optimization is not available.');\n }\n };\n tree.clearCache = () => {\n if (config.debugMode) {\n console.warn('⚠️ clearCache() called but caching is not available.');\n }\n };\n tree.invalidatePattern = () => {\n if (config.debugMode) {\n console.warn('⚠️ invalidatePattern() called but performance optimization is not enabled.');\n }\n return 0;\n };\n tree.getMetrics = () => {\n return {\n updates: 0,\n computations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n averageUpdateTime: 0,\n };\n };\n tree.addTap = (middleware) => {\n if (config.debugMode) {\n console.warn('⚠️ addTap() called but middleware support is not available.');\n }\n void middleware;\n };\n tree.removeTap = (id) => {\n if (config.debugMode) {\n console.warn('⚠️ removeTap() called but middleware support is not available.');\n }\n void id;\n };\n tree.asCrud = () => {\n if (config.debugMode) {\n console.warn('⚠️ asCrud() called but entity helpers are not available.');\n }\n return {};\n };\n tree.asyncAction = (operation, asyncConfig = {}) => {\n if (config.debugMode) {\n console.warn('⚠️ asyncAction() called but async actions are not available.');\n }\n void operation;\n void asyncConfig;\n return {};\n };\n tree.undo = () => {\n if (config.debugMode) {\n console.warn('⚠️ undo() called but time travel is not available.');\n }\n };\n tree.redo = () => {\n if (config.debugMode) {\n console.warn('⚠️ redo() called but time travel is not available.');\n }\n };\n tree.getHistory = () => {\n if (config.debugMode) {\n console.warn('⚠️ getHistory() called but time travel is not available.');\n }\n return [];\n };\n tree.resetHistory = () => {\n if (config.debugMode) {\n console.warn('⚠️ resetHistory() called but time travel is not available.');\n }\n };\n}\nexport function signalTree(obj, configOrPreset) {\n if (typeof configOrPreset === 'string') {\n const presetConfigs = {\n basic: {\n useLazySignals: false,\n debugMode: false,\n },\n performance: {\n useLazySignals: true,\n batchUpdates: true,\n useMemoization: true,\n useShallowComparison: true,\n },\n development: {\n useLazySignals: false,\n debugMode: true,\n enableDevTools: true,\n trackPerformance: true,\n },\n production: {\n useLazySignals: true,\n batchUpdates: true,\n useMemoization: true,\n debugMode: false,\n },\n };\n const config = presetConfigs[configOrPreset];\n if (!config) {\n console.warn(`Unknown preset: ${configOrPreset}, using default configuration`);\n return create(obj, {});\n }\n return create(obj, config);\n }\n const config = configOrPreset || {};\n return create(obj, config);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2lnbmFsLXRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBYXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFTdEQsU0FBUyxrQkFBa0IsQ0FDekIsR0FBWSxFQUNaLFFBQVEsR0FBRyxDQUFDLEVBQ1osWUFBWSxHQUFHLENBQUM7SUFFaEIsSUFBSSxZQUFZLElBQUksUUFBUTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXRDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUViLElBQUksQ0FBQztRQUNILElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBRWxCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7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RUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFHRCxNQUFNLE1BQU0sR0FBRyxjQUFjLElBQUksRUFBRSxDQUFDO0lBQ3BDLE9BQU8sTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaWduYWxUcmVlIENvcmUgdjEuMS4xIC0gRmFpciBTb3VyY2UgTGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDI1IEpvbmF0aGFuIEQgQm9yZ2lhXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9KQm9yZ2lhL3NpZ25hbHRyZWUvYmxvYi9tYWluL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgRGVzdHJveVJlZixcbiAgaXNTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUge1xuICBTaWduYWxUcmVlLFxuICBEZWVwU2lnbmFsaWZ5LFxuICBUcmVlQ29uZmlnLFxuICBUcmVlUHJlc2V0LFxuICBNaWRkbGV3YXJlLFxuICBQZXJmb3JtYW5jZU1ldHJpY3MsXG4gIEVudGl0eUhlbHBlcnMsXG4gIEFzeW5jQWN0aW9uQ29uZmlnLFxuICBBc3luY0FjdGlvbixcbiAgVGltZVRyYXZlbEVudHJ5LFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUxhenlTaWduYWxUcmVlLCBlcXVhbCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUEVSRk9STUFOQ0UgSEVVUklTVElDU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBFc3RpbWF0ZXMgdGhlIHNpemUgb2YgYW4gb2JqZWN0IGZvciBzdHJhdGVneSBzZWxlY3Rpb25cbiAqL1xuZnVuY3Rpb24gZXN0aW1hdGVPYmplY3RTaXplKFxuICBvYmo6IHVua25vd24sXG4gIG1heERlcHRoID0gMyxcbiAgY3VycmVudERlcHRoID0gMFxuKTogbnVtYmVyIHtcbiAgaWYgKGN1cnJlbnREZXB0aCA+PSBtYXhEZXB0aCkgcmV0dXJuIDE7XG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHJldHVybiAxO1xuXG4gIGxldCBzaXplID0gMDtcblxuICB0cnkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHNpemUgPSBvYmoubGVuZ3RoO1xuICAgICAgLy8gU2FtcGxlIGZpcnN0IGZldyBpdGVtcyBmb3IgbmVzdGVkIHNpemUgZXN0aW1hdGlvblxuICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IE1hdGgubWluKDMsIG9iai5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgc2l6ZSArPSBlc3RpbWF0ZU9iamVjdFNpemUob2JqW2ldLCBtYXhEZXB0aCwgY3VycmVudERlcHRoICsgMSkgKiAwLjE7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgc2l6ZSA9IGtleXMubGVuZ3RoO1xuICAgICAgLy8gU2FtcGxlIGZpcnN0IGZldyBwcm9wZXJ0aWVzIGZvciBuZXN0ZWQgc2l6ZSBlc3RpbWF0aW9uXG4gICAgICBjb25zdCBzYW1wbGVTaXplID0gTWF0aC5taW4oNSwga2V5cy5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXlzW2ldXTtcbiAgICAgICAgc2l6ZSArPSBlc3RpbWF0ZU9iamVjdFNpemUodmFsdWUsIG1heERlcHRoLCBjdXJyZW50RGVwdGggKyAxKSAqIDAuNTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHdlIGNhbid0IGVzdGltYXRlLCBhc3N1bWUgc21hbGxcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKHNpemUpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0byB1c2UgbGF6eSBzaWduYWwgY3JlYXRpb24gYmFzZWQgb24gb2JqZWN0IGNoYXJhY3RlcmlzdGljc1xuICovXG5mdW5jdGlvbiBzaG91bGRVc2VMYXp5KG9iajogdW5rbm93biwgY29uZmlnOiBUcmVlQ29uZmlnKTogYm9vbGVhbiB7XG4gIC8vIEV4cGxpY2l0IGNvbmZpZ3VyYXRpb24gdGFrZXMgcHJlY2VkZW5jZVxuICBpZiAoY29uZmlnLnVzZUxhenlTaWduYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29uZmlnLnVzZUxhenlTaWduYWxzO1xuICB9XG5cbiAgLy8gRGV2ZWxvcG1lbnQgbW9kZTogcHJlZmVyIGVhZ2VyIGZvciBiZXR0ZXIgZGVidWdnaW5nXG4gIGlmIChjb25maWcuZGVidWdNb2RlIHx8IGNvbmZpZy5lbmFibGVEZXZUb29scykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFBlcmZvcm1hbmNlIG1vZGU6IGFsd2F5cyB1c2UgbGF6eVxuICBpZiAoY29uZmlnLmJhdGNoVXBkYXRlcyAmJiBjb25maWcudXNlTWVtb2l6YXRpb24pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEF1dG8tZGV0ZWN0IGJhc2VkIG9uIHNpemVcbiAgY29uc3QgZXN0aW1hdGVkU2l6ZSA9IGVzdGltYXRlT2JqZWN0U2l6ZShvYmopO1xuXG4gIC8vIFVzZSBsYXp5IGZvciBvYmplY3RzIHdpdGggbW9yZSB0aGFuIDUwIGVzdGltYXRlZCBwcm9wZXJ0aWVzXG4gIHJldHVybiBlc3RpbWF0ZWRTaXplID4gNTA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcXVhbGl0eSBmdW5jdGlvbiBiYXNlZCBvbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBwYXJhbSB1c2VTaGFsbG93Q29tcGFyaXNvbiAtIElmIHRydWUsIHVzZXMgT2JqZWN0LmlzIGZvciBjb21wYXJpc29uOyBvdGhlcndpc2UgdXNlcyBkZWVwIGVxdWFsaXR5XG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdHdvIHZhbHVlcyBmb3IgZXF1YWxpdHlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRXF1YWxpdHlGbih1c2VTaGFsbG93Q29tcGFyaXNvbjogYm9vbGVhbikge1xuICByZXR1cm4gdXNlU2hhbGxvd0NvbXBhcmlzb24gPyBPYmplY3QuaXMgOiBlcXVhbDtcbn1cblxuLyoqXG4gKiBFbmhhbmNlZCBidWlsdC1pbiBvYmplY3QgZGV0ZWN0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBjb3ZlcmFnZVxuICovXG5mdW5jdGlvbiBpc0J1aWx0SW5PYmplY3QodjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcblxuICAvLyBDb3JlIEphdmFTY3JpcHQgYnVpbHQtaW5zXG4gIGlmIChcbiAgICB2IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgIHYgaW5zdGFuY2VvZiBSZWdFeHAgfHxcbiAgICB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIHYgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICB2IGluc3RhbmNlb2YgU2V0IHx8XG4gICAgdiBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICB2IGluc3RhbmNlb2YgV2Vha1NldCB8fFxuICAgIHYgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fFxuICAgIHYgaW5zdGFuY2VvZiBEYXRhVmlldyB8fFxuICAgIHYgaW5zdGFuY2VvZiBFcnJvciB8fFxuICAgIHYgaW5zdGFuY2VvZiBQcm9taXNlXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gVHlwZWQgQXJyYXlzXG4gIGlmIChcbiAgICB2IGluc3RhbmNlb2YgSW50OEFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgSW50MTZBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBVaW50MTZBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIFVpbnQzMkFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgQmlnSW50NjRBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBCaWdVaW50NjRBcnJheVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFdlYiBBUElzICh3aGVuIGF2YWlsYWJsZSlcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKFxuICAgICAgdiBpbnN0YW5jZW9mIFVSTCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcyB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8XG4gICAgICB2IGluc3RhbmNlb2YgQmxvYiB8fFxuICAgICAgKHR5cGVvZiBGaWxlICE9PSAndW5kZWZpbmVkJyAmJiB2IGluc3RhbmNlb2YgRmlsZSkgfHxcbiAgICAgICh0eXBlb2YgRmlsZUxpc3QgIT09ICd1bmRlZmluZWQnICYmIHYgaW5zdGFuY2VvZiBGaWxlTGlzdCkgfHxcbiAgICAgICh0eXBlb2YgSGVhZGVycyAhPT0gJ3VuZGVmaW5lZCcgJiYgdiBpbnN0YW5jZW9mIEhlYWRlcnMpIHx8XG4gICAgICAodHlwZW9mIFJlcXVlc3QgIT09ICd1bmRlZmluZWQnICYmIHYgaW5zdGFuY2VvZiBSZXF1ZXN0KSB8fFxuICAgICAgKHR5cGVvZiBSZXNwb25zZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdiBpbnN0YW5jZW9mIFJlc3BvbnNlKSB8fFxuICAgICAgKHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHYgaW5zdGFuY2VvZiBBYm9ydENvbnRyb2xsZXIpIHx8XG4gICAgICAodHlwZW9mIEFib3J0U2lnbmFsICE9PSAndW5kZWZpbmVkJyAmJiB2IGluc3RhbmNlb2YgQWJvcnRTaWduYWwpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBOb2RlLmpzIGJ1aWx0LWlucyAod2hlbiBhdmFpbGFibGUpXG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBOb2RlQnVmZmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KT8uQnVmZmVyO1xuICAgIGlmIChOb2RlQnVmZmVyICYmIHYgaW5zdGFuY2VvZiBOb2RlQnVmZmVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIElnbm9yZSBpZiBCdWZmZXIgaXMgbm90IGF2YWlsYWJsZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvcmUgZnVuY3Rpb24gdG8gY3JlYXRlIGEgYmFzaWMgU2lnbmFsVHJlZSB3aXRoIGVuaGFuY2VkIHNhZmV0eSBhbmQgc21hcnQgc3RyYXRlZ3kgc2VsZWN0aW9uLlxuICogVGhpcyBwcm92aWRlcyB0aGUgbWluaW1hbCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYWR2YW5jZWQgZmVhdHVyZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUgKE5PIGNvbnN0cmFpbnRzIC0gbWF4aW11bSBmbGV4aWJpbGl0eSlcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSB0cmVlXG4gKiBAcmV0dXJucyBBIGJhc2ljIFNpZ25hbFRyZWUgd2l0aCBjb3JlIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlPFQ+KG9iajogVCwgY29uZmlnOiBUcmVlQ29uZmlnID0ge30pOiBTaWduYWxUcmVlPFQ+IHtcbiAgLy8gVmFsaWRhdGUgaW5wdXRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBTaWduYWxUcmVlIGZyb20gbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGVxdWFsaXR5Rm4gPSBjcmVhdGVFcXVhbGl0eUZuKGNvbmZpZy51c2VTaGFsbG93Q29tcGFyaXNvbiA/PyBmYWxzZSk7XG4gIGNvbnN0IHVzZUxhenkgPSBzaG91bGRVc2VMYXp5KG9iaiwgY29uZmlnKTtcblxuICAvLyBMb2cgc3RyYXRlZ3kgc2VsZWN0aW9uIGluIGRlYnVnIG1vZGVcbiAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICBjb25zdCBlc3RpbWF0ZWRTaXplID0gZXN0aW1hdGVPYmplY3RTaXplKG9iaik7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgW1NpZ25hbFRyZWVdIENyZWF0aW5nIHRyZWUgd2l0aCAke1xuICAgICAgICB1c2VMYXp5ID8gJ2xhenknIDogJ2VhZ2VyJ1xuICAgICAgfSBzdHJhdGVneSAoZXN0aW1hdGVkIHNpemU6ICR7ZXN0aW1hdGVkU2l6ZX0pYFxuICAgICk7XG4gIH1cblxuICAvLyBDcmVhdGUgc2lnbmFscyB1c2luZyBhcHByb3ByaWF0ZSBzdHJhdGVneVxuICBsZXQgc2lnbmFsU3RhdGU6IERlZXBTaWduYWxpZnk8VD47XG5cbiAgdHJ5IHtcbiAgICBpZiAodXNlTGF6eSAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgc2lnbmFsU3RhdGUgPSBjcmVhdGVMYXp5U2lnbmFsVHJlZShcbiAgICAgICAgb2JqIGFzIG9iamVjdCxcbiAgICAgICAgZXF1YWxpdHlGblxuICAgICAgKSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xuICAgIH0gZWxzZSB7XG4gICAgICBzaWduYWxTdGF0ZSA9IGNyZWF0ZVNpZ25hbFN0b3JlKG9iaiwgZXF1YWxpdHlGbik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZhbGxiYWNrIHRvIGVhZ2VyIGlmIGxhenkgZmFpbHNcbiAgICBpZiAodXNlTGF6eSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW1NpZ25hbFRyZWVdIExhenkgY3JlYXRpb24gZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZWFnZXI6JyxcbiAgICAgICAgZXJyb3JcbiAgICAgICk7XG4gICAgICBzaWduYWxTdGF0ZSA9IGNyZWF0ZVNpZ25hbFN0b3JlKG9iaiwgZXF1YWxpdHlGbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdFRyZWUgPSB7XG4gICAgc3RhdGU6IHNpZ25hbFN0YXRlLFxuICAgICQ6IHNpZ25hbFN0YXRlLCAvLyAkIHBvaW50cyB0byB0aGUgc2FtZSBzdGF0ZSBvYmplY3RcbiAgfSBhcyBTaWduYWxUcmVlPFQ+O1xuXG4gIGVuaGFuY2VUcmVlKHJlc3VsdFRyZWUsIGNvbmZpZyk7XG4gIHJldHVybiByZXN1bHRUcmVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgc2lnbmFscyB1c2luZyBzaWduYWwtc3RvcmUgcGF0dGVybiBmb3IgcGVyZmVjdCB0eXBlIGluZmVyZW5jZS5cbiAqIEVhZ2VyIGNyZWF0aW9uIC0gYWxsIHNpZ25hbHMgY3JlYXRlZCBpbW1lZGlhdGVseS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9KQm9yZ2lhL3NpZ25hbHRyZWUvYmxvYi9tYWluL2RvY3MvYXBpL2NyZWF0ZS1zaWduYWwtc3RvcmUubWRcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIG9iamVjdCB0eXBlIHRvIHByb2Nlc3MgKHByZXNlcnZlcyBleGFjdCB0eXBlIHN0cnVjdHVyZSlcbiAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIGNvbnZlcnQgdG8gc2lnbmFsc1xuICogQHBhcmFtIGVxdWFsaXR5Rm4gLSBGdW5jdGlvbiB0byBjb21wYXJlIHZhbHVlcyBmb3IgZXF1YWxpdHlcbiAqIEByZXR1cm5zIEEgZGVlcGx5IHNpZ25hbGlmaWVkIHZlcnNpb24gbWFpbnRhaW5pbmcgZXhhY3QgdHlwZSBzdHJ1Y3R1cmVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU2lnbmFsU3RvcmU8VD4oXG4gIG9iajogVCxcbiAgZXF1YWxpdHlGbjogKGE6IHVua25vd24sIGI6IHVua25vd24pID0+IGJvb2xlYW5cbik6IERlZXBTaWduYWxpZnk8VD4ge1xuICAvLyBIYW5kbGUgcHJpbWl0aXZlcyBhbmQgbnVsbC91bmRlZmluZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBzaWduYWwob2JqLCB7IGVxdWFsOiBlcXVhbGl0eUZuIH0pIGFzIERlZXBTaWduYWxpZnk8VD47XG4gIH1cblxuICAvLyBIYW5kbGUgYXJyYXlzIC0gdHJlYXQgYXMgcHJpbWl0aXZlIHNpZ25hbFxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIHNpZ25hbChvYmosIHsgZXF1YWw6IGVxdWFsaXR5Rm4gfSkgYXMgRGVlcFNpZ25hbGlmeTxUPjtcbiAgfVxuXG4gIC8vIEhhbmRsZSBidWlsdC1pbiBvYmplY3RzIC0gdHJlYXQgYXMgcHJpbWl0aXZlIHNpZ25hbFxuICBpZiAoaXNCdWlsdEluT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gc2lnbmFsKG9iaiwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xuICB9XG5cbiAgY29uc3Qgc3RvcmU6IFBhcnRpYWw8RGVlcFNpZ25hbGlmeTxUPj4gPSB7fTtcbiAgY29uc3QgcHJvY2Vzc2VkT2JqZWN0cyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvLyBQcmV2ZW50IGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgaWYgKHByb2Nlc3NlZE9iamVjdHMuaGFzKG9iaiBhcyBvYmplY3QpKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1tTaWduYWxUcmVlXSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQsIGNyZWF0aW5nIHJlZmVyZW5jZSBzaWduYWwnXG4gICAgKTtcbiAgICByZXR1cm4gc2lnbmFsKG9iaiwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xuICB9XG4gIHByb2Nlc3NlZE9iamVjdHMuYWRkKG9iaiBhcyBvYmplY3QpO1xuXG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gU2tpcCBzeW1ib2wga2V5cyBmb3Igbm93IChoYW5kbGUgc2VwYXJhdGVseSBpZiBuZWVkZWQpXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykgY29udGludWU7XG5cbiAgICAgICAgLy8gTmV2ZXIgZG91YmxlLXdyYXAgc2lnbmFsc1xuICAgICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHZhbHVlIHR5cGVzXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgICAgICBlcXVhbDogZXF1YWxpdHlGbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgLy8gUHJpbWl0aXZlc1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHNpZ25hbCh2YWx1ZSwge1xuICAgICAgICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNCdWlsdEluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgIC8vIEFycmF5cyBhbmQgYnVpbHQtaW4gb2JqZWN0c1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHNpZ25hbCh2YWx1ZSwge1xuICAgICAgICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTmVzdGVkIG9iamVjdHMgLSByZWN1cnNlXG4gICAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gY3JlYXRlU2lnbmFsU3RvcmUoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGVxdWFsaXR5Rm5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtTaWduYWxUcmVlXSBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hbCBmb3Iga2V5IFwiJHtrZXl9XCI6YCxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApO1xuICAgICAgICAvLyBGYWxsYmFjazogdHJlYXQgYXMgcHJpbWl0aXZlXG4gICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHNpZ25hbCh2YWx1ZSwge1xuICAgICAgICAgIGVxdWFsOiBlcXVhbGl0eUZuLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3ltYm9sIHByb3BlcnRpZXMgaWYgcHJlc2VudFxuICAgIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG4gICAgZm9yIChjb25zdCBzeW0gb2Ygc3ltYm9scykge1xuICAgICAgY29uc3QgdmFsdWUgPSAob2JqIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtzeW1dO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXSA9IHNpZ25hbCh2YWx1ZSwge1xuICAgICAgICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW1NpZ25hbFRyZWVdIEZhaWxlZCB0byBjcmVhdGUgc2lnbmFsIGZvciBzeW1ib2wga2V5OmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBjcmVhdGUgc2lnbmFsIHN0b3JlOiAke1xuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ1xuICAgICAgfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHN0b3JlIGFzIERlZXBTaWduYWxpZnk8VD47XG59XG5cbi8qKlxuICogRW5oYW5jZXMgYSB0cmVlIHdpdGggYmFzaWMgZnVuY3Rpb25hbGl0eSAodW53cmFwLCB1cGRhdGUsIHBpcGUpLlxuICogQWRkcyBjb3JlIG1ldGhvZHMgdGhhdCBldmVyeSBTaWduYWxUcmVlIG5lZWRzIGZvciBiYXNpYyBvcGVyYXRpb24uXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGVcbiAqIEBwYXJhbSB0cmVlIC0gVGhlIHRyZWUgdG8gZW5oYW5jZSB3aXRoIGJhc2ljIGZ1bmN0aW9uYWxpdHlcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIHVzZWQgZHVyaW5nIHRyZWUgY3JlYXRpb25cbiAqIEByZXR1cm5zIFRoZSBlbmhhbmNlZCB0cmVlIHdpdGggdW53cmFwLCB1cGRhdGUsIGFuZCBwaXBlIG1ldGhvZHNcbiAqL1xuZnVuY3Rpb24gZW5oYW5jZVRyZWU8VD4oXG4gIHRyZWU6IFNpZ25hbFRyZWU8VD4sXG4gIGNvbmZpZzogVHJlZUNvbmZpZyA9IHt9XG4pOiBTaWduYWxUcmVlPFQ+IHtcbiAgLy8gVHJhY2sgaWYgdGhpcyB0cmVlIHVzZXMgbGF6eSBzaWduYWxzIGZvciBwcm9wZXIgY2xlYW51cFxuICBjb25zdCBpc0xhenkgPSBjb25maWcudXNlTGF6eVNpZ25hbHMgPz8gc2hvdWxkVXNlTGF6eSh0cmVlLnN0YXRlLCBjb25maWcpO1xuXG4gIC8qKlxuICAgKiBVbndyYXBzIHRoZSBjdXJyZW50IHN0YXRlIGJ5IHJlYWRpbmcgYWxsIHNpZ25hbCB2YWx1ZXMuXG4gICAqIFJlY3Vyc2l2ZWx5IGNvbnZlcnRzIHRoZSBzaWduYWwgdHJlZSBiYWNrIHRvIHBsYWluIEphdmFTY3JpcHQgdmFsdWVzLlxuICAgKi9cbiAgdHJlZS51bndyYXAgPSAoKTogVCA9PiB7XG4gICAgY29uc3QgdW53cmFwT2JqZWN0ID0gPE8+KG9iajogRGVlcFNpZ25hbGlmeTxPPik6IE8gPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb2JqIGFzIE87XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzaWduYWxzIGRpcmVjdGx5XG4gICAgICBpZiAoaXNTaWduYWwob2JqKSkge1xuICAgICAgICByZXR1cm4gKG9iaiBhcyBTaWduYWw8Tz4pKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBhcnJheXMgKHdoaWNoIGFyZSBzaWduYWxzIGluIG91ciBzdHJ1Y3R1cmUpXG4gICAgICBpZiAoaXNTaWduYWwob2JqKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChvYmogYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUgYXMgTztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuXG4gICAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9ICh2YWx1ZSBhcyBTaWduYWw8dW5rbm93bj4pKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgIWlzQnVpbHRJbk9iamVjdCh2YWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gTmVzdGVkIHNpZ25hbCBzdGF0ZVxuICAgICAgICAgIHJlc3VsdFtrZXldID0gdW53cmFwT2JqZWN0KHZhbHVlIGFzIERlZXBTaWduYWxpZnk8b2JqZWN0Pik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3ltYm9sIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG4gICAgICBmb3IgKGNvbnN0IHN5bSBvZiBzeW1ib2xzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKG9iaiBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXTtcbiAgICAgICAgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgICAgIChyZXN1bHQgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW3N5bV0gPSAoXG4gICAgICAgICAgICB2YWx1ZSBhcyBTaWduYWw8dW5rbm93bj5cbiAgICAgICAgICApKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKHJlc3VsdCBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQgYXMgTztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHVud3JhcE9iamVjdCh0cmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD4pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBzdGF0ZSB1c2luZyBhbiB1cGRhdGVyIGZ1bmN0aW9uIHdpdGggdHJhbnNhY3Rpb24gc3VwcG9ydC5cbiAgICovXG4gIHRyZWUudXBkYXRlID0gKHVwZGF0ZXI6IChjdXJyZW50OiBUKSA9PiBQYXJ0aWFsPFQ+KSA9PiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25Mb2c6IEFycmF5PHtcbiAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgIG9sZFZhbHVlOiB1bmtub3duO1xuICAgICAgbmV3VmFsdWU6IHVua25vd247XG4gICAgfT4gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0cmVlLnVud3JhcCgpO1xuICAgICAgY29uc3QgcGFydGlhbE9iaiA9IHVwZGF0ZXIoY3VycmVudFZhbHVlKTtcblxuICAgICAgaWYgKCFwYXJ0aWFsT2JqIHx8IHR5cGVvZiBwYXJ0aWFsT2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VwZGF0ZXIgbXVzdCByZXR1cm4gYW4gb2JqZWN0Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxPPihcbiAgICAgICAgdGFyZ2V0OiBEZWVwU2lnbmFsaWZ5PE8+LFxuICAgICAgICB1cGRhdGVzOiBQYXJ0aWFsPE8+LFxuICAgICAgICBwYXRoID0gJydcbiAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB1cGRhdGVzKSB7XG4gICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodXBkYXRlcywga2V5KSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCB1cGRhdGVWYWx1ZSA9IHVwZGF0ZXNba2V5XTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IHBhdGggPyBgJHtwYXRofS4ke2tleX1gIDoga2V5O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTaWduYWxPclN0YXRlID0gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoaXNTaWduYWwoY3VycmVudFNpZ25hbE9yU3RhdGUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSAoY3VycmVudFNpZ25hbE9yU3RhdGUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICAgICAgICB0cmFuc2FjdGlvbkxvZy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwYXRoOiBjdXJyZW50UGF0aCxcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZTogb3JpZ2luYWxWYWx1ZSxcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZTogdXBkYXRlVmFsdWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAoY3VycmVudFNpZ25hbE9yU3RhdGUgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pLnNldChcbiAgICAgICAgICAgICAgICB1cGRhdGVWYWx1ZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgdHlwZW9mIHVwZGF0ZVZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICB1cGRhdGVWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheSh1cGRhdGVWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgIWlzQnVpbHRJbk9iamVjdCh1cGRhdGVWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGN1cnJlbnRTaWduYWxPclN0YXRlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICBjdXJyZW50U2lnbmFsT3JTdGF0ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAhaXNTaWduYWwoY3VycmVudFNpZ25hbE9yU3RhdGUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gTmVzdGVkIG9iamVjdCAtIHJlY3Vyc2VcbiAgICAgICAgICAgICAgdXBkYXRlT2JqZWN0KFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTaWduYWxPclN0YXRlIGFzIERlZXBTaWduYWxpZnk8b2JqZWN0PixcbiAgICAgICAgICAgICAgICB1cGRhdGVWYWx1ZSBhcyBQYXJ0aWFsPG9iamVjdD4sXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGhcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFNpZ25hbE9yU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgYFtTaWduYWxUcmVlXSBDYW5ub3QgdXBkYXRlIG5vbi1leGlzdGVudCBwYXRoOiAke2N1cnJlbnRQYXRofWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYFtTaWduYWxUcmVlXSBGYWlsZWQgdG8gdXBkYXRlIHBhdGggXCIke2N1cnJlbnRQYXRofVwiOmAsXG4gICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHRvIHRyaWdnZXIgcm9sbGJhY2tcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHVwZGF0ZU9iamVjdCh0cmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD4sIHBhcnRpYWxPYmopO1xuXG4gICAgICAvLyBMb2cgdHJhbnNhY3Rpb24gaW4gZGVidWcgbW9kZVxuICAgICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUgJiYgdHJhbnNhY3Rpb25Mb2cubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpZ25hbFRyZWVdIFVwZGF0ZSB0cmFuc2FjdGlvbjonLCB0cmFuc2FjdGlvbkxvZyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJvbGxiYWNrIG9uIGVycm9yXG4gICAgICBjb25zb2xlLmVycm9yKCdbU2lnbmFsVHJlZV0gVXBkYXRlIGZhaWxlZCwgYXR0ZW1wdGluZyByb2xsYmFjazonLCBlcnJvcik7XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gcmVzdG9yZSBvcmlnaW5hbCB2YWx1ZXMgZnJvbSB0cmFuc2FjdGlvbiBsb2dcbiAgICAgIGZvciAoY29uc3QgeyBwYXRoLCBvbGRWYWx1ZSB9IG9mIHRyYW5zYWN0aW9uTG9nLnJldmVyc2UoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICAgICAgICBsZXQgY3VycmVudDogdW5rbm93biA9IHRyZWUuc3RhdGU7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhQYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcGF0aFBhcnRzW2ldXTtcbiAgICAgICAgICAgIGlmICghY3VycmVudCkgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RLZXkgPSBwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0U2lnbmFsID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2xhc3RLZXldO1xuICAgICAgICAgICAgaWYgKGlzU2lnbmFsKHRhcmdldFNpZ25hbCkpIHtcbiAgICAgICAgICAgICAgKHRhcmdldFNpZ25hbCBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duPikuc2V0KG9sZFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHJvbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgJ1tTaWduYWxUcmVlXSBSb2xsYmFjayBmYWlsZWQgZm9yIHBhdGg6JyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICByb2xsYmFja0Vycm9yXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgLy8gUGlwZSBpbXBsZW1lbnRhdGlvbiBmb3IgZnVuY3Rpb24gY29tcG9zaXRpb25cbiAgdHJlZS5waXBlID0gKDxUUmVzdWx0ID0gU2lnbmFsVHJlZTxUPj4oXG4gICAgLi4uZm5zOiBBcnJheTwoaW5wdXQ6IHVua25vd24pID0+IHVua25vd24+XG4gICk6IFRSZXN1bHQgPT4ge1xuICAgIGlmIChmbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJlZSBhcyB1bmtub3duIGFzIFRSZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZucy5yZWR1Y2UoKGFjYywgZm4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGwgcGlwZSBhcmd1bWVudHMgbXVzdCBiZSBmdW5jdGlvbnMnKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmbihhY2MpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpZ25hbFRyZWVdIFBpcGUgZnVuY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSwgdHJlZSBhcyB1bmtub3duKSBhcyBUUmVzdWx0O1xuICB9KSBhcyBTaWduYWxUcmVlPFQ+WydwaXBlJ107XG5cbiAgLy8gRW5oYW5jZWQgZGVzdHJveSB3aXRoIHByb3BlciBjbGVhbnVwXG4gIHRyZWUuZGVzdHJveSA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2xlYW4gdXAgbGF6eSBzaWduYWwgcHJveGllcyBpZiB0aGV5IGV4aXN0XG4gICAgICBpZiAoaXNMYXp5KSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdHJlZS5zdGF0ZSBhcyB1bmtub3duO1xuICAgICAgICBpZiAoc3RhdGUgJiYgdHlwZW9mIHN0YXRlID09PSAnb2JqZWN0JyAmJiAnX19jbGVhbnVwX18nIGluIHN0YXRlKSB7XG4gICAgICAgICAgY29uc3QgY2xlYW51cCA9IChzdGF0ZSBhcyB7IF9fY2xlYW51cF9fOiB1bmtub3duIH0pLl9fY2xlYW51cF9fO1xuICAgICAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciBhbnkgZWZmZWN0cyBvciBzdWJzY3JpcHRpb25zXG4gICAgICAvLyAoVGhpcyB3b3VsZCBiZSB0cmFja2VkIGlmIHdlIG1haW50YWluIGEgbGlzdCBvZiBhY3RpdmUgZWZmZWN0cylcblxuICAgICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaWduYWxUcmVlXSBUcmVlIGRlc3Ryb3llZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2lnbmFsVHJlZV0gRXJyb3IgZHVyaW5nIGNsZWFudXA6JywgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICAvLyBBZGQgc3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIGFkdmFuY2VkIGZlYXR1cmVzXG4gIGFkZFN0dWJNZXRob2RzKHRyZWUsIGNvbmZpZyk7XG5cbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8qKlxuICogQWRkcyBzdHViIGltcGxlbWVudGF0aW9ucyBmb3IgYWR2YW5jZWQgZmVhdHVyZXNcbiAqL1xuZnVuY3Rpb24gYWRkU3R1Yk1ldGhvZHM8VD4odHJlZTogU2lnbmFsVHJlZTxUPiwgY29uZmlnOiBUcmVlQ29uZmlnKTogdm9pZCB7XG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBhZHZhbmNlZCBmZWF0dXJlcyAod2lsbCBsb2cgd2FybmluZ3MpXG4gIHRyZWUuYmF0Y2hVcGRhdGUgPSAodXBkYXRlcjogKGN1cnJlbnQ6IFQpID0+IFBhcnRpYWw8VD4pID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGJhdGNoVXBkYXRlKCkgY2FsbGVkIGJ1dCBiYXRjaGluZyBpcyBub3QgZW5hYmxlZC4nLFxuICAgICAgJ1RvIGVuYWJsZSBiYXRjaCB1cGRhdGVzLCBpbnN0YWxsIEBzaWduYWx0cmVlL2JhdGNoaW5nJ1xuICAgICk7XG4gICAgLy8gRmFsbGJhY2s6IEp1c3QgY2FsbCB1cGRhdGUgZGlyZWN0bHlcbiAgICB0cmVlLnVwZGF0ZSh1cGRhdGVyKTtcbiAgfTtcblxuICB0cmVlLm1lbW9pemUgPSA8Uj4oZm46ICh0cmVlOiBUKSA9PiBSLCBjYWNoZUtleT86IHN0cmluZyk6IFNpZ25hbDxSPiA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBtZW1vaXplKCkgY2FsbGVkIGJ1dCBtZW1vaXphdGlvbiBpcyBub3QgZW5hYmxlZC4nLFxuICAgICAgJ1RvIGVuYWJsZSBtZW1vaXplZCBjb21wdXRhdGlvbnMsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWVtb2l6YXRpb24nXG4gICAgKTtcbiAgICB2b2lkIGNhY2hlS2V5OyAvLyBNYXJrIGFzIGludGVudGlvbmFsbHkgdW51c2VkXG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IGZuKHRyZWUudW53cmFwKCkpKTtcbiAgfTtcblxuICB0cmVlLmVmZmVjdCA9IChmbjogKHRyZWU6IFQpID0+IHZvaWQpID0+IHtcbiAgICB0cnkge1xuICAgICAgZWZmZWN0KCgpID0+IGZuKHRyZWUudW53cmFwKCkpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFsbGJhY2sgZm9yIHRlc3QgZW52aXJvbm1lbnRzIHdpdGhvdXQgaW5qZWN0aW9uIGNvbnRleHRcbiAgICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRWZmZWN0IHJlcXVpcmVzIEFuZ3VsYXIgaW5qZWN0aW9uIGNvbnRleHQnLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHRyZWUuc3Vic2NyaWJlID0gKGZuOiAodHJlZTogVCkgPT4gdm9pZCk6ICgoKSA9PiB2b2lkKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgICBsZXQgaXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgZWZmZWN0UmVmID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFpc0Rlc3Ryb3llZCkge1xuICAgICAgICAgIGZuKHRyZWUudW53cmFwKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgZWZmZWN0UmVmLmRlc3Ryb3koKTtcbiAgICAgIH07XG5cbiAgICAgIGRlc3Ryb3lSZWYub25EZXN0cm95KHVuc3Vic2NyaWJlKTtcbiAgICAgIHJldHVybiB1bnN1YnNjcmliZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFsbGJhY2sgZm9yIHRlc3QgZW52aXJvbm1lbnRcbiAgICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU3Vic2NyaWJlIHJlcXVpcmVzIEFuZ3VsYXIgaW5qZWN0aW9uIGNvbnRleHQnLCBlcnJvcik7XG4gICAgICB9XG4gICAgICBmbih0cmVlLnVud3JhcCgpKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIC8vIE5vLW9wIHVuc3Vic2NyaWJlXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICAvLyBQZXJmb3JtYW5jZSBzdHVic1xuICB0cmVlLm9wdGltaXplID0gKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICfimqDvuI8gb3B0aW1pemUoKSBjYWxsZWQgYnV0IHRyZWUgb3B0aW1pemF0aW9uIGlzIG5vdCBhdmFpbGFibGUuJ1xuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgdHJlZS5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyBjbGVhckNhY2hlKCkgY2FsbGVkIGJ1dCBjYWNoaW5nIGlzIG5vdCBhdmFpbGFibGUuJyk7XG4gICAgfVxuICB9O1xuXG4gIHRyZWUuaW52YWxpZGF0ZVBhdHRlcm4gPSAoKTogbnVtYmVyID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAn4pqg77iPIGludmFsaWRhdGVQYXR0ZXJuKCkgY2FsbGVkIGJ1dCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaXMgbm90IGVuYWJsZWQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH07XG5cbiAgdHJlZS5nZXRNZXRyaWNzID0gKCk6IFBlcmZvcm1hbmNlTWV0cmljcyA9PiB7XG4gICAgLy8gUmV0dXJuIGFjdHVhbCBtZXRyaWNzIGlmIHdlJ3JlIHRyYWNraW5nIHRoZW1cbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlczogMCxcbiAgICAgIGNvbXB1dGF0aW9uczogMCxcbiAgICAgIGNhY2hlSGl0czogMCxcbiAgICAgIGNhY2hlTWlzc2VzOiAwLFxuICAgICAgYXZlcmFnZVVwZGF0ZVRpbWU6IDAsXG4gICAgfTtcbiAgfTtcblxuICAvLyBNaWRkbGV3YXJlIHN0dWJzXG4gIHRyZWUuYWRkVGFwID0gKG1pZGRsZXdhcmU6IE1pZGRsZXdhcmU8VD4pID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAn4pqg77iPIGFkZFRhcCgpIGNhbGxlZCBidXQgbWlkZGxld2FyZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdm9pZCBtaWRkbGV3YXJlO1xuICB9O1xuXG4gIHRyZWUucmVtb3ZlVGFwID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAn4pqg77iPIHJlbW92ZVRhcCgpIGNhbGxlZCBidXQgbWlkZGxld2FyZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdm9pZCBpZDtcbiAgfTtcblxuICAvLyBFbnRpdHkgaGVscGVycyBzdHViXG4gIHRyZWUuYXNDcnVkID0gPEUgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfCBudW1iZXIgfT4oKTogRW50aXR5SGVscGVyczxFPiA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybign4pqg77iPIGFzQ3J1ZCgpIGNhbGxlZCBidXQgZW50aXR5IGhlbHBlcnMgYXJlIG5vdCBhdmFpbGFibGUuJyk7XG4gICAgfVxuICAgIHJldHVybiB7fSBhcyBFbnRpdHlIZWxwZXJzPEU+O1xuICB9O1xuXG4gIC8vIEFzeW5jIGFjdGlvbiBzdHViXG4gIHRyZWUuYXN5bmNBY3Rpb24gPSA8VElucHV0LCBUUmVzdWx0PihcbiAgICBvcGVyYXRpb246IChpbnB1dDogVElucHV0KSA9PiBQcm9taXNlPFRSZXN1bHQ+LFxuICAgIGFzeW5jQ29uZmlnOiBBc3luY0FjdGlvbkNvbmZpZzxULCBUUmVzdWx0PiA9IHt9XG4gICk6IEFzeW5jQWN0aW9uPFRJbnB1dCwgVFJlc3VsdD4gPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICfimqDvuI8gYXN5bmNBY3Rpb24oKSBjYWxsZWQgYnV0IGFzeW5jIGFjdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdm9pZCBvcGVyYXRpb247XG4gICAgdm9pZCBhc3luY0NvbmZpZztcbiAgICByZXR1cm4ge30gYXMgQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PjtcbiAgfTtcblxuICAvLyBUaW1lIHRyYXZlbCBzdHVic1xuICB0cmVlLnVuZG8gPSAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybign4pqg77iPIHVuZG8oKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyk7XG4gICAgfVxuICB9O1xuXG4gIHRyZWUucmVkbyA9ICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gcmVkbygpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nKTtcbiAgICB9XG4gIH07XG5cbiAgdHJlZS5nZXRIaXN0b3J5ID0gKCk6IFRpbWVUcmF2ZWxFbnRyeTxUPltdID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gZ2V0SGlzdG9yeSgpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9O1xuXG4gIHRyZWUucmVzZXRIaXN0b3J5ID0gKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICfimqDvuI8gcmVzZXRIaXN0b3J5KCkgY2FsbGVkIGJ1dCB0aW1lIHRyYXZlbCBpcyBub3QgYXZhaWxhYmxlLidcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUFVCTElDIEFQSVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhY3RpdmUgc2lnbmFsIHRyZWUgd2l0aCBzbWFydCBwcm9ncmVzc2l2ZSBlbmhhbmNlbWVudC5cbiAqXG4gKiBBdXRvbWF0aWNhbGx5IGNvbnZlcnRzIHBsYWluIG9iamVjdHMgaW50byBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdoZXJlIGVhY2ggcHJvcGVydHlcbiAqIGJlY29tZXMgYSB3cml0YWJsZSBzaWduYWwuIFByb3ZpZGVzIGludGVsbGlnZW50IHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMsIGF1dG9tYXRpY1xuICogY2hhbmdlIGRldGVjdGlvbiwgYW5kIHNlYW1sZXNzIGludGVncmF0aW9uIHdpdGggQW5ndWxhcidzIHNpZ25hbCBzeXN0ZW0uXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgKG5vIGNvbnN0cmFpbnRzIGZvciBtYXhpbXVtIGZsZXhpYmlsaXR5KVxuICogQHBhcmFtIG9iaiAtIFRoZSBpbml0aWFsIHN0YXRlIG9iamVjdCB0byBjb252ZXJ0IGludG8gYSByZWFjdGl2ZSB0cmVlXG4gKiBAcmV0dXJucyBBIFNpZ25hbFRyZWUgd2l0aCBhdXRvLWVuYWJsaW5nIGZlYXR1cmVzIGFuZCByZWFjdGl2ZSBwcm9wZXJ0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEJhc2ljIHVzYWdlIC0gc2ltcGxlIHN0YXRlIG1hbmFnZW1lbnRcbiAqIGNvbnN0IHN0YXRlID0gc2lnbmFsVHJlZSh7IGNvdW50OiAwLCB1c2VyOiB7IG5hbWU6ICdKb2huJyB9IH0pO1xuICpcbiAqIC8vIEFjY2VzcyByZWFjdGl2ZSBwcm9wZXJ0aWVzXG4gKiBjb25zb2xlLmxvZyhzdGF0ZS5jb3VudCgpKTsgLy8gMFxuICogY29uc29sZS5sb2coc3RhdGUudXNlci5uYW1lKCkpOyAvLyAnSm9obidcbiAqXG4gKiAvLyBVcGRhdGUgc3RhdGVcbiAqIHN0YXRlLmNvdW50LnNldCgxKTtcbiAqIHN0YXRlLnVzZXIubmFtZS5zZXQoJ0phbmUnKTtcbiAqXG4gKiAvLyBCYXRjaCB1cGRhdGVzXG4gKiBzdGF0ZS51cGRhdGUoY3VycmVudCA9PiAoe1xuICogICBjb3VudDogY3VycmVudC5jb3VudCArIDEsXG4gKiAgIHVzZXI6IHsgLi4uY3VycmVudC51c2VyLCBuYW1lOiAnQm9iJyB9XG4gKiB9KSk7XG4gKlxuICogLy8gU3Vic2NyaWJlIHRvIGNoYW5nZXNcbiAqIHN0YXRlLnN1YnNjcmliZShuZXdTdGF0ZSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKCdTdGF0ZSBjaGFuZ2VkOicsIG5ld1N0YXRlKTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEFkdmFuY2VkIHVzYWdlIHdpdGggZWZmZWN0cyBhbmQgY29tcHV0ZWQgdmFsdWVzXG4gKiBpbnRlcmZhY2UgQXBwU3RhdGUge1xuICogICB0b2RvczogVG9kb1tdO1xuICogICBmaWx0ZXI6ICdhbGwnIHwgJ2FjdGl2ZScgfCAnY29tcGxldGVkJztcbiAqIH1cbiAqXG4gKiBjb25zdCBzdG9yZSA9IHNpZ25hbFRyZWU8QXBwU3RhdGU+KHtcbiAqICAgdG9kb3M6IFtdLFxuICogICBmaWx0ZXI6ICdhbGwnXG4gKiB9KTtcbiAqXG4gKiAvLyBDcmVhdGUgY29tcHV0ZWQgdmFsdWVzXG4gKiBjb25zdCBmaWx0ZXJlZFRvZG9zID0gY29tcHV0ZWQoKCkgPT4ge1xuICogICBjb25zdCB0b2RvcyA9IHN0b3JlLnRvZG9zKCk7XG4gKiAgIGNvbnN0IGZpbHRlciA9IHN0b3JlLmZpbHRlcigpO1xuICogICByZXR1cm4gdG9kb3MuZmlsdGVyKHRvZG8gPT5cbiAqICAgICBmaWx0ZXIgPT09ICdhbGwnIHx8XG4gKiAgICAgKGZpbHRlciA9PT0gJ2FjdGl2ZScgJiYgIXRvZG8uY29tcGxldGVkKSB8fFxuICogICAgIChmaWx0ZXIgPT09ICdjb21wbGV0ZWQnICYmIHRvZG8uY29tcGxldGVkKVxuICogICApO1xuICogfSk7XG4gKlxuICogLy8gUmVhY3QgdG8gc3RhdGUgY2hhbmdlc1xuICogc3RvcmUuZWZmZWN0KHN0YXRlID0+IHtcbiAqICAgY29uc29sZS5sb2coYCR7c3RhdGUudG9kb3MubGVuZ3RofSB0b2Rvcywgc2hvd2luZyAke3N0YXRlLmZpbHRlcn1gKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQ+KG9iajogVCk6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggcHJlc2V0IGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVXNlcyBwcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb25zIG9wdGltaXplZCBmb3IgY29tbW9uIHVzZSBjYXNlcy5cbiAqIEF2YWlsYWJsZSBwcmVzZXRzOiAnYmFzaWMnLCAncGVyZm9ybWFuY2UnLCAnZGV2ZWxvcG1lbnQnLCAncHJvZHVjdGlvbicuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHBhcmFtIHByZXNldCAtIFByZWRlZmluZWQgY29uZmlndXJhdGlvbiBwcmVzZXRcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSBjb25maWd1cmVkIHdpdGggdGhlIHNwZWNpZmllZCBwcmVzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRGV2ZWxvcG1lbnQgcHJlc2V0IC0gZW5oYW5jZWQgZGVidWdnaW5nXG4gKiBjb25zdCBkZXZTdG9yZSA9IHNpZ25hbFRyZWUoeyBjb3VudDogMCB9LCAnZGV2ZWxvcG1lbnQnKTtcbiAqIC8vIEVuYWJsZXM6IGRlYnVnTW9kZSwgZW5hYmxlRGV2VG9vbHMsIHRyYWNrUGVyZm9ybWFuY2VcbiAqXG4gKiAvLyBQcm9kdWN0aW9uIHByZXNldCAtIG9wdGltaXplZCBwZXJmb3JtYW5jZVxuICogY29uc3QgcHJvZFN0b3JlID0gc2lnbmFsVHJlZSh7IGNvdW50OiAwIH0sICdwcm9kdWN0aW9uJyk7XG4gKiAvLyBFbmFibGVzOiB1c2VMYXp5U2lnbmFscywgYmF0Y2hVcGRhdGVzLCB1c2VNZW1vaXphdGlvblxuICpcbiAqIC8vIFBlcmZvcm1hbmNlIHByZXNldCAtIG1heGltdW0gb3B0aW1pemF0aW9uXG4gKiBjb25zdCBwZXJmU3RvcmUgPSBzaWduYWxUcmVlKHsgdXNlcnM6IFtdIH0sICdwZXJmb3JtYW5jZScpO1xuICogLy8gRW5hYmxlczogdXNlTGF6eVNpZ25hbHMsIGJhdGNoVXBkYXRlcywgdXNlTWVtb2l6YXRpb24sIHVzZVNoYWxsb3dDb21wYXJpc29uXG4gKlxuICogLy8gQmFzaWMgcHJlc2V0IC0gbWluaW1hbCBmZWF0dXJlc1xuICogY29uc3QgYmFzaWNTdG9yZSA9IHNpZ25hbFRyZWUoeyBkYXRhOiB7fSB9LCAnYmFzaWMnKTtcbiAqIC8vIE1pbmltYWwgb3ZlcmhlYWQsIG5vIG9wdGltaXphdGlvbnNcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUPihvYmo6IFQsIHByZXNldDogVHJlZVByZXNldCk6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggY3VzdG9tIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogUHJvdmlkZXMgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciBTaWduYWxUcmVlIGJlaGF2aW9yIGFuZCBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MuXG4gKiBVc2UgdGhpcyBvdmVybG9hZCB3aGVuIHlvdSBuZWVkIHNwZWNpZmljIG9wdGltaXphdGlvbiBzZXR0aW5ncyBvciBkZWJ1Z2dpbmcgZmVhdHVyZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHBhcmFtIGNvbmZpZyAtIEN1c3RvbSBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHJldHVybnMgQSBTaWduYWxUcmVlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3VzdG9tIGNvbmZpZ3VyYXRpb24gZm9yIHNwZWNpZmljIG5lZWRzXG4gKiBjb25zdCBzdG9yZSA9IHNpZ25hbFRyZWUoe1xuICogICB1c2VyczogW10sXG4gKiAgIHNldHRpbmdzOiB7IHRoZW1lOiAnZGFyaycgfVxuICogfSwge1xuICogICB1c2VMYXp5U2lnbmFsczogdHJ1ZSwgICAgICAvLyBDcmVhdGUgc2lnbmFscyBvbi1kZW1hbmRcbiAqICAgYmF0Y2hVcGRhdGVzOiB0cnVlLCAgICAgICAgLy8gR3JvdXAgcmFwaWQgdXBkYXRlc1xuICogICB1c2VNZW1vaXphdGlvbjogdHJ1ZSwgICAgICAvLyBDYWNoZSBjb21wdXRlZCB2YWx1ZXNcbiAqICAgZGVidWdNb2RlOiBmYWxzZSwgICAgICAgICAgLy8gUHJvZHVjdGlvbiBtb2RlXG4gKiAgIGVuYWJsZURldlRvb2xzOiBmYWxzZSwgICAgIC8vIE5vIGRldiB0b29sc1xuICogICB0cmFja1BlcmZvcm1hbmNlOiB0cnVlLCAgICAvLyBNb25pdG9yIHBlcmZvcm1hbmNlXG4gKiAgIHVzZVNoYWxsb3dDb21wYXJpc29uOiBmYWxzZSAvLyBEZWVwIGVxdWFsaXR5IGNoZWNraW5nXG4gKiB9KTtcbiAqXG4gKiAvLyBBY2Nlc3MgcGVyZm9ybWFuY2UgbWV0cmljc1xuICogY29uc3QgbWV0cmljcyA9IHN0b3JlLmdldE1ldHJpY3MoKTtcbiAqIGNvbnNvbGUubG9nKGBVcGRhdGVzOiAke21ldHJpY3MudXBkYXRlQ291bnR9LCBUaW1lOiAke21ldHJpY3MudG90YWxUaW1lfW1zYCk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ29uZmlndXJhdGlvbiBmb3IgbGFyZ2UgZGF0YXNldHNcbiAqIGNvbnN0IGJpZ0RhdGFTdG9yZSA9IHNpZ25hbFRyZWUobGFyZ2VEYXRhc2V0LCB7XG4gKiAgIHVzZUxhenlTaWduYWxzOiB0cnVlLCAgICAgICAgLy8gRXNzZW50aWFsIGZvciBsYXJnZSBvYmplY3RzXG4gKiAgIHVzZVNoYWxsb3dDb21wYXJpc29uOiB0cnVlLCAgLy8gRmFzdGVyIGNvbXBhcmlzb25zXG4gKiAgIGJhdGNoVXBkYXRlczogdHJ1ZSwgICAgICAgICAgLy8gUHJldmVudCBVSSB0aHJhc2hpbmdcbiAqICAgdXNlTWVtb2l6YXRpb246IHRydWUsICAgICAgICAvLyBDYWNoZSBleHBlbnNpdmUgY29tcHV0YXRpb25zXG4gKiAgIGRlYnVnTW9kZTogZmFsc2UgICAgICAgICAgICAgLy8gTm8gZGVidWcgb3ZlcmhlYWRcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQ+KG9iajogVCwgY29uZmlnOiBUcmVlQ29uZmlnKTogU2lnbmFsVHJlZTxUPjtcblxuLyoqXG4gKiBNYWluIFNpZ25hbFRyZWUgZmFjdG9yeSBmdW5jdGlvbiB3aXRoIHN1cGVyaW9yIHR5cGUgaW5mZXJlbmNlLlxuICpcbiAqIFRoaXMgb3ZlcmxvYWQgcHJvdmlkZXMgZW5oYW5jZWQgVHlwZVNjcmlwdCBpbmZlcmVuY2UgZm9yIG9iamVjdCB0eXBlcyxcbiAqIGVuc3VyaW5nIGFsbCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseSB0eXBlZCBhbmQgcmVhY3RpdmUuIElkZWFsIGZvclxuICogc3Ryb25nbHktdHlwZWQgYXBwbGljYXRpb25zIHdoZXJlIHR5cGUgc2FmZXR5IGlzIHBhcmFtb3VudC5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIE9iamVjdCB0eXBlIGV4dGVuZGluZyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiBmb3IgYmV0dGVyIGluZmVyZW5jZVxuICogQHBhcmFtIG9iaiAtIFJlcXVpcmVkIHN0YXRlIG9iamVjdCB3aXRoIGFsbCBwcm9wZXJ0aWVzIGRlZmluZWRcbiAqIEBwYXJhbSBjb25maWdPclByZXNldCAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0IG9yIHByZXNldCBzdHJpbmdcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSB3aXRoIGVuaGFuY2VkIHR5cGUgc2FmZXR5IGFuZCBpbmZlcmVuY2VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRW5oYW5jZWQgdHlwZSBpbmZlcmVuY2VcbiAqIGNvbnN0IHR5cGVkU3RvcmUgPSBzaWduYWxUcmVlKHtcbiAqICAgdXNlcjogeyBpZDogMSwgbmFtZTogJ0pvaG4nLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0sXG4gKiAgIHNldHRpbmdzOiB7IHRoZW1lOiAnZGFyaycsIG5vdGlmaWNhdGlvbnM6IHRydWUgfSxcbiAqICAgZGF0YTogeyBpdGVtczogW10sIGxvYWRpbmc6IGZhbHNlLCBlcnJvcjogbnVsbCB9XG4gKiB9IGFzIGNvbnN0KTtcbiAqXG4gKiAvLyBUeXBlU2NyaXB0IGtub3dzIGV4YWN0IHR5cGVzXG4gKiB0eXBlZFN0b3JlLnVzZXIuaWQuc2V0KDIpOyAgICAgICAgICAgLy8gbnVtYmVyXG4gKiB0eXBlZFN0b3JlLnNldHRpbmdzLnRoZW1lLnNldCgnbGlnaHQnKTsgLy8gJ2RhcmsnIHwgJ2xpZ2h0J1xuICogdHlwZWRTdG9yZS5kYXRhLmxvYWRpbmcuc2V0KHRydWUpOyAgIC8vIGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvYmo6IFJlcXVpcmVkPFQ+LFxuICBjb25maWdPclByZXNldD86IFRyZWVDb25maWcgfCBUcmVlUHJlc2V0XG4pOiBTaWduYWxUcmVlPFJlcXVpcmVkPFQ+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VD4oXG4gIG9iajogVCxcbiAgY29uZmlnT3JQcmVzZXQ/OiBUcmVlQ29uZmlnIHwgVHJlZVByZXNldFxuKTogU2lnbmFsVHJlZTxUPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VD4oXG4gIG9iajogVCxcbiAgY29uZmlnT3JQcmVzZXQ/OiBUcmVlQ29uZmlnIHwgVHJlZVByZXNldFxuKTogU2lnbmFsVHJlZTxUPiB7XG4gIC8vIEhhbmRsZSBwcmVzZXQgc3RyaW5nc1xuICBpZiAodHlwZW9mIGNvbmZpZ09yUHJlc2V0ID09PSAnc3RyaW5nJykge1xuICAgIC8vIE1hcCBwcmVzZXQgdG8gY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHByZXNldENvbmZpZ3M6IFJlY29yZDxUcmVlUHJlc2V0LCBQYXJ0aWFsPFRyZWVDb25maWc+PiA9IHtcbiAgICAgIGJhc2ljOiB7XG4gICAgICAgIHVzZUxhenlTaWduYWxzOiBmYWxzZSxcbiAgICAgICAgZGVidWdNb2RlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBwZXJmb3JtYW5jZToge1xuICAgICAgICB1c2VMYXp5U2lnbmFsczogdHJ1ZSxcbiAgICAgICAgYmF0Y2hVcGRhdGVzOiB0cnVlLFxuICAgICAgICB1c2VNZW1vaXphdGlvbjogdHJ1ZSxcbiAgICAgICAgdXNlU2hhbGxvd0NvbXBhcmlzb246IHRydWUsXG4gICAgICB9LFxuICAgICAgZGV2ZWxvcG1lbnQ6IHtcbiAgICAgICAgdXNlTGF6eVNpZ25hbHM6IGZhbHNlLCAvLyBFYWdlciBmb3IgYmV0dGVyIGRlYnVnZ2luZ1xuICAgICAgICBkZWJ1Z01vZGU6IHRydWUsXG4gICAgICAgIGVuYWJsZURldlRvb2xzOiB0cnVlLFxuICAgICAgICB0cmFja1BlcmZvcm1hbmNlOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHByb2R1Y3Rpb246IHtcbiAgICAgICAgdXNlTGF6eVNpZ25hbHM6IHRydWUsXG4gICAgICAgIGJhdGNoVXBkYXRlczogdHJ1ZSxcbiAgICAgICAgdXNlTWVtb2l6YXRpb246IHRydWUsXG4gICAgICAgIGRlYnVnTW9kZTogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBjb25maWcgPSBwcmVzZXRDb25maWdzW2NvbmZpZ09yUHJlc2V0XTtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgVW5rbm93biBwcmVzZXQ6ICR7Y29uZmlnT3JQcmVzZXR9LCB1c2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGNyZWF0ZShvYmosIHt9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZShvYmosIGNvbmZpZyk7XG4gIH1cblxuICAvLyBIYW5kbGUgY29uZmlndXJhdGlvbiBvYmplY3RzIG9yIGRlZmF1bHRcbiAgY29uc3QgY29uZmlnID0gY29uZmlnT3JQcmVzZXQgfHwge307XG4gIHJldHVybiBjcmVhdGUob2JqLCBjb25maWcpO1xufVxuIl19"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signaltree-core.mjs","sources":["../tmp-esm2022/lib/utils.js","../tmp-esm2022/lib/signal-tree.js"],"sourcesContent":["import { signal, isSignal } from '@angular/core';\nexport function equal(a, b) {\n if (a === b)\n return true;\n if (a == null || b == null)\n return a === b;\n const typeA = typeof a;\n const typeB = typeof b;\n if (typeA !== typeB)\n return false;\n if (typeA !== 'object')\n return false;\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size)\n return false;\n for (const [key, value] of a) {\n if (!b.has(key) || !equal(value, b.get(key)))\n return false;\n }\n return true;\n }\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size)\n return false;\n for (const value of a) {\n if (!b.has(value))\n return false;\n }\n return true;\n }\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length)\n return false;\n return a.every((item, index) => equal(item, b[index]));\n }\n if (Array.isArray(b))\n return false;\n const objA = a;\n const objB = b;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length)\n return false;\n return keysA.every((key) => key in objB && equal(objA[key], objB[key]));\n}\nexport function terminalSignal(value, customEqual) {\n return signal(value, {\n equal: customEqual || equal,\n });\n}\nclass LRUCache {\n maxSize;\n cache = new Map();\n constructor(maxSize) {\n this.maxSize = maxSize;\n }\n set(key, value) {\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n get(key) {\n const value = this.cache.get(key);\n if (value !== undefined) {\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n return value;\n }\n clear() {\n this.cache.clear();\n }\n size() {\n return this.cache.size;\n }\n}\nconst MAX_CACHE_SIZE = 1000;\nconst pathCache = new LRUCache(MAX_CACHE_SIZE);\nexport function parsePath(path) {\n const cached = pathCache.get(path);\n if (cached) {\n return cached;\n }\n const parts = path.split('.');\n pathCache.set(path, parts);\n return parts;\n}\nexport function createLazySignalTree(obj, equalityFn, basePath = '') {\n const signalCache = new Map();\n const nestedProxies = new Map();\n const nestedCleanups = new Map();\n const cleanup = () => {\n nestedCleanups.forEach((cleanupFn) => {\n try {\n cleanupFn();\n }\n catch (error) {\n console.warn('Error during nested cleanup:', error);\n }\n });\n nestedCleanups.clear();\n signalCache.clear();\n nestedProxies.clear();\n };\n const isBuiltInObject = (v) => {\n if (v === null || v === undefined)\n return false;\n return (v instanceof Date ||\n v instanceof RegExp ||\n typeof v === 'function' ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n v instanceof Error ||\n v instanceof Promise ||\n v instanceof URL ||\n v instanceof URLSearchParams ||\n v instanceof FormData ||\n v instanceof Blob ||\n (typeof File !== 'undefined' && v instanceof File));\n };\n const proxy = new Proxy(obj, {\n get(target, prop) {\n if (prop === '__cleanup__') {\n return cleanup;\n }\n if (typeof prop === 'symbol') {\n return target[prop];\n }\n if (prop === 'valueOf' || prop === 'toString') {\n return target[prop];\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n if (!(key in target)) {\n return undefined;\n }\n const value = target[key];\n if (isSignal(value)) {\n return value;\n }\n if (signalCache.has(path)) {\n return signalCache.get(path);\n }\n if (nestedProxies.has(path)) {\n return nestedProxies.get(path);\n }\n if (value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !isSignal(value) &&\n !isBuiltInObject(value)) {\n try {\n const nestedProxy = createLazySignalTree(value, equalityFn, path);\n nestedProxies.set(path, nestedProxy);\n const proxyWithCleanup = nestedProxy;\n if (typeof proxyWithCleanup.__cleanup__ === 'function') {\n nestedCleanups.set(path, proxyWithCleanup.__cleanup__);\n }\n return nestedProxy;\n }\n catch (error) {\n console.warn(`Failed to create lazy proxy for path \"${path}\":`, error);\n const fallbackSignal = signal(value, ...(ngDevMode ? [{ debugName: \"fallbackSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, fallbackSignal);\n return fallbackSignal;\n }\n }\n try {\n const newSignal = signal(value, ...(ngDevMode ? [{ debugName: \"newSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, newSignal);\n return newSignal;\n }\n catch (error) {\n console.warn(`Failed to create signal for path \"${path}\":`, error);\n return value;\n }\n },\n set(target, prop, value) {\n if (typeof prop === 'symbol') {\n target[prop] = value;\n return true;\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n try {\n target[key] = value;\n const cachedSignal = signalCache.get(path);\n if (cachedSignal && 'set' in cachedSignal) {\n cachedSignal.set(value);\n }\n if (nestedProxies.has(path)) {\n const nestedCleanup = nestedCleanups.get(path);\n if (nestedCleanup) {\n nestedCleanup();\n nestedCleanups.delete(path);\n }\n nestedProxies.delete(path);\n }\n return true;\n }\n catch (error) {\n console.warn(`Failed to set value for path \"${path}\":`, error);\n return false;\n }\n },\n has(target, prop) {\n return prop in target;\n },\n ownKeys(target) {\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n });\n return proxy;\n}\nexport const deepEqual = equal;\nexport function shallowEqual(a, b) {\n if (a === b)\n return true;\n if (a == null || b == null)\n return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (a[key] !==\n b[key])\n return false;\n }\n return true;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLE1BQU0sRUFBa0IsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBaURqRSxNQUFNLFVBQVUsS0FBSyxDQUFJLENBQUksRUFBRSxDQUFJO0lBRWpDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUd6QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUk7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFHM0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkIsSUFBSSxLQUFLLEtBQUssS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBR2xDLElBQUksS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUdyQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBR0QsSUFBSSxDQUFDLFlBQVksTUFBTSxJQUFJLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQztRQUMvQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEQsQ0FBQztJQUdELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJO1lBQUUs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LENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztRQUV4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3hCLElBQ0csQ0FBNkIsQ0FBQyxHQUFHLENBQUM7Z0JBQ2xDLENBQTZCLENBQUMsR0FBRyxDQUFDO2dCQUVuQyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaWduYWxUcmVlIFV0aWxpdHkgRnVuY3Rpb25zIHYxLjEuMSAtIEZhaXIgU291cmNlIExpY2Vuc2VcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0pCb3JnaWEvc2lnbmFsdHJlZS9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmltcG9ydCB7IHNpZ25hbCwgV3JpdGFibGVTaWduYWwsIGlzU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IERlZXBTaWduYWxpZnkgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBFbmhhbmNlZCBkZWVwIGVxdWFsaXR5IGZ1bmN0aW9uIG9wdGltaXplZCBmb3IgU2lnbmFsVHJlZSBvcGVyYXRpb25zLlxuICpcbiAqIFBlcmZvcm1zIGNvbXByZWhlbnNpdmUgZXF1YWxpdHkgY2hlY2tpbmcgZm9yIGFsbCBKYXZhU2NyaXB0IHR5cGVzIGluY2x1ZGluZ1xuICogcHJpbWl0aXZlcywgb2JqZWN0cywgYXJyYXlzLCBEYXRlLCBSZWdFeHAsIE1hcCwgU2V0LCBhbmQgb3RoZXIgYnVpbHQtaW5zLlxuICogT3B0aW1pemVkIHdpdGggZWFybHkgZXhpdHMgYW5kIHR5cGUtc3BlY2lmaWMgY29tcGFyaXNvbnMgZm9yIG1heGltdW0gcGVyZm9ybWFuY2UuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB2YWx1ZXMgYmVpbmcgY29tcGFyZWRcbiAqIEBwYXJhbSBhIC0gRmlyc3QgdmFsdWUgdG8gY29tcGFyZVxuICogQHBhcmFtIGIgLSBTZWNvbmQgdmFsdWUgdG8gY29tcGFyZVxuICogQHJldHVybnMgVHJ1ZSBpZiB2YWx1ZXMgYXJlIGRlZXBseSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFByaW1pdGl2ZSBjb21wYXJpc29uc1xuICogZXF1YWwoNDIsIDQyKTsgICAgICAgICAgIC8vIHRydWVcbiAqIGVxdWFsKCdoZWxsbycsICdoZWxsbycpOyAvLyB0cnVlXG4gKiBlcXVhbChudWxsLCB1bmRlZmluZWQpOyAgLy8gZmFsc2VcbiAqXG4gKiAvLyBPYmplY3QgY29tcGFyaXNvbnNcbiAqIGVxdWFsKHsgYTogMSwgYjogMiB9LCB7IGE6IDEsIGI6IDIgfSk7IC8vIHRydWVcbiAqIGVxdWFsKHsgYTogMSB9LCB7IGE6IDEsIGI6IDIgfSk7ICAgICAgIC8vIGZhbHNlXG4gKlxuICogLy8gQXJyYXkgY29tcGFyaXNvbnNcbiAqIGVxdWFsKFsxLCAyLCAzXSwgWzEsIDIsIDNdKTsgICAgICAgICAgIC8vIHRydWVcbiAqIGVxdWFsKFsxLCBbMiwgM11dLCBbMSwgWzIsIDNdXSk7ICAgICAgIC8vIHRydWUgKGRlZXApXG4gKlxuICogLy8gQ29tcGxleCB0eXBlc1xuICogZXF1YWwobmV3IERhdGUoJzIwMjMtMDEtMDEnKSwgbmV3IERhdGUoJzIwMjMtMDEtMDEnKSk7IC8vIHRydWVcbiAqIGVxdWFsKC9hYmMvZ2ksIC9hYmMvZ2kpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlXG4gKiBlcXVhbChuZXcgU2V0KFsxLCAyXSksIG5ldyBTZXQoWzEsIDJdKSk7ICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZXF1YWwobmV3IE1hcChbWydhJywgMV1dKSwgbmV3IE1hcChbWydhJywgMV1dKSk7ICAgICAgIC8vIHRydWVcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBVc2FnZSBpbiBTaWduYWxUcmVlIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gKiBjb25zdCBzdGF0ZSA9IHNpZ25hbFRyZWUoe1xuICogICB1c2VyOiB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCB9XG4gKiB9KTtcbiAqXG4gKiAvLyBJbnRlcm5hbCBlcXVhbCgpIHVzYWdlIHByZXZlbnRzIHVubmVjZXNzYXJ5IHVwZGF0ZXNcbiAqIHN0YXRlLnVzZXIuc2V0KHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH0pOyAvLyBObyBjaGFuZ2UgZGV0ZWN0ZWRcbiAqIHN0YXRlLnVzZXIuc2V0KHsgbmFtZTogJ0phbmUnLCBhZ2U6IDMwIH0pOyAvLyBDaGFuZ2UgZGV0ZWN0ZWRcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBGYXN0IHBhdGggZm9yIHJlZmVyZW5jZSBlcXVhbGl0eVxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIGNhc2VzXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PT0gYjtcblxuICAvLyBUeXBlIGNoZWNrIGZpcnN0IC0gbW9zdCBlZmZpY2llbnQgZWFybHkgZXhpdFxuICBjb25zdCB0eXBlQSA9IHR5cGVvZiBhO1xuICBjb25zdCB0eXBlQiA9IHR5cGVvZiBiO1xuICBpZiAodHlwZUEgIT09IHR5cGVCKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gRm9yIHByaW1pdGl2ZXMsID09PSBjaGVjayBhYm92ZSBpcyBzdWZmaWNpZW50XG4gIGlmICh0eXBlQSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcblxuICAvLyBIYW5kbGUgRGF0ZSBvYmplY3RzIHNwZWNpZmljYWxseVxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIFJlZ0V4cCBvYmplY3RzIHNwZWNpZmljYWxseVxuICBpZiAoYSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiBiIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICB9XG5cbiAgLy8gSGFuZGxlIG90aGVyIGJ1aWx0LWluIG9iamVjdHMgdGhhdCBuZWVkIHNwZWNpYWwgY29tcGFyaXNvblxuICBpZiAoYSBpbnN0YW5jZW9mIE1hcCAmJiBiIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYSkge1xuICAgICAgaWYgKCFiLmhhcyhrZXkpIHx8ICFlcXVhbCh2YWx1ZSwgYi5nZXQoa2V5KSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIFNldCAmJiBiIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhKSB7XG4gICAgICBpZiAoIWIuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBhcnJheXMgd2l0aCBvcHRpbWl6ZWQgY29tcGFyaXNvblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShiKSB8fCBhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYS5ldmVyeSgoaXRlbSwgaW5kZXgpID0+IGVxdWFsKGl0ZW0sIGJbaW5kZXhdKSk7XG4gIH1cblxuICAvLyBBcnJheXMgY2hlY2sgYWJvdmUgaGFuZGxlcyBhcnJheSB2cyBvYmplY3QgbWlzbWF0Y2hcbiAgaWYgKEFycmF5LmlzQXJyYXkoYikpIHJldHVybiBmYWxzZTtcblxuICAvLyBIYW5kbGUgcmVndWxhciBvYmplY3RzIHdpdGggb3B0aW1pemVkIGNvbXBhcmlzb25cbiAgY29uc3Qgb2JqQSA9IGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG9iakIgPSBiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGtleXNBLmV2ZXJ5KChrZXkpID0+IGtleSBpbiBvYmpCICYmIGVxdWFsKG9iakFba2V5XSwgb2JqQltrZXldKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRlcm1pbmFsIHNpZ25hbCB3aXRoIGVuaGFuY2VkIGRlZXAgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqXG4gKiBBbHRlcm5hdGl2ZSB0byBBbmd1bGFyJ3Mgc2lnbmFsKCkgdGhhdCB1c2VzIFNpZ25hbFRyZWUncyBkZWVwIGVxdWFsaXR5XG4gKiBmdW5jdGlvbiBmb3IgY2hhbmdlIGRldGVjdGlvbi4gVXNlZnVsIHdoZW4geW91IG5lZWQgc3RhbmRhbG9uZSBzaWduYWxzXG4gKiB3aXRoIHRoZSBzYW1lIGVxdWFsaXR5IHNlbWFudGljcyBhcyBTaWduYWxUcmVlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIHNpZ25hbCB2YWx1ZVxuICogQHBhcmFtIHZhbHVlIC0gSW5pdGlhbCB2YWx1ZSBmb3IgdGhlIHNpZ25hbFxuICogQHBhcmFtIGN1c3RvbUVxdWFsIC0gT3B0aW9uYWwgY3VzdG9tIGVxdWFsaXR5IGZ1bmN0aW9uIChkZWZhdWx0cyB0byBkZWVwIGVxdWFsKVxuICogQHJldHVybnMgQSBXcml0YWJsZVNpZ25hbCB3aXRoIGRlZXAgZXF1YWxpdHkgY29tcGFyaXNvblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBTdGFuZGFyZCBBbmd1bGFyIHNpZ25hbCB3aXRoIHJlZmVyZW5jZSBlcXVhbGl0eVxuICogY29uc3Qgc3RhbmRhcmRTaWduYWwgPSBzaWduYWwoeyBjb3VudDogMCB9KTtcbiAqIHN0YW5kYXJkU2lnbmFsLnNldCh7IGNvdW50OiAwIH0pOyAvLyBUcmlnZ2VycyB1cGRhdGUgKGRpZmZlcmVudCByZWZlcmVuY2UpXG4gKlxuICogLy8gVGVybWluYWwgc2lnbmFsIHdpdGggZGVlcCBlcXVhbGl0eVxuICogY29uc3QgdGVybWluYWxTaWcgPSB0ZXJtaW5hbFNpZ25hbCh7IGNvdW50OiAwIH0pO1xuICogdGVybWluYWxTaWcuc2V0KHsgY291bnQ6IDAgfSk7IC8vIE5vIHVwZGF0ZSAoc2FtZSB2YWx1ZSlcbiAqIHRlcm1pbmFsU2lnLnNldCh7IGNvdW50OiAxIH0pOyAvLyBUcmlnZ2VycyB1cGRhdGUgKGRpZmZlcmVudCB2YWx1ZSlcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDdXN0b20gZXF1YWxpdHkgZnVuY3Rpb25cbiAqIGNvbnN0IHVzZXJTaWduYWwgPSB0ZXJtaW5hbFNpZ25hbChcbiAqICAgeyBpZDogMSwgbmFtZTogJ0pvaG4nIH0sXG4gKiAgIChhLCBiKSA9PiBhLmlkID09PSBiLmlkIC8vIE9ubHkgY29tcGFyZSBieSBJRFxuICogKTtcbiAqXG4gKiB1c2VyU2lnbmFsLnNldCh7IGlkOiAxLCBuYW1lOiAnSmFuZScgfSk7IC8vIE5vIHVwZGF0ZSAoc2FtZSBJRClcbiAqIHVzZXJTaWduYWwuc2V0KHsgaWQ6IDIsIG5hbWU6ICdKYW5lJyB9KTsgLy8gVHJpZ2dlcnMgdXBkYXRlIChkaWZmZXJlbnQgSUQpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlcm1pbmFsU2lnbmFsPFQ+KFxuICB2YWx1ZTogVCxcbiAgY3VzdG9tRXF1YWw/OiAoYTogVCwgYjogVCkgPT4gYm9vbGVhblxuKTogV3JpdGFibGVTaWduYWw8VD4ge1xuICByZXR1cm4gc2lnbmFsKHZhbHVlLCB7XG4gICAgZXF1YWw6IGN1c3RvbUVxdWFsIHx8IGVxdWFsLFxuICB9KTtcbn1cblxuLyoqXG4gKiBMUlUgQ2FjaGUgaW1wbGVtZW50YXRpb24gZm9yIGVmZmljaWVudCBtZW1vcnkgbWFuYWdlbWVudFxuICovXG5jbGFzcyBMUlVDYWNoZTxLLCBWPiB7XG4gIHByaXZhdGUgY2FjaGUgPSBuZXcgTWFwPEssIFY+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXhTaXplOiBudW1iZXIpIHt9XG5cbiAgc2V0KGtleTogSywgdmFsdWU6IFYpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYWNoZS5zaXplID49IHRoaXMubWF4U2l6ZSkge1xuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLmNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNhY2hlLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJlbW92ZSBpZiBleGlzdHMgdG8gdXBkYXRlIHBvc2l0aW9uXG4gICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTsgLy8gQWRkIHRvIGVuZCAobW9zdCByZWNlbnQpXG4gIH1cblxuICBnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBNb3ZlIHRvIGVuZCAobWFyayBhcyByZWNlbnRseSB1c2VkKVxuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuc2l6ZTtcbiAgfVxufVxuXG4vLyBQYXRoIHBhcnNpbmcgY2FjaGUgd2l0aCBwcm9wZXIgTFJVIGV2aWN0aW9uIHN0cmF0ZWd5XG5jb25zdCBNQVhfQ0FDSEVfU0laRSA9IDEwMDA7XG5jb25zdCBwYXRoQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBzdHJpbmdbXT4oTUFYX0NBQ0hFX1NJWkUpO1xuXG4vKipcbiAqIFBhcnNlcyBhIGRvdC1ub3RhdGlvbiBwYXRoIGludG8gYW4gYXJyYXkgb2Yga2V5cyB3aXRoIGludGVsbGlnZW50IGNhY2hpbmcuXG4gKlxuICogQ29udmVydHMgc3RyaW5nIHBhdGhzIGxpa2UgJ3VzZXIucHJvZmlsZS5uYW1lJyBpbnRvIGFycmF5cyBbJ3VzZXInLCAncHJvZmlsZScsICduYW1lJ11cbiAqIGZvciBlZmZpY2llbnQgbmVzdGVkIHByb3BlcnR5IGFjY2Vzcy4gVXNlcyBMUlUgY2FjaGluZyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZVxuICogZm9yIGZyZXF1ZW50bHkgYWNjZXNzZWQgcGF0aHMgd2hpbGUgcHJldmVudGluZyBtZW1vcnkgbGVha3MuXG4gKlxuICogQHBhcmFtIHBhdGggLSBEb3Qtbm90YXRpb24gcGF0aCBzdHJpbmcgdG8gcGFyc2VcbiAqIEByZXR1cm5zIEFycmF5IG9mIHByb3BlcnR5IGtleXMgZm9yIG5lc3RlZCBhY2Nlc3NcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQmFzaWMgcGF0aCBwYXJzaW5nXG4gKiBwYXJzZVBhdGgoJ3VzZXIubmFtZScpOyAgICAgICAgICAgLy8gWyd1c2VyJywgJ25hbWUnXVxuICogcGFyc2VQYXRoKCdkYXRhLml0ZW1zLjAudGl0bGUnKTsgIC8vIFsnZGF0YScsICdpdGVtcycsICcwJywgJ3RpdGxlJ11cbiAqIHBhcnNlUGF0aCgnc2V0dGluZ3MnKTsgICAgICAgICAgICAvLyBbJ3NldHRpbmdzJ11cbiAqXG4gKiAvLyBDYWNoZWQgZm9yIHBlcmZvcm1hbmNlXG4gKiBwYXJzZVBhdGgoJ3VzZXIucHJvZmlsZS5uYW1lJyk7ICAgLy8gUGFyc2VzIGFuZCBjYWNoZXNcbiAqIHBhcnNlUGF0aCgndXNlci5wcm9maWxlLm5hbWUnKTsgICAvLyBSZXR1cm5zIGNhY2hlZCByZXN1bHRcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBVc2VkIGludGVybmFsbHkgZm9yIG5lc3RlZCBzdGF0ZSBhY2Nlc3NcbiAqIGNvbnN0IHN0b3JlID0gc2lnbmFsVHJlZSh7XG4gKiAgIHVzZXI6IHsgcHJvZmlsZTogeyBuYW1lOiAnSm9obicgfSB9XG4gKiB9KTtcbiAqXG4gKiAvLyBJbnRlcm5hbGx5IHVzZXMgcGFyc2VQYXRoIGZvciBlZmZpY2llbnQgYWNjZXNzXG4gKiBzdG9yZS51c2VyLnByb2ZpbGUubmFtZS5zZXQoJ0phbmUnKTtcbiAqXG4gKiAvLyBPciB3aXRoIHN0cmluZyBwYXRocyBpbiBleHRlbnNpb25zXG4gKiBzZXROZXN0ZWRWYWx1ZShzdG9yZSwgJ3VzZXIucHJvZmlsZS5uYW1lJywgJ0JvYicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjYWNoZWQgPSBwYXRoQ2FjaGUuZ2V0KHBhdGgpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICBwYXRoQ2FjaGUuc2V0KHBhdGgsIHBhcnRzKTtcbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXp5IHNpZ25hbCB0cmVlIHVzaW5nIFByb3h5IGZvciBvbi1kZW1hbmQgc2lnbmFsIGNyZWF0aW9uLlxuICogT25seSBjcmVhdGVzIHNpZ25hbHMgd2hlbiBwcm9wZXJ0aWVzIGFyZSBmaXJzdCBhY2Nlc3NlZC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9KQm9yZ2lhL3NpZ25hbHRyZWUvYmxvYi9tYWluL2RvY3MvYXBpL2NyZWF0ZS1sYXp5LXNpZ25hbC10cmVlLm1kXG4gKiBAcGFyYW0gb2JqIC0gU291cmNlIG9iamVjdCB0byBsYXppbHkgc2lnbmFsaWZ5XG4gKiBAcGFyYW0gZXF1YWxpdHlGbiAtIEVxdWFsaXR5IGZ1bmN0aW9uIGZvciBzaWduYWwgY29tcGFyaXNvblxuICogQHBhcmFtIGJhc2VQYXRoIC0gQmFzZSBwYXRoIGZvciBuZXN0ZWQgb2JqZWN0cyAoaW50ZXJuYWwgdXNlKVxuICogQHJldHVybnMgUHJveGllZCBvYmplY3QgdGhhdCBjcmVhdGVzIHNpZ25hbHMgb24gZmlyc3QgYWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYXp5U2lnbmFsVHJlZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb2JqOiBULFxuICBlcXVhbGl0eUZuOiAoYTogdW5rbm93biwgYjogdW5rbm93bikgPT4gYm9vbGVhbixcbiAgYmFzZVBhdGggPSAnJ1xuKTogRGVlcFNpZ25hbGlmeTxUPiB7XG4gIC8vIFVzZSBNYXAgaW5zdGVhZCBvZiBXZWFrTWFwIGZvciBiZXR0ZXIgY29udHJvbCBvdmVyIGNsZWFudXBcbiAgY29uc3Qgc2lnbmFsQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgV3JpdGFibGVTaWduYWw8dW5rbm93bj4+KCk7XG4gIGNvbnN0IG5lc3RlZFByb3hpZXMgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcblxuICAvLyBUcmFjayBjbGVhbnVwIGZ1bmN0aW9ucyBmb3IgbmVzdGVkIHByb3hpZXNcbiAgY29uc3QgbmVzdGVkQ2xlYW51cHMgPSBuZXcgTWFwPHN0cmluZywgKCkgPT4gdm9pZD4oKTtcblxuICAvLyBFbmhhbmNlZCBjbGVhbnVwIGZ1bmN0aW9uXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgLy8gQ2xlYW4gdXAgYWxsIG5lc3RlZCBwcm94aWVzIGZpcnN0XG4gICAgbmVzdGVkQ2xlYW51cHMuZm9yRWFjaCgoY2xlYW51cEZuKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjbGVhbnVwRm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgZHVyaW5nIG5lc3RlZCBjbGVhbnVwOicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZXN0ZWRDbGVhbnVwcy5jbGVhcigpO1xuXG4gICAgLy8gQ2xlYXIgY2FjaGVzXG4gICAgc2lnbmFsQ2FjaGUuY2xlYXIoKTtcbiAgICBuZXN0ZWRQcm94aWVzLmNsZWFyKCk7XG4gIH07XG5cbiAgLy8gRW5oYW5jZWQgYnVpbHQtaW4gb2JqZWN0IGRldGVjdGlvblxuICBjb25zdCBpc0J1aWx0SW5PYmplY3QgPSAodjogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHYgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICB2IGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgICB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdiBpbnN0YW5jZW9mIE1hcCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFNldCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBXZWFrU2V0IHx8XG4gICAgICB2IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBEYXRhVmlldyB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICAgICB2IGluc3RhbmNlb2YgUHJvbWlzZSB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFVSTCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcyB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8XG4gICAgICB2IGluc3RhbmNlb2YgQmxvYiB8fFxuICAgICAgKHR5cGVvZiBGaWxlICE9PSAndW5kZWZpbmVkJyAmJiB2IGluc3RhbmNlb2YgRmlsZSlcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgICAvLyBIYW5kbGUgY2xlYW51cCBtZXRob2RcbiAgICAgIGlmIChwcm9wID09PSAnX19jbGVhbnVwX18nKSB7XG4gICAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3ltYm9sIHByb3BlcnRpZXMgKGxpa2UgU3ltYm9sLml0ZXJhdG9yKSBub3JtYWxseVxuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBpbnNwZWN0aW9uIG1ldGhvZHNcbiAgICAgIGlmIChwcm9wID09PSAndmFsdWVPZicgfHwgcHJvcCA9PT0gJ3RvU3RyaW5nJykge1xuICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHByb3AgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoID8gYCR7YmFzZVBhdGh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIC8vIFNhZmV0eSBjaGVjayBmb3IgcHJvcGVydHkgZXhpc3RlbmNlXG4gICAgICBpZiAoIShrZXkgaW4gdGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG5cbiAgICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIHNpZ25hbCwgcmV0dXJuIGl0XG4gICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc2lnbmFsIGZvciB0aGlzIHBhdGhcbiAgICAgIGlmIChzaWduYWxDYWNoZS5oYXMocGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIG5lc3RlZCBwcm94eSBjYWNoZWRcbiAgICAgIGlmIChuZXN0ZWRQcm94aWVzLmhhcyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gbmVzdGVkUHJveGllcy5nZXQocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgb2JqZWN0cyAtIGNyZWF0ZSBsYXp5IHByb3h5XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc1NpZ25hbCh2YWx1ZSkgJiZcbiAgICAgICAgIWlzQnVpbHRJbk9iamVjdCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG5lc3RlZFByb3h5ID0gY3JlYXRlTGF6eVNpZ25hbFRyZWUoXG4gICAgICAgICAgICB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIGVxdWFsaXR5Rm4sXG4gICAgICAgICAgICBwYXRoXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIG5lc3RlZFByb3hpZXMuc2V0KHBhdGgsIG5lc3RlZFByb3h5KTtcblxuICAgICAgICAgIC8vIFN0b3JlIGNsZWFudXAgZnVuY3Rpb24gZm9yIG5lc3RlZCBwcm94eVxuICAgICAgICAgIGNvbnN0IHByb3h5V2l0aENsZWFudXAgPSBuZXN0ZWRQcm94eSBhcyB7IF9fY2xlYW51cF9fPzogKCkgPT4gdm9pZCB9O1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJveHlXaXRoQ2xlYW51cC5fX2NsZWFudXBfXyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVzdGVkQ2xlYW51cHMuc2V0KHBhdGgsIHByb3h5V2l0aENsZWFudXAuX19jbGVhbnVwX18pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuZXN0ZWRQcm94eTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBsYXp5IHByb3h5IGZvciBwYXRoIFwiJHtwYXRofVwiOmAsXG4gICAgICAgICAgICBlcnJvclxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IGNyZWF0ZSBhIHNpZ25hbCBmb3IgdGhlIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrU2lnbmFsID0gc2lnbmFsKHZhbHVlLCB7IGVxdWFsOiBlcXVhbGl0eUZuIH0pO1xuICAgICAgICAgIHNpZ25hbENhY2hlLnNldChwYXRoLCBmYWxsYmFja1NpZ25hbCk7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrU2lnbmFsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBzaWduYWwgZm9yIHByaW1pdGl2ZSB2YWx1ZXMsIGFycmF5cywgYW5kIGJ1aWx0LWluIG9iamVjdHNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5ld1NpZ25hbCA9IHNpZ25hbCh2YWx1ZSwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KTtcbiAgICAgICAgc2lnbmFsQ2FjaGUuc2V0KHBhdGgsIG5ld1NpZ25hbCk7XG4gICAgICAgIHJldHVybiBuZXdTaWduYWw7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBjcmVhdGUgc2lnbmFsIGZvciBwYXRoIFwiJHtwYXRofVwiOmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlOyAvLyBSZXR1cm4gcmF3IHZhbHVlIGFzIGZhbGxiYWNrXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldCh0YXJnZXQ6IG9iamVjdCwgcHJvcDogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogdW5rbm93bikge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gcHJvcCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW5hbCBvYmplY3RcbiAgICAgICAgKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWNoZWQgc2lnbmFsLCB1cGRhdGUgaXRcbiAgICAgICAgY29uc3QgY2FjaGVkU2lnbmFsID0gc2lnbmFsQ2FjaGUuZ2V0KHBhdGgpO1xuICAgICAgICBpZiAoY2FjaGVkU2lnbmFsICYmICdzZXQnIGluIGNhY2hlZFNpZ25hbCkge1xuICAgICAgICAgIChjYWNoZWRTaWduYWwgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pLnNldCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBuZXN0ZWQgcHJveHkgY2FjaGUgaWYgdGhlIHZhbHVlIHR5cGUgY2hhbmdlZFxuICAgICAgICBpZiAobmVzdGVkUHJveGllcy5oYXMocGF0aCkpIHtcbiAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgbmVzdGVkIHByb3h5XG4gICAgICAgICAgY29uc3QgbmVzdGVkQ2xlYW51cCA9IG5lc3RlZENsZWFudXBzLmdldChwYXRoKTtcbiAgICAgICAgICBpZiAobmVzdGVkQ2xlYW51cCkge1xuICAgICAgICAgICAgbmVzdGVkQ2xlYW51cCgpO1xuICAgICAgICAgICAgbmVzdGVkQ2xlYW51cHMuZGVsZXRlKHBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXN0ZWRQcm94aWVzLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gc2V0IHZhbHVlIGZvciBwYXRoIFwiJHtwYXRofVwiOmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQ7XG4gICAgfSxcblxuICAgIG93bktleXModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gICAgfSxcblxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBwcm94eSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xufVxuXG4vKipcbiAqIE5hdGl2ZSBkZWVwIGVxdWFsaXR5IGNoZWNrIGZvciBhcnJheXMgYW5kIG9iamVjdHMuXG4gKiBBbGlhcyBmb3IgdGhlIGVuaGFuY2VkIGVxdWFsIGZ1bmN0aW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgY29uc3QgZGVlcEVxdWFsID0gZXF1YWw7XG5cbi8qKlxuICogU2hhbGxvdyBlcXVhbGl0eSBjaGVjayBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsPFQ+KGE6IFQsIGI6IFQpOiBib29sZWFuIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzQSkge1xuICAgICAgaWYgKFxuICAgICAgICAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSAhPT1cbiAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV1cbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==","import { signal, computed, effect, inject, DestroyRef, isSignal, } from '@angular/core';\nimport { createLazySignalTree, equal } from './utils';\nfunction estimateObjectSize(obj, maxDepth = 3, currentDepth = 0) {\n if (currentDepth >= maxDepth)\n return 1;\n if (obj === null || obj === undefined)\n return 0;\n if (typeof obj !== 'object')\n return 1;\n let size = 0;\n try {\n if (Array.isArray(obj)) {\n size = obj.length;\n const sampleSize = Math.min(3, obj.length);\n for (let i = 0; i < sampleSize; i++) {\n size += estimateObjectSize(obj[i], maxDepth, currentDepth + 1) * 0.1;\n }\n }\n else {\n const keys = Object.keys(obj);\n size = keys.length;\n const sampleSize = Math.min(5, keys.length);\n for (let i = 0; i < sampleSize; i++) {\n const value = obj[keys[i]];\n size += estimateObjectSize(value, maxDepth, currentDepth + 1) * 0.5;\n }\n }\n }\n catch {\n return 1;\n }\n return Math.floor(size);\n}\nfunction shouldUseLazy(obj, config) {\n if (config.useLazySignals !== undefined) {\n return config.useLazySignals;\n }\n if (config.debugMode || config.enableDevTools) {\n return false;\n }\n if (config.batchUpdates && config.useMemoization) {\n return true;\n }\n const estimatedSize = estimateObjectSize(obj);\n return estimatedSize > 50;\n}\nfunction createEqualityFn(useShallowComparison) {\n return useShallowComparison ? Object.is : equal;\n}\nfunction isBuiltInObject(v) {\n if (v === null || v === undefined)\n return false;\n if (v instanceof Date ||\n v instanceof RegExp ||\n typeof v === 'function' ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n v instanceof Error ||\n v instanceof Promise) {\n return true;\n }\n if (v instanceof Int8Array ||\n v instanceof Uint8Array ||\n v instanceof Uint8ClampedArray ||\n v instanceof Int16Array ||\n v instanceof Uint16Array ||\n v instanceof Int32Array ||\n v instanceof Uint32Array ||\n v instanceof Float32Array ||\n v instanceof Float64Array ||\n v instanceof BigInt64Array ||\n v instanceof BigUint64Array) {\n return true;\n }\n if (typeof window !== 'undefined') {\n if (v instanceof URL ||\n v instanceof URLSearchParams ||\n v instanceof FormData ||\n v instanceof Blob ||\n (typeof File !== 'undefined' && v instanceof File) ||\n (typeof FileList !== 'undefined' && v instanceof FileList) ||\n (typeof Headers !== 'undefined' && v instanceof Headers) ||\n (typeof Request !== 'undefined' && v instanceof Request) ||\n (typeof Response !== 'undefined' && v instanceof Response) ||\n (typeof AbortController !== 'undefined' &&\n v instanceof AbortController) ||\n (typeof AbortSignal !== 'undefined' && v instanceof AbortSignal)) {\n return true;\n }\n }\n try {\n const NodeBuffer = globalThis?.Buffer;\n if (NodeBuffer && v instanceof NodeBuffer) {\n return true;\n }\n }\n catch {\n }\n return false;\n}\nfunction create(obj, config = {}) {\n if (obj === null || obj === undefined) {\n throw new Error('Cannot create SignalTree from null or undefined');\n }\n const equalityFn = createEqualityFn(config.useShallowComparison ?? false);\n const useLazy = shouldUseLazy(obj, config);\n if (config.debugMode) {\n const estimatedSize = estimateObjectSize(obj);\n console.log(`[SignalTree] Creating tree with ${useLazy ? 'lazy' : 'eager'} strategy (estimated size: ${estimatedSize})`);\n }\n let signalState;\n try {\n if (useLazy && typeof obj === 'object') {\n signalState = createLazySignalTree(obj, equalityFn);\n }\n else {\n signalState = createSignalStore(obj, equalityFn);\n }\n }\n catch (error) {\n if (useLazy) {\n console.warn('[SignalTree] Lazy creation failed, falling back to eager:', error);\n signalState = createSignalStore(obj, equalityFn);\n }\n else {\n throw error;\n }\n }\n const resultTree = {\n state: signalState,\n $: signalState,\n };\n enhanceTree(resultTree, config);\n return resultTree;\n}\nfunction createSignalStore(obj, equalityFn) {\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return signal(obj, { equal: equalityFn });\n }\n if (Array.isArray(obj)) {\n return signal(obj, { equal: equalityFn });\n }\n if (isBuiltInObject(obj)) {\n return signal(obj, { equal: equalityFn });\n }\n const store = {};\n const processedObjects = new WeakSet();\n if (processedObjects.has(obj)) {\n console.warn('[SignalTree] Circular reference detected, creating reference signal');\n return signal(obj, { equal: equalityFn });\n }\n processedObjects.add(obj);\n try {\n for (const [key, value] of Object.entries(obj)) {\n try {\n if (typeof key === 'symbol')\n continue;\n if (isSignal(value)) {\n store[key] = value;\n continue;\n }\n if (value === null || value === undefined) {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else if (typeof value !== 'object') {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else if (Array.isArray(value) || isBuiltInObject(value)) {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else {\n store[key] = createSignalStore(value, equalityFn);\n }\n }\n catch (error) {\n console.warn(`[SignalTree] Failed to create signal for key \"${key}\":`, error);\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n const symbols = Object.getOwnPropertySymbols(obj);\n for (const sym of symbols) {\n const value = obj[sym];\n try {\n if (isSignal(value)) {\n store[sym] = value;\n }\n else {\n store[sym] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n catch (error) {\n console.warn(`[SignalTree] Failed to create signal for symbol key:`, error);\n }\n }\n }\n catch (error) {\n throw new Error(`Failed to create signal store: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n return store;\n}\nfunction enhanceTree(tree, config = {}) {\n const isLazy = config.useLazySignals ?? shouldUseLazy(tree.state, config);\n tree.unwrap = () => {\n const unwrapObject = (obj) => {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n if (isSignal(obj)) {\n return obj();\n }\n if (isSignal(obj)) {\n const value = obj();\n if (Array.isArray(value)) {\n return value;\n }\n }\n const result = {};\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key))\n continue;\n const value = obj[key];\n if (isSignal(value)) {\n result[key] = value();\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n !isBuiltInObject(value)) {\n result[key] = unwrapObject(value);\n }\n else {\n result[key] = value;\n }\n }\n const symbols = Object.getOwnPropertySymbols(obj);\n for (const sym of symbols) {\n const value = obj[sym];\n if (isSignal(value)) {\n result[sym] = value();\n }\n else {\n result[sym] = value;\n }\n }\n return result;\n };\n return unwrapObject(tree.state);\n };\n tree.update = (updater) => {\n const transactionLog = [];\n try {\n const currentValue = tree.unwrap();\n const partialObj = updater(currentValue);\n if (!partialObj || typeof partialObj !== 'object') {\n throw new Error('Updater must return an object');\n }\n const updateObject = (target, updates, path = '') => {\n for (const key in updates) {\n if (!Object.prototype.hasOwnProperty.call(updates, key))\n continue;\n const updateValue = updates[key];\n const currentPath = path ? `${path}.${key}` : key;\n const currentSignalOrState = target[key];\n try {\n if (isSignal(currentSignalOrState)) {\n const originalValue = currentSignalOrState();\n transactionLog.push({\n path: currentPath,\n oldValue: originalValue,\n newValue: updateValue,\n });\n currentSignalOrState.set(updateValue);\n }\n else if (typeof updateValue === 'object' &&\n updateValue !== null &&\n !Array.isArray(updateValue) &&\n !isBuiltInObject(updateValue) &&\n typeof currentSignalOrState === 'object' &&\n currentSignalOrState !== null &&\n !isSignal(currentSignalOrState)) {\n updateObject(currentSignalOrState, updateValue, currentPath);\n }\n else if (currentSignalOrState === undefined) {\n console.warn(`[SignalTree] Cannot update non-existent path: ${currentPath}`);\n }\n }\n catch (error) {\n console.error(`[SignalTree] Failed to update path \"${currentPath}\":`, error);\n throw error;\n }\n }\n };\n updateObject(tree.state, partialObj);\n if (config.debugMode && transactionLog.length > 0) {\n console.log('[SignalTree] Update transaction:', transactionLog);\n }\n }\n catch (error) {\n console.error('[SignalTree] Update failed, attempting rollback:', error);\n for (const { path, oldValue } of transactionLog.reverse()) {\n try {\n const pathParts = path.split('.');\n let current = tree.state;\n for (let i = 0; i < pathParts.length - 1; i++) {\n current = current[pathParts[i]];\n if (!current)\n break;\n }\n if (current) {\n const lastKey = pathParts[pathParts.length - 1];\n const targetSignal = current[lastKey];\n if (isSignal(targetSignal)) {\n targetSignal.set(oldValue);\n }\n }\n }\n catch (rollbackError) {\n console.error('[SignalTree] Rollback failed for path:', path, rollbackError);\n }\n }\n throw error;\n }\n };\n tree.pipe = ((...fns) => {\n if (fns.length === 0) {\n return tree;\n }\n return fns.reduce((acc, fn) => {\n if (typeof fn !== 'function') {\n throw new Error('All pipe arguments must be functions');\n }\n try {\n return fn(acc);\n }\n catch (error) {\n console.error('[SignalTree] Pipe function failed:', error);\n throw error;\n }\n }, tree);\n });\n tree.destroy = () => {\n try {\n if (isLazy) {\n const state = tree.state;\n if (state && typeof state === 'object' && '__cleanup__' in state) {\n const cleanup = state.__cleanup__;\n if (typeof cleanup === 'function') {\n cleanup();\n }\n }\n }\n if (config.debugMode) {\n console.log('[SignalTree] Tree destroyed');\n }\n }\n catch (error) {\n console.error('[SignalTree] Error during cleanup:', error);\n }\n };\n addStubMethods(tree, config);\n return tree;\n}\nfunction addStubMethods(tree, config) {\n tree.batchUpdate = (updater) => {\n console.warn('⚠️ batchUpdate() called but batching is not enabled.', 'To enable batch updates, install @signaltree/batching');\n tree.update(updater);\n };\n tree.memoize = (fn, cacheKey) => {\n console.warn('⚠️ memoize() called but memoization is not enabled.', 'To enable memoized computations, install @signaltree/memoization');\n void cacheKey;\n return computed(() => fn(tree.unwrap()));\n };\n tree.effect = (fn) => {\n try {\n effect(() => fn(tree.unwrap()));\n }\n catch (error) {\n if (config.debugMode) {\n console.warn('Effect requires Angular injection context', error);\n }\n }\n };\n tree.subscribe = (fn) => {\n try {\n const destroyRef = inject(DestroyRef);\n let isDestroyed = false;\n const effectRef = effect(() => {\n if (!isDestroyed) {\n fn(tree.unwrap());\n }\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n const unsubscribe = () => {\n isDestroyed = true;\n effectRef.destroy();\n };\n destroyRef.onDestroy(unsubscribe);\n return unsubscribe;\n }\n catch (error) {\n if (config.debugMode) {\n console.warn('Subscribe requires Angular injection context', error);\n }\n fn(tree.unwrap());\n return () => {\n };\n }\n };\n tree.optimize = () => {\n if (config.debugMode) {\n console.warn('⚠️ optimize() called but tree optimization is not available.');\n }\n };\n tree.clearCache = () => {\n if (config.debugMode) {\n console.warn('⚠️ clearCache() called but caching is not available.');\n }\n };\n tree.invalidatePattern = () => {\n if (config.debugMode) {\n console.warn('⚠️ invalidatePattern() called but performance optimization is not enabled.');\n }\n return 0;\n };\n tree.getMetrics = () => {\n return {\n updates: 0,\n computations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n averageUpdateTime: 0,\n };\n };\n tree.addTap = (middleware) => {\n if (config.debugMode) {\n console.warn('⚠️ addTap() called but middleware support is not available.');\n }\n void middleware;\n };\n tree.removeTap = (id) => {\n if (config.debugMode) {\n console.warn('⚠️ removeTap() called but middleware support is not available.');\n }\n void id;\n };\n tree.asCrud = () => {\n if (config.debugMode) {\n console.warn('⚠️ asCrud() called but entity helpers are not available.');\n }\n return {};\n };\n tree.asyncAction = (operation, asyncConfig = {}) => {\n if (config.debugMode) {\n console.warn('⚠️ asyncAction() called but async actions are not available.');\n }\n void operation;\n void asyncConfig;\n return {};\n };\n tree.undo = () => {\n if (config.debugMode) {\n console.warn('⚠️ undo() called but time travel is not available.');\n }\n };\n tree.redo = () => {\n if (config.debugMode) {\n console.warn('⚠️ redo() called but time travel is not available.');\n }\n };\n tree.getHistory = () => {\n if (config.debugMode) {\n console.warn('⚠️ getHistory() called but time travel is not available.');\n }\n return [];\n };\n tree.resetHistory = () => {\n if (config.debugMode) {\n console.warn('⚠️ resetHistory() called but time travel is not available.');\n }\n };\n}\nexport function signalTree(obj, configOrPreset) {\n if (typeof configOrPreset === 'string') {\n const presetConfigs = {\n basic: {\n useLazySignals: false,\n debugMode: false,\n },\n performance: {\n useLazySignals: true,\n batchUpdates: true,\n useMemoization: true,\n useShallowComparison: true,\n },\n development: {\n useLazySignals: false,\n debugMode: true,\n enableDevTools: true,\n trackPerformance: true,\n },\n production: {\n useLazySignals: true,\n batchUpdates: true,\n useMemoization: true,\n debugMode: false,\n },\n };\n const config = presetConfigs[configOrPreset];\n if (!config) {\n console.warn(`Unknown preset: ${configOrPreset}, using default configuration`);\n return create(obj, {});\n }\n return create(obj, config);\n }\n const config = configOrPreset || {};\n return create(obj, config);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2lnbmFsLXRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBYXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFTdEQsU0FBUyxrQkFBa0IsQ0FDekIsR0FBWSxFQUNaLFFBQVEsR0FBRyxDQUFDLEVBQ1osWUFBWSxHQUFHLENBQUM7SUFFaEIsSUFBSSxZQUFZLElBQUksUUFBUTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXRDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUViLElBQUksQ0FBQztRQUNILElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBRWxCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7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RUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFHRCxNQUFNLE1BQU0sR0FBRyxjQUFjLElBQUksRUFBRSxDQUFDO0lBQ3BDLE9BQU8sTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaWduYWxUcmVlIENvcmUgdjEuMS40IC0gRmFpciBTb3VyY2UgTGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDI1IEpvbmF0aGFuIEQgQm9yZ2lhXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9KQm9yZ2lhL3NpZ25hbHRyZWUvYmxvYi9tYWluL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgRGVzdHJveVJlZixcbiAgaXNTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUge1xuICBTaWduYWxUcmVlLFxuICBEZWVwU2lnbmFsaWZ5LFxuICBUcmVlQ29uZmlnLFxuICBUcmVlUHJlc2V0LFxuICBNaWRkbGV3YXJlLFxuICBQZXJmb3JtYW5jZU1ldHJpY3MsXG4gIEVudGl0eUhlbHBlcnMsXG4gIEFzeW5jQWN0aW9uQ29uZmlnLFxuICBBc3luY0FjdGlvbixcbiAgVGltZVRyYXZlbEVudHJ5LFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUxhenlTaWduYWxUcmVlLCBlcXVhbCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUEVSRk9STUFOQ0UgSEVVUklTVElDU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBFc3RpbWF0ZXMgdGhlIHNpemUgb2YgYW4gb2JqZWN0IGZvciBzdHJhdGVneSBzZWxlY3Rpb25cbiAqL1xuZnVuY3Rpb24gZXN0aW1hdGVPYmplY3RTaXplKFxuICBvYmo6IHVua25vd24sXG4gIG1heERlcHRoID0gMyxcbiAgY3VycmVudERlcHRoID0gMFxuKTogbnVtYmVyIHtcbiAgaWYgKGN1cnJlbnREZXB0aCA+PSBtYXhEZXB0aCkgcmV0dXJuIDE7XG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHJldHVybiAxO1xuXG4gIGxldCBzaXplID0gMDtcblxuICB0cnkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHNpemUgPSBvYmoubGVuZ3RoO1xuICAgICAgLy8gU2FtcGxlIGZpcnN0IGZldyBpdGVtcyBmb3IgbmVzdGVkIHNpemUgZXN0aW1hdGlvblxuICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IE1hdGgubWluKDMsIG9iai5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgc2l6ZSArPSBlc3RpbWF0ZU9iamVjdFNpemUob2JqW2ldLCBtYXhEZXB0aCwgY3VycmVudERlcHRoICsgMSkgKiAwLjE7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgc2l6ZSA9IGtleXMubGVuZ3RoO1xuICAgICAgLy8gU2FtcGxlIGZpcnN0IGZldyBwcm9wZXJ0aWVzIGZvciBuZXN0ZWQgc2l6ZSBlc3RpbWF0aW9uXG4gICAgICBjb25zdCBzYW1wbGVTaXplID0gTWF0aC5taW4oNSwga2V5cy5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXlzW2ldXTtcbiAgICAgICAgc2l6ZSArPSBlc3RpbWF0ZU9iamVjdFNpemUodmFsdWUsIG1heERlcHRoLCBjdXJyZW50RGVwdGggKyAxKSAqIDAuNTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHdlIGNhbid0IGVzdGltYXRlLCBhc3N1bWUgc21hbGxcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKHNpemUpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0byB1c2UgbGF6eSBzaWduYWwgY3JlYXRpb24gYmFzZWQgb24gb2JqZWN0IGNoYXJhY3RlcmlzdGljc1xuICovXG5mdW5jdGlvbiBzaG91bGRVc2VMYXp5KG9iajogdW5rbm93biwgY29uZmlnOiBUcmVlQ29uZmlnKTogYm9vbGVhbiB7XG4gIC8vIEV4cGxpY2l0IGNvbmZpZ3VyYXRpb24gdGFrZXMgcHJlY2VkZW5jZVxuICBpZiAoY29uZmlnLnVzZUxhenlTaWduYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29uZmlnLnVzZUxhenlTaWduYWxzO1xuICB9XG5cbiAgLy8gRGV2ZWxvcG1lbnQgbW9kZTogcHJlZmVyIGVhZ2VyIGZvciBiZXR0ZXIgZGVidWdnaW5nXG4gIGlmIChjb25maWcuZGVidWdNb2RlIHx8IGNvbmZpZy5lbmFibGVEZXZUb29scykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFBlcmZvcm1hbmNlIG1vZGU6IGFsd2F5cyB1c2UgbGF6eVxuICBpZiAoY29uZmlnLmJhdGNoVXBkYXRlcyAmJiBjb25maWcudXNlTWVtb2l6YXRpb24pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEF1dG8tZGV0ZWN0IGJhc2VkIG9uIHNpemVcbiAgY29uc3QgZXN0aW1hdGVkU2l6ZSA9IGVzdGltYXRlT2JqZWN0U2l6ZShvYmopO1xuXG4gIC8vIFVzZSBsYXp5IGZvciBvYmplY3RzIHdpdGggbW9yZSB0aGFuIDUwIGVzdGltYXRlZCBwcm9wZXJ0aWVzXG4gIHJldHVybiBlc3RpbWF0ZWRTaXplID4gNTA7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlcXVhbGl0eSBmdW5jdGlvbiBiYXNlZCBvbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBwYXJhbSB1c2VTaGFsbG93Q29tcGFyaXNvbiAtIElmIHRydWUsIHVzZXMgT2JqZWN0LmlzIGZvciBjb21wYXJpc29uOyBvdGhlcndpc2UgdXNlcyBkZWVwIGVxdWFsaXR5XG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdHdvIHZhbHVlcyBmb3IgZXF1YWxpdHlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRXF1YWxpdHlGbih1c2VTaGFsbG93Q29tcGFyaXNvbjogYm9vbGVhbikge1xuICByZXR1cm4gdXNlU2hhbGxvd0NvbXBhcmlzb24gPyBPYmplY3QuaXMgOiBlcXVhbDtcbn1cblxuLyoqXG4gKiBFbmhhbmNlZCBidWlsdC1pbiBvYmplY3QgZGV0ZWN0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBjb3ZlcmFnZVxuICovXG5mdW5jdGlvbiBpc0J1aWx0SW5PYmplY3QodjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcblxuICAvLyBDb3JlIEphdmFTY3JpcHQgYnVpbHQtaW5zXG4gIGlmIChcbiAgICB2IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgIHYgaW5zdGFuY2VvZiBSZWdFeHAgfHxcbiAgICB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIHYgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICB2IGluc3RhbmNlb2YgU2V0IHx8XG4gICAgdiBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICB2IGluc3RhbmNlb2YgV2Vha1NldCB8fFxuICAgIHYgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fFxuICAgIHYgaW5zdGFuY2VvZiBEYXRhVmlldyB8fFxuICAgIHYgaW5zdGFuY2VvZiBFcnJvciB8fFxuICAgIHYgaW5zdGFuY2VvZiBQcm9taXNlXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gVHlwZWQgQXJyYXlzXG4gIGlmIChcbiAgICB2IGluc3RhbmNlb2YgSW50OEFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgSW50MTZBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBVaW50MTZBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIFVpbnQzMkFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgQmlnSW50NjRBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBCaWdVaW50NjRBcnJheVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFdlYiBBUElzICh3aGVuIGF2YWlsYWJsZSlcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKFxuICAgICAgdiBpbnN0YW5jZW9mIFVSTCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcyB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8XG4gICAgICB2IGluc3RhbmNlb2YgQmxvYiB8fFxuICAgICAgKHR5cGVvZiBGaWxlICE9PSAndW5kZWZpbmVkJyAmJiB2IGluc3RhbmNlb2YgRmlsZSkgfHxcbiAgICAgICh0eXBlb2YgRmlsZUxpc3QgIT09ICd1bmRlZmluZWQnICYmIHYgaW5zdGFuY2VvZiBGaWxlTGlzdCkgfHxcbiAgICAgICh0eXBlb2YgSGVhZGVycyAhPT0gJ3VuZGVmaW5lZCcgJiYgdiBpbnN0YW5jZW9mIEhlYWRlcnMpIHx8XG4gICAgICAodHlwZW9mIFJlcXVlc3QgIT09ICd1bmRlZmluZWQnICYmIHYgaW5zdGFuY2VvZiBSZXF1ZXN0KSB8fFxuICAgICAgKHR5cGVvZiBSZXNwb25zZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdiBpbnN0YW5jZW9mIFJlc3BvbnNlKSB8fFxuICAgICAgKHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHYgaW5zdGFuY2VvZiBBYm9ydENvbnRyb2xsZXIpIHx8XG4gICAgICAodHlwZW9mIEFib3J0U2lnbmFsICE9PSAndW5kZWZpbmVkJyAmJiB2IGluc3RhbmNlb2YgQWJvcnRTaWduYWwpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBOb2RlLmpzIGJ1aWx0LWlucyAod2hlbiBhdmFpbGFibGUpXG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBOb2RlQnVmZmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KT8uQnVmZmVyO1xuICAgIGlmIChOb2RlQnVmZmVyICYmIHYgaW5zdGFuY2VvZiBOb2RlQnVmZmVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIElnbm9yZSBpZiBCdWZmZXIgaXMgbm90IGF2YWlsYWJsZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvcmUgZnVuY3Rpb24gdG8gY3JlYXRlIGEgYmFzaWMgU2lnbmFsVHJlZSB3aXRoIGVuaGFuY2VkIHNhZmV0eSBhbmQgc21hcnQgc3RyYXRlZ3kgc2VsZWN0aW9uLlxuICogVGhpcyBwcm92aWRlcyB0aGUgbWluaW1hbCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYWR2YW5jZWQgZmVhdHVyZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUgKE5PIGNvbnN0cmFpbnRzIC0gbWF4aW11bSBmbGV4aWJpbGl0eSlcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSB0cmVlXG4gKiBAcmV0dXJucyBBIGJhc2ljIFNpZ25hbFRyZWUgd2l0aCBjb3JlIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlPFQ+KG9iajogVCwgY29uZmlnOiBUcmVlQ29uZmlnID0ge30pOiBTaWduYWxUcmVlPFQ+IHtcbiAgLy8gVmFsaWRhdGUgaW5wdXRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBTaWduYWxUcmVlIGZyb20gbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGVxdWFsaXR5Rm4gPSBjcmVhdGVFcXVhbGl0eUZuKGNvbmZpZy51c2VTaGFsbG93Q29tcGFyaXNvbiA/PyBmYWxzZSk7XG4gIGNvbnN0IHVzZUxhenkgPSBzaG91bGRVc2VMYXp5KG9iaiwgY29uZmlnKTtcblxuICAvLyBMb2cgc3RyYXRlZ3kgc2VsZWN0aW9uIGluIGRlYnVnIG1vZGVcbiAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICBjb25zdCBlc3RpbWF0ZWRTaXplID0gZXN0aW1hdGVPYmplY3RTaXplKG9iaik7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgW1NpZ25hbFRyZWVdIENyZWF0aW5nIHRyZWUgd2l0aCAke1xuICAgICAgICB1c2VMYXp5ID8gJ2xhenknIDogJ2VhZ2VyJ1xuICAgICAgfSBzdHJhdGVneSAoZXN0aW1hdGVkIHNpemU6ICR7ZXN0aW1hdGVkU2l6ZX0pYFxuICAgICk7XG4gIH1cblxuICAvLyBDcmVhdGUgc2lnbmFscyB1c2luZyBhcHByb3ByaWF0ZSBzdHJhdGVneVxuICBsZXQgc2lnbmFsU3RhdGU6IERlZXBTaWduYWxpZnk8VD47XG5cbiAgdHJ5IHtcbiAgICBpZiAodXNlTGF6eSAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgc2lnbmFsU3RhdGUgPSBjcmVhdGVMYXp5U2lnbmFsVHJlZShcbiAgICAgICAgb2JqIGFzIG9iamVjdCxcbiAgICAgICAgZXF1YWxpdHlGblxuICAgICAgKSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xuICAgIH0gZWxzZSB7XG4gICAgICBzaWduYWxTdGF0ZSA9IGNyZWF0ZVNpZ25hbFN0b3JlKG9iaiwgZXF1YWxpdHlGbik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZhbGxiYWNrIHRvIGVhZ2VyIGlmIGxhenkgZmFpbHNcbiAgICBpZiAodXNlTGF6eSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW1NpZ25hbFRyZWVdIExhenkgY3JlYXRpb24gZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZWFnZXI6JyxcbiAgICAgICAgZXJyb3JcbiAgICAgICk7XG4gICAgICBzaWduYWxTdGF0ZSA9IGNyZWF0ZVNpZ25hbFN0b3JlKG9iaiwgZXF1YWxpdHlGbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdFRyZWUgPSB7XG4gICAgc3RhdGU6IHNpZ25hbFN0YXRlLFxuICAgICQ6IHNpZ25hbFN0YXRlLCAvLyAkIHBvaW50cyB0byB0aGUgc2FtZSBzdGF0ZSBvYmplY3RcbiAgfSBhcyBTaWduYWxUcmVlPFQ+O1xuXG4gIGVuaGFuY2VUcmVlKHJlc3VsdFRyZWUsIGNvbmZpZyk7XG4gIHJldHVybiByZXN1bHRUcmVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgc2lnbmFscyB1c2luZyBzaWduYWwtc3RvcmUgcGF0dGVybiBmb3IgcGVyZmVjdCB0eXBlIGluZmVyZW5jZS5cbiAqIEVhZ2VyIGNyZWF0aW9uIC0gYWxsIHNpZ25hbHMgY3JlYXRlZCBpbW1lZGlhdGVseS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9KQm9yZ2lhL3NpZ25hbHRyZWUvYmxvYi9tYWluL2RvY3MvYXBpL2NyZWF0ZS1zaWduYWwtc3RvcmUubWRcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIG9iamVjdCB0eXBlIHRvIHByb2Nlc3MgKHByZXNlcnZlcyBleGFjdCB0eXBlIHN0cnVjdHVyZSlcbiAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIGNvbnZlcnQgdG8gc2lnbmFsc1xuICogQHBhcmFtIGVxdWFsaXR5Rm4gLSBGdW5jdGlvbiB0byBjb21wYXJlIHZhbHVlcyBmb3IgZXF1YWxpdHlcbiAqIEByZXR1cm5zIEEgZGVlcGx5IHNpZ25hbGlmaWVkIHZlcnNpb24gbWFpbnRhaW5pbmcgZXhhY3QgdHlwZSBzdHJ1Y3R1cmVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU2lnbmFsU3RvcmU8VD4oXG4gIG9iajogVCxcbiAgZXF1YWxpdHlGbjogKGE6IHVua25vd24sIGI6IHVua25vd24pID0+IGJvb2xlYW5cbik6IERlZXBTaWduYWxpZnk8VD4ge1xuICAvLyBIYW5kbGUgcHJpbWl0aXZlcyBhbmQgbnVsbC91bmRlZmluZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBzaWduYWwob2JqLCB7IGVxdWFsOiBlcXVhbGl0eUZuIH0pIGFzIERlZXBTaWduYWxpZnk8VD47XG4gIH1cblxuICAvLyBIYW5kbGUgYXJyYXlzIC0gdHJlYXQgYXMgcHJpbWl0aXZlIHNpZ25hbFxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIHNpZ25hbChvYmosIHsgZXF1YWw6IGVxdWFsaXR5Rm4gfSkgYXMgRGVlcFNpZ25hbGlmeTxUPjtcbiAgfVxuXG4gIC8vIEhhbmRsZSBidWlsdC1pbiBvYmplY3RzIC0gdHJlYXQgYXMgcHJpbWl0aXZlIHNpZ25hbFxuICBpZiAoaXNCdWlsdEluT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gc2lnbmFsKG9iaiwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xuICB9XG5cbiAgY29uc3Qgc3RvcmU6IFBhcnRpYWw8RGVlcFNpZ25hbGlmeTxUPj4gPSB7fTtcbiAgY29uc3QgcHJvY2Vzc2VkT2JqZWN0cyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvLyBQcmV2ZW50IGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgaWYgKHByb2Nlc3NlZE9iamVjdHMuaGFzKG9iaiBhcyBvYmplY3QpKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1tTaWduYWxUcmVlXSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQsIGNyZWF0aW5nIHJlZmVyZW5jZSBzaWduYWwnXG4gICAgKTtcbiAgICByZXR1cm4gc2lnbmFsKG9iaiwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xuICB9XG4gIHByb2Nlc3NlZE9iamVjdHMuYWRkKG9iaiBhcyBvYmplY3QpO1xuXG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gU2tpcCBzeW1ib2wga2V5cyBmb3Igbm93IChoYW5kbGUgc2VwYXJhdGVseSBpZiBuZWVkZWQpXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykgY29udGludWU7XG5cbiAgICAgICAgLy8gTmV2ZXIgZG91YmxlLXdyYXAgc2lnbmFsc1xuICAgICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHZhbHVlIHR5cGVzXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgICAgICBlcXVhbDogZXF1YWxpdHlGbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgLy8gUHJpbWl0aXZlc1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHNpZ25hbCh2YWx1ZSwge1xuICAgICAgICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNCdWlsdEluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgIC8vIEFycmF5cyBhbmQgYnVpbHQtaW4gb2JqZWN0c1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHNpZ25hbCh2YWx1ZSwge1xuICAgICAgICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTmVzdGVkIG9iamVjdHMgLSByZWN1cnNlXG4gICAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gY3JlYXRlU2lnbmFsU3RvcmUoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGVxdWFsaXR5Rm5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtTaWduYWxUcmVlXSBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hbCBmb3Iga2V5IFwiJHtrZXl9XCI6YCxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApO1xuICAgICAgICAvLyBGYWxsYmFjazogdHJlYXQgYXMgcHJpbWl0aXZlXG4gICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHNpZ25hbCh2YWx1ZSwge1xuICAgICAgICAgIGVxdWFsOiBlcXVhbGl0eUZuLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3ltYm9sIHByb3BlcnRpZXMgaWYgcHJlc2VudFxuICAgIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG4gICAgZm9yIChjb25zdCBzeW0gb2Ygc3ltYm9scykge1xuICAgICAgY29uc3QgdmFsdWUgPSAob2JqIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtzeW1dO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXSA9IHNpZ25hbCh2YWx1ZSwge1xuICAgICAgICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW1NpZ25hbFRyZWVdIEZhaWxlZCB0byBjcmVhdGUgc2lnbmFsIGZvciBzeW1ib2wga2V5OmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBjcmVhdGUgc2lnbmFsIHN0b3JlOiAke1xuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ1xuICAgICAgfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHN0b3JlIGFzIERlZXBTaWduYWxpZnk8VD47XG59XG5cbi8qKlxuICogRW5oYW5jZXMgYSB0cmVlIHdpdGggYmFzaWMgZnVuY3Rpb25hbGl0eSAodW53cmFwLCB1cGRhdGUsIHBpcGUpLlxuICogQWRkcyBjb3JlIG1ldGhvZHMgdGhhdCBldmVyeSBTaWduYWxUcmVlIG5lZWRzIGZvciBiYXNpYyBvcGVyYXRpb24uXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGVcbiAqIEBwYXJhbSB0cmVlIC0gVGhlIHRyZWUgdG8gZW5oYW5jZSB3aXRoIGJhc2ljIGZ1bmN0aW9uYWxpdHlcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIHVzZWQgZHVyaW5nIHRyZWUgY3JlYXRpb25cbiAqIEByZXR1cm5zIFRoZSBlbmhhbmNlZCB0cmVlIHdpdGggdW53cmFwLCB1cGRhdGUsIGFuZCBwaXBlIG1ldGhvZHNcbiAqL1xuZnVuY3Rpb24gZW5oYW5jZVRyZWU8VD4oXG4gIHRyZWU6IFNpZ25hbFRyZWU8VD4sXG4gIGNvbmZpZzogVHJlZUNvbmZpZyA9IHt9XG4pOiBTaWduYWxUcmVlPFQ+IHtcbiAgLy8gVHJhY2sgaWYgdGhpcyB0cmVlIHVzZXMgbGF6eSBzaWduYWxzIGZvciBwcm9wZXIgY2xlYW51cFxuICBjb25zdCBpc0xhenkgPSBjb25maWcudXNlTGF6eVNpZ25hbHMgPz8gc2hvdWxkVXNlTGF6eSh0cmVlLnN0YXRlLCBjb25maWcpO1xuXG4gIC8qKlxuICAgKiBVbndyYXBzIHRoZSBjdXJyZW50IHN0YXRlIGJ5IHJlYWRpbmcgYWxsIHNpZ25hbCB2YWx1ZXMuXG4gICAqIFJlY3Vyc2l2ZWx5IGNvbnZlcnRzIHRoZSBzaWduYWwgdHJlZSBiYWNrIHRvIHBsYWluIEphdmFTY3JpcHQgdmFsdWVzLlxuICAgKi9cbiAgdHJlZS51bndyYXAgPSAoKTogVCA9PiB7XG4gICAgY29uc3QgdW53cmFwT2JqZWN0ID0gPE8+KG9iajogRGVlcFNpZ25hbGlmeTxPPik6IE8gPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb2JqIGFzIE87XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzaWduYWxzIGRpcmVjdGx5XG4gICAgICBpZiAoaXNTaWduYWwob2JqKSkge1xuICAgICAgICByZXR1cm4gKG9iaiBhcyBTaWduYWw8Tz4pKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBhcnJheXMgKHdoaWNoIGFyZSBzaWduYWxzIGluIG91ciBzdHJ1Y3R1cmUpXG4gICAgICBpZiAoaXNTaWduYWwob2JqKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChvYmogYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUgYXMgTztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuXG4gICAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9ICh2YWx1ZSBhcyBTaWduYWw8dW5rbm93bj4pKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgIWlzQnVpbHRJbk9iamVjdCh2YWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gTmVzdGVkIHNpZ25hbCBzdGF0ZVxuICAgICAgICAgIHJlc3VsdFtrZXldID0gdW53cmFwT2JqZWN0KHZhbHVlIGFzIERlZXBTaWduYWxpZnk8b2JqZWN0Pik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3ltYm9sIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG4gICAgICBmb3IgKGNvbnN0IHN5bSBvZiBzeW1ib2xzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKG9iaiBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXTtcbiAgICAgICAgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgICAgIChyZXN1bHQgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW3N5bV0gPSAoXG4gICAgICAgICAgICB2YWx1ZSBhcyBTaWduYWw8dW5rbm93bj5cbiAgICAgICAgICApKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKHJlc3VsdCBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQgYXMgTztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHVud3JhcE9iamVjdCh0cmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD4pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBzdGF0ZSB1c2luZyBhbiB1cGRhdGVyIGZ1bmN0aW9uIHdpdGggdHJhbnNhY3Rpb24gc3VwcG9ydC5cbiAgICovXG4gIHRyZWUudXBkYXRlID0gKHVwZGF0ZXI6IChjdXJyZW50OiBUKSA9PiBQYXJ0aWFsPFQ+KSA9PiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25Mb2c6IEFycmF5PHtcbiAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgIG9sZFZhbHVlOiB1bmtub3duO1xuICAgICAgbmV3VmFsdWU6IHVua25vd247XG4gICAgfT4gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0cmVlLnVud3JhcCgpO1xuICAgICAgY29uc3QgcGFydGlhbE9iaiA9IHVwZGF0ZXIoY3VycmVudFZhbHVlKTtcblxuICAgICAgaWYgKCFwYXJ0aWFsT2JqIHx8IHR5cGVvZiBwYXJ0aWFsT2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VwZGF0ZXIgbXVzdCByZXR1cm4gYW4gb2JqZWN0Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxPPihcbiAgICAgICAgdGFyZ2V0OiBEZWVwU2lnbmFsaWZ5PE8+LFxuICAgICAgICB1cGRhdGVzOiBQYXJ0aWFsPE8+LFxuICAgICAgICBwYXRoID0gJydcbiAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB1cGRhdGVzKSB7XG4gICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodXBkYXRlcywga2V5KSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCB1cGRhdGVWYWx1ZSA9IHVwZGF0ZXNba2V5XTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IHBhdGggPyBgJHtwYXRofS4ke2tleX1gIDoga2V5O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTaWduYWxPclN0YXRlID0gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoaXNTaWduYWwoY3VycmVudFNpZ25hbE9yU3RhdGUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSAoY3VycmVudFNpZ25hbE9yU3RhdGUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICAgICAgICB0cmFuc2FjdGlvbkxvZy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwYXRoOiBjdXJyZW50UGF0aCxcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZTogb3JpZ2luYWxWYWx1ZSxcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZTogdXBkYXRlVmFsdWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAoY3VycmVudFNpZ25hbE9yU3RhdGUgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pLnNldChcbiAgICAgICAgICAgICAgICB1cGRhdGVWYWx1ZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgdHlwZW9mIHVwZGF0ZVZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICB1cGRhdGVWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheSh1cGRhdGVWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgIWlzQnVpbHRJbk9iamVjdCh1cGRhdGVWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGN1cnJlbnRTaWduYWxPclN0YXRlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICBjdXJyZW50U2lnbmFsT3JTdGF0ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAhaXNTaWduYWwoY3VycmVudFNpZ25hbE9yU3RhdGUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gTmVzdGVkIG9iamVjdCAtIHJlY3Vyc2VcbiAgICAgICAgICAgICAgdXBkYXRlT2JqZWN0KFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTaWduYWxPclN0YXRlIGFzIERlZXBTaWduYWxpZnk8b2JqZWN0PixcbiAgICAgICAgICAgICAgICB1cGRhdGVWYWx1ZSBhcyBQYXJ0aWFsPG9iamVjdD4sXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGhcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFNpZ25hbE9yU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgYFtTaWduYWxUcmVlXSBDYW5ub3QgdXBkYXRlIG5vbi1leGlzdGVudCBwYXRoOiAke2N1cnJlbnRQYXRofWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYFtTaWduYWxUcmVlXSBGYWlsZWQgdG8gdXBkYXRlIHBhdGggXCIke2N1cnJlbnRQYXRofVwiOmAsXG4gICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHRvIHRyaWdnZXIgcm9sbGJhY2tcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHVwZGF0ZU9iamVjdCh0cmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD4sIHBhcnRpYWxPYmopO1xuXG4gICAgICAvLyBMb2cgdHJhbnNhY3Rpb24gaW4gZGVidWcgbW9kZVxuICAgICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUgJiYgdHJhbnNhY3Rpb25Mb2cubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpZ25hbFRyZWVdIFVwZGF0ZSB0cmFuc2FjdGlvbjonLCB0cmFuc2FjdGlvbkxvZyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJvbGxiYWNrIG9uIGVycm9yXG4gICAgICBjb25zb2xlLmVycm9yKCdbU2lnbmFsVHJlZV0gVXBkYXRlIGZhaWxlZCwgYXR0ZW1wdGluZyByb2xsYmFjazonLCBlcnJvcik7XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gcmVzdG9yZSBvcmlnaW5hbCB2YWx1ZXMgZnJvbSB0cmFuc2FjdGlvbiBsb2dcbiAgICAgIGZvciAoY29uc3QgeyBwYXRoLCBvbGRWYWx1ZSB9IG9mIHRyYW5zYWN0aW9uTG9nLnJldmVyc2UoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICAgICAgICBsZXQgY3VycmVudDogdW5rbm93biA9IHRyZWUuc3RhdGU7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhQYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcGF0aFBhcnRzW2ldXTtcbiAgICAgICAgICAgIGlmICghY3VycmVudCkgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RLZXkgPSBwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0U2lnbmFsID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2xhc3RLZXldO1xuICAgICAgICAgICAgaWYgKGlzU2lnbmFsKHRhcmdldFNpZ25hbCkpIHtcbiAgICAgICAgICAgICAgKHRhcmdldFNpZ25hbCBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duPikuc2V0KG9sZFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHJvbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgJ1tTaWduYWxUcmVlXSBSb2xsYmFjayBmYWlsZWQgZm9yIHBhdGg6JyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICByb2xsYmFja0Vycm9yXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgLy8gUGlwZSBpbXBsZW1lbnRhdGlvbiBmb3IgZnVuY3Rpb24gY29tcG9zaXRpb25cbiAgdHJlZS5waXBlID0gKDxUUmVzdWx0ID0gU2lnbmFsVHJlZTxUPj4oXG4gICAgLi4uZm5zOiBBcnJheTwoaW5wdXQ6IHVua25vd24pID0+IHVua25vd24+XG4gICk6IFRSZXN1bHQgPT4ge1xuICAgIGlmIChmbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJlZSBhcyB1bmtub3duIGFzIFRSZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZucy5yZWR1Y2UoKGFjYywgZm4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGwgcGlwZSBhcmd1bWVudHMgbXVzdCBiZSBmdW5jdGlvbnMnKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmbihhY2MpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpZ25hbFRyZWVdIFBpcGUgZnVuY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSwgdHJlZSBhcyB1bmtub3duKSBhcyBUUmVzdWx0O1xuICB9KSBhcyBTaWduYWxUcmVlPFQ+WydwaXBlJ107XG5cbiAgLy8gRW5oYW5jZWQgZGVzdHJveSB3aXRoIHByb3BlciBjbGVhbnVwXG4gIHRyZWUuZGVzdHJveSA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2xlYW4gdXAgbGF6eSBzaWduYWwgcHJveGllcyBpZiB0aGV5IGV4aXN0XG4gICAgICBpZiAoaXNMYXp5KSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdHJlZS5zdGF0ZSBhcyB1bmtub3duO1xuICAgICAgICBpZiAoc3RhdGUgJiYgdHlwZW9mIHN0YXRlID09PSAnb2JqZWN0JyAmJiAnX19jbGVhbnVwX18nIGluIHN0YXRlKSB7XG4gICAgICAgICAgY29uc3QgY2xlYW51cCA9IChzdGF0ZSBhcyB7IF9fY2xlYW51cF9fOiB1bmtub3duIH0pLl9fY2xlYW51cF9fO1xuICAgICAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciBhbnkgZWZmZWN0cyBvciBzdWJzY3JpcHRpb25zXG4gICAgICAvLyAoVGhpcyB3b3VsZCBiZSB0cmFja2VkIGlmIHdlIG1haW50YWluIGEgbGlzdCBvZiBhY3RpdmUgZWZmZWN0cylcblxuICAgICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaWduYWxUcmVlXSBUcmVlIGRlc3Ryb3llZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2lnbmFsVHJlZV0gRXJyb3IgZHVyaW5nIGNsZWFudXA6JywgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICAvLyBBZGQgc3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIGFkdmFuY2VkIGZlYXR1cmVzXG4gIGFkZFN0dWJNZXRob2RzKHRyZWUsIGNvbmZpZyk7XG5cbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8qKlxuICogQWRkcyBzdHViIGltcGxlbWVudGF0aW9ucyBmb3IgYWR2YW5jZWQgZmVhdHVyZXNcbiAqL1xuZnVuY3Rpb24gYWRkU3R1Yk1ldGhvZHM8VD4odHJlZTogU2lnbmFsVHJlZTxUPiwgY29uZmlnOiBUcmVlQ29uZmlnKTogdm9pZCB7XG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBhZHZhbmNlZCBmZWF0dXJlcyAod2lsbCBsb2cgd2FybmluZ3MpXG4gIHRyZWUuYmF0Y2hVcGRhdGUgPSAodXBkYXRlcjogKGN1cnJlbnQ6IFQpID0+IFBhcnRpYWw8VD4pID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGJhdGNoVXBkYXRlKCkgY2FsbGVkIGJ1dCBiYXRjaGluZyBpcyBub3QgZW5hYmxlZC4nLFxuICAgICAgJ1RvIGVuYWJsZSBiYXRjaCB1cGRhdGVzLCBpbnN0YWxsIEBzaWduYWx0cmVlL2JhdGNoaW5nJ1xuICAgICk7XG4gICAgLy8gRmFsbGJhY2s6IEp1c3QgY2FsbCB1cGRhdGUgZGlyZWN0bHlcbiAgICB0cmVlLnVwZGF0ZSh1cGRhdGVyKTtcbiAgfTtcblxuICB0cmVlLm1lbW9pemUgPSA8Uj4oZm46ICh0cmVlOiBUKSA9PiBSLCBjYWNoZUtleT86IHN0cmluZyk6IFNpZ25hbDxSPiA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBtZW1vaXplKCkgY2FsbGVkIGJ1dCBtZW1vaXphdGlvbiBpcyBub3QgZW5hYmxlZC4nLFxuICAgICAgJ1RvIGVuYWJsZSBtZW1vaXplZCBjb21wdXRhdGlvbnMsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWVtb2l6YXRpb24nXG4gICAgKTtcbiAgICB2b2lkIGNhY2hlS2V5OyAvLyBNYXJrIGFzIGludGVudGlvbmFsbHkgdW51c2VkXG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IGZuKHRyZWUudW53cmFwKCkpKTtcbiAgfTtcblxuICB0cmVlLmVmZmVjdCA9IChmbjogKHRyZWU6IFQpID0+IHZvaWQpID0+IHtcbiAgICB0cnkge1xuICAgICAgZWZmZWN0KCgpID0+IGZuKHRyZWUudW53cmFwKCkpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFsbGJhY2sgZm9yIHRlc3QgZW52aXJvbm1lbnRzIHdpdGhvdXQgaW5qZWN0aW9uIGNvbnRleHRcbiAgICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRWZmZWN0IHJlcXVpcmVzIEFuZ3VsYXIgaW5qZWN0aW9uIGNvbnRleHQnLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHRyZWUuc3Vic2NyaWJlID0gKGZuOiAodHJlZTogVCkgPT4gdm9pZCk6ICgoKSA9PiB2b2lkKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgICBsZXQgaXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgZWZmZWN0UmVmID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFpc0Rlc3Ryb3llZCkge1xuICAgICAgICAgIGZuKHRyZWUudW53cmFwKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgZWZmZWN0UmVmLmRlc3Ryb3koKTtcbiAgICAgIH07XG5cbiAgICAgIGRlc3Ryb3lSZWYub25EZXN0cm95KHVuc3Vic2NyaWJlKTtcbiAgICAgIHJldHVybiB1bnN1YnNjcmliZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFsbGJhY2sgZm9yIHRlc3QgZW52aXJvbm1lbnRcbiAgICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU3Vic2NyaWJlIHJlcXVpcmVzIEFuZ3VsYXIgaW5qZWN0aW9uIGNvbnRleHQnLCBlcnJvcik7XG4gICAgICB9XG4gICAgICBmbih0cmVlLnVud3JhcCgpKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIC8vIE5vLW9wIHVuc3Vic2NyaWJlXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxuICAvLyBQZXJmb3JtYW5jZSBzdHVic1xuICB0cmVlLm9wdGltaXplID0gKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICfimqDvuI8gb3B0aW1pemUoKSBjYWxsZWQgYnV0IHRyZWUgb3B0aW1pemF0aW9uIGlzIG5vdCBhdmFpbGFibGUuJ1xuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgdHJlZS5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyBjbGVhckNhY2hlKCkgY2FsbGVkIGJ1dCBjYWNoaW5nIGlzIG5vdCBhdmFpbGFibGUuJyk7XG4gICAgfVxuICB9O1xuXG4gIHRyZWUuaW52YWxpZGF0ZVBhdHRlcm4gPSAoKTogbnVtYmVyID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAn4pqg77iPIGludmFsaWRhdGVQYXR0ZXJuKCkgY2FsbGVkIGJ1dCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaXMgbm90IGVuYWJsZWQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH07XG5cbiAgdHJlZS5nZXRNZXRyaWNzID0gKCk6IFBlcmZvcm1hbmNlTWV0cmljcyA9PiB7XG4gICAgLy8gUmV0dXJuIGFjdHVhbCBtZXRyaWNzIGlmIHdlJ3JlIHRyYWNraW5nIHRoZW1cbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlczogMCxcbiAgICAgIGNvbXB1dGF0aW9uczogMCxcbiAgICAgIGNhY2hlSGl0czogMCxcbiAgICAgIGNhY2hlTWlzc2VzOiAwLFxuICAgICAgYXZlcmFnZVVwZGF0ZVRpbWU6IDAsXG4gICAgfTtcbiAgfTtcblxuICAvLyBNaWRkbGV3YXJlIHN0dWJzXG4gIHRyZWUuYWRkVGFwID0gKG1pZGRsZXdhcmU6IE1pZGRsZXdhcmU8VD4pID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAn4pqg77iPIGFkZFRhcCgpIGNhbGxlZCBidXQgbWlkZGxld2FyZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdm9pZCBtaWRkbGV3YXJlO1xuICB9O1xuXG4gIHRyZWUucmVtb3ZlVGFwID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAn4pqg77iPIHJlbW92ZVRhcCgpIGNhbGxlZCBidXQgbWlkZGxld2FyZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdm9pZCBpZDtcbiAgfTtcblxuICAvLyBFbnRpdHkgaGVscGVycyBzdHViXG4gIHRyZWUuYXNDcnVkID0gPEUgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfCBudW1iZXIgfT4oKTogRW50aXR5SGVscGVyczxFPiA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybign4pqg77iPIGFzQ3J1ZCgpIGNhbGxlZCBidXQgZW50aXR5IGhlbHBlcnMgYXJlIG5vdCBhdmFpbGFibGUuJyk7XG4gICAgfVxuICAgIHJldHVybiB7fSBhcyBFbnRpdHlIZWxwZXJzPEU+O1xuICB9O1xuXG4gIC8vIEFzeW5jIGFjdGlvbiBzdHViXG4gIHRyZWUuYXN5bmNBY3Rpb24gPSA8VElucHV0LCBUUmVzdWx0PihcbiAgICBvcGVyYXRpb246IChpbnB1dDogVElucHV0KSA9PiBQcm9taXNlPFRSZXN1bHQ+LFxuICAgIGFzeW5jQ29uZmlnOiBBc3luY0FjdGlvbkNvbmZpZzxULCBUUmVzdWx0PiA9IHt9XG4gICk6IEFzeW5jQWN0aW9uPFRJbnB1dCwgVFJlc3VsdD4gPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICfimqDvuI8gYXN5bmNBY3Rpb24oKSBjYWxsZWQgYnV0IGFzeW5jIGFjdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdm9pZCBvcGVyYXRpb247XG4gICAgdm9pZCBhc3luY0NvbmZpZztcbiAgICByZXR1cm4ge30gYXMgQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PjtcbiAgfTtcblxuICAvLyBUaW1lIHRyYXZlbCBzdHVic1xuICB0cmVlLnVuZG8gPSAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybign4pqg77iPIHVuZG8oKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyk7XG4gICAgfVxuICB9O1xuXG4gIHRyZWUucmVkbyA9ICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gcmVkbygpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nKTtcbiAgICB9XG4gIH07XG5cbiAgdHJlZS5nZXRIaXN0b3J5ID0gKCk6IFRpbWVUcmF2ZWxFbnRyeTxUPltdID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gZ2V0SGlzdG9yeSgpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9O1xuXG4gIHRyZWUucmVzZXRIaXN0b3J5ID0gKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICfimqDvuI8gcmVzZXRIaXN0b3J5KCkgY2FsbGVkIGJ1dCB0aW1lIHRyYXZlbCBpcyBub3QgYXZhaWxhYmxlLidcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUFVCTElDIEFQSVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhY3RpdmUgc2lnbmFsIHRyZWUgd2l0aCBzbWFydCBwcm9ncmVzc2l2ZSBlbmhhbmNlbWVudC5cbiAqXG4gKiBBdXRvbWF0aWNhbGx5IGNvbnZlcnRzIHBsYWluIG9iamVjdHMgaW50byBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdoZXJlIGVhY2ggcHJvcGVydHlcbiAqIGJlY29tZXMgYSB3cml0YWJsZSBzaWduYWwuIFByb3ZpZGVzIGludGVsbGlnZW50IHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMsIGF1dG9tYXRpY1xuICogY2hhbmdlIGRldGVjdGlvbiwgYW5kIHNlYW1sZXNzIGludGVncmF0aW9uIHdpdGggQW5ndWxhcidzIHNpZ25hbCBzeXN0ZW0uXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgKG5vIGNvbnN0cmFpbnRzIGZvciBtYXhpbXVtIGZsZXhpYmlsaXR5KVxuICogQHBhcmFtIG9iaiAtIFRoZSBpbml0aWFsIHN0YXRlIG9iamVjdCB0byBjb252ZXJ0IGludG8gYSByZWFjdGl2ZSB0cmVlXG4gKiBAcmV0dXJucyBBIFNpZ25hbFRyZWUgd2l0aCBhdXRvLWVuYWJsaW5nIGZlYXR1cmVzIGFuZCByZWFjdGl2ZSBwcm9wZXJ0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEJhc2ljIHVzYWdlIC0gc2ltcGxlIHN0YXRlIG1hbmFnZW1lbnRcbiAqIGNvbnN0IHN0YXRlID0gc2lnbmFsVHJlZSh7IGNvdW50OiAwLCB1c2VyOiB7IG5hbWU6ICdKb2huJyB9IH0pO1xuICpcbiAqIC8vIEFjY2VzcyByZWFjdGl2ZSBwcm9wZXJ0aWVzXG4gKiBjb25zb2xlLmxvZyhzdGF0ZS5jb3VudCgpKTsgLy8gMFxuICogY29uc29sZS5sb2coc3RhdGUudXNlci5uYW1lKCkpOyAvLyAnSm9obidcbiAqXG4gKiAvLyBVcGRhdGUgc3RhdGVcbiAqIHN0YXRlLmNvdW50LnNldCgxKTtcbiAqIHN0YXRlLnVzZXIubmFtZS5zZXQoJ0phbmUnKTtcbiAqXG4gKiAvLyBCYXRjaCB1cGRhdGVzXG4gKiBzdGF0ZS51cGRhdGUoY3VycmVudCA9PiAoe1xuICogICBjb3VudDogY3VycmVudC5jb3VudCArIDEsXG4gKiAgIHVzZXI6IHsgLi4uY3VycmVudC51c2VyLCBuYW1lOiAnQm9iJyB9XG4gKiB9KSk7XG4gKlxuICogLy8gU3Vic2NyaWJlIHRvIGNoYW5nZXNcbiAqIHN0YXRlLnN1YnNjcmliZShuZXdTdGF0ZSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKCdTdGF0ZSBjaGFuZ2VkOicsIG5ld1N0YXRlKTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEFkdmFuY2VkIHVzYWdlIHdpdGggZWZmZWN0cyBhbmQgY29tcHV0ZWQgdmFsdWVzXG4gKiBpbnRlcmZhY2UgQXBwU3RhdGUge1xuICogICB0b2RvczogVG9kb1tdO1xuICogICBmaWx0ZXI6ICdhbGwnIHwgJ2FjdGl2ZScgfCAnY29tcGxldGVkJztcbiAqIH1cbiAqXG4gKiBjb25zdCBzdG9yZSA9IHNpZ25hbFRyZWU8QXBwU3RhdGU+KHtcbiAqICAgdG9kb3M6IFtdLFxuICogICBmaWx0ZXI6ICdhbGwnXG4gKiB9KTtcbiAqXG4gKiAvLyBDcmVhdGUgY29tcHV0ZWQgdmFsdWVzXG4gKiBjb25zdCBmaWx0ZXJlZFRvZG9zID0gY29tcHV0ZWQoKCkgPT4ge1xuICogICBjb25zdCB0b2RvcyA9IHN0b3JlLnRvZG9zKCk7XG4gKiAgIGNvbnN0IGZpbHRlciA9IHN0b3JlLmZpbHRlcigpO1xuICogICByZXR1cm4gdG9kb3MuZmlsdGVyKHRvZG8gPT5cbiAqICAgICBmaWx0ZXIgPT09ICdhbGwnIHx8XG4gKiAgICAgKGZpbHRlciA9PT0gJ2FjdGl2ZScgJiYgIXRvZG8uY29tcGxldGVkKSB8fFxuICogICAgIChmaWx0ZXIgPT09ICdjb21wbGV0ZWQnICYmIHRvZG8uY29tcGxldGVkKVxuICogICApO1xuICogfSk7XG4gKlxuICogLy8gUmVhY3QgdG8gc3RhdGUgY2hhbmdlc1xuICogc3RvcmUuZWZmZWN0KHN0YXRlID0+IHtcbiAqICAgY29uc29sZS5sb2coYCR7c3RhdGUudG9kb3MubGVuZ3RofSB0b2Rvcywgc2hvd2luZyAke3N0YXRlLmZpbHRlcn1gKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQ+KG9iajogVCk6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggcHJlc2V0IGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVXNlcyBwcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb25zIG9wdGltaXplZCBmb3IgY29tbW9uIHVzZSBjYXNlcy5cbiAqIEF2YWlsYWJsZSBwcmVzZXRzOiAnYmFzaWMnLCAncGVyZm9ybWFuY2UnLCAnZGV2ZWxvcG1lbnQnLCAncHJvZHVjdGlvbicuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHBhcmFtIHByZXNldCAtIFByZWRlZmluZWQgY29uZmlndXJhdGlvbiBwcmVzZXRcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSBjb25maWd1cmVkIHdpdGggdGhlIHNwZWNpZmllZCBwcmVzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRGV2ZWxvcG1lbnQgcHJlc2V0IC0gZW5oYW5jZWQgZGVidWdnaW5nXG4gKiBjb25zdCBkZXZTdG9yZSA9IHNpZ25hbFRyZWUoeyBjb3VudDogMCB9LCAnZGV2ZWxvcG1lbnQnKTtcbiAqIC8vIEVuYWJsZXM6IGRlYnVnTW9kZSwgZW5hYmxlRGV2VG9vbHMsIHRyYWNrUGVyZm9ybWFuY2VcbiAqXG4gKiAvLyBQcm9kdWN0aW9uIHByZXNldCAtIG9wdGltaXplZCBwZXJmb3JtYW5jZVxuICogY29uc3QgcHJvZFN0b3JlID0gc2lnbmFsVHJlZSh7IGNvdW50OiAwIH0sICdwcm9kdWN0aW9uJyk7XG4gKiAvLyBFbmFibGVzOiB1c2VMYXp5U2lnbmFscywgYmF0Y2hVcGRhdGVzLCB1c2VNZW1vaXphdGlvblxuICpcbiAqIC8vIFBlcmZvcm1hbmNlIHByZXNldCAtIG1heGltdW0gb3B0aW1pemF0aW9uXG4gKiBjb25zdCBwZXJmU3RvcmUgPSBzaWduYWxUcmVlKHsgdXNlcnM6IFtdIH0sICdwZXJmb3JtYW5jZScpO1xuICogLy8gRW5hYmxlczogdXNlTGF6eVNpZ25hbHMsIGJhdGNoVXBkYXRlcywgdXNlTWVtb2l6YXRpb24sIHVzZVNoYWxsb3dDb21wYXJpc29uXG4gKlxuICogLy8gQmFzaWMgcHJlc2V0IC0gbWluaW1hbCBmZWF0dXJlc1xuICogY29uc3QgYmFzaWNTdG9yZSA9IHNpZ25hbFRyZWUoeyBkYXRhOiB7fSB9LCAnYmFzaWMnKTtcbiAqIC8vIE1pbmltYWwgb3ZlcmhlYWQsIG5vIG9wdGltaXphdGlvbnNcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUPihvYmo6IFQsIHByZXNldDogVHJlZVByZXNldCk6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggY3VzdG9tIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogUHJvdmlkZXMgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciBTaWduYWxUcmVlIGJlaGF2aW9yIGFuZCBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MuXG4gKiBVc2UgdGhpcyBvdmVybG9hZCB3aGVuIHlvdSBuZWVkIHNwZWNpZmljIG9wdGltaXphdGlvbiBzZXR0aW5ncyBvciBkZWJ1Z2dpbmcgZmVhdHVyZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHBhcmFtIGNvbmZpZyAtIEN1c3RvbSBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHJldHVybnMgQSBTaWduYWxUcmVlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3VzdG9tIGNvbmZpZ3VyYXRpb24gZm9yIHNwZWNpZmljIG5lZWRzXG4gKiBjb25zdCBzdG9yZSA9IHNpZ25hbFRyZWUoe1xuICogICB1c2VyczogW10sXG4gKiAgIHNldHRpbmdzOiB7IHRoZW1lOiAnZGFyaycgfVxuICogfSwge1xuICogICB1c2VMYXp5U2lnbmFsczogdHJ1ZSwgICAgICAvLyBDcmVhdGUgc2lnbmFscyBvbi1kZW1hbmRcbiAqICAgYmF0Y2hVcGRhdGVzOiB0cnVlLCAgICAgICAgLy8gR3JvdXAgcmFwaWQgdXBkYXRlc1xuICogICB1c2VNZW1vaXphdGlvbjogdHJ1ZSwgICAgICAvLyBDYWNoZSBjb21wdXRlZCB2YWx1ZXNcbiAqICAgZGVidWdNb2RlOiBmYWxzZSwgICAgICAgICAgLy8gUHJvZHVjdGlvbiBtb2RlXG4gKiAgIGVuYWJsZURldlRvb2xzOiBmYWxzZSwgICAgIC8vIE5vIGRldiB0b29sc1xuICogICB0cmFja1BlcmZvcm1hbmNlOiB0cnVlLCAgICAvLyBNb25pdG9yIHBlcmZvcm1hbmNlXG4gKiAgIHVzZVNoYWxsb3dDb21wYXJpc29uOiBmYWxzZSAvLyBEZWVwIGVxdWFsaXR5IGNoZWNraW5nXG4gKiB9KTtcbiAqXG4gKiAvLyBBY2Nlc3MgcGVyZm9ybWFuY2UgbWV0cmljc1xuICogY29uc3QgbWV0cmljcyA9IHN0b3JlLmdldE1ldHJpY3MoKTtcbiAqIGNvbnNvbGUubG9nKGBVcGRhdGVzOiAke21ldHJpY3MudXBkYXRlQ291bnR9LCBUaW1lOiAke21ldHJpY3MudG90YWxUaW1lfW1zYCk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ29uZmlndXJhdGlvbiBmb3IgbGFyZ2UgZGF0YXNldHNcbiAqIGNvbnN0IGJpZ0RhdGFTdG9yZSA9IHNpZ25hbFRyZWUobGFyZ2VEYXRhc2V0LCB7XG4gKiAgIHVzZUxhenlTaWduYWxzOiB0cnVlLCAgICAgICAgLy8gRXNzZW50aWFsIGZvciBsYXJnZSBvYmplY3RzXG4gKiAgIHVzZVNoYWxsb3dDb21wYXJpc29uOiB0cnVlLCAgLy8gRmFzdGVyIGNvbXBhcmlzb25zXG4gKiAgIGJhdGNoVXBkYXRlczogdHJ1ZSwgICAgICAgICAgLy8gUHJldmVudCBVSSB0aHJhc2hpbmdcbiAqICAgdXNlTWVtb2l6YXRpb246IHRydWUsICAgICAgICAvLyBDYWNoZSBleHBlbnNpdmUgY29tcHV0YXRpb25zXG4gKiAgIGRlYnVnTW9kZTogZmFsc2UgICAgICAgICAgICAgLy8gTm8gZGVidWcgb3ZlcmhlYWRcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQ+KG9iajogVCwgY29uZmlnOiBUcmVlQ29uZmlnKTogU2lnbmFsVHJlZTxUPjtcblxuLyoqXG4gKiBNYWluIFNpZ25hbFRyZWUgZmFjdG9yeSBmdW5jdGlvbiB3aXRoIHN1cGVyaW9yIHR5cGUgaW5mZXJlbmNlLlxuICpcbiAqIFRoaXMgb3ZlcmxvYWQgcHJvdmlkZXMgZW5oYW5jZWQgVHlwZVNjcmlwdCBpbmZlcmVuY2UgZm9yIG9iamVjdCB0eXBlcyxcbiAqIGVuc3VyaW5nIGFsbCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseSB0eXBlZCBhbmQgcmVhY3RpdmUuIElkZWFsIGZvclxuICogc3Ryb25nbHktdHlwZWQgYXBwbGljYXRpb25zIHdoZXJlIHR5cGUgc2FmZXR5IGlzIHBhcmFtb3VudC5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIE9iamVjdCB0eXBlIGV4dGVuZGluZyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiBmb3IgYmV0dGVyIGluZmVyZW5jZVxuICogQHBhcmFtIG9iaiAtIFJlcXVpcmVkIHN0YXRlIG9iamVjdCB3aXRoIGFsbCBwcm9wZXJ0aWVzIGRlZmluZWRcbiAqIEBwYXJhbSBjb25maWdPclByZXNldCAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0IG9yIHByZXNldCBzdHJpbmdcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSB3aXRoIGVuaGFuY2VkIHR5cGUgc2FmZXR5IGFuZCBpbmZlcmVuY2VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRW5oYW5jZWQgdHlwZSBpbmZlcmVuY2VcbiAqIGNvbnN0IHR5cGVkU3RvcmUgPSBzaWduYWxUcmVlKHtcbiAqICAgdXNlcjogeyBpZDogMSwgbmFtZTogJ0pvaG4nLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0sXG4gKiAgIHNldHRpbmdzOiB7IHRoZW1lOiAnZGFyaycsIG5vdGlmaWNhdGlvbnM6IHRydWUgfSxcbiAqICAgZGF0YTogeyBpdGVtczogW10sIGxvYWRpbmc6IGZhbHNlLCBlcnJvcjogbnVsbCB9XG4gKiB9IGFzIGNvbnN0KTtcbiAqXG4gKiAvLyBUeXBlU2NyaXB0IGtub3dzIGV4YWN0IHR5cGVzXG4gKiB0eXBlZFN0b3JlLnVzZXIuaWQuc2V0KDIpOyAgICAgICAgICAgLy8gbnVtYmVyXG4gKiB0eXBlZFN0b3JlLnNldHRpbmdzLnRoZW1lLnNldCgnbGlnaHQnKTsgLy8gJ2RhcmsnIHwgJ2xpZ2h0J1xuICogdHlwZWRTdG9yZS5kYXRhLmxvYWRpbmcuc2V0KHRydWUpOyAgIC8vIGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvYmo6IFJlcXVpcmVkPFQ+LFxuICBjb25maWdPclByZXNldD86IFRyZWVDb25maWcgfCBUcmVlUHJlc2V0XG4pOiBTaWduYWxUcmVlPFJlcXVpcmVkPFQ+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VD4oXG4gIG9iajogVCxcbiAgY29uZmlnT3JQcmVzZXQ/OiBUcmVlQ29uZmlnIHwgVHJlZVByZXNldFxuKTogU2lnbmFsVHJlZTxUPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VD4oXG4gIG9iajogVCxcbiAgY29uZmlnT3JQcmVzZXQ/OiBUcmVlQ29uZmlnIHwgVHJlZVByZXNldFxuKTogU2lnbmFsVHJlZTxUPiB7XG4gIC8vIEhhbmRsZSBwcmVzZXQgc3RyaW5nc1xuICBpZiAodHlwZW9mIGNvbmZpZ09yUHJlc2V0ID09PSAnc3RyaW5nJykge1xuICAgIC8vIE1hcCBwcmVzZXQgdG8gY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHByZXNldENvbmZpZ3M6IFJlY29yZDxUcmVlUHJlc2V0LCBQYXJ0aWFsPFRyZWVDb25maWc+PiA9IHtcbiAgICAgIGJhc2ljOiB7XG4gICAgICAgIHVzZUxhenlTaWduYWxzOiBmYWxzZSxcbiAgICAgICAgZGVidWdNb2RlOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBwZXJmb3JtYW5jZToge1xuICAgICAgICB1c2VMYXp5U2lnbmFsczogdHJ1ZSxcbiAgICAgICAgYmF0Y2hVcGRhdGVzOiB0cnVlLFxuICAgICAgICB1c2VNZW1vaXphdGlvbjogdHJ1ZSxcbiAgICAgICAgdXNlU2hhbGxvd0NvbXBhcmlzb246IHRydWUsXG4gICAgICB9LFxuICAgICAgZGV2ZWxvcG1lbnQ6IHtcbiAgICAgICAgdXNlTGF6eVNpZ25hbHM6IGZhbHNlLCAvLyBFYWdlciBmb3IgYmV0dGVyIGRlYnVnZ2luZ1xuICAgICAgICBkZWJ1Z01vZGU6IHRydWUsXG4gICAgICAgIGVuYWJsZURldlRvb2xzOiB0cnVlLFxuICAgICAgICB0cmFja1BlcmZvcm1hbmNlOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHByb2R1Y3Rpb246IHtcbiAgICAgICAgdXNlTGF6eVNpZ25hbHM6IHRydWUsXG4gICAgICAgIGJhdGNoVXBkYXRlczogdHJ1ZSxcbiAgICAgICAgdXNlTWVtb2l6YXRpb246IHRydWUsXG4gICAgICAgIGRlYnVnTW9kZTogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBjb25maWcgPSBwcmVzZXRDb25maWdzW2NvbmZpZ09yUHJlc2V0XTtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgVW5rbm93biBwcmVzZXQ6ICR7Y29uZmlnT3JQcmVzZXR9LCB1c2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGNyZWF0ZShvYmosIHt9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZShvYmosIGNvbmZpZyk7XG4gIH1cblxuICAvLyBIYW5kbGUgY29uZmlndXJhdGlvbiBvYmplY3RzIG9yIGRlZmF1bHRcbiAgY29uc3QgY29uZmlnID0gY29uZmlnT3JQcmVzZXQgfHwge307XG4gIHJldHVybiBjcmVhdGUob2JqLCBjb25maWcpO1xufVxuIl19"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signaltree/core",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "description": "Lightweight, type-safe signal-based state management for Angular. Core package providing hierarchical signal trees, basic entity management, and async actions.",
5
5
  "peerDependencies": {
6
6
  "@angular/core": "^20.1.0"