aws-delivlib
Version:
A fabulous library for defining continuous pipelines for building, testing and releasing code libraries.
132 lines • 17.1 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 (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateProperties = exports.RequestType = exports.Status = exports.sendResponse = exports.customResourceHandler = void 0;
const https = __importStar(require("https"));
const url = __importStar(require("url"));
/**
* Implements a Lambda CloudFormation custom resource handler.
*
* @param handleEvent the handler function that creates, updates and deletes the resource.
* @param refAttribute the name of the attribute holindg the Physical ID of the resource.
* @returns a handler function.
*/
function customResourceHandler(handleEvent) {
return async (event, context) => {
try {
// eslint-disable-next-line no-console
console.log(`Input event: ${JSON.stringify(event)}`);
const attributes = await handleEvent(event, context);
// eslint-disable-next-line no-console
console.log(`Attributes: ${JSON.stringify(attributes)}`);
await exports.sendResponse(event, Status.SUCCESS, attributes.Ref, attributes);
}
catch (e) {
// eslint-disable-next-line no-console
console.error(e);
await exports.sendResponse(event, Status.FAILED, event.PhysicalResourceId, {}, e.message);
}
};
}
exports.customResourceHandler = customResourceHandler;
/**
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-ref-responses.html
*/
function sendResponse(event, status, physicalResourceId = event.PhysicalResourceId || event.LogicalResourceId, data, reason) {
const responseBody = JSON.stringify({
Data: data,
LogicalResourceId: event.LogicalResourceId,
PhysicalResourceId: physicalResourceId,
Reason: reason,
RequestId: event.RequestId,
StackId: event.StackId,
Status: status,
}, null, 2);
// eslint-disable-next-line no-console
console.log(`Response body: ${responseBody}`);
const parsedUrl = url.parse(event.ResponseURL);
const options = {
headers: {
'content-length': responseBody.length,
'content-type': '',
},
hostname: parsedUrl.hostname,
method: 'PUT',
path: parsedUrl.path,
port: parsedUrl.port || 443,
};
return new Promise((ok, ko) => {
// eslint-disable-next-line no-console
console.log('Sending response...');
const req = https.request(options, resp => {
// eslint-disable-next-line no-console
console.log(`Received HTTP ${resp.statusCode} (${resp.statusMessage})`);
if (resp.statusCode === 200) {
return ok();
}
ko(new Error(`Unexpected error sending resopnse to CloudFormation: HTTP ${resp.statusCode} (${resp.statusMessage})`));
});
req.once('error', ko);
req.write(responseBody);
req.end();
});
}
exports.sendResponse = sendResponse;
var Status;
(function (Status) {
Status["SUCCESS"] = "SUCCESS";
Status["FAILED"] = "FAILED";
})(Status = exports.Status || (exports.Status = {}));
var RequestType;
(function (RequestType) {
RequestType["CREATE"] = "Create";
RequestType["UPDATE"] = "Update";
RequestType["DELETE"] = "Delete";
})(RequestType = exports.RequestType || (exports.RequestType = {}));
/**
* Validates that all required properties are present, and that no extraneous properties are provided.
*
* @param props the properties to be validated.
* @param validProps a mapping of valid property names to a boolean instructing whether the property is required or not.
*/
function validateProperties(props, validProps) {
// ServiceToken is always accepted (technically required, but we don't care about it internally, unless the caller said we do)
validProps.ServiceToken = validProps.ServiceToken || false;
// ResourceVersion is injected by the Lambda handler, and is permitted but not required, unless the caller said it is.
validProps.ResourceVersion = validProps.ResourceVersion || false;
for (const property of Object.keys(props)) {
if (!(property in validProps)) {
throw new Error(`Unexpected property: ${property}`);
}
}
for (const property of Object.keys(validProps)) {
if (validProps[property] && !(property in props)) {
throw new Error(`Missing required property: ${property}`);
}
}
return props;
}
exports.validateProperties = validateProperties;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2Nsb3VkLWZvcm1hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIl9jbG91ZC1mb3JtYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBK0I7QUFDL0IseUNBQTJCO0FBTTNCOzs7Ozs7R0FNRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLFdBQTRCO0lBQ2hFLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUM5QixJQUFJO1lBQ0Ysc0NBQXNDO1lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXJELE1BQU0sVUFBVSxHQUFHLE1BQU0sV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUVyRCxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXpELE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQy9FO1FBQUMsT0FBTyxDQUFNLEVBQUU7WUFDZixzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixNQUFNLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0Y7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDO0FBbEJELHNEQWtCQztBQWFEOztHQUVHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLEtBQVksRUFDdkMsTUFBYyxFQUNkLHFC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Q0FBQyxFQUFFO1FBQ3pDLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQ3JEO0tBQ0Y7SUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDOUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO0tBQ0Y7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFqQkQsZ0RBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0ICogYXMgdXJsIGZyb20gJ3VybCc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnLi9fbGFtYmRhJztcblxuZXhwb3J0IHR5cGUgTGFtYmRhSGFuZGxlciA9IChldmVudDogRXZlbnQsIGNvbnRleHQ6IGxhbWJkYS5Db250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+O1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VIYW5kbGVyID0gKGV2ZW50OiBFdmVudCwgY29udGV4dDogbGFtYmRhLkNvbnRleHQpID0+IFByb21pc2U8UmVzb3VyY2VBdHRyaWJ1dGVzPjtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgTGFtYmRhIENsb3VkRm9ybWF0aW9uIGN1c3RvbSByZXNvdXJjZSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBoYW5kbGVFdmVudCAgdGhlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBjcmVhdGVzLCB1cGRhdGVzIGFuZCBkZWxldGVzIHRoZSByZXNvdXJjZS5cbiAqIEBwYXJhbSByZWZBdHRyaWJ1dGUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBob2xpbmRnIHRoZSBQaHlzaWNhbCBJRCBvZiB0aGUgcmVzb3VyY2UuXG4gKiBAcmV0dXJucyBhIGhhbmRsZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXN0b21SZXNvdXJjZUhhbmRsZXIoaGFuZGxlRXZlbnQ6IFJlc291cmNlSGFuZGxlcik6IExhbWJkYUhhbmRsZXIge1xuICByZXR1cm4gYXN5bmMgKGV2ZW50LCBjb250ZXh0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhgSW5wdXQgZXZlbnQ6ICR7SlNPTi5zdHJpbmdpZnkoZXZlbnQpfWApO1xuXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gYXdhaXQgaGFuZGxlRXZlbnQoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5sb2coYEF0dHJpYnV0ZXM6ICR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlcyl9YCk7XG5cbiAgICAgIGF3YWl0IGV4cG9ydHMuc2VuZFJlc3BvbnNlKGV2ZW50LCBTdGF0dXMuU1VDQ0VTUywgYXR0cmlidXRlcy5SZWYsIGF0dHJpYnV0ZXMpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICBhd2FpdCBleHBvcnRzLnNlbmRSZXNwb25zZShldmVudCwgU3RhdHVzLkZBSUxFRCwgZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkLCB7fSwgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogR2VuZXJhbCBzaGFwZSBvZiBjdXN0b20gcmVzb3VyY2UgYXR0cmlidXRlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUF0dHJpYnV0ZXMge1xuICAvKiogVGhlIHBoeXNpY2FsIHJlZmVyZW5jZSB0byB0aGlzIHJlc291cmNlIGluc3RhbmNlLiAqL1xuICBSZWY6IHN0cmluZztcblxuICAvKiogT3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgcmVzb3VyY2UuICovXG4gIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2NycGctcmVmLXJlc3BvbnNlcy5odG1sXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZW5kUmVzcG9uc2UoZXZlbnQ6IEV2ZW50LFxuICBzdGF0dXM6IFN0YXR1cyxcbiAgcGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmcgPSBldmVudC5QaHlzaWNhbFJlc291cmNlSWQgfHwgZXZlbnQuTG9naWNhbFJlc291cmNlSWQsXG4gIGRhdGE6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9LFxuICByZWFzb24/OiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzcG9uc2VCb2R5ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIERhdGE6IGRhdGEsXG4gICAgTG9naWNhbFJlc291cmNlSWQ6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkLFxuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogcGh5c2ljYWxSZXNvdXJjZUlkLFxuICAgIFJlYXNvbjogcmVhc29uLFxuICAgIFJlcXVlc3RJZDogZXZlbnQuUmVxdWVzdElkLFxuICAgIFN0YWNrSWQ6IGV2ZW50LlN0YWNrSWQsXG4gICAgU3RhdHVzOiBzdGF0dXMsXG4gIH0sIG51bGwsIDIpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUubG9nKGBSZXNwb25zZSBib2R5OiAke3Jlc3BvbnNlQm9keX1gKTtcblxuICBjb25zdCBwYXJzZWRVcmwgPSB1cmwucGFyc2UoZXZlbnQuUmVzcG9uc2VVUkwpO1xuICBjb25zdCBvcHRpb25zOiBodHRwcy5SZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnY29udGVudC1sZW5ndGgnOiByZXNwb25zZUJvZHkubGVuZ3RoLFxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICcnLFxuICAgIH0sXG4gICAgaG9zdG5hbWU6IHBhcnNlZFVybC5ob3N0bmFtZSxcbiAgICBtZXRob2Q6ICdQVVQnLFxuICAgIHBhdGg6IHBhcnNlZFVybC5wYXRoLFxuICAgIHBvcnQ6IHBhcnNlZFVybC5wb3J0IHx8IDQ0MyxcbiAgfTtcblxuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKG9rLCBrbykgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coJ1NlbmRpbmcgcmVzcG9uc2UuLi4nKTtcblxuICAgIGNvbnN0IHJlcSA9IGh0dHBzLnJlcXVlc3Qob3B0aW9ucywgcmVzcCA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5sb2coYFJlY2VpdmVkIEhUVFAgJHtyZXNwLnN0YXR1c0NvZGV9ICgke3Jlc3Auc3RhdHVzTWVzc2FnZX0pYCk7XG4gICAgICBpZiAocmVzcC5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgcmV0dXJuIG9rKCk7XG4gICAgICB9XG4gICAgICBrbyhuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZXJyb3Igc2VuZGluZyByZXNvcG5zZSB0byBDbG91ZEZvcm1hdGlvbjogSFRUUCAke3Jlc3Auc3RhdHVzQ29kZX0gKCR7cmVzcC5zdGF0dXNNZXNzYWdlfSlgKSk7XG4gICAgfSk7XG5cbiAgICByZXEub25jZSgnZXJyb3InLCBrbyk7XG4gICAgcmVxLndyaXRlKHJlc3BvbnNlQm9keSk7XG5cbiAgICByZXEuZW5kKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZW51bSBTdGF0dXMge1xuICBTVUNDRVNTID0gJ1NVQ0NFU1MnLFxuICBGQUlMRUQgPSAnRkFJTEVEJyxcbn1cblxuZXhwb3J0IGVudW0gUmVxdWVzdFR5cGUge1xuICBDUkVBVEUgPSAnQ3JlYXRlJyxcbiAgVVBEQVRFID0gJ1VwZGF0ZScsXG4gIERFTEVURSA9ICdEZWxldGUnLFxufVxuXG4vKiogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9jcnBnLXJlZi1yZXF1ZXN0cy5odG1sICovXG5leHBvcnQgdHlwZSBFdmVudCA9IENyZWF0ZUV2ZW50IHwgVXBkYXRlRXZlbnQgfCBEZWxldGVFdmVudDtcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZvcm1hdGlvbkV2ZW50QmFzZSB7XG4gIHJlYWRvbmx5IFJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZTtcbiAgcmVhZG9ubHkgUmVzcG9uc2VVUkw6IHN0cmluZztcbiAgcmVhZG9ubHkgU3RhY2tJZDogc3RyaW5nO1xuICByZWFkb25seSBSZXF1ZXN0SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgUmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IExvZ2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IFJlc291cmNlUHJvcGVydGllczogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRXZlbnQgZXh0ZW5kcyBDbG91ZEZvcm1hdGlvbkV2ZW50QmFzZSB7XG4gIHJlYWRvbmx5IFJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZS5DUkVBVEU7XG4gIHJlYWRvbmx5IFBoeXNpY2FsUmVzb3VyY2VJZDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUV2ZW50IGV4dGVuZHMgQ2xvdWRGb3JtYXRpb25FdmVudEJhc2Uge1xuICByZWFkb25seSBSZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUuVVBEQVRFO1xuICByZWFkb25seSBQaHlzaWNhbFJlc291cmNlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgT2xkUmVzb3VyY2VQcm9wZXJ0aWVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWxldGVFdmVudCBleHRlbmRzIENsb3VkRm9ybWF0aW9uRXZlbnRCYXNlIHtcbiAgcmVhZG9ubHkgUmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlLkRFTEVURTtcbiAgcmVhZG9ubHkgUGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoYXQgYWxsIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIHByZXNlbnQsIGFuZCB0aGF0IG5vIGV4dHJhbmVvdXMgcHJvcGVydGllcyBhcmUgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIHByb3BzICAgICAgdGhlIHByb3BlcnRpZXMgdG8gYmUgdmFsaWRhdGVkLlxuICogQHBhcmFtIHZhbGlkUHJvcHMgYSBtYXBwaW5nIG9mIHZhbGlkIHByb3BlcnR5IG5hbWVzIHRvIGEgYm9vbGVhbiBpbnN0cnVjdGluZyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZCBvciBub3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMocHJvcHM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB2YWxpZFByb3BzOiB7IFtuYW1lOiBzdHJpbmddOiBib29sZWFuIH0pIHtcbiAgLy8gU2VydmljZVRva2VuIGlzIGFsd2F5cyBhY2NlcHRlZCAodGVjaG5pY2FsbHkgcmVxdWlyZWQsIGJ1dCB3ZSBkb24ndCBjYXJlIGFib3V0IGl0IGludGVybmFsbHksIHVubGVzcyB0aGUgY2FsbGVyIHNhaWQgd2UgZG8pXG4gIHZhbGlkUHJvcHMuU2VydmljZVRva2VuID0gdmFsaWRQcm9wcy5TZXJ2aWNlVG9rZW4gfHwgZmFsc2U7XG4gIC8vIFJlc291cmNlVmVyc2lvbiBpcyBpbmplY3RlZCBieSB0aGUgTGFtYmRhIGhhbmRsZXIsIGFuZCBpcyBwZXJtaXR0ZWQgYnV0IG5vdCByZXF1aXJlZCwgdW5sZXNzIHRoZSBjYWxsZXIgc2FpZCBpdCBpcy5cbiAgdmFsaWRQcm9wcy5SZXNvdXJjZVZlcnNpb24gPSB2YWxpZFByb3BzLlJlc291cmNlVmVyc2lvbiB8fCBmYWxzZTtcblxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHByb3BzKSkge1xuICAgIGlmICghKHByb3BlcnR5IGluIHZhbGlkUHJvcHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgcHJvcGVydHk6ICR7cHJvcGVydHl9YCk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModmFsaWRQcm9wcykpIHtcbiAgICBpZiAodmFsaWRQcm9wc1twcm9wZXJ0eV0gJiYgIShwcm9wZXJ0eSBpbiBwcm9wcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eTogJHtwcm9wZXJ0eX1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb3BzO1xufVxuIl19