UNPKG

cdk-sops-secrets

Version:

CDK Constructs that syncs your sops secrets into AWS SecretsManager secrets.

97 lines 14.3 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.SopsSecret = exports.RawOutput = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_kms_1 = require("aws-cdk-lib/aws-kms"); const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager"); const core_1 = require("aws-cdk-lib/core"); const constructs_1 = require("constructs"); const SopsSync_1 = require("./SopsSync"); var RawOutput; (function (RawOutput) { /** * Parse the secret as a string */ RawOutput["STRING"] = "STRING"; /** * Parse the secret as a binary */ RawOutput["BINARY"] = "BINARY"; })(RawOutput || (exports.RawOutput = RawOutput = {})); /** * A drop in replacement for the normal Secret, that is populated with the encrypted * content of the given sops file. */ class SopsSecret extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); this.secret = new aws_secretsmanager_1.Secret(this, 'Resource', props); // Fullfill secret Interface this.encryptionKey = this.secret.encryptionKey; this.secretArn = this.secret.secretArn; this.secretName = this.secret.secretName; this.stack = core_1.Stack.of(scope); this.env = { account: this.stack.account, region: this.stack.region, }; let resourceType = props.sopsFileFormat == 'binary' ? SopsSync_1.ResourceType.SECRET_RAW : SopsSync_1.ResourceType.SECRET; if (props.rawOutput === RawOutput.BINARY) { resourceType = SopsSync_1.ResourceType.SECRET_BINARY; } if (props.rawOutput === RawOutput.STRING) { resourceType = SopsSync_1.ResourceType.SECRET_RAW; } this.sync = new SopsSync_1.SopsSync(this, 'SopsSync', { target: this.secret.secretArn, resourceType, flattenSeparator: '.', secret: this.secret, ...props, }); } currentVersionId() { return this.sync.versionId; } grantRead(grantee, versionStages) { if (this.encryptionKey) { // @see https://docs.aws.amazon.com/kms/latest/developerguide/services-secrets-manager.html this.encryptionKey.grantDecrypt(new aws_kms_1.ViaServicePrincipal(`secretsmanager.${core_1.Stack.of(this).region}.amazonaws.com`, grantee.grantPrincipal)); } return this.secret.grantRead(grantee, versionStages); } grantWrite(_grantee) { throw new Error(`Method grantWrite(...) not allowed as this secret is managed by SopsSync`); } addRotationSchedule(id, options) { throw new Error(`Method addRotationSchedule('${id}', ${JSON.stringify(options)}) not allowed as this secret is managed by SopsSync`); } addToResourcePolicy(statement) { return this.secret.addToResourcePolicy(statement); } denyAccountRootDelete() { return this.secret.denyAccountRootDelete(); } attach(target) { return this.secret.attach(target); } applyRemovalPolicy(policy) { return this.secret.applyRemovalPolicy(policy); } secretValueFromJson(jsonField) { return core_1.SecretValue.secretsManager(this.secretArn, { jsonField, versionId: this.sync.versionId, }); } get secretValue() { return this.secretValueFromJson(''); } } exports.SopsSecret = SopsSecret; _a = JSII_RTTI_SYMBOL_1; SopsSecret[_a] = { fqn: "cdk-sops-secrets.SopsSecret", version: "2.2.4" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29wc1NlY3JldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Tb3BzU2VjcmV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsaURBQWdFO0FBQ2hFLHVFQVF3QztBQUN4QywyQ0FLMEI7QUFDMUIsMkNBQXVDO0FBQ3ZDLHlDQUFxRTtBQUVyRSxJQUFZLFNBU1g7QUFURCxXQUFZLFNBQVM7SUFDbkI7O09BRUc7SUFDSCw4QkFBaUIsQ0FBQTtJQUNqQjs7T0FFRztJQUNILDhCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFUVyxTQUFTLHlCQUFULFNBQVMsUUFTcEI7QUE0Q0Q7OztHQUdHO0FBQ0gsTUFBYSxVQUFXLFNBQVEsc0JBQVM7SUFVdkMsWUFBbUIsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksMkJBQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQTJCLENBQUMsQ0FBQztRQUV4RSw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLEdBQUc7WUFDVCxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07U0FDMUIsQ0FBQztRQUVGLElBQUksWUFBWSxHQUNkLEtBQUssQ0FBQyxjQUFjLElBQUksUUFBUTtZQUM5QixDQUFDLENBQUMsdUJBQVksQ0FBQyxVQUFVO1lBQ3pCLENBQUMsQ0FBQyx1QkFBWSxDQUFDLE1BQU0sQ0FBQztRQUMxQixJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pDLFlBQVksR0FBRyx1QkFBWSxDQUFDLGFBQWEsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QyxZQUFZLEdBQUcsdUJBQVksQ0FBQyxVQUFVLENBQUM7UUFDekMsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxtQkFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDekMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztZQUM3QixZQUFZO1lBQ1osZ0JBQWdCLEVBQUUsR0FBRztZQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsR0FBSSxLQUF5QjtTQUM5QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVNLFNBQVMsQ0FBQyxPQUFtQixFQUFFLGFBQXdCO1FBQzVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLDJGQUEyRjtZQUMzRixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FDN0IsSUFBSSw2QkFBbUIsQ0FDckIsa0JBQWtCLFlBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxnQkFBZ0IsRUFDdkQsT0FBTyxDQUFDLGNBQWMsQ0FDdkIsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDTSxVQUFVLENBQUMsUUFBb0I7UUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FDYiwwRUFBMEUsQ0FDM0UsQ0FBQztJQUNKLENBQUM7SUFDTSxtQkFBbUIsQ0FDeEIsRUFBVSxFQUNWLE9BQWdDO1FBRWhDLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0JBQStCLEVBQUUsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUNuRCxPQUFPLENBQ1IscURBQXFELENBQ3ZELENBQUM7SUFDSixDQUFDO0lBQ00sbUJBQW1CLENBQ3hCLFNBQTBCO1FBRTFCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ00scUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFDTSxNQUFNLENBQUMsTUFBK0I7UUFDM0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ00sa0JBQWtCLENBQUMsTUFBcUI7UUFDN0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxTQUFpQjtRQUMxQyxPQUFPLGtCQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDaEQsU0FBUztZQUNULFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7U0FDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDOztBQW5HSCxnQ0FvR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0LFxuICBHcmFudCxcbiAgSUdyYW50YWJsZSxcbiAgUG9saWN5U3RhdGVtZW50LFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IElLZXksIFZpYVNlcnZpY2VQcmluY2lwYWwgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7XG4gIElTZWNyZXQsXG4gIElTZWNyZXRBdHRhY2htZW50VGFyZ2V0LFxuICBSZXBsaWNhUmVnaW9uLFxuICBSb3RhdGlvblNjaGVkdWxlLFxuICBSb3RhdGlvblNjaGVkdWxlT3B0aW9ucyxcbiAgU2VjcmV0LFxuICBTZWNyZXRQcm9wcyxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyJztcbmltcG9ydCB7XG4gIFJlbW92YWxQb2xpY3ksXG4gIFJlc291cmNlRW52aXJvbm1lbnQsXG4gIFNlY3JldFZhbHVlLFxuICBTdGFjayxcbn0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFJlc291cmNlVHlwZSwgU29wc1N5bmMsIFNvcHNTeW5jT3B0aW9ucyB9IGZyb20gJy4vU29wc1N5bmMnO1xuXG5leHBvcnQgZW51bSBSYXdPdXRwdXQge1xuICAvKipcbiAgICogUGFyc2UgdGhlIHNlY3JldCBhcyBhIHN0cmluZ1xuICAgKi9cbiAgU1RSSU5HID0gJ1NUUklORycsXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgc2VjcmV0IGFzIGEgYmluYXJ5XG4gICAqL1xuICBCSU5BUlkgPSAnQklOQVJZJyxcbn1cblxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIG9mIHRoZSBTb3BzU2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29wc1NlY3JldFByb3BzIGV4dGVuZHMgU29wc1N5bmNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNob3VsZCB0aGUgc2VjcmV0IHBhcnNlZCBhbmQgdHJhbnNmb3JtZWQgdG8ganNvbj9cbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQgLSBTVFJJTkcgZm9yIGJpbmFyeSBzZWNyZXRzLCBlbHNlIG5vIHJhdyBvdXRwdXRcbiAgICovXG4gIHJlYWRvbmx5IHJhd091dHB1dD86IFJhd091dHB1dDtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsLCBodW1hbi1mcmllbmRseSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VjcmV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGRlc2NyaXB0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tZXItbWFuYWdlZCBlbmNyeXB0aW9uIGtleSB0byB1c2UgZm9yIGVuY3J5cHRpbmcgdGhlIHNlY3JldCB2YWx1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIGRlZmF1bHQgS01TIGtleSBmb3IgdGhlIGFjY291bnQgYW5kIHJlZ2lvbiBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IElLZXk7XG4gIC8qKlxuICAgKiBBIG5hbWUgZm9yIHRoZSBzZWNyZXQuIE5vdGUgdGhhdCBkZWxldGluZyBzZWNyZXRzIGZyb20gU2VjcmV0c01hbmFnZXIgZG9lcyBub3QgaGFwcGVuIGltbWVkaWF0ZWx5LCBidXQgYWZ0ZXIgYSA3IHRvXG4gICAqIDMwIGRheXMgYmxhY2tvdXQgcGVyaW9kLiBEdXJpbmcgdGhhdCBwZXJpb2QsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgYW5vdGhlciBzZWNyZXQgdGhhdCBzaGFyZXMgdGhlIHNhbWUgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIG5hbWUgaXMgZ2VuZXJhdGVkIGJ5IENsb3VkRm9ybWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFBvbGljeSB0byBhcHBseSB3aGVuIHRoZSBzZWNyZXQgaXMgcmVtb3ZlZCBmcm9tIHRoaXMgc3RhY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm90IHNldC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xuICAvKipcbiAgICogQSBsaXN0IG9mIHJlZ2lvbnMgd2hlcmUgdG8gcmVwbGljYXRlIHRoaXMgc2VjcmV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNlY3JldCBpcyBub3QgcmVwbGljYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbGljYVJlZ2lvbnM/OiBSZXBsaWNhUmVnaW9uW107XG59XG5cbi8qKlxuICogQSBkcm9wIGluIHJlcGxhY2VtZW50IGZvciB0aGUgbm9ybWFsIFNlY3JldCwgdGhhdCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgZW5jcnlwdGVkXG4gKiBjb250ZW50IG9mIHRoZSBnaXZlbiBzb3BzIGZpbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb3BzU2VjcmV0IGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVNlY3JldCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjcmV0OiBTZWNyZXQ7XG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBJS2V5IHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzZWNyZXRBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgc2VjcmV0RnVsbEFybj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc2VjcmV0TmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFjazogU3RhY2s7XG4gIHJlYWRvbmx5IGVudjogUmVzb3VyY2VFbnZpcm9ubWVudDtcblxuICByZWFkb25seSBzeW5jOiBTb3BzU3luYztcbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTb3BzU2VjcmV0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuc2VjcmV0ID0gbmV3IFNlY3JldCh0aGlzLCAnUmVzb3VyY2UnLCBwcm9wcyBzYXRpc2ZpZXMgU2VjcmV0UHJvcHMpO1xuXG4gICAgLy8gRnVsbGZpbGwgc2VjcmV0IEludGVyZmFjZVxuICAgIHRoaXMuZW5jcnlwdGlvbktleSA9IHRoaXMuc2VjcmV0LmVuY3J5cHRpb25LZXk7XG4gICAgdGhpcy5zZWNyZXRBcm4gPSB0aGlzLnNlY3JldC5zZWNyZXRBcm47XG4gICAgdGhpcy5zZWNyZXROYW1lID0gdGhpcy5zZWNyZXQuc2VjcmV0TmFtZTtcbiAgICB0aGlzLnN0YWNrID0gU3RhY2sub2Yoc2NvcGUpO1xuICAgIHRoaXMuZW52ID0ge1xuICAgICAgYWNjb3VudDogdGhpcy5zdGFjay5hY2NvdW50LFxuICAgICAgcmVnaW9uOiB0aGlzLnN0YWNrLnJlZ2lvbixcbiAgICB9O1xuXG4gICAgbGV0IHJlc291cmNlVHlwZSA9XG4gICAgICBwcm9wcy5zb3BzRmlsZUZvcm1hdCA9PSAnYmluYXJ5J1xuICAgICAgICA/IFJlc291cmNlVHlwZS5TRUNSRVRfUkFXXG4gICAgICAgIDogUmVzb3VyY2VUeXBlLlNFQ1JFVDtcbiAgICBpZiAocHJvcHMucmF3T3V0cHV0ID09PSBSYXdPdXRwdXQuQklOQVJZKSB7XG4gICAgICByZXNvdXJjZVR5cGUgPSBSZXNvdXJjZVR5cGUuU0VDUkVUX0JJTkFSWTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnJhd091dHB1dCA9PT0gUmF3T3V0cHV0LlNUUklORykge1xuICAgICAgcmVzb3VyY2VUeXBlID0gUmVzb3VyY2VUeXBlLlNFQ1JFVF9SQVc7XG4gICAgfVxuXG4gICAgdGhpcy5zeW5jID0gbmV3IFNvcHNTeW5jKHRoaXMsICdTb3BzU3luYycsIHtcbiAgICAgIHRhcmdldDogdGhpcy5zZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgcmVzb3VyY2VUeXBlLFxuICAgICAgZmxhdHRlblNlcGFyYXRvcjogJy4nLFxuICAgICAgc2VjcmV0OiB0aGlzLnNlY3JldCxcbiAgICAgIC4uLihwcm9wcyBhcyBTb3BzU3luY09wdGlvbnMpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGN1cnJlbnRWZXJzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zeW5jLnZlcnNpb25JZDtcbiAgfVxuXG4gIHB1YmxpYyBncmFudFJlYWQoZ3JhbnRlZTogSUdyYW50YWJsZSwgdmVyc2lvblN0YWdlcz86IHN0cmluZ1tdKTogR3JhbnQge1xuICAgIGlmICh0aGlzLmVuY3J5cHRpb25LZXkpIHtcbiAgICAgIC8vIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ttcy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VydmljZXMtc2VjcmV0cy1tYW5hZ2VyLmh0bWxcbiAgICAgIHRoaXMuZW5jcnlwdGlvbktleS5ncmFudERlY3J5cHQoXG4gICAgICAgIG5ldyBWaWFTZXJ2aWNlUHJpbmNpcGFsKFxuICAgICAgICAgIGBzZWNyZXRzbWFuYWdlci4ke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWAsXG4gICAgICAgICAgZ3JhbnRlZS5ncmFudFByaW5jaXBhbCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlY3JldC5ncmFudFJlYWQoZ3JhbnRlZSwgdmVyc2lvblN0YWdlcyk7XG4gIH1cbiAgcHVibGljIGdyYW50V3JpdGUoX2dyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1ldGhvZCBncmFudFdyaXRlKC4uLikgbm90IGFsbG93ZWQgYXMgdGhpcyBzZWNyZXQgaXMgbWFuYWdlZCBieSBTb3BzU3luY2AsXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgYWRkUm90YXRpb25TY2hlZHVsZShcbiAgICBpZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJvdGF0aW9uU2NoZWR1bGVPcHRpb25zLFxuICApOiBSb3RhdGlvblNjaGVkdWxlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWV0aG9kIGFkZFJvdGF0aW9uU2NoZWR1bGUoJyR7aWR9JywgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICl9KSBub3QgYWxsb3dlZCBhcyB0aGlzIHNlY3JldCBpcyBtYW5hZ2VkIGJ5IFNvcHNTeW5jYCxcbiAgICApO1xuICB9XG4gIHB1YmxpYyBhZGRUb1Jlc291cmNlUG9saWN5KFxuICAgIHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50LFxuICApOiBBZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5zZWNyZXQuYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG4gIHB1YmxpYyBkZW55QWNjb3VudFJvb3REZWxldGUoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuc2VjcmV0LmRlbnlBY2NvdW50Um9vdERlbGV0ZSgpO1xuICB9XG4gIHB1YmxpYyBhdHRhY2godGFyZ2V0OiBJU2VjcmV0QXR0YWNobWVudFRhcmdldCk6IElTZWNyZXQge1xuICAgIHJldHVybiB0aGlzLnNlY3JldC5hdHRhY2godGFyZ2V0KTtcbiAgfVxuICBwdWJsaWMgYXBwbHlSZW1vdmFsUG9saWN5KHBvbGljeTogUmVtb3ZhbFBvbGljeSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLnNlY3JldC5hcHBseVJlbW92YWxQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIHB1YmxpYyBzZWNyZXRWYWx1ZUZyb21Kc29uKGpzb25GaWVsZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFNlY3JldFZhbHVlLnNlY3JldHNNYW5hZ2VyKHRoaXMuc2VjcmV0QXJuLCB7XG4gICAgICBqc29uRmllbGQsXG4gICAgICB2ZXJzaW9uSWQ6IHRoaXMuc3luYy52ZXJzaW9uSWQsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlY3JldFZhbHVlKCk6IFNlY3JldFZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5zZWNyZXRWYWx1ZUZyb21Kc29uKCcnKTtcbiAgfVxufVxuIl19