UNPKG

ngx-dynamic-hooks

Version:

Automatically insert live Angular components into a dynamic string of content (based on their selector or any pattern of your choice) and render the result in the DOM.

181 lines 31.7 kB
import { Injectable, reflectComponentType } from '@angular/core'; import { selectorHookParserConfigDefaults } from './selectorHookParserConfig'; import * as i0 from "@angular/core"; /** * A helper class for resolving a SelectorHookParserConfig */ export class SelectorHookParserConfigResolver { constructor() { } /** * Overwrites the default parser config with a (partial) SelectorHookParserConfig object and returns the result * * @param userParserConfig - The (partial) SelectorHookParserConfig object */ processConfig(userParserConfig) { const parserConfig = JSON.parse(JSON.stringify(selectorHookParserConfigDefaults)); // component if (!userParserConfig || !userParserConfig.hasOwnProperty('component')) { throw Error('Missing the required "component" property for the SelectorHookParserConfig. Must be either the component class or a LazyLoadComponentConfig.'); } parserConfig.component = userParserConfig.component; // If is class if (userParserConfig.component.hasOwnProperty('prototype')) { const compMeta = reflectComponentType(userParserConfig.component); parserConfig.selector = compMeta.selector; // If is LazyLoadingComponentConfig } else if (userParserConfig.component.hasOwnProperty('importPromise') && userParserConfig.component.hasOwnProperty('importName')) { if (!userParserConfig.hasOwnProperty('selector')) { throw Error(`When using lazy-loaded dynamic components, you have to specify the "selector" property in the parser config, as the real selector can't be known before the component is loaded.`); } // If is neither } else { throw Error('The "component" property in the SelectorHookParserConfig must either contain the component class or a LazyLoadComponentConfig.'); } // name if (userParserConfig.hasOwnProperty('name')) { if (typeof userParserConfig.name !== 'string') { throw Error('The submitted "name" property in the SelectorHookParserConfig must be of type string, was ' + typeof userParserConfig.name); } parserConfig.name = userParserConfig.name; } // selector (defaults to component selector) if (userParserConfig.hasOwnProperty('selector')) { if (typeof userParserConfig.selector !== 'string') { throw Error('The submitted "selector" property in the SelectorHookParserConfig must be of type string, was ' + typeof userParserConfig.selector); } parserConfig.selector = userParserConfig.selector; } // hostElementTag if (userParserConfig.hasOwnProperty('hostElementTag')) { if (typeof userParserConfig.hostElementTag !== 'string') { throw Error('The submitted "hostElementTag" property in the SelectorHookParserConfig must be of type string, was ' + typeof userParserConfig.hostElementTag); } parserConfig.hostElementTag = userParserConfig.hostElementTag; } // parseWithRegex if (userParserConfig.hasOwnProperty('parseWithRegex')) { if (typeof userParserConfig.parseWithRegex !== 'boolean') { throw Error('The submitted "parseWithRegex" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.parseWithRegex); } parserConfig.parseWithRegex = userParserConfig.parseWithRegex; } // allowSelfClosing if (userParserConfig.hasOwnProperty('allowSelfClosing')) { if (typeof userParserConfig.allowSelfClosing !== 'boolean') { throw Error('The submitted "allowSelfClosing" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.allowSelfClosing); } parserConfig.allowSelfClosing = userParserConfig.allowSelfClosing; } // enclosing if (userParserConfig.hasOwnProperty('enclosing')) { if (typeof userParserConfig.enclosing !== 'boolean') { throw Error('The submitted "enclosing" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.enclosing); } parserConfig.enclosing = userParserConfig.enclosing; } // bracketStyle if (userParserConfig.hasOwnProperty('bracketStyle')) { if (typeof userParserConfig.bracketStyle !== 'object' || typeof userParserConfig.bracketStyle.opening !== 'string' || typeof userParserConfig.bracketStyle.closing !== 'string') { throw Error('The submitted "bracketStyle" property in the SelectorHookParserConfig must have the form {opening: string, closing: string}'); } parserConfig.bracketStyle = userParserConfig.bracketStyle; } // injector (defaults to undefined) if (userParserConfig.hasOwnProperty('injector')) { parserConfig.injector = userParserConfig.injector; } // environmentInjector (defaults to undefined) if (userParserConfig.hasOwnProperty('environmentInjector')) { parserConfig.environmentInjector = userParserConfig.environmentInjector; } // unescapeStrings if (userParserConfig.hasOwnProperty('unescapeStrings')) { if (typeof userParserConfig.unescapeStrings !== 'boolean') { throw Error('The submitted "unescapeStrings" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.unescapeStrings); } parserConfig.unescapeStrings = userParserConfig.unescapeStrings; } // parseInputs if (userParserConfig.hasOwnProperty('parseInputs')) { if (typeof userParserConfig.parseInputs !== 'boolean') { throw Error('The submitted "parseInputs" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.parseInputs); } parserConfig.parseInputs = userParserConfig.parseInputs; } // inputsBlacklist if (userParserConfig.hasOwnProperty('inputsBlacklist')) { if (!Array.isArray(userParserConfig.inputsBlacklist)) { throw Error('The submitted "inputsBlacklist" property in the SelectorHookParserConfig must be an array of strings.'); } for (const entry of userParserConfig.inputsBlacklist) { if (typeof entry !== 'string') { throw Error('All entries of the submitted "inputsBlacklist" property in the SelectorHookParserConfig must be of type string, ' + typeof entry + ' found.'); } } parserConfig.inputsBlacklist = userParserConfig.inputsBlacklist; } // inputsWhitelist if (userParserConfig.hasOwnProperty('inputsWhitelist')) { if (!Array.isArray(userParserConfig.inputsWhitelist)) { throw Error('The submitted "inputsWhitelist" property in the SelectorHookParserConfig must be an array of strings.'); } for (const entry of userParserConfig.inputsWhitelist) { if (typeof entry !== 'string') { throw Error('All entries of the submitted "inputsWhitelist" property in the SelectorHookParserConfig must be of type string, ' + typeof entry + ' found.'); } } parserConfig.inputsWhitelist = userParserConfig.inputsWhitelist; } // outputsBlacklist if (userParserConfig.hasOwnProperty('outputsBlacklist')) { if (!Array.isArray(userParserConfig.outputsBlacklist)) { throw Error('The submitted "outputsBlacklist" property in the SelectorHookParserConfig must be an array of strings.'); } for (const entry of userParserConfig.outputsBlacklist) { if (typeof entry !== 'string') { throw Error('All entries of the submitted "outputsBlacklist" property in the SelectorHookParserConfig must be of type string, ' + typeof entry + ' found.'); } } parserConfig.outputsBlacklist = userParserConfig.outputsBlacklist; } // outputsWhitelist if (userParserConfig.hasOwnProperty('outputsWhitelist')) { if (!Array.isArray(userParserConfig.outputsWhitelist)) { throw Error('The submitted "outputsWhitelist" property in the SelectorHookParserConfig must be an array of strings.'); } for (const entry of userParserConfig.outputsWhitelist) { if (typeof entry !== 'string') { throw Error('All entries of the submitted "outputsWhitelist" property in the SelectorHookParserConfig must be of type string, ' + typeof entry + ' found.'); } } parserConfig.outputsWhitelist = userParserConfig.outputsWhitelist; } // allowContextInBindings if (userParserConfig.hasOwnProperty('allowContextInBindings')) { if (typeof userParserConfig.allowContextInBindings !== 'boolean') { throw Error('The submitted "allowContextInBindings" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.allowContextInBindings); } parserConfig.allowContextInBindings = userParserConfig.allowContextInBindings; } // allowContextFunctionCalls if (userParserConfig.hasOwnProperty('allowContextFunctionCalls')) { if (typeof userParserConfig.allowContextFunctionCalls !== 'boolean') { throw Error('The submitted "allowContextFunctionCalls" property in the SelectorHookParserConfig must be of type boolean, was ' + typeof userParserConfig.allowContextFunctionCalls); } parserConfig.allowContextFunctionCalls = userParserConfig.allowContextFunctionCalls; } return parserConfig; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectorHookParserConfigResolver, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectorHookParserConfigResolver, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectorHookParserConfigResolver, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnUmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHluYW1pYy1ob29rcy9zcmMvbGliL3BhcnNlcnMvc2VsZWN0b3Ivc2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnUmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQThELGdDQUFnQyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRTFJOztHQUVHO0FBSUgsTUFBTSxPQUFPLGdDQUFnQztJQUUzQztJQUNBLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLGdCQUEwQztRQUN0RCxNQUFNLFlBQVksR0FBcUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQztRQUVwSCxZQUFZO1FBQ1osSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDdkUsTUFBTSxLQUFLLENBQUMsOElBQThJLENBQUMsQ0FBQztRQUM5SixDQUFDO1FBQ0QsWUFBWSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFFcEQsY0FBYztRQUNkLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzNELE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLFNBQXlDLENBQUUsQ0FBQztZQUNuRyxZQUFZLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFFNUMsbUNBQW1DO1FBQ25DLENBQUM7YUFBTSxJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2pJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxLQUFLLENBQUMsa0xBQWtMLENBQUMsQ0FBQztZQUNsTSxDQUFDO1lBQ0gsZ0JBQWdCO1FBQ2hCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxLQUFLLENBQUMsZ0lBQWdJLENBQUMsQ0FBQztRQUNoSixDQUFDO1FBRUQsT0FBTztRQUNQLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxPQUFPLGdCQUFnQixDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFBQyxNQUFNLEtBQUssQ0FBQyw0RkFBNEYsR0FBRyxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQUMsQ0FBQztZQUM1TCxZQUFZLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQztRQUM1QyxDQUFDO1FBRUQsNENBQTRDO1FBQzVDLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDaEQsSUFBSSxPQUFPLGdCQUFnQixDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFBQyxNQUFNLEtBQUssQ0FBQyxnR0FBZ0csR0FBRyxPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQUMsQ0FBQztZQUN4TSxZQUFZLENBQUMsUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztRQUNwRCxDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUN0RCxJQUFJLE9BQU8sZ0JBQWdCLENBQUMsY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUFDLE1BQU0sS0FBSyxDQUFDLHNHQUFzRyxHQUFHLE9BQU8sZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQzFOLFlBQVksQ0FBQyxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsY0FBYyxDQUFDO1FBQ2hFLENBQUM7UUFFRCxpQkFBaUI7UUFDakIsSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksT0FBTyxnQkFBZ0IsQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQUMsTUFBTSxLQUFLLENBQUMsdUdBQXVHLEdBQUcsT0FBTyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUFDLENBQUM7WUFDNU4sWUFBWSxDQUFDLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUM7UUFDaEUsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDeEQsSUFBSSxPQUFPLGdCQUFnQixDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUFDLE1BQU0sS0FBSyxDQUFDLHlHQUF5RyxHQUFHLE9BQU8sZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUFDLENBQUM7WUFDbE8sWUFBWSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO1FBQ3BFLENBQUM7UUFFRCxZQUFZO1FBQ1osSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxJQUFJLE9BQU8sZ0JBQWdCLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUFDLE1BQU0sS0FBSyxDQUFDLGtHQUFrRyxHQUFHLE9BQU8sZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQzdNLFlBQVksQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1FBQ3RELENBQUM7UUFFRCxlQUFlO1FBQ2YsSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxJQUFJLE9BQU8sZ0JBQWdCLENBQUMsWUFBWSxLQUFLLFFBQVEsSUFBSSxPQUFPLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDaEwsTUFBTSxLQUFLLENBQUMsNkhBQTZILENBQUMsQ0FBQztZQUM3SSxDQUFDO1lBQ0QsWUFBWSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7UUFDNUQsQ0FBQztRQUVELG1DQUFtQztRQUNuQyxJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ2hELFlBQVksQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQ3BELENBQUM7UUFFRCw4Q0FBOEM7UUFDOUMsSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDO1lBQzNELFlBQVksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztRQUMxRSxDQUFDO1FBRUQsa0JBQWtCO1FBQ2xCLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUN2RCxJQUFJLE9BQU8sZ0JBQWdCLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUFDLE1BQU0sS0FBSyxDQUFDLHdHQUF3RyxHQUFHLE9BQU8sZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQy9OLFlBQVksQ0FBQyxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsZUFBZSxDQUFDO1FBQ2xFLENBQUM7UUFFRCxjQUFjO1FBQ2QsSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLE9BQU8sZ0JBQWdCLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUFDLE1BQU0sS0FBSyxDQUFDLG9HQUFvRyxHQUFHLE9BQU8sZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQ25OLFlBQVksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDO1FBQzFELENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQUMsTUFBTSxLQUFLLENBQUMsdUdBQXVHLENBQUMsQ0FBQztZQUFDLENBQUM7WUFDL0ssS0FBSyxNQUFNLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDckQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFBQyxNQUFNLEtBQUssQ0FBQyxrSEFBa0gsR0FBRyxPQUFPLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFBQyxDQUFDO1lBQ2hNLENBQUM7WUFDRCxZQUFZLENBQUMsZUFBZSxHQUFHLGdCQUFnQixDQUFDLGVBQWUsQ0FBQztRQUNsRSxDQUFDO1FBRUQsa0JBQWtCO1FBQ2xCLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO2dCQUFDLE1BQU0sS0FBSyxDQUFDLHVHQUF1RyxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQy9LLEtBQUssTUFBTSxLQUFLLElBQUksZ0JBQWdCLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3JELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQUMsTUFBTSxLQUFLLENBQUMsa0hBQWtILEdBQUcsT0FBTyxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQUMsQ0FBQztZQUNoTSxDQUFDO1lBQ0QsWUFBWSxDQUFDLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUM7UUFDbEUsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUFDLE1BQU0sS0FBSyxDQUFDLHdHQUF3RyxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQ2pMLEtBQUssTUFBTSxLQUFLLElBQUksZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFBQyxNQUFNLEtBQUssQ0FBQyxtSEFBbUgsR0FBRyxPQUFPLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFBQyxDQUFDO1lBQ2pNLENBQUM7WUFDRCxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUM7UUFDcEUsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUFDLE1BQU0sS0FBSyxDQUFDLHdHQUF3RyxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQ2pMLEtBQUssTUFBTSxLQUFLLElBQUksZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFBQyxNQUFNLEtBQUssQ0FBQyxtSEFBbUgsR0FBRyxPQUFPLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFBQyxDQUFDO1lBQ2pNLENBQUM7WUFDRCxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUM7UUFDcEUsQ0FBQztRQUVELHlCQUF5QjtRQUN6QixJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7WUFDOUQsSUFBSSxPQUFPLGdCQUFnQixDQUFDLHNCQUFzQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUFDLE1BQU0sS0FBSyxDQUFDLCtHQUErRyxHQUFHLE9BQU8sZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUFDLENBQUM7WUFDcFAsWUFBWSxDQUFDLHNCQUFzQixHQUFHLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDO1FBQ2hGLENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsMkJBQTJCLENBQUMsRUFBRSxDQUFDO1lBQ2pFLElBQUksT0FBTyxnQkFBZ0IsQ0FBQyx5QkFBeUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFBQyxNQUFNLEtBQUssQ0FBQyxrSEFBa0gsR0FBRyxPQUFPLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFBQyxDQUFDO1lBQzdQLFlBQVksQ0FBQyx5QkFBeUIsR0FBRyxnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQztRQUN0RixDQUFDO1FBRUQsT0FBTyxZQUF3QyxDQUFDO0lBQ2xELENBQUM7K0dBckpVLGdDQUFnQzttSEFBaEMsZ0NBQWdDLGNBRi9CLE1BQU07OzRGQUVQLGdDQUFnQztrQkFINUMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCByZWZsZWN0Q29tcG9uZW50VHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnLCBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWdEZWZhdWx0cywgc2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnRGVmYXVsdHMgfSBmcm9tICcuL3NlbGVjdG9ySG9va1BhcnNlckNvbmZpZyc7XG5cbi8qKlxuICogQSBoZWxwZXIgY2xhc3MgZm9yIHJlc29sdmluZyBhIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZ1xuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWdSZXNvbHZlciB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBwYXJzZXIgY29uZmlnIHdpdGggYSAocGFydGlhbCkgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0XG4gICAqXG4gICAqIEBwYXJhbSB1c2VyUGFyc2VyQ29uZmlnIC0gVGhlIChwYXJ0aWFsKSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgb2JqZWN0XG4gICAqL1xuICBwcm9jZXNzQ29uZmlnKHVzZXJQYXJzZXJDb25maWc6IFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyk6IFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyB7XG4gICAgY29uc3QgcGFyc2VyQ29uZmlnOiBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWdEZWZhdWx0cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnRGVmYXVsdHMpKTtcblxuICAgIC8vIGNvbXBvbmVudFxuICAgIGlmICghdXNlclBhcnNlckNvbmZpZyB8fCAhdXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnY29tcG9uZW50JykpIHtcbiAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHRoZSByZXF1aXJlZCBcImNvbXBvbmVudFwiIHByb3BlcnR5IGZvciB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnLiBNdXN0IGJlIGVpdGhlciB0aGUgY29tcG9uZW50IGNsYXNzIG9yIGEgTGF6eUxvYWRDb21wb25lbnRDb25maWcuJyk7XG4gICAgfVxuICAgIHBhcnNlckNvbmZpZy5jb21wb25lbnQgPSB1c2VyUGFyc2VyQ29uZmlnLmNvbXBvbmVudDtcblxuICAgIC8vIElmIGlzIGNsYXNzXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuY29tcG9uZW50Lmhhc093blByb3BlcnR5KCdwcm90b3R5cGUnKSkge1xuICAgICAgY29uc3QgY29tcE1ldGEgPSByZWZsZWN0Q29tcG9uZW50VHlwZSh1c2VyUGFyc2VyQ29uZmlnLmNvbXBvbmVudCBhcyAobmV3KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpKSE7XG4gICAgICBwYXJzZXJDb25maWcuc2VsZWN0b3IgPSBjb21wTWV0YS5zZWxlY3RvcjtcblxuICAgIC8vIElmIGlzIExhenlMb2FkaW5nQ29tcG9uZW50Q29uZmlnXG4gICAgfSBlbHNlIGlmICh1c2VyUGFyc2VyQ29uZmlnLmNvbXBvbmVudC5oYXNPd25Qcm9wZXJ0eSgnaW1wb3J0UHJvbWlzZScpICYmIHVzZXJQYXJzZXJDb25maWcuY29tcG9uZW50Lmhhc093blByb3BlcnR5KCdpbXBvcnROYW1lJykpIHtcbiAgICAgIGlmICghdXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnc2VsZWN0b3InKSkge1xuICAgICAgICB0aHJvdyBFcnJvcihgV2hlbiB1c2luZyBsYXp5LWxvYWRlZCBkeW5hbWljIGNvbXBvbmVudHMsIHlvdSBoYXZlIHRvIHNwZWNpZnkgdGhlIFwic2VsZWN0b3JcIiBwcm9wZXJ0eSBpbiB0aGUgcGFyc2VyIGNvbmZpZywgYXMgdGhlIHJlYWwgc2VsZWN0b3IgY2FuJ3QgYmUga25vd24gYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbG9hZGVkLmApOyBcbiAgICAgIH1cbiAgICAvLyBJZiBpcyBuZWl0aGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKCdUaGUgXCJjb21wb25lbnRcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgZWl0aGVyIGNvbnRhaW4gdGhlIGNvbXBvbmVudCBjbGFzcyBvciBhIExhenlMb2FkQ29tcG9uZW50Q29uZmlnLicpO1xuICAgIH1cblxuICAgIC8vIG5hbWVcbiAgICBpZiAodXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpKSB7XG4gICAgICBpZiAodHlwZW9mIHVzZXJQYXJzZXJDb25maWcubmFtZSAhPT0gJ3N0cmluZycpIHsgdGhyb3cgRXJyb3IoJ1RoZSBzdWJtaXR0ZWQgXCJuYW1lXCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLCB3YXMgJyArIHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLm5hbWUpOyB9XG4gICAgICBwYXJzZXJDb25maWcubmFtZSA9IHVzZXJQYXJzZXJDb25maWcubmFtZTtcbiAgICB9XG5cbiAgICAvLyBzZWxlY3RvciAoZGVmYXVsdHMgdG8gY29tcG9uZW50IHNlbGVjdG9yKVxuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdzZWxlY3RvcicpKSB7XG4gICAgICBpZiAodHlwZW9mIHVzZXJQYXJzZXJDb25maWcuc2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7IHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwic2VsZWN0b3JcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcsIHdhcyAnICsgdHlwZW9mIHVzZXJQYXJzZXJDb25maWcuc2VsZWN0b3IpOyB9XG4gICAgICBwYXJzZXJDb25maWcuc2VsZWN0b3IgPSB1c2VyUGFyc2VyQ29uZmlnLnNlbGVjdG9yO1xuICAgIH1cblxuICAgIC8vIGhvc3RFbGVtZW50VGFnXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuaGFzT3duUHJvcGVydHkoJ2hvc3RFbGVtZW50VGFnJykpIHtcbiAgICAgIGlmICh0eXBlb2YgdXNlclBhcnNlckNvbmZpZy5ob3N0RWxlbWVudFRhZyAhPT0gJ3N0cmluZycpIHsgdGhyb3cgRXJyb3IoJ1RoZSBzdWJtaXR0ZWQgXCJob3N0RWxlbWVudFRhZ1wiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBvZiB0eXBlIHN0cmluZywgd2FzICcgKyB0eXBlb2YgdXNlclBhcnNlckNvbmZpZy5ob3N0RWxlbWVudFRhZyk7IH1cbiAgICAgIHBhcnNlckNvbmZpZy5ob3N0RWxlbWVudFRhZyA9IHVzZXJQYXJzZXJDb25maWcuaG9zdEVsZW1lbnRUYWc7XG4gICAgfVxuXG4gICAgLy8gcGFyc2VXaXRoUmVnZXhcbiAgICBpZiAodXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncGFyc2VXaXRoUmVnZXgnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLnBhcnNlV2l0aFJlZ2V4ICE9PSAnYm9vbGVhbicpIHsgdGhyb3cgRXJyb3IoJ1RoZSBzdWJtaXR0ZWQgXCJwYXJzZVdpdGhSZWdleFwiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4sIHdhcyAnICsgdHlwZW9mIHVzZXJQYXJzZXJDb25maWcucGFyc2VXaXRoUmVnZXgpOyB9XG4gICAgICBwYXJzZXJDb25maWcucGFyc2VXaXRoUmVnZXggPSB1c2VyUGFyc2VyQ29uZmlnLnBhcnNlV2l0aFJlZ2V4O1xuICAgIH1cblxuICAgIC8vIGFsbG93U2VsZkNsb3NpbmdcbiAgICBpZiAodXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnYWxsb3dTZWxmQ2xvc2luZycpKSB7XG4gICAgICBpZiAodHlwZW9mIHVzZXJQYXJzZXJDb25maWcuYWxsb3dTZWxmQ2xvc2luZyAhPT0gJ2Jvb2xlYW4nKSB7IHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwiYWxsb3dTZWxmQ2xvc2luZ1wiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4sIHdhcyAnICsgdHlwZW9mIHVzZXJQYXJzZXJDb25maWcuYWxsb3dTZWxmQ2xvc2luZyk7IH1cbiAgICAgIHBhcnNlckNvbmZpZy5hbGxvd1NlbGZDbG9zaW5nID0gdXNlclBhcnNlckNvbmZpZy5hbGxvd1NlbGZDbG9zaW5nO1xuICAgIH1cblxuICAgIC8vIGVuY2xvc2luZ1xuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdlbmNsb3NpbmcnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLmVuY2xvc2luZyAhPT0gJ2Jvb2xlYW4nKSB7IHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwiZW5jbG9zaW5nXCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiwgd2FzICcgKyB0eXBlb2YgdXNlclBhcnNlckNvbmZpZy5lbmNsb3NpbmcpOyB9XG4gICAgICBwYXJzZXJDb25maWcuZW5jbG9zaW5nID0gdXNlclBhcnNlckNvbmZpZy5lbmNsb3Npbmc7XG4gICAgfVxuXG4gICAgLy8gYnJhY2tldFN0eWxlXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuaGFzT3duUHJvcGVydHkoJ2JyYWNrZXRTdHlsZScpKSB7XG4gICAgICBpZiAodHlwZW9mIHVzZXJQYXJzZXJDb25maWcuYnJhY2tldFN0eWxlICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgdXNlclBhcnNlckNvbmZpZy5icmFja2V0U3R5bGUub3BlbmluZyAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHVzZXJQYXJzZXJDb25maWcuYnJhY2tldFN0eWxlLmNsb3NpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwiYnJhY2tldFN0eWxlXCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGhhdmUgdGhlIGZvcm0ge29wZW5pbmc6IHN0cmluZywgY2xvc2luZzogc3RyaW5nfScpO1xuICAgICAgfVxuICAgICAgcGFyc2VyQ29uZmlnLmJyYWNrZXRTdHlsZSA9IHVzZXJQYXJzZXJDb25maWcuYnJhY2tldFN0eWxlO1xuICAgIH1cblxuICAgIC8vIGluamVjdG9yIChkZWZhdWx0cyB0byB1bmRlZmluZWQpXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuaGFzT3duUHJvcGVydHkoJ2luamVjdG9yJykpIHtcbiAgICAgIHBhcnNlckNvbmZpZy5pbmplY3RvciA9IHVzZXJQYXJzZXJDb25maWcuaW5qZWN0b3I7XG4gICAgfVxuXG4gICAgLy8gZW52aXJvbm1lbnRJbmplY3RvciAoZGVmYXVsdHMgdG8gdW5kZWZpbmVkKVxuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdlbnZpcm9ubWVudEluamVjdG9yJykpIHtcbiAgICAgIHBhcnNlckNvbmZpZy5lbnZpcm9ubWVudEluamVjdG9yID0gdXNlclBhcnNlckNvbmZpZy5lbnZpcm9ubWVudEluamVjdG9yO1xuICAgIH1cblxuICAgIC8vIHVuZXNjYXBlU3RyaW5nc1xuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCd1bmVzY2FwZVN0cmluZ3MnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLnVuZXNjYXBlU3RyaW5ncyAhPT0gJ2Jvb2xlYW4nKSB7IHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwidW5lc2NhcGVTdHJpbmdzXCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiwgd2FzICcgKyB0eXBlb2YgdXNlclBhcnNlckNvbmZpZy51bmVzY2FwZVN0cmluZ3MpOyB9XG4gICAgICBwYXJzZXJDb25maWcudW5lc2NhcGVTdHJpbmdzID0gdXNlclBhcnNlckNvbmZpZy51bmVzY2FwZVN0cmluZ3M7XG4gICAgfVxuXG4gICAgLy8gcGFyc2VJbnB1dHNcbiAgICBpZiAodXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncGFyc2VJbnB1dHMnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLnBhcnNlSW5wdXRzICE9PSAnYm9vbGVhbicpIHsgdGhyb3cgRXJyb3IoJ1RoZSBzdWJtaXR0ZWQgXCJwYXJzZUlucHV0c1wiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4sIHdhcyAnICsgdHlwZW9mIHVzZXJQYXJzZXJDb25maWcucGFyc2VJbnB1dHMpOyB9XG4gICAgICBwYXJzZXJDb25maWcucGFyc2VJbnB1dHMgPSB1c2VyUGFyc2VyQ29uZmlnLnBhcnNlSW5wdXRzO1xuICAgIH1cblxuICAgIC8vIGlucHV0c0JsYWNrbGlzdFxuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdpbnB1dHNCbGFja2xpc3QnKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHVzZXJQYXJzZXJDb25maWcuaW5wdXRzQmxhY2tsaXN0KSkgeyB0aHJvdyBFcnJvcignVGhlIHN1Ym1pdHRlZCBcImlucHV0c0JsYWNrbGlzdFwiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLicpOyB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHVzZXJQYXJzZXJDb25maWcuaW5wdXRzQmxhY2tsaXN0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgIT09ICdzdHJpbmcnKSB7IHRocm93IEVycm9yKCdBbGwgZW50cmllcyBvZiB0aGUgc3VibWl0dGVkIFwiaW5wdXRzQmxhY2tsaXN0XCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLCAnICsgdHlwZW9mIGVudHJ5ICsgJyBmb3VuZC4nKTsgfVxuICAgICAgfVxuICAgICAgcGFyc2VyQ29uZmlnLmlucHV0c0JsYWNrbGlzdCA9IHVzZXJQYXJzZXJDb25maWcuaW5wdXRzQmxhY2tsaXN0O1xuICAgIH1cblxuICAgIC8vIGlucHV0c1doaXRlbGlzdFxuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdpbnB1dHNXaGl0ZWxpc3QnKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHVzZXJQYXJzZXJDb25maWcuaW5wdXRzV2hpdGVsaXN0KSkgeyB0aHJvdyBFcnJvcignVGhlIHN1Ym1pdHRlZCBcImlucHV0c1doaXRlbGlzdFwiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLicpOyB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHVzZXJQYXJzZXJDb25maWcuaW5wdXRzV2hpdGVsaXN0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgIT09ICdzdHJpbmcnKSB7IHRocm93IEVycm9yKCdBbGwgZW50cmllcyBvZiB0aGUgc3VibWl0dGVkIFwiaW5wdXRzV2hpdGVsaXN0XCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLCAnICsgdHlwZW9mIGVudHJ5ICsgJyBmb3VuZC4nKTsgfVxuICAgICAgfVxuICAgICAgcGFyc2VyQ29uZmlnLmlucHV0c1doaXRlbGlzdCA9IHVzZXJQYXJzZXJDb25maWcuaW5wdXRzV2hpdGVsaXN0O1xuICAgIH1cblxuICAgIC8vIG91dHB1dHNCbGFja2xpc3RcbiAgICBpZiAodXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnb3V0cHV0c0JsYWNrbGlzdCcpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodXNlclBhcnNlckNvbmZpZy5vdXRwdXRzQmxhY2tsaXN0KSkgeyB0aHJvdyBFcnJvcignVGhlIHN1Ym1pdHRlZCBcIm91dHB1dHNCbGFja2xpc3RcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncy4nKTsgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB1c2VyUGFyc2VyQ29uZmlnLm91dHB1dHNCbGFja2xpc3QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gJ3N0cmluZycpIHsgdGhyb3cgRXJyb3IoJ0FsbCBlbnRyaWVzIG9mIHRoZSBzdWJtaXR0ZWQgXCJvdXRwdXRzQmxhY2tsaXN0XCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLCAnICsgdHlwZW9mIGVudHJ5ICsgJyBmb3VuZC4nKTsgfVxuICAgICAgfVxuICAgICAgcGFyc2VyQ29uZmlnLm91dHB1dHNCbGFja2xpc3QgPSB1c2VyUGFyc2VyQ29uZmlnLm91dHB1dHNCbGFja2xpc3Q7XG4gICAgfVxuXG4gICAgLy8gb3V0cHV0c1doaXRlbGlzdFxuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdvdXRwdXRzV2hpdGVsaXN0JykpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh1c2VyUGFyc2VyQ29uZmlnLm91dHB1dHNXaGl0ZWxpc3QpKSB7IHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwib3V0cHV0c1doaXRlbGlzdFwiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLicpOyB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHVzZXJQYXJzZXJDb25maWcub3V0cHV0c1doaXRlbGlzdCkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSAnc3RyaW5nJykgeyB0aHJvdyBFcnJvcignQWxsIGVudHJpZXMgb2YgdGhlIHN1Ym1pdHRlZCBcIm91dHB1dHNXaGl0ZWxpc3RcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcsICcgKyB0eXBlb2YgZW50cnkgKyAnIGZvdW5kLicpOyB9XG4gICAgICB9XG4gICAgICBwYXJzZXJDb25maWcub3V0cHV0c1doaXRlbGlzdCA9IHVzZXJQYXJzZXJDb25maWcub3V0cHV0c1doaXRlbGlzdDtcbiAgICB9XG5cbiAgICAvLyBhbGxvd0NvbnRleHRJbkJpbmRpbmdzXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuaGFzT3duUHJvcGVydHkoJ2FsbG93Q29udGV4dEluQmluZGluZ3MnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLmFsbG93Q29udGV4dEluQmluZGluZ3MgIT09ICdib29sZWFuJykgeyB0aHJvdyBFcnJvcignVGhlIHN1Ym1pdHRlZCBcImFsbG93Q29udGV4dEluQmluZGluZ3NcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgYmUgb2YgdHlwZSBib29sZWFuLCB3YXMgJyArIHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLmFsbG93Q29udGV4dEluQmluZGluZ3MpOyB9XG4gICAgICBwYXJzZXJDb25maWcuYWxsb3dDb250ZXh0SW5CaW5kaW5ncyA9IHVzZXJQYXJzZXJDb25maWcuYWxsb3dDb250ZXh0SW5CaW5kaW5ncztcbiAgICB9XG5cbiAgICAvLyBhbGxvd0NvbnRleHRGdW5jdGlvbkNhbGxzXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuaGFzT3duUHJvcGVydHkoJ2FsbG93Q29udGV4dEZ1bmN0aW9uQ2FsbHMnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLmFsbG93Q29udGV4dEZ1bmN0aW9uQ2FsbHMgIT09ICdib29sZWFuJykgeyB0aHJvdyBFcnJvcignVGhlIHN1Ym1pdHRlZCBcImFsbG93Q29udGV4dEZ1bmN0aW9uQ2FsbHNcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgYmUgb2YgdHlwZSBib29sZWFuLCB3YXMgJyArIHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLmFsbG93Q29udGV4dEZ1bmN0aW9uQ2FsbHMpOyB9XG4gICAgICBwYXJzZXJDb25maWcuYWxsb3dDb250ZXh0RnVuY3Rpb25DYWxscyA9IHVzZXJQYXJzZXJDb25maWcuYWxsb3dDb250ZXh0RnVuY3Rpb25DYWxscztcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VyQ29uZmlnIGFzIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZztcbiAgfVxufVxuIl19