@orcabus/platform-cdk-constructs 0.0.27 → 0.0.29

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
@@ -5408,7 +5408,7 @@
5408
5408
  },
5409
5409
  "locationInModule": {
5410
5410
  "filename": "ecs/index.ts",
5411
- "line": 88
5411
+ "line": 89
5412
5412
  },
5413
5413
  "parameters": [
5414
5414
  {
@@ -5460,7 +5460,7 @@
5460
5460
  "immutable": true,
5461
5461
  "locationInModule": {
5462
5462
  "filename": "ecs/index.ts",
5463
- "line": 86
5463
+ "line": 87
5464
5464
  },
5465
5465
  "name": "containerDefinition",
5466
5466
  "type": {
@@ -5474,7 +5474,7 @@
5474
5474
  "immutable": true,
5475
5475
  "locationInModule": {
5476
5476
  "filename": "ecs/index.ts",
5477
- "line": 85
5477
+ "line": 86
5478
5478
  },
5479
5479
  "name": "securityGroup",
5480
5480
  "type": {
@@ -5494,6 +5494,20 @@
5494
5494
  "type": {
5495
5495
  "fqn": "aws-cdk-lib.aws_ecs.FargateTaskDefinition"
5496
5496
  }
5497
+ },
5498
+ {
5499
+ "docs": {
5500
+ "stability": "experimental"
5501
+ },
5502
+ "immutable": true,
5503
+ "locationInModule": {
5504
+ "filename": "ecs/index.ts",
5505
+ "line": 85
5506
+ },
5507
+ "name": "taskExecutionRole",
5508
+ "type": {
5509
+ "fqn": "aws-cdk-lib.aws_iam.IRole"
5510
+ }
5497
5511
  }
5498
5512
  ],
5499
5513
  "symbolId": "ecs/index:EcsFargateTaskConstruct"
@@ -6726,6 +6740,6 @@
6726
6740
  "symbolId": "shared-config/slack:SlackAlerts"
6727
6741
  }
6728
6742
  },
6729
- "version": "0.0.27",
6730
- "fingerprint": "Di21O3y4Lqp+NLZ7WX3FQNNZrQiiNwGUMrjy+ekH7LY="
6743
+ "version": "0.0.29",
6744
+ "fingerprint": "to2qJ4qhRMxIu8FDi+dQkfjTFHOmV0JnqoO4A+JpGGY="
6731
6745
  }
@@ -15,7 +15,7 @@ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
15
15
  const aws_route53_targets_1 = require("aws-cdk-lib/aws-route53-targets");
16
16
  const config_1 = require("./config");
17
17
  class OrcaBusApiGateway extends constructs_1.Construct {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.apigateway.OrcaBusApiGateway", version: "0.0.27" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.apigateway.OrcaBusApiGateway", version: "0.0.29" };
19
19
  /**
20
20
  * The AWS region where the API Gateway is deployed.
21
21
  */
@@ -13,7 +13,7 @@ exports.CROSS_DEPLOYMENT_ARTIFACT_BUCKET_NAME = "orcabus-cross-deployment-codepi
13
13
  exports.CROSS_DEPLOYMENT_ARTIFACT_KMS_ALIAS = "orcabus-cross-deployment-codepipeline-artifact";
14
14
  exports.CROSS_DEPLOYMENT_ARTIFACT_KMS_ARN_SSM_PARAMETER_NAME = "/orcabus/deployment-stack-pipeline/artifact-bucket/kms-key-arn";
15
15
  class CrossDeploymentArtifactBucket extends constructs_1.Construct {
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.deploymentPipeline.CrossDeploymentArtifactBucket", version: "0.0.27" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.deploymentPipeline.CrossDeploymentArtifactBucket", version: "0.0.29" };
17
17
  /**
18
18
  * The S3 bucket used to store artifacts for cross-deployment pipelines.
19
19
  */
@@ -31,7 +31,7 @@ exports.DEFAULT_SYNTH_STEP_PARTIAL_BUILD_SPEC = {
31
31
  * before using this construct.
32
32
  */
33
33
  class DeploymentStackPipeline extends constructs_1.Construct {
34
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.deploymentPipeline.DeploymentStackPipeline", version: "0.0.27" };
34
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.deploymentPipeline.DeploymentStackPipeline", version: "0.0.29" };
35
35
  /**
36
36
  * The code pipeline construct that is created.
37
37
  */
package/dynamodb/index.js CHANGED
@@ -40,7 +40,7 @@ const dynamodb = __importStar(require("aws-cdk-lib/aws-dynamodb"));
40
40
  const aws_cdk_lib_1 = require("aws-cdk-lib");
41
41
  const config_1 = require("./config");
42
42
  class DynamoDbPartitionedConstruct extends constructs_1.Construct {
43
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.dynamodb.DynamoDbPartitionedConstruct", version: "0.0.27" };
43
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.dynamodb.DynamoDbPartitionedConstruct", version: "0.0.29" };
44
44
  table;
45
45
  constructor(scope, id, props) {
46
46
  super(scope, id);
@@ -75,7 +75,7 @@ class DynamoDbPartitionedConstruct extends constructs_1.Construct {
75
75
  }
76
76
  exports.DynamoDbPartitionedConstruct = DynamoDbPartitionedConstruct;
77
77
  class DynamoDbNonPartitionedConstruct extends constructs_1.Construct {
78
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.dynamodb.DynamoDbNonPartitionedConstruct", version: "0.0.27" };
78
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.dynamodb.DynamoDbNonPartitionedConstruct", version: "0.0.29" };
79
79
  table;
80
80
  constructor(scope, id, props) {
81
81
  super(scope, id);
package/ecs/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import { Construct } from "constructs";
2
2
  import * as ec2 from "aws-cdk-lib/aws-ec2";
3
3
  import * as ecs from "aws-cdk-lib/aws-ecs";
4
4
  import * as lambda from "aws-cdk-lib/aws-lambda";
5
+ import { IRole } from "aws-cdk-lib/aws-iam";
5
6
  export type Architecture = 'X86_64' | 'ARM64';
6
7
  export declare const CPU_ARCHITECTURE_MAP: Record<Architecture, ecs.CpuArchitecture>;
7
8
  export declare const LAMBDA_ARCHITECTURE_MAP: Record<Architecture, lambda.Architecture>;
@@ -40,6 +41,7 @@ export interface FargateEcsTaskConstructProps {
40
41
  export declare class EcsFargateTaskConstruct extends Construct {
41
42
  readonly cluster: ecs.ICluster;
42
43
  readonly taskDefinition: ecs.FargateTaskDefinition;
44
+ readonly taskExecutionRole: IRole;
43
45
  readonly securityGroup: ec2.ISecurityGroup;
44
46
  readonly containerDefinition: ecs.ContainerDefinition;
45
47
  constructor(scope: Construct, id: string, props: FargateEcsTaskConstructProps);
package/ecs/index.js CHANGED
@@ -55,9 +55,10 @@ exports.LAMBDA_ARCHITECTURE_MAP = {
55
55
  ['ARM64']: lambda.Architecture.ARM_64
56
56
  };
57
57
  class EcsFargateTaskConstruct extends constructs_1.Construct {
58
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.ecs.EcsFargateTaskConstruct", version: "0.0.27" };
58
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.ecs.EcsFargateTaskConstruct", version: "0.0.29" };
59
59
  cluster;
60
60
  taskDefinition;
61
+ taskExecutionRole;
61
62
  securityGroup;
62
63
  containerDefinition;
63
64
  constructor(scope, id, props) {
@@ -77,7 +78,7 @@ class EcsFargateTaskConstruct extends constructs_1.Construct {
77
78
  // Allow the task definition role ecr access to the guardduty agent
78
79
  // https://docs.aws.amazon.com/guardduty/latest/ug/prereq-runtime-monitoring-ecs-support.html#before-enable-runtime-monitoring-ecs
79
80
  // Which is in another account - 005257825471.dkr.ecr.ap-southeast-2.amazonaws.com/aws-guardduty-agent-fargate
80
- const taskExecutionRole = new iam.Role(this, `task-execution-role`, {
81
+ this.taskExecutionRole = new iam.Role(this, `TaskExecutionRole`, {
81
82
  assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
82
83
  managedPolicies: [aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName('service-role/AmazonECSTaskExecutionRolePolicy')],
83
84
  });
@@ -89,7 +90,7 @@ class EcsFargateTaskConstruct extends constructs_1.Construct {
89
90
  runtimePlatform: {
90
91
  cpuArchitecture: props.runtimePlatform ?? exports.CPU_ARCHITECTURE_MAP[architecture],
91
92
  },
92
- executionRole: taskExecutionRole
93
+ executionRole: this.taskExecutionRole
93
94
  });
94
95
  // Set up the security group
95
96
  this.securityGroup = new ec2.SecurityGroup(this, 'FargateSecurityGroup', {
@@ -112,4 +113,4 @@ class EcsFargateTaskConstruct extends constructs_1.Construct {
112
113
  }
113
114
  }
114
115
  exports.EcsFargateTaskConstruct = EcsFargateTaskConstruct;
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXFDO0FBQ3JDLHFDQUFnRjtBQUNoRix5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLGlEQUFzRDtBQUN0RCwrREFBaUQ7QUFDakQsc0VBQXdEO0FBQ3hELHlEQUEyQztBQUMzQyxtREFBbUQ7QUFDbkQsNERBQXFEO0FBQ3JELGlEQUFrRDtBQXFCckMsUUFBQSxvQkFBb0IsR0FBOEM7SUFDM0UsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU07SUFDdEMsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUs7Q0FDdkMsQ0FBQTtBQUVZLFFBQUEsdUJBQXVCLEdBQThDO0lBQzlFLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNO0lBQ3RDLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNO0NBQ3hDLENBQUE7QUEwQ0QsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUzs7SUFDbEMsT0FBTyxDQUFjO0lBQ3JCLGNBQWMsQ0FBMkI7SUFDekMsYUFBYSxDQUFvQjtJQUNqQyxtQkFBbUIsQ0FBeUI7SUFFNUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFtQztRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLG1DQUFtQztRQUNuQyxNQUFNLFlBQVksR0FBaUIsS0FBSyxDQUFDLFlBQVksSUFBSSw2QkFBb0IsQ0FBQTtRQUU3RSxzQkFBc0I7UUFDdEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQzlCLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDYixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxxQkFBUTtTQUNyQyxDQUNKLENBQUE7UUFFRCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ25ELEdBQUcsRUFBRSxPQUFPO1lBQ1osOEJBQThCLEVBQUUsSUFBSTtZQUNwQyxtQkFBbUIsRUFBRSwyQkFBaUIsQ0FBQyxPQUFPO1NBQ2pELENBQUMsQ0FBQTtRQUVGLG1FQUFtRTtRQUNuRSxrSUFBa0k7UUFDbEksOEdBQThHO1FBQzlHLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtZQUNsRSxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLENBQUM7WUFDOUQsZUFBZSxFQUFFLENBQUMsdUJBQWEsQ0FBQyx3QkFBd0IsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1NBQzNHLENBQUMsQ0FBQTtRQUVGLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUN4RSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLHNCQUFhLENBQUMsR0FBRyxJQUFJO1lBQzFDLDBEQUEwRDtZQUMxRCxjQUFjLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLDBCQUFpQixDQUFDLEdBQUcsSUFBSTtZQUNsRSxlQUFlLEVBQUU7Z0JBQ2IsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLElBQUksNEJBQW9CLENBQUMsWUFBWSxDQUFDO2FBQy9FO1lBQ0QsYUFBYSxFQUFFLGlCQUFpQjtTQUNuQyxDQUFDLENBQUE7UUFFRiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQ3JFLEdBQUcsRUFBRSxPQUFPO1lBQ1osV0FBVyxFQUFFLGtDQUFrQztTQUNsRCxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUU7WUFDNUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLEtBQUssRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUMxQyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7Z0JBQ3ZELFNBQVMsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDM0IsU0FBUyxFQUFFO29CQUNQLGNBQWMsRUFBRSwrQkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxjQUFjO2lCQUN2RTthQUNKLENBQUMsQ0FDTDtZQUNELE9BQU8sRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDM0IsWUFBWSxFQUFFLEtBQUssQ0FBQyxhQUFhO2dCQUNqQyxZQUFZLEVBQUUsd0JBQWEsQ0FBQyxRQUFRO2FBQ3ZDLENBQUM7U0FDTCxDQUFDLENBQUM7SUFDUCxDQUFDOztBQWxFTCwwREFtRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbnN0cnVjdH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7REVGQVVMVF9BUkNISVRFQ1RVUkUsIERFRkFVTFRfTUVNT1JZX0dCLCBERUZBVUxUX1ZDUFVTfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0ICogYXMgZWNzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQge0NvbnRhaW5lckluc2lnaHRzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgKiBhcyBlY3JBc3NldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3ItYXNzZXRzXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7UmV0ZW50aW9uRGF5c30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQge1ZQQ19OQU1FfSBmcm9tIFwiLi4vc2hhcmVkLWNvbmZpZy9uZXR3b3JraW5nXCI7XG5pbXBvcnQge01hbmFnZWRQb2xpY3l9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5cbi8vIE1lbW9yeSBhbmQgQ1BVIGxpbWl0cyBmb3IgRmFyZ2F0ZSB0YXNrc1xuLypcbjI1NiAoLjI1IHZDUFUpIC0gQXZhaWxhYmxlIG1lbW9yeSB2YWx1ZXM6IDUxMiAoMC41IEdCKSwgMTAyNCAoMSBHQiksIDIwNDggKDIgR0IpXG5cbjUxMiAoLjUgdkNQVSkgLSBBdmFpbGFibGUgbWVtb3J5IHZhbHVlczogMTAyNCAoMSBHQiksIDIwNDggKDIgR0IpLCAzMDcyICgzIEdCKSwgNDA5NiAoNCBHQilcblxuMTAyNCAoMSB2Q1BVKSAtIEF2YWlsYWJsZSBtZW1vcnkgdmFsdWVzOiAyMDQ4ICgyIEdCKSwgMzA3MiAoMyBHQiksIDQwOTYgKDQgR0IpLCA1MTIwICg1IEdCKSwgNjE0NCAoNiBHQiksIDcxNjggKDcgR0IpLCA4MTkyICg4IEdCKVxuXG4yMDQ4ICgyIHZDUFUpIC0gQXZhaWxhYmxlIG1lbW9yeSB2YWx1ZXM6IEJldHdlZW4gNDA5NiAoNCBHQikgYW5kIDE2Mzg0ICgxNiBHQikgaW4gaW5jcmVtZW50cyBvZiAxMDI0ICgxIEdCKVxuXG40MDk2ICg0IHZDUFUpIC0gQXZhaWxhYmxlIG1lbW9yeSB2YWx1ZXM6IEJldHdlZW4gODE5MiAoOCBHQikgYW5kIDMwNzIwICgzMCBHQikgaW4gaW5jcmVtZW50cyBvZiAxMDI0ICgxIEdCKVxuXG44MTkyICg4IHZDUFUpIC0gQXZhaWxhYmxlIG1lbW9yeSB2YWx1ZXM6IEJldHdlZW4gMTYzODQgKDE2IEdCKSBhbmQgNjE0NDAgKDYwIEdCKSBpbiBpbmNyZW1lbnRzIG9mIDQwOTYgKDQgR0IpXG5cbjE2Mzg0ICgxNiB2Q1BVKSAtIEF2YWlsYWJsZSBtZW1vcnkgdmFsdWVzOiBCZXR3ZWVuIDMyNzY4ICgzMiBHQikgYW5kIDEyMjg4MCAoMTIwIEdCKSBpbiBpbmNyZW1lbnRzIG9mIDgxOTIgKDggR0IpXG4qL1xuXG5leHBvcnQgdHlwZSBBcmNoaXRlY3R1cmUgPSAnWDg2XzY0JyB8ICdBUk02NCdcblxuZXhwb3J0IGNvbnN0IENQVV9BUkNISVRFQ1RVUkVfTUFQOiBSZWNvcmQ8QXJjaGl0ZWN0dXJlLCBlY3MuQ3B1QXJjaGl0ZWN0dXJlPiA9IHtcbiAgICBbJ1g4Nl82NCddOiBlY3MuQ3B1QXJjaGl0ZWN0dXJlLlg4Nl82NCxcbiAgICBbJ0FSTTY0J106IGVjcy5DcHVBcmNoaXRlY3R1cmUuQVJNNjRcbn1cblxuZXhwb3J0IGNvbnN0IExBTUJEQV9BUkNISVRFQ1RVUkVfTUFQOiBSZWNvcmQ8QXJjaGl0ZWN0dXJlLCBsYW1iZGEuQXJjaGl0ZWN0dXJlPiA9IHtcbiAgICBbJ1g4Nl82NCddOiBsYW1iZGEuQXJjaGl0ZWN0dXJlLlg4Nl82NCxcbiAgICBbJ0FSTTY0J106IGxhbWJkYS5BcmNoaXRlY3R1cmUuQVJNXzY0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFyZ2F0ZUVjc1Rhc2tDb25zdHJ1Y3RQcm9wcyB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIFZQQyB0byB1c2UuIElmIG5vdCBwcm92aWRlZCwgdGhlIEBERUZBVUxUX01BSU5fVlBDX05BTUUgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHZwY05hbWU/OiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIFRoZSBydW50aW1lIENQVSBhcmNoaXRlY3R1cmUsIGVpdGhlciBYODZfNjQgb3IgQVJNNjQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGRlZmF1bHQgaXMgQERFRkFVTFRfQVJDSElURUNUVVJFLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJ1bnRpbWVQbGF0Zm9ybT86IGVjcy5DcHVBcmNoaXRlY3R1cmVcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgQ1BVcyB0byB1c2UsIGJldHdlZW4gMC4yNSBhbmQgMTYuIElmIG5vdCBwcm92aWRlZCwgdGhlIGRlZmF1bHQgaXMgQERFRkFVTFRfVkNQVVMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbkNwdXM6IG51bWJlciAvLyBOdW1iZXIgb2YgQ1BVcyAoMC4yNSwgMC41LCAxLCAyLCA0LCA4LCAxNilcblxuICAgIC8qKlxuICAgICAqIFRoZSBtZW1vcnkgbGltaXQgaW4gR2lCLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGlzIEBERUZBVUxUX01FTU9SWV9HQi5cbiAgICAgKiBUaGUgbWVtb3J5IGxpbWl0IG11c3QgYmUgYmV0d2VlbiAwLjUgYW5kIDEyMCBHaUIuXG4gICAgICogQnV0IHBsZWFzZSBub3RlIHRoYXQgdGhlIG1lbW9yeSBsaW1pdCB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgQ1BVcywgcGxlYXNlIHJlZmVyIHRvIHRoZSB0YWJsZSBhYm92ZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBtZW1vcnlMaW1pdEdpQjogbnVtYmVyXG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBjb250YWluZXIuIElmIG5vdCBwcm92aWRlZCwgdGhlIGRlZmF1bHQgaXMgQERFRkFVTFRfQVJDSElURUNUVVJFLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZVxuXG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyLiBUaGlzIGlzIGEgcmVxdWlyZWQgcHJvcGVydHlcbiAgICAgKi9cbiAgICByZWFkb25seSBjb250YWluZXJOYW1lOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIFRoZSBwYXRoIHRvIHRoZSBEb2NrZXJmaWxlLiBUaGlzIGlzIGEgcmVxdWlyZWQgcHJvcGVydHlcbiAgICAgKi9cbiAgICByZWFkb25seSBkb2NrZXJQYXRoOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEVjc0ZhcmdhdGVUYXNrQ29uc3RydWN0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2x1c3RlcjogZWNzLklDbHVzdGVyXG4gICAgcHVibGljIHJlYWRvbmx5IHRhc2tEZWZpbml0aW9uOiBlY3MuRmFyZ2F0ZVRhc2tEZWZpbml0aW9uXG4gICAgcHVibGljIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXA6IGVjMi5JU2VjdXJpdHlHcm91cFxuICAgIHB1YmxpYyByZWFkb25seSBjb250YWluZXJEZWZpbml0aW9uOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvblxuXG4gICAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEZhcmdhdGVFY3NUYXNrQ29uc3RydWN0UHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgICAgICAvLyBTZXQgYXJjaGl0ZWN0dXJlIGlmIG5vdCBwcm92aWRlZFxuICAgICAgICBjb25zdCBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZSA9IHByb3BzLmFyY2hpdGVjdHVyZSA/PyBERUZBVUxUX0FSQ0hJVEVDVFVSRVxuXG4gICAgICAgIC8vIFNldCB1cCB0aGUgbWFpbiB2cGNcbiAgICAgICAgY29uc3QgbWFpblZwYyA9IGVjMi5WcGMuZnJvbUxvb2t1cChcbiAgICAgICAgICAgIHRoaXMsICdNYWluVnBjJywge1xuICAgICAgICAgICAgICAgIHZwY05hbWU6IHByb3BzLnZwY05hbWUgPz8gVlBDX05BTUVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuXG4gICAgICAgIC8vIFNldCB1cCB0aGUgRUNTIGNsdXN0ZXJcbiAgICAgICAgdGhpcy5jbHVzdGVyID0gbmV3IGVjcy5DbHVzdGVyKHRoaXMsICdGYXJnYXRlQ2x1c3RlcicsIHtcbiAgICAgICAgICAgIHZwYzogbWFpblZwYyxcbiAgICAgICAgICAgIGVuYWJsZUZhcmdhdGVDYXBhY2l0eVByb3ZpZGVyczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbnRhaW5lckluc2lnaHRzVjI6IENvbnRhaW5lckluc2lnaHRzLkVOQUJMRURcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBBbGxvdyB0aGUgdGFzayBkZWZpbml0aW9uIHJvbGUgZWNyIGFjY2VzcyB0byB0aGUgZ3VhcmRkdXR5IGFnZW50XG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ndWFyZGR1dHkvbGF0ZXN0L3VnL3ByZXJlcS1ydW50aW1lLW1vbml0b3JpbmctZWNzLXN1cHBvcnQuaHRtbCNiZWZvcmUtZW5hYmxlLXJ1bnRpbWUtbW9uaXRvcmluZy1lY3NcbiAgICAgICAgLy8gV2hpY2ggaXMgaW4gYW5vdGhlciBhY2NvdW50IC0gMDA1MjU3ODI1NDcxLmRrci5lY3IuYXAtc291dGhlYXN0LTIuYW1hem9uYXdzLmNvbS9hd3MtZ3VhcmRkdXR5LWFnZW50LWZhcmdhdGVcbiAgICAgICAgY29uc3QgdGFza0V4ZWN1dGlvblJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgYHRhc2stZXhlY3V0aW9uLXJvbGVgLCB7XG4gICAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2Vjcy10YXNrcy5hbWF6b25hd3MuY29tJyksXG4gICAgICAgICAgbWFuYWdlZFBvbGljaWVzOiBbTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BbWF6b25FQ1NUYXNrRXhlY3V0aW9uUm9sZVBvbGljeScpXSxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTZXQgdXAgdGhlIEZhcmdhdGUgdGFzayBkZWZpbml0aW9uXG4gICAgICAgIHRoaXMudGFza0RlZmluaXRpb24gPSBuZXcgZWNzLkZhcmdhdGVUYXNrRGVmaW5pdGlvbih0aGlzLCAnRmFyZ2F0ZVRhc2tEZWYnLCB7XG4gICAgICAgICAgICBjcHU6IChwcm9wcy5uQ3B1cyA/PyBERUZBVUxUX1ZDUFVTKSAqIDEwMjQsXG4gICAgICAgICAgICAvLyBDb252ZXJ0IG1lbW9yeSBsaW1pdCBmcm9tIEdpQiB0byBNaUIgKDEgR2lCID0gMTAyNCBNaUIpXG4gICAgICAgICAgICBtZW1vcnlMaW1pdE1pQjogKHByb3BzLm1lbW9yeUxpbWl0R2lCID8/IERFRkFVTFRfTUVNT1JZX0dCKSAqIDEwMjQsXG4gICAgICAgICAgICBydW50aW1lUGxhdGZvcm06IHtcbiAgICAgICAgICAgICAgICBjcHVBcmNoaXRlY3R1cmU6IHByb3BzLnJ1bnRpbWVQbGF0Zm9ybSA/PyBDUFVfQVJDSElURUNUVVJFX01BUFthcmNoaXRlY3R1cmVdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4ZWN1dGlvblJvbGU6IHRhc2tFeGVjdXRpb25Sb2xlXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU2V0IHVwIHRoZSBzZWN1cml0eSBncm91cFxuICAgICAgICB0aGlzLnNlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgJ0ZhcmdhdGVTZWN1cml0eUdyb3VwJywge1xuICAgICAgICAgICAgdnBjOiBtYWluVnBjLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTZWN1cml0eSBncm91cCBmb3IgRmFyZ2F0ZSB0YXNrcydcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbnRhaW5lckRlZmluaXRpb24gPSB0aGlzLnRhc2tEZWZpbml0aW9uLmFkZENvbnRhaW5lcignRmFyZ2F0ZUNvbnRhaW5lcicsIHtcbiAgICAgICAgICAgIGNvbnRhaW5lck5hbWU6IHByb3BzLmNvbnRhaW5lck5hbWUsXG4gICAgICAgICAgICBpbWFnZTogZWNzLkNvbnRhaW5lckltYWdlLmZyb21Eb2NrZXJJbWFnZUFzc2V0KFxuICAgICAgICAgICAgICAgIG5ldyBlY3JBc3NldHMuRG9ja2VySW1hZ2VBc3NldCh0aGlzLCAnRmFyZ2F0ZURvY2tlckltYWdlJywge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6IHByb3BzLmRvY2tlclBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkQXJnczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgVEFSR0VUUExBVEZPUk06IExBTUJEQV9BUkNISVRFQ1RVUkVfTUFQW2FyY2hpdGVjdHVyZV0uZG9ja2VyUGxhdGZvcm1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlci5hd3NMb2dzKHtcbiAgICAgICAgICAgICAgICBzdHJlYW1QcmVmaXg6IHByb3BzLmNvbnRhaW5lck5hbWUsXG4gICAgICAgICAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9XRUVLXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXFDO0FBQ3JDLHFDQUFnRjtBQUNoRix5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLGlEQUFzRDtBQUN0RCwrREFBaUQ7QUFDakQsc0VBQXdEO0FBQ3hELHlEQUEyQztBQUMzQyxtREFBbUQ7QUFDbkQsNERBQXFEO0FBQ3JELGlEQUF5RDtBQXFCNUMsUUFBQSxvQkFBb0IsR0FBOEM7SUFDM0UsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU07SUFDdEMsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUs7Q0FDdkMsQ0FBQTtBQUVZLFFBQUEsdUJBQXVCLEdBQThDO0lBQzlFLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNO0lBQ3RDLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNO0NBQ3hDLENBQUE7QUEwQ0QsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUzs7SUFDbEMsT0FBTyxDQUFjO0lBQ3JCLGNBQWMsQ0FBMkI7SUFDekMsaUJBQWlCLENBQU87SUFDeEIsYUFBYSxDQUFvQjtJQUNqQyxtQkFBbUIsQ0FBeUI7SUFFNUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFtQztRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLG1DQUFtQztRQUNuQyxNQUFNLFlBQVksR0FBaUIsS0FBSyxDQUFDLFlBQVksSUFBSSw2QkFBb0IsQ0FBQTtRQUU3RSxzQkFBc0I7UUFDdEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQzlCLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDYixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxxQkFBUTtTQUNyQyxDQUNKLENBQUE7UUFFRCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ25ELEdBQUcsRUFBRSxPQUFPO1lBQ1osOEJBQThCLEVBQUUsSUFBSTtZQUNwQyxtQkFBbUIsRUFBRSwyQkFBaUIsQ0FBQyxPQUFPO1NBQ2pELENBQUMsQ0FBQTtRQUVGLG1FQUFtRTtRQUNuRSxrSUFBa0k7UUFDbEksOEdBQThHO1FBQzlHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQy9ELFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQztZQUM5RCxlQUFlLEVBQUUsQ0FBQyx1QkFBYSxDQUFDLHdCQUF3QixDQUFDLCtDQUErQyxDQUFDLENBQUM7U0FDM0csQ0FBQyxDQUFBO1FBRUYscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ3hFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksc0JBQWEsQ0FBQyxHQUFHLElBQUk7WUFDMUMsMERBQTBEO1lBQzFELGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLElBQUksMEJBQWlCLENBQUMsR0FBRyxJQUFJO1lBQ2xFLGVBQWUsRUFBRTtnQkFDYixlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWUsSUFBSSw0QkFBb0IsQ0FBQyxZQUFZLENBQUM7YUFDL0U7WUFDRCxhQUFhLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtTQUN4QyxDQUFDLENBQUE7UUFFRiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQ3JFLEdBQUcsRUFBRSxPQUFPO1lBQ1osV0FBVyxFQUFFLGtDQUFrQztTQUNsRCxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUU7WUFDNUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLEtBQUssRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUMxQyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7Z0JBQ3ZELFNBQVMsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDM0IsU0FBUyxFQUFFO29CQUNQLGNBQWMsRUFBRSwrQkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxjQUFjO2lCQUN2RTthQUNKLENBQUMsQ0FDTDtZQUNELE9BQU8sRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDM0IsWUFBWSxFQUFFLEtBQUssQ0FBQyxhQUFhO2dCQUNqQyxZQUFZLEVBQUUsd0JBQWEsQ0FBQyxRQUFRO2FBQ3ZDLENBQUM7U0FDTCxDQUFDLENBQUM7SUFDUCxDQUFDOztBQW5FTCwwREFvRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbnN0cnVjdH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7REVGQVVMVF9BUkNISVRFQ1RVUkUsIERFRkFVTFRfTUVNT1JZX0dCLCBERUZBVUxUX1ZDUFVTfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0ICogYXMgZWNzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQge0NvbnRhaW5lckluc2lnaHRzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgKiBhcyBlY3JBc3NldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3ItYXNzZXRzXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7UmV0ZW50aW9uRGF5c30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQge1ZQQ19OQU1FfSBmcm9tIFwiLi4vc2hhcmVkLWNvbmZpZy9uZXR3b3JraW5nXCI7XG5pbXBvcnQge0lSb2xlLCBNYW5hZ2VkUG9saWN5fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuXG4vLyBNZW1vcnkgYW5kIENQVSBsaW1pdHMgZm9yIEZhcmdhdGUgdGFza3Ncbi8qXG4yNTYgKC4yNSB2Q1BVKSAtIEF2YWlsYWJsZSBtZW1vcnkgdmFsdWVzOiA1MTIgKDAuNSBHQiksIDEwMjQgKDEgR0IpLCAyMDQ4ICgyIEdCKVxuXG41MTIgKC41IHZDUFUpIC0gQXZhaWxhYmxlIG1lbW9yeSB2YWx1ZXM6IDEwMjQgKDEgR0IpLCAyMDQ4ICgyIEdCKSwgMzA3MiAoMyBHQiksIDQwOTYgKDQgR0IpXG5cbjEwMjQgKDEgdkNQVSkgLSBBdmFpbGFibGUgbWVtb3J5IHZhbHVlczogMjA0OCAoMiBHQiksIDMwNzIgKDMgR0IpLCA0MDk2ICg0IEdCKSwgNTEyMCAoNSBHQiksIDYxNDQgKDYgR0IpLCA3MTY4ICg3IEdCKSwgODE5MiAoOCBHQilcblxuMjA0OCAoMiB2Q1BVKSAtIEF2YWlsYWJsZSBtZW1vcnkgdmFsdWVzOiBCZXR3ZWVuIDQwOTYgKDQgR0IpIGFuZCAxNjM4NCAoMTYgR0IpIGluIGluY3JlbWVudHMgb2YgMTAyNCAoMSBHQilcblxuNDA5NiAoNCB2Q1BVKSAtIEF2YWlsYWJsZSBtZW1vcnkgdmFsdWVzOiBCZXR3ZWVuIDgxOTIgKDggR0IpIGFuZCAzMDcyMCAoMzAgR0IpIGluIGluY3JlbWVudHMgb2YgMTAyNCAoMSBHQilcblxuODE5MiAoOCB2Q1BVKSAtIEF2YWlsYWJsZSBtZW1vcnkgdmFsdWVzOiBCZXR3ZWVuIDE2Mzg0ICgxNiBHQikgYW5kIDYxNDQwICg2MCBHQikgaW4gaW5jcmVtZW50cyBvZiA0MDk2ICg0IEdCKVxuXG4xNjM4NCAoMTYgdkNQVSkgLSBBdmFpbGFibGUgbWVtb3J5IHZhbHVlczogQmV0d2VlbiAzMjc2OCAoMzIgR0IpIGFuZCAxMjI4ODAgKDEyMCBHQikgaW4gaW5jcmVtZW50cyBvZiA4MTkyICg4IEdCKVxuKi9cblxuZXhwb3J0IHR5cGUgQXJjaGl0ZWN0dXJlID0gJ1g4Nl82NCcgfCAnQVJNNjQnXG5cbmV4cG9ydCBjb25zdCBDUFVfQVJDSElURUNUVVJFX01BUDogUmVjb3JkPEFyY2hpdGVjdHVyZSwgZWNzLkNwdUFyY2hpdGVjdHVyZT4gPSB7XG4gICAgWydYODZfNjQnXTogZWNzLkNwdUFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgWydBUk02NCddOiBlY3MuQ3B1QXJjaGl0ZWN0dXJlLkFSTTY0XG59XG5cbmV4cG9ydCBjb25zdCBMQU1CREFfQVJDSElURUNUVVJFX01BUDogUmVjb3JkPEFyY2hpdGVjdHVyZSwgbGFtYmRhLkFyY2hpdGVjdHVyZT4gPSB7XG4gICAgWydYODZfNjQnXTogbGFtYmRhLkFyY2hpdGVjdHVyZS5YODZfNjQsXG4gICAgWydBUk02NCddOiBsYW1iZGEuQXJjaGl0ZWN0dXJlLkFSTV82NFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhcmdhdGVFY3NUYXNrQ29uc3RydWN0UHJvcHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBWUEMgdG8gdXNlLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBAREVGQVVMVF9NQUlOX1ZQQ19OQU1FIHdpbGwgYmUgdXNlZC5cbiAgICAgKi9cbiAgICByZWFkb25seSB2cGNOYW1lPzogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBUaGUgcnVudGltZSBDUFUgYXJjaGl0ZWN0dXJlLCBlaXRoZXIgWDg2XzY0IG9yIEFSTTY0LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGlzIEBERUZBVUxUX0FSQ0hJVEVDVFVSRS5cbiAgICAgKi9cbiAgICByZWFkb25seSBydW50aW1lUGxhdGZvcm0/OiBlY3MuQ3B1QXJjaGl0ZWN0dXJlXG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIENQVXMgdG8gdXNlLCBiZXR3ZWVuIDAuMjUgYW5kIDE2LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGlzIEBERUZBVUxUX1ZDUFVTLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5DcHVzOiBudW1iZXIgLy8gTnVtYmVyIG9mIENQVXMgKDAuMjUsIDAuNSwgMSwgMiwgNCwgOCwgMTYpXG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWVtb3J5IGxpbWl0IGluIEdpQi4gSWYgbm90IHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBpcyBAREVGQVVMVF9NRU1PUllfR0IuXG4gICAgICogVGhlIG1lbW9yeSBsaW1pdCBtdXN0IGJlIGJldHdlZW4gMC41IGFuZCAxMjAgR2lCLlxuICAgICAqIEJ1dCBwbGVhc2Ugbm90ZSB0aGF0IHRoZSBtZW1vcnkgbGltaXQgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIENQVXMsIHBsZWFzZSByZWZlciB0byB0aGUgdGFibGUgYWJvdmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbWVtb3J5TGltaXRHaUI6IG51bWJlclxuXG4gICAgLyoqXG4gICAgICogVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgY29udGFpbmVyLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGlzIEBERUZBVUxUX0FSQ0hJVEVDVFVSRS5cbiAgICAgKi9cbiAgICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmVcblxuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lci4gVGhpcyBpcyBhIHJlcXVpcmVkIHByb3BlcnR5XG4gICAgICovXG4gICAgcmVhZG9ubHkgY29udGFpbmVyTmFtZTogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGF0aCB0byB0aGUgRG9ja2VyZmlsZS4gVGhpcyBpcyBhIHJlcXVpcmVkIHByb3BlcnR5XG4gICAgICovXG4gICAgcmVhZG9ubHkgZG9ja2VyUGF0aDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBFY3NGYXJnYXRlVGFza0NvbnN0cnVjdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gICAgcHVibGljIHJlYWRvbmx5IGNsdXN0ZXI6IGVjcy5JQ2x1c3RlclxuICAgIHB1YmxpYyByZWFkb25seSB0YXNrRGVmaW5pdGlvbjogZWNzLkZhcmdhdGVUYXNrRGVmaW5pdGlvblxuICAgIHB1YmxpYyByZWFkb25seSB0YXNrRXhlY3V0aW9uUm9sZTogSVJvbGVcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VjdXJpdHlHcm91cDogZWMyLklTZWN1cml0eUdyb3VwXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lckRlZmluaXRpb246IGVjcy5Db250YWluZXJEZWZpbml0aW9uXG5cbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRmFyZ2F0ZUVjc1Rhc2tDb25zdHJ1Y3RQcm9wcykge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgICAgIC8vIFNldCBhcmNoaXRlY3R1cmUgaWYgbm90IHByb3ZpZGVkXG4gICAgICAgIGNvbnN0IGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlID0gcHJvcHMuYXJjaGl0ZWN0dXJlID8/IERFRkFVTFRfQVJDSElURUNUVVJFXG5cbiAgICAgICAgLy8gU2V0IHVwIHRoZSBtYWluIHZwY1xuICAgICAgICBjb25zdCBtYWluVnBjID0gZWMyLlZwYy5mcm9tTG9va3VwKFxuICAgICAgICAgICAgdGhpcywgJ01haW5WcGMnLCB7XG4gICAgICAgICAgICAgICAgdnBjTmFtZTogcHJvcHMudnBjTmFtZSA/PyBWUENfTkFNRVxuICAgICAgICAgICAgfVxuICAgICAgICApXG5cbiAgICAgICAgLy8gU2V0IHVwIHRoZSBFQ1MgY2x1c3RlclxuICAgICAgICB0aGlzLmNsdXN0ZXIgPSBuZXcgZWNzLkNsdXN0ZXIodGhpcywgJ0ZhcmdhdGVDbHVzdGVyJywge1xuICAgICAgICAgICAgdnBjOiBtYWluVnBjLFxuICAgICAgICAgICAgZW5hYmxlRmFyZ2F0ZUNhcGFjaXR5UHJvdmlkZXJzOiB0cnVlLFxuICAgICAgICAgICAgY29udGFpbmVySW5zaWdodHNWMjogQ29udGFpbmVySW5zaWdodHMuRU5BQkxFRFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEFsbG93IHRoZSB0YXNrIGRlZmluaXRpb24gcm9sZSBlY3IgYWNjZXNzIHRvIHRoZSBndWFyZGR1dHkgYWdlbnRcbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2d1YXJkZHV0eS9sYXRlc3QvdWcvcHJlcmVxLXJ1bnRpbWUtbW9uaXRvcmluZy1lY3Mtc3VwcG9ydC5odG1sI2JlZm9yZS1lbmFibGUtcnVudGltZS1tb25pdG9yaW5nLWVjc1xuICAgICAgICAvLyBXaGljaCBpcyBpbiBhbm90aGVyIGFjY291bnQgLSAwMDUyNTc4MjU0NzEuZGtyLmVjci5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tL2F3cy1ndWFyZGR1dHktYWdlbnQtZmFyZ2F0ZVxuICAgICAgICB0aGlzLnRhc2tFeGVjdXRpb25Sb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsIGBUYXNrRXhlY3V0aW9uUm9sZWAsIHtcbiAgICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZWNzLXRhc2tzLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgICBtYW5hZ2VkUG9saWNpZXM6IFtNYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FtYXpvbkVDU1Rhc2tFeGVjdXRpb25Sb2xlUG9saWN5JyldLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNldCB1cCB0aGUgRmFyZ2F0ZSB0YXNrIGRlZmluaXRpb25cbiAgICAgICAgdGhpcy50YXNrRGVmaW5pdGlvbiA9IG5ldyBlY3MuRmFyZ2F0ZVRhc2tEZWZpbml0aW9uKHRoaXMsICdGYXJnYXRlVGFza0RlZicsIHtcbiAgICAgICAgICAgIGNwdTogKHByb3BzLm5DcHVzID8/IERFRkFVTFRfVkNQVVMpICogMTAyNCxcbiAgICAgICAgICAgIC8vIENvbnZlcnQgbWVtb3J5IGxpbWl0IGZyb20gR2lCIHRvIE1pQiAoMSBHaUIgPSAxMDI0IE1pQilcbiAgICAgICAgICAgIG1lbW9yeUxpbWl0TWlCOiAocHJvcHMubWVtb3J5TGltaXRHaUIgPz8gREVGQVVMVF9NRU1PUllfR0IpICogMTAyNCxcbiAgICAgICAgICAgIHJ1bnRpbWVQbGF0Zm9ybToge1xuICAgICAgICAgICAgICAgIGNwdUFyY2hpdGVjdHVyZTogcHJvcHMucnVudGltZVBsYXRmb3JtID8/IENQVV9BUkNISVRFQ1RVUkVfTUFQW2FyY2hpdGVjdHVyZV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhlY3V0aW9uUm9sZTogdGhpcy50YXNrRXhlY3V0aW9uUm9sZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNldCB1cCB0aGUgc2VjdXJpdHkgZ3JvdXBcbiAgICAgICAgdGhpcy5zZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsICdGYXJnYXRlU2VjdXJpdHlHcm91cCcsIHtcbiAgICAgICAgICAgIHZwYzogbWFpblZwYyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU2VjdXJpdHkgZ3JvdXAgZm9yIEZhcmdhdGUgdGFza3MnXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb250YWluZXJEZWZpbml0aW9uID0gdGhpcy50YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoJ0ZhcmdhdGVDb250YWluZXInLCB7XG4gICAgICAgICAgICBjb250YWluZXJOYW1lOiBwcm9wcy5jb250YWluZXJOYW1lLFxuICAgICAgICAgICAgaW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZS5mcm9tRG9ja2VySW1hZ2VBc3NldChcbiAgICAgICAgICAgICAgICBuZXcgZWNyQXNzZXRzLkRvY2tlckltYWdlQXNzZXQodGhpcywgJ0ZhcmdhdGVEb2NrZXJJbWFnZScsIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5OiBwcm9wcy5kb2NrZXJQYXRoLFxuICAgICAgICAgICAgICAgICAgICBidWlsZEFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRBUkdFVFBMQVRGT1JNOiBMQU1CREFfQVJDSElURUNUVVJFX01BUFthcmNoaXRlY3R1cmVdLmRvY2tlclBsYXRmb3JtXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGxvZ2dpbmc6IGVjcy5Mb2dEcml2ZXIuYXdzTG9ncyh7XG4gICAgICAgICAgICAgICAgc3RyZWFtUHJlZml4OiBwcm9wcy5jb250YWluZXJOYW1lLFxuICAgICAgICAgICAgICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfV0VFS1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
package/lambda/index.js CHANGED
@@ -56,7 +56,7 @@ function getPythonUvDockerImage() {
56
56
  return aws_cdk_lib_1.DockerImage.fromBuild(path_1.default.join(__dirname, 'build_python'));
57
57
  }
58
58
  class PythonUvFunction extends aws_lambda_python_alpha_1.PythonFunction {
59
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.lambda.PythonUvFunction", version: "0.0.27" };
59
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.lambda.PythonUvFunction", version: "0.0.29" };
60
60
  // Class constructs, to be used for caching the layers
61
61
  // This means that if there are multiple lambdas throughout the stack
62
62
  // They will all use the same layer
@@ -12,21 +12,62 @@
12
12
  """
13
13
 
14
14
  from typing import (
15
- TypedDict, NotRequired, Literal, List
15
+ TypedDict, NotRequired, Literal, List, Union
16
16
  )
17
17
 
18
18
  JobType = Literal['FASTQ_DECOMPRESSION']
19
19
  JobStatus = Literal['PENDING', 'RUNNING', 'FAILED', 'ABORTED', 'SUCCEEDED']
20
20
 
21
+ # Output jobs
22
+ class DecompressionJobOutputObjectItem(TypedDict):
23
+ ingestId: str
24
+ gzipFileUri: str
21
25
 
22
- class JobOutput(TypedDict):
23
- index: str
24
- lane: str
25
- libraryId: str
26
- instrumentRunId: str
27
- read1FileUriDecompressed: str
28
- read2FileUriDecompressed: NotRequired[str]
29
26
 
27
+ class DecompressionJobOutputObjectFastqId(TypedDict):
28
+ fastqId: str
29
+ decompressedFileUriByOraFileIngestIdList: List[DecompressionJobOutputObjectItem]
30
+
31
+
32
+ class GzipFileSizeCalculationOutputObjectItem(TypedDict):
33
+ ingestId: str
34
+ gzipFileSize: int
35
+
36
+
37
+ class GzipFileSizeCalculationOutputsFastqId(TypedDict):
38
+ fastqId: str
39
+ gzipFileSizeByOraFileIngestIdList: List[GzipFileSizeCalculationOutputObjectItem]
40
+
41
+
42
+ class RawMd5sumCalculationOutputsObjectItem(TypedDict):
43
+ ingestId: str
44
+ rawMd5sum: str
45
+
46
+
47
+ class RawMd5sumCalculationOutputsFastqId(TypedDict):
48
+ fastqId: str
49
+ rawMd5sumByOraFileIngestIdList: List[RawMd5sumCalculationOutputsObjectItem]
50
+
51
+
52
+ class DecompressionJobOutputObject(TypedDict):
53
+ # Decompressed file URI by ORA file ingest ID list
54
+ decompressedFileList: List[DecompressionJobOutputObjectFastqId]
55
+
56
+ class GzipFileSizeCalculationOutputObject(TypedDict):
57
+ # Gzip file size by ORA file ingest ID list
58
+ gzipFileSizeList: List[GzipFileSizeCalculationOutputsFastqId]
59
+
60
+
61
+ class RawMd5sumCalculationOutputObject(TypedDict):
62
+ # Raw md5sum by ORA file ingest ID list
63
+ rawMd5sumList: List[RawMd5sumCalculationOutputsFastqId]
64
+
65
+
66
+ JobOutputType = Union[
67
+ DecompressionJobOutputObject |
68
+ GzipFileSizeCalculationOutputObject |
69
+ RawMd5sumCalculationOutputObject
70
+ ]
30
71
 
31
72
  class Job(TypedDict):
32
73
  id: str
@@ -36,7 +77,7 @@ class Job(TypedDict):
36
77
  startTime: str
37
78
  endTime: str
38
79
  errorMessages: NotRequired[str]
39
- outputs: NotRequired[List[JobOutput]]
80
+ outputs: NotRequired[JobOutputType]
40
81
 
41
82
 
42
83
  class JobQueryParameters(TypedDict):
@@ -5,25 +5,28 @@ Update helpers for the update script.
5
5
  """
6
6
 
7
7
  # Standard imports
8
- from typing import Optional
8
+ from typing import Optional, Dict, Any
9
9
 
10
10
  # Local imports
11
11
  from . import fastq_decompression_patch_request
12
12
  from .globals import JOB_ENDPOINT
13
- from .models import Job, JobStatus
13
+ from .models import Job, JobStatus, JobOutputType
14
14
 
15
15
 
16
16
  def update_status(
17
17
  job_id: str,
18
18
  job_status: JobStatus,
19
19
  steps_execution_arn: Optional[str] = None,
20
- error_message: Optional[str] = None
20
+ error_message: Optional[str] = None,
21
+ output: Optional[Dict[str, JobOutputType]] = None
21
22
  ) -> Job:
22
23
  """
23
24
  Add QC stats to a fastq_id.
24
25
 
25
26
  :param job_id: The job id
26
27
  :param job_status: Dictionary of QC stats
28
+ :param steps_execution_arn:
29
+ :param output:
27
30
  :param error_message: Optional error message
28
31
  """
29
32
  return fastq_decompression_patch_request(
@@ -33,7 +36,8 @@ def update_status(
33
36
  {
34
37
  "status": job_status,
35
38
  "errorMessage": error_message,
36
- "stepsExecutionArn": steps_execution_arn
39
+ "stepsExecutionArn": steps_execution_arn,
40
+ "output": output
37
41
  }.items()
38
42
  ))
39
43
  )
@@ -337,5 +337,8 @@ def update_ingest_id(s3_object_id: str, new_ingest_id: str) -> Dict:
337
337
  }
338
338
  return file_manager_patch_request(
339
339
  endpoint=f"{S3_LIST_ENDPOINT}/{s3_object_id}",
340
- params=json_data
340
+ json_data=json_data,
341
+ params = {
342
+ "updateTag": json.dumps(True)
343
+ }
341
344
  )
@@ -12,7 +12,7 @@ const aws_cloudwatch_actions_1 = require("aws-cdk-lib/aws-cloudwatch-actions");
12
12
  * SNS topic.
13
13
  */
14
14
  class MonitoredQueue extends constructs_1.Construct {
15
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.monitoredQueue.MonitoredQueue", version: "0.0.27" };
15
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.monitoredQueue.MonitoredQueue", version: "0.0.29" };
16
16
  queue;
17
17
  deadLetterQueue;
18
18
  alarm;
@@ -7,7 +7,7 @@ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
7
7
  * A construct which represents a named role that a Lambda function can assume.
8
8
  */
9
9
  class NamedLambdaRole extends aws_iam_1.Role {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.namedLambdaRole.NamedLambdaRole", version: "0.0.27" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.namedLambdaRole.NamedLambdaRole", version: "0.0.29" };
11
11
  constructor(scope, id, props) {
12
12
  super(scope, id, {
13
13
  assumedBy: new aws_iam_1.ServicePrincipal("lambda.amazonaws.com"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orcabus/platform-cdk-constructs",
3
- "version": "0.0.27",
3
+ "version": "0.0.29",
4
4
  "description": "CDK Package for OrcaBus infrastructure.",
5
5
  "main": "index.ts",
6
6
  "types": "index.d.ts",
@@ -15,7 +15,7 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
15
15
  * to the provider framework.
16
16
  */
17
17
  class ProviderFunction extends constructs_1.Construct {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.provider.ProviderFunction", version: "0.0.27" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.provider.ProviderFunction", version: "0.0.29" };
19
19
  _function;
20
20
  _response;
21
21
  constructor(scope, id, props) {
@@ -23,7 +23,7 @@ exports.VPC_LOOKUP_PROPS = {
23
23
  * Helper for looking up the shared OrcaBus VPC.
24
24
  */
25
25
  class OrcaBusVpc {
26
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.networking.OrcaBusVpc", version: "0.0.27" };
26
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.networking.OrcaBusVpc", version: "0.0.29" };
27
27
  /**
28
28
  * The shared VPC that is used by OrcaBus.
29
29
  * @param scope
@@ -42,7 +42,7 @@ exports.SHARED_SECURITY_GROUP_NAME = "OrcaBusSharedComputeSecurityGroup";
42
42
  * Helper for looking up the shared compute security group by name.
43
43
  */
44
44
  class OrcaBusSharedComputeSecurityGroup {
45
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.networking.OrcaBusSharedComputeSecurityGroup", version: "0.0.27" };
45
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.networking.OrcaBusSharedComputeSecurityGroup", version: "0.0.29" };
46
46
  /**
47
47
  * The shared security group that is used by compute resources to access the database.
48
48
  * @param scope
@@ -11,7 +11,7 @@ exports.SLACK_ALERTS_SNS_TOPIC = "AwsChatBotTopic-alerts";
11
11
  * A helper class to construct the arn for the slack SNS topic.
12
12
  */
13
13
  class SlackAlerts {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.slack.SlackAlerts", version: "0.0.27" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@orcabus/platform-cdk-constructs.sharedConfig.slack.SlackAlerts", version: "0.0.29" };
15
15
  /**
16
16
  * Format the ARN for the slack alerts SNS topic for the current stack.
17
17
  * @param stack