@restatedev/restate-cdk 1.1.0-rc.2 → 1.1.1-pre.6

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.
@@ -1,8 +1,6 @@
1
1
  name: PR Checks (npm)
2
2
 
3
3
  on:
4
- push:
5
- branches: [main]
6
4
  pull_request:
7
5
  types: [opened, synchronize, reopened, ready_for_review]
8
6
  workflow_dispatch:
@@ -14,7 +12,7 @@ jobs:
14
12
  - uses: actions/checkout@v4
15
13
  - uses: actions/setup-node@v4
16
14
  with:
17
- node-version: "20"
15
+ node-version: "22"
18
16
  - run: npm ci
19
17
  - run: npm run lint
20
18
  - run: npm run build
@@ -1,23 +1,59 @@
1
- name: Publish package to NPM
1
+ name: Publish release to NPM
2
+
2
3
  on:
3
4
  release:
4
5
  types: [published]
6
+
5
7
  jobs:
6
8
  build:
9
+ # prevent from running on forks
10
+ if: github.repository_owner == 'restatedev'
7
11
  runs-on: ubuntu-latest
12
+
8
13
  permissions:
9
- contents: read
14
+ contents: write
10
15
  packages: write
16
+
11
17
  steps:
12
18
  - uses: actions/checkout@v4
13
- # Setup .npmrc file to publish to NPM
14
19
  - uses: actions/setup-node@v4
15
20
  with:
16
- node-version: "20.x"
21
+ node-version: "22.x"
17
22
  registry-url: "https://registry.npmjs.org"
23
+
18
24
  - run: npm ci
25
+
26
+ - name: Extract tag version
27
+ # expected tag format is vX.Y.Z
28
+ run: |
29
+ echo "Full GITHUB_REF: ${GITHUB_REF}"
30
+ TAG_VERSION=${GITHUB_REF#refs/tags/v}
31
+ if [ -z "$TAG_VERSION" ]; then
32
+ echo "Error: TAG_VERSION is empty. Exiting."
33
+ exit 1
34
+ fi
35
+ echo "Extracted TAG_VERSION: $TAG_VERSION"
36
+ echo "TAG_VERSION=$TAG_VERSION" >> $GITHUB_ENV
37
+
38
+ - name: Update package version
39
+ run: npm version $TAG_VERSION --no-git-tag-version
40
+
41
+ - name: Commit and push
42
+ run: |
43
+ git config --global user.name "github-actions[bot]"
44
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
45
+ git commit -am "Release ${TAG_VERSION}"
46
+ git push origin HEAD:main
47
+ env:
48
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
49
+
19
50
  - run: npm run build
20
51
  - run: npm run test
21
- - run: npm publish --tag latest --access public
52
+ - run: |
53
+ if [[ ${{ github.event.release.prerelease }} == true ]]; then
54
+ npm publish --tag next --access public
55
+ else
56
+ npm publish --tag latest --access public
57
+ fi
22
58
  env:
23
59
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -1,4 +1,4 @@
1
- name: Build and test
1
+ name: Publish snapshot to NPM
2
2
 
3
3
  on:
4
4
  push:
@@ -9,22 +9,18 @@ jobs:
9
9
  # prevent from running on forks
10
10
  if: github.repository_owner == 'restatedev'
11
11
  runs-on: ubuntu-latest
12
- strategy:
13
- matrix:
14
- node-version: [20.x]
15
12
 
16
13
  steps:
17
14
  - uses: actions/checkout@v4
18
- - name: Use Node.js ${{ matrix.node-version }}
19
- uses: actions/setup-node@v4
15
+ - uses: actions/setup-node@v4
20
16
  with:
21
- node-version: ${{ matrix.node-version }}
17
+ node-version: "22.x"
22
18
  registry-url: "https://registry.npmjs.org"
23
19
  - run: npm ci
24
20
  - run: npm run build
25
21
  - run: npm run test
26
22
  - run: mv $(npm pack) restatedev-restate-cdk.tgz
27
- - uses: actions/upload-artifact@v3
23
+ - uses: actions/upload-artifact@v4
28
24
  with:
29
25
  name: restatedev-restate-cdk
30
26
  path: restatedev-restate-cdk.tgz
@@ -37,7 +33,7 @@ jobs:
37
33
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
38
34
  run: |
39
35
  # We're using 0.0.0 to avoid this version to be higher than released versions.
40
- # To use it:
36
+ # To use it:
41
37
  # "@restatedev/restate-cdk": "^0.0.0-SNAPSHOT"
42
38
  npm version 0.0.0-SNAPSHOT-$(date '+%Y%m%d%H%M%S') --git-tag-version false
43
39
  # We use dist-tag dev for the snapshot releases, see https://docs.npmjs.com/cli/v9/commands/npm-dist-tag for more info
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 - Restate Software, Inc., Restate GmbH
3
+ Copyright (c) 2023-2025 - Restate Software, Inc., Restate GmbH
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -3,13 +3,18 @@
3
3
  [![Discord](https://img.shields.io/discord/1128210118216007792?logo=discord)](https://discord.gg/skW3AZ6uGd)
4
4
  [![Twitter](https://img.shields.io/twitter/follow/restatedev.svg?style=social&label=Follow)](https://twitter.com/intent/follow?screen_name=restatedev)
5
5
 
6
- # Restate CDK support
6
+ # Restate CDK Construct Library
7
7
 
8
- AWS Cloud Development Kit (CDK) construct library for deploying [Restate](https://restate.dev) and Restate services on
9
- AWS. This library helps you when deploying Restate services to AWS Lambda as well as for managing self-hosted Restate
10
- deployments on your own infrastructure. For more information on CDK, please
8
+ AWS Cloud Development Kit (CDK) construct library for deploying [Restate](https://restate.dev) and
9
+ Restate services on AWS.
10
+
11
+ [Restate](https://github.com/restatedev/restate) is the platform for building resilient applications
12
+ that tolerate all infrastructure faults w/o the need for a PhD. For more information on CDK, please
11
13
  see [Getting started with the AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html).
12
14
 
15
+ This library helps you manage registering AWS Lambda-based Restate services in Restate environments.
16
+ It also offers basic support for creating self-hosted Restate deployments on your own AWS infrastructure.
17
+
13
18
  ## Installation
14
19
 
15
20
  Inside an existing CDK project, add the library from [npm](https://www.npmjs.com/package/@restatedev/restate-cdk):
@@ -23,17 +28,16 @@ npm i @restatedev/restate-cdk
23
28
  - [`RestateCloudEnvironment`](./lib/restate-constructs/restate-cloud-environment.ts) - Supports deploying Restate
24
29
  services to an existing [Restate Cloud](https://cloud.restate.dev) environment.
25
30
  - [`SingleNodeRestateDeployment`](./lib/restate-constructs/single-node-restate-deployment.ts) - Deploys a self-hosted
26
- Restate server running on Amazon EC2; this provides a basic single-node deployment targeted at development and testing
31
+ Restate server running on Amazon EC2; this provides a basic single-node deployment targeted at
32
+ development and testing
27
33
  - [`ServiceDeployer`](./lib/restate-constructs/service-deployer.ts) - facilitates registration of Lambda-based service
28
34
  handlers with a Restate environment, such as a self-hosted EC2 environment
29
35
 
30
- For a more detailed overview, please see
31
- the [Restate CDK documentation](https://docs.restate.dev/deploy/lambda/cdk).
36
+ For a more detailed look, please refer to the [Restate CDK documentation](https://docs.restate.dev/deploy/lambda/cdk).
32
37
 
33
38
  ### Examples
34
39
 
35
40
  You can use the following templates to bootstrap your own CDK projects:
36
41
 
37
42
  - [e2e tests in this repository](test/e2e)
38
- - [typescript-lambda-cdk](https://github.com/restatedev/examples/tree/main/templates/typescript-lambda-cdk)
39
- - [kotlin-gradle-lambda-cdk](https://github.com/restatedev/examples/tree/main/templates/kotlin-gradle-lambda-cdk)
43
+ - the official [Restate examples](https://github.com/restatedev/examples) repository
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  /*
3
- * Copyright (c) 2024 - Restate Software, Inc., Restate GmbH
3
+ * Copyright (c) 2023-2025 - Restate Software, Inc., Restate GmbH
4
4
  *
5
- * This file is part of the Restate SDK for Node.js/TypeScript,
5
+ * This file is part of the Restate CDK Construct Library,
6
6
  * which is released under the MIT license.
7
7
  *
8
8
  * You can find a copy of the license in file LICENSE in the root
@@ -16,4 +16,4 @@ var TracingMode;
16
16
  TracingMode["DISABLED"] = "DISABLED";
17
17
  TracingMode["AWS_XRAY"] = "AWS_XRAY";
18
18
  })(TracingMode || (exports.TracingMode = TracingMode = {}));
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHMtY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3Jlc3RhdGUtY29uc3RydWN0cy9kZXBsb3ltZW50cy1jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7O0FBRUgsSUFBWSxXQUdYO0FBSEQsV0FBWSxXQUFXO0lBQ3JCLG9DQUFxQixDQUFBO0lBQ3JCLG9DQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxXQUFXLDJCQUFYLFdBQVcsUUFHdEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDI0IC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgU0RLIGZvciBOb2RlLmpzL1R5cGVTY3JpcHQsXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuZXhwb3J0IGVudW0gVHJhY2luZ01vZGUge1xuICBESVNBQkxFRCA9IFwiRElTQUJMRURcIixcbiAgQVdTX1hSQVkgPSBcIkFXU19YUkFZXCIsXG59XG4iXX0=
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHMtY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3Jlc3RhdGUtY29uc3RydWN0cy9kZXBsb3ltZW50cy1jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7O0FBRUgsSUFBWSxXQUdYO0FBSEQsV0FBWSxXQUFXO0lBQ3JCLG9DQUFxQixDQUFBO0lBQ3JCLG9DQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxXQUFXLDJCQUFYLFdBQVcsUUFHdEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzLTIwMjUgLSBSZXN0YXRlIFNvZnR3YXJlLCBJbmMuLCBSZXN0YXRlIEdtYkhcbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgUmVzdGF0ZSBDREsgQ29uc3RydWN0IExpYnJhcnksXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuZXhwb3J0IGVudW0gVHJhY2luZ01vZGUge1xuICBESVNBQkxFRCA9IFwiRElTQUJMRURcIixcbiAgQVdTX1hSQVkgPSBcIkFXU19YUkFZXCIsXG59XG4iXX0=
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  /*
3
- * Copyright (c) 2023 - Restate Software, Inc., Restate GmbH
3
+ * Copyright (c) 2023-2025 - Restate Software, Inc., Restate GmbH
4
4
  *
5
- * This file is part of the Restate SDK for Node.js/TypeScript,
5
+ * This file is part of the Restate CDK Construct Library,
6
6
  * which is released under the MIT license.
7
7
  *
8
8
  * You can find a copy of the license in file LICENSE in the root
@@ -25,13 +25,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
25
25
  }) : function(o, v) {
26
26
  o["default"] = v;
27
27
  });
28
- var __importStar = (this && this.__importStar) || function (mod) {
29
- if (mod && mod.__esModule) return mod;
30
- var result = {};
31
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
32
- __setModuleDefault(result, mod);
33
- return result;
34
- };
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
35
45
  Object.defineProperty(exports, "__esModule", { value: true });
36
46
  exports.FargateRestateDeployment = void 0;
37
47
  const constructs_1 = require("constructs");
@@ -138,15 +148,15 @@ class FargateRestateDeployment extends constructs_1.Construct {
138
148
  streamPrefix: "restate",
139
149
  }),
140
150
  environment: {
141
- RESTATE_OBSERVABILITY__LOG__FORMAT: "Json",
142
- // RUST_LOG: "warn,restate=info",
151
+ RESTATE_LOG_FORMAT: "json",
152
+ RESTATE_NODE_NAME: "fargate",
143
153
  },
144
154
  command: props.command,
145
155
  startTimeout: cdk.Duration.seconds(20),
146
156
  stopTimeout: cdk.Duration.seconds(20),
147
157
  });
148
158
  restate.addMountPoints({
149
- containerPath: "/target",
159
+ containerPath: "/restate-data",
150
160
  readOnly: false,
151
161
  sourceVolume: "restateStore",
152
162
  });
@@ -191,9 +201,10 @@ class FargateRestateDeployment extends constructs_1.Construct {
191
201
  containerPort: RESTATE_INGRESS_PORT,
192
202
  }),
193
203
  ],
204
+ port: RESTATE_INGRESS_PORT,
194
205
  protocol: elb2.ApplicationProtocol.HTTP,
195
206
  healthCheck: {
196
- path: "/grpc.health.v1.Health/Check",
207
+ path: "/restate/health",
197
208
  interval: cdk.Duration.seconds(5),
198
209
  healthyThresholdCount: 3,
199
210
  unhealthyThresholdCount: 3,
@@ -214,6 +225,7 @@ class FargateRestateDeployment extends constructs_1.Construct {
214
225
  containerPort: RESTATE_ADMIN_PORT,
215
226
  }),
216
227
  ],
228
+ port: RESTATE_ADMIN_PORT,
217
229
  protocol: elb2.ApplicationProtocol.HTTP,
218
230
  healthCheck: {
219
231
  path: "/health",
@@ -236,4 +248,4 @@ class FargateRestateDeployment extends constructs_1.Construct {
236
248
  }
237
249
  }
238
250
  exports.FargateRestateDeployment = FargateRestateDeployment;
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS1yZXN0YXRlLWRlcGxveW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2ZhcmdhdGUtcmVzdGF0ZS1kZXBsb3ltZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsMkNBQXVDO0FBQ3ZDLGlEQUFtQztBQUNuQyx3RUFBMEQ7QUFDMUQsMkRBQTZDO0FBQzdDLHlEQUEyQztBQUMzQyx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLHlEQUEyQztBQUMzQyw2RUFBK0Q7QUFDL0QsNkRBQStDO0FBQy9DLHlFQUEyRDtBQUkzRCxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUNoQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUMvQixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUNsQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLHFCQUFxQixHQUFHLDhCQUE4QixDQUFDO0FBQzdELE1BQU0sMEJBQTBCLEdBQUcsUUFBUSxDQUFDO0FBQzVDLE1BQU0sdUJBQXVCLEdBQUcsUUFBUSxDQUFDO0FBb0V6Qzs7OztHQUlHO0FBQ0gsTUFBYSx3QkFBeUIsU0FBUSxzQkFBUztJQVdyRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTBCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU3RSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLHFCQUFxQixDQUFDO1FBQ2pFLE1BQU0sVUFB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QUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLG1CQUFtQixFQUFFLEVBQUUsQ0FBQztRQUMzRyxJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsS0FBSyxDQUFDLE9BQU8sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0lBQ2xFLENBQUM7Q0FDRjtBQWpORCw0REFpTkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzIC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgU0RLIGZvciBOb2RlLmpzL1R5cGVTY3JpcHQsXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGFjbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBlY3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCAqIGFzIGVmcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVmc1wiO1xuaW1wb3J0ICogYXMgZWxiMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCAqIGFzIHI1MyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCAqIGFzIHRhcmdldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7IElSZXN0YXRlRW52aXJvbm1lbnQgfSBmcm9tIFwiLi9yZXN0YXRlLWVudmlyb25tZW50XCI7XG5pbXBvcnQgeyBUcmFjaW5nTW9kZSB9IGZyb20gXCIuL2RlcGxveW1lbnRzLWNvbW1vblwiO1xuXG5jb25zdCBQVUJMSUNfSU5HUkVTU19QT1JUID0gNDQzO1xuY29uc3QgUFVCTElDX0FETUlOX1BPUlQgPSA5MDcwO1xuY29uc3QgUkVTVEFURV9JTkdSRVNTX1BPUlQgPSA4MDgwO1xuY29uc3QgUkVTVEFURV9BRE1JTl9QT1JUID0gOTA3MDtcbmNvbnN0IFJFU1RBVEVfSU1BR0VfREVGQVVMVCA9IFwiZG9ja2VyLmlvL3Jlc3RhdGVkZXYvcmVzdGF0ZVwiO1xuY29uc3QgUkVTVEFURV9ET0NLRVJfREVGQVVMVF9UQUcgPSBcImxhdGVzdFwiO1xuY29uc3QgQURPVF9ET0NLRVJfREVGQVVMVF9UQUcgPSBcImxhdGVzdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhdGVGYXJnYXRlUHJvcHMge1xuICAvKiogVGhlIFZQQyBpbiB3aGljaCB0byBsYXVuY2ggdGhlIFJlc3RhdGUgaG9zdC4gKi9cbiAgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqIExvZyBncm91cCBmb3IgUmVzdGF0ZSBzZXJ2aWNlIGxvZ3MuICovXG4gIGxvZ0dyb3VwPzogbG9ncy5Mb2dHcm91cDtcblxuICAvKiogVHJhY2luZyBtb2RlIGZvciBSZXN0YXRlIHNlcnZpY2VzLiBEZWZhdWx0cyB0byB7QGxpbmsgVHJhY2luZ01vZGUuRElTQUJMRUR9LiAqL1xuICB0cmFjaW5nPzogVHJhY2luZ01vZGU7XG5cbiAgLyoqIFByZWZpeCBmb3IgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhpcyBjb25zdHJ1Y3QgdGhhdCByZXF1aXJlIHVuaXF1ZSBuYW1lcy4gKi9cbiAgcHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKiBFQ1MgY2x1c3RlciBuYW1lLiAqL1xuICBjbHVzdGVyTmFtZT86IHN0cmluZztcblxuICAvKiogUmVzdGF0ZSBEb2NrZXIgaW1hZ2UgbmFtZS4gRGVmYXVsdHMgdG8gYGxhdGVzdGAuICovXG4gIHJlc3RhdGVJbWFnZT86IHN0cmluZztcblxuICAvKiogUmVzdGF0ZSBEb2NrZXIgaW1hZ2UgdGFnLiBEZWZhdWx0cyB0byBgbGF0ZXN0YC4gKi9cbiAgcmVzdGF0ZVRhZz86IHN0cmluZztcblxuICAvKiogQW1hem9uIERpc3RybyBmb3IgT3BlbiBUZWxlbWV0cnkgRG9ja2VyIGltYWdlIHRhZy4gRGVmYXVsdHMgdG8gYGxhdGVzdGAuICovXG4gIGFkb3RUYWc/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IGZvciBSZXN0YXRlIGNvbnRhaW5lci4gVXNlIGl0IHRvIGNvbmZpZ3VyZSBsb2dnaW5nIGFuZCBvdGhlciBwcm9jZXNzLWxldmVsIHNldHRpbmdzLlxuICAgKi9cbiAgZW52aXJvbm1lbnQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZXN0YXRlIGNvbnRhaW5lciBleHRyYSBhcmd1bWVudHMuXG4gICAqL1xuICBjb21tYW5kPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIG5hbWUgZm9yIHRoZSBwdWJsaWMgZW5kcG9pbnQuXG4gICAqL1xuICBkbnNOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEROUyB6b25lIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgcHVibGljIGVuZHBvaW50LlxuICAgKi9cbiAgaG9zdGVkWm9uZTogcjUzLklIb3N0ZWRab25lO1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgbG9uZy1saXZlZCByZXNvdXJjZXMgKHN0b3JhZ2UsIGxvZ3MpLiBEZWZhdWx0OiBgY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWWAuXG4gICAqL1xuICByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGxvYWRCYWxhbmNlcj86IHtcbiAgICAvKiogQHNlZSBCYXNlTG9hZEJhbGFuY2VyUHJvcHMuaW50ZXJuZXRGYWNpbmcgKi9cbiAgICBpbnRlcm5ldEZhY2luZz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJZiB5b3Ugc2V0IHRoaXMgdG8gZmFsc2UsIHlvdSBjYW4gY3VzdG9taXplIHRoZSBhY2Nlc3MgdG8gdGhlIHBhaXIgb2YgQUxCIGxpc3RlbmVycyB2aWFcbiAgICAgKiB7QGxpbmsgRmFyZ2F0ZVJlc3RhdGVEZXBsb3ltZW50LmluZ3Jlc3NMaXN0ZW5lcn0gYW5kIHtAbGluayBGYXJnYXRlUmVzdGF0ZURlcGxveW1lbnQuYWRtaW5MaXN0ZW5lcn0uXG4gICAgICpcbiAgICAgKiBAc2VlIEJhc2VBcHBsaWNhdGlvbkxpc3RlbmVyUHJvcHMub3BlbiAqL1xuICAgIG9wZW4/OiBib29sZWFuO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBSZXN0YXRlIHNlcnZpY2UgZGVwbG95bWVudCBydW5uaW5nIGFzIGEgRmFyZ2F0ZSB0YXNrIGFuZCBiYWNrZWQgYnkgRUZTLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBjb25zdHJ1Y3QgaXMgc3RpbGwgZXhwZXJpbWVudGFsISBVc2Ugd2l0aCBjYXV0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRmFyZ2F0ZVJlc3RhdGVEZXBsb3ltZW50IGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVJlc3RhdGVFbnZpcm9ubWVudCB7XG4gIHJlYWRvbmx5IGludm9rZXJSb2xlOiBpYW0uSVJvbGU7XG4gIHJlYWRvbmx5IHZwYzogZWMyLklWcGM7XG5cbiAgcmVhZG9ubHkgaW5ncmVzc1VybDogc3RyaW5nO1xuICByZWFkb25seSBhZG1pblVybDogc3RyaW5nO1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwOiBlYzIuU2VjdXJpdHlHcm91cDtcbiAgcmVhZG9ubHkgZGF0YVN0b3JlOiBlZnMuRmlsZVN5c3RlbTtcbiAgcmVhZG9ubHkgaW5ncmVzc0xpc3RlbmVyOiBlbGIyLkFwcGxpY2F0aW9uTGlzdGVuZXI7XG4gIHJlYWRvbmx5IGFkbWluTGlzdGVuZXI6IGVsYjIuQXBwbGljYXRpb25MaXN0ZW5lcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmVzdGF0ZUZhcmdhdGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnZwYyA9IHByb3BzLnZwYyA/PyBlYzIuVnBjLmZyb21Mb29rdXAodGhpcywgXCJWcGNcIiwgeyBpc0RlZmF1bHQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCByZXN0YXRlSW1hZ2UgPSBwcm9wcy5yZXN0YXRlSW1hZ2UgPz8gUkVTVEFURV9JTUFHRV9ERUZBVUxUO1xuICAgIGNvbnN0IHJlc3RhdGVUYWcgPSBwcm9wcy5yZXN0YXRlVGFnID8/IFJFU1RBVEVfRE9DS0VSX0RFRkFVTFRfVEFHO1xuICAgIGNvbnN0IGFkb3RUYWcgPSBwcm9wcy5hZG90VGFnID8/IEFET1RfRE9DS0VSX0RFRkFVTFRfVEFHOyAvLyBUT0RPOiBhZGQgWC1SYXkgc3VwcG9ydCBsaWtlIHdlIGhhdmUgZm9yIEVDMlxuXG4gICAgY29uc3QgZnMgPSBuZXcgZWZzLkZpbGVTeXN0ZW0odGhpcywgXCJEYXRhU3RvcmVcIiwge1xuICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgIGxpZmVjeWNsZVBvbGljeTogZWZzLkxpZmVjeWNsZVBvbGljeS5BRlRFUl8zMF9EQVlTLFxuICAgICAgcGVyZm9ybWFuY2VNb2RlOiBlZnMuUGVyZm9ybWFuY2VNb2RlLkdFTkVSQUxfUFVSUE9TRSxcbiAgICAgIHRocm91Z2hwdXRNb2RlOiBlZnMuVGhyb3VnaHB1dE1vZGUuQlVSU1RJTkcsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5ID8/IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgfSk7XG4gICAgZnMuYWRkVG9SZXNvdXJjZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgc2lkOiBcIkFsbG93RWZzTW91bnRcIixcbiAgICAgICAgYWN0aW9uczogW1wiZWxhc3RpY2ZpbGVzeXN0ZW06Q2xpZW50TW91bnRcIl0sXG4gICAgICAgIC8vIFJlc3RyaWN0aW5nIHRvIHRoZSBFQ1MgZXhlY3V0aW9uIHJvbGUgZG9lcyBub3Qgd29yazsgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIgLSBFRlMgYWNjZXNzIGlzIHNlY3VyZWQgYnkgYSBzZWN1cml0eSBncm91cFxuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5BbnlQcmluY2lwYWwoKV0sXG4gICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICBCb29sOiB7XG4gICAgICAgICAgICBcImVsYXN0aWNmaWxlc3lzdGVtOkFjY2Vzc2VkVmlhTW91bnRUYXJnZXRcIjogXCJ0cnVlXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5kYXRhU3RvcmUgPSBmcztcblxuICAgIGNvbnN0IGNsdXN0ZXIgPSBuZXcgZWNzLkNsdXN0ZXIodGhpcywgXCJDbHVzdGVyXCIsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBjbHVzdGVyTmFtZTogcHJvcHMuY2x1c3Rlck5hbWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN0YXRlVGFzayA9IG5ldyBlY3MuRmFyZ2F0ZVRhc2tEZWZpbml0aW9uKHRoaXMsIFwiUmVzdGF0ZVRhc2tcIiwge1xuICAgICAgY3B1OiA0MDk2LFxuICAgICAgbWVtb3J5TGltaXRNaUI6IDgxOTIsXG4gICAgICBydW50aW1lUGxhdGZvcm06IHtcbiAgICAgICAgY3B1QXJjaGl0ZWN0dXJlOiBlY3MuQ3B1QXJjaGl0ZWN0dXJlLkFSTTY0LFxuICAgICAgICBvcGVyYXRpbmdTeXN0ZW1GYW1pbHk6IGVjcy5PcGVyYXRpbmdTeXN0ZW1GYW1pbHkuTElOVVgsXG4gICAgICB9LFxuICAgICAgdm9sdW1lczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyZXN0YXRlU3RvcmVcIixcbiAgICAgICAgICBlZnNWb2x1bWVDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICBmaWxlU3lzdGVtSWQ6IGZzLmZpbGVTeXN0ZW1JZCxcbiAgICAgICAgICAgIGF1dGhvcml6YXRpb25Db25maWc6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gVE9ETzogU3RhcnQgYW4gQURPVCBjb250YWluZXIgYW5kIGhvb2sgaXQgdXAgdG8gUmVzdGF0ZSBhbmQgQVdTIFgtUmF5IG9yIGFub3RoZXIgT1RlbCBzaW5rXG4gICAgLy8gaWYgKHByb3BzLnRyYWNpbmcgPT09IFRyYWNpbmdNb2RlLkFXU19YUkFZKSB7XG4gICAgLy8gICByZXN0YXRlVGFzay50YXNrUm9sZS5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcIkFXU1hyYXlXcml0ZU9ubHlBY2Nlc3NcIikpO1xuICAgIC8vIH1cblxuICAgIG5ldyBpYW0uUG9saWN5KHRoaXMsIFwiVGFza1BvbGljeVwiLCB7XG4gICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBzaWQ6IFwiQWxsb3dBc3N1bWVBbnlSb2xlXCIsXG4gICAgICAgICAgYWN0aW9uczogW1wic3RzOkFzc3VtZVJvbGVcIl0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLCAvLyB3ZSBkb24ndCBrbm93IHVwZnJvbnQgd2hhdCBpbnZva2VyIHJvbGVzIHdlIG1heSBiZSBhc2tlZCB0byBhc3N1bWUgYXQgcnVudGltZVxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSkuYXR0YWNoVG9Sb2xlKHJlc3RhdGVUYXNrLnRhc2tSb2xlKTtcblxuICAgIGNvbnN0IGludm9rZXJSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsIFwiSW52b2tlclJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLkFyblByaW5jaXBhbChyZXN0YXRlVGFzay50YXNrUm9sZS5yb2xlQXJuKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFzc3VtZWQgYnkgUmVzdGF0ZSBkZXBsb3ltZW50IHRvIGludm9rZSBMYW1iZGEtYmFzZWQgc2VydmljZXNcIixcbiAgICB9KTtcbiAgICBpbnZva2VyUm9sZS5ncmFudEFzc3VtZVJvbGUocmVzdGF0ZVRhc2sudGFza1JvbGUpO1xuICAgIHRoaXMuaW52b2tlclJvbGUgPSBpbnZva2VyUm9sZTtcblxuICAgIGNvbnN0IGxvZ0dyb3VwID1cbiAgICAgIHByb3BzLmxvZ0dyb3VwID8/XG4gICAgICBuZXcgbG9ncy5Mb2dHcm91cCh0aGlzLCBcIkxvZ3NcIiwge1xuICAgICAgICBsb2dHcm91cE5hbWU6IGAvcmVzdGF0ZS8ke2lkfWAsXG4gICAgICAgIHJldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSA/PyBjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgfSk7XG5cbiAgICBjb25zdCByZXN0YXRlID0gcmVzdGF0ZVRhc2suYWRkQ29udGFpbmVyKFwiUmVzdGF0ZVwiLCB7XG4gICAgICBjb250YWluZXJOYW1lOiBcInJlc3RhdGUtcnVudGltZVwiLFxuICAgICAgaW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoYCR7cmVzdGF0ZUltYWdlfToke3Jlc3RhdGVUYWd9YCksXG4gICAgICBwb3J0TWFwcGluZ3M6IFt7IGNvbnRhaW5lclBvcnQ6IFJFU1RBVEVfSU5HUkVTU19QT1JUIH0sIHsgY29udGFpbmVyUG9ydDogUkVTVEFURV9BRE1JTl9QT1JUIH1dLFxuICAgICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlci5hd3NMb2dzKHtcbiAgICAgICAgbG9nR3JvdXAsXG4gICAgICAgIHN0cmVhbVByZWZpeDogXCJyZXN0YXRlXCIsXG4gICAgICB9KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFJFU1RBVEVfT0JTRVJWQUJJTElUWV9fTE9HX19GT1JNQVQ6IFwiSnNvblwiLFxuICAgICAgICAvLyBSVVNUX0xPRzogXCJ3YXJuLHJlc3RhdGU9aW5mb1wiLFxuICAgICAgfSxcbiAgICAgIGNvbW1hbmQ6IHByb3BzLmNvbW1hbmQsXG4gICAgICBzdGFydFRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDIwKSxcbiAgICAgIHN0b3BUaW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygyMCksXG4gICAgfSk7XG4gICAgcmVzdGF0ZS5hZGRNb3VudFBvaW50cyh7XG4gICAgICBjb250YWluZXJQYXRoOiBcIi90YXJnZXRcIixcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHNvdXJjZVZvbHVtZTogXCJyZXN0YXRlU3RvcmVcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3RhdGVTZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsIFwiU2VjdXJpdHlHcm91cFwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnNlY3VyaXR5R3JvdXAgPSByZXN0YXRlU2VjdXJpdHlHcm91cDtcblxuICAgIGNvbnN0IHJlc3RhdGVGYXJnYXRlU2VydmljZSA9IG5ldyBlY3MuRmFyZ2F0ZVNlcnZpY2UodGhpcywgXCJTZXJ2aWNlXCIsIHtcbiAgICAgIGNsdXN0ZXIsXG4gICAgICB0YXNrRGVmaW5pdGlvbjogcmVzdGF0ZVRhc2ssXG4gICAgICBhc3NpZ25QdWJsaWNJcDogdHJ1ZSxcbiAgICAgIGNpcmN1aXRCcmVha2VyOiB7XG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcbiAgICAgICAgcm9sbGJhY2s6IHRydWUsXG4gICAgICB9LFxuICAgICAgbWluSGVhbHRoeVBlcmNlbnQ6IDAsIC8vIGFsbG93IHNjYWxlIGRvd24gdG8gemVybyBkdXJpbmcgZGVwbG95bWVudHMgKHJlcXVpcmVkIGZvciBhdC1tb3N0LTEgbWF4IHNldHRpbmcpXG4gICAgICBtYXhIZWFsdGh5UGVyY2VudDogMTAwLCAvLyBkb24ndCBzdGFydCBtb3JlIHRoYW4gb25lIGNvcHlcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbcmVzdGF0ZVNlY3VyaXR5R3JvdXBdLFxuICAgIH0pO1xuXG4gICAgZnMuY29ubmVjdGlvbnMuYWxsb3dEZWZhdWx0UG9ydEZyb20ocmVzdGF0ZVNlY3VyaXR5R3JvdXApO1xuICAgIGZzLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRUbyhyZXN0YXRlU2VjdXJpdHlHcm91cCk7XG4gICAgZnMuZ3JhbnRSb290QWNjZXNzKHJlc3RhdGVGYXJnYXRlU2VydmljZS50YXNrRGVmaW5pdGlvbi50YXNrUm9sZS5ncmFudFByaW5jaXBhbCk7XG5cbiAgICBjb25zdCBhbGIgPSBuZXcgZWxiMi5BcHBsaWNhdGlvbkxvYWRCYWxhbmNlcih0aGlzLCBcIkFsYlwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgaW50ZXJuZXRGYWNpbmc6IHByb3BzLmxvYWRCYWxhbmNlcj8uaW50ZXJuZXRGYWNpbmcsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwdWJsaWNBcGlDZXJ0aWZpY2F0ZSA9IG5ldyBhY20uQ2VydGlmaWNhdGUodGhpcywgXCJDZXJ0aWZpY2F0ZVwiLCB7XG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kbnNOYW1lLFxuICAgICAgdmFsaWRhdGlvbjogYWNtLkNlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHByb3BzLmhvc3RlZFpvbmUpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW5ncmVzc0xpc3RlbmVyID0gYWxiLmFkZExpc3RlbmVyKFwiSW5ncmVzc0xpc3RlbmVyXCIsIHtcbiAgICAgIHBvcnQ6IFBVQkxJQ19JTkdSRVNTX1BPUlQsXG4gICAgICBwcm90b2NvbDogZWxiMi5BcHBsaWNhdGlvblByb3RvY29sLkhUVFBTLFxuICAgICAgY2VydGlmaWNhdGVzOiBbcHVibGljQXBpQ2VydGlmaWNhdGVdLFxuICAgICAgb3BlbjogcHJvcHMubG9hZEJhbGFuY2VyPy5vcGVuLFxuICAgIH0pO1xuICAgIGluZ3Jlc3NMaXN0ZW5lci5hZGRUYXJnZXRzKFwiRmFyZ2F0ZUluZ3Jlc3NUYXJnZXRcIiwge1xuICAgICAgdGFyZ2V0czogW1xuICAgICAgICByZXN0YXRlRmFyZ2F0ZVNlcnZpY2UubG9hZEJhbGFuY2VyVGFyZ2V0KHtcbiAgICAgICAgICBjb250YWluZXJOYW1lOiByZXN0YXRlLmNvbnRhaW5lck5hbWUsXG4gICAgICAgICAgY29udGFpbmVyUG9ydDogUkVTVEFURV9JTkdSRVNTX1BPUlQsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIHByb3RvY29sOiBlbGIyLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUCxcbiAgICAgIGhlYWx0aENoZWNrOiB7XG4gICAgICAgIHBhdGg6IFwiL2dycGMuaGVhbHRoLnYxLkhlYWx0aC9DaGVja1wiLFxuICAgICAgICBpbnRlcnZhbDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICAgIGhlYWx0aHlUaHJlc2hvbGRDb3VudDogMyxcbiAgICAgICAgdW5oZWFsdGh5VGhyZXNob2xkQ291bnQ6IDMsXG4gICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDIpLFxuICAgICAgfSxcbiAgICAgIGRlcmVnaXN0cmF0aW9uRGVsYXk6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgIH0pO1xuICAgIHRoaXMuaW5ncmVzc0xpc3RlbmVyID0gaW5ncmVzc0xpc3RlbmVyO1xuXG4gICAgY29uc3QgYWRtaW5MaXN0ZW5lciA9IGFsYi5hZGRMaXN0ZW5lcihcIkFkbWluTGlzdGVuZXJcIiwge1xuICAgICAgcG9ydDogUFVCTElDX0FETUlOX1BPUlQsXG4gICAgICBwcm90b2NvbDogZWxiMi5BcHBsaWNhdGlvblByb3RvY29sLkhUVFBTLFxuICAgICAgY2VydGlmaWNhdGVzOiBbcHVibGljQXBpQ2VydGlmaWNhdGVdLFxuICAgIH0pO1xuICAgIGFkbWluTGlzdGVuZXIuYWRkVGFyZ2V0cyhcIkZhcmdhdGVBZG1pblRhcmdldFwiLCB7XG4gICAgICB0YXJnZXRzOiBbXG4gICAgICAgIHJlc3RhdGVGYXJnYXRlU2VydmljZS5sb2FkQmFsYW5jZXJUYXJnZXQoe1xuICAgICAgICAgIGNvbnRhaW5lck5hbWU6IHJlc3RhdGUuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICBjb250YWluZXJQb3J0OiBSRVNUQVRFX0FETUlOX1BPUlQsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIHByb3RvY29sOiBlbGIyLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUCxcbiAgICAgIGhlYWx0aENoZWNrOiB7XG4gICAgICAgIHBhdGg6IFwiL2hlYWx0aFwiLFxuICAgICAgICBpbnRlcnZhbDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICAgIGhlYWx0aHlUaHJlc2hvbGRDb3VudDogMyxcbiAgICAgICAgdW5oZWFsdGh5VGhyZXNob2xkQ291bnQ6IDMsXG4gICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDIpLFxuICAgICAgfSxcbiAgICAgIGRlcmVnaXN0cmF0aW9uRGVsYXk6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgIH0pO1xuICAgIHRoaXMuYWRtaW5MaXN0ZW5lciA9IGFkbWluTGlzdGVuZXI7XG5cbiAgICBuZXcgcjUzLkFSZWNvcmQodGhpcywgXCJBbGJBbGlhc1wiLCB7XG4gICAgICB6b25lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG5zTmFtZS5zcGxpdChcIi5cIilbMF0sXG4gICAgICB0YXJnZXQ6IHI1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyB0YXJnZXRzLkxvYWRCYWxhbmNlclRhcmdldChhbGIpKSxcbiAgICAgIC8vIG90aGVyIEFSZWNvcmQgY29uZmlndXJhdGlvbi4uLlxuICAgIH0pO1xuXG4gICAgdGhpcy5pbmdyZXNzVXJsID0gYGh0dHBzOi8vJHtwcm9wcy5kbnNOYW1lfSR7UFVCTElDX0lOR1JFU1NfUE9SVCA9PSA0NDMgPyBcIlwiIDogYDoke1BVQkxJQ19JTkdSRVNTX1BPUlR9YH1gO1xuICAgIHRoaXMuYWRtaW5VcmwgPSBgaHR0cHM6Ly8ke3Byb3BzLmRuc05hbWV9OiR7UFVCTElDX0FETUlOX1BPUlR9YDtcbiAgfVxufVxuIl19
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS1yZXN0YXRlLWRlcGxveW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2ZhcmdhdGUtcmVzdGF0ZS1kZXBsb3ltZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDJDQUF1QztBQUN2QyxpREFBbUM7QUFDbkMsd0VBQTBEO0FBQzFELDJEQUE2QztBQUM3Qyx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLHlEQUEyQztBQUMzQyx5REFBMkM7QUFDM0MsNkVBQStEO0FBQy9ELDZEQUErQztBQUMvQyx5RUFBMkQ7QUFJM0QsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDL0IsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFDaEMsTUFBTSxxQkFBcUIsR0FBRyw4QkFBOEIsQ0FBQztBQUM3RCxNQUFNLDBCQUEwQixHQUFHLFFBQVEsQ0FBQztBQUM1QyxNQUFNLHVCQUF1QixHQUFHLFFBQVEsQ0FBQztBQW9FekM7Ozs7R0FJRztBQUNILE1BQWEsd0JBQXlCLFNBQVEsc0JBQVM7SUFXckQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFN0UsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxxQkFBcUIsQ0FBQztRQUNq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QyxVQUFVLEdBQUcsV0FBVyxLQUFLLENBQUMsT0FBTyxHQUFHLG1CQUFtQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLG1CQUFtQixFQUFFLEVBQUUsQ0FBQztRQUMzRyxJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsS0FBSyxDQUFDLE9BQU8sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0lBQ2xFLENBQUM7Q0FDRjtBQW5ORCw0REFtTkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzLTIwMjUgLSBSZXN0YXRlIFNvZnR3YXJlLCBJbmMuLCBSZXN0YXRlIEdtYkhcbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgUmVzdGF0ZSBDREsgQ29uc3RydWN0IExpYnJhcnksXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGFjbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBlY3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCAqIGFzIGVmcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVmc1wiO1xuaW1wb3J0ICogYXMgZWxiMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCAqIGFzIHI1MyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCAqIGFzIHRhcmdldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7IElSZXN0YXRlRW52aXJvbm1lbnQgfSBmcm9tIFwiLi9yZXN0YXRlLWVudmlyb25tZW50XCI7XG5pbXBvcnQgeyBUcmFjaW5nTW9kZSB9IGZyb20gXCIuL2RlcGxveW1lbnRzLWNvbW1vblwiO1xuXG5jb25zdCBQVUJMSUNfSU5HUkVTU19QT1JUID0gNDQzO1xuY29uc3QgUFVCTElDX0FETUlOX1BPUlQgPSA5MDcwO1xuY29uc3QgUkVTVEFURV9JTkdSRVNTX1BPUlQgPSA4MDgwO1xuY29uc3QgUkVTVEFURV9BRE1JTl9QT1JUID0gOTA3MDtcbmNvbnN0IFJFU1RBVEVfSU1BR0VfREVGQVVMVCA9IFwiZG9ja2VyLmlvL3Jlc3RhdGVkZXYvcmVzdGF0ZVwiO1xuY29uc3QgUkVTVEFURV9ET0NLRVJfREVGQVVMVF9UQUcgPSBcImxhdGVzdFwiO1xuY29uc3QgQURPVF9ET0NLRVJfREVGQVVMVF9UQUcgPSBcImxhdGVzdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhdGVGYXJnYXRlUHJvcHMge1xuICAvKiogVGhlIFZQQyBpbiB3aGljaCB0byBsYXVuY2ggdGhlIFJlc3RhdGUgaG9zdC4gKi9cbiAgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqIExvZyBncm91cCBmb3IgUmVzdGF0ZSBzZXJ2aWNlIGxvZ3MuICovXG4gIGxvZ0dyb3VwPzogbG9ncy5Mb2dHcm91cDtcblxuICAvKiogVHJhY2luZyBtb2RlIGZvciBSZXN0YXRlIHNlcnZpY2VzLiBEZWZhdWx0cyB0byB7QGxpbmsgVHJhY2luZ01vZGUuRElTQUJMRUR9LiAqL1xuICB0cmFjaW5nPzogVHJhY2luZ01vZGU7XG5cbiAgLyoqIFByZWZpeCBmb3IgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhpcyBjb25zdHJ1Y3QgdGhhdCByZXF1aXJlIHVuaXF1ZSBuYW1lcy4gKi9cbiAgcHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKiBFQ1MgY2x1c3RlciBuYW1lLiAqL1xuICBjbHVzdGVyTmFtZT86IHN0cmluZztcblxuICAvKiogUmVzdGF0ZSBEb2NrZXIgaW1hZ2UgbmFtZS4gRGVmYXVsdHMgdG8gYGxhdGVzdGAuICovXG4gIHJlc3RhdGVJbWFnZT86IHN0cmluZztcblxuICAvKiogUmVzdGF0ZSBEb2NrZXIgaW1hZ2UgdGFnLiBEZWZhdWx0cyB0byBgbGF0ZXN0YC4gKi9cbiAgcmVzdGF0ZVRhZz86IHN0cmluZztcblxuICAvKiogQW1hem9uIERpc3RybyBmb3IgT3BlbiBUZWxlbWV0cnkgRG9ja2VyIGltYWdlIHRhZy4gRGVmYXVsdHMgdG8gYGxhdGVzdGAuICovXG4gIGFkb3RUYWc/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IGZvciBSZXN0YXRlIGNvbnRhaW5lci4gVXNlIGl0IHRvIGNvbmZpZ3VyZSBsb2dnaW5nIGFuZCBvdGhlciBwcm9jZXNzLWxldmVsIHNldHRpbmdzLlxuICAgKi9cbiAgZW52aXJvbm1lbnQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZXN0YXRlIGNvbnRhaW5lciBleHRyYSBhcmd1bWVudHMuXG4gICAqL1xuICBjb21tYW5kPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIG5hbWUgZm9yIHRoZSBwdWJsaWMgZW5kcG9pbnQuXG4gICAqL1xuICBkbnNOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEROUyB6b25lIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgcHVibGljIGVuZHBvaW50LlxuICAgKi9cbiAgaG9zdGVkWm9uZTogcjUzLklIb3N0ZWRab25lO1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgbG9uZy1saXZlZCByZXNvdXJjZXMgKHN0b3JhZ2UsIGxvZ3MpLiBEZWZhdWx0OiBgY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWWAuXG4gICAqL1xuICByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGxvYWRCYWxhbmNlcj86IHtcbiAgICAvKiogQHNlZSBCYXNlTG9hZEJhbGFuY2VyUHJvcHMuaW50ZXJuZXRGYWNpbmcgKi9cbiAgICBpbnRlcm5ldEZhY2luZz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJZiB5b3Ugc2V0IHRoaXMgdG8gZmFsc2UsIHlvdSBjYW4gY3VzdG9taXplIHRoZSBhY2Nlc3MgdG8gdGhlIHBhaXIgb2YgQUxCIGxpc3RlbmVycyB2aWFcbiAgICAgKiB7QGxpbmsgRmFyZ2F0ZVJlc3RhdGVEZXBsb3ltZW50LmluZ3Jlc3NMaXN0ZW5lcn0gYW5kIHtAbGluayBGYXJnYXRlUmVzdGF0ZURlcGxveW1lbnQuYWRtaW5MaXN0ZW5lcn0uXG4gICAgICpcbiAgICAgKiBAc2VlIEJhc2VBcHBsaWNhdGlvbkxpc3RlbmVyUHJvcHMub3BlbiAqL1xuICAgIG9wZW4/OiBib29sZWFuO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBSZXN0YXRlIHNlcnZpY2UgZGVwbG95bWVudCBydW5uaW5nIGFzIGEgRmFyZ2F0ZSB0YXNrIGFuZCBiYWNrZWQgYnkgRUZTLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBjb25zdHJ1Y3QgaXMgc3RpbGwgZXhwZXJpbWVudGFsISBVc2Ugd2l0aCBjYXV0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRmFyZ2F0ZVJlc3RhdGVEZXBsb3ltZW50IGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVJlc3RhdGVFbnZpcm9ubWVudCB7XG4gIHJlYWRvbmx5IGludm9rZXJSb2xlOiBpYW0uSVJvbGU7XG4gIHJlYWRvbmx5IHZwYzogZWMyLklWcGM7XG5cbiAgcmVhZG9ubHkgaW5ncmVzc1VybDogc3RyaW5nO1xuICByZWFkb25seSBhZG1pblVybDogc3RyaW5nO1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwOiBlYzIuU2VjdXJpdHlHcm91cDtcbiAgcmVhZG9ubHkgZGF0YVN0b3JlOiBlZnMuRmlsZVN5c3RlbTtcbiAgcmVhZG9ubHkgaW5ncmVzc0xpc3RlbmVyOiBlbGIyLkFwcGxpY2F0aW9uTGlzdGVuZXI7XG4gIHJlYWRvbmx5IGFkbWluTGlzdGVuZXI6IGVsYjIuQXBwbGljYXRpb25MaXN0ZW5lcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmVzdGF0ZUZhcmdhdGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnZwYyA9IHByb3BzLnZwYyA/PyBlYzIuVnBjLmZyb21Mb29rdXAodGhpcywgXCJWcGNcIiwgeyBpc0RlZmF1bHQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCByZXN0YXRlSW1hZ2UgPSBwcm9wcy5yZXN0YXRlSW1hZ2UgPz8gUkVTVEFURV9JTUFHRV9ERUZBVUxUO1xuICAgIGNvbnN0IHJlc3RhdGVUYWcgPSBwcm9wcy5yZXN0YXRlVGFnID8/IFJFU1RBVEVfRE9DS0VSX0RFRkFVTFRfVEFHO1xuICAgIGNvbnN0IGFkb3RUYWcgPSBwcm9wcy5hZG90VGFnID8/IEFET1RfRE9DS0VSX0RFRkFVTFRfVEFHOyAvLyBUT0RPOiBhZGQgWC1SYXkgc3VwcG9ydCBsaWtlIHdlIGhhdmUgZm9yIEVDMlxuXG4gICAgY29uc3QgZnMgPSBuZXcgZWZzLkZpbGVTeXN0ZW0odGhpcywgXCJEYXRhU3RvcmVcIiwge1xuICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgIGxpZmVjeWNsZVBvbGljeTogZWZzLkxpZmVjeWNsZVBvbGljeS5BRlRFUl8zMF9EQVlTLFxuICAgICAgcGVyZm9ybWFuY2VNb2RlOiBlZnMuUGVyZm9ybWFuY2VNb2RlLkdFTkVSQUxfUFVSUE9TRSxcbiAgICAgIHRocm91Z2hwdXRNb2RlOiBlZnMuVGhyb3VnaHB1dE1vZGUuQlVSU1RJTkcsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5ID8/IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgfSk7XG4gICAgZnMuYWRkVG9SZXNvdXJjZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgc2lkOiBcIkFsbG93RWZzTW91bnRcIixcbiAgICAgICAgYWN0aW9uczogW1wiZWxhc3RpY2ZpbGVzeXN0ZW06Q2xpZW50TW91bnRcIl0sXG4gICAgICAgIC8vIFJlc3RyaWN0aW5nIHRvIHRoZSBFQ1MgZXhlY3V0aW9uIHJvbGUgZG9lcyBub3Qgd29yazsgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIgLSBFRlMgYWNjZXNzIGlzIHNlY3VyZWQgYnkgYSBzZWN1cml0eSBncm91cFxuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5BbnlQcmluY2lwYWwoKV0sXG4gICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICBCb29sOiB7XG4gICAgICAgICAgICBcImVsYXN0aWNmaWxlc3lzdGVtOkFjY2Vzc2VkVmlhTW91bnRUYXJnZXRcIjogXCJ0cnVlXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5kYXRhU3RvcmUgPSBmcztcblxuICAgIGNvbnN0IGNsdXN0ZXIgPSBuZXcgZWNzLkNsdXN0ZXIodGhpcywgXCJDbHVzdGVyXCIsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBjbHVzdGVyTmFtZTogcHJvcHMuY2x1c3Rlck5hbWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN0YXRlVGFzayA9IG5ldyBlY3MuRmFyZ2F0ZVRhc2tEZWZpbml0aW9uKHRoaXMsIFwiUmVzdGF0ZVRhc2tcIiwge1xuICAgICAgY3B1OiA0MDk2LFxuICAgICAgbWVtb3J5TGltaXRNaUI6IDgxOTIsXG4gICAgICBydW50aW1lUGxhdGZvcm06IHtcbiAgICAgICAgY3B1QXJjaGl0ZWN0dXJlOiBlY3MuQ3B1QXJjaGl0ZWN0dXJlLkFSTTY0LFxuICAgICAgICBvcGVyYXRpbmdTeXN0ZW1GYW1pbHk6IGVjcy5PcGVyYXRpbmdTeXN0ZW1GYW1pbHkuTElOVVgsXG4gICAgICB9LFxuICAgICAgdm9sdW1lczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyZXN0YXRlU3RvcmVcIixcbiAgICAgICAgICBlZnNWb2x1bWVDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICBmaWxlU3lzdGVtSWQ6IGZzLmZpbGVTeXN0ZW1JZCxcbiAgICAgICAgICAgIGF1dGhvcml6YXRpb25Db25maWc6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gVE9ETzogU3RhcnQgYW4gQURPVCBjb250YWluZXIgYW5kIGhvb2sgaXQgdXAgdG8gUmVzdGF0ZSBhbmQgQVdTIFgtUmF5IG9yIGFub3RoZXIgT1RlbCBzaW5rXG4gICAgLy8gaWYgKHByb3BzLnRyYWNpbmcgPT09IFRyYWNpbmdNb2RlLkFXU19YUkFZKSB7XG4gICAgLy8gICByZXN0YXRlVGFzay50YXNrUm9sZS5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcIkFXU1hyYXlXcml0ZU9ubHlBY2Nlc3NcIikpO1xuICAgIC8vIH1cblxuICAgIG5ldyBpYW0uUG9saWN5KHRoaXMsIFwiVGFza1BvbGljeVwiLCB7XG4gICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBzaWQ6IFwiQWxsb3dBc3N1bWVBbnlSb2xlXCIsXG4gICAgICAgICAgYWN0aW9uczogW1wic3RzOkFzc3VtZVJvbGVcIl0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLCAvLyB3ZSBkb24ndCBrbm93IHVwZnJvbnQgd2hhdCBpbnZva2VyIHJvbGVzIHdlIG1heSBiZSBhc2tlZCB0byBhc3N1bWUgYXQgcnVudGltZVxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSkuYXR0YWNoVG9Sb2xlKHJlc3RhdGVUYXNrLnRhc2tSb2xlKTtcblxuICAgIGNvbnN0IGludm9rZXJSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsIFwiSW52b2tlclJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLkFyblByaW5jaXBhbChyZXN0YXRlVGFzay50YXNrUm9sZS5yb2xlQXJuKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFzc3VtZWQgYnkgUmVzdGF0ZSBkZXBsb3ltZW50IHRvIGludm9rZSBMYW1iZGEtYmFzZWQgc2VydmljZXNcIixcbiAgICB9KTtcbiAgICBpbnZva2VyUm9sZS5ncmFudEFzc3VtZVJvbGUocmVzdGF0ZVRhc2sudGFza1JvbGUpO1xuICAgIHRoaXMuaW52b2tlclJvbGUgPSBpbnZva2VyUm9sZTtcblxuICAgIGNvbnN0IGxvZ0dyb3VwID1cbiAgICAgIHByb3BzLmxvZ0dyb3VwID8/XG4gICAgICBuZXcgbG9ncy5Mb2dHcm91cCh0aGlzLCBcIkxvZ3NcIiwge1xuICAgICAgICBsb2dHcm91cE5hbWU6IGAvcmVzdGF0ZS8ke2lkfWAsXG4gICAgICAgIHJldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSA/PyBjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgfSk7XG5cbiAgICBjb25zdCByZXN0YXRlID0gcmVzdGF0ZVRhc2suYWRkQ29udGFpbmVyKFwiUmVzdGF0ZVwiLCB7XG4gICAgICBjb250YWluZXJOYW1lOiBcInJlc3RhdGUtcnVudGltZVwiLFxuICAgICAgaW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoYCR7cmVzdGF0ZUltYWdlfToke3Jlc3RhdGVUYWd9YCksXG4gICAgICBwb3J0TWFwcGluZ3M6IFt7IGNvbnRhaW5lclBvcnQ6IFJFU1RBVEVfSU5HUkVTU19QT1JUIH0sIHsgY29udGFpbmVyUG9ydDogUkVTVEFURV9BRE1JTl9QT1JUIH1dLFxuICAgICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlci5hd3NMb2dzKHtcbiAgICAgICAgbG9nR3JvdXAsXG4gICAgICAgIHN0cmVhbVByZWZpeDogXCJyZXN0YXRlXCIsXG4gICAgICB9KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFJFU1RBVEVfTE9HX0ZPUk1BVDogXCJqc29uXCIsXG4gICAgICAgIFJFU1RBVEVfTk9ERV9OQU1FOiBcImZhcmdhdGVcIixcbiAgICAgIH0sXG4gICAgICBjb21tYW5kOiBwcm9wcy5jb21tYW5kLFxuICAgICAgc3RhcnRUaW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygyMCksXG4gICAgICBzdG9wVGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoMjApLFxuICAgIH0pO1xuICAgIHJlc3RhdGUuYWRkTW91bnRQb2ludHMoe1xuICAgICAgY29udGFpbmVyUGF0aDogXCIvcmVzdGF0ZS1kYXRhXCIsXG4gICAgICByZWFkT25seTogZmFsc2UsXG4gICAgICBzb3VyY2VWb2x1bWU6IFwicmVzdGF0ZVN0b3JlXCIsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN0YXRlU2VjdXJpdHlHcm91cCA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBcIlNlY3VyaXR5R3JvdXBcIiwge1xuICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy5zZWN1cml0eUdyb3VwID0gcmVzdGF0ZVNlY3VyaXR5R3JvdXA7XG5cbiAgICBjb25zdCByZXN0YXRlRmFyZ2F0ZVNlcnZpY2UgPSBuZXcgZWNzLkZhcmdhdGVTZXJ2aWNlKHRoaXMsIFwiU2VydmljZVwiLCB7XG4gICAgICBjbHVzdGVyLFxuICAgICAgdGFza0RlZmluaXRpb246IHJlc3RhdGVUYXNrLFxuICAgICAgYXNzaWduUHVibGljSXA6IHRydWUsXG4gICAgICBjaXJjdWl0QnJlYWtlcjoge1xuICAgICAgICBlbmFibGU6IHRydWUsXG4gICAgICAgIHJvbGxiYWNrOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIG1pbkhlYWx0aHlQZXJjZW50OiAwLCAvLyBhbGxvdyBzY2FsZSBkb3duIHRvIHplcm8gZHVyaW5nIGRlcGxveW1lbnRzIChyZXF1aXJlZCBmb3IgYXQtbW9zdC0xIG1heCBzZXR0aW5nKVxuICAgICAgbWF4SGVhbHRoeVBlcmNlbnQ6IDEwMCwgLy8gZG9uJ3Qgc3RhcnQgbW9yZSB0aGFuIG9uZSBjb3B5XG4gICAgICBzZWN1cml0eUdyb3VwczogW3Jlc3RhdGVTZWN1cml0eUdyb3VwXSxcbiAgICB9KTtcblxuICAgIGZzLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRGcm9tKHJlc3RhdGVTZWN1cml0eUdyb3VwKTtcbiAgICBmcy5jb25uZWN0aW9ucy5hbGxvd0RlZmF1bHRQb3J0VG8ocmVzdGF0ZVNlY3VyaXR5R3JvdXApO1xuICAgIGZzLmdyYW50Um9vdEFjY2VzcyhyZXN0YXRlRmFyZ2F0ZVNlcnZpY2UudGFza0RlZmluaXRpb24udGFza1JvbGUuZ3JhbnRQcmluY2lwYWwpO1xuXG4gICAgY29uc3QgYWxiID0gbmV3IGVsYjIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIodGhpcywgXCJBbGJcIiwge1xuICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgIGludGVybmV0RmFjaW5nOiBwcm9wcy5sb2FkQmFsYW5jZXI/LmludGVybmV0RmFjaW5nLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcHVibGljQXBpQ2VydGlmaWNhdGUgPSBuZXcgYWNtLkNlcnRpZmljYXRlKHRoaXMsIFwiQ2VydGlmaWNhdGVcIiwge1xuICAgICAgZG9tYWluTmFtZTogcHJvcHMuZG5zTmFtZSxcbiAgICAgIHZhbGlkYXRpb246IGFjbS5DZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyhwcm9wcy5ob3N0ZWRab25lKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGluZ3Jlc3NMaXN0ZW5lciA9IGFsYi5hZGRMaXN0ZW5lcihcIkluZ3Jlc3NMaXN0ZW5lclwiLCB7XG4gICAgICBwb3J0OiBQVUJMSUNfSU5HUkVTU19QT1JULFxuICAgICAgcHJvdG9jb2w6IGVsYjIuQXBwbGljYXRpb25Qcm90b2NvbC5IVFRQUyxcbiAgICAgIGNlcnRpZmljYXRlczogW3B1YmxpY0FwaUNlcnRpZmljYXRlXSxcbiAgICAgIG9wZW46IHByb3BzLmxvYWRCYWxhbmNlcj8ub3BlbixcbiAgICB9KTtcbiAgICBpbmdyZXNzTGlzdGVuZXIuYWRkVGFyZ2V0cyhcIkZhcmdhdGVJbmdyZXNzVGFyZ2V0XCIsIHtcbiAgICAgIHRhcmdldHM6IFtcbiAgICAgICAgcmVzdGF0ZUZhcmdhdGVTZXJ2aWNlLmxvYWRCYWxhbmNlclRhcmdldCh7XG4gICAgICAgICAgY29udGFpbmVyTmFtZTogcmVzdGF0ZS5jb250YWluZXJOYW1lLFxuICAgICAgICAgIGNvbnRhaW5lclBvcnQ6IFJFU1RBVEVfSU5HUkVTU19QT1JULFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgICBwb3J0OiBSRVNUQVRFX0lOR1JFU1NfUE9SVCxcbiAgICAgIHByb3RvY29sOiBlbGIyLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUCxcbiAgICAgIGhlYWx0aENoZWNrOiB7XG4gICAgICAgIHBhdGg6IFwiL3Jlc3RhdGUvaGVhbHRoXCIsXG4gICAgICAgIGludGVydmFsOiBjZGsuRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgICAgaGVhbHRoeVRocmVzaG9sZENvdW50OiAzLFxuICAgICAgICB1bmhlYWx0aHlUaHJlc2hvbGRDb3VudDogMyxcbiAgICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoMiksXG4gICAgICB9LFxuICAgICAgZGVyZWdpc3RyYXRpb25EZWxheTogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgfSk7XG4gICAgdGhpcy5pbmdyZXNzTGlzdGVuZXIgPSBpbmdyZXNzTGlzdGVuZXI7XG5cbiAgICBjb25zdCBhZG1pbkxpc3RlbmVyID0gYWxiLmFkZExpc3RlbmVyKFwiQWRtaW5MaXN0ZW5lclwiLCB7XG4gICAgICBwb3J0OiBQVUJMSUNfQURNSU5fUE9SVCxcbiAgICAgIHByb3RvY29sOiBlbGIyLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUFMsXG4gICAgICBjZXJ0aWZpY2F0ZXM6IFtwdWJsaWNBcGlDZXJ0aWZpY2F0ZV0sXG4gICAgfSk7XG4gICAgYWRtaW5MaXN0ZW5lci5hZGRUYXJnZXRzKFwiRmFyZ2F0ZUFkbWluVGFyZ2V0XCIsIHtcbiAgICAgIHRhcmdldHM6IFtcbiAgICAgICAgcmVzdGF0ZUZhcmdhdGVTZXJ2aWNlLmxvYWRCYWxhbmNlclRhcmdldCh7XG4gICAgICAgICAgY29udGFpbmVyTmFtZTogcmVzdGF0ZS5jb250YWluZXJOYW1lLFxuICAgICAgICAgIGNvbnRhaW5lclBvcnQ6IFJFU1RBVEVfQURNSU5fUE9SVCxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgICAgcG9ydDogUkVTVEFURV9BRE1JTl9QT1JULFxuICAgICAgcHJvdG9jb2w6IGVsYjIuQXBwbGljYXRpb25Qcm90b2NvbC5IVFRQLFxuICAgICAgaGVhbHRoQ2hlY2s6IHtcbiAgICAgICAgcGF0aDogXCIvaGVhbHRoXCIsXG4gICAgICAgIGludGVydmFsOiBjZGsuRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgICAgaGVhbHRoeVRocmVzaG9sZENvdW50OiAzLFxuICAgICAgICB1bmhlYWx0aHlUaHJlc2hvbGRDb3VudDogMyxcbiAgICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoMiksXG4gICAgICB9LFxuICAgICAgZGVyZWdpc3RyYXRpb25EZWxheTogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgfSk7XG4gICAgdGhpcy5hZG1pbkxpc3RlbmVyID0gYWRtaW5MaXN0ZW5lcjtcblxuICAgIG5ldyByNTMuQVJlY29yZCh0aGlzLCBcIkFsYkFsaWFzXCIsIHtcbiAgICAgIHpvbmU6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICByZWNvcmROYW1lOiBwcm9wcy5kbnNOYW1lLnNwbGl0KFwiLlwiKVswXSxcbiAgICAgIHRhcmdldDogcjUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMobmV3IHRhcmdldHMuTG9hZEJhbGFuY2VyVGFyZ2V0KGFsYikpLFxuICAgICAgLy8gb3RoZXIgQVJlY29yZCBjb25maWd1cmF0aW9uLi4uXG4gICAgfSk7XG5cbiAgICB0aGlzLmluZ3Jlc3NVcmwgPSBgaHR0cHM6Ly8ke3Byb3BzLmRuc05hbWV9JHtQVUJMSUNfSU5HUkVTU19QT1JUID09IDQ0MyA/IFwiXCIgOiBgOiR7UFVCTElDX0lOR1JFU1NfUE9SVH1gfWA7XG4gICAgdGhpcy5hZG1pblVybCA9IGBodHRwczovLyR7cHJvcHMuZG5zTmFtZX06JHtQVUJMSUNfQURNSU5fUE9SVH1gO1xuICB9XG59XG4iXX0=
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./service-deployer";
2
+ export * from "./fargate-restate-deployment";
2
3
  export * from "./restate-environment";
3
4
  export * from "./restate-cloud-environment";
4
5
  export * from "./deployments-common";
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  /*
3
- * Copyright (c) 2023 - Restate Software, Inc., Restate GmbH
3
+ * Copyright (c) 2023-2025 - Restate Software, Inc., Restate GmbH
4
4
  *
5
- * This file is part of the Restate SDK for Node.js/TypeScript,
5
+ * This file is part of the Restate CDK Construct Library,
6
6
  * which is released under the MIT license.
7
7
  *
8
8
  * You can find a copy of the license in file LICENSE in the root
@@ -25,8 +25,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
25
25
  };
26
26
  Object.defineProperty(exports, "__esModule", { value: true });
27
27
  __exportStar(require("./service-deployer"), exports);
28
+ __exportStar(require("./fargate-restate-deployment"), exports);
28
29
  __exportStar(require("./restate-environment"), exports);
29
30
  __exportStar(require("./restate-cloud-environment"), exports);
30
31
  __exportStar(require("./deployments-common"), exports);
31
32
  __exportStar(require("./single-node-restate-deployment"), exports);
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxxREFBbUM7QUFDbkMsd0RBQXNDO0FBQ3RDLDhEQUE0QztBQUM1Qyx1REFBcUM7QUFDckMsbUVBQWlEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL3NlcnZpY2UtZGVwbG95ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtY2xvdWQtZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlcGxveW1lbnRzLWNvbW1vblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2luZ2xlLW5vZGUtcmVzdGF0ZS1kZXBsb3ltZW50XCI7XG4iXX0=
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxxREFBbUM7QUFDbkMsK0RBQTZDO0FBQzdDLHdEQUFzQztBQUN0Qyw4REFBNEM7QUFDNUMsdURBQXFDO0FBQ3JDLG1FQUFpRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjMtMjAyNSAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIENESyBDb25zdHJ1Y3QgTGlicmFyeSxcbiAqIHdoaWNoIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqXG4gKiBZb3UgY2FuIGZpbmQgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGluIGZpbGUgTElDRU5TRSBpbiB0aGUgcm9vdFxuICogZGlyZWN0b3J5IG9mIHRoaXMgcmVwb3NpdG9yeSBvciBwYWNrYWdlLCBvciBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL3Jlc3RhdGVkZXYvc2RrLXR5cGVzY3JpcHQvYmxvYi9tYWluL0xJQ0VOU0VcbiAqL1xuXG5leHBvcnQgKiBmcm9tIFwiLi9zZXJ2aWNlLWRlcGxveWVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mYXJnYXRlLXJlc3RhdGUtZGVwbG95bWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVzdGF0ZS1lbnZpcm9ubWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVzdGF0ZS1jbG91ZC1lbnZpcm9ubWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVwbG95bWVudHMtY29tbW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zaW5nbGUtbm9kZS1yZXN0YXRlLWRlcGxveW1lbnRcIjtcbiJdfQ==
@@ -1,6 +1,5 @@
1
1
  import { Handler } from "aws-lambda/handler";
2
2
  import { CloudFormationCustomResourceEvent } from "aws-lambda/trigger/cloudformation-custom-resource";
3
- import * as cdk from "aws-cdk-lib";
4
3
  /**
5
4
  * Custom Resource event shape for registering Restate Lambda service handlers with a Restate environment.
6
5
  */
@@ -27,7 +26,6 @@ export interface RegistrationProperties {
27
26
  private?: "true" | "false";
28
27
  /** Whether to trust any certificate when connecting to the admin endpoint. */
29
28
  insecure?: "true" | "false";
30
- removalPolicy?: cdk.RemovalPolicy;
31
29
  }
32
30
  /**
33
31
  * Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  /*
3
- * Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH
3
+ * Copyright (c) 2023-2025 - Restate Software, Inc., Restate GmbH
4
4
  *
5
- * This file is part of the Restate SDK for Node.js/TypeScript,
5
+ * This file is part of the Restate CDK Construct Library,
6
6
  * which is released under the MIT license.
7
7
  *
8
8
  * You can find a copy of the license in file LICENSE in the root
@@ -25,13 +25,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
25
25
  }) : function(o, v) {
26
26
  o["default"] = v;
27
27
  });
28
- var __importStar = (this && this.__importStar) || function (mod) {
29
- if (mod && mod.__esModule) return mod;
30
- var result = {};
31
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
32
- __setModuleDefault(result, mod);
33
- return result;
34
- };
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
35
45
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
46
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
47
  };
@@ -156,9 +166,10 @@ const handler = async function (event) {
156
166
  const response = (await registerDeploymentResponse.json());
157
167
  if (props.servicePath && !response.services.find((s) => s.name === props.servicePath)) {
158
168
  failureReason =
159
- `"Registration succeeded, but none the services names in the deployment matched the specified name. " +
160
- "Expected \"${props.servicePath}\"", got back: [` + response.services.map((svc) => svc?.name).join(", ");
161
- `]`;
169
+ "Registration succeeded, but none of the service names in the deployment match the specified name. " +
170
+ `Expected "${props.servicePath}", got back: [` +
171
+ response.services.map((svc) => svc?.name).join(", ") +
172
+ "]";
162
173
  attempt = MAX_REGISTRATION_ATTEMPTS; // don't retry this
163
174
  break;
164
175
  }
@@ -235,4 +246,4 @@ async function createAuthHeader(props) {
235
246
  async function sleep(millis) {
236
247
  return new Promise((resolve) => setTimeout(resolve, millis));
237
248
  }
238
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlILDREQUErQjtBQUUvQiw0RUFBOEY7QUFDOUYsbUNBQW1DO0FBQ25DLGtEQUFvQztBQUNwQyxnREFBa0M7QUE0Q2xDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsMkZBQTJGO0FBQ2hJLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0FBRXBDLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO0FBQ3ZDLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQztBQUVqQzs7O0dBR0c7QUFDSSxNQUFNLE9BQU8sR0FBcUQsS0FBSyxXQUFXLEtBQUs7SUFDNUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFdkIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGtCQUE0QyxDQUFDO0lBRWpFLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMvQixTQUFTLEVBQUUsSUFBSTtLQUNoQixDQUFDLENBQUM7SUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDakMsU0FBUyxFQUFFLElBQUk7UUFDZixrQkFBa0IsRUFBRSxLQUFLLENBQUMsUUFBUSxLQUFLLE1BQU07S0FDOUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFRLEVBQUUsRUFBRTtRQUNqQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7WUFDNUIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFVBQVUsQ0FBQztR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Q0FBQztRQUNuRSxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxtRUFBbUUsQ0FBQyxDQUFDO0FBQ3hHLENBQUMsQ0FBQztBQS9MVyxRQUFBLE9BQU8sV0ErTGxCO0FBRUYsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEtBQTZCO0lBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3pGLE1BQU0sR0FBRyxHQUFHLElBQUksNkNBQW9CLEVBQUUsQ0FBQztJQUN2QyxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQzdCLElBQUksOENBQXFCLENBQUM7UUFDeEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxrQkFBa0I7S0FDbkMsQ0FBQyxDQUNILENBQUM7SUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxRQUFRLENBQUMsSUFBSSxhQUFhLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzlGLE9BQU87UUFDTCxhQUFhLEVBQUUsVUFBVSxRQUFRLENBQUMsWUFBWSxFQUFFO0tBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLEtBQUssQ0FBQyxNQUFjO0lBQ2pDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMy0yMDI0IC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgU0RLIGZvciBOb2RlLmpzL1R5cGVTY3JpcHQsXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgSGFuZGxlciB9IGZyb20gXCJhd3MtbGFtYmRhL2hhbmRsZXJcIjtcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCB9IGZyb20gXCJhd3MtbGFtYmRhL3RyaWdnZXIvY2xvdWRmb3JtYXRpb24tY3VzdG9tLXJlc291cmNlXCI7XG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEdldFNlY3JldFZhbHVlQ29tbWFuZCwgU2VjcmV0c01hbmFnZXJDbGllbnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSBcIm5vZGU6aHR0cHNcIjtcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiO1xuXG4vKipcbiAqIEN1c3RvbSBSZXNvdXJjZSBldmVudCBzaGFwZSBmb3IgcmVnaXN0ZXJpbmcgUmVzdGF0ZSBMYW1iZGEgc2VydmljZSBoYW5kbGVycyB3aXRoIGEgUmVzdGF0ZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzIHtcbiAgLyoqIFdoZXJlIHRvIGZpbmQgdGhlIFJlc3RhdGUgYWRtaW4gZW5kcG9pbnQuICovXG4gIGFkbWluVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzZXJ2aWNlIG5hbWUgdG8gbG9vayBmb3IgaW4gdGhlIGRlcGxveW1lbnQuIElmIG1vcmUgdGhhbiBvbmUgc2VydmljZSBpcyBiZWhpbmQgdGhlIHNhbWUgZW5kcG9pbnQsIGFueSBvbmVcbiAgICogc2hvdWxkIG1hdGNoLiBMZWF2ZSB1bnNldCB0byBza2lwIHRoZSBjaGVjay5cbiAgICovXG4gIHNlcnZpY2VQYXRoPzogc3RyaW5nO1xuXG4gIHNlcnZpY2VMYW1iZGFBcm4/OiBzdHJpbmc7XG5cbiAgaW52b2tlUm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gdG9rZW4gQVJOIHRvIHVzZSB3aXRoIHRoZSBhZG1pbiBlbmRwb2ludC4gVGhlIHNlY3JldCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgYSBiZWFyZXIgdG9rZW4sIGlmIHNldC5cbiAgICovXG4gIGF1dGhUb2tlblNlY3JldEFybj86IHN0cmluZztcblxuICAvKiogTm90IHVzZWQgYnkgdGhlIGhhbmRsZXIsIHB1cmVseSB1c2VkIHRvIHRyaWNrIENsb3VkRm9ybWF0aW9uIHRvIHBlcmZvcm0gYW4gdXBkYXRlIHdoZW4gaXQgb3RoZXJ3aXNlIHdvdWxkIG5vdC4gKi9cbiAgY29uZmlndXJhdGlvblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbWFyayB0aGUgc2VydmljZSBhcyBwcml2YXRlLCBhbmQgbWFrZSBpdCB1bmF2YWlsYWJsZSB0byBiZSBjYWxsZWQgdmlhIFJlc3RhdGUgaW5ncmVzcy4gSWYgdGhlcmUgYXJlXG4gICAqIG11bHRpcGxlIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IHRoZSBlbmRwb2ludCwgdGhleSB3aWxsIGFsbCBiZSBtYXJrZWQgYXMgc3BlY2lmaWVkLlxuICAgKi9cbiAgcHJpdmF0ZT86IFwidHJ1ZVwiIHwgXCJmYWxzZVwiO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHRydXN0IGFueSBjZXJ0aWZpY2F0ZSB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIGFkbWluIGVuZHBvaW50LiAqL1xuICBpbnNlY3VyZT86IFwidHJ1ZVwiIHwgXCJmYWxzZVwiO1xuXG4gIHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeTtcbn1cblxudHlwZSBSZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgc2VydmljZXM6IHsgbmFtZTogc3RyaW5nOyByZXZpc2lvbjogbnVtYmVyOyBwdWJsaWM6IGJvb2xlYW4gfVtdO1xufTtcblxuY29uc3QgTUFYX0hFQUxUSF9DSEVDS19BVFRFTVBUUyA9IDU7IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBxdWl0ZSBsb25nIHRvIGFsbG93IHNvbWUgdGltZSBmb3IgZmlyc3QtcnVuIEVDMiBhbmQgRG9ja2VyIGJvb3QgdXBcbmNvbnN0IE1BWF9SRUdJU1RSQVRJT05fQVRURU1QVFMgPSAzO1xuXG5jb25zdCBERVBMT1lNRU5UU19QQVRIID0gXCJkZXBsb3ltZW50c1wiO1xuY29uc3QgU0VSVklDRVNfUEFUSCA9IFwic2VydmljZXNcIjtcblxuLyoqXG4gKiBDdXN0b20gUmVzb3VyY2UgZXZlbnQgaGFuZGxlciBmb3IgUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbi4gVGhpcyBoYW5kbGVyIGJhY2tzIHRoZSBjdXN0b20gcmVzb3VyY2VzIGNyZWF0ZWQgYnlcbiAqIHtAbGluayBTZXJ2aWNlRGVwbG95ZXJ9IHRvIGZhY2lsaXRhdGUgTGFtYmRhIHNlcnZpY2UgaGFuZGxlciBkaXNjb3ZlcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVyOiBIYW5kbGVyPENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCwgdm9pZD4gPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc29sZS5sb2coeyBldmVudCB9KTtcblxuICBjb25zdCBwcm9wcyA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcyBhcyBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzO1xuXG4gIGNvbnN0IGh0dHBBZ2VudCA9IG5ldyBodHRwLkFnZW50KHtcbiAgICBrZWVwQWxpdmU6IHRydWUsXG4gIH0pO1xuICBjb25zdCBodHRwc0FnZW50ID0gbmV3IGh0dHBzLkFnZW50KHtcbiAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgcmVqZWN0VW5hdXRob3JpemVkOiBwcm9wcy5pbnNlY3VyZSAhPT0gXCJ0cnVlXCIsXG4gIH0pO1xuICBjb25zdCBhZ2VudFNlbGVjdG9yID0gKHVybDogVVJMKSA9PiB7XG4gICAgaWYgKHVybC5wcm90b2NvbCA9PSBcImh0dHA6XCIpIHtcbiAgICAgIHJldHVybiBodHRwQWdlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBodHRwc0FnZW50O1xuICAgIH1cbiAgfTtcblxuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiRGVsZXRlXCIpIHtcbiAgICAvLyBTaW5jZSB3ZSByZXRhaW4gb2xkZXIgTGFtYmRhIGhhbmRsZXIgdmVyc2lvbnMgb24gdXBkYXRlLCB3ZSBhbHNvIGxlYXZlIHRoZSByZWdpc3RlcmVkIHNlcnZpY2UgYWxvbmUuIFRoZXJlIG1heVxuICAgIC8vIGJlIHVuZmluaXNoZWQgaW52b2NhdGlvbnMgdGhhdCByZXF1aXJlIGl0OyBpbiB0aGUgZnV0dXJlIHdlIHdvdWxkIHdhbnQgdG8gaW5mb3JtIFJlc3RhdGUgdGhhdCB3ZSB3YW50IHRvXG4gICAgLy8gZGUtcmVnaXN0ZXIgdGhlIHNlcnZpY2UsIGFuZCB3YWl0IGZvciBSZXN0YXRlIHRvIGxldCB1cyBrbm93IHRoYXQgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIGRlcGxveWVkIEZ1bmN0aW9uXG4gICAgLy8gdmVyc2lvbiBmcm9tIExhbWJkYS5cblxuICAgIC8vIGNvbnN0IHByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzIGFzIFJlZ2lzdHJhdGlvblByb3BlcnRpZXM7XG4gICAgLy8gaWYgKHByb3BzLnJlbW92YWxQb2xpY3kgPT09IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpIHtcbiAgICAvLyAgIGNvbnNvbGUubG9nKGBEZS1yZWdpc3RlcmluZyBzZXJ2aWNlICR7cHJvcHMuc2VydmljZUxhbWJkYUFybn1gKTtcbiAgICAvLyAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgLy8gICBjb25zdCBpZCA9IGJ0b2EocHJvcHMuc2VydmljZUxhbWJkYUFybiEpOyAvLyBUT0RPOiB3ZSBzaG91bGQgYmUgdHJlYXRpbmcgc2VydmljZSBpZHMgYXMgb3BhcXVlXG4gICAgLy8gICBjb25zdCBkZWxldGVDYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDVfMDAwKTtcbiAgICAvLyAgIGNvbnN0IGRlbGV0ZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMuYWRtaW5Vcmx9LyR7REVQTE9ZTUVOVFNfUEFUSH0vJHtpZH0/Zm9yY2U9dHJ1ZWAsIHtcbiAgICAvLyAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAvLyAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgIC8vICAgICBhZ2VudDogYWdlbnRTZWxlY3RvcixcbiAgICAvLyAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KGRlbGV0ZUNhbGxUaW1lb3V0KSk7XG4gICAgLy9cbiAgICAvLyAgIGNvbnNvbGUubG9nKGBHb3QgZGVsZXRlIHJlc3BvbnNlIGJhY2s6ICR7ZGVsZXRlUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIC8vICAgaWYgKGRlbGV0ZVJlc3BvbnNlLnN0YXR1cyAhPSAyMDIpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGBSZW1vdmluZyBzZXJ2aWNlIGRlcGxveW1lbnQgZmFpbGVkOiAke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgY29uc29sZS53YXJuKFwiRGUtcmVnaXN0ZXJpbmcgc2VydmljZXMgaXMgbm90IHN1cHBvcnRlZCBjdXJyZW50bHkuIFByZXZpb3VzIHZlcnNpb24gd2lsbCByZW1haW4gcmVnaXN0ZXJlZC5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXV0aEhlYWRlciA9IGF3YWl0IGNyZWF0ZUF1dGhIZWFkZXIocHJvcHMpO1xuXG4gIGxldCBhdHRlbXB0O1xuXG4gIGNvbnN0IGhlYWx0aENoZWNrVXJsID0gYCR7cHJvcHMuYWRtaW5Vcmx9L2hlYWx0aGA7XG5cbiAgYXR0ZW1wdCA9IDE7XG4gIGNvbnNvbGUubG9nKGBQZXJmb3JtaW5nIGhlYWx0aCBjaGVjayBhZ2FpbnN0OiAke2hlYWx0aENoZWNrVXJsfWApO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnNvbGUubG9nKGBNYWtpbmcgaGVhbHRoIGNoZWNrIHJlcXVlc3QgIyR7YXR0ZW1wdH0uLi5gKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IGhlYWx0aENoZWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDVfMDAwKTtcbiAgICBsZXQgaGVhbHRoUmVzcG9uc2UgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaGVhbHRoUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChoZWFsdGhDaGVja1VybCwge1xuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBoZWFkZXJzOiBhdXRoSGVhZGVyLFxuICAgICAgICBhZ2VudDogYWdlbnRTZWxlY3RvcixcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KGhlYWx0aENoZWNrVGltZW91dCkpO1xuXG4gICAgICBjb25zb2xlLmxvZyhgR290IGhlYWx0aCBjaGVjayByZXNwb25zZSBiYWNrOiAke2hlYWx0aFJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgIGlmIChoZWFsdGhSZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIGhlYWx0aFJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBSZXN0YXRlIGhlYWx0aCBjaGVjayBmYWlsZWQ6ICR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzfTsgYXR0ZW1wdCAke2F0dGVtcHR9KWAsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IChlIGFzIEVycm9yKT8ubWVzc2FnZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJlc3RhdGUgaGVhbHRoIGNoZWNrIGZhaWxlZDogXCIke2Vycm9yTWVzc2FnZX1cIiAoYXR0ZW1wdCAke2F0dGVtcHR9KWApO1xuICAgIH1cblxuICAgIGlmIChhdHRlbXB0ID49IE1BWF9IRUFMVEhfQ0hFQ0tfQVRURU1QVFMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFkbWluIHNlcnZpY2UgaGVhbHRoIGNoZWNrIGZhaWxpbmcgYWZ0ZXIgJHthdHRlbXB0fSBhdHRlbXB0cy5gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UgPz8gYCR7aGVhbHRoUmVzcG9uc2U/LnN0YXR1c1RleHR9ICgke2hlYWx0aFJlc3BvbnNlPy5zdGF0dXN9KWApO1xuICAgIH1cbiAgICBhdHRlbXB0ICs9IDE7XG5cbiAgICBjb25zdCB3YWl0VGltZU1pbGxpcyA9IHJhbmRvbUludCgyXzAwMCkgKyAyICoqIGF0dGVtcHQgKiAxXzAwMDsgLy8gM3MgLT4gNnMgLT4gMTBzIC0+IDE4cyAtPiAzNHNcbiAgICBjb25zb2xlLmxvZyhgUmV0cnlpbmcgYWZ0ZXIgJHt3YWl0VGltZU1pbGxpc30gbXMuLi5gKTtcbiAgICBhd2FpdCBzbGVlcCh3YWl0VGltZU1pbGxpcyk7XG4gIH1cblxuICBjb25zdCBkZXBsb3ltZW50c1VybCA9IGAke3Byb3BzLmFkbWluVXJsfS8ke0RFUExPWU1FTlRTX1BBVEh9YDtcbiAgY29uc3QgcmVnaXN0cmF0aW9uUmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBhcm46IHByb3BzLnNlcnZpY2VMYW1iZGFBcm4sXG4gICAgYXNzdW1lX3JvbGVfYXJuOiBwcm9wcy5pbnZva2VSb2xlQXJuLFxuICB9KTtcblxuICBsZXQgZmFpbHVyZVJlYXNvbjtcbiAgYXR0ZW1wdCA9IDE7XG4gIGNvbnNvbGUubG9nKGBSZWdpc3RlcmluZyBzZXJ2aWNlcyBhdCAke2RlcGxveW1lbnRzVXJsfTogJHtyZWdpc3RyYXRpb25SZXF1ZXN0fWApO1xuXG4gIHJlZ2lzdHJhdGlvbl9yZXRyeV9sb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZyhgTWFraW5nIHJlZ2lzdHJhdGlvbiByZXF1ZXN0ICMke2F0dGVtcHR9Li4uYCk7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgY29uc3QgcmVnaXN0ZXJDYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDEwXzAwMCk7XG4gICAgICBjb25zdCByZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZSA9IGF3YWl0IGZldGNoKGRlcGxveW1lbnRzVXJsLCB7XG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGJvZHk6IHJlZ2lzdHJhdGlvblJlcXVlc3QsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAuLi5hdXRoSGVhZGVyLFxuICAgICAgICB9LFxuICAgICAgICBhZ2VudDogYWdlbnRTZWxlY3RvcixcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHJlZ2lzdGVyQ2FsbFRpbWVvdXQpKTtcblxuICAgICAgaWYgKHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLmpzb24oKSkgYXMgUmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2U7XG5cbiAgICAgICAgaWYgKHByb3BzLnNlcnZpY2VQYXRoICYmICFyZXNwb25zZS5zZXJ2aWNlcy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHByb3BzLnNlcnZpY2VQYXRoKSkge1xuICAgICAgICAgIGZhaWx1cmVSZWFzb24gPVxuICAgICAgICAgICAgYFwiUmVnaXN0cmF0aW9uIHN1Y2NlZWRlZCwgYnV0IG5vbmUgdGhlIHNlcnZpY2VzIG5hbWVzIGluIHRoZSBkZXBsb3ltZW50IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBuYW1lLiBcIiArIFxuICAgICAgICAgICAgXCJFeHBlY3RlZCBcXFwiJHtwcm9wcy5zZXJ2aWNlUGF0aH1cXFwiXCIsIGdvdCBiYWNrOiBbYCArIHJlc3BvbnNlLnNlcnZpY2VzLm1hcCgoc3ZjKSA9PiBzdmM/Lm5hbWUpLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICBgXWA7XG5cbiAgICAgICAgICBhdHRlbXB0ID0gTUFYX1JFR0lTVFJBVElPTl9BVFRFTVBUUzsgLy8gZG9uJ3QgcmV0cnkgdGhpc1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJTdWNjZXNzZnVsIHJlZ2lzdHJhdGlvbiEgU2VydmljZXM6IFwiLCBKU09OLnN0cmluZ2lmeShyZXNwb25zZS5zZXJ2aWNlcykpO1xuXG4gICAgICAgIGNvbnN0IGlzUHVibGljID0gKHByb3BzLnByaXZhdGUgPz8gXCJmYWxzZVwiKSA9PT0gXCJmYWxzZVwiO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiByZXNwb25zZS5zZXJ2aWNlcyA/PyBbXSkge1xuICAgICAgICAgIGlmIChzZXJ2aWNlLnB1YmxpYyA9PT0gaXNQdWJsaWMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTZXJ2aWNlICR7c2VydmljZS5uYW1lfSBpcyAke2lzUHVibGljID8gXCJwdWJsaWNcIiA6IFwicHJpdmF0ZVwifS5gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKGBNYXJraW5nIHNlcnZpY2UgJHtzZXJ2aWNlLm5hbWV9IGFzICR7aXNQdWJsaWMgPyBcInB1YmxpY1wiIDogXCJwcml2YXRlXCJ9Li4uYCk7XG4gICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgICBjb25zdCBwcml2YXRlQ2FsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoXCJ0aW1lb3V0XCIpLCAxMF8wMDApO1xuICAgICAgICAgIGNvbnN0IHBhdGNoUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtwcm9wcy5hZG1pblVybH0vJHtTRVJWSUNFU19QQVRIfS8ke3NlcnZpY2UubmFtZX1gLCB7XG4gICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAuLi5hdXRoSGVhZGVyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHVibGljOiBpc1B1YmxpYyB9KSxcbiAgICAgICAgICAgIGFnZW50OiBhZ2VudFNlbGVjdG9yLFxuICAgICAgICAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHByaXZhdGVDYWxsVGltZW91dCkpO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coYEdvdCBwYXRjaCByZXNwb25zZSBiYWNrOiAke3BhdGNoUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgIGlmIChwYXRjaFJlc3BvbnNlLnN0YXR1cyAhPSAyMDApIHtcbiAgICAgICAgICAgIGZhaWx1cmVSZWFzb24gPSBgTWFya2luZyBzZXJ2aWNlIGFzICR7cHJvcHMucHJpdmF0ZSA/IFwicHJpdmF0ZVwiIDogXCJwdWJsaWNcIn0gZmFpbGVkOiAke3BhdGNoUmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7cGF0Y2hSZXNwb25zZS5zdGF0dXN9KWA7XG4gICAgICAgICAgICBicmVhayByZWdpc3RyYXRpb25fcmV0cnlfbG9vcDsgLy8gZG9uJ3QgdGhyb3cgaW1tZWRpYXRlbHkgLSBsZXQgcmV0cnkgbG9vcCBkZWNpZGUgd2hldGhlciB0byBhYm9ydCBzXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBtYXJrZWQgc2VydmljZSBhcyAke2lzUHVibGljID8gXCJwdWJsaWNcIiA6IFwicHJpdmF0ZVwifS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjsgLy8gT3ZlcmFsbCBzdWNjZXNzIVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JCb2R5ID0gYXdhaXQgcmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBmYWlsdXJlUmVhc29uID0gYFJlZ2lzdHJhdGlvbiBmYWlsZWQgKCR7cmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2Uuc3RhdHVzfSk6ICR7ZXJyb3JCb2R5fWA7XG4gICAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgICBtZXNzYWdlOiBgR290IGVycm9yIHJlc3BvbnNlIGZyb20gUmVzdGF0ZS5gLFxuICAgICAgICAgIGNvZGU6IHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBib2R5OiBlcnJvckJvZHksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlfSAoYXR0ZW1wdCAke2F0dGVtcHR9KWApO1xuICAgICAgZmFpbHVyZVJlYXNvbiA9IChlIGFzIEVycm9yKT8ubWVzc2FnZTtcbiAgICB9XG5cbiAgICBpZiAoYXR0ZW1wdCA+PSBNQVhfUkVHSVNUUkFUSU9OX0FUVEVNUFRTKSB7XG4gICAgICBmYWlsdXJlUmVhc29uID0gYEdpdmluZyB1cCBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzLiBMYXN0IGVycm9yOiAke2ZhaWx1cmVSZWFzb259YDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBhdHRlbXB0ICs9IDE7XG4gICAgY29uc3Qgd2FpdFRpbWVNaWxsaXMgPSByYW5kb21JbnQoMl8wMDApICsgMiAqKiBhdHRlbXB0ICogMV8wMDA7IC8vIDNzIC0+IDZzIC0+IDEwc1xuICAgIGNvbnNvbGUubG9nKGBSZXRyeWluZyByZWdpc3RyYXRpb24gYWZ0ZXIgJHt3YWl0VGltZU1pbGxpc30gbXMuLi5gKTtcbiAgICBhd2FpdCBzbGVlcCh3YWl0VGltZU1pbGxpcyk7XG4gIH1cblxuICBjb25zb2xlLmVycm9yKGZhaWx1cmVSZWFzb24pO1xuICB0aHJvdyBuZXcgRXJyb3IoZmFpbHVyZVJlYXNvbiA/PyBcIlJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkLiBQbGVhc2Ugc2VlIGxvZ3MgZm9yIGRldGFpbHMuXCIpO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aEhlYWRlcihwcm9wczogUmVnaXN0cmF0aW9uUHJvcGVydGllcyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBpZiAoIXByb3BzLmF1dGhUb2tlblNlY3JldEFybikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBVc2luZyBiZWFyZXIgYXV0aGVudGljYXRpb24gdG9rZW4gZnJvbSBzZWNyZXQgJHtwcm9wcy5hdXRoVG9rZW5TZWNyZXRBcm59YCk7XG4gIGNvbnN0IHNzbSA9IG5ldyBTZWNyZXRzTWFuYWdlckNsaWVudCgpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNzbS5zZW5kKFxuICAgIG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoe1xuICAgICAgU2VjcmV0SWQ6IHByb3BzLmF1dGhUb2tlblNlY3JldEFybixcbiAgICB9KSxcbiAgKTtcblxuICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBzZWNyZXQgXCIke3Jlc3BvbnNlLk5hbWV9XCIgdmVyc2lvbiAke3Jlc3BvbnNlLlZlcnNpb25JZH1gKTtcbiAgcmV0dXJuIHtcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7cmVzcG9uc2UuU2VjcmV0U3RyaW5nfWAsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpczogbnVtYmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXMpKTtcbn1cbiJdfQ==
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJSCw0REFBK0I7QUFDL0IsNEVBQThGO0FBQzlGLG1DQUFtQztBQUNuQyxrREFBb0M7QUFDcEMsZ0RBQWtDO0FBNENsQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQyxDQUFDLDJGQUEyRjtBQUNoSSxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUVwQyxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztBQUN2QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFFakM7OztHQUdHO0FBQ0ksTUFBTSxPQUFPLEdBQXFELEtBQUssV0FBVyxLQUFLO0lBQzVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXZCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxrQkFBNEMsQ0FBQztJQUVqRSxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDL0IsU0FBUyxFQUFFLElBQUk7S0FDaEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ2pDLFNBQVMsRUFBRSxJQUFJO1FBQ2Ysa0JBQWtCLEVBQUUsS0FBSyxDQUFDLFFBQVEsS0FBSyxNQUFNO0tBQzlDLENBQUMsQ0FBQztJQUNILE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUU7UUFDakMsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxV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QUErQixjQUFjLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxJQUFJLG1FQUFtRSxDQUFDLENBQUM7QUFDeEcsQ0FBQyxDQUFDO0FBaE1XLFFBQUEsT0FBTyxXQWdNbEI7QUFFRixLQUFLLFVBQVUsZ0JBQWdCLENBQUMsS0FBNkI7SUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzlCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsaURBQWlELEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDekYsTUFBTSxHQUFHLEdBQUcsSUFBSSw2Q0FBb0IsRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sUUFBUSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FDN0IsSUFBSSw4Q0FBcUIsQ0FBQztRQUN4QixRQUFRLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtLQUNuQyxDQUFDLENBQ0gsQ0FBQztJQUVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLFFBQVEsQ0FBQyxJQUFJLGFBQWEsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDOUYsT0FBTztRQUNMLGFBQWEsRUFBRSxVQUFVLFFBQVEsQ0FBQyxZQUFZLEVBQUU7S0FDakQsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUsS0FBSyxDQUFDLE1BQWM7SUFDakMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzLTIwMjUgLSBSZXN0YXRlIFNvZnR3YXJlLCBJbmMuLCBSZXN0YXRlIEdtYkhcbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgUmVzdGF0ZSBDREsgQ29uc3RydWN0IExpYnJhcnksXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgSGFuZGxlciB9IGZyb20gXCJhd3MtbGFtYmRhL2hhbmRsZXJcIjtcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCB9IGZyb20gXCJhd3MtbGFtYmRhL3RyaWdnZXIvY2xvdWRmb3JtYXRpb24tY3VzdG9tLXJlc291cmNlXCI7XG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcbmltcG9ydCB7IEdldFNlY3JldFZhbHVlQ29tbWFuZCwgU2VjcmV0c01hbmFnZXJDbGllbnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSBcIm5vZGU6aHR0cHNcIjtcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiO1xuXG4vKipcbiAqIEN1c3RvbSBSZXNvdXJjZSBldmVudCBzaGFwZSBmb3IgcmVnaXN0ZXJpbmcgUmVzdGF0ZSBMYW1iZGEgc2VydmljZSBoYW5kbGVycyB3aXRoIGEgUmVzdGF0ZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzIHtcbiAgLyoqIFdoZXJlIHRvIGZpbmQgdGhlIFJlc3RhdGUgYWRtaW4gZW5kcG9pbnQuICovXG4gIGFkbWluVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzZXJ2aWNlIG5hbWUgdG8gbG9vayBmb3IgaW4gdGhlIGRlcGxveW1lbnQuIElmIG1vcmUgdGhhbiBvbmUgc2VydmljZSBpcyBiZWhpbmQgdGhlIHNhbWUgZW5kcG9pbnQsIGFueSBvbmVcbiAgICogc2hvdWxkIG1hdGNoLiBMZWF2ZSB1bnNldCB0byBza2lwIHRoZSBjaGVjay5cbiAgICovXG4gIHNlcnZpY2VQYXRoPzogc3RyaW5nO1xuXG4gIHNlcnZpY2VMYW1iZGFBcm4/OiBzdHJpbmc7XG5cbiAgaW52b2tlUm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gdG9rZW4gQVJOIHRvIHVzZSB3aXRoIHRoZSBhZG1pbiBlbmRwb2ludC4gVGhlIHNlY3JldCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgYSBiZWFyZXIgdG9rZW4sIGlmIHNldC5cbiAgICovXG4gIGF1dGhUb2tlblNlY3JldEFybj86IHN0cmluZztcblxuICAvKiogTm90IHVzZWQgYnkgdGhlIGhhbmRsZXIsIHB1cmVseSB1c2VkIHRvIHRyaWNrIENsb3VkRm9ybWF0aW9uIHRvIHBlcmZvcm0gYW4gdXBkYXRlIHdoZW4gaXQgb3RoZXJ3aXNlIHdvdWxkIG5vdC4gKi9cbiAgY29uZmlndXJhdGlvblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbWFyayB0aGUgc2VydmljZSBhcyBwcml2YXRlLCBhbmQgbWFrZSBpdCB1bmF2YWlsYWJsZSB0byBiZSBjYWxsZWQgdmlhIFJlc3RhdGUgaW5ncmVzcy4gSWYgdGhlcmUgYXJlXG4gICAqIG11bHRpcGxlIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IHRoZSBlbmRwb2ludCwgdGhleSB3aWxsIGFsbCBiZSBtYXJrZWQgYXMgc3BlY2lmaWVkLlxuICAgKi9cbiAgcHJpdmF0ZT86IFwidHJ1ZVwiIHwgXCJmYWxzZVwiO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHRydXN0IGFueSBjZXJ0aWZpY2F0ZSB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIGFkbWluIGVuZHBvaW50LiAqL1xuICBpbnNlY3VyZT86IFwidHJ1ZVwiIHwgXCJmYWxzZVwiO1xuXG4gIC8vIHJlbW92YWxQb2xpY3k/OiBzdHJpbmc7XG59XG5cbnR5cGUgUmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2UgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHNlcnZpY2VzOiB7IG5hbWU6IHN0cmluZzsgcmV2aXNpb246IG51bWJlcjsgcHVibGljOiBib29sZWFuIH1bXTtcbn07XG5cbmNvbnN0IE1BWF9IRUFMVEhfQ0hFQ0tfQVRURU1QVFMgPSA1OyAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgcXVpdGUgbG9uZyB0byBhbGxvdyBzb21lIHRpbWUgZm9yIGZpcnN0LXJ1biBFQzIgYW5kIERvY2tlciBib290IHVwXG5jb25zdCBNQVhfUkVHSVNUUkFUSU9OX0FUVEVNUFRTID0gMztcblxuY29uc3QgREVQTE9ZTUVOVFNfUEFUSCA9IFwiZGVwbG95bWVudHNcIjtcbmNvbnN0IFNFUlZJQ0VTX1BBVEggPSBcInNlcnZpY2VzXCI7XG5cbi8qKlxuICogQ3VzdG9tIFJlc291cmNlIGV2ZW50IGhhbmRsZXIgZm9yIFJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24uIFRoaXMgaGFuZGxlciBiYWNrcyB0aGUgY3VzdG9tIHJlc291cmNlcyBjcmVhdGVkIGJ5XG4gKiB7QGxpbmsgU2VydmljZURlcGxveWVyfSB0byBmYWNpbGl0YXRlIExhbWJkYSBzZXJ2aWNlIGhhbmRsZXIgZGlzY292ZXJ5LlxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlcjogSGFuZGxlcjxDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsIHZvaWQ+ID0gYXN5bmMgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnNvbGUubG9nKHsgZXZlbnQgfSk7XG5cbiAgY29uc3QgcHJvcHMgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMgYXMgUmVnaXN0cmF0aW9uUHJvcGVydGllcztcblxuICBjb25zdCBodHRwQWdlbnQgPSBuZXcgaHR0cC5BZ2VudCh7XG4gICAga2VlcEFsaXZlOiB0cnVlLFxuICB9KTtcbiAgY29uc3QgaHR0cHNBZ2VudCA9IG5ldyBodHRwcy5BZ2VudCh7XG4gICAga2VlcEFsaXZlOiB0cnVlLFxuICAgIHJlamVjdFVuYXV0aG9yaXplZDogcHJvcHMuaW5zZWN1cmUgIT09IFwidHJ1ZVwiLFxuICB9KTtcbiAgY29uc3QgYWdlbnRTZWxlY3RvciA9ICh1cmw6IFVSTCkgPT4ge1xuICAgIGlmICh1cmwucHJvdG9jb2wgPT0gXCJodHRwOlwiKSB7XG4gICAgICByZXR1cm4gaHR0cEFnZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaHR0cHNBZ2VudDtcbiAgICB9XG4gIH07XG5cbiAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlID09PSBcIkRlbGV0ZVwiKSB7XG4gICAgLy8gU2luY2Ugd2UgcmV0YWluIG9sZGVyIExhbWJkYSBoYW5kbGVyIHZlcnNpb25zIG9uIHVwZGF0ZSwgd2UgYWxzbyBsZWF2ZSB0aGUgcmVnaXN0ZXJlZCBzZXJ2aWNlIGFsb25lLiBUaGVyZSBtYXlcbiAgICAvLyBiZSB1bmZpbmlzaGVkIGludm9jYXRpb25zIHRoYXQgcmVxdWlyZSBpdDsgaW4gdGhlIGZ1dHVyZSB3ZSB3b3VsZCB3YW50IHRvIGluZm9ybSBSZXN0YXRlIHRoYXQgd2Ugd2FudCB0b1xuICAgIC8vIGRlLXJlZ2lzdGVyIHRoZSBzZXJ2aWNlLCBhbmQgd2FpdCBmb3IgUmVzdGF0ZSB0byBsZXQgdXMga25vdyB0aGF0IGl0IGlzIHNhZmUgdG8gZGVsZXRlIHRoZSBkZXBsb3llZCBGdW5jdGlvblxuICAgIC8vIHZlcnNpb24gZnJvbSBMYW1iZGEuXG5cbiAgICAvLyBjb25zdCBwcm9wcyA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcyBhcyBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzO1xuICAgIC8vIGlmIChwcm9wcy5yZW1vdmFsUG9saWN5ID09PSBjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZyhgRGUtcmVnaXN0ZXJpbmcgc2VydmljZSAke3Byb3BzLnNlcnZpY2VMYW1iZGFBcm59YCk7XG4gICAgLy8gICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIC8vICAgY29uc3QgaWQgPSBidG9hKHByb3BzLnNlcnZpY2VMYW1iZGFBcm4hKTsgLy8gVE9ETzogd2Ugc2hvdWxkIGJlIHRyZWF0aW5nIHNlcnZpY2UgaWRzIGFzIG9wYXF1ZVxuICAgIC8vICAgY29uc3QgZGVsZXRlQ2FsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoXCJ0aW1lb3V0XCIpLCA1XzAwMCk7XG4gICAgLy8gICBjb25zdCBkZWxldGVSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3Byb3BzLmFkbWluVXJsfS8ke0RFUExPWU1FTlRTX1BBVEh9LyR7aWR9P2ZvcmNlPXRydWVgLCB7XG4gICAgLy8gICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgLy8gICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAvLyAgICAgYWdlbnQ6IGFnZW50U2VsZWN0b3IsXG4gICAgLy8gICB9KS5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dChkZWxldGVDYWxsVGltZW91dCkpO1xuICAgIC8vXG4gICAgLy8gICBjb25zb2xlLmxvZyhgR290IGRlbGV0ZSByZXNwb25zZSBiYWNrOiAke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAvLyAgIGlmIChkZWxldGVSZXNwb25zZS5zdGF0dXMgIT0gMjAyKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgUmVtb3Zpbmcgc2VydmljZSBkZXBsb3ltZW50IGZhaWxlZDogJHtkZWxldGVSZXNwb25zZS5zdGF0dXNUZXh0fSAoJHtkZWxldGVSZXNwb25zZS5zdGF0dXN9KWApO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIGNvbnNvbGUud2FybihcIkRlLXJlZ2lzdGVyaW5nIHNlcnZpY2VzIGlzIG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5LiBQcmV2aW91cyB2ZXJzaW9uIHdpbGwgcmVtYWluIHJlZ2lzdGVyZWQuXCIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGF1dGhIZWFkZXIgPSBhd2FpdCBjcmVhdGVBdXRoSGVhZGVyKHByb3BzKTtcblxuICBsZXQgYXR0ZW1wdDtcblxuICBjb25zdCBoZWFsdGhDaGVja1VybCA9IGAke3Byb3BzLmFkbWluVXJsfS9oZWFsdGhgO1xuXG4gIGF0dGVtcHQgPSAxO1xuICBjb25zb2xlLmxvZyhgUGVyZm9ybWluZyBoZWFsdGggY2hlY2sgYWdhaW5zdDogJHtoZWFsdGhDaGVja1VybH1gKTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zb2xlLmxvZyhgTWFraW5nIGhlYWx0aCBjaGVjayByZXF1ZXN0ICMke2F0dGVtcHR9Li4uYCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBoZWFsdGhDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoXCJ0aW1lb3V0XCIpLCA1XzAwMCk7XG4gICAgbGV0IGhlYWx0aFJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGhlYWx0aFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goaGVhbHRoQ2hlY2tVcmwsIHtcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgaGVhZGVyczogYXV0aEhlYWRlcixcbiAgICAgICAgYWdlbnQ6IGFnZW50U2VsZWN0b3IsXG4gICAgICB9KS5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dChoZWFsdGhDaGVja1RpbWVvdXQpKTtcblxuICAgICAgY29uc29sZS5sb2coYEdvdCBoZWFsdGggY2hlY2sgcmVzcG9uc2UgYmFjazogJHtoZWFsdGhSZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICBpZiAoaGVhbHRoUmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiBoZWFsdGhSZXNwb25zZS5zdGF0dXMgPCAzMDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgUmVzdGF0ZSBoZWFsdGggY2hlY2sgZmFpbGVkOiAke2hlYWx0aFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2hlYWx0aFJlc3BvbnNlLnN0YXR1c307IGF0dGVtcHQgJHthdHRlbXB0fSlgLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSAoZSBhcyBFcnJvcik/Lm1lc3NhZ2U7XG4gICAgICBjb25zb2xlLmVycm9yKGBSZXN0YXRlIGhlYWx0aCBjaGVjayBmYWlsZWQ6IFwiJHtlcnJvck1lc3NhZ2V9XCIgKGF0dGVtcHQgJHthdHRlbXB0fSlgKTtcbiAgICB9XG5cbiAgICBpZiAoYXR0ZW1wdCA+PSBNQVhfSEVBTFRIX0NIRUNLX0FUVEVNUFRTKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBBZG1pbiBzZXJ2aWNlIGhlYWx0aCBjaGVjayBmYWlsaW5nIGFmdGVyICR7YXR0ZW1wdH0gYXR0ZW1wdHMuYCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlID8/IGAke2hlYWx0aFJlc3BvbnNlPy5zdGF0dXNUZXh0fSAoJHtoZWFsdGhSZXNwb25zZT8uc3RhdHVzfSlgKTtcbiAgICB9XG4gICAgYXR0ZW1wdCArPSAxO1xuXG4gICAgY29uc3Qgd2FpdFRpbWVNaWxsaXMgPSByYW5kb21JbnQoMl8wMDApICsgMiAqKiBhdHRlbXB0ICogMV8wMDA7IC8vIDNzIC0+IDZzIC0+IDEwcyAtPiAxOHMgLT4gMzRzXG4gICAgY29uc29sZS5sb2coYFJldHJ5aW5nIGFmdGVyICR7d2FpdFRpbWVNaWxsaXN9IG1zLi4uYCk7XG4gICAgYXdhaXQgc2xlZXAod2FpdFRpbWVNaWxsaXMpO1xuICB9XG5cbiAgY29uc3QgZGVwbG95bWVudHNVcmwgPSBgJHtwcm9wcy5hZG1pblVybH0vJHtERVBMT1lNRU5UU19QQVRIfWA7XG4gIGNvbnN0IHJlZ2lzdHJhdGlvblJlcXVlc3QgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgYXJuOiBwcm9wcy5zZXJ2aWNlTGFtYmRhQXJuLFxuICAgIGFzc3VtZV9yb2xlX2FybjogcHJvcHMuaW52b2tlUm9sZUFybixcbiAgfSk7XG5cbiAgbGV0IGZhaWx1cmVSZWFzb247XG4gIGF0dGVtcHQgPSAxO1xuICBjb25zb2xlLmxvZyhgUmVnaXN0ZXJpbmcgc2VydmljZXMgYXQgJHtkZXBsb3ltZW50c1VybH06ICR7cmVnaXN0cmF0aW9uUmVxdWVzdH1gKTtcblxuICByZWdpc3RyYXRpb25fcmV0cnlfbG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5sb2coYE1ha2luZyByZWdpc3RyYXRpb24gcmVxdWVzdCAjJHthdHRlbXB0fS4uLmApO1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyQ2FsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoXCJ0aW1lb3V0XCIpLCAxMF8wMDApO1xuICAgICAgY29uc3QgcmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2UgPSBhd2FpdCBmZXRjaChkZXBsb3ltZW50c1VybCwge1xuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBib2R5OiByZWdpc3RyYXRpb25SZXF1ZXN0LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgLi4uYXV0aEhlYWRlcixcbiAgICAgICAgfSxcbiAgICAgICAgYWdlbnQ6IGFnZW50U2VsZWN0b3IsXG4gICAgICB9KS5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dChyZWdpc3RlckNhbGxUaW1lb3V0KSk7XG5cbiAgICAgIGlmIChyZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCByZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5qc29uKCkpIGFzIFJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlO1xuXG4gICAgICAgIGlmIChwcm9wcy5zZXJ2aWNlUGF0aCAmJiAhcmVzcG9uc2Uuc2VydmljZXMuZmluZCgocykgPT4gcy5uYW1lID09PSBwcm9wcy5zZXJ2aWNlUGF0aCkpIHtcbiAgICAgICAgICBmYWlsdXJlUmVhc29uID1cbiAgICAgICAgICAgIFwiUmVnaXN0cmF0aW9uIHN1Y2NlZWRlZCwgYnV0IG5vbmUgb2YgdGhlIHNlcnZpY2UgbmFtZXMgaW4gdGhlIGRlcGxveW1lbnQgbWF0Y2ggdGhlIHNwZWNpZmllZCBuYW1lLiBcIiArXG4gICAgICAgICAgICBgRXhwZWN0ZWQgXCIke3Byb3BzLnNlcnZpY2VQYXRofVwiLCBnb3QgYmFjazogW2AgK1xuICAgICAgICAgICAgcmVzcG9uc2Uuc2VydmljZXMubWFwKChzdmMpID0+IHN2Yz8ubmFtZSkuam9pbihcIiwgXCIpICtcbiAgICAgICAgICAgIFwiXVwiO1xuXG4gICAgICAgICAgYXR0ZW1wdCA9IE1BWF9SRUdJU1RSQVRJT05fQVRURU1QVFM7IC8vIGRvbid0IHJldHJ5IHRoaXNcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKFwiU3VjY2Vzc2Z1bCByZWdpc3RyYXRpb24hIFNlcnZpY2VzOiBcIiwgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2Uuc2VydmljZXMpKTtcblxuICAgICAgICBjb25zdCBpc1B1YmxpYyA9IChwcm9wcy5wcml2YXRlID8/IFwiZmFsc2VcIikgPT09IFwiZmFsc2VcIjtcblxuICAgICAgICBmb3IgKGNvbnN0IHNlcnZpY2Ugb2YgcmVzcG9uc2Uuc2VydmljZXMgPz8gW10pIHtcbiAgICAgICAgICBpZiAoc2VydmljZS5wdWJsaWMgPT09IGlzUHVibGljKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU2VydmljZSAke3NlcnZpY2UubmFtZX0gaXMgJHtpc1B1YmxpYyA/IFwicHVibGljXCIgOiBcInByaXZhdGVcIn0uYCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhgTWFya2luZyBzZXJ2aWNlICR7c2VydmljZS5uYW1lfSBhcyAke2lzUHVibGljID8gXCJwdWJsaWNcIiA6IFwicHJpdmF0ZVwifS4uLmApO1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgY29uc3QgcHJpdmF0ZUNhbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KFwidGltZW91dFwiKSwgMTBfMDAwKTtcbiAgICAgICAgICBjb25zdCBwYXRjaFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMuYWRtaW5Vcmx9LyR7U0VSVklDRVNfUEFUSH0vJHtzZXJ2aWNlLm5hbWV9YCwge1xuICAgICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgIG1ldGhvZDogXCJQQVRDSFwiLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgLi4uYXV0aEhlYWRlcixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHB1YmxpYzogaXNQdWJsaWMgfSksXG4gICAgICAgICAgICBhZ2VudDogYWdlbnRTZWxlY3RvcixcbiAgICAgICAgICB9KS5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dChwcml2YXRlQ2FsbFRpbWVvdXQpKTtcblxuICAgICAgICAgIGNvbnNvbGUubG9nKGBHb3QgcGF0Y2ggcmVzcG9uc2UgYmFjazogJHtwYXRjaFJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICBpZiAocGF0Y2hSZXNwb25zZS5zdGF0dXMgIT0gMjAwKSB7XG4gICAgICAgICAgICBmYWlsdXJlUmVhc29uID0gYE1hcmtpbmcgc2VydmljZSBhcyAke3Byb3BzLnByaXZhdGUgPyBcInByaXZhdGVcIiA6IFwicHVibGljXCJ9IGZhaWxlZDogJHtwYXRjaFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke3BhdGNoUmVzcG9uc2Uuc3RhdHVzfSlgO1xuICAgICAgICAgICAgYnJlYWsgcmVnaXN0cmF0aW9uX3JldHJ5X2xvb3A7IC8vIGRvbid0IHRocm93IGltbWVkaWF0ZWx5IC0gbGV0IHJldHJ5IGxvb3AgZGVjaWRlIHdoZXRoZXIgdG8gYWJvcnQgc1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKGBTdWNjZXNzZnVsbHkgbWFya2VkIHNlcnZpY2UgYXMgJHtpc1B1YmxpYyA/IFwicHVibGljXCIgOiBcInByaXZhdGVcIn0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47IC8vIE92ZXJhbGwgc3VjY2VzcyFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yQm9keSA9IGF3YWl0IHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgZmFpbHVyZVJlYXNvbiA9IGBSZWdpc3RyYXRpb24gZmFpbGVkICgke3JlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLnN0YXR1c30pOiAke2Vycm9yQm9keX1gO1xuICAgICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgICAgbWVzc2FnZTogYEdvdCBlcnJvciByZXNwb25zZSBmcm9tIFJlc3RhdGUuYCxcbiAgICAgICAgICBjb2RlOiByZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgYm9keTogZXJyb3JCb2R5LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBSZWdpc3RyYXRpb24gZmFpbGVkOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZX0gKGF0dGVtcHQgJHthdHRlbXB0fSlgKTtcbiAgICAgIGZhaWx1cmVSZWFzb24gPSAoZSBhcyBFcnJvcik/Lm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgaWYgKGF0dGVtcHQgPj0gTUFYX1JFR0lTVFJBVElPTl9BVFRFTVBUUykge1xuICAgICAgZmFpbHVyZVJlYXNvbiA9IGBHaXZpbmcgdXAgYWZ0ZXIgJHthdHRlbXB0fSBhdHRlbXB0cy4gTGFzdCBlcnJvcjogJHtmYWlsdXJlUmVhc29ufWA7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgYXR0ZW1wdCArPSAxO1xuICAgIGNvbnN0IHdhaXRUaW1lTWlsbGlzID0gcmFuZG9tSW50KDJfMDAwKSArIDIgKiogYXR0ZW1wdCAqIDFfMDAwOyAvLyAzcyAtPiA2cyAtPiAxMHNcbiAgICBjb25zb2xlLmxvZyhgUmV0cnlpbmcgcmVnaXN0cmF0aW9uIGFmdGVyICR7d2FpdFRpbWVNaWxsaXN9IG1zLi4uYCk7XG4gICAgYXdhaXQgc2xlZXAod2FpdFRpbWVNaWxsaXMpO1xuICB9XG5cbiAgY29uc29sZS5lcnJvcihmYWlsdXJlUmVhc29uKTtcbiAgdGhyb3cgbmV3IEVycm9yKGZhaWx1cmVSZWFzb24gPz8gXCJSZXN0YXRlIHNlcnZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZC4gUGxlYXNlIHNlZSBsb2dzIGZvciBkZXRhaWxzLlwiKTtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUF1dGhIZWFkZXIocHJvcHM6IFJlZ2lzdHJhdGlvblByb3BlcnRpZXMpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgaWYgKCFwcm9wcy5hdXRoVG9rZW5TZWNyZXRBcm4pIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zb2xlLmxvZyhgVXNpbmcgYmVhcmVyIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZyb20gc2VjcmV0ICR7cHJvcHMuYXV0aFRva2VuU2VjcmV0QXJufWApO1xuICBjb25zdCBzc20gPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzc20uc2VuZChcbiAgICBuZXcgR2V0U2VjcmV0VmFsdWVDb21tYW5kKHtcbiAgICAgIFNlY3JldElkOiBwcm9wcy5hdXRoVG9rZW5TZWNyZXRBcm4sXG4gICAgfSksXG4gICk7XG5cbiAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgc2VjcmV0IFwiJHtyZXNwb25zZS5OYW1lfVwiIHZlcnNpb24gJHtyZXNwb25zZS5WZXJzaW9uSWR9YCk7XG4gIHJldHVybiB7XG4gICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Jlc3BvbnNlLlNlY3JldFN0cmluZ31gLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXM6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzKSk7XG59XG4iXX0=