@nlabs/arkhamjs 3.30.0 → 3.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,88 +10,28 @@ export declare class FluxFramework extends EventEmitter {
10
10
  private middleware;
11
11
  private options;
12
12
  private stateCache;
13
- private updateStorage;
14
13
  private stateChanged;
15
14
  constructor();
16
- /**
17
- * Add middleware to framework with duplicate prevention
18
- */
19
15
  addMiddleware(middleware: FluxMiddlewareType[]): void;
20
- /**
21
- * Remove all app data from storage with optimized state reset
22
- */
23
16
  clearAppData(): Promise<boolean>;
24
- /**
25
- * Remove all middleware with proper cleanup
26
- */
27
17
  clearMiddleware(): boolean;
28
- /**
29
- * De-registers named stores with cleanup
30
- */
31
18
  removeStores(storeNames: string[]): void;
32
- /**
33
- * Optimized dispatch method with reduced cloning and better performance
34
- */
35
19
  dispatch(action: FluxAction, silent?: boolean): Promise<FluxAction>;
36
- /**
37
- * Get the current Flux options
38
- */
39
20
  getOptions(): FluxOptions;
40
- /**
41
- * Optimized getState with caching
42
- */
43
21
  getState(path?: string | string[], defaultValue?: unknown): unknown;
44
- /**
45
- * Get a store object registered with Flux
46
- */
47
22
  getStore(name?: string): FluxStore | undefined;
48
- /**
49
- * Initialize and set configuration options with validation
50
- */
51
23
  init(options?: FluxOptions, reset?: boolean): Promise<FluxFramework>;
52
- /**
53
- * Adds an initialization listener with immediate execution if already initialized
54
- */
55
24
  onInit(listener: (...args: any[]) => void): void;
56
- /**
57
- * Removes the initialization listener
58
- */
59
25
  offInit(listener: (...args: any[]) => void): void;
60
- /**
61
- * Removes an event listener
62
- */
63
26
  off(eventType: string, listener: (...args: any[]) => void): this;
64
- /**
65
- * Adds an event listener
66
- */
67
27
  on(eventType: string, listener: (...args: any[]) => void): this;
68
- /**
69
- * Registers new Stores with validation
70
- */
71
28
  addStores(stores: FluxStore[]): Promise<FluxStore[]>;
72
- /**
73
- * Remove middleware from framework
74
- */
75
29
  removeMiddleware(names: string[]): void;
76
- /**
77
- * Reset framework with proper cleanup
78
- */
79
30
  reset(clearStorage?: boolean): Promise<void>;
80
- /**
81
- * Optimized setState with change tracking
82
- */
83
31
  setState(path: string | string[] | undefined, value: unknown): Promise<boolean>;
84
- /**
85
- * Process middleware with optimized cloning
86
- */
87
32
  private processMiddleware;
88
- /**
89
- * Update stores state with optimized cloning
90
- */
33
+ private updateStorage;
91
34
  private updateStoresState;
92
- /**
93
- * Get cached stack trace for performance
94
- */
95
35
  private getCachedStack;
96
36
  private addPlugin;
97
37
  private deregister;
package/lib/Flux/Flux.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /* ArkhamJS - Optimized Build */
2
- var y=Object.defineProperty;var S=(c,h,t)=>h in c?y(c,h,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[h]=t;var a=(c,h,t)=>S(c,typeof h!="symbol"?h+"":h,t);import{isEmpty as x}from"@nlabs/utils/checks/isEmpty";import{cloneDeep as l}from"@nlabs/utils/objects/clone";import{debounceCompact as v}from"@nlabs/utils/objects/debounce-compact";import{get as k}from"@nlabs/utils/objects/get";import{merge as F}from"@nlabs/utils/objects/merge";import{set as A}from"@nlabs/utils/objects/set";import{parseStack as b}from"@nlabs/utils/objects/stack-parser";import{EventEmitter as T}from"events";import{ArkhamConstants as g}from"../constants/ArkhamConstants";const u=new Map,E=100;class m extends T{constructor(){super();a(this,"isInit",!1);a(this,"pluginTypes",["preDispatch","postDispatch"]);a(this,"state",{});a(this,"storeActions",{});a(this,"defaultOptions",{name:"arkhamjs",routerType:"browser",scrollToTop:!0,storageWait:300,stores:[],title:"ArkhamJS"});a(this,"middleware",{});a(this,"options",this.defaultOptions);a(this,"stateCache",new Map);a(this,"updateStorage",()=>Promise.resolve(!1));a(this,"stateChanged",!1);this.addMiddleware=this.addMiddleware.bind(this),this.addStores=this.addStores.bind(this),this.clearAppData=this.clearAppData.bind(this),this.clearMiddleware=this.clearMiddleware.bind(this),this.deregister=this.deregister.bind(this),this.dispatch=this.dispatch.bind(this),this.getOptions=this.getOptions.bind(this),this.getState=this.getState.bind(this),this.getStore=this.getStore.bind(this),this.init=this.init.bind(this),this.off=this.off.bind(this),this.register=this.register.bind(this),this.removeMiddleware=this.removeMiddleware.bind(this),this.removeStores=this.removeStores.bind(this),this.reset=this.reset.bind(this),this.setState=this.setState.bind(this),this.pluginTypes.forEach(t=>this.middleware[`${t}List`]=[])}addMiddleware(t){t.forEach(e=>{if(!e||typeof e!="function"&&typeof e!="object")throw Error("Unknown middleware is not configured properly. Cannot add to Flux.");const s=e.name||"";if(!s)throw Error("Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.");this.middleware.preDispatchList?.find(r=>r.name===s)||this.middleware.postDispatchList?.find(r=>r.name===s)||this.pluginTypes.forEach(r=>{const o=e[r];if(o&&typeof o=="function"){const n={method:o,name:s};this.middleware[`${r}List`]=this.addPlugin(r,n)}})})}clearAppData(){Object.keys(this.storeActions).forEach(s=>{const i=this.storeActions[s];i&&(this.state[i.name]=i.initialState)}),this.stateCache.clear(),this.stateChanged=!0;const{name:t,storage:e}=this.options;return e?.setStorageData?e.setStorageData(t??"arkhamjs",this.state):Promise.resolve(!0)}clearMiddleware(){return Object.keys(this.middleware).forEach(t=>{this.middleware[t]=[]}),!0}removeStores(t){t.forEach(e=>this.deregister(e))}async dispatch(t,e=!1){if(!t)throw new Error("ArkhamJS Error: Flux.dispatch requires an action.");const s=Date.now();let i=l(t),r=[];this.options.debug&&(r=this.getCachedStack());const o={duration:0,options:this.options,stack:r},{postDispatchList:n=[],preDispatchList:p=[]}=this.middleware;p.length&&(i=await this.processMiddleware(p,i,o));const{type:d,...f}=i;if(!d||d==="")return Promise.resolve(i);if(this.updateStoresState(d,f),this.stateChanged&&this.options.storage&&this.updateStorage)try{await this.updateStorage(),this.stateChanged=!1}catch{}const w=Date.now()-s;return o.duration=w,n.length&&(i=await this.processMiddleware(n,i,o)),e||(this.emit(d,i),this.emit("arkhamjs",this.state)),Promise.resolve(i)}getOptions(){return this.options}getState(t="",e){const s=Array.isArray(t)?t.join("."):t;if(this.stateCache.has(s))return this.stateCache.get(s);let i;t?i=k(this.state,t):i=this.state||{};const r=i&&l(i),o=r===void 0?e:r;return this.stateCache.set(s,o),o}getStore(t=""){return this.storeActions[t]}async init(t={},e=!1){e&&(this.isInit=!1,await this.reset(!1));const s={...t};this.isInit&&this.options.name&&(s.name=this.options.name),this.options={...this.defaultOptions,...s};const{debug:i,middleware:r,name:o,stores:n}=this.options;try{await this.useStorage(o??"arkhamjs")}catch(d){throw d}if(n?.length)try{await this.addStores(n)}catch(d){throw d}r?.length&&this.addMiddleware(r);const p="arkhamjs";return i?window[p]=this:delete window[p],this.isInit=!0,this.emit(g.INIT),this}onInit(t){this.on(g.INIT,t),this.isInit&&t()}offInit(t){this.off(g.INIT,t)}off(t,e){return this.removeListener(t,e)}on(t,e){return this.addListener(t,e)}async addStores(t){const e=t.map(r=>this.register(r)),{name:s,storage:i}=this.options;if(i?.setStorageData)try{await i.setStorageData(s??"arkhamjs",this.state)}catch(r){throw r}return e}removeMiddleware(t){t.forEach(e=>{this.pluginTypes.forEach(s=>{this.middleware[`${s}List`]=this.removePlugin(s,e)})})}async reset(t=!0){const{name:e,storage:s}=this.options;if(s&&t)try{await s.setStorageData?.(e??"arkhamjs",{})}catch(i){throw i}this.middleware={},this.options={...this.defaultOptions},this.state={},this.storeActions={},this.stateCache.clear(),this.stateChanged=!1,this.isInit=!1,this.pluginTypes.forEach(i=>this.middleware[`${i}List`]=[])}setState(t="",e){if(t){this.state=A(this.state,t,l(e)),this.stateChanged=!0;const s=Array.isArray(t)?t.join("."):t;this.stateCache.delete(s)}return this.options.storage&&this.updateStorage?this.updateStorage():Promise.resolve(!1)}async processMiddleware(t,e,s){return Promise.all(t.map(i=>i.method(l(e),l(this.state),s))).then(i=>i.reduce((r,o)=>F(r,o),e)).catch(i=>{throw i})}updateStoresState(t,e){Object.keys(this.storeActions).forEach(s=>{const i=this.storeActions[s];if(i){const r=this.state[s]||i.initialState||{},o=i.action(t,e,r);o!==r&&(this.state[s]=l(o)||r,this.stateChanged=!0)}})}getCachedStack(){const t=new Error().stack?.split(`
2
+ var y=Object.defineProperty;var S=(c,h,t)=>h in c?y(c,h,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[h]=t;var a=(c,h,t)=>S(c,typeof h!="symbol"?h+"":h,t);import{isEmpty as x}from"@nlabs/utils/lib/checks/isEmpty/isEmpty.js";import{cloneDeep as l}from"@nlabs/utils/lib/objects/clone/clone.js";import{debounceCompact as v}from"@nlabs/utils/lib/objects/debounce-compact/debounce-compact.js";import{get as k}from"@nlabs/utils/lib/objects/get/get.js";import{merge as F}from"@nlabs/utils/lib/objects/merge/merge.js";import{set as A}from"@nlabs/utils/lib/objects/set/set.js";import{parseStack as b}from"@nlabs/utils/lib/objects/stack-parser/stack-parser.js";import{EventEmitter as T}from"events";import{ArkhamConstants as g}from"../constants/ArkhamConstants";const u=new Map,E=100;class m extends T{constructor(){super();a(this,"isInit",!1);a(this,"pluginTypes",["preDispatch","postDispatch"]);a(this,"state",{});a(this,"storeActions",{});a(this,"defaultOptions",{name:"arkhamjs",routerType:"browser",scrollToTop:!0,storageWait:300,stores:[],title:"ArkhamJS"});a(this,"middleware",{});a(this,"options",this.defaultOptions);a(this,"stateCache",new Map);a(this,"stateChanged",!1);a(this,"updateStorage",()=>Promise.resolve(!1));this.addMiddleware=this.addMiddleware.bind(this),this.addStores=this.addStores.bind(this),this.clearAppData=this.clearAppData.bind(this),this.clearMiddleware=this.clearMiddleware.bind(this),this.deregister=this.deregister.bind(this),this.dispatch=this.dispatch.bind(this),this.getOptions=this.getOptions.bind(this),this.getState=this.getState.bind(this),this.getStore=this.getStore.bind(this),this.init=this.init.bind(this),this.off=this.off.bind(this),this.register=this.register.bind(this),this.removeMiddleware=this.removeMiddleware.bind(this),this.removeStores=this.removeStores.bind(this),this.reset=this.reset.bind(this),this.setState=this.setState.bind(this),this.pluginTypes.forEach(t=>this.middleware[`${t}List`]=[])}addMiddleware(t){t.forEach(e=>{if(!e||typeof e!="function"&&typeof e!="object")throw Error("Unknown middleware is not configured properly. Cannot add to Flux.");const s=e.name||"";if(!s)throw Error("Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.");this.middleware.preDispatchList?.find(r=>r.name===s)||this.middleware.postDispatchList?.find(r=>r.name===s)||this.pluginTypes.forEach(r=>{const o=e[r];if(o&&typeof o=="function"){const n={method:o,name:s};this.middleware[`${r}List`]=this.addPlugin(r,n)}})})}clearAppData(){Object.keys(this.storeActions).forEach(s=>{const i=this.storeActions[s];i&&(this.state[i.name]=i.initialState)}),this.stateCache.clear(),this.stateChanged=!0;const{name:t,storage:e}=this.options;return e?.setStorageData?e.setStorageData(t??"arkhamjs",this.state):Promise.resolve(!0)}clearMiddleware(){return Object.keys(this.middleware).forEach(t=>{this.middleware[t]=[]}),!0}removeStores(t){t.forEach(e=>this.deregister(e))}async dispatch(t,e=!1){if(!t)throw new Error("ArkhamJS Error: Flux.dispatch requires an action.");const s=Date.now();let i=l(t),r=[];this.options.debug&&(r=this.getCachedStack());const o={duration:0,options:this.options,stack:r},{postDispatchList:n=[],preDispatchList:p=[]}=this.middleware;p.length&&(i=await this.processMiddleware(p,i,o));const{type:d,...f}=i;if(!d||d==="")return Promise.resolve(i);if(this.updateStoresState(d,f),this.stateChanged&&this.options.storage&&this.updateStorage)try{await this.updateStorage(),this.stateChanged=!1}catch{}const w=Date.now()-s;return o.duration=w,n.length&&(i=await this.processMiddleware(n,i,o)),e||(this.emit(d,i),this.emit("arkhamjs",this.state)),Promise.resolve(i)}getOptions(){return this.options}getState(t="",e){const s=Array.isArray(t)?t.join("."):t;if(this.stateCache.has(s))return this.stateCache.get(s);let i;t?i=k(this.state,t):i=this.state||{};const r=i&&l(i),o=r===void 0?e:r;return this.stateCache.set(s,o),o}getStore(t=""){return this.storeActions[t]}async init(t={},e=!1){e&&(this.isInit=!1,await this.reset(!1));const s={...t};this.isInit&&this.options.name&&(s.name=this.options.name),this.options={...this.defaultOptions,...s};const{debug:i,middleware:r,name:o,stores:n}=this.options;try{await this.useStorage(o??"arkhamjs")}catch(d){throw d}if(n?.length)try{await this.addStores(n)}catch(d){throw d}r?.length&&this.addMiddleware(r);const p="arkhamjs";return i?window[p]=this:delete window[p],this.isInit=!0,this.emit(g.INIT),this}onInit(t){this.on(g.INIT,t),this.isInit&&t()}offInit(t){this.off(g.INIT,t)}off(t,e){return this.removeListener(t,e)}on(t,e){return this.addListener(t,e)}async addStores(t){const e=t.map(r=>this.register(r)),{name:s,storage:i}=this.options;if(i?.setStorageData)try{await i.setStorageData(s??"arkhamjs",this.state)}catch(r){throw r}return e}removeMiddleware(t){t.forEach(e=>{this.pluginTypes.forEach(s=>{this.middleware[`${s}List`]=this.removePlugin(s,e)})})}async reset(t=!0){const{name:e,storage:s}=this.options;if(s&&t)try{await s.setStorageData?.(e??"arkhamjs",{})}catch(i){throw i}this.middleware={},this.options={...this.defaultOptions},this.state={},this.storeActions={},this.stateCache.clear(),this.stateChanged=!1,this.isInit=!1,this.pluginTypes.forEach(i=>this.middleware[`${i}List`]=[])}setState(t="",e){if(t){this.state=A(this.state,t,l(e)),this.stateChanged=!0;const s=Array.isArray(t)?t.join("."):t;this.stateCache.delete(s)}return this.options.storage&&this.updateStorage?this.updateStorage():Promise.resolve(!1)}async processMiddleware(t,e,s){return Promise.all(t.map(i=>i.method(l(e),l(this.state),s))).then(i=>i.reduce((r,o)=>F(r,o),e)).catch(i=>{throw i})}updateStoresState(t,e){Object.keys(this.storeActions).forEach(s=>{const i=this.storeActions[s];if(i){const r=this.state[s]||i.initialState||{},o=i.action(t,e,r);o!==r&&(this.state[s]=l(o)||r,this.stateChanged=!0)}})}getCachedStack(){const t=new Error().stack?.split(`
3
3
  `)[2]||"";if(u.has(t))return u.get(t);let e=[];try{const s="stackTraceLimit",i=Error.stackTraceLimit;if(Error[s]=1/0,e=b(new Error),Error[s]=i,u.size>=E){const r=u.keys().next().value;r&&u.delete(r)}u.set(t,e)}catch{}return e}addPlugin(t,e){const s=this.middleware[`${t}List`]||[],{method:i,name:r}=e;if(i&&typeof i=="function")s.some(n=>n.name===r)||s.push({method:i,name:r});else if(i!==void 0)throw Error(`${e.name} middleware is not configured properly. Method is not a function.`);return s}deregister(t=""){delete this.storeActions[t],delete this.state[t],this.stateCache.clear()}register(t){if(!t)throw Error("Store is undefined. Cannot register with Flux.");if(typeof t!="function")throw Error(`${t} is not a store function. Cannot register with Flux.`);const{name:e}=t,s=t(),i={action:t,initialState:s,name:e};return!x(e)&&!this.storeActions[e]&&(this.storeActions[e]=i,this.state[e]||(this.state[e]=s?l(s):{})),this.storeActions[e]}removePlugin(t,e){return(this.middleware[`${t}List`]||[]).filter(i=>i.name!==e)}async useStorage(t){const{storage:e,state:s,storageWait:i}=this.options;if(e)try{this.state=s||await e?.getStorageData?.(t)||{},this.updateStorage=v(()=>e?.setStorageData?.(t,this.state),i??300)}catch(r){throw r}else this.state=s||{}}}a(m,"initFlux",!1);const J=new m;export{J as Flux,m as FluxFramework};
4
4
  /* End ArkhamJS */
5
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7aXNFbXB0eX0gZnJvbSAnQG5sYWJzL3V0aWxzL2NoZWNrcy9pc0VtcHR5JztcbmltcG9ydCB7Y2xvbmVEZWVwfSBmcm9tICdAbmxhYnMvdXRpbHMvb2JqZWN0cy9jbG9uZSc7XG5pbXBvcnQge2RlYm91bmNlQ29tcGFjdH0gZnJvbSAnQG5sYWJzL3V0aWxzL29iamVjdHMvZGVib3VuY2UtY29tcGFjdCc7XG5pbXBvcnQge2dldH0gZnJvbSAnQG5sYWJzL3V0aWxzL29iamVjdHMvZ2V0JztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJ0BubGFicy91dGlscy9vYmplY3RzL21lcmdlJztcbmltcG9ydCB7c2V0fSBmcm9tICdAbmxhYnMvdXRpbHMvb2JqZWN0cy9zZXQnO1xuaW1wb3J0IHtwYXJzZVN0YWNrfSBmcm9tICdAbmxhYnMvdXRpbHMvb2JqZWN0cy9zdGFjay1wYXJzZXInO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ2V2ZW50cyc7XG5cbmltcG9ydCB7QXJraGFtQ29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvQXJraGFtQ29uc3RhbnRzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhBY3Rpb24sIEZsdXhNaWRkbGV3YXJlVHlwZSwgRmx1eE9wdGlvbnMsIEZsdXhQbHVnaW5UeXBlLCBGbHV4U3RvcmV9IGZyb20gJy4vRmx1eC50eXBlcyc7XG5cbmNvbnN0IFNUQUNLX0NBQ0hFID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xuY29uc3QgU1RBQ0tfQ0FDSEVfU0laRSA9IDEwMDtcblxuZXhwb3J0IGNsYXNzIEZsdXhGcmFtZXdvcmsgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBzdGF0aWMgaW5pdEZsdXg6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNJbml0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgcGx1Z2luVHlwZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gWydwcmVEaXNwYXRjaCcsICdwb3N0RGlzcGF0Y2gnXSBhcyBjb25zdDtcblxuICBwcml2YXRlIHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIHByaXZhdGUgc3RvcmVBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBGbHV4U3RvcmU+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE9wdGlvbnM6IEZsdXhPcHRpb25zID0ge1xuICAgIG5hbWU6ICdhcmtoYW1qcycsXG4gICAgcm91dGVyVHlwZTogJ2Jyb3dzZXInLFxuICAgIHNjcm9sbFRvVG9wOiB0cnVlLFxuICAgIHN0b3JhZ2VXYWl0OiAzMDAsXG4gICAgc3RvcmVzOiBbXSxcbiAgICB0aXRsZTogJ0Fya2hhbUpTJ1xuICB9O1xuICBwcml2YXRlIG1pZGRsZXdhcmU6IFJlY29yZDxzdHJpbmcsIEZsdXhQbHVnaW5UeXBlW10+ID0ge307XG4gIHByaXZhdGUgb3B0aW9uczogRmx1eE9wdGlvbnMgPSB0aGlzLmRlZmF1bHRPcHRpb25zO1xuXG4gIHByaXZhdGUgc3RhdGVDYWNoZTogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIHVwZGF0ZVN0b3JhZ2U6ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gPSAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuXG4gIHByaXZhdGUgc3RhdGVDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEJpbmQgbWV0aG9kcyBvbmNlIGluIGNvbnN0cnVjdG9yIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICB0aGlzLmFkZE1pZGRsZXdhcmUgPSB0aGlzLmFkZE1pZGRsZXdhcmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFkZFN0b3JlcyA9IHRoaXMuYWRkU3RvcmVzLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jbGVhckFwcERhdGEgPSB0aGlzLmNsZWFyQXBwRGF0YS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY2xlYXJNaWRkbGV3YXJlID0gdGhpcy5jbGVhck1pZGRsZXdhcmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRlcmVnaXN0ZXIgPSB0aGlzLmRlcmVnaXN0ZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5kaXNwYXRjaC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZ2V0T3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZ2V0U3RhdGUgPSB0aGlzLmdldFN0YXRlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRTdG9yZSA9IHRoaXMuZ2V0U3RvcmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmluaXQgPSB0aGlzLmluaXQuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9mZiA9IHRoaXMub2ZmLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZWdpc3RlciA9IHRoaXMucmVnaXN0ZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlbW92ZU1pZGRsZXdhcmUgPSB0aGlzLnJlbW92ZU1pZGRsZXdhcmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlbW92ZVN0b3JlcyA9IHRoaXMucmVtb3ZlU3RvcmVzLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZXNldCA9IHRoaXMucmVzZXQuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNldFN0YXRlID0gdGhpcy5zZXRTdGF0ZS5iaW5kKHRoaXMpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBtaWRkbGV3YXJlIGxpc3RzXG4gICAgdGhpcy5wbHVnaW5UeXBlcy5mb3JFYWNoKCh0eXBlOiBzdHJpbmcpID0+IHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSA9IFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbWlkZGxld2FyZSB0byBmcmFtZXdvcmsgd2l0aCBkdXBsaWNhdGUgcHJldmVudGlvblxuICAgKi9cbiAgYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlOiBGbHV4TWlkZGxld2FyZVR5cGVbXSk6IHZvaWQge1xuICAgIG1pZGRsZXdhcmUuZm9yRWFjaCgobWlkZGxlT2JqOiBGbHV4TWlkZGxld2FyZVR5cGUpID0+IHtcbiAgICAgIGlmKCFtaWRkbGVPYmogfHwgKHR5cGVvZiBtaWRkbGVPYmogIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1pZGRsZU9iaiAhPT0gJ29iamVjdCcpKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIG1pZGRsZXdhcmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIENhbm5vdCBhZGQgdG8gRmx1eC4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWlkZGxlTmFtZTogc3RyaW5nID0gbWlkZGxlT2JqLm5hbWUgfHwgJyc7XG4gICAgICBpZighbWlkZGxlTmFtZSkge1xuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBSZXF1aXJlcyBuYW1lIHByb3BlcnR5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBleGlzdGluZyBtaWRkbGV3YXJlIHRvIHByZXZlbnQgZHVwbGljYXRlc1xuICAgICAgY29uc3QgZXhpc3RpbmdNaWRkbGV3YXJlID0gdGhpcy5taWRkbGV3YXJlLnByZURpc3BhdGNoTGlzdD8uZmluZCgobSkgPT4gbS5uYW1lID09PSBtaWRkbGVOYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pZGRsZXdhcmUucG9zdERpc3BhdGNoTGlzdD8uZmluZCgobSkgPT4gbS5uYW1lID09PSBtaWRkbGVOYW1lKTtcblxuICAgICAgaWYoZXhpc3RpbmdNaWRkbGV3YXJlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgTWlkZGxld2FyZSBcIiR7bWlkZGxlTmFtZX1cIiBhbHJlYWR5IGV4aXN0cy4gU2tpcHBpbmcgZHVwbGljYXRlLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IG1pZGRsZU9ialt0eXBlIGFzIGtleW9mIEZsdXhNaWRkbGV3YXJlVHlwZV07XG4gICAgICAgIGlmKG1ldGhvZCAmJiB0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgcGx1Z2luOiBGbHV4UGx1Z2luVHlwZSA9IHttZXRob2QsIG5hbWU6IG1pZGRsZU5hbWV9O1xuICAgICAgICAgIHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSA9IHRoaXMuYWRkUGx1Z2luKHR5cGUsIHBsdWdpbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgYXBwIGRhdGEgZnJvbSBzdG9yYWdlIHdpdGggb3B0aW1pemVkIHN0YXRlIHJlc2V0XG4gICAqL1xuICBjbGVhckFwcERhdGEoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gUmVzZXQgc3RhdGUgdG8gaW5pdGlhbCB2YWx1ZXMgd2l0aG91dCBjbG9uaW5nXG4gICAgT2JqZWN0LmtleXModGhpcy5zdG9yZUFjdGlvbnMpLmZvckVhY2goKHN0b3JlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgIGlmKHN0b3JlRm4pIHtcbiAgICAgICAgdGhpcy5zdGF0ZVtzdG9yZUZuLm5hbWVdID0gc3RvcmVGbi5pbml0aWFsU3RhdGU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhciBzdGF0ZSBjYWNoZVxuICAgIHRoaXMuc3RhdGVDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcbiAgICBpZihzdG9yYWdlPy5zZXRTdG9yYWdlRGF0YSkge1xuICAgICAgcmV0dXJuIHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSA/PyAnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgbWlkZGxld2FyZSB3aXRoIHByb3BlciBjbGVhbnVwXG4gICAqL1xuICBjbGVhck1pZGRsZXdhcmUoKTogYm9vbGVhbiB7XG4gICAgT2JqZWN0LmtleXModGhpcy5taWRkbGV3YXJlKS5mb3JFYWNoKChwbHVnaW5UeXBlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMubWlkZGxld2FyZVtwbHVnaW5UeXBlXSA9IFtdO1xuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlLXJlZ2lzdGVycyBuYW1lZCBzdG9yZXMgd2l0aCBjbGVhbnVwXG4gICAqL1xuICByZW1vdmVTdG9yZXMoc3RvcmVOYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBzdG9yZU5hbWVzLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4gdGhpcy5kZXJlZ2lzdGVyKG5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpbWl6ZWQgZGlzcGF0Y2ggbWV0aG9kIHdpdGggcmVkdWNlZCBjbG9uaW5nIGFuZCBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICovXG4gIGFzeW5jIGRpc3BhdGNoKGFjdGlvbjogRmx1eEFjdGlvbiwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEZsdXhBY3Rpb24+IHtcbiAgICBpZighYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fya2hhbUpTIEVycm9yOiBGbHV4LmRpc3BhdGNoIHJlcXVpcmVzIGFuIGFjdGlvbi4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydFRpbWU6IG51bWJlciA9IERhdGUubm93KCk7XG5cbiAgICAvLyBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb246IE9ubHkgY2xvbmUgYWN0aW9uIG9uY2VcbiAgICBsZXQgY2xvbmVkQWN0aW9uOiBGbHV4QWN0aW9uID0gY2xvbmVEZWVwKGFjdGlvbik7XG5cbiAgICAvLyBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb246IE9ubHkgZ2V0IHN0YWNrIHRyYWNlIGluIGRlYnVnIG1vZGVcbiAgICBsZXQgc3RhY2s6IGFueVtdID0gW107XG4gICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKSB7XG4gICAgICBzdGFjayA9IHRoaXMuZ2V0Q2FjaGVkU3RhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBJbmZvID0ge1xuICAgICAgZHVyYXRpb246IDAsXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICBzdGFja1xuICAgIH07XG5cbiAgICAvLyBBcHBseSBwcmUtZGlzcGF0Y2ggbWlkZGxld2FyZSB3aXRoIG9wdGltaXplZCBjbG9uaW5nXG4gICAgY29uc3Qge3Bvc3REaXNwYXRjaExpc3QgPSBbXSwgcHJlRGlzcGF0Y2hMaXN0ID0gW119ID0gdGhpcy5taWRkbGV3YXJlO1xuXG4gICAgaWYocHJlRGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgdGhpcy5wcm9jZXNzTWlkZGxld2FyZShwcmVEaXNwYXRjaExpc3QsIGNsb25lZEFjdGlvbiwgYXBwSW5mbyk7XG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGUsIC4uLmRhdGF9ID0gY2xvbmVkQWN0aW9uO1xuXG4gICAgaWYoIXR5cGUgfHwgdHlwZSA9PT0gJycpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXJraGFtSlMgV2FybmluZzogRmx1eC5kaXNwYXRjaCBpcyBtaXNzaW5nIGFuIGFjdGlvbiB0eXBlIGZvciB0aGUgcGF5bG9hZDonLCBkYXRhKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2xvbmVkQWN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpbWl6ZWQgc3RhdGUgdXBkYXRlcyAtIG9ubHkgY2xvbmUgd2hlbiBuZWNlc3NhcnlcbiAgICB0aGlzLnVwZGF0ZVN0b3Jlc1N0YXRlKHR5cGUsIGRhdGEpO1xuXG4gICAgLy8gU2F2ZSBjYWNoZSBpbiBzdG9yYWdlIG9ubHkgaWYgc3RhdGUgY2hhbmdlZFxuICAgIGlmKHRoaXMuc3RhdGVDaGFuZ2VkICYmIHRoaXMub3B0aW9ucy5zdG9yYWdlICYmIHRoaXMudXBkYXRlU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdG9yYWdlKCk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JhZ2UgdXBkYXRlIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb246IG51bWJlciA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgYXBwSW5mby5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG4gICAgLy8gQXBwbHkgcG9zdC1kaXNwYXRjaCBtaWRkbGV3YXJlXG4gICAgaWYocG9zdERpc3BhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIGNsb25lZEFjdGlvbiA9IGF3YWl0IHRoaXMucHJvY2Vzc01pZGRsZXdhcmUocG9zdERpc3BhdGNoTGlzdCwgY2xvbmVkQWN0aW9uLCBhcHBJbmZvKTtcbiAgICB9XG5cbiAgICBpZighc2lsZW50KSB7XG4gICAgICB0aGlzLmVtaXQodHlwZSwgY2xvbmVkQWN0aW9uKTtcbiAgICAgIHRoaXMuZW1pdCgnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IEZsdXggb3B0aW9uc1xuICAgKi9cbiAgZ2V0T3B0aW9ucygpOiBGbHV4T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpbWl6ZWQgZ2V0U3RhdGUgd2l0aCBjYWNoaW5nXG4gICAqL1xuICBnZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCBkZWZhdWx0VmFsdWU/OiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3QgcGF0aEtleSA9IEFycmF5LmlzQXJyYXkocGF0aCkgPyBwYXRoLmpvaW4oJy4nKSA6IHBhdGg7XG5cbiAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgIGlmKHRoaXMuc3RhdGVDYWNoZS5oYXMocGF0aEtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlQ2FjaGUuZ2V0KHBhdGhLZXkpO1xuICAgIH1cblxuICAgIGxldCBzdG9yZVZhbHVlOiB1bmtub3duO1xuICAgIGlmKCFwYXRoKSB7XG4gICAgICBzdG9yZVZhbHVlID0gdGhpcy5zdGF0ZSB8fCB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcmVWYWx1ZSA9IGdldCh0aGlzLnN0YXRlLCBwYXRoKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHN0b3JlVmFsdWUgPyBjbG9uZURlZXAoc3RvcmVWYWx1ZSkgOiBzdG9yZVZhbHVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcblxuICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICB0aGlzLnN0YXRlQ2FjaGUuc2V0KHBhdGhLZXksIHJlc3VsdCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0b3JlIG9iamVjdCByZWdpc3RlcmVkIHdpdGggRmx1eFxuICAgKi9cbiAgZ2V0U3RvcmUobmFtZTogc3RyaW5nID0gJycpOiBGbHV4U3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFuZCBzZXQgY29uZmlndXJhdGlvbiBvcHRpb25zIHdpdGggdmFsaWRhdGlvblxuICAgKi9cbiAgYXN5bmMgaW5pdChvcHRpb25zOiBGbHV4T3B0aW9ucyA9IHt9LCByZXNldDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxGbHV4RnJhbWV3b3JrPiB7XG4gICAgaWYocmVzZXQpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkT3B0aW9ucyA9IHsuLi5vcHRpb25zfTtcbiAgICBpZih0aGlzLmlzSW5pdCAmJiB0aGlzLm9wdGlvbnMubmFtZSkge1xuICAgICAgdXBkYXRlZE9wdGlvbnMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zLCAuLi51cGRhdGVkT3B0aW9uc307XG4gICAgY29uc3Qge2RlYnVnLCBtaWRkbGV3YXJlLCBuYW1lLCBzdG9yZXN9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXNlU3RvcmFnZShuYW1lID8/ICdhcmtoYW1qcycpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Fya2hhbSBFcnJvcjogVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHVzaW5nIHN0b3JhZ2UuJywgbmFtZSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZihzdG9yZXM/Lmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRTdG9yZXMoc3RvcmVzKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXJraGFtIEVycm9yOiBUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWRkaW5nIHN0b3Jlcy4nLCBzdG9yZXMpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihtaWRkbGV3YXJlPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3aW5kb3dQcm9wZXJ0eTogc3RyaW5nID0gJ2Fya2hhbWpzJztcbiAgICBpZihkZWJ1Zykge1xuICAgICAgKHdpbmRvdyBhcyBhbnkpW3dpbmRvd1Byb3BlcnR5XSA9IHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSAod2luZG93IGFzIGFueSlbd2luZG93UHJvcGVydHldO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0ID0gdHJ1ZTtcbiAgICB0aGlzLmVtaXQoQXJraGFtQ29uc3RhbnRzLklOSVQpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpbml0aWFsaXphdGlvbiBsaXN0ZW5lciB3aXRoIGltbWVkaWF0ZSBleGVjdXRpb24gaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgKi9cbiAgb25Jbml0KGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uKEFya2hhbUNvbnN0YW50cy5JTklULCBsaXN0ZW5lcik7XG5cbiAgICBpZih0aGlzLmlzSW5pdCkge1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgaW5pdGlhbGl6YXRpb24gbGlzdGVuZXJcbiAgICovXG4gIG9mZkluaXQobGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub2ZmKEFya2hhbUNvbnN0YW50cy5JTklULCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lclxuICAgKi9cbiAgb3ZlcnJpZGUgb2ZmKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lclxuICAgKi9cbiAgb3ZlcnJpZGUgb24oZXZlbnRUeXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgbmV3IFN0b3JlcyB3aXRoIHZhbGlkYXRpb25cbiAgICovXG4gIGFzeW5jIGFkZFN0b3JlcyhzdG9yZXM6IEZsdXhTdG9yZVtdKTogUHJvbWlzZTxGbHV4U3RvcmVbXT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWRTdG9yZXM6IEZsdXhTdG9yZVtdID0gc3RvcmVzLm1hcCgoc3RvcmU6IEZsdXhTdG9yZSkgPT4gdGhpcy5yZWdpc3RlcihzdG9yZSkpO1xuXG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuICAgIGlmKHN0b3JhZ2U/LnNldFN0b3JhZ2VEYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUgPz8gJ2Fya2hhbWpzJywgdGhpcy5zdGF0ZSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZWdpc3RlcmVkU3RvcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBtaWRkbGV3YXJlIGZyb20gZnJhbWV3b3JrXG4gICAqL1xuICByZW1vdmVNaWRkbGV3YXJlKG5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIG5hbWVzLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5wbHVnaW5UeXBlcy5mb3JFYWNoKCh0eXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5yZW1vdmVQbHVnaW4odHlwZSwgbmFtZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBmcmFtZXdvcmsgd2l0aCBwcm9wZXIgY2xlYW51cFxuICAgKi9cbiAgYXN5bmMgcmVzZXQoY2xlYXJTdG9yYWdlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UgJiYgY2xlYXJTdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhPy4obmFtZSA/PyAnYXJraGFtanMnLCB7fSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFyIGFsbCBwcm9wZXJ0aWVzIGFuZCBjYWNoZXNcbiAgICB0aGlzLm1pZGRsZXdhcmUgPSB7fTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9uc307XG4gICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgIHRoaXMuc3RvcmVBY3Rpb25zID0ge307XG4gICAgdGhpcy5zdGF0ZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuXG4gICAgLy8gUmVpbml0aWFsaXplIG1pZGRsZXdhcmUgbGlzdHNcbiAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGltaXplZCBzZXRTdGF0ZSB3aXRoIGNoYW5nZSB0cmFja2luZ1xuICAgKi9cbiAgc2V0U3RhdGUocGF0aDogc3RyaW5nIHwgc3RyaW5nW10gPSAnJywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZihwYXRoKSB7XG4gICAgICB0aGlzLnN0YXRlID0gc2V0KHRoaXMuc3RhdGUsIHBhdGgsIGNsb25lRGVlcCh2YWx1ZSkpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAvLyBDbGVhciByZWxldmFudCBjYWNoZSBlbnRyaWVzXG4gICAgICBjb25zdCBwYXRoS2V5ID0gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGguam9pbignLicpIDogcGF0aDtcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5kZWxldGUocGF0aEtleSk7XG4gICAgfVxuXG4gICAgaWYodGhpcy5vcHRpb25zLnN0b3JhZ2UgJiYgdGhpcy51cGRhdGVTdG9yYWdlKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVTdG9yYWdlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gIH1cblxuICAvLyBQcml2YXRlIGhlbHBlciBtZXRob2RzXG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgbWlkZGxld2FyZSB3aXRoIG9wdGltaXplZCBjbG9uaW5nXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NNaWRkbGV3YXJlKFxuICAgIG1pZGRsZXdhcmVMaXN0OiBGbHV4UGx1Z2luVHlwZVtdLFxuICAgIGFjdGlvbjogRmx1eEFjdGlvbixcbiAgICBhcHBJbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPEZsdXhBY3Rpb24+IHtcbiAgICByZXR1cm4gUHJvbWlzZVxuICAgICAgLmFsbChcbiAgICAgICAgbWlkZGxld2FyZUxpc3QubWFwKChwbHVnaW46IEZsdXhQbHVnaW5UeXBlKSA9PlxuICAgICAgICAgIHBsdWdpbi5tZXRob2QoY2xvbmVEZWVwKGFjdGlvbiksIGNsb25lRGVlcCh0aGlzLnN0YXRlKSwgYXBwSW5mbylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChhY3Rpb25zKSA9PiBhY3Rpb25zLnJlZHVjZSgodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSA9PlxuICAgICAgICAgIG1lcmdlKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbiksIGFjdGlvbikgYXMgRmx1eEFjdGlvblxuICAgICAgKVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzdG9yZXMgc3RhdGUgd2l0aCBvcHRpbWl6ZWQgY2xvbmluZ1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTdG9yZXNTdGF0ZSh0eXBlOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXModGhpcy5zdG9yZUFjdGlvbnMpLmZvckVhY2goKHN0b3JlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgIGlmKHN0b3JlRm4pIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5zdGF0ZVtzdG9yZU5hbWVdIHx8IHN0b3JlRm4uaW5pdGlhbFN0YXRlIHx8IHt9O1xuXG4gICAgICAgIC8vIE9ubHkgY2xvbmUgaWYgdGhlIHN0YXRlIGFjdHVhbGx5IGNoYW5nZXNcbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBzdG9yZUZuLmFjdGlvbih0eXBlLCBkYXRhLCBjdXJyZW50U3RhdGUpO1xuICAgICAgICBpZihuZXdTdGF0ZSAhPT0gY3VycmVudFN0YXRlKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVtzdG9yZU5hbWVdID0gY2xvbmVEZWVwKG5ld1N0YXRlKSB8fCBjdXJyZW50U3RhdGU7XG4gICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhY2hlZCBzdGFjayB0cmFjZSBmb3IgcGVyZm9ybWFuY2VcbiAgICovXG4gIHByaXZhdGUgZ2V0Q2FjaGVkU3RhY2soKTogdW5rbm93bltdIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IG5ldyBFcnJvcigpLnN0YWNrPy5zcGxpdCgnXFxuJylbMl0gfHwgJyc7XG5cbiAgICBpZihTVEFDS19DQUNIRS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gU1RBQ0tfQ0FDSEUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgbGV0IHN0YWNrOiB1bmtub3duW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhY2tQcm9wZXJ0eSA9ICdzdGFja1RyYWNlTGltaXQnO1xuICAgICAgY29uc3Qgb3JpZ2luYWxMaW1pdCA9IChFcnJvciBhcyBhbnkpLnN0YWNrVHJhY2VMaW1pdDtcbiAgICAgIChFcnJvciBhcyBhbnkpW3N0YWNrUHJvcGVydHldID0gSW5maW5pdHk7XG4gICAgICBzdGFjayA9IHBhcnNlU3RhY2sobmV3IEVycm9yKCkpO1xuICAgICAgKEVycm9yIGFzIGFueSlbc3RhY2tQcm9wZXJ0eV0gPSBvcmlnaW5hbExpbWl0O1xuXG4gICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0XG4gICAgICBpZihTVEFDS19DQUNIRS5zaXplID49IFNUQUNLX0NBQ0hFX1NJWkUpIHtcbiAgICAgICAgY29uc3QgZmlyc3RLZXkgPSBTVEFDS19DQUNIRS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZihmaXJzdEtleSkge1xuICAgICAgICAgIFNUQUNLX0NBQ0hFLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFNUQUNLX0NBQ0hFLnNldChjYWNoZUtleSwgc3RhY2spO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIC8vIEZhbGxiYWNrIHRvIGVtcHR5IHN0YWNrXG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQbHVnaW4odHlwZTogc3RyaW5nLCBwbHVnaW46IEZsdXhQbHVnaW5UeXBlKTogRmx1eFBsdWdpblR5cGVbXSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSB8fCBbXTtcbiAgICBjb25zdCB7bWV0aG9kLCBuYW1lfSA9IHBsdWdpbjtcblxuICAgIGlmKG1ldGhvZCAmJiB0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBleGlzdHM6IGJvb2xlYW4gPSBsaXN0LnNvbWUoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmKCFleGlzdHMpIHtcbiAgICAgICAgbGlzdC5wdXNoKHttZXRob2QsIG5hbWV9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKGAke3BsdWdpbi5uYW1lfSBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBNZXRob2QgaXMgbm90IGEgZnVuY3Rpb24uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICBwcml2YXRlIGRlcmVnaXN0ZXIobmFtZTogc3RyaW5nID0gJycpOiB2b2lkIHtcbiAgICBkZWxldGUgdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV07XG4gICAgZGVsZXRlIHRoaXMuc3RhdGVbbmFtZV07XG4gICAgdGhpcy5zdGF0ZUNhY2hlLmNsZWFyKCk7IC8vIENsZWFyIGNhY2hlIHdoZW4gc3RvcmVzIGNoYW5nZVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlcihzdG9yZUZuOiB1bmtub3duKTogRmx1eFN0b3JlIHtcbiAgICBpZighc3RvcmVGbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1N0b3JlIGlzIHVuZGVmaW5lZC4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC4nKTtcbiAgICB9XG5cbiAgICBpZih0eXBlb2Ygc3RvcmVGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgRXJyb3IoYCR7c3RvcmVGbn0gaXMgbm90IGEgc3RvcmUgZnVuY3Rpb24uIENhbm5vdCByZWdpc3RlciB3aXRoIEZsdXguYCk7XG4gICAgfVxuXG4gICAgY29uc3Qge25hbWV9ID0gc3RvcmVGbjtcbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IHVua25vd24gPSAoc3RvcmVGbiBhcyAoKSA9PiB1bmtub3duKSgpO1xuICAgIGNvbnN0IHN0b3JlQWN0aW9uOiBGbHV4U3RvcmUgPSB7XG4gICAgICBhY3Rpb246IHN0b3JlRm4gYXMgKHR5cGU6IHN0cmluZywgZGF0YTogdW5rbm93biwgc3RhdGU6IHVua25vd24pID0+IHVua25vd24sXG4gICAgICBpbml0aWFsU3RhdGUsXG4gICAgICBuYW1lXG4gICAgfTtcblxuICAgIGlmKCFpc0VtcHR5KG5hbWUpICYmICF0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSkge1xuICAgICAgdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV0gPSBzdG9yZUFjdGlvbjtcblxuICAgICAgaWYoIXRoaXMuc3RhdGVbbmFtZV0pIHtcbiAgICAgICAgdGhpcy5zdGF0ZVtuYW1lXSA9IGluaXRpYWxTdGF0ZSA/IGNsb25lRGVlcChpbml0aWFsU3RhdGUpIDoge307XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdITtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGx1Z2luKHR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogRmx1eFBsdWdpblR5cGVbXSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSB8fCBbXTtcbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lICE9PSBuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXNlU3RvcmFnZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7c3RvcmFnZSwgc3RhdGUsIHN0b3JhZ2VXYWl0fSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCBhd2FpdCBzdG9yYWdlPy5nZXRTdG9yYWdlRGF0YT8uKG5hbWUpIHx8IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZVN0b3JhZ2UgPSBkZWJvdW5jZUNvbXBhY3QoXG4gICAgICAgICAgKCkgPT4gc3RvcmFnZT8uc2V0U3RvcmFnZURhdGE/LihuYW1lLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICBzdG9yYWdlV2FpdCA/PyAzMDBcbiAgICAgICAgKSBhcyBhbnk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFya2hhbUpTIEVycm9yOiBVc2luZyBzdG9yYWdlLCBcIiR7bmFtZX1cIi5gKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCB7fTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEZsdXg6IEZsdXhGcmFtZXdvcmsgPSBuZXcgRmx1eEZyYW1ld29yaygpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjtvS0FJQSxPQUFRLFdBQUFBLE1BQWMsOEJBQ3RCLE9BQVEsYUFBQUMsTUFBZ0IsNkJBQ3hCLE9BQVEs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SyxDQUFDLEtBQUssYUFBYUEsQ0FBSSxJQUMxQyxLQUFLLGFBQWFBLENBQUksRUFBSW1ELEVBRXRCLEtBQUssTUFBTW5ELENBQUksSUFDakIsS0FBSyxNQUFNQSxDQUFJLEVBQUlrRCxFQUFlMUMsRUFBVTBDLENBQVksRUFBSSxDQUFDLElBSTFELEtBQUssYUFBYWxELENBQUksQ0FDL0IsQ0FFUSxhQUFhVCxFQUFjUyxFQUFnQyxDQUVqRSxPQURhLEtBQUssV0FBVyxHQUFHVCxDQUFJLE1BQU0sR0FBSyxDQUFDLEdBQ3BDLE9BQVEwRCxHQUF3QkEsRUFBSSxPQUFTakQsQ0FBSSxDQUMvRCxDQUVBLE1BQWMsV0FBV0EsRUFBNkIsQ0FDcEQsS0FBTSxDQUFDLFFBQUFDLEVBQVMsTUFBQW9ELEVBQU8sWUFBQUMsQ0FBVyxFQUFJLEtBQUssUUFFM0MsR0FBR3JELEVBQ0QsR0FBSSxDQUNGLEtBQUssTUFBUW9ELEdBQVMsTUFBTXBELEdBQVMsaUJBQWlCRCxDQUFJLEdBQUssQ0FBQyxFQUNoRSxLQUFLLGNBQWdCdUQsRUFDbkIsSUFBTXRELEdBQVMsaUJBQWlCRCxFQUFNLEtBQUssS0FBSyxFQUNoRHNELEdBQWUsR0FDakIsQ0FDRixPQUFRM0IsRUFBTyxDQUViLE1BQU1BLENBQ1IsTUFFQSxLQUFLLE1BQVEwQixHQUFTLENBQUMsQ0FFM0IsQ0FDRixDQTVoQkUvRCxFQURXRixFQUNKLFdBQW9CLElBOGhCdEIsTUFBTW9FLEVBQXNCLElBQUlwRSIsCiAgIm5hbWVzIjogWyJpc0VtcHR5IiwgImNsb25lRGVlcCIsICJkZWJvdW5jZUNvbXBhY3QiLCAiZ2V0IiwgIm1lcmdlIiwgInNldCIsICJwYXJzZVN0YWNrIiwgIkV2ZW50RW1pdHRlciIsICJBcmtoYW1Db25zdGFudHMiLCAiU1RBQ0tfQ0FDSEUiLCAiU1RBQ0tfQ0FDSEVfU0laRSIsICJGbHV4RnJhbWV3b3JrIiwgIkV2ZW50RW1pdHRlciIsICJfX3B1YmxpY0ZpZWxkIiwgInR5cGUiLCAibWlkZGxld2FyZSIsICJtaWRkbGVPYmoiLCAibWlkZGxlTmFtZSIsICJtIiwgIm1ldGhvZCIsICJwbHVnaW4iLCAic3RvcmVOYW1lIiwgInN0b3JlRm4iLCAibmFtZSIsICJzdG9yYWdlIiwgInBsdWdpblR5cGUiLCAic3RvcmVOYW1lcyIsICJhY3Rpb24iLCAic2lsZW50IiwgInN0YXJ0VGltZSIsICJjbG9uZWRBY3Rpb24iLCAiY2xvbmVEZWVwIiwgInN0YWNrIiwgImFwcEluZm8iLCAicG9zdERpc3BhdGNoTGlzdCIsICJwcmVEaXNwYXRjaExpc3QiLCAiZGF0YSIsICJkdXJhdGlvbiIsICJwYXRoIiwgImRlZmF1bHRWYWx1ZSIsICJwYXRoS2V5IiwgInN0b3JlVmFsdWUiLCAiZ2V0IiwgInZhbHVlIiwgInJlc3VsdCIsICJvcHRpb25zIiwgInJlc2V0IiwgInVwZGF0ZWRPcHRpb25zIiwgImRlYnVnIiwgInN0b3JlcyIsICJlcnJvciIsICJ3aW5kb3dQcm9wZXJ0eSIsICJBcmtoYW1Db25zdGFudHMiLCAibGlzdGVuZXIiLCAiZXZlbnRUeXBlIiwgInJlZ2lzdGVyZWRTdG9yZXMiLCAic3RvcmUiLCAibmFtZXMiLCAiY2xlYXJTdG9yYWdlIiwgInNldCIsICJtaWRkbGV3YXJlTGlzdCIsICJhY3Rpb25zIiwgInVwZGF0ZWRBY3Rpb24iLCAibWVyZ2UiLCAiY3VycmVudFN0YXRlIiwgIm5ld1N0YXRlIiwgImNhY2hlS2V5IiwgInN0YWNrUHJvcGVydHkiLCAib3JpZ2luYWxMaW1pdCIsICJwYXJzZVN0YWNrIiwgImZpcnN0S2V5IiwgImxpc3QiLCAib2JqIiwgImluaXRpYWxTdGF0ZSIsICJzdG9yZUFjdGlvbiIsICJpc0VtcHR5IiwgInN0YXRlIiwgInN0b3JhZ2VXYWl0IiwgImRlYm91bmNlQ29tcGFjdCIsICJGbHV4Il0KfQo=
5
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7aXNFbXB0eX0gZnJvbSAnQG5sYWJzL3V0aWxzL2xpYi9jaGVja3MvaXNFbXB0eS9pc0VtcHR5LmpzJztcbmltcG9ydCB7Y2xvbmVEZWVwfSBmcm9tICdAbmxhYnMvdXRpbHMvbGliL29iamVjdHMvY2xvbmUvY2xvbmUuanMnO1xuaW1wb3J0IHtkZWJvdW5jZUNvbXBhY3R9IGZyb20gJ0BubGFicy91dGlscy9saWIvb2JqZWN0cy9kZWJvdW5jZS1jb21wYWN0L2RlYm91bmNlLWNvbXBhY3QuanMnO1xuaW1wb3J0IHtnZXR9IGZyb20gJ0BubGFicy91dGlscy9saWIvb2JqZWN0cy9nZXQvZ2V0LmpzJztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJ0BubGFicy91dGlscy9saWIvb2JqZWN0cy9tZXJnZS9tZXJnZS5qcyc7XG5pbXBvcnQge3NldH0gZnJvbSAnQG5sYWJzL3V0aWxzL2xpYi9vYmplY3RzL3NldC9zZXQuanMnO1xuaW1wb3J0IHtwYXJzZVN0YWNrfSBmcm9tICdAbmxhYnMvdXRpbHMvbGliL29iamVjdHMvc3RhY2stcGFyc2VyL3N0YWNrLXBhcnNlci5qcyc7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcblxuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4uL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMnO1xuXG5pbXBvcnQgdHlwZSB7Rmx1eEFjdGlvbiwgRmx1eE1pZGRsZXdhcmVUeXBlLCBGbHV4T3B0aW9ucywgRmx1eFBsdWdpblR5cGUsIEZsdXhTdG9yZX0gZnJvbSAnLi9GbHV4LnR5cGVzJztcblxuY29uc3QgU1RBQ0tfQ0FDSEUgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG5jb25zdCBTVEFDS19DQUNIRV9TSVpFID0gMTAwO1xuXG5leHBvcnQgY2xhc3MgRmx1eEZyYW1ld29yayBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBpbml0Rmx1eDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICByZWFkb25seSBwbHVnaW5UeXBlczogcmVhZG9ubHkgc3RyaW5nW10gPSBbJ3ByZURpc3BhdGNoJywgJ3Bvc3REaXNwYXRjaCddIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgc3RhdGU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgcHJpdmF0ZSBzdG9yZUFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEZsdXhTdG9yZT4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0T3B0aW9uczogRmx1eE9wdGlvbnMgPSB7XG4gICAgbmFtZTogJ2Fya2hhbWpzJyxcbiAgICByb3V0ZXJUeXBlOiAnYnJvd3NlcicsXG4gICAgc2Nyb2xsVG9Ub3A6IHRydWUsXG4gICAgc3RvcmFnZVdhaXQ6IDMwMCxcbiAgICBzdG9yZXM6IFtdLFxuICAgIHRpdGxlOiAnQXJraGFtSlMnXG4gIH07XG4gIHByaXZhdGUgbWlkZGxld2FyZTogUmVjb3JkPHN0cmluZywgRmx1eFBsdWdpblR5cGVbXT4gPSB7fTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBGbHV4T3B0aW9ucyA9IHRoaXMuZGVmYXVsdE9wdGlvbnM7XG4gIHByaXZhdGUgc3RhdGVDYWNoZTogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdGF0ZUNoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gQmluZCBtZXRob2RzIG9uY2UgaW4gY29uc3RydWN0b3IgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIHRoaXMuYWRkTWlkZGxld2FyZSA9IHRoaXMuYWRkTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWRkU3RvcmVzID0gdGhpcy5hZGRTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyQXBwRGF0YSA9IHRoaXMuY2xlYXJBcHBEYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jbGVhck1pZGRsZXdhcmUgPSB0aGlzLmNsZWFyTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGVyZWdpc3RlciA9IHRoaXMuZGVyZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLmRpc3BhdGNoLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0b3JlID0gdGhpcy5nZXRTdG9yZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaW5pdCA9IHRoaXMuaW5pdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub2ZmID0gdGhpcy5vZmYuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5yZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlTWlkZGxld2FyZSA9IHRoaXMucmVtb3ZlTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlU3RvcmVzID0gdGhpcy5yZW1vdmVTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlc2V0ID0gdGhpcy5yZXNldC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2V0U3RhdGUgPSB0aGlzLnNldFN0YXRlLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gW10pO1xuICB9XG5cbiAgYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlOiBGbHV4TWlkZGxld2FyZVR5cGVbXSk6IHZvaWQge1xuICAgIG1pZGRsZXdhcmUuZm9yRWFjaCgobWlkZGxlT2JqOiBGbHV4TWlkZGxld2FyZVR5cGUpID0+IHtcbiAgICAgIGlmKCFtaWRkbGVPYmogfHwgKHR5cGVvZiBtaWRkbGVPYmogIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1pZGRsZU9iaiAhPT0gJ29iamVjdCcpKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIG1pZGRsZXdhcmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIENhbm5vdCBhZGQgdG8gRmx1eC4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWlkZGxlTmFtZTogc3RyaW5nID0gbWlkZGxlT2JqLm5hbWUgfHwgJyc7XG4gICAgICBpZighbWlkZGxlTmFtZSkge1xuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBSZXF1aXJlcyBuYW1lIHByb3BlcnR5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nTWlkZGxld2FyZSA9IHRoaXMubWlkZGxld2FyZS5wcmVEaXNwYXRjaExpc3Q/LmZpbmQoKG0pID0+IG0ubmFtZSA9PT0gbWlkZGxlTmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taWRkbGV3YXJlLnBvc3REaXNwYXRjaExpc3Q/LmZpbmQoKG0pID0+IG0ubmFtZSA9PT0gbWlkZGxlTmFtZSk7XG5cbiAgICAgIGlmKGV4aXN0aW5nTWlkZGxld2FyZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oYE1pZGRsZXdhcmUgXCIke21pZGRsZU5hbWV9XCIgYWxyZWFkeSBleGlzdHMuIFNraXBwaW5nIGR1cGxpY2F0ZS5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBtZXRob2QgPSBtaWRkbGVPYmpbdHlwZSBhcyBrZXlvZiBGbHV4TWlkZGxld2FyZVR5cGVdO1xuICAgICAgICBpZihtZXRob2QgJiYgdHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IHBsdWdpbjogRmx1eFBsdWdpblR5cGUgPSB7bWV0aG9kLCBuYW1lOiBtaWRkbGVOYW1lfTtcbiAgICAgICAgICB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSB0aGlzLmFkZFBsdWdpbih0eXBlLCBwbHVnaW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyQXBwRGF0YSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLnN0b3JlQWN0aW9ucykuZm9yRWFjaCgoc3RvcmVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlRm4gPSB0aGlzLnN0b3JlQWN0aW9uc1tzdG9yZU5hbWVdO1xuICAgICAgaWYoc3RvcmVGbikge1xuICAgICAgICB0aGlzLnN0YXRlW3N0b3JlRm4ubmFtZV0gPSBzdG9yZUZuLmluaXRpYWxTdGF0ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc3RhdGVDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcbiAgICBpZihzdG9yYWdlPy5zZXRTdG9yYWdlRGF0YSkge1xuICAgICAgcmV0dXJuIHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSA/PyAnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG5cbiAgY2xlYXJNaWRkbGV3YXJlKCk6IGJvb2xlYW4ge1xuICAgIE9iamVjdC5rZXlzKHRoaXMubWlkZGxld2FyZSkuZm9yRWFjaCgocGx1Z2luVHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLm1pZGRsZXdhcmVbcGx1Z2luVHlwZV0gPSBbXTtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJlbW92ZVN0b3JlcyhzdG9yZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHN0b3JlTmFtZXMuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB0aGlzLmRlcmVnaXN0ZXIobmFtZSkpO1xuICB9XG5cbiAgYXN5bmMgZGlzcGF0Y2goYWN0aW9uOiBGbHV4QWN0aW9uLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4ge1xuICAgIGlmKCFhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJraGFtSlMgRXJyb3I6IEZsdXguZGlzcGF0Y2ggcmVxdWlyZXMgYW4gYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICAgIGxldCBjbG9uZWRBY3Rpb246IEZsdXhBY3Rpb24gPSBjbG9uZURlZXAoYWN0aW9uKTtcblxuICAgIGxldCBzdGFjazogYW55W10gPSBbXTtcbiAgICBpZih0aGlzLm9wdGlvbnMuZGVidWcpIHtcbiAgICAgIHN0YWNrID0gdGhpcy5nZXRDYWNoZWRTdGFjaygpO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcEluZm8gPSB7XG4gICAgICBkdXJhdGlvbjogMCxcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIHN0YWNrXG4gICAgfTtcblxuICAgIGNvbnN0IHtwb3N0RGlzcGF0Y2hMaXN0ID0gW10sIHByZURpc3BhdGNoTGlzdCA9IFtdfSA9IHRoaXMubWlkZGxld2FyZTtcblxuICAgIGlmKHByZURpc3BhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIGNsb25lZEFjdGlvbiA9IGF3YWl0IHRoaXMucHJvY2Vzc01pZGRsZXdhcmUocHJlRGlzcGF0Y2hMaXN0LCBjbG9uZWRBY3Rpb24sIGFwcEluZm8pO1xuICAgIH1cblxuICAgIGNvbnN0IHt0eXBlLCAuLi5kYXRhfSA9IGNsb25lZEFjdGlvbjtcblxuICAgIGlmKCF0eXBlIHx8IHR5cGUgPT09ICcnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKCdBcmtoYW1KUyBXYXJuaW5nOiBGbHV4LmRpc3BhdGNoIGlzIG1pc3NpbmcgYW4gYWN0aW9uIHR5cGUgZm9yIHRoZSBwYXlsb2FkOicsIGRhdGEpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU3RvcmVzU3RhdGUodHlwZSwgZGF0YSk7XG5cbiAgICBpZih0aGlzLnN0YXRlQ2hhbmdlZCAmJiB0aGlzLm9wdGlvbnMuc3RvcmFnZSAmJiB0aGlzLnVwZGF0ZVN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlU3RvcmFnZSgpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKCdTdG9yYWdlIHVwZGF0ZSBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uOiBudW1iZXIgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgIGFwcEluZm8uZHVyYXRpb24gPSBkdXJhdGlvbjtcblxuICAgIGlmKHBvc3REaXNwYXRjaExpc3QubGVuZ3RoKSB7XG4gICAgICBjbG9uZWRBY3Rpb24gPSBhd2FpdCB0aGlzLnByb2Nlc3NNaWRkbGV3YXJlKHBvc3REaXNwYXRjaExpc3QsIGNsb25lZEFjdGlvbiwgYXBwSW5mbyk7XG4gICAgfVxuXG4gICAgaWYoIXNpbGVudCkge1xuICAgICAgdGhpcy5lbWl0KHR5cGUsIGNsb25lZEFjdGlvbik7XG4gICAgICB0aGlzLmVtaXQoJ2Fya2hhbWpzJywgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZWRBY3Rpb24pO1xuICB9XG5cbiAgZ2V0T3B0aW9ucygpOiBGbHV4T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgfVxuXG4gIGdldFN0YXRlKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdID0gJycsIGRlZmF1bHRWYWx1ZT86IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBwYXRoS2V5ID0gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGguam9pbignLicpIDogcGF0aDtcblxuICAgIGlmKHRoaXMuc3RhdGVDYWNoZS5oYXMocGF0aEtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlQ2FjaGUuZ2V0KHBhdGhLZXkpO1xuICAgIH1cblxuICAgIGxldCBzdG9yZVZhbHVlOiB1bmtub3duO1xuICAgIGlmKCFwYXRoKSB7XG4gICAgICBzdG9yZVZhbHVlID0gdGhpcy5zdGF0ZSB8fCB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcmVWYWx1ZSA9IGdldCh0aGlzLnN0YXRlLCBwYXRoKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHN0b3JlVmFsdWUgPyBjbG9uZURlZXAoc3RvcmVWYWx1ZSkgOiBzdG9yZVZhbHVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcblxuICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQocGF0aEtleSwgcmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRTdG9yZShuYW1lOiBzdHJpbmcgPSAnJyk6IEZsdXhTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICB9XG5cbiAgYXN5bmMgaW5pdChvcHRpb25zOiBGbHV4T3B0aW9ucyA9IHt9LCByZXNldDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxGbHV4RnJhbWV3b3JrPiB7XG4gICAgaWYocmVzZXQpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkT3B0aW9ucyA9IHsuLi5vcHRpb25zfTtcbiAgICBpZih0aGlzLmlzSW5pdCAmJiB0aGlzLm9wdGlvbnMubmFtZSkge1xuICAgICAgdXBkYXRlZE9wdGlvbnMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zLCAuLi51cGRhdGVkT3B0aW9uc307XG4gICAgY29uc3Qge2RlYnVnLCBtaWRkbGV3YXJlLCBuYW1lLCBzdG9yZXN9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXNlU3RvcmFnZShuYW1lID8/ICdhcmtoYW1qcycpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSB1c2luZyBzdG9yYWdlLicsIG5hbWUpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYoc3RvcmVzPy5sZW5ndGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkU3RvcmVzKHN0b3Jlcyk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Fya2hhbSBFcnJvcjogVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGFkZGluZyBzdG9yZXMuJywgc3RvcmVzKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYobWlkZGxld2FyZT8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmFkZE1pZGRsZXdhcmUobWlkZGxld2FyZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2luZG93UHJvcGVydHk6IHN0cmluZyA9ICdhcmtoYW1qcyc7XG4gICAgaWYoZGVidWcpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KVt3aW5kb3dQcm9wZXJ0eV0gPSB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgKHdpbmRvdyBhcyBhbnkpW3dpbmRvd1Byb3BlcnR5XTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KEFya2hhbUNvbnN0YW50cy5JTklUKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25Jbml0KGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uKEFya2hhbUNvbnN0YW50cy5JTklULCBsaXN0ZW5lcik7XG5cbiAgICBpZih0aGlzLmlzSW5pdCkge1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG4gIH1cblxuICBvZmZJbml0KGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9mZihBcmtoYW1Db25zdGFudHMuSU5JVCwgbGlzdGVuZXIpO1xuICB9XG5cbiAgb3ZlcnJpZGUgb2ZmKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICBvdmVycmlkZSBvbihldmVudFR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgYXN5bmMgYWRkU3RvcmVzKHN0b3JlczogRmx1eFN0b3JlW10pOiBQcm9taXNlPEZsdXhTdG9yZVtdPiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZFN0b3JlczogRmx1eFN0b3JlW10gPSBzdG9yZXMubWFwKChzdG9yZTogRmx1eFN0b3JlKSA9PiB0aGlzLnJlZ2lzdGVyKHN0b3JlKSk7XG5cbiAgICBjb25zdCB7bmFtZSwgc3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYoc3RvcmFnZT8uc2V0U3RvcmFnZURhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSA/PyAnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRTdG9yZXM7XG4gIH1cblxuICByZW1vdmVNaWRkbGV3YXJlKG5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIG5hbWVzLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5wbHVnaW5UeXBlcy5mb3JFYWNoKCh0eXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5yZW1vdmVQbHVnaW4odHlwZSwgbmFtZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0KGNsZWFyU3RvcmFnZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7bmFtZSwgc3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZihzdG9yYWdlICYmIGNsZWFyU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXRTdG9yYWdlRGF0YT8uKG5hbWUgPz8gJ2Fya2hhbWpzJywge30pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm1pZGRsZXdhcmUgPSB7fTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9uc307XG4gICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgIHRoaXMuc3RvcmVBY3Rpb25zID0ge307XG4gICAgdGhpcy5zdGF0ZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuXG4gICAgdGhpcy5wbHVnaW5UeXBlcy5mb3JFYWNoKCh0eXBlOiBzdHJpbmcpID0+IHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSA9IFtdKTtcbiAgfVxuXG4gIHNldFN0YXRlKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdID0gJycsIHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYocGF0aCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHNldCh0aGlzLnN0YXRlLCBwYXRoLCBjbG9uZURlZXAodmFsdWUpKTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgY29uc3QgcGF0aEtleSA9IEFycmF5LmlzQXJyYXkocGF0aCkgPyBwYXRoLmpvaW4oJy4nKSA6IHBhdGg7XG4gICAgICB0aGlzLnN0YXRlQ2FjaGUuZGVsZXRlKHBhdGhLZXkpO1xuICAgIH1cblxuICAgIGlmKHRoaXMub3B0aW9ucy5zdG9yYWdlICYmIHRoaXMudXBkYXRlU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU3RvcmFnZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTWlkZGxld2FyZShcbiAgICBtaWRkbGV3YXJlTGlzdDogRmx1eFBsdWdpblR5cGVbXSxcbiAgICBhY3Rpb246IEZsdXhBY3Rpb24sXG4gICAgYXBwSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTxGbHV4QWN0aW9uPiB7XG4gICAgcmV0dXJuIFByb21pc2VcbiAgICAgIC5hbGwoXG4gICAgICAgIG1pZGRsZXdhcmVMaXN0Lm1hcCgocGx1Z2luOiBGbHV4UGx1Z2luVHlwZSkgPT5cbiAgICAgICAgICBwbHVnaW4ubWV0aG9kKGNsb25lRGVlcChhY3Rpb24pLCBjbG9uZURlZXAodGhpcy5zdGF0ZSksIGFwcEluZm8pXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC50aGVuKFxuICAgICAgICAoYWN0aW9ucykgPT4gYWN0aW9ucy5yZWR1Y2UoKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbikgPT5cbiAgICAgICAgICBtZXJnZSh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pLCBhY3Rpb24pIGFzIEZsdXhBY3Rpb25cbiAgICAgIClcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RvcmFnZTogKCkgPT4gUHJvbWlzZTxib29sZWFuPiA9ICgpID0+IFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdG9yZXNTdGF0ZSh0eXBlOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXModGhpcy5zdG9yZUFjdGlvbnMpLmZvckVhY2goKHN0b3JlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgIGlmKHN0b3JlRm4pIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5zdGF0ZVtzdG9yZU5hbWVdIHx8IHN0b3JlRm4uaW5pdGlhbFN0YXRlIHx8IHt9O1xuXG4gICAgICAgIGNvbnN0IG5ld1N0YXRlID0gc3RvcmVGbi5hY3Rpb24odHlwZSwgZGF0YSwgY3VycmVudFN0YXRlKTtcbiAgICAgICAgaWYobmV3U3RhdGUgIT09IGN1cnJlbnRTdGF0ZSkge1xuICAgICAgICAgIHRoaXMuc3RhdGVbc3RvcmVOYW1lXSA9IGNsb25lRGVlcChuZXdTdGF0ZSkgfHwgY3VycmVudFN0YXRlO1xuICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYWNoZWRTdGFjaygpOiB1bmtub3duW10ge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gbmV3IEVycm9yKCkuc3RhY2s/LnNwbGl0KCdcXG4nKVsyXSB8fCAnJztcblxuICAgIGlmKFNUQUNLX0NBQ0hFLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiBTVEFDS19DQUNIRS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICBsZXQgc3RhY2s6IHVua25vd25bXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFja1Byb3BlcnR5ID0gJ3N0YWNrVHJhY2VMaW1pdCc7XG4gICAgICBjb25zdCBvcmlnaW5hbExpbWl0ID0gKEVycm9yIGFzIGFueSkuc3RhY2tUcmFjZUxpbWl0O1xuICAgICAgKEVycm9yIGFzIGFueSlbc3RhY2tQcm9wZXJ0eV0gPSBJbmZpbml0eTtcbiAgICAgIHN0YWNrID0gcGFyc2VTdGFjayhuZXcgRXJyb3IoKSk7XG4gICAgICAoRXJyb3IgYXMgYW55KVtzdGFja1Byb3BlcnR5XSA9IG9yaWdpbmFsTGltaXQ7XG5cbiAgICAgIGlmKFNUQUNLX0NBQ0hFLnNpemUgPj0gU1RBQ0tfQ0FDSEVfU0laRSkge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IFNUQUNLX0NBQ0hFLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmKGZpcnN0S2V5KSB7XG4gICAgICAgICAgU1RBQ0tfQ0FDSEUuZGVsZXRlKGZpcnN0S2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgU1RBQ0tfQ0FDSEUuc2V0KGNhY2hlS2V5LCBzdGFjayk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfVxuXG4gIHByaXZhdGUgYWRkUGx1Z2luKHR5cGU6IHN0cmluZywgcGx1Z2luOiBGbHV4UGx1Z2luVHlwZSk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG4gICAgY29uc3Qge21ldGhvZCwgbmFtZX0gPSBwbHVnaW47XG5cbiAgICBpZihtZXRob2QgJiYgdHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgZXhpc3RzOiBib29sZWFuID0gbGlzdC5zb21lKChvYmo6IEZsdXhQbHVnaW5UeXBlKSA9PiBvYmoubmFtZSA9PT0gbmFtZSk7XG4gICAgICBpZighZXhpc3RzKSB7XG4gICAgICAgIGxpc3QucHVzaCh7bWV0aG9kLCBuYW1lfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtwbHVnaW4ubmFtZX0gbWlkZGxld2FyZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4gTWV0aG9kIGlzIG5vdCBhIGZ1bmN0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXJlZ2lzdGVyKG5hbWU6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gICAgZGVsZXRlIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICAgIGRlbGV0ZSB0aGlzLnN0YXRlW25hbWVdO1xuICAgIHRoaXMuc3RhdGVDYWNoZS5jbGVhcigpOyAvLyBDbGVhciBjYWNoZSB3aGVuIHN0b3JlcyBjaGFuZ2VcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXIoc3RvcmVGbjogdW5rbm93bik6IEZsdXhTdG9yZSB7XG4gICAgaWYoIXN0b3JlRm4pIHtcbiAgICAgIHRocm93IEVycm9yKCdTdG9yZSBpcyB1bmRlZmluZWQuIENhbm5vdCByZWdpc3RlciB3aXRoIEZsdXguJyk7XG4gICAgfVxuXG4gICAgaWYodHlwZW9mIHN0b3JlRm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IEVycm9yKGAke3N0b3JlRm59IGlzIG5vdCBhIHN0b3JlIGZ1bmN0aW9uLiBDYW5ub3QgcmVnaXN0ZXIgd2l0aCBGbHV4LmApO1xuICAgIH1cblxuICAgIGNvbnN0IHtuYW1lfSA9IHN0b3JlRm47XG4gICAgY29uc3QgaW5pdGlhbFN0YXRlOiB1bmtub3duID0gKHN0b3JlRm4gYXMgKCkgPT4gdW5rbm93bikoKTtcbiAgICBjb25zdCBzdG9yZUFjdGlvbjogRmx1eFN0b3JlID0ge1xuICAgICAgYWN0aW9uOiBzdG9yZUZuIGFzICh0eXBlOiBzdHJpbmcsIGRhdGE6IHVua25vd24sIHN0YXRlOiB1bmtub3duKSA9PiB1bmtub3duLFxuICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgbmFtZVxuICAgIH07XG5cbiAgICBpZighaXNFbXB0eShuYW1lKSAmJiAhdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV0pIHtcbiAgICAgIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdID0gc3RvcmVBY3Rpb247XG5cbiAgICAgIGlmKCF0aGlzLnN0YXRlW25hbWVdKSB7XG4gICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSBpbml0aWFsU3RhdGUgPyBjbG9uZURlZXAoaW5pdGlhbFN0YXRlKSA6IHt9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSE7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBsdWdpbih0eXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChvYmo6IEZsdXhQbHVnaW5UeXBlKSA9PiBvYmoubmFtZSAhPT0gbmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVzZVN0b3JhZ2UobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge3N0b3JhZ2UsIHN0YXRlLCBzdG9yYWdlV2FpdH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZihzdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUgfHwgYXdhaXQgc3RvcmFnZT8uZ2V0U3RvcmFnZURhdGE/LihuYW1lKSB8fCB7fTtcbiAgICAgICAgdGhpcy51cGRhdGVTdG9yYWdlID0gZGVib3VuY2VDb21wYWN0KFxuICAgICAgICAgICgpID0+IHN0b3JhZ2U/LnNldFN0b3JhZ2VEYXRhPy4obmFtZSwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgc3RvcmFnZVdhaXQgPz8gMzAwXG4gICAgICAgICkgYXMgYW55O1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKGBBcmtoYW1KUyBFcnJvcjogVXNpbmcgc3RvcmFnZSwgXCIke25hbWV9XCIuYCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlID0gc3RhdGUgfHwge307XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGbHV4OiBGbHV4RnJhbWV3b3JrID0g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RUFBeUJuRCxFQUEwQixFQUNuRG9ELEVBQXlCLENBQzdCLE9BQVFwRCxFQUNSLGFBQUFtRCxFQUNBLEtBQUFsRCxDQUNGLEVBRUEsTUFBRyxDQUFDb0QsRUFBUXBELENBQUksR0FBSyxDQUFDLEtBQUssYUFBYUEsQ0FBSSxJQUMxQyxLQUFLLGFBQWFBLENBQUksRUFBSW1ELEVBRXRCLEtBQUssTUFBTW5ELENBQUksSUFDakIsS0FBSyxNQUFNQSxDQUFJLEVBQUlrRCxFQUFlMUMsRUFBVTBDLENBQVksRUFBSSxDQUFDLElBSTFELEtBQUssYUFBYWxELENBQUksQ0FDL0IsQ0FFUSxhQUFhVCxFQUFjUyxFQUFnQyxDQUVqRSxPQURhLEtBQUssV0FBVyxHQUFHVCxDQUFJLE1BQU0sR0FBSyxDQUFDLEdBQ3BDLE9BQVEwRCxHQUF3QkEsRUFBSSxPQUFTakQsQ0FBSSxDQUMvRCxDQUVBLE1BQWMsV0FBV0EsRUFBNkIsQ0FDcEQsS0FBTSxDQUFDLFFBQUFDLEVBQVMsTUFBQW9ELEVBQU8sWUFBQUMsQ0FBVyxFQUFJLEtBQUssUUFFM0MsR0FBR3JELEVBQ0QsR0FBSSxDQUNGLEtBQUssTUFBUW9ELEdBQVMsTUFBTXBELEdBQVMsaUJBQWlCRCxDQUFJLEdBQUssQ0FBQyxFQUNoRSxLQUFLLGNBQWdCdUQsRUFDbkIsSUFBTXRELEdBQVMsaUJBQWlCRCxFQUFNLEtBQUssS0FBSyxFQUNoRHNELEdBQWUsR0FDakIsQ0FDRixPQUFRM0IsRUFBTyxDQUdiLE1BQU1BLENBQ1IsTUFFQSxLQUFLLE1BQVEwQixHQUFTLENBQUMsQ0FFM0IsQ0FDRixDQWhkRS9ELEVBRFdGLEVBQ0osV0FBb0IsSUFrZHRCLE1BQU1vRSxFQUFzQixJQUFJcEUiLAogICJuYW1lcyI6IFsiaXNFbXB0eSIsICJjbG9uZURlZXAiLCAiZGVib3VuY2VDb21wYWN0IiwgImdldCIsICJtZXJnZSIsICJzZXQiLCAicGFyc2VTdGFjayIsICJFdmVudEVtaXR0ZXIiLCAiQXJraGFtQ29uc3RhbnRzIiwgIlNUQUNLX0NBQ0hFIiwgIlNUQUNLX0NBQ0hFX1NJWkUiLCAiRmx1eEZyYW1ld29yayIsICJFdmVudEVtaXR0ZXIiLCAiX19wdWJsaWNGaWVsZCIsICJ0eXBlIiwgIm1pZGRsZXdhcmUiLCAibWlkZGxlT2JqIiwgIm1pZGRsZU5hbWUiLCAibSIsICJtZXRob2QiLCAicGx1Z2luIiwgInN0b3JlTmFtZSIsICJzdG9yZUZuIiwgIm5hbWUiLCAic3RvcmFnZSIsICJwbHVnaW5UeXBlIiwgInN0b3JlTmFtZXMiLCAiYWN0aW9uIiwgInNpbGVudCIsICJzdGFydFRpbWUiLCAiY2xvbmVkQWN0aW9uIiwgImNsb25lRGVlcCIsICJzdGFjayIsICJhcHBJbmZvIiwgInBvc3REaXNwYXRjaExpc3QiLCAicHJlRGlzcGF0Y2hMaXN0IiwgImRhdGEiLCAiZHVyYXRpb24iLCAicGF0aCIsICJkZWZhdWx0VmFsdWUiLCAicGF0aEtleSIsICJzdG9yZVZhbHVlIiwgImdldCIsICJ2YWx1ZSIsICJyZXN1bHQiLCAib3B0aW9ucyIsICJyZXNldCIsICJ1cGRhdGVkT3B0aW9ucyIsICJkZWJ1ZyIsICJzdG9yZXMiLCAiZXJyb3IiLCAid2luZG93UHJvcGVydHkiLCAiQXJraGFtQ29uc3RhbnRzIiwgImxpc3RlbmVyIiwgImV2ZW50VHlwZSIsICJyZWdpc3RlcmVkU3RvcmVzIiwgInN0b3JlIiwgIm5hbWVzIiwgImNsZWFyU3RvcmFnZSIsICJzZXQiLCAibWlkZGxld2FyZUxpc3QiLCAiYWN0aW9ucyIsICJ1cGRhdGVkQWN0aW9uIiwgIm1lcmdlIiwgImN1cnJlbnRTdGF0ZSIsICJuZXdTdGF0ZSIsICJjYWNoZUtleSIsICJzdGFja1Byb3BlcnR5IiwgIm9yaWdpbmFsTGltaXQiLCAicGFyc2VTdGFjayIsICJmaXJzdEtleSIsICJsaXN0IiwgIm9iaiIsICJpbml0aWFsU3RhdGUiLCAic3RvcmVBY3Rpb24iLCAiaXNFbXB0eSIsICJzdGF0ZSIsICJzdG9yYWdlV2FpdCIsICJkZWJvdW5jZUNvbXBhY3QiLCAiRmx1eCJdCn0K
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nlabs/arkhamjs",
3
- "version": "3.30.0",
3
+ "version": "3.31.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -64,13 +64,11 @@
64
64
  "update": "lex update --interactive"
65
65
  },
66
66
  "dependencies": {
67
- "@nlabs/utils": "2.0.1",
67
+ "@nlabs/utils": "2.1.2",
68
68
  "events": "^3.3.0"
69
69
  },
70
70
  "devDependencies": {
71
- "@types/events": "^3.0.3",
72
- "@types/jest": "^30.0.0",
73
- "@types/node": "^24.0.10",
71
+ "@jest/globals": "^30.0.4",
74
72
  "typescript": "^5.8.3"
75
73
  },
76
74
  "files": [