UNPKG

cdk-iot-greengrass-fleet-provisioning

Version:

CDK Construct for AWS IoT Greengrass Fleet Provisioning (with AWS IoT Certificates)

186 lines 23.7 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 __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createResource = createResource; exports.deleteResource = deleteResource; const client_iot_1 = require("@aws-sdk/client-iot"); const client_s3_1 = require("@aws-sdk/client-s3"); const client_ssm_1 = require("@aws-sdk/client-ssm"); __exportStar(require("./types"), exports); __exportStar(require("./iot"), exports); __exportStar(require("./s3"), exports); __exportStar(require("./ssm"), exports); const iot_1 = require("./iot"); const s3_1 = require("./s3"); const ssm_1 = require("./ssm"); const iotClient = (0, iot_1.IoTClientAdapter)(new client_iot_1.IoTClient()); const ssmClient = (0, ssm_1.SSMClientAdapter)(new client_ssm_1.SSMClient()); const s3Client = (0, s3_1.S3ClientAdapter)(new client_s3_1.S3Client()); async function createResource(resource) { const { certificateId, certificateArn, certificatePem, keyPair } = await iotClient.createKeysAndCertificate(); console.log(`Iot Certificate - Created Certificate with Id ${certificateId}`); const pathCertificate = `${resource.CertificatePrefix}/${certificateId}`; const pathCertificatePem = `${pathCertificate}.pem`; const pathCertificatePrivateKey = `${pathCertificate}.key.prv`; const pathCertificatePublicKey = `${pathCertificate}.key.pub`; const pathCertificateRoot = `${pathCertificate}.root`; const response = await fetch('https://www.amazontrust.com/repository/AmazonRootCA1.pem'); const buffer = await response.arrayBuffer(); const certificateRootCA = Buffer.from(buffer).toString(); await s3Client.putObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificate}`, Body: certificateId, }); await s3Client.putObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificate}.arn`, Body: certificateArn, }); await s3Client.putObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificatePem}`, Body: certificatePem, }); await s3Client.putObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificatePrivateKey}`, Body: keyPair?.PrivateKey, }); await s3Client.putObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificatePublicKey}`, Body: keyPair?.PublicKey, }); await s3Client.putObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificateRoot}`, Body: certificateRootCA, }); await ssmClient.putParameter({ Name: `/${resource.ResourcePrefix}/certificateId`, Value: `${certificateId}`, Type: 'String', Overwrite: true, }); await ssmClient.putParameter({ Name: `/${resource.ResourcePrefix}/${certificateId}/pem`, Value: `${certificatePem}`, Type: 'String', Overwrite: true, }); await ssmClient.putParameter({ Name: `/${resource.ResourcePrefix}/${certificateId}/key-private`, Value: `${keyPair.PrivateKey}`, Type: 'String', Overwrite: true, }); await ssmClient.putParameter({ Name: `/${resource.ResourcePrefix}/${certificateId}/key-public`, Value: `${keyPair.PublicKey}`, Type: 'String', Overwrite: true, }); await ssmClient.putParameter({ Name: `/${resource.ResourcePrefix}/${certificateId}/root-ca`, Value: `${certificateRootCA}`, Type: 'String', Overwrite: true, }); const credentialEndpointAddress = await iotClient.describeEndpoint({ endpointType: 'iot:CredentialProvider', }); const dataEndpointAddress = await iotClient.describeEndpoint({ endpointType: 'iot:CredentialProvider', }); ; return { certificateId: certificateId, certificateArn: certificateArn, credentialEndpointAddress: credentialEndpointAddress.endpointAddress, dataEndpointAddress: dataEndpointAddress.endpointAddress, // s3CertificatePem: `s3://${resource.CertificateBucketName}/${pathCertificatePem}`, // s3CertificatePrivateKey: `s3://${resource.CertificateBucketName}/${pathCertificatePrivateKey}`, // s3CertificatePublicKey: `s3://${resource.CertificateBucketName}/${pathCertificatePublicKey}`, // s3CertificateRoot: `s3://${resource.CertificateBucketName}/${pathCertificateRoot}`, // ssmParamCertificateId: `/${resource.ResourcePrefix}/certificateId`, // ssmParamCertificatePem: `/${resource.ResourcePrefix}/${certificateId}/pem`, // ssmParamCertificatePrivateKey: `/${resource.ResourcePrefix}/${certificateId}/key-private`, // ssmParamCertificatePublicKey: `/${resource.ResourcePrefix}/${certificateId}/key-public`, // ssmParamCertificateRoot: `/${resource.ResourcePrefix}/${certificateId}/root-ca`, }; } async function deleteResource(resource, certificateId) { const pathCertificate = `${resource.CertificatePrefix}/${certificateId}`; const pathCertificatePem = `${pathCertificate}.pem`; const pathCertificatePrivateKey = `${pathCertificate}.key.prv`; const pathCertificatePublicKey = `${pathCertificate}.key.pub`; const pathCertificateRoot = `${pathCertificate}.root`; await s3Client.deleteObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificate}`, }); await s3Client.deleteObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificate}.arn`, }); await s3Client.deleteObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificatePem}`, }); await s3Client.deleteObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificatePrivateKey}`, }); await s3Client.deleteObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificatePublicKey}`, }); await s3Client.deleteObject({ Bucket: resource.CertificateBucketName, Key: `${pathCertificateRoot}`, }); // delete if it's the current one const ssmParamCertificateId = await ssmClient.getParameter({ Name: `/${resource.ResourcePrefix}/certificateId`, }); if (ssmParamCertificateId.Parameter?.Value === certificateId) { await ssmClient.deleteParameter({ Name: `/${resource.ResourcePrefix}/certificateId`, }); } await ssmClient.deleteParameter({ Name: `/${resource.ResourcePrefix}/${certificateId}/pem`, }); await ssmClient.deleteParameter({ Name: `/${resource.ResourcePrefix}/${certificateId}/key-private`, }); await ssmClient.deleteParameter({ Name: `/${resource.ResourcePrefix}/${certificateId}/key-public`, }); await ssmClient.deleteParameter({ Name: `/${resource.ResourcePrefix}/${certificateId}/root-ca`, }); await iotClient.updateCertificate({ certificateId: certificateId, newStatus: 'INACTIVE', }); await iotClient.deleteCertificate({ certificateId: certificateId, }); return {}; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ3JlZW5ncmFzcy1mbGVldC1wcm92aXNpb25pbmcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQSx3Q0FvR0M7QUFFRCx3Q0FpRUM7QUE5TEQsb0RBQWdEO0FBQ2hELGtEQUE4QztBQUM5QyxvREFBZ0Q7QUFFaEQsMENBQXdCO0FBQ3hCLHdDQUFzQjtBQUN0Qix1Q0FBcUI7QUFDckIsd0NBQXNCO0FBRXRCLCtCQUF5QztBQUN6Qyw2QkFBdUM7QUFDdkMsK0JBQXlDO0FBUXpDLE1BQU0sU0FBUyxHQUFHLElBQUEsc0JBQWdCLEVBQUMsSUFBSSxzQkFBUyxFQUFFLENBQUMsQ0FBQztBQUNwRCxNQUFNLFNBQVMsR0FBRyxJQUFBLHNCQUFnQixFQUFDLElBQUksc0JBQVMsRUFBRSxDQUFDLENBQUM7QUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBQSxvQkFBZSxFQUFDLElBQUksb0JBQVEsRUFBRSxDQUFDLENBQUM7QUFFMUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxRQUE0QjtJQUMvRCxNQUFNLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUM5RyxPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBRTlFLE1BQU0sZUFBZSxHQUFXLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQ2pGLE1BQU0sa0JBQWtCLEdBQVcsR0FBRyxlQUFlLE1BQU0sQ0FBQztJQUM1RCxNQUFNLHlCQUF5QixHQUFXLEdBQUcsZUFBZSxVQUFVLENBQUM7SUFDdkUsTUFBTSx3QkFBd0IsR0FBVyxHQUFHLGVBQWUsVUFBVSxDQUFDO0lBQ3RFLE1BQU0sbUJBQW1CLEdBQVcsR0FBRyxlQUFlLE9B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LGFBQWEsTUFBTTtLQUN6RCxDQUFDLENBQUM7SUFDSCxNQUFNLFNBQVMsQ0FBQyxlQUFlLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUksUUFBUSxDQUFDLGNBQWMsSUFBSSxhQUFhLGNBQWM7S0FDakUsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxTQUFTLENBQUMsZUFBZSxDQUFDO1FBQzlCLElBQUksRUFBRSxJQUFJLFFBQVEsQ0FBQyxjQUFjLElBQUksYUFBYSxhQUFhO0tBQ2hFLENBQUMsQ0FBQztJQUNILE1BQU0sU0FBUyxDQUFDLGVBQWUsQ0FBQztRQUM5QixJQUFJLEVBQUUsSUFBSSxRQUFRLENBQUMsY0FBYyxJQUFJLGFBQWEsVUFBVTtLQUM3RCxDQUFDLENBQUM7SUFFSCxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNoQyxhQUFhLEVBQUUsYUFBYTtRQUM1QixTQUFTLEVBQUUsVUFBVTtLQUN0QixDQUFDLENBQUM7SUFDSCxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNoQyxhQUFhLEVBQUUsYUFBYTtLQUM3QixDQUFDLENBQUM7SUFFSCxPQUFPLEVBQ04sQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJb1RDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtaW90JztcbmltcG9ydCB7IFMzQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJztcbmltcG9ydCB7IFNTTUNsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zc20nO1xuXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW90JztcbmV4cG9ydCAqIGZyb20gJy4vczMnO1xuZXhwb3J0ICogZnJvbSAnLi9zc20nO1xuXG5pbXBvcnQgeyBJb1RDbGllbnRBZGFwdGVyIH0gZnJvbSAnLi9pb3QnO1xuaW1wb3J0IHsgUzNDbGllbnRBZGFwdGVyIH0gZnJvbSAnLi9zMyc7XG5pbXBvcnQgeyBTU01DbGllbnRBZGFwdGVyIH0gZnJvbSAnLi9zc20nO1xuXG5pbXBvcnQge1xuICBDcmVhdGVSZXNvdXJjZXNSZXNwb25zZSxcbiAgRGVsZXRlUmVzb3VyY2VzUmVzcG9uc2UsXG4gIFJlc291cmNlUHJvcGVydGllcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IGlvdENsaWVudCA9IElvVENsaWVudEFkYXB0ZXIobmV3IElvVENsaWVudCgpKTtcbmNvbnN0IHNzbUNsaWVudCA9IFNTTUNsaWVudEFkYXB0ZXIobmV3IFNTTUNsaWVudCgpKTtcbmNvbnN0IHMzQ2xpZW50ID0gUzNDbGllbnRBZGFwdGVyKG5ldyBTM0NsaWVudCgpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlc291cmNlKHJlc291cmNlOiBSZXNvdXJjZVByb3BlcnRpZXMpOiBQcm9taXNlPENyZWF0ZVJlc291cmNlc1Jlc3BvbnNlPiB7XG4gIGNvbnN0IHsgY2VydGlmaWNhdGVJZCwgY2VydGlmaWNhdGVBcm4sIGNlcnRpZmljYXRlUGVtLCBrZXlQYWlyIH0gPSBhd2FpdCBpb3RDbGllbnQuY3JlYXRlS2V5c0FuZENlcnRpZmljYXRlKCk7XG4gIGNvbnNvbGUubG9nKGBJb3QgQ2VydGlmaWNhdGUgLSBDcmVhdGVkIENlcnRpZmljYXRlIHdpdGggSWQgJHtjZXJ0aWZpY2F0ZUlkfWApO1xuXG4gIGNvbnN0IHBhdGhDZXJ0aWZpY2F0ZTogc3RyaW5nID0gYCR7cmVzb3VyY2UuQ2VydGlmaWNhdGVQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH1gO1xuICBjb25zdCBwYXRoQ2VydGlmaWNhdGVQZW06IHN0cmluZyA9IGAke3BhdGhDZXJ0aWZpY2F0ZX0ucGVtYDtcbiAgY29uc3QgcGF0aENlcnRpZmljYXRlUHJpdmF0ZUtleTogc3RyaW5nID0gYCR7cGF0aENlcnRpZmljYXRlfS5rZXkucHJ2YDtcbiAgY29uc3QgcGF0aENlcnRpZmljYXRlUHVibGljS2V5OiBzdHJpbmcgPSBgJHtwYXRoQ2VydGlmaWNhdGV9LmtleS5wdWJgO1xuICBjb25zdCBwYXRoQ2VydGlmaWNhdGVSb290OiBzdHJpbmcgPSBgJHtwYXRoQ2VydGlmaWNhdGV9LnJvb3RgO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vd3d3LmFtYXpvbnRydXN0LmNvbS9yZXBvc2l0b3J5L0FtYXpvblJvb3RDQTEucGVtJyk7XG4gIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gIGNvbnN0IGNlcnRpZmljYXRlUm9vdENBOiBzdHJpbmcgPSBCdWZmZXIuZnJvbShidWZmZXIpLnRvU3RyaW5nKCk7XG5cbiAgYXdhaXQgczNDbGllbnQucHV0T2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZX1gLFxuICAgIEJvZHk6IGNlcnRpZmljYXRlSWQsXG4gIH0pO1xuICBhd2FpdCBzM0NsaWVudC5wdXRPYmplY3Qoe1xuICAgIEJ1Y2tldDogcmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lLFxuICAgIEtleTogYCR7cGF0aENlcnRpZmljYXRlfS5hcm5gLFxuICAgIEJvZHk6IGNlcnRpZmljYXRlQXJuLFxuICB9KTtcbiAgYXdhaXQgczNDbGllbnQucHV0T2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZVBlbX1gLFxuICAgIEJvZHk6IGNlcnRpZmljYXRlUGVtLFxuICB9KTtcbiAgYXdhaXQgczNDbGllbnQucHV0T2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZVByaXZhdGVLZXl9YCxcbiAgICBCb2R5OiBrZXlQYWlyPy5Qcml2YXRlS2V5LFxuICB9KTtcbiAgYXdhaXQgczNDbGllbnQucHV0T2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZVB1YmxpY0tleX1gLFxuICAgIEJvZHk6IGtleVBhaXI/LlB1YmxpY0tleSxcbiAgfSk7XG4gIGF3YWl0IHMzQ2xpZW50LnB1dE9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGVSb290fWAsXG4gICAgQm9keTogY2VydGlmaWNhdGVSb290Q0EsXG4gIH0pO1xuXG4gIGF3YWl0IHNzbUNsaWVudC5wdXRQYXJhbWV0ZXIoe1xuICAgIE5hbWU6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vY2VydGlmaWNhdGVJZGAsXG4gICAgVmFsdWU6IGAke2NlcnRpZmljYXRlSWR9YCxcbiAgICBUeXBlOiAnU3RyaW5nJyxcbiAgICBPdmVyd3JpdGU6IHRydWUsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQucHV0UGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcGVtYCxcbiAgICBWYWx1ZTogYCR7Y2VydGlmaWNhdGVQZW19YCxcbiAgICBUeXBlOiAnU3RyaW5nJyxcbiAgICBPdmVyd3JpdGU6IHRydWUsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQucHV0UGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0va2V5LXByaXZhdGVgLFxuICAgIFZhbHVlOiBgJHtrZXlQYWlyIS5Qcml2YXRlS2V5IX1gLFxuICAgIFR5cGU6ICdTdHJpbmcnLFxuICAgIE92ZXJ3cml0ZTogdHJ1ZSxcbiAgfSk7XG4gIGF3YWl0IHNzbUNsaWVudC5wdXRQYXJhbWV0ZXIoe1xuICAgIE5hbWU6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfS9rZXktcHVibGljYCxcbiAgICBWYWx1ZTogYCR7a2V5UGFpciEuUHVibGljS2V5IX1gLFxuICAgIFR5cGU6ICdTdHJpbmcnLFxuICAgIE92ZXJ3cml0ZTogdHJ1ZSxcbiAgfSk7XG4gIGF3YWl0IHNzbUNsaWVudC5wdXRQYXJhbWV0ZXIoe1xuICAgIE5hbWU6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfS9yb290LWNhYCxcbiAgICBWYWx1ZTogYCR7Y2VydGlmaWNhdGVSb290Q0F9YCxcbiAgICBUeXBlOiAnU3RyaW5nJyxcbiAgICBPdmVyd3JpdGU6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IGNyZWRlbnRpYWxFbmRwb2ludEFkZHJlc3MgPSBhd2FpdCBpb3RDbGllbnQuZGVzY3JpYmVFbmRwb2ludCh7XG4gICAgZW5kcG9pbnRUeXBlOiAnaW90OkNyZWRlbnRpYWxQcm92aWRlcicsXG4gIH0pO1xuICBjb25zdCBkYXRhRW5kcG9pbnRBZGRyZXNzID0gYXdhaXQgaW90Q2xpZW50LmRlc2NyaWJlRW5kcG9pbnQoe1xuICAgIGVuZHBvaW50VHlwZTogJ2lvdDpDcmVkZW50aWFsUHJvdmlkZXInLFxuICB9KTs7XG5cbiAgcmV0dXJuIHtcbiAgICBjZXJ0aWZpY2F0ZUlkOiBjZXJ0aWZpY2F0ZUlkISxcbiAgICBjZXJ0aWZpY2F0ZUFybjogY2VydGlmaWNhdGVBcm4hLFxuICAgIGNyZWRlbnRpYWxFbmRwb2ludEFkZHJlc3M6IGNyZWRlbnRpYWxFbmRwb2ludEFkZHJlc3MuZW5kcG9pbnRBZGRyZXNzISxcbiAgICBkYXRhRW5kcG9pbnRBZGRyZXNzOiBkYXRhRW5kcG9pbnRBZGRyZXNzLmVuZHBvaW50QWRkcmVzcyEsXG5cbiAgICAvLyBzM0NlcnRpZmljYXRlUGVtOiBgczM6Ly8ke3Jlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZX0vJHtwYXRoQ2VydGlmaWNhdGVQZW19YCxcbiAgICAvLyBzM0NlcnRpZmljYXRlUHJpdmF0ZUtleTogYHMzOi8vJHtyZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWV9LyR7cGF0aENlcnRpZmljYXRlUHJpdmF0ZUtleX1gLFxuICAgIC8vIHMzQ2VydGlmaWNhdGVQdWJsaWNLZXk6IGBzMzovLyR7cmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lfS8ke3BhdGhDZXJ0aWZpY2F0ZVB1YmxpY0tleX1gLFxuICAgIC8vIHMzQ2VydGlmaWNhdGVSb290OiBgczM6Ly8ke3Jlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZX0vJHtwYXRoQ2VydGlmaWNhdGVSb290fWAsXG5cbiAgICAvLyBzc21QYXJhbUNlcnRpZmljYXRlSWQ6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vY2VydGlmaWNhdGVJZGAsXG4gICAgLy8gc3NtUGFyYW1DZXJ0aWZpY2F0ZVBlbTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS8ke2NlcnRpZmljYXRlSWR9L3BlbWAsXG4gICAgLy8gc3NtUGFyYW1DZXJ0aWZpY2F0ZVByaXZhdGVLZXk6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfS9rZXktcHJpdmF0ZWAsXG4gICAgLy8gc3NtUGFyYW1DZXJ0aWZpY2F0ZVB1YmxpY0tleTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS8ke2NlcnRpZmljYXRlSWR9L2tleS1wdWJsaWNgLFxuICAgIC8vIHNzbVBhcmFtQ2VydGlmaWNhdGVSb290OiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcm9vdC1jYWAsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVSZXNvdXJjZShyZXNvdXJjZTogUmVzb3VyY2VQcm9wZXJ0aWVzLCBjZXJ0aWZpY2F0ZUlkOiBzdHJpbmcpOiBQcm9taXNlPERlbGV0ZVJlc291cmNlc1Jlc3BvbnNlPiB7XG5cbiAgY29uc3QgcGF0aENlcnRpZmljYXRlOiBzdHJpbmcgPSBgJHtyZXNvdXJjZS5DZXJ0aWZpY2F0ZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfWA7XG4gIGNvbnN0IHBhdGhDZXJ0aWZpY2F0ZVBlbTogc3RyaW5nID0gYCR7cGF0aENlcnRpZmljYXRlfS5wZW1gO1xuICBjb25zdCBwYXRoQ2VydGlmaWNhdGVQcml2YXRlS2V5OiBzdHJpbmcgPSBgJHtwYXRoQ2VydGlmaWNhdGV9LmtleS5wcnZgO1xuICBjb25zdCBwYXRoQ2VydGlmaWNhdGVQdWJsaWNLZXk6IHN0cmluZyA9IGAke3BhdGhDZXJ0aWZpY2F0ZX0ua2V5LnB1YmA7XG4gIGNvbnN0IHBhdGhDZXJ0aWZpY2F0ZVJvb3Q6IHN0cmluZyA9IGAke3BhdGhDZXJ0aWZpY2F0ZX0ucm9vdGA7XG5cbiAgYXdhaXQgczNDbGllbnQuZGVsZXRlT2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZX1gLFxuICB9KTtcbiAgYXdhaXQgczNDbGllbnQuZGVsZXRlT2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZX0uYXJuYCxcbiAgfSk7XG4gIGF3YWl0IHMzQ2xpZW50LmRlbGV0ZU9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGVQZW19YCxcbiAgfSk7XG4gIGF3YWl0IHMzQ2xpZW50LmRlbGV0ZU9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGVQcml2YXRlS2V5fWAsXG4gIH0pO1xuICBhd2FpdCBzM0NsaWVudC5kZWxldGVPYmplY3Qoe1xuICAgIEJ1Y2tldDogcmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lLFxuICAgIEtleTogYCR7cGF0aENlcnRpZmljYXRlUHVibGljS2V5fWAsXG4gIH0pO1xuICBhd2FpdCBzM0NsaWVudC5kZWxldGVPYmplY3Qoe1xuICAgIEJ1Y2tldDogcmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lLFxuICAgIEtleTogYCR7cGF0aENlcnRpZmljYXRlUm9vdH1gLFxuICB9KTtcblxuICAvLyBkZWxldGUgaWYgaXQncyB0aGUgY3VycmVudCBvbmVcbiAgY29uc3Qgc3NtUGFyYW1DZXJ0aWZpY2F0ZUlkID0gYXdhaXQgc3NtQ2xpZW50LmdldFBhcmFtZXRlcih7XG4gICAgTmFtZTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS9jZXJ0aWZpY2F0ZUlkYCxcbiAgfSk7XG4gIGlmIChzc21QYXJhbUNlcnRpZmljYXRlSWQuUGFyYW1ldGVyPy5WYWx1ZSA9PT0gY2VydGlmaWNhdGVJZCkge1xuICAgIGF3YWl0IHNzbUNsaWVudC5kZWxldGVQYXJhbWV0ZXIoe1xuICAgICAgTmFtZTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS9jZXJ0aWZpY2F0ZUlkYCxcbiAgICB9KTtcbiAgfVxuICBhd2FpdCBzc21DbGllbnQuZGVsZXRlUGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcGVtYCxcbiAgfSk7XG4gIGF3YWl0IHNzbUNsaWVudC5kZWxldGVQYXJhbWV0ZXIoe1xuICAgIE5hbWU6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfS9rZXktcHJpdmF0ZWAsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQuZGVsZXRlUGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0va2V5LXB1YmxpY2AsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQuZGVsZXRlUGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcm9vdC1jYWAsXG4gIH0pO1xuXG4gIGF3YWl0IGlvdENsaWVudC51cGRhdGVDZXJ0aWZpY2F0ZSh7XG4gICAgY2VydGlmaWNhdGVJZDogY2VydGlmaWNhdGVJZCxcbiAgICBuZXdTdGF0dXM6ICdJTkFDVElWRScsXG4gIH0pO1xuICBhd2FpdCBpb3RDbGllbnQuZGVsZXRlQ2VydGlmaWNhdGUoe1xuICAgIGNlcnRpZmljYXRlSWQ6IGNlcnRpZmljYXRlSWQsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gIH07XG59Il19