projen
Version:
CDK for software projects
153 lines • 15.8 kB
JavaScript
;
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.CdktnConfig = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const fs = __importStar(require("node:fs"));
const path = __importStar(require("node:path"));
const component_1 = require("../component");
const json_1 = require("../json");
/**
* Represents cdktf.json file.
*
* CDKTN (CDK Terrain) continues to use the `cdktf.json` filename for
* backwards compatibility with its CDKTF origins.
*/
class CdktnConfig extends component_1.Component {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.cdktn.CdktnConfig", version: "0.103.12" };
/**
* Represents the JSON file.
*/
file;
/**
* Name of the cdktn.out directory.
*/
cdktnOut;
/**
* List of Terraform providers to build.
*/
_terraformProviders;
/**
* List of Terraform modules to build.
*/
_terraformModules;
constructor(scope, options) {
super(scope);
this.cdktnOut = options.cdktnOut ?? "cdktf.out";
this._terraformProviders = options.terraformProviders ?? [];
this._terraformModules = options.terraformModules ?? [];
this.file = new json_1.JsonFile(this.project, "cdktf.json", {
omitEmpty: true,
// `cdktn get` and `cdktn provider add` write generated provider/module
// entries back into this file, so it can't be read-only.
readonly: false,
obj: {
language: options.language ?? "typescript",
app: options.app,
output: this.cdktnOut,
terraformProviders: () => this.resolveTerraformProviders(),
terraformModules: () => this.resolveTerraformModules(),
context: options.context,
projectId: options.projectId,
sendCrashReports: options.sendCrashReports,
},
});
this.project.gitignore.exclude(`/${this.cdktnOut}/`);
this.project.gitignore.exclude(".gen/");
}
/**
* Add Terraform providers to `cdktf.json`.
* @param providers The providers to add.
*/
addTerraformProviders(...providers) {
this._terraformProviders.push(...providers);
}
/**
* Add Terraform modules to `cdktf.json`.
* @param modules The modules to add.
*/
addTerraformModules(...modules) {
this._terraformModules.push(...modules);
}
/**
* Reads the existing `cdktf.json` from disk and merges projen-managed
* providers with any that were added externally (e.g. via `cdktn provider add`).
*/
resolveTerraformProviders() {
const existing = this.readExistingConfig();
return this.mergeEntries(existing?.terraformProviders, this._terraformProviders);
}
/**
* Reads the existing `cdktf.json` from disk and merges projen-managed
* modules with any that were added externally (e.g. via `cdktn get`).
*/
resolveTerraformModules() {
const existing = this.readExistingConfig();
return this.mergeEntries(existing?.terraformModules, this._terraformModules);
}
/**
* Merge entries from the existing file with projen-managed entries,
* deduplicating by value.
*/
mergeEntries(existing, managed) {
if (!existing || existing.length === 0) {
return managed;
}
const merged = [...managed];
for (const entry of existing) {
if (!merged.includes(entry)) {
merged.push(entry);
}
}
return merged;
}
/**
* Read the existing cdktf.json file from disk (if it exists).
*/
readExistingConfig() {
const filePath = path.join(this.project.outdir, "cdktf.json");
if (!fs.existsSync(filePath)) {
return undefined;
}
try {
return JSON.parse(fs.readFileSync(filePath, "utf-8"));
}
catch {
return undefined;
}
}
}
exports.CdktnConfig = CdktnConfig;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrdG4tY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nka3RuL2Nka3RuLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQThCO0FBQzlCLGdEQUFrQztBQUVsQyw0Q0FBeUM7QUFDekMsa0NBQW1DO0FBbUVuQzs7Ozs7R0FLRztBQUNILE1BQWEsV0FBWSxTQUFRLHFCQUFTOztJQUN4Qzs7T0FFRztJQUNhLElBQUksQ0FBVztJQUUvQjs7T0FFRztJQUNhLFFBQVEsQ0FBUztJQUVqQzs7T0FFRztJQUNjLG1CQUFtQixDQUFXO0lBRS9DOztPQUVHO0lBQ2MsaUJBQWlCLENBQVc7SUFFN0MsWUFBWSxLQUFpQixFQUFFLE9BQTJCO1FBQ3hELEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUM7UUFDaEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7UUFFeEQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLGVBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtZQUNuRCxTQUFTLEVBQUUsSUFBSTtZQUNmLHVFQUF1RTtZQUN2RSx5REFBeUQ7WUFDekQsUUFBUSxFQUFFLEtBQUs7WUFDZixHQUFHLEVBQUU7Z0JBQ0gsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksWUFBWTtnQkFDMUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO2dCQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3JCLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtnQkFDMUQsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO2dCQUN0RCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87Z0JBQ3hCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztnQkFDNUIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjthQUMzQztTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0kscUJBQXFCLENBQUMsR0FBRyxTQUFtQjtRQUNqRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLG1CQUFtQixDQUFDLEdBQUcsT0FBaUI7UUFDN0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7O09BR0c7SUFDSyx5QkFBeUI7UUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUN0QixRQUFRLEVBQUUsa0JBQWtCLEVBQzVCLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSyx1QkFBdUI7UUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUN0QixRQUFRLEVBQUUsZ0JBQWdCLEVBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSyxZQUFZLENBQ2xCLFFBQThCLEVBQzlCLE9BQWlCO1FBRWpCLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQjtRQUN4QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQzs7QUExSEgsa0NBMkhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IEpzb25GaWxlIH0gZnJvbSBcIi4uL2pzb25cIjtcblxuLyoqXG4gKiBDb21tb24gb3B0aW9ucyBmb3IgYGNka3RmLmpzb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENka3RuQ29uZmlnQ29tbW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUZXJyYWZvcm0gcHJvdmlkZXJzIHRvIGJ1aWxkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgcmVhZG9ubHkgdGVycmFmb3JtUHJvdmlkZXJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRlcnJhZm9ybSBtb2R1bGVzIHRvIGJ1aWxkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgcmVhZG9ubHkgdGVycmFmb3JtTW9kdWxlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGNvbnRleHQgdG8gaW5jbHVkZSBpbiBgY2RrdGYuanNvbmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBjb250ZXh0XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0PzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuICAvKipcbiAgICogQ0RLVE4gb3V0cHV0IGRpcmVjdG9yeS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJjZGt0Zi5vdXRcIlxuICAgKi9cbiAgcmVhZG9ubHkgY2RrdG5PdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENESyBwcm9qZWN0IGlkZW50aWZpZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHJlcG9ydCBjcmFzaGluZyB0byBhIHJlbW90ZSBzZXJ2ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VuZENyYXNoUmVwb3J0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYENka3RuQ29uZmlnYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGt0bkNvbmZpZ09wdGlvbnMgZXh0ZW5kcyBDZGt0bkNvbmZpZ0NvbW1vbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGluIG9yZGVyIHRvIHN5bnRoZXNpemUgdGhlIENES1ROIGFwcGxpY2F0aW9uXG4gICAqIChsYW5ndWFnZSBzcGVjaWZpYykuXG4gICAqL1xuICByZWFkb25seSBhcHA6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIENES1ROIGFwcC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ0eXBlc2NyaXB0XCJcbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY2RrdGYuanNvbiBmaWxlLlxuICpcbiAqIENES1ROIChDREsgVGVycmFpbikgY29udGludWVzIHRvIHVzZSB0aGUgYGNka3RmLmpzb25gIGZpbGVuYW1lIGZvclxuICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBpdHMgQ0RLVEYgb3JpZ2lucy5cbiAqL1xuZXhwb3J0IGNsYXNzIENka3RuQ29uZmlnIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIEpTT04gZmlsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmaWxlOiBKc29uRmlsZTtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgY2RrdG4ub3V0IGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGt0bk91dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIFRlcnJhZm9ybSBwcm92aWRlcnMgdG8gYnVpbGQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90ZXJyYWZvcm1Qcm92aWRlcnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIFRlcnJhZm9ybSBtb2R1bGVzIHRvIGJ1aWxkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdGVycmFmb3JtTW9kdWxlczogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IElDb25zdHJ1Y3QsIG9wdGlvbnM6IENka3RuQ29uZmlnT3B0aW9ucykge1xuICAgIHN1cGVyKHNjb3BlKTtcblxuICAgIHRoaXMuY2RrdG5PdXQgPSBvcHRpb25zLmNka3RuT3V0ID8/IFwiY2RrdGYub3V0XCI7XG4gICAgdGhpcy5fdGVycmFmb3JtUHJvdmlkZXJzID0gb3B0aW9ucy50ZXJyYWZvcm1Qcm92aWRlcnMgPz8gW107XG4gICAgdGhpcy5fdGVycmFmb3JtTW9kdWxlcyA9IG9wdGlvbnMudGVycmFmb3JtTW9kdWxlcyA/PyBbXTtcblxuICAgIHRoaXMuZmlsZSA9IG5ldyBKc29uRmlsZSh0aGlzLnByb2plY3QsIFwiY2RrdGYuanNvblwiLCB7XG4gICAgICBvbWl0RW1wdHk6IHRydWUsXG4gICAgICAvLyBgY2RrdG4gZ2V0YCBhbmQgYGNka3RuIHByb3ZpZGVyIGFkZGAgd3JpdGUgZ2VuZXJhdGVkIHByb3ZpZGVyL21vZHVsZVxuICAgICAgLy8gZW50cmllcyBiYWNrIGludG8gdGhpcyBmaWxlLCBzbyBpdCBjYW4ndCBiZSByZWFkLW9ubHkuXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICBvYmo6IHtcbiAgICAgICAgbGFuZ3VhZ2U6IG9wdGlvbnMubGFuZ3VhZ2UgPz8gXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIGFwcDogb3B0aW9ucy5hcHAsXG4gICAgICAgIG91dHB1dDogdGhpcy5jZGt0bk91dCxcbiAgICAgICAgdGVycmFmb3JtUHJvdmlkZXJzOiAoKSA9PiB0aGlzLnJlc29sdmVUZXJyYWZvcm1Qcm92aWRlcnMoKSxcbiAgICAgICAgdGVycmFmb3JtTW9kdWxlczogKCkgPT4gdGhpcy5yZXNvbHZlVGVycmFmb3JtTW9kdWxlcygpLFxuICAgICAgICBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsXG4gICAgICAgIHByb2plY3RJZDogb3B0aW9ucy5wcm9qZWN0SWQsXG4gICAgICAgIHNlbmRDcmFzaFJlcG9ydHM6IG9wdGlvbnMuc2VuZENyYXNoUmVwb3J0cyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2plY3QuZ2l0aWdub3JlLmV4Y2x1ZGUoYC8ke3RoaXMuY2RrdG5PdXR9L2ApO1xuICAgIHRoaXMucHJvamVjdC5naXRpZ25vcmUuZXhjbHVkZShcIi5nZW4vXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBUZXJyYWZvcm0gcHJvdmlkZXJzIHRvIGBjZGt0Zi5qc29uYC5cbiAgICogQHBhcmFtIHByb3ZpZGVycyBUaGUgcHJvdmlkZXJzIHRvIGFkZC5cbiAgICovXG4gIHB1YmxpYyBhZGRUZXJyYWZvcm1Qcm92aWRlcnMoLi4ucHJvdmlkZXJzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3RlcnJhZm9ybVByb3ZpZGVycy5wdXNoKC4uLnByb3ZpZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFRlcnJhZm9ybSBtb2R1bGVzIHRvIGBjZGt0Zi5qc29uYC5cbiAgICogQHBhcmFtIG1vZHVsZXMgVGhlIG1vZHVsZXMgdG8gYWRkLlxuICAgKi9cbiAgcHVibGljIGFkZFRlcnJhZm9ybU1vZHVsZXMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl90ZXJyYWZvcm1Nb2R1bGVzLnB1c2goLi4ubW9kdWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGV4aXN0aW5nIGBjZGt0Zi5qc29uYCBmcm9tIGRpc2sgYW5kIG1lcmdlcyBwcm9qZW4tbWFuYWdlZFxuICAgKiBwcm92aWRlcnMgd2l0aCBhbnkgdGhhdCB3ZXJlIGFkZGVkIGV4dGVybmFsbHkgKGUuZy4gdmlhIGBjZGt0biBwcm92aWRlciBhZGRgKS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVRlcnJhZm9ybVByb3ZpZGVycygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnJlYWRFeGlzdGluZ0NvbmZpZygpO1xuICAgIHJldHVybiB0aGlzLm1lcmdlRW50cmllcyhcbiAgICAgIGV4aXN0aW5nPy50ZXJyYWZvcm1Qcm92aWRlcnMsXG4gICAgICB0aGlzLl90ZXJyYWZvcm1Qcm92aWRlcnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgZXhpc3RpbmcgYGNka3RmLmpzb25gIGZyb20gZGlzayBhbmQgbWVyZ2VzIHByb2plbi1tYW5hZ2VkXG4gICAqIG1vZHVsZXMgd2l0aCBhbnkgdGhhdCB3ZXJlIGFkZGVkIGV4dGVybmFsbHkgKGUuZy4gdmlhIGBjZGt0biBnZXRgKS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVRlcnJhZm9ybU1vZHVsZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5yZWFkRXhpc3RpbmdDb25maWcoKTtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUVudHJpZXMoXG4gICAgICBleGlzdGluZz8udGVycmFmb3JtTW9kdWxlcyxcbiAgICAgIHRoaXMuX3RlcnJhZm9ybU1vZHVsZXMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBlbnRyaWVzIGZyb20gdGhlIGV4aXN0aW5nIGZpbGUgd2l0aCBwcm9qZW4tbWFuYWdlZCBlbnRyaWVzLFxuICAgKiBkZWR1cGxpY2F0aW5nIGJ5IHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBtZXJnZUVudHJpZXMoXG4gICAgZXhpc3Rpbmc6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgIG1hbmFnZWQ6IHN0cmluZ1tdLFxuICApOiBzdHJpbmdbXSB7XG4gICAgaWYgKCFleGlzdGluZyB8fCBleGlzdGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBtYW5hZ2VkO1xuICAgIH1cbiAgICBjb25zdCBtZXJnZWQgPSBbLi4ubWFuYWdlZF07XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBleGlzdGluZykge1xuICAgICAgaWYgKCFtZXJnZWQuaW5jbHVkZXMoZW50cnkpKSB7XG4gICAgICAgIG1lcmdlZC5wdXNoKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBleGlzdGluZyBjZGt0Zi5qc29uIGZpbGUgZnJvbSBkaXNrIChpZiBpdCBleGlzdHMpLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkRXhpc3RpbmdDb25maWcoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnByb2plY3Qub3V0ZGlyLCBcImNka3RmLmpzb25cIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIl19