aws-cdk 2.36.0 → 2.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +13 -1
  2. package/THIRD_PARTY_LICENSES +81 -1
  3. package/build-info.json +2 -2
  4. package/lib/api/aws-auth/aws-sdk-inifile.js +2 -3
  5. package/lib/api/aws-auth/awscli-compatible.js +5 -7
  6. package/lib/api/aws-auth/sdk-provider.js +7 -11
  7. package/lib/api/aws-auth/sdk.js +2 -3
  8. package/lib/api/bootstrap/bootstrap-environment.js +14 -15
  9. package/lib/api/bootstrap/deploy-bootstrap.js +5 -7
  10. package/lib/api/cloudformation-deployments.js +9 -12
  11. package/lib/api/cxapp/cloud-assembly.js +3 -4
  12. package/lib/api/cxapp/cloud-executable.js +2 -3
  13. package/lib/api/cxapp/exec.js +8 -10
  14. package/lib/api/deploy-stack.js +11 -13
  15. package/lib/api/evaluate-cloudformation-template.js +6 -11
  16. package/lib/api/hotswap/appsync-mapping-templates.js +4 -5
  17. package/lib/api/hotswap/code-build-projects.js +2 -3
  18. package/lib/api/hotswap/ecs-services.js +4 -5
  19. package/lib/api/hotswap/lambda-functions.js +45 -24
  20. package/lib/api/hotswap/s3-bucket-deployments.js +3 -5
  21. package/lib/api/hotswap/stepfunctions-state-machines.js +2 -3
  22. package/lib/api/hotswap-deployments.js +9 -7
  23. package/lib/api/logs/logs-monitor.js +5 -8
  24. package/lib/api/nested-stack-helpers.js +9 -11
  25. package/lib/api/toolkit-info.js +12 -17
  26. package/lib/api/util/cloudformation/stack-activity-monitor.js +17 -27
  27. package/lib/api/util/cloudformation.js +7 -11
  28. package/lib/api/util/placeholders.js +2 -3
  29. package/lib/assets.js +3 -4
  30. package/lib/cdk-toolkit.d.ts +14 -0
  31. package/lib/cdk-toolkit.js +36 -19
  32. package/lib/cli.js +14 -14
  33. package/lib/context-providers/load-balancers.js +11 -18
  34. package/lib/context-providers/security-groups.js +5 -7
  35. package/lib/deploy.d.ts +7 -0
  36. package/lib/deploy.js +43 -0
  37. package/lib/import.js +8 -13
  38. package/lib/index.js +3266 -1537
  39. package/lib/init-templates/app/typescript/lib/%name%-stack.template.ts +3 -3
  40. package/lib/init-templates/lib/typescript/lib/index.template.ts +1 -0
  41. package/lib/notices.js +11 -17
  42. package/lib/settings.js +4 -5
  43. package/lib/util/asset-publishing.js +5 -8
  44. package/lib/util/directories.js +2 -3
  45. package/lib/version.js +2 -2
  46. package/package.json +10 -9
  47. package/test/api/bootstrap2.test.js +2 -3
  48. package/test/api/cloud-executable.test.js +2 -3
  49. package/test/api/deploy-stack.test.js +4 -7
  50. package/test/api/fake-sts.js +6 -8
  51. package/test/api/hotswap/hotswap-deployments.test.js +59 -4
  52. package/test/api/hotswap/lambda-functions-docker-hotswap-deployments.test.js +3 -3
  53. package/test/api/hotswap/lambda-functions-hotswap-deployments.test.js +179 -7
  54. package/test/api/sdk-provider.test.js +8 -11
  55. package/test/aws-sdk-non-public-apis.test.js +2 -3
  56. package/test/cdk-toolkit.test.js +10 -1
  57. package/test/context-providers/load-balancers.test.js +3 -5
  58. package/test/deploy.test.d.ts +1 -0
  59. package/test/deploy.test.js +175 -0
  60. package/test/import.test.js +2 -2
  61. package/test/init.test.js +2 -3
  62. package/test/integ/cli/app/app.js +19 -0
  63. package/test/integ/cli/bootstrapping.integtest.js +9 -20
  64. package/test/integ/cli/cli.integtest.js +62 -31
  65. package/test/integ/github-helpers.js +2 -3
  66. package/test/integ/helpers/aws.js +4 -7
  67. package/test/integ/helpers/cdk.js +21 -30
  68. package/test/integ/helpers/sam.js +10 -17
  69. package/test/util/mock-child_process.js +3 -4
  70. package/test/util/mock-sdk.js +4 -6
  71. package/test/util/mock-toolkitinfo.js +4 -5
  72. package/test/util.js +3 -5
package/README.md CHANGED
@@ -191,6 +191,8 @@ In order to deploy them, you can list the stacks you want to deploy. If your app
191
191
 
192
192
  If you want to deploy all of them, you can use the flag `--all` or the wildcard `*` to deploy all stacks in an app. Please note that, if you have a hierarchy of stacks as described above, `--all` and `*` will only match the stacks on the top level. If you want to match all the stacks in the hierarchy, use `**`. You can also combine these patterns. For example, if you want to deploy all stacks in the `Prod` stage, you can use `cdk deploy PipelineStack/Prod/**`.
193
193
 
194
+ `--concurrency N` allows deploying multiple stacks in parallel while respecting inter-stack dependencies to speed up deployments. It does not protect against CloudFormation and other AWS account rate limiting.
195
+
194
196
  #### Parameters
195
197
 
196
198
  Pass parameters to your template during deployment by using `--parameters
@@ -373,7 +375,8 @@ and that you have the necessary IAM permissions to update the resources that are
373
375
  Hotswapping is currently supported for the following changes
374
376
  (additional changes will be supported in the future):
375
377
 
376
- - Code asset (including Docker image and inline code) and tag changes of AWS Lambda functions.
378
+ - Code asset (including Docker image and inline code), tag changes, and configuration changes (only
379
+ description and environment variables are supported) of AWS Lambda functions.
377
380
  - AWS Lambda Versions and Aliases changes.
378
381
  - Definition changes of AWS Step Functions State Machines.
379
382
  - Container asset changes of AWS ECS Services.
@@ -455,6 +458,15 @@ locally to your terminal. To disable this feature you can pass the `--no-logs` o
455
458
  $ cdk watch --no-logs
456
459
  ```
457
460
 
461
+ You can increase the concurrency by which `watch` will deploy and hotswap
462
+ your stacks by specifying `--concurrency N`. `--concurrency` for `watch`
463
+ acts the same as `--concurrency` for `deploy`, in that it will deploy or
464
+ hotswap your stacks while respecting inter-stack dependencies.
465
+
466
+ ```console
467
+ $ cdk watch --concurrency 5
468
+ ```
469
+
458
470
  **Note**: This command is considered experimental, and might have breaking changes in the future.
459
471
  The same limitations apply to to `watch` deployments as do to `--hotswap` deployments. See the
460
472
  *Hotswap deployments for faster development* section for more information.
@@ -268,7 +268,7 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH RE
268
268
 
269
269
  ----------------
270
270
 
271
- ** aws-sdk@2.1185.0 - https://www.npmjs.com/package/aws-sdk/v/2.1185.0 | Apache-2.0
271
+ ** aws-sdk@2.1191.0 - https://www.npmjs.com/package/aws-sdk/v/2.1191.0 | Apache-2.0
272
272
  AWS SDK for JavaScript
273
273
  Copyright 2012-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
274
274
 
@@ -1143,6 +1143,32 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1143
1143
  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1144
1144
 
1145
1145
 
1146
+ ----------------
1147
+
1148
+ ** eventemitter3@4.0.7 - https://www.npmjs.com/package/eventemitter3/v/4.0.7 | MIT
1149
+ The MIT License (MIT)
1150
+
1151
+ Copyright (c) 2014 Arnout Kazemier
1152
+
1153
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1154
+ of this software and associated documentation files (the "Software"), to deal
1155
+ in the Software without restriction, including without limitation the rights
1156
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1157
+ copies of the Software, and to permit persons to whom the Software is
1158
+ furnished to do so, subject to the following conditions:
1159
+
1160
+ The above copyright notice and this permission notice shall be included in all
1161
+ copies or substantial portions of the Software.
1162
+
1163
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1164
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1165
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1166
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1167
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1168
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1169
+ SOFTWARE.
1170
+
1171
+
1146
1172
  ----------------
1147
1173
 
1148
1174
  ** fast-deep-equal@3.1.3 - https://www.npmjs.com/package/fast-deep-equal/v/3.1.3 | MIT
@@ -2274,6 +2300,60 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
2274
2300
  IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
2275
2301
 
2276
2302
 
2303
+ ----------------
2304
+
2305
+ ** p-finally@1.0.0 - https://www.npmjs.com/package/p-finally/v/1.0.0 | MIT
2306
+ The MIT License (MIT)
2307
+
2308
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
2309
+
2310
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2311
+ of this software and associated documentation files (the "Software"), to deal
2312
+ in the Software without restriction, including without limitation the rights
2313
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2314
+ copies of the Software, and to permit persons to whom the Software is
2315
+ furnished to do so, subject to the following conditions:
2316
+
2317
+ The above copyright notice and this permission notice shall be included in
2318
+ all copies or substantial portions of the Software.
2319
+
2320
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2321
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2322
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2323
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2324
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2325
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2326
+ THE SOFTWARE.
2327
+
2328
+
2329
+ ----------------
2330
+
2331
+ ** p-queue@6.6.2 - https://www.npmjs.com/package/p-queue/v/6.6.2 | MIT
2332
+ MIT License
2333
+
2334
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
2335
+
2336
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
2337
+
2338
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
2339
+
2340
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2341
+
2342
+
2343
+ ----------------
2344
+
2345
+ ** p-timeout@3.2.0 - https://www.npmjs.com/package/p-timeout/v/3.2.0 | MIT
2346
+ MIT License
2347
+
2348
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
2349
+
2350
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
2351
+
2352
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
2353
+
2354
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2355
+
2356
+
2277
2357
  ----------------
2278
2358
 
2279
2359
  ** pac-proxy-agent@5.0.0 - https://www.npmjs.com/package/pac-proxy-agent/v/5.0.0 | MIT
package/build-info.json CHANGED
@@ -1,4 +1,4 @@
1
1
  {
2
- "comment": "Generated at 2022-08-08T20:09:08Z by generate.sh",
3
- "commit": "7cde279"
2
+ "comment": "Generated at 2022-08-17T10:07:45Z by generate.sh",
3
+ "commit": "317fe7a"
4
4
  }
@@ -31,7 +31,6 @@ class PatchedSharedIniFileCredentials extends AWS.SharedIniFileCredentials {
31
31
  loadRoleProfile(creds, roleProfile, callback) {
32
32
  // Need to duplicate the whole implementation here -- the function is long and has been written in
33
33
  // such a way that there are no small monkey patches possible.
34
- var _a, _b, _c, _d;
35
34
  if (this.disableAssumeRole) {
36
35
  throw AWS.util.error(new Error('Role assumption profiles are disabled. ' +
37
36
  'Failed to load profile ' + this.profile +
@@ -52,7 +51,7 @@ class PatchedSharedIniFileCredentials extends AWS.SharedIniFileCredentials {
52
51
  throw credentialError;
53
52
  }
54
53
  const profiles = loadProfilesProper(this.filename);
55
- const region = (_d = (_b = (_a = profiles[this.profile]) === null || _a === void 0 ? void 0 : _a.region) !== null && _b !== void 0 ? _b : (_c = profiles.default) === null || _c === void 0 ? void 0 : _c.region) !== null && _d !== void 0 ? _d : 'us-east-1';
54
+ const region = profiles[this.profile]?.region ?? profiles.default?.region ?? 'us-east-1';
56
55
  const stsCreds = sourceProfile ? this.sourceProfileCredentials(sourceProfile, creds) : this.credentialSourceCredentials(credentialSource);
57
56
  this.roleArn = roleArn;
58
57
  var sts = new AWS.STS({
@@ -154,4 +153,4 @@ function loadProfilesProper(filename) {
154
153
  }
155
154
  return profiles;
156
155
  }
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLXNkay1pbmlmaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLXNkay1pbmlmaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUcvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBYSwrQkFBZ0MsU0FBUSxHQUFHLENBQUMsd0JBQXdCO0lBU3hFLGVBQWUsQ0FDcEIsS0FBNkMsRUFDN0MsV0FBbUMsRUFDbkMsUUFBMkM7UUFFM0Msa0dBQWtHO1FBQ2xHLDhEQUE4RDs7UUFFOUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsTUFBTyxHQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FDM0IsSUFBSSxLQUFLLENBQUMseUNBQXlDO2dCQUN6Qyx5QkFBeUIsR0FBRyxJQUFJLENBQUMsT0FBTztnQkFDeEMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFDcEMsRUFBRSxJQUFJLEVBQUUseUNBQXlDLEVBQUUsQ0FDcEQsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFDbkMsSUFBSSxlQUFlLEdBQUcsV0FBVyxDQUFDLGlCQUFpQixDQUFDO1FBQ3BELElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDekMsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUN2QyxJQUFJLGFBQWEsR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDO1FBQy9DLElBQUksZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGlCQUFpQixDQUFDO1FBRXJELE1BQU0sZUFBZSxHQUFJLEdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUM3QyxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsSUFBSSxDQUFDLE9BQU8sb0ZBQW9GLENBQUMsRUFDakosRUFBRSxJQUFJLEVBQUUseUNB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cEMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUN0QyxRQUFRLEVBQUUsSUFBSTtZQUNkLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztTQUNoRCxDQUFDLENBQUM7S0FDSjtJQUNELElBQUksaUJBQWlCLEdBQTJDLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDakYsUUFBUSxFQUFFLFFBQVE7WUFDaEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0tBQ25GLENBQUMsQ0FBQztJQUNILEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7UUFDaEUsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQztLQUMxQjtJQUNELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7UUFDL0QsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQ2YsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2pCLEdBQUcsT0FBTztTQUNYLENBQUM7S0FDSDtJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBBV1MgZnJvbSAnYXdzLXNkayc7XG5cblxuLyoqXG4gKiBIYWNrLWZpeFxuICpcbiAqIFRoZXJlIGFyZSBhIG51bWJlciBvZiBpc3N1ZXMgaW4gdGhlIHVwc3RyZWFtIHZlcnNpb24gb2YgU2hhcmVkSW5pRmlsZUNyZWRlbnRpYWxzXG4gKiB0aGF0IG5lZWQgZml4aW5nOlxuICpcbiAqICAxLiBUaGUgdXBzdHJlYW0gYXdzLXNkayBjb250YWlucyBhbiBpbmNvcnJlY3QgaW5zdGFudGlhdGlvbiBvZiBhbiBgQVdTLlNUU2BcbiAqICAgICBjbGllbnQsIHdoaWNoICpzaG91bGQqIGhhdmUgdGFrZW4gdGhlIHJlZ2lvbiBmcm9tIHRoZSByZXF1ZXN0ZWQgcHJvZmlsZVxuICogICAgIGJ1dCBkb2Vzbid0LiBJdCB3aWxsIHVzZSB0aGUgcmVnaW9uIGZyb20gdGhlIGRlZmF1bHQgcHJvZmlsZSwgd2hpY2hcbiAqICAgICBtYXkgbm90IGV4aXN0LCBkZWZhdWx0aW5nIHRvIGB1cy1lYXN0LTFgIChzaW5jZSB3ZSBzd2l0Y2hlZCB0b1xuICogICAgIEFXU19TVFNfUkVHSU9OQUxfRU5EUE9JTlRTPXJlZ2lvbmFsLCB0aGF0IGRlZmF1bHQgaXMgbm90IGV2ZW4gYWxsb3dlZCBhbnltb3JlXG4gKiAgICAgYW5kIHRoZSBhYnNlbmNlIG9mIGEgZGVmYXVsdCByZWdpb24gd2lsbCBsZWFkIHRvIGFuIGVycm9yKS5cbiAqXG4gKiAgMi4gVGhlIHNpbXBsZSBmaXggaXMgdG8gZ2V0IHRoZSByZWdpb24gZnJvbSB0aGUgYGNvbmZpZ2AgZmlsZS4gcHJvZmlsZXNcbiAqICAgICBhcmUgbWFkZSB1cCBvZiBhIGNvbWJpbmF0aW9uIG9mIGBjcmVkZW50aWFsc2AgYW5kIGBjb25maWdgLCBhbmQgdGhlIHJlZ2lvbiBpc1xuICogICAgIGdlbmVyYWxseSBpbiBgY29uZmlnYCB3aXRoIHRoZSByZXN0IGluIGBjcmVkZW50aWFsc2AuIEhvd2V2ZXIsIGEgYnVnIGluXG4gKiAgICAgYGdldFByb2ZpbGVzRnJvbVNoYXJlZENvbmZpZ2Agb3ZlcndyaXRlcyBBTEwgYGNvbmZpZ2AgZGF0YSB3aXRoIGBjcmVkZW50aWFsc2BcbiAqICAgICBkYXRhLCBzbyB3ZSBhbHNvIG5lZWQgdG8gZG8gZXh0cmEgd29yayB0byBmaXNoIHRoZSBgcmVnaW9uYCBvdXQgb2YgdGhlIGNvbmZpZy5cbiAqXG4gKiAzLiAgVGhlICdjcmVkZW50aWFsX3NvdXJjZScgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIE1lYW5pbmcgY3JlZGVudGlhbHNcbiAqICAgICBmb3IgYXNzdW1lLXJvbGUgY2Fubm90IGJlIGZldGNoZWQgdXNpbmcgRUMyL0VTQyBtZXRhZGF0YS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzL2lzc3Vlcy8zNDE4IGZvciBhbGwgdGhlIGdvcnkgZGV0YWlscy5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1zZGstanMvaXNzdWVzLzE5MTYgZm9yIHNvbWUgbW9yZSBnbG9yeSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgUGF0Y2hlZFNoYXJlZEluaUZpbGVDcmVkZW50aWFscyBleHRlbmRzIEFXUy5TaGFyZWRJbmlGaWxlQ3JlZGVudGlhbHMge1xuICBkZWNsYXJlIHByaXZhdGUgcHJvZmlsZTogc3RyaW5nO1xuICBkZWNsYXJlIHByaXZhdGUgZmlsZW5hbWU6IHN0cmluZztcbiAgZGVjbGFyZSBwcml2YXRlIGRpc2FibGVBc3N1bWVSb2xlOiBib29sZWFuO1xuICBkZWNsYXJlIHByaXZhdGUgb3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZGVjbGFyZSBwcml2YXRlIHJvbGVBcm46IHN0cmluZztcbiAgZGVjbGFyZSBwcml2YXRlIGh0dHBPcHRpb25zPzogQVdTLkhUVFBPcHRpb25zO1xuICBkZWNsYXJlIHByaXZhdGUgdG9rZW5Db2RlRm4/OiAobWZhU2VyaWFsOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyPzogRXJyb3IsIHRva2VuPzogc3RyaW5nKSA9PiB2b2lkKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBsb2FkUm9sZVByb2ZpbGUoXG4gICAgY3JlZHM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICAgIHJvbGVQcm9maWxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGNhbGxiYWNrOiAoZXJyPzogRXJyb3IsIGRhdGE/OiBhbnkpID0+IHZvaWQpIHtcblxuICAgIC8vIE5lZWQgdG8gZHVwbGljYXRlIHRoZSB3aG9sZSBpbXBsZW1lbnRhdGlvbiBoZXJlIC0tIHRoZSBmdW5jdGlvbiBpcyBsb25nIGFuZCBoYXMgYmVlbiB3cml0dGVuIGluXG4gICAgLy8gc3VjaCBhIHdheSB0aGF0IHRoZXJlIGFyZSBubyBzbWFsbCBtb25rZXkgcGF0Y2hlcyBwb3NzaWJsZS5cblxuICAgIGlmICh0aGlzLmRpc2FibGVBc3N1bWVSb2xlKSB7XG4gICAgICB0aHJvdyAoQVdTIGFzIGFueSkudXRpbC5lcnJvcihcbiAgICAgICAgbmV3IEVycm9yKCdSb2xlIGFzc3VtcHRpb24gcHJvZmlsZXMgYXJlIGRpc2FibGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gbG9hZCBwcm9maWxlICcgKyB0aGlzLnByb2ZpbGUgK1xuICAgICAgICAgICAgICAgICAgJyBmcm9tICcgKyBjcmVkcy5maWxlbmFtZSksXG4gICAgICAgIHsgY29kZTogJ1NoYXJlZEluaUZpbGVDcmVkZW50aWFsc1Byb3ZpZGVyRmFpbHVyZScgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciByb2xlQXJuID0gcm9sZVByb2ZpbGUucm9sZV9hcm47XG4gICAgdmFyIHJvbGVTZXNzaW9uTmFtZSA9IHJvbGVQcm9maWxlLnJvbGVfc2Vzc2lvbl9uYW1lO1xuICAgIHZhciBleHRlcm5hbElkID0gcm9sZVByb2ZpbGUuZXh0ZXJuYWxfaWQ7XG4gICAgdmFyIG1mYVNlcmlhbCA9IHJvbGVQcm9maWxlLm1mYV9zZXJpYWw7XG4gICAgdmFyIHNvdXJjZVByb2ZpbGUgPSByb2xlUHJvZmlsZS5zb3VyY2VfcHJvZmlsZTtcbiAgICB2YXIgY3JlZGVudGlhbFNvdXJjZSA9IHJvbGVQcm9maWxlLmNyZWRlbnRpYWxfc291cmNlO1xuXG4gICAgY29uc3QgY3JlZGVudGlhbEVycm9yID0gKEFXUyBhcyBhbnkpLnV0aWwuZXJyb3IoXG4gICAgICBuZXcgRXJyb3IoYFdoZW4gdXNpbmcgJ3JvbGVfYXJuJyBpbiBwcm9maWxlICgnJHt0aGlzLnByb2ZpbGV9JyksIHlvdSBtdXN0IGFsc28gY29uZmlndXJlIGV4YWN0bHkgb25lIG9mICdzb3VyY2VfcHJvZmlsZScgb3IgJ2NyZWRlbnRpYWxfc291cmNlJ2ApLFxuICAgICAgeyBjb2RlOiAnU2hhcmVkSW5pRmlsZUNyZWRlbnRpYWxzUHJvdmlkZXJGYWlsdXJlJyB9LFxuICAgICk7XG5cbiAgICBpZiAoc291cmNlUHJvZmlsZSAmJiBjcmVkZW50aWFsU291cmNlKSB7XG4gICAgICB0aHJvdyBjcmVkZW50aWFsRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFzb3VyY2VQcm9maWxlICYmICFjcmVkZW50aWFsU291cmNlKSB7XG4gICAgICB0aHJvdyBjcmVkZW50aWFsRXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZmlsZXMgPSBsb2FkUHJvZmlsZXNQcm9wZXIodGhpcy5maWxlbmFtZSk7XG4gICAgY29uc3QgcmVnaW9uID0gcHJvZmlsZXNbdGhpcy5wcm9maWxlXT8ucmVnaW9uID8/IHByb2ZpbGVzLmRlZmF1bHQ/LnJlZ2lvbiA/PyAndXMtZWFzdC0xJztcblxuICAgIGNvbnN0IHN0c0NyZWRzID0gc291cmNlUHJvZmlsZSA/IHRoaXMuc291cmNlUHJvZmlsZUNyZWRlbnRpYWxzKHNvdXJjZVByb2ZpbGUsIGNyZWRzKSA6IHRoaXMuY3JlZGVudGlhbFNvdXJjZUNyZWRlbnRpYWxzKGNyZWRlbnRpYWxTb3VyY2UpO1xuXG4gICAgdGhpcy5yb2xlQXJuID0gcm9sZUFybjtcbiAgICB2YXIgc3RzID0gbmV3IEFXUy5TVFMoe1xuICAgICAgY3JlZGVudGlhbHM6IHN0c0NyZWRzLFxuICAgICAgcmVnaW9uLFxuICAgICAgaHR0cE9wdGlvbnM6IHRoaXMuaHR0cE9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB2YXIgcm9sZVBhcmFtczogQVdTLlNUUy5Bc3N1bWVSb2xlUmVxdWVzdCA9IHtcbiAgICAgIFJvbGVBcm46IHJvbGVBcm4sXG4gICAgICBSb2xlU2Vzc2lvbk5hbWU6IHJvbGVTZXNzaW9uTmFtZSB8fCAnYXdzLXNkay1qcy0nICsgRGF0ZS5ub3coKSxcbiAgICB9O1xuXG4gICAgaWYgKGV4dGVybmFsSWQpIHtcbiAgICAgIHJvbGVQYXJhbXMuRXh0ZXJuYWxJZCA9IGV4dGVybmFsSWQ7XG4gICAgfVxuXG4gICAgaWYgKG1mYVNlcmlhbCAmJiBzZWxmLnRva2VuQ29kZUZuKSB7XG4gICAgICByb2xlUGFyYW1zLlNlcmlhbE51bWJlciA9IG1mYVNlcmlhbDtcbiAgICAgIHNlbGYudG9rZW5Db2RlRm4obWZhU2VyaWFsLCBmdW5jdGlvbihlcnIsIHRva2VuKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB2YXIgbWVzc2FnZTtcbiAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZSA9IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2soXG4gICAgICAgICAgICAoQVdTIGFzIGFueSkudXRpbC5lcnJvcihcbiAgICAgICAgICAgICAgbmV3IEVycm9yKCdFcnJvciBmZXRjaGluZyBNRkEgdG9rZW46ICcgKyBtZXNzYWdlKSxcbiAgICAgICAgICAgICAgeyBjb2RlOiAnU2hhcmVkSW5pRmlsZUNyZWRlbnRpYWxzUHJvdmlkZXJGYWlsdXJlJyB9LFxuICAgICAgICAgICAgKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcm9sZVBhcmFtcy5Ub2tlbkNvZGUgPSB0b2tlbjtcbiAgICAgICAgc3RzLmFzc3VtZVJvbGUocm9sZVBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0cy5hc3N1bWVSb2xlKHJvbGVQYXJhbXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHByaXZhdGUgc291cmNlUHJvZmlsZUNyZWRlbnRpYWxzKHNvdXJjZVByb2ZpbGU6IHN0cmluZywgcHJvZmlsZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KSB7XG5cbiAgICB2YXIgc291cmNlUHJvZmlsZUV4aXN0YW5jZVRlc3QgPSBwcm9maWxlc1tzb3VyY2VQcm9maWxlXTtcblxuICAgIGlmICh0eXBlb2Ygc291cmNlUHJvZmlsZUV4aXN0YW5jZVRlc3QgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyAoQVdTIGFzIGFueSkudXRpbC5lcnJvcihcbiAgICAgICAgbmV3IEVycm9yKCdzb3VyY2VfcHJvZmlsZSAnICsgc291cmNlUHJvZmlsZSArICcgdXNpbmcgcHJvZmlsZSAnXG4gICAgICAgICAgKyB0aGlzLnByb2ZpbGUgKyAnIGRvZXMgbm90IGV4aXN0JyksXG4gICAgICAgIHsgY29kZTogJ1NoYXJlZEluaUZpbGVDcmVkZW50aWFsc1Byb3ZpZGVyRmFpbHVyZScgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZVByb2ZpbGVFeGlzdGFuY2VUZXN0LnNzb19zdGFydF91cmwpIHtcbiAgICAgIHJldHVybiBuZXcgQVdTLlNzb0NyZWRlbnRpYWxzKHsgcHJvZmlsZTogc291cmNlUHJvZmlsZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFXUy5TaGFyZWRJbmlGaWxlQ3JlZGVudGlhbHMoXG4gICAgICAoQVdTIGFzIGFueSkudXRpbC5tZXJnZSh0aGlzLm9wdGlvbnMgfHwge30sIHtcbiAgICAgICAgcHJvZmlsZTogc291cmNlUHJvZmlsZSxcbiAgICAgICAgcHJlZmVyU3RhdGljQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuXG4gIH1cblxuICAvLyB0aGUgYXdzLXNkayBmb3IganMgZG9lcyBub3Qgc3VwcG9ydCAnY3JlZGVudGlhbF9zb3VyY2UnIChodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1zZGstanMvaXNzdWVzLzE5MTYpXG4gIC8vIHNvIHVuZm9ydHVuYXRlbHkgd2UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBvdXJzZWx2ZXMuXG4gIHByaXZhdGUgY3JlZGVudGlhbFNvdXJjZUNyZWRlbnRpYWxzKHNvdXJjZUNyZWRlbnRpYWw6IHN0cmluZykge1xuXG4gICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jcmVkcmVmL2xhdGVzdC9yZWZkb2NzL3NldHRpbmctZ2xvYmFsLWNyZWRlbnRpYWxfc291cmNlLmh0bWxcbiAgICBzd2l0Y2ggKHNvdXJjZUNyZWRlbnRpYWwpIHtcbiAgICAgIGNhc2UgJ0Vudmlyb25tZW50Jzoge1xuICAgICAgICByZXR1cm4gbmV3IEFXUy5FbnZpcm9ubWVudENyZWRlbnRpYWxzKCdBV1MnKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VjMkluc3RhbmNlTWV0YWRhdGEnOiB7XG4gICAgICAgIHJldHVybiBuZXcgQVdTLkVDMk1ldGFkYXRhQ3JlZGVudGlhbHMoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0Vjc0NvbnRhaW5lcic6IHtcbiAgICAgICAgcmV0dXJuIG5ldyBBV1MuRUNTQ3JlZGVudGlhbHMoKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjcmVkZW50aWFsX3NvdXJjZSAke3NvdXJjZUNyZWRlbnRpYWx9IGluIHByb2ZpbGUgJHt0aGlzLnByb2ZpbGV9IGlzIHVuc3VwcG9ydGVkLiBjaG9vc2Ugb25lIG9mIFtFbnZpcm9ubWVudCwgRWMySW5zdGFuY2VNZXRhZGF0YSwgRWNzQ29udGFpbmVyXWApO1xuICAgICAgfVxuICAgIH1cblxuICB9XG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0byBsb2FkIHByb2ZpbGVzIGZyb20gZGlzayB0aGF0IE1FUkdFUyBjcmVkZW50aWFscyBhbmQgY29uZmlnIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmdcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1qcy9ibG9iLzVhZTVhN2Q3ZDI0ZDEwMDBkYmMwODljYzE1ZjhlZDJjN2IwNmM1NDIvbGliL3V0aWwuanMjTDk1NlxuICovXG5mdW5jdGlvbiBsb2FkUHJvZmlsZXNQcm9wZXIoZmlsZW5hbWU6IHN0cmluZykge1xuICBjb25zdCB1dGlsID0gKEFXUyBhcyBhbnkpLnV0aWw7IC8vIERvZXMgZXhpc3RzIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZW4ndCBhbnkgdHlwaW5ncyBmb3IgaXRcbiAgY29uc3QgaW5pTG9hZGVyID0gdXRpbC5pbmlMb2FkZXI7XG4gIGNvbnN0IHByb2ZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHt9O1xuICBsZXQgcHJvZmlsZXNGcm9tQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHt9O1xuICBpZiAocHJvY2Vzcy5lbnZbdXRpbC5jb25maWdPcHRJbkVudl0pIHtcbiAgICBwcm9maWxlc0Zyb21Db25maWcgPSBpbmlMb2FkZXIubG9hZEZyb20oe1xuICAgICAgaXNDb25maWc6IHRydWUsXG4gICAgICBmaWxlbmFtZTogcHJvY2Vzcy5lbnZbdXRpbC5zaGFyZWRDb25maWdGaWxlRW52XSxcbiAgICB9KTtcbiAgfVxuICB2YXIgcHJvZmlsZXNGcm9tQ3JlZHM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0gaW5pTG9hZGVyLmxvYWRGcm9tKHtcbiAgICBmaWxlbmFtZTogZmlsZW5hbWUgfHxcbiAgICAgIChwcm9jZXNzLmVudlt1dGlsLmNvbmZpZ09wdEluRW52XSAmJiBwcm9jZXNzLmVudlt1dGlsLnNoYXJlZENyZWRlbnRpYWxzRmlsZUVudl0pLFxuICB9KTtcbiAgZm9yIChjb25zdCBbbmFtZSwgcHJvZmlsZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvZmlsZXNGcm9tQ29uZmlnKSkge1xuICAgIHByb2ZpbGVzW25hbWVdID0gcHJvZmlsZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9maWxlXSBvZiBPYmplY3QuZW50cmllcyhwcm9maWxlc0Zyb21DcmVkcykpIHtcbiAgICBwcm9maWxlc1tuYW1lXSA9IHtcbiAgICAgIC4uLnByb2ZpbGVzW25hbWVdLFxuICAgICAgLi4ucHJvZmlsZSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBwcm9maWxlcztcbn1cbiJdfQ==
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLXNkay1pbmlmaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLXNkay1pbmlmaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUcvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBYSwrQkFBZ0MsU0FBUSxHQUFHLENBQUMsd0JBQXdCO0lBU3hFLGVBQWUsQ0FDcEIsS0FBNkMsRUFDN0MsV0FBbUMsRUFDbkMsUUFBMkM7UUFFM0Msa0dBQWtHO1FBQ2xHLDhEQUE4RDtRQUU5RCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixNQUFPLEdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUMzQixJQUFJLEtBQUssQ0FBQyx5Q0FBeUM7Z0JBQ3pDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxPQUFPO2dCQUN4QyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUNwQyxFQUFFLElBQUksRUFBRSx5Q0FBeUMsRUFBRSxDQUNwRCxDQUFDO1NBQ0g7UUFFRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNuQyxJQUFJLGVBQWUsR0FBRyxXQUFXLENBQUMsaUJBQWlCLENBQUM7UUFDcEQsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUN6QyxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1FBQ3ZDLElBQUksYUFBYSxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUM7UUFDL0MsSUFBSSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsaUJBQWlCLENBQUM7UUFFckQsTUFBTSxlQUFlLEdBQUksR0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQzdDLElBQUksS0FBSyxDQUFDLHNDQUFzQyxJQUFJLENBQUMsT0FBTyxvRkFBb0YsQ0FBQyxFQUNqSixFQUFFLElBQUksRUFBRSx5Q0FB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QWtCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUN0QyxRQUFRLEVBQUUsSUFBSTtZQUNkLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztTQUNoRCxDQUFDLENBQUM7S0FDSjtJQUNELElBQUksaUJBQWlCLEdBQTJDLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDakYsUUFBUSxFQUFFLFFBQVE7WUFDaEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0tBQ25GLENBQUMsQ0FBQztJQUNILEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7UUFDaEUsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQztLQUMxQjtJQUNELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7UUFDL0QsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQ2YsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2pCLEdBQUcsT0FBTztTQUNYLENBQUM7S0FDSDtJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBBV1MgZnJvbSAnYXdzLXNkayc7XG5cblxuLyoqXG4gKiBIYWNrLWZpeFxuICpcbiAqIFRoZXJlIGFyZSBhIG51bWJlciBvZiBpc3N1ZXMgaW4gdGhlIHVwc3RyZWFtIHZlcnNpb24gb2YgU2hhcmVkSW5pRmlsZUNyZWRlbnRpYWxzXG4gKiB0aGF0IG5lZWQgZml4aW5nOlxuICpcbiAqICAxLiBUaGUgdXBzdHJlYW0gYXdzLXNkayBjb250YWlucyBhbiBpbmNvcnJlY3QgaW5zdGFudGlhdGlvbiBvZiBhbiBgQVdTLlNUU2BcbiAqICAgICBjbGllbnQsIHdoaWNoICpzaG91bGQqIGhhdmUgdGFrZW4gdGhlIHJlZ2lvbiBmcm9tIHRoZSByZXF1ZXN0ZWQgcHJvZmlsZVxuICogICAgIGJ1dCBkb2Vzbid0LiBJdCB3aWxsIHVzZSB0aGUgcmVnaW9uIGZyb20gdGhlIGRlZmF1bHQgcHJvZmlsZSwgd2hpY2hcbiAqICAgICBtYXkgbm90IGV4aXN0LCBkZWZhdWx0aW5nIHRvIGB1cy1lYXN0LTFgIChzaW5jZSB3ZSBzd2l0Y2hlZCB0b1xuICogICAgIEFXU19TVFNfUkVHSU9OQUxfRU5EUE9JTlRTPXJlZ2lvbmFsLCB0aGF0IGRlZmF1bHQgaXMgbm90IGV2ZW4gYWxsb3dlZCBhbnltb3JlXG4gKiAgICAgYW5kIHRoZSBhYnNlbmNlIG9mIGEgZGVmYXVsdCByZWdpb24gd2lsbCBsZWFkIHRvIGFuIGVycm9yKS5cbiAqXG4gKiAgMi4gVGhlIHNpbXBsZSBmaXggaXMgdG8gZ2V0IHRoZSByZWdpb24gZnJvbSB0aGUgYGNvbmZpZ2AgZmlsZS4gcHJvZmlsZXNcbiAqICAgICBhcmUgbWFkZSB1cCBvZiBhIGNvbWJpbmF0aW9uIG9mIGBjcmVkZW50aWFsc2AgYW5kIGBjb25maWdgLCBhbmQgdGhlIHJlZ2lvbiBpc1xuICogICAgIGdlbmVyYWxseSBpbiBgY29uZmlnYCB3aXRoIHRoZSByZXN0IGluIGBjcmVkZW50aWFsc2AuIEhvd2V2ZXIsIGEgYnVnIGluXG4gKiAgICAgYGdldFByb2ZpbGVzRnJvbVNoYXJlZENvbmZpZ2Agb3ZlcndyaXRlcyBBTEwgYGNvbmZpZ2AgZGF0YSB3aXRoIGBjcmVkZW50aWFsc2BcbiAqICAgICBkYXRhLCBzbyB3ZSBhbHNvIG5lZWQgdG8gZG8gZXh0cmEgd29yayB0byBmaXNoIHRoZSBgcmVnaW9uYCBvdXQgb2YgdGhlIGNvbmZpZy5cbiAqXG4gKiAzLiAgVGhlICdjcmVkZW50aWFsX3NvdXJjZScgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIE1lYW5pbmcgY3JlZGVudGlhbHNcbiAqICAgICBmb3IgYXNzdW1lLXJvbGUgY2Fubm90IGJlIGZldGNoZWQgdXNpbmcgRUMyL0VTQyBtZXRhZGF0YS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzL2lzc3Vlcy8zNDE4IGZvciBhbGwgdGhlIGdvcnkgZGV0YWlscy5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1zZGstanMvaXNzdWVzLzE5MTYgZm9yIHNvbWUgbW9yZSBnbG9yeSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgUGF0Y2hlZFNoYXJlZEluaUZpbGVDcmVkZW50aWFscyBleHRlbmRzIEFXUy5TaGFyZWRJbmlGaWxlQ3JlZGVudGlhbHMge1xuICBkZWNsYXJlIHByaXZhdGUgcHJvZmlsZTogc3RyaW5nO1xuICBkZWNsYXJlIHByaXZhdGUgZmlsZW5hbWU6IHN0cmluZztcbiAgZGVjbGFyZSBwcml2YXRlIGRpc2FibGVBc3N1bWVSb2xlOiBib29sZWFuO1xuICBkZWNsYXJlIHByaXZhdGUgb3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZGVjbGFyZSBwcml2YXRlIHJvbGVBcm46IHN0cmluZztcbiAgZGVjbGFyZSBwcml2YXRlIGh0dHBPcHRpb25zPzogQVdTLkhUVFBPcHRpb25zO1xuICBkZWNsYXJlIHByaXZhdGUgdG9rZW5Db2RlRm4/OiAobWZhU2VyaWFsOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyPzogRXJyb3IsIHRva2VuPzogc3RyaW5nKSA9PiB2b2lkKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBsb2FkUm9sZVByb2ZpbGUoXG4gICAgY3JlZHM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICAgIHJvbGVQcm9maWxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGNhbGxiYWNrOiAoZXJyPzogRXJyb3IsIGRhdGE/OiBhbnkpID0+IHZvaWQpIHtcblxuICAgIC8vIE5lZWQgdG8gZHVwbGljYXRlIHRoZSB3aG9sZSBpbXBsZW1lbnRhdGlvbiBoZXJlIC0tIHRoZSBmdW5jdGlvbiBpcyBsb25nIGFuZCBoYXMgYmVlbiB3cml0dGVuIGluXG4gICAgLy8gc3VjaCBhIHdheSB0aGF0IHRoZXJlIGFyZSBubyBzbWFsbCBtb25rZXkgcGF0Y2hlcyBwb3NzaWJsZS5cblxuICAgIGlmICh0aGlzLmRpc2FibGVBc3N1bWVSb2xlKSB7XG4gICAgICB0aHJvdyAoQVdTIGFzIGFueSkudXRpbC5lcnJvcihcbiAgICAgICAgbmV3IEVycm9yKCdSb2xlIGFzc3VtcHRpb24gcHJvZmlsZXMgYXJlIGRpc2FibGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gbG9hZCBwcm9maWxlICcgKyB0aGlzLnByb2ZpbGUgK1xuICAgICAgICAgICAgICAgICAgJyBmcm9tICcgKyBjcmVkcy5maWxlbmFtZSksXG4gICAgICAgIHsgY29kZTogJ1NoYXJlZEluaUZpbGVDcmVkZW50aWFsc1Byb3ZpZGVyRmFpbHVyZScgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciByb2xlQXJuID0gcm9sZVByb2ZpbGUucm9sZV9hcm47XG4gICAgdmFyIHJvbGVTZXNzaW9uTmFtZSA9IHJvbGVQcm9maWxlLnJvbGVfc2Vzc2lvbl9uYW1lO1xuICAgIHZhciBleHRlcm5hbElkID0gcm9sZVByb2ZpbGUuZXh0ZXJuYWxfaWQ7XG4gICAgdmFyIG1mYVNlcmlhbCA9IHJvbGVQcm9maWxlLm1mYV9zZXJpYWw7XG4gICAgdmFyIHNvdXJjZVByb2ZpbGUgPSByb2xlUHJvZmlsZS5zb3VyY2VfcHJvZmlsZTtcbiAgICB2YXIgY3JlZGVudGlhbFNvdXJjZSA9IHJvbGVQcm9maWxlLmNyZWRlbnRpYWxfc291cmNlO1xuXG4gICAgY29uc3QgY3JlZGVudGlhbEVycm9yID0gKEFXUyBhcyBhbnkpLnV0aWwuZXJyb3IoXG4gICAgICBuZXcgRXJyb3IoYFdoZW4gdXNpbmcgJ3JvbGVfYXJuJyBpbiBwcm9maWxlICgnJHt0aGlzLnByb2ZpbGV9JyksIHlvdSBtdXN0IGFsc28gY29uZmlndXJlIGV4YWN0bHkgb25lIG9mICdzb3VyY2VfcHJvZmlsZScgb3IgJ2NyZWRlbnRpYWxfc291cmNlJ2ApLFxuICAgICAgeyBjb2RlOiAnU2hhcmVkSW5pRmlsZUNyZWRlbnRpYWxzUHJvdmlkZXJGYWlsdXJlJyB9LFxuICAgICk7XG5cbiAgICBpZiAoc291cmNlUHJvZmlsZSAmJiBjcmVkZW50aWFsU291cmNlKSB7XG4gICAgICB0aHJvdyBjcmVkZW50aWFsRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFzb3VyY2VQcm9maWxlICYmICFjcmVkZW50aWFsU291cmNlKSB7XG4gICAgICB0aHJvdyBjcmVkZW50aWFsRXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZmlsZXMgPSBsb2FkUHJvZmlsZXNQcm9wZXIodGhpcy5maWxlbmFtZSk7XG4gICAgY29uc3QgcmVnaW9uID0gcHJvZmlsZXNbdGhpcy5wcm9maWxlXT8ucmVnaW9uID8/IHByb2ZpbGVzLmRlZmF1bHQ/LnJlZ2lvbiA/PyAndXMtZWFzdC0xJztcblxuICAgIGNvbnN0IHN0c0NyZWRzID0gc291cmNlUHJvZmlsZSA/IHRoaXMuc291cmNlUHJvZmlsZUNyZWRlbnRpYWxzKHNvdXJjZVByb2ZpbGUsIGNyZWRzKSA6IHRoaXMuY3JlZGVudGlhbFNvdXJjZUNyZWRlbnRpYWxzKGNyZWRlbnRpYWxTb3VyY2UpO1xuXG4gICAgdGhpcy5yb2xlQXJuID0gcm9sZUFybjtcbiAgICB2YXIgc3RzID0gbmV3IEFXUy5TVFMoe1xuICAgICAgY3JlZGVudGlhbHM6IHN0c0NyZWRzLFxuICAgICAgcmVnaW9uLFxuICAgICAgaHR0cE9wdGlvbnM6IHRoaXMuaHR0cE9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB2YXIgcm9sZVBhcmFtczogQVdTLlNUUy5Bc3N1bWVSb2xlUmVxdWVzdCA9IHtcbiAgICAgIFJvbGVBcm46IHJvbGVBcm4sXG4gICAgICBSb2xlU2Vzc2lvbk5hbWU6IHJvbGVTZXNzaW9uTmFtZSB8fCAnYXdzLXNkay1qcy0nICsgRGF0ZS5ub3coKSxcbiAgICB9O1xuXG4gICAgaWYgKGV4dGVybmFsSWQpIHtcbiAgICAgIHJvbGVQYXJhbXMuRXh0ZXJuYWxJZCA9IGV4dGVybmFsSWQ7XG4gICAgfVxuXG4gICAgaWYgKG1mYVNlcmlhbCAmJiBzZWxmLnRva2VuQ29kZUZuKSB7XG4gICAgICByb2xlUGFyYW1zLlNlcmlhbE51bWJlciA9IG1mYVNlcmlhbDtcbiAgICAgIHNlbGYudG9rZW5Db2RlRm4obWZhU2VyaWFsLCBmdW5jdGlvbihlcnIsIHRva2VuKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB2YXIgbWVzc2FnZTtcbiAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZSA9IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2soXG4gICAgICAgICAgICAoQVdTIGFzIGFueSkudXRpbC5lcnJvcihcbiAgICAgICAgICAgICAgbmV3IEVycm9yKCdFcnJvciBmZXRjaGluZyBNRkEgdG9rZW46ICcgKyBtZXNzYWdlKSxcbiAgICAgICAgICAgICAgeyBjb2RlOiAnU2hhcmVkSW5pRmlsZUNyZWRlbnRpYWxzUHJvdmlkZXJGYWlsdXJlJyB9LFxuICAgICAgICAgICAgKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcm9sZVBhcmFtcy5Ub2tlbkNvZGUgPSB0b2tlbjtcbiAgICAgICAgc3RzLmFzc3VtZVJvbGUocm9sZVBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0cy5hc3N1bWVSb2xlKHJvbGVQYXJhbXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHByaXZhdGUgc291cmNlUHJvZmlsZUNyZWRlbnRpYWxzKHNvdXJjZVByb2ZpbGU6IHN0cmluZywgcHJvZmlsZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KSB7XG5cbiAgICB2YXIgc291cmNlUHJvZmlsZUV4aXN0YW5jZVRlc3QgPSBwcm9maWxlc1tzb3VyY2VQcm9maWxlXTtcblxuICAgIGlmICh0eXBlb2Ygc291cmNlUHJvZmlsZUV4aXN0YW5jZVRlc3QgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyAoQVdTIGFzIGFueSkudXRpbC5lcnJvcihcbiAgICAgICAgbmV3IEVycm9yKCdzb3VyY2VfcHJvZmlsZSAnICsgc291cmNlUHJvZmlsZSArICcgdXNpbmcgcHJvZmlsZSAnXG4gICAgICAgICAgKyB0aGlzLnByb2ZpbGUgKyAnIGRvZXMgbm90IGV4aXN0JyksXG4gICAgICAgIHsgY29kZTogJ1NoYXJlZEluaUZpbGVDcmVkZW50aWFsc1Byb3ZpZGVyRmFpbHVyZScgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZVByb2ZpbGVFeGlzdGFuY2VUZXN0LnNzb19zdGFydF91cmwpIHtcbiAgICAgIHJldHVybiBuZXcgQVdTLlNzb0NyZWRlbnRpYWxzKHsgcHJvZmlsZTogc291cmNlUHJvZmlsZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFXUy5TaGFyZWRJbmlGaWxlQ3JlZGVudGlhbHMoXG4gICAgICAoQVdTIGFzIGFueSkudXRpbC5tZXJnZSh0aGlzLm9wdGlvbnMgfHwge30sIHtcbiAgICAgICAgcHJvZmlsZTogc291cmNlUHJvZmlsZSxcbiAgICAgICAgcHJlZmVyU3RhdGljQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuXG4gIH1cblxuICAvLyB0aGUgYXdzLXNkayBmb3IganMgZG9lcyBub3Qgc3VwcG9ydCAnY3JlZGVudGlhbF9zb3VyY2UnIChodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1zZGstanMvaXNzdWVzLzE5MTYpXG4gIC8vIHNvIHVuZm9ydHVuYXRlbHkgd2UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBvdXJzZWx2ZXMuXG4gIHByaXZhdGUgY3JlZGVudGlhbFNvdXJjZUNyZWRlbnRpYWxzKHNvdXJjZUNyZWRlbnRpYWw6IHN0cmluZykge1xuXG4gICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jcmVkcmVmL2xhdGVzdC9yZWZkb2NzL3NldHRpbmctZ2xvYmFsLWNyZWRlbnRpYWxfc291cmNlLmh0bWxcbiAgICBzd2l0Y2ggKHNvdXJjZUNyZWRlbnRpYWwpIHtcbiAgICAgIGNhc2UgJ0Vudmlyb25tZW50Jzoge1xuICAgICAgICByZXR1cm4gbmV3IEFXUy5FbnZpcm9ubWVudENyZWRlbnRpYWxzKCdBV1MnKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VjMkluc3RhbmNlTWV0YWRhdGEnOiB7XG4gICAgICAgIHJldHVybiBuZXcgQVdTLkVDMk1ldGFkYXRhQ3JlZGVudGlhbHMoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0Vjc0NvbnRhaW5lcic6IHtcbiAgICAgICAgcmV0dXJuIG5ldyBBV1MuRUNTQ3JlZGVudGlhbHMoKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjcmVkZW50aWFsX3NvdXJjZSAke3NvdXJjZUNyZWRlbnRpYWx9IGluIHByb2ZpbGUgJHt0aGlzLnByb2ZpbGV9IGlzIHVuc3VwcG9ydGVkLiBjaG9vc2Ugb25lIG9mIFtFbnZpcm9ubWVudCwgRWMySW5zdGFuY2VNZXRhZGF0YSwgRWNzQ29udGFpbmVyXWApO1xuICAgICAgfVxuICAgIH1cblxuICB9XG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0byBsb2FkIHByb2ZpbGVzIGZyb20gZGlzayB0aGF0IE1FUkdFUyBjcmVkZW50aWFscyBhbmQgY29uZmlnIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmdcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1qcy9ibG9iLzVhZTVhN2Q3ZDI0ZDEwMDBkYmMwODljYzE1ZjhlZDJjN2IwNmM1NDIvbGliL3V0aWwuanMjTDk1NlxuICovXG5mdW5jdGlvbiBsb2FkUHJvZmlsZXNQcm9wZXIoZmlsZW5hbWU6IHN0cmluZykge1xuICBjb25zdCB1dGlsID0gKEFXUyBhcyBhbnkpLnV0aWw7IC8vIERvZXMgZXhpc3RzIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZW4ndCBhbnkgdHlwaW5ncyBmb3IgaXRcbiAgY29uc3QgaW5pTG9hZGVyID0gdXRpbC5pbmlMb2FkZXI7XG4gIGNvbnN0IHByb2ZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHt9O1xuICBsZXQgcHJvZmlsZXNGcm9tQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHt9O1xuICBpZiAocHJvY2Vzcy5lbnZbdXRpbC5jb25maWdPcHRJbkVudl0pIHtcbiAgICBwcm9maWxlc0Zyb21Db25maWcgPSBpbmlMb2FkZXIubG9hZEZyb20oe1xuICAgICAgaXNDb25maWc6IHRydWUsXG4gICAgICBmaWxlbmFtZTogcHJvY2Vzcy5lbnZbdXRpbC5zaGFyZWRDb25maWdGaWxlRW52XSxcbiAgICB9KTtcbiAgfVxuICB2YXIgcHJvZmlsZXNGcm9tQ3JlZHM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0gaW5pTG9hZGVyLmxvYWRGcm9tKHtcbiAgICBmaWxlbmFtZTogZmlsZW5hbWUgfHxcbiAgICAgIChwcm9jZXNzLmVudlt1dGlsLmNvbmZpZ09wdEluRW52XSAmJiBwcm9jZXNzLmVudlt1dGlsLnNoYXJlZENyZWRlbnRpYWxzRmlsZUVudl0pLFxuICB9KTtcbiAgZm9yIChjb25zdCBbbmFtZSwgcHJvZmlsZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvZmlsZXNGcm9tQ29uZmlnKSkge1xuICAgIHByb2ZpbGVzW25hbWVdID0gcHJvZmlsZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9maWxlXSBvZiBPYmplY3QuZW50cmllcyhwcm9maWxlc0Zyb21DcmVkcykpIHtcbiAgICBwcm9maWxlc1tuYW1lXSA9IHtcbiAgICAgIC4uLnByb2ZpbGVzW25hbWVdLFxuICAgICAgLi4ucHJvZmlsZSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBwcm9maWxlcztcbn1cbiJdfQ==
@@ -35,7 +35,6 @@ class AwsCliCompatible {
35
35
  * 4. Respects $AWS_DEFAULT_PROFILE in addition to $AWS_PROFILE.
36
36
  */
37
37
  static async credentialChain(options = {}) {
38
- var _a, _b;
39
38
  // Force reading the `config` file if it exists by setting the appropriate
40
39
  // environment variable.
41
40
  await forceSdkToReadConfigIfPresent();
@@ -51,14 +50,14 @@ class AwsCliCompatible {
51
50
  () => new AWS.EnvironmentCredentials('AMAZON'),
52
51
  ...iniFileCredentialFactories(implicitProfile),
53
52
  ];
54
- if ((_a = options.containerCreds) !== null && _a !== void 0 ? _a : hasEcsCredentials()) {
53
+ if (options.containerCreds ?? hasEcsCredentials()) {
55
54
  sources.push(() => new AWS.ECSCredentials());
56
55
  }
57
56
  else if (hasWebIdentityCredentials()) {
58
57
  // else if: we have found WebIdentityCredentials as provided by EKS ServiceAccounts
59
58
  sources.push(() => new AWS.TokenFileWebIdentityCredentials());
60
59
  }
61
- else if ((_b = options.ec2instance) !== null && _b !== void 0 ? _b : await isEc2Instance()) {
60
+ else if (options.ec2instance ?? await isEc2Instance()) {
62
61
  // else if: don't get EC2 creds if we should have gotten ECS or EKS creds
63
62
  // ECS and EKS instances also run on EC2 boxes but the creds represent something different.
64
63
  // Same behavior as upstream code.
@@ -95,7 +94,6 @@ class AwsCliCompatible {
95
94
  * Lambda and CodeBuild set the $AWS_REGION variable.
96
95
  */
97
96
  static async region(options = {}) {
98
- var _a;
99
97
  const profile = options.profile || process.env.AWS_PROFILE || process.env.AWS_DEFAULT_PROFILE || 'default';
100
98
  // Defaults inside constructor
101
99
  const toCheck = [
@@ -110,10 +108,10 @@ class AwsCliCompatible {
110
108
  if (await fs.pathExists(opts.filename)) {
111
109
  const configFile = new sdk_ini_file_1.SharedIniFile(opts);
112
110
  const section = await configFile.getProfile(opts.profile);
113
- region = section === null || section === void 0 ? void 0 : section.region;
111
+ region = section?.region;
114
112
  }
115
113
  }
116
- if (!region && ((_a = options.ec2instance) !== null && _a !== void 0 ? _a : await isEc2Instance())) {
114
+ if (!region && (options.ec2instance ?? await isEc2Instance())) {
117
115
  _env_1.debug('Looking up AWS region in the EC2 Instance Metadata Service (IMDS).');
118
116
  const imdsOptions = {
119
117
  httpOptions: { timeout: 1000, connectTimeout: 1000 }, maxRetries: 2,
@@ -316,4 +314,4 @@ async function tokenCodeFn(serialArn, cb) {
316
314
  cb(err);
317
315
  }
318
316
  }
319
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzY2xpLWNvbXBhdGlibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhd3NjbGktY29tcGF0aWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FBK0M7QUFDL0MseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQixxQ0FBcUM7QUFDckMsaUNBQStCO0FBQy9CLHVEQUFvRTtBQUNwRSxpREFBK0M7QUFFL0M7Ozs7Ozs7R0FPRztBQUNILE1BQWEsZ0JBQWdCO0lBQzNCOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFrQyxFQUFFOztRQUN0RSwwRUFBMEU7UUFDMUUsd0JBQXdCO1FBQ3hCLE1BQU0sNkJBQTZCLEVBQUUsQ0FBQztRQUV0QywrRUFBK0U7UUFDL0UsNkVBQTZFO1FBQzdFLGtGQUFrRjtRQUNsRixJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDbkIsT0FBTyxJQUFJLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNyRjtRQUVELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksU0FBUyxDQUFDO1FBRWhHLE1BQU0sT0FBTyxHQUFHO1lBQ2QsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDO1lBQzNDLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztZQUM5QyxHQUFHLDBCQUEwQixDQUFDLGVBQWUsQ0FBQztTQUMvQyxDQUFDO1FBRUYsVUFBSSxPQUFPLENBQUMsY0FBYyxtQ0FBSSxpQkFBaUIsRUFBRSxFQUFFO1lBQ2pELE9BQU8sQ0FBQyxJ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QUFDLENBQUM7S0FDekQ7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLFlBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNULE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0FBQ0gsQ0FBQztBQWNEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsV0FBVyxDQUFDLFNBQWlCLEVBQUUsRUFBeUM7SUFDckYsWUFBSyxDQUFDLGtDQUFrQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELElBQUk7UUFDRixNQUFNLEtBQUssR0FBVyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLFNBQVMsSUFBSSxFQUFFO1lBQzFFLElBQUksRUFBRSxJQUFJO1lBQ1YsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDLENBQUM7UUFDSCxZQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUM5QyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3RCO0lBQUMsT0FBTyxHQUFHLEVBQUU7UUFDWixZQUFLLENBQUMseUJBQXlCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ1Q7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJ3V0aWwnO1xuaW1wb3J0ICogYXMgQVdTIGZyb20gJ2F3cy1zZGsnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcHJvbXB0bHkgZnJvbSAncHJvbXB0bHknO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuL19lbnYnO1xuaW1wb3J0IHsgUGF0Y2hlZFNoYXJlZEluaUZpbGVDcmVkZW50aWFscyB9IGZyb20gJy4vYXdzLXNkay1pbmlmaWxlJztcbmltcG9ydCB7IFNoYXJlZEluaUZpbGUgfSBmcm9tICcuL3Nka19pbmlfZmlsZSc7XG5cbi8qKlxuICogQmVoYXZpb3JzIHRvIG1hdGNoIEFXUyBDTElcbiAqXG4gKiBTZWUgdGhlc2UgbGlua3M6XG4gKlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsaS9sYXRlc3QvdG9waWMvY29uZmlnLXZhcnMuaHRtbFxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsaS9sYXRlc3QvdXNlcmd1aWRlL2NsaS1jb25maWd1cmUtZW52dmFycy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBBd3NDbGlDb21wYXRpYmxlIHtcbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEFXUyBDTEktY29tcGF0aWJsZSBjcmVkZW50aWFsIGNoYWluIHByb3ZpZGVyXG4gICAqXG4gICAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZGVmYXVsdCBjcmVkZW50aWFsIHByb3ZpZGVyIGNoYWluIGNyZWF0ZWQgYnkgdGhlIFNES1xuICAgKiBleGNlcHQ6XG4gICAqXG4gICAqIDEuIEFjY2VwdHMgcHJvZmlsZSBhcmd1bWVudCBpbiB0aGUgY29uc3RydWN0b3IgKHRoZSBTREsgbXVzdCBoYXZlIGl0IHByZXBvcHVsYXRlZFxuICAgKiAgICBpbiB0aGUgZW52aXJvbm1lbnQpLlxuICAgKiAyLiBDb25kaXRpb25hbGx5IGNoZWNrcyBFQzIgY3JlZGVudGlhbHMsIGJlY2F1c2UgY2hlY2tpbmcgZm9yIEVDMlxuICAgKiAgICBjcmVkZW50aWFscyBvbiBhIG5vbi1FQzIgbWFjaGluZSBtYXkgbGVhZCB0byBsb25nIGRlbGF5cyAoaW4gdGhlIGJlc3QgY2FzZSlcbiAgICogICAgb3IgYW4gZXhjZXB0aW9uIChpbiB0aGUgd29yc3QgY2FzZSkuXG4gICAqIDMuIFJlc3BlY3RzICRBV1NfU0hBUkVEX0NSRURFTlRJQUxTX0ZJTEUuXG4gICAqIDQuIFJlc3BlY3RzICRBV1NfREVGQVVMVF9QUk9GSUxFIGluIGFkZGl0aW9uIHRvICRBV1NfUFJPRklMRS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlZGVudGlhbENoYWluKG9wdGlvbnM6IENyZWRlbnRpYWxDaGFpbk9wdGlvbnMgPSB7fSkge1xuICAgIC8vIEZvcmNlIHJlYWRpbmcgdGhlIGBjb25maWdgIGZpbGUgaWYgaXQgZXhpc3RzIGJ5IHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlXG4gICAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAgYXdhaXQgZm9yY2VTZGtUb1JlYWRDb25maWdJZlByZXNlbnQoKTtcblxuICAgIC8vIFRvIG1hdGNoIEFXUyBDTEkgYmVoYXZpb3IsIGlmIGEgcHJvZmlsZSBpcyBleHBsaWNpdGx5IGdpdmVuIHVzaW5nIC0tcHJvZmlsZSxcbiAgICAvLyB3ZSB1c2UgdGhhdCB0byB0aGUgZXhjbHVzaW9uIG9mIGV2ZXJ5dGhpbmcgZWxzZSAobm90ZTogdGhpcyBkb2VzIG5vdCBhcHBseVxuICAgIC8vIHRvIEFXU19QUk9GSUxFLCBlbnZpcm9ubWVudCBjcmVkZW50aWFscyBzdGlsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBBV1NfUFJPRklMRSlcbiAgICBpZiAob3B0aW9ucy5wcm9maWxlKSB7XG4gICAgICByZXR1cm4gbmV3IEFXUy5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbihpbmlGaWxlQ3JlZGVudGlhbEZhY3RvcmllcyhvcHRpb25zLnByb2ZpbGUpKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbXBsaWNpdFByb2ZpbGUgPSBwcm9jZXNzLmVudi5BV1NfUFJPRklMRSB8fCBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9QUk9GSUxFIHx8ICdkZWZhdWx0JztcblxuICAgIGNvbnN0IHNvdXJjZXMgPSBbXG4gICAgICAoKSA9PiBuZXcgQVdTLkVudmlyb25tZW50Q3JlZGVudGlhbHMoJ0FXUycpLFxuICAgICAgKCkgPT4gbmV3IEFXUy5FbnZpcm9ubWVudENyZWRlbnRpYWxzKCdBTUFaT04nKSxcbiAgICAgIC4uLmluaUZpbGVDcmVkZW50aWFsRmFjdG9yaWVzKGltcGxpY2l0UHJvZmlsZSksXG4gICAgXTtcblxuICAgIGlmIChvcHRpb25zLmNvbnRhaW5lckNyZWRzID8/IGhhc0Vjc0NyZWRlbnRpYWxzKCkpIHtcbiAgICAgIHNvdXJjZXMucHVzaCgoKSA9PiBuZXcgQVdTLkVDU0NyZWRlbnRpYWxzKCkpO1xuICAgIH0gZWxzZSBpZiAoaGFzV2ViSWRlbnRpdHlDcmVkZW50aWFscygpKSB7XG4gICAgICAvLyBlbHNlIGlmOiB3ZSBoYXZlIGZvdW5kIFdlYklkZW50aXR5Q3JlZGVudGlhbHMgYXMgcHJvdmlkZWQgYnkgRUtTIFNlcnZpY2VBY2NvdW50c1xuICAgICAgc291cmNlcy5wdXNoKCgpID0+IG5ldyBBV1MuVG9rZW5GaWxlV2ViSWRlbnRpdHlDcmVkZW50aWFscygpKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZWMyaW5zdGFuY2UgPz8gYXdhaXQgaXNFYzJJbnN0YW5jZSgpKSB7XG4gICAgICAvLyBlbHNlIGlmOiBkb24ndCBnZXQgRUMyIGNyZWRzIGlmIHdlIHNob3VsZCBoYXZlIGdvdHRlbiBFQ1Mgb3IgRUtTIGNyZWRzXG4gICAgICAvLyBFQ1MgYW5kIEVLUyBpbnN0YW5jZXMgYWxzbyBydW4gb24gRUMyIGJveGVzIGJ1dCB0aGUgY3JlZHMgcmVwcmVzZW50IHNvbWV0aGluZyBkaWZmZXJlbnQuXG4gICAgICAvLyBTYW1lIGJlaGF2aW9yIGFzIHVwc3RyZWFtIGNvZGUuXG4gICAgICBzb3VyY2VzLnB1c2goKCkgPT4gbmV3IEFXUy5FQzJNZXRhZGF0YUNyZWRlbnRpYWxzKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQVdTLkNyZWRlbnRpYWxQcm92aWRlckNoYWluKHNvdXJjZXMpO1xuXG4gICAgZnVuY3Rpb24gcHJvZmlsZUNyZWRlbnRpYWxzKHByb2ZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBuZXcgUGF0Y2hlZFNoYXJlZEluaUZpbGVDcmVkZW50aWFscyh7XG4gICAgICAgIHByb2ZpbGU6IHByb2ZpbGVOYW1lLFxuICAgICAgICBmaWxlbmFtZTogY3JlZGVudGlhbHNGaWxlTmFtZSgpLFxuICAgICAgICBodHRwT3B0aW9uczogb3B0aW9ucy5odHRwT3B0aW9ucyxcbiAgICAgICAgdG9rZW5Db2RlRm4sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbmlGaWxlQ3JlZGVudGlhbEZhY3Rvcmllcyh0aGVQcm9maWxlOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgICgpID0+IHByb2ZpbGVDcmVkZW50aWFscyh0aGVQcm9maWxlKSxcbiAgICAgICAgKCkgPT4gbmV3IEFXUy5Tc29DcmVkZW50aWFscyh7IHByb2ZpbGU6IHRoZVByb2ZpbGUgfSksXG4gICAgICAgICgpID0+IG5ldyBBV1MuUHJvY2Vzc0NyZWRlbnRpYWxzKHsgcHJvZmlsZTogdGhlUHJvZmlsZSB9KSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZGVmYXVsdCByZWdpb24gaW4gYSBDTEktY29tcGF0aWJsZSB3YXlcbiAgICpcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIG5vZGVfbG9hZGVyLmpzLCBidXQgd2l0aCB0aGUgZm9sbG93aW5nIGRpZmZlcmVuY2VzIHRvIG1ha2UgaXRcbiAgICogQVdTIENMSSBjb21wYXRpYmxlOlxuICAgKlxuICAgKiAxLiBUYWtlcyBhIHByb2ZpbGUgbmFtZSBhcyBhbiBhcmd1bWVudCAoaW5zdGVhZCBvZiBmb3JjaW5nIGl0IHRvIGJlIHRha2VuIGZyb20gJEFXU19QUk9GSUxFKS5cbiAgICogICAgVGhpcyByZXF1aXJlcyBoYXZpbmcgbWFkZSBhIGNvcHkgb2YgdGhlIFNESydzIGBTaGFyZWRJbmlGaWxlYCAodGhlIG9yaWdpbmFsXG4gICAqICAgIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnQpLlxuICAgKiAyLiAkQVdTX0RFRkFVTFRfUFJPRklMRSBhbmQgJEFXU19ERUZBVUxUX1JFR0lPTiBhcmUgYWxzbyByZXNwZWN0ZWQuXG4gICAqXG4gICAqIExhbWJkYSBhbmQgQ29kZUJ1aWxkIHNldCB0aGUgJEFXU19SRUdJT04gdmFyaWFibGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIHJlZ2lvbihvcHRpb25zOiBSZWdpb25PcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHByb2ZpbGUgPSBvcHRpb25zLnByb2ZpbGUgfHwgcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUgfHwgcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUFJPRklMRSB8fCAnZGVmYXVsdCc7XG5cbiAgICAvLyBEZWZhdWx0cyBpbnNpZGUgY29uc3RydWN0b3JcbiAgICBjb25zdCB0b0NoZWNrID0gW1xuICAgICAgeyBmaWxlbmFtZTogY3JlZGVudGlhbHNGaWxlTmFtZSgpLCBwcm9maWxlIH0sXG4gICAgICB7IGlzQ29uZmlnOiB0cnVlLCBmaWxlbmFtZTogY29uZmlnRmlsZU5hbWUoKSwgcHJvZmlsZSB9LFxuICAgICAgeyBpc0NvbmZpZzogdHJ1ZSwgZmlsZW5hbWU6IGNvbmZpZ0ZpbGVOYW1lKCksIHByb2ZpbGU6ICdkZWZhdWx0JyB9LFxuICAgIF07XG5cbiAgICBsZXQgcmVnaW9uID0gcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCBwcm9jZXNzLmVudi5BTUFaT05fUkVHSU9OIHx8XG4gICAgICBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT04gfHwgcHJvY2Vzcy5lbnYuQU1BWk9OX0RFRkFVTFRfUkVHSU9OO1xuXG4gICAgd2hpbGUgKCFyZWdpb24gJiYgdG9DaGVjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvcHRzID0gdG9DaGVjay5zaGlmdCgpITtcbiAgICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKG9wdHMuZmlsZW5hbWUpKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ0ZpbGUgPSBuZXcgU2hhcmVkSW5pRmlsZShvcHRzKTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGF3YWl0IGNvbmZpZ0ZpbGUuZ2V0UHJvZmlsZShvcHRzLnByb2ZpbGUpO1xuICAgICAgICByZWdpb24gPSBzZWN0aW9uPy5yZWdpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZWdpb24gJiYgKG9wdGlvbnMuZWMyaW5zdGFuY2UgPz8gYXdhaXQgaXNFYzJJbnN0YW5jZSgpKSkge1xuICAgICAgZGVidWcoJ0xvb2tpbmcgdXAgQVdTIHJlZ2lvbiBpbiB0aGUgRUMyIEluc3RhbmNlIE1ldGFkYXRhIFNlcnZpY2UgKElNRFMpLicpO1xuICAgICAgY29uc3QgaW1kc09wdGlvbnMgPSB7XG4gICAgICAgIGh0dHBPcHRpb25zOiB7IHRpbWVvdXQ6IDEwMDAsIGNvbm5lY3RUaW1lb3V0OiAxMDAwIH0sIG1heFJldHJpZXM6IDIsXG4gICAgICB9O1xuICAgICAgY29uc3QgbWV0YWRhdGFTZXJ2aWNlID0gbmV3IEFXUy5NZXRhZGF0YVNlcnZpY2UoaW1kc09wdGlvbnMpO1xuXG4gICAgICBsZXQgdG9rZW47XG4gICAgICB0cnkge1xuICAgICAgICB0b2tlbiA9IGF3YWl0IGdldEltZHNWMlRva2VuKG1ldGFkYXRhU2VydmljZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRlYnVnKGBObyBJTURTdjIgdG9rZW46ICR7ZX1gKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVnaW9uID0gYXdhaXQgZ2V0UmVnaW9uRnJvbUltZHMobWV0YWRhdGFTZXJ2aWNlLCB0b2tlbik7XG4gICAgICAgIGRlYnVnKGBBV1MgcmVnaW9uIGZyb20gSU1EUzogJHtyZWdpb259YCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRlYnVnKGBVbmFibGUgdG8gcmV0cmlldmUgQVdTIHJlZ2lvbiBmcm9tIElNRFM6ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXJlZ2lvbikge1xuICAgICAgY29uc3QgdXNlZFByb2ZpbGUgPSAhcHJvZmlsZSA/ICcnIDogYCAocHJvZmlsZTogXCIke3Byb2ZpbGV9XCIpYDtcbiAgICAgIHJlZ2lvbiA9ICd1cy1lYXN0LTEnOyAvLyBUaGlzIGlzIHdoYXQgdGhlIEFXUyBDTEkgZG9lc1xuICAgICAgZGVidWcoYFVuYWJsZSB0byBkZXRlcm1pbmUgQVdTIHJlZ2lvbiBmcm9tIGVudmlyb25tZW50IG9yIEFXUyBjb25maWd1cmF0aW9uJHt1c2VkUHJvZmlsZX0sIGRlZmF1bHRpbmcgdG8gJyR7cmVnaW9ufSdgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVnaW9uO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgaXQgbG9va3MgbGlrZSB3ZSdsbCBoYXZlIEVDUyBjcmVkZW50aWFscyBhdmFpbGFibGVcbiAqL1xuZnVuY3Rpb24gaGFzRWNzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gIHJldHVybiAoQVdTLkVDU0NyZWRlbnRpYWxzLnByb3RvdHlwZSBhcyBhbnkpLmlzQ29uZmlndXJlZEZvckVjc0NyZWRlbnRpYWxzKCk7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgaXQgbG9va3MgbGlrZSB3ZSdsbCBoYXZlIFdlYklkZW50aXR5Q3JlZGVudGlhbHMgKHRoYXQncyB3aGF0IEVLUyB1c2VzKSBhdmFpbGFibGVcbiAqIE5vIGNoZWNrIGxpa2UgaGFzRWNzQ3JlZGVudGlhbHMgYXZhaWxhYmxlLCBzbyBoYXZlIHRvIGltcGxlbWVudCBvdXIgb3duLlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1zZGstanMvYmxvYi8zY2NmZDk0ZGEwNzIzNGFlODcwMzdmNTVjMTM4MzkyZjM4YjY4ODFkL2xpYi9jcmVkZW50aWFscy90b2tlbl9maWxlX3dlYl9pZGVudGl0eV9jcmVkZW50aWFscy5qcyNMNTlcbiAqL1xuZnVuY3Rpb24gaGFzV2ViSWRlbnRpdHlDcmVkZW50aWFscygpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4ocHJvY2Vzcy5lbnYuQVdTX1JPTEVfQVJOICYmIHByb2Nlc3MuZW52LkFXU19XRUJfSURFTlRJVFlfVE9LRU5fRklMRSk7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgd2UncmUgb24gYW4gRUMyIGluc3RhbmNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzRWMySW5zdGFuY2UoKSB7XG4gIGlmIChpc0VjMkluc3RhbmNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgIGRlYnVnKFwiRGV0ZXJtaW5pbmcgaWYgd2UncmUgb24gYW4gRUMyIGluc3RhbmNlLlwiKTtcbiAgICBsZXQgaW5zdGFuY2UgPSBmYWxzZTtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvV2luZG93c0d1aWRlL2lkZW50aWZ5X2VjMl9pbnN0YW5jZXMuaHRtbFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXRpbC5wcm9taXNpZnkoY2hpbGRfcHJvY2Vzcy5leGVjKSgnd21pYyBwYXRoIHdpbjMyX2NvbXB1dGVyc3lzdGVtcHJvZHVjdCBnZXQgdXVpZCcsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICAgIC8vIG91dHB1dCBsb29rcyBsaWtlXG4gICAgICAgIC8vICBVVUlEXG4gICAgICAgIC8vICBFQzJBRTE0NS1EMURDLTEzQjItOTRFRC0wMTIzNEFCQ0RFRlxuICAgICAgICBjb25zdCBsaW5lcyA9IHJlc3VsdC5zdGRvdXQudG9TdHJpbmcoKS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGluc3RhbmNlID0gbGluZXMuc29tZSh4ID0+IG1hdGNoZXNSZWdleCgvXmVjMi9pLCB4KSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIE1vZGVybiBtYWNoaW5lcyBtYXkgbm90IGhhdmUgd21pYy5leGUgaW5zdGFsbGVkLiBObyByZWFzb24gdG8gZmFpbCwganVzdCBhc3N1bWUgaXQncyBub3QgYW4gRUMyIGluc3RhbmNlLlxuICAgICAgICBkZWJ1ZyhgQ2hlY2tpbmcgdXNpbmcgV01JQyBmYWlsZWQsIGFzc3VtaW5nIE5PVCBhbiBFQzIgaW5zdGFuY2U6ICR7ZS5tZXNzYWdlfSAocGFzcyAtLWVjMmNyZWRzIHRvIGZvcmNlKWApO1xuICAgICAgICBpbnN0YW5jZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWRlbnRpZnlfZWMyX2luc3RhbmNlcy5odG1sXG4gICAgICBjb25zdCBmaWxlczogQXJyYXk8W3N0cmluZywgUmVnRXhwXT4gPSBbXG4gICAgICAgIC8vIFRoaXMgcmVjb2duaXplcyB0aGUgWGVuIGh5cGVydmlzb3IgYmFzZWQgaW5zdGFuY2VzIChwcmUtNXRoIGdlbilcbiAgICAgICAgWycvc3lzL2h5cGVydmlzb3IvdXVpZCcsIC9eZWMyL2ldLFxuXG4gICAgICAgIC8vIFRoaXMgcmVjb2duaXplcyB0aGUgbmV3IEh5cGVydmlzb3IgKDV0aC1nZW4gaW5zdGFuY2VzIGFuZCBoaWdoZXIpXG4gICAgICAgIC8vIENhbid0IHVzZSB0aGUgYWR2ZXJ0aXNlZCBmaWxlICcvc3lzL2RldmljZXMvdmlydHVhbC9kbWkvaWQvcHJvZHVjdF91dWlkJyBiZWNhdXNlIGl0IHJlcXVpcmVzIHJvb3QgdG8gcmVhZC5cbiAgICAgICAgLy8gSW5zdGVhZCwgc3lzX3ZlbmRvciBjb250YWlucyBzb21ldGhpbmcgbGlrZSAnQW1hem9uIEVDMicuXG4gICAgICAgIFsnL3N5cy9kZXZpY2VzL3ZpcnR1YWwvZG1pL2lkL3N5c192ZW5kb3InLCAvZWMyL2ldLFxuICAgICAgXTtcbiAgICAgIGZvciAoY29uc3QgW2ZpbGUsIHJlXSBvZiBmaWxlcykge1xuICAgICAgICBpZiAobWF0Y2hlc1JlZ2V4KHJlLCByZWFkSWZQb3NzaWJsZShmaWxlKSkpIHtcbiAgICAgICAgICBpbnN0YW5jZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZGVidWcoaW5zdGFuY2UgPyAnTG9va3MgbGlrZSBhbiBFQzIgaW5zdGFuY2UuJyA6ICdEb2VzIG5vdCBsb29rIGxpa2UgYW4gRUMyIGluc3RhbmNlLicpO1xuICAgIGlzRWMySW5zdGFuY2VDYWNoZSA9IGluc3RhbmNlO1xuICB9XG4gIHJldHVybiBpc0VjMkluc3RhbmNlQ2FjaGU7XG59XG5cblxubGV0IGlzRWMySW5zdGFuY2VDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBdHRlbXB0cyB0byBnZXQgYSBJbnN0YW5jZSBNZXRhZGF0YSBTZXJ2aWNlIFYyIHRva2VuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEltZHNWMlRva2VuKG1ldGFkYXRhU2VydmljZTogQVdTLk1ldGFkYXRhU2VydmljZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGRlYnVnKCdBdHRlbXB0aW5nIHRvIHJldHJpZXZlIGFuIElNRFN2MiB0b2tlbi4nKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBtZXRhZGF0YVNlcnZpY2UucmVxdWVzdChcbiAgICAgICcvbGF0ZXN0L2FwaS90b2tlbicsXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ3gtYXdzLWVjMi1tZXRhZGF0YS10b2tlbi10dGwtc2Vjb25kcyc6ICc2MCcgfSxcbiAgICAgIH0sXG4gICAgICAoZXJyOiBBV1MuQVdTRXJyb3IsIHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0b2tlbikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0lNRFMgZGlkIG5vdCByZXR1cm4gYSB0b2tlbi4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBnZXQgdGhlIHJlZ2lvbiBmcm9tIHRoZSBJbnN0YW5jZSBNZXRhZGF0YSBTZXJ2aWNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFJlZ2lvbkZyb21JbWRzKG1ldGFkYXRhU2VydmljZTogQVdTLk1ldGFkYXRhU2VydmljZSwgdG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGRlYnVnKCdSZXRyaWV2aW5nIHRoZSBBV1MgcmVnaW9uIGZyb20gdGhlIElNRFMuJyk7XG4gIGxldCBvcHRpb25zOiB7IG1ldGhvZD86IHN0cmluZyB8IHVuZGVmaW5lZDsgaGVhZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgdW5kZWZpbmVkOyB9ID0ge307XG4gIGlmICh0b2tlbikge1xuICAgIG9wdGlvbnMgPSB7IGhlYWRlcnM6IHsgJ3gtYXdzLWVjMi1tZXRhZGF0YS10b2tlbic6IHRva2VuIH0gfTtcbiAgfVxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIG1ldGFkYXRhU2VydmljZS5yZXF1ZXN0KFxuICAgICAgJy9sYXRlc3QvZHluYW1pYy9pbnN0YW5jZS1pZGVudGl0eS9kb2N1bWVudCcsXG4gICAgICBvcHRpb25zLFxuICAgICAgKGVycjogQVdTLkFXU0Vycm9yLCBpbnN0YW5jZUlkZW50aXR5RG9jdW1lbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSBpZiAoIWluc3RhbmNlSWRlbnRpdHlEb2N1bWVudCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0lNRFMgZGlkIG5vdCByZXR1cm4gYW4gSW5zdGFuY2UgSWRlbnRpdHkgRG9jdW1lbnQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlKEpTT04ucGFyc2UoaW5zdGFuY2VJZGVudGl0eURvY3VtZW50KS5yZWdpb24pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaG9tZURpcigpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkhPTUUgfHwgcHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEVcbiAgICB8fCAocHJvY2Vzcy5lbnYuSE9NRVBBVEggPyAoKHByb2Nlc3MuZW52LkhPTUVEUklWRSB8fCAnQzovJykgKyBwcm9jZXNzLmVudi5IT01FUEFUSCkgOiBudWxsKSB8fCBvcy5ob21lZGlyKCk7XG59XG5cbmZ1bmN0aW9uIGNyZWRlbnRpYWxzRmlsZU5hbWUoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5BV1NfU0hBUkVEX0NSRURFTlRJQUxTX0ZJTEUgfHwgcGF0aC5qb2luKGhvbWVEaXIoKSwgJy5hd3MnLCAnY3JlZGVudGlhbHMnKTtcbn1cblxuZnVuY3Rpb24gY29uZmlnRmlsZU5hbWUoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5BV1NfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKGhvbWVEaXIoKSwgJy5hd3MnLCAnY29uZmlnJyk7XG59XG5cbi8qKlxuICogRm9yY2UgdGhlIEpTIFNESyB0byBob25vciB0aGUgfi8uYXdzL2NvbmZpZyBmaWxlIChhbmQgdmFyaW91cyBzZXR0aW5ncyB0aGVyZWluKVxuICpcbiAqIEZvciBleGFtcGxlLCB0aGVyZSBpcyBqdXN0ICpOTyogd2F5IHRvIGRvIEFzc3VtZVJvbGUgY3JlZGVudGlhbHMgYXMgbG9uZyBhcyBBV1NfU0RLX0xPQURfQ09ORklHIGlzIG5vdCBzZXQsXG4gKiBvciByZWFkIGNyZWRlbnRpYWxzIGZyb20gdGhhdCBmaWxlLlxuICpcbiAqIFRoZSBTREsgY3Jhc2hlcyBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGJ1dCB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgc28gY29uZGl0aW9uYWxseSBzZXQgaXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZvcmNlU2RrVG9SZWFkQ29uZmlnSWZQcmVzZW50KCkge1xuICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhjb25maWdGaWxlTmFtZSgpKSkge1xuICAgIHByb2Nlc3MuZW52LkFXU19TREtfTE9BRF9DT05GSUcgPSAnMSc7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF0Y2hlc1JlZ2V4KHJlOiBSZWdFeHAsIHM6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICByZXR1cm4gcyAhPT0gdW5kZWZpbmVkICYmIHJlLmV4ZWMocykgIT09IG51bGw7XG59XG5cbi8qKlxuICogUmVhZCBhIGZpbGUgaWYgaXQgZXhpc3RzLCBvciByZXR1cm4gdW5kZWZpbmVkXG4gKlxuICogTm90IGFzeW5jIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiB0aGUgY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gcmVhZElmUG9zc2libGUoZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5wYXRoRXhpc3RzU3luYyhmaWxlbmFtZSkpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkZWJ1ZyhlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGVudGlhbENoYWluT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVjMmluc3RhbmNlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY29udGFpbmVyQ3JlZHM/OiBib29sZWFuO1xuICByZWFkb25seSBodHRwT3B0aW9ucz86IEFXUy5IVFRQT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpb25PcHRpb25zIHtcbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZWMyaW5zdGFuY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFzayB1c2VyIGZvciBNRkEgdG9rZW4gZm9yIGdpdmVuIHNlcmlhbFxuICpcbiAqIFJlc3VsdCBpcyBzZW5kIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBTREsgdG8gYXV0aG9yaXplIHRoZSByZXF1ZXN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRva2VuQ29kZUZuKHNlcmlhbEFybjogc3RyaW5nLCBjYjogKGVycj86IEVycm9yLCB0b2tlbj86IHN0cmluZykgPT4gdm9pZCk6IFByb21pc2U8dm9pZD4ge1xuICBkZWJ1ZygnUmVxdWlyZSBNRkEgdG9rZW4gZm9yIHNlcmlhbCBBUk4nLCBzZXJpYWxBcm4pO1xuICB0cnkge1xuICAgIGNvbnN0IHRva2VuOiBzdHJpbmcgPSBhd2FpdCBwcm9tcHRseS5wcm9tcHQoYE1GQSB0b2tlbiBmb3IgJHtzZXJpYWxBcm59OiBgLCB7XG4gICAgICB0cmltOiB0cnVlLFxuICAgICAgZGVmYXVsdDogJycsXG4gICAgfSk7XG4gICAgZGVidWcoJ1N1Y2Nlc3NmdWxseSBnb3QgTUZBIHRva2VuIGZyb20gdXNlcicpO1xuICAgIGNiKHVuZGVmaW5lZCwgdG9rZW4pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWJ1ZygnRmFpbGVkIHRvIGdldCBNRkEgdG9rZW4nLCBlcnIpO1xuICAgIGNiKGVycik7XG4gIH1cbn1cblxuIl19
317
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzY2xpLWNvbXBhdGlibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhd3NjbGktY29tcGF0aWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FBK0M7QUFDL0MseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQixxQ0FBcUM7QUFDckMsaUNBQStCO0FBQy9CLHVEQUFvRTtBQUNwRSxpREFBK0M7QUFFL0M7Ozs7Ozs7R0FPRztBQUNILE1BQWEsZ0JBQWdCO0lBQzNCOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFrQyxFQUFFO1FBQ3RFLDBFQUEwRTtRQUMxRSx3QkFBd0I7UUFDeEIsTUFBTSw2QkFBNkIsRUFBRSxDQUFDO1FBRXRDLCtFQUErRTtRQUMvRSw2RUFBNkU7UUFDN0Usa0ZBQWtGO1FBQ2xGLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNuQixPQUFPLElBQUksR0FBRyxDQUFDLHVCQUF1QixDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ3JGO1FBRUQsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsSUFBSSxTQUFTLENBQUM7UUFFaEcsTUFBTSxPQUFPLEdBQUc7WUFDZCxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7WUFDM0MsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDO1lBQzlDLEdBQUcsMEJBQTBCLENBQUMsZUFBZSxDQUFDO1NBQy9DLENBQUM7UUFFRixJQUFJLE9BQU8sQ0FBQyxjQUFjLElBQUksaUJBQWlCLEVBQUUsRUFBRTtZQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDOUM7YUFBTSxJQUFJLHlCQUF5QixFQUFFLEVBQUU7WUFDdEMsbUZBQW1GO1lBQ25GLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsK0JBQStCLEVBQUUsQ0FBQyxDQUFDO1NBQy9EO2FBQU0sSUFBSSxPQUFPLENBQUMsV0FBVyxJQUFJLE1BQU0sYUFBYSxFQUFFLEVBQUU7WUFDdkQseUVBQXlFO1lBQ3pFLDJGQUEyRjtZQUMzRixrQ0FBa0M7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7U0FDdEQ7UUFFRCxPQUFPLElBQUksR0FBRyxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWhELFNBQVMsa0JBQWtCLENBQUMsV0FBbUI7WUFDN0MsT0FBTyxJQUFJLGlEQUErQixDQUFDO2dCQUN6QyxPQUFPLEVBQUUsV0FBVztnQkFDcEIsUUFBUSxFQUFFLG1CQUFtQixFQUFFO2dCQUMvQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7Z0JBQ2hDLFdBQVc7YUFDWixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsU0FBUywwQkFBMEIsQ0FBQyxVQUFrQjtZQUNwRCxPQUFPO2dCQUNMLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztnQkFDcEMsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO2dCQUNyRCxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQzthQUMxRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUF5QixFQUFFO1FBQ3BELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsSUFBSSxTQUFTLENBQUM7UUFFM0csOEJBQThCO1FBQzlCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUU7WUFDNUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUU7WUFDdkQsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFO1NBQ25FLENBQUM7UUFFRixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWE7WUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBRXRFLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRyxDQUFDO1lBQzlCLElBQUksTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSw0QkFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLEdBQUcsT0FBTyxFQUFFLE1BQU0sQ0FBQzthQUMxQjtTQUNGO1FBRUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksTUFBTSxhQUFhLEVBQUUsQ0FBQyxFQUFFO1lBQzdELFlBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1lBQzVFLE1BQU0sV0FBVyxHQUFHO2dCQUNsQixXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQzthQUNwRSxDQUFDO1lBQ0YsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTdELElBQUksS0FBSyxDQUFDO1lBQ1YsSUFBSTtnQkFDRixLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDL0M7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixZQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDaEM7WUFFRCxJQUFJO2dCQUNGLE1BQU0sR0FBRyxNQUFNLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDekQsWUFBSyxDQUFDLHlCQUF5QixNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQzFDO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsWUFBSyxDQUFDLDRDQUE0QyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3hEO1NBQ0Y7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxPQUFPLElBQUksQ0FBQztZQUMvRCxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsZ0NBQWdDO1lBQ3RELFlBQUssQ0FBQyx1RUFBdUUsV0FBVyxvQkFBb0IsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUN4SDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQXBJRCw0Q0FvSUM7QUFFRDs7R0FFRztBQUNILFNBQVMsaUJBQWlCO0lBQ3hCLE9BQVEsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFpQixDQUFDLDZCQUE2QixFQUFFLENBQUM7QUFDL0UsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHlCQUF5QjtJQUNoQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUM7QUFDdEYsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLGFBQWE7SUFDMUIsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUU7UUFDcEMsWUFBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUU7WUFDaEMscUZBQXFGO1lBQ3JGLElBQUk7Z0JBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnREFBZ0QsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNqSSxvQkFBb0I7Z0JBQ3BCLFFBQVE7Z0JBQ1IsdUNBQXVDO2dCQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkQsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEQ7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDViw0R0FBNEc7Z0JBQzVHLFlBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDLE9BQU8sNkJBQTZCLENBQUMsQ0FBQztnQkFDM0csUUFBUSxHQUFHLEtBQUssQ0FBQzthQUNsQjtTQUNGO2FBQU07WUFDTCxrRkFBa0Y7WUFDbEYsTUFBTSxLQUFLLEdBQTRCO2dCQUNyQyxtRUFBbUU7Z0JBQ25FLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDO2dCQUVqQyxvRUFBb0U7Z0JBQ3BFLDZHQUE2RztnQkFDN0csNERBQTREO2dCQUM1RCxDQUFDLHdDQUF3QyxFQUFFLE1BQU0sQ0FBQzthQUNuRCxDQUFDO1lBQ0YsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRTtnQkFDOUIsSUFBSSxZQUFZLENBQUMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO29CQUMxQyxRQUFRLEdBQUcsSUFBSSxDQUFDO29CQUNoQixNQUFNO2lCQUNQO2FBQ0Y7U0FDRjtRQUNELFlBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3hGLGtCQUFrQixHQUFHLFFBQVEsQ0FBQztLQUMvQjtJQUNELE9BQU8sa0JBQWtCLENBQUM7QUFDNUIsQ0FBQztBQUdELElBQUksa0JBQWtCLEdBQXdCLFNBQVMsQ0FBQztBQUV4RDs7R0FFRztBQUNILEtBQUssVUFBVSxjQUFjLENBQUMsZUFBb0M7SUFDaEUsWUFBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDakQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxlQUFlLENBQUMsT0FBTyxDQUNyQixtQkFBbUIsRUFDbkI7WUFDRSxNQUFNLEVBQUUsS0FBSztZQUNiLE9BQU8sRUFBRSxFQUFFLHNDQUFzQyxFQUFFLElBQUksRUFBRTtTQUMxRCxFQUNELENBQUMsR0FBaUIsRUFBRSxLQUF5QixFQUFFLEVBQUU7WUFDL0MsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2I7aUJBQU0sSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDakIsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQzthQUNuRDtpQkFBTTtnQkFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDaEI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLGlCQUFpQixDQUFDLGVBQW9DLEVBQUUsS0FBeUI7SUFDOUYsWUFBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxPQUFPLEdBQXVGLEVBQUUsQ0FBQztJQUNyRyxJQUFJLEtBQUssRUFBRTtRQUNULE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLDBCQUEwQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7S0FDOUQ7SUFDRCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLGVBQWUsQ0FBQyxPQUFPLENBQ3JCLDRDQUE0QyxFQUM1QyxPQUFPLEVBQ1AsQ0FBQyxHQUFpQixFQUFFLHdCQUE0QyxFQUFFLEVBQUU7WUFDbEUsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2I7aUJBQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFO2dCQUNwQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQyxDQUFDO2FBQ3pFO2lCQUFNO2dCQUNMLElBQUk7b0JBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDdEQ7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNYO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsT0FBTztJQUNkLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXO1dBQzdDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDakgsQ0FBQztBQUVELFNBQVMsbUJBQW1CO0lBQzFCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztBQUNoRyxDQUFDO0FBRUQsU0FBUyxjQUFjO0lBQ3JCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxLQUFLLFVBQVUsNkJBQTZCO0lBQzFDLElBQUksTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUU7UUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUM7S0FDdkM7QUFDSCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsRUFBVSxFQUFFLENBQXFCO0lBQ3JELE9BQU8sQ0FBQyxLQUFLLFNBQVMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNoRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLFFBQWdCO0lBQ3RDLElBQUk7UUFDRixJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUFFLE9BQU8sU0FBUyxDQUFDO1NBQUU7UUFDdkQsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0tBQ3pEO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixZQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVCxPQUFPLFNBQVMsQ0FBQztLQUNsQjtBQUNILENBQUM7QUFjRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLFdBQVcsQ0FBQyxTQUFpQixFQUFFLEVBQXlDO0lBQ3JGLFlBQUssQ0FBQyxrQ0FBa0MsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyRCxJQUFJO1FBQ0YsTUFBTSxLQUFLLEdBQVcsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLGlCQUFpQixTQUFTLElBQUksRUFBRTtZQUMxRSxJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsWUFBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUN0QjtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osWUFBSyxDQUFDLHlCQUF5QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNUO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHByb21wdGx5IGZyb20gJ3Byb21wdGx5JztcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi9fZW52JztcbmltcG9ydCB7IFBhdGNoZWRTaGFyZWRJbmlGaWxlQ3JlZGVudGlhbHMgfSBmcm9tICcuL2F3cy1zZGstaW5pZmlsZSc7XG5pbXBvcnQgeyBTaGFyZWRJbmlGaWxlIH0gZnJvbSAnLi9zZGtfaW5pX2ZpbGUnO1xuXG4vKipcbiAqIEJlaGF2aW9ycyB0byBtYXRjaCBBV1MgQ0xJXG4gKlxuICogU2VlIHRoZXNlIGxpbmtzOlxuICpcbiAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGkvbGF0ZXN0L3RvcGljL2NvbmZpZy12YXJzLmh0bWxcbiAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jbGkvbGF0ZXN0L3VzZXJndWlkZS9jbGktY29uZmlndXJlLWVudnZhcnMuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgQXdzQ2xpQ29tcGF0aWJsZSB7XG4gIC8qKlxuICAgKiBCdWlsZCBhbiBBV1MgQ0xJLWNvbXBhdGlibGUgY3JlZGVudGlhbCBjaGFpbiBwcm92aWRlclxuICAgKlxuICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGRlZmF1bHQgY3JlZGVudGlhbCBwcm92aWRlciBjaGFpbiBjcmVhdGVkIGJ5IHRoZSBTREtcbiAgICogZXhjZXB0OlxuICAgKlxuICAgKiAxLiBBY2NlcHRzIHByb2ZpbGUgYXJndW1lbnQgaW4gdGhlIGNvbnN0cnVjdG9yICh0aGUgU0RLIG11c3QgaGF2ZSBpdCBwcmVwb3B1bGF0ZWRcbiAgICogICAgaW4gdGhlIGVudmlyb25tZW50KS5cbiAgICogMi4gQ29uZGl0aW9uYWxseSBjaGVja3MgRUMyIGNyZWRlbnRpYWxzLCBiZWNhdXNlIGNoZWNraW5nIGZvciBFQzJcbiAgICogICAgY3JlZGVudGlhbHMgb24gYSBub24tRUMyIG1hY2hpbmUgbWF5IGxlYWQgdG8gbG9uZyBkZWxheXMgKGluIHRoZSBiZXN0IGNhc2UpXG4gICAqICAgIG9yIGFuIGV4Y2VwdGlvbiAoaW4gdGhlIHdvcnN0IGNhc2UpLlxuICAgKiAzLiBSZXNwZWN0cyAkQVdTX1NIQVJFRF9DUkVERU5USUFMU19GSUxFLlxuICAgKiA0LiBSZXNwZWN0cyAkQVdTX0RFRkFVTFRfUFJPRklMRSBpbiBhZGRpdGlvbiB0byAkQVdTX1BST0ZJTEUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWRlbnRpYWxDaGFpbihvcHRpb25zOiBDcmVkZW50aWFsQ2hhaW5PcHRpb25zID0ge30pIHtcbiAgICAvLyBGb3JjZSByZWFkaW5nIHRoZSBgY29uZmlnYCBmaWxlIGlmIGl0IGV4aXN0cyBieSBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZVxuICAgIC8vIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgIGF3YWl0IGZvcmNlU2RrVG9SZWFkQ29uZmlnSWZQcmVzZW50KCk7XG5cbiAgICAvLyBUbyBtYXRjaCBBV1MgQ0xJIGJlaGF2aW9yLCBpZiBhIHByb2ZpbGUgaXMgZXhwbGljaXRseSBnaXZlbiB1c2luZyAtLXByb2ZpbGUsXG4gICAgLy8gd2UgdXNlIHRoYXQgdG8gdGhlIGV4Y2x1c2lvbiBvZiBldmVyeXRoaW5nIGVsc2UgKG5vdGU6IHRoaXMgZG9lcyBub3QgYXBwbHlcbiAgICAvLyB0byBBV1NfUFJPRklMRSwgZW52aXJvbm1lbnQgY3JlZGVudGlhbHMgc3RpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgQVdTX1BST0ZJTEUpXG4gICAgaWYgKG9wdGlvbnMucHJvZmlsZSkge1xuICAgICAgcmV0dXJuIG5ldyBBV1MuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4oaW5pRmlsZUNyZWRlbnRpYWxGYWN0b3JpZXMob3B0aW9ucy5wcm9maWxlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wbGljaXRQcm9maWxlID0gcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUgfHwgcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUFJPRklMRSB8fCAnZGVmYXVsdCc7XG5cbiAgICBjb25zdCBzb3VyY2VzID0gW1xuICAgICAgKCkgPT4gbmV3IEFXUy5FbnZpcm9ubWVudENyZWRlbnRpYWxzKCdBV1MnKSxcbiAgICAgICgpID0+IG5ldyBBV1MuRW52aXJvbm1lbnRDcmVkZW50aWFscygnQU1BWk9OJyksXG4gICAgICAuLi5pbmlGaWxlQ3JlZGVudGlhbEZhY3RvcmllcyhpbXBsaWNpdFByb2ZpbGUpLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy5jb250YWluZXJDcmVkcyA/PyBoYXNFY3NDcmVkZW50aWFscygpKSB7XG4gICAgICBzb3VyY2VzLnB1c2goKCkgPT4gbmV3IEFXUy5FQ1NDcmVkZW50aWFscygpKTtcbiAgICB9IGVsc2UgaWYgKGhhc1dlYklkZW50aXR5Q3JlZGVudGlhbHMoKSkge1xuICAgICAgLy8gZWxzZSBpZjogd2UgaGF2ZSBmb3VuZCBXZWJJZGVudGl0eUNyZWRlbnRpYWxzIGFzIHByb3ZpZGVkIGJ5IEVLUyBTZXJ2aWNlQWNjb3VudHNcbiAgICAgIHNvdXJjZXMucHVzaCgoKSA9PiBuZXcgQVdTLlRva2VuRmlsZVdlYklkZW50aXR5Q3JlZGVudGlhbHMoKSk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmVjMmluc3RhbmNlID8/IGF3YWl0IGlzRWMySW5zdGFuY2UoKSkge1xuICAgICAgLy8gZWxzZSBpZjogZG9uJ3QgZ2V0IEVDMiBjcmVkcyBpZiB3ZSBzaG91bGQgaGF2ZSBnb3R0ZW4gRUNTIG9yIEVLUyBjcmVkc1xuICAgICAgLy8gRUNTIGFuZCBFS1MgaW5zdGFuY2VzIGFsc28gcnVuIG9uIEVDMiBib3hlcyBidXQgdGhlIGNyZWRzIHJlcHJlc2VudCBzb21ldGhpbmcgZGlmZmVyZW50LlxuICAgICAgLy8gU2FtZSBiZWhhdmlvciBhcyB1cHN0cmVhbSBjb2RlLlxuICAgICAgc291cmNlcy5wdXNoKCgpID0+IG5ldyBBV1MuRUMyTWV0YWRhdGFDcmVkZW50aWFscygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFXUy5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbihzb3VyY2VzKTtcblxuICAgIGZ1bmN0aW9uIHByb2ZpbGVDcmVkZW50aWFscyhwcm9maWxlTmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gbmV3IFBhdGNoZWRTaGFyZWRJbmlGaWxlQ3JlZGVudGlhbHMoe1xuICAgICAgICBwcm9maWxlOiBwcm9maWxlTmFtZSxcbiAgICAgICAgZmlsZW5hbWU6IGNyZWRlbnRpYWxzRmlsZU5hbWUoKSxcbiAgICAgICAgaHR0cE9wdGlvbnM6IG9wdGlvbnMuaHR0cE9wdGlvbnMsXG4gICAgICAgIHRva2VuQ29kZUZuLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5pRmlsZUNyZWRlbnRpYWxGYWN0b3JpZXModGhlUHJvZmlsZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICAoKSA9PiBwcm9maWxlQ3JlZGVudGlhbHModGhlUHJvZmlsZSksXG4gICAgICAgICgpID0+IG5ldyBBV1MuU3NvQ3JlZGVudGlhbHMoeyBwcm9maWxlOiB0aGVQcm9maWxlIH0pLFxuICAgICAgICAoKSA9PiBuZXcgQVdTLlByb2Nlc3NDcmVkZW50aWFscyh7IHByb2ZpbGU6IHRoZVByb2ZpbGUgfSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgcmVnaW9uIGluIGEgQ0xJLWNvbXBhdGlibGUgd2F5XG4gICAqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBub2RlX2xvYWRlci5qcywgYnV0IHdpdGggdGhlIGZvbGxvd2luZyBkaWZmZXJlbmNlcyB0byBtYWtlIGl0XG4gICAqIEFXUyBDTEkgY29tcGF0aWJsZTpcbiAgICpcbiAgICogMS4gVGFrZXMgYSBwcm9maWxlIG5hbWUgYXMgYW4gYXJndW1lbnQgKGluc3RlYWQgb2YgZm9yY2luZyBpdCB0byBiZSB0YWtlbiBmcm9tICRBV1NfUFJPRklMRSkuXG4gICAqICAgIFRoaXMgcmVxdWlyZXMgaGF2aW5nIG1hZGUgYSBjb3B5IG9mIHRoZSBTREsncyBgU2hhcmVkSW5pRmlsZWAgKHRoZSBvcmlnaW5hbFxuICAgKiAgICBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50KS5cbiAgICogMi4gJEFXU19ERUZBVUxUX1BST0ZJTEUgYW5kICRBV1NfREVGQVVMVF9SRUdJT04gYXJlIGFsc28gcmVzcGVjdGVkLlxuICAgKlxuICAgKiBMYW1iZGEgYW5kIENvZGVCdWlsZCBzZXQgdGhlICRBV1NfUkVHSU9OIHZhcmlhYmxlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyByZWdpb24ob3B0aW9uczogUmVnaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwcm9maWxlID0gb3B0aW9ucy5wcm9maWxlIHx8IHByb2Nlc3MuZW52LkFXU19QUk9GSUxFIHx8IHByb2Nlc3MuZW52LkFXU19ERUZBVUxUX1BST0ZJTEUgfHwgJ2RlZmF1bHQnO1xuXG4gICAgLy8gRGVmYXVsdHMgaW5zaWRlIGNvbnN0cnVjdG9yXG4gICAgY29uc3QgdG9DaGVjayA9IFtcbiAgICAgIHsgZmlsZW5hbWU6IGNyZWRlbnRpYWxzRmlsZU5hbWUoKSwgcHJvZmlsZSB9LFxuICAgICAgeyBpc0NvbmZpZzogdHJ1ZSwgZmlsZW5hbWU6IGNvbmZpZ0ZpbGVOYW1lKCksIHByb2ZpbGUgfSxcbiAgICAgIHsgaXNDb25maWc6IHRydWUsIGZpbGVuYW1lOiBjb25maWdGaWxlTmFtZSgpLCBwcm9maWxlOiAnZGVmYXVsdCcgfSxcbiAgICBdO1xuXG4gICAgbGV0IHJlZ2lvbiA9IHByb2Nlc3MuZW52LkFXU19SRUdJT04gfHwgcHJvY2Vzcy5lbnYuQU1BWk9OX1JFR0lPTiB8fFxuICAgICAgcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OIHx8IHByb2Nlc3MuZW52LkFNQVpPTl9ERUZBVUxUX1JFR0lPTjtcblxuICAgIHdoaWxlICghcmVnaW9uICYmIHRvQ2hlY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgb3B0cyA9IHRvQ2hlY2suc2hpZnQoKSE7XG4gICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhvcHRzLmZpbGVuYW1lKSkge1xuICAgICAgICBjb25zdCBjb25maWdGaWxlID0gbmV3IFNoYXJlZEluaUZpbGUob3B0cyk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBhd2FpdCBjb25maWdGaWxlLmdldFByb2ZpbGUob3B0cy5wcm9maWxlKTtcbiAgICAgICAgcmVnaW9uID0gc2VjdGlvbj8ucmVnaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcmVnaW9uICYmIChvcHRpb25zLmVjMmluc3RhbmNlID8/IGF3YWl0IGlzRWMySW5zdGFuY2UoKSkpIHtcbiAgICAgIGRlYnVnKCdMb29raW5nIHVwIEFXUyByZWdpb24gaW4gdGhlIEVDMiBJbnN0YW5jZSBNZXRhZGF0YSBTZXJ2aWNlIChJTURTKS4nKTtcbiAgICAgIGNvbnN0IGltZHNPcHRpb25zID0ge1xuICAgICAgICBodHRwT3B0aW9uczogeyB0aW1lb3V0OiAxMDAwLCBjb25uZWN0VGltZW91dDogMTAwMCB9LCBtYXhSZXRyaWVzOiAyLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhU2VydmljZSA9IG5ldyBBV1MuTWV0YWRhdGFTZXJ2aWNlKGltZHNPcHRpb25zKTtcblxuICAgICAgbGV0IHRva2VuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCBnZXRJbWRzVjJUb2tlbihtZXRhZGF0YVNlcnZpY2UpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkZWJ1ZyhgTm8gSU1EU3YyIHRva2VuOiAke2V9YCk7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlZ2lvbiA9IGF3YWl0IGdldFJlZ2lvbkZyb21JbWRzKG1ldGFkYXRhU2VydmljZSwgdG9rZW4pO1xuICAgICAgICBkZWJ1ZyhgQVdTIHJlZ2lvbiBmcm9tIElNRFM6ICR7cmVnaW9ufWApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkZWJ1ZyhgVW5hYmxlIHRvIHJldHJpZXZlIEFXUyByZWdpb24gZnJvbSBJTURTOiAke2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZWdpb24pIHtcbiAgICAgIGNvbnN0IHVzZWRQcm9maWxlID0gIXByb2ZpbGUgPyAnJyA6IGAgKHByb2ZpbGU6IFwiJHtwcm9maWxlfVwiKWA7XG4gICAgICByZWdpb24gPSAndXMtZWFzdC0xJzsgLy8gVGhpcyBpcyB3aGF0IHRoZSBBV1MgQ0xJIGRvZXNcbiAgICAgIGRlYnVnKGBVbmFibGUgdG8gZGV0ZXJtaW5lIEFXUyByZWdpb24gZnJvbSBlbnZpcm9ubWVudCBvciBBV1MgY29uZmlndXJhdGlvbiR7dXNlZFByb2ZpbGV9LCBkZWZhdWx0aW5nIHRvICcke3JlZ2lvbn0nYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZ2lvbjtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGl0IGxvb2tzIGxpa2Ugd2UnbGwgaGF2ZSBFQ1MgY3JlZGVudGlhbHMgYXZhaWxhYmxlXG4gKi9cbmZ1bmN0aW9uIGhhc0Vjc0NyZWRlbnRpYWxzKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKEFXUy5FQ1NDcmVkZW50aWFscy5wcm90b3R5cGUgYXMgYW55KS5pc0NvbmZpZ3VyZWRGb3JFY3NDcmVkZW50aWFscygpO1xufVxuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGl0IGxvb2tzIGxpa2Ugd2UnbGwgaGF2ZSBXZWJJZGVudGl0eUNyZWRlbnRpYWxzICh0aGF0J3Mgd2hhdCBFS1MgdXNlcykgYXZhaWxhYmxlXG4gKiBObyBjaGVjayBsaWtlIGhhc0Vjc0NyZWRlbnRpYWxzIGF2YWlsYWJsZSwgc28gaGF2ZSB0byBpbXBsZW1lbnQgb3VyIG93bi5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzL2Jsb2IvM2NjZmQ5NGRhMDcyMzRhZTg3MDM3ZjU1YzEzODM5MmYzOGI2ODgxZC9saWIvY3JlZGVudGlhbHMvdG9rZW5fZmlsZV93ZWJfaWRlbnRpdHlfY3JlZGVudGlhbHMuanMjTDU5XG4gKi9cbmZ1bmN0aW9uIGhhc1dlYklkZW50aXR5Q3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKHByb2Nlc3MuZW52LkFXU19ST0xFX0FSTiAmJiBwcm9jZXNzLmVudi5BV1NfV0VCX0lERU5USVRZX1RPS0VOX0ZJTEUpO1xufVxuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIHdlJ3JlIG9uIGFuIEVDMiBpbnN0YW5jZVxuICovXG5hc3luYyBmdW5jdGlvbiBpc0VjMkluc3RhbmNlKCkge1xuICBpZiAoaXNFYzJJbnN0YW5jZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICBkZWJ1ZyhcIkRldGVybWluaW5nIGlmIHdlJ3JlIG9uIGFuIEVDMiBpbnN0YW5jZS5cIik7XG4gICAgbGV0IGluc3RhbmNlID0gZmFsc2U7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L1dpbmRvd3NHdWlkZS9pZGVudGlmeV9lYzJfaW5zdGFuY2VzLmh0bWxcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHV0aWwucHJvbWlzaWZ5KGNoaWxkX3Byb2Nlc3MuZXhlYykoJ3dtaWMgcGF0aCB3aW4zMl9jb21wdXRlcnN5c3RlbXByb2R1Y3QgZ2V0IHV1aWQnLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgICAvLyBvdXRwdXQgbG9va3MgbGlrZVxuICAgICAgICAvLyAgVVVJRFxuICAgICAgICAvLyAgRUMyQUUxNDUtRDFEQy0xM0IyLTk0RUQtMDEyMzRBQkNERUZcbiAgICAgICAgY29uc3QgbGluZXMgPSByZXN1bHQuc3Rkb3V0LnRvU3RyaW5nKCkuc3BsaXQoJ1xcbicpO1xuICAgICAgICBpbnN0YW5jZSA9IGxpbmVzLnNvbWUoeCA9PiBtYXRjaGVzUmVnZXgoL15lYzIvaSwgeCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBNb2Rlcm4gbWFjaGluZXMgbWF5IG5vdCBoYXZlIHdtaWMuZXhlIGluc3RhbGxlZC4gTm8gcmVhc29uIHRvIGZhaWwsIGp1c3QgYXNzdW1lIGl0J3Mgbm90IGFuIEVDMiBpbnN0YW5jZS5cbiAgICAgICAgZGVidWcoYENoZWNraW5nIHVzaW5nIFdNSUMgZmFpbGVkLCBhc3N1bWluZyBOT1QgYW4gRUMyIGluc3RhbmNlOiAke2UubWVzc2FnZX0gKHBhc3MgLS1lYzJjcmVkcyB0byBmb3JjZSlgKTtcbiAgICAgICAgaW5zdGFuY2UgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2lkZW50aWZ5X2VjMl9pbnN0YW5jZXMuaHRtbFxuICAgICAgY29uc3QgZmlsZXM6IEFycmF5PFtzdHJpbmcsIFJlZ0V4cF0+ID0gW1xuICAgICAgICAvLyBUaGlzIHJlY29nbml6ZXMgdGhlIFhlbiBoeXBlcnZpc29yIGJhc2VkIGluc3RhbmNlcyAocHJlLTV0aCBnZW4pXG4gICAgICAgIFsnL3N5cy9oeXBlcnZpc29yL3V1aWQnLCAvXmVjMi9pXSxcblxuICAgICAgICAvLyBUaGlzIHJlY29nbml6ZXMgdGhlIG5ldyBIeXBlcnZpc29yICg1dGgtZ2VuIGluc3RhbmNlcyBhbmQgaGlnaGVyKVxuICAgICAgICAvLyBDYW4ndCB1c2UgdGhlIGFkdmVydGlzZWQgZmlsZSAnL3N5cy9kZXZpY2VzL3ZpcnR1YWwvZG1pL2lkL3Byb2R1Y3RfdXVpZCcgYmVjYXVzZSBpdCByZXF1aXJlcyByb290IHRvIHJlYWQuXG4gICAgICAgIC8vIEluc3RlYWQsIHN5c192ZW5kb3IgY29udGFpbnMgc29tZXRoaW5nIGxpa2UgJ0FtYXpvbiBFQzInLlxuICAgICAgICBbJy9zeXMvZGV2aWNlcy92aXJ0dWFsL2RtaS9pZC9zeXNfdmVuZG9yJywgL2VjMi9pXSxcbiAgICAgIF07XG4gICAgICBmb3IgKGNvbnN0IFtmaWxlLCByZV0gb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKG1hdGNoZXNSZWdleChyZSwgcmVhZElmUG9zc2libGUoZmlsZSkpKSB7XG4gICAgICAgICAgaW5zdGFuY2UgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGRlYnVnKGluc3RhbmNlID8gJ0xvb2tzIGxpa2UgYW4gRUMyIGluc3RhbmNlLicgOiAnRG9lcyBub3QgbG9vayBsaWtlIGFuIEVDMiBpbnN0YW5jZS4nKTtcbiAgICBpc0VjMkluc3RhbmNlQ2FjaGUgPSBpbnN0YW5jZTtcbiAgfVxuICByZXR1cm4gaXNFYzJJbnN0YW5jZUNhY2hlO1xufVxuXG5cbmxldCBpc0VjMkluc3RhbmNlQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gZ2V0IGEgSW5zdGFuY2UgTWV0YWRhdGEgU2VydmljZSBWMiB0b2tlblxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRJbWRzVjJUb2tlbihtZXRhZGF0YVNlcnZpY2U6IEFXUy5NZXRhZGF0YVNlcnZpY2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICBkZWJ1ZygnQXR0ZW1wdGluZyB0byByZXRyaWV2ZSBhbiBJTURTdjIgdG9rZW4uJyk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbWV0YWRhdGFTZXJ2aWNlLnJlcXVlc3QoXG4gICAgICAnL2xhdGVzdC9hcGkvdG9rZW4nLFxuICAgICAge1xuICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICBoZWFkZXJzOiB7ICd4LWF3cy1lYzItbWV0YWRhdGEtdG9rZW4tdHRsLXNlY29uZHMnOiAnNjAnIH0sXG4gICAgICB9LFxuICAgICAgKGVycjogQVdTLkFXU0Vycm9yLCB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIGlmICghdG9rZW4pIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdJTURTIGRpZCBub3QgcmV0dXJuIGEgdG9rZW4uJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUodG9rZW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gZ2V0IHRoZSByZWdpb24gZnJvbSB0aGUgSW5zdGFuY2UgTWV0YWRhdGEgU2VydmljZVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZWdpb25Gcm9tSW1kcyhtZXRhZGF0YVNlcnZpY2U6IEFXUy5NZXRhZGF0YVNlcnZpY2UsIHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZz4ge1xuICBkZWJ1ZygnUmV0cmlldmluZyB0aGUgQVdTIHJlZ2lvbiBmcm9tIHRoZSBJTURTLicpO1xuICBsZXQgb3B0aW9uczogeyBtZXRob2Q/OiBzdHJpbmcgfCB1bmRlZmluZWQ7IGhlYWRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IHVuZGVmaW5lZDsgfSA9IHt9O1xuICBpZiAodG9rZW4pIHtcbiAgICBvcHRpb25zID0geyBoZWFkZXJzOiB7ICd4LWF3cy1lYzItbWV0YWRhdGEtdG9rZW4nOiB0b2tlbiB9IH07XG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBtZXRhZGF0YVNlcnZpY2UucmVxdWVzdChcbiAgICAgICcvbGF0ZXN0L2R5bmFtaWMvaW5zdGFuY2UtaWRlbnRpdHkvZG9jdW1lbnQnLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIChlcnI6IEFXUy5BV1NFcnJvciwgaW5zdGFuY2VJZGVudGl0eURvY3VtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpbnN0YW5jZUlkZW50aXR5RG9jdW1lbnQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdJTURTIGRpZCBub3QgcmV0dXJuIGFuIEluc3RhbmNlIElkZW50aXR5IERvY3VtZW50LicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKGluc3RhbmNlSWRlbnRpdHlEb2N1bWVudCkucmVnaW9uKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhvbWVEaXIoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5IT01FIHx8IHByb2Nlc3MuZW52LlVTRVJQUk9GSUxFXG4gICAgfHwgKHByb2Nlc3MuZW52LkhPTUVQQVRIID8gKChwcm9jZXNzLmVudi5IT01FRFJJVkUgfHwgJ0M6LycpICsgcHJvY2Vzcy5lbnYuSE9NRVBBVEgpIDogbnVsbCkgfHwgb3MuaG9tZWRpcigpO1xufVxuXG5mdW5jdGlvbiBjcmVkZW50aWFsc0ZpbGVOYW1lKCkge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuQVdTX1NIQVJFRF9DUkVERU5USUFMU19GSUxFIHx8IHBhdGguam9pbihob21lRGlyKCksICcuYXdzJywgJ2NyZWRlbnRpYWxzJyk7XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ0ZpbGVOYW1lKCkge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuQVdTX0NPTkZJR19GSUxFIHx8IHBhdGguam9pbihob21lRGlyKCksICcuYXdzJywgJ2NvbmZpZycpO1xufVxuXG4vKipcbiAqIEZvcmNlIHRoZSBKUyBTREsgdG8gaG9ub3IgdGhlIH4vLmF3cy9jb25maWcgZmlsZSAoYW5kIHZhcmlvdXMgc2V0dGluZ3MgdGhlcmVpbilcbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlcmUgaXMganVzdCAqTk8qIHdheSB0byBkbyBBc3N1bWVSb2xlIGNyZWRlbnRpYWxzIGFzIGxvbmcgYXMgQVdTX1NES19MT0FEX0NPTkZJRyBpcyBub3Qgc2V0LFxuICogb3IgcmVhZCBjcmVkZW50aWFscyBmcm9tIHRoYXQgZmlsZS5cbiAqXG4gKiBUaGUgU0RLIGNyYXNoZXMgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBidXQgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHNvIGNvbmRpdGlvbmFsbHkgc2V0IGl0LlxuICovXG5hc3luYyBmdW5jdGlvbiBmb3JjZVNka1RvUmVhZENvbmZpZ0lmUHJlc2VudCgpIHtcbiAgaWYgKGF3YWl0IGZzLnBhdGhFeGlzdHMoY29uZmlnRmlsZU5hbWUoKSkpIHtcbiAgICBwcm9jZXNzLmVudi5BV1NfU0RLX0xPQURfQ09ORklHID0gJzEnO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNSZWdleChyZTogUmVnRXhwLCBzOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuIHMgIT09IHVuZGVmaW5lZCAmJiByZS5leGVjKHMpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIFJlYWQgYSBmaWxlIGlmIGl0IGV4aXN0cywgb3IgcmV0dXJuIHVuZGVmaW5lZFxuICpcbiAqIE5vdCBhc3luYyBiZWNhdXNlIGl0IGlzIHVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIHJlYWRJZlBvc3NpYmxlKGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGlmICghZnMucGF0aEV4aXN0c1N5bmMoZmlsZW5hbWUpKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZpbGVuYW1lLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGVidWcoZSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWRlbnRpYWxDaGFpbk9wdGlvbnMge1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xuICByZWFkb25seSBlYzJpbnN0YW5jZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNvbnRhaW5lckNyZWRzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaHR0cE9wdGlvbnM/OiBBV1MuSFRUUE9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVjMmluc3RhbmNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBc2sgdXNlciBmb3IgTUZBIHRva2VuIGZvciBnaXZlbiBzZXJpYWxcbiAqXG4gKiBSZXN1bHQgaXMgc2VuZCB0byBjYWxsYmFjayBmdW5jdGlvbiBmb3IgU0RLIHRvIGF1dGhvcml6ZSB0aGUgcmVxdWVzdFxuICovXG5hc3luYyBmdW5jdGlvbiB0b2tlbkNvZGVGbihzZXJpYWxBcm46IHN0cmluZywgY2I6IChlcnI/OiBFcnJvciwgdG9rZW4/OiBzdHJpbmcpID0+IHZvaWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZGVidWcoJ1JlcXVpcmUgTUZBIHRva2VuIGZvciBzZXJpYWwgQVJOJywgc2VyaWFsQXJuKTtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbjogc3RyaW5nID0gYXdhaXQgcHJvbXB0bHkucHJvbXB0KGBNRkEgdG9rZW4gZm9yICR7c2VyaWFsQXJufTogYCwge1xuICAgICAgdHJpbTogdHJ1ZSxcbiAgICAgIGRlZmF1bHQ6ICcnLFxuICAgIH0pO1xuICAgIGRlYnVnKCdTdWNjZXNzZnVsbHkgZ290IE1GQSB0b2tlbiBmcm9tIHVzZXInKTtcbiAgICBjYih1bmRlZmluZWQsIHRva2VuKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVidWcoJ0ZhaWxlZCB0byBnZXQgTUZBIHRva2VuJywgZXJyKTtcbiAgICBjYihlcnIpO1xuICB9XG59XG5cbiJdfQ==