"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ const core_1 = require("@angular-devkit/core"); const from_1 = require("rxjs/observable/from"); const operators_1 = require("rxjs/operators"); const interface_1 = require("../tree/interface"); const null_1 = require("../tree/null"); const static_1 = require("../tree/static"); const collection_1 = require("./collection"); const schematic_1 = require("./schematic"); const task_1 = require("./task"); class UnknownUrlSourceProtocol extends core_1.BaseException { constructor(url) { super(`Unknown Protocol on url "${url}".`); } } exports.UnknownUrlSourceProtocol = UnknownUrlSourceProtocol; class UnknownCollectionException extends core_1.BaseException { constructor(name) { super(`Unknown collection "${name}".`); } } exports.UnknownCollectionException = UnknownCollectionException; class UnknownSchematicException extends core_1.BaseException { constructor(name, collection) { super(`Schematic "${name}" not found in collection "${collection.name}".`); } } exports.UnknownSchematicException = UnknownSchematicException; class SchematicEngineConflictingException extends core_1.BaseException { constructor() { super(`A schematic was called from a different engine as its parent.`); } } exports.SchematicEngineConflictingException = SchematicEngineConflictingException; class UnregisteredTaskException extends core_1.BaseException { constructor(name, schematic) { const addendum = schematic ? ` in schematic "${schematic.name}"` : ''; super(`Unregistered task "${name}"${addendum}.`); } } exports.UnregisteredTaskException = UnregisteredTaskException; class SchematicEngine { constructor(_host) { this._host = _host; this._collectionCache = new Map(); this._schematicCache = new Map(); this._taskSchedulers = new Array(); } get defaultMergeStrategy() { return this._host.defaultMergeStrategy || interface_1.MergeStrategy.Default; } createCollection(name) { let collection = this._collectionCache.get(name); if (collection) { return collection; } const description = this._host.createCollectionDescription(name); if (!description) { throw new UnknownCollectionException(name); } collection = new collection_1.CollectionImpl(description, this); this._collectionCache.set(name, collection); this._schematicCache.set(name, new Map()); return collection; } createContext(schematic, parent) { // Check for inconsistencies. if (parent && parent.engine && parent.engine !== this) { throw new SchematicEngineConflictingException(); } const context = { debug: parent && parent.debug || false, engine: this, logger: (parent && parent.logger && parent.logger.createChild(schematic.description.name)) || new core_1.logging.NullLogger(), schematic, strategy: (parent && parent.strategy !== undefined) ? parent.strategy : this.defaultMergeStrategy, addTask, }; const taskScheduler = new task_1.TaskScheduler(context); const host = this._host; this._taskSchedulers.push(taskScheduler); function addTask(task, dependencies) { const config = task.toConfiguration(); if (!host.hasTaskExecutor(config.name)) { throw new UnregisteredTaskException(config.name, schematic.description); } config.dependencies = config.dependencies || []; if (dependencies) { config.dependencies.unshift(...dependencies); } return taskScheduler.schedule(config); } return context; } createSchematic(name, collection) { const collectionImpl = this._collectionCache.get(collection.description.name); const schematicMap = this._schematicCache.get(collection.description.name); if (!collectionImpl || !schematicMap || collectionImpl !== collection) { // This is weird, maybe the collection was created by another engine? throw new UnknownCollectionException(collection.description.name); } let schematic = schematicMap.get(name); if (schematic) { return schematic; } const description = this._host.createSchematicDescription(name, collection.description); if (!description) { throw new UnknownSchematicException(name, collection.description); } const factory = this._host.getSchematicRuleFactory(description, collection.description); schematic = new schematic_1.SchematicImpl(description, factory, collection, this); schematicMap.set(name, schematic); return schematic; } listSchematicNames(collection) { return this._host.listSchematicNames(collection.description); } transformOptions(schematic, options) { return this._host.transformOptions(schematic.description, options); } createSourceFromUrl(url, context) { switch (url.protocol) { case 'null:': return () => new null_1.NullTree(); case 'empty:': return () => static_1.empty(); default: const hostSource = this._host.createSourceFromUrl(url, context); if (!hostSource) { throw new UnknownUrlSourceProtocol(url.toString()); } return hostSource; } } executePostTasks() { const executors = new Map(); const taskObservable = from_1.from(this._taskSchedulers) .pipe(operators_1.concatMap(scheduler => scheduler.finalize()), operators_1.concatMap(task => { const { name, options } = task.configuration; const executor = executors.get(name); if (executor) { return executor(options, task.context); } return this._host.createTaskExecutor(name) .pipe(operators_1.concatMap(executor => { executors.set(name, executor); return executor(options, task.context); })); })); return taskObservable; } } exports.SchematicEngine = SchematicEngine; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9oYW5zbC9Tb3VyY2VzL2hhbnNsL2RldmtpdC8iLCJzb3VyY2VzIjpbInBhY2thZ2VzL2FuZ3VsYXJfZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL2VuZ2luZS9lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0dBTUc7QUFDSCwrQ0FBOEQ7QUFPOUQsK0NBQThEO0FBQzlELDhDQUEyQztBQUUzQyxpREFBa0Q7QUFDbEQsdUNBQXdDO0FBQ3hDLDJDQUF1QztBQUN2Qyw2Q0FBOEM7QUFROUMsMkNBQTRDO0FBQzVDLGlDQUtnQjtBQUdoQiw4QkFBc0MsU0FBUSxvQkFBYTtJQUN6RCxZQUFZLEdBQVcsSUFBSSxLQUFLLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3pFO0FBRkQsNERBRUM7QUFFRCxnQ0FBd0MsU0FBUSxvQkFBYTtJQUMzRCxZQUFZLElBQVksSUFBSSxLQUFLLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3RFO0FBRkQsZ0VBRUM7QUFDRCwrQkFBdUMsU0FBUSxvQkFBYTtJQUMxRCxZQUFZLElBQVksRUFBRSxVQUFxQztRQUM3RCxLQUFLLENBQUMsY0FBYyxJQUFJLDhCQUE4QixVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUM3RSxDQUFDO0NBQ0Y7QUFKRCw4REFJQztBQUVELHlDQUFpRCxTQUFRLG9CQUFhO0lBQ3BFLGdCQUFnQixLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDMUY7QUFGRCxrRkFFQztBQUVELCtCQUF1QyxTQUFRLG9CQUFhO0lBQzFELFlBQVksSUFBWSxFQUFFLFNBQXdDO1FBQ2hFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FB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SixNQUFNLENBQUMsY0FBYyxDQUFDO0lBQ3hCLENBQUM7Q0FDRjtBQTFKRCwwQ0EwSkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uLCBsb2dnaW5nIH0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29sbGVjdGlvbkRlc2NyaXB0aW9uLFxuICBTY2hlbWF0aWNEZXNjcmlwdGlvbixcbiAgVHlwZWRTY2hlbWF0aWNDb250ZXh0LFxuIH0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3MnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBmcm9tIGFzIG9ic2VydmFibGVGcm9tIH0gZnJvbSAncnhqcy9vYnNlcnZhYmxlL2Zyb20nO1xuaW1wb3J0IHsgY29uY2F0TWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVXJsIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IE1lcmdlU3RyYXRlZ3kgfSBmcm9tICcuLi90cmVlL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBOdWxsVHJlZSB9IGZyb20gJy4uL3RyZWUvbnVsbCc7XG5pbXBvcnQgeyBlbXB0eSB9IGZyb20gJy4uL3RyZWUvc3RhdGljJztcbmltcG9ydCB7IENvbGxlY3Rpb25JbXBsIH0gZnJvbSAnLi9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIENvbGxlY3Rpb24sXG4gIEVuZ2luZSxcbiAgRW5naW5lSG9zdCxcbiAgU2NoZW1hdGljLFxuICBTb3VyY2UsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFNjaGVtYXRpY0ltcGwgfSBmcm9tICcuL3NjaGVtYXRpYyc7XG5pbXBvcnQge1xuICBUYXNrQ29uZmlndXJhdGlvbkdlbmVyYXRvcixcbiAgVGFza0V4ZWN1dG9yLFxuICBUYXNrSWQsXG4gIFRhc2tTY2hlZHVsZXIsXG59IGZyb20gJy4vdGFzayc7XG5cblxuZXhwb3J0IGNsYXNzIFVua25vd25VcmxTb3VyY2VQcm90b2NvbCBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcih1cmw6IHN0cmluZykgeyBzdXBlcihgVW5rbm93biBQcm90b2NvbCBvbiB1cmwgXCIke3VybH1cIi5gKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5rbm93bkNvbGxlY3Rpb25FeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7IHN1cGVyKGBVbmtub3duIGNvbGxlY3Rpb24gXCIke25hbWV9XCIuYCk7IH1cbn1cbmV4cG9ydCBjbGFzcyBVbmtub3duU2NoZW1hdGljRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY29sbGVjdGlvbjogQ29sbGVjdGlvbkRlc2NyaXB0aW9uPHt9Pikge1xuICAgIHN1cGVyKGBTY2hlbWF0aWMgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIGNvbGxlY3Rpb24gXCIke2NvbGxlY3Rpb24ubmFtZX1cIi5gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hdGljRW5naW5lQ29uZmxpY3RpbmdFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoKSB7IHN1cGVyKGBBIHNjaGVtYXRpYyB3YXMgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgZW5naW5lIGFzIGl0cyBwYXJlbnQuYCk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIFVucmVnaXN0ZXJlZFRhc2tFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzY2hlbWF0aWM/OiBTY2hlbWF0aWNEZXNjcmlwdGlvbjx7fSwge30+KSB7XG4gICAgY29uc3QgYWRkZW5kdW0gPSBzY2hlbWF0aWMgPyBgIGluIHNjaGVtYXRpYyBcIiR7c2NoZW1hdGljLm5hbWV9XCJgIDogJyc7XG4gICAgc3VwZXIoYFVucmVnaXN0ZXJlZCB0YXNrIFwiJHtuYW1lfVwiJHthZGRlbmR1bX0uYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYXRpY0VuZ2luZTxDb2xsZWN0aW9uVCBleHRlbmRzIG9iamVjdCwgU2NoZW1hdGljVCBleHRlbmRzIG9iamVjdD5cbiAgICBpbXBsZW1lbnRzIEVuZ2luZTxDb2xsZWN0aW9uVCwgU2NoZW1hdGljVD4ge1xuXG4gIHByaXZhdGUgX2NvbGxlY3Rpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBDb2xsZWN0aW9uSW1wbDxDb2xsZWN0aW9uVCwgU2NoZW1hdGljVD4+KCk7XG4gIHByaXZhdGUgX3NjaGVtYXRpY0NhY2hlXG4gICAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgU2NoZW1hdGljSW1wbDxDb2xsZWN0aW9uVCwgU2NoZW1hdGljVD4+PigpO1xuICBwcml2YXRlIF90YXNrU2NoZWR1bGVycyA9IG5ldyBBcnJheTxUYXNrU2NoZWR1bGVyPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2hvc3Q6IEVuZ2luZUhvc3Q8Q29sbGVjdGlvblQsIFNjaGVtYXRpY1Q+KSB7XG4gIH1cblxuICBnZXQgZGVmYXVsdE1lcmdlU3RyYXRlZ3koKSB7IHJldHVybiB0aGlzLl9ob3N0LmRlZmF1bHRNZXJnZVN0cmF0ZWd5IHx8IE1lcmdlU3RyYXRlZ3kuRGVmYXVsdDsgfVxuXG4gIGNyZWF0ZUNvbGxlY3Rpb24obmFtZTogc3RyaW5nKTogQ29sbGVjdGlvbjxDb2xsZWN0aW9uVCwgU2NoZW1hdGljVD4ge1xuICAgIGxldCBjb2xsZWN0aW9uID0gdGhpcy5fY29sbGVjdGlvbkNhY2hlLmdldChuYW1lKTtcbiAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLl9ob3N0LmNyZWF0ZUNvbGxlY3Rpb25EZXNjcmlwdGlvbihuYW1lKTtcbiAgICBpZiAoIWRlc2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVW5rbm93bkNvbGxlY3Rpb25FeGNlcHRpb24obmFtZSk7XG4gICAgfVxuXG4gICAgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uSW1wbDxDb2xsZWN0aW9uVCwgU2NoZW1hdGljVD4oZGVzY3JpcHRpb24sIHRoaXMpO1xuICAgIHRoaXMuX2NvbGxlY3Rpb25DYWNoZS5zZXQobmFtZSwgY29sbGVjdGlvbik7XG4gICAgdGhpcy5fc2NoZW1hdGljQ2FjaGUuc2V0KG5hbWUsIG5ldyBNYXAoKSk7XG5cbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfVxuXG4gIGNyZWF0ZUNvbnRleHQoXG4gICAgc2NoZW1hdGljOiBTY2hlbWF0aWM8Q29sbGVjdGlvblQsIFNjaGVtYXRpY1Q+LFxuICAgIHBhcmVudD86IFBhcnRpYWw8VHlwZWRTY2hlbWF0aWNDb250ZXh0PENvbGxlY3Rpb25ULCBTY2hlbWF0aWNUPj4sXG4gICk6IFR5cGVkU2NoZW1hdGljQ29udGV4dDxDb2xsZWN0aW9uVCwgU2NoZW1hdGljVD4ge1xuICAgIC8vIENoZWNrIGZvciBpbmNvbnNpc3RlbmNpZXMuXG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuZW5naW5lICYmIHBhcmVudC5lbmdpbmUgIT09IHRoaXMpIHtcbiAgICAgIHRocm93IG5ldyBTY2hlbWF0aWNFbmdpbmVDb25mbGljdGluZ0V4Y2VwdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBkZWJ1ZzogcGFyZW50ICYmIHBhcmVudC5kZWJ1ZyB8fCBmYWxzZSxcbiAgICAgIGVuZ2luZTogdGhpcyxcbiAgICAgIGxvZ2dlcjogKHBhcmVudCAmJiBwYXJlbnQubG9nZ2VyICYmIHBhcmVudC5sb2dnZXIuY3JlYXRlQ2hpbGQoc2NoZW1hdGljLmRlc2NyaXB0aW9uLm5hbWUpKVxuICAgICAgICAgICAgICB8fCBuZXcgbG9nZ2luZy5OdWxsTG9nZ2VyKCksXG4gICAgICBzY2hlbWF0aWMsXG4gICAgICBzdHJhdGVneTogKHBhcmVudCAmJiBwYXJlbnQuc3RyYXRlZ3kgIT09IHVuZGVmaW5lZClcbiAgICAgICAgPyBwYXJlbnQuc3RyYXRlZ3kgOiB0aGlzLmRlZmF1bHRNZXJnZVN0cmF0ZWd5LFxuICAgICAgYWRkVGFzayxcbiAgICB9O1xuXG4gICAgY29uc3QgdGFza1NjaGVkdWxlciA9IG5ldyBUYXNrU2NoZWR1bGVyKGNvbnRleHQpO1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLl9ob3N0O1xuICAgIHRoaXMuX3Rhc2tTY2hlZHVsZXJzLnB1c2godGFza1NjaGVkdWxlcik7XG5cbiAgICBmdW5jdGlvbiBhZGRUYXNrPFQ+KFxuICAgICAgdGFzazogVGFza0NvbmZpZ3VyYXRpb25HZW5lcmF0b3I8VD4sXG4gICAgICBkZXBlbmRlbmNpZXM/OiBBcnJheTxUYXNrSWQ+LFxuICAgICk6IFRhc2tJZCB7XG4gICAgICBjb25zdCBjb25maWcgPSB0YXNrLnRvQ29uZmlndXJhdGlvbigpO1xuXG4gICAgICBpZiAoIWhvc3QuaGFzVGFza0V4ZWN1dG9yKGNvbmZpZy5uYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5yZWdpc3RlcmVkVGFza0V4Y2VwdGlvbihjb25maWcubmFtZSwgc2NoZW1hdGljLmRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgY29uZmlnLmRlcGVuZGVuY2llcyA9IGNvbmZpZy5kZXBlbmRlbmNpZXMgfHwgW107XG4gICAgICBpZiAoZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGNvbmZpZy5kZXBlbmRlbmNpZXMudW5zaGlmdCguLi5kZXBlbmRlbmNpZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFza1NjaGVkdWxlci5zY2hlZHVsZShjb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG5cbiAgY3JlYXRlU2NoZW1hdGljKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgY29sbGVjdGlvbjogQ29sbGVjdGlvbjxDb2xsZWN0aW9uVCwgU2NoZW1hdGljVD4pOiBTY2hlbWF0aWM8Q29sbGVjdGlvblQsIFNjaGVtYXRpY1Q+IHtcbiAgICBjb25zdCBjb2xsZWN0aW9uSW1wbCA9IHRoaXMuX2NvbGxlY3Rpb25DYWNoZS5nZXQoY29sbGVjdGlvbi5kZXNjcmlwdGlvbi5uYW1lKTtcbiAgICBjb25zdCBzY2hlbWF0aWNNYXAgPSB0aGlzLl9zY2hlbWF0aWNDYWNoZS5nZXQoY29sbGVjdGlvbi5kZXNjcmlwdGlvbi5uYW1lKTtcbiAgICBpZiAoIWNvbGxlY3Rpb25JbXBsIHx8ICFzY2hlbWF0aWNNYXAgfHwgY29sbGVjdGlvbkltcGwgIT09IGNvbGxlY3Rpb24pIHtcbiAgICAgIC8vIFRoaXMgaXMgd2VpcmQsIG1heWJlIHRoZSBjb2xsZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IGFub3RoZXIgZW5naW5lP1xuICAgICAgdGhyb3cgbmV3IFVua25vd25Db2xsZWN0aW9uRXhjZXB0aW9uKGNvbGxlY3Rpb24uZGVzY3JpcHRpb24ubmFtZSk7XG4gICAgfVxuXG4gICAgbGV0IHNjaGVtYXRpYyA9IHNjaGVtYXRpY01hcC5nZXQobmFtZSk7XG4gICAgaWYgKHNjaGVtYXRpYykge1xuICAgICAgcmV0dXJuIHNjaGVtYXRpYztcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMuX2hvc3QuY3JlYXRlU2NoZW1hdGljRGVzY3JpcHRpb24obmFtZSwgY29sbGVjdGlvbi5kZXNjcmlwdGlvbik7XG4gICAgaWYgKCFkZXNjcmlwdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFVua25vd25TY2hlbWF0aWNFeGNlcHRpb24obmFtZSwgY29sbGVjdGlvbi5kZXNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuX2hvc3QuZ2V0U2NoZW1hdGljUnVsZUZhY3RvcnkoZGVzY3JpcHRpb24sIGNvbGxlY3Rpb24uZGVzY3JpcHRpb24pO1xuICAgIHNjaGVtYXRpYyA9IG5ldyBTY2hlbWF0aWNJbXBsPENvbGxlY3Rpb25ULCBTY2hlbWF0aWNUPihkZXNjcmlwdGlvbiwgZmFjdG9yeSwgY29sbGVjdGlvbiwgdGhpcyk7XG5cbiAgICBzY2hlbWF0aWNNYXAuc2V0KG5hbWUsIHNjaGVtYXRpYyk7XG5cbiAgICByZXR1cm4gc2NoZW1hdGljO1xuICB9XG5cbiAgbGlzdFNjaGVtYXRpY05hbWVzKGNvbGxlY3Rpb246IENvbGxlY3Rpb248Q29sbGVjdGlvblQsIFNjaGVtYXRpY1Q+KSB7XG4gICAgcmV0dXJuIHRoaXMuX2hvc3QubGlzdFNjaGVtYXRpY05hbWVzKGNvbGxlY3Rpb24uZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgdHJhbnNmb3JtT3B0aW9uczxPcHRpb25UIGV4dGVuZHMgb2JqZWN0LCBSZXN1bHRUIGV4dGVuZHMgb2JqZWN0PihcbiAgICBzY2hlbWF0aWM6IFNjaGVtYXRpYzxDb2xsZWN0aW9uVCwgU2NoZW1hdGljVD4sXG4gICAgb3B0aW9uczogT3B0aW9uVCxcbiAgKTogT2JzZXJ2YWJsZTxSZXN1bHRUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2hvc3QudHJhbnNmb3JtT3B0aW9uczxPcHRpb25ULCBSZXN1bHRUPihzY2hlbWF0aWMuZGVzY3JpcHRpb24sIG9wdGlvbnMpO1xuICB9XG5cbiAgY3JlYXRlU291cmNlRnJvbVVybCh1cmw6IFVybCwgY29udGV4dDogVHlwZWRTY2hlbWF0aWNDb250ZXh0PENvbGxlY3Rpb25ULCBTY2hlbWF0aWNUPik6IFNvdXJjZSB7XG4gICAgc3dpdGNoICh1cmwucHJvdG9jb2wpIHtcbiAgICAgIGNhc2UgJ251bGw6JzogcmV0dXJuICgpID0+IG5ldyBOdWxsVHJlZSgpO1xuICAgICAgY2FzZSAnZW1wdHk6JzogcmV0dXJuICgpID0+IGVtcHR5KCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zdCBob3N0U291cmNlID0gdGhpcy5faG9zdC5jcmVhdGVTb3VyY2VGcm9tVXJsKHVybCwgY29udGV4dCk7XG4gICAgICAgIGlmICghaG9zdFNvdXJjZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmtub3duVXJsU291cmNlUHJvdG9jb2wodXJsLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhvc3RTb3VyY2U7XG4gICAgfVxuICB9XG5cbiAgZXhlY3V0ZVBvc3RUYXNrcygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBleGVjdXRvcnMgPSBuZXcgTWFwPHN0cmluZywgVGFza0V4ZWN1dG9yPigpO1xuXG4gICAgY29uc3QgdGFza09ic2VydmFibGUgPSBvYnNlcnZhYmxlRnJvbSh0aGlzLl90YXNrU2NoZWR1bGVycylcbiAgICAgIC5waXBlKFxuICAgICAgICBjb25jYXRNYXAoc2NoZWR1bGVyID0+IHNjaGVkdWxlci5maW5hbGl6ZSgpKSxcbiAgICAgICAgY29uY2F0TWFwKHRhc2sgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSwgb3B0aW9ucyB9ID0gdGFzay5jb25maWd1cmF0aW9uO1xuXG4gICAgICAgICAgY29uc3QgZXhlY3V0b3IgPSBleGVjdXRvcnMuZ2V0KG5hbWUpO1xuICAgICAgICAgIGlmIChleGVjdXRvcikge1xuICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dG9yKG9wdGlvbnMsIHRhc2suY29udGV4dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3QuY3JlYXRlVGFza0V4ZWN1dG9yKG5hbWUpXG4gICAgICAgICAgICAucGlwZShjb25jYXRNYXAoZXhlY3V0b3IgPT4ge1xuICAgICAgICAgICAgICBleGVjdXRvcnMuc2V0KG5hbWUsIGV4ZWN1dG9yKTtcblxuICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0b3Iob3B0aW9ucywgdGFzay5jb250ZXh0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHRhc2tPYnNlcnZhYmxlO1xuICB9XG59XG4iXX0=