UNPKG

deploy-time-build

Version:
131 lines 18.8 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.SociIndexV2Build = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const path_1 = require("path"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_codebuild_1 = require("aws-cdk-lib/aws-codebuild"); const aws_ecs_1 = require("aws-cdk-lib/aws-ecs"); const aws_iam_1 = require("aws-cdk-lib/aws-iam"); const aws_lambda_1 = require("aws-cdk-lib/aws-lambda"); const constructs_1 = require("constructs"); const singleton_project_1 = require("./singleton-project"); /** * Build and publish a SOCI index for a container image. * A SOCI index helps start Fargate tasks faster in some cases. * Please read the following document for more details: https://docs.aws.amazon.com/AmazonECS/latest/userguide/container-considerations.html */ class SociIndexV2Build extends constructs_1.Construct { /** * A utility method to create a SociIndexBuild construct from a DockerImageAsset instance. */ static fromDockerImageAsset(scope, id, imageAsset) { return new SociIndexV2Build(scope, id, { repository: imageAsset.repository, inputImageTag: imageAsset.assetHash, }); } constructor(scope, id, props) { super(scope, id); const sociWrapperVersion = 'v0.2.3'; const outputImageTagKey = 'outputImageTag'; const binaryUrl = `https://github.com/tmokmss/soci-wrapper/releases/download/${sociWrapperVersion}/soci-wrapper-${sociWrapperVersion}-linux-amd64.tar.gz`; const handler = new aws_lambda_1.SingletonFunction(this, 'CustomResourceHandler', { // Use raw string to avoid from tightening CDK version requirement runtime: new aws_lambda_1.Runtime('nodejs20.x', aws_lambda_1.RuntimeFamily.NODEJS), code: aws_lambda_1.Code.fromAsset((0, path_1.join)(__dirname, '../lambda/trigger-codebuild/dist')), handler: 'index.handler', uuid: 'db740fd5-5436-4a84-8a09-e6dfcd01f4f3', // generated for this construct lambdaPurpose: 'DeployTimeBuildCustomResourceHandler', timeout: aws_cdk_lib_1.Duration.minutes(5), }); const project = new singleton_project_1.SingletonProject(this, 'Project', { uuid: 'e7e8a038-e0e4-4f55-8114-cdd6523ad08f', // generated for this construct projectPurpose: 'SociIndexV2Build', environment: { buildImage: aws_codebuild_1.LinuxBuildImage.fromCodeBuildImageId('aws/codebuild/standard:7.0') }, buildSpec: aws_codebuild_1.BuildSpec.fromObject({ version: '0.2', phases: { build: { commands: [ 'current_dir=$(pwd)', `wget --quiet -O soci-wrapper.tar.gz ${binaryUrl}`, 'tar -xvzf soci-wrapper.tar.gz', '', 'export AWS_ACCOUNT=$(aws sts get-caller-identity --query "Account" --output text)', 'export REGISTRY_USER=AWS', 'export REGISTRY_PASSWORD=$(aws ecr get-login-password --region $AWS_REGION)', 'export REGISTRY=$AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com', 'aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $REGISTRY', 'REPO_NAME=$repositoryName', 'IMAGE_TAG=$inputImageTag', 'DIGEST=$(aws ecr describe-images --repository-name $REPO_NAME --image-ids imageTag=$IMAGE_TAG --query imageDetails[0].imageDigest --output text)', './soci-wrapper --repo $REPO_NAME --digest $DIGEST --region $AWS_REGION --account $AWS_ACCOUNT --soci-version V2 --output-tag $outputImageTag', ], }, post_build: { commands: [ 'echo Build completed on `date`', ` STATUS='SUCCESS' if [ $CODEBUILD_BUILD_SUCCEEDING -ne 1 ] # Test if the build is failing then STATUS='FAILED' REASON="deploy-time-build failed. See CloudWatch Log stream for the detailed reason: https://$AWS_REGION.console.aws.amazon.com/cloudwatch/home?region=$AWS_REGION#logsV2:log-groups/log-group/\\$252Faws\\$252Fcodebuild\\$252F$projectName/log-events/$CODEBUILD_LOG_PATH" fi cat <<EOF > payload.json { "StackId": "$stackId", "RequestId": "$requestId", "LogicalResourceId":"$logicalResourceId", "PhysicalResourceId": "$outputImageTag", "Status": "$STATUS", "Reason": "$REASON", "Data": { "${outputImageTagKey}": "$outputImageTag" } } EOF curl -vv -i -X PUT -H 'Content-Type:' -d "@payload.json" "$responseURL" `, ], }, }, }), }).project; handler.addToRolePolicy(new aws_iam_1.PolicyStatement({ actions: ['codebuild:StartBuild'], resources: [project.projectArn], })); props.repository.grantPullPush(project); props.repository.grant(project, 'ecr:DescribeImages'); const properties = { type: 'SociIndexV2Build', inputImageTag: props.inputImageTag, outputImageTag: props.outputImageTag ?? `${props.inputImageTag}-soci`, repositoryName: props.repository.repositoryName, codeBuildProjectName: project.projectName, }; const custom = new aws_cdk_lib_1.CustomResource(this, 'Resource', { serviceToken: handler.functionArn, resourceType: 'Custom::CDKSociIndexBuild', properties, }); this.repository = props.repository; this.outputImageTag = custom.getAttString(outputImageTagKey); } /** * Get the instance of image embedded with SOCI v2 index for an ECS task definition. * When using this image returned from this function, your deployment waits until * the index build complete and then start deploying after the image with index ready. */ toEcsDockerImageCode() { return aws_ecs_1.ContainerImage.fromEcrRepository(this.repository, this.outputImageTag); } } exports.SociIndexV2Build = SociIndexV2Build; _a = JSII_RTTI_SYMBOL_1; SociIndexV2Build[_a] = { fqn: "deploy-time-build.SociIndexV2Build", version: "0.3.37" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaS1pbmRleC12Mi1idWlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zb2NpLWluZGV4LXYyLWJ1aWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQTRCO0FBQzVCLDZDQUF1RDtBQUN2RCw2REFBdUU7QUFHdkUsaURBQXFEO0FBQ3JELGlEQUFzRDtBQUN0RCx1REFBeUY7QUFDekYsMkNBQXVDO0FBQ3ZDLDJEQUF1RDtBQXdCdkQ7Ozs7R0FJRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsc0JBQVM7SUFDN0M7O09BRUc7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsVUFBNEI7UUFDM0YsT0FBTyxJQUFJLGdCQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDckMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVO1lBQ2pDLGFBQWEsRUFBRSxVQUFVLENBQUMsU0FBUztTQUNwQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBS0QsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDO1FBQ3BDLE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7UUFFM0MsTUFBTSxTQUFTLEdBQUcsNkRBQTZELGtCQUFrQixpQkFBaUIsa0JBQWtCLHFCQUFxQixDQUFDO1FBRTFKLE1BQU0sT0FBTyxHQUFHLElBQUksOEJBQWlCLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFO1lBQ25FLGtFQUFrRTtZQUNsRSxPQUFPLEVBQUUsSUFBSSxvQkFBTyxDQUFDLFlBQVksRUFBRSwwQkFBYSxDQUFDLE1BQU0sQ0FBQztZQUN4RCxJQUFJLEVBQUUsaUJBQUksQ0FBQyxTQUFTLENBQUMsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7WUFDekUsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLHNDQUFzQyxFQUFFLCtCQUErQjtZQUM3RSxhQUFhLEVBQUUsc0NBQXNDO1lBQ3JELE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLEdBQUcsSUFBSSxvQ0FBZ0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ3BELElBQUksRUFBRSxzQ0FBc0MsRUFBRSwrQkFBK0I7WUFDN0UsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxXQUFXLEVBQUUsRUFBRSxVQUFVLEVBQUUsK0JBQWUsQ0FBQyxvQkFBb0IsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFO1lBQy9GLFNBQVMsRUFBRSx5QkFBUyxDQUFDLFVBQVUsQ0FBQztnQkFDOUIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFO29CQUNOLEtBQUssRUFBRTt3QkFDTCxRQUFRLEVBQUU7NEJBQ1Isb0JBQW9COzRCQUNwQix1Q0FBdUMsU0FBUyxFQUFFOzRCQUNsRCwrQkFBK0I7NEJBQy9CLEVBQUU7NEJBQ0YsbUZBQW1GOzRCQUNuRiwwQkFBMEI7NEJBQzFCLDZFQUE2RTs0QkFDN0UsZ0VBQWdFOzRCQUNoRSwwR0FBMEc7NEJBQzFHLDJCQUEyQjs0QkFDM0IsMEJBQTBCOzRCQUMxQixrSkFBa0o7NEJBQ2xKLDhJQUE4STt5QkFDL0k7cUJBQ0Y7b0JBQ0QsVUFBVSxFQUFFO3dCQUNWLFFBQVEsRUFBRTs0QkFDUixnQ0FBZ0M7NEJBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCUCxpQkFBaUI7Ozs7O2VBS1Q7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1NBQ0gsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUVYLE9BQU8sQ0FBQyxlQUFlLENBQ3JCLElBQUkseUJBQWUsQ0FBQztZQUNsQixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztZQUNqQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1NBQ2hDLENBQUMsQ0FDSCxDQUFDO1FBRUYsS0FBSyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFFdEQsTUFBTSxVQUFVLEdBQWtDO1lBQ2hELElBQUksRUFBRSxrQkFBa0I7WUFDeEIsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxJQUFJLEdBQUcsS0FBSyxDQUFDLGFBQWEsT0FBTztZQUNyRSxjQUFjLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxjQUFjO1lBQy9DLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxXQUFXO1NBQzFDLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNsRCxZQUFZLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDakMsWUFBWSxFQUFFLDJCQUEyQjtZQUN6QyxVQUFVO1NBQ1gsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sd0JBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNoRixDQUFDOztBQTNISCw0Q0E0SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBCdWlsZFNwZWMsIExpbnV4QnVpbGRJbWFnZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcbmltcG9ydCB7IERvY2tlckltYWdlQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyLWFzc2V0cyc7XG5pbXBvcnQgeyBDb250YWluZXJJbWFnZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3MnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBDb2RlLCBSdW50aW1lLCBSdW50aW1lRmFtaWx5LCBTaW5nbGV0b25GdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBTaW5nbGV0b25Qcm9qZWN0IH0gZnJvbSAnLi9zaW5nbGV0b24tcHJvamVjdCc7XG5pbXBvcnQgeyBTb2NpSW5kZXhWMkJ1aWxkUmVzb3VyY2VQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2lJbmRleFYyQnVpbGRQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgRUNSIHJlcG9zaXRvcnkgeW91ciBjb250YWluZXIgaW1hZ2UgaXMgc3RvcmVkLlxuICAgKiBZb3UgY2FuIG9ubHkgc3BlY2lmeSBhIHJlcG9zaXRvcnkgaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgKGFjY291bnQvcmVnaW9uKS5cbiAgICogVGhlIGluZGV4IGFydGlmYWN0IHdpbGwgYmUgdXBsb2FkZWQgdG8gdGhpcyByZXBvc2l0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeTogSVJlcG9zaXRvcnk7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWcgb2YgdGhlIGNvbnRhaW5lciBpbWFnZSB5b3Ugd2FudCB0byBidWlsZCBpbmRleCBmb3IuXG4gICAqL1xuICByZWFkb25seSBpbnB1dEltYWdlVGFnOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWcgb2YgdGhlIG91dHB1dCBjb250YWluZXIgaW1hZ2UgZW1iZWRkZWQgd2l0aCBTT0NJIGluZGV4LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJHtpbnB1dEltYWdlVGFnfS1zb2NpYFxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0SW1hZ2VUYWc/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQnVpbGQgYW5kIHB1Ymxpc2ggYSBTT0NJIGluZGV4IGZvciBhIGNvbnRhaW5lciBpbWFnZS5cbiAqIEEgU09DSSBpbmRleCBoZWxwcyBzdGFydCBGYXJnYXRlIHRhc2tzIGZhc3RlciBpbiBzb21lIGNhc2VzLlxuICogUGxlYXNlIHJlYWQgdGhlIGZvbGxvd2luZyBkb2N1bWVudCBmb3IgbW9yZSBkZXRhaWxzOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC91c2VyZ3VpZGUvY29udGFpbmVyLWNvbnNpZGVyYXRpb25zLmh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2lJbmRleFYyQnVpbGQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogQSB1dGlsaXR5IG1ldGhvZCB0byBjcmVhdGUgYSBTb2NpSW5kZXhCdWlsZCBjb25zdHJ1Y3QgZnJvbSBhIERvY2tlckltYWdlQXNzZXQgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Eb2NrZXJJbWFnZUFzc2V0KHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGltYWdlQXNzZXQ6IERvY2tlckltYWdlQXNzZXQpIHtcbiAgICByZXR1cm4gbmV3IFNvY2lJbmRleFYyQnVpbGQoc2NvcGUsIGlkLCB7XG4gICAgICByZXBvc2l0b3J5OiBpbWFnZUFzc2V0LnJlcG9zaXRvcnksXG4gICAgICBpbnB1dEltYWdlVGFnOiBpbWFnZUFzc2V0LmFzc2V0SGFzaCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSByZXBvc2l0b3J5OiBJUmVwb3NpdG9yeTtcbiAgcHVibGljIHJlYWRvbmx5IG91dHB1dEltYWdlVGFnOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNvY2lJbmRleFYyQnVpbGRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBzb2NpV3JhcHBlclZlcnNpb24gPSAndjAuMi4zJztcbiAgICBjb25zdCBvdXRwdXRJbWFnZVRhZ0tleSA9ICdvdXRwdXRJbWFnZVRhZyc7XG5cbiAgICBjb25zdCBiaW5hcnlVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tL3Rtb2ttc3Mvc29jaS13cmFwcGVyL3JlbGVhc2VzL2Rvd25sb2FkLyR7c29jaVdyYXBwZXJWZXJzaW9ufS9zb2NpLXdyYXBwZXItJHtzb2NpV3JhcHBlclZlcnNpb259LWxpbnV4LWFtZDY0LnRhci5nemA7XG5cbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IFNpbmdsZXRvbkZ1bmN0aW9uKHRoaXMsICdDdXN0b21SZXNvdXJjZUhhbmRsZXInLCB7XG4gICAgICAvLyBVc2UgcmF3IHN0cmluZyB0byBhdm9pZCBmcm9tIHRpZ2h0ZW5pbmcgQ0RLIHZlcnNpb24gcmVxdWlyZW1lbnRcbiAgICAgIHJ1bnRpbWU6IG5ldyBSdW50aW1lKCdub2RlanMyMC54JywgUnVudGltZUZhbWlseS5OT0RFSlMpLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoam9pbihfX2Rpcm5hbWUsICcuLi9sYW1iZGEvdHJpZ2dlci1jb2RlYnVpbGQvZGlzdCcpKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIHV1aWQ6ICdkYjc0MGZkNS01NDM2LTRhODQtOGEwOS1lNmRmY2QwMWY0ZjMnLCAvLyBnZW5lcmF0ZWQgZm9yIHRoaXMgY29uc3RydWN0XG4gICAgICBsYW1iZGFQdXJwb3NlOiAnRGVwbG95VGltZUJ1aWxkQ3VzdG9tUmVzb3VyY2VIYW5kbGVyJyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gbmV3IFNpbmdsZXRvblByb2plY3QodGhpcywgJ1Byb2plY3QnLCB7XG4gICAgICB1dWlkOiAnZTdlOGEwMzgtZTBlNC00ZjU1LTgxMTQtY2RkNjUyM2FkMDhmJywgLy8gZ2VuZXJhdGVkIGZvciB0aGlzIGNvbnN0cnVjdFxuICAgICAgcHJvamVjdFB1cnBvc2U6ICdTb2NpSW5kZXhWMkJ1aWxkJyxcbiAgICAgIGVudmlyb25tZW50OiB7IGJ1aWxkSW1hZ2U6IExpbnV4QnVpbGRJbWFnZS5mcm9tQ29kZUJ1aWxkSW1hZ2VJZCgnYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo3LjAnKSB9LFxuICAgICAgYnVpbGRTcGVjOiBCdWlsZFNwZWMuZnJvbU9iamVjdCh7XG4gICAgICAgIHZlcnNpb246ICcwLjInLFxuICAgICAgICBwaGFzZXM6IHtcbiAgICAgICAgICBidWlsZDoge1xuICAgICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICAgJ2N1cnJlbnRfZGlyPSQocHdkKScsXG4gICAgICAgICAgICAgIGB3Z2V0IC0tcXVpZXQgLU8gc29jaS13cmFwcGVyLnRhci5neiAke2JpbmFyeVVybH1gLFxuICAgICAgICAgICAgICAndGFyIC14dnpmIHNvY2ktd3JhcHBlci50YXIuZ3onLFxuICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgJ2V4cG9ydCBBV1NfQUNDT1VOVD0kKGF3cyBzdHMgZ2V0LWNhbGxlci1pZGVudGl0eSAtLXF1ZXJ5IFwiQWNjb3VudFwiIC0tb3V0cHV0IHRleHQpJyxcbiAgICAgICAgICAgICAgJ2V4cG9ydCBSRUdJU1RSWV9VU0VSPUFXUycsXG4gICAgICAgICAgICAgICdleHBvcnQgUkVHSVNUUllfUEFTU1dPUkQ9JChhd3MgZWNyIGdldC1sb2dpbi1wYXNzd29yZCAtLXJlZ2lvbiAkQVdTX1JFR0lPTiknLFxuICAgICAgICAgICAgICAnZXhwb3J0IFJFR0lTVFJZPSRBV1NfQUNDT1VOVC5ka3IuZWNyLiRBV1NfUkVHSU9OLmFtYXpvbmF3cy5jb20nLFxuICAgICAgICAgICAgICAnYXdzIGVjciBnZXQtbG9naW4tcGFzc3dvcmQgLS1yZWdpb24gJEFXU19SRUdJT04gfCBkb2NrZXIgbG9naW4gLS11c2VybmFtZSBBV1MgLS1wYXNzd29yZC1zdGRpbiAkUkVHSVNUUlknLFxuICAgICAgICAgICAgICAnUkVQT19OQU1FPSRyZXBvc2l0b3J5TmFtZScsXG4gICAgICAgICAgICAgICdJTUFHRV9UQUc9JGlucHV0SW1hZ2VUYWcnLFxuICAgICAgICAgICAgICAnRElHRVNUPSQoYXdzIGVjciBkZXNjcmliZS1pbWFnZXMgLS1yZXBvc2l0b3J5LW5hbWUgJFJFUE9fTkFNRSAtLWltYWdlLWlkcyBpbWFnZVRhZz0kSU1BR0VfVEFHIC0tcXVlcnkgaW1hZ2VEZXRhaWxzWzBdLmltYWdlRGlnZXN0IC0tb3V0cHV0IHRleHQpJyxcbiAgICAgICAgICAgICAgJy4vc29jaS13cmFwcGVyIC0tcmVwbyAkUkVQT19OQU1FIC0tZGlnZXN0ICRESUdFU1QgLS1yZWdpb24gJEFXU19SRUdJT04gLS1hY2NvdW50ICRBV1NfQUNDT1VOVCAtLXNvY2ktdmVyc2lvbiBWMiAtLW91dHB1dC10YWcgJG91dHB1dEltYWdlVGFnJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwb3N0X2J1aWxkOiB7XG4gICAgICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICAgICAnZWNobyBCdWlsZCBjb21wbGV0ZWQgb24gYGRhdGVgJyxcbiAgICAgICAgICAgICAgYFxuU1RBVFVTPSdTVUNDRVNTJ1xuaWYgWyAkQ09ERUJVSUxEX0JVSUxEX1NVQ0NFRURJTkcgLW5lIDEgXSAjIFRlc3QgaWYgdGhlIGJ1aWxkIGlzIGZhaWxpbmdcbnRoZW5cblNUQVRVUz0nRkFJTEVEJ1xuUkVBU09OPVwiZGVwbG95LXRpbWUtYnVpbGQgZmFpbGVkLiBTZWUgQ2xvdWRXYXRjaCBMb2cgc3RyZWFtIGZvciB0aGUgZGV0YWlsZWQgcmVhc29uOiBcbmh0dHBzOi8vJEFXU19SRUdJT04uY29uc29sZS5hd3MuYW1hem9uLmNvbS9jbG91ZHdhdGNoL2hvbWU/cmVnaW9uPSRBV1NfUkVHSU9OI2xvZ3NWMjpsb2ctZ3JvdXBzL2xvZy1ncm91cC9cXFxcJDI1MkZhd3NcXFxcJDI1MkZjb2RlYnVpbGRcXFxcJDI1MkYkcHJvamVjdE5hbWUvbG9nLWV2ZW50cy8kQ09ERUJVSUxEX0xPR19QQVRIXCJcbmZpXG5jYXQgPDxFT0YgPiBwYXlsb2FkLmpzb25cbntcbiAgXCJTdGFja0lkXCI6IFwiJHN0YWNrSWRcIixcbiAgXCJSZXF1ZXN0SWRcIjogXCIkcmVxdWVzdElkXCIsXG4gIFwiTG9naWNhbFJlc291cmNlSWRcIjpcIiRsb2dpY2FsUmVzb3VyY2VJZFwiLFxuICBcIlBoeXNpY2FsUmVzb3VyY2VJZFwiOiBcIiRvdXRwdXRJbWFnZVRhZ1wiLFxuICBcIlN0YXR1c1wiOiBcIiRTVEFUVVNcIixcbiAgXCJSZWFzb25cIjogXCIkUkVBU09OXCIsXG4gIFwiRGF0YVwiOiB7XG4gICAgXCIke291dHB1dEltYWdlVGFnS2V5fVwiOiBcIiRvdXRwdXRJbWFnZVRhZ1wiXG4gIH1cbn1cbkVPRlxuY3VybCAtdnYgLWkgLVggUFVUIC1IICdDb250ZW50LVR5cGU6JyAtZCBcIkBwYXlsb2FkLmpzb25cIiBcIiRyZXNwb25zZVVSTFwiXG4gICAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9KS5wcm9qZWN0O1xuXG4gICAgaGFuZGxlci5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogWydjb2RlYnVpbGQ6U3RhcnRCdWlsZCddLFxuICAgICAgICByZXNvdXJjZXM6IFtwcm9qZWN0LnByb2plY3RBcm5dLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHByb3BzLnJlcG9zaXRvcnkuZ3JhbnRQdWxsUHVzaChwcm9qZWN0KTtcbiAgICBwcm9wcy5yZXBvc2l0b3J5LmdyYW50KHByb2plY3QsICdlY3I6RGVzY3JpYmVJbWFnZXMnKTtcblxuICAgIGNvbnN0IHByb3BlcnRpZXM6IFNvY2lJbmRleFYyQnVpbGRSZXNvdXJjZVByb3BzID0ge1xuICAgICAgdHlwZTogJ1NvY2lJbmRleFYyQnVpbGQnLFxuICAgICAgaW5wdXRJbWFnZVRhZzogcHJvcHMuaW5wdXRJbWFnZVRhZyxcbiAgICAgIG91dHB1dEltYWdlVGFnOiBwcm9wcy5vdXRwdXRJbWFnZVRhZyA/PyBgJHtwcm9wcy5pbnB1dEltYWdlVGFnfS1zb2NpYCxcbiAgICAgIHJlcG9zaXRvcnlOYW1lOiBwcm9wcy5yZXBvc2l0b3J5LnJlcG9zaXRvcnlOYW1lLFxuICAgICAgY29kZUJ1aWxkUHJvamVjdE5hbWU6IHByb2plY3QucHJvamVjdE5hbWUsXG4gICAgfTtcblxuICAgIGNvbnN0IGN1c3RvbSA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IGhhbmRsZXIuZnVuY3Rpb25Bcm4sXG4gICAgICByZXNvdXJjZVR5cGU6ICdDdXN0b206OkNES1NvY2lJbmRleEJ1aWxkJyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlcG9zaXRvcnkgPSBwcm9wcy5yZXBvc2l0b3J5O1xuICAgIHRoaXMub3V0cHV0SW1hZ2VUYWcgPSBjdXN0b20uZ2V0QXR0U3RyaW5nKG91dHB1dEltYWdlVGFnS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGluc3RhbmNlIG9mIGltYWdlIGVtYmVkZGVkIHdpdGggU09DSSB2MiBpbmRleCBmb3IgYW4gRUNTIHRhc2sgZGVmaW5pdGlvbi5cbiAgICogV2hlbiB1c2luZyB0aGlzIGltYWdlIHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiwgeW91ciBkZXBsb3ltZW50IHdhaXRzIHVudGlsXG4gICAqIHRoZSBpbmRleCBidWlsZCBjb21wbGV0ZSBhbmQgdGhlbiBzdGFydCBkZXBsb3lpbmcgYWZ0ZXIgdGhlIGltYWdlIHdpdGggaW5kZXggcmVhZHkuXG4gICAqL1xuICBwdWJsaWMgdG9FY3NEb2NrZXJJbWFnZUNvZGUoKSB7XG4gICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21FY3JSZXBvc2l0b3J5KHRoaXMucmVwb3NpdG9yeSwgdGhpcy5vdXRwdXRJbWFnZVRhZyk7XG4gIH1cbn1cbiJdfQ==