@enfo/aws-cdkompliance
Version:
Tagging and compliant resources using the CDK
185 lines • 18.3 kB
JavaScript
"use strict";
var _a, _b;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DatabaseCluster = exports.defaultInstanceProps = exports.defaultDatabaseClusterProps = exports.DatabaseInstance = exports.defaultDatabaseInstanceProps = exports.DatabaseEnvironment = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_rds_1 = require("aws-cdk-lib/aws-rds");
/**
* Used to state whether or not this database should be considered a production database or not
*/
var DatabaseEnvironment;
(function (DatabaseEnvironment) {
/**
* When used the database must be deployed to multiple Availability Zones
*/
DatabaseEnvironment[DatabaseEnvironment["PRODUCTION"] = 0] = "PRODUCTION";
/**
* When used the database can be deployed to a single Availability Zone
*/
DatabaseEnvironment[DatabaseEnvironment["NOT_PRODUCTION"] = 1] = "NOT_PRODUCTION";
})(DatabaseEnvironment = exports.DatabaseEnvironment || (exports.DatabaseEnvironment = {}));
/**
* Properties for a new Compliant RDS Instance
*/
exports.defaultDatabaseInstanceProps = {
publiclyAccessible: false,
storageEncrypted: true,
iamAuthentication: true,
autoMinorVersionUpgrade: true,
copyTagsToSnapshot: true,
deletionProtection: true,
multiAz: true,
environment: DatabaseEnvironment.PRODUCTION
};
/**
* Compliant RDS Instance
*
* See README for usage examples
*/
class DatabaseInstance extends aws_rds_1.DatabaseInstance {
constructor(scope, id, props) {
super(scope, id, {
...exports.defaultDatabaseInstanceProps,
...props
});
this.calculatedProps = {
...exports.defaultDatabaseInstanceProps,
...props
};
this.node.addValidation({
validate: () => {
return [
...this.checkPubliclyAccessible(),
...this.checkStorageEncrypted(),
...this.checkIAMAuthentication(),
...this.checkAutoUpgrade(),
...this.checkCopyTags(),
...this.checkDeletionProtection(),
...this.checkMultiAz()
];
}
});
}
checkPubliclyAccessible() {
return !this.calculatedProps.publiclyAccessible
? []
: ['publiclyAccessible must be false'];
}
checkStorageEncrypted() {
return this.calculatedProps.storageEncrypted
? []
: ['storageEncrypted must be true'];
}
checkIAMAuthentication() {
return this.calculatedProps.iamAuthentication
? []
: ['iamAuthentication must be true'];
}
checkAutoUpgrade() {
return this.calculatedProps.autoMinorVersionUpgrade
? []
: ['autoMinorVersionUpgrade must be true'];
}
checkCopyTags() {
return this.calculatedProps.copyTagsToSnapshot
? []
: ['copyTagsToSnapshot must be true'];
}
checkDeletionProtection() {
return this.calculatedProps.deletionProtection
? []
: ['deletionProtection must be true'];
}
checkMultiAz() {
return (this.calculatedProps.environment === DatabaseEnvironment.PRODUCTION && !this.calculatedProps.multiAz)
? ['Production instance must be multi AZ']
: [];
}
}
exports.DatabaseInstance = DatabaseInstance;
_a = JSII_RTTI_SYMBOL_1;
DatabaseInstance[_a] = { fqn: "@enfo/aws-cdkompliance.DatabaseInstance", version: "1.1.0" };
/**
* Properties for a new Compliant RDS Cluster
*/
exports.defaultDatabaseClusterProps = {
storageEncrypted: true,
iamAuthentication: true,
copyTagsToSnapshot: true,
deletionProtection: true
};
exports.defaultInstanceProps = {
publiclyAccessible: false,
autoMinorVersionUpgrade: true
};
/**
* Compliant RDS Cluster
*
* See README for usage examples
*/
class DatabaseCluster extends aws_rds_1.DatabaseCluster {
constructor(scope, id, props) {
super(scope, id, {
...exports.defaultDatabaseClusterProps,
...props,
instanceProps: {
...exports.defaultInstanceProps,
...props.instanceProps
}
});
this.calculatedProps = {
...exports.defaultDatabaseClusterProps,
...props,
instanceProps: {
...exports.defaultInstanceProps,
...props === null || props === void 0 ? void 0 : props.instanceProps
}
};
this.node.addValidation({
validate: () => {
return [
...this.checkPubliclyAccessible(),
...this.checkStorageEncrypted(),
...this.checkIAMAuthentication(),
...this.checkAutoUpgrade(),
...this.checkCopyTags(),
...this.checkDeletionProtection()
];
}
});
}
checkStorageEncrypted() {
return this.calculatedProps.storageEncrypted
? []
: ['storageEncrypted must be true'];
}
checkIAMAuthentication() {
return this.calculatedProps.iamAuthentication
? []
: ['iamAuthentication must be true'];
}
checkCopyTags() {
return this.calculatedProps.copyTagsToSnapshot
? []
: ['copyTagsToSnapshot must be true'];
}
checkDeletionProtection() {
return this.calculatedProps.deletionProtection
? []
: ['deletionProtection must be true'];
}
checkPubliclyAccessible() {
return !this.calculatedProps.instanceProps.publiclyAccessible
? []
: ['publiclyAccessible must be false'];
}
checkAutoUpgrade() {
return this.calculatedProps.instanceProps.autoMinorVersionUpgrade
? []
: ['autoMinorVersionUpgrade must be true'];
}
}
exports.DatabaseCluster = DatabaseCluster;
_b = JSII_RTTI_SYMBOL_1;
DatabaseCluster[_b] = { fqn: "@enfo/aws-cdkompliance.DatabaseCluster", version: "1.1.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaURBSzRCO0FBRzVCOztHQUVHO0FBQ0gsSUFBWSxtQkFTWDtBQVRELFdBQVksbUJBQW1CO0lBQzdCOztPQUVHO0lBQ0gseUVBQVUsQ0FBQTtJQUNWOztPQUVHO0lBQ0gsaUZBQWMsQ0FBQTtBQUNoQixDQUFDLEVBVFcsbUJBQW1CLEdBQW5CLDJCQUFtQixLQUFuQiwyQkFBbUIsUUFTOUI7QUFNRDs7R0FFRztBQUNVLFFBQUEsNEJBQTRCLEdBQUc7SUFDMUMsa0JBQWtCLEVBQUUsS0FBSztJQUN6QixnQkFBZ0IsRUFBRSxJQUFJO0lBQ3RCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsdUJBQXVCLEVBQUUsSUFBSTtJQUM3QixrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsT0FBTyxFQUFFLElBQUk7SUFDYixXQUFXLEVBQUUsbUJBQW1CLENBQUMsVUFBVTtDQUM1QyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsMEJBQW1CO0lBRXZELFlBQWEsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixHQUFHLG9DQUE0QjtZQUMvQixHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLEdBQUcsb0NBQTRCO1lBQy9CLEdBQUcsS0FBSztTQUNULENBQUE7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN0QixRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUNiLE9BQU87b0JBQ0wsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7b0JBQ2pDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFO29CQUMvQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFB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RUFBRTtZQUNKLENBQUMsQ0FBQyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7SUFDOUMsQ0FBQzs7QUFwRUgsMENBcUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGF0YWJhc2VDbHVzdGVyIGFzIFJEU0RhdGFiYXNlQ2x1c3RlcixcbiAgRGF0YWJhc2VDbHVzdGVyUHJvcHMsXG4gIERhdGFiYXNlSW5zdGFuY2UgYXMgUkRTRGF0YWJhc2VJbnN0YW5jZSxcbiAgRGF0YWJhc2VJbnN0YW5jZVByb3BzIGFzIFJEU0RhdGFiYXNlSW5zdGFuY2VQcm9wc1xufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtcmRzJ1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cydcblxuLyoqXG4gKiBVc2VkIHRvIHN0YXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgZGF0YWJhc2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwcm9kdWN0aW9uIGRhdGFiYXNlIG9yIG5vdFxuICovXG5leHBvcnQgZW51bSBEYXRhYmFzZUVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFdoZW4gdXNlZCB0aGUgZGF0YWJhc2UgbXVzdCBiZSBkZXBsb3llZCB0byBtdWx0aXBsZSBBdmFpbGFiaWxpdHkgWm9uZXNcbiAgICovXG4gIFBST0RVQ1RJT04sXG4gIC8qKlxuICAgKiBXaGVuIHVzZWQgdGhlIGRhdGFiYXNlIGNhbiBiZSBkZXBsb3llZCB0byBhIHNpbmdsZSBBdmFpbGFiaWxpdHkgWm9uZVxuICAgKi9cbiAgTk9UX1BST0RVQ1RJT05cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZUluc3RhbmNlUHJvcHMgZXh0ZW5kcyBSRFNEYXRhYmFzZUluc3RhbmNlUHJvcHMge1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IERhdGFiYXNlRW52aXJvbm1lbnRcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIG5ldyBDb21wbGlhbnQgUkRTIEluc3RhbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RGF0YWJhc2VJbnN0YW5jZVByb3BzID0ge1xuICBwdWJsaWNseUFjY2Vzc2libGU6IGZhbHNlLFxuICBzdG9yYWdlRW5jcnlwdGVkOiB0cnVlLFxuICBpYW1BdXRoZW50aWNhdGlvbjogdHJ1ZSxcbiAgYXV0b01pbm9yVmVyc2lvblVwZ3JhZGU6IHRydWUsXG4gIGNvcHlUYWdzVG9TbmFwc2hvdDogdHJ1ZSxcbiAgZGVsZXRpb25Qcm90ZWN0aW9uOiB0cnVlLFxuICBtdWx0aUF6OiB0cnVlLFxuICBlbnZpcm9ubWVudDogRGF0YWJhc2VFbnZpcm9ubWVudC5QUk9EVUNUSU9OXG59XG5cbi8qKlxuICogQ29tcGxpYW50IFJEUyBJbnN0YW5jZVxuICpcbiAqIFNlZSBSRUFETUUgZm9yIHVzYWdlIGV4YW1wbGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUluc3RhbmNlIGV4dGVuZHMgUkRTRGF0YWJhc2VJbnN0YW5jZSB7XG4gIHByb3RlY3RlZCBjYWxjdWxhdGVkUHJvcHM6IERhdGFiYXNlSW5zdGFuY2VQcm9wc1xuICBjb25zdHJ1Y3RvciAoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERhdGFiYXNlSW5zdGFuY2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uZGVmYXVsdERhdGFiYXNlSW5zdGFuY2VQcm9wcyxcbiAgICAgIC4uLnByb3BzXG4gICAgfSlcbiAgICB0aGlzLmNhbGN1bGF0ZWRQcm9wcyA9IHtcbiAgICAgIC4uLmRlZmF1bHREYXRhYmFzZUluc3RhbmNlUHJvcHMsXG4gICAgICAuLi5wcm9wc1xuICAgIH1cblxuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKHtcbiAgICAgIHZhbGlkYXRlOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgLi4udGhpcy5jaGVja1B1YmxpY2x5QWNjZXNzaWJsZSgpLFxuICAgICAgICAgIC4uLnRoaXMuY2hlY2tTdG9yYWdlRW5jcnlwdGVkKCksXG4gICAgICAgICAgLi4udGhpcy5jaGVja0lBTUF1dGhlbnRpY2F0aW9uKCksXG4gICAgICAgICAgLi4udGhpcy5jaGVja0F1dG9VcGdyYWRlKCksXG4gICAgICAgICAgLi4udGhpcy5jaGVja0NvcHlUYWdzKCksXG4gICAgICAgICAgLi4udGhpcy5jaGVja0RlbGV0aW9uUHJvdGVjdGlvbigpLFxuICAgICAgICAgIC4uLnRoaXMuY2hlY2tNdWx0aUF6KClcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tQdWJsaWNseUFjY2Vzc2libGUgKCkge1xuICAgIHJldHVybiAhdGhpcy5jYWxjdWxhdGVkUHJvcHMucHVibGljbHlBY2Nlc3NpYmxlXG4gICAgICA/IFtdXG4gICAgICA6IFsncHVibGljbHlBY2Nlc3NpYmxlIG11c3QgYmUgZmFsc2UnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrU3RvcmFnZUVuY3J5cHRlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlZFByb3BzLnN0b3JhZ2VFbmNyeXB0ZWRcbiAgICAgID8gW11cbiAgICAgIDogWydzdG9yYWdlRW5jcnlwdGVkIG11c3QgYmUgdHJ1ZSddXG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tJQU1BdXRoZW50aWNhdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlZFByb3BzLmlhbUF1dGhlbnRpY2F0aW9uXG4gICAgICA/IFtdXG4gICAgICA6IFsnaWFtQXV0aGVudGljYXRpb24gbXVzdCBiZSB0cnVlJ11cbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0F1dG9VcGdyYWRlICgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVkUHJvcHMuYXV0b01pbm9yVmVyc2lvblVwZ3JhZGVcbiAgICAgID8gW11cbiAgICAgIDogWydhdXRvTWlub3JWZXJzaW9uVXBncmFkZSBtdXN0IGJlIHRydWUnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrQ29weVRhZ3MgKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZWRQcm9wcy5jb3B5VGFnc1RvU25hcHNob3RcbiAgICAgID8gW11cbiAgICAgIDogWydjb3B5VGFnc1RvU25hcHNob3QgbXVzdCBiZSB0cnVlJ11cbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0RlbGV0aW9uUHJvdGVjdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlZFByb3BzLmRlbGV0aW9uUHJvdGVjdGlvblxuICAgICAgPyBbXVxuICAgICAgOiBbJ2RlbGV0aW9uUHJvdGVjdGlvbiBtdXN0IGJlIHRydWUnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrTXVsdGlBeiAoKSB7XG4gICAgcmV0dXJuICh0aGlzLmNhbGN1bGF0ZWRQcm9wcy5lbnZpcm9ubWVudCA9PT0gRGF0YWJhc2VFbnZpcm9ubWVudC5QUk9EVUNUSU9OICYmICF0aGlzLmNhbGN1bGF0ZWRQcm9wcy5tdWx0aUF6KVxuICAgICAgPyBbJ1Byb2R1Y3Rpb24gaW5zdGFuY2UgbXVzdCBiZSBtdWx0aSBBWiddXG4gICAgICA6IFtdXG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIG5ldyBDb21wbGlhbnQgUkRTIENsdXN0ZXJcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHREYXRhYmFzZUNsdXN0ZXJQcm9wcyA9IHtcbiAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgaWFtQXV0aGVudGljYXRpb246IHRydWUsXG4gIGNvcHlUYWdzVG9TbmFwc2hvdDogdHJ1ZSxcbiAgZGVsZXRpb25Qcm90ZWN0aW9uOiB0cnVlXG59XG5leHBvcnQgY29uc3QgZGVmYXVsdEluc3RhbmNlUHJvcHMgPSB7XG4gIHB1YmxpY2x5QWNjZXNzaWJsZTogZmFsc2UsXG4gIGF1dG9NaW5vclZlcnNpb25VcGdyYWRlOiB0cnVlXG59XG5cbi8qKlxuICogQ29tcGxpYW50IFJEUyBDbHVzdGVyXG4gKlxuICogU2VlIFJFQURNRSBmb3IgdXNhZ2UgZXhhbXBsZXNcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFiYXNlQ2x1c3RlciBleHRlbmRzIFJEU0RhdGFiYXNlQ2x1c3RlciB7XG4gIHByb3RlY3RlZCBjYWxjdWxhdGVkUHJvcHM6IERhdGFiYXNlQ2x1c3RlclByb3BzXG4gIGNvbnN0cnVjdG9yIChzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRGF0YWJhc2VDbHVzdGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLmRlZmF1bHREYXRhYmFzZUNsdXN0ZXJQcm9wcyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgaW5zdGFuY2VQcm9wczoge1xuICAgICAgICAuLi5kZWZhdWx0SW5zdGFuY2VQcm9wcyxcbiAgICAgICAgLi4ucHJvcHMuaW5zdGFuY2VQcm9wc1xuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5jYWxjdWxhdGVkUHJvcHMgPSB7XG4gICAgICAuLi5kZWZhdWx0RGF0YWJhc2VDbHVzdGVyUHJvcHMsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGluc3RhbmNlUHJvcHM6IHtcbiAgICAgICAgLi4uZGVmYXVsdEluc3RhbmNlUHJvcHMsXG4gICAgICAgIC4uLnByb3BzPy5pbnN0YW5jZVByb3BzXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oe1xuICAgICAgdmFsaWRhdGU6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAuLi50aGlzLmNoZWNrUHVibGljbHlBY2Nlc3NpYmxlKCksXG4gICAgICAgICAgLi4udGhpcy5jaGVja1N0b3JhZ2VFbmNyeXB0ZWQoKSxcbiAgICAgICAgICAuLi50aGlzLmNoZWNrSUFNQXV0aGVudGljYXRpb24oKSxcbiAgICAgICAgICAuLi50aGlzLmNoZWNrQXV0b1VwZ3JhZGUoKSxcbiAgICAgICAgICAuLi50aGlzLmNoZWNrQ29weVRhZ3MoKSxcbiAgICAgICAgICAuLi50aGlzLmNoZWNrRGVsZXRpb25Qcm90ZWN0aW9uKClcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tTdG9yYWdlRW5jcnlwdGVkICgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVkUHJvcHMuc3RvcmFnZUVuY3J5cHRlZFxuICAgICAgPyBbXVxuICAgICAgOiBbJ3N0b3JhZ2VFbmNyeXB0ZWQgbXVzdCBiZSB0cnVlJ11cbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0lBTUF1dGhlbnRpY2F0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVkUHJvcHMuaWFtQXV0aGVudGljYXRpb25cbiAgICAgID8gW11cbiAgICAgIDogWydpYW1BdXRoZW50aWNhdGlvbiBtdXN0IGJlIHRydWUnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrQ29weVRhZ3MgKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZWRQcm9wcy5jb3B5VGFnc1RvU25hcHNob3RcbiAgICAgID8gW11cbiAgICAgIDogWydjb3B5VGFnc1RvU25hcHNob3QgbXVzdCBiZSB0cnVlJ11cbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0RlbGV0aW9uUHJvdGVjdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlZFByb3BzLmRlbGV0aW9uUHJvdGVjdGlvblxuICAgICAgPyBbXVxuICAgICAgOiBbJ2RlbGV0aW9uUHJvdGVjdGlvbiBtdXN0IGJlIHRydWUnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrUHVibGljbHlBY2Nlc3NpYmxlICgpIHtcbiAgICByZXR1cm4gIXRoaXMuY2FsY3VsYXRlZFByb3BzLmluc3RhbmNlUHJvcHMucHVibGljbHlBY2Nlc3NpYmxlXG4gICAgICA/IFtdXG4gICAgICA6IFsncHVibGljbHlBY2Nlc3NpYmxlIG11c3QgYmUgZmFsc2UnXVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrQXV0b1VwZ3JhZGUgKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZWRQcm9wcy5pbnN0YW5jZVByb3BzLmF1dG9NaW5vclZlcnNpb25VcGdyYWRlXG4gICAgICA/IFtdXG4gICAgICA6IFsnYXV0b01pbm9yVmVyc2lvblVwZ3JhZGUgbXVzdCBiZSB0cnVlJ11cbiAgfVxufVxuIl19