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
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnUmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHluYW1pYy1ob29rcy9zcmMvbGliL3BhcnNlcnMvc2VsZWN0b3Ivc2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnUmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQThELGdDQUFnQyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRTFJOztHQUVHO0FBSUgsTUFBTSxPQUFPLGdDQUFnQztJQUUzQztJQUNBLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLGdCQUEwQztRQUN0RCxNQUFNLFlBQVksR0FBcUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQztRQUVwSCxZQUFZO1FBQ1osSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDdkUsTUFBTSxLQUFLLENBQUMsOElBQThJLENBQUMsQ0FBQztRQUM5SixDQUFDO1FBQ0QsWUFBWSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFFcEQsY0FBYztRQUNkLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzNELE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLFNBQXlDLENBQUUsQ0FBQztZQUNuRyxZQUFZLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFFNUMsbUNBQW1DO1FBQ25DLENBQUM7YUFBTSxJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FB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WUFDRCxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUM7UUFDcEUsQ0FBQztRQUVELHlCQUF5QjtRQUN6QixJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7WUFDOUQsSUFBSSxPQUFPLGdCQUFnQixDQUFDLHNCQUFzQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUFDLE1BQU0sS0FBSyxDQUFDLCtHQUErRyxHQUFHLE9BQU8sZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUFDLENBQUM7WUFDcFAsWUFBWSxDQUFDLHNCQUFzQixHQUFHLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDO1FBQ2hGLENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsMkJBQTJCLENBQUMsRUFBRSxDQUFDO1lBQ2pFLElBQUksT0FBTyxnQkFBZ0IsQ0FBQyx5QkFBeUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFBQyxNQUFNLEtBQUssQ0FBQyxrSEFBa0gsR0FBRyxPQUFPLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFBQyxDQUFDO1lBQzdQLFlBQVksQ0FBQyx5QkFBeUIsR0FBRyxnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQztRQUN0RixDQUFDO1FBRUQsT0FBTyxZQUF3QyxDQUFDO0lBQ2xELENBQUM7K0dBckpVLGdDQUFnQzttSEFBaEMsZ0NBQWdDLGNBRi9CLE1BQU07OzRGQUVQLGdDQUFnQztrQkFINUMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCByZWZsZWN0Q29tcG9uZW50VHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnLCBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWdEZWZhdWx0cywgc2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnRGVmYXVsdHMgfSBmcm9tICcuL3NlbGVjdG9ySG9va1BhcnNlckNvbmZpZyc7XG5cbi8qKlxuICogQSBoZWxwZXIgY2xhc3MgZm9yIHJlc29sdmluZyBhIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZ1xuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWdSZXNvbHZlciB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBwYXJzZXIgY29uZmlnIHdpdGggYSAocGFydGlhbCkgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0XG4gICAqXG4gICAqIEBwYXJhbSB1c2VyUGFyc2VyQ29uZmlnIC0gVGhlIChwYXJ0aWFsKSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgb2JqZWN0XG4gICAqL1xuICBwcm9jZXNzQ29uZmlnKHVzZXJQYXJzZXJDb25maWc6IFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyk6IFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyB7XG4gICAgY29uc3QgcGFyc2VyQ29uZmlnOiBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWdEZWZhdWx0cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnRGVmYXVsdHMpKTtcblxuICAgIC8vIGNvbXBvbmVudFxuICAgIGlmICghdXNlclBhcnNlckNvbmZpZyB8fCAhdXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnY29tcG9uZW50JykpIHtcbiAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHRoZSByZXF1aXJlZCBcImNvbXBvbmVudFwiIHByb3BlcnR5IGZvciB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnLiBNdXN0IGJlIGVpdGhlciB0aGUgY29tcG9uZW50IGNsYXNzIG9yIGEgTGF6eUxvYWRDb21wb25lbnRDb25maWcuJyk7XG4gICAgfVxuICAgIHBhcnNlckNvbmZpZy5jb21wb25lbnQgPSB1c2VyUGFyc2VyQ29uZmlnLmNvbXBvbmVudDtcblxuICAgIC8vIElmIGlzIGNsYXNzXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuY29tcG9uZW50Lmhhc093blByb3BlcnR5KCdwcm90b3R5cGUnKSkge1xuICAgICAgY29uc3QgY29tcE1ldGEgPSByZWZsZWN0Q29tcG9uZW50VHlwZSh1c2VyUGFyc2VyQ29uZmlnLmNvbXBvbmVudCBhcyAobmV3KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpKSE7XG4gICAgICBwYXJzZXJDb25maWcuc2VsZWN0b3IgPSBjb21wTWV0YS5zZWxlY3RvcjtcblxuICAgIC8vIElmIGlzIExhenlMb2FkaW5nQ29tcG9uZW50Q29uZmlnXG4gICAgfSBlbHNlIGlmICh1c2VyUGFyc2VyQ29uZmlnLmNvbXBvbmVudC5oYXNPd25Qcm9wZXJ0eSgnaW1wb3J0UHJvbWlzZScpICYmIHVzZXJQYXJzZXJDb25maWcuY29tcG9uZW50Lmhhc093blByb3BlcnR5KCdpbXBvcnROYW1lJykpIHtcbiAgICAgIGlmICghdXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnc2VsZWN0b3InKSkge1xuICAgICAgICB0aHJvdyBFcnJvcihgV2hlbiB1c2luZyBsYXp5LWxvYWRlZCBkeW5hbWljIGNvbXBvbmVudHMsIHlvdSBoYXZlIHRvIHNwZWNpZnkgdGhlIFwic2VsZWN0b3JcIiBwcm9wZXJ0eSBpbiB0aGUgcGFyc2VyIGNvbmZpZywgYXMgdGhlIHJlYWwgc2VsZWN0b3IgY2FuJ3QgYmUga25vd24gYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbG9hZGVkLmApOyBcbiAgICAgIH1cbiAgICAvLyBJZiBpcyBuZWl0aGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKCdUaGUgXCJjb21wb25lbnRcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgZWl0aGVyIGNvbnRhaW4gdGhlIGNvbXBvbmVudCBjbGFzcyBvciBhIExhenlMb2FkQ29tcG9uZW50Q29uZmlnLicpO1xuICAgIH1cblxuICAgIC8vIG5hbWVcbiAgICBpZiAodXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpKSB7XG4gICAgICBpZiAodHlwZW9mIHVzZXJQYXJzZXJDb25maWcubmFtZSAhPT0gJ3N0cmluZycpIHsgdGhyb3cgRXJyb3IoJ1RoZSBzdWJtaXR0ZWQgXCJuYW1lXCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLCB3YXMgJyArIHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLm5hbWUpOyB9XG4gICAgICBwYXJzZXJDb25maWcubmFtZSA9IHVzZXJQYXJzZXJDb25maWcubmFtZTtcbiAgICB9XG5cbiAgICAvLyBzZWxlY3RvciAoZGVmYXVsdHMgdG8gY29tcG9uZW50IHNlbGVjdG9yKVxuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdzZWxlY3RvcicpKSB7XG4gICAgICBpZiAodHlwZW9mIHVzZXJQYXJzZXJDb25maWcuc2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7IHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwic2VsZWN0b3JcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcsIHdhcyAnICsgdHlwZW9mIHVzZXJQYXJzZXJDb25maWcuc2VsZWN0b3IpOyB9XG4gICAgICBwYXJzZXJDb25maWcuc2VsZWN0b3IgPSB1c2VyUGFyc2VyQ29uZmlnLnNlbGVjdG9yO1xuICAgIH1cblxuICAgIC8vIGhvc3RFbGVtZW50VGFnXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuaGFzT3duUHJvcGVydHkoJ2hvc3RFbGVtZW50VGFnJykpIHtcbiAgICAgIGlmICh0eXBlb2YgdXNlclBhcnNlckNvbmZpZy5ob3N0RWxlbWVudFRhZyAhPT0gJ3N0cmluZycpIHsgdGhyb3cgRXJyb3IoJ1RoZSBzdWJtaXR0ZWQgXCJob3N0RWxlbWVudFRhZ1wiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBvZiB0eXBlIHN0cmluZywgd2FzICcgKyB0eXBlb2YgdXNlclBhcnNlckNvbmZpZy5ob3N0RWxlbWVudFRhZyk7IH1cbiAgICAgIHBhcnNlckNvbmZpZy5ob3N0RWxlbWVudFRhZyA9IHVzZXJQYXJzZXJDb25maWcuaG9zdEVsZW1lbnRUYWc7XG4gICAgfVxuXG4gICAgLy8gcGFyc2VXaXRoUmVnZXhcbiAgICBpZiAodXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncGFyc2VXaXRoUmVnZXgnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLnBhcnNlV2l0aFJlZ2V4ICE9PSAnYm9vbGVhbicpIHsgdGhyb3cgRXJyb3IoJ1RoZSBzdWJtaXR0ZWQgXCJwYXJzZVdpdGhSZWdleFwiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4sIHdhcyAnICsgdHlwZW9mIHVzZXJQYXJzZXJDb25maWcucGFyc2VXaXRoUmVnZXgpOyB9XG4gICAgICBwYXJzZXJDb25maWcucGFyc2VXaXRoUmVnZXggPSB1c2VyUGFyc2VyQ29uZmlnLnBhcnNlV2l0aFJlZ2V4O1xuICAgIH1cblxuICAgIC8vIGFsbG93U2VsZkNsb3NpbmdcbiAgICBpZiAodXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnYWxsb3dTZWxmQ2xvc2luZycpKSB7XG4gICAgICBpZiAodHlwZW9mIHVzZXJQYXJzZXJDb25maWcuYWxsb3dTZWxmQ2xvc2luZyAhPT0gJ2Jvb2xlYW4nKSB7IHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwiYWxsb3dTZWxmQ2xvc2luZ1wiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4sIHdhcyAnICsgdHlwZW9mIHVzZXJQYXJzZXJDb25maWcuYWxsb3dTZWxmQ2xvc2luZyk7IH1cbiAgICAgIHBhcnNlckNvbmZpZy5hbGxvd1NlbGZDbG9zaW5nID0gdXNlclBhcnNlckNvbmZpZy5hbGxvd1NlbGZDbG9zaW5nO1xuICAgIH1cblxuICAgIC8vIGVuY2xvc2luZ1xuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdlbmNsb3NpbmcnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLmVuY2xvc2luZyAhPT0gJ2Jvb2xlYW4nKSB7IHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwiZW5jbG9zaW5nXCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiwgd2FzICcgKyB0eXBlb2YgdXNlclBhcnNlckNvbmZpZy5lbmNsb3NpbmcpOyB9XG4gICAgICBwYXJzZXJDb25maWcuZW5jbG9zaW5nID0gdXNlclBhcnNlckNvbmZpZy5lbmNsb3Npbmc7XG4gICAgfVxuXG4gICAgLy8gYnJhY2tldFN0eWxlXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuaGFzT3duUHJvcGVydHkoJ2JyYWNrZXRTdHlsZScpKSB7XG4gICAgICBpZiAodHlwZW9mIHVzZXJQYXJzZXJDb25maWcuYnJhY2tldFN0eWxlICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgdXNlclBhcnNlckNvbmZpZy5icmFja2V0U3R5bGUub3BlbmluZyAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHVzZXJQYXJzZXJDb25maWcuYnJhY2tldFN0eWxlLmNsb3NpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwiYnJhY2tldFN0eWxlXCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGhhdmUgdGhlIGZvcm0ge29wZW5pbmc6IHN0cmluZywgY2xvc2luZzogc3RyaW5nfScpO1xuICAgICAgfVxuICAgICAgcGFyc2VyQ29uZmlnLmJyYWNrZXRTdHlsZSA9IHVzZXJQYXJzZXJDb25maWcuYnJhY2tldFN0eWxlO1xuICAgIH1cblxuICAgIC8vIGluamVjdG9yIChkZWZhdWx0cyB0byB1bmRlZmluZWQpXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuaGFzT3duUHJvcGVydHkoJ2luamVjdG9yJykpIHtcbiAgICAgIHBhcnNlckNvbmZpZy5pbmplY3RvciA9IHVzZXJQYXJzZXJDb25maWcuaW5qZWN0b3I7XG4gICAgfVxuXG4gICAgLy8gZW52aXJvbm1lbnRJbmplY3RvciAoZGVmYXVsdHMgdG8gdW5kZWZpbmVkKVxuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdlbnZpcm9ubWVudEluamVjdG9yJykpIHtcbiAgICAgIHBhcnNlckNvbmZpZy5lbnZpcm9ubWVudEluamVjdG9yID0gdXNlclBhcnNlckNvbmZpZy5lbnZpcm9ubWVudEluamVjdG9yO1xuICAgIH1cblxuICAgIC8vIHVuZXNjYXBlU3RyaW5nc1xuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCd1bmVzY2FwZVN0cmluZ3MnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLnVuZXNjYXBlU3RyaW5ncyAhPT0gJ2Jvb2xlYW4nKSB7IHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwidW5lc2NhcGVTdHJpbmdzXCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiwgd2FzICcgKyB0eXBlb2YgdXNlclBhcnNlckNvbmZpZy51bmVzY2FwZVN0cmluZ3MpOyB9XG4gICAgICBwYXJzZXJDb25maWcudW5lc2NhcGVTdHJpbmdzID0gdXNlclBhcnNlckNvbmZpZy51bmVzY2FwZVN0cmluZ3M7XG4gICAgfVxuXG4gICAgLy8gcGFyc2VJbnB1dHNcbiAgICBpZiAodXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncGFyc2VJbnB1dHMnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLnBhcnNlSW5wdXRzICE9PSAnYm9vbGVhbicpIHsgdGhyb3cgRXJyb3IoJ1RoZSBzdWJtaXR0ZWQgXCJwYXJzZUlucHV0c1wiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4sIHdhcyAnICsgdHlwZW9mIHVzZXJQYXJzZXJDb25maWcucGFyc2VJbnB1dHMpOyB9XG4gICAgICBwYXJzZXJDb25maWcucGFyc2VJbnB1dHMgPSB1c2VyUGFyc2VyQ29uZmlnLnBhcnNlSW5wdXRzO1xuICAgIH1cblxuICAgIC8vIGlucHV0c0JsYWNrbGlzdFxuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdpbnB1dHNCbGFja2xpc3QnKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHVzZXJQYXJzZXJDb25maWcuaW5wdXRzQmxhY2tsaXN0KSkgeyB0aHJvdyBFcnJvcignVGhlIHN1Ym1pdHRlZCBcImlucHV0c0JsYWNrbGlzdFwiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLicpOyB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHVzZXJQYXJzZXJDb25maWcuaW5wdXRzQmxhY2tsaXN0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgIT09ICdzdHJpbmcnKSB7IHRocm93IEVycm9yKCdBbGwgZW50cmllcyBvZiB0aGUgc3VibWl0dGVkIFwiaW5wdXRzQmxhY2tsaXN0XCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLCAnICsgdHlwZW9mIGVudHJ5ICsgJyBmb3VuZC4nKTsgfVxuICAgICAgfVxuICAgICAgcGFyc2VyQ29uZmlnLmlucHV0c0JsYWNrbGlzdCA9IHVzZXJQYXJzZXJDb25maWcuaW5wdXRzQmxhY2tsaXN0O1xuICAgIH1cblxuICAgIC8vIGlucHV0c1doaXRlbGlzdFxuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdpbnB1dHNXaGl0ZWxpc3QnKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHVzZXJQYXJzZXJDb25maWcuaW5wdXRzV2hpdGVsaXN0KSkgeyB0aHJvdyBFcnJvcignVGhlIHN1Ym1pdHRlZCBcImlucHV0c1doaXRlbGlzdFwiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLicpOyB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHVzZXJQYXJzZXJDb25maWcuaW5wdXRzV2hpdGVsaXN0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgIT09ICdzdHJpbmcnKSB7IHRocm93IEVycm9yKCdBbGwgZW50cmllcyBvZiB0aGUgc3VibWl0dGVkIFwiaW5wdXRzV2hpdGVsaXN0XCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLCAnICsgdHlwZW9mIGVudHJ5ICsgJyBmb3VuZC4nKTsgfVxuICAgICAgfVxuICAgICAgcGFyc2VyQ29uZmlnLmlucHV0c1doaXRlbGlzdCA9IHVzZXJQYXJzZXJDb25maWcuaW5wdXRzV2hpdGVsaXN0O1xuICAgIH1cblxuICAgIC8vIG91dHB1dHNCbGFja2xpc3RcbiAgICBpZiAodXNlclBhcnNlckNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnb3V0cHV0c0JsYWNrbGlzdCcpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodXNlclBhcnNlckNvbmZpZy5vdXRwdXRzQmxhY2tsaXN0KSkgeyB0aHJvdyBFcnJvcignVGhlIHN1Ym1pdHRlZCBcIm91dHB1dHNCbGFja2xpc3RcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncy4nKTsgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB1c2VyUGFyc2VyQ29uZmlnLm91dHB1dHNCbGFja2xpc3QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gJ3N0cmluZycpIHsgdGhyb3cgRXJyb3IoJ0FsbCBlbnRyaWVzIG9mIHRoZSBzdWJtaXR0ZWQgXCJvdXRwdXRzQmxhY2tsaXN0XCIgcHJvcGVydHkgaW4gdGhlIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZyBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLCAnICsgdHlwZW9mIGVudHJ5ICsgJyBmb3VuZC4nKTsgfVxuICAgICAgfVxuICAgICAgcGFyc2VyQ29uZmlnLm91dHB1dHNCbGFja2xpc3QgPSB1c2VyUGFyc2VyQ29uZmlnLm91dHB1dHNCbGFja2xpc3Q7XG4gICAgfVxuXG4gICAgLy8gb3V0cHV0c1doaXRlbGlzdFxuICAgIGlmICh1c2VyUGFyc2VyQ29uZmlnLmhhc093blByb3BlcnR5KCdvdXRwdXRzV2hpdGVsaXN0JykpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh1c2VyUGFyc2VyQ29uZmlnLm91dHB1dHNXaGl0ZWxpc3QpKSB7IHRocm93IEVycm9yKCdUaGUgc3VibWl0dGVkIFwib3V0cHV0c1doaXRlbGlzdFwiIHByb3BlcnR5IGluIHRoZSBTZWxlY3Rvckhvb2tQYXJzZXJDb25maWcgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLicpOyB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHVzZXJQYXJzZXJDb25maWcub3V0cHV0c1doaXRlbGlzdCkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSAnc3RyaW5nJykgeyB0aHJvdyBFcnJvcignQWxsIGVudHJpZXMgb2YgdGhlIHN1Ym1pdHRlZCBcIm91dHB1dHNXaGl0ZWxpc3RcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcsICcgKyB0eXBlb2YgZW50cnkgKyAnIGZvdW5kLicpOyB9XG4gICAgICB9XG4gICAgICBwYXJzZXJDb25maWcub3V0cHV0c1doaXRlbGlzdCA9IHVzZXJQYXJzZXJDb25maWcub3V0cHV0c1doaXRlbGlzdDtcbiAgICB9XG5cbiAgICAvLyBhbGxvd0NvbnRleHRJbkJpbmRpbmdzXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuaGFzT3duUHJvcGVydHkoJ2FsbG93Q29udGV4dEluQmluZGluZ3MnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLmFsbG93Q29udGV4dEluQmluZGluZ3MgIT09ICdib29sZWFuJykgeyB0aHJvdyBFcnJvcignVGhlIHN1Ym1pdHRlZCBcImFsbG93Q29udGV4dEluQmluZGluZ3NcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgYmUgb2YgdHlwZSBib29sZWFuLCB3YXMgJyArIHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLmFsbG93Q29udGV4dEluQmluZGluZ3MpOyB9XG4gICAgICBwYXJzZXJDb25maWcuYWxsb3dDb250ZXh0SW5CaW5kaW5ncyA9IHVzZXJQYXJzZXJDb25maWcuYWxsb3dDb250ZXh0SW5CaW5kaW5ncztcbiAgICB9XG5cbiAgICAvLyBhbGxvd0NvbnRleHRGdW5jdGlvbkNhbGxzXG4gICAgaWYgKHVzZXJQYXJzZXJDb25maWcuaGFzT3duUHJvcGVydHkoJ2FsbG93Q29udGV4dEZ1bmN0aW9uQ2FsbHMnKSkge1xuICAgICAgaWYgKHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLmFsbG93Q29udGV4dEZ1bmN0aW9uQ2FsbHMgIT09ICdib29sZWFuJykgeyB0aHJvdyBFcnJvcignVGhlIHN1Ym1pdHRlZCBcImFsbG93Q29udGV4dEZ1bmN0aW9uQ2FsbHNcIiBwcm9wZXJ0eSBpbiB0aGUgU2VsZWN0b3JIb29rUGFyc2VyQ29uZmlnIG11c3QgYmUgb2YgdHlwZSBib29sZWFuLCB3YXMgJyArIHR5cGVvZiB1c2VyUGFyc2VyQ29uZmlnLmFsbG93Q29udGV4dEZ1bmN0aW9uQ2FsbHMpOyB9XG4gICAgICBwYXJzZXJDb25maWcuYWxsb3dDb250ZXh0RnVuY3Rpb25DYWxscyA9IHVzZXJQYXJzZXJDb25maWcuYWxsb3dDb250ZXh0RnVuY3Rpb25DYWxscztcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VyQ29uZmlnIGFzIFNlbGVjdG9ySG9va1BhcnNlckNvbmZpZztcbiAgfVxufVxuIl19