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.

128 lines 17 kB
import { Injectable } from '@angular/core'; import { DynamicHooksInheritance } from './settings'; import { getParseOptionDefaults } from './options'; import * as i0 from "@angular/core"; import * as i1 from "./parserEntryResolver"; /** * A helper class for resolving a combined settings object from all provided ones */ export class SettingsResolver { constructor(parserEntryResolver) { this.parserEntryResolver = parserEntryResolver; } /** * Takes all provided settings objects and combines them into a final settings object * * @param injector - The current injector * @param content - The content * @param allSettings - All settings provided anywhere * @param ancestorSettings - All ancestor settings * @param moduleSettings - The current module settings * @param localParsers - A list of local parsers * @param localOptions - A local options object * @param globalParsersBlacklist - A list of global parsers to blacklist * @param globalParsersWhitelist - A list of global parsers to whitelist */ resolve(injector, content, allSettings, ancestorSettings, moduleSettings, localParsers = null, localOptions = null, globalParsersBlacklist = null, globalParsersWhitelist = null) { let resolvedSettings = {}; allSettings = allSettings || []; ancestorSettings = ancestorSettings || []; moduleSettings = moduleSettings || {}; const defaultSettings = { options: getParseOptionDefaults() }; // Merge settings according to inheritance if (!moduleSettings.hasOwnProperty('inheritance') || moduleSettings.inheritance === DynamicHooksInheritance.Linear) { resolvedSettings = this.mergeSettings([ defaultSettings, ...ancestorSettings, { parsers: localParsers || undefined, options: localOptions || undefined } ]); } else if (moduleSettings.inheritance === DynamicHooksInheritance.All) { // Additionally merge ancestorSettings after allSettings to give settings closer to the current injector priority resolvedSettings = this.mergeSettings([ defaultSettings, ...allSettings, ...ancestorSettings, { options: localOptions || undefined } ]); } else { resolvedSettings = this.mergeSettings([ defaultSettings, moduleSettings || {}, { options: localOptions || undefined } ]); } const finalOptions = resolvedSettings.options; // Disabled sanitization if content is not string if (content && typeof content !== 'string') { finalOptions.sanitize = false; } // Process parsers entries. Local parsers fully replace global ones. let finalParsers = []; if (localParsers) { finalParsers = this.parserEntryResolver.resolve(localParsers, injector, null, null, finalOptions); } else if (resolvedSettings.parsers) { finalParsers = this.parserEntryResolver.resolve(resolvedSettings.parsers, injector, globalParsersBlacklist, globalParsersWhitelist, finalOptions); } return { parsers: finalParsers, options: finalOptions }; } /** * Merges multiple settings objects, overwriting previous ones with later ones in the provided array * * @param settingsArray - The settings objects to merge */ mergeSettings(settingsArray) { const mergedSettings = {}; for (const settings of settingsArray) { // Unique parsers are simply all collected, not overwritten if (settings.parsers !== undefined) { if (mergedSettings.parsers === undefined) { mergedSettings.parsers = []; } for (const parserEntry of settings.parsers) { if (!mergedSettings.parsers.includes(parserEntry)) { mergedSettings.parsers.push(parserEntry); } } } // Options are individually overwritten if (settings.options !== undefined) { if (mergedSettings.options === undefined) { mergedSettings.options = {}; } mergedSettings.options = this.recursiveAssign(mergedSettings.options, settings.options); } } return mergedSettings; } /** * Recursively merges two objects * * @param a - The target object to merge into * @param b - The other object being merged */ recursiveAssign(a, b) { if (Object(b) !== b) return b; if (Object(a) !== a) a = {}; for (const key in b) { a[key] = this.recursiveAssign(a[key], b[key]); } return a; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SettingsResolver, deps: [{ token: i1.ParserEntryResolver }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SettingsResolver, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SettingsResolver, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.ParserEntryResolver }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3NSZXNvbHZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1keW5hbWljLWhvb2tzL3NyYy9saWIvc2VydmljZXMvc2V0dGluZ3Mvc2V0dGluZ3NSZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVUsVUFBVSxFQUFzQixNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQXdCLHVCQUF1QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBSTNFLE9BQU8sRUFBZ0Isc0JBQXNCLEVBQUUsTUFBTSxXQUFXLENBQUM7OztBQUVqRTs7R0FFRztBQUlILE1BQU0sT0FBTyxnQkFBZ0I7SUFFM0IsWUFDVSxtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtJQUVsRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksT0FBTyxDQUNaLFFBQWtCLEVBQ2xCLE9BQVksRUFDWixXQUF3QyxFQUN4QyxnQkFBNkMsRUFDN0MsY0FBeUMsRUFDekMsZUFBdUMsSUFBSSxFQUMzQyxlQUFrQyxJQUFJLEVBQ3RDLHlCQUF3QyxJQUFJLEVBQzVDLHlCQUF3QyxJQUFJO1FBSzVDLElBQUksZ0JBQWdCLEdBQXlCLEVBQUUsQ0FBQztRQUNoRCxXQUFXLEdBQUcsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7UUFDMUMsY0FBYyxHQUFHLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDdEMsTUFBTSxlQUFlLEdBQXlCLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLEVBQUUsQ0FBQztRQUVwRiwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksY0FBYyxDQUFDLFdBQVcsS0FBSyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuSCxnQkFBZ0Is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QUFDLENBQUM7WUFDMUYsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxlQUFlLENBQUUsQ0FBTSxFQUFFLENBQU07UUFDckMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVCLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7K0dBcElVLGdCQUFnQjttSEFBaEIsZ0JBQWdCLGNBRmYsTUFBTTs7NEZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljSG9va3NTZXR0aW5ncywgRHluYW1pY0hvb2tzSW5oZXJpdGFuY2UgfSBmcm9tICcuL3NldHRpbmdzJztcbmltcG9ydCB7IFBhcnNlckVudHJ5UmVzb2x2ZXIgfSBmcm9tICcuL3BhcnNlckVudHJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgSG9va1BhcnNlckVudHJ5IH0gZnJvbSAnLi9wYXJzZXJFbnRyeSc7XG5pbXBvcnQgeyBIb29rUGFyc2VyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlc1B1YmxpYyc7XG5pbXBvcnQgeyBQYXJzZU9wdGlvbnMsIGdldFBhcnNlT3B0aW9uRGVmYXVsdHMgfSBmcm9tICcuL29wdGlvbnMnO1xuXG4vKipcbiAqIEEgaGVscGVyIGNsYXNzIGZvciByZXNvbHZpbmcgYSBjb21iaW5lZCBzZXR0aW5ncyBvYmplY3QgZnJvbSBhbGwgcHJvdmlkZWQgb25lc1xuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1Jlc29sdmVyIHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcnNlckVudHJ5UmVzb2x2ZXI6IFBhcnNlckVudHJ5UmVzb2x2ZXJcbiAgKSB7XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYWxsIHByb3ZpZGVkIHNldHRpbmdzIG9iamVjdHMgYW5kIGNvbWJpbmVzIHRoZW0gaW50byBhIGZpbmFsIHNldHRpbmdzIG9iamVjdFxuICAgKiBcbiAgICogQHBhcmFtIGluamVjdG9yIC0gVGhlIGN1cnJlbnQgaW5qZWN0b3JcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBUaGUgY29udGVudFxuICAgKiBAcGFyYW0gYWxsU2V0dGluZ3MgLSBBbGwgc2V0dGluZ3MgcHJvdmlkZWQgYW55d2hlcmVcbiAgICogQHBhcmFtIGFuY2VzdG9yU2V0dGluZ3MgLSBBbGwgYW5jZXN0b3Igc2V0dGluZ3NcbiAgICogQHBhcmFtIG1vZHVsZVNldHRpbmdzIC0gVGhlIGN1cnJlbnQgbW9kdWxlIHNldHRpbmdzXG4gICAqIEBwYXJhbSBsb2NhbFBhcnNlcnMgLSBBIGxpc3Qgb2YgbG9jYWwgcGFyc2Vyc1xuICAgKiBAcGFyYW0gbG9jYWxPcHRpb25zIC0gQSBsb2NhbCBvcHRpb25zIG9iamVjdFxuICAgKiBAcGFyYW0gZ2xvYmFsUGFyc2Vyc0JsYWNrbGlzdCAtIEEgbGlzdCBvZiBnbG9iYWwgcGFyc2VycyB0byBibGFja2xpc3RcbiAgICogQHBhcmFtIGdsb2JhbFBhcnNlcnNXaGl0ZWxpc3QgLSBBIGxpc3Qgb2YgZ2xvYmFsIHBhcnNlcnMgdG8gd2hpdGVsaXN0XG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZShcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgY29udGVudDogYW55LFxuICAgIGFsbFNldHRpbmdzOiBEeW5hbWljSG9va3NTZXR0aW5nc1tdfG51bGwsXG4gICAgYW5jZXN0b3JTZXR0aW5nczogRHluYW1pY0hvb2tzU2V0dGluZ3NbXXxudWxsLFxuICAgIG1vZHVsZVNldHRpbmdzOiBEeW5hbWljSG9va3NTZXR0aW5nc3xudWxsLCBcbiAgICBsb2NhbFBhcnNlcnM6IEhvb2tQYXJzZXJFbnRyeVtdfG51bGwgPSBudWxsLCBcbiAgICBsb2NhbE9wdGlvbnM6IFBhcnNlT3B0aW9uc3xudWxsID0gbnVsbCxcbiAgICBnbG9iYWxQYXJzZXJzQmxhY2tsaXN0OiBzdHJpbmdbXXxudWxsID0gbnVsbCxcbiAgICBnbG9iYWxQYXJzZXJzV2hpdGVsaXN0OiBzdHJpbmdbXXxudWxsID0gbnVsbCxcbiAgKToge1xuICAgIHBhcnNlcnM6IEhvb2tQYXJzZXJbXTtcbiAgICBvcHRpb25zOiBQYXJzZU9wdGlvbnM7XG4gIH0ge1xuICAgIGxldCByZXNvbHZlZFNldHRpbmdzOiBEeW5hbWljSG9va3NTZXR0aW5ncyA9IHt9O1xuICAgIGFsbFNldHRpbmdzID0gYWxsU2V0dGluZ3MgfHwgW107XG4gICAgYW5jZXN0b3JTZXR0aW5ncyA9IGFuY2VzdG9yU2V0dGluZ3MgfHwgW107XG4gICAgbW9kdWxlU2V0dGluZ3MgPSBtb2R1bGVTZXR0aW5ncyB8fCB7fTtcbiAgICBjb25zdCBkZWZhdWx0U2V0dGluZ3M6IER5bmFtaWNIb29rc1NldHRpbmdzID0geyBvcHRpb25zOiBnZXRQYXJzZU9wdGlvbkRlZmF1bHRzKCkgfTtcblxuICAgIC8vIE1lcmdlIHNldHRpbmdzIGFjY29yZGluZyB0byBpbmhlcml0YW5jZVxuICAgIGlmICghbW9kdWxlU2V0dGluZ3MuaGFzT3duUHJvcGVydHkoJ2luaGVyaXRhbmNlJykgfHwgbW9kdWxlU2V0dGluZ3MuaW5oZXJpdGFuY2UgPT09IER5bmFtaWNIb29rc0luaGVyaXRhbmNlLkxpbmVhcikge1xuICAgICAgcmVzb2x2ZWRTZXR0aW5ncyA9IHRoaXMubWVyZ2VTZXR0aW5ncyhbXG4gICAgICAgIGRlZmF1bHRTZXR0aW5ncyxcbiAgICAgICAgLi4uYW5jZXN0b3JTZXR0aW5ncyxcbiAgICAgICAge3BhcnNlcnM6IGxvY2FsUGFyc2VycyB8fCB1bmRlZmluZWQsIG9wdGlvbnM6IGxvY2FsT3B0aW9ucyB8fCB1bmRlZmluZWR9XG4gICAgICBdKTtcblxuICAgIH0gZWxzZSBpZiAobW9kdWxlU2V0dGluZ3MuaW5oZXJpdGFuY2UgPT09IER5bmFtaWNIb29rc0luaGVyaXRhbmNlLkFsbCkge1xuICAgICAgLy8gQWRkaXRpb25hbGx5IG1lcmdlIGFuY2VzdG9yU2V0dGluZ3MgYWZ0ZXIgYWxsU2V0dGluZ3MgdG8gZ2l2ZSBzZXR0aW5ncyBjbG9zZXIgdG8gdGhlIGN1cnJlbnQgaW5qZWN0b3IgcHJpb3JpdHlcbiAgICAgIHJlc29sdmVkU2V0dGluZ3MgPSB0aGlzLm1lcmdlU2V0dGluZ3MoW1xuICAgICAgICBkZWZhdWx0U2V0dGluZ3MsXG4gICAgICAgIC4uLmFsbFNldHRpbmdzLCBcbiAgICAgICAgLi4uYW5jZXN0b3JTZXR0aW5ncyxcbiAgICAgICAge29wdGlvbnM6IGxvY2FsT3B0aW9ucyB8fCB1bmRlZmluZWR9XG4gICAgICBdKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlZFNldHRpbmdzID0gdGhpcy5tZXJnZVNldHRpbmdzKFtcbiAgICAgICAgZGVmYXVsdFNldHRpbmdzLFxuICAgICAgICBtb2R1bGVTZXR0aW5ncyB8fCB7fSxcbiAgICAgICAge29wdGlvbnM6IGxvY2FsT3B0aW9ucyB8fCB1bmRlZmluZWR9XG4gICAgICBdKSAgXG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gcmVzb2x2ZWRTZXR0aW5ncy5vcHRpb25zITtcblxuICAgIC8vIERpc2FibGVkIHNhbml0aXphdGlvbiBpZiBjb250ZW50IGlzIG5vdCBzdHJpbmdcbiAgICBpZiAoY29udGVudCAmJiB0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGZpbmFsT3B0aW9ucy5zYW5pdGl6ZSA9IGZhbHNlO1xuICB9XG4gICAgXG4gICAgLy8gUHJvY2VzcyBwYXJzZXJzIGVudHJpZXMuIExvY2FsIHBhcnNlcnMgZnVsbHkgcmVwbGFjZSBnbG9iYWwgb25lcy5cbiAgICBsZXQgZmluYWxQYXJzZXJzOiBIb29rUGFyc2VyW10gPSBbXTtcbiAgICBpZiAobG9jYWxQYXJzZXJzKSB7XG4gICAgICBmaW5hbFBhcnNlcnMgPSB0aGlzLnBhcnNlckVudHJ5UmVzb2x2ZXIucmVzb2x2ZShsb2NhbFBhcnNlcnMsIGluamVjdG9yLCBudWxsLCBudWxsLCBmaW5hbE9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAocmVzb2x2ZWRTZXR0aW5ncy5wYXJzZXJzKSB7XG4gICAgICBmaW5hbFBhcnNlcnMgPSB0aGlzLnBhcnNlckVudHJ5UmVzb2x2ZXIucmVzb2x2ZShyZXNvbHZlZFNldHRpbmdzLnBhcnNlcnMsIGluamVjdG9yLCBnbG9iYWxQYXJzZXJzQmxhY2tsaXN0LCBnbG9iYWxQYXJzZXJzV2hpdGVsaXN0LCBmaW5hbE9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwYXJzZXJzOiBmaW5hbFBhcnNlcnMsXG4gICAgICBvcHRpb25zOiBmaW5hbE9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlcyBtdWx0aXBsZSBzZXR0aW5ncyBvYmplY3RzLCBvdmVyd3JpdGluZyBwcmV2aW91cyBvbmVzIHdpdGggbGF0ZXIgb25lcyBpbiB0aGUgcHJvdmlkZWQgYXJyYXlcbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzQXJyYXkgLSBUaGUgc2V0dGluZ3Mgb2JqZWN0cyB0byBtZXJnZVxuICAgKi9cbiAgcHJpdmF0ZSBtZXJnZVNldHRpbmdzKHNldHRpbmdzQXJyYXk6IER5bmFtaWNIb29rc1NldHRpbmdzW10pOiBEeW5hbWljSG9va3NTZXR0aW5ncyB7XG4gICAgY29uc3QgbWVyZ2VkU2V0dGluZ3M6IER5bmFtaWNIb29rc1NldHRpbmdzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHNldHRpbmdzIG9mIHNldHRpbmdzQXJyYXkpIHtcbiAgICAgIC8vIFVuaXF1ZSBwYXJzZXJzIGFyZSBzaW1wbHkgYWxsIGNvbGxlY3RlZCwgbm90IG92ZXJ3cml0dGVuXG4gICAgICBpZiAoc2V0dGluZ3MucGFyc2VycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChtZXJnZWRTZXR0aW5ncy5wYXJzZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBtZXJnZWRTZXR0aW5ncy5wYXJzZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwYXJzZXJFbnRyeSBvZiBzZXR0aW5ncy5wYXJzZXJzKSB7XG4gICAgICAgICAgaWYgKCFtZXJnZWRTZXR0aW5ncy5wYXJzZXJzLmluY2x1ZGVzKHBhcnNlckVudHJ5KSkge1xuICAgICAgICAgICAgbWVyZ2VkU2V0dGluZ3MucGFyc2Vycy5wdXNoKHBhcnNlckVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9wdGlvbnMgYXJlIGluZGl2aWR1YWxseSBvdmVyd3JpdHRlblxuICAgICAgaWYgKHNldHRpbmdzLm9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobWVyZ2VkU2V0dGluZ3Mub3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbWVyZ2VkU2V0dGluZ3Mub3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgbWVyZ2VkU2V0dGluZ3Mub3B0aW9ucyA9IHRoaXMucmVjdXJzaXZlQXNzaWduKG1lcmdlZFNldHRpbmdzLm9wdGlvbnMsIHNldHRpbmdzLm9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWRTZXR0aW5ncztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBtZXJnZXMgdHdvIG9iamVjdHNcbiAgICogXG4gICAqIEBwYXJhbSBhIC0gVGhlIHRhcmdldCBvYmplY3QgdG8gbWVyZ2UgaW50b1xuICAgKiBAcGFyYW0gYiAtIFRoZSBvdGhlciBvYmplY3QgYmVpbmcgbWVyZ2VkXG4gICAqL1xuICBwcml2YXRlIHJlY3Vyc2l2ZUFzc2lnbiAoYTogYW55LCBiOiBhbnkpIHtcbiAgICBpZiAoT2JqZWN0KGIpICE9PSBiKSByZXR1cm4gYjtcbiAgICBpZiAoT2JqZWN0KGEpICE9PSBhKSBhID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYikge1xuICAgICAgICBhW2tleV0gPSB0aGlzLnJlY3Vyc2l2ZUFzc2lnbihhW2tleV0sIGJba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9XG5cbn1cbiJdfQ==