aws-delivlib 13.3.3 → 13.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +22 -20
- package/cdk.out/{asset.663163693e04179c71265b44a325be7e6b8c4e90b081883a1b3f3393de2546ea → asset.7820644cf1fdec7cec290ed6fdd561e35f4015d4dcf03a20f8035dda3c0ac88a}/watcher-handler.d.ts +0 -0
- package/cdk.out/asset.7820644cf1fdec7cec290ed6fdd561e35f4015d4dcf03a20f8035dda3c0ac88a/watcher-handler.js +108 -0
- package/cdk.out/{asset.663163693e04179c71265b44a325be7e6b8c4e90b081883a1b3f3393de2546ea → asset.7820644cf1fdec7cec290ed6fdd561e35f4015d4dcf03a20f8035dda3c0ac88a}/watcher-handler.ts +0 -0
- package/cdk.out/asset.dc2e98009b027861f34e56eebb81faa5a3951ed9da80ce4a903a45de04268238/index.js +16465 -0
- package/cdk.out/cdk.out +1 -1
- package/cdk.out/delivlib-test.assets.json +9 -9
- package/cdk.out/delivlib-test.template.json +3 -3
- package/cdk.out/manifest.json +1840 -1840
- package/cdk.out/tree.json +412 -412
- package/lib/__tests__/build-spec.test.js +21 -2
- package/lib/__tests__/bump.test.js +21 -2
- package/lib/__tests__/canary.test.js +22 -3
- package/lib/__tests__/change-control-lambda/disable-transition.test.js +2 -1
- package/lib/__tests__/change-control-lambda/handler.test.js +23 -3
- package/lib/__tests__/chime-notifier.test.js +4 -3
- package/lib/__tests__/code-signing-cert.test.js +21 -2
- package/lib/__tests__/integ.delivlib.js +21 -2
- package/lib/__tests__/open-pgp-key-pair.test.js +21 -2
- package/lib/__tests__/pipeline.test.js +22 -3
- package/lib/__tests__/pr.test.js +21 -2
- package/lib/__tests__/publishing.test.js +38 -2
- package/lib/__tests__/registry-sync/ecr-mirror.test.js +21 -2
- package/lib/__tests__/registry-sync/mirror-source.test.js +21 -2
- package/lib/__tests__/shellable.test.js +22 -3
- package/lib/__tests__/test-stack.js +22 -3
- package/lib/change-control-lambda/disable-transition.js +21 -2
- package/lib/change-control-lambda/index.js +21 -2
- package/lib/change-controller.js +21 -2
- package/lib/chime-notifier/chime-notifier.js +22 -12
- package/lib/chime-notifier/chime-notifier.ts +1 -11
- package/lib/chime-notifier/{notifier-handler.d.ts → handler/notifier-handler.d.ts} +0 -0
- package/lib/chime-notifier/handler/notifier-handler.js +110 -0
- package/lib/chime-notifier/{notifier-handler.ts → handler/notifier-handler.ts} +4 -4
- package/lib/code-signing/certificate-signing-request.js +21 -2
- package/lib/code-signing/code-signing-certificate.js +21 -2
- package/lib/code-signing/private-key.js +21 -2
- package/lib/custom-resource-handlers/src/_cloud-formation.js +22 -3
- package/lib/custom-resource-handlers/src/_exec.js +22 -3
- package/lib/custom-resource-handlers/src/_rmrf.js +23 -4
- package/lib/custom-resource-handlers/src/certificate-signing-request.js +26 -7
- package/lib/custom-resource-handlers/src/certificate-signing-request.tsbuildinfo +1 -1
- package/lib/custom-resource-handlers/src/pgp-secret.js +27 -8
- package/lib/custom-resource-handlers/src/pgp-secret.tsbuildinfo +1 -1
- package/lib/custom-resource-handlers/src/private-key.js +26 -7
- package/lib/custom-resource-handlers/src/private-key.tsbuildinfo +1 -1
- package/lib/open-pgp-key-pair.js +21 -2
- package/lib/pipeline-notifications/chime.js +21 -2
- package/lib/pipeline-notifications/slack.js +21 -2
- package/lib/pipeline-watcher/handler/watcher-handler.js +21 -2
- package/lib/pipeline-watcher/watcher.js +21 -2
- package/lib/pipeline.d.ts +20 -6
- package/lib/pipeline.js +35 -10
- package/lib/pipeline.ts +34 -14
- package/lib/publishing/s3/publish.sh +2 -1
- package/lib/publishing.js +22 -3
- package/lib/pull-request/bump.js +21 -2
- package/lib/pull-request/merge-back.js +22 -3
- package/lib/pull-request/pr.js +21 -2
- package/lib/shellable.js +22 -3
- package/lib/util.js +23 -4
- package/package.json +36 -37
- package/cdk.out/asset.663163693e04179c71265b44a325be7e6b8c4e90b081883a1b3f3393de2546ea/watcher-handler.js +0 -89
- package/cdk.out/asset.d81bf2d4c389ecd69472cf4b27599e1ffbe0c1543104f45d035834e863f64ca7/index.js +0 -14129
- package/lib/chime-notifier/notifier-handler.js +0 -91
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handler = exports.codePipeline = void 0;
|
|
4
|
-
const https = require("https");
|
|
5
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
6
|
-
const AWS = require("aws-sdk");
|
|
7
|
-
// export for tests
|
|
8
|
-
exports.codePipeline = new AWS.CodePipeline();
|
|
9
|
-
/**
|
|
10
|
-
* Lambda handler for the codepipeline state change events
|
|
11
|
-
*
|
|
12
|
-
* {
|
|
13
|
-
* "version": "0",
|
|
14
|
-
* "id": event_Id,
|
|
15
|
-
* "detail-type": "CodePipeline Pipeline Execution State Change",
|
|
16
|
-
* "source": "aws.codepipeline",
|
|
17
|
-
* "account": Pipeline_Account,
|
|
18
|
-
* "time": TimeStamp,
|
|
19
|
-
* "region": "us-east-1",
|
|
20
|
-
* "resources": [
|
|
21
|
-
* "arn:aws:codepipeline:us-east-1:account_ID:myPipeline"
|
|
22
|
-
* ],
|
|
23
|
-
* "detail": {
|
|
24
|
-
* "pipeline": "myPipeline",
|
|
25
|
-
* "version": "1",
|
|
26
|
-
* "state": "STARTED",
|
|
27
|
-
* "execution-id": execution_Id
|
|
28
|
-
* }
|
|
29
|
-
* }
|
|
30
|
-
*/
|
|
31
|
-
async function handler(event) {
|
|
32
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
33
|
-
// Log the event so we can have a look in CloudWatch logs
|
|
34
|
-
process.stdout.write(`${JSON.stringify(event)}\n`);
|
|
35
|
-
const webhookUrls = event.webhookUrls || [];
|
|
36
|
-
if (webhookUrls.length === 0) {
|
|
37
|
-
throw new Error("Expected event field 'webhookUrls'");
|
|
38
|
-
}
|
|
39
|
-
const messageTemplate = event.message;
|
|
40
|
-
if (!messageTemplate) {
|
|
41
|
-
throw new Error("Expected event field 'message'");
|
|
42
|
-
}
|
|
43
|
-
const details = event.detail || {};
|
|
44
|
-
const pipelineName = details.pipeline;
|
|
45
|
-
const pipelineExecutionId = details['execution-id'];
|
|
46
|
-
if (!pipelineName || !pipelineExecutionId) {
|
|
47
|
-
process.stderr.write('Malformed event!\n');
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
// Describe the revision that caused the pipeline to fail
|
|
51
|
-
const response = await exports.codePipeline.getPipelineExecution({ pipelineName, pipelineExecutionId }).promise();
|
|
52
|
-
process.stdout.write(`${JSON.stringify(response)}\n`);
|
|
53
|
-
const firstArtifact = ((_b = (_a = response.pipelineExecution) === null || _a === void 0 ? void 0 : _a.artifactRevisions) !== null && _b !== void 0 ? _b : [])[0];
|
|
54
|
-
const revisionSummary = (_d = (_c = firstArtifact === null || firstArtifact === void 0 ? void 0 : firstArtifact.revisionSummary) !== null && _c !== void 0 ? _c : firstArtifact === null || firstArtifact === void 0 ? void 0 : firstArtifact.revisionId) !== null && _d !== void 0 ? _d : `execution ${pipelineExecutionId}`;
|
|
55
|
-
// Find the action that caused the pipeline to fail (no pagination for now)
|
|
56
|
-
const actionResponse = await exports.codePipeline.listActionExecutions({ pipelineName, filter: { pipelineExecutionId } }).promise();
|
|
57
|
-
process.stdout.write(`${JSON.stringify(actionResponse)}\n`);
|
|
58
|
-
const failingActionDetails = (actionResponse.actionExecutionDetails || []).find(d => d.status === 'Failed');
|
|
59
|
-
const failingAction = (_e = failingActionDetails === null || failingActionDetails === void 0 ? void 0 : failingActionDetails.actionName) !== null && _e !== void 0 ? _e : 'UNKNOWN';
|
|
60
|
-
const failureUrl = (_h = (_g = (_f = failingActionDetails === null || failingActionDetails === void 0 ? void 0 : failingActionDetails.output) === null || _f === void 0 ? void 0 : _f.executionResult) === null || _g === void 0 ? void 0 : _g.externalExecutionUrl) !== null && _h !== void 0 ? _h : '???';
|
|
61
|
-
const message = messageTemplate
|
|
62
|
-
.replace(/\$PIPELINE/g, pipelineName)
|
|
63
|
-
.replace(/\$REVISION/g, revisionSummary)
|
|
64
|
-
.replace(/\$ACTION/g, failingAction)
|
|
65
|
-
.replace(/\$URL/g, failureUrl);
|
|
66
|
-
// Post the failure to all given Chime webhook URLs
|
|
67
|
-
await Promise.all(webhookUrls.map(url => sendChimeNotification(url, message)));
|
|
68
|
-
}
|
|
69
|
-
exports.handler = handler;
|
|
70
|
-
async function sendChimeNotification(url, message) {
|
|
71
|
-
return new Promise((ok, ko) => {
|
|
72
|
-
const req = https.request(url, {
|
|
73
|
-
method: 'POST',
|
|
74
|
-
headers: {
|
|
75
|
-
'Content-Type': 'application/json',
|
|
76
|
-
},
|
|
77
|
-
}, (res) => {
|
|
78
|
-
if (res.statusCode !== 200) {
|
|
79
|
-
ko(new Error(`Server responded with ${res.statusCode}: ${JSON.stringify(res.headers)}`));
|
|
80
|
-
}
|
|
81
|
-
res.setEncoding('utf8');
|
|
82
|
-
res.on('data', () => { });
|
|
83
|
-
res.on('error', ko);
|
|
84
|
-
res.on('end', ok);
|
|
85
|
-
});
|
|
86
|
-
req.on('error', ko);
|
|
87
|
-
req.write(JSON.stringify({ Content: message }));
|
|
88
|
-
req.end();
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpZXItaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5vdGlmaWVyLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQy9CLDZEQUE2RDtBQUM3RCwrQkFBK0I7QUFHL0IsbUJBQW1CO0FBQ04sUUFBQSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7QUFFbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNJLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBVTs7SUFDdEMseURBQXlEO0lBQ3pELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbkQsTUFBTSxXQUFXLEdBQWEsS0FBSyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7SUFDdEQsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztLQUFFO0lBRXhGLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDdEMsSUFBSSxDQUFDLGVBQWUsRUFBRTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztLQUFFO0lBRTVFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ25DLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDdEMsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFcEQsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1FBQ3pDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDM0MsT0FBTztLQUNSO0lBRUQseURBQXlEO0lB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LEVBQUUsR0FBa0MsQ0FBQyxDQUFDLENBQUM7WUFDekQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrJztcblxuXG4vLyBleHBvcnQgZm9yIHRlc3RzXG5leHBvcnQgY29uc3QgY29kZVBpcGVsaW5lID0gbmV3IEFXUy5Db2RlUGlwZWxpbmUoKTtcblxuLyoqXG4gKiBMYW1iZGEgaGFuZGxlciBmb3IgdGhlIGNvZGVwaXBlbGluZSBzdGF0ZSBjaGFuZ2UgZXZlbnRzXG4gKlxuICoge1xuICogICAgIFwidmVyc2lvblwiOiBcIjBcIixcbiAqICAgICBcImlkXCI6IGV2ZW50X0lkLFxuICogICAgIFwiZGV0YWlsLXR5cGVcIjogXCJDb2RlUGlwZWxpbmUgUGlwZWxpbmUgRXhlY3V0aW9uIFN0YXRlIENoYW5nZVwiLFxuICogICAgIFwic291cmNlXCI6IFwiYXdzLmNvZGVwaXBlbGluZVwiLFxuICogICAgIFwiYWNjb3VudFwiOiBQaXBlbGluZV9BY2NvdW50LFxuICogICAgIFwidGltZVwiOiBUaW1lU3RhbXAsXG4gKiAgICAgXCJyZWdpb25cIjogXCJ1cy1lYXN0LTFcIixcbiAqICAgICBcInJlc291cmNlc1wiOiBbXG4gKiAgICAgICAgIFwiYXJuOmF3czpjb2RlcGlwZWxpbmU6dXMtZWFzdC0xOmFjY291bnRfSUQ6bXlQaXBlbGluZVwiXG4gKiAgICAgXSxcbiAqICAgICBcImRldGFpbFwiOiB7XG4gKiAgICAgICAgIFwicGlwZWxpbmVcIjogXCJteVBpcGVsaW5lXCIsXG4gKiAgICAgICAgIFwidmVyc2lvblwiOiBcIjFcIixcbiAqICAgICAgICAgXCJzdGF0ZVwiOiBcIlNUQVJURURcIixcbiAqICAgICAgICAgXCJleGVjdXRpb24taWRcIjogZXhlY3V0aW9uX0lkXG4gKiAgICAgfVxuICogfVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogYW55KSB7XG4gIC8vIExvZyB0aGUgZXZlbnQgc28gd2UgY2FuIGhhdmUgYSBsb29rIGluIENsb3VkV2F0Y2ggbG9nc1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtKU09OLnN0cmluZ2lmeShldmVudCl9XFxuYCk7XG5cbiAgY29uc3Qgd2ViaG9va1VybHM6IHN0cmluZ1tdID0gZXZlbnQud2ViaG9va1VybHMgfHwgW107XG4gIGlmICh3ZWJob29rVXJscy5sZW5ndGggPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgZXZlbnQgZmllbGQgJ3dlYmhvb2tVcmxzJ1wiKTsgfVxuXG4gIGNvbnN0IG1lc3NhZ2VUZW1wbGF0ZSA9IGV2ZW50Lm1lc3NhZ2U7XG4gIGlmICghbWVzc2FnZVRlbXBsYXRlKSB7IHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGV2ZW50IGZpZWxkICdtZXNzYWdlJ1wiKTsgfVxuXG4gIGNvbnN0IGRldGFpbHMgPSBldmVudC5kZXRhaWwgfHwge307XG4gIGNvbnN0IHBpcGVsaW5lTmFtZSA9IGRldGFpbHMucGlwZWxpbmU7XG4gIGNvbnN0IHBpcGVsaW5lRXhlY3V0aW9uSWQgPSBkZXRhaWxzWydleGVjdXRpb24taWQnXTtcblxuICBpZiAoIXBpcGVsaW5lTmFtZSB8fCAhcGlwZWxpbmVFeGVjdXRpb25JZCkge1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdNYWxmb3JtZWQgZXZlbnQhXFxuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVzY3JpYmUgdGhlIHJldmlzaW9uIHRoYXQgY2F1c2VkIHRoZSBwaXBlbGluZSB0byBmYWlsXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29kZVBpcGVsaW5lLmdldFBpcGVsaW5lRXhlY3V0aW9uKHsgcGlwZWxpbmVOYW1lLCBwaXBlbGluZUV4ZWN1dGlvbklkIH0pLnByb21pc2UoKTtcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfVxcbmApO1xuICBjb25zdCBmaXJzdEFydGlmYWN0OiBBV1MuQ29kZVBpcGVsaW5lLkFydGlmYWN0UmV2aXNpb24gfCB1bmRlZmluZWQgPSAocmVzcG9uc2UucGlwZWxpbmVFeGVjdXRpb24/LmFydGlmYWN0UmV2aXNpb25zID8/IFtdKVswXTtcbiAgY29uc3QgcmV2aXNpb25TdW1tYXJ5ID0gZmlyc3RBcnRpZmFjdD8ucmV2aXNpb25TdW1tYXJ5ID8/IGZpcnN0QXJ0aWZhY3Q/LnJldmlzaW9uSWQgPz8gYGV4ZWN1dGlvbiAke3BpcGVsaW5lRXhlY3V0aW9uSWR9YDtcblxuICAvLyBGaW5kIHRoZSBhY3Rpb24gdGhhdCBjYXVzZWQgdGhlIHBpcGVsaW5lIHRvIGZhaWwgKG5vIHBhZ2luYXRpb24gZm9yIG5vdylcbiAgY29uc3QgYWN0aW9uUmVzcG9uc2UgPSBhd2FpdCBjb2RlUGlwZWxpbmUubGlzdEFjdGlvbkV4ZWN1dGlvbnMoeyBwaXBlbGluZU5hbWUsIGZpbHRlcjogeyBwaXBlbGluZUV4ZWN1dGlvbklkIH0gfSkucHJvbWlzZSgpO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtKU09OLnN0cmluZ2lmeShhY3Rpb25SZXNwb25zZSl9XFxuYCk7XG4gIGNvbnN0IGZhaWxpbmdBY3Rpb25EZXRhaWxzID0gKGFjdGlvblJlc3BvbnNlLmFjdGlvbkV4ZWN1dGlvbkRldGFpbHMgfHwgW10pLmZpbmQoZCA9PiBkLnN0YXR1cyA9PT0gJ0ZhaWxlZCcpO1xuICBjb25zdCBmYWlsaW5nQWN0aW9uID0gZmFpbGluZ0FjdGlvbkRldGFpbHM/LmFjdGlvbk5hbWUgPz8gJ1VOS05PV04nO1xuICBjb25zdCBmYWlsdXJlVXJsID0gZmFpbGluZ0FjdGlvbkRldGFpbHM/Lm91dHB1dD8uZXhlY3V0aW9uUmVzdWx0Py5leHRlcm5hbEV4ZWN1dGlvblVybCA/PyAnPz8/JztcblxuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVRlbXBsYXRlXG4gICAgLnJlcGxhY2UoL1xcJFBJUEVMSU5FL2csIHBpcGVsaW5lTmFtZSlcbiAgICAucmVwbGFjZSgvXFwkUkVWSVNJT04vZywgcmV2aXNpb25TdW1tYXJ5KVxuICAgIC5yZXBsYWNlKC9cXCRBQ1RJT04vZywgZmFpbGluZ0FjdGlvbilcbiAgICAucmVwbGFjZSgvXFwkVVJML2csIGZhaWx1cmVVcmwpO1xuXG4gIC8vIFBvc3QgdGhlIGZhaWx1cmUgdG8gYWxsIGdpdmVuIENoaW1lIHdlYmhvb2sgVVJMc1xuICBhd2FpdCBQcm9taXNlLmFsbCh3ZWJob29rVXJscy5tYXAodXJsID0+IHNlbmRDaGltZU5vdGlmaWNhdGlvbih1cmwsIG1lc3NhZ2UpKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmRDaGltZU5vdGlmaWNhdGlvbih1cmw6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgob2ssIGtvKSA9PiB7XG4gICAgY29uc3QgcmVxID0gaHR0cHMucmVxdWVzdCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9LCAocmVzKSA9PiB7XG4gICAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICBrbyhuZXcgRXJyb3IoYFNlcnZlciByZXNwb25kZWQgd2l0aCAke3Jlcy5zdGF0dXNDb2RlfTogJHtKU09OLnN0cmluZ2lmeShyZXMuaGVhZGVycyl9YCkpO1xuICAgICAgfVxuXG4gICAgICByZXMuc2V0RW5jb2RpbmcoJ3V0ZjgnKTtcbiAgICAgIHJlcy5vbignZGF0YScsICgpID0+IHsgLyogZ29iYmxlIGdvYmJsZSBhbmQgaWdub3JlICovIH0pO1xuICAgICAgcmVzLm9uKCdlcnJvcicsIGtvKTtcbiAgICAgIHJlcy5vbignZW5kJywgb2spO1xuICAgIH0pO1xuXG4gICAgcmVxLm9uKCdlcnJvcicsIGtvKTtcbiAgICByZXEud3JpdGUoSlNPTi5zdHJpbmdpZnkoeyBDb250ZW50OiBtZXNzYWdlIH0pKTtcbiAgICByZXEuZW5kKCk7XG4gIH0pO1xufSJdfQ==
|