@aws-cdk/app-staging-synthesizer-alpha 2.85.0-alpha.0 → 2.87.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -8,7 +8,7 @@
8
8
  "url": "https://aws.amazon.com"
9
9
  },
10
10
  "dependencies": {
11
- "aws-cdk-lib": "2.85.0",
11
+ "aws-cdk-lib": "2.87.0",
12
12
  "constructs": "^10.0.0"
13
13
  },
14
14
  "dependencyClosure": {
@@ -3187,6 +3187,19 @@
3187
3187
  }
3188
3188
  }
3189
3189
  },
3190
+ "aws-cdk-lib.aws_verifiedpermissions": {
3191
+ "targets": {
3192
+ "dotnet": {
3193
+ "package": "Amazon.CDK.AWS.VerifiedPermissions"
3194
+ },
3195
+ "java": {
3196
+ "package": "services.verifiedpermissions"
3197
+ },
3198
+ "python": {
3199
+ "module": "aws_cdk.aws_verifiedpermissions"
3200
+ }
3201
+ }
3202
+ },
3190
3203
  "aws-cdk-lib.aws_voiceid": {
3191
3204
  "targets": {
3192
3205
  "dotnet": {
@@ -3498,7 +3511,7 @@
3498
3511
  },
3499
3512
  "name": "@aws-cdk/app-staging-synthesizer-alpha",
3500
3513
  "readme": {
3501
- "markdown": "# App Staging Synthesizer\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\nThis library includes constructs aimed at replacing the current model of bootstrapping and providing\ngreater control of the bootstrap experience to the CDK user. The important constructs in this library\nare as follows:\n\n- the `IStagingResources` interface: a framework for an app-level bootstrap stack that handles\n file assets and docker assets.\n- the `DefaultStagingStack`, which is a works-out-of-the-box implementation of the `IStagingResources`\n interface.\n- the `AppStagingSynthesizer`, a new CDK synthesizer that will synthesize CDK applications with\n the staging resources provided.\n\n> As this library is `experimental`, there are features that are not yet implemented. Please look\n> at the list of [Known Limitations](#known-limitations) before getting started.\n\nTo get started, update your CDK App with a new `defaultStackSynthesizer`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id', // put a unique id here\n }),\n});\n```\n\nThis will introduce a `DefaultStagingStack` in your CDK App and staging assets of your App\nwill live in the resources from that stack rather than the CDK Bootstrap stack.\n\nIf you are migrating from a different version of synthesis your updated CDK App will target\nthe resources in the `DefaultStagingStack` and no longer be tied to the bootstrapped resources\nin your account.\n\n## Bootstrap Model\n\nOur current bootstrap model looks like this, when you run `cdk bootstrap aws://<account>/<region>` :\n\n```text\n┌───────────────────────────────────┐┌────────────────────────┐┌────────────────────────┐\n│ ││ ││ │\n│ ││ ││ │\n│ ┌───────────────┐ ││ ┌──────────────┐ ││ ┌──────────────┐ │\n│ │Bootstrap Stack│ ││ │ CDK App 1 │ ││ │ CDK App 2 │ │\n│ └───────────────┘ ││ └──────────────┘ ││ └──────────────┘ │\n│ ││ ││ │\n│ ││ ││ │\n│ ┌───────────────────────────┐ ││ ┌────────────┐ ││ │\n│ │IAM Role for CFN execution │ ││┌────│ S3 Asset │ ││ │\n│ │ IAM Role for lookup │ │││ └────────────┘ ││ │\n│ │ IAM Role for deployment │ │││ ││ │\n│ └───────────────────────────┘ │││ ││ ┌─────────────┐ │\n│ │││ ┌──────────┼┼─────│ S3 Asset │ │\n│ │││ │ ││ └─────────────┘ │\n│ ┌───────────────────────────────┐ │││ │ ││ │\n│ │ IAM Role for File Publishing │ │││ │ ││ │\n│ │ IAM Role for Image Publishing │ │││ │ ││ │\n│ └───────────────────────────────┘ │││ │ ││ │\n│ │││ │ ││ │\n│ ┌─────────────────────────────┐ │││ │ ││ │\n│ │S3 Bucket for Staging Assets │ │││ │ ││ │\n│ │ KMS Key encryption │◀─┼┼┴────────────┘ ││ ┌────────────┐ │\n│ └─────────────────────────────┘ ││ ┌──────────┼┼───── │ ECR Asset │ │\n│ ││ │ ││ └────────────┘ │\n│ ││ │ ││ │\n│┌─────────────────────────────────┐││ │ ││ │\n││ECR Repository for Staging Assets◀┼┼─────────────┘ ││ │\n│└─────────────────────────────────┘││ ││ │\n│ ││ ││ │\n│ ││ ││ │\n│ ││ ││ │\n│ ││ ││ │\n│ ││ ││ │\n│ ││ ││ │\n└───────────────────────────────────┘└────────────────────────┘└────────────────────────┘\n```\n\nYour CDK Application utilizes these resources when deploying. For example, if you have a file asset,\nit gets uploaded to the S3 Staging Bucket using the File Publishing Role when you run `cdk deploy`.\n\nThis library introduces an alternate model to bootstrapping, by splitting out essential CloudFormation IAM roles\nand staging resources. There will still be a Bootstrap Stack, but this will only contain IAM roles necessary for\nCloudFormation deployment. Each CDK App will instead be in charge of its own staging resources, including the\nS3 Bucket, ECR Repositories, and associated IAM roles. It works like this:\n\nThe Staging Stack will contain, on a per-need basis,\n\n- 1 S3 Bucket with KMS encryption for all file assets in the CDK App.\n- An ECR Repository _per_ image (and its revisions).\n- IAM roles with access to the Bucket and Repositories.\n\n```text\n┌─────────────────────────────┐┌───────────────────────────────────────┐┌───────────────────────────────────────┐\n│ ││ ││ │\n│ ┌───────────────┐ ││ ┌──────────────┐ ││ ┌──────────────┐ │\n│ │Bootstrap Stack│ ││ │ CDK App 1 │ ││ │ CDK App 2 │ │\n│ └───────────────┘ ││ └──────────────┘ ││ └──────────────┘ │\n│ ││┌──────────────────┐ ││┌──────────────────┐ │\n│ │││ ┌──────────────┐ │ │││ ┌──────────────┐ │ │\n│ │││ │Staging Stack │ │ │││ │Staging Stack │ │ │\n│ │││ └──────────────┘ │ │││ └──────────────┘ │ │\n│ │││ │ │││ │ │\n│ │││ │ │││ │ │\n│ │││┌────────────────┐│ ┌────────────┐│││┌────────────────┐│ ┌────────────┐│\n│ ││││ IAM Role for ││ ┌───│ S3 Asset │││││ IAM Role for ││ ┌───│ S3 Asset ││\n│ ││││File Publishing ││ │ └────────────┘││││File Publishing ││ │ └────────────┘│\n│ │││└────────────────┘│ │ ││││ IAM Role for ││ │ │\n│ │││ │ │ ││││Image Publishing││ │ │\n│┌───────────────────────────┐│││ │ │ │││└────────────────┘│ │ │\n││IAM Role for CFN execution ││││ │ │ │││ │ │ │\n││ IAM Role for lookup ││││ │ │ │││ │ │ │\n││ IAM Role for deployment ││││┌────────────────┐│ │ │││┌────────────────┐│ │ │\n│└───────────────────────────┘││││ S3 Bucket for ││ │ ││││ S3 Bucket for ││ │ │\n│ ││││ Staging Assets │◀─┘ ││││ Staging Assets │◀─┘ │\n│ │││└────────────────┘│ │││└────────────────┘│ ┌───────────┐│\n│ │││ │ │││ │ ┌───│ ECR Asset ││\n│ │││ │ │││┌────────────────┐│ │ └───────────┘│\n│ │││ │ ││││ ECR Repository ││ │ │\n│ │││ │ ││││ for Staging │◀──┘ │\n│ │││ │ ││││ Assets ││ │\n│ │││ │ │││└────────────────┘│ │\n│ │││ │ │││ │ │\n│ │││ │ │││ │ │\n│ │││ │ │││ │ │\n│ │││ │ │││ │ │\n│ │││ │ │││ │ │\n│ ││└──────────────────┘ ││└──────────────────┘ │\n└─────────────────────────────┘└───────────────────────────────────────┘└───────────────────────────────────────┘\n```\n\nThis allows staging resources to be created when needed next to the CDK App. It has the following\nbenefits:\n\n- Resources between separate CDK Apps are separated so they can be cleaned up and lifecycle\ncontrolled individually.\n- Users have a familiar way to customize staging resources in the CDK Application.\n\n## Using the Default Staging Stack per Environment\n\nThe most common use case will be to use the built-in default resources. In this scenario, the\nsynthesizer will create a new Staging Stack in each environment the CDK App is deployed to store\nits staging resources. To use this kind of synthesizer, use `AppStagingSynthesizer.defaultResources()`.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n }),\n});\n```\n\nEvery CDK App that uses the `DefaultStagingStack` must include an `appId`. This should\nbe an identifier unique to the app and is used to differentiate staging resources associated\nwith the app.\n\n### Default Staging Stack\n\nThe Default Staging Stack includes all the staging resources necessary for CDK Assets. The below example\nis of a CDK App using the `AppStagingSynthesizer` and creating a file asset for the Lambda Function\nsource code. As part of the `DefaultStagingStack`, an S3 bucket and IAM role will be created that will be\nused to upload the asset to S3.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({ appId: 'my-app-id' }),\n});\n\nconst stack = new Stack(app, 'my-stack');\n\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')),\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n\napp.synth();\n```\n\n### Custom Roles\n\nYou can customize some or all of the roles you'd like to use in the synthesizer as well,\nif all you need is to supply custom roles (and not change anything else in the `DefaultStagingStack`):\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});\n```\n\nOr, you can ask to use the CLI credentials that exist at deploy-time.\nThese credentials must have the ability to perform CloudFormation calls,\nlookup resources in your account, and perform CloudFormation deployment.\nFor a full list of what is necessary, see `LookupRole`, `DeploymentActionRole`,\nand `CloudFormationExecutionRole` in the\n[bootstrap template](https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml).\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.cliCredentials(),\n }),\n});\n```\n\nThe default staging stack will create roles to publish to the S3 bucket and ECR repositories,\nassumable by the deployment role. You can also specify an existing IAM role for the\n`fileAssetPublishingRole` or `imageAssetPublishingRole`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),\n imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),\n }),\n});\n```\n\n### Deploy Time S3 Assets\n\nThere are two types of assets:\n\n- Assets used only during deployment. These are used to hand off a large piece of data to another\nservice, that will make a private copy of that data. After deployment, the asset is only necessary for\na potential future rollback.\n- Assets accessed throughout the running life time of the application.\n\nExamples of assets that are only used at deploy time are CloudFormation Templates and Lambda Code\nbundles. Examples of assets accessed throughout the life time of the application are script files\ndownloaded to run in a CodeBuild Project, or on EC2 instance startup. ECR images are always application\nlife-time assets. S3 deploy time assets are stored with a `deploy-time/` prefix, and a lifecycle rule will collect them after a configurable number of days.\n\nLambda assets are by default marked as deploy time assets:\n\n```ts\ndeclare const stack: Stack;\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')), // lambda marks deployTime = true\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n```\n\nOr, if you want to create your own deploy time asset:\n\n```ts\nimport { Asset } from 'aws-cdk-lib/aws-s3-assets';\n\ndeclare const stack: Stack;\nconst asset = new Asset(stack, 'deploy-time-asset', {\n deployTime: true,\n path: path.join(__dirname, './deploy-time-asset'),\n});\n```\n\nBy default, we store deploy time assets for 30 days, but you can change this number by specifying\n`deployTimeFileAssetLifetime`. The number you specify here is how long you will be able to roll back\nto a previous version of an application just by doing a CloudFormation deployment with the old\ntemplate, without rebuilding and republishing assets.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deployTimeFileAssetLifetime: Duration.days(100),\n }),\n});\n```\n\n### Lifecycle Rules on ECR Repositories\n\nBy default, we store a maximum of 3 revisions of a particular docker image asset. This allows\nfor smooth faciliation of rollback scenarios where we may reference previous versions of an\nimage. When more than 3 revisions of an asset exist in the ECR repository, the oldest one is\npurged.\n\nTo change the number of revisions stored, use `imageAssetVersionCount`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n imageAssetVersionCount: 10,\n }),\n});\n```\n\n## Using a Custom Staging Stack per Environment\n\nIf you want to customize some behavior that is not configurable via properties,\nyou can implement your own class that implements `IStagingResources`. To get a head start,\nyou can subclass `DefaultStagingStack`.\n\n```ts\ninterface CustomStagingStackOptions extends DefaultStagingStackOptions {}\n\nclass CustomStagingStack extends DefaultStagingStack {\n}\n```\n\nOr you can roll your own staging resources from scratch, as long as it implements `IStagingResources`.\n\n```ts\ninterface CustomStagingStackProps extends StackProps {}\n\nclass CustomStagingStack extends Stack implements IStagingResources {\n public constructor(scope: Construct, id: string, props: CustomStagingStackProps) {\n super(scope, id, props);\n }\n\n public addFile(asset: FileAssetSource): FileStagingLocation {\n return {\n bucketName: 'myBucket',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n\n public addDockerImage(asset: DockerImageAssetSource): ImageStagingLocation {\n return {\n repoName: 'myRepo',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n}\n```\n\nUsing your custom staging resources means implementing a `CustomFactory` class and calling the\n`AppStagingSynthesizer.customFactory()` static method. This has the benefit of providing a\ncustom Staging Stack that can be created in every environment the CDK App is deployed to.\n\n```ts fixture=with-custom-staging\nclass CustomFactory implements IStagingResourcesFactory {\n public obtainStagingResources(stack: Stack, context: ObtainStagingResourcesContext) {\n const myApp = App.of(stack);\n\n return new CustomStagingStack(myApp!, `CustomStagingStack-${context.environmentString}`, {});\n }\n}\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customFactory({\n factory: new CustomFactory(),\n oncePerEnv: true, // by default\n }),\n});\n```\n\n## Using an Existing Staging Stack\n\nUse `AppStagingSynthesizer.customResources()` to supply an existing stack as the Staging Stack.\nMake sure that the custom stack you provide implements `IStagingResources`.\n\n```ts fixture=with-custom-staging\nconst resourceApp = new App();\nconst resources = new CustomStagingStack(resourceApp, 'CustomStagingStack', {});\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customResources({\n resources,\n }),\n});\n```\n\n## Known Limitations\n\nSince this module is experimental, there are some known limitations:\n\n- Currently this module does not support CDK Pipelines. You must deploy CDK Apps using this\n synthesizer via `cdk deploy`.\n- This synthesizer only needs a bootstrap stack with Roles, without staging resources. We\n haven't written such a bootstrap stack yet; at the moment you can use the existing modern\n bootstrap stack, the staging resources in them will just go unused.\n- Due to limitations on the CloudFormation template size, CDK Applications can have\n at most 38 independent ECR images.\n- When you run `cdk destroy` (for example during testing), the staging bucket and ECR\n repositories will be left behind because CloudFormation cannot clean up non-empty resources.\n You must deploy those resources manually if you want to redeploy again using the same `appId`.\n"
3514
+ "markdown": "# App Staging Synthesizer\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\nThis library includes constructs aimed at replacing the current model of bootstrapping and providing\ngreater control of the bootstrap experience to the CDK user. The important constructs in this library\nare as follows:\n\n- the `IStagingResources` interface: a framework for an app-level bootstrap stack that handles\n file assets and docker assets.\n- the `DefaultStagingStack`, which is a works-out-of-the-box implementation of the `IStagingResources`\n interface.\n- the `AppStagingSynthesizer`, a new CDK synthesizer that will synthesize CDK applications with\n the staging resources provided.\n\n> As this library is `experimental`, there are features that are not yet implemented. Please look\n> at the list of [Known Limitations](#known-limitations) before getting started.\n\nTo get started, update your CDK App with a new `defaultStackSynthesizer`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id', // put a unique id here\n }),\n});\n```\n\nThis will introduce a `DefaultStagingStack` in your CDK App and staging assets of your App\nwill live in the resources from that stack rather than the CDK Bootstrap stack.\n\nIf you are migrating from a different version of synthesis your updated CDK App will target\nthe resources in the `DefaultStagingStack` and no longer be tied to the bootstrapped resources\nin your account.\n\n## Bootstrap Model\n\nIn our default bootstrapping process, when you run `cdk bootstrap aws://<account>/<region>`, the following\nresources are created:\n\n- It creates Roles to assume for cross-account deployments and for Pipeline deployments;\n- It creates staging resources: a global S3 bucket and global ECR repository to hold CDK assets;\n- It creates Roles to write to the S3 bucket and ECR repository;\n\nBecause the bootstrapping resources include regional resources, you need to bootstrap\nevery region you plan to deploy to individually. All assets of all CDK apps deploying\nto that account and region will be written to the single S3 Bucket and ECR repository.\n\nBy using the synthesizer in this library, instead of the\n`DefaultStackSynthesizer`, a different set of staging resources will be created\nfor every CDK application, and they will be created automatically as part of a\nregular deployment, in a separate Stack that is deployed before your application\nStacks. The staging resources will be one S3 bucket, and *one ECR repository per\nimage*, and Roles necessary to access those buckets and ECR repositories. The\nRoles from the default bootstrap stack are still used (though their use can be\nturned off).\n\nThis has the following advantages:\n\n- Because staging resources are now application-specific, they can be fully cleaned up when you clean up\n the application.\n- Because there is now one ECR repository per image instead of one ECR repository for all images, it is\n possible to effectively use ECR life cycle rules (for example, retain only the most recent 5 images)\n to cut down on storage costs.\n- Resources between separate CDK Apps are separated so they can be cleaned up and lifecycle\n controlled individually.\n- Because the only shared bootstrapping resources required are Roles, which are global resources,\n you now only need to bootstrap every account in one Region (instead of every Region). This makes it\n easier to do with CloudFormation StackSets.\n\nFor the deployment roles, this synthesizer still uses the Roles from the default\nbootstrap stack, and nothing else. The staging resources from that bootstrap\nstack will be unused. You can customize the template to remove those resources\nif you prefer. In the future, we will provide a bootstrap stack template with\nonly those Roles, specifically for use with this synthesizer.\n\n## Using the Default Staging Stack per Environment\n\nThe most common use case will be to use the built-in default resources. In this scenario, the\nsynthesizer will create a new Staging Stack in each environment the CDK App is deployed to store\nits staging resources. To use this kind of synthesizer, use `AppStagingSynthesizer.defaultResources()`.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});\n```\n\nEvery CDK App that uses the `DefaultStagingStack` must include an `appId`. This should\nbe an identifier unique to the app and is used to differentiate staging resources associated\nwith the app.\n\n### Default Staging Stack\n\nThe Default Staging Stack includes all the staging resources necessary for CDK Assets. The below example\nis of a CDK App using the `AppStagingSynthesizer` and creating a file asset for the Lambda Function\nsource code. As part of the `DefaultStagingStack`, an S3 bucket and IAM role will be created that will be\nused to upload the asset to S3.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({ appId: 'my-app-id' }),\n});\n\nconst stack = new Stack(app, 'my-stack');\n\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')),\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n\napp.synth();\n```\n\n### Custom Roles\n\nYou can customize some or all of the roles you'd like to use in the synthesizer as well,\nif all you need is to supply custom roles (and not change anything else in the `DefaultStagingStack`):\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});\n```\n\nOr, you can ask to use the CLI credentials that exist at deploy-time.\nThese credentials must have the ability to perform CloudFormation calls,\nlookup resources in your account, and perform CloudFormation deployment.\nFor a full list of what is necessary, see `LookupRole`, `DeploymentActionRole`,\nand `CloudFormationExecutionRole` in the\n[bootstrap template](https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml).\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.cliCredentials(),\n }),\n});\n```\n\nThe default staging stack will create roles to publish to the S3 bucket and ECR repositories,\nassumable by the deployment role. You can also specify an existing IAM role for the\n`fileAssetPublishingRole` or `imageAssetPublishingRole`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),\n imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),\n }),\n});\n```\n\n### Deploy Time S3 Assets\n\nThere are two types of assets:\n\n- Assets used only during deployment. These are used to hand off a large piece of data to another\nservice, that will make a private copy of that data. After deployment, the asset is only necessary for\na potential future rollback.\n- Assets accessed throughout the running life time of the application.\n\nExamples of assets that are only used at deploy time are CloudFormation Templates and Lambda Code\nbundles. Examples of assets accessed throughout the life time of the application are script files\ndownloaded to run in a CodeBuild Project, or on EC2 instance startup. ECR images are always application\nlife-time assets. S3 deploy time assets are stored with a `deploy-time/` prefix, and a lifecycle rule will collect them after a configurable number of days.\n\nLambda assets are by default marked as deploy time assets:\n\n```ts\ndeclare const stack: Stack;\nnew lambda.Function(stack, 'lambda', {\n code: lambda.AssetCode.fromAsset(path.join(__dirname, 'assets')), // lambda marks deployTime = true\n handler: 'index.handler',\n runtime: lambda.Runtime.PYTHON_3_9,\n});\n```\n\nOr, if you want to create your own deploy time asset:\n\n```ts\nimport { Asset } from 'aws-cdk-lib/aws-s3-assets';\n\ndeclare const stack: Stack;\nconst asset = new Asset(stack, 'deploy-time-asset', {\n deployTime: true,\n path: path.join(__dirname, './deploy-time-asset'),\n});\n```\n\nBy default, we store deploy time assets for 30 days, but you can change this number by specifying\n`deployTimeFileAssetLifetime`. The number you specify here is how long you will be able to roll back\nto a previous version of an application just by doing a CloudFormation deployment with the old\ntemplate, without rebuilding and republishing assets.\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deployTimeFileAssetLifetime: Duration.days(100),\n }),\n});\n```\n\n### Lifecycle Rules on ECR Repositories\n\nBy default, we store a maximum of 3 revisions of a particular docker image asset. This allows\nfor smooth faciliation of rollback scenarios where we may reference previous versions of an\nimage. When more than 3 revisions of an asset exist in the ECR repository, the oldest one is\npurged.\n\nTo change the number of revisions stored, use `imageAssetVersionCount`:\n\n```ts\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n imageAssetVersionCount: 10,\n }),\n});\n```\n\n## Using a Custom Staging Stack per Environment\n\nIf you want to customize some behavior that is not configurable via properties,\nyou can implement your own class that implements `IStagingResources`. To get a head start,\nyou can subclass `DefaultStagingStack`.\n\n```ts\ninterface CustomStagingStackOptions extends DefaultStagingStackOptions {}\n\nclass CustomStagingStack extends DefaultStagingStack {\n}\n```\n\nOr you can roll your own staging resources from scratch, as long as it implements `IStagingResources`.\n\n```ts\ninterface CustomStagingStackProps extends StackProps {}\n\nclass CustomStagingStack extends Stack implements IStagingResources {\n public constructor(scope: Construct, id: string, props: CustomStagingStackProps) {\n super(scope, id, props);\n }\n\n public addFile(asset: FileAssetSource): FileStagingLocation {\n return {\n bucketName: 'myBucket',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n\n public addDockerImage(asset: DockerImageAssetSource): ImageStagingLocation {\n return {\n repoName: 'myRepo',\n assumeRoleArn: 'myArn',\n dependencyStack: this,\n };\n }\n}\n```\n\nUsing your custom staging resources means implementing a `CustomFactory` class and calling the\n`AppStagingSynthesizer.customFactory()` static method. This has the benefit of providing a\ncustom Staging Stack that can be created in every environment the CDK App is deployed to.\n\n```ts fixture=with-custom-staging\nclass CustomFactory implements IStagingResourcesFactory {\n public obtainStagingResources(stack: Stack, context: ObtainStagingResourcesContext) {\n const myApp = App.of(stack);\n\n return new CustomStagingStack(myApp!, `CustomStagingStack-${context.environmentString}`, {});\n }\n}\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customFactory({\n factory: new CustomFactory(),\n oncePerEnv: true, // by default\n }),\n});\n```\n\n## Using an Existing Staging Stack\n\nUse `AppStagingSynthesizer.customResources()` to supply an existing stack as the Staging Stack.\nMake sure that the custom stack you provide implements `IStagingResources`.\n\n```ts fixture=with-custom-staging\nconst resourceApp = new App();\nconst resources = new CustomStagingStack(resourceApp, 'CustomStagingStack', {});\n\nconst app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.customResources({\n resources,\n }),\n});\n```\n\n## Known Limitations\n\nSince this module is experimental, there are some known limitations:\n\n- Currently this module does not support CDK Pipelines. You must deploy CDK Apps using this\n synthesizer via `cdk deploy`. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26118)\n to indicate you want this.\n- This synthesizer only needs a bootstrap stack with Roles, without staging resources. We\n haven't written such a bootstrap stack yet; at the moment you can use the existing modern\n bootstrap stack, the staging resources in them will just go unused. You can customize the\n template to remove them if desired.\n- Due to limitations on the CloudFormation template size, CDK Applications can have\n at most 20 independent ECR images. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26119)\n if you need more than this.\n"
3502
3515
  },
3503
3516
  "repository": {
3504
3517
  "directory": "packages/@aws-cdk/app-staging-synthesizer-alpha",
@@ -3897,7 +3910,7 @@
3897
3910
  "kind": "class",
3898
3911
  "locationInModule": {
3899
3912
  "filename": "lib/bootstrap-roles.ts",
3900
- "line": 7
3913
+ "line": 8
3901
3914
  },
3902
3915
  "methods": [
3903
3916
  {
@@ -3907,7 +3920,7 @@
3907
3920
  },
3908
3921
  "locationInModule": {
3909
3922
  "filename": "lib/bootstrap-roles.ts",
3910
- "line": 11
3923
+ "line": 12
3911
3924
  },
3912
3925
  "name": "cliCredentials",
3913
3926
  "returns": {
@@ -3924,7 +3937,7 @@
3924
3937
  },
3925
3938
  "locationInModule": {
3926
3939
  "filename": "lib/bootstrap-roles.ts",
3927
- "line": 18
3940
+ "line": 19
3928
3941
  },
3929
3942
  "name": "fromRoleArn",
3930
3943
  "parameters": [
@@ -3949,7 +3962,7 @@
3949
3962
  },
3950
3963
  "locationInModule": {
3951
3964
  "filename": "lib/bootstrap-roles.ts",
3952
- "line": 30
3965
+ "line": 31
3953
3966
  },
3954
3967
  "name": "isCliCredentials",
3955
3968
  "returns": {
@@ -3977,7 +3990,7 @@
3977
3990
  "kind": "interface",
3978
3991
  "locationInModule": {
3979
3992
  "filename": "lib/bootstrap-roles.ts",
3980
- "line": 89
3993
+ "line": 142
3981
3994
  },
3982
3995
  "name": "BootstrapRoles",
3983
3996
  "properties": [
@@ -3991,7 +4004,7 @@
3991
4004
  "immutable": true,
3992
4005
  "locationInModule": {
3993
4006
  "filename": "lib/bootstrap-roles.ts",
3994
- "line": 95
4007
+ "line": 148
3995
4008
  },
3996
4009
  "name": "cloudFormationExecutionRole",
3997
4010
  "optional": true,
@@ -4009,7 +4022,7 @@
4009
4022
  "immutable": true,
4010
4023
  "locationInModule": {
4011
4024
  "filename": "lib/bootstrap-roles.ts",
4012
- "line": 102
4025
+ "line": 155
4013
4026
  },
4014
4027
  "name": "deploymentRole",
4015
4028
  "optional": true,
@@ -4027,7 +4040,7 @@
4027
4040
  "immutable": true,
4028
4041
  "locationInModule": {
4029
4042
  "filename": "lib/bootstrap-roles.ts",
4030
- "line": 109
4043
+ "line": 162
4031
4044
  },
4032
4045
  "name": "lookupRole",
4033
4046
  "optional": true,
@@ -4138,6 +4151,47 @@
4138
4151
  ],
4139
4152
  "symbolId": "lib/app-staging-synthesizer:CustomResourcesOptions"
4140
4153
  },
4154
+ "@aws-cdk/app-staging-synthesizer-alpha.DefaultBootstrapRolesOptions": {
4155
+ "assembly": "@aws-cdk/app-staging-synthesizer-alpha",
4156
+ "datatype": true,
4157
+ "docs": {
4158
+ "stability": "experimental",
4159
+ "summary": "Options for `DeploymentIdentities.defaultBootstrappedRoles`.",
4160
+ "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});",
4161
+ "custom": {
4162
+ "exampleMetadata": "infused"
4163
+ }
4164
+ },
4165
+ "fqn": "@aws-cdk/app-staging-synthesizer-alpha.DefaultBootstrapRolesOptions",
4166
+ "kind": "interface",
4167
+ "locationInModule": {
4168
+ "filename": "lib/bootstrap-roles.ts",
4169
+ "line": 128
4170
+ },
4171
+ "name": "DefaultBootstrapRolesOptions",
4172
+ "properties": [
4173
+ {
4174
+ "abstract": true,
4175
+ "docs": {
4176
+ "default": "- the stack's current region",
4177
+ "remarks": "By default, the region in which the stack is deployed is used.",
4178
+ "stability": "experimental",
4179
+ "summary": "The region where the default bootstrap roles have been created."
4180
+ },
4181
+ "immutable": true,
4182
+ "locationInModule": {
4183
+ "filename": "lib/bootstrap-roles.ts",
4184
+ "line": 136
4185
+ },
4186
+ "name": "bootstrapRegion",
4187
+ "optional": true,
4188
+ "type": {
4189
+ "primitive": "string"
4190
+ }
4191
+ }
4192
+ ],
4193
+ "symbolId": "lib/bootstrap-roles:DefaultBootstrapRolesOptions"
4194
+ },
4141
4195
  "@aws-cdk/app-staging-synthesizer-alpha.DefaultResourcesOptions": {
4142
4196
  "assembly": "@aws-cdk/app-staging-synthesizer-alpha",
4143
4197
  "datatype": true,
@@ -4557,7 +4611,7 @@
4557
4611
  "docs": {
4558
4612
  "stability": "experimental",
4559
4613
  "summary": "Deployment identities are the class of roles to be assumed by the CDK when deploying the App.",
4560
- "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n deploymentIdentities: DeploymentIdentities.specifyRoles({\n cloudFormationExecutionRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Execute'),\n deploymentRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Deploy'),\n lookupRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/Lookup'),\n }),\n }),\n});",
4614
+ "example": "const app = new App({\n defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({\n appId: 'my-app-id',\n\n // The following line is optional. By default it is assumed you have bootstrapped in the same\n // region(s) as the stack(s) you are deploying.\n deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),\n }),\n});",
4561
4615
  "custom": {
4562
4616
  "exampleMetadata": "infused"
4563
4617
  }
@@ -4566,7 +4620,7 @@
4566
4620
  "kind": "class",
4567
4621
  "locationInModule": {
4568
4622
  "filename": "lib/bootstrap-roles.ts",
4569
- "line": 60
4623
+ "line": 61
4570
4624
  },
4571
4625
  "methods": [
4572
4626
  {
@@ -4576,7 +4630,7 @@
4576
4630
  },
4577
4631
  "locationInModule": {
4578
4632
  "filename": "lib/bootstrap-roles.ts",
4579
- "line": 64
4633
+ "line": 65
4580
4634
  },
4581
4635
  "name": "cliCredentials",
4582
4636
  "returns": {
@@ -4586,6 +4640,32 @@
4586
4640
  },
4587
4641
  "static": true
4588
4642
  },
4643
+ {
4644
+ "docs": {
4645
+ "stability": "experimental",
4646
+ "summary": "Use the Roles that have been created by the default bootstrap stack."
4647
+ },
4648
+ "locationInModule": {
4649
+ "filename": "lib/bootstrap-roles.ts",
4650
+ "line": 84
4651
+ },
4652
+ "name": "defaultBootstrapRoles",
4653
+ "parameters": [
4654
+ {
4655
+ "name": "options",
4656
+ "optional": true,
4657
+ "type": {
4658
+ "fqn": "@aws-cdk/app-staging-synthesizer-alpha.DefaultBootstrapRolesOptions"
4659
+ }
4660
+ }
4661
+ ],
4662
+ "returns": {
4663
+ "type": {
4664
+ "fqn": "@aws-cdk/app-staging-synthesizer-alpha.DeploymentIdentities"
4665
+ }
4666
+ },
4667
+ "static": true
4668
+ },
4589
4669
  {
4590
4670
  "docs": {
4591
4671
  "remarks": "These roles\nmust already exist.",
@@ -4594,7 +4674,7 @@
4594
4674
  },
4595
4675
  "locationInModule": {
4596
4676
  "filename": "lib/bootstrap-roles.ts",
4597
- "line": 76
4677
+ "line": 77
4598
4678
  },
4599
4679
  "name": "specifyRoles",
4600
4680
  "parameters": [
@@ -4618,16 +4698,50 @@
4618
4698
  {
4619
4699
  "docs": {
4620
4700
  "stability": "experimental",
4621
- "summary": "roles that are bootstrapped to your account."
4701
+ "summary": "CloudFormation Execution Role."
4622
4702
  },
4623
4703
  "immutable": true,
4624
4704
  "locationInModule": {
4625
4705
  "filename": "lib/bootstrap-roles.ts",
4626
- "line": 82
4706
+ "line": 102
4627
4707
  },
4628
- "name": "roles",
4708
+ "name": "cloudFormationExecutionRole",
4709
+ "optional": true,
4629
4710
  "type": {
4630
- "fqn": "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRoles"
4711
+ "fqn": "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRole"
4712
+ }
4713
+ },
4714
+ {
4715
+ "docs": {
4716
+ "stability": "experimental",
4717
+ "summary": "Deployment Action Role."
4718
+ },
4719
+ "immutable": true,
4720
+ "locationInModule": {
4721
+ "filename": "lib/bootstrap-roles.ts",
4722
+ "line": 107
4723
+ },
4724
+ "name": "deploymentRole",
4725
+ "optional": true,
4726
+ "type": {
4727
+ "fqn": "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRole"
4728
+ }
4729
+ },
4730
+ {
4731
+ "docs": {
4732
+ "default": "- use bootstrapped role",
4733
+ "stability": "experimental",
4734
+ "summary": "Lookup Role."
4735
+ },
4736
+ "immutable": true,
4737
+ "locationInModule": {
4738
+ "filename": "lib/bootstrap-roles.ts",
4739
+ "line": 113
4740
+ },
4741
+ "name": "lookupRole",
4742
+ "optional": true,
4743
+ "type": {
4744
+ "fqn": "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRole"
4631
4745
  }
4632
4746
  }
4633
4747
  ],
@@ -5011,7 +5125,7 @@
5011
5125
  "kind": "interface",
5012
5126
  "locationInModule": {
5013
5127
  "filename": "lib/bootstrap-roles.ts",
5014
- "line": 116
5128
+ "line": 169
5015
5129
  },
5016
5130
  "name": "StagingRoles",
5017
5131
  "properties": [
@@ -5025,7 +5139,7 @@
5025
5139
  "immutable": true,
5026
5140
  "locationInModule": {
5027
5141
  "filename": "lib/bootstrap-roles.ts",
5028
- "line": 129
5142
+ "line": 182
5029
5143
  },
5030
5144
  "name": "dockerAssetPublishingRole",
5031
5145
  "optional": true,
@@ -5043,7 +5157,7 @@
5043
5157
  "immutable": true,
5044
5158
  "locationInModule": {
5045
5159
  "filename": "lib/bootstrap-roles.ts",
5046
- "line": 122
5160
+ "line": 175
5047
5161
  },
5048
5162
  "name": "fileAssetPublishingRole",
5049
5163
  "optional": true,
@@ -5099,6 +5213,6 @@
5099
5213
  "symbolId": "lib/default-staging-stack:UsingAppStagingSynthesizer"
5100
5214
  }
5101
5215
  },
5102
- "version": "2.85.0-alpha.0",
5216
+ "version": "2.87.0-alpha.0",
5103
5217
  "fingerprint": "**********"
5104
5218
  }
Binary file
package/.warnings.jsii.js CHANGED
@@ -92,6 +92,8 @@ function _aws_cdk_app_staging_synthesizer_alpha_BootstrapRole(p) {
92
92
  }
93
93
  function _aws_cdk_app_staging_synthesizer_alpha_DeploymentIdentities(p) {
94
94
  }
95
+ function _aws_cdk_app_staging_synthesizer_alpha_DefaultBootstrapRolesOptions(p) {
96
+ }
95
97
  function _aws_cdk_app_staging_synthesizer_alpha_BootstrapRoles(p) {
96
98
  if (p == null)
97
99
  return;
@@ -168,4 +170,4 @@ class DeprecationError extends Error {
168
170
  });
169
171
  }
170
172
  }
171
- module.exports = { print, getPropertyDescriptor, DeprecationError, _aws_cdk_app_staging_synthesizer_alpha_UsingAppStagingSynthesizer, _aws_cdk_app_staging_synthesizer_alpha_DefaultStagingStackOptions, _aws_cdk_app_staging_synthesizer_alpha_DefaultStagingStackProps, _aws_cdk_app_staging_synthesizer_alpha_DefaultStagingStack, _aws_cdk_app_staging_synthesizer_alpha_AppStagingSynthesizerOptions, _aws_cdk_app_staging_synthesizer_alpha_DefaultResourcesOptions, _aws_cdk_app_staging_synthesizer_alpha_CustomFactoryOptions, _aws_cdk_app_staging_synthesizer_alpha_CustomResourcesOptions, _aws_cdk_app_staging_synthesizer_alpha_AppStagingSynthesizer, _aws_cdk_app_staging_synthesizer_alpha_BootstrapRole, _aws_cdk_app_staging_synthesizer_alpha_DeploymentIdentities, _aws_cdk_app_staging_synthesizer_alpha_BootstrapRoles, _aws_cdk_app_staging_synthesizer_alpha_StagingRoles, _aws_cdk_app_staging_synthesizer_alpha_FileStagingLocation, _aws_cdk_app_staging_synthesizer_alpha_ImageStagingLocation, _aws_cdk_app_staging_synthesizer_alpha_IStagingResources, _aws_cdk_app_staging_synthesizer_alpha_IStagingResourcesFactory, _aws_cdk_app_staging_synthesizer_alpha_ObtainStagingResourcesContext };
173
+ module.exports = { print, getPropertyDescriptor, DeprecationError, _aws_cdk_app_staging_synthesizer_alpha_UsingAppStagingSynthesizer, _aws_cdk_app_staging_synthesizer_alpha_DefaultStagingStackOptions, _aws_cdk_app_staging_synthesizer_alpha_DefaultStagingStackProps, _aws_cdk_app_staging_synthesizer_alpha_DefaultStagingStack, _aws_cdk_app_staging_synthesizer_alpha_AppStagingSynthesizerOptions, _aws_cdk_app_staging_synthesizer_alpha_DefaultResourcesOptions, _aws_cdk_app_staging_synthesizer_alpha_CustomFactoryOptions, _aws_cdk_app_staging_synthesizer_alpha_CustomResourcesOptions, _aws_cdk_app_staging_synthesizer_alpha_AppStagingSynthesizer, _aws_cdk_app_staging_synthesizer_alpha_BootstrapRole, _aws_cdk_app_staging_synthesizer_alpha_DeploymentIdentities, _aws_cdk_app_staging_synthesizer_alpha_DefaultBootstrapRolesOptions, _aws_cdk_app_staging_synthesizer_alpha_BootstrapRoles, _aws_cdk_app_staging_synthesizer_alpha_StagingRoles, _aws_cdk_app_staging_synthesizer_alpha_FileStagingLocation, _aws_cdk_app_staging_synthesizer_alpha_ImageStagingLocation, _aws_cdk_app_staging_synthesizer_alpha_IStagingResources, _aws_cdk_app_staging_synthesizer_alpha_IStagingResourcesFactory, _aws_cdk_app_staging_synthesizer_alpha_ObtainStagingResourcesContext };
package/README.md CHANGED
@@ -48,106 +48,44 @@ in your account.
48
48
 
49
49
  ## Bootstrap Model
50
50
 
51
- Our current bootstrap model looks like this, when you run `cdk bootstrap aws://<account>/<region>` :
52
-
53
- ```text
54
- ┌───────────────────────────────────┐┌────────────────────────┐┌────────────────────────┐
55
- │ ││ ││ │
56
- │ ││ ││ │
57
- │ ┌───────────────┐ ││ ┌──────────────┐ ││ ┌──────────────┐ │
58
- │ │Bootstrap Stack│ ││ │ CDK App 1 │ ││ │ CDK App 2 │ │
59
- │ └───────────────┘ ││ └──────────────┘ ││ └──────────────┘ │
60
- │ ││ ││ │
61
- │ ││ ││ │
62
- │ ┌───────────────────────────┐ ││ ┌────────────┐ ││ │
63
- │ │IAM Role for CFN execution │ ││┌────│ S3 Asset │ ││ │
64
- │ │ IAM Role for lookup │ │││ └────────────┘ ││ │
65
- │ │ IAM Role for deployment │ │││ ││ │
66
- │ └───────────────────────────┘ │││ ││ ┌─────────────┐ │
67
- │ │││ ┌──────────┼┼─────│ S3 Asset │ │
68
- │ │││ │ ││ └─────────────┘ │
69
- ┌───────────────────────────────┐ │││ │ ││ │
70
- │ │ IAM Role for File Publishing │ │││ │ ││ │
71
- IAM Role for Image Publishing │ │││ │ ││ │
72
- │ └───────────────────────────────┘ │││ │ ││ │
73
- │ │││ │ ││ │
74
- ┌─────────────────────────────┐ │││ │ ││ │
75
- │ │S3 Bucket for Staging Assets │ │││ │ ││ │
76
- │ KMS Key encryption │◀─┼┼┴────────────┘ ││ ┌────────────┐ │
77
- └─────────────────────────────┘ ││ ┌──────────┼┼───── ECR Asset │ │
78
- │ ││ │ ││ └────────────┘ │
79
- │ ││ │ ││ │
80
- │┌─────────────────────────────────┐││ │ ││ │
81
- ││ECR Repository for Staging Assets◀┼┼─────────────┘ ││ │
82
- │└─────────────────────────────────┘││ ││ │
83
- │ ││ ││ │
84
- │ ││ ││ │
85
- │ ││ ││ │
86
- │ ││ ││ │
87
- │ ││ ││ │
88
- │ ││ ││ │
89
- └───────────────────────────────────┘└────────────────────────┘└────────────────────────┘
90
- ```
91
-
92
- Your CDK Application utilizes these resources when deploying. For example, if you have a file asset,
93
- it gets uploaded to the S3 Staging Bucket using the File Publishing Role when you run `cdk deploy`.
94
-
95
- This library introduces an alternate model to bootstrapping, by splitting out essential CloudFormation IAM roles
96
- and staging resources. There will still be a Bootstrap Stack, but this will only contain IAM roles necessary for
97
- CloudFormation deployment. Each CDK App will instead be in charge of its own staging resources, including the
98
- S3 Bucket, ECR Repositories, and associated IAM roles. It works like this:
99
-
100
- The Staging Stack will contain, on a per-need basis,
101
-
102
- - 1 S3 Bucket with KMS encryption for all file assets in the CDK App.
103
- - An ECR Repository _per_ image (and its revisions).
104
- - IAM roles with access to the Bucket and Repositories.
105
-
106
- ```text
107
- ┌─────────────────────────────┐┌───────────────────────────────────────┐┌───────────────────────────────────────┐
108
- │ ││ ││ │
109
- │ ┌───────────────┐ ││ ┌──────────────┐ ││ ┌──────────────┐ │
110
- │ │Bootstrap Stack│ ││ │ CDK App 1 │ ││ │ CDK App 2 │ │
111
- │ └───────────────┘ ││ └──────────────┘ ││ └──────────────┘ │
112
- │ ││┌──────────────────┐ ││┌──────────────────┐ │
113
- │ │││ ┌──────────────┐ │ │││ ┌──────────────┐ │ │
114
- │ │││ │Staging Stack │ │ │││ │Staging Stack │ │ │
115
- │ │││ └──────────────┘ │ │││ └──────────────┘ │ │
116
- │ │││ │ │││ │ │
117
- │ │││ │ │││ │ │
118
- │ │││┌────────────────┐│ ┌────────────┐│││┌────────────────┐│ ┌────────────┐│
119
- │ ││││ IAM Role for ││ ┌───│ S3 Asset │││││ IAM Role for ││ ┌───│ S3 Asset ││
120
- │ ││││File Publishing ││ │ └────────────┘││││File Publishing ││ │ └────────────┘│
121
- │ │││└────────────────┘│ │ ││││ IAM Role for ││ │ │
122
- │ │││ │ │ ││││Image Publishing││ │ │
123
- │┌───────────────────────────┐│││ │ │ │││└────────────────┘│ │ │
124
- ││IAM Role for CFN execution ││││ │ │ │││ │ │ │
125
- ││ IAM Role for lookup ││││ │ │ │││ │ │ │
126
- ││ IAM Role for deployment ││││┌────────────────┐│ │ │││┌────────────────┐│ │ │
127
- │└───────────────────────────┘││││ S3 Bucket for ││ │ ││││ S3 Bucket for ││ │ │
128
- │ ││││ Staging Assets │◀─┘ ││││ Staging Assets │◀─┘ │
129
- │ │││└────────────────┘│ │││└────────────────┘│ ┌───────────┐│
130
- │ │││ │ │││ │ ┌───│ ECR Asset ││
131
- │ │││ │ │││┌────────────────┐│ │ └───────────┘│
132
- │ │││ │ ││││ ECR Repository ││ │ │
133
- │ │││ │ ││││ for Staging │◀──┘ │
134
- │ │││ │ ││││ Assets ││ │
135
- │ │││ │ │││└────────────────┘│ │
136
- │ │││ │ │││ │ │
137
- │ │││ │ │││ │ │
138
- │ │││ │ │││ │ │
139
- │ │││ │ │││ │ │
140
- │ │││ │ │││ │ │
141
- │ ││└──────────────────┘ ││└──────────────────┘ │
142
- └─────────────────────────────┘└───────────────────────────────────────┘└───────────────────────────────────────┘
143
- ```
144
-
145
- This allows staging resources to be created when needed next to the CDK App. It has the following
146
- benefits:
147
-
51
+ In our default bootstrapping process, when you run `cdk bootstrap aws://<account>/<region>`, the following
52
+ resources are created:
53
+
54
+ - It creates Roles to assume for cross-account deployments and for Pipeline deployments;
55
+ - It creates staging resources: a global S3 bucket and global ECR repository to hold CDK assets;
56
+ - It creates Roles to write to the S3 bucket and ECR repository;
57
+
58
+ Because the bootstrapping resources include regional resources, you need to bootstrap
59
+ every region you plan to deploy to individually. All assets of all CDK apps deploying
60
+ to that account and region will be written to the single S3 Bucket and ECR repository.
61
+
62
+ By using the synthesizer in this library, instead of the
63
+ `DefaultStackSynthesizer`, a different set of staging resources will be created
64
+ for every CDK application, and they will be created automatically as part of a
65
+ regular deployment, in a separate Stack that is deployed before your application
66
+ Stacks. The staging resources will be one S3 bucket, and *one ECR repository per
67
+ image*, and Roles necessary to access those buckets and ECR repositories. The
68
+ Roles from the default bootstrap stack are still used (though their use can be
69
+ turned off).
70
+
71
+ This has the following advantages:
72
+
73
+ - Because staging resources are now application-specific, they can be fully cleaned up when you clean up
74
+ the application.
75
+ - Because there is now one ECR repository per image instead of one ECR repository for all images, it is
76
+ possible to effectively use ECR life cycle rules (for example, retain only the most recent 5 images)
77
+ to cut down on storage costs.
148
78
  - Resources between separate CDK Apps are separated so they can be cleaned up and lifecycle
149
- controlled individually.
150
- - Users have a familiar way to customize staging resources in the CDK Application.
79
+ controlled individually.
80
+ - Because the only shared bootstrapping resources required are Roles, which are global resources,
81
+ you now only need to bootstrap every account in one Region (instead of every Region). This makes it
82
+ easier to do with CloudFormation StackSets.
83
+
84
+ For the deployment roles, this synthesizer still uses the Roles from the default
85
+ bootstrap stack, and nothing else. The staging resources from that bootstrap
86
+ stack will be unused. You can customize the template to remove those resources
87
+ if you prefer. In the future, we will provide a bootstrap stack template with
88
+ only those Roles, specifically for use with this synthesizer.
151
89
 
152
90
  ## Using the Default Staging Stack per Environment
153
91
 
@@ -159,6 +97,10 @@ its staging resources. To use this kind of synthesizer, use `AppStagingSynthesiz
159
97
  const app = new App({
160
98
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
161
99
  appId: 'my-app-id',
100
+
101
+ // The following line is optional. By default it is assumed you have bootstrapped in the same
102
+ // region(s) as the stack(s) you are deploying.
103
+ deploymentIdentities: DeploymentIdentities.defaultBootstrapRoles({ bootstrapRegion: 'us-east-1' }),
162
104
  }),
163
105
  });
164
106
  ```
@@ -232,7 +174,7 @@ assumable by the deployment role. You can also specify an existing IAM role for
232
174
  const app = new App({
233
175
  defaultStackSynthesizer: AppStagingSynthesizer.defaultResources({
234
176
  appId: 'my-app-id',
235
- fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),
177
+ fileAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/S3Access'),
236
178
  imageAssetPublishingRole: BootstrapRole.fromRoleArn('arn:aws:iam::123456789012:role/ECRAccess'),
237
179
  }),
238
180
  });
@@ -242,14 +184,14 @@ const app = new App({
242
184
 
243
185
  There are two types of assets:
244
186
 
245
- - Assets used only during deployment. These are used to hand off a large piece of data to another
246
- service, that will make a private copy of that data. After deployment, the asset is only necessary for
247
- a potential future rollback.
187
+ - Assets used only during deployment. These are used to hand off a large piece of data to another
188
+ service, that will make a private copy of that data. After deployment, the asset is only necessary for
189
+ a potential future rollback.
248
190
  - Assets accessed throughout the running life time of the application.
249
191
 
250
192
  Examples of assets that are only used at deploy time are CloudFormation Templates and Lambda Code
251
- bundles. Examples of assets accessed throughout the life time of the application are script files
252
- downloaded to run in a CodeBuild Project, or on EC2 instance startup. ECR images are always application
193
+ bundles. Examples of assets accessed throughout the life time of the application are script files
194
+ downloaded to run in a CodeBuild Project, or on EC2 instance startup. ECR images are always application
253
195
  life-time assets. S3 deploy time assets are stored with a `deploy-time/` prefix, and a lifecycle rule will collect them after a configurable number of days.
254
196
 
255
197
  Lambda assets are by default marked as deploy time assets:
@@ -275,9 +217,9 @@ const asset = new Asset(stack, 'deploy-time-asset', {
275
217
  });
276
218
  ```
277
219
 
278
- By default, we store deploy time assets for 30 days, but you can change this number by specifying
220
+ By default, we store deploy time assets for 30 days, but you can change this number by specifying
279
221
  `deployTimeFileAssetLifetime`. The number you specify here is how long you will be able to roll back
280
- to a previous version of an application just by doing a CloudFormation deployment with the old
222
+ to a previous version of an application just by doing a CloudFormation deployment with the old
281
223
  template, without rebuilding and republishing assets.
282
224
 
283
225
  ```ts
@@ -316,7 +258,7 @@ you can subclass `DefaultStagingStack`.
316
258
  ```ts
317
259
  interface CustomStagingStackOptions extends DefaultStagingStackOptions {}
318
260
 
319
- class CustomStagingStack extends DefaultStagingStack {
261
+ class CustomStagingStack extends DefaultStagingStack {
320
262
  }
321
263
  ```
322
264
 
@@ -389,13 +331,13 @@ const app = new App({
389
331
 
390
332
  Since this module is experimental, there are some known limitations:
391
333
 
392
- - Currently this module does not support CDK Pipelines. You must deploy CDK Apps using this
393
- synthesizer via `cdk deploy`.
334
+ - Currently this module does not support CDK Pipelines. You must deploy CDK Apps using this
335
+ synthesizer via `cdk deploy`. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26118)
336
+ to indicate you want this.
394
337
  - This synthesizer only needs a bootstrap stack with Roles, without staging resources. We
395
338
  haven't written such a bootstrap stack yet; at the moment you can use the existing modern
396
- bootstrap stack, the staging resources in them will just go unused.
339
+ bootstrap stack, the staging resources in them will just go unused. You can customize the
340
+ template to remove them if desired.
397
341
  - Due to limitations on the CloudFormation template size, CDK Applications can have
398
- at most 38 independent ECR images.
399
- - When you run `cdk destroy` (for example during testing), the staging bucket and ECR
400
- repositories will be left behind because CloudFormation cannot clean up non-empty resources.
401
- You must deploy those resources manually if you want to redeploy again using the same `appId`.
342
+ at most 20 independent ECR images. Please upvote [this issue](https://github.com/aws/aws-cdk/issues/26119)
343
+ if you need more than this.
@@ -90,13 +90,12 @@ class AppStagingSynthesizer extends core_1.StackSynthesizer {
90
90
  constructor(props) {
91
91
  super();
92
92
  this.props = props;
93
+ const defaultIdentities = bootstrap_roles_1.DeploymentIdentities.defaultBootstrapRoles();
94
+ const identities = props.deploymentIdentities ?? bootstrap_roles_1.DeploymentIdentities.defaultBootstrapRoles();
93
95
  this.roles = {
94
- deploymentRole: props.deploymentIdentities?.roles.deploymentRole ??
95
- bootstrap_roles_1.BootstrapRole.fromRoleArn(AppStagingSynthesizer.DEFAULT_DEPLOY_ROLE_ARN),
96
- cloudFormationExecutionRole: props.deploymentIdentities?.roles.cloudFormationExecutionRole ??
97
- bootstrap_roles_1.BootstrapRole.fromRoleArn(AppStagingSynthesizer.DEFAULT_CLOUDFORMATION_ROLE_ARN),
98
- lookupRole: this.props.deploymentIdentities?.roles.lookupRole ??
99
- bootstrap_roles_1.BootstrapRole.fromRoleArn(AppStagingSynthesizer.DEFAULT_LOOKUP_ROLE_ARN),
96
+ deploymentRole: identities.deploymentRole ?? defaultIdentities.deploymentRole,
97
+ cloudFormationExecutionRole: identities.cloudFormationExecutionRole ?? defaultIdentities.cloudFormationExecutionRole,
98
+ lookupRole: identities.lookupRole ?? identities.lookupRole,
100
99
  };
101
100
  }
102
101
  /**
@@ -171,7 +170,7 @@ class AppStagingSynthesizer extends core_1.StackSynthesizer {
171
170
  }
172
171
  }
173
172
  _a = JSII_RTTI_SYMBOL_1;
174
- AppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.AppStagingSynthesizer", version: "2.85.0-alpha.0" };
173
+ AppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.AppStagingSynthesizer", version: "2.87.0-alpha.0" };
175
174
  /**
176
175
  * Default ARN qualifier
177
176
  */
@@ -252,4 +251,4 @@ class BoundAppStagingSynthesizer extends core_1.StackSynthesizer {
252
251
  return this.cloudFormationLocationFromDockerImageAsset(location);
253
252
  }
254
253
  }
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN0YWdpbmctc3ludGhlc2l6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhcHAtc3RhZ2luZy1zeW50aGVzaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyQ0FhMEI7QUFDMUIsNEVBQXlHO0FBQ3pHLHVEQUF3RjtBQUN4RixtRUFBMEY7QUFDMUYsdUVBQXlHO0FBQ3pHLHFEQUF1RDtBQUN2RCxtREFBdUQ7QUFHdkQsTUFBTSxlQUFlLEdBQUcsSUFBSSw0QkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFTLENBQUMsQ0FBQztBQUNwRSxNQUFNLGdCQUFnQixHQUFHLElBQUksNEJBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBUyxDQUFDLENBQUM7QUF5RXJFOztHQUVHO0FBQ0gsTUFBYSxxQkFBc0IsU0FBUSx1QkFBZ0I7SUFxQnpEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQWdDOzs7Ozs7Ozs7O1FBQzdELElBQUEsNEJBQWdCLEVBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFbkQsT0FBTyxxQkFBcUIsQ0FBQyxhQUFhLENBQUM7WUFDekMsT0FBTyxFQUFFLDJDQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDN0Msb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtZQUNsRCxrQkFBa0IsRUFBRSxPQUFPLENBQUMsa0JBQWtCO1lBQzlDLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztLQUNKO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQStCOzs7Ozs7Ozs7O1FBQzNELE9BQU8scUJBQXFCLENBQUMsYUFBYSxDQUFDO1lBQ3pDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0I7WUFDbEQsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUM5QyxVQUFVLEVBQUUsS0FBSztZQUNq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QyxhQUFhLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUU7WUFDOUUsVUFBVSxFQUFFLElBQUEsZ0RBQTZCLEVBQUMsVUFBVSxDQUFDO1lBQ3JELFlBQVksRUFBRSxNQUFNO1lBQ3BCLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUEsZ0RBQTZCLEVBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNsRyxDQUFDLENBQUM7UUFFSCxJQUFJLGVBQWUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsMERBQTBELENBQUMsQ0FBQztZQUMzRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxJQUFJLENBQUMsbUNBQW1DLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDM0Q7SUFFRDs7T0FFRztJQUNJLG1CQUFtQixDQUFDLEtBQTZCO1FBQ3RELE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUU7WUFDckYsY0FBYyxFQUFFLElBQUEsZ0RBQTZCLEVBQUMsUUFBUSxDQUFDO1lBQ3ZELElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUEsZ0RBQTZCLEVBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNsRyxDQUFDLENBQUM7UUFFSCxJQUFJLGVBQWUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsMERBQTBELENBQUMsQ0FBQztZQUMzRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxJQUFJLENBQUMsMENBQTBDLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDbEU7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFzc2V0TWFuaWZlc3RCdWlsZGVyLFxuICBCT09UU1RSQVBfUVVBTElGSUVSX0NPTlRFWFQsXG4gIERvY2tlckltYWdlQXNzZXRMb2NhdGlvbixcbiAgRG9ja2VySW1hZ2VBc3NldFNvdXJjZSxcbiAgRmlsZUFzc2V0TG9jYXRpb24sXG4gIEZpbGVBc3NldFNvdXJjZSxcbiAgSUJvdW5kU3RhY2tTeW50aGVzaXplciBhcyBJQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXIsXG4gIElSZXVzYWJsZVN0YWNrU3ludGhlc2l6ZXIsXG4gIElTeW50aGVzaXNTZXNzaW9uLFxuICBTdGFjayxcbiAgU3RhY2tTeW50aGVzaXplcixcbiAgVG9rZW4sXG59IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgU3RyaW5nU3BlY2lhbGl6ZXIsIHRyYW5zbGF0ZUNmblRva2VuVG9Bc3NldFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBCb290c3RyYXBSb2xlLCBCb290c3RyYXBSb2xlcywgRGVwbG95bWVudElkZW50aXRpZXMgfSBmcm9tICcuL2Jvb3RzdHJhcC1yb2xlcyc7XG5pbXBvcnQgeyBEZWZhdWx0U3RhZ2luZ1N0YWNrLCBEZWZhdWx0U3RhZ2luZ1N0YWNrT3B0aW9ucyB9IGZyb20gJy4vZGVmYXVsdC1zdGFnaW5nLXN0YWNrJztcbmltcG9ydCB7IFBlckVudmlyb25tZW50U3RhZ2luZ0ZhY3RvcnkgYXMgUGVyRW52aXJvbm1lbnRTdGFnaW5nRmFjdG9yeSB9IGZyb20gJy4vcGVyLWVudi1zdGFnaW5nLWZhY3RvcnknO1xuaW1wb3J0IHsgQXBwU2NvcGVkR2xvYmFsIH0gZnJvbSAnLi9wcml2YXRlL2FwcC1nbG9iYWwnO1xuaW1wb3J0IHsgdmFsaWRhdGVOb1Rva2VucyB9IGZyb20gJy4vcHJpdmF0ZS9uby10b2tlbnMnO1xuaW1wb3J0IHsgSVN0YWdpbmdSZXNvdXJjZXMsIElTdGFnaW5nUmVzb3VyY2VzRmFjdG9yeSwgT2J0YWluU3RhZ2luZ1Jlc291cmNlc0NvbnRleHQgfSBmcm9tICcuL3N0YWdpbmctc3RhY2snO1xuXG5jb25zdCBBR05PU1RJQ19TVEFDS1MgPSBuZXcgQXBwU2NvcGVkR2xvYmFsKCgpID0+IG5ldyBTZXQ8U3RhY2s+KCkpO1xuY29uc3QgRU5WX0FXQVJFX1NUQUNLUyA9IG5ldyBBcHBTY29wZWRHbG9iYWwoKCkgPT4gbmV3IFNldDxTdGFjaz4oKSk7XG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGFwcGx5IHRvIGFsbCBBcHBTdGFnaW5nU3ludGhlc2l6ZXIgdmFyaWFudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBTdGFnaW5nU3ludGhlc2l6ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoYXQgcm9sZXMgdG8gdXNlIHRvIGRlcGxveSBhcHBsaWNhdGlvbnNcbiAgICpcbiAgICogVGhlc2UgYXJlIHRoZSByb2xlcyB0aGF0IGhhdmUgcGVybWlzc2lvbnMgdG8gaW50ZXJhY3Qgd2l0aCBDbG91ZEZvcm1hdGlvblxuICAgKiBvbiB5b3VyIGJlaGFsZi4gQnkgZGVmYXVsdCB0aGVzZSBhcmUgdGhlIHN0YW5kYXJkIGJvb3RzdHJhcHBlZCBDREsgcm9sZXMsXG4gICAqIGJ1dCB5b3UgY2FuIGN1c3RvbWl6ZSB0aGVtIG9yIHR1cm4gdGhlbSBvZmYgYW5kIHVzZSB0aGUgQ0xJIGNyZWRlbnRpYWxzXG4gICAqIHRvIGRlcGxveS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgc3RhbmRhcmQgYm9vdHN0cmFwcGVkIENESyByb2xlc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudElkZW50aXRpZXM/OiBEZXBsb3ltZW50SWRlbnRpdGllcztcblxuICAvKipcbiAgICogUXVhbGlmaWVyIHRvIGRpc2FtYmlndWF0ZSBtdWx0aXBsZSBib290c3RyYXBwZWQgZW52aXJvbm1lbnRzIGluIHRoZSBzYW1lIGFjY291bnRcbiAgICpcbiAgICogVGhpcyBxdWFsaWZpZXIgaXMgb25seSB1c2VkIHRvIHJlZmVyZW5jZSBib290c3RyYXBwZWQgcmVzb3VyY2VzLiBJdCB3aWxsIG5vdFxuICAgKiBiZSB1c2VkIGluIHRoZSBjcmVhdGlvbiBvZiBhcHAtc3BlY2lmaWMgc3RhZ2luZyByZXNvdXJjZXM6IGBhcHBJZGAgaXMgdXNlZCBmb3IgdGhhdFxuICAgKiBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFZhbHVlIG9mIGNvbnRleHQga2V5ICdAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcicgaWYgc2V0LCBvdGhlcndpc2UgYERFRkFVTFRfUVVBTElGSUVSYFxuICAgKi9cbiAgcmVhZG9ubHkgYm9vdHN0cmFwUXVhbGlmaWVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHN0YWNrUGVyRW52IHN0YXRpYyBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0UmVzb3VyY2VzT3B0aW9ucyBleHRlbmRzIEFwcFN0YWdpbmdTeW50aGVzaXplck9wdGlvbnMsIERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zIHt9XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3VzdG9tRmFjdG9yeSBzdGF0aWMgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tRmFjdG9yeU9wdGlvbnMgZXh0ZW5kcyBBcHBTdGFnaW5nU3ludGhlc2l6ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBmYWN0b3J5IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJldHVybiBzdGFnaW5nIHJlc291cmNlcyBmb3IgZWFjaCBzdGFja1xuICAgKi9cbiAgcmVhZG9ubHkgZmFjdG9yeTogSVN0YWdpbmdSZXNvdXJjZXNGYWN0b3J5O1xuXG4gIC8qKlxuICAgKiBSZXVzZSB0aGUgYW5zd2VyIGZyb20gdGhlIGZhY3RvcnkgZm9yIHN0YWNrcyBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBvbmNlUGVyRW52PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjdXN0b21SZXNvdXJjZXMgc3RhdGljIG1ldGhvZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVJlc291cmNlc09wdGlvbnMgZXh0ZW5kcyBBcHBTdGFnaW5nU3ludGhlc2l6ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVzZSB0aGVzZSBleGFjdCBzdGFnaW5nIHJlc291cmNlcyBmb3IgZXZlcnkgc3RhY2sgdGhhdCB0aGlzIHN5bnRoZXNpemVyIGlzIHVzZWQgZm9yXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZXM6IElTdGFnaW5nUmVzb3VyY2VzO1xufVxuXG4vKipcbiAqIEludGVybmFsIHByb3BlcnRpZXMgZm9yIEFwcFN0YWdpbmdTeW50aGVzaXplclxuICovXG5pbnRlcmZhY2UgQXBwU3RhZ2luZ1N5bnRoZXNpemVyUHJvcHMgZXh0ZW5kcyBBcHBTdGFnaW5nU3ludGhlc2l6ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgZmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGFuIElTdGFnaW5nU3RhY2sgd2hlbiBnaXZlbiB0aGUgc3RhY2sgdGhlXG4gICAqIHN5bnRoZXNpemVyIGlzIGJpbmRpbmcuXG4gICAqL1xuICByZWFkb25seSBmYWN0b3J5OiBJU3RhZ2luZ1Jlc291cmNlc0ZhY3Rvcnk7XG59XG5cbi8qKlxuICogQXBwIFN0YWdpbmcgU3ludGhlc2l6ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFwcFN0YWdpbmdTeW50aGVzaXplciBleHRlbmRzIFN0YWNrU3ludGhlc2l6ZXIgaW1wbGVtZW50cyBJUmV1c2FibGVTdGFja1N5bnRoZXNpemVyIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgQVJOIHF1YWxpZmllclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1FVQUxJRklFUiA9ICdobmI2NTlmZHMnO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IENsb3VkRm9ybWF0aW9uIHJvbGUgQVJOLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0NMT1VERk9STUFUSU9OX1JPTEVfQVJOID0gJ2Fybjoke0FXUzo6UGFydGl0aW9ufTppYW06OiR7QVdTOjpBY2NvdW50SWR9OnJvbGUvY2RrLSR7UXVhbGlmaWVyfS1jZm4tZXhlYy1yb2xlLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259JztcblxuICAvKipcbiAgICogRGVmYXVsdCBkZXBsb3kgcm9sZSBBUk4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfREVQTE9ZX1JPTEVfQVJOID0gJ2Fybjoke0FXUzo6UGFydGl0aW9ufTppYW06OiR7QVdTOjpBY2NvdW50SWR9OnJvbGUvY2RrLSR7UXVhbGlmaWVyfS1kZXBsb3ktcm9sZS0ke0FXUzo6QWNjb3VudElkfS0ke0FXUzo6UmVnaW9ufSc7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbG9va3VwIHJvbGUgQVJOIGZvciBtaXNzaW5nIHZhbHVlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9MT09LVVBfUk9MRV9BUk4gPSAnYXJuOiR7QVdTOjpQYXJ0aXRpb259OmlhbTo6JHtBV1M6OkFjY291bnRJZH06cm9sZS9jZGstJHtRdWFsaWZpZXJ9LWxvb2t1cC1yb2xlLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259JztcblxuICAvKipcbiAgICogVXNlIHRoZSBEZWZhdWx0IFN0YWdpbmcgUmVzb3VyY2VzLCBjcmVhdGluZyBhIHNpbmdsZSBzdGFjayBwZXIgZW52aXJvbm1lbnQgdGhpcyBhcHAgaXMgZGVwbG95ZWQgaW5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFJlc291cmNlcyhvcHRpb25zOiBEZWZhdWx0UmVzb3VyY2VzT3B0aW9ucykge1xuICAgIHZhbGlkYXRlTm9Ub2tlbnMob3B0aW9ucywgJ0FwcFN0YWdpbmdTeW50aGVzaXplcicpO1xuXG4gICAgcmV0dXJuIEFwcFN0YWdpbmdTeW50aGVzaXplci5jdXN0b21GYWN0b3J5KHtcbiAgICAgIGZhY3Rvcnk6IERlZmF1bHRTdGFnaW5nU3RhY2suZmFjdG9yeShvcHRpb25zKSxcbiAgICAgIGRlcGxveW1lbnRJZGVudGl0aWVzOiBvcHRpb25zLmRlcGxveW1lbnRJZGVudGl0aWVzLFxuICAgICAgYm9vdHN0cmFwUXVhbGlmaWVyOiBvcHRpb25zLmJvb3RzdHJhcFF1YWxpZmllcixcbiAgICAgIG9uY2VQZXJFbnY6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlIHRoZXNlIGV4YWN0IHN0YWdpbmcgcmVzb3VyY2VzIGZvciBldmVyeSBzdGFjayB0aGF0IHRoaXMgc3ludGhlc2l6ZXIgaXMgdXNlZCBmb3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3VzdG9tUmVzb3VyY2VzKG9wdGlvbnM6IEN1c3RvbVJlc291cmNlc09wdGlvbnMpIHtcbiAgICByZXR1cm4gQXBwU3RhZ2luZ1N5bnRoZXNpemVyLmN1c3RvbUZhY3Rvcnkoe1xuICAgICAgZGVwbG95bWVudElkZW50aXRpZXM6IG9wdGlvbnMuZGVwbG95bWVudElkZW50aXRpZXMsXG4gICAgICBib290c3RyYXBRdWFsaWZpZXI6IG9wdGlvbnMuYm9vdHN0cmFwUXVhbGlmaWVyLFxuICAgICAgb25jZVBlckVudjogZmFsc2UsXG4gICAgICBmYWN0b3J5OiB7XG4gICAgICAgIG9idGFpblN0YWdpbmdSZXNvdXJjZXMoKSB7XG4gICAgICAgICAgcmV0dXJuIG9wdGlvbnMucmVzb3VyY2VzO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdXBwbHkgeW91ciBvd24gc3RhZ2luZ1N0YWNrRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIElTdGFnaW5nU3RhY2sgd2hlblxuICAgKiBhIHN0YWNrIGlzIGJvdW5kIHRvIHRoZSBzeW50aGVzaXplci5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgYG9uY2VQZXJFbnYgPSB0cnVlYCwgd2hpY2ggbWVhbnMgdGhhdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgSVN0YWdpbmdTdGFja1xuICAgKiB3aWxsIGJlIGNyZWF0ZWQgaW4gbmV3IGVudmlyb25tZW50cy4gU2V0IGBvbmNlUGVyRW52ID0gZmFsc2VgIHRvIHR1cm4gb2ZmIHRoYXQgYmVoYXZpb3IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGN1c3RvbUZhY3Rvcnkob3B0aW9uczogQ3VzdG9tRmFjdG9yeU9wdGlvbnMpIHtcbiAgICBjb25zdCBvbmNlUGVyRW52ID0gb3B0aW9ucy5vbmNlUGVyRW52ID8/IHRydWU7XG4gICAgY29uc3QgZmFjdG9yeSA9IG9uY2VQZXJFbnYgPyBuZXcgUGVyRW52aXJvbm1lbnRTdGFnaW5nRmFjdG9yeShvcHRpb25zLmZhY3RvcnkpIDogb3B0aW9ucy5mYWN0b3J5O1xuXG4gICAgcmV0dXJuIG5ldyBBcHBTdGFnaW5nU3ludGhlc2l6ZXIoe1xuICAgICAgZmFjdG9yeSxcbiAgICAgIGJvb3RzdHJhcFF1YWxpZmllcjogb3B0aW9ucy5ib290c3RyYXBRdWFsaWZpZXIsXG4gICAgICBkZXBsb3ltZW50SWRlbnRpdGllczogb3B0aW9ucy5kZXBsb3ltZW50SWRlbnRpdGllcyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgcm9sZXM6IFJlcXVpcmVkPEJvb3RzdHJhcFJvbGVzPjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEFwcFN0YWdpbmdTeW50aGVzaXplclByb3BzKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMucm9sZXMgPSB7XG4gICAgICBkZXBsb3ltZW50Um9sZTogcHJvcHMuZGVwbG95bWVudElkZW50aXRpZXM/LnJvbGVzLmRlcGxveW1lbnRSb2xlID8/XG4gICAgICAgIEJvb3RzdHJhcFJvbGUuZnJvbVJvbGVBcm4oQXBwU3RhZ2luZ1N5bnRoZXNpemVyLkRFRkFVTFRfREVQTE9ZX1JPTEVfQVJOKSxcbiAgICAgIGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZTogcHJvcHMuZGVwbG95bWVudElkZW50aXRpZXM/LnJvbGVzLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZSA/P1xuICAgICAgICBCb290c3RyYXBSb2xlLmZyb21Sb2xlQXJuKEFwcFN0YWdpbmdTeW50aGVzaXplci5ERUZBVUxUX0NMT1VERk9STUFUSU9OX1JPTEVfQVJOKSxcbiAgICAgIGxvb2t1cFJvbGU6IHRoaXMucHJvcHMuZGVwbG95bWVudElkZW50aXRpZXM/LnJvbGVzLmxvb2t1cFJvbGUgPz9cbiAgICAgICAgQm9vdHN0cmFwUm9sZS5mcm9tUm9sZUFybihBcHBTdGFnaW5nU3ludGhlc2l6ZXIuREVGQVVMVF9MT09LVVBfUk9MRV9BUk4pLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHZlcnNpb24gb2YgdGhlIHN5bnRoZXNpemVyIGJvdW5kIHRvIGEgc3RhY2suXG4gICAqL1xuICBwdWJsaWMgcmV1c2FibGVCaW5kKHN0YWNrOiBTdGFjayk6IElCb3VuZEFwcFN0YWdpbmdTeW50aGVzaXplciB7XG4gICAgdGhpcy5jaGVja0Vudmlyb25tZW50R25vc3RpY2lzbShzdGFjayk7XG4gICAgY29uc3QgcXVhbGlmaWVyID0gdGhpcy5wcm9wcy5ib290c3RyYXBRdWFsaWZpZXIgPz9cbiAgICAgIHN0YWNrLm5vZGUudHJ5R2V0Q29udGV4dChCT09UU1RSQVBfUVVBTElGSUVSX0NPTlRFWFQpID8/XG4gICAgICBBcHBTdGFnaW5nU3ludGhlc2l6ZXIuREVGQVVMVF9RVUFMSUZJRVI7XG4gICAgY29uc3Qgc3BlYyA9IG5ldyBTdHJpbmdTcGVjaWFsaXplcihzdGFjaywgcXVhbGlmaWVyKTtcblxuICAgIGNvbnN0IGRlcGxveVJvbGUgPSB0aGlzLnJvbGVzLmRlcGxveW1lbnRSb2xlLl9zcGVjaWFsaXplKHNwZWMpO1xuXG4gICAgY29uc3QgY29udGV4dDogT2J0YWluU3RhZ2luZ1Jlc291cmNlc0NvbnRleHQgPSB7XG4gICAgICBlbnZpcm9ubWVudFN0cmluZzogW1xuICAgICAgICBUb2tlbi5pc1VucmVzb2x2ZWQoc3RhY2suYWNjb3VudCkgPyAnQUNDT1VOVCcgOiBzdGFjay5hY2NvdW50LFxuICAgICAgICBUb2tlbi5pc1VucmVzb2x2ZWQoc3RhY2sucmVnaW9uKSA/ICdSRUdJT04nIDogc3RhY2sucmVnaW9uLFxuICAgICAgXS5qb2luKCctJyksXG4gICAgICBkZXBsb3lSb2xlQXJuOiBkZXBsb3lSb2xlLl9hcm5Gb3JDbG91ZEZvcm1hdGlvbigpLFxuICAgICAgcXVhbGlmaWVyLFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IEJvdW5kQXBwU3RhZ2luZ1N5bnRoZXNpemVyKHN0YWNrLCB7XG4gICAgICBzdGFnaW5nUmVzb3VyY2VzOiB0aGlzLnByb3BzLmZhY3Rvcnkub2J0YWluU3RhZ2luZ1Jlc291cmNlcyhzdGFjaywgY29udGV4dCksXG4gICAgICBkZXBsb3lSb2xlLFxuICAgICAgY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlOiB0aGlzLnJvbGVzLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZS5fc3BlY2lhbGl6ZShzcGVjKSxcbiAgICAgIGxvb2t1cFJvbGU6IHRoaXMucm9sZXMubG9va3VwUm9sZS5fc3BlY2lhbGl6ZShzcGVjKSxcbiAgICAgIHF1YWxpZmllcixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBmb3IgbGVnYWN5IHB1cnBvc2VzOyB0aGlzIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLlxuICAgKi9cbiAgcHVibGljIGJpbmQoX3N0YWNrOiBTdGFjaykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhIGxlZ2FjeSBBUEksIGNhbGwgcmV1c2FibGVCaW5kIGluc3RlYWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBmb3IgbGVnYWN5IHB1cnBvc2VzOyB0aGlzIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLlxuICAgKi9cbiAgcHVibGljIHN5bnRoZXNpemUoX3Nlc3Npb246IElTeW50aGVzaXNTZXNzaW9uKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGlzIGEgbGVnYWN5IEFQSSwgY2FsbCByZXVzYWJsZUJpbmQgaW5zdGVhZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGZvciBsZWdhY3kgcHVycG9zZXM7IHRoaXMgd2lsbCBuZXZlciBiZSBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkRmlsZUFzc2V0KF9hc3NldDogRmlsZUFzc2V0U291cmNlKTogRmlsZUFzc2V0TG9jYXRpb24ge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhIGxlZ2FjeSBBUEksIGNhbGwgcmV1c2FibGVCaW5kIGluc3RlYWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBmb3IgbGVnYWN5IHB1cnBvc2VzOyB0aGlzIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLlxuICAgKi9cbiAgcHVibGljIGFkZERvY2tlckltYWdlQXNzZXQoX2Fzc2V0OiBEb2NrZXJJbWFnZUFzc2V0U291cmNlKTogRG9ja2VySW1hZ2VBc3NldExvY2F0aW9uIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgaXMgYSBsZWdhY3kgQVBJLCBjYWxsIHJldXNhYmxlQmluZCBpbnN0ZWFkJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhhdCB3ZSdyZSBvbmx5IGJlaW5nIHVzZWQgZm9yIGV4Y2x1c2l2ZWx5IGdub3N0aWMgb3IgYWdub3N0aWMgc3RhY2tzLlxuICAgKlxuICAgKiBXZSBjYW4gdGhpbmsgYWJvdXQgd2hldGhlciB0byBsb29zZW4gdGhpcyByZXF1aXJlbWVudCBsYXRlci5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tFbnZpcm9ubWVudEdub3N0aWNpc20oc3RhY2s6IFN0YWNrKSB7XG4gICAgY29uc3QgaXNBZ25vc3RpYyA9IFRva2VuLmlzVW5yZXNvbHZlZChzdGFjay5hY2NvdW50KSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQoc3RhY2sucmVnaW9uKTtcbiAgICBjb25zdCBhZ25vc3RpY1N0YWNrcyA9IEFHTk9TVElDX1NUQUNLUy5mb3Ioc3RhY2spO1xuICAgIGNvbnN0IGVudkF3YXJlU3RhY2tzID0gRU5WX0FXQVJFX1NUQUNLUy5mb3Ioc3RhY2spO1xuXG4gICAgKGlzQWdub3N0aWMgPyBhZ25vc3RpY1N0YWNrcyA6IGVudkF3YXJlU3RhY2tzKS5hZGQoc3RhY2spO1xuICAgIGlmIChhZ25vc3RpY1N0YWNrcy5zaXplID4gMCAmJiBlbnZBd2FyZVN0YWNrcy5zaXplID4gMCkge1xuXG4gICAgICBjb25zdCBkZXNjcmliZVN0YWNrcyA9ICh4czogU2V0PFN0YWNrPikgPT4gQXJyYXkuZnJvbSh4cykubWFwKHMgPT4gcy5ub2RlLnBhdGgpLmpvaW4oJywgJyk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgICdJdCBpcyBub3Qgc2FmZSB0byB1c2UgQXBwU3RhZ2luZ1N5bnRoZXNpemVyIGZvciBib3RoIGVudmlyb25tZW50LWFnbm9zdGljIGFuZCBlbnZpcm9ubWVudC1hd2FyZSBzdGFja3MgYXQgdGhlIHNhbWUgdGltZS4nLFxuICAgICAgICAnUGxlYXNlIGVpdGhlciBzcGVjaWZ5IGVudmlyb25tZW50cyBmb3IgYWxsIHN0YWNrcyBvciBubyBzdGFja3MgaW4gdGhlIENESyBBcHAuJyxcbiAgICAgICAgYFN0YWNrcyB3aXRoIGVudmlyb25tZW50OiAke2Rlc2NyaWJlU3RhY2tzKGFnbm9zdGljU3RhY2tzKX0uYCxcbiAgICAgICAgYFN0YWNrcyB3aXRob3V0IGVudmlyb25tZW50OiAke2Rlc2NyaWJlU3RhY2tzKGVudkF3YXJlU3RhY2tzKX0uYCxcbiAgICAgIF0uam9pbignICcpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBwcm9wZXJ0aWVzIGZvciBCb3VuZEFwcFN0YWdpbmdTeW50aGVzaXplclxuICovXG5pbnRlcmZhY2UgQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgYm9vdHN0cmFwIHF1YWxpZmllclxuICAgKi9cbiAgcmVhZG9ubHkgcXVhbGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZXMgd2UgZW5kIHVwIHVzaW5nIGZvciB0aGlzIHN5bnRoZXNpemVyXG4gICAqL1xuICByZWFkb25seSBzdGFnaW5nUmVzb3VyY2VzOiBJU3RhZ2luZ1Jlc291cmNlcztcblxuICAvKipcbiAgICogVGhlIGRlcGxveSByb2xlXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lSb2xlOiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBDbG91ZEZvcm1hdGlvbiBFeGVjdXRpb24gUm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlOiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBMb29rdXAgUm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZTogQm9vdHN0cmFwUm9sZTtcbn1cblxuY2xhc3MgQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXIgZXh0ZW5kcyBTdGFja1N5bnRoZXNpemVyIGltcGxlbWVudHMgSUJvdW5kQXBwU3RhZ2luZ1N5bnRoZXNpemVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnaW5nU3RhY2s6IElTdGFnaW5nUmVzb3VyY2VzO1xuICBwcml2YXRlIHJlYWRvbmx5IGFzc2V0TWFuaWZlc3QgPSBuZXcgQXNzZXRNYW5pZmVzdEJ1aWxkZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWFsaWZpZXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRlbmN5U3RhY2tzOiBTZXQ8U3RhY2s+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKHN0YWNrOiBTdGFjaywgcHJpdmF0ZSByZWFkb25seSBwcm9wczogQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXJQcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgc3VwZXIuYmluZChzdGFjayk7XG5cbiAgICB0aGlzLnF1YWxpZmllciA9IHByb3BzLnF1YWxpZmllcjtcbiAgICB0aGlzLnN0YWdpbmdTdGFjayA9IHByb3BzLnN0YWdpbmdSZXNvdXJjZXM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBxdWFsaWZpZXIgdXNlZCB0byBib290c3RyYXAgdGhpcyBzdGFja1xuICAgKi9cbiAgcHVibGljIGdldCBib290c3RyYXBRdWFsaWZpZXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBOb3Qgc3VyZSB3aHkgd2UgbmVlZCB0aGlzLlxuICAgIHJldHVybiB0aGlzLnF1YWxpZmllcjtcbiAgfVxuXG4gIHB1YmxpYyBzeW50aGVzaXplKHNlc3Npb246IElTeW50aGVzaXNTZXNzaW9uKTogdm9pZCB7XG4gICAgY29uc3QgdGVtcGxhdGVBc3NldFNvdXJjZSA9IHRoaXMuc3ludGhlc2l6ZVRlbXBsYXRlKHNlc3Npb24sIHRoaXMucHJvcHMubG9va3VwUm9sZT8uX2FybkZvckNsb3VkQXNzZW1ibHkoKSk7XG4gICAgY29uc3QgdGVtcGxhdGVBc3NldCA9IHRoaXMuYWRkRmlsZUFzc2V0KHRlbXBsYXRlQXNzZXRTb3VyY2UpO1xuXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gQXJyYXkuZnJvbSh0aGlzLmRlcGVuZGVuY3lTdGFja3MpLmZsYXRNYXAoKGQpID0+IGQuYXJ0aWZhY3RJZCk7XG4gICAgY29uc3QgYXNzZXRNYW5pZmVzdElkID0gdGhpcy5hc3NldE1hbmlmZXN0LmVtaXRNYW5pZmVzdCh0aGlzLmJvdW5kU3RhY2ssIHNlc3Npb24sIHt9LCBkZXBlbmRlbmNpZXMpO1xuXG4gICAgY29uc3QgbG9va3VwUm9sZUFybiA9IHRoaXMucHJvcHMubG9va3VwUm9sZT8uX2FybkZvckNsb3VkQXNzZW1ibHkoKTtcblxuICAgIHRoaXMuZW1pdEFydGlmYWN0KHNlc3Npb24sIHtcbiAgICAgIGFzc3VtZVJvbGVBcm46IHRoaXMucHJvcHMuZGVwbG95Um9sZT8uX2FybkZvckNsb3VkQXNzZW1ibHkoKSxcbiAgICAgIGFkZGl0aW9uYWxEZXBlbmRlbmNpZXM6IFthc3NldE1hbmlmZXN0SWRdLFxuICAgICAgc3RhY2tUZW1wbGF0ZUFzc2V0T2JqZWN0VXJsOiB0ZW1wbGF0ZUFzc2V0LnMzT2JqZWN0VXJsV2l0aFBsYWNlaG9sZGVycyxcbiAgICAgIGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZUFybjogdGhpcy5wcm9wcy5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU/Ll9hcm5Gb3JDbG91ZEFzc2VtYmx5KCksXG4gICAgICBsb29rdXBSb2xlOiBsb29rdXBSb2xlQXJuID8geyBhcm46IGxvb2t1cFJvbGVBcm4gfSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBmaWxlIGFzc2V0IHRvIHRoZSBtYW5pZmVzdC5cbiAgICovXG4gIHB1YmxpYyBhZGRGaWxlQXNzZXQoYXNzZXQ6IEZpbGVBc3NldFNvdXJjZSk6IEZpbGVBc3NldExvY2F0aW9uIHtcbiAgICBjb25zdCB7IGJ1Y2tldE5hbWUsIGFzc3VtZVJvbGVBcm4sIHByZWZpeCwgZGVwZW5kZW5jeVN0YWNrIH0gPSB0aGlzLnN0YWdpbmdTdGFjay5hZGRGaWxlKGFzc2V0KTtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuYXNzZXRNYW5pZmVzdC5kZWZhdWx0QWRkRmlsZUFzc2V0KHRoaXMuYm91bmRTdGFjaywgYXNzZXQsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHRyYW5zbGF0ZUNmblRva2VuVG9Bc3NldFRva2VuKGJ1Y2tldE5hbWUpLFxuICAgICAgYnVja2V0UHJlZml4OiBwcmVmaXgsXG4gICAgICByb2xlOiBhc3N1bWVSb2xlQXJuID8geyBhc3N1bWVSb2xlQXJuOiB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbihhc3N1bWVSb2xlQXJuKSB9IDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgaWYgKGRlcGVuZGVuY3lTdGFjaykge1xuICAgICAgdGhpcy5ib3VuZFN0YWNrLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeVN0YWNrLCAnc3RhY2sgZGVwZW5kcyBvbiB0aGUgc3RhZ2luZyBzdGFjayBmb3Igc3RhZ2luZyByZXNvdXJjZXMnKTtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVN0YWNrcy5hZGQoZGVwZW5kZW5jeVN0YWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jbG91ZEZvcm1hdGlvbkxvY2F0aW9uRnJvbUZpbGVBc3NldChsb2NhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZG9ja2VyIGltYWdlIGFzc2V0IHRvIHRoZSBtYW5pZmVzdC5cbiAgICovXG4gIHB1YmxpYyBhZGREb2NrZXJJbWFnZUFzc2V0KGFzc2V0OiBEb2NrZXJJbWFnZUFzc2V0U291cmNlKTogRG9ja2VySW1hZ2VBc3NldExvY2F0aW9uIHtcbiAgICBjb25zdCB7IHJlcG9OYW1lLCBhc3N1bWVSb2xlQXJuLCBkZXBlbmRlbmN5U3RhY2sgfSA9IHRoaXMuc3RhZ2luZ1N0YWNrLmFkZERvY2tlckltYWdlKGFzc2V0KTtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuYXNzZXRNYW5pZmVzdC5kZWZhdWx0QWRkRG9ja2VySW1hZ2VBc3NldCh0aGlzLmJvdW5kU3RhY2ssIGFzc2V0LCB7XG4gICAgICByZXBvc2l0b3J5TmFtZTogdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4ocmVwb05hbWUpLFxuICAgICAgcm9sZTogYXNzdW1lUm9sZUFybiA/IHsgYXNzdW1lUm9sZUFybjogdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4oYXNzdW1lUm9sZUFybikgfSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGlmIChkZXBlbmRlbmN5U3RhY2spIHtcbiAgICAgIHRoaXMuYm91bmRTdGFjay5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3lTdGFjaywgJ3N0YWNrIGRlcGVuZHMgb24gdGhlIHN0YWdpbmcgc3RhY2sgZm9yIHN0YWdpbmcgcmVzb3VyY2VzJyk7XG4gICAgICB0aGlzLmRlcGVuZGVuY3lTdGFja3MuYWRkKGRlcGVuZGVuY3lTdGFjayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2xvdWRGb3JtYXRpb25Mb2NhdGlvbkZyb21Eb2NrZXJJbWFnZUFzc2V0KGxvY2F0aW9uKTtcbiAgfVxufVxuIl19
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN0YWdpbmctc3ludGhlc2l6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhcHAtc3RhZ2luZy1zeW50aGVzaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyQ0FhMEI7QUFDMUIsNEVBQXlHO0FBQ3pHLHVEQUF3RjtBQUN4RixtRUFBMEY7QUFDMUYsdUVBQXlHO0FBQ3pHLHFEQUF1RDtBQUN2RCxtREFBdUQ7QUFHdkQsTUFBTSxlQUFlLEdBQUcsSUFBSSw0QkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFTLENBQUMsQ0FBQztBQUNwRSxNQUFNLGdCQUFnQixHQUFHLElBQUksNEJBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBUyxDQUFDLENBQUM7QUF5RXJFOztHQUVHO0FBQ0gsTUFBYSxxQkFBc0IsU0FBUSx1QkFBZ0I7SUFxQnpEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQWdDOzs7Ozs7Ozs7O1FBQzdELElBQUEsNEJBQWdCLEVBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFbkQsT0FBTyxxQkFBcUIsQ0FBQyxhQUFhLENBQUM7WUFDekMsT0FBTyxFQUFFLDJDQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDN0Msb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtZQUNsRCxrQkFBa0IsRUFBRSxPQUFPLENBQUMsa0JBQWtCO1lBQzlDLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztLQUNKO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQStCOzs7Ozs7Ozs7O1FBQzNELE9BQU8scUJBQXFCLENBQUMsYUFBYSxDQUFDO1lBQ3pDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0I7WUFDbEQsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUM5QyxVQUFVLEVBQUUsS0FBSztZQUNq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RSxLQUFLLEVBQUU7WUFDOUUsVUFBVSxFQUFFLElBQUEsZ0RBQTZCLEVBQUMsVUFBVSxDQUFDO1lBQ3JELFlBQVksRUFBRSxNQUFNO1lBQ3BCLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUEsZ0RBQTZCLEVBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNsRyxDQUFDLENBQUM7UUFFSCxJQUFJLGVBQWUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsMERBQTBELENBQUMsQ0FBQztZQUMzRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxJQUFJLENBQUMsbUNBQW1DLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDM0Q7SUFFRDs7T0FFRztJQUNJLG1CQUFtQixDQUFDLEtBQTZCO1FBQ3RELE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUU7WUFDckYsY0FBYyxFQUFFLElBQUEsZ0RBQTZCLEVBQUMsUUFBUSxDQUFDO1lBQ3ZELElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUEsZ0RBQTZCLEVBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNsRyxDQUFDLENBQUM7UUFFSCxJQUFJLGVBQWUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsMERBQTBELENBQUMsQ0FBQztZQUMzRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxJQUFJLENBQUMsMENBQTBDLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDbEU7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFzc2V0TWFuaWZlc3RCdWlsZGVyLFxuICBCT09UU1RSQVBfUVVBTElGSUVSX0NPTlRFWFQsXG4gIERvY2tlckltYWdlQXNzZXRMb2NhdGlvbixcbiAgRG9ja2VySW1hZ2VBc3NldFNvdXJjZSxcbiAgRmlsZUFzc2V0TG9jYXRpb24sXG4gIEZpbGVBc3NldFNvdXJjZSxcbiAgSUJvdW5kU3RhY2tTeW50aGVzaXplciBhcyBJQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXIsXG4gIElSZXVzYWJsZVN0YWNrU3ludGhlc2l6ZXIsXG4gIElTeW50aGVzaXNTZXNzaW9uLFxuICBTdGFjayxcbiAgU3RhY2tTeW50aGVzaXplcixcbiAgVG9rZW4sXG59IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgU3RyaW5nU3BlY2lhbGl6ZXIsIHRyYW5zbGF0ZUNmblRva2VuVG9Bc3NldFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBCb290c3RyYXBSb2xlLCBCb290c3RyYXBSb2xlcywgRGVwbG95bWVudElkZW50aXRpZXMgfSBmcm9tICcuL2Jvb3RzdHJhcC1yb2xlcyc7XG5pbXBvcnQgeyBEZWZhdWx0U3RhZ2luZ1N0YWNrLCBEZWZhdWx0U3RhZ2luZ1N0YWNrT3B0aW9ucyB9IGZyb20gJy4vZGVmYXVsdC1zdGFnaW5nLXN0YWNrJztcbmltcG9ydCB7IFBlckVudmlyb25tZW50U3RhZ2luZ0ZhY3RvcnkgYXMgUGVyRW52aXJvbm1lbnRTdGFnaW5nRmFjdG9yeSB9IGZyb20gJy4vcGVyLWVudi1zdGFnaW5nLWZhY3RvcnknO1xuaW1wb3J0IHsgQXBwU2NvcGVkR2xvYmFsIH0gZnJvbSAnLi9wcml2YXRlL2FwcC1nbG9iYWwnO1xuaW1wb3J0IHsgdmFsaWRhdGVOb1Rva2VucyB9IGZyb20gJy4vcHJpdmF0ZS9uby10b2tlbnMnO1xuaW1wb3J0IHsgSVN0YWdpbmdSZXNvdXJjZXMsIElTdGFnaW5nUmVzb3VyY2VzRmFjdG9yeSwgT2J0YWluU3RhZ2luZ1Jlc291cmNlc0NvbnRleHQgfSBmcm9tICcuL3N0YWdpbmctc3RhY2snO1xuXG5jb25zdCBBR05PU1RJQ19TVEFDS1MgPSBuZXcgQXBwU2NvcGVkR2xvYmFsKCgpID0+IG5ldyBTZXQ8U3RhY2s+KCkpO1xuY29uc3QgRU5WX0FXQVJFX1NUQUNLUyA9IG5ldyBBcHBTY29wZWRHbG9iYWwoKCkgPT4gbmV3IFNldDxTdGFjaz4oKSk7XG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGFwcGx5IHRvIGFsbCBBcHBTdGFnaW5nU3ludGhlc2l6ZXIgdmFyaWFudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBTdGFnaW5nU3ludGhlc2l6ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoYXQgcm9sZXMgdG8gdXNlIHRvIGRlcGxveSBhcHBsaWNhdGlvbnNcbiAgICpcbiAgICogVGhlc2UgYXJlIHRoZSByb2xlcyB0aGF0IGhhdmUgcGVybWlzc2lvbnMgdG8gaW50ZXJhY3Qgd2l0aCBDbG91ZEZvcm1hdGlvblxuICAgKiBvbiB5b3VyIGJlaGFsZi4gQnkgZGVmYXVsdCB0aGVzZSBhcmUgdGhlIHN0YW5kYXJkIGJvb3RzdHJhcHBlZCBDREsgcm9sZXMsXG4gICAqIGJ1dCB5b3UgY2FuIGN1c3RvbWl6ZSB0aGVtIG9yIHR1cm4gdGhlbSBvZmYgYW5kIHVzZSB0aGUgQ0xJIGNyZWRlbnRpYWxzXG4gICAqIHRvIGRlcGxveS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgc3RhbmRhcmQgYm9vdHN0cmFwcGVkIENESyByb2xlc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudElkZW50aXRpZXM/OiBEZXBsb3ltZW50SWRlbnRpdGllcztcblxuICAvKipcbiAgICogUXVhbGlmaWVyIHRvIGRpc2FtYmlndWF0ZSBtdWx0aXBsZSBib290c3RyYXBwZWQgZW52aXJvbm1lbnRzIGluIHRoZSBzYW1lIGFjY291bnRcbiAgICpcbiAgICogVGhpcyBxdWFsaWZpZXIgaXMgb25seSB1c2VkIHRvIHJlZmVyZW5jZSBib290c3RyYXBwZWQgcmVzb3VyY2VzLiBJdCB3aWxsIG5vdFxuICAgKiBiZSB1c2VkIGluIHRoZSBjcmVhdGlvbiBvZiBhcHAtc3BlY2lmaWMgc3RhZ2luZyByZXNvdXJjZXM6IGBhcHBJZGAgaXMgdXNlZCBmb3IgdGhhdFxuICAgKiBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFZhbHVlIG9mIGNvbnRleHQga2V5ICdAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcicgaWYgc2V0LCBvdGhlcndpc2UgYERFRkFVTFRfUVVBTElGSUVSYFxuICAgKi9cbiAgcmVhZG9ubHkgYm9vdHN0cmFwUXVhbGlmaWVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHN0YWNrUGVyRW52IHN0YXRpYyBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0UmVzb3VyY2VzT3B0aW9ucyBleHRlbmRzIEFwcFN0YWdpbmdTeW50aGVzaXplck9wdGlvbnMsIERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zIHt9XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3VzdG9tRmFjdG9yeSBzdGF0aWMgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tRmFjdG9yeU9wdGlvbnMgZXh0ZW5kcyBBcHBTdGFnaW5nU3ludGhlc2l6ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBmYWN0b3J5IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJldHVybiBzdGFnaW5nIHJlc291cmNlcyBmb3IgZWFjaCBzdGFja1xuICAgKi9cbiAgcmVhZG9ubHkgZmFjdG9yeTogSVN0YWdpbmdSZXNvdXJjZXNGYWN0b3J5O1xuXG4gIC8qKlxuICAgKiBSZXVzZSB0aGUgYW5zd2VyIGZyb20gdGhlIGZhY3RvcnkgZm9yIHN0YWNrcyBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBvbmNlUGVyRW52PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjdXN0b21SZXNvdXJjZXMgc3RhdGljIG1ldGhvZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVJlc291cmNlc09wdGlvbnMgZXh0ZW5kcyBBcHBTdGFnaW5nU3ludGhlc2l6ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVzZSB0aGVzZSBleGFjdCBzdGFnaW5nIHJlc291cmNlcyBmb3IgZXZlcnkgc3RhY2sgdGhhdCB0aGlzIHN5bnRoZXNpemVyIGlzIHVzZWQgZm9yXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZXM6IElTdGFnaW5nUmVzb3VyY2VzO1xufVxuXG4vKipcbiAqIEludGVybmFsIHByb3BlcnRpZXMgZm9yIEFwcFN0YWdpbmdTeW50aGVzaXplclxuICovXG5pbnRlcmZhY2UgQXBwU3RhZ2luZ1N5bnRoZXNpemVyUHJvcHMgZXh0ZW5kcyBBcHBTdGFnaW5nU3ludGhlc2l6ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgZmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGFuIElTdGFnaW5nU3RhY2sgd2hlbiBnaXZlbiB0aGUgc3RhY2sgdGhlXG4gICAqIHN5bnRoZXNpemVyIGlzIGJpbmRpbmcuXG4gICAqL1xuICByZWFkb25seSBmYWN0b3J5OiBJU3RhZ2luZ1Jlc291cmNlc0ZhY3Rvcnk7XG59XG5cbi8qKlxuICogQXBwIFN0YWdpbmcgU3ludGhlc2l6ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFwcFN0YWdpbmdTeW50aGVzaXplciBleHRlbmRzIFN0YWNrU3ludGhlc2l6ZXIgaW1wbGVtZW50cyBJUmV1c2FibGVTdGFja1N5bnRoZXNpemVyIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgQVJOIHF1YWxpZmllclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1FVQUxJRklFUiA9ICdobmI2NTlmZHMnO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IENsb3VkRm9ybWF0aW9uIHJvbGUgQVJOLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0NMT1VERk9STUFUSU9OX1JPTEVfQVJOID0gJ2Fybjoke0FXUzo6UGFydGl0aW9ufTppYW06OiR7QVdTOjpBY2NvdW50SWR9OnJvbGUvY2RrLSR7UXVhbGlmaWVyfS1jZm4tZXhlYy1yb2xlLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259JztcblxuICAvKipcbiAgICogRGVmYXVsdCBkZXBsb3kgcm9sZSBBUk4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfREVQTE9ZX1JPTEVfQVJOID0gJ2Fybjoke0FXUzo6UGFydGl0aW9ufTppYW06OiR7QVdTOjpBY2NvdW50SWR9OnJvbGUvY2RrLSR7UXVhbGlmaWVyfS1kZXBsb3ktcm9sZS0ke0FXUzo6QWNjb3VudElkfS0ke0FXUzo6UmVnaW9ufSc7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbG9va3VwIHJvbGUgQVJOIGZvciBtaXNzaW5nIHZhbHVlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9MT09LVVBfUk9MRV9BUk4gPSAnYXJuOiR7QVdTOjpQYXJ0aXRpb259OmlhbTo6JHtBV1M6OkFjY291bnRJZH06cm9sZS9jZGstJHtRdWFsaWZpZXJ9LWxvb2t1cC1yb2xlLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259JztcblxuICAvKipcbiAgICogVXNlIHRoZSBEZWZhdWx0IFN0YWdpbmcgUmVzb3VyY2VzLCBjcmVhdGluZyBhIHNpbmdsZSBzdGFjayBwZXIgZW52aXJvbm1lbnQgdGhpcyBhcHAgaXMgZGVwbG95ZWQgaW5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFJlc291cmNlcyhvcHRpb25zOiBEZWZhdWx0UmVzb3VyY2VzT3B0aW9ucykge1xuICAgIHZhbGlkYXRlTm9Ub2tlbnMob3B0aW9ucywgJ0FwcFN0YWdpbmdTeW50aGVzaXplcicpO1xuXG4gICAgcmV0dXJuIEFwcFN0YWdpbmdTeW50aGVzaXplci5jdXN0b21GYWN0b3J5KHtcbiAgICAgIGZhY3Rvcnk6IERlZmF1bHRTdGFnaW5nU3RhY2suZmFjdG9yeShvcHRpb25zKSxcbiAgICAgIGRlcGxveW1lbnRJZGVudGl0aWVzOiBvcHRpb25zLmRlcGxveW1lbnRJZGVudGl0aWVzLFxuICAgICAgYm9vdHN0cmFwUXVhbGlmaWVyOiBvcHRpb25zLmJvb3RzdHJhcFF1YWxpZmllcixcbiAgICAgIG9uY2VQZXJFbnY6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlIHRoZXNlIGV4YWN0IHN0YWdpbmcgcmVzb3VyY2VzIGZvciBldmVyeSBzdGFjayB0aGF0IHRoaXMgc3ludGhlc2l6ZXIgaXMgdXNlZCBmb3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3VzdG9tUmVzb3VyY2VzKG9wdGlvbnM6IEN1c3RvbVJlc291cmNlc09wdGlvbnMpIHtcbiAgICByZXR1cm4gQXBwU3RhZ2luZ1N5bnRoZXNpemVyLmN1c3RvbUZhY3Rvcnkoe1xuICAgICAgZGVwbG95bWVudElkZW50aXRpZXM6IG9wdGlvbnMuZGVwbG95bWVudElkZW50aXRpZXMsXG4gICAgICBib290c3RyYXBRdWFsaWZpZXI6IG9wdGlvbnMuYm9vdHN0cmFwUXVhbGlmaWVyLFxuICAgICAgb25jZVBlckVudjogZmFsc2UsXG4gICAgICBmYWN0b3J5OiB7XG4gICAgICAgIG9idGFpblN0YWdpbmdSZXNvdXJjZXMoKSB7XG4gICAgICAgICAgcmV0dXJuIG9wdGlvbnMucmVzb3VyY2VzO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdXBwbHkgeW91ciBvd24gc3RhZ2luZ1N0YWNrRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIElTdGFnaW5nU3RhY2sgd2hlblxuICAgKiBhIHN0YWNrIGlzIGJvdW5kIHRvIHRoZSBzeW50aGVzaXplci5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgYG9uY2VQZXJFbnYgPSB0cnVlYCwgd2hpY2ggbWVhbnMgdGhhdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgSVN0YWdpbmdTdGFja1xuICAgKiB3aWxsIGJlIGNyZWF0ZWQgaW4gbmV3IGVudmlyb25tZW50cy4gU2V0IGBvbmNlUGVyRW52ID0gZmFsc2VgIHRvIHR1cm4gb2ZmIHRoYXQgYmVoYXZpb3IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGN1c3RvbUZhY3Rvcnkob3B0aW9uczogQ3VzdG9tRmFjdG9yeU9wdGlvbnMpIHtcbiAgICBjb25zdCBvbmNlUGVyRW52ID0gb3B0aW9ucy5vbmNlUGVyRW52ID8/IHRydWU7XG4gICAgY29uc3QgZmFjdG9yeSA9IG9uY2VQZXJFbnYgPyBuZXcgUGVyRW52aXJvbm1lbnRTdGFnaW5nRmFjdG9yeShvcHRpb25zLmZhY3RvcnkpIDogb3B0aW9ucy5mYWN0b3J5O1xuXG4gICAgcmV0dXJuIG5ldyBBcHBTdGFnaW5nU3ludGhlc2l6ZXIoe1xuICAgICAgZmFjdG9yeSxcbiAgICAgIGJvb3RzdHJhcFF1YWxpZmllcjogb3B0aW9ucy5ib290c3RyYXBRdWFsaWZpZXIsXG4gICAgICBkZXBsb3ltZW50SWRlbnRpdGllczogb3B0aW9ucy5kZXBsb3ltZW50SWRlbnRpdGllcyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgcm9sZXM6IFJlcXVpcmVkPEJvb3RzdHJhcFJvbGVzPjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEFwcFN0YWdpbmdTeW50aGVzaXplclByb3BzKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IGRlZmF1bHRJZGVudGl0aWVzID0gRGVwbG95bWVudElkZW50aXRpZXMuZGVmYXVsdEJvb3RzdHJhcFJvbGVzKCk7XG4gICAgY29uc3QgaWRlbnRpdGllcyA9IHByb3BzLmRlcGxveW1lbnRJZGVudGl0aWVzID8/IERlcGxveW1lbnRJZGVudGl0aWVzLmRlZmF1bHRCb290c3RyYXBSb2xlcygpO1xuXG4gICAgdGhpcy5yb2xlcyA9IHtcbiAgICAgIGRlcGxveW1lbnRSb2xlOiBpZGVudGl0aWVzLmRlcGxveW1lbnRSb2xlID8/IGRlZmF1bHRJZGVudGl0aWVzLmRlcGxveW1lbnRSb2xlISxcbiAgICAgIGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZTogaWRlbnRpdGllcy5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGUgPz8gZGVmYXVsdElkZW50aXRpZXMuY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlISxcbiAgICAgIGxvb2t1cFJvbGU6IGlkZW50aXRpZXMubG9va3VwUm9sZSA/PyBpZGVudGl0aWVzLmxvb2t1cFJvbGUhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHZlcnNpb24gb2YgdGhlIHN5bnRoZXNpemVyIGJvdW5kIHRvIGEgc3RhY2suXG4gICAqL1xuICBwdWJsaWMgcmV1c2FibGVCaW5kKHN0YWNrOiBTdGFjayk6IElCb3VuZEFwcFN0YWdpbmdTeW50aGVzaXplciB7XG4gICAgdGhpcy5jaGVja0Vudmlyb25tZW50R25vc3RpY2lzbShzdGFjayk7XG4gICAgY29uc3QgcXVhbGlmaWVyID0gdGhpcy5wcm9wcy5ib290c3RyYXBRdWFsaWZpZXIgPz9cbiAgICAgIHN0YWNrLm5vZGUudHJ5R2V0Q29udGV4dChCT09UU1RSQVBfUVVBTElGSUVSX0NPTlRFWFQpID8/XG4gICAgICBBcHBTdGFnaW5nU3ludGhlc2l6ZXIuREVGQVVMVF9RVUFMSUZJRVI7XG4gICAgY29uc3Qgc3BlYyA9IG5ldyBTdHJpbmdTcGVjaWFsaXplcihzdGFjaywgcXVhbGlmaWVyKTtcblxuICAgIGNvbnN0IGRlcGxveVJvbGUgPSB0aGlzLnJvbGVzLmRlcGxveW1lbnRSb2xlLl9zcGVjaWFsaXplKHNwZWMpO1xuXG4gICAgY29uc3QgY29udGV4dDogT2J0YWluU3RhZ2luZ1Jlc291cmNlc0NvbnRleHQgPSB7XG4gICAgICBlbnZpcm9ubWVudFN0cmluZzogW1xuICAgICAgICBUb2tlbi5pc1VucmVzb2x2ZWQoc3RhY2suYWNjb3VudCkgPyAnQUNDT1VOVCcgOiBzdGFjay5hY2NvdW50LFxuICAgICAgICBUb2tlbi5pc1VucmVzb2x2ZWQoc3RhY2sucmVnaW9uKSA/ICdSRUdJT04nIDogc3RhY2sucmVnaW9uLFxuICAgICAgXS5qb2luKCctJyksXG4gICAgICBkZXBsb3lSb2xlQXJuOiBkZXBsb3lSb2xlLl9hcm5Gb3JDbG91ZEZvcm1hdGlvbigpLFxuICAgICAgcXVhbGlmaWVyLFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IEJvdW5kQXBwU3RhZ2luZ1N5bnRoZXNpemVyKHN0YWNrLCB7XG4gICAgICBzdGFnaW5nUmVzb3VyY2VzOiB0aGlzLnByb3BzLmZhY3Rvcnkub2J0YWluU3RhZ2luZ1Jlc291cmNlcyhzdGFjaywgY29udGV4dCksXG4gICAgICBkZXBsb3lSb2xlLFxuICAgICAgY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlOiB0aGlzLnJvbGVzLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZS5fc3BlY2lhbGl6ZShzcGVjKSxcbiAgICAgIGxvb2t1cFJvbGU6IHRoaXMucm9sZXMubG9va3VwUm9sZS5fc3BlY2lhbGl6ZShzcGVjKSxcbiAgICAgIHF1YWxpZmllcixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBmb3IgbGVnYWN5IHB1cnBvc2VzOyB0aGlzIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLlxuICAgKi9cbiAgcHVibGljIGJpbmQoX3N0YWNrOiBTdGFjaykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhIGxlZ2FjeSBBUEksIGNhbGwgcmV1c2FibGVCaW5kIGluc3RlYWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBmb3IgbGVnYWN5IHB1cnBvc2VzOyB0aGlzIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLlxuICAgKi9cbiAgcHVibGljIHN5bnRoZXNpemUoX3Nlc3Npb246IElTeW50aGVzaXNTZXNzaW9uKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGlzIGEgbGVnYWN5IEFQSSwgY2FsbCByZXVzYWJsZUJpbmQgaW5zdGVhZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGZvciBsZWdhY3kgcHVycG9zZXM7IHRoaXMgd2lsbCBuZXZlciBiZSBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkRmlsZUFzc2V0KF9hc3NldDogRmlsZUFzc2V0U291cmNlKTogRmlsZUFzc2V0TG9jYXRpb24ge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhIGxlZ2FjeSBBUEksIGNhbGwgcmV1c2FibGVCaW5kIGluc3RlYWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBmb3IgbGVnYWN5IHB1cnBvc2VzOyB0aGlzIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLlxuICAgKi9cbiAgcHVibGljIGFkZERvY2tlckltYWdlQXNzZXQoX2Fzc2V0OiBEb2NrZXJJbWFnZUFzc2V0U291cmNlKTogRG9ja2VySW1hZ2VBc3NldExvY2F0aW9uIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgaXMgYSBsZWdhY3kgQVBJLCBjYWxsIHJldXNhYmxlQmluZCBpbnN0ZWFkJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhhdCB3ZSdyZSBvbmx5IGJlaW5nIHVzZWQgZm9yIGV4Y2x1c2l2ZWx5IGdub3N0aWMgb3IgYWdub3N0aWMgc3RhY2tzLlxuICAgKlxuICAgKiBXZSBjYW4gdGhpbmsgYWJvdXQgd2hldGhlciB0byBsb29zZW4gdGhpcyByZXF1aXJlbWVudCBsYXRlci5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tFbnZpcm9ubWVudEdub3N0aWNpc20oc3RhY2s6IFN0YWNrKSB7XG4gICAgY29uc3QgaXNBZ25vc3RpYyA9IFRva2VuLmlzVW5yZXNvbHZlZChzdGFjay5hY2NvdW50KSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQoc3RhY2sucmVnaW9uKTtcbiAgICBjb25zdCBhZ25vc3RpY1N0YWNrcyA9IEFHTk9TVElDX1NUQUNLUy5mb3Ioc3RhY2spO1xuICAgIGNvbnN0IGVudkF3YXJlU3RhY2tzID0gRU5WX0FXQVJFX1NUQUNLUy5mb3Ioc3RhY2spO1xuXG4gICAgKGlzQWdub3N0aWMgPyBhZ25vc3RpY1N0YWNrcyA6IGVudkF3YXJlU3RhY2tzKS5hZGQoc3RhY2spO1xuICAgIGlmIChhZ25vc3RpY1N0YWNrcy5zaXplID4gMCAmJiBlbnZBd2FyZVN0YWNrcy5zaXplID4gMCkge1xuXG4gICAgICBjb25zdCBkZXNjcmliZVN0YWNrcyA9ICh4czogU2V0PFN0YWNrPikgPT4gQXJyYXkuZnJvbSh4cykubWFwKHMgPT4gcy5ub2RlLnBhdGgpLmpvaW4oJywgJyk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgICdJdCBpcyBub3Qgc2FmZSB0byB1c2UgQXBwU3RhZ2luZ1N5bnRoZXNpemVyIGZvciBib3RoIGVudmlyb25tZW50LWFnbm9zdGljIGFuZCBlbnZpcm9ubWVudC1hd2FyZSBzdGFja3MgYXQgdGhlIHNhbWUgdGltZS4nLFxuICAgICAgICAnUGxlYXNlIGVpdGhlciBzcGVjaWZ5IGVudmlyb25tZW50cyBmb3IgYWxsIHN0YWNrcyBvciBubyBzdGFja3MgaW4gdGhlIENESyBBcHAuJyxcbiAgICAgICAgYFN0YWNrcyB3aXRoIGVudmlyb25tZW50OiAke2Rlc2NyaWJlU3RhY2tzKGFnbm9zdGljU3RhY2tzKX0uYCxcbiAgICAgICAgYFN0YWNrcyB3aXRob3V0IGVudmlyb25tZW50OiAke2Rlc2NyaWJlU3RhY2tzKGVudkF3YXJlU3RhY2tzKX0uYCxcbiAgICAgIF0uam9pbignICcpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBwcm9wZXJ0aWVzIGZvciBCb3VuZEFwcFN0YWdpbmdTeW50aGVzaXplclxuICovXG5pbnRlcmZhY2UgQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgYm9vdHN0cmFwIHF1YWxpZmllclxuICAgKi9cbiAgcmVhZG9ubHkgcXVhbGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZXMgd2UgZW5kIHVwIHVzaW5nIGZvciB0aGlzIHN5bnRoZXNpemVyXG4gICAqL1xuICByZWFkb25seSBzdGFnaW5nUmVzb3VyY2VzOiBJU3RhZ2luZ1Jlc291cmNlcztcblxuICAvKipcbiAgICogVGhlIGRlcGxveSByb2xlXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lSb2xlOiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBDbG91ZEZvcm1hdGlvbiBFeGVjdXRpb24gUm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlOiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBMb29rdXAgUm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZTogQm9vdHN0cmFwUm9sZTtcbn1cblxuY2xhc3MgQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXIgZXh0ZW5kcyBTdGFja1N5bnRoZXNpemVyIGltcGxlbWVudHMgSUJvdW5kQXBwU3RhZ2luZ1N5bnRoZXNpemVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnaW5nU3RhY2s6IElTdGFnaW5nUmVzb3VyY2VzO1xuICBwcml2YXRlIHJlYWRvbmx5IGFzc2V0TWFuaWZlc3QgPSBuZXcgQXNzZXRNYW5pZmVzdEJ1aWxkZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWFsaWZpZXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRlbmN5U3RhY2tzOiBTZXQ8U3RhY2s+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKHN0YWNrOiBTdGFjaywgcHJpdmF0ZSByZWFkb25seSBwcm9wczogQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXJQcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgc3VwZXIuYmluZChzdGFjayk7XG5cbiAgICB0aGlzLnF1YWxpZmllciA9IHByb3BzLnF1YWxpZmllcjtcbiAgICB0aGlzLnN0YWdpbmdTdGFjayA9IHByb3BzLnN0YWdpbmdSZXNvdXJjZXM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBxdWFsaWZpZXIgdXNlZCB0byBib290c3RyYXAgdGhpcyBzdGFja1xuICAgKi9cbiAgcHVibGljIGdldCBib290c3RyYXBRdWFsaWZpZXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBOb3Qgc3VyZSB3aHkgd2UgbmVlZCB0aGlzLlxuICAgIHJldHVybiB0aGlzLnF1YWxpZmllcjtcbiAgfVxuXG4gIHB1YmxpYyBzeW50aGVzaXplKHNlc3Npb246IElTeW50aGVzaXNTZXNzaW9uKTogdm9pZCB7XG4gICAgY29uc3QgdGVtcGxhdGVBc3NldFNvdXJjZSA9IHRoaXMuc3ludGhlc2l6ZVRlbXBsYXRlKHNlc3Npb24sIHRoaXMucHJvcHMubG9va3VwUm9sZT8uX2FybkZvckNsb3VkQXNzZW1ibHkoKSk7XG4gICAgY29uc3QgdGVtcGxhdGVBc3NldCA9IHRoaXMuYWRkRmlsZUFzc2V0KHRlbXBsYXRlQXNzZXRTb3VyY2UpO1xuXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gQXJyYXkuZnJvbSh0aGlzLmRlcGVuZGVuY3lTdGFja3MpLmZsYXRNYXAoKGQpID0+IGQuYXJ0aWZhY3RJZCk7XG4gICAgY29uc3QgYXNzZXRNYW5pZmVzdElkID0gdGhpcy5hc3NldE1hbmlmZXN0LmVtaXRNYW5pZmVzdCh0aGlzLmJvdW5kU3RhY2ssIHNlc3Npb24sIHt9LCBkZXBlbmRlbmNpZXMpO1xuXG4gICAgY29uc3QgbG9va3VwUm9sZUFybiA9IHRoaXMucHJvcHMubG9va3VwUm9sZT8uX2FybkZvckNsb3VkQXNzZW1ibHkoKTtcblxuICAgIHRoaXMuZW1pdEFydGlmYWN0KHNlc3Npb24sIHtcbiAgICAgIGFzc3VtZVJvbGVBcm46IHRoaXMucHJvcHMuZGVwbG95Um9sZT8uX2FybkZvckNsb3VkQXNzZW1ibHkoKSxcbiAgICAgIGFkZGl0aW9uYWxEZXBlbmRlbmNpZXM6IFthc3NldE1hbmlmZXN0SWRdLFxuICAgICAgc3RhY2tUZW1wbGF0ZUFzc2V0T2JqZWN0VXJsOiB0ZW1wbGF0ZUFzc2V0LnMzT2JqZWN0VXJsV2l0aFBsYWNlaG9sZGVycyxcbiAgICAgIGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZUFybjogdGhpcy5wcm9wcy5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU/Ll9hcm5Gb3JDbG91ZEFzc2VtYmx5KCksXG4gICAgICBsb29rdXBSb2xlOiBsb29rdXBSb2xlQXJuID8geyBhcm46IGxvb2t1cFJvbGVBcm4gfSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBmaWxlIGFzc2V0IHRvIHRoZSBtYW5pZmVzdC5cbiAgICovXG4gIHB1YmxpYyBhZGRGaWxlQXNzZXQoYXNzZXQ6IEZpbGVBc3NldFNvdXJjZSk6IEZpbGVBc3NldExvY2F0aW9uIHtcbiAgICBjb25zdCB7IGJ1Y2tldE5hbWUsIGFzc3VtZVJvbGVBcm4sIHByZWZpeCwgZGVwZW5kZW5jeVN0YWNrIH0gPSB0aGlzLnN0YWdpbmdTdGFjay5hZGRGaWxlKGFzc2V0KTtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuYXNzZXRNYW5pZmVzdC5kZWZhdWx0QWRkRmlsZUFzc2V0KHRoaXMuYm91bmRTdGFjaywgYXNzZXQsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHRyYW5zbGF0ZUNmblRva2VuVG9Bc3NldFRva2VuKGJ1Y2tldE5hbWUpLFxuICAgICAgYnVja2V0UHJlZml4OiBwcmVmaXgsXG4gICAgICByb2xlOiBhc3N1bWVSb2xlQXJuID8geyBhc3N1bWVSb2xlQXJuOiB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbihhc3N1bWVSb2xlQXJuKSB9IDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgaWYgKGRlcGVuZGVuY3lTdGFjaykge1xuICAgICAgdGhpcy5ib3VuZFN0YWNrLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeVN0YWNrLCAnc3RhY2sgZGVwZW5kcyBvbiB0aGUgc3RhZ2luZyBzdGFjayBmb3Igc3RhZ2luZyByZXNvdXJjZXMnKTtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVN0YWNrcy5hZGQoZGVwZW5kZW5jeVN0YWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jbG91ZEZvcm1hdGlvbkxvY2F0aW9uRnJvbUZpbGVBc3NldChsb2NhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZG9ja2VyIGltYWdlIGFzc2V0IHRvIHRoZSBtYW5pZmVzdC5cbiAgICovXG4gIHB1YmxpYyBhZGREb2NrZXJJbWFnZUFzc2V0KGFzc2V0OiBEb2NrZXJJbWFnZUFzc2V0U291cmNlKTogRG9ja2VySW1hZ2VBc3NldExvY2F0aW9uIHtcbiAgICBjb25zdCB7IHJlcG9OYW1lLCBhc3N1bWVSb2xlQXJuLCBkZXBlbmRlbmN5U3RhY2sgfSA9IHRoaXMuc3RhZ2luZ1N0YWNrLmFkZERvY2tlckltYWdlKGFzc2V0KTtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuYXNzZXRNYW5pZmVzdC5kZWZhdWx0QWRkRG9ja2VySW1hZ2VBc3NldCh0aGlzLmJvdW5kU3RhY2ssIGFzc2V0LCB7XG4gICAgICByZXBvc2l0b3J5TmFtZTogdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4ocmVwb05hbWUpLFxuICAgICAgcm9sZTogYXNzdW1lUm9sZUFybiA/IHsgYXNzdW1lUm9sZUFybjogdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4oYXNzdW1lUm9sZUFybikgfSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGlmIChkZXBlbmRlbmN5U3RhY2spIHtcbiAgICAgIHRoaXMuYm91bmRTdGFjay5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3lTdGFjaywgJ3N0YWNrIGRlcGVuZHMgb24gdGhlIHN0YWdpbmcgc3RhY2sgZm9yIHN0YWdpbmcgcmVzb3VyY2VzJyk7XG4gICAgICB0aGlzLmRlcGVuZGVuY3lTdGFja3MuYWRkKGRlcGVuZGVuY3lTdGFjayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2xvdWRGb3JtYXRpb25Mb2NhdGlvbkZyb21Eb2NrZXJJbWFnZUFzc2V0KGxvY2F0aW9uKTtcbiAgfVxufVxuIl19
@@ -37,8 +37,6 @@ export declare class BootstrapRole {
37
37
  * when deploying the App.
38
38
  */
39
39
  export declare class DeploymentIdentities {
40
- /** roles that are bootstrapped to your account. */
41
- readonly roles: BootstrapRoles;
42
40
  /**
43
41
  * Use CLI credentials for all deployment identities.
44
42
  */
@@ -48,8 +46,38 @@ export declare class DeploymentIdentities {
48
46
  * must already exist.
49
47
  */
50
48
  static specifyRoles(roles: BootstrapRoles): DeploymentIdentities;
49
+ /**
50
+ * Use the Roles that have been created by the default bootstrap stack
51
+ */
52
+ static defaultBootstrapRoles(options?: DefaultBootstrapRolesOptions): DeploymentIdentities;
53
+ /**
54
+ * CloudFormation Execution Role
55
+ */
56
+ readonly cloudFormationExecutionRole?: BootstrapRole;
57
+ /**
58
+ * Deployment Action Role
59
+ */
60
+ readonly deploymentRole?: BootstrapRole;
61
+ /**
62
+ * Lookup Role
63
+ @default - use bootstrapped role
64
+ */
65
+ readonly lookupRole?: BootstrapRole;
51
66
  private constructor();
52
67
  }
68
+ /**
69
+ * Options for `DeploymentIdentities.defaultBootstrappedRoles`
70
+ */
71
+ export interface DefaultBootstrapRolesOptions {
72
+ /**
73
+ * The region where the default bootstrap roles have been created
74
+ *
75
+ * By default, the region in which the stack is deployed is used.
76
+ *
77
+ * @default - the stack's current region
78
+ */
79
+ readonly bootstrapRegion?: string;
80
+ }
53
81
  /**
54
82
  * Roles that are bootstrapped to your account.
55
83
  */
@@ -5,6 +5,7 @@ exports.DeploymentIdentities = exports.BootstrapRole = void 0;
5
5
  const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
6
6
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7
7
  const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
8
+ const app_staging_synthesizer_1 = require("./app-staging-synthesizer");
8
9
  /**
9
10
  * Bootstrapped role specifier. These roles must exist already.
10
11
  * This class does not create new IAM Roles.
@@ -52,7 +53,7 @@ class BootstrapRole {
52
53
  }
53
54
  }
54
55
  _a = JSII_RTTI_SYMBOL_1;
55
- BootstrapRole[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRole", version: "2.85.0-alpha.0" };
56
+ BootstrapRole[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRole", version: "2.87.0-alpha.0" };
56
57
  BootstrapRole.CLI_CREDS = 'cli-credentials';
57
58
  exports.BootstrapRole = BootstrapRole;
58
59
  /**
@@ -86,13 +87,40 @@ class DeploymentIdentities {
86
87
  }
87
88
  return new DeploymentIdentities(roles);
88
89
  }
90
+ /**
91
+ * Use the Roles that have been created by the default bootstrap stack
92
+ */
93
+ static defaultBootstrapRoles(options = {}) {
94
+ try {
95
+ jsiiDeprecationWarnings._aws_cdk_app_staging_synthesizer_alpha_DefaultBootstrapRolesOptions(options);
96
+ }
97
+ catch (error) {
98
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
99
+ Error.captureStackTrace(error, this.defaultBootstrapRoles);
100
+ }
101
+ throw error;
102
+ }
103
+ function replacePlaceholders(x) {
104
+ if (options.bootstrapRegion !== undefined) {
105
+ x = x.replace(/\$\{AWS::Region\}/g, options.bootstrapRegion);
106
+ }
107
+ return x;
108
+ }
109
+ return new DeploymentIdentities({
110
+ deploymentRole: BootstrapRole.fromRoleArn(replacePlaceholders(app_staging_synthesizer_1.AppStagingSynthesizer.DEFAULT_DEPLOY_ROLE_ARN)),
111
+ cloudFormationExecutionRole: BootstrapRole.fromRoleArn(replacePlaceholders(app_staging_synthesizer_1.AppStagingSynthesizer.DEFAULT_CLOUDFORMATION_ROLE_ARN)),
112
+ lookupRole: BootstrapRole.fromRoleArn(replacePlaceholders(app_staging_synthesizer_1.AppStagingSynthesizer.DEFAULT_LOOKUP_ROLE_ARN)),
113
+ });
114
+ }
89
115
  constructor(
90
116
  /** roles that are bootstrapped to your account. */
91
117
  roles) {
92
- this.roles = roles;
118
+ this.cloudFormationExecutionRole = roles.cloudFormationExecutionRole;
119
+ this.deploymentRole = roles.deploymentRole;
120
+ this.lookupRole = roles.lookupRole;
93
121
  }
94
122
  }
95
123
  _b = JSII_RTTI_SYMBOL_1;
96
- DeploymentIdentities[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DeploymentIdentities", version: "2.85.0-alpha.0" };
124
+ DeploymentIdentities[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DeploymentIdentities", version: "2.87.0-alpha.0" };
97
125
  exports.DeploymentIdentities = DeploymentIdentities;
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLXJvbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYm9vdHN0cmFwLXJvbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRFQUF3STtBQUV4STs7O0dBR0c7QUFDSCxNQUFhLGFBQWE7SUFDeEI7O09BRUc7SUFDSSxNQUFNLENBQUMsY0FBYztRQUMxQixPQUFPLElBQUksYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNuRDtJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFXO1FBQ25DLG9DQUFpQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQzdELE9BQU8sSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDL0I7SUFJRCxZQUFxQyxPQUFlO1FBQWYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtLQUFJO0lBRXhEOztPQUVHO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxhQUFhLENBQUMsU0FBUyxDQUFDO0tBQ2pEO0lBRUQ7O09BRUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdEQUE2QixFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUMxRjtJQUVEOztPQUVHO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnREFBNkIsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDMUY7SUFFRDs7T0FFRztJQUNJLFdBQVcsQ0FBQyxJQUF1QjtRQUN4QyxPQUFPLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDekQ7Ozs7QUE5QmMsdUJBQVMsR0FBRyxpQkFBaUIsQ0FBQztBQWhCbEMsc0NBQWE7QUFpRDFCOzs7R0FHRztBQUNILE1BQWEsb0JBQW9CO0lBQy9COztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWM7UUFDMUIsT0FBTyxJQUFJLG9CQUFvQixDQUFDO1lBQzlCLDJCQUEyQixFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQUU7WUFDM0QsY0FBYyxFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQUU7WUFDOUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQUU7U0FDM0MsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQXFCOzs7Ozs7Ozs7O1FBQzlDLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4QztJQUVEO0lBQ0UsbURBQW1EO0lBQ25DLEtBQXFCO1FBQXJCLFVBQUssR0FBTCxLQUFLLENBQWdCO0tBQ25DOzs7O0FBdkJPLG9EQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0cmluZ1NwZWNpYWxpemVyLCB0cmFuc2xhdGVBc3NldFRva2VuVG9DZm5Ub2tlbiwgdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcblxuLyoqXG4gKiBCb290c3RyYXBwZWQgcm9sZSBzcGVjaWZpZXIuIFRoZXNlIHJvbGVzIG11c3QgZXhpc3QgYWxyZWFkeS5cbiAqIFRoaXMgY2xhc3MgZG9lcyBub3QgY3JlYXRlIG5ldyBJQU0gUm9sZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCb290c3RyYXBSb2xlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgY3VycmVudGx5IGFzc3VtZWQgcm9sZS9jcmVkZW50aWFsc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGlDcmVkZW50aWFscygpIHtcbiAgICByZXR1cm4gbmV3IEJvb3RzdHJhcFJvbGUoQm9vdHN0cmFwUm9sZS5DTElfQ1JFRFMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYW4gZXhpc3RpbmcgSUFNIFJvbGUgdG8gYXNzdW1lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Sb2xlQXJuKGFybjogc3RyaW5nKSB7XG4gICAgU3RyaW5nU3BlY2lhbGl6ZXIudmFsaWRhdGVOb1Rva2Vucyhhcm4sICdCb290c3RyYXBSb2xlIEFSTicpO1xuICAgIHJldHVybiBuZXcgQm9vdHN0cmFwUm9sZShhcm4pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgQ0xJX0NSRURTID0gJ2NsaS1jcmVkZW50aWFscyc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZykge31cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhpcyBpcyBvYmplY3Qgd2FzIGNyZWF0ZWQgdXNpbmcgQm9vdHN0cmFwUm9sZS5jbGlDcmVkZW50aWFscygpXG4gICAqL1xuICBwdWJsaWMgaXNDbGlDcmVkZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlQXJuID09PSBCb290c3RyYXBSb2xlLkNMSV9DUkVEUztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYXJuRm9yQ2xvdWRGb3JtYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDbGlDcmVkZW50aWFscygpID8gdW5kZWZpbmVkIDogdHJhbnNsYXRlQXNzZXRUb2tlblRvQ2ZuVG9rZW4odGhpcy5yb2xlQXJuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYXJuRm9yQ2xvdWRBc3NlbWJseSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0NsaUNyZWRlbnRpYWxzKCkgPyB1bmRlZmluZWQgOiB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbih0aGlzLnJvbGVBcm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9zcGVjaWFsaXplKHNwZWM6IFN0cmluZ1NwZWNpYWxpemVyKSB7XG4gICAgcmV0dXJuIG5ldyBCb290c3RyYXBSb2xlKHNwZWMuc3BlY2lhbGl6ZSh0aGlzLnJvbGVBcm4pKTtcbiAgfVxufVxuXG4vKipcbiAqIERlcGxveW1lbnQgaWRlbnRpdGllcyBhcmUgdGhlIGNsYXNzIG9mIHJvbGVzIHRvIGJlIGFzc3VtZWQgYnkgdGhlIENES1xuICogd2hlbiBkZXBsb3lpbmcgdGhlIEFwcC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlcGxveW1lbnRJZGVudGl0aWVzIHtcbiAgLyoqXG4gICAqIFVzZSBDTEkgY3JlZGVudGlhbHMgZm9yIGFsbCBkZXBsb3ltZW50IGlkZW50aXRpZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsaUNyZWRlbnRpYWxzKCk6IERlcGxveW1lbnRJZGVudGl0aWVzIHtcbiAgICByZXR1cm4gbmV3IERlcGxveW1lbnRJZGVudGl0aWVzKHtcbiAgICAgIGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZTogQm9vdHN0cmFwUm9sZS5jbGlDcmVkZW50aWFscygpLFxuICAgICAgZGVwbG95bWVudFJvbGU6IEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKSxcbiAgICAgIGxvb2t1cFJvbGU6IEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHlvdXIgb3duIHJvbGVzIGZvciBhbGwgZGVwbG95bWVudCBpZGVudGl0aWVzLiBUaGVzZSByb2xlc1xuICAgKiBtdXN0IGFscmVhZHkgZXhpc3QuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwZWNpZnlSb2xlcyhyb2xlczogQm9vdHN0cmFwUm9sZXMpOiBEZXBsb3ltZW50SWRlbnRpdGllcyB7XG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50SWRlbnRpdGllcyhyb2xlcyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIC8qKiByb2xlcyB0aGF0IGFyZSBib290c3RyYXBwZWQgdG8geW91ciBhY2NvdW50LiAqL1xuICAgIHB1YmxpYyByZWFkb25seSByb2xlczogQm9vdHN0cmFwUm9sZXMsXG4gICkge31cbn1cblxuLyoqXG4gKiBSb2xlcyB0aGF0IGFyZSBib290c3RyYXBwZWQgdG8geW91ciBhY2NvdW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJvb3RzdHJhcFJvbGVzIHtcbiAgLyoqXG4gICAqIENsb3VkRm9ybWF0aW9uIEV4ZWN1dGlvbiBSb2xlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGJvb3RzdHJhcHBlZCByb2xlXG4gICAqL1xuICByZWFkb25seSBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBEZXBsb3ltZW50IEFjdGlvbiBSb2xlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGJvb3N0cmFwcGVkIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRSb2xlPzogQm9vdHN0cmFwUm9sZTtcblxuICAvKipcbiAgICogTG9va3VwIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgYm9vdHN0cmFwcGVkIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cFJvbGU/OiBCb290c3RyYXBSb2xlO1xufVxuXG4vKipcbiAqIFJvbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBTdGFnaW5nIFN0YWNrXG4gKiAoZm9yIGFjY2VzcyB0byBTdGFnaW5nIFJlc291cmNlcylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFnaW5nUm9sZXMge1xuICAvKipcbiAgICogRmlsZSBBc3NldCBQdWJsaXNoaW5nIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdGFnaW5nIHN0YWNrIGNyZWF0ZXMgYSBmaWxlIGFzc2V0IHB1Ymxpc2hpbmcgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBEb2NrZXIgQXNzZXQgUHVibGlzaGluZyBSb2xlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3RhZ2luZyBzdGFjayBjcmVhdGVzIGEgZG9ja2VyIGFzc2V0IHB1Ymxpc2hpbmcgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyQXNzZXRQdWJsaXNoaW5nUm9sZT86IEJvb3RzdHJhcFJvbGU7XG59XG4iXX0=
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLXJvbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYm9vdHN0cmFwLXJvbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRFQUF3STtBQUN4SSx1RUFBa0U7QUFFbEU7OztHQUdHO0FBQ0gsTUFBYSxhQUFhO0lBQ3hCOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWM7UUFDMUIsT0FBTyxJQUFJLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDbkQ7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBVztRQUNuQyxvQ0FBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUM3RCxPQUFPLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQy9CO0lBSUQsWUFBcUMsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7S0FBSTtJQUV4RDs7T0FFRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQztLQUNqRDtJQUVEOztPQUVHO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnREFBNkIsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDMUY7SUFFRDs7T0FFRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0RBQTZCLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzFGO0lBRUQ7O09BRUc7SUFDSSxXQUFXLENBQUMsSUFBdUI7UUFDeEMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0tBQ3pEOzs7O0FBOUJjLHVCQUFTLEdBQUcsaUJBQWlCLENBQUM7QUFoQmxDLHNDQUFhO0FBaUQxQjs7O0dBR0c7QUFDSCxNQUFhLG9CQUFvQjtJQUMvQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxjQUFjO1FBQzFCLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQztZQUM5QiwyQkFBMkIsRUFBRSxhQUFhLENBQUMsY0FBYyxFQUFFO1lBQzNELGNBQWMsRUFBRSxhQUFhLENBQUMsY0FBYyxFQUFFO1lBQzlDLFVBQVUsRUFBRSxhQUFhLENBQUMsY0FBYyxFQUFFO1NBQzNDLENBQUMsQ0FBQztLQUNKO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFxQjs7Ozs7Ozs7OztRQUM5QyxPQUFPLElBQUksb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDeEM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxVQUF3QyxFQUFFOzs7Ozs7Ozs7O1FBQzVFLFNBQVMsbUJBQW1CLENBQUMsQ0FBUztZQUNwQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFO2dCQUN6QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDOUQ7WUFDRCxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCxPQUFPLElBQUksb0JBQW9CLENBQUM7WUFDOUIsY0FBYyxFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsK0NBQXFCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUM3RywyQkFBMkIsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLCtDQUFxQixDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDbEksVUFBVSxFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsK0NBQXFCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztTQUMxRyxDQUFDLENBQUM7S0FDSjtJQWtCRDtJQUNFLG1EQUFtRDtJQUNuRCxLQUFxQjtRQUVyQixJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDLDJCQUEyQixDQUFDO1FBQ3JFLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7S0FDcEM7Ozs7QUE3RFUsb0RBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RyaW5nU3BlY2lhbGl6ZXIsIHRyYW5zbGF0ZUFzc2V0VG9rZW5Ub0NmblRva2VuLCB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgQXBwU3RhZ2luZ1N5bnRoZXNpemVyIH0gZnJvbSAnLi9hcHAtc3RhZ2luZy1zeW50aGVzaXplcic7XG5cbi8qKlxuICogQm9vdHN0cmFwcGVkIHJvbGUgc3BlY2lmaWVyLiBUaGVzZSByb2xlcyBtdXN0IGV4aXN0IGFscmVhZHkuXG4gKiBUaGlzIGNsYXNzIGRvZXMgbm90IGNyZWF0ZSBuZXcgSUFNIFJvbGVzLlxuICovXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwUm9sZSB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGN1cnJlbnRseSBhc3N1bWVkIHJvbGUvY3JlZGVudGlhbHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xpQ3JlZGVudGlhbHMoKSB7XG4gICAgcmV0dXJuIG5ldyBCb290c3RyYXBSb2xlKEJvb3RzdHJhcFJvbGUuQ0xJX0NSRURTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGFuIGV4aXN0aW5nIElBTSBSb2xlIHRvIGFzc3VtZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUm9sZUFybihhcm46IHN0cmluZykge1xuICAgIFN0cmluZ1NwZWNpYWxpemVyLnZhbGlkYXRlTm9Ub2tlbnMoYXJuLCAnQm9vdHN0cmFwUm9sZSBBUk4nKTtcbiAgICByZXR1cm4gbmV3IEJvb3RzdHJhcFJvbGUoYXJuKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIENMSV9DUkVEUyA9ICdjbGktY3JlZGVudGlhbHMnO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByb2xlQXJuOiBzdHJpbmcpIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgb2JqZWN0IHdhcyBjcmVhdGVkIHVzaW5nIEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKVxuICAgKi9cbiAgcHVibGljIGlzQ2xpQ3JlZGVudGlhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucm9sZUFybiA9PT0gQm9vdHN0cmFwUm9sZS5DTElfQ1JFRFM7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2FybkZvckNsb3VkRm9ybWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmlzQ2xpQ3JlZGVudGlhbHMoKSA/IHVuZGVmaW5lZCA6IHRyYW5zbGF0ZUFzc2V0VG9rZW5Ub0NmblRva2VuKHRoaXMucm9sZUFybik7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2FybkZvckNsb3VkQXNzZW1ibHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDbGlDcmVkZW50aWFscygpID8gdW5kZWZpbmVkIDogdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4odGhpcy5yb2xlQXJuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfc3BlY2lhbGl6ZShzcGVjOiBTdHJpbmdTcGVjaWFsaXplcikge1xuICAgIHJldHVybiBuZXcgQm9vdHN0cmFwUm9sZShzcGVjLnNwZWNpYWxpemUodGhpcy5yb2xlQXJuKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXBsb3ltZW50IGlkZW50aXRpZXMgYXJlIHRoZSBjbGFzcyBvZiByb2xlcyB0byBiZSBhc3N1bWVkIGJ5IHRoZSBDREtcbiAqIHdoZW4gZGVwbG95aW5nIHRoZSBBcHAuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3ltZW50SWRlbnRpdGllcyB7XG4gIC8qKlxuICAgKiBVc2UgQ0xJIGNyZWRlbnRpYWxzIGZvciBhbGwgZGVwbG95bWVudCBpZGVudGl0aWVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGlDcmVkZW50aWFscygpOiBEZXBsb3ltZW50SWRlbnRpdGllcyB7XG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50SWRlbnRpdGllcyh7XG4gICAgICBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU6IEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKSxcbiAgICAgIGRlcGxveW1lbnRSb2xlOiBCb290c3RyYXBSb2xlLmNsaUNyZWRlbnRpYWxzKCksXG4gICAgICBsb29rdXBSb2xlOiBCb290c3RyYXBSb2xlLmNsaUNyZWRlbnRpYWxzKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSB5b3VyIG93biByb2xlcyBmb3IgYWxsIGRlcGxveW1lbnQgaWRlbnRpdGllcy4gVGhlc2Ugcm9sZXNcbiAgICogbXVzdCBhbHJlYWR5IGV4aXN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGVjaWZ5Um9sZXMocm9sZXM6IEJvb3RzdHJhcFJvbGVzKTogRGVwbG95bWVudElkZW50aXRpZXMge1xuICAgIHJldHVybiBuZXcgRGVwbG95bWVudElkZW50aXRpZXMocm9sZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgUm9sZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUgZGVmYXVsdCBib290c3RyYXAgc3RhY2tcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdEJvb3RzdHJhcFJvbGVzKG9wdGlvbnM6IERlZmF1bHRCb290c3RyYXBSb2xlc09wdGlvbnMgPSB7fSk6IERlcGxveW1lbnRJZGVudGl0aWVzIHtcbiAgICBmdW5jdGlvbiByZXBsYWNlUGxhY2Vob2xkZXJzKHg6IHN0cmluZykge1xuICAgICAgaWYgKG9wdGlvbnMuYm9vdHN0cmFwUmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeCA9IHgucmVwbGFjZSgvXFwkXFx7QVdTOjpSZWdpb25cXH0vZywgb3B0aW9ucy5ib290c3RyYXBSZWdpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50SWRlbnRpdGllcyh7XG4gICAgICBkZXBsb3ltZW50Um9sZTogQm9vdHN0cmFwUm9sZS5mcm9tUm9sZUFybihyZXBsYWNlUGxhY2Vob2xkZXJzKEFwcFN0YWdpbmdTeW50aGVzaXplci5ERUZBVUxUX0RFUExPWV9ST0xFX0FSTikpLFxuICAgICAgY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlOiBCb290c3RyYXBSb2xlLmZyb21Sb2xlQXJuKHJlcGxhY2VQbGFjZWhvbGRlcnMoQXBwU3RhZ2luZ1N5bnRoZXNpemVyLkRFRkFVTFRfQ0xPVURGT1JNQVRJT05fUk9MRV9BUk4pKSxcbiAgICAgIGxvb2t1cFJvbGU6IEJvb3RzdHJhcFJvbGUuZnJvbVJvbGVBcm4ocmVwbGFjZVBsYWNlaG9sZGVycyhBcHBTdGFnaW5nU3ludGhlc2l6ZXIuREVGQVVMVF9MT09LVVBfUk9MRV9BUk4pKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG91ZEZvcm1hdGlvbiBFeGVjdXRpb24gUm9sZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIERlcGxveW1lbnQgQWN0aW9uIFJvbGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXBsb3ltZW50Um9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIExvb2t1cCBSb2xlXG4gICAgQGRlZmF1bHQgLSB1c2UgYm9vdHN0cmFwcGVkIHJvbGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb29rdXBSb2xlPzogQm9vdHN0cmFwUm9sZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIC8qKiByb2xlcyB0aGF0IGFyZSBib290c3RyYXBwZWQgdG8geW91ciBhY2NvdW50LiAqL1xuICAgIHJvbGVzOiBCb290c3RyYXBSb2xlcyxcbiAgKSB7XG4gICAgdGhpcy5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGUgPSByb2xlcy5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU7XG4gICAgdGhpcy5kZXBsb3ltZW50Um9sZSA9IHJvbGVzLmRlcGxveW1lbnRSb2xlO1xuICAgIHRoaXMubG9va3VwUm9sZSA9IHJvbGVzLmxvb2t1cFJvbGU7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgRGVwbG95bWVudElkZW50aXRpZXMuZGVmYXVsdEJvb3RzdHJhcHBlZFJvbGVzYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRCb290c3RyYXBSb2xlc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHJlZ2lvbiB3aGVyZSB0aGUgZGVmYXVsdCBib290c3RyYXAgcm9sZXMgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhlIHJlZ2lvbiBpbiB3aGljaCB0aGUgc3RhY2sgaXMgZGVwbG95ZWQgaXMgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgc3RhY2sncyBjdXJyZW50IHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgYm9vdHN0cmFwUmVnaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJvbGVzIHRoYXQgYXJlIGJvb3RzdHJhcHBlZCB0byB5b3VyIGFjY291bnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwUm9sZXMge1xuICAvKipcbiAgICogQ2xvdWRGb3JtYXRpb24gRXhlY3V0aW9uIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgYm9vdHN0cmFwcGVkIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIERlcGxveW1lbnQgQWN0aW9uIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgYm9vc3RyYXBwZWQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFJvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBMb29rdXAgUm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVzZSBib290c3RyYXBwZWQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZT86IEJvb3RzdHJhcFJvbGU7XG59XG5cbi8qKlxuICogUm9sZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIFN0YWdpbmcgU3RhY2tcbiAqIChmb3IgYWNjZXNzIHRvIFN0YWdpbmcgUmVzb3VyY2VzKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdpbmdSb2xlcyB7XG4gIC8qKlxuICAgKiBGaWxlIEFzc2V0IFB1Ymxpc2hpbmcgUm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN0YWdpbmcgc3RhY2sgY3JlYXRlcyBhIGZpbGUgYXNzZXQgcHVibGlzaGluZyByb2xlXG4gICAqL1xuICByZWFkb25seSBmaWxlQXNzZXRQdWJsaXNoaW5nUm9sZT86IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIERvY2tlciBBc3NldCBQdWJsaXNoaW5nIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdGFnaW5nIHN0YWNrIGNyZWF0ZXMgYSBkb2NrZXIgYXNzZXQgcHVibGlzaGluZyByb2xlXG4gICAqL1xuICByZWFkb25seSBkb2NrZXJBc3NldFB1Ymxpc2hpbmdSb2xlPzogQm9vdHN0cmFwUm9sZTtcbn1cbiJdfQ==
@@ -29,7 +29,7 @@ class UsingAppStagingSynthesizer extends constructs_1.Construct {
29
29
  }
30
30
  }
31
31
  _a = JSII_RTTI_SYMBOL_1;
32
- UsingAppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.UsingAppStagingSynthesizer", version: "2.85.0-alpha.0" };
32
+ UsingAppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.UsingAppStagingSynthesizer", version: "2.87.0-alpha.0" };
33
33
  exports.UsingAppStagingSynthesizer = UsingAppStagingSynthesizer;
34
34
  /**
35
35
  * A default Staging Stack that implements IStagingResources.
@@ -262,7 +262,7 @@ class DefaultStagingStack extends core_1.Stack {
262
262
  this.stagingRepos[asset.assetName] = new ecr.Repository(this, repoName, {
263
263
  repositoryName: repoName,
264
264
  lifecycleRules: [{
265
- description: 'Garbage collect old image versions and keep the specified number of latest versions',
265
+ description: 'Garbage collect old image versions',
266
266
  maxImageCount: this.props.imageAssetVersionCount ?? 3,
267
267
  }],
268
268
  ...(this.autoDeleteStagingAssets ? {
@@ -316,6 +316,6 @@ class DefaultStagingStack extends core_1.Stack {
316
316
  }
317
317
  }
318
318
  _b = JSII_RTTI_SYMBOL_1;
319
- DefaultStagingStack[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DefaultStagingStack", version: "2.85.0-alpha.0" };
319
+ DefaultStagingStack[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DefaultStagingStack", version: "2.87.0-alpha.0" };
320
320
  exports.DefaultStagingStack = DefaultStagingStack;
321
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MseUNBQXlDO0FBQ3pDLDJDQVkwQjtBQUMxQiw0RUFBMEU7QUFDMUUsNENBQTRDO0FBQzVDLDJDQUF1QztBQUkxQixRQUFBLGtCQUFrQixHQUFHLGNBQWMsQ0FBQztBQUVqRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSwwQkFBMkIsU0FBUSxzQkFBUztJQUN2RCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2xCOzs7O0FBSFUsZ0VBQTBCO0FBcUd2Qzs7Ozs7R0FLRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsWUFBSztJQUM1Qzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBbUM7Ozs7Ozs7Ozs7UUFDdkQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6RixPQUFPO1lBQ0wsc0JBQXNCLENBQUMsS0FBSyxFQUFFLE9BQU87Z0JBQ25DLE1BQU0sR0FBRyxHQUFHLFVBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxVQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxDQUFDLFNBQVMseUJBQXlCLENBQUMsQ0FBQztpQkFDcEU7Z0JBRUQsNEVBQTRFO2dCQUM1RSwwRUFBMEU7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LENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2QyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5RUFBeUUsSUFBSSxRQUFRLENBQUMsQ0FBQztTQUN4RztLQUNGOzs7O0FBM1VVLGtEQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBlY3IgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHtcbiAgQXBwLFxuICBBcm5Gb3JtYXQsXG4gIEJvb3RzdHJhcGxlc3NTeW50aGVzaXplcixcbiAgRG9ja2VySW1hZ2VBc3NldFNvdXJjZSxcbiAgRHVyYXRpb24sXG4gIEZpbGVBc3NldFNvdXJjZSxcbiAgSVN5bnRoZXNpc1Nlc3Npb24sXG4gIFJlbW92YWxQb2xpY3ksXG4gIFN0YWNrLFxuICBTdGFja1Byb3BzLFxuICBJTkxJTkVfQ1VTVE9NX1JFU09VUkNFX0NPTlRFWFQsXG59IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgU3RyaW5nU3BlY2lhbGl6ZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ2F3cy1jZGstbGliL2N4LWFwaSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEJvb3RzdHJhcFJvbGUgfSBmcm9tICcuL2Jvb3RzdHJhcC1yb2xlcyc7XG5pbXBvcnQgeyBGaWxlU3RhZ2luZ0xvY2F0aW9uLCBJU3RhZ2luZ1Jlc291cmNlcywgSVN0YWdpbmdSZXNvdXJjZXNGYWN0b3J5LCBJbWFnZVN0YWdpbmdMb2NhdGlvbiB9IGZyb20gJy4vc3RhZ2luZy1zdGFjayc7XG5cbmV4cG9ydCBjb25zdCBERVBMT1lfVElNRV9QUkVGSVggPSAnZGVwbG95LXRpbWUvJztcblxuLyoqXG4gKiBUaGlzIGlzIGEgZHVtbXkgY29uc3RydWN0IG1lYW50IHRvIHNpZ25pZnkgdGhhdCBhIHN0YWNrIGlzIHV0aWxpemluZ1xuICogdGhlIEFwcFN0YWdpbmdTeW50aGVzaXplci4gSXQgZG9lcyBub3QgZG8gYW55dGhpbmcsIGFuZCBpcyBub3QgbWVhbnRcbiAqIHRvIGJlIGNyZWF0ZWQgb24gaXRzIG93bi4gVGhpcyBjb25zdHJ1Y3Qgd2lsbCBiZSBhIHBhcnQgb2YgdGhlXG4gKiBjb25zdHJ1Y3QgdHJlZSBvbmx5IGFuZCBub3QgdGhlIENmbiB0ZW1wbGF0ZS4gVGhlIGNvbnN0cnVjdCB0cmVlIGlzXG4gKiB0aGVuIGVuY29kZWQgaW4gdGhlIEFXUzo6Q0RLOjpNZXRhZGF0YSByZXNvdXJjZSBvZiB0aGUgc3RhY2sgYW5kXG4gKiBpbmplc3RlZCBpbiBvdXIgbWV0cmljcyBsaWtlIGV2ZXJ5IG90aGVyIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFVzaW5nQXBwU3RhZ2luZ1N5bnRoZXNpemVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBVc2VyIGNvbmZpZ3VyYWJsZSBvcHRpb25zIHRvIHRoZSBEZWZhdWx0U3RhZ2luZ1N0YWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHRoZSBzdGFnaW5nIHN0YWNrIGJlbG9uZ3MgdG8uXG4gICAqXG4gICAqIFRoaXMgaWRlbnRpZmllciB3aWxsIGJlIHVzZWQgaW4gdGhlIG5hbWUgb2Ygc3RhZ2luZyByZXNvdXJjZXNcbiAgICogY3JlYXRlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIENESyBhcHBzLlxuICAgKlxuICAgKiBUaGUgaWRlbnRpZmllciBzaG91bGQgaW5jbHVkZSBsb3dlcmNhc2UgY2hhcmFjdGVycyBhbmQgZGFzaGVzICgnLScpIG9ubHlcbiAgICogYW5kIGhhdmUgYSBtYXhpbXVtIG9mIDIwIGNoYXJhY3RlcnMuXG4gICAqL1xuICByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFeHBsaWNpdCBuYW1lIGZvciB0aGUgc3RhZ2luZyBidWNrZXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHdlbGwta25vd24gbmFtZSB1bmlxdWUgdG8gdGhpcyBhcHAvZW52LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2luZ0J1Y2tldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhc3MgaW4gYW4gZXhpc3Rpbmcgcm9sZSB0byBiZSB1c2VkIGFzIHRoZSBmaWxlIHB1Ymxpc2hpbmcgcm9sZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5ldyByb2xlIHdpbGwgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBQYXNzIGluIGFuIGV4aXN0aW5nIHJvbGUgdG8gYmUgdXNlZCBhcyB0aGUgaW1hZ2UgcHVibGlzaGluZyByb2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlmZXRpbWUgZm9yIGRlcGxveSB0aW1lIGZpbGUgYXNzZXRzLlxuICAgKlxuICAgKiBBc3NldHMgdGhhdCBhcmUgb25seSBuZWNlc3NhcnkgYXQgZGVwbG95bWVudCB0aW1lIChmb3IgaW5zdGFuY2UsXG4gICAqIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcyBhbmQgTGFtYmRhIHNvdXJjZSBjb2RlIGJ1bmRsZXMpIHdpbGwgYmVcbiAgICogYXV0b21hdGljYWxseSBkZWxldGVkIGFmdGVyIHRoaXMgbWFueSBkYXlzLiBBc3NldHMgdGhhdCBtYXkgYmVcbiAgICogcmVhZCBmcm9tIHRoZSBzdGFnaW5nIGJ1Y2tldCBkdXJpbmcgeW91ciBhcHBsaWNhdGlvbidzIHJ1biB0aW1lXG4gICAqIHdpbGwgbm90IGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIFNldCB0aGlzIHRvIHRoZSBsZW5ndGggb2YgdGltZSB5b3Ugd2lzaCB0byBiZSBhYmxlIHRvIHJvbGwgYmFjayB0b1xuICAgKiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB5b3VyIGFwcGxpY2F0aW9uIHdpdGhvdXQgaGF2aW5nIHRvIGRvIGEgbmV3XG4gICAqIGBjZGsgc3ludGhgIGFuZCByZS11cGxvYWQgb2YgYXNzZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIER1cmF0aW9uLmRheXMoMzApXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lUaW1lRmlsZUFzc2V0TGlmZXRpbWU/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIHZlcnNpb25zIHRvIHN0b3JlIGluIGEgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogUHJldmlvdXMgdmVyc2lvbnMgb2YgYW4gaW1hZ2UgY2FuIGJlIHN0b3JlZCBmb3Igcm9sbGJhY2sgcHVycG9zZXMuXG4gICAqIE9uY2UgYSByZXBvc2l0b3J5IGhhcyBtb3JlIHRoYW4gMyBpbWFnZSB2ZXJzaW9ucyBzdG9yZWQsIHRoZSBvbGRlc3RcbiAgICogdmVyc2lvbiB3aWxsIGJlIGRpc2NhcmRlZC4gVGhpcyBhbGxvd3MgZm9yIHNlbnNpYmxlIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgKiB3aGlsZSBtYWludGFpbmluZyBhIGZldyBwcmV2aW91cyB2ZXJzaW9ucyBmb3Igcm9sbGJhY2sgc2NlbmFyaW9zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVwIHRvIDMgdmVyc2lvbnMgc3RvcmVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0VmVyc2lvbkNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdXRvIGRlbGV0ZXMgb2JqZWN0cyBpbiB0aGUgc3RhZ2luZyBTMyBidWNrZXQgYW5kIGltYWdlcyBpbiB0aGVcbiAgICogc3RhZ2luZyBFQ1IgcmVwb3NpdG9yaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhdXRvRGVsZXRlU3RhZ2luZ0Fzc2V0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVmYXVsdCBTdGFnaW5nIFN0YWNrIFByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0U3RhZ2luZ1N0YWNrUHJvcHMgZXh0ZW5kcyBEZWZhdWx0U3RhZ2luZ1N0YWNrT3B0aW9ucywgU3RhY2tQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBkZXBsb3kgYWN0aW9uIHJvbGUsIGlmIGdpdmVuXG4gICAqXG4gICAqIFRoaXMgcm9sZSB3aWxsIG5lZWQgcGVybWlzc2lvbnMgdG8gcmVhZCBmcm9tIHRvIHRoZSBzdGFnaW5nIHJlc291cmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgQ0xJIGNyZWRlbnRpYWxzIGFyZSBhc3N1bWVkLCBubyBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZSBncmFudGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95Um9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHF1YWxpZmllciB1c2VkIHRvIHNwZWNpYWxpemUgc3RyaW5nc1xuICAgKlxuICAgKiBTaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IGJ1dCB3aG8ga25vd3Mgd2hhdCBwZW9wbGUgbWlnaHQgZG8uXG4gICAqL1xuICByZWFkb25seSBxdWFsaWZpZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGRlZmF1bHQgU3RhZ2luZyBTdGFjayB0aGF0IGltcGxlbWVudHMgSVN0YWdpbmdSZXNvdXJjZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRlZmF1bHRTdGFnaW5nU3RhY2sgPSBEZWZhdWx0U3RhZ2luZ1N0YWNrLmZhY3RvcnkoeyBhcHBJZDogJ215LWFwcC1pZCcgfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZhdWx0U3RhZ2luZ1N0YWNrIGV4dGVuZHMgU3RhY2sgaW1wbGVtZW50cyBJU3RhZ2luZ1Jlc291cmNlcyB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBmYWN0b3J5IHRoYXQgd2lsbCBjcmVhdGUgRGVmYXVsdFN0YWdpbmdTdGFja3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZmFjdG9yeShvcHRpb25zOiBEZWZhdWx0U3RhZ2luZ1N0YWNrT3B0aW9ucyk6IElTdGFnaW5nUmVzb3VyY2VzRmFjdG9yeSB7XG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpLnNsaWNlKDAsIDIwKTtcbiAgICByZXR1cm4ge1xuICAgICAgb2J0YWluU3RhZ2luZ1Jlc291cmNlcyhzdGFjaywgY29udGV4dCkge1xuICAgICAgICBjb25zdCBhcHAgPSBBcHAub2Yoc3RhY2spO1xuICAgICAgICBpZiAoIUFwcC5pc0FwcChhcHApKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFjayAke3N0YWNrLnN0YWNrTmFtZX0gbXVzdCBiZSBwYXJ0IG9mIGFuIEFwcGApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmVjYXVzZSB3ZSBkbyBub3Qga2VlcCBtZXRyaWNzIGluIHRoZSBEZWZhdWx0U3RhZ2luZ1N0YWNrLCB3ZSB3aWxsIGluamVjdFxuICAgICAgICAvLyBhIGR1bW15IGNvbnN0cnVjdCBpbnRvIHRoZSBzdGFjayB1c2luZyB0aGUgRGVmYXVsdFN0YWdpbmdTdGFjayBpbnN0ZWFkLlxuICAgICAgICBpZiAoY3hhcGkuQU5BTFlUSUNTX1JFUE9SVElOR19FTkFCTEVEX0NPTlRFWFQpIHtcbiAgICAgICAgICBuZXcgVXNpbmdBcHBTdGFnaW5nU3ludGhlc2l6ZXIoc3RhY2ssIGBVc2luZ0FwcFN0YWdpbmdTeW50aGVzaXplci8ke3N0YWNrLnN0YWNrTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YWNrSWQgPSBgU3RhZ2luZ1N0YWNrLSR7YXBwSWR9LSR7Y29udGV4dC5lbnZpcm9ubWVudFN0cmluZ31gO1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRTdGFnaW5nU3RhY2soYXBwLCBzdGFja0lkLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcblxuICAgICAgICAgIC8vIERvZXMgbm90IG5lZWQgdG8gY29udGFpbiBlbnZpcm9ubWVudCBiZWNhdXNlIHN0YWNrIG5hbWVzIGFyZSB1bmlxdWUgaW5zaWRlIGFuIGVudiBhbnl3YXlcbiAgICAgICAgICBzdGFja05hbWU6IGBTdGFnaW5nU3RhY2stJHthcHBJZH1gLFxuICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgYWNjb3VudDogc3RhY2suYWNjb3VudCxcbiAgICAgICAgICAgIHJlZ2lvbjogc3RhY2sucmVnaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBwSWQsXG4gICAgICAgICAgcXVhbGlmaWVyOiBjb250ZXh0LnF1YWxpZmllcixcbiAgICAgICAgICBkZXBsb3lSb2xlQXJuOiBjb250ZXh0LmRlcGxveVJvbGVBcm4sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYXNzZXQgcHVibGlzaGluZyByb2xlIG5hbWUgZm9yIGZpbGUgKFMzKSBhc3NldHMuXG4gICAqL1xuICBwcml2YXRlIGdldCBmaWxlUm9sZU5hbWUoKSB7XG4gICAgcmV0dXJuIGBjZGstJHt0aGlzLmFwcElkfS1maWxlLXJvbGUtJHt0aGlzLnJlZ2lvbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYXNzZXQgcHVibGlzaGluZyByb2xlIG5hbWUgZm9yIGRvY2tlciAoRUNSKSBhc3NldHMuXG4gICAqL1xuICBwcml2YXRlIGdldCBpbWFnZVJvbGVOYW1lKCkge1xuICAgIHJldHVybiBgY2RrLSR7dGhpcy5hcHBJZH0taW1hZ2Utcm9sZS0ke3RoaXMucmVnaW9ufWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFwcC1zY29wZWQsIGV2aXJvbm1lbnQta2V5ZWQgc3RhZ2luZyBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhZ2luZ0J1Y2tldD86IHMzLkJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIGFwcC1zY29wZWQsIGVudmlyb25tZW50LWtleWVkIGVjciByZXBvc2l0b3JpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXBwLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YWdpbmdSZXBvczogUmVjb3JkPHN0cmluZywgZWNyLlJlcG9zaXRvcnk+O1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdG8gYWRkIGRlcGVuZGVuY2llcyB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXBlbmRlbmN5U3RhY2s6IFN0YWNrO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnaW5nQnVja2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBwdWJsaXNoIHJvbGUgQVJOIGluIGFzc2V0IG1hbmlmZXN0IGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlZEZpbGVSb2xlPzogQm9vdHN0cmFwUm9sZTtcbiAgcHJpdmF0ZSBmaWxlUm9sZT86IGlhbS5JUm9sZTtcbiAgcHJpdmF0ZSBmaWxlUm9sZU1hbmlmZXN0QXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbWFnZSBwdWJsaXNoaW5nIHJvbGUgQVJOIGluIGFzc2V0IG1hbmlmZXN0IGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlZEltYWdlUm9sZT86IEJvb3RzdHJhcFJvbGU7XG4gIHByaXZhdGUgaW1hZ2VSb2xlPzogaWFtLklSb2xlO1xuICBwcml2YXRlIGRpZEltYWdlUm9sZSA9IGZhbHNlO1xuICBwcml2YXRlIGltYWdlUm9sZU1hbmlmZXN0QXJuPzogc3RyaW5nO1xuICBwcml2YXRlIGF1dG9EZWxldGVTdGFnaW5nQXNzZXRzOiBib29sZWFuO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95Um9sZUFybj86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQXBwLCBpZDogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBEZWZhdWx0U3RhZ2luZ1N0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc3ludGhlc2l6ZXI6IG5ldyBCb290c3RyYXBsZXNzU3ludGhlc2l6ZXIoKSxcbiAgICAgIGFuYWx5dGljc1JlcG9ydGluZzogZmFsc2UsIC8vIHJlbW92aW5nIEFXUzo6Q0RLOjpNZXRhZGF0YSBjb25zdHJ1Y3Qgc2F2ZXMgfjNLQlxuICAgIH0pO1xuICAgIC8vIHJlbW92aW5nIHBhdGggbWV0YWRhdGEgc2F2ZXMgfjJLQlxuICAgIHRoaXMubm9kZS5zZXRDb250ZXh0KGN4YXBpLlBBVEhfTUVUQURBVEFfRU5BQkxFX0NPTlRFWFQsIGZhbHNlKTtcblxuICAgIC8vIEZvciBhbGwgcmVzb3VyY2VzIHVuZGVyIHRoZSBkZWZhdWx0IHN0YWdpbmcgc3RhY2ssIHdlIHdhbnQgdG8gaW5saW5lIGN1c3RvbVxuICAgIC8vIHJlc291cmNlcyBiZWNhdXNlIHRoZSBzdGFnaW5nIGJ1Y2tldCBuZWNlc3NhcnkgZm9yIGN1c3RvbSByZXNvdXJjZSBhc3NldHNcbiAgICAvLyBkb2VzIG5vdCBleGlzdCB5ZXQuXG4gICAgdGhpcy5ub2RlLnNldENvbnRleHQoSU5MSU5FX0NVU1RPTV9SRVNPVVJDRV9DT05URVhULCB0cnVlKTtcbiAgICB0aGlzLmF1dG9EZWxldGVTdGFnaW5nQXNzZXRzID0gcHJvcHMuYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHMgPz8gdHJ1ZTtcblxuICAgIHRoaXMuYXBwSWQgPSB0aGlzLnZhbGlkYXRlQXBwSWQocHJvcHMuYXBwSWQpO1xuICAgIHRoaXMuZGVwZW5kZW5jeVN0YWNrID0gdGhpcztcblxuICAgIHRoaXMuZGVwbG95Um9sZUFybiA9IHByb3BzLmRlcGxveVJvbGVBcm47XG4gICAgdGhpcy5zdGFnaW5nQnVja2V0TmFtZSA9IHByb3BzLnN0YWdpbmdCdWNrZXROYW1lO1xuICAgIGNvbnN0IHNwZWNpYWxpemVyID0gbmV3IFN0cmluZ1NwZWNpYWxpemVyKHRoaXMsIHByb3BzLnF1YWxpZmllcik7XG5cbiAgICB0aGlzLnByb3ZpZGVkRmlsZVJvbGUgPSBwcm9wcy5maWxlQXNzZXRQdWJsaXNoaW5nUm9sZT8uX3NwZWNpYWxpemUoc3BlY2lhbGl6ZXIpO1xuICAgIHRoaXMucHJvdmlkZWRJbWFnZVJvbGUgPSBwcm9wcy5pbWFnZUFzc2V0UHVibGlzaGluZ1JvbGU/Ll9zcGVjaWFsaXplKHNwZWNpYWxpemVyKTtcbiAgICB0aGlzLnN0YWdpbmdSZXBvcyA9IHt9O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFwcElkKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBpZiAoaWQubGVuZ3RoID4gMjApIHtcbiAgICAgIGVycm9ycy5wdXNoKGBhcHBJZCBleHBlY3RlZCBubyBtb3JlIHRoYW4gMjAgY2hhcmFjdGVycyBidXQgZ290ICR7aWQubGVuZ3RofSBjaGFyYWN0ZXJzLmApO1xuICAgIH1cbiAgICBpZiAoaWQgIT09IGlkLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdhcHBJZCBvbmx5IGFjY2VwdHMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuJyk7XG4gICAgfVxuICAgIGlmICghL15bYS16MC05LV0qJC8udGVzdChpZCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdhcHBJZCBleHBlY3RzIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIGRhc2hlcyAoXFwnLVxcJyknKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgIGBhcHBJZCAke2lkfSBoYXMgZXJyb3JzOmAsXG4gICAgICAgIC4uLmVycm9ycyxcbiAgICAgIF0uam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUZpbGVSb2xlKCkge1xuICAgIGlmICh0aGlzLnByb3ZpZGVkRmlsZVJvbGUpIHtcbiAgICAgIC8vIE92ZXJyaWRlXG4gICAgICB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4gPSB0aGlzLnByb3ZpZGVkRmlsZVJvbGUuX2FybkZvckNsb3VkQXNzZW1ibHkoKTtcbiAgICAgIGNvbnN0IGNmbkFybiA9IHRoaXMucHJvdmlkZWRGaWxlUm9sZS5fYXJuRm9yQ2xvdWRGb3JtYXRpb24oKTtcbiAgICAgIHRoaXMuZmlsZVJvbGUgPSBjZm5Bcm4gPyBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnQ2RrRmlsZVJvbGUnLCBjZm5Bcm4pIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJvbGVOYW1lID0gdGhpcy5maWxlUm9sZU5hbWU7XG4gICAgdGhpcy5maWxlUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnQ2RrRmlsZVJvbGUnLCB7XG4gICAgICByb2xlTmFtZSxcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKHRoaXMuYWNjb3VudCksXG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4gPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgcGFydGl0aW9uOiAnJHtBV1M6OlBhcnRpdGlvbn0nLFxuICAgICAgcmVnaW9uOiAnJywgLy8gaWFtIGlzIGdsb2JhbFxuICAgICAgc2VydmljZTogJ2lhbScsXG4gICAgICByZXNvdXJjZTogJ3JvbGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiByb2xlTmFtZSxcbiAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUltYWdlUm9sZSgpIHtcbiAgICAvLyBJdCBtYXkgZW5kIHVwIHNldHRpbmcgaW1hZ2VSb2xlIHRvIHVuZGVmaW5lZCwgYnV0IGF0IGxlYXN0IHdlIHRyaWVkXG4gICAgaWYgKHRoaXMuZGlkSW1hZ2VSb2xlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlkSW1hZ2VSb2xlID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnByb3ZpZGVkSW1hZ2VSb2xlKSB7XG4gICAgICAvLyBPdmVycmlkZVxuICAgICAgdGhpcy5pbWFnZVJvbGVNYW5pZmVzdEFybiA9IHRoaXMucHJvdmlkZWRJbWFnZVJvbGUuX2FybkZvckNsb3VkQXNzZW1ibHkoKTtcbiAgICAgIGNvbnN0IGNmbkFybiA9IHRoaXMucHJvdmlkZWRJbWFnZVJvbGUuX2FybkZvckNsb3VkRm9ybWF0aW9uKCk7XG4gICAgICB0aGlzLmltYWdlUm9sZSA9IGNmbkFybiA/IGlhbS5Sb2xlLmZyb21Sb2xlQXJuKHRoaXMsICdDZGtJbWFnZVJvbGUnLCBjZm5Bcm4pIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJvbGVOYW1lID0gdGhpcy5pbWFnZVJvbGVOYW1lO1xuICAgIHRoaXMuaW1hZ2VSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdDZGtJbWFnZVJvbGUnLCB7XG4gICAgICByb2xlTmFtZSxcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKHRoaXMuYWNjb3VudCksXG4gICAgfSk7XG4gICAgdGhpcy5pbWFnZVJvbGVNYW5pZmVzdEFybiA9IFN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICBwYXJ0aXRpb246ICcke0FXUzo6UGFydGl0aW9ufScsXG4gICAgICByZWdpb246ICcnLCAvLyBpYW0gaXMgZ2xvYmFsXG4gICAgICBzZXJ2aWNlOiAnaWFtJyxcbiAgICAgIHJlc291cmNlOiAncm9sZScsXG4gICAgICByZXNvdXJjZU5hbWU6IHJvbGVOYW1lLFxuICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnVja2V0S2V5KCk6IGttcy5JS2V5IHtcbiAgICByZXR1cm4gbmV3IGttcy5LZXkodGhpcywgJ0J1Y2tldEtleScsIHtcbiAgICAgIGFsaWFzOiBgYWxpYXMvY2RrLSR7dGhpcy5hcHBJZH0tc3RhZ2luZ2AsXG4gICAgICBhZG1pbnM6IFtuZXcgaWFtLkFjY291bnRQcmluY2lwYWwodGhpcy5hY2NvdW50KV0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENyZWF0ZUJ1Y2tldCgpIHtcbiAgICBjb25zdCBzdGFnaW5nQnVja2V0TmFtZSA9IHRoaXMuc3RhZ2luZ0J1Y2tldE5hbWUgPz8gYGNkay0ke3RoaXMuYXBwSWR9LXN0YWdpbmctJHt0aGlzLmFjY291bnR9LSR7dGhpcy5yZWdpb259YDtcbiAgICBjb25zdCBidWNrZXRJZCA9ICdDZGtTdGFnaW5nQnVja2V0JztcbiAgICBjb25zdCBjcmVhdGVkQnVja2V0ID0gdGhpcy5ub2RlLnRyeUZpbmRDaGlsZChidWNrZXRJZCkgYXMgczMuQnVja2V0O1xuICAgIGlmIChjcmVhdGVkQnVja2V0KSB7XG4gICAgICByZXR1cm4gc3RhZ2luZ0J1Y2tldE5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5lbnN1cmVGaWxlUm9sZSgpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY3JlYXRlQnVja2V0S2V5KCk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGJ1Y2tldCBvbmNlIHRoZSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICBjb25zdCBidWNrZXQgPSBuZXcgczMuQnVja2V0KHRoaXMsIGJ1Y2tldElkLCB7XG4gICAgICBidWNrZXROYW1lOiBzdGFnaW5nQnVja2V0TmFtZSxcbiAgICAgIC4uLih0aGlzLmF1dG9EZWxldGVTdGFnaW5nQXNzZXRzID8ge1xuICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgfSA6IHtcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICB9KSxcbiAgICAgIGVuY3J5cHRpb246IHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TLFxuICAgICAgZW5jcnlwdGlvbktleToga2V5LFxuXG4gICAgICAvLyBNYW55IEFXUyBhY2NvdW50IHNhZmV0eSBjaGVja2VycyB3aWxsIGNvbXBsYWluIHdoZW4gYnVja2V0cyBhcmVuJ3QgdmVyc2lvbmVkXG4gICAgICB2ZXJzaW9uZWQ6IHRydWUsXG4gICAgICAvLyBNYW55IEFXUyBhY2NvdW50IHNhZmV0eSBjaGVja2VycyB3aWxsIGNvbXBsYWluIHdoZW4gU1NMIGlzbid0IGVuZm9yY2VkXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZmlsZVJvbGUpIHtcbiAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmZpbGVSb2xlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXBsb3lSb2xlQXJuKSB7XG4gICAgICBidWNrZXQuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnczM6R2V0T2JqZWN0KicsXG4gICAgICAgICAgJ3MzOkdldEJ1Y2tldConLFxuICAgICAgICAgICdzMzpMaXN0KicsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW2J1Y2tldC5idWNrZXRBcm4sIGJ1Y2tldC5hcm5Gb3JPYmplY3RzKCcqJyldLFxuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5Bcm5QcmluY2lwYWwodGhpcy5kZXBsb3lSb2xlQXJuKV0sXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gT2JqZWN0cyBzaG91bGQgbmV2ZXIgYmUgb3ZlcndyaXR0ZW4sIGJ1dCBsZXQncyBtYWtlIHN1cmUgd2UgaGF2ZSBhIGxpZmVjeWNsZSBwb2xpY3lcbiAgICAvLyBmb3IgaXQgYW55d2F5LlxuICAgIGJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgIG5vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvbjogRHVyYXRpb24uZGF5cygzNjUpLFxuICAgIH0pO1xuXG4gICAgYnVja2V0LmFkZExpZmVjeWNsZVJ1bGUoe1xuICAgICAgcHJlZml4OiBERVBMT1lfVElNRV9QUkVGSVgsXG4gICAgICBleHBpcmF0aW9uOiB0aGlzLnByb3BzLmRlcGxveVRpbWVGaWxlQXNzZXRMaWZldGltZSA/PyBEdXJhdGlvbi5kYXlzKDMwKSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdGFnaW5nQnVja2V0TmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3ZWxsLWtub3duIG5hbWUgb2YgdGhlIHJlcG9cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3JlYXRlUmVwbyhhc3NldDogRG9ja2VySW1hZ2VBc3NldFNvdXJjZSk6IHN0cmluZyB7XG4gICAgaWYgKCFhc3NldC5hc3NldE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXNzZXRzIHN5bnRoZXNpemVkIHdpdGggQXBwU2NvcGVkU3RhZ2luZ1N5bnRoZXNpemVyIG11c3QgaW5jbHVkZSBhbiBcXCdhc3NldE5hbWVcXCcgaW4gdGhlIGFzc2V0IHNvdXJjZSBkZWZpbml0aW9uLicpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBpbWFnZSBwdWJsaXNoaW5nIHJvbGUgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIHRoaXMuZW5zdXJlSW1hZ2VSb2xlKCk7XG5cbiAgICBjb25zdCByZXBvTmFtZSA9IGdlbmVyYXRlUmVwb05hbWUoYCR7dGhpcy5hcHBJZH0vJHthc3NldC5hc3NldE5hbWV9YCk7XG4gICAgaWYgKHRoaXMuc3RhZ2luZ1JlcG9zW2Fzc2V0LmFzc2V0TmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFnaW5nUmVwb3NbYXNzZXQuYXNzZXROYW1lXSA9IG5ldyBlY3IuUmVwb3NpdG9yeSh0aGlzLCByZXBvTmFtZSwge1xuICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwb05hbWUsXG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnR2FyYmFnZSBjb2xsZWN0IG9sZCBpbWFnZSB2ZXJzaW9ucyBhbmQga2VlcCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBsYXRlc3QgdmVyc2lvbnMnLFxuICAgICAgICAgIG1heEltYWdlQ291bnQ6IHRoaXMucHJvcHMuaW1hZ2VBc3NldFZlcnNpb25Db3VudCA/PyAzLFxuICAgICAgICB9XSxcbiAgICAgICAgLi4uKHRoaXMuYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHMgPyB7XG4gICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgIGF1dG9EZWxldGVJbWFnZXM6IHRydWUsXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLmltYWdlUm9sZSkge1xuICAgICAgICB0aGlzLnN0YWdpbmdSZXBvc1thc3NldC5hc3NldE5hbWVdLmdyYW50UHVsbFB1c2godGhpcy5pbWFnZVJvbGUpO1xuICAgICAgICB0aGlzLnN0YWdpbmdSZXBvc1thc3NldC5hc3NldE5hbWVdLmdyYW50UmVhZCh0aGlzLmltYWdlUm9sZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXBvTmFtZTtcblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlUmVwb05hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgnLicsICctJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZEZpbGUoYXNzZXQ6IEZpbGVBc3NldFNvdXJjZSk6IEZpbGVTdGFnaW5nTG9jYXRpb24ge1xuICAgIC8vIEhhcyBzaWRlIGVmZmVjdHMgc28gbXVzdCBnbyBmaXJzdFxuICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSB0aGlzLmdldENyZWF0ZUJ1Y2tldCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICBhc3N1bWVSb2xlQXJuOiB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4sXG4gICAgICBwcmVmaXg6IGFzc2V0LmRlcGxveVRpbWUgPyBERVBMT1lfVElNRV9QUkVGSVggOiB1bmRlZmluZWQsXG4gICAgICBkZXBlbmRlbmN5U3RhY2s6IHRoaXMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhZGREb2NrZXJJbWFnZShhc3NldDogRG9ja2VySW1hZ2VBc3NldFNvdXJjZSk6IEltYWdlU3RhZ2luZ0xvY2F0aW9uIHtcbiAgICAvLyBIYXMgc2lkZSBlZmZlY3RzIHNvIG11c3QgZ28gZmlyc3RcbiAgICBjb25zdCByZXBvTmFtZSA9IHRoaXMuZ2V0Q3JlYXRlUmVwbyhhc3NldCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVwb05hbWUsXG4gICAgICBhc3N1bWVSb2xlQXJuOiB0aGlzLmltYWdlUm9sZU1hbmlmZXN0QXJuLFxuICAgICAgZGVwZW5kZW5jeVN0YWNrOiB0aGlzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3ludGhlc2l6ZXMgdGhlIGNsb3VkZm9ybWF0aW9uIHRlbXBsYXRlIGludG8gYSBjbG91ZCBhc3NlbWJseS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3N5bnRoZXNpemVUZW1wbGF0ZShzZXNzaW9uOiBJU3ludGhlc2lzU2Vzc2lvbiwgbG9va3VwUm9sZUFybj86IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHN1cGVyLl9zeW50aGVzaXplVGVtcGxhdGUoc2Vzc2lvbiwgbG9va3VwUm9sZUFybik7XG5cbiAgICBjb25zdCBidWlsZGVyID0gc2Vzc2lvbi5hc3NlbWJseTtcbiAgICBjb25zdCBvdXRQYXRoID0gcGF0aC5qb2luKGJ1aWxkZXIub3V0ZGlyLCB0aGlzLnRlbXBsYXRlRmlsZSk7XG4gICAgY29uc3Qgc2l6ZSA9IGZzLnN0YXRTeW5jKG91dFBhdGgpLnNpemU7XG4gICAgaWYgKHNpemUgPiA1MTIwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFnaW5nIHJlc291cmNlIHRlbXBsYXRlIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gNTEyMDAgYnl0ZXMsIGJ1dCBnb3QgJHtzaXplfSBieXRlc2ApO1xuICAgIH1cbiAgfVxufVxuIl19
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVmYXVsdC1zdGFnaW5nLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MseUNBQXlDO0FBQ3pDLDJDQVkwQjtBQUMxQiw0RUFBMEU7QUFDMUUsNENBQTRDO0FBQzVDLDJDQUF1QztBQUkxQixRQUFBLGtCQUFrQixHQUFHLGNBQWMsQ0FBQztBQUVqRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSwwQkFBMkIsU0FBUSxzQkFBUztJQUN2RCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2xCOzs7O0FBSFUsZ0VBQTBCO0FBcUd2Qzs7Ozs7R0FLRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsWUFBSztJQUM1Qzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBbUM7Ozs7Ozs7Ozs7UUFDdkQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6RixPQUFPO1lBQ0wsc0JBQXNCLENBQUMsS0FBSyxFQUFFLE9BQU87Z0JBQ25DLE1BQU0sR0FBRyxHQUFHLFVBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxVQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxDQUFDLFNBQVMseUJBQXlCLENBQUMsQ0FBQztpQkFDcEU7Z0JBRUQsNEVBQTRFO2dCQUM1RSwwRUFBMEU7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LENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2QyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5RUFBeUUsSUFBSSxRQUFRLENBQUMsQ0FBQztTQUN4RztLQUNGOzs7O0FBM1VVLGtEQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBlY3IgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHtcbiAgQXBwLFxuICBBcm5Gb3JtYXQsXG4gIEJvb3RzdHJhcGxlc3NTeW50aGVzaXplcixcbiAgRG9ja2VySW1hZ2VBc3NldFNvdXJjZSxcbiAgRHVyYXRpb24sXG4gIEZpbGVBc3NldFNvdXJjZSxcbiAgSVN5bnRoZXNpc1Nlc3Npb24sXG4gIFJlbW92YWxQb2xpY3ksXG4gIFN0YWNrLFxuICBTdGFja1Byb3BzLFxuICBJTkxJTkVfQ1VTVE9NX1JFU09VUkNFX0NPTlRFWFQsXG59IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgU3RyaW5nU3BlY2lhbGl6ZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ2F3cy1jZGstbGliL2N4LWFwaSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEJvb3RzdHJhcFJvbGUgfSBmcm9tICcuL2Jvb3RzdHJhcC1yb2xlcyc7XG5pbXBvcnQgeyBGaWxlU3RhZ2luZ0xvY2F0aW9uLCBJU3RhZ2luZ1Jlc291cmNlcywgSVN0YWdpbmdSZXNvdXJjZXNGYWN0b3J5LCBJbWFnZVN0YWdpbmdMb2NhdGlvbiB9IGZyb20gJy4vc3RhZ2luZy1zdGFjayc7XG5cbmV4cG9ydCBjb25zdCBERVBMT1lfVElNRV9QUkVGSVggPSAnZGVwbG95LXRpbWUvJztcblxuLyoqXG4gKiBUaGlzIGlzIGEgZHVtbXkgY29uc3RydWN0IG1lYW50IHRvIHNpZ25pZnkgdGhhdCBhIHN0YWNrIGlzIHV0aWxpemluZ1xuICogdGhlIEFwcFN0YWdpbmdTeW50aGVzaXplci4gSXQgZG9lcyBub3QgZG8gYW55dGhpbmcsIGFuZCBpcyBub3QgbWVhbnRcbiAqIHRvIGJlIGNyZWF0ZWQgb24gaXRzIG93bi4gVGhpcyBjb25zdHJ1Y3Qgd2lsbCBiZSBhIHBhcnQgb2YgdGhlXG4gKiBjb25zdHJ1Y3QgdHJlZSBvbmx5IGFuZCBub3QgdGhlIENmbiB0ZW1wbGF0ZS4gVGhlIGNvbnN0cnVjdCB0cmVlIGlzXG4gKiB0aGVuIGVuY29kZWQgaW4gdGhlIEFXUzo6Q0RLOjpNZXRhZGF0YSByZXNvdXJjZSBvZiB0aGUgc3RhY2sgYW5kXG4gKiBpbmplc3RlZCBpbiBvdXIgbWV0cmljcyBsaWtlIGV2ZXJ5IG90aGVyIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFVzaW5nQXBwU3RhZ2luZ1N5bnRoZXNpemVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBVc2VyIGNvbmZpZ3VyYWJsZSBvcHRpb25zIHRvIHRoZSBEZWZhdWx0U3RhZ2luZ1N0YWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHRoZSBzdGFnaW5nIHN0YWNrIGJlbG9uZ3MgdG8uXG4gICAqXG4gICAqIFRoaXMgaWRlbnRpZmllciB3aWxsIGJlIHVzZWQgaW4gdGhlIG5hbWUgb2Ygc3RhZ2luZyByZXNvdXJjZXNcbiAgICogY3JlYXRlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIENESyBhcHBzLlxuICAgKlxuICAgKiBUaGUgaWRlbnRpZmllciBzaG91bGQgaW5jbHVkZSBsb3dlcmNhc2UgY2hhcmFjdGVycyBhbmQgZGFzaGVzICgnLScpIG9ubHlcbiAgICogYW5kIGhhdmUgYSBtYXhpbXVtIG9mIDIwIGNoYXJhY3RlcnMuXG4gICAqL1xuICByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFeHBsaWNpdCBuYW1lIGZvciB0aGUgc3RhZ2luZyBidWNrZXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHdlbGwta25vd24gbmFtZSB1bmlxdWUgdG8gdGhpcyBhcHAvZW52LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2luZ0J1Y2tldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhc3MgaW4gYW4gZXhpc3Rpbmcgcm9sZSB0byBiZSB1c2VkIGFzIHRoZSBmaWxlIHB1Ymxpc2hpbmcgcm9sZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5ldyByb2xlIHdpbGwgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBQYXNzIGluIGFuIGV4aXN0aW5nIHJvbGUgdG8gYmUgdXNlZCBhcyB0aGUgaW1hZ2UgcHVibGlzaGluZyByb2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlmZXRpbWUgZm9yIGRlcGxveSB0aW1lIGZpbGUgYXNzZXRzLlxuICAgKlxuICAgKiBBc3NldHMgdGhhdCBhcmUgb25seSBuZWNlc3NhcnkgYXQgZGVwbG95bWVudCB0aW1lIChmb3IgaW5zdGFuY2UsXG4gICAqIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcyBhbmQgTGFtYmRhIHNvdXJjZSBjb2RlIGJ1bmRsZXMpIHdpbGwgYmVcbiAgICogYXV0b21hdGljYWxseSBkZWxldGVkIGFmdGVyIHRoaXMgbWFueSBkYXlzLiBBc3NldHMgdGhhdCBtYXkgYmVcbiAgICogcmVhZCBmcm9tIHRoZSBzdGFnaW5nIGJ1Y2tldCBkdXJpbmcgeW91ciBhcHBsaWNhdGlvbidzIHJ1biB0aW1lXG4gICAqIHdpbGwgbm90IGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIFNldCB0aGlzIHRvIHRoZSBsZW5ndGggb2YgdGltZSB5b3Ugd2lzaCB0byBiZSBhYmxlIHRvIHJvbGwgYmFjayB0b1xuICAgKiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB5b3VyIGFwcGxpY2F0aW9uIHdpdGhvdXQgaGF2aW5nIHRvIGRvIGEgbmV3XG4gICAqIGBjZGsgc3ludGhgIGFuZCByZS11cGxvYWQgb2YgYXNzZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIER1cmF0aW9uLmRheXMoMzApXG4gICAqL1xuICByZWFkb25seSBkZXBsb3lUaW1lRmlsZUFzc2V0TGlmZXRpbWU/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIHZlcnNpb25zIHRvIHN0b3JlIGluIGEgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogUHJldmlvdXMgdmVyc2lvbnMgb2YgYW4gaW1hZ2UgY2FuIGJlIHN0b3JlZCBmb3Igcm9sbGJhY2sgcHVycG9zZXMuXG4gICAqIE9uY2UgYSByZXBvc2l0b3J5IGhhcyBtb3JlIHRoYW4gMyBpbWFnZSB2ZXJzaW9ucyBzdG9yZWQsIHRoZSBvbGRlc3RcbiAgICogdmVyc2lvbiB3aWxsIGJlIGRpc2NhcmRlZC4gVGhpcyBhbGxvd3MgZm9yIHNlbnNpYmxlIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgKiB3aGlsZSBtYWludGFpbmluZyBhIGZldyBwcmV2aW91cyB2ZXJzaW9ucyBmb3Igcm9sbGJhY2sgc2NlbmFyaW9zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVwIHRvIDMgdmVyc2lvbnMgc3RvcmVkXG4gICAqL1xuICByZWFkb25seSBpbWFnZUFzc2V0VmVyc2lvbkNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdXRvIGRlbGV0ZXMgb2JqZWN0cyBpbiB0aGUgc3RhZ2luZyBTMyBidWNrZXQgYW5kIGltYWdlcyBpbiB0aGVcbiAgICogc3RhZ2luZyBFQ1IgcmVwb3NpdG9yaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhdXRvRGVsZXRlU3RhZ2luZ0Fzc2V0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVmYXVsdCBTdGFnaW5nIFN0YWNrIFByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0U3RhZ2luZ1N0YWNrUHJvcHMgZXh0ZW5kcyBEZWZhdWx0U3RhZ2luZ1N0YWNrT3B0aW9ucywgU3RhY2tQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBkZXBsb3kgYWN0aW9uIHJvbGUsIGlmIGdpdmVuXG4gICAqXG4gICAqIFRoaXMgcm9sZSB3aWxsIG5lZWQgcGVybWlzc2lvbnMgdG8gcmVhZCBmcm9tIHRvIHRoZSBzdGFnaW5nIHJlc291cmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgQ0xJIGNyZWRlbnRpYWxzIGFyZSBhc3N1bWVkLCBubyBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZSBncmFudGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95Um9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHF1YWxpZmllciB1c2VkIHRvIHNwZWNpYWxpemUgc3RyaW5nc1xuICAgKlxuICAgKiBTaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IGJ1dCB3aG8ga25vd3Mgd2hhdCBwZW9wbGUgbWlnaHQgZG8uXG4gICAqL1xuICByZWFkb25seSBxdWFsaWZpZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGRlZmF1bHQgU3RhZ2luZyBTdGFjayB0aGF0IGltcGxlbWVudHMgSVN0YWdpbmdSZXNvdXJjZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRlZmF1bHRTdGFnaW5nU3RhY2sgPSBEZWZhdWx0U3RhZ2luZ1N0YWNrLmZhY3RvcnkoeyBhcHBJZDogJ215LWFwcC1pZCcgfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZhdWx0U3RhZ2luZ1N0YWNrIGV4dGVuZHMgU3RhY2sgaW1wbGVtZW50cyBJU3RhZ2luZ1Jlc291cmNlcyB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBmYWN0b3J5IHRoYXQgd2lsbCBjcmVhdGUgRGVmYXVsdFN0YWdpbmdTdGFja3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZmFjdG9yeShvcHRpb25zOiBEZWZhdWx0U3RhZ2luZ1N0YWNrT3B0aW9ucyk6IElTdGFnaW5nUmVzb3VyY2VzRmFjdG9yeSB7XG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpLnNsaWNlKDAsIDIwKTtcbiAgICByZXR1cm4ge1xuICAgICAgb2J0YWluU3RhZ2luZ1Jlc291cmNlcyhzdGFjaywgY29udGV4dCkge1xuICAgICAgICBjb25zdCBhcHAgPSBBcHAub2Yoc3RhY2spO1xuICAgICAgICBpZiAoIUFwcC5pc0FwcChhcHApKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFjayAke3N0YWNrLnN0YWNrTmFtZX0gbXVzdCBiZSBwYXJ0IG9mIGFuIEFwcGApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmVjYXVzZSB3ZSBkbyBub3Qga2VlcCBtZXRyaWNzIGluIHRoZSBEZWZhdWx0U3RhZ2luZ1N0YWNrLCB3ZSB3aWxsIGluamVjdFxuICAgICAgICAvLyBhIGR1bW15IGNvbnN0cnVjdCBpbnRvIHRoZSBzdGFjayB1c2luZyB0aGUgRGVmYXVsdFN0YWdpbmdTdGFjayBpbnN0ZWFkLlxuICAgICAgICBpZiAoY3hhcGkuQU5BTFlUSUNTX1JFUE9SVElOR19FTkFCTEVEX0NPTlRFWFQpIHtcbiAgICAgICAgICBuZXcgVXNpbmdBcHBTdGFnaW5nU3ludGhlc2l6ZXIoc3RhY2ssIGBVc2luZ0FwcFN0YWdpbmdTeW50aGVzaXplci8ke3N0YWNrLnN0YWNrTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YWNrSWQgPSBgU3RhZ2luZ1N0YWNrLSR7YXBwSWR9LSR7Y29udGV4dC5lbnZpcm9ubWVudFN0cmluZ31gO1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRTdGFnaW5nU3RhY2soYXBwLCBzdGFja0lkLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcblxuICAgICAgICAgIC8vIERvZXMgbm90IG5lZWQgdG8gY29udGFpbiBlbnZpcm9ubWVudCBiZWNhdXNlIHN0YWNrIG5hbWVzIGFyZSB1bmlxdWUgaW5zaWRlIGFuIGVudiBhbnl3YXlcbiAgICAgICAgICBzdGFja05hbWU6IGBTdGFnaW5nU3RhY2stJHthcHBJZH1gLFxuICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgYWNjb3VudDogc3RhY2suYWNjb3VudCxcbiAgICAgICAgICAgIHJlZ2lvbjogc3RhY2sucmVnaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBwSWQsXG4gICAgICAgICAgcXVhbGlmaWVyOiBjb250ZXh0LnF1YWxpZmllcixcbiAgICAgICAgICBkZXBsb3lSb2xlQXJuOiBjb250ZXh0LmRlcGxveVJvbGVBcm4sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYXNzZXQgcHVibGlzaGluZyByb2xlIG5hbWUgZm9yIGZpbGUgKFMzKSBhc3NldHMuXG4gICAqL1xuICBwcml2YXRlIGdldCBmaWxlUm9sZU5hbWUoKSB7XG4gICAgcmV0dXJuIGBjZGstJHt0aGlzLmFwcElkfS1maWxlLXJvbGUtJHt0aGlzLnJlZ2lvbn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYXNzZXQgcHVibGlzaGluZyByb2xlIG5hbWUgZm9yIGRvY2tlciAoRUNSKSBhc3NldHMuXG4gICAqL1xuICBwcml2YXRlIGdldCBpbWFnZVJvbGVOYW1lKCkge1xuICAgIHJldHVybiBgY2RrLSR7dGhpcy5hcHBJZH0taW1hZ2Utcm9sZS0ke3RoaXMucmVnaW9ufWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFwcC1zY29wZWQsIGV2aXJvbm1lbnQta2V5ZWQgc3RhZ2luZyBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhZ2luZ0J1Y2tldD86IHMzLkJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIGFwcC1zY29wZWQsIGVudmlyb25tZW50LWtleWVkIGVjciByZXBvc2l0b3JpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXBwLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YWdpbmdSZXBvczogUmVjb3JkPHN0cmluZywgZWNyLlJlcG9zaXRvcnk+O1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdG8gYWRkIGRlcGVuZGVuY2llcyB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXBlbmRlbmN5U3RhY2s6IFN0YWNrO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnaW5nQnVja2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBwdWJsaXNoIHJvbGUgQVJOIGluIGFzc2V0IG1hbmlmZXN0IGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlZEZpbGVSb2xlPzogQm9vdHN0cmFwUm9sZTtcbiAgcHJpdmF0ZSBmaWxlUm9sZT86IGlhbS5JUm9sZTtcbiAgcHJpdmF0ZSBmaWxlUm9sZU1hbmlmZXN0QXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbWFnZSBwdWJsaXNoaW5nIHJvbGUgQVJOIGluIGFzc2V0IG1hbmlmZXN0IGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlZEltYWdlUm9sZT86IEJvb3RzdHJhcFJvbGU7XG4gIHByaXZhdGUgaW1hZ2VSb2xlPzogaWFtLklSb2xlO1xuICBwcml2YXRlIGRpZEltYWdlUm9sZSA9IGZhbHNlO1xuICBwcml2YXRlIGltYWdlUm9sZU1hbmlmZXN0QXJuPzogc3RyaW5nO1xuICBwcml2YXRlIGF1dG9EZWxldGVTdGFnaW5nQXNzZXRzOiBib29sZWFuO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95Um9sZUFybj86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQXBwLCBpZDogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBEZWZhdWx0U3RhZ2luZ1N0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc3ludGhlc2l6ZXI6IG5ldyBCb290c3RyYXBsZXNzU3ludGhlc2l6ZXIoKSxcbiAgICAgIGFuYWx5dGljc1JlcG9ydGluZzogZmFsc2UsIC8vIHJlbW92aW5nIEFXUzo6Q0RLOjpNZXRhZGF0YSBjb25zdHJ1Y3Qgc2F2ZXMgfjNLQlxuICAgIH0pO1xuICAgIC8vIHJlbW92aW5nIHBhdGggbWV0YWRhdGEgc2F2ZXMgfjJLQlxuICAgIHRoaXMubm9kZS5zZXRDb250ZXh0KGN4YXBpLlBBVEhfTUVUQURBVEFfRU5BQkxFX0NPTlRFWFQsIGZhbHNlKTtcblxuICAgIC8vIEZvciBhbGwgcmVzb3VyY2VzIHVuZGVyIHRoZSBkZWZhdWx0IHN0YWdpbmcgc3RhY2ssIHdlIHdhbnQgdG8gaW5saW5lIGN1c3RvbVxuICAgIC8vIHJlc291cmNlcyBiZWNhdXNlIHRoZSBzdGFnaW5nIGJ1Y2tldCBuZWNlc3NhcnkgZm9yIGN1c3RvbSByZXNvdXJjZSBhc3NldHNcbiAgICAvLyBkb2VzIG5vdCBleGlzdCB5ZXQuXG4gICAgdGhpcy5ub2RlLnNldENvbnRleHQoSU5MSU5FX0NVU1RPTV9SRVNPVVJDRV9DT05URVhULCB0cnVlKTtcbiAgICB0aGlzLmF1dG9EZWxldGVTdGFnaW5nQXNzZXRzID0gcHJvcHMuYXV0b0RlbGV0ZVN0YWdpbmdBc3NldHMgPz8gdHJ1ZTtcblxuICAgIHRoaXMuYXBwSWQgPSB0aGlzLnZhbGlkYXRlQXBwSWQocHJvcHMuYXBwSWQpO1xuICAgIHRoaXMuZGVwZW5kZW5jeVN0YWNrID0gdGhpcztcblxuICAgIHRoaXMuZGVwbG95Um9sZUFybiA9IHByb3BzLmRlcGxveVJvbGVBcm47XG4gICAgdGhpcy5zdGFnaW5nQnVja2V0TmFtZSA9IHByb3BzLnN0YWdpbmdCdWNrZXROYW1lO1xuICAgIGNvbnN0IHNwZWNpYWxpemVyID0gbmV3IFN0cmluZ1NwZWNpYWxpemVyKHRoaXMsIHByb3BzLnF1YWxpZmllcik7XG5cbiAgICB0aGlzLnByb3ZpZGVkRmlsZVJvbGUgPSBwcm9wcy5maWxlQXNzZXRQdWJsaXNoaW5nUm9sZT8uX3NwZWNpYWxpemUoc3BlY2lhbGl6ZXIpO1xuICAgIHRoaXMucHJvdmlkZWRJbWFnZVJvbGUgPSBwcm9wcy5pbWFnZUFzc2V0UHVibGlzaGluZ1JvbGU/Ll9zcGVjaWFsaXplKHNwZWNpYWxpemVyKTtcbiAgICB0aGlzLnN0YWdpbmdSZXBvcyA9IHt9O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFwcElkKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBpZiAoaWQubGVuZ3RoID4gMjApIHtcbiAgICAgIGVycm9ycy5wdXNoKGBhcHBJZCBleHBlY3RlZCBubyBtb3JlIHRoYW4gMjAgY2hhcmFjdGVycyBidXQgZ290ICR7aWQubGVuZ3RofSBjaGFyYWN0ZXJzLmApO1xuICAgIH1cbiAgICBpZiAoaWQgIT09IGlkLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdhcHBJZCBvbmx5IGFjY2VwdHMgbG93ZXJjYXNlIGNoYXJhY3RlcnMuJyk7XG4gICAgfVxuICAgIGlmICghL15bYS16MC05LV0qJC8udGVzdChpZCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdhcHBJZCBleHBlY3RzIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIGRhc2hlcyAoXFwnLVxcJyknKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgIGBhcHBJZCAke2lkfSBoYXMgZXJyb3JzOmAsXG4gICAgICAgIC4uLmVycm9ycyxcbiAgICAgIF0uam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUZpbGVSb2xlKCkge1xuICAgIGlmICh0aGlzLnByb3ZpZGVkRmlsZVJvbGUpIHtcbiAgICAgIC8vIE92ZXJyaWRlXG4gICAgICB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4gPSB0aGlzLnByb3ZpZGVkRmlsZVJvbGUuX2FybkZvckNsb3VkQXNzZW1ibHkoKTtcbiAgICAgIGNvbnN0IGNmbkFybiA9IHRoaXMucHJvdmlkZWRGaWxlUm9sZS5fYXJuRm9yQ2xvdWRGb3JtYXRpb24oKTtcbiAgICAgIHRoaXMuZmlsZVJvbGUgPSBjZm5Bcm4gPyBpYW0uUm9sZS5mcm9tUm9sZUFybih0aGlzLCAnQ2RrRmlsZVJvbGUnLCBjZm5Bcm4pIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJvbGVOYW1lID0gdGhpcy5maWxlUm9sZU5hbWU7XG4gICAgdGhpcy5maWxlUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnQ2RrRmlsZVJvbGUnLCB7XG4gICAgICByb2xlTmFtZSxcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKHRoaXMuYWNjb3VudCksXG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbGVSb2xlTWFuaWZlc3RBcm4gPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgcGFydGl0aW9uOiAnJHtBV1M6OlBhcnRpdGlvbn0nLFxuICAgICAgcmVnaW9uOiAnJywgLy8gaWFtIGlzIGdsb2JhbFxuICAgICAgc2VydmljZTogJ2lhbScsXG4gICAgICByZXNvdXJjZTogJ3JvbGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiByb2xlTmFtZSxcbiAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUltYWdlUm9sZSgpIHtcbiAgICAvLyBJdCBtYXkgZW5kIHVwIHNldHRpbmcgaW1hZ2VSb2xlIHRvIHVuZGVmaW5lZCwgYnV0IGF0IGxlYXN0IHdlIHRyaWVkXG4gICAgaWYgKHRoaXMuZGlkSW1hZ2VSb2xlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlkSW1hZ2VSb2xlID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnByb3ZpZGVkSW1hZ2VSb2xlKSB7XG4gICAgICAvLyBPdmVycmlkZVxuICAgICAgdGhpcy5pbWFnZVJvbGVNYW5pZmVzdEFybiA9IHRoaXMucHJvdmlkZWRJbWFnZVJvbGUuX2FybkZvckNsb3VkQXNzZW1ibHkoKTtcbiAgICAgIGNvbnN0IGNmbkFybiA9IHRoaXMucHJvdmlkZWRJbWFnZVJvbGUuX2FybkZvckNsb3VkRm9ybWF0aW9uKCk7XG4gICAgICB0aGlzLmltYWdlUm9sZSA9IGNmbkFybiA/IGlhbS5Sb2xlLmZyb21Sb2xlQXJuKHRoaXMsICdDZGtJbWFnZVJvbGUnLCBjZm5Bcm4pIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJvbGVOYW1lID0gdGhpcy5pbWFnZVJvbGVOYW1lO1xuICAgIHRoaXMuaW1hZ2VSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdDZGtJbWFnZVJvbGUnLCB7XG4gICAgICByb2xlTmFtZSxcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKHRoaXMuYWNjb3VudCksXG4gICAgfSk7XG4gICAgdGhpcy5pbWFnZVJvbGVNYW5pZmVzdEFybiA9IFN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICBwYXJ0aXRpb246ICcke0FXUzo6UGFydGl0aW9ufScsXG4gICAgICByZWdpb246ICcnLCAvLyBpYW0gaXMgZ2xvYmFsXG4gICAgICBzZXJ2aWNlOiAnaWFtJyxcbiAgICAgIHJlc291cmNlOiAncm9sZScsXG4gICAgICByZXNvdXJjZU5hbWU6IHJvbGVOYW1lLFxuICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnVja2V0S2V5KCk6IGttcy5JS2V5IHtcbiAgICByZXR1cm4gbmV3IGttcy5LZXkodGhpcywgJ0J1Y2tldEtleScsIHtcbiAgICAgIGFsaWFzOiBgYWxpYXMvY2RrLSR7dGhpcy5hcHBJZH0tc3RhZ2luZ2AsXG4gICAgICBhZG1pbnM6IFtuZXcgaWFtLkFjY291bnRQcmluY2lwYWwodGhpcy5hY2NvdW50KV0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENyZWF0ZUJ1Y2tldCgpIHtcbiAgICBjb25zdCBzdGFnaW5nQnVja2V0TmFtZSA9IHRoaXMuc3RhZ2luZ0J1Y2tldE5hbWUgPz8gYGNkay0ke3RoaXMuYXBwSWR9LXN0YWdpbmctJHt0aGlzLmFjY291bnR9LSR7dGhpcy5yZWdpb259YDtcbiAgICBjb25zdCBidWNrZXRJZCA9ICdDZGtTdGFnaW5nQnVja2V0JztcbiAgICBjb25zdCBjcmVhdGVkQnVja2V0ID0gdGhpcy5ub2RlLnRyeUZpbmRDaGlsZChidWNrZXRJZCkgYXMgczMuQnVja2V0O1xuICAgIGlmIChjcmVhdGVkQnVja2V0KSB7XG4gICAgICByZXR1cm4gc3RhZ2luZ0J1Y2tldE5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5lbnN1cmVGaWxlUm9sZSgpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY3JlYXRlQnVja2V0S2V5KCk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGJ1Y2tldCBvbmNlIHRoZSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICBjb25zdCBidWNrZXQgPSBuZXcgczMuQnVja2V0KHRoaXMsIGJ1Y2tldElkLCB7XG4gICAgICBidWNrZXROYW1lOiBzdGFnaW5nQnVja2V0TmFtZSxcbiAgICAgIC4uLih0aGlzLmF1dG9EZWxldGVTdGFnaW5nQXNzZXRzID8ge1xuICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgfSA6IHtcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICB9KSxcbiAgICAgIGVuY3J5cHRpb246IHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TLFxuICAgICAgZW5jcnlwdGlvbktleToga2V5LFxuXG4gICAgICAvLyBNYW55IEFXUyBhY2NvdW50IHNhZmV0eSBjaGVja2VycyB3aWxsIGNvbXBsYWluIHdoZW4gYnVja2V0cyBhcmVuJ3QgdmVyc2lvbmVkXG4gICAgICB2ZXJzaW9uZWQ6IHRydWUsXG4gICAgICAvLyBNYW55IEFXUyBhY2NvdW50IHNhZmV0eSBjaGVja2VycyB3aWxsIGNvbXBsYWluIHdoZW4gU1NMIGlzbid0IGVuZm9yY2VkXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZmlsZVJvbGUpIHtcbiAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmZpbGVSb2xlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXBsb3lSb2xlQXJuKSB7XG4gICAgICBidWNrZXQuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnczM6R2V0T2JqZWN0KicsXG4gICAgICAgICAgJ3MzOkdldEJ1Y2tldConLFxuICAgICAgICAgICdzMzpMaXN0KicsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW2J1Y2tldC5idWNrZXRBcm4sIGJ1Y2tldC5hcm5Gb3JPYmplY3RzKCcqJyldLFxuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5Bcm5QcmluY2lwYWwodGhpcy5kZXBsb3lSb2xlQXJuKV0sXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gT2JqZWN0cyBzaG91bGQgbmV2ZXIgYmUgb3ZlcndyaXR0ZW4sIGJ1dCBsZXQncyBtYWtlIHN1cmUgd2UgaGF2ZSBhIGxpZmVjeWNsZSBwb2xpY3lcbiAgICAvLyBmb3IgaXQgYW55d2F5LlxuICAgIGJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgIG5vbmN1cnJlbnRWZXJzaW9uRXhwaXJhdGlvbjogRHVyYXRpb24uZGF5cygzNjUpLFxuICAgIH0pO1xuXG4gICAgYnVja2V0LmFkZExpZmVjeWNsZVJ1bGUoe1xuICAgICAgcHJlZml4OiBERVBMT1lfVElNRV9QUkVGSVgsXG4gICAgICBleHBpcmF0aW9uOiB0aGlzLnByb3BzLmRlcGxveVRpbWVGaWxlQXNzZXRMaWZldGltZSA/PyBEdXJhdGlvbi5kYXlzKDMwKSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdGFnaW5nQnVja2V0TmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3ZWxsLWtub3duIG5hbWUgb2YgdGhlIHJlcG9cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3JlYXRlUmVwbyhhc3NldDogRG9ja2VySW1hZ2VBc3NldFNvdXJjZSk6IHN0cmluZyB7XG4gICAgaWYgKCFhc3NldC5hc3NldE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXNzZXRzIHN5bnRoZXNpemVkIHdpdGggQXBwU2NvcGVkU3RhZ2luZ1N5bnRoZXNpemVyIG11c3QgaW5jbHVkZSBhbiBcXCdhc3NldE5hbWVcXCcgaW4gdGhlIGFzc2V0IHNvdXJjZSBkZWZpbml0aW9uLicpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBpbWFnZSBwdWJsaXNoaW5nIHJvbGUgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIHRoaXMuZW5zdXJlSW1hZ2VSb2xlKCk7XG5cbiAgICBjb25zdCByZXBvTmFtZSA9IGdlbmVyYXRlUmVwb05hbWUoYCR7dGhpcy5hcHBJZH0vJHthc3NldC5hc3NldE5hbWV9YCk7XG4gICAgaWYgKHRoaXMuc3RhZ2luZ1JlcG9zW2Fzc2V0LmFzc2V0TmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFnaW5nUmVwb3NbYXNzZXQuYXNzZXROYW1lXSA9IG5ldyBlY3IuUmVwb3NpdG9yeSh0aGlzLCByZXBvTmFtZSwge1xuICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwb05hbWUsXG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnR2FyYmFnZSBjb2xsZWN0IG9sZCBpbWFnZSB2ZXJzaW9ucycsXG4gICAgICAgICAgbWF4SW1hZ2VDb3VudDogdGhpcy5wcm9wcy5pbWFnZUFzc2V0VmVyc2lvbkNvdW50ID8/IDMsXG4gICAgICAgIH1dLFxuICAgICAgICAuLi4odGhpcy5hdXRvRGVsZXRlU3RhZ2luZ0Fzc2V0cyA/IHtcbiAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgYXV0b0RlbGV0ZUltYWdlczogdHJ1ZSxcbiAgICAgICAgfSA6IHtcbiAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuaW1hZ2VSb2xlKSB7XG4gICAgICAgIHRoaXMuc3RhZ2luZ1JlcG9zW2Fzc2V0LmFzc2V0TmFtZV0uZ3JhbnRQdWxsUHVzaCh0aGlzLmltYWdlUm9sZSk7XG4gICAgICAgIHRoaXMuc3RhZ2luZ1JlcG9zW2Fzc2V0LmFzc2V0TmFtZV0uZ3JhbnRSZWFkKHRoaXMuaW1hZ2VSb2xlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcG9OYW1lO1xuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIG5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKS5yZXBsYWNlKCcuJywgJy0nKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkRmlsZShhc3NldDogRmlsZUFzc2V0U291cmNlKTogRmlsZVN0YWdpbmdMb2NhdGlvbiB7XG4gICAgLy8gSGFzIHNpZGUgZWZmZWN0cyBzbyBtdXN0IGdvIGZpcnN0XG4gICAgY29uc3QgYnVja2V0TmFtZSA9IHRoaXMuZ2V0Q3JlYXRlQnVja2V0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVja2V0TmFtZSxcbiAgICAgIGFzc3VtZVJvbGVBcm46IHRoaXMuZmlsZVJvbGVNYW5pZmVzdEFybixcbiAgICAgIHByZWZpeDogYXNzZXQuZGVwbG95VGltZSA/IERFUExPWV9USU1FX1BSRUZJWCA6IHVuZGVmaW5lZCxcbiAgICAgIGRlcGVuZGVuY3lTdGFjazogdGhpcyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFkZERvY2tlckltYWdlKGFzc2V0OiBEb2NrZXJJbWFnZUFzc2V0U291cmNlKTogSW1hZ2VTdGFnaW5nTG9jYXRpb24ge1xuICAgIC8vIEhhcyBzaWRlIGVmZmVjdHMgc28gbXVzdCBnbyBmaXJzdFxuICAgIGNvbnN0IHJlcG9OYW1lID0gdGhpcy5nZXRDcmVhdGVSZXBvKGFzc2V0KTtcblxuICAgIHJldHVybiB7XG4gICAgICByZXBvTmFtZSxcbiAgICAgIGFzc3VtZVJvbGVBcm46IHRoaXMuaW1hZ2VSb2xlTWFuaWZlc3RBcm4sXG4gICAgICBkZXBlbmRlbmN5U3RhY2s6IHRoaXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW50aGVzaXplcyB0aGUgY2xvdWRmb3JtYXRpb24gdGVtcGxhdGUgaW50byBhIGNsb3VkIGFzc2VtYmx5LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfc3ludGhlc2l6ZVRlbXBsYXRlKHNlc3Npb246IElTeW50aGVzaXNTZXNzaW9uLCBsb29rdXBSb2xlQXJuPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgc3VwZXIuX3N5bnRoZXNpemVUZW1wbGF0ZShzZXNzaW9uLCBsb29rdXBSb2xlQXJuKTtcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBzZXNzaW9uLmFzc2VtYmx5O1xuICAgIGNvbnN0IG91dFBhdGggPSBwYXRoLmpvaW4oYnVpbGRlci5vdXRkaXIsIHRoaXMudGVtcGxhdGVGaWxlKTtcbiAgICBjb25zdCBzaXplID0gZnMuc3RhdFN5bmMob3V0UGF0aCkuc2l6ZTtcbiAgICBpZiAoc2l6ZSA+IDUxMjAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YWdpbmcgcmVzb3VyY2UgdGVtcGxhdGUgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiA1MTIwMCBieXRlcywgYnV0IGdvdCAke3NpemV9IGJ5dGVzYCk7XG4gICAgfVxuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@aws-cdk/app-staging-synthesizer-alpha",
3
3
  "private": false,
4
- "version": "2.85.0-alpha.0",
4
+ "version": "2.87.0-alpha.0",
5
5
  "description": "Cdk synthesizer for with app-scoped staging stack",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -84,19 +84,19 @@
84
84
  }
85
85
  },
86
86
  "dependencies": {
87
- "aws-cdk-lib": "2.85.0",
87
+ "aws-cdk-lib": "2.87.0",
88
88
  "constructs": "^10.0.0"
89
89
  },
90
90
  "devDependencies": {
91
- "aws-cdk-lib": "2.85.0",
92
- "@aws-cdk/integ-runner": "2.85.0-alpha.0",
93
- "@aws-cdk/integ-tests-alpha": "2.85.0-alpha.0",
91
+ "aws-cdk-lib": "2.87.0",
92
+ "@aws-cdk/integ-runner": "2.87.0-alpha.0",
93
+ "@aws-cdk/integ-tests-alpha": "2.87.0-alpha.0",
94
94
  "constructs": "^10.0.0",
95
- "@aws-cdk/cdk-build-tools": "2.85.0-alpha.0",
96
- "@aws-cdk/pkglint": "2.85.0-alpha.0"
95
+ "@aws-cdk/cdk-build-tools": "2.87.0-alpha.0",
96
+ "@aws-cdk/pkglint": "2.87.0-alpha.0"
97
97
  },
98
98
  "peerDependencies": {
99
- "aws-cdk-lib": "2.85.0",
99
+ "aws-cdk-lib": "2.87.0",
100
100
  "constructs": "^10.0.0"
101
101
  },
102
102
  "publishConfig": {