UNPKG

projen

Version:

CDK for software projects

212 lines • 21.3 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.Tasks = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const fs = __importStar(require("fs")); const path = __importStar(require("path")); const component_1 = require("./component"); const logging_1 = require("./logging"); const task_1 = require("./task"); const task_runner_1 = require("./task-runner"); /** * Defines and manages project tasks. * * Tasks extend the projen CLI by adding subcommands to it. Task definitions are * synthesized into `.projen/tasks.json`. */ class Tasks extends component_1.Component { static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Tasks", version: "0.104.8" }; _tasks; _env; _shell; _runner; constructor(project) { super(project); this._tasks = {}; this._env = {}; // Eagerly create the default task runner. The runner is a component that // owns the `.projen/tasks.json` manifest, so it must be part of the // construct tree for the manifest to be synthesized. this._runner = new task_runner_1.ProjenTaskRunner(this); } /** * All tasks. */ get all() { return Object.values(this._tasks); } /** * Adds a task to a project. * @param name The name of the task * @param options Task options. */ addTask(name, options = {}) { if (name.trim() === "") { throw new Error("Task name must not be empty. Provide a non-empty name when calling addTask."); } const task = new task_1.Task(name, options); if (this._tasks[name]) { throw new Error(`A task with the name ${name} already exists. To override it, call removeTask first and then create the new task.`); } this._tasks[name] = task; return task; } /** * Removes a task from a project. * * @param name The name of the task to remove. * * @returns The `Task` that was removed, otherwise `undefined`. */ removeTask(name) { const dependentTasks = this.all.filter((task) => task.steps.find((step) => step.spawn == name)); if (dependentTasks.length > 0) { const errList = dependentTasks.map((depTask) => depTask.name).join(", "); throw new Error(`Unable to remove task "${name}" because the following tasks depend on it: ${errList}`); } const task = this._tasks[name]; if (task) { delete this._tasks[name]; return task; } else { return undefined; } } /** * Adds global environment. * @param name Environment variable name * @param value Value */ addEnvironment(name, value) { this._env[name] = value; } /** * Returns a copy of the currently global environment for this project. */ get env() { return { ...this._env, }; } /** * The default shell used to run all task commands, or `undefined` for the * built-in cross-platform projen shell. Individual tasks and steps can * override this. * @see {@link TaskCommonOptions.shell} */ get shell() { return this._shell; } /** * Sets the default shell used to run all task commands. */ set shell(shell) { this._shell = shell; } /** * Finds a task by name. Returns `undefined` if the task cannot be found. * @param name The name of the task */ tryFind(name) { return this._tasks[name]; } /** * Runs the specified task. * * @param name The name of the task to run. * @param args Arguments to pass to the task. */ runTask(name, args) { const task = this._tasks[name]; if (!task) { throw new Error(`cannot find command ${name}`); } this._runner.runTask(task, args); } synthesize() { if (this.project.ejected) { // Insert a task-runner script so that tasks can be run after ejecting fs.mkdirSync(path.join(this.project.outdir, "scripts"), { recursive: true, }); fs.copyFileSync( // The bundled task runner lives at <pkg>/lib/run-task.cjs. This file is // at src/ (ts-jest) or lib/ (compiled); in both cases // "../lib/run-task.cjs" resolves to the real bundle under lib/. path.join(__dirname, "..", "lib", "run-task.cjs"), path.join(this.project.outdir, "scripts", "run-task.cjs")); fs.chmodSync(path.join(this.project.outdir, "scripts", "run-task.cjs"), "755"); } } resolveTasksManifest(resolver) { const obj = { env: (() => this.renderEnv()), shell: (() => this._shell?._render()), tasks: (() => this.renderTasks()), }; return (resolver.resolve(obj, { omitEmpty: true, }) ?? undefined); } renderTasks() { const tasks = {}; for (const task of Object.values(this._tasks).sort((x, y) => x.name.localeCompare(y.name))) { tasks[task.name] = task._renderSpec(); } return tasks; } renderEnv() { return Object.keys(this._env).reduce((prev, curr) => ({ ...prev, [curr]: this.getEnvString(curr, this._env[curr]), }), {}); } /** * Ensure that environment variables are persisted as strings * to prevent type errors when parsing from tasks.json in future */ getEnvString(name, value) { if (typeof value !== "string" && value !== undefined) { (0, logging_1.warn)(`Received non-string value for environment variable ${name}. Value will be stringified.`); return String(value); } else { return value; } } } exports.Tasks = Tasks; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFza3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsMkNBQXdDO0FBRXhDLHVDQUFpQztBQUdqQyxpQ0FBOEI7QUFFOUIsK0NBQW1FO0FBR25FOzs7OztHQUtHO0FBQ0gsTUFBYSxLQUFNLFNBQVEscUJBQVM7O0lBQ2pCLE1BQU0sQ0FBMkI7SUFDakMsSUFBSSxDQUE2QjtJQUMxQyxNQUFNLENBQWE7SUFDbkIsT0FBTyxDQUFjO0lBRTdCLFlBQVksT0FBZ0I7UUFDMUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFZix5RUFBeUU7UUFDekUsb0VBQW9FO1FBQ3BFLHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksOEJBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxHQUFHO1FBQ1osT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE9BQU8sQ0FBQyxJQUFZLEVBQUUsVUFBdUIsRUFBRTtRQUNwRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUNiLDZFQUE2RSxDQUM5RSxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksV0FBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUs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UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxTQUFTO1FBQ2YsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQ2xDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNmLEdBQUcsSUFBSTtZQUNQLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqRCxDQUFDLEVBQ0YsRUFBRSxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssWUFBWSxDQUFDLElBQVksRUFBRSxLQUFVO1FBQzNDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyRCxJQUFBLGNBQUksRUFDRixzREFBc0QsSUFBSSw4QkFBOEIsQ0FDekYsQ0FBQztZQUNGLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQzs7QUF0TUgsc0JBdU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgSVJlc29sdmVyIH0gZnJvbSBcIi4vZmlsZVwiO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gXCIuL2xvZ2dpbmdcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCIuL3Byb2plY3RcIjtcbmltcG9ydCB0eXBlIHsgVGFza09wdGlvbnMgfSBmcm9tIFwiLi90YXNrXCI7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSBcIi4vdGFza1wiO1xuaW1wb3J0IHR5cGUgeyBUYXNrc01hbmlmZXN0LCBUYXNrU3BlYyB9IGZyb20gXCIuL3Rhc2stbW9kZWxcIjtcbmltcG9ydCB7IFByb2plblRhc2tSdW5uZXIsIHR5cGUgSVRhc2tSdW5uZXIgfSBmcm9tIFwiLi90YXNrLXJ1bm5lclwiO1xuaW1wb3J0IHR5cGUgeyBUYXNrU2hlbGwgfSBmcm9tIFwiLi90YXNrLXNoZWxsXCI7XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgbWFuYWdlcyBwcm9qZWN0IHRhc2tzLlxuICpcbiAqIFRhc2tzIGV4dGVuZCB0aGUgcHJvamVuIENMSSBieSBhZGRpbmcgc3ViY29tbWFuZHMgdG8gaXQuIFRhc2sgZGVmaW5pdGlvbnMgYXJlXG4gKiBzeW50aGVzaXplZCBpbnRvIGAucHJvamVuL3Rhc2tzLmpzb25gLlxuICovXG5leHBvcnQgY2xhc3MgVGFza3MgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IF90YXNrczogeyBbbmFtZTogc3RyaW5nXTogVGFzayB9O1xuICBwcml2YXRlIHJlYWRvbmx5IF9lbnY6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuICBwcml2YXRlIF9zaGVsbD86IFRhc2tTaGVsbDtcbiAgcHJpdmF0ZSBfcnVubmVyOiBJVGFza1J1bm5lcjtcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICB0aGlzLl90YXNrcyA9IHt9O1xuICAgIHRoaXMuX2VudiA9IHt9O1xuXG4gICAgLy8gRWFnZXJseSBjcmVhdGUgdGhlIGRlZmF1bHQgdGFzayBydW5uZXIuIFRoZSBydW5uZXIgaXMgYSBjb21wb25lbnQgdGhhdFxuICAgIC8vIG93bnMgdGhlIGAucHJvamVuL3Rhc2tzLmpzb25gIG1hbmlmZXN0LCBzbyBpdCBtdXN0IGJlIHBhcnQgb2YgdGhlXG4gICAgLy8gY29uc3RydWN0IHRyZWUgZm9yIHRoZSBtYW5pZmVzdCB0byBiZSBzeW50aGVzaXplZC5cbiAgICB0aGlzLl9ydW5uZXIgPSBuZXcgUHJvamVuVGFza1J1bm5lcih0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgdGFza3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl90YXNrcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHRhc2sgdG8gYSBwcm9qZWN0LlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFza1xuICAgKiBAcGFyYW0gb3B0aW9ucyBUYXNrIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgYWRkVGFzayhuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFRhc2tPcHRpb25zID0ge30pIHtcbiAgICBpZiAobmFtZS50cmltKCkgPT09IFwiXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJUYXNrIG5hbWUgbXVzdCBub3QgYmUgZW1wdHkuIFByb3ZpZGUgYSBub24tZW1wdHkgbmFtZSB3aGVuIGNhbGxpbmcgYWRkVGFzay5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHRhc2sgPSBuZXcgVGFzayhuYW1lLCBvcHRpb25zKTtcbiAgICBpZiAodGhpcy5fdGFza3NbbmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEEgdGFzayB3aXRoIHRoZSBuYW1lICR7bmFtZX0gYWxyZWFkeSBleGlzdHMuIFRvIG92ZXJyaWRlIGl0LCBjYWxsIHJlbW92ZVRhc2sgZmlyc3QgYW5kIHRoZW4gY3JlYXRlIHRoZSBuZXcgdGFzay5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fdGFza3NbbmFtZV0gPSB0YXNrO1xuICAgIHJldHVybiB0YXNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSB0YXNrIGZyb20gYSBwcm9qZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFzayB0byByZW1vdmUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBgVGFza2AgdGhhdCB3YXMgcmVtb3ZlZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRhc2sobmFtZTogc3RyaW5nKTogdW5kZWZpbmVkIHwgVGFzayB7XG4gICAgY29uc3QgZGVwZW5kZW50VGFza3MgPSB0aGlzLmFsbC5maWx0ZXIoKHRhc2spID0+XG4gICAgICB0YXNrLnN0ZXBzLmZpbmQoKHN0ZXApID0+IHN0ZXAuc3Bhd24gPT0gbmFtZSksXG4gICAgKTtcbiAgICBpZiAoZGVwZW5kZW50VGFza3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXJyTGlzdCA9IGRlcGVuZGVudFRhc2tzLm1hcCgoZGVwVGFzaykgPT4gZGVwVGFzay5uYW1lKS5qb2luKFwiLCBcIik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gcmVtb3ZlIHRhc2sgXCIke25hbWV9XCIgYmVjYXVzZSB0aGUgZm9sbG93aW5nIHRhc2tzIGRlcGVuZCBvbiBpdDogJHtlcnJMaXN0fWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRhc2sgPSB0aGlzLl90YXNrc1tuYW1lXTtcbiAgICBpZiAodGFzaykge1xuICAgICAgZGVsZXRlIHRoaXMuX3Rhc2tzW25hbWVdO1xuICAgICAgcmV0dXJuIHRhc2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZ2xvYmFsIGVudmlyb25tZW50LlxuICAgKiBAcGFyYW0gbmFtZSBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZVxuICAgKi9cbiAgcHVibGljIGFkZEVudmlyb25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2VudltuYW1lXSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBjdXJyZW50bHkgZ2xvYmFsIGVudmlyb25tZW50IGZvciB0aGlzIHByb2plY3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVudigpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5fZW52LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgc2hlbGwgdXNlZCB0byBydW4gYWxsIHRhc2sgY29tbWFuZHMsIG9yIGB1bmRlZmluZWRgIGZvciB0aGVcbiAgICogYnVpbHQtaW4gY3Jvc3MtcGxhdGZvcm0gcHJvamVuIHNoZWxsLiBJbmRpdmlkdWFsIHRhc2tzIGFuZCBzdGVwcyBjYW5cbiAgICogb3ZlcnJpZGUgdGhpcy5cbiAgICogQHNlZSB7QGxpbmsgVGFza0NvbW1vbk9wdGlvbnMuc2hlbGx9XG4gICAqL1xuICBwdWJsaWMgZ2V0IHNoZWxsKCk6IFRhc2tTaGVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRlZmF1bHQgc2hlbGwgdXNlZCB0byBydW4gYWxsIHRhc2sgY29tbWFuZHMuXG4gICAqL1xuICBwdWJsaWMgc2V0IHNoZWxsKHNoZWxsOiBUYXNrU2hlbGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zaGVsbCA9IHNoZWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgdGFzayBieSBuYW1lLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSB0YXNrIGNhbm5vdCBiZSBmb3VuZC5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhc2tcbiAgICovXG4gIHB1YmxpYyB0cnlGaW5kKG5hbWU6IHN0cmluZyk6IHVuZGVmaW5lZCB8IFRhc2sge1xuICAgIHJldHVybiB0aGlzLl90YXNrc1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBzcGVjaWZpZWQgdGFzay5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhc2sgdG8gcnVuLlxuICAgKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgdGFzay5cbiAgICovXG4gIHB1YmxpYyBydW5UYXNrKG5hbWU6IHN0cmluZywgYXJncz86IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5fdGFza3NbbmFtZV07XG4gICAgaWYgKCF0YXNrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBmaW5kIGNvbW1hbmQgJHtuYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLl9ydW5uZXIucnVuVGFzayh0YXNrLCBhcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBzeW50aGVzaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb2plY3QuZWplY3RlZCkge1xuICAgICAgLy8gSW5zZXJ0IGEgdGFzay1ydW5uZXIgc2NyaXB0IHNvIHRoYXQgdGFza3MgY2FuIGJlIHJ1biBhZnRlciBlamVjdGluZ1xuICAgICAgZnMubWtkaXJTeW5jKHBhdGguam9pbih0aGlzLnByb2plY3Qub3V0ZGlyLCBcInNjcmlwdHNcIiksIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBmcy5jb3B5RmlsZVN5bmMoXG4gICAgICAgIC8vIFRoZSBidW5kbGVkIHRhc2sgcnVubmVyIGxpdmVzIGF0IDxwa2c+L2xpYi9ydW4tdGFzay5janMuIFRoaXMgZmlsZSBpc1xuICAgICAgICAvLyBhdCBzcmMvICh0cy1qZXN0KSBvciBsaWIvIChjb21waWxlZCk7IGluIGJvdGggY2FzZXNcbiAgICAgICAgLy8gXCIuLi9saWIvcnVuLXRhc2suY2pzXCIgcmVzb2x2ZXMgdG8gdGhlIHJlYWwgYnVuZGxlIHVuZGVyIGxpYi8uXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCJsaWJcIiwgXCJydW4tdGFzay5janNcIiksXG4gICAgICAgIHBhdGguam9pbih0aGlzLnByb2plY3Qub3V0ZGlyLCBcInNjcmlwdHNcIiwgXCJydW4tdGFzay5janNcIiksXG4gICAgICApO1xuICAgICAgZnMuY2htb2RTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgXCJzY3JpcHRzXCIsIFwicnVuLXRhc2suY2pzXCIpLFxuICAgICAgICBcIjc1NVwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZVRhc2tzTWFuaWZlc3QocmVzb2x2ZXI6IElSZXNvbHZlcik6IFRhc2tzTWFuaWZlc3Qge1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIGVudjogKCgpID0+IHRoaXMucmVuZGVyRW52KCkpIGFzIGFueSxcbiAgICAgIHNoZWxsOiAoKCkgPT4gdGhpcy5fc2hlbGw/Ll9yZW5kZXIoKSkgYXMgYW55LFxuICAgICAgdGFza3M6ICgoKSA9PiB0aGlzLnJlbmRlclRhc2tzKCkpIGFzIGFueSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHJlc29sdmVyLnJlc29sdmUob2JqLCB7XG4gICAgICAgIG9taXRFbXB0eTogdHJ1ZSxcbiAgICAgIH0pID8/IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclRhc2tzKCkge1xuICAgIGNvbnN0IHRhc2tzOiB7IFtuYW1lOiBzdHJpbmddOiBUYXNrU3BlYyB9ID0ge307XG4gICAgZm9yIChjb25zdCB0YXNrIG9mIE9iamVjdC52YWx1ZXModGhpcy5fdGFza3MpLnNvcnQoKHgsIHkpID0+XG4gICAgICB4Lm5hbWUubG9jYWxlQ29tcGFyZSh5Lm5hbWUpLFxuICAgICkpIHtcbiAgICAgIHRhc2tzW3Rhc2submFtZV0gPSB0YXNrLl9yZW5kZXJTcGVjKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhc2tzO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJFbnYoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2VudikucmVkdWNlKFxuICAgICAgKHByZXYsIGN1cnIpID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIFtjdXJyXTogdGhpcy5nZXRFbnZTdHJpbmcoY3VyciwgdGhpcy5fZW52W2N1cnJdKSxcbiAgICAgIH0pLFxuICAgICAge30sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHBlcnNpc3RlZCBhcyBzdHJpbmdzXG4gICAqIHRvIHByZXZlbnQgdHlwZSBlcnJvcnMgd2hlbiBwYXJzaW5nIGZyb20gdGFza3MuanNvbiBpbiBmdXR1cmVcbiAgICovXG4gIHByaXZhdGUgZ2V0RW52U3RyaW5nKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgd2FybihcbiAgICAgICAgYFJlY2VpdmVkIG5vbi1zdHJpbmcgdmFsdWUgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlICR7bmFtZX0uIFZhbHVlIHdpbGwgYmUgc3RyaW5naWZpZWQuYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxufVxuIl19