projen
Version:
CDK for software projects
131 lines • 20.5 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PullRequestLint = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const _1 = require(".");
const workflows_model_1 = require("./workflows-model");
const component_1 = require("../component");
const runner_options_1 = require("../runner-options");
/**
* Configure validations to run on GitHub pull requests.
* Only generates a file if at least one linter is configured.
*/
class PullRequestLint extends component_1.Component {
constructor(github, options = {}) {
super(github.project);
this.github = github;
this.options = options;
const checkSemanticTitle = options.semanticTitle ?? true;
const checkContributorStatement = Boolean(options.contributorStatement);
// should only create a workflow if one or more linters are enabled
if (!checkSemanticTitle && !checkContributorStatement) {
return;
}
const workflow = github.addWorkflow("pull-request-lint");
workflow.on({
pullRequestTarget: {
types: [
"labeled",
"opened",
"synchronize",
"reopened",
"ready_for_review",
"edited",
],
},
// run on merge group, but use a condition later to always succeed
// needed so the workflow can be a required status check
mergeGroup: {},
});
// All checks are run against the PR and can only be evaluated within a PR context
// Needed so jobs can be set as required and will run successfully on merge group checks.
const prCheck = "(github.event_name == 'pull_request' || github.event_name == 'pull_request_target')";
if (checkSemanticTitle) {
const opts = options.semanticTitleOptions ?? {};
const types = opts.types ?? ["feat", "fix", "chore"];
const validateJob = {
name: "Validate PR title",
if: prCheck,
...(0, runner_options_1.filteredRunsOnOptions)(options.runsOn, options.runsOnGroup),
permissions: {
pullRequests: workflows_model_1.JobPermission.WRITE,
},
steps: [
{
uses: "amannn/action-semantic-pull-request@v6",
env: {
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}",
},
with: {
types: types.join("\n"),
...(opts.scopes ? { scopes: opts.scopes.join("\n") } : {}),
requireScope: opts.requireScope ?? false,
},
},
],
};
workflow.addJobs({ validate: validateJob });
}
if (options.contributorStatement) {
const opts = options.contributorStatementOptions ?? {};
const users = opts.exemptUsers ?? [];
const labels = opts.exemptLabels ?? [];
const conditions = [prCheck];
const exclusions = [
...labels.map((l) => `contains(github.event.pull_request.labels.*.name, '${l}')`),
...users.map((u) => `github.event.pull_request.user.login == '${u}'`),
];
if (exclusions.length) {
conditions.push(`!(${exclusions.join(" || ")})`);
}
const scriptBody = [
'const actual = process.env.PR_BODY.replace(/\\r?\\n/g, "\\n");',
'const expected = process.env.EXPECTED.replace(/\\r?\\n/g, "\\n");',
"if (!actual.includes(expected)) {",
' console.log("%j", actual);',
' console.log("%j", expected);',
" core.setFailed(`${process.env.HELP}: ${expected}`);",
"}",
].join("\n");
const helpMessage = "Contributor statement missing from PR description. Please include the following text in the PR description";
const contributorStatement = {
name: "Require Contributor Statement",
runsOn: options.runsOn ?? ["ubuntu-latest"],
permissions: {
pullRequests: workflows_model_1.JobPermission.READ,
},
if: conditions.join(" && "),
env: {
PR_BODY: "${{ github.event.pull_request.body }}",
EXPECTED: options.contributorStatement,
HELP: helpMessage,
},
steps: [
{
uses: "actions/github-script@v8",
with: {
script: scriptBody,
},
},
],
};
workflow.addJobs({ contributorStatement });
}
}
preSynthesize() {
if (this.options.contributorStatement) {
// Append to PR template in preSynthesize so it's always at the end of the file
const prTemplate = _1.PullRequestTemplate.of(this.project) ??
this.github.addPullRequestTemplate();
prTemplate?.addLine("");
prTemplate?.addLine("---");
prTemplate?.addLine(this.options.contributorStatement);
prTemplate?.addLine("");
}
}
}
exports.PullRequestLint = PullRequestLint;
_a = JSII_RTTI_SYMBOL_1;
PullRequestLint[_a] = { fqn: "projen.github.PullRequestLint", version: "0.99.51" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC1yZXF1ZXN0LWxpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2l0aHViL3B1bGwtcmVxdWVzdC1saW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0Esd0JBQXdDO0FBRXhDLHVEQUFrRDtBQUNsRCw0Q0FBeUM7QUFFekMsc0RBQTBEO0FBK0YxRDs7O0dBR0c7QUFDSCxNQUFhLGVBQWdCLFNBQVEscUJBQVM7SUFDNUMsWUFDbUIsTUFBYyxFQUNkLFVBQWtDLEVBQUU7UUFFckQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUhMLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxZQUFPLEdBQVAsT0FBTyxDQUE2QjtRQUlyRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDO1FBQ3pELE1BQU0seUJBQXlCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXhFLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3RELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDVixpQkFBaUIsRUFBRTtnQkFDakIsS0FBSyxFQUFFO29CQUNMLFNBQVM7b0JBQ1QsUUFBUTtvQkFDUixhQUFhO29CQUNiLFVBQVU7b0JBQ1Ysa0JBQWtCO29CQUNsQixRQUFRO2lCQUNUO2FBQ0Y7WUFDRCxrRUFBa0U7WUFDbEUsd0RBQXdEO1lBQ3hELFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsa0ZBQWtGO1FBQ2xGLHlGQUF5RjtRQUN6RixNQUFNLE9BQU8sR0FDWCxxRkFBcUYsQ0FBQztRQUV4RixJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztZQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUVyRCxNQUFNLFdBQVcsR0FBUTtnQkFDdkIsSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsRUFBRSxFQUFFLE9BQU87Z0JBQ1gsR0FBRyxJQUFBLHNDQUFxQixFQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDN0QsV0FBVyxFQUFFO29CQUNYLFlBQVksRUFBRSwrQkFBYSxDQUFDLEtBQUs7aUJBQ2xDO2dCQUNELEtBQUssRUFBRTtvQkFDTDt3QkFDRSxJQUFJLEVBQUUsd0NBQXdDO3dCQUM5QyxHQUFHLEVBQUU7NEJBQ0gsWUFBWSxFQUFFLDZCQUE2Qjt5QkFDNUM7d0JBQ0QsSUFBSSxFQUFFOzRCQUNKLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs0QkFDdkIsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFDMUQsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSzt5QkFDekM7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQywyQkFBMkIsSUFBSSxFQUFFLENBQUM7WUFDdkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7WUFFdkMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU3QixNQUFNLFVBQVUsR0FBYTtnQkFDM0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUNYLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxzREFBc0QsQ0FBQyxJQUFJLENBQ25FO2dCQUNELEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsNENBQTRDLENBQUMsR0FBRyxDQUFDO2FBQ3RFLENBQUM7WUFFRixJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEIsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRztnQkFDakIsZ0VBQWdFO2dCQUNoRSxtRUFBbUU7Z0JBQ25FLG1DQUFtQztnQkFDbkMsZ0NBQWdDO2dCQUNoQyxrQ0FBa0M7Z0JBQ2xDLHlEQUF5RDtnQkFDekQsR0FBRzthQUNKLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWIsTUFBTSxXQUFXLEdBQ2YsNEdBQTRHLENBQUM7WUFDL0csTUFBTSxvQkFBb0IsR0FBUTtnQkFDaEMsSUFBSSxFQUFFLCtCQUErQjtnQkFDckMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUM7Z0JBQzNDLFdBQVcsRUFBRTtvQkFDWCxZQUFZLEVBQUUsK0JBQWEsQ0FBQyxJQUFJO2lCQUNqQztnQkFDRCxFQUFFLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQzNCLEdBQUcsRUFBRTtvQkFDSCxPQUFPLEVBQUUsdUNBQXVDO29CQUNoRCxRQUFRLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtvQkFDdEMsSUFBSSxFQUFFLFdBQVc7aUJBQ2xCO2dCQUNELEtBQUssRUFBRTtvQkFDTDt3QkFDRSxJQUFJLEVBQUUsMEJBQTBCO3dCQUNoQyxJQUFJLEVBQUU7NEJBQ0osTUFBTSxFQUFFLFVBQVU7eUJBQ25CO3FCQUNGO2lCQUNGO2FBQ0YsQ0FBQztZQUVGLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFTSxhQUFhO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3RDLCtFQUErRTtZQUMvRSxNQUFNLFVBQVUsR0FDZCxzQkFBbUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3ZDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN2RCxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDOztBQXJJSCwwQ0FzSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEdpdEh1YiB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBQdWxsUmVxdWVzdFRlbXBsYXRlIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB0eXBlIHsgSm9iIH0gZnJvbSBcIi4vd29ya2Zsb3dzLW1vZGVsXCI7XG5pbXBvcnQgeyBKb2JQZXJtaXNzaW9uIH0gZnJvbSBcIi4vd29ya2Zsb3dzLW1vZGVsXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEdyb3VwUnVubmVyT3B0aW9ucyB9IGZyb20gXCIuLi9ydW5uZXItb3B0aW9uc1wiO1xuaW1wb3J0IHsgZmlsdGVyZWRSdW5zT25PcHRpb25zIH0gZnJvbSBcIi4uL3J1bm5lci1vcHRpb25zXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgUHVsbFJlcXVlc3RMaW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVsbFJlcXVlc3RMaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IHB1bGwgcmVxdWVzdCB0aXRsZXMgZm9sbG93IENvbnZlbnRpb25hbCBDb21taXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cuY29udmVudGlvbmFsY29tbWl0cy5vcmcvXG4gICAqL1xuICByZWFkb25seSBzZW1hbnRpY1RpdGxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgdmFsaWRhdGluZyB0aGUgY29udmVudGlvbmFsIGNvbW1pdCB0aXRsZSBsaW50ZXIuXG4gICAqIEBkZWZhdWx0IC0gdGl0bGUgbXVzdCBzdGFydCB3aXRoIFwiZmVhdFwiLCBcImZpeFwiLCBvciBcImNob3JlXCJcbiAgICovXG4gIHJlYWRvbmx5IHNlbWFudGljVGl0bGVPcHRpb25zPzogU2VtYW50aWNUaXRsZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEdpdGh1YiBSdW5uZXIgc2VsZWN0aW9uIGxhYmVsc1xuICAgKiBAZGVmYXVsdCBbXCJ1YnVudHUtbGF0ZXN0XCJdXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgdGFyZ2V0IFJ1bm5lciBieSBsYWJlbHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIGJvdGggYHJ1bnNPbmAgYW5kIGBydW5zT25Hcm91cGAgYXJlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgcnVuc09uPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEdpdGh1YiBSdW5uZXIgR3JvdXAgc2VsZWN0aW9uIG9wdGlvbnNcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSB0YXJnZXQgUnVubmVyIEdyb3VwIGJ5IG5hbWUgYW5kL29yIGxhYmVsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgYm90aCBgcnVuc09uYCBhbmQgYHJ1bnNPbkdyb3VwYCBhcmUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBydW5zT25Hcm91cD86IEdyb3VwUnVubmVyT3B0aW9ucztcblxuICAvKipcbiAgICogUmVxdWlyZSBhIGNvbnRyaWJ1dG9yIHN0YXRlbWVudCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgUFIgZGVzY3JpcHRpb24uXG4gICAqIEZvciBleGFtcGxlIGNvbmZpcm1pbmcgdGhhdCB0aGUgY29udHJpYnV0aW9uIGhhcyBiZWVuIG1hZGUgYnkgdGhlIGNvbnRyaWJ1dG9yIGFuZCBjb21wbGllcyB3aXRoIHRoZSBwcm9qZWN0J3MgbGljZW5zZS5cbiAgICpcbiAgICogQXBwZW5kcyB0aGUgc3RhdGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIFB1bGwgUmVxdWVzdCB0ZW1wbGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb250cmlidXRvciBzdGF0ZW1lbnQgaXMgcmVxdWlyZWRcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRyaWJ1dG9yU3RhdGVtZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciByZXF1aXJpbmcgYSBjb250cmlidXRvciBzdGF0ZW1lbnQgb24gUHVsbCBSZXF1ZXN0c1xuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRyaWJ1dG9yU3RhdGVtZW50T3B0aW9ucz86IENvbnRyaWJ1dG9yU3RhdGVtZW50T3B0aW9ucztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBsaW50aW5nIHRoYXQgUFIgdGl0bGVzIGZvbGxvdyBDb252ZW50aW9uYWwgQ29tbWl0cy5cbiAqIEBzZWUgaHR0cHM6Ly93d3cuY29udmVudGlvbmFsY29tbWl0cy5vcmcvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNUaXRsZU9wdGlvbnMge1xuICAvKipcbiAgICogQ29uZmlndXJlIGEgbGlzdCBvZiBjb21taXQgdHlwZXMgdGhhdCBhcmUgYWxsb3dlZC5cbiAgICogQGRlZmF1bHQgW1wiZmVhdFwiLCBcImZpeFwiLCBcImNob3JlXCJdXG4gICAqL1xuICByZWFkb25seSB0eXBlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhhdCBhIHNjb3BlIG11c3QgYWx3YXlzIGJlIHByb3ZpZGVkLlxuICAgKiBlLmcuIGZlYXQodWkpLCBmaXgoY29yZSlcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVTY29wZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB3aGljaCBzY29wZXMgYXJlIGFsbG93ZWQgKG5ld2xpbmUtZGVsaW1pdGVkKS5cbiAgICogVGhlc2UgYXJlIHJlZ2V4IHBhdHRlcm5zIGF1dG8td3JhcHBlZCBpbiBgXiAkYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgc2NvcGVzIGFsbG93ZWRcbiAgICovXG4gIHJlYWRvbmx5IHNjb3Blcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJlcXVpcmluZyBhIGNvbnRyaWJ1dG9yIHN0YXRlbWVudCBvbiBQdWxsIFJlcXVlc3RzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJpYnV0b3JTdGF0ZW1lbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFB1bGwgcmVxdWVzdHMgZnJvbSB0aGVzZSBHaXRIdWIgdXNlcnMgYXJlIGV4ZW1wdGVkIGZyb20gYSBjb250cmlidXRvciBzdGF0ZW1lbnQuXG4gICAqIEBkZWZhdWx0IC0gbm8gdXNlcnMgYXJlIGV4ZW1wdGVkXG4gICAqL1xuICByZWFkb25seSBleGVtcHRVc2Vycz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogUHVsbCByZXF1ZXN0cyB3aXRoIG9uZSBvZiB0aGVzZSBsYWJlbHMgYXJlIGV4ZW1wdGVkIGZyb20gYSBjb250cmlidXRvciBzdGF0ZW1lbnQuXG4gICAqIEBkZWZhdWx0IC0gbm8gbGFiZWxzIGFyZSBleGNsdWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhlbXB0TGFiZWxzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29uZmlndXJlIHZhbGlkYXRpb25zIHRvIHJ1biBvbiBHaXRIdWIgcHVsbCByZXF1ZXN0cy5cbiAqIE9ubHkgZ2VuZXJhdGVzIGEgZmlsZSBpZiBhdCBsZWFzdCBvbmUgbGludGVyIGlzIGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQdWxsUmVxdWVzdExpbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdpdGh1YjogR2l0SHViLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogUHVsbFJlcXVlc3RMaW50T3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICBzdXBlcihnaXRodWIucHJvamVjdCk7XG5cbiAgICBjb25zdCBjaGVja1NlbWFudGljVGl0bGUgPSBvcHRpb25zLnNlbWFudGljVGl0bGUgPz8gdHJ1ZTtcbiAgICBjb25zdCBjaGVja0NvbnRyaWJ1dG9yU3RhdGVtZW50ID0gQm9vbGVhbihvcHRpb25zLmNvbnRyaWJ1dG9yU3RhdGVtZW50KTtcblxuICAgIC8vIHNob3VsZCBvbmx5IGNyZWF0ZSBhIHdvcmtmbG93IGlmIG9uZSBvciBtb3JlIGxpbnRlcnMgYXJlIGVuYWJsZWRcbiAgICBpZiAoIWNoZWNrU2VtYW50aWNUaXRsZSAmJiAhY2hlY2tDb250cmlidXRvclN0YXRlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93ID0gZ2l0aHViLmFkZFdvcmtmbG93KFwicHVsbC1yZXF1ZXN0LWxpbnRcIik7XG4gICAgd29ya2Zsb3cub24oe1xuICAgICAgcHVsbFJlcXVlc3RUYXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICBcImxhYmVsZWRcIixcbiAgICAgICAgICBcIm9wZW5lZFwiLFxuICAgICAgICAgIFwic3luY2hyb25pemVcIixcbiAgICAgICAgICBcInJlb3BlbmVkXCIsXG4gICAgICAgICAgXCJyZWFkeV9mb3JfcmV2aWV3XCIsXG4gICAgICAgICAgXCJlZGl0ZWRcIixcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICAvLyBydW4gb24gbWVyZ2UgZ3JvdXAsIGJ1dCB1c2UgYSBjb25kaXRpb24gbGF0ZXIgdG8gYWx3YXlzIHN1Y2NlZWRcbiAgICAgIC8vIG5lZWRlZCBzbyB0aGUgd29ya2Zsb3cgY2FuIGJlIGEgcmVxdWlyZWQgc3RhdHVzIGNoZWNrXG4gICAgICBtZXJnZUdyb3VwOiB7fSxcbiAgICB9KTtcblxuICAgIC8vIEFsbCBjaGVja3MgYXJlIHJ1biBhZ2FpbnN0IHRoZSBQUiBhbmQgY2FuIG9ubHkgYmUgZXZhbHVhdGVkIHdpdGhpbiBhIFBSIGNvbnRleHRcbiAgICAvLyBOZWVkZWQgc28gam9icyBjYW4gYmUgc2V0IGFzIHJlcXVpcmVkIGFuZCB3aWxsIHJ1biBzdWNjZXNzZnVsbHkgb24gbWVyZ2UgZ3JvdXAgY2hlY2tzLlxuICAgIGNvbnN0IHByQ2hlY2sgPVxuICAgICAgXCIoZ2l0aHViLmV2ZW50X25hbWUgPT0gJ3B1bGxfcmVxdWVzdCcgfHwgZ2l0aHViLmV2ZW50X25hbWUgPT0gJ3B1bGxfcmVxdWVzdF90YXJnZXQnKVwiO1xuXG4gICAgaWYgKGNoZWNrU2VtYW50aWNUaXRsZSkge1xuICAgICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMuc2VtYW50aWNUaXRsZU9wdGlvbnMgPz8ge307XG4gICAgICBjb25zdCB0eXBlcyA9IG9wdHMudHlwZXMgPz8gW1wiZmVhdFwiLCBcImZpeFwiLCBcImNob3JlXCJdO1xuXG4gICAgICBjb25zdCB2YWxpZGF0ZUpvYjogSm9iID0ge1xuICAgICAgICBuYW1lOiBcIlZhbGlkYXRlIFBSIHRpdGxlXCIsXG4gICAgICAgIGlmOiBwckNoZWNrLFxuICAgICAgICAuLi5maWx0ZXJlZFJ1bnNPbk9wdGlvbnMob3B0aW9ucy5ydW5zT24sIG9wdGlvbnMucnVuc09uR3JvdXApLFxuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgIHB1bGxSZXF1ZXN0czogSm9iUGVybWlzc2lvbi5XUklURSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VzOiBcImFtYW5ubi9hY3Rpb24tc2VtYW50aWMtcHVsbC1yZXF1ZXN0QHY2XCIsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgR0lUSFVCX1RPS0VOOiBcIiR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgdHlwZXM6IHR5cGVzLmpvaW4oXCJcXG5cIiksXG4gICAgICAgICAgICAgIC4uLihvcHRzLnNjb3BlcyA/IHsgc2NvcGVzOiBvcHRzLnNjb3Blcy5qb2luKFwiXFxuXCIpIH0gOiB7fSksXG4gICAgICAgICAgICAgIHJlcXVpcmVTY29wZTogb3B0cy5yZXF1aXJlU2NvcGUgPz8gZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICB3b3JrZmxvdy5hZGRKb2JzKHsgdmFsaWRhdGU6IHZhbGlkYXRlSm9iIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNvbnRyaWJ1dG9yU3RhdGVtZW50KSB7XG4gICAgICBjb25zdCBvcHRzID0gb3B0aW9ucy5jb250cmlidXRvclN0YXRlbWVudE9wdGlvbnMgPz8ge307XG4gICAgICBjb25zdCB1c2VycyA9IG9wdHMuZXhlbXB0VXNlcnMgPz8gW107XG4gICAgICBjb25zdCBsYWJlbHMgPSBvcHRzLmV4ZW1wdExhYmVscyA/PyBbXTtcblxuICAgICAgY29uc3QgY29uZGl0aW9ucyA9IFtwckNoZWNrXTtcblxuICAgICAgY29uc3QgZXhjbHVzaW9uczogc3RyaW5nW10gPSBbXG4gICAgICAgIC4uLmxhYmVscy5tYXAoXG4gICAgICAgICAgKGwpID0+IGBjb250YWlucyhnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmxhYmVscy4qLm5hbWUsICcke2x9JylgLFxuICAgICAgICApLFxuICAgICAgICAuLi51c2Vycy5tYXAoKHUpID0+IGBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LnVzZXIubG9naW4gPT0gJyR7dX0nYCksXG4gICAgICBdO1xuXG4gICAgICBpZiAoZXhjbHVzaW9ucy5sZW5ndGgpIHtcbiAgICAgICAgY29uZGl0aW9ucy5wdXNoKGAhKCR7ZXhjbHVzaW9ucy5qb2luKFwiIHx8IFwiKX0pYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcmlwdEJvZHkgPSBbXG4gICAgICAgICdjb25zdCBhY3R1YWwgPSBwcm9jZXNzLmVudi5QUl9CT0RZLnJlcGxhY2UoL1xcXFxyP1xcXFxuL2csIFwiXFxcXG5cIik7JyxcbiAgICAgICAgJ2NvbnN0IGV4cGVjdGVkID0gcHJvY2Vzcy5lbnYuRVhQRUNURUQucmVwbGFjZSgvXFxcXHI/XFxcXG4vZywgXCJcXFxcblwiKTsnLFxuICAgICAgICBcImlmICghYWN0dWFsLmluY2x1ZGVzKGV4cGVjdGVkKSkge1wiLFxuICAgICAgICAnICAgIGNvbnNvbGUubG9nKFwiJWpcIiwgYWN0dWFsKTsnLFxuICAgICAgICAnICAgIGNvbnNvbGUubG9nKFwiJWpcIiwgZXhwZWN0ZWQpOycsXG4gICAgICAgIFwiICAgIGNvcmUuc2V0RmFpbGVkKGAke3Byb2Nlc3MuZW52LkhFTFB9OiAke2V4cGVjdGVkfWApO1wiLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcblxuICAgICAgY29uc3QgaGVscE1lc3NhZ2UgPVxuICAgICAgICBcIkNvbnRyaWJ1dG9yIHN0YXRlbWVudCBtaXNzaW5nIGZyb20gUFIgZGVzY3JpcHRpb24uIFBsZWFzZSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgdGV4dCBpbiB0aGUgUFIgZGVzY3JpcHRpb25cIjtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9yU3RhdGVtZW50OiBKb2IgPSB7XG4gICAgICAgIG5hbWU6IFwiUmVxdWlyZSBDb250cmlidXRvciBTdGF0ZW1lbnRcIixcbiAgICAgICAgcnVuc09uOiBvcHRpb25zLnJ1bnNPbiA/PyBbXCJ1YnVudHUtbGF0ZXN0XCJdLFxuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgIHB1bGxSZXF1ZXN0czogSm9iUGVybWlzc2lvbi5SRUFELFxuICAgICAgICB9LFxuICAgICAgICBpZjogY29uZGl0aW9ucy5qb2luKFwiICYmIFwiKSxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgUFJfQk9EWTogXCIke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5ib2R5IH19XCIsXG4gICAgICAgICAgRVhQRUNURUQ6IG9wdGlvbnMuY29udHJpYnV0b3JTdGF0ZW1lbnQsXG4gICAgICAgICAgSEVMUDogaGVscE1lc3NhZ2UsXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlczogXCJhY3Rpb25zL2dpdGh1Yi1zY3JpcHRAdjhcIixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgc2NyaXB0OiBzY3JpcHRCb2R5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgd29ya2Zsb3cuYWRkSm9icyh7IGNvbnRyaWJ1dG9yU3RhdGVtZW50IH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29udHJpYnV0b3JTdGF0ZW1lbnQpIHtcbiAgICAgIC8vIEFwcGVuZCB0byBQUiB0ZW1wbGF0ZSBpbiBwcmVTeW50aGVzaXplIHNvIGl0J3MgYWx3YXlzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGVcbiAgICAgIGNvbnN0IHByVGVtcGxhdGUgPVxuICAgICAgICBQdWxsUmVxdWVzdFRlbXBsYXRlLm9mKHRoaXMucHJvamVjdCkgPz9cbiAgICAgICAgdGhpcy5naXRodWIuYWRkUHVsbFJlcXVlc3RUZW1wbGF0ZSgpO1xuICAgICAgcHJUZW1wbGF0ZT8uYWRkTGluZShcIlwiKTtcbiAgICAgIHByVGVtcGxhdGU/LmFkZExpbmUoXCItLS1cIik7XG4gICAgICBwclRlbXBsYXRlPy5hZGRMaW5lKHRoaXMub3B0aW9ucy5jb250cmlidXRvclN0YXRlbWVudCk7XG4gICAgICBwclRlbXBsYXRlPy5hZGRMaW5lKFwiXCIpO1xuICAgIH1cbiAgfVxufVxuIl19