image-scanner-with-trivy 2.0.0 → 2.1.1

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
@@ -3962,7 +3962,7 @@
3962
3962
  },
3963
3963
  "name": "image-scanner-with-trivy",
3964
3964
  "readme": {
3965
- "markdown": "# image-scanner-with-trivy\n\n## Detail Pages\n\nThe detail blog is [here](https://dev.to/aws-builders/container-image-scanning-with-trivy-in-aws-cdk-151h).\n\nTo my surprise, this library was featured on the ecosystem page of [Trivy's official documentation](https://aquasecurity.github.io/trivy/latest/ecosystem/ide/#image-scanner-with-trivy-community)!\n\n## What is\n\nThis is an AWS CDK Construct that allows you to **scan container images with Trivy in CDK deployment layer**.\n\nIf it detects vulnerabilities, it can **prevent the image from being pushed to the ECR for the application**.\n\nSince it takes an `imageUri` for ECR as an argument, it can also be used to **simply scan an existing image in the repository**.\n\n## Trivy\n\n[Trivy](https://github.com/aquasecurity/trivy) is a comprehensive and versatile security scanner.\n\n## Usage\n\n### Install\n\n```sh\nnpm install image-scanner-with-trivy\n```\n\n### CDK Code\n\nThe following code is a minimal example.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\n// Add properties you want for trivy options (ignoreUnfixed, severity, scanners, trivyIgnore, etc).\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n});\n\n// By adding `addDependency`, if the vulnerabilities are detected by `ImageScannerWithTrivy`, the following `ECRDeployment` will not be executed, deployment will fail.\nconst ecrDeployment = new ECRDeployment(this, 'DeployImage', {\n src: new DockerImageName(image.imageUri),\n dest: new DockerImageName(`${repository.repositoryUri}:latest`),\n});\necrDeployment.node.addDependency(imageScanner);\n```\n\n### Scan Logs Output\n\nIf you output the scan logs to other than the default log group, you can specify the `scanLogsOutput` option.\n\nThis option is useful when you want to choose where to output the scan logs.\n\nCurrently, CloudWatch Logs is only supported as an output destination.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Use `ScanLogsOutput.cloudWatchLogs` method to specify the log group.\n scanLogsOutput: ScanLogsOutput.cloudWatchLogs({ logGroup: new LogGroup(this, 'LogGroup') }),\n});\n```\n\n### Default Log Group\n\nIf you customize the default log group for Scanner Lambda, you can specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options.\nCurrently, only changing the removal policy and retention days are supported.\n\nIf the default log group is already created in your AWS Account and you specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options, the deployment will fail because of a conflict with the log group name.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Change the default log group removal policy to `Destroy`.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n // Change the default log group retention days to `One Year`.\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n```\n\nIf you use ImageScannerWithTrivy construct multiple times in the same stack, you have to set the same values for `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\nWhen you set the different values for each construct, the first one will be applied to all ImageScannerWithTrivy constructs in the same stack and warning message will be displayed.\n\nThe following code will produce warning message because of the different values of `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are applied to all ImageScannerWithTrivy constructs in the same stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n\n// NG example\n// Once you specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays, you have to set the same values for each construct.\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithDifferentDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are different from the above construct, and warning message will be displayed when synthesizing the stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.RETAIN, // This should be `RemovalPolicy.DESTROY` as the above construct.\n defaultLogGroupRetentionDays: RetentionDays.ONE_MONTH, // This should be `RetentionDays.ONE_YEAR` as the above construct.\n});\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithNoDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // You should specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays if you have already set the values.\n});\n```\n\n## API Reference\n\nAPI Reference is [here](./API.md#api-reference-).\n"
3965
+ "markdown": "# image-scanner-with-trivy\n\n## Detail Pages\n\nThe detail blog is [here](https://dev.to/aws-builders/container-image-scanning-with-trivy-in-aws-cdk-151h).\n\nTo my surprise, this library was featured on the ecosystem page of [Trivy's official documentation](https://aquasecurity.github.io/trivy/latest/ecosystem/ide/#image-scanner-with-trivy-community)!\n\n## What is\n\nThis is an AWS CDK Construct that allows you to **scan container images with Trivy in CDK deployment layer**.\n\nIf it detects vulnerabilities, it can **prevent the image from being pushed to the ECR for the application**.\n\nSince it takes an `imageUri` for ECR as an argument, it can also be used to **simply scan an existing image in the repository**.\n\n## Trivy\n\n[Trivy](https://github.com/aquasecurity/trivy) is a comprehensive and versatile security scanner.\n\n## Usage\n\n### Install\n\n```sh\nnpm install image-scanner-with-trivy\n```\n\n### CDK Code\n\nThe following code is a minimal example.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\n// Add properties you want for trivy options (ignoreUnfixed, severity, scanners, trivyIgnore, etc).\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n});\n\n// By adding `addDependency`, if the vulnerabilities are detected by `ImageScannerWithTrivy`, the following `ECRDeployment` will not be executed, deployment will fail.\nconst ecrDeployment = new ECRDeployment(this, 'DeployImage', {\n src: new DockerImageName(image.imageUri),\n dest: new DockerImageName(`${repository.repositoryUri}:latest`),\n});\necrDeployment.node.addDependency(imageScanner);\n```\n\n### Scan Logs Output\n\nIf you output the scan logs to other than the default log group, you can specify the `scanLogsOutput` option.\n\nThis option is useful when you want to choose where to output the scan logs.\n\nCurrently, CloudWatch Logs is only supported as an output destination.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Use `ScanLogsOutput.cloudWatchLogs` method to specify the log group.\n scanLogsOutput: ScanLogsOutput.cloudWatchLogs({ logGroup: new LogGroup(this, 'LogGroup') }),\n});\n```\n\n### Default Log Group\n\nIf you customize the default log group for Scanner Lambda, you can specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options.\nCurrently, only changing the removal policy and retention days are supported.\n\nIf the default log group is already created in your AWS Account and you specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options, the deployment will fail because of a conflict with the log group name.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Change the default log group removal policy to `Destroy`.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n // Change the default log group retention days to `One Year`.\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n```\n\nIf you use ImageScannerWithTrivy construct multiple times in the same stack, you have to set the same values for `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\nWhen you set the different values for each construct, the first one will be applied to all ImageScannerWithTrivy constructs in the same stack and warning message will be displayed.\n\nThe following code will produce warning message because of the different values of `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are applied to all ImageScannerWithTrivy constructs in the same stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n\n// NG example\n// Once you specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays, you have to set the same values for each construct.\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithDifferentDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are different from the above construct, and warning message will be displayed when synthesizing the stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.RETAIN, // This should be `RemovalPolicy.DESTROY` as the above construct.\n defaultLogGroupRetentionDays: RetentionDays.ONE_MONTH, // This should be `RetentionDays.ONE_YEAR` as the above construct.\n});\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithNoDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // You should specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays if you have already set the values.\n});\n```\n\n### Rollback Error Suppression\n\nBy default, the `suppressErrorOnRollback` property is set to `true`.\n\nWhen image scanning fails, CloudFormation triggers a rollback and executes the previous version\nof the scanner Lambda. If this property is set to `true`, the previous version of the scanner\nLambda will not throw an error, even if the image scanning for the previous version fails.\n\nThis allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state\nwhen image scanning failures occur.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Default is true - suppress errors during rollback to prevent ROLLBACK_FAILED\n suppressErrorOnRollback: true,\n // Set to false if you want rollback errors to be thrown\n suppressErrorOnRollback: false,\n});\n```\n\n## API Reference\n\nAPI Reference is [here](./API.md#api-reference-).\n"
3966
3966
  },
3967
3967
  "repository": {
3968
3968
  "type": "git",
@@ -4088,7 +4088,7 @@
4088
4088
  },
4089
4089
  "locationInModule": {
4090
4090
  "filename": "src/image-scanner-with-trivy.ts",
4091
- "line": 315
4091
+ "line": 330
4092
4092
  },
4093
4093
  "parameters": [
4094
4094
  {
@@ -4114,7 +4114,7 @@
4114
4114
  "kind": "class",
4115
4115
  "locationInModule": {
4116
4116
  "filename": "src/image-scanner-with-trivy.ts",
4117
- "line": 314
4117
+ "line": 329
4118
4118
  },
4119
4119
  "name": "ImageScannerWithTrivy",
4120
4120
  "symbolId": "src/image-scanner-with-trivy:ImageScannerWithTrivy"
@@ -4396,6 +4396,25 @@
4396
4396
  }
4397
4397
  }
4398
4398
  },
4399
+ {
4400
+ "abstract": true,
4401
+ "docs": {
4402
+ "default": "true",
4403
+ "remarks": "When image scanning fails, CloudFormation triggers a rollback and executes the previous\nversion of the scanner Lambda. If this property is set to `true`, the previous version of\nthe scanner Lambda will not throw an error, even if the image scanning for the previous version\nfails.\n\nThis allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state\nwhen image scanning failures occur.",
4404
+ "stability": "stable",
4405
+ "summary": "Suppress errors during rollback scanner Lambda execution."
4406
+ },
4407
+ "immutable": true,
4408
+ "locationInModule": {
4409
+ "filename": "src/image-scanner-with-trivy.ts",
4410
+ "line": 323
4411
+ },
4412
+ "name": "suppressErrorOnRollback",
4413
+ "optional": true,
4414
+ "type": {
4415
+ "primitive": "boolean"
4416
+ }
4417
+ },
4399
4418
  {
4400
4419
  "abstract": true,
4401
4420
  "docs": {
@@ -4645,6 +4664,6 @@
4645
4664
  "symbolId": "src/image-scanner-with-trivy:Severity"
4646
4665
  }
4647
4666
  },
4648
- "version": "2.0.0",
4649
- "fingerprint": "AgLZ3VCxzpZE+D9DPljC53OKCs6bcGXU0vjOIwofx5w="
4667
+ "version": "2.1.1",
4668
+ "fingerprint": "UxJGqLDdTlaUSu2uNRizQj8PQSz6boH8jdb01Unk+3s="
4650
4669
  }
package/API.md CHANGED
@@ -203,6 +203,7 @@ const imageScannerWithTrivyProps: ImageScannerWithTrivyProps = { ... }
203
203
  | <code><a href="#image-scanner-with-trivy.ImageScannerWithTrivyProps.property.scanLogsOutput">scanLogsOutput</a></code> | <code><a href="#image-scanner-with-trivy.ScanLogsOutput">ScanLogsOutput</a></code> | Configuration for scan logs output. |
204
204
  | <code><a href="#image-scanner-with-trivy.ImageScannerWithTrivyProps.property.scanners">scanners</a></code> | <code><a href="#image-scanner-with-trivy.Scanners">Scanners</a>[]</code> | Enable/Disable Scanners. |
205
205
  | <code><a href="#image-scanner-with-trivy.ImageScannerWithTrivyProps.property.severity">severity</a></code> | <code><a href="#image-scanner-with-trivy.Severity">Severity</a>[]</code> | Severity Selection. |
206
+ | <code><a href="#image-scanner-with-trivy.ImageScannerWithTrivyProps.property.suppressErrorOnRollback">suppressErrorOnRollback</a></code> | <code>boolean</code> | Suppress errors during rollback scanner Lambda execution. |
206
207
  | <code><a href="#image-scanner-with-trivy.ImageScannerWithTrivyProps.property.trivyIgnore">trivyIgnore</a></code> | <code>string[]</code> | By Finding IDs. |
207
208
 
208
209
  ---
@@ -448,6 +449,27 @@ It defaults to `CRITICAL` IN THIS CONSTRUCT for safety in CI/CD, but the default
448
449
 
449
450
  ---
450
451
 
452
+ ##### `suppressErrorOnRollback`<sup>Optional</sup> <a name="suppressErrorOnRollback" id="image-scanner-with-trivy.ImageScannerWithTrivyProps.property.suppressErrorOnRollback"></a>
453
+
454
+ ```typescript
455
+ public readonly suppressErrorOnRollback: boolean;
456
+ ```
457
+
458
+ - *Type:* boolean
459
+ - *Default:* true
460
+
461
+ Suppress errors during rollback scanner Lambda execution.
462
+
463
+ When image scanning fails, CloudFormation triggers a rollback and executes the previous
464
+ version of the scanner Lambda. If this property is set to `true`, the previous version of
465
+ the scanner Lambda will not throw an error, even if the image scanning for the previous version
466
+ fails.
467
+
468
+ This allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state
469
+ when image scanning failures occur.
470
+
471
+ ---
472
+
451
473
  ##### `trivyIgnore`<sup>Optional</sup> <a name="trivyIgnore" id="image-scanner-with-trivy.ImageScannerWithTrivyProps.property.trivyIgnore"></a>
452
474
 
453
475
  ```typescript
package/CONTRIBUTION.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## Contribution
2
2
 
3
+ ### Build for Code Bundle and API.md
4
+
5
+ ```sh
6
+ yarn build
7
+ ```
8
+
3
9
  ### Update Snapshots in Integration Tests
4
10
 
5
11
  ```sh
package/README.md CHANGED
@@ -154,6 +154,39 @@ new ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithNoDefaultLogGroupOptio
154
154
  });
155
155
  ```
156
156
 
157
+ ### Rollback Error Suppression
158
+
159
+ By default, the `suppressErrorOnRollback` property is set to `true`.
160
+
161
+ When image scanning fails, CloudFormation triggers a rollback and executes the previous version
162
+ of the scanner Lambda. If this property is set to `true`, the previous version of the scanner
163
+ Lambda will not throw an error, even if the image scanning for the previous version fails.
164
+
165
+ This allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state
166
+ when image scanning failures occur.
167
+
168
+ ```ts
169
+ import { ImageScannerWithTrivy } from 'image-scanner-with-trivy';
170
+
171
+ const repository = new Repository(this, 'ImageRepository', {
172
+ removalPolicy: RemovalPolicy.DESTROY,
173
+ autoDeleteImages: true,
174
+ });
175
+
176
+ const image = new DockerImageAsset(this, 'DockerImage', {
177
+ directory: resolve(__dirname, './'),
178
+ });
179
+
180
+ new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {
181
+ imageUri: image.imageUri,
182
+ repository: image.repository,
183
+ // Default is true - suppress errors during rollback to prevent ROLLBACK_FAILED
184
+ suppressErrorOnRollback: true,
185
+ // Set to false if you want rollback errors to be thrown
186
+ suppressErrorOnRollback: false,
187
+ });
188
+ ```
189
+
157
190
  ## API Reference
158
191
 
159
192
  API Reference is [here](./API.md#api-reference-).
@@ -1,9 +1,10 @@
1
- "use strict";var g=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var h=(e,t)=>{for(var n in t)g(e,n,{get:t[n],enumerable:!0})},O=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of S(t))!C.call(e,o)&&o!==n&&g(e,o,{get:()=>t[o],enumerable:!(i=f(t,o))||i.enumerable});return e};var L=e=>O(g({},"__esModule",{value:!0}),e);var E={};h(E,{handler:()=>w});module.exports=L(E);var l=require("child_process"),m=require("fs"),s=require("@aws-sdk/client-cloudwatch-logs");var d="/tmp/.trivyignore",c=new s.CloudWatchLogsClient,w=async function(e){let t=e.RequestType,n=e.ResourceProperties;if(!n.addr||!n.imageUri)throw new Error("addr and imageUri are required.");let i={PhysicalResourceId:n.addr,Data:{}};if(t==="Create"||t==="Update"){let o=x(n);n.trivyIgnore.length&&(console.log("trivyignore: "+JSON.stringify(n.trivyIgnore)),R(n.trivyIgnore));let a=`/opt/trivy image --no-progress ${o.join(" ")} ${n.imageUri}`;console.log("command: "+a),console.log("imageUri: "+n.imageUri);let r=(0,l.spawnSync)(a,{shell:!0});if(await $(r,n.imageUri,n.output),r.status!==0)throw new Error(`Error: ${r.error}
2
- Signal: ${r.signal}
3
- Status: ${r.status}
4
- Image Scanner returned fatal errors. You may have vulnerabilities. See logs.`)}return i},x=e=>{let t=[];return e.ignoreUnfixed==="true"&&t.push("--ignore-unfixed"),e.severity.length&&t.push(`--severity ${e.severity.join(",")}`),e.scanners.length&&t.push(`--scanners ${e.scanners.join(",")}`),e.imageConfigScanners.length&&t.push(`--image-config-scanners ${e.imageConfigScanners.join(",")}`),e.exitCode&&t.push(`--exit-code ${e.exitCode}`),e.exitOnEol&&t.push(`--exit-on-eol ${e.exitOnEol}`),e.trivyIgnore.length&&t.push(`--ignorefile ${d}`),e.platform&&t.push(`--platform ${e.platform}`),t},R=e=>{let t=e.join(`
5
- `);(0,m.writeFileSync)(d,t,"utf-8")},$=async(e,t,n)=>{switch(n?.type){case"cloudWatchLogs":await v(e,n,t);break;default:console.log(`stderr:
1
+ "use strict";var g=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var h=(e,t)=>{for(var n in t)g(e,n,{get:t[n],enumerable:!0})},L=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of C(t))!O.call(e,r)&&r!==n&&g(e,r,{get:()=>t[r],enumerable:!(o=y(t,r))||o.enumerable});return e};var R=e=>L(g({},"__esModule",{value:!0}),e);var b={};h(b,{handler:()=>k});module.exports=R(b);var d=require("child_process"),p=require("fs"),a=require("@aws-sdk/client-cloudwatch-logs"),c=require("@aws-sdk/client-cloudformation");var S="/tmp/.trivyignore",m=new a.CloudWatchLogsClient,w=new c.CloudFormationClient,k=async function(e){let t=e.RequestType,n=e.ResourceProperties;if(!n.addr||!n.imageUri)throw new Error("addr and imageUri are required.");let o={PhysicalResourceId:n.addr,Data:{}};if(t==="Create"||t==="Update"){let r=$(n);n.trivyIgnore.length&&(console.log("trivyignore: "+JSON.stringify(n.trivyIgnore)),x(n.trivyIgnore));let i=`/opt/trivy image --no-progress ${r.join(" ")} ${n.imageUri}`;console.log("command: "+i),console.log("imageUri: "+n.imageUri);let s=(0,d.spawnSync)(i,{shell:!0});if(await E(s,n.imageUri,n.output),s.status===0)return o;let u=`Error: ${s.error}
2
+ Signal: ${s.signal}
3
+ Status: ${s.status}
4
+ Image Scanner returned fatal errors. You may have vulnerabilities. See logs.`;if(n.suppressErrorOnRollback==="true"&&await I(e.StackId))return console.log(`Vulnerabilities may be detected, but suppressing errors during rollback (suppressErrorOnRollback=true).
5
+ ${u}`),o;throw new Error(u)}return o},$=e=>{let t=[];return e.ignoreUnfixed==="true"&&t.push("--ignore-unfixed"),e.severity.length&&t.push(`--severity ${e.severity.join(",")}`),e.scanners.length&&t.push(`--scanners ${e.scanners.join(",")}`),e.imageConfigScanners.length&&t.push(`--image-config-scanners ${e.imageConfigScanners.join(",")}`),e.exitCode&&t.push(`--exit-code ${e.exitCode}`),e.exitOnEol&&t.push(`--exit-on-eol ${e.exitOnEol}`),e.trivyIgnore.length&&t.push(`--ignorefile ${S}`),e.platform&&t.push(`--platform ${e.platform}`),t},x=e=>{let t=e.join(`
6
+ `);(0,p.writeFileSync)(S,t,"utf-8")},E=async(e,t,n)=>{switch(n?.type){case"cloudWatchLogs":await v(e,n,t);break;default:console.log(`stderr:
6
7
  `+e.stderr.toString()),console.log(`stdout:
7
- `+e.stdout.toString())}},v=async(e,t,n)=>{let[i,o]=n.split(":"),a=o?`uri=${i},tag=${o}`:`uri=${i}`;try{await c.send(new s.CreateLogStreamCommand({logGroupName:t.logGroupName,logStreamName:a}))}catch(u){if(u instanceof s.ResourceAlreadyExistsException)console.log(`Log stream ${a} already exists in log group ${t.logGroupName}.`);else throw u}let r=new Date().getTime(),p={logGroupName:t.logGroupName,logStreamName:a,logEvents:[{timestamp:r,message:`stderr:
8
- `+e.stderr.toString()},{timestamp:r,message:`stdout:
9
- `+e.stdout.toString()}]},y=new s.PutLogEventsCommand(p);await c.send(y),console.log(`Scan logs output to the log group: ${t.logGroupName}, log stream: ${a}`)};0&&(module.exports={handler});
8
+ `+e.stdout.toString())}},v=async(e,t,n)=>{let[o,r]=n.split(":"),i=r?`uri=${o},tag=${r}`:`uri=${o}`;try{await m.send(new a.CreateLogStreamCommand({logGroupName:t.logGroupName,logStreamName:i}))}catch(l){if(l instanceof a.ResourceAlreadyExistsException)console.log(`Log stream ${i} already exists in log group ${t.logGroupName}.`);else throw l}let s=new Date().getTime(),u={logGroupName:t.logGroupName,logStreamName:i,logEvents:[{timestamp:s,message:`stderr:
9
+ `+e.stderr.toString()},{timestamp:s,message:`stdout:
10
+ `+e.stdout.toString()}]},f=new a.PutLogEventsCommand(u);await m.send(f),console.log(`Scan logs output to the log group: ${t.logGroupName}, log stream: ${i}`)},I=async e=>{let t=new c.DescribeStacksCommand({StackName:e}),n=await w.send(t);if(n.Stacks&&n.Stacks.length>0)return n.Stacks[0].StackStatus===c.ResourceStatus.ROLLBACK_IN_PROGRESS;throw new Error(`Stack not found or no stacks returned from DescribeStacks command, stackId: ${e}`)};0&&(module.exports={handler});
@@ -7,6 +7,11 @@ import {
7
7
  PutLogEventsCommandInput,
8
8
  ResourceAlreadyExistsException,
9
9
  } from '@aws-sdk/client-cloudwatch-logs';
10
+ import {
11
+ CloudFormationClient,
12
+ DescribeStacksCommand,
13
+ ResourceStatus,
14
+ } from '@aws-sdk/client-cloudformation';
10
15
  import { CdkCustomResourceHandler, CdkCustomResourceResponse } from 'aws-lambda';
11
16
  import {
12
17
  ScanLogsOutputOptions,
@@ -18,6 +23,7 @@ import {
18
23
  const TRIVY_IGNORE_FILE_PATH = '/tmp/.trivyignore';
19
24
 
20
25
  const cwClient = new CloudWatchLogsClient();
26
+ const cfnClient = new CloudFormationClient();
21
27
 
22
28
  export const handler: CdkCustomResourceHandler = async function (event) {
23
29
  const requestType = event.RequestType;
@@ -48,10 +54,18 @@ export const handler: CdkCustomResourceHandler = async function (event) {
48
54
 
49
55
  await outputScanLogs(response, props.imageUri, props.output);
50
56
 
51
- if (response.status !== 0)
52
- throw new Error(
53
- `Error: ${response.error}\nSignal: ${response.signal}\nStatus: ${response.status}\nImage Scanner returned fatal errors. You may have vulnerabilities. See logs.`,
57
+ if (response.status === 0) return funcResponse;
58
+
59
+ const errorMessage = `Error: ${response.error}\nSignal: ${response.signal}\nStatus: ${response.status}\nImage Scanner returned fatal errors. You may have vulnerabilities. See logs.`;
60
+
61
+ if (props.suppressErrorOnRollback === 'true' && (await isRollbackInProgress(event.StackId))) {
62
+ console.log(
63
+ `Vulnerabilities may be detected, but suppressing errors during rollback (suppressErrorOnRollback=true).\n${errorMessage}`,
54
64
  );
65
+ return funcResponse;
66
+ }
67
+
68
+ throw new Error(errorMessage);
55
69
  }
56
70
 
57
71
  return funcResponse;
@@ -145,3 +159,19 @@ const outputScanLogsToCWLogs = async (
145
159
  `Scan logs output to the log group: ${output.logGroupName}, log stream: ${logStreamName}`,
146
160
  );
147
161
  };
162
+
163
+ const isRollbackInProgress = async (stackId: string): Promise<boolean> => {
164
+ const command = new DescribeStacksCommand({
165
+ StackName: stackId,
166
+ });
167
+ const response = await cfnClient.send(command);
168
+
169
+ if (response.Stacks && response.Stacks.length > 0) {
170
+ const stackStatus = response.Stacks[0].StackStatus;
171
+ return stackStatus === ResourceStatus.ROLLBACK_IN_PROGRESS;
172
+ }
173
+
174
+ throw new Error(
175
+ `Stack not found or no stacks returned from DescribeStacks command, stackId: ${stackId}`,
176
+ );
177
+ };
@@ -236,6 +236,20 @@ export interface ImageScannerWithTrivyProps {
236
236
  * @default - scan logs output to default log group created by Scanner Lambda(`/aws/lambda/${functionName}`)
237
237
  */
238
238
  readonly scanLogsOutput?: ScanLogsOutput;
239
+ /**
240
+ * Suppress errors during rollback scanner Lambda execution
241
+ *
242
+ * When image scanning fails, CloudFormation triggers a rollback and executes the previous
243
+ * version of the scanner Lambda. If this property is set to `true`, the previous version of
244
+ * the scanner Lambda will not throw an error, even if the image scanning for the previous version
245
+ * fails.
246
+ *
247
+ * This allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state
248
+ * when image scanning failures occur.
249
+ *
250
+ * @default true
251
+ */
252
+ readonly suppressErrorOnRollback?: boolean;
239
253
  }
240
254
  export declare class ImageScannerWithTrivy extends Construct {
241
255
  constructor(scope: Construct, id: string, props: ImageScannerWithTrivyProps);
@@ -59,7 +59,7 @@ class ScanLogsOutput {
59
59
  }
60
60
  exports.ScanLogsOutput = ScanLogsOutput;
61
61
  _a = JSII_RTTI_SYMBOL_1;
62
- ScanLogsOutput[_a] = { fqn: "image-scanner-with-trivy.ScanLogsOutput", version: "2.0.0" };
62
+ ScanLogsOutput[_a] = { fqn: "image-scanner-with-trivy.ScanLogsOutput", version: "2.1.1" };
63
63
  class CloudWatchLogsOutput extends ScanLogsOutput {
64
64
  constructor(options) {
65
65
  super();
@@ -125,6 +125,7 @@ class ImageScannerWithTrivy extends constructs_1.Construct {
125
125
  trivyIgnore: props.trivyIgnore ?? [],
126
126
  platform: props.platform ?? '',
127
127
  output: props.scanLogsOutput?.bind(customResourceLambda),
128
+ suppressErrorOnRollback: String(props.suppressErrorOnRollback ?? true),
128
129
  };
129
130
  new aws_cdk_lib_1.CustomResource(this, 'Resource', {
130
131
  resourceType: 'Custom::ImageScannerWithTrivy',
@@ -181,5 +182,5 @@ class ImageScannerWithTrivy extends constructs_1.Construct {
181
182
  }
182
183
  exports.ImageScannerWithTrivy = ImageScannerWithTrivy;
183
184
  _b = JSII_RTTI_SYMBOL_1;
184
- ImageScannerWithTrivy[_b] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivy", version: "2.0.0" };
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utc2Nhbm5lci13aXRoLXRyaXZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltYWdlLXNjYW5uZXItd2l0aC10cml2eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtCQUE0QjtBQUM1Qiw2Q0FTcUI7QUFFckIsK0RBQXNEO0FBRXRELHVEQU1nQztBQUNoQyxtREFBdUY7QUFDdkYsbUVBQXdEO0FBQ3hELDJDQUF1QztBQUN2QyxtQ0FLaUI7QUFFakI7Ozs7R0FJRztBQUNILElBQVksUUFNWDtBQU5ELFdBQVksUUFBUTtJQUNsQiwrQkFBbUIsQ0FBQTtJQUNuQix1QkFBVyxDQUFBO0lBQ1gsNkJBQWlCLENBQUE7SUFDakIseUJBQWEsQ0FBQTtJQUNiLGlDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFOVyxRQUFRLHdCQUFSLFFBQVEsUUFNbkI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxRQUtYO0FBTEQsV0FBWSxRQUFRO0lBQ2xCLHlCQUFhLENBQUE7SUFDYiw2QkFBaUIsQ0FBQTtJQUNqQiw2QkFBaUIsQ0FBQTtJQUNqQiwrQkFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsUUFBUSx3QkFBUixRQUFRLFFBS25CO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksbUJBR1g7QUFIRCxXQUFZLG1CQUFtQjtJQUM3Qix3Q0FBaUIsQ0FBQTtJQUNqQix3Q0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBSFcsbUJBQW1CLG1DQUFuQixtQkFBbUIsUUFHOUI7QUFZRDs7R0FFRztBQUNILE1BQXNCLGNBQWM7SUFDbEM7O09BRUc7SUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQWtDO1FBQzdELE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDOztBQU5ILHdDQVlDOzs7QUFFRCxNQUFNLG9CQUFxQixTQUFRLGNBQWM7SUFNL0MsWUFBWSxPQUFrQztRQUM1QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElB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SyxTQUFTLENBQUM7WUFDdEM7Z0JBQ0UsT0FBTyxhQUE2QixDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDOztBQS9JSCxzREFnSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBBbm5vdGF0aW9ucyxcbiAgQ2ZuRGVsZXRpb25Qb2xpY3ksXG4gIEN1c3RvbVJlc291cmNlLFxuICBEdXJhdGlvbixcbiAgUmVtb3ZhbFBvbGljeSxcbiAgU2l6ZSxcbiAgU3RhY2ssXG4gIFRva2VuLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyLWFzc2V0cyc7XG5pbXBvcnQgeyBJR3JhbnRhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQge1xuICBBcmNoaXRlY3R1cmUsXG4gIEFzc2V0Q29kZSxcbiAgSGFuZGxlcixcbiAgUnVudGltZSxcbiAgU2luZ2xldG9uRnVuY3Rpb24sXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ2ZuTG9nR3JvdXAsIElMb2dHcm91cCwgTG9nR3JvdXAsIFJldGVudGlvbkRheXMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBDbG91ZFdhdGNoTG9nc091dHB1dE9wdGlvbnMsXG4gIFNjYW5Mb2dzT3V0cHV0T3B0aW9ucyxcbiAgU2NhbkxvZ3NPdXRwdXRUeXBlLFxuICBTY2FubmVyQ3VzdG9tUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRW51bSBmb3IgU2V2ZXJpdHkgU2VsZWN0aW9uXG4gKlxuICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3Mvc2Nhbm5lci92dWxuZXJhYmlsaXR5LyNzZXZlcml0eS1zZWxlY3Rpb25cbiAqL1xuZXhwb3J0IGVudW0gU2V2ZXJpdHkge1xuICBVTktOT1dOID0gJ1VOS05PV04nLFxuICBMT1cgPSAnTE9XJyxcbiAgTUVESVVNID0gJ01FRElVTScsXG4gIEhJR0ggPSAnSElHSCcsXG4gIENSSVRJQ0FMID0gJ0NSSVRJQ0FMJyxcbn1cblxuLyoqXG4gKiBFbnVtIGZvciBTY2FubmVyc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vb3RoZXJzLyNlbmFibGVkaXNhYmxlLXNjYW5uZXJzXG4gKi9cbmV4cG9ydCBlbnVtIFNjYW5uZXJzIHtcbiAgVlVMTiA9ICd2dWxuJyxcbiAgQ09ORklHID0gJ2NvbmZpZycsXG4gIFNFQ1JFVCA9ICdzZWNyZXQnLFxuICBMSUNFTlNFID0gJ2xpY2Vuc2UnLFxufVxuXG4vKipcbiAqIEVudW0gZm9yIEltYWdlQ29uZmlnU2Nhbm5lcnNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy90YXJnZXQvY29udGFpbmVyX2ltYWdlLyNjb250YWluZXItaW1hZ2UtbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGVudW0gSW1hZ2VDb25maWdTY2FubmVycyB7XG4gIENPTkZJRyA9ICdjb25maWcnLFxuICBTRUNSRVQgPSAnc2VjcmV0Jyxcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzY2FuIGxvZ3Mgb3V0cHV0IHRvIENsb3VkV2F0Y2ggTG9ncyBsb2cgZ3JvdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRXYXRjaExvZ3NPdXRwdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbG9nIGdyb3VwIHRvIG91dHB1dCBzY2FuIGxvZ3MuXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cDogSUxvZ0dyb3VwO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIG91dHB1dCBvZiB0aGUgc2NhbiBsb2dzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2NhbkxvZ3NPdXRwdXQge1xuICAvKipcbiAgICogU2NhbiBsb2dzIG91dHB1dCB0byBDbG91ZFdhdGNoIExvZ3MgbG9nIGdyb3VwLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbG91ZFdhdGNoTG9ncyhvcHRpb25zOiBDbG91ZFdhdGNoTG9nc091dHB1dFByb3BzKTogU2NhbkxvZ3NPdXRwdXQge1xuICAgIHJldHVybiBuZXcgQ2xvdWRXYXRjaExvZ3NPdXRwdXQob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24gZm9yIHNjYW4gbG9ncy5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBiaW5kKGdyYW50ZWU6IElHcmFudGFibGUpOiBTY2FuTG9nc091dHB1dE9wdGlvbnM7XG59XG5cbmNsYXNzIENsb3VkV2F0Y2hMb2dzT3V0cHV0IGV4dGVuZHMgU2NhbkxvZ3NPdXRwdXQge1xuICAvKipcbiAgICogVGhlIGxvZyBncm91cCB0byBvdXRwdXQgc2NhbiBsb2dzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dHcm91cDogSUxvZ0dyb3VwO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENsb3VkV2F0Y2hMb2dzT3V0cHV0UHJvcHMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5sb2dHcm91cCA9IG9wdGlvbnMubG9nR3JvdXA7XG4gIH1cblxuICBwdWJsaWMgYmluZChncmFudGVlOiBJR3JhbnRhYmxlKTogQ2xvdWRXYXRjaExvZ3NPdXRwdXRPcHRpb25zIHtcbiAgICAvLyBNb3N0IExhbWJkYXMgYXJlIGdyYW50ZWQgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGFuZCBjYW4gd3JpdGUgdG8gYW55IENsb3VkV2F0Y2ggTG9ncy5cbiAgICAvLyBIb3dldmVyLCBqdXN0IGluIGNhc2UgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGlzIG5vdCBncmFudGVkLCBhbGxvdyB3cml0aW5nIHRvIENsb3VkV2F0Y2ggTG9ncy5cbiAgICB0aGlzLmxvZ0dyb3VwLmdyYW50V3JpdGUoZ3JhbnRlZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogU2NhbkxvZ3NPdXRwdXRUeXBlLkNMT1VEV0FUQ0hfTE9HUyxcbiAgICAgIGxvZ0dyb3VwTmFtZTogdGhpcy5sb2dHcm91cC5sb2dHcm91cE5hbWUsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlU2Nhbm5lcldpdGhUcml2eVByb3BzIHtcbiAgLyoqXG4gICAqIEltYWdlIFVSSSBmb3Igc2NhbiB0YXJnZXQuXG4gICAqL1xuICByZWFkb25seSBpbWFnZVVyaTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXBvc2l0b3J5IGluY2x1ZGluZyB0aGUgaW1hZ2UgVVJJIGZvciBzY2FuIHRhcmdldC5cbiAgICpcbiAgICogQmVjYXVzZSBvZiBncmFudFB1bGwgdG8gQ3VzdG9tUmVzb3VyY2VMYW1iZGEuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5OiBJUmVwb3NpdG9yeTtcblxuICAvKipcbiAgICogVGhlIHVuZml4ZWQvdW5maXhhYmxlIHZ1bG5lcmFiaWxpdGllcyBtZWFuIHRoYXQgdGhlIHBhdGNoIGhhcyBub3QgeWV0IGJlZW4gcHJvdmlkZWQgb24gdGhlaXIgZGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBUbyBoaWRlIHVuZml4ZWQvdW5maXhhYmxlIHZ1bG5lcmFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGAtLWlnbm9yZS11bmZpeGVkYCBmbGFnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy9zY2FubmVyL3Z1bG5lcmFiaWxpdHkvI3VuZml4ZWQtdnVsbmVyYWJpbGl0aWVzXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVVbmZpeGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V2ZXJpdHkgU2VsZWN0aW9uXG4gICAqXG4gICAqIFRoZSBzZXZlcml0eSBpcyB0YWtlbiBmcm9tIHRoZSBzZWxlY3RlZCBkYXRhIHNvdXJjZSBzaW5jZSB0aGUgc2V2ZXJpdHkgZnJvbSB2ZW5kb3JzIGlzIG1vcmUgYWNjdXJhdGUuXG4gICAqIFVzaW5nIENWRS0yMDIzLTA0NjQgYXMgYW4gZXhhbXBsZSwgd2hpbGUgaXQgaXMgcmF0ZWQgYXMgXCJISUdIXCIgaW4gTlZELCBSZWQgSGF0IGhhcyBtYXJrZWQgaXRzICdJbXBhY3QnIGFzIFwiTG93XCIuIEFzIGEgcmVzdWx0LCBUcml2eSB3aWxsIGRpc3BsYXkgaXQgYXMgXCJMb3dcIi5cbiAgICpcbiAgICogVGhlIHNldmVyaXR5IGRlcGVuZHMgb24gdGhlIGNvbXBpbGUgb3B0aW9uLCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBldGMuIE5WRCBkb2Vzbid0IGtub3cgaG93IHRoZSB2ZW5kb3IgZGlzdHJpYnV0ZXMgdGhlIHNvZnR3YXJlLlxuICAgKiBSZWQgSGF0IGV2YWx1YXRlcyB0aGUgc2V2ZXJpdHkgbW9yZSBhY2N1cmF0ZWx5LiBUaGF0J3Mgd2h5IFRyaXZ5IHByZWZlcnMgdmVuZG9yIHNjb3JlcyBvdmVyIE5WRC5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gYENSSVRJQ0FMYCBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELCBidXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBUcml2eSBpcyBcIkNSSVRJQ0FMLEhJR0gsTUVESVVNLExPVyxVTktOT1dOXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtTZXZlcml0eS5DUklUSUNBTF1cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3Mvc2Nhbm5lci92dWxuZXJhYmlsaXR5LyNzZXZlcml0eS1zZWxlY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IHNldmVyaXR5PzogU2V2ZXJpdHlbXTtcblxuICAvKipcbiAgICogRW5hYmxlL0Rpc2FibGUgU2Nhbm5lcnNcbiAgICpcbiAgICogWW91IGNhbiBlbmFibGUvZGlzYWJsZSBzY2FubmVycyB3aXRoIHRoZSBgc2Nhbm5lcnNgLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgY29udGFpbmVyIGltYWdlIHNjYW5uaW5nIGVuYWJsZXMgdnVsbmVyYWJpbGl0eSAoVlVMTikgYW5kIHNlY3JldCBzY2FubmVycyAoU0VDUkVUKSBieSBkZWZhdWx0LlxuICAgKiBJZiB5b3UgZG9uJ3QgbmVlZCBzZWNyZXQgc2Nhbm5pbmcsIGl0IGNhbiBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIFNjYW5uZXJzLlZVTE4gb25seS5cbiAgICpcbiAgICogQGRlZmF1bHQgW1NlY3VyaXR5LlZVTE4sU2Nhbm5lcnMuU0VDUkVUXVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy9jb25maWd1cmF0aW9uL290aGVycy8jZW5hYmxlZGlzYWJsZS1zY2FubmVyc1xuICAgKi9cbiAgcmVhZG9ubHkgc2Nhbm5lcnM/OiBTY2FubmVyc1tdO1xuXG4gIC8qKlxuICAgKiBFbnVtIGZvciBJbWFnZUNvbmZpZ1NjYW5uZXJzXG4gICAqXG4gICAqIENvbnRhaW5lciBpbWFnZXMgaGF2ZSBjb25maWd1cmF0aW9uLiBkb2NrZXIgaW5zcGVjdCBhbmQgYGRvY2tlciBoaXN0b3J5YCBzaG93IHRoZSBpbmZvcm1hdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqIFRyaXZ5IHNjYW5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGNvbnRhaW5lciBpbWFnZXMgZm9yXG4gICAqXG4gICAqIC0gTWlzY29uZmlndXJhdGlvbnNcbiAgICogLSBTZWNyZXRzXG4gICAqXG4gICAqIFRoZXkgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFlvdSBjYW4gZW5hYmxlIHRoZW0gd2l0aCBgaW1hZ2VDb25maWdTY2FubmVyc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL3RhcmdldC9jb250YWluZXJfaW1hZ2UvI2NvbnRhaW5lci1pbWFnZS1tZXRhZGF0YVxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VDb25maWdTY2FubmVycz86IEltYWdlQ29uZmlnU2Nhbm5lcnNbXTtcblxuICAvKipcbiAgICogRXhpdCBDb2RlXG4gICAqXG4gICAqIFVzZSB0aGUgYGV4aXRDb2RlYCBvcHRpb24gaWYgeW91IHdhbnQgdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlLlxuICAgKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgMCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gZXhpdCBldmVuIHdoZW4gdnVsbmVyYWJpbGl0aWVzIGFyZSBkZXRlY3RlZC5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gMSBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELiBJbiB0aGUgb3JpZ2luYWwgdHJpdnksIGl0IGlzIDAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9vdGhlcnMvI2V4aXQtY29kZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdENvZGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEV4aXQgb24gRU9MXG4gICAqXG4gICAqIFNvbWV0aW1lcyB5b3UgbWF5IHN1cnByaXNpbmdseSBnZXQgMCB2dWxuZXJhYmlsaXRpZXMgaW4gYW4gb2xkIGltYWdlOlxuICAgKiAgLSBFbmFibGluZyAtLWlnbm9yZS11bmZpeGVkIG9wdGlvbiB3aGlsZSBhbGwgcGFja2FnZXMgaGF2ZSBubyBmaXhlZCB2ZXJzaW9ucy5cbiAgICogIC0gU2Nhbm5pbmcgYSByYXRoZXIgb3V0ZGF0ZWQgT1MgKGUuZy4gVWJ1bnR1IDEwLjA0KS5cbiAgICpcbiAgICogQW4gT1MgYXQgdGhlIGVuZCBvZiBzZXJ2aWNlL2xpZmUgKEVPTCkgdXN1YWxseSBnZXRzIGludG8gdGhpcyBzaXR1YXRpb24sIHdoaWNoIGlzIGRlZmluaXRlbHkgZnVsbCBvZiB2dWxuZXJhYmlsaXRpZXMuXG4gICAqIGBleGl0T25Fb2xgIGNhbiBmYWlsIHNjYW5uaW5nIG9uIEVPTCBPUyB3aXRoIGEgbm9uLXplcm8gY29kZS5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gMSBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELiBJbiB0aGUgb3JpZ2luYWwgdHJpdnksIGl0IGlzIDAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9vdGhlcnMvI2V4aXQtb24tZW9sXG4gICAqL1xuICByZWFkb25seSBleGl0T25Fb2w/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJ5IEZpbmRpbmcgSURzXG4gICAqXG4gICAqIFRoZSBpZ25vcmUgcnVsZXMgd3JpdHRlbiB0byB0aGUgLnRyaXZ5aWdub3JlIGluIHRyaXZ5LlxuICAgKiBQdXQgZWFjaCBsaW5lIHlvdSB3cml0ZSBpbiB0aGUgZmlsZSBpbnRvIG9uZSBlbGVtZW50IG9mIHRoZSBhcnJheS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogICAgICQgY2F0IC50cml2eWlnbm9yZVxuICAgKiAgICAgIyBBY2NlcHQgdGhlIHJpc2tcbiAgICogICAgIENWRS0yMDE4LTE0NjE4XG4gICAqXG4gICAqICAgICAjIEFjY2VwdCB0aGUgcmlzayB1bnRpbCAyMDIzLTAxLTAxXG4gICAqICAgICBDVkUtMjAxOS0xNDY5NyBleHA6MjAyMy0wMS0wMVxuICAgKlxuICAgKiAgICAgIyBObyBpbXBhY3QgaW4gb3VyIHNldHRpbmdzXG4gICAqICAgICBDVkUtMjAxOS0xNTQzXG4gICAqXG4gICAqICAgICAjIElnbm9yZSBtaXNjb25maWd1cmF0aW9uc1xuICAgKiAgICAgQVZELURTLTAwMDJcbiAgICpcbiAgICogICAgICMgSWdub3JlIHNlY3JldHNcbiAgICogICAgIGdlbmVyaWMtdW53YW50ZWQtcnVsZVxuICAgKiAgICAgYXdzLWFjY291bnQtaWRcbiAgICpcbiAgICogQGRlZmF1bHQgW11cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9maWx0ZXJpbmcvI3RyaXZ5aWdub3JlXG4gICAqL1xuICByZWFkb25seSB0cml2eUlnbm9yZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZW1vcnkgU2l6ZSAoTUIpIGZvciBTY2FubmVyIExhbWJkYVxuICAgKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgYmV0d2VlbiBgMzAwOGAgYW5kIGAxMDI0MGAuXG4gICAqXG4gICAqIElmIHRoaXMgQ29uc3RydWN0IGV4ZWN1dGlvbiB0ZXJtaW5hdGVzIGFibm9ybWFsbHkgZHVlIHRvIFNJR0tJTEwsIHRyeSBhIGxhcmdlciBzaXplLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlIChgMzAwOGAgTUIpIGlzIE1heGltdW0gTGFtYmRhIG1lbW9yeSBzaXplIGZvciBkZWZhdWx0IEFXUyBhY2NvdW50IHdpdGhvdXQgcXVvdGEgbGltaXQgaW5jcmVhc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IDMwMDhcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNjYW4gSW1hZ2Ugb24gYSBzcGVjaWZpYyBBcmNoaXRlY3R1cmUgYW5kIE9TXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIFRyaXZ5IGxvYWRzIGFuIGltYWdlIG9uIGEgYGxpbnV4L2FtZDY0YCBtYWNoaW5lLlxuICAgKlxuICAgKiBUbyBjdXN0b21pemUgdGhpcywgcGFzcyBhIGBwbGF0Zm9ybWAgYXJndW1lbnQgaW4gdGhlIGZvcm1hdCBPUy9BcmNoaXRlY3R1cmUgZm9yIHRoZSBpbWFnZSwgc3VjaCBhcyBgbGludXgvYXJtNjRgXG4gICAqXG4gICAqIEBkZWZhdWx0IC1cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZhbCBwb2xpY3kgdG8gYXBwbHkgdG8gU2Nhbm5lciBMYW1iZGEncyBkZWZhdWx0IGxvZyBncm91cFxuICAgKlxuICAgKiBJZiB5b3UgdXNlIEltYWdlU2Nhbm5lcldpdGhUcml2eSBjb25zdHJ1Y3QgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgc3RhY2ssIHlvdSBjYW5ub3Qgc2V0IGRpZmZlcmVudCByZW1vdmFsIHBvbGljaWVzIGZvciB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqIFNlZSBgTm90ZXNgIHNlY3Rpb24gaW4gdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNjYW5uZXIgTGFtYmRhIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKS5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRMb2dHcm91cFJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgbG9nIGV2ZW50cyBhcmUga2VwdCBpbiBTY2FubmVyIExhbWJkYSdzIGRlZmF1bHQgbG9nIGdyb3VwXG4gICAqXG4gICAqIElmIHlvdSB1c2UgSW1hZ2VTY2FubmVyV2l0aFRyaXZ5IGNvbnN0cnVjdCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBzdGFjaywgeW91IGNhbm5vdCBzZXQgZGlmZmVyZW50IHJldGVudGlvbiBkYXlzIGZvciB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqIFNlZSBgTm90ZXNgIHNlY3Rpb24gaW4gdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNjYW5uZXIgTGFtYmRhIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKSBhbmQgbG9nIGV2ZW50cyBuZXZlciBleHBpcmUuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzPzogUmV0ZW50aW9uRGF5cztcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3Igc2NhbiBsb2dzIG91dHB1dFxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzY2FuIGxvZ3MgYXJlIG91dHB1dCB0byBkZWZhdWx0IGxvZyBncm91cCBjcmVhdGVkIGJ5IFNjYW5uZXIgTGFtYmRhLlxuICAgKlxuICAgKiBTcGVjaWZ5IHRoaXMgaWYgeW91IHdhbnQgdG8gc2VuZCBzY2FuIGxvZ3MgdG8gb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqXG4gICAqIEN1cnJlbnRseSwgb25seSBgY2xvdWRXYXRjaExvZ3NgIGlzIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzY2FuIGxvZ3Mgb3V0cHV0IHRvIGRlZmF1bHQgbG9nIGdyb3VwIGNyZWF0ZWQgYnkgU2Nhbm5lciBMYW1iZGEoYC9hd3MvbGFtYmRhLyR7ZnVuY3Rpb25OYW1lfWApXG4gICAqL1xuICByZWFkb25seSBzY2FuTG9nc091dHB1dD86IFNjYW5Mb2dzT3V0cHV0O1xufVxuXG4vLyBNYXhpbXVtIExhbWJkYSBtZW1vcnkgc2l6ZSBmb3IgZGVmYXVsdCBBV1MgYWNjb3VudCB3aXRob3V0IHF1b3RhIGxpbWl0IGluY3JlYXNlXG5jb25zdCBERUZBVUxUX01FTU9SWV9TSVpFID0gMzAwODtcblxuZXhwb3J0IGNsYXNzIEltYWdlU2Nhbm5lcldpdGhUcml2eSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbWFnZVNjYW5uZXJXaXRoVHJpdnlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy5tZW1vcnlTaXplICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1lbW9yeVNpemUpICYmXG4gICAgICAocHJvcHMubWVtb3J5U2l6ZSA8IDMwMDggfHwgcHJvcHMubWVtb3J5U2l6ZSA+IDEwMjQwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IGNhbiBzcGVjaWZ5IGJldHdlZW4gXFxgMzAwOFxcYCBhbmQgXFxgMTAyNDBcXGAgZm9yIFxcYG1lbW9yeVNpemVcXGAsIGdvdCAke3Byb3BzLm1lbW9yeVNpemV9LmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGxhbWJkYVB1cnBvc2UgPSAnQ3VzdG9tOjpJbWFnZVNjYW5uZXJXaXRoVHJpdnlDdXN0b21SZXNvdXJjZUxhbWJkYSc7XG4gICAgY29uc3QgY3VzdG9tUmVzb3VyY2VMYW1iZGEgPSBuZXcgU2luZ2xldG9uRnVuY3Rpb24odGhpcywgJ0N1c3RvbVJlc291cmNlTGFtYmRhJywge1xuICAgICAgdXVpZDogJzQ3MGI2MzQzLWQyNjctZjc1My0yMjZjLTFlOTlmMDlmMzE5YScsXG4gICAgICBsYW1iZGFQdXJwb3NlLFxuICAgICAgcnVudGltZTogUnVudGltZS5GUk9NX0lNQUdFLFxuICAgICAgaGFuZGxlcjogSGFuZGxlci5GUk9NX0lNQUdFLFxuICAgICAgY29kZTogQXNzZXRDb2RlLmZyb21Bc3NldEltYWdlKGpvaW4oX19kaXJuYW1lLCAnLi4vYXNzZXRzL2xhbWJkYScpLCB7XG4gICAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5MSU5VWF9BUk02NCxcbiAgICAgICAgLy8gZXhjbHVkZSBub2RlX21vZHVsZXNcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgbmF0aXZlIGJpbmFyeSBvZiB0aGUgaW5zdGFsbGVkIGVzYnVpbGQgY2hhbmdlcyBkZXBlbmRpbmcgb24gdGhlIGNwdSBhcmNoaXRlY3R1cmVcbiAgICAgICAgLy8gYW5kIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBpbWFnZSBhc3NldCBjaGFuZ2VzIGRlcGVuZGluZyBvbiB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICAgICAgICBleGNsdWRlOiBbJ25vZGVfbW9kdWxlcyddLFxuICAgICAgfSksXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDkwMCksXG4gICAgICByZXRyeUF0dGVtcHRzOiAwLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSA/PyBERUZBVUxUX01FTU9SWV9TSVpFLFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZVNpemU6IFNpemUuZ2liaWJ5dGVzKDEwKSwgLy8gZm9yIGNhc2VzIHRoYXQgbmVlZCB0byB1cGRhdGUgdHJpdnkgREI6IC90bXAvdHJpdnkvZGIvdHJpdnkuZGJcbiAgICB9KTtcbiAgICBwcm9wcy5yZXBvc2l0b3J5LmdyYW50UHVsbChjdXN0b21SZXNvdXJjZUxhbWJkYSk7XG5cbiAgICBjb25zdCBjdXN0b21SZXNvdXJjZUxhbWJkYUxvZ0dyb3VwQ29uc3RydWN0TmFtZSA9IGBEZWZhdWx0TG9nR3JvdXBGb3Ike2xhbWJkYVB1cnBvc2V9YDtcblxuICAgIHRoaXMudmFsaWRhdGVMYW1iZGFEZWZhdWx0TG9nR3JvdXBPcHRpb25zKGN1c3RvbVJlc291cmNlTGFtYmRhTG9nR3JvdXBDb25zdHJ1Y3ROYW1lLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeSB8fCBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzKSB7XG4gICAgICB0aGlzLmVuc3VyZUxhbWJkYURlZmF1bHRMb2dHcm91cChcbiAgICAgICAgY3VzdG9tUmVzb3VyY2VMYW1iZGEsXG4gICAgICAgIGN1c3RvbVJlc291cmNlTGFtYmRhTG9nR3JvdXBDb25zdHJ1Y3ROYW1lLFxuICAgICAgICBwcm9wcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1hZ2VTY2FubmVyUHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgJ1Byb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IGN1c3RvbVJlc291cmNlTGFtYmRhLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW1hZ2VTY2FubmVyUHJvcGVydGllczogU2Nhbm5lckN1c3RvbVJlc291cmNlUHJvcHMgPSB7XG4gICAgICBhZGRyOiB0aGlzLm5vZGUuYWRkcixcbiAgICAgIGltYWdlVXJpOiBwcm9wcy5pbWFnZVVyaSxcbiAgICAgIGlnbm9yZVVuZml4ZWQ6IFN0cmluZyhwcm9wcy5pZ25vcmVVbmZpeGVkID8/IGZhbHNlKSxcbiAgICAgIHNldmVyaXR5OiBwcm9wcy5zZXZlcml0eSA/PyBbU2V2ZXJpdHkuQ1JJVElDQUxdLFxuICAgICAgc2Nhbm5lcnM6IHByb3BzLnNjYW5uZXJzID8/IFtdLFxuICAgICAgaW1hZ2VDb25maWdTY2FubmVyczogcHJvcHMuaW1hZ2VDb25maWdTY2FubmVycyA/PyBbXSxcbiAgICAgIGV4aXRDb2RlOiBwcm9wcy5leGl0Q29kZSA/PyAxLFxuICAgICAgZXhpdE9uRW9sOiBwcm9wcy5leGl0T25Fb2wgPz8gMSxcbiAgICAgIHRyaXZ5SWdub3JlOiBwcm9wcy50cml2eUlnbm9yZSA/PyBbXSxcbiAgICAgIHBsYXRmb3JtOiBwcm9wcy5wbGF0Zm9ybSA/PyAnJyxcbiAgICAgIG91dHB1dDogcHJvcHMuc2NhbkxvZ3NPdXRwdXQ/LmJpbmQoY3VzdG9tUmVzb3VyY2VMYW1iZGEpLFxuICAgIH07XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpJbWFnZVNjYW5uZXJXaXRoVHJpdnknLFxuICAgICAgcHJvcGVydGllczogaW1hZ2VTY2FubmVyUHJvcGVydGllcyxcbiAgICAgIHNlcnZpY2VUb2tlbjogaW1hZ2VTY2FubmVyUHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHNwZWNpZmllZCBkZWZhdWx0IGxvZyBncm91cCBvcHRpb25zIGFyZSB0aGUgc2FtZSBmb3IgZXhpc3RpbmcgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTGFtYmRhRGVmYXVsdExvZ0dyb3VwT3B0aW9ucyhcbiAgICBsb2dHcm91cENvbnN0cnVjdE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSW1hZ2VTY2FubmVyV2l0aFRyaXZ5UHJvcHMsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gU3RhY2sub2YodGhpcykubm9kZS50cnlGaW5kQ2hpbGQobG9nR3JvdXBDb25zdHJ1Y3ROYW1lKSBhc1xuICAgICAgfCBMb2dHcm91cFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFleGlzdGluZykgcmV0dXJuO1xuXG4gICAgY29uc3QgY2ZuTG9nR3JvdXAgPSBleGlzdGluZy5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5Mb2dHcm91cDtcblxuICAgIGlmIChcbiAgICAgICF0aGlzLmlzU2FtZVJlc291cmNlRGVsZXRpb25CZWhhdmlvcihcbiAgICAgICAgcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeSxcbiAgICAgICAgY2ZuTG9nR3JvdXAuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSxcbiAgICAgICkgfHxcbiAgICAgIGNmbkxvZ0dyb3VwLnJldGVudGlvbkluRGF5cyAhPT0gcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmV0ZW50aW9uRGF5c1xuICAgICkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQGltYWdlLXNjYW5uZXItd2l0aC10cml2eTpkdXBsaWNhdGVMYW1iZGFEZWZhdWx0TG9nR3JvdXBPcHRpb25zJyxcbiAgICAgICAgXCJZb3UgaGF2ZSB0byBzZXQgdGhlIHNhbWUgdmFsdWVzIGZvciAnZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeScgYW5kICdkZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzJyBmb3IgZWFjaCBJbWFnZVNjYW5uZXJXaXRoVHJpdnkgY29uc3RydWN0IGluIHRoZSBzYW1lIHN0YWNrLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAgZm9yIFNjYW5uZXIgTGFtYmRhIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIGRlZmF1bHQgbG9nIGdyb3VwIGZvciBTY2FubmVyIExhbWJkYSBleGlzdHMgaW4gY2hpbGRyZW4gb2YgdGhlIHN0YWNrIGNvbnN0cnVjdC5cbiAgICogSWYgaXQgZG9lcyBub3QgZXhpc3QsIGl0IGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwIGZvciBTY2FubmVyIExhbWJkYSBhcyBhIGNoaWxkIG9mIHRoZSBzdGFjayBjb25zdHJ1Y3QuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUxhbWJkYURlZmF1bHRMb2dHcm91cChcbiAgICBzaW5nbGV0b25GdW5jdGlvbjogU2luZ2xldG9uRnVuY3Rpb24sXG4gICAgbG9nR3JvdXBDb25zdHJ1Y3ROYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEltYWdlU2Nhbm5lcldpdGhUcml2eVByb3BzLFxuICApOiBMb2dHcm91cCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBTdGFjay5vZih0aGlzKS5ub2RlLnRyeUZpbmRDaGlsZChsb2dHcm91cENvbnN0cnVjdE5hbWUpIGFzXG4gICAgICB8IExvZ0dyb3VwXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExvZ0dyb3VwKFN0YWNrLm9mKHRoaXMpLCBsb2dHcm91cENvbnN0cnVjdE5hbWUsIHtcbiAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7c2luZ2xldG9uRnVuY3Rpb24uZnVuY3Rpb25OYW1lfWAsXG4gICAgICByZXRlbnRpb246IHByb3BzLmRlZmF1bHRMb2dHcm91cFJldGVudGlvbkRheXMsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVSZXNvdXJjZURlbGV0aW9uQmVoYXZpb3IoXG4gICAgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3ksXG4gICAgZGVsZXRpb25Qb2xpY3k/OiBDZm5EZWxldGlvblBvbGljeSxcbiAgKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChyZW1vdmFsUG9saWN5KSB7XG4gICAgICBjYXNlIFJlbW92YWxQb2xpY3kuREVTVFJPWTpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG4gICAgICBjYXNlIFJlbW92YWxQb2xpY3kuUkVUQUlOOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IENmbkRlbGV0aW9uUG9saWN5LlJFVEFJTjtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5TTkFQU0hPVDpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5TTkFQU0hPVDtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5SRVRBSU5fT05fVVBEQVRFX09SX0RFTEVURTpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5SRVRBSU5fRVhDRVBUX09OX0NSRUFURTtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IHVuZGVmaW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiByZW1vdmFsUG9saWN5IHNhdGlzZmllcyBuZXZlcjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
185
+ ImageScannerWithTrivy[_b] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivy", version: "2.1.1" };
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utc2Nhbm5lci13aXRoLXRyaXZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltYWdlLXNjYW5uZXItd2l0aC10cml2eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtCQUE0QjtBQUM1Qiw2Q0FTcUI7QUFFckIsK0RBQXNEO0FBRXRELHVEQU1nQztBQUNoQyxtREFBdUY7QUFDdkYsbUVBQXdEO0FBQ3hELDJDQUF1QztBQUN2QyxtQ0FLaUI7QUFFakI7Ozs7R0FJRztBQUNILElBQVksUUFNWDtBQU5ELFdBQVksUUFBUTtJQUNsQiwrQkFBbUIsQ0FBQTtJQUNuQix1QkFBVyxDQUFBO0lBQ1gsNkJBQWlCLENBQUE7SUFDakIseUJBQWEsQ0FBQTtJQUNiLGlDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFOVyxRQUFRLHdCQUFSLFFBQVEsUUFNbkI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxRQUtYO0FBTEQsV0FBWSxRQUFRO0lBQ2xCLHlCQUFhLENBQUE7SUFDYiw2QkFBaUIsQ0FBQTtJQUNqQiw2QkFBaUIsQ0FBQTtJQUNqQiwrQkFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsUUFBUSx3QkFBUixRQUFRLFFBS25CO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksbUJBR1g7QUFIRCxXQUFZLG1CQUFtQjtJQUM3Qix3Q0FBaUIsQ0FBQTtJQUNqQix3Q0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBSFcsbUJBQW1CLG1DQUFuQixtQkFBbUIsUUFHOUI7QUFZRDs7R0FFRztBQUNILE1BQXNCLGNBQWM7SUFDbEM7O09BRUc7SUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQWtDO1FBQzdELE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDOztBQU5ILHdDQVlDOzs7QUFFRCxNQUFNLG9CQUFxQixTQUFRLGNBQWM7SUFNL0MsWUFBWSxPQUFrQztRQUM1QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElB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LCtCQUFpQixDQUFDLHVCQUF1QixDQUFDO1lBQ3RFLEtBQUssU0FBUztnQkFDWixPQUFPLGNBQWMsS0FBSyxTQUFTLENBQUM7WUFDdEM7Z0JBQ0UsT0FBTyxhQUE2QixDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDOztBQWhKSCxzREFpSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBBbm5vdGF0aW9ucyxcbiAgQ2ZuRGVsZXRpb25Qb2xpY3ksXG4gIEN1c3RvbVJlc291cmNlLFxuICBEdXJhdGlvbixcbiAgUmVtb3ZhbFBvbGljeSxcbiAgU2l6ZSxcbiAgU3RhY2ssXG4gIFRva2VuLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyLWFzc2V0cyc7XG5pbXBvcnQgeyBJR3JhbnRhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQge1xuICBBcmNoaXRlY3R1cmUsXG4gIEFzc2V0Q29kZSxcbiAgSGFuZGxlcixcbiAgUnVudGltZSxcbiAgU2luZ2xldG9uRnVuY3Rpb24sXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ2ZuTG9nR3JvdXAsIElMb2dHcm91cCwgTG9nR3JvdXAsIFJldGVudGlvbkRheXMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBDbG91ZFdhdGNoTG9nc091dHB1dE9wdGlvbnMsXG4gIFNjYW5Mb2dzT3V0cHV0T3B0aW9ucyxcbiAgU2NhbkxvZ3NPdXRwdXRUeXBlLFxuICBTY2FubmVyQ3VzdG9tUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRW51bSBmb3IgU2V2ZXJpdHkgU2VsZWN0aW9uXG4gKlxuICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3Mvc2Nhbm5lci92dWxuZXJhYmlsaXR5LyNzZXZlcml0eS1zZWxlY3Rpb25cbiAqL1xuZXhwb3J0IGVudW0gU2V2ZXJpdHkge1xuICBVTktOT1dOID0gJ1VOS05PV04nLFxuICBMT1cgPSAnTE9XJyxcbiAgTUVESVVNID0gJ01FRElVTScsXG4gIEhJR0ggPSAnSElHSCcsXG4gIENSSVRJQ0FMID0gJ0NSSVRJQ0FMJyxcbn1cblxuLyoqXG4gKiBFbnVtIGZvciBTY2FubmVyc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vb3RoZXJzLyNlbmFibGVkaXNhYmxlLXNjYW5uZXJzXG4gKi9cbmV4cG9ydCBlbnVtIFNjYW5uZXJzIHtcbiAgVlVMTiA9ICd2dWxuJyxcbiAgQ09ORklHID0gJ2NvbmZpZycsXG4gIFNFQ1JFVCA9ICdzZWNyZXQnLFxuICBMSUNFTlNFID0gJ2xpY2Vuc2UnLFxufVxuXG4vKipcbiAqIEVudW0gZm9yIEltYWdlQ29uZmlnU2Nhbm5lcnNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy90YXJnZXQvY29udGFpbmVyX2ltYWdlLyNjb250YWluZXItaW1hZ2UtbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGVudW0gSW1hZ2VDb25maWdTY2FubmVycyB7XG4gIENPTkZJRyA9ICdjb25maWcnLFxuICBTRUNSRVQgPSAnc2VjcmV0Jyxcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzY2FuIGxvZ3Mgb3V0cHV0IHRvIENsb3VkV2F0Y2ggTG9ncyBsb2cgZ3JvdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRXYXRjaExvZ3NPdXRwdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbG9nIGdyb3VwIHRvIG91dHB1dCBzY2FuIGxvZ3MuXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cDogSUxvZ0dyb3VwO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIG91dHB1dCBvZiB0aGUgc2NhbiBsb2dzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2NhbkxvZ3NPdXRwdXQge1xuICAvKipcbiAgICogU2NhbiBsb2dzIG91dHB1dCB0byBDbG91ZFdhdGNoIExvZ3MgbG9nIGdyb3VwLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbG91ZFdhdGNoTG9ncyhvcHRpb25zOiBDbG91ZFdhdGNoTG9nc091dHB1dFByb3BzKTogU2NhbkxvZ3NPdXRwdXQge1xuICAgIHJldHVybiBuZXcgQ2xvdWRXYXRjaExvZ3NPdXRwdXQob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24gZm9yIHNjYW4gbG9ncy5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBiaW5kKGdyYW50ZWU6IElHcmFudGFibGUpOiBTY2FuTG9nc091dHB1dE9wdGlvbnM7XG59XG5cbmNsYXNzIENsb3VkV2F0Y2hMb2dzT3V0cHV0IGV4dGVuZHMgU2NhbkxvZ3NPdXRwdXQge1xuICAvKipcbiAgICogVGhlIGxvZyBncm91cCB0byBvdXRwdXQgc2NhbiBsb2dzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dHcm91cDogSUxvZ0dyb3VwO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENsb3VkV2F0Y2hMb2dzT3V0cHV0UHJvcHMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5sb2dHcm91cCA9IG9wdGlvbnMubG9nR3JvdXA7XG4gIH1cblxuICBwdWJsaWMgYmluZChncmFudGVlOiBJR3JhbnRhYmxlKTogQ2xvdWRXYXRjaExvZ3NPdXRwdXRPcHRpb25zIHtcbiAgICAvLyBNb3N0IExhbWJkYXMgYXJlIGdyYW50ZWQgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGFuZCBjYW4gd3JpdGUgdG8gYW55IENsb3VkV2F0Y2ggTG9ncy5cbiAgICAvLyBIb3dldmVyLCBqdXN0IGluIGNhc2UgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGlzIG5vdCBncmFudGVkLCBhbGxvdyB3cml0aW5nIHRvIENsb3VkV2F0Y2ggTG9ncy5cbiAgICB0aGlzLmxvZ0dyb3VwLmdyYW50V3JpdGUoZ3JhbnRlZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogU2NhbkxvZ3NPdXRwdXRUeXBlLkNMT1VEV0FUQ0hfTE9HUyxcbiAgICAgIGxvZ0dyb3VwTmFtZTogdGhpcy5sb2dHcm91cC5sb2dHcm91cE5hbWUsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlU2Nhbm5lcldpdGhUcml2eVByb3BzIHtcbiAgLyoqXG4gICAqIEltYWdlIFVSSSBmb3Igc2NhbiB0YXJnZXQuXG4gICAqL1xuICByZWFkb25seSBpbWFnZVVyaTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXBvc2l0b3J5IGluY2x1ZGluZyB0aGUgaW1hZ2UgVVJJIGZvciBzY2FuIHRhcmdldC5cbiAgICpcbiAgICogQmVjYXVzZSBvZiBncmFudFB1bGwgdG8gQ3VzdG9tUmVzb3VyY2VMYW1iZGEuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5OiBJUmVwb3NpdG9yeTtcblxuICAvKipcbiAgICogVGhlIHVuZml4ZWQvdW5maXhhYmxlIHZ1bG5lcmFiaWxpdGllcyBtZWFuIHRoYXQgdGhlIHBhdGNoIGhhcyBub3QgeWV0IGJlZW4gcHJvdmlkZWQgb24gdGhlaXIgZGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBUbyBoaWRlIHVuZml4ZWQvdW5maXhhYmxlIHZ1bG5lcmFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGAtLWlnbm9yZS11bmZpeGVkYCBmbGFnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy9zY2FubmVyL3Z1bG5lcmFiaWxpdHkvI3VuZml4ZWQtdnVsbmVyYWJpbGl0aWVzXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVVbmZpeGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V2ZXJpdHkgU2VsZWN0aW9uXG4gICAqXG4gICAqIFRoZSBzZXZlcml0eSBpcyB0YWtlbiBmcm9tIHRoZSBzZWxlY3RlZCBkYXRhIHNvdXJjZSBzaW5jZSB0aGUgc2V2ZXJpdHkgZnJvbSB2ZW5kb3JzIGlzIG1vcmUgYWNjdXJhdGUuXG4gICAqIFVzaW5nIENWRS0yMDIzLTA0NjQgYXMgYW4gZXhhbXBsZSwgd2hpbGUgaXQgaXMgcmF0ZWQgYXMgXCJISUdIXCIgaW4gTlZELCBSZWQgSGF0IGhhcyBtYXJrZWQgaXRzICdJbXBhY3QnIGFzIFwiTG93XCIuIEFzIGEgcmVzdWx0LCBUcml2eSB3aWxsIGRpc3BsYXkgaXQgYXMgXCJMb3dcIi5cbiAgICpcbiAgICogVGhlIHNldmVyaXR5IGRlcGVuZHMgb24gdGhlIGNvbXBpbGUgb3B0aW9uLCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBldGMuIE5WRCBkb2Vzbid0IGtub3cgaG93IHRoZSB2ZW5kb3IgZGlzdHJpYnV0ZXMgdGhlIHNvZnR3YXJlLlxuICAgKiBSZWQgSGF0IGV2YWx1YXRlcyB0aGUgc2V2ZXJpdHkgbW9yZSBhY2N1cmF0ZWx5LiBUaGF0J3Mgd2h5IFRyaXZ5IHByZWZlcnMgdmVuZG9yIHNjb3JlcyBvdmVyIE5WRC5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gYENSSVRJQ0FMYCBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELCBidXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBUcml2eSBpcyBcIkNSSVRJQ0FMLEhJR0gsTUVESVVNLExPVyxVTktOT1dOXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtTZXZlcml0eS5DUklUSUNBTF1cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3Mvc2Nhbm5lci92dWxuZXJhYmlsaXR5LyNzZXZlcml0eS1zZWxlY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IHNldmVyaXR5PzogU2V2ZXJpdHlbXTtcblxuICAvKipcbiAgICogRW5hYmxlL0Rpc2FibGUgU2Nhbm5lcnNcbiAgICpcbiAgICogWW91IGNhbiBlbmFibGUvZGlzYWJsZSBzY2FubmVycyB3aXRoIHRoZSBgc2Nhbm5lcnNgLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgY29udGFpbmVyIGltYWdlIHNjYW5uaW5nIGVuYWJsZXMgdnVsbmVyYWJpbGl0eSAoVlVMTikgYW5kIHNlY3JldCBzY2FubmVycyAoU0VDUkVUKSBieSBkZWZhdWx0LlxuICAgKiBJZiB5b3UgZG9uJ3QgbmVlZCBzZWNyZXQgc2Nhbm5pbmcsIGl0IGNhbiBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIFNjYW5uZXJzLlZVTE4gb25seS5cbiAgICpcbiAgICogQGRlZmF1bHQgW1NlY3VyaXR5LlZVTE4sU2Nhbm5lcnMuU0VDUkVUXVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy9jb25maWd1cmF0aW9uL290aGVycy8jZW5hYmxlZGlzYWJsZS1zY2FubmVyc1xuICAgKi9cbiAgcmVhZG9ubHkgc2Nhbm5lcnM/OiBTY2FubmVyc1tdO1xuXG4gIC8qKlxuICAgKiBFbnVtIGZvciBJbWFnZUNvbmZpZ1NjYW5uZXJzXG4gICAqXG4gICAqIENvbnRhaW5lciBpbWFnZXMgaGF2ZSBjb25maWd1cmF0aW9uLiBkb2NrZXIgaW5zcGVjdCBhbmQgYGRvY2tlciBoaXN0b3J5YCBzaG93IHRoZSBpbmZvcm1hdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqIFRyaXZ5IHNjYW5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGNvbnRhaW5lciBpbWFnZXMgZm9yXG4gICAqXG4gICAqIC0gTWlzY29uZmlndXJhdGlvbnNcbiAgICogLSBTZWNyZXRzXG4gICAqXG4gICAqIFRoZXkgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFlvdSBjYW4gZW5hYmxlIHRoZW0gd2l0aCBgaW1hZ2VDb25maWdTY2FubmVyc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL3RhcmdldC9jb250YWluZXJfaW1hZ2UvI2NvbnRhaW5lci1pbWFnZS1tZXRhZGF0YVxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VDb25maWdTY2FubmVycz86IEltYWdlQ29uZmlnU2Nhbm5lcnNbXTtcblxuICAvKipcbiAgICogRXhpdCBDb2RlXG4gICAqXG4gICAqIFVzZSB0aGUgYGV4aXRDb2RlYCBvcHRpb24gaWYgeW91IHdhbnQgdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlLlxuICAgKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgMCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gZXhpdCBldmVuIHdoZW4gdnVsbmVyYWJpbGl0aWVzIGFyZSBkZXRlY3RlZC5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gMSBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELiBJbiB0aGUgb3JpZ2luYWwgdHJpdnksIGl0IGlzIDAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9vdGhlcnMvI2V4aXQtY29kZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdENvZGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEV4aXQgb24gRU9MXG4gICAqXG4gICAqIFNvbWV0aW1lcyB5b3UgbWF5IHN1cnByaXNpbmdseSBnZXQgMCB2dWxuZXJhYmlsaXRpZXMgaW4gYW4gb2xkIGltYWdlOlxuICAgKiAgLSBFbmFibGluZyAtLWlnbm9yZS11bmZpeGVkIG9wdGlvbiB3aGlsZSBhbGwgcGFja2FnZXMgaGF2ZSBubyBmaXhlZCB2ZXJzaW9ucy5cbiAgICogIC0gU2Nhbm5pbmcgYSByYXRoZXIgb3V0ZGF0ZWQgT1MgKGUuZy4gVWJ1bnR1IDEwLjA0KS5cbiAgICpcbiAgICogQW4gT1MgYXQgdGhlIGVuZCBvZiBzZXJ2aWNlL2xpZmUgKEVPTCkgdXN1YWxseSBnZXRzIGludG8gdGhpcyBzaXR1YXRpb24sIHdoaWNoIGlzIGRlZmluaXRlbHkgZnVsbCBvZiB2dWxuZXJhYmlsaXRpZXMuXG4gICAqIGBleGl0T25Fb2xgIGNhbiBmYWlsIHNjYW5uaW5nIG9uIEVPTCBPUyB3aXRoIGEgbm9uLXplcm8gY29kZS5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gMSBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELiBJbiB0aGUgb3JpZ2luYWwgdHJpdnksIGl0IGlzIDAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9vdGhlcnMvI2V4aXQtb24tZW9sXG4gICAqL1xuICByZWFkb25seSBleGl0T25Fb2w/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJ5IEZpbmRpbmcgSURzXG4gICAqXG4gICAqIFRoZSBpZ25vcmUgcnVsZXMgd3JpdHRlbiB0byB0aGUgLnRyaXZ5aWdub3JlIGluIHRyaXZ5LlxuICAgKiBQdXQgZWFjaCBsaW5lIHlvdSB3cml0ZSBpbiB0aGUgZmlsZSBpbnRvIG9uZSBlbGVtZW50IG9mIHRoZSBhcnJheS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogICAgICQgY2F0IC50cml2eWlnbm9yZVxuICAgKiAgICAgIyBBY2NlcHQgdGhlIHJpc2tcbiAgICogICAgIENWRS0yMDE4LTE0NjE4XG4gICAqXG4gICAqICAgICAjIEFjY2VwdCB0aGUgcmlzayB1bnRpbCAyMDIzLTAxLTAxXG4gICAqICAgICBDVkUtMjAxOS0xNDY5NyBleHA6MjAyMy0wMS0wMVxuICAgKlxuICAgKiAgICAgIyBObyBpbXBhY3QgaW4gb3VyIHNldHRpbmdzXG4gICAqICAgICBDVkUtMjAxOS0xNTQzXG4gICAqXG4gICAqICAgICAjIElnbm9yZSBtaXNjb25maWd1cmF0aW9uc1xuICAgKiAgICAgQVZELURTLTAwMDJcbiAgICpcbiAgICogICAgICMgSWdub3JlIHNlY3JldHNcbiAgICogICAgIGdlbmVyaWMtdW53YW50ZWQtcnVsZVxuICAgKiAgICAgYXdzLWFjY291bnQtaWRcbiAgICpcbiAgICogQGRlZmF1bHQgW11cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9maWx0ZXJpbmcvI3RyaXZ5aWdub3JlXG4gICAqL1xuICByZWFkb25seSB0cml2eUlnbm9yZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZW1vcnkgU2l6ZSAoTUIpIGZvciBTY2FubmVyIExhbWJkYVxuICAgKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgYmV0d2VlbiBgMzAwOGAgYW5kIGAxMDI0MGAuXG4gICAqXG4gICAqIElmIHRoaXMgQ29uc3RydWN0IGV4ZWN1dGlvbiB0ZXJtaW5hdGVzIGFibm9ybWFsbHkgZHVlIHRvIFNJR0tJTEwsIHRyeSBhIGxhcmdlciBzaXplLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlIChgMzAwOGAgTUIpIGlzIE1heGltdW0gTGFtYmRhIG1lbW9yeSBzaXplIGZvciBkZWZhdWx0IEFXUyBhY2NvdW50IHdpdGhvdXQgcXVvdGEgbGltaXQgaW5jcmVhc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IDMwMDhcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNjYW4gSW1hZ2Ugb24gYSBzcGVjaWZpYyBBcmNoaXRlY3R1cmUgYW5kIE9TXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIFRyaXZ5IGxvYWRzIGFuIGltYWdlIG9uIGEgYGxpbnV4L2FtZDY0YCBtYWNoaW5lLlxuICAgKlxuICAgKiBUbyBjdXN0b21pemUgdGhpcywgcGFzcyBhIGBwbGF0Zm9ybWAgYXJndW1lbnQgaW4gdGhlIGZvcm1hdCBPUy9BcmNoaXRlY3R1cmUgZm9yIHRoZSBpbWFnZSwgc3VjaCBhcyBgbGludXgvYXJtNjRgXG4gICAqXG4gICAqIEBkZWZhdWx0IC1cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZhbCBwb2xpY3kgdG8gYXBwbHkgdG8gU2Nhbm5lciBMYW1iZGEncyBkZWZhdWx0IGxvZyBncm91cFxuICAgKlxuICAgKiBJZiB5b3UgdXNlIEltYWdlU2Nhbm5lcldpdGhUcml2eSBjb25zdHJ1Y3QgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgc3RhY2ssIHlvdSBjYW5ub3Qgc2V0IGRpZmZlcmVudCByZW1vdmFsIHBvbGljaWVzIGZvciB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqIFNlZSBgTm90ZXNgIHNlY3Rpb24gaW4gdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNjYW5uZXIgTGFtYmRhIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKS5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRMb2dHcm91cFJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgbG9nIGV2ZW50cyBhcmUga2VwdCBpbiBTY2FubmVyIExhbWJkYSdzIGRlZmF1bHQgbG9nIGdyb3VwXG4gICAqXG4gICAqIElmIHlvdSB1c2UgSW1hZ2VTY2FubmVyV2l0aFRyaXZ5IGNvbnN0cnVjdCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBzdGFjaywgeW91IGNhbm5vdCBzZXQgZGlmZmVyZW50IHJldGVudGlvbiBkYXlzIGZvciB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqIFNlZSBgTm90ZXNgIHNlY3Rpb24gaW4gdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNjYW5uZXIgTGFtYmRhIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKSBhbmQgbG9nIGV2ZW50cyBuZXZlciBleHBpcmUuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzPzogUmV0ZW50aW9uRGF5cztcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3Igc2NhbiBsb2dzIG91dHB1dFxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzY2FuIGxvZ3MgYXJlIG91dHB1dCB0byBkZWZhdWx0IGxvZyBncm91cCBjcmVhdGVkIGJ5IFNjYW5uZXIgTGFtYmRhLlxuICAgKlxuICAgKiBTcGVjaWZ5IHRoaXMgaWYgeW91IHdhbnQgdG8gc2VuZCBzY2FuIGxvZ3MgdG8gb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqXG4gICAqIEN1cnJlbnRseSwgb25seSBgY2xvdWRXYXRjaExvZ3NgIGlzIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzY2FuIGxvZ3Mgb3V0cHV0IHRvIGRlZmF1bHQgbG9nIGdyb3VwIGNyZWF0ZWQgYnkgU2Nhbm5lciBMYW1iZGEoYC9hd3MvbGFtYmRhLyR7ZnVuY3Rpb25OYW1lfWApXG4gICAqL1xuICByZWFkb25seSBzY2FuTG9nc091dHB1dD86IFNjYW5Mb2dzT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBTdXBwcmVzcyBlcnJvcnMgZHVyaW5nIHJvbGxiYWNrIHNjYW5uZXIgTGFtYmRhIGV4ZWN1dGlvblxuICAgKlxuICAgKiBXaGVuIGltYWdlIHNjYW5uaW5nIGZhaWxzLCBDbG91ZEZvcm1hdGlvbiB0cmlnZ2VycyBhIHJvbGxiYWNrIGFuZCBleGVjdXRlcyB0aGUgcHJldmlvdXNcbiAgICogdmVyc2lvbiBvZiB0aGUgc2Nhbm5lciBMYW1iZGEuIElmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIHByZXZpb3VzIHZlcnNpb24gb2ZcbiAgICogdGhlIHNjYW5uZXIgTGFtYmRhIHdpbGwgbm90IHRocm93IGFuIGVycm9yLCBldmVuIGlmIHRoZSBpbWFnZSBzY2FubmluZyBmb3IgdGhlIHByZXZpb3VzIHZlcnNpb25cbiAgICogZmFpbHMuXG4gICAqXG4gICAqIFRoaXMgYWxsb3dzIHRoZSByb2xsYmFjayB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHksIGF2b2lkaW5nIFJPTExCQUNLX0ZBSUxFRCBzdGF0ZVxuICAgKiB3aGVuIGltYWdlIHNjYW5uaW5nIGZhaWx1cmVzIG9jY3VyLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzdXBwcmVzc0Vycm9yT25Sb2xsYmFjaz86IGJvb2xlYW47XG59XG5cbi8vIE1heGltdW0gTGFtYmRhIG1lbW9yeSBzaXplIGZvciBkZWZhdWx0IEFXUyBhY2NvdW50IHdpdGhvdXQgcXVvdGEgbGltaXQgaW5jcmVhc2VcbmNvbnN0IERFRkFVTFRfTUVNT1JZX1NJWkUgPSAzMDA4O1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VTY2FubmVyV2l0aFRyaXZ5IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEltYWdlU2Nhbm5lcldpdGhUcml2eVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChcbiAgICAgIHByb3BzLm1lbW9yeVNpemUgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubWVtb3J5U2l6ZSkgJiZcbiAgICAgIChwcm9wcy5tZW1vcnlTaXplIDwgMzAwOCB8fCBwcm9wcy5tZW1vcnlTaXplID4gMTAyNDApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBZb3UgY2FuIHNwZWNpZnkgYmV0d2VlbiBcXGAzMDA4XFxgIGFuZCBcXGAxMDI0MFxcYCBmb3IgXFxgbWVtb3J5U2l6ZVxcYCwgZ290ICR7cHJvcHMubWVtb3J5U2l6ZX0uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbGFtYmRhUHVycG9zZSA9ICdDdXN0b206OkltYWdlU2Nhbm5lcldpdGhUcml2eUN1c3RvbVJlc291cmNlTGFtYmRhJztcbiAgICBjb25zdCBjdXN0b21SZXNvdXJjZUxhbWJkYSA9IG5ldyBTaW5nbGV0b25GdW5jdGlvbih0aGlzLCAnQ3VzdG9tUmVzb3VyY2VMYW1iZGEnLCB7XG4gICAgICB1dWlkOiAnNDcwYjYzNDMtZDI2Ny1mNzUzLTIyNmMtMWU5OWYwOWYzMTlhJyxcbiAgICAgIGxhbWJkYVB1cnBvc2UsXG4gICAgICBydW50aW1lOiBSdW50aW1lLkZST01fSU1BR0UsXG4gICAgICBoYW5kbGVyOiBIYW5kbGVyLkZST01fSU1BR0UsXG4gICAgICBjb2RlOiBBc3NldENvZGUuZnJvbUFzc2V0SW1hZ2Uoam9pbihfX2Rpcm5hbWUsICcuLi9hc3NldHMvbGFtYmRhJyksIHtcbiAgICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLkxJTlVYX0FSTTY0LFxuICAgICAgICAvLyBleGNsdWRlIG5vZGVfbW9kdWxlc1xuICAgICAgICAvLyBiZWNhdXNlIHRoZSBuYXRpdmUgYmluYXJ5IG9mIHRoZSBpbnN0YWxsZWQgZXNidWlsZCBjaGFuZ2VzIGRlcGVuZGluZyBvbiB0aGUgY3B1IGFyY2hpdGVjdHVyZVxuICAgICAgICAvLyBhbmQgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIGltYWdlIGFzc2V0IGNoYW5nZXMgZGVwZW5kaW5nIG9uIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gICAgICAgIGV4Y2x1ZGU6IFsnbm9kZV9tb2R1bGVzJ10sXG4gICAgICB9KSxcbiAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoOTAwKSxcbiAgICAgIHJldHJ5QXR0ZW1wdHM6IDAsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplID8/IERFRkFVTFRfTUVNT1JZX1NJWkUsXG4gICAgICBlcGhlbWVyYWxTdG9yYWdlU2l6ZTogU2l6ZS5naWJpYnl0ZXMoMTApLCAvLyBmb3IgY2FzZXMgdGhhdCBuZWVkIHRvIHVwZGF0ZSB0cml2eSBEQjogL3RtcC90cml2eS9kYi90cml2eS5kYlxuICAgIH0pO1xuICAgIHByb3BzLnJlcG9zaXRvcnkuZ3JhbnRQdWxsKGN1c3RvbVJlc291cmNlTGFtYmRhKTtcblxuICAgIGNvbnN0IGN1c3RvbVJlc291cmNlTGFtYmRhTG9nR3JvdXBDb25zdHJ1Y3ROYW1lID0gYERlZmF1bHRMb2dHcm91cEZvciR7bGFtYmRhUHVycG9zZX1gO1xuXG4gICAgdGhpcy52YWxpZGF0ZUxhbWJkYURlZmF1bHRMb2dHcm91cE9wdGlvbnMoY3VzdG9tUmVzb3VyY2VMYW1iZGFMb2dHcm91cENvbnN0cnVjdE5hbWUsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5IHx8IHByb3BzLmRlZmF1bHRMb2dHcm91cFJldGVudGlvbkRheXMpIHtcbiAgICAgIHRoaXMuZW5zdXJlTGFtYmRhRGVmYXVsdExvZ0dyb3VwKFxuICAgICAgICBjdXN0b21SZXNvdXJjZUxhbWJkYSxcbiAgICAgICAgY3VzdG9tUmVzb3VyY2VMYW1iZGFMb2dHcm91cENvbnN0cnVjdE5hbWUsXG4gICAgICAgIHByb3BzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbWFnZVNjYW5uZXJQcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCAnUHJvdmlkZXInLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogY3VzdG9tUmVzb3VyY2VMYW1iZGEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbWFnZVNjYW5uZXJQcm9wZXJ0aWVzOiBTY2FubmVyQ3VzdG9tUmVzb3VyY2VQcm9wcyA9IHtcbiAgICAgIGFkZHI6IHRoaXMubm9kZS5hZGRyLFxuICAgICAgaW1hZ2VVcmk6IHByb3BzLmltYWdlVXJpLFxuICAgICAgaWdub3JlVW5maXhlZDogU3RyaW5nKHByb3BzLmlnbm9yZVVuZml4ZWQgPz8gZmFsc2UpLFxuICAgICAgc2V2ZXJpdHk6IHByb3BzLnNldmVyaXR5ID8/IFtTZXZlcml0eS5DUklUSUNBTF0sXG4gICAgICBzY2FubmVyczogcHJvcHMuc2Nhbm5lcnMgPz8gW10sXG4gICAgICBpbWFnZUNvbmZpZ1NjYW5uZXJzOiBwcm9wcy5pbWFnZUNvbmZpZ1NjYW5uZXJzID8/IFtdLFxuICAgICAgZXhpdENvZGU6IHByb3BzLmV4aXRDb2RlID8/IDEsXG4gICAgICBleGl0T25Fb2w6IHByb3BzLmV4aXRPbkVvbCA/PyAxLFxuICAgICAgdHJpdnlJZ25vcmU6IHByb3BzLnRyaXZ5SWdub3JlID8/IFtdLFxuICAgICAgcGxhdGZvcm06IHByb3BzLnBsYXRmb3JtID8/ICcnLFxuICAgICAgb3V0cHV0OiBwcm9wcy5zY2FuTG9nc091dHB1dD8uYmluZChjdXN0b21SZXNvdXJjZUxhbWJkYSksXG4gICAgICBzdXBwcmVzc0Vycm9yT25Sb2xsYmFjazogU3RyaW5nKHByb3BzLnN1cHByZXNzRXJyb3JPblJvbGxiYWNrID8/IHRydWUpLFxuICAgIH07XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpJbWFnZVNjYW5uZXJXaXRoVHJpdnknLFxuICAgICAgcHJvcGVydGllczogaW1hZ2VTY2FubmVyUHJvcGVydGllcyxcbiAgICAgIHNlcnZpY2VUb2tlbjogaW1hZ2VTY2FubmVyUHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHNwZWNpZmllZCBkZWZhdWx0IGxvZyBncm91cCBvcHRpb25zIGFyZSB0aGUgc2FtZSBmb3IgZXhpc3RpbmcgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTGFtYmRhRGVmYXVsdExvZ0dyb3VwT3B0aW9ucyhcbiAgICBsb2dHcm91cENvbnN0cnVjdE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSW1hZ2VTY2FubmVyV2l0aFRyaXZ5UHJvcHMsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gU3RhY2sub2YodGhpcykubm9kZS50cnlGaW5kQ2hpbGQobG9nR3JvdXBDb25zdHJ1Y3ROYW1lKSBhc1xuICAgICAgfCBMb2dHcm91cFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFleGlzdGluZykgcmV0dXJuO1xuXG4gICAgY29uc3QgY2ZuTG9nR3JvdXAgPSBleGlzdGluZy5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5Mb2dHcm91cDtcblxuICAgIGlmIChcbiAgICAgICF0aGlzLmlzU2FtZVJlc291cmNlRGVsZXRpb25CZWhhdmlvcihcbiAgICAgICAgcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeSxcbiAgICAgICAgY2ZuTG9nR3JvdXAuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSxcbiAgICAgICkgfHxcbiAgICAgIGNmbkxvZ0dyb3VwLnJldGVudGlvbkluRGF5cyAhPT0gcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmV0ZW50aW9uRGF5c1xuICAgICkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQGltYWdlLXNjYW5uZXItd2l0aC10cml2eTpkdXBsaWNhdGVMYW1iZGFEZWZhdWx0TG9nR3JvdXBPcHRpb25zJyxcbiAgICAgICAgXCJZb3UgaGF2ZSB0byBzZXQgdGhlIHNhbWUgdmFsdWVzIGZvciAnZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeScgYW5kICdkZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzJyBmb3IgZWFjaCBJbWFnZVNjYW5uZXJXaXRoVHJpdnkgY29uc3RydWN0IGluIHRoZSBzYW1lIHN0YWNrLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAgZm9yIFNjYW5uZXIgTGFtYmRhIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIGRlZmF1bHQgbG9nIGdyb3VwIGZvciBTY2FubmVyIExhbWJkYSBleGlzdHMgaW4gY2hpbGRyZW4gb2YgdGhlIHN0YWNrIGNvbnN0cnVjdC5cbiAgICogSWYgaXQgZG9lcyBub3QgZXhpc3QsIGl0IGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwIGZvciBTY2FubmVyIExhbWJkYSBhcyBhIGNoaWxkIG9mIHRoZSBzdGFjayBjb25zdHJ1Y3QuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUxhbWJkYURlZmF1bHRMb2dHcm91cChcbiAgICBzaW5nbGV0b25GdW5jdGlvbjogU2luZ2xldG9uRnVuY3Rpb24sXG4gICAgbG9nR3JvdXBDb25zdHJ1Y3ROYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEltYWdlU2Nhbm5lcldpdGhUcml2eVByb3BzLFxuICApOiBMb2dHcm91cCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBTdGFjay5vZih0aGlzKS5ub2RlLnRyeUZpbmRDaGlsZChsb2dHcm91cENvbnN0cnVjdE5hbWUpIGFzXG4gICAgICB8IExvZ0dyb3VwXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExvZ0dyb3VwKFN0YWNrLm9mKHRoaXMpLCBsb2dHcm91cENvbnN0cnVjdE5hbWUsIHtcbiAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7c2luZ2xldG9uRnVuY3Rpb24uZnVuY3Rpb25OYW1lfWAsXG4gICAgICByZXRlbnRpb246IHByb3BzLmRlZmF1bHRMb2dHcm91cFJldGVudGlvbkRheXMsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVSZXNvdXJjZURlbGV0aW9uQmVoYXZpb3IoXG4gICAgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3ksXG4gICAgZGVsZXRpb25Qb2xpY3k/OiBDZm5EZWxldGlvblBvbGljeSxcbiAgKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChyZW1vdmFsUG9saWN5KSB7XG4gICAgICBjYXNlIFJlbW92YWxQb2xpY3kuREVTVFJPWTpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG4gICAgICBjYXNlIFJlbW92YWxQb2xpY3kuUkVUQUlOOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IENmbkRlbGV0aW9uUG9saWN5LlJFVEFJTjtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5TTkFQU0hPVDpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5TTkFQU0hPVDtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5SRVRBSU5fT05fVVBEQVRFX09SX0RFTEVURTpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5SRVRBSU5fRVhDRVBUX09OX0NSRUFURTtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IHVuZGVmaW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiByZW1vdmFsUG9saWN5IHNhdGlzZmllcyBuZXZlcjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
package/lib/types.d.ts CHANGED
@@ -31,4 +31,5 @@ export interface ScannerCustomResourceProps {
31
31
  readonly trivyIgnore: string[];
32
32
  readonly platform: string;
33
33
  readonly output?: ScanLogsOutputOptions;
34
+ readonly suppressErrorOnRollback: string;
34
35
  }
package/lib/types.js CHANGED
@@ -8,4 +8,4 @@ var ScanLogsOutputType;
8
8
  (function (ScanLogsOutputType) {
9
9
  ScanLogsOutputType["CLOUDWATCH_LOGS"] = "cloudWatchLogs";
10
10
  })(ScanLogsOutputType || (exports.ScanLogsOutputType = ScanLogsOutputType = {}));
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxJQUFZLGtCQUVYO0FBRkQsV0FBWSxrQkFBa0I7SUFDNUIsd0RBQWtDLENBQUE7QUFDcEMsQ0FBQyxFQUZXLGtCQUFrQixrQ0FBbEIsa0JBQWtCLFFBRTdCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbnVtIGZvciBTY2FuTG9nc091dHB1dFR5cGVcbiAqL1xuZXhwb3J0IGVudW0gU2NhbkxvZ3NPdXRwdXRUeXBlIHtcbiAgQ0xPVURXQVRDSF9MT0dTID0gJ2Nsb3VkV2F0Y2hMb2dzJyxcbn1cblxuLyoqXG4gKiBPdXRwdXQgY29uZmlndXJhdGlvbnMgZm9yIHNjYW4gbG9ncy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2FuTG9nc091dHB1dE9wdGlvbnMge1xuICByZWFkb25seSB0eXBlOiBTY2FuTG9nc091dHB1dFR5cGU7XG59XG5cbi8qKlxuICogT3V0cHV0IGNvbmZpZ3VyYXRpb24gZm9yIHNjYW4gbG9ncyB0byBDbG91ZFdhdGNoIExvZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRXYXRjaExvZ3NPdXRwdXRPcHRpb25zIGV4dGVuZHMgU2NhbkxvZ3NPdXRwdXRPcHRpb25zIHtcbiAgcmVhZG9ubHkgbG9nR3JvdXBOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTGFtYmRhIGZ1bmN0aW9uIGV2ZW50IG9iamVjdCBmb3IgU2Nhbm5lciBDdXN0b20gUmVzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Nhbm5lckN1c3RvbVJlc291cmNlUHJvcHMge1xuICByZWFkb25seSBhZGRyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltYWdlVXJpOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlnbm9yZVVuZml4ZWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V2ZXJpdHk6IHN0cmluZ1tdO1xuICByZWFkb25seSBzY2FubmVyczogc3RyaW5nW107XG4gIHJlYWRvbmx5IGltYWdlQ29uZmlnU2Nhbm5lcnM6IHN0cmluZ1tdO1xuICByZWFkb25seSBleGl0Q29kZTogbnVtYmVyO1xuICByZWFkb25seSBleGl0T25Fb2w6IG51bWJlcjtcbiAgcmVhZG9ubHkgdHJpdnlJZ25vcmU6IHN0cmluZ1tdO1xuICByZWFkb25seSBwbGF0Zm9ybTogc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXQ/OiBTY2FuTG9nc091dHB1dE9wdGlvbnM7XG59XG4iXX0=
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxJQUFZLGtCQUVYO0FBRkQsV0FBWSxrQkFBa0I7SUFDNUIsd0RBQWtDLENBQUE7QUFDcEMsQ0FBQyxFQUZXLGtCQUFrQixrQ0FBbEIsa0JBQWtCLFFBRTdCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbnVtIGZvciBTY2FuTG9nc091dHB1dFR5cGVcbiAqL1xuZXhwb3J0IGVudW0gU2NhbkxvZ3NPdXRwdXRUeXBlIHtcbiAgQ0xPVURXQVRDSF9MT0dTID0gJ2Nsb3VkV2F0Y2hMb2dzJyxcbn1cblxuLyoqXG4gKiBPdXRwdXQgY29uZmlndXJhdGlvbnMgZm9yIHNjYW4gbG9ncy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2FuTG9nc091dHB1dE9wdGlvbnMge1xuICByZWFkb25seSB0eXBlOiBTY2FuTG9nc091dHB1dFR5cGU7XG59XG5cbi8qKlxuICogT3V0cHV0IGNvbmZpZ3VyYXRpb24gZm9yIHNjYW4gbG9ncyB0byBDbG91ZFdhdGNoIExvZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRXYXRjaExvZ3NPdXRwdXRPcHRpb25zIGV4dGVuZHMgU2NhbkxvZ3NPdXRwdXRPcHRpb25zIHtcbiAgcmVhZG9ubHkgbG9nR3JvdXBOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTGFtYmRhIGZ1bmN0aW9uIGV2ZW50IG9iamVjdCBmb3IgU2Nhbm5lciBDdXN0b20gUmVzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Nhbm5lckN1c3RvbVJlc291cmNlUHJvcHMge1xuICByZWFkb25seSBhZGRyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltYWdlVXJpOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlnbm9yZVVuZml4ZWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V2ZXJpdHk6IHN0cmluZ1tdO1xuICByZWFkb25seSBzY2FubmVyczogc3RyaW5nW107XG4gIHJlYWRvbmx5IGltYWdlQ29uZmlnU2Nhbm5lcnM6IHN0cmluZ1tdO1xuICByZWFkb25seSBleGl0Q29kZTogbnVtYmVyO1xuICByZWFkb25seSBleGl0T25Fb2w6IG51bWJlcjtcbiAgcmVhZG9ubHkgdHJpdnlJZ25vcmU6IHN0cmluZ1tdO1xuICByZWFkb25seSBwbGF0Zm9ybTogc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXQ/OiBTY2FuTG9nc091dHB1dE9wdGlvbnM7XG4gIHJlYWRvbmx5IHN1cHByZXNzRXJyb3JPblJvbGxiYWNrOiBzdHJpbmc7XG59XG4iXX0=
package/package.json CHANGED
@@ -88,7 +88,7 @@
88
88
  "publishConfig": {
89
89
  "access": "public"
90
90
  },
91
- "version": "2.0.0",
91
+ "version": "2.1.1",
92
92
  "types": "lib/index.d.ts",
93
93
  "stability": "stable",
94
94
  "jsii": {