@cdktn/provider-generator 0.23.0-pre.8 → 0.23.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 (195) hide show
  1. package/ambient.d.ts +0 -1
  2. package/{lib → build}/__tests__/edge-provider-schema/builder.d.ts +1 -0
  3. package/build/__tests__/edge-provider-schema/builder.js +106 -0
  4. package/build/__tests__/edge-provider-schema/cli.d.ts +2 -0
  5. package/build/__tests__/edge-provider-schema/cli.js +67 -0
  6. package/{lib → build}/__tests__/edge-provider-schema/index.d.ts +1 -0
  7. package/build/__tests__/edge-provider-schema/index.js +154 -0
  8. package/build/__tests__/edge-provider-schema.test.d.ts +2 -0
  9. package/build/__tests__/edge-provider-schema.test.js +46 -0
  10. package/build/__tests__/provider.test.d.ts +2 -0
  11. package/build/__tests__/provider.test.js +158 -0
  12. package/build/get/__tests__/constructs-maker.test.d.ts +2 -0
  13. package/build/get/__tests__/constructs-maker.test.js +113 -0
  14. package/build/get/__tests__/generator/complex-computed-types.test.d.ts +2 -0
  15. package/build/get/__tests__/generator/complex-computed-types.test.js +42 -0
  16. package/build/get/__tests__/generator/deep-nested-attributes.test.d.ts +2 -0
  17. package/build/get/__tests__/generator/deep-nested-attributes.test.js +50 -0
  18. package/build/get/__tests__/generator/description-escaping.test.d.ts +2 -0
  19. package/build/get/__tests__/generator/description-escaping.test.js +65 -0
  20. package/build/get/__tests__/generator/empty-provider-resources.test.d.ts +2 -0
  21. package/build/get/__tests__/generator/empty-provider-resources.test.js +40 -0
  22. package/build/get/__tests__/generator/export-sharding.test.d.ts +2 -0
  23. package/build/get/__tests__/generator/export-sharding.test.js +82 -0
  24. package/build/get/__tests__/generator/module-generator.test.d.ts +2 -0
  25. package/build/get/__tests__/generator/module-generator.test.js +476 -0
  26. package/build/get/__tests__/generator/nested-types.test.d.ts +2 -0
  27. package/build/get/__tests__/generator/nested-types.test.js +51 -0
  28. package/build/get/__tests__/generator/provider.test.d.ts +2 -0
  29. package/build/get/__tests__/generator/provider.test.js +51 -0
  30. package/build/get/__tests__/generator/resource-types.test.d.ts +2 -0
  31. package/build/get/__tests__/generator/resource-types.test.js +78 -0
  32. package/build/get/__tests__/generator/skipped-attributes.test.d.ts +2 -0
  33. package/build/get/__tests__/generator/skipped-attributes.test.js +55 -0
  34. package/build/get/__tests__/generator/types.test.d.ts +2 -0
  35. package/build/get/__tests__/generator/types.test.js +289 -0
  36. package/build/get/__tests__/generator/versions-file.test.d.ts +2 -0
  37. package/build/get/__tests__/generator/versions-file.test.js +74 -0
  38. package/{lib → build}/get/__tests__/util.d.ts +1 -0
  39. package/build/get/__tests__/util.js +59 -0
  40. package/{lib → build}/get/constructs-maker.d.ts +2 -1
  41. package/{lib → build}/get/constructs-maker.js +5 -2
  42. package/{lib → build}/get/generator/custom-defaults.d.ts +1 -0
  43. package/build/get/generator/custom-defaults.js +403 -0
  44. package/{lib → build}/get/generator/emitter/attributes-emitter.d.ts +1 -0
  45. package/build/get/generator/emitter/attributes-emitter.js +161 -0
  46. package/{lib → build}/get/generator/emitter/index.d.ts +1 -0
  47. package/{lib → build}/get/generator/emitter/index.js +1 -1
  48. package/{lib → build}/get/generator/emitter/resource-emitter.d.ts +1 -0
  49. package/build/get/generator/emitter/resource-emitter.js +147 -0
  50. package/{lib → build}/get/generator/emitter/struct-emitter.d.ts +1 -0
  51. package/build/get/generator/emitter/struct-emitter.js +500 -0
  52. package/{lib → build}/get/generator/loop-detection.d.ts +1 -0
  53. package/build/get/generator/loop-detection.js +56 -0
  54. package/{lib → build}/get/generator/models/attribute-model.d.ts +1 -0
  55. package/build/get/generator/models/attribute-model.js +160 -0
  56. package/{lib → build}/get/generator/models/attribute-type-model.d.ts +1 -0
  57. package/build/get/generator/models/attribute-type-model.js +376 -0
  58. package/{lib → build}/get/generator/models/index.d.ts +1 -0
  59. package/{lib → build}/get/generator/models/index.js +1 -1
  60. package/{lib → build}/get/generator/models/resource-model.d.ts +1 -0
  61. package/build/get/generator/models/resource-model.js +106 -0
  62. package/{lib → build}/get/generator/models/scope.d.ts +1 -0
  63. package/build/get/generator/models/scope.js +36 -0
  64. package/{lib → build}/get/generator/models/struct.d.ts +1 -0
  65. package/build/get/generator/models/struct.js +90 -0
  66. package/{lib → build}/get/generator/module-generator.d.ts +1 -0
  67. package/build/get/generator/module-generator.js +184 -0
  68. package/{lib → build}/get/generator/provider-generator.d.ts +1 -0
  69. package/build/get/generator/provider-generator.js +225 -0
  70. package/{lib → build}/get/generator/resource-parser.d.ts +1 -0
  71. package/build/get/generator/resource-parser.js +497 -0
  72. package/{lib → build}/get/generator/sanitized-comments.d.ts +1 -0
  73. package/build/get/generator/sanitized-comments.js +44 -0
  74. package/{lib → build}/get/generator/skipped-attributes.d.ts +1 -0
  75. package/build/get/generator/skipped-attributes.js +29 -0
  76. package/{lib → build}/index.d.ts +1 -0
  77. package/{lib → build}/index.js +1 -1
  78. package/{lib → build}/util.d.ts +1 -0
  79. package/build/util.js +30 -0
  80. package/package.json +13 -15
  81. package/{lib → src}/__tests__/__snapshots__/edge-provider-schema.test.ts.snap +1 -1
  82. package/{lib → src}/__tests__/__snapshots__/provider.test.ts.snap +14953 -890
  83. package/{lib → src}/get/__tests__/generator/__snapshots__/complex-computed-types.test.ts.snap +1 -1
  84. package/{lib → src}/get/__tests__/generator/__snapshots__/description-escaping.test.ts.snap +1 -1
  85. package/{lib → src}/get/__tests__/generator/__snapshots__/export-sharding.test.ts.snap +1 -1
  86. package/{lib → src}/get/__tests__/generator/__snapshots__/module-generator.test.ts.snap +10 -10
  87. package/{lib → src}/get/__tests__/generator/__snapshots__/nested-types.test.ts.snap +1 -1
  88. package/{lib → src}/get/__tests__/generator/__snapshots__/provider.test.ts.snap +1 -1
  89. package/{lib → src}/get/__tests__/generator/__snapshots__/resource-types.test.ts.snap +1 -1
  90. package/{lib → src}/get/__tests__/generator/__snapshots__/skipped-attributes.test.ts.snap +1 -1
  91. package/{lib → src}/get/__tests__/generator/__snapshots__/types.test.ts.snap +92 -1
  92. package/src/get/__tests__/generator/fixtures/map-of-map-of-string.test.fixture.json +27 -0
  93. package/tsconfig.json +6 -3
  94. package/lib/__tests__/edge-provider-schema/builder.js +0 -106
  95. package/lib/__tests__/edge-provider-schema/cli.d.ts +0 -1
  96. package/lib/__tests__/edge-provider-schema/cli.js +0 -67
  97. package/lib/__tests__/edge-provider-schema/index.js +0 -154
  98. package/lib/__tests__/edge-provider-schema.test.d.ts +0 -1
  99. package/lib/__tests__/edge-provider-schema.test.js +0 -46
  100. package/lib/__tests__/provider.test.d.ts +0 -1
  101. package/lib/__tests__/provider.test.js +0 -158
  102. package/lib/get/__tests__/constructs-maker.test.d.ts +0 -1
  103. package/lib/get/__tests__/constructs-maker.test.js +0 -113
  104. package/lib/get/__tests__/generator/complex-computed-types.test.d.ts +0 -1
  105. package/lib/get/__tests__/generator/complex-computed-types.test.js +0 -42
  106. package/lib/get/__tests__/generator/deep-nested-attributes.test.d.ts +0 -1
  107. package/lib/get/__tests__/generator/deep-nested-attributes.test.js +0 -50
  108. package/lib/get/__tests__/generator/description-escaping.test.d.ts +0 -1
  109. package/lib/get/__tests__/generator/description-escaping.test.js +0 -65
  110. package/lib/get/__tests__/generator/empty-provider-resources.test.d.ts +0 -1
  111. package/lib/get/__tests__/generator/empty-provider-resources.test.js +0 -40
  112. package/lib/get/__tests__/generator/export-sharding.test.d.ts +0 -1
  113. package/lib/get/__tests__/generator/export-sharding.test.js +0 -82
  114. package/lib/get/__tests__/generator/module-generator.test.d.ts +0 -1
  115. package/lib/get/__tests__/generator/module-generator.test.js +0 -476
  116. package/lib/get/__tests__/generator/nested-types.test.d.ts +0 -1
  117. package/lib/get/__tests__/generator/nested-types.test.js +0 -51
  118. package/lib/get/__tests__/generator/provider.test.d.ts +0 -1
  119. package/lib/get/__tests__/generator/provider.test.js +0 -51
  120. package/lib/get/__tests__/generator/resource-types.test.d.ts +0 -1
  121. package/lib/get/__tests__/generator/resource-types.test.js +0 -78
  122. package/lib/get/__tests__/generator/skipped-attributes.test.d.ts +0 -1
  123. package/lib/get/__tests__/generator/skipped-attributes.test.js +0 -55
  124. package/lib/get/__tests__/generator/types.test.d.ts +0 -1
  125. package/lib/get/__tests__/generator/types.test.js +0 -280
  126. package/lib/get/__tests__/generator/versions-file.test.d.ts +0 -1
  127. package/lib/get/__tests__/generator/versions-file.test.js +0 -74
  128. package/lib/get/__tests__/util.js +0 -59
  129. package/lib/get/generator/custom-defaults.js +0 -403
  130. package/lib/get/generator/emitter/attributes-emitter.js +0 -161
  131. package/lib/get/generator/emitter/resource-emitter.js +0 -144
  132. package/lib/get/generator/emitter/struct-emitter.js +0 -500
  133. package/lib/get/generator/loop-detection.js +0 -56
  134. package/lib/get/generator/models/attribute-model.js +0 -160
  135. package/lib/get/generator/models/attribute-type-model.js +0 -376
  136. package/lib/get/generator/models/resource-model.js +0 -106
  137. package/lib/get/generator/models/scope.js +0 -36
  138. package/lib/get/generator/models/struct.js +0 -90
  139. package/lib/get/generator/module-generator.js +0 -184
  140. package/lib/get/generator/provider-generator.js +0 -225
  141. package/lib/get/generator/resource-parser.js +0 -497
  142. package/lib/get/generator/sanitized-comments.js +0 -44
  143. package/lib/get/generator/skipped-attributes.js +0 -29
  144. package/lib/util.js +0 -30
  145. /package/{lib → src}/get/__tests__/generator/fixtures/aws-provider.test.fixture.json +0 -0
  146. /package/{lib → src}/get/__tests__/generator/fixtures/aws_acm_certificate.test.fixture.json +0 -0
  147. /package/{lib → src}/get/__tests__/generator/fixtures/aws_cloudfront_distribution.test.fixture.json +0 -0
  148. /package/{lib → src}/get/__tests__/generator/fixtures/aws_fms_admin_account.test.fixture.json +0 -0
  149. /package/{lib → src}/get/__tests__/generator/fixtures/aws_quicksight_template.test.fixture.json +0 -0
  150. /package/{lib → src}/get/__tests__/generator/fixtures/aws_s3_bucket.test.fixture.json +0 -0
  151. /package/{lib → src}/get/__tests__/generator/fixtures/aws_security_group.test.fixture.json +0 -0
  152. /package/{lib → src}/get/__tests__/generator/fixtures/aws_wafv2_web_acl.test.fixture.json +0 -0
  153. /package/{lib → src}/get/__tests__/generator/fixtures/block-type-nested-computed-list.test.fixture.json +0 -0
  154. /package/{lib → src}/get/__tests__/generator/fixtures/block-type-set-list.test.fixture.json +0 -0
  155. /package/{lib → src}/get/__tests__/generator/fixtures/boolean-list.test.fixture.json +0 -0
  156. /package/{lib → src}/get/__tests__/generator/fixtures/boolean-map.test.fixture.json +0 -0
  157. /package/{lib → src}/get/__tests__/generator/fixtures/comment-ending-sequence.test.fixture.json +0 -0
  158. /package/{lib → src}/get/__tests__/generator/fixtures/computed-complex-nested.test.fixture.json +0 -0
  159. /package/{lib → src}/get/__tests__/generator/fixtures/computed-complex.test.fixture.json +0 -0
  160. /package/{lib → src}/get/__tests__/generator/fixtures/computed-optional-complex.test.fixture.json +0 -0
  161. /package/{lib → src}/get/__tests__/generator/fixtures/data_aws_quicksight_analysis.fixture.json +0 -0
  162. /package/{lib → src}/get/__tests__/generator/fixtures/datadog_dashboard.test.fixture.json +0 -0
  163. /package/{lib → src}/get/__tests__/generator/fixtures/datadog_spans_metric.test.fixture.json +0 -0
  164. /package/{lib → src}/get/__tests__/generator/fixtures/deep-attributes.test.fixture.json +0 -0
  165. /package/{lib → src}/get/__tests__/generator/fixtures/deeply-nested-block-types.test.fixture.json +0 -0
  166. /package/{lib → src}/get/__tests__/generator/fixtures/description-escaping.test.fixture.json +0 -0
  167. /package/{lib → src}/get/__tests__/generator/fixtures/elasticstack-provider.test.fixture.json +0 -0
  168. /package/{lib → src}/get/__tests__/generator/fixtures/empty-provider-resources.test.fixture.json +0 -0
  169. /package/{lib → src}/get/__tests__/generator/fixtures/ignored-attributes.test.fixture.json +0 -0
  170. /package/{lib → src}/get/__tests__/generator/fixtures/incompatible-attribute-names.test.fixture.json +0 -0
  171. /package/{lib → src}/get/__tests__/generator/fixtures/incompatible-resource-names.test.fixture.json +0 -0
  172. /package/{lib → src}/get/__tests__/generator/fixtures/list-list-object.test.fixture.json +0 -0
  173. /package/{lib → src}/get/__tests__/generator/fixtures/list-list-string.test.fixture.json +0 -0
  174. /package/{lib → src}/get/__tests__/generator/fixtures/list-of-string-map.test.fixture.json +0 -0
  175. /package/{lib → src}/get/__tests__/generator/fixtures/map-of-string-list.test.fixture.json +0 -0
  176. /package/{lib → src}/get/__tests__/generator/fixtures/markdown-description-with-code-blocks.test.fixture.json +0 -0
  177. /package/{lib → src}/get/__tests__/generator/fixtures/module-get-x.test.fixture.tf +0 -0
  178. /package/{lib → src}/get/__tests__/generator/fixtures/module-no-newline-1.test.fixture.tf +0 -0
  179. /package/{lib → src}/get/__tests__/generator/fixtures/module-no-newline-2.test.fixture.tf +0 -0
  180. /package/{lib → src}/get/__tests__/generator/fixtures/module-no-outputs.test.fixture.tf +0 -0
  181. /package/{lib → src}/get/__tests__/generator/fixtures/module-no-variable-type.test.fixture.tf +0 -0
  182. /package/{lib → src}/get/__tests__/generator/fixtures/module-with-star-default.test.fixture.tf +0 -0
  183. /package/{lib → src}/get/__tests__/generator/fixtures/name-conflict.test.fixture.json +0 -0
  184. /package/{lib → src}/get/__tests__/generator/fixtures/nested-type-without-attributes.test.fixture.json +0 -0
  185. /package/{lib → src}/get/__tests__/generator/fixtures/nested-types.test.fixture.json +0 -0
  186. /package/{lib → src}/get/__tests__/generator/fixtures/number-list.test.fixture.json +0 -0
  187. /package/{lib → src}/get/__tests__/generator/fixtures/number-map.test.fixture.json +0 -0
  188. /package/{lib → src}/get/__tests__/generator/fixtures/primitive-boolean.test.fixture.json +0 -0
  189. /package/{lib → src}/get/__tests__/generator/fixtures/primitive-dynamic.test.fixture.json +0 -0
  190. /package/{lib → src}/get/__tests__/generator/fixtures/primitive-number.test.fixture.json +0 -0
  191. /package/{lib → src}/get/__tests__/generator/fixtures/primitive-string.test.fixture.json +0 -0
  192. /package/{lib → src}/get/__tests__/generator/fixtures/single-block-type.test.fixture.json +0 -0
  193. /package/{lib → src}/get/__tests__/generator/fixtures/string-list.test.fixture.json +0 -0
  194. /package/{lib → src}/get/__tests__/generator/fixtures/string-map.test.fixture.json +0 -0
  195. /package/{lib → src}/get/__tests__/generator/fixtures/stripe-schema.test.fixture.json +0 -0
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ // Copyright (c) HashiCorp, Inc
27
+ // SPDX-License-Identifier: MPL-2.0
28
+ const fs = __importStar(require("fs-extra"));
29
+ const os = __importStar(require("os"));
30
+ const path = __importStar(require("path"));
31
+ const commons_1 = require("@cdktn/commons");
32
+ const constructs_maker_1 = require("../../constructs-maker");
33
+ jest.setTimeout(600000);
34
+ global.setImmediate =
35
+ global.setImmediate ||
36
+ ((fn, ...args) => global.setTimeout(fn, 0, ...args));
37
+ describe("versions.json file generation", () => {
38
+ const languages = [commons_1.Language.TYPESCRIPT, commons_1.Language.PYTHON];
39
+ const constraints = [
40
+ {
41
+ fqn: "hashicorp/aws",
42
+ name: "aws",
43
+ source: "hashicorp/aws",
44
+ version: "4.0.0",
45
+ },
46
+ {
47
+ fqn: "hashicorp/random",
48
+ name: "random",
49
+ source: "hashicorp/random",
50
+ version: "3.1.3",
51
+ },
52
+ {
53
+ fqn: "kreuzwerker/docker",
54
+ name: "docker",
55
+ source: "kreuzwerker/docker",
56
+ version: "2.16.0",
57
+ },
58
+ ];
59
+ beforeAll(() => { });
60
+ test.each(languages)("generates a file for the %s language", async (language) => {
61
+ const workdir = fs.mkdtempSync(path.join(os.tmpdir(), "versions-file.test"));
62
+ const options = {
63
+ codeMakerOutput: workdir,
64
+ targetLanguage: language,
65
+ };
66
+ // Ignore warnings to pop up from the generate function
67
+ process.env.NODE_OPTIONS = "--max-old-space-size=16384";
68
+ const constructMaker = new constructs_maker_1.ConstructsMaker(options, process.env.CDKTF_EXPERIMENTAL_PROVIDER_SCHEMA_CACHE_PATH);
69
+ await constructMaker.generate(constraints);
70
+ const output = fs.readFileSync(path.join(workdir, "versions.json"), "utf-8");
71
+ expect(Object.keys(JSON.parse(output))).toEqual(expect.arrayContaining(constraints.map((c) => `registry.terraform.io/${c.fqn}`)));
72
+ });
73
+ });
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbnMtZmlsZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2dldC9fX3Rlc3RzX18vZ2VuZXJhdG9yL3ZlcnNpb25zLWZpbGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyw2Q0FBK0I7QUFDL0IsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3Qiw0Q0FBeUU7QUFDekUsNkRBQXFFO0FBRXJFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTyxDQUFDLENBQUM7QUFDekIsTUFBTSxDQUFDLFlBQVk7SUFDakIsTUFBTSxDQUFDLFlBQVk7UUFDbkIsQ0FBQyxDQUFDLEVBQU8sRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUVuRSxRQUFRLENBQUMsK0JBQStCLEVBQUUsR0FBRyxFQUFFO0lBQzdDLE1BQU0sU0FBUyxHQUFHLENBQUMsa0JBQVEsQ0FBQyxVQUFVLEVBQUUsa0JBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV6RCxNQUFNLFdBQVcsR0FBb0M7UUFDbkQ7WUFDRSxHQUFHLEVBQUUsZUFBZTtZQUNwQixJQUFJLEVBQUUsS0FBSztZQUNYLE1BQU0sRUFBRSxlQUFlO1lBQ3ZCLE9BQU8sRUFBRSxPQUFPO1NBQ2pCO1FBQ0Q7WUFDRSxHQUFHLEVBQUUsa0JBQWtCO1lBQ3ZCLElBQUksRUFBRSxRQUFRO1lBQ2QsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixPQUFPLEVBQUUsT0FBTztTQUNqQjtRQUNEO1lBQ0UsR0FBRyxFQUFFLG9CQUFvQjtZQUN6QixJQUFJLEVBQUUsUUFBUTtZQUNkLE1BQU0sRUFBRSxvQkFBb0I7WUFDNUIsT0FBTyxFQUFFLFFBQVE7U0FDbEI7S0FDRixDQUFDO0lBRUYsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXBCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQ2xCLHNDQUFzQyxFQUN0QyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7UUFDakIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsb0JBQW9CLENBQUMsQ0FDN0MsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFlO1lBQzFCLGVBQWUsRUFBRSxPQUFPO1lBQ3hCLGNBQWMsRUFBRSxRQUFRO1NBQ3pCLENBQUM7UUFFRix1REFBdUQ7UUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsNEJBQTRCLENBQUM7UUFDeEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxrQ0FBZSxDQUN4QyxPQUFPLEVBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FDMUQsQ0FBQztRQUVGLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUzQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsRUFDbkMsT0FBTyxDQUNSLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQzdDLE1BQU0sQ0FBQyxlQUFlLENBQ3BCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLHlCQUF5QixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FDekQsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUNGLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCAqIGFzIG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgTGFuZ3VhZ2UsIFRlcnJhZm9ybURlcGVuZGVuY3lDb25zdHJhaW50IH0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RzTWFrZXIsIEdldE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vY29uc3RydWN0cy1tYWtlclwiO1xuXG5qZXN0LnNldFRpbWVvdXQoNjAwXzAwMCk7XG5nbG9iYWwuc2V0SW1tZWRpYXRlID1cbiAgZ2xvYmFsLnNldEltbWVkaWF0ZSB8fFxuICAoKGZuOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBnbG9iYWwuc2V0VGltZW91dChmbiwgMCwgLi4uYXJncykpO1xuXG5kZXNjcmliZShcInZlcnNpb25zLmpzb24gZmlsZSBnZW5lcmF0aW9uXCIsICgpID0+IHtcbiAgY29uc3QgbGFuZ3VhZ2VzID0gW0xhbmd1YWdlLlRZUEVTQ1JJUFQsIExhbmd1YWdlLlBZVEhPTl07XG5cbiAgY29uc3QgY29uc3RyYWludHM6IFRlcnJhZm9ybURlcGVuZGVuY3lDb25zdHJhaW50W10gPSBbXG4gICAge1xuICAgICAgZnFuOiBcImhhc2hpY29ycC9hd3NcIixcbiAgICAgIG5hbWU6IFwiYXdzXCIsXG4gICAgICBzb3VyY2U6IFwiaGFzaGljb3JwL2F3c1wiLFxuICAgICAgdmVyc2lvbjogXCI0LjAuMFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgZnFuOiBcImhhc2hpY29ycC9yYW5kb21cIixcbiAgICAgIG5hbWU6IFwicmFuZG9tXCIsXG4gICAgICBzb3VyY2U6IFwiaGFzaGljb3JwL3JhbmRvbVwiLFxuICAgICAgdmVyc2lvbjogXCIzLjEuM1wiLFxuICAgIH0sXG4gICAge1xuICAgICAgZnFuOiBcImtyZXV6d2Vya2VyL2RvY2tlclwiLFxuICAgICAgbmFtZTogXCJkb2NrZXJcIixcbiAgICAgIHNvdXJjZTogXCJrcmV1endlcmtlci9kb2NrZXJcIixcbiAgICAgIHZlcnNpb246IFwiMi4xNi4wXCIsXG4gICAgfSxcbiAgXTtcblxuICBiZWZvcmVBbGwoKCkgPT4ge30pO1xuXG4gIHRlc3QuZWFjaChsYW5ndWFnZXMpKFxuICAgIFwiZ2VuZXJhdGVzIGEgZmlsZSBmb3IgdGhlICVzIGxhbmd1YWdlXCIsXG4gICAgYXN5bmMgKGxhbmd1YWdlKSA9PiB7XG4gICAgICBjb25zdCB3b3JrZGlyID0gZnMubWtkdGVtcFN5bmMoXG4gICAgICAgIHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJ2ZXJzaW9ucy1maWxlLnRlc3RcIiksXG4gICAgICApO1xuXG4gICAgICBjb25zdCBvcHRpb25zOiBHZXRPcHRpb25zID0ge1xuICAgICAgICBjb2RlTWFrZXJPdXRwdXQ6IHdvcmtkaXIsXG4gICAgICAgIHRhcmdldExhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgIH07XG5cbiAgICAgIC8vIElnbm9yZSB3YXJuaW5ncyB0byBwb3AgdXAgZnJvbSB0aGUgZ2VuZXJhdGUgZnVuY3Rpb25cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OUyA9IFwiLS1tYXgtb2xkLXNwYWNlLXNpemU9MTYzODRcIjtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdE1ha2VyID0gbmV3IENvbnN0cnVjdHNNYWtlcihcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgcHJvY2Vzcy5lbnYuQ0RLVEZfRVhQRVJJTUVOVEFMX1BST1ZJREVSX1NDSEVNQV9DQUNIRV9QQVRILFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgY29uc3RydWN0TWFrZXIuZ2VuZXJhdGUoY29uc3RyYWludHMpO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgIHBhdGguam9pbih3b3JrZGlyLCBcInZlcnNpb25zLmpzb25cIiksXG4gICAgICAgIFwidXRmLThcIixcbiAgICAgICk7XG4gICAgICBleHBlY3QoT2JqZWN0LmtleXMoSlNPTi5wYXJzZShvdXRwdXQpKSkudG9FcXVhbChcbiAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhcbiAgICAgICAgICBjb25zdHJhaW50cy5tYXAoKGMpID0+IGByZWdpc3RyeS50ZXJyYWZvcm0uaW8vJHtjLmZxbn1gKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcbn0pO1xuIl19
@@ -1 +1,2 @@
1
1
  export declare function expectModuleToMatchSnapshot(testName: string, testCategory: string, fixtureNames: string[]): void;
2
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.expectModuleToMatchSnapshot = void 0;
27
+ // Copyright (c) HashiCorp, Inc
28
+ // SPDX-License-Identifier: MPL-2.0
29
+ const fs = __importStar(require("fs"));
30
+ const commons_1 = require("@cdktn/commons");
31
+ const constructs_maker_1 = require("../constructs-maker");
32
+ const path = __importStar(require("path"));
33
+ function expectModuleToMatchSnapshot(testName, testCategory, fixtureNames) {
34
+ test(testName, async () => {
35
+ await (0, commons_1.withTempDir)(`${testName.replace(/\s*/, "-")}.test`, async () => {
36
+ const curdir = process.cwd();
37
+ fs.mkdirSync("module");
38
+ fixtureNames.forEach((fixtureName) => {
39
+ fs.copyFileSync(path.join(__dirname, testCategory, "fixtures", fixtureName), path.join(curdir, "module", fixtureName));
40
+ });
41
+ const constraint = new commons_1.TerraformModuleConstraint({
42
+ source: "./module",
43
+ name: "module",
44
+ fqn: "module",
45
+ });
46
+ fs.mkdirSync("work");
47
+ const workdir = path.join(curdir, "work");
48
+ const maker = new constructs_maker_1.ConstructsMaker({
49
+ codeMakerOutput: workdir,
50
+ targetLanguage: commons_1.Language.TYPESCRIPT,
51
+ }, process.env.CDKTF_EXPERIMENTAL_PROVIDER_SCHEMA_CACHE_PATH);
52
+ await maker.generate([constraint]);
53
+ const output = fs.readFileSync(path.join(workdir, "modules/module.ts"), "utf-8");
54
+ expect(output).toMatchSnapshot();
55
+ });
56
+ });
57
+ }
58
+ exports.expectModuleToMatchSnapshot = expectModuleToMatchSnapshot;
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nZXQvX190ZXN0c19fL3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLHVDQUF5QjtBQUN6Qiw0Q0FJd0I7QUFDeEIsMERBQXNEO0FBQ3RELDJDQUE2QjtBQUU3QixTQUFnQiwyQkFBMkIsQ0FDekMsUUFBZ0IsRUFDaEIsWUFBb0IsRUFDcEIsWUFBc0I7SUFFdEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4QixNQUFNLElBQUEscUJBQVcsRUFBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdkIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUNuQyxFQUFFLENBQUMsWUFBWSxDQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FDekMsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxVQUFVLEdBQUcsSUFBSSxtQ0FBeUIsQ0FBQztnQkFDL0MsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLElBQUksRUFBRSxRQUFRO2dCQUNkLEdBQUcsRUFBRSxRQUFRO2FBQ2QsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUUxQyxNQUFNLEtBQUssR0FBRyxJQUFJLGtDQUFlLENBQy9CO2dCQUNFLGVBQWUsRUFBRSxPQUFPO2dCQUN4QixjQUFjLEVBQUUsa0JBQVEsQ0FBQyxVQUFVO2FBQ3BDLEVBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FDMUQsQ0FBQztZQUNGLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFbkMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsRUFDdkMsT0FBTyxDQUNSLENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUExQ0Qsa0VBMENDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHtcbiAgTGFuZ3VhZ2UsXG4gIFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQsXG4gIHdpdGhUZW1wRGlyLFxufSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdHNNYWtlciB9IGZyb20gXCIuLi9jb25zdHJ1Y3RzLW1ha2VyXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RNb2R1bGVUb01hdGNoU25hcHNob3QoXG4gIHRlc3ROYW1lOiBzdHJpbmcsXG4gIHRlc3RDYXRlZ29yeTogc3RyaW5nLFxuICBmaXh0dXJlTmFtZXM6IHN0cmluZ1tdLFxuKSB7XG4gIHRlc3QodGVzdE5hbWUsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB3aXRoVGVtcERpcihgJHt0ZXN0TmFtZS5yZXBsYWNlKC9cXHMqLywgXCItXCIpfS50ZXN0YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VyZGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICAgIGZzLm1rZGlyU3luYyhcIm1vZHVsZVwiKTtcblxuICAgICAgZml4dHVyZU5hbWVzLmZvckVhY2goKGZpeHR1cmVOYW1lKSA9PiB7XG4gICAgICAgIGZzLmNvcHlGaWxlU3luYyhcbiAgICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCB0ZXN0Q2F0ZWdvcnksIFwiZml4dHVyZXNcIiwgZml4dHVyZU5hbWUpLFxuICAgICAgICAgIHBhdGguam9pbihjdXJkaXIsIFwibW9kdWxlXCIsIGZpeHR1cmVOYW1lKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjb25zdHJhaW50ID0gbmV3IFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQoe1xuICAgICAgICBzb3VyY2U6IFwiLi9tb2R1bGVcIixcbiAgICAgICAgbmFtZTogXCJtb2R1bGVcIixcbiAgICAgICAgZnFuOiBcIm1vZHVsZVwiLFxuICAgICAgfSk7XG5cbiAgICAgIGZzLm1rZGlyU3luYyhcIndvcmtcIik7XG4gICAgICBjb25zdCB3b3JrZGlyID0gcGF0aC5qb2luKGN1cmRpciwgXCJ3b3JrXCIpO1xuXG4gICAgICBjb25zdCBtYWtlciA9IG5ldyBDb25zdHJ1Y3RzTWFrZXIoXG4gICAgICAgIHtcbiAgICAgICAgICBjb2RlTWFrZXJPdXRwdXQ6IHdvcmtkaXIsXG4gICAgICAgICAgdGFyZ2V0TGFuZ3VhZ2U6IExhbmd1YWdlLlRZUEVTQ1JJUFQsXG4gICAgICAgIH0sXG4gICAgICAgIHByb2Nlc3MuZW52LkNES1RGX0VYUEVSSU1FTlRBTF9QUk9WSURFUl9TQ0hFTUFfQ0FDSEVfUEFUSCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBtYWtlci5nZW5lcmF0ZShbY29uc3RyYWludF0pO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgIHBhdGguam9pbih3b3JrZGlyLCBcIm1vZHVsZXMvbW9kdWxlLnRzXCIpLFxuICAgICAgICBcInV0Zi04XCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
@@ -71,7 +71,7 @@ export declare class ConstructsMaker {
71
71
  removeFoldersThatShouldNotExist(constraintsThatShouldExist: TerraformDependencyConstraint[]): Promise<void>;
72
72
  private emitConstraintsFile;
73
73
  private generateJsiiLanguage;
74
- getSchemas(targets: TerraformDependencyConstraint[]): Promise<import("@cdktn/provider-schema/src/read").Schema>;
74
+ getSchemas(targets: TerraformDependencyConstraint[]): Promise<import("@cdktn/provider-schema/build/read").Schema>;
75
75
  generate(allConstraints: TerraformDependencyConstraint[], constraintsToGenerate?: TerraformDependencyConstraint[]): Promise<void>;
76
76
  private save;
77
77
  private get isJavascriptTarget();
@@ -89,3 +89,4 @@ export declare class ConstructsMaker {
89
89
  * @throws an Error if no go.mod was found
90
90
  */
91
91
  export declare const determineGoModuleName: (dir: string) => Promise<string>;
92
+ //# sourceMappingURL=constructs-maker.d.ts.map
@@ -137,7 +137,10 @@ async function generateJsiiLanguage(code, opts, outputPath, disallowedFileGlobs
137
137
  if (opts.java) {
138
138
  const source = path.resolve(path.join(staging, "dist/java/src/"));
139
139
  const target = path.join(opts.java.outdir, "src/");
140
- await fs.mkdirp(target); // make sure target directory exists
140
+ // Pre-create shared package directories.
141
+ const packageDir = opts.java.package.replace(/\./g, "/");
142
+ await fs.mkdirp(path.join(target, "main/java", packageDir));
143
+ await fs.mkdirp(path.join(target, "main/resources", packageDir));
141
144
  await fs.copy(source, target, { recursive: true, overwrite: false });
142
145
  }
143
146
  if (opts.csharp) {
@@ -527,4 +530,4 @@ const determineGoModuleName = async (dir) => {
527
530
  throw new Error(`Could not determine the root Go module name. No go.mod found in ${dir} and any parent directories`);
528
531
  };
529
532
  exports.determineGoModuleName = determineGoModuleName;
530
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0cy1tYWtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnN0cnVjdHMtbWFrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLDZDQUErQjtBQUMvQiwyQ0FBNkI7QUFDN0IseUNBQXNDO0FBQ3RDLDRDQUErQztBQUMvQyw0Q0FVd0I7QUFDeEIsNENBQTJEO0FBQzNELHVFQUE0RTtBQUM1RSxtRUFBK0Q7QUFDL0QsK0JBQTRCO0FBQzVCLDREQUFvRDtBQUVwRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFDcEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQWlEN0MsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxJQUFlLEVBQ2YsSUFBeUIsRUFDekIsVUFBa0IsRUFDbEIsc0JBQWdDLEVBQUU7SUFFbEMsTUFBTSxJQUFBLGlCQUFPLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQzlCLG9FQUFvRTtRQUNwRSxzRUFBc0U7UUFDdEUsb0JBQW9CO1FBQ3BCLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6Qiw0RUFBNEU7UUFDNUUsNEdBQTRHO1FBQzVHLE1BQU0sYUFBYSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQzVELFdBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQ3JDLENBQUM7UUFDRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxD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O2dCQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMseUNBQXlDO2dCQUM5RyxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHNEQUFzRCxJQUFJLHNEQUFzRCxDQUNqSCxDQUFDO1FBQ0osQ0FBQztRQUNELDBFQUEwRTtRQUMxRSw4Q0FBOEM7UUFDOUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUN6QixVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4QyxDQUFDLFFBQVEsVUFBVSxLQUFLLFdBQVcsRUFBRTtJQUVyQyxNQUFNLElBQUksS0FBSyxDQUNiLG1FQUFtRSxHQUFHLDZCQUE2QixDQUNwRyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBbkNXLFFBQUEscUJBQXFCLHlCQW1DaEMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDb2RlTWFrZXIgfSBmcm9tIFwiY29kZW1ha2VyXCI7XG5pbXBvcnQgeyBleGVjLCBta2R0ZW1wIH0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQge1xuICBUZXJyYWZvcm1EZXBlbmRlbmN5Q29uc3RyYWludCxcbiAgbG9nZ2VyLFxuICBsb2dUaW1lc3BhbixcbiAgQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQsXG4gIENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldCxcbiAgQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICBQcm92aWRlclNjaGVtYSxcbiAgTW9kdWxlU2NoZW1hLFxuICBFcnJvcnMsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHsgRElTUExBWV9WRVJTSU9OLCBMYW5ndWFnZSB9IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHsgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3IgfSBmcm9tIFwiLi9nZW5lcmF0b3IvcHJvdmlkZXItZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBNb2R1bGVHZW5lcmF0b3IgfSBmcm9tIFwiLi9nZW5lcmF0b3IvbW9kdWxlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgZ2xvYiB9IGZyb20gXCJnbG9iXCI7XG5pbXBvcnQgeyByZWFkU2NoZW1hIH0gZnJvbSBcIkBjZGt0bi9wcm92aWRlci1zY2hlbWFcIjtcblxuY29uc3QgcGFjbWFrTW9kdWxlID0gcmVxdWlyZS5yZXNvbHZlKFwianNpaS1wYWNtYWsvYmluL2pzaWktcGFjbWFrXCIpO1xuY29uc3QganNpaU1vZHVsZSA9IHJlcXVpcmUucmVzb2x2ZShcImpzaWkvYmluL2pzaWlcIik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVKU0lJT3B0aW9ucyB7XG4gIGVudHJ5cG9pbnQ6IHN0cmluZztcbiAgZGVwczogc3RyaW5nW107XG4gIG1vZHVsZUtleTogc3RyaW5nO1xuICBleHBvcnRzPzogUmVjb3JkPHN0cmluZywgRXhwb3J0RGVmaW5pdGlvbiB8IHN0cmluZz47XG4gIGpzaWk/OiBKc2lpT3V0cHV0T3B0aW9ucztcbiAgcHl0aG9uPzogUHl0aG9uT3V0cHV0T3B0aW9ucztcbiAgamF2YT86IEphdmFPdXRwdXRPcHRpb25zO1xuICBjc2hhcnA/OiBDU2hhcnBPdXRwdXRPcHRpb25zO1xuICBnb2xhbmc/OiBHb0xhbmdPdXRwdXRPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpzaWlPdXRwdXRPcHRpb25zIHtcbiAgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFB5dGhvbk91dHB1dE9wdGlvbnMge1xuICBvdXRkaXI6IHN0cmluZztcbiAgbW9kdWxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEphdmFPdXRwdXRPcHRpb25zIHtcbiAgb3V0ZGlyOiBzdHJpbmc7XG4gIHBhY2thZ2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDU2hhcnBPdXRwdXRPcHRpb25zIHtcbiAgb3V0ZGlyOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdvTGFuZ091dHB1dE9wdGlvbnMge1xuICBvdXRkaXI6IHN0cmluZztcbiAgbW9kdWxlTmFtZTogc3RyaW5nO1xuICBwYWNrYWdlTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL3BhY2thZ2VzLmh0bWwjY29uZGl0aW9uYWwtZXhwb3J0cyBmb3IgbW9yZSBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydERlZmluaXRpb24ge1xuICBub2RlPzogc3RyaW5nO1xuICBpbXBvcnQ/OiBzdHJpbmc7XG4gIHJlcXVpcmU/OiBzdHJpbmc7XG4gIGRlZmF1bHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUpzaWlMYW5ndWFnZShcbiAgY29kZTogQ29kZU1ha2VyLFxuICBvcHRzOiBHZW5lcmF0ZUpTSUlPcHRpb25zLFxuICBvdXRwdXRQYXRoOiBzdHJpbmcsXG4gIGRpc2FsbG93ZWRGaWxlR2xvYnM6IHN0cmluZ1tdID0gW10sXG4pIHtcbiAgYXdhaXQgbWtkdGVtcChhc3luYyAoc3RhZ2luZykgPT4ge1xuICAgIC8vIHRoaXMgaXMgbm90IHR5cGVzY3JpcHQsIHNvIHdlIGdlbmVyYXRlIGluIGEgc3RhZ2luZyBkaXJlY3RvcnkgYW5kXG4gICAgLy8gdXNlIGpzaWktc3JjbWFrIHRvIGNvbXBpbGUgYW5kIGV4dHJhY3QgdGhlIGxhbmd1YWdlLXNwZWNpZmljIHNvdXJjZVxuICAgIC8vIGludG8gb3VyIHByb2plY3QuXG4gICAgYXdhaXQgY29kZS5zYXZlKHN0YWdpbmcpO1xuXG4gICAgLy8gYXMgdGhlIGFib3ZlIGdlbmVyYXRlZCB0aGUgVHlwZXNjcmlwdCBjb2RlIGZvciBhbGwgcHJvdmlkZXJzIGFuZCBtb2R1bGVzLFxuICAgIC8vIHdlIG5lZWQgdG8gZmlsdGVyIG91dCB0aGUgb25lcyB3ZSBkb24ndCBuZWVkIHNvIHRoZXkgZG9uJ3QgZW5kIHVwIGluIHRoZSBKU0lJIGJ1bmRsZSBvdmVyIGFuZCBvdmVyIGFnYWluLlxuICAgIGNvbnN0IGZpbGVzVG9EZWxldGUgPSBkaXNhbGxvd2VkRmlsZUdsb2JzLmZsYXRNYXAoKHBhdHRlcm4pID0+XG4gICAgICBnbG9iLnN5bmMocGF0dGVybiwgeyBjd2Q6IHN0YWdpbmcgfSksXG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbGVzVG9EZWxldGUubWFwKChmaWxlKSA9PiBmcy5yZW1vdmUocGF0aC5qb2luKHN0YWdpbmcsIGZpbGUpKSksXG4gICAgKTtcblxuICAgIC8vIENvbXBpbGUgd2l0aCBKU0lJXG4gICAgY29uc3QganNpaUFyZ3MgPSBbXCItLXNpbGVuY2Utd2FybmluZ3NcIiwgXCJyZXNlcnZlZC13b3JkXCJdO1xuICAgIGNvbnN0IGpzaWlFbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50O1xuICAgIGNvbnN0IGJhc2VwYXRoID0gcGF0aC5qb2luKFxuICAgICAgcGF0aC5kaXJuYW1lKGpzaWlFbnRyeXBvaW50KSxcbiAgICAgIHBhdGguYmFzZW5hbWUoanNpaUVudHJ5cG9pbnQsIFwiLnRzXCIpLFxuICAgICk7XG5cbiAgICBjb25zdCBtb2R1bGVLZXkgPSBvcHRzLm1vZHVsZUtleS5yZXBsYWNlKC9cXC4vZywgXCJcIikucmVwbGFjZSgvXFwvL2csIFwiXCIpO1xuICAgIGNvbnN0IG1vZHVsZURpcnMgPSBvcHRzLmRlcHM7XG4gICAgY29uc3QgdGFyZ2V0czogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IGRlcHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGRpciBvZiBtb2R1bGVEaXJzKSB7XG4gICAgICAvLyByZWFkIG1vZHVsZSBtZXRhZGF0YVxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBmcy5yZWFkSnNvbihwYXRoLmpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKSk7XG4gICAgICBjb25zdCBtb2R1bGVOYW1lOiBzdHJpbmcgPSBtZXRhZGF0YS5uYW1lO1xuICAgICAgY29uc3QgbW9kdWxlVmVyc2lvbjogc3RyaW5nID0gbWV0YWRhdGEudmVyc2lvbjtcblxuICAgICAgY29uc3QgdGFyZ2V0ZGlyID0gcGF0aC5qb2luKFxuICAgICAgICBwYXRoLmpvaW4oc3RhZ2luZywgXCJub2RlX21vZHVsZXNcIiksXG4gICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMubWtkaXJwKHBhdGguZGlybmFtZSh0YXJnZXRkaXIpKTtcbiAgICAgIGF3YWl0IGZzLmNvcHkoZGlyLCB0YXJnZXRkaXIpO1xuXG4gICAgICAvLyBhZGQgdG8gXCJkZXBzXCIgYW5kIFwicGVlciBkZXBzXCJcbiAgICAgIGlmICghbW9kdWxlTmFtZS5zdGFydHNXaXRoKFwiQHR5cGVzL1wiKSkge1xuICAgICAgICBkZXBzW21vZHVsZU5hbWVdID0gbW9kdWxlVmVyc2lvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGtnID0ge1xuICAgICAgbmFtZTogbW9kdWxlS2V5LFxuICAgICAgdmVyc2lvbjogXCIwLjAuMFwiLFxuICAgICAgYXV0aG9yOiBcImdlbmVyYXRlZEBnZW5lcmF0ZWQuY29tXCIsXG4gICAgICBtYWluOiBgJHtiYXNlcGF0aH0uanNgLFxuICAgICAgdHlwZXM6IGAke2Jhc2VwYXRofS5kLnRzYCxcbiAgICAgIGxpY2Vuc2U6IFwiVU5MSUNFTlNFRFwiLFxuICAgICAgcmVwb3NpdG9yeTogeyB1cmw6IFwiaHR0cDovL2dlbmVyYXRlZFwiLCB0eXBlOiBcImdpdFwiIH0sXG4gICAgICBqc2lpOiB7XG4gICAgICAgIG91dGRpcjogXCJkaXN0XCIsXG4gICAgICAgIHRhcmdldHM6IHRhcmdldHMsXG4gICAgICB9LFxuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBzLFxuICAgICAgcGVlckRlcGVuZGVuY2llczogZGVwcyxcbiAgICB9O1xuXG4gICAgaWYgKG9wdHMuZXhwb3J0cykge1xuICAgICAgKHBrZyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KS5leHBvcnRzID0gb3B0cy5leHBvcnRzO1xuICAgIH1cbiAgICBpZiAob3B0cy5weXRob24pIHtcbiAgICAgIHRhcmdldHMucHl0aG9uID0ge1xuICAgICAgICBkaXN0TmFtZTogXCJnZW5lcmF0ZWRcIixcbiAgICAgICAgbW9kdWxlOiBvcHRzLnB5dGhvbi5tb2R1bGVOYW1lLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5qYXZhKSB7XG4gICAgICB0YXJnZXRzLmphdmEgPSB7XG4gICAgICAgIHBhY2thZ2U6IG9wdHMuamF2YS5wYWNrYWdlLFxuICAgICAgICBtYXZlbjoge1xuICAgICAgICAgIGdyb3VwSWQ6IFwiZ2VuZXJhdGVkXCIsXG4gICAgICAgICAgYXJ0aWZhY3RJZDogXCJnZW5lcmF0ZWRcIixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuY3NoYXJwKSB7XG4gICAgICB0YXJnZXRzLmRvdG5ldCA9IHtcbiAgICAgICAgbmFtZXNwYWNlOiBvcHRzLmNzaGFycC5uYW1lc3BhY2UsXG4gICAgICAgIHBhY2thZ2VJZDogb3B0cy5jc2hhcnAubmFtZXNwYWNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5nb2xhbmcpIHtcbiAgICAgIHRhcmdldHMuZ28gPSB7XG4gICAgICAgIG1vZHVsZU5hbWU6IG9wdHMuZ29sYW5nLm1vZHVsZU5hbWUsXG4gICAgICAgIHBhY2thZ2VOYW1lOiBvcHRzLmdvbGFuZy5wYWNrYWdlTmFtZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKHN0YWdpbmcsIFwicGFja2FnZS5qc29uXCIpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocGtnLCB1bmRlZmluZWQsIDIpLFxuICAgICk7XG5cbiAgICBjb25zdCBlbmRKc2lpVGltZXIgPSBsb2dUaW1lc3BhbihcImpzaWlcIik7XG4gICAgYXdhaXQgZXhlYyhqc2lpTW9kdWxlLCBqc2lpQXJncywge1xuICAgICAgY3dkOiBzdGFnaW5nLFxuICAgIH0pO1xuICAgIGVuZEpzaWlUaW1lcigpO1xuXG4gICAgLy8gZXh0cmFjdCAuanNpaSBpZiByZXF1ZXN0ZWRcbiAgICBpZiAob3B0cy5qc2lpKSB7XG4gICAgICBhd2FpdCBmcy5jb3B5KHBhdGguam9pbihzdGFnaW5nLCBcIi5qc2lpXCIpLCBvcHRzLmpzaWkucGF0aCk7XG4gICAgfVxuXG4gICAgLy8gcnVuIHBhY21hayB0byBnZW5lcmF0ZSBjb2RlXG4gICAgY29uc3QgZW5kSnNpaVBhY21ha1RpbWVyID0gbG9nVGltZXNwYW4oXCJqc2lpLXBhY21ha1wiKTtcbiAgICBhd2FpdCBleGVjKHBhY21ha01vZHVsZSwgW1wiLS1jb2RlLW9ubHlcIl0sIHsgY3dkOiBzdGFnaW5nIH0pO1xuICAgIGVuZEpzaWlQYWNtYWtUaW1lcigpO1xuXG4gICAgaWYgKG9wdHMucHl0aG9uKSB7XG4gICAgICBjb25zdCByZWxkaXIgPSBvcHRzLnB5dGhvbi5tb2R1bGVOYW1lLnJlcGxhY2UoL1xcLi9nLCBcIi9cIik7IC8vIGpzaWkgcmVwbGFjZXMgXCIuXCIgd2l0aCBcIi9cIlxuICAgICAgY29uc3Qgc291cmNlID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICBwYXRoLmpvaW4oc3RhZ2luZywgXCJkaXN0L3B5dGhvbi9zcmNcIiwgcmVsZGlyKSxcbiAgICAgICk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmpvaW4ob3B0cy5weXRob24ub3V0ZGlyLCByZWxkaXIpO1xuICAgICAgYXdhaXQgZnMubW92ZShzb3VyY2UsIHRhcmdldCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuamF2YSkge1xuICAgICAgY29uc3Qgc291cmNlID0gcGF0aC5yZXNvbHZlKHBhdGguam9pbihzdGFnaW5nLCBcImRpc3QvamF2YS9zcmMvXCIpKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHBhdGguam9pbihvcHRzLmphdmEub3V0ZGlyLCBcInNyYy9cIik7XG4gICAgICBhd2FpdCBmcy5ta2RpcnAodGFyZ2V0KTsgLy8gbWFrZSBzdXJlIHRhcmdldCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCBmcy5jb3B5KHNvdXJjZSwgdGFyZ2V0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgb3ZlcndyaXRlOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jc2hhcnApIHtcbiAgICAgIGNvbnN0IHJlbGRpciA9IG9wdHMuY3NoYXJwLm5hbWVzcGFjZTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4oc3RhZ2luZywgXCJkaXN0L2RvdG5ldC9cIiwgcmVsZGlyKSk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmpvaW4ob3B0cy5jc2hhcnAub3V0ZGlyLCByZWxkaXIpO1xuICAgICAgYXdhaXQgZnMubW92ZShzb3VyY2UsIHRhcmdldCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZ29sYW5nKSB7XG4gICAgICBjb25zdCByZWxkaXIgPSBvcHRzLmdvbGFuZy5wYWNrYWdlTmFtZTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4oc3RhZ2luZywgXCJkaXN0L2dvL1wiLCByZWxkaXIpKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHBhdGguam9pbihvcHRzLmdvbGFuZy5vdXRkaXIsIHJlbGRpcik7XG4gICAgICBhd2FpdCBmcy5tb3ZlKHNvdXJjZSwgdGFyZ2V0LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICAgIC8vIHJlbW92ZSBnby5tb2QgYXMgdGhpcyB3b3VsZCBtYWtlIGl0IGEgc3VibW9kdWxlXG4gICAgICBhd2FpdCBmcy5yZW1vdmUocGF0aC5qb2luKHRhcmdldCwgXCJnby5tb2RcIikpO1xuICAgIH1cblxuICAgIFtcInZlcnNpb25zLmpzb25cIiwgXCJjb25zdHJhaW50cy5qc29uXCJdLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZzLmNvcHlTeW5jKFxuICAgICAgICAgIHBhdGgucmVzb2x2ZShzdGFnaW5nLCBmaWxlKSxcbiAgICAgICAgICBwYXRoLnJlc29sdmUob3V0cHV0UGF0aCwgZmlsZSksXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGNvcHkgJHtmaWxlfTogJHtlfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxudHlwZSBDb25zdHJhaW50RmlsZSA9IHsgcHJvdmlkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBjZGt0Zjogc3RyaW5nIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHRhcmdldExhbmd1YWdlOiBMYW5ndWFnZTtcbiAgcmVhZG9ubHkgY29kZU1ha2VyT3V0cHV0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGpzaWlQYXJhbGxlbGlzbT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBhdGggdG8gY29weSB0aGUgb3V0cHV0IC5qc2lpIGZpbGUuXG4gICAqIEBkZWZhdWx0IC0ganNpaSBmaWxlIGlzIG5vdCBlbWl0dGVkXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRKc2lpPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ29uc3RydWN0c01ha2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2RlTWFrZXJPdXRkaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb2RlOiBDb2RlTWFrZXI7XG4gIHByaXZhdGUgdmVyc2lvbnM6IHsgW3Byb3ZpZGVyTmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBHZXRPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hQ2FjaGVQYXRoPzogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0VGVsZW1ldHJ5OiAocGF5bG9hZDoge1xuICAgICAgdGFyZ2V0TGFuZ3VhZ2U6IHN0cmluZztcbiAgICAgIHRyYWNraW5nUGF5bG9hZDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9KSA9PiBQcm9taXNlPHZvaWQ+ID0gYXN5bmMgKCkgPT4ge30sXG4gICkge1xuICAgIHRoaXMuY29kZU1ha2VyT3V0ZGlyID0gcGF0aC5yZXNvbHZlKHRoaXMub3B0aW9ucy5jb2RlTWFrZXJPdXRwdXQpO1xuICAgIGZzLm1rZGlycFN5bmModGhpcy5jb2RlTWFrZXJPdXRkaXIpO1xuICAgIHRoaXMuY29kZSA9IG5ldyBDb2RlTWFrZXIoKTtcbiAgICB0aGlzLnZlcnNpb25zID0ge307XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVR5cGVzY3JpcHRQcm92aWRlcihcbiAgICB0YXJnZXQ6IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuICAgIHNjaGVtYTogUHJvdmlkZXJTY2hlbWEsXG4gICkge1xuICAgIGNvbnN0IGVuZFRTVGltZXIgPSBsb2dUaW1lc3BhbihgR2VuZXJhdGUgVHlwZXNjcmlwdCBmb3IgJHt0YXJnZXQubmFtZX1gKTtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3IodGhpcy5jb2RlLCBzY2hlbWEpO1xuICAgIGdlbmVyYXRvci5nZW5lcmF0ZSh0YXJnZXQpO1xuXG4gICAgdGhpcy52ZXJzaW9ucyA9IHsgLi4udGhpcy52ZXJzaW9ucywgLi4uZ2VuZXJhdG9yLnZlcnNpb25zIH07XG4gICAgZW5kVFNUaW1lcigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbHRlckFscmVhZHlHZW5lcmF0ZWQoXG4gICAgY29uc3RyYWludHM6IFRlcnJhZm9ybURlcGVuZGVuY3lDb25zdHJhaW50W10sXG4gICkge1xuICAgIGxldCBjb25zdHJhaW50c0ZpbGUgPSBcInt9XCI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0cmFpbnRzRmlsZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5jb2RlTWFrZXJPdXRkaXIsIFwiY29uc3RyYWludHMuanNvblwiKSxcbiAgICAgICAgXCJ1dGY4XCIsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGNvbnN0cmFpbnRzLmpzb24gZmlsZSB3aGlsZSBmaWx0ZXJpbmc6ICR7ZX0uIFRoaXMgbWVhbnMgbm8gcHJvdmlkZXJzIHdlcmUgZ2VuZXJhdGVkLCBzbyBhbGwgY29uc3RyYWludHMgbmVlZCB0byBiZSBnZW5lcmF0ZWQuYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gY29uc3RyYWludHM7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgY29uc3RyYWludHMuanNvbiBmaWxlOiAke2NvbnN0cmFpbnRzRmlsZX1gKTtcblxuICAgIGxldCBwcmV2aW91c0NvbnN0cmFpbnRzOiBQYXJ0aWFsPENvbnN0cmFpbnRGaWxlPiA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBwcmV2aW91c0NvbnN0cmFpbnRzID0gSlNPTi5wYXJzZShjb25zdHJhaW50c0ZpbGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgQ291bGQgbm90IHBhcnNlIGNvbnN0cmFpbnRzLmpzb24gZmlsZSB3aGlsZSBmaWx0ZXJpbmc6ICR7ZX0uIEdlbmVyYXRpbmcgYWxsIGNvbnN0cmFpbnRzLmAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBGb3VuZCBwcmV2aW91cyBjb25zdHJhaW50czogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgcHJldmlvdXNDb25zdHJhaW50cyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMixcbiAgICAgICl9YCxcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgIXByZXZpb3VzQ29uc3RyYWludHMucHJvdmlkZXJzIHx8XG4gICAgICB0eXBlb2YgcHJldmlvdXNDb25zdHJhaW50cy5wcm92aWRlcnMgIT09IFwib2JqZWN0XCJcbiAgICApIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgcHJvdmlkZXJzIGluIGNvbnN0cmFpbnRzLmpzb24gZmlsZSwgZ2VuZXJhdGluZyBhbGwgY29uc3RyYWludHMuIFRoZSBjb25zdHJhaW50cyBmaWxlIHdhcyAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHByZXZpb3VzQ29uc3RyYWludHMsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzO1xuICAgIH1cblxuICAgIGlmIChwcmV2aW91c0NvbnN0cmFpbnRzLmNka3RmICE9PSBESVNQTEFZX1ZFUlNJT04pIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgVGhlIENES1ROIHZlcnNpb24gaGFzIGNoYW5nZWQsIGdlbmVyYXRpbmcgYWxsIGNvbnN0cmFpbnRzLiBUaGUgcHJldmlvdXMgdmVyc2lvbiB3YXMgJHtwcmV2aW91c0NvbnN0cmFpbnRzLmNka3RmfSwgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyAke0RJU1BMQVlfVkVSU0lPTn1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBjb25zdHJhaW50cztcbiAgICB9XG5cbiAgICBjb25zdCBjb25zdHJhaW50c1RvR2VuZXJhdGUgPSBjb25zdHJhaW50cy5maWx0ZXIoKGNvbnN0cmFpbnQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnRNYXRjaGVzID1cbiAgICAgICAgcHJldmlvdXNDb25zdHJhaW50cy5wcm92aWRlcnMhW2NvbnN0cmFpbnQuZnFuXSA9PT0gY29uc3RyYWludC52ZXJzaW9uO1xuICAgICAgbGV0IHByb3ZpZGVyRm9sZGVyRXhpc3RzID0gZmFsc2U7XG5cbiAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLnRhcmdldExhbmd1YWdlKSB7XG4gICAgICAgIGNhc2UgTGFuZ3VhZ2UuVFlQRVNDUklQVDpcbiAgICAgICAgICBwcm92aWRlckZvbGRlckV4aXN0cyA9IGZzLmV4aXN0c1N5bmMoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5jb2RlTWFrZXJPdXRkaXIsIFwicHJvdmlkZXJzXCIsIGNvbnN0cmFpbnQubmFtZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMYW5ndWFnZS5QWVRIT046XG4gICAgICAgIGNhc2UgTGFuZ3VhZ2UuSkFWQTpcbiAgICAgICAgY2FzZSBMYW5ndWFnZS5DU0hBUlA6XG4gICAgICAgICAgcHJvdmlkZXJGb2xkZXJFeGlzdHMgPSBmcy5leGlzdHNTeW5jKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMuY29kZU1ha2VyT3V0ZGlyLCBjb25zdHJhaW50Lm5hbWUpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTGFuZ3VhZ2UuR086XG4gICAgICAgICAgcHJvdmlkZXJGb2xkZXJFeGlzdHMgPSBmcy5leGlzdHNTeW5jKFxuICAgICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgICB0aGlzLmNvZGVNYWtlck91dGRpcixcbiAgICAgICAgICAgICAgY29uc3RyYWludC5uYW1lc3BhY2UgfHwgXCJoYXNoaWNvcnBcIixcbiAgICAgICAgICAgICAgY29uc3RyYWludC5uYW1lLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm92aWRlckV4aXN0cyA9IGNvbnN0cmFpbnRNYXRjaGVzICYmIHByb3ZpZGVyRm9sZGVyRXhpc3RzO1xuICAgICAgcmV0dXJuICFwcm92aWRlckV4aXN0cztcbiAgICB9KTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBDb25zdHJhaW50cyB0byBnZW5lcmF0ZTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgY29uc3RyYWludHNUb0dlbmVyYXRlLFxuICAgICAgICBudWxsLFxuICAgICAgICAyLFxuICAgICAgKX1gLFxuICAgICk7XG5cbiAgICByZXR1cm4gY29uc3RyYWludHNUb0dlbmVyYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVR5cGVzY3JpcHRNb2R1bGUoXG4gICAgdGFyZ2V0OiBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQsXG4gICAgc2NoZW1hOiBNb2R1bGVTY2hlbWEsXG4gICkge1xuICAgIGNvbnN0IGVuZFRTVGltZXIgPSBsb2dUaW1lc3BhbihgR2VuZXJhdGUgVHlwZXNjcmlwdCBmb3IgJHt0YXJnZXQubmFtZX1gKTtcbiAgICB0YXJnZXQuc3BlYyA9IHNjaGVtYTtcbiAgICBuZXcgTW9kdWxlR2VuZXJhdG9yKHRoaXMuY29kZSwgW3RhcmdldF0pO1xuICAgIGVuZFRTVGltZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVUeXBlc2NyaXB0KFxuICAgIHRhcmdldDogQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICAgIHNjaGVtYXM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgcmVhZFNjaGVtYT4+LFxuICApIHtcbiAgICBpZiAodGFyZ2V0LmlzTW9kdWxlKSB7XG4gICAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFzLm1vZHVsZVNjaGVtYT8uW3RhcmdldC5tb2R1bGVLZXldO1xuICAgICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JzLkludGVybmFsKFxuICAgICAgICAgIGBDb3VsZCBub3QgZ2VuZXJhdGUgc2NoZW1hIGZvciBtb2R1bGUgJHt0YXJnZXQubW9kdWxlS2V5fWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVUeXBlc2NyaXB0TW9kdWxlKFxuICAgICAgICB0YXJnZXQgYXMgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0LFxuICAgICAgICBzY2hlbWEsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0LmlzUHJvdmlkZXIpIHtcbiAgICAgIGlmICghc2NoZW1hcy5wcm92aWRlclNjaGVtYSkge1xuICAgICAgICB0aHJvdyBFcnJvcnMuSW50ZXJuYWwoYENvdWxkIG5vdCBnZW5lcmF0ZSBzY2hlbWEgZm9yIHByb3ZpZGVyc2ApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlVHlwZXNjcmlwdFByb3ZpZGVyKFxuICAgICAgICB0YXJnZXQgYXMgQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQsXG4gICAgICAgIHNjaGVtYXMucHJvdmlkZXJTY2hlbWEsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmtub3duIHRhcmdldCB0eXBlIHVzZWQgdG8gZ2VuZXJhdGUgYmluZGluZ3M6ICR7dGFyZ2V0Lm5hbWV9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gZW1pdHMgYSB2ZXJzaW9ucy5qc29uIGZpbGUgd2l0aCBhIG1hcCBvZiB0aGUgdXNlZCB2ZXJzaW9uIGZvciBlYWNoIHByb3ZpZGVyIGZxcG5cbiAgcHJpdmF0ZSB1cGRhdGVWZXJzaW9uc0ZpbGUoXG4gICAgYWxsb3dlZENvbnN0cmFpbnRzOiBUZXJyYWZvcm1EZXBlbmRlbmN5Q29uc3RyYWludFtdLFxuICApIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgVXBkYXRpbmcgdmVyc2lvbnMgZmlsZSB3aXRoIGdlbmVyYXRlZCB2ZXJzaW9ucyAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICB0aGlzLnZlcnNpb25zLFxuICAgICAgICBudWxsLFxuICAgICAgICAyLFxuICAgICAgKX0gd2l0aCBhbGxvd2VkIGNvbnN0cmFpbnRzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGFsbG93ZWRDb25zdHJhaW50cyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMixcbiAgICAgICl9YCxcbiAgICApO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gXCJ2ZXJzaW9ucy5qc29uXCI7XG4gICAgbGV0IHByZXZpb3VzVmVyc2lvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICB0cnkge1xuICAgICAgcHJldmlvdXNWZXJzaW9ucyA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUodGhpcy5jb2RlTWFrZXJPdXRkaXIsIGZpbGVQYXRoKSwgXCJ1dGY4XCIpLFxuICAgICAgKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgUmVhZCBleGlzdGluZyB2ZXJzaW9ucyBmaWxlOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHByZXZpb3VzVmVyc2lvbnMsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgQ291bGQgbm90IHJlYWQgdmVyc2lvbnMgZmlsZSwgdGhpcyBpcyBleHBlY3RlZCBpZiB0aGVyZSBhcmUgbm8gcHJlLWV4aXN0aW5nIGxvY2FsIHByb3ZpZGVyczogJHtlfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZlcnNpb25zID0gYWxsb3dlZENvbnN0cmFpbnRzLnJlZHVjZSgoYWNjLCBjb25zdHJhaW50KSA9PiB7XG4gICAgICBjb25zdCBwcm92aWRlciA9IE9iamVjdC5lbnRyaWVzKHByZXZpb3VzVmVyc2lvbnMpLmZpbmQoKFtuYW1lXSkgPT5cbiAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBtb3JlIHJlZmluZWQsIGJ1dCBpdCdzIGdvb2QgZW5vdWdoIGZvciBub3dcbiAgICAgICAgbmFtZS5lbmRzV2l0aChjb25zdHJhaW50LmZxbiksXG4gICAgICApO1xuXG4gICAgICBpZiAocHJvdmlkZXIpIHtcbiAgICAgICAgY29uc3QgW25hbWUsIHZlcnNpb25dID0gcHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB7IC4uLmFjYywgW25hbWVdOiB2ZXJzaW9uIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYFdyaXRpbmcgdmVyc2lvbnMgZmlsZSAoJHtmaWxlUGF0aH0pOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICB2ZXJzaW9ucyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMixcbiAgICAgICl9YCxcbiAgICApO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKGZpbGVQYXRoKTtcbiAgICB0aGlzLmNvZGUubGluZShKU09OLnN0cmluZ2lmeSh7IC4uLnZlcnNpb25zLCAuLi50aGlzLnZlcnNpb25zIH0sIG51bGwsIDIpKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VGaWxlKGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVtb3ZlRm9sZGVyc1RoYXRTaG91bGROb3RFeGlzdChcbiAgICBjb25zdHJhaW50c1RoYXRTaG91bGRFeGlzdDogVGVycmFmb3JtRGVwZW5kZW5jeUNvbnN0cmFpbnRbXSxcbiAgKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYFJlbW92aW5nIHByb3ZpZGVycyBleGNlcHQgZm9yICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGNvbnN0cmFpbnRzVGhhdFNob3VsZEV4aXN0LFxuICAgICAgICBudWxsLFxuICAgICAgICAyLFxuICAgICAgKX1gLFxuICAgICk7XG5cbiAgICAvLyBBbGwgbGFuZ3VhZ2VzIGJlc2lkZXMgVFMga2VlcCB0aGVpciBwcm92aWRlcnMgaW4gdGhlIHNhbWUgZm9sZGVycyBhcyBtb2R1bGVzXG4gICAgLy8gdGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIGZvciB1cyB0byBkaXN0aW5ndWlzaCBhIG5vIGxvbmdlciByZXF1aXJlZCBwcm92aWRlclxuICAgIC8vIGZyb20gYSBtYW51YWxseSB3cml0dGVuIGNvbnN0cnVjdCBvciBhIG1vZHVsZVxuICAgIGlmICghdGhpcy5pc0phdmFzY3JpcHRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZmlsZXNJblByb3ZpZGVyczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwcm92aWRlcnNGb2xkZXIgPSBwYXRoLnJlc29sdmUodGhpcy5jb2RlTWFrZXJPdXRkaXIsIFwicHJvdmlkZXJzXCIpO1xuICAgIHRyeSB7XG4gICAgICBmaWxlc0luUHJvdmlkZXJzID0gYXdhaXQgZnMucmVhZGRpcihwcm92aWRlcnNGb2xkZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYEVycm9yIGxpc3RpbmcgZmlsZXMgaW4gcHJvdmlkZXJzIGZvbGRlciAnJHtwcm92aWRlcnNGb2xkZXJ9JzogJHtlfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlcnMgPSBmaWxlc0luUHJvdmlkZXJzLmZpbHRlcigoZmlsZSkgPT5cbiAgICAgIGZzXG4gICAgICAgIC5zdGF0U3luYyhwYXRoLnJlc29sdmUodGhpcy5jb2RlTWFrZXJPdXRkaXIsIFwicHJvdmlkZXJzXCIsIGZpbGUpKVxuICAgICAgICAuaXNEaXJlY3RvcnkoKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGZvbGRlcnMuZm9yRWFjaCgoZm9sZGVyKSA9PiB7XG4gICAgICBjb25zdCBzaG91bGRFeGlzdCA9IGNvbnN0cmFpbnRzVGhhdFNob3VsZEV4aXN0LnNvbWUoXG4gICAgICAgIChjb25zdHJhaW50KSA9PiBjb25zdHJhaW50Lm5hbWUgPT09IGZvbGRlcixcbiAgICAgICk7XG5cbiAgICAgIGlmICghc2hvdWxkRXhpc3QpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZW1vdmluZyBmb2xkZXIgJHtmb2xkZXJ9IGZyb20gcHJvdmlkZXJzYCk7XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5yZXNvbHZlKHRoaXMuY29kZU1ha2VyT3V0ZGlyLCBcInByb3ZpZGVyc1wiLCBmb2xkZXIpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGVtaXRzIGEgY29uc3RyYWludHMuanNvbiBmaWxlIHdpdGggYSBtYXAgb2YgdGhlIHVzZWQgcHJvdmlkZXIgZnFwbnMgYW5kIHZlcnNpb24gY29uc3RyYWludHNcbiAgLy8gdGhpcyBpcyB1c2VkIGZvciBjYWNoaW5nIHB1cnBvc2VzXG4gIHByaXZhdGUgZW1pdENvbnN0cmFpbnRzRmlsZShcbiAgICBhbGxvd2VkQ29uc3RyYWludHM6IFRlcnJhZm9ybURlcGVuZGVuY3lDb25zdHJhaW50W10sXG4gICkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gXCJjb25zdHJhaW50cy5qc29uXCI7XG5cbiAgICBjb25zdCBjb250ZW50OiBDb25zdHJhaW50RmlsZSA9IHtcbiAgICAgIGNka3RmOiBESVNQTEFZX1ZFUlNJT04sXG4gICAgICBwcm92aWRlcnM6IGFsbG93ZWRDb25zdHJhaW50c1xuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5mcW4ubG9jYWxlQ29tcGFyZShiLmZxbikpXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGNhcnJ5LCBpdGVtKSA9PiAoe1xuICAgICAgICAgICAgLi4uY2FycnksXG4gICAgICAgICAgICBbaXRlbS5mcW5dOiBpdGVtLnZlcnNpb24sXG4gICAgICAgICAgfSksXG4gICAgICAgICAge30sXG4gICAgICAgICksXG4gICAgfTtcblxuICAgIHRoaXMuY29kZS5vcGVuRmlsZShmaWxlUGF0aCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoSlNPTi5zdHJpbmdpZnkoY29udGVudCwgbnVsbCwgMikpO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUoZmlsZVBhdGgpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVKc2lpTGFuZ3VhZ2UodGFyZ2V0OiBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQpIHtcbiAgICAvLyB0aGVzZSBhcmUgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgd2UgY29tcGlsZSBhZ2FpbnN0XG4gICAgY29uc3QgZGVwcyA9IFtcIkB0eXBlcy9ub2RlXCIsIFwiY29uc3RydWN0c1wiLCBcImNka3RuXCJdO1xuICAgIGNvbnN0IG9wdHM6IEdlbmVyYXRlSlNJSU9wdGlvbnMgPSB7XG4gICAgICBlbnRyeXBvaW50OiB0YXJnZXQuZmlsZU5hbWUsXG4gICAgICBkZXBzOiBkZXBzLm1hcCgoZGVwKSA9PlxuICAgICAgICBwYXRoLmRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKGAke2RlcH0vcGFja2FnZS5qc29uYCkpLFxuICAgICAgKSxcbiAgICAgIG1vZHVsZUtleTogdGFyZ2V0Lm1vZHVsZUtleSxcbiAgICAgIGV4cG9ydHM6IHRhcmdldC5pc1Byb3ZpZGVyIC8vIE1vZHVsZXMgYXJlIHNtYWxsIGVub3VnaCB0aGF0IHdlIGRvbid0IG5lZWQgdGhpcyBvcHRpbWl6YXRpb25cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBcIi5cIjoge1xuICAgICAgICAgICAgICBpbXBvcnQ6IGAuL3Byb3ZpZGVycy8ke3RhcmdldC5uYW1lfS9pbmRleC5qc2AsXG4gICAgICAgICAgICAgIHJlcXVpcmU6IGAuL3Byb3ZpZGVycy8ke3RhcmdldC5uYW1lfS9sYXp5LWluZGV4LmpzYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgLy8gdXNlZCBmb3IgdGVzdGluZy5cbiAgICBpZiAodGhpcy5vcHRpb25zLm91dHB1dEpzaWkpIHtcbiAgICAgIG9wdHMuanNpaSA9IHsgcGF0aDogdGhpcy5vcHRpb25zLm91dHB1dEpzaWkgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1B5dGhvblRhcmdldCkge1xuICAgICAgb3B0cy5weXRob24gPSB7XG4gICAgICAgIG91dGRpcjogdGhpcy5jb2RlTWFrZXJPdXRkaXIsXG4gICAgICAgIG1vZHVsZU5hbWU6IHRhcmdldC5zcmNNYWtOYW1lLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0phdmFUYXJnZXQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvZGVNYWtlck91dHB1dC5pbmNsdWRlcyhcIi9cIikgfHxcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvZGVNYWtlck91dHB1dC5pbmNsdWRlcyhcIlxcXFxcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBFcnJvcnMuVXNhZ2UoXG4gICAgICAgICAgYFdoZW4gdXNpbmcgSmF2YSB0aGUgXCJjb2RlTWFrZXJPdXRwdXRcIiBvcHRpb24gaW4gdGhlIGNka3RmLmpzb24gbXVzdCBiZSB0aGUgb3JnYW5pemF0aW9uIGlkZW50aWZpZXIgZm9yIHlvdXIgcHJvamVjdCAoZS5nLiBjb20ubXktY29tcGFueSksIG5vdCBhIHBhdGguIFRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlIHdpbGwgYmUgcGxhY2VkIGluIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBnaXZlbiBkaXJlY3RvcnkuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYSA8IDAuMTkgdmVyc2lvbiBvZiBjZGt0ZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGNvZGVtYWtlck91dHB1dCB0byBcImltcG9ydHNcIi5gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBvcHRzLmphdmEgPSB7XG4gICAgICAgIG91dGRpcjogXCIuXCIsIC8vIGdlbmVyYXRlZCBqYXZhIGZpbGVzIGFyZW4ndCBwYWNrYWdlZCwgc28ganVzdCBpbmNsdWRlIGRpcmVjdGx5IGluIGFwcFxuICAgICAgICBwYWNrYWdlOiBgJHt0aGlzLm9wdGlvbnMuY29kZU1ha2VyT3V0cHV0fS4ke3RhcmdldC5zcmNNYWtOYW1lfWAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ3NoYXJwVGFyZ2V0KSB7XG4gICAgICBvcHRzLmNzaGFycCA9IHtcbiAgICAgICAgb3V0ZGlyOiB0aGlzLmNvZGVNYWtlck91dGRpcixcbiAgICAgICAgbmFtZXNwYWNlOiB0YXJnZXQuc3JjTWFrTmFtZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNHb1RhcmdldCkge1xuICAgICAgLy8gVE9ETzogY2hlY2sgaWYgbmVlZGVkIGZvciBtb2R1bGVzIHNvbWVob3dcbiAgICAgIC8vIGNvbnN0IHRhcmdldFR5cGUgPSB0YXJnZXQuaXNQcm92aWRlciA/ICdwcm92aWRlcicgOiAnbW9kdWxlJztcblxuICAgICAgLy8ganNpaS1zcmNtYWMgd2lsbCBwcm9kdWNlIGEgZm9sZGVyIGluc2lkZSB0aGlzIGRpciBuYW1lZCBhZnRlciBcInBhY2thZ2VOYW1lXCJcbiAgICAgIC8vIHNvIHRoaXMgcmVzdWx0cyBpbiBlLmcuIC5nZW4vaGFzaGljb3JwL3JhbmRvbVxuICAgICAgY29uc3Qgb3V0ZGlyID0gcGF0aC5qb2luKHRoaXMuY29kZU1ha2VyT3V0ZGlyLCB0YXJnZXQubmFtZXNwYWNlID8/IFwiXCIpO1xuXG4gICAgICBvcHRzLmdvbGFuZyA9IHtcbiAgICAgICAgb3V0ZGlyLFxuICAgICAgICBtb2R1bGVOYW1lOiBhd2FpdCBkZXRlcm1pbmVHb01vZHVsZU5hbWUob3V0ZGlyKSwgLy8gZS5nLiBgZ2l0aHViLmNvbS9vcmcvdXNlcnByb2plY3QvLmdlbi9oYXNoaWNvcnBgXG4gICAgICAgIHBhY2thZ2VOYW1lOiB0YXJnZXQuc3JjTWFrTmFtZSwgLy8gcGFja2FnZSB3aWxsIGJlIG5hbWVkIGUuZy4gcmFuZG9tIGZvciBoYXNoaWNvcnAvcmFuZG9tXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OUyAmJlxuICAgICAgIXByb2Nlc3MuZW52Lk5PREVfT1BUSU9OUy5pbmNsdWRlcyhgLS1tYXgtb2xkLXNwYWNlLXNpemVgKVxuICAgICkge1xuICAgICAgbG9nZ2VyLndhcm4oYGZvdW5kIE5PREVfT1BUSU9OUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRob3V0IGEgc2V0dGluZyBmb3IgLS1tYXgtb2xkLXNwYWNlLXNpemUuXG5UaGUgcHJvdmlkZXIgZ2VuZXJhdGlvbiBuZWVkcyBhIHN1YnN0YW50aWFsIGFtb3VudCBvZiBtZW1vcnkgKH4xM0dCKSBmb3Igc29tZSBwcm92aWRlcnMgYW5kIGxhbmd1YWdlcy5cblNvIGNka3RuLWNsaSBzZXRzIGl0IHRvIE5PREVfT1BUSU9OUz1cIi0tbWF4LW9sZC1zcGFjZS1zaXplPTE2Mzg0XCIgYnkgZGVmYXVsdC4gQXMgeW91ciBlbnZpcm9ubWVudCBhbHJlYWR5IGNvbnRhaW5zXG5hIE5PREVfT1BUSU9OUyB2YXJpYWJsZSwgd2Ugd29uJ3Qgb3ZlcnJpZGUgaXQuIEhlbmNlLCB0aGUgcHJvdmlkZXIgZ2VuZXJhdGlvbiBtaWdodCBmYWlsIHdpdGggYW4gb3V0IG9mIG1lbW9yeSBlcnJvci5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW5jcmVhc2UgbWVtb3J5IHRvIGFsbG93IGdlbmVyYXRpbmcgbGFyZ2UgcHJvdmlkZXJzIChpLmUuIGF3cyBvciBhenVyZXJtIGZvciBHbylcbiAgICAgIC8vIHNyY21hayBpcyBnb2luZyB0byBzcGF3biBhIGNoaWxkcHJvY2VzcyAoZm9yIGpzaWktcGFjbWFrKSB3aGljaCBpcyBnb2luZyB0byBiZSBhZmZlY3RlZCBieSB0aGlzIGVudiB2YXJcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OUyA9IFwiLS1tYXgtb2xkLXNwYWNlLXNpemU9MTYzODRcIjtcbiAgICB9XG5cbiAgICBjb25zdCBqc2lpVGltZXIgPSBsb2dUaW1lc3BhbihcIkpTSUlcIik7XG4gICAgYXdhaXQgZ2VuZXJhdGVKc2lpTGFuZ3VhZ2UodGhpcy5jb2RlLCBvcHRzLCB0aGlzLmNvZGVNYWtlck91dGRpciwgW1xuICAgICAgdGFyZ2V0LmlzTW9kdWxlID8gXCJwcm92aWRlcnMvKipcIiA6IFwibW9kdWxlcy8qKlwiLFxuICAgIF0pO1xuICAgIGpzaWlUaW1lcigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNjaGVtYXModGFyZ2V0czogVGVycmFmb3JtRGVwZW5kZW5jeUNvbnN0cmFpbnRbXSkge1xuICAgIHJldHVybiBhd2FpdCByZWFkU2NoZW1hKHRhcmdldHMsIHRoaXMuc2NoZW1hQ2FjaGVQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZW5lcmF0ZShcbiAgICBhbGxDb25zdHJhaW50czogVGVycmFmb3JtRGVwZW5kZW5jeUNvbnN0cmFpbnRbXSxcbiAgICBjb25zdHJhaW50c1RvR2VuZXJhdGUgPSBhbGxDb25zdHJhaW50cyxcbiAgKSB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGNvbnN0cmFpbnRzVG9HZW5lcmF0ZS5tYXAoKGNvbnN0cmFpbnQpID0+XG4gICAgICBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQuZnJvbShjb25zdHJhaW50LCB0aGlzLm9wdGlvbnMudGFyZ2V0TGFuZ3VhZ2UpLFxuICAgICk7XG5cbiAgICBjb25zdCBlbmRTY2hlbWFUaW1lciA9IGxvZ1RpbWVzcGFuKFwiR2F0aGVyaW5nIHNjaGVtYVwiKTtcbiAgICBjb25zdCBzY2hlbWFzID0gYXdhaXQgdGhpcy5nZXRTY2hlbWFzKGNvbnN0cmFpbnRzVG9HZW5lcmF0ZSk7XG4gICAgZW5kU2NoZW1hVGltZXIoKTtcblxuICAgIGNvbnN0IGVuZEdlbmVyYXRlVGltZXIgPSBsb2dUaW1lc3BhbihcIkdlbmVyYXRlIFRTXCIpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4gdGhpcy5nZW5lcmF0ZVR5cGVzY3JpcHQodGFyZ2V0LCBzY2hlbWFzKSksXG4gICAgKTtcbiAgICBlbmRHZW5lcmF0ZVRpbWVyKCk7XG5cbiAgICB0aGlzLnVwZGF0ZVZlcnNpb25zRmlsZShhbGxDb25zdHJhaW50cyk7XG4gICAgdGhpcy5lbWl0Q29uc3RyYWludHNGaWxlKGFsbENvbnN0cmFpbnRzKTtcblxuICAgIGlmICh0aGlzLmlzSmF2YXNjcmlwdFRhcmdldCkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzSmF2YXNjcmlwdFRhcmdldCB8fCB0aGlzLm9wdGlvbnMub3V0cHV0SnNpaSkge1xuICAgICAgY29uc3QgbnVtYmVyT2ZXb3JrZXJzID0gTWF0aC5tYXgoXG4gICAgICAgIDEsXG4gICAgICAgIHRoaXMub3B0aW9ucy5qc2lpUGFyYWxsZWxpc20gPT09IC0xXG4gICAgICAgICAgPyB0YXJnZXRzLmxlbmd0aFxuICAgICAgICAgIDogdGhpcy5vcHRpb25zLmpzaWlQYXJhbGxlbGlzbSB8fCAxLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgd29yayA9IFsuLi50YXJnZXRzXTtcbiAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkobnVtYmVyT2ZXb3JrZXJzKS5maWxsKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IHRhcmdldDogQ29uc3RydWN0c01ha2VyVGFyZ2V0IHwgdW5kZWZpbmVkO1xuICAgICAgICB3aGlsZSAoKHRhcmdldCA9IHdvcmsucG9wKCkpKSB7XG4gICAgICAgICAgY29uc3QgZW5kSnNpaVRhcmdldCA9IGxvZ1RpbWVzcGFuKFxuICAgICAgICAgICAgYEdlbmVyYXRpbmcgSlNJSSBiaW5kaW5ncyBmb3IgJHt0YXJnZXQubmFtZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUpzaWlMYW5ndWFnZSh0YXJnZXQpO1xuICAgICAgICAgIGVuZEpzaWlUYXJnZXQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdvcmtlcnMubWFwKChmbikgPT4gZm4oKSkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVwb3J0VGVsZW1ldHJ5KHtcbiAgICAgICAgdHJhY2tpbmdQYXlsb2FkOiB0YXJnZXQudHJhY2tpbmdQYXlsb2FkLFxuICAgICAgICB0YXJnZXRMYW5ndWFnZTogdGFyZ2V0LnRhcmdldExhbmd1YWdlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNQeXRob25UYXJnZXQpIHtcbiAgICAgIGNvbnN0IGVuZFB5dGhvblRpbWVyID0gbG9nVGltZXNwYW4oXCJQeXRob24gcG9zdC1wcm9jZXNzaW5nXCIpO1xuICAgICAgLy8gUmVtb3ZlIGZyb20gLiBpbXBvcnQgLi4uIHN0YXRlbWVudHMgZnJvbSByb290IGxldmVsIF9faW5pdF9fLnB5XG4gICAgICAvLyBUaGlzIHJlbW92ZXMgcm9vdC1sZXZlbCBpbXBvcnRzIG9mIG5hbWVzcGFjZXMsIGJ1dCBzYXZlcyAyNXMgc3ludGggdGltZSBmb3IgdGhlIGF3cyBwcm92aWRlciBhbG9uZVxuICAgICAgY29uc3QgYWxsSW5pdFB5UGF0aHMgPSBnbG9iXG4gICAgICAgIC5zeW5jKFwiKiovX19pbml0X18ucHlcIiwge1xuICAgICAgICAgIGN3ZDogdGhpcy5jb2RlTWFrZXJPdXRkaXIsXG4gICAgICAgIH0pXG4gICAgICAgIC8vIHNvcnQgYnkgZGVwdGgsIHNvIHdlIHN0YXJ0IHdpdGggdGhlIHNoYWxsb3dlc3QgZmlsZXNcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuc3BsaXQoXCIvXCIpLmxlbmd0aCAtIGIuc3BsaXQoXCIvXCIpLmxlbmd0aCk7XG5cbiAgICAgIGNvbnN0IHZpc2l0ZWREaXJlY3Rvcmllczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgaW5pdFB5UGF0aCBvZiBhbGxJbml0UHlQYXRocykge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnlQYXRoID0gcGF0aC5kaXJuYW1lKGluaXRQeVBhdGgpO1xuICAgICAgICBpZiAodmlzaXRlZERpcmVjdG9yaWVzLnNvbWUoKGRpcikgPT4gZGlyZWN0b3J5UGF0aC5zdGFydHNXaXRoKGRpcikpKSB7XG4gICAgICAgICAgLy8gd2UgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBkaXJlY3RvcnlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2aXNpdGVkRGlyZWN0b3JpZXMucHVzaChkaXJlY3RvcnlQYXRoKTtcblxuICAgICAgICBjb25zdCBhYnNvbHV0ZUluaXRQeVBhdGggPSBwYXRoLmpvaW4odGhpcy5jb2RlTWFrZXJPdXRkaXIsIGluaXRQeVBhdGgpO1xuICAgICAgICBjb25zdCBpbml0UHkgPSBhd2FpdCBmcy5yZWFkRmlsZShhYnNvbHV0ZUluaXRQeVBhdGgsIFwidXRmOFwiKTtcbiAgICAgICAgY29uc3QgaW5pdFB5V2l0aG91dEltcG9ydHMgPSBpbml0UHkucmVwbGFjZSgvZnJvbSBcXC4gaW1wb3J0IC4qXFxuL2csIFwiXCIpO1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoYWJzb2x1dGVJbml0UHlQYXRoLCBpbml0UHlXaXRob3V0SW1wb3J0cyk7XG4gICAgICB9XG5cbiAgICAgIGVuZFB5dGhvblRpbWVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlKG91dGRpciA9IHRoaXMuY29kZU1ha2VyT3V0ZGlyKSB7XG4gICAgYXdhaXQgdGhpcy5jb2RlLnNhdmUob3V0ZGlyKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzSmF2YXNjcmlwdFRhcmdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnRhcmdldExhbmd1YWdlID09PSBMYW5ndWFnZS5UWVBFU0NSSVBUO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaXNQeXRob25UYXJnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50YXJnZXRMYW5ndWFnZSA9PT0gTGFuZ3VhZ2UuUFlUSE9OO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaXNKYXZhVGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGFyZ2V0TGFuZ3VhZ2UgPT09IExhbmd1YWdlLkpBVkE7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc0NzaGFycFRhcmdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnRhcmdldExhbmd1YWdlID09PSBMYW5ndWFnZS5DU0hBUlA7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc0dvVGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGFyZ2V0TGFuZ3VhZ2UgPT09IExhbmd1YWdlLkdPO1xuICB9XG59XG5cbi8qKlxuICogc2VhcmNoZXMgZm9yIHRoZSBjbG9zZXN0IGBnby5tb2RgIGZpbGUgYW5kIHJldHVybnMgdGhlIG5lc3RlZCBnbyBtb2R1bGUgbmFtZSBmb3IgYGRpcmBcbiAqIGUuZy4gKC9kaXIvLmdlbi8pID0+IGNkay50Zi9zdGFjay8uZ2VuIGlmIHRoZSBwYXJlbnQgZGlyIG9mIC5nZW4gaGFzIGEgZ28ubW9kIGZvciBcIm1vZHVsZSBjZGsudGYvc3RhY2tcIlxuICpcbiAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20gKHNlYXJjaGVzIHVwd2FyZHMpXG4gKiBAcmV0dXJucyB0aGUgcGFja2FnZSBuYW1lIGZvciBgZGlyYFxuICogQHRocm93cyBhbiBFcnJvciBpZiBubyBnby5tb2Qgd2FzIGZvdW5kXG4gKi9cbmV4cG9ydCBjb25zdCBkZXRlcm1pbmVHb01vZHVsZU5hbWUgPSBhc3luYyAoZGlyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBsZXQgcHJldmlvdXNEaXI7XG4gIGxldCBjdXJyZW50RGlyID0gcGF0aC5yZXNvbHZlKGRpcik7XG5cbiAgZG8ge1xuICAgIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGN1cnJlbnREaXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgLy8gZGlyZWN0b3J5IG1pZ2h0IG5vdCBleGlzdCB5ZXQsIGJ1dCB3ZSBzdGlsbCB3YWxrIHVwd2FyZHMgZnJvbSB0aGVyZSwgc28gaWdub3JlICdFTk9FTlQnXG4gICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWxlcy5pbmNsdWRlcyhcImdvLm1vZFwiKSkge1xuICAgICAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShjdXJyZW50RGlyLCBcImdvLm1vZFwiKTtcbiAgICAgIGNvbnN0IGdvbW9kID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZSk7XG4gICAgICBjb25zdCBtYXRjaCA9IC9ebW9kdWxlXFxzKihcXFMqKVxccyokL20uZXhlYyhnb21vZC50b1N0cmluZygpKTtcbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFsxXSkge1xuICAgICAgICBjb25zdCBjaGlsZGRpciA9IHBhdGgucmVsYXRpdmUoY3VycmVudERpciwgZGlyKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTsgLy8gcmVwbGFjZSAnXFwnIHdpdGggJy8nIGZvciB3aW5kb3dzIHBhdGhzXG4gICAgICAgIHJldHVybiBjaGlsZGRpci5sZW5ndGggPiAwID8gYCR7bWF0Y2hbMV19LyR7Y2hpbGRkaXJ9YCA6IG1hdGNoWzFdO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGRldGVybWluZSB0aGUgcm9vdCBHbyBtb2R1bGUgbmFtZS4gRm91bmQgJHtmaWxlfSBidXQgZmFpbGVkIHRvIHJlZ2V4IG1hdGNoIHRoZSBtb2R1bGUgbmFtZSBkaXJlY3RpdmVgLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gZ28gdXAgb25lIGRpcmVjdG9yeS4gQXMgZGlybmFtZSgnLycpIHdpbGwgcmV0dXJuICcvJyB3ZSBjYW5jZWwgdGhlIGxvb3BcbiAgICAvLyBhcyBzb29uIGFzIHRoZSBkaXIgZG9lcyBub3QgY2hhbmdlIGFueW1vcmUuXG4gICAgcHJldmlvdXNEaXIgPSBjdXJyZW50RGlyO1xuICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gIH0gd2hpbGUgKGN1cnJlbnREaXIgIT09IHByZXZpb3VzRGlyKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIHJvb3QgR28gbW9kdWxlIG5hbWUuIE5vIGdvLm1vZCBmb3VuZCBpbiAke2Rpcn0gYW5kIGFueSBwYXJlbnQgZGlyZWN0b3JpZXNgLFxuICApO1xufTtcbiJdfQ==
533
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0cy1tYWtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZXQvY29uc3RydWN0cy1tYWtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsNkNBQStCO0FBQy9CLDJDQUE2QjtBQUM3Qix5Q0FBc0M7QUFDdEMsNENBQStDO0FBQy9DLDRDQVV3QjtBQUN4Qiw0Q0FBMkQ7QUFDM0QsdUVBQTRFO0FBQzVFLG1FQUErRDtBQUMvRCwrQkFBNEI7QUFDNUIsNERBQW9EO0FBRXBELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUNwRSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBaUQ3QyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLElBQWUsRUFDZixJQUF5QixFQUN6QixVQUFrQixFQUNsQixzQkFBZ0MsRUFBRTtJQUVsQyxNQUFNLElBQUEsaUJBQU8sRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDOUIsb0VBQW9FO1FBQ3BFLHNFQUFzRTtRQUN0RSxvQkFBb0I7UUFDcEIsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpCLDRFQUE0RTtRQUM1RSw0R0FBNEc7UUFDNUcsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDNUQsV0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FDckMsQ0FBQztRQUNGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElB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SUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QyxNQUFNLEtBQUssR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDNUQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyx5Q0FBeUM7Z0JBQzlHLE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQ2Isc0RBQXNELElBQUksc0RBQXNELENBQ2pILENBQUM7UUFDSixDQUFDO1FBQ0QsMEVBQTBFO1FBQzFFLDhDQUE4QztRQUM5QyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQ3pCLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLENBQUMsUUFBUSxVQUFVLEtBQUssV0FBVyxFQUFFO0lBRXJDLE1BQU0sSUFBSSxLQUFLLENBQ2IsbUVBQW1FLEdBQUcsNkJBQTZCLENBQ3BHLENBQUM7QUFDSixDQUFDLENBQUM7QUFuQ1csUUFBQSxxQkFBcUIseUJBbUNoQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IENvZGVNYWtlciB9IGZyb20gXCJjb2RlbWFrZXJcIjtcbmltcG9ydCB7IGV4ZWMsIG1rZHRlbXAgfSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7XG4gIFRlcnJhZm9ybURlcGVuZGVuY3lDb25zdHJhaW50LFxuICBsb2dnZXIsXG4gIGxvZ1RpbWVzcGFuLFxuICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldCxcbiAgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0LFxuICBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQsXG4gIFByb3ZpZGVyU2NoZW1hLFxuICBNb2R1bGVTY2hlbWEsXG4gIEVycm9ycyxcbn0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQgeyBESVNQTEFZX1ZFUlNJT04sIExhbmd1YWdlIH0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvciB9IGZyb20gXCIuL2dlbmVyYXRvci9wcm92aWRlci1nZW5lcmF0b3JcIjtcbmltcG9ydCB7IE1vZHVsZUdlbmVyYXRvciB9IGZyb20gXCIuL2dlbmVyYXRvci9tb2R1bGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBnbG9iIH0gZnJvbSBcImdsb2JcIjtcbmltcG9ydCB7IHJlYWRTY2hlbWEgfSBmcm9tIFwiQGNka3RuL3Byb3ZpZGVyLXNjaGVtYVwiO1xuXG5jb25zdCBwYWNtYWtNb2R1bGUgPSByZXF1aXJlLnJlc29sdmUoXCJqc2lpLXBhY21hay9iaW4vanNpaS1wYWNtYWtcIik7XG5jb25zdCBqc2lpTW9kdWxlID0gcmVxdWlyZS5yZXNvbHZlKFwianNpaS9iaW4vanNpaVwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUpTSUlPcHRpb25zIHtcbiAgZW50cnlwb2ludDogc3RyaW5nO1xuICBkZXBzOiBzdHJpbmdbXTtcbiAgbW9kdWxlS2V5OiBzdHJpbmc7XG4gIGV4cG9ydHM/OiBSZWNvcmQ8c3RyaW5nLCBFeHBvcnREZWZpbml0aW9uIHwgc3RyaW5nPjtcbiAganNpaT86IEpzaWlPdXRwdXRPcHRpb25zO1xuICBweXRob24/OiBQeXRob25PdXRwdXRPcHRpb25zO1xuICBqYXZhPzogSmF2YU91dHB1dE9wdGlvbnM7XG4gIGNzaGFycD86IENTaGFycE91dHB1dE9wdGlvbnM7XG4gIGdvbGFuZz86IEdvTGFuZ091dHB1dE9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNpaU91dHB1dE9wdGlvbnMge1xuICBwYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHl0aG9uT3V0cHV0T3B0aW9ucyB7XG4gIG91dGRpcjogc3RyaW5nO1xuICBtb2R1bGVOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSmF2YU91dHB1dE9wdGlvbnMge1xuICBvdXRkaXI6IHN0cmluZztcbiAgcGFja2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENTaGFycE91dHB1dE9wdGlvbnMge1xuICBvdXRkaXI6IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR29MYW5nT3V0cHV0T3B0aW9ucyB7XG4gIG91dGRpcjogc3RyaW5nO1xuICBtb2R1bGVOYW1lOiBzdHJpbmc7XG4gIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogU2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcGFja2FnZXMuaHRtbCNjb25kaXRpb25hbC1leHBvcnRzIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0RGVmaW5pdGlvbiB7XG4gIG5vZGU/OiBzdHJpbmc7XG4gIGltcG9ydD86IHN0cmluZztcbiAgcmVxdWlyZT86IHN0cmluZztcbiAgZGVmYXVsdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSnNpaUxhbmd1YWdlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIG9wdHM6IEdlbmVyYXRlSlNJSU9wdGlvbnMsXG4gIG91dHB1dFBhdGg6IHN0cmluZyxcbiAgZGlzYWxsb3dlZEZpbGVHbG9iczogc3RyaW5nW10gPSBbXSxcbikge1xuICBhd2FpdCBta2R0ZW1wKGFzeW5jIChzdGFnaW5nKSA9PiB7XG4gICAgLy8gdGhpcyBpcyBub3QgdHlwZXNjcmlwdCwgc28gd2UgZ2VuZXJhdGUgaW4gYSBzdGFnaW5nIGRpcmVjdG9yeSBhbmRcbiAgICAvLyB1c2UganNpaS1zcmNtYWsgdG8gY29tcGlsZSBhbmQgZXh0cmFjdCB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgc291cmNlXG4gICAgLy8gaW50byBvdXIgcHJvamVjdC5cbiAgICBhd2FpdCBjb2RlLnNhdmUoc3RhZ2luZyk7XG5cbiAgICAvLyBhcyB0aGUgYWJvdmUgZ2VuZXJhdGVkIHRoZSBUeXBlc2NyaXB0IGNvZGUgZm9yIGFsbCBwcm92aWRlcnMgYW5kIG1vZHVsZXMsXG4gICAgLy8gd2UgbmVlZCB0byBmaWx0ZXIgb3V0IHRoZSBvbmVzIHdlIGRvbid0IG5lZWQgc28gdGhleSBkb24ndCBlbmQgdXAgaW4gdGhlIEpTSUkgYnVuZGxlIG92ZXIgYW5kIG92ZXIgYWdhaW4uXG4gICAgY29uc3QgZmlsZXNUb0RlbGV0ZSA9IGRpc2FsbG93ZWRGaWxlR2xvYnMuZmxhdE1hcCgocGF0dGVybikgPT5cbiAgICAgIGdsb2Iuc3luYyhwYXR0ZXJuLCB7IGN3ZDogc3RhZ2luZyB9KSxcbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXNUb0RlbGV0ZS5tYXAoKGZpbGUpID0+IGZzLnJlbW92ZShwYXRoLmpvaW4oc3RhZ2luZywgZmlsZSkpKSxcbiAgICApO1xuXG4gICAgLy8gQ29tcGlsZSB3aXRoIEpTSUlcbiAgICBjb25zdCBqc2lpQXJncyA9IFtcIi0tc2lsZW5jZS13YXJuaW5nc1wiLCBcInJlc2VydmVkLXdvcmRcIl07XG4gICAgY29uc3QganNpaUVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQ7XG4gICAgY29uc3QgYmFzZXBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwYXRoLmRpcm5hbWUoanNpaUVudHJ5cG9pbnQpLFxuICAgICAgcGF0aC5iYXNlbmFtZShqc2lpRW50cnlwb2ludCwgXCIudHNcIiksXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZHVsZUtleSA9IG9wdHMubW9kdWxlS2V5LnJlcGxhY2UoL1xcLi9nLCBcIlwiKS5yZXBsYWNlKC9cXC8vZywgXCJcIik7XG4gICAgY29uc3QgbW9kdWxlRGlycyA9IG9wdHMuZGVwcztcbiAgICBjb25zdCB0YXJnZXRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgZGVwczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgZGlyIG9mIG1vZHVsZURpcnMpIHtcbiAgICAgIC8vIHJlYWQgbW9kdWxlIG1ldGFkYXRhXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGZzLnJlYWRKc29uKHBhdGguam9pbihkaXIsIFwicGFja2FnZS5qc29uXCIpKTtcbiAgICAgIGNvbnN0IG1vZHVsZU5hbWU6IHN0cmluZyA9IG1ldGFkYXRhLm5hbWU7XG4gICAgICBjb25zdCBtb2R1bGVWZXJzaW9uOiBzdHJpbmcgPSBtZXRhZGF0YS52ZXJzaW9uO1xuXG4gICAgICBjb25zdCB0YXJnZXRkaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgIHBhdGguam9pbihzdGFnaW5nLCBcIm5vZGVfbW9kdWxlc1wiKSxcbiAgICAgICAgbW9kdWxlTmFtZSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBmcy5ta2RpcnAocGF0aC5kaXJuYW1lKHRhcmdldGRpcikpO1xuICAgICAgYXdhaXQgZnMuY29weShkaXIsIHRhcmdldGRpcik7XG5cbiAgICAgIC8vIGFkZCB0byBcImRlcHNcIiBhbmQgXCJwZWVyIGRlcHNcIlxuICAgICAgaWYgKCFtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoXCJAdHlwZXMvXCIpKSB7XG4gICAgICAgIGRlcHNbbW9kdWxlTmFtZV0gPSBtb2R1bGVWZXJzaW9uO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwa2cgPSB7XG4gICAgICBuYW1lOiBtb2R1bGVLZXksXG4gICAgICB2ZXJzaW9uOiBcIjAuMC4wXCIsXG4gICAgICBhdXRob3I6IFwiZ2VuZXJhdGVkQGdlbmVyYXRlZC5jb21cIixcbiAgICAgIG1haW46IGAke2Jhc2VwYXRofS5qc2AsXG4gICAgICB0eXBlczogYCR7YmFzZXBhdGh9LmQudHNgLFxuICAgICAgbGljZW5zZTogXCJVTkxJQ0VOU0VEXCIsXG4gICAgICByZXBvc2l0b3J5OiB7IHVybDogXCJodHRwOi8vZ2VuZXJhdGVkXCIsIHR5cGU6IFwiZ2l0XCIgfSxcbiAgICAgIGpzaWk6IHtcbiAgICAgICAgb3V0ZGlyOiBcImRpc3RcIixcbiAgICAgICAgdGFyZ2V0czogdGFyZ2V0cyxcbiAgICAgIH0sXG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcHMsXG4gICAgICBwZWVyRGVwZW5kZW5jaWVzOiBkZXBzLFxuICAgIH07XG5cbiAgICBpZiAob3B0cy5leHBvcnRzKSB7XG4gICAgICAocGtnIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLmV4cG9ydHMgPSBvcHRzLmV4cG9ydHM7XG4gICAgfVxuICAgIGlmIChvcHRzLnB5dGhvbikge1xuICAgICAgdGFyZ2V0cy5weXRob24gPSB7XG4gICAgICAgIGRpc3ROYW1lOiBcImdlbmVyYXRlZFwiLFxuICAgICAgICBtb2R1bGU6IG9wdHMucHl0aG9uLm1vZHVsZU5hbWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChvcHRzLmphdmEpIHtcbiAgICAgIHRhcmdldHMuamF2YSA9IHtcbiAgICAgICAgcGFja2FnZTogb3B0cy5qYXZhLnBhY2thZ2UsXG4gICAgICAgIG1hdmVuOiB7XG4gICAgICAgICAgZ3JvdXBJZDogXCJnZW5lcmF0ZWRcIixcbiAgICAgICAgICBhcnRpZmFjdElkOiBcImdlbmVyYXRlZFwiLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jc2hhcnApIHtcbiAgICAgIHRhcmdldHMuZG90bmV0ID0ge1xuICAgICAgICBuYW1lc3BhY2U6IG9wdHMuY3NoYXJwLm5hbWVzcGFjZSxcbiAgICAgICAgcGFja2FnZUlkOiBvcHRzLmNzaGFycC5uYW1lc3BhY2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChvcHRzLmdvbGFuZykge1xuICAgICAgdGFyZ2V0cy5nbyA9IHtcbiAgICAgICAgbW9kdWxlTmFtZTogb3B0cy5nb2xhbmcubW9kdWxlTmFtZSxcbiAgICAgICAgcGFja2FnZU5hbWU6IG9wdHMuZ29sYW5nLnBhY2thZ2VOYW1lLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oc3RhZ2luZywgXCJwYWNrYWdlLmpzb25cIiksXG4gICAgICBKU09OLnN0cmluZ2lmeShwa2csIHVuZGVmaW5lZCwgMiksXG4gICAgKTtcblxuICAgIGNvbnN0IGVuZEpzaWlUaW1lciA9IGxvZ1RpbWVzcGFuKFwianNpaVwiKTtcbiAgICBhd2FpdCBleGVjKGpzaWlNb2R1bGUsIGpzaWlBcmdzLCB7XG4gICAgICBjd2Q6IHN0YWdpbmcsXG4gICAgfSk7XG4gICAgZW5kSnNpaVRpbWVyKCk7XG5cbiAgICAvLyBleHRyYWN0IC5qc2lpIGlmIHJlcXVlc3RlZFxuICAgIGlmIChvcHRzLmpzaWkpIHtcbiAgICAgIGF3YWl0IGZzLmNvcHkocGF0aC5qb2luKHN0YWdpbmcsIFwiLmpzaWlcIiksIG9wdHMuanNpaS5wYXRoKTtcbiAgICB9XG5cbiAgICAvLyBydW4gcGFjbWFrIHRvIGdlbmVyYXRlIGNvZGVcbiAgICBjb25zdCBlbmRKc2lpUGFjbWFrVGltZXIgPSBsb2dUaW1lc3BhbihcImpzaWktcGFjbWFrXCIpO1xuICAgIGF3YWl0IGV4ZWMocGFjbWFrTW9kdWxlLCBbXCItLWNvZGUtb25seVwiXSwgeyBjd2Q6IHN0YWdpbmcgfSk7XG4gICAgZW5kSnNpaVBhY21ha1RpbWVyKCk7XG5cbiAgICBpZiAob3B0cy5weXRob24pIHtcbiAgICAgIGNvbnN0IHJlbGRpciA9IG9wdHMucHl0aG9uLm1vZHVsZU5hbWUucmVwbGFjZSgvXFwuL2csIFwiL1wiKTsgLy8ganNpaSByZXBsYWNlcyBcIi5cIiB3aXRoIFwiL1wiXG4gICAgICBjb25zdCBzb3VyY2UgPSBwYXRoLnJlc29sdmUoXG4gICAgICAgIHBhdGguam9pbihzdGFnaW5nLCBcImRpc3QvcHl0aG9uL3NyY1wiLCByZWxkaXIpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHBhdGguam9pbihvcHRzLnB5dGhvbi5vdXRkaXIsIHJlbGRpcik7XG4gICAgICBhd2FpdCBmcy5tb3ZlKHNvdXJjZSwgdGFyZ2V0LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5qYXZhKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBwYXRoLnJlc29sdmUocGF0aC5qb2luKHN0YWdpbmcsIFwiZGlzdC9qYXZhL3NyYy9cIikpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gcGF0aC5qb2luKG9wdHMuamF2YS5vdXRkaXIsIFwic3JjL1wiKTtcbiAgICAgIC8vIFByZS1jcmVhdGUgc2hhcmVkIHBhY2thZ2UgZGlyZWN0b3JpZXMuXG4gICAgICBjb25zdCBwYWNrYWdlRGlyID0gb3B0cy5qYXZhLnBhY2thZ2UucmVwbGFjZSgvXFwuL2csIFwiL1wiKTtcbiAgICAgIGF3YWl0IGZzLm1rZGlycChwYXRoLmpvaW4odGFyZ2V0LCBcIm1haW4vamF2YVwiLCBwYWNrYWdlRGlyKSk7XG4gICAgICBhd2FpdCBmcy5ta2RpcnAocGF0aC5qb2luKHRhcmdldCwgXCJtYWluL3Jlc291cmNlc1wiLCBwYWNrYWdlRGlyKSk7XG4gICAgICBhd2FpdCBmcy5jb3B5KHNvdXJjZSwgdGFyZ2V0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgb3ZlcndyaXRlOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5jc2hhcnApIHtcbiAgICAgIGNvbnN0IHJlbGRpciA9IG9wdHMuY3NoYXJwLm5hbWVzcGFjZTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4oc3RhZ2luZywgXCJkaXN0L2RvdG5ldC9cIiwgcmVsZGlyKSk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmpvaW4ob3B0cy5jc2hhcnAub3V0ZGlyLCByZWxkaXIpO1xuICAgICAgYXdhaXQgZnMubW92ZShzb3VyY2UsIHRhcmdldCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZ29sYW5nKSB7XG4gICAgICBjb25zdCByZWxkaXIgPSBvcHRzLmdvbGFuZy5wYWNrYWdlTmFtZTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4oc3RhZ2luZywgXCJkaXN0L2dvL1wiLCByZWxkaXIpKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHBhdGguam9pbihvcHRzLmdvbGFuZy5vdXRkaXIsIHJlbGRpcik7XG4gICAgICBhd2FpdCBmcy5tb3ZlKHNvdXJjZSwgdGFyZ2V0LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICAgIC8vIHJlbW92ZSBnby5tb2QgYXMgdGhpcyB3b3VsZCBtYWtlIGl0IGEgc3VibW9kdWxlXG4gICAgICBhd2FpdCBmcy5yZW1vdmUocGF0aC5qb2luKHRhcmdldCwgXCJnby5tb2RcIikpO1xuICAgIH1cblxuICAgIFtcInZlcnNpb25zLmpzb25cIiwgXCJjb25zdHJhaW50cy5qc29uXCJdLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZzLmNvcHlTeW5jKFxuICAgICAgICAgIHBhdGgucmVzb2x2ZShzdGFnaW5nLCBmaWxlKSxcbiAgICAgICAgICBwYXRoLnJlc29sdmUob3V0cHV0UGF0aCwgZmlsZSksXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGNvcHkgJHtmaWxlfTogJHtlfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxudHlwZSBDb25zdHJhaW50RmlsZSA9IHsgcHJvdmlkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBjZGt0Zjogc3RyaW5nIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHRhcmdldExhbmd1YWdlOiBMYW5ndWFnZTtcbiAgcmVhZG9ubHkgY29kZU1ha2VyT3V0cHV0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGpzaWlQYXJhbGxlbGlzbT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBhdGggdG8gY29weSB0aGUgb3V0cHV0IC5qc2lpIGZpbGUuXG4gICAqIEBkZWZhdWx0IC0ganNpaSBmaWxlIGlzIG5vdCBlbWl0dGVkXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRKc2lpPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ29uc3RydWN0c01ha2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2RlTWFrZXJPdXRkaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb2RlOiBDb2RlTWFrZXI7XG4gIHByaXZhdGUgdmVyc2lvbnM6IHsgW3Byb3ZpZGVyTmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBHZXRPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hQ2FjaGVQYXRoPzogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVwb3J0VGVsZW1ldHJ5OiAocGF5bG9hZDoge1xuICAgICAgdGFyZ2V0TGFuZ3VhZ2U6IHN0cmluZztcbiAgICAgIHRyYWNraW5nUGF5bG9hZDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9KSA9PiBQcm9taXNlPHZvaWQ+ID0gYXN5bmMgKCkgPT4ge30sXG4gICkge1xuICAgIHRoaXMuY29kZU1ha2VyT3V0ZGlyID0gcGF0aC5yZXNvbHZlKHRoaXMub3B0aW9ucy5jb2RlTWFrZXJPdXRwdXQpO1xuICAgIGZzLm1rZGlycFN5bmModGhpcy5jb2RlTWFrZXJPdXRkaXIpO1xuICAgIHRoaXMuY29kZSA9IG5ldyBDb2RlTWFrZXIoKTtcbiAgICB0aGlzLnZlcnNpb25zID0ge307XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVR5cGVzY3JpcHRQcm92aWRlcihcbiAgICB0YXJnZXQ6IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuICAgIHNjaGVtYTogUHJvdmlkZXJTY2hlbWEsXG4gICkge1xuICAgIGNvbnN0IGVuZFRTVGltZXIgPSBsb2dUaW1lc3BhbihgR2VuZXJhdGUgVHlwZXNjcmlwdCBmb3IgJHt0YXJnZXQubmFtZX1gKTtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3IodGhpcy5jb2RlLCBzY2hlbWEpO1xuICAgIGdlbmVyYXRvci5nZW5lcmF0ZSh0YXJnZXQpO1xuXG4gICAgdGhpcy52ZXJzaW9ucyA9IHsgLi4udGhpcy52ZXJzaW9ucywgLi4uZ2VuZXJhdG9yLnZlcnNpb25zIH07XG4gICAgZW5kVFNUaW1lcigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbHRlckFscmVhZHlHZW5lcmF0ZWQoXG4gICAgY29uc3RyYWludHM6IFRlcnJhZm9ybURlcGVuZGVuY3lDb25zdHJhaW50W10sXG4gICkge1xuICAgIGxldCBjb25zdHJhaW50c0ZpbGUgPSBcInt9XCI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0cmFpbnRzRmlsZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5jb2RlTWFrZXJPdXRkaXIsIFwiY29uc3RyYWludHMuanNvblwiKSxcbiAgICAgICAgXCJ1dGY4XCIsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGNvbnN0cmFpbnRzLmpzb24gZmlsZSB3aGlsZSBmaWx0ZXJpbmc6ICR7ZX0uIFRoaXMgbWVhbnMgbm8gcHJvdmlkZXJzIHdlcmUgZ2VuZXJhdGVkLCBzbyBhbGwgY29uc3RyYWludHMgbmVlZCB0byBiZSBnZW5lcmF0ZWQuYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gY29uc3RyYWludHM7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgY29uc3RyYWludHMuanNvbiBmaWxlOiAke2NvbnN0cmFpbnRzRmlsZX1gKTtcblxuICAgIGxldCBwcmV2aW91c0NvbnN0cmFpbnRzOiBQYXJ0aWFsPENvbnN0cmFpbnRGaWxlPiA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBwcmV2aW91c0NvbnN0cmFpbnRzID0gSlNPTi5wYXJzZShjb25zdHJhaW50c0ZpbGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgQ291bGQgbm90IHBhcnNlIGNvbnN0cmFpbnRzLmpzb24gZmlsZSB3aGlsZSBmaWx0ZXJpbmc6ICR7ZX0uIEdlbmVyYXRpbmcgYWxsIGNvbnN0cmFpbnRzLmAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBGb3VuZCBwcmV2aW91cyBjb25zdHJhaW50czogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgcHJldmlvdXNDb25zdHJhaW50cyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMixcbiAgICAgICl9YCxcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgIXByZXZpb3VzQ29uc3RyYWludHMucHJvdmlkZXJzIHx8XG4gICAgICB0eXBlb2YgcHJldmlvdXNDb25zdHJhaW50cy5wcm92aWRlcnMgIT09IFwib2JqZWN0XCJcbiAgICApIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgcHJvdmlkZXJzIGluIGNvbnN0cmFpbnRzLmpzb24gZmlsZSwgZ2VuZXJhdGluZyBhbGwgY29uc3RyYWludHMuIFRoZSBjb25zdHJhaW50cyBmaWxlIHdhcyAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHByZXZpb3VzQ29uc3RyYWludHMsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzO1xuICAgIH1cblxuICAgIGlmIChwcmV2aW91c0NvbnN0cmFpbnRzLmNka3RmICE9PSBESVNQTEFZX1ZFUlNJT04pIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgVGhlIENES1ROIHZlcnNpb24gaGFzIGNoYW5nZWQsIGdlbmVyYXRpbmcgYWxsIGNvbnN0cmFpbnRzLiBUaGUgcHJldmlvdXMgdmVyc2lvbiB3YXMgJHtwcmV2aW91c0NvbnN0cmFpbnRzLmNka3RmfSwgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyAke0RJU1BMQVlfVkVSU0lPTn1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBjb25zdHJhaW50cztcbiAgICB9XG5cbiAgICBjb25zdCBjb25zdHJhaW50c1RvR2VuZXJhdGUgPSBjb25zdHJhaW50cy5maWx0ZXIoKGNvbnN0cmFpbnQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnRNYXRjaGVzID1cbiAgICAgICAgcHJldmlvdXNDb25zdHJhaW50cy5wcm92aWRlcnMhW2NvbnN0cmFpbnQuZnFuXSA9PT0gY29uc3RyYWludC52ZXJzaW9uO1xuICAgICAgbGV0IHByb3ZpZGVyRm9sZGVyRXhpc3RzID0gZmFsc2U7XG5cbiAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLnRhcmdldExhbmd1YWdlKSB7XG4gICAgICAgIGNhc2UgTGFuZ3VhZ2UuVFlQRVNDUklQVDpcbiAgICAgICAgICBwcm92aWRlckZvbGRlckV4aXN0cyA9IGZzLmV4aXN0c1N5bmMoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5jb2RlTWFrZXJPdXRkaXIsIFwicHJvdmlkZXJzXCIsIGNvbnN0cmFpbnQubmFtZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMYW5ndWFnZS5QWVRIT046XG4gICAgICAgIGNhc2UgTGFuZ3VhZ2UuSkFWQTpcbiAgICAgICAgY2FzZSBMYW5ndWFnZS5DU0hBUlA6XG4gICAgICAgICAgcHJvdmlkZXJGb2xkZXJFeGlzdHMgPSBmcy5leGlzdHNTeW5jKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMuY29kZU1ha2VyT3V0ZGlyLCBjb25zdHJhaW50Lm5hbWUpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTGFuZ3VhZ2UuR086XG4gICAgICAgICAgcHJvdmlkZXJGb2xkZXJFeGlzdHMgPSBmcy5leGlzdHNTeW5jKFxuICAgICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgICB0aGlzLmNvZGVNYWtlck91dGRpcixcbiAgICAgICAgICAgICAgY29uc3RyYWludC5uYW1lc3BhY2UgfHwgXCJoYXNoaWNvcnBcIixcbiAgICAgICAgICAgICAgY29uc3RyYWludC5uYW1lLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm92aWRlckV4aXN0cyA9IGNvbnN0cmFpbnRNYXRjaGVzICYmIHByb3ZpZGVyRm9sZGVyRXhpc3RzO1xuICAgICAgcmV0dXJuICFwcm92aWRlckV4aXN0cztcbiAgICB9KTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBDb25zdHJhaW50cyB0byBnZW5lcmF0ZTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgY29uc3RyYWludHNUb0dlbmVyYXRlLFxuICAgICAgICBudWxsLFxuICAgICAgICAyLFxuICAgICAgKX1gLFxuICAgICk7XG5cbiAgICByZXR1cm4gY29uc3RyYWludHNUb0dlbmVyYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVR5cGVzY3JpcHRNb2R1bGUoXG4gICAgdGFyZ2V0OiBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQsXG4gICAgc2NoZW1hOiBNb2R1bGVTY2hlbWEsXG4gICkge1xuICAgIGNvbnN0IGVuZFRTVGltZXIgPSBsb2dUaW1lc3BhbihgR2VuZXJhdGUgVHlwZXNjcmlwdCBmb3IgJHt0YXJnZXQubmFtZX1gKTtcbiAgICB0YXJnZXQuc3BlYyA9IHNjaGVtYTtcbiAgICBuZXcgTW9kdWxlR2VuZXJhdG9yKHRoaXMuY29kZSwgW3RhcmdldF0pO1xuICAgIGVuZFRTVGltZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVUeXBlc2NyaXB0KFxuICAgIHRhcmdldDogQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICAgIHNjaGVtYXM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgcmVhZFNjaGVtYT4+LFxuICApIHtcbiAgICBpZiAodGFyZ2V0LmlzTW9kdWxlKSB7XG4gICAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFzLm1vZHVsZVNjaGVtYT8uW3RhcmdldC5tb2R1bGVLZXldO1xuICAgICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JzLkludGVybmFsKFxuICAgICAgICAgIGBDb3VsZCBub3QgZ2VuZXJhdGUgc2NoZW1hIGZvciBtb2R1bGUgJHt0YXJnZXQubW9kdWxlS2V5fWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVUeXBlc2NyaXB0TW9kdWxlKFxuICAgICAgICB0YXJnZXQgYXMgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0LFxuICAgICAgICBzY2hlbWEsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0LmlzUHJvdmlkZXIpIHtcbiAgICAgIGlmICghc2NoZW1hcy5wcm92aWRlclNjaGVtYSkge1xuICAgICAgICB0aHJvdyBFcnJvcnMuSW50ZXJuYWwoYENvdWxkIG5vdCBnZW5lcmF0ZSBzY2hlbWEgZm9yIHByb3ZpZGVyc2ApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlVHlwZXNjcmlwdFByb3ZpZGVyKFxuICAgICAgICB0YXJnZXQgYXMgQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQsXG4gICAgICAgIHNjaGVtYXMucHJvdmlkZXJTY2hlbWEsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmtub3duIHRhcmdldCB0eXBlIHVzZWQgdG8gZ2VuZXJhdGUgYmluZGluZ3M6ICR7dGFyZ2V0Lm5hbWV9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gZW1pdHMgYSB2ZXJzaW9ucy5qc29uIGZpbGUgd2l0aCBhIG1hcCBvZiB0aGUgdXNlZCB2ZXJzaW9uIGZvciBlYWNoIHByb3ZpZGVyIGZxcG5cbiAgcHJpdmF0ZSB1cGRhdGVWZXJzaW9uc0ZpbGUoXG4gICAgYWxsb3dlZENvbnN0cmFpbnRzOiBUZXJyYWZvcm1EZXBlbmRlbmN5Q29uc3RyYWludFtdLFxuICApIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgVXBkYXRpbmcgdmVyc2lvbnMgZmlsZSB3aXRoIGdlbmVyYXRlZCB2ZXJzaW9ucyAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICB0aGlzLnZlcnNpb25zLFxuICAgICAgICBudWxsLFxuICAgICAgICAyLFxuICAgICAgKX0gd2l0aCBhbGxvd2VkIGNvbnN0cmFpbnRzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGFsbG93ZWRDb25zdHJhaW50cyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMixcbiAgICAgICl9YCxcbiAgICApO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gXCJ2ZXJzaW9ucy5qc29uXCI7XG4gICAgbGV0IHByZXZpb3VzVmVyc2lvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICB0cnkge1xuICAgICAgcHJldmlvdXNWZXJzaW9ucyA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUodGhpcy5jb2RlTWFrZXJPdXRkaXIsIGZpbGVQYXRoKSwgXCJ1dGY4XCIpLFxuICAgICAgKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgUmVhZCBleGlzdGluZyB2ZXJzaW9ucyBmaWxlOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHByZXZpb3VzVmVyc2lvbnMsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgQ291bGQgbm90IHJlYWQgdmVyc2lvbnMgZmlsZSwgdGhpcyBpcyBleHBlY3RlZCBpZiB0aGVyZSBhcmUgbm8gcHJlLWV4aXN0aW5nIGxvY2FsIHByb3ZpZGVyczogJHtlfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZlcnNpb25zID0gYWxsb3dlZENvbnN0cmFpbnRzLnJlZHVjZSgoYWNjLCBjb25zdHJhaW50KSA9PiB7XG4gICAgICBjb25zdCBwcm92aWRlciA9IE9iamVjdC5lbnRyaWVzKHByZXZpb3VzVmVyc2lvbnMpLmZpbmQoKFtuYW1lXSkgPT5cbiAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBtb3JlIHJlZmluZWQsIGJ1dCBpdCdzIGdvb2QgZW5vdWdoIGZvciBub3dcbiAgICAgICAgbmFtZS5lbmRzV2l0aChjb25zdHJhaW50LmZxbiksXG4gICAgICApO1xuXG4gICAgICBpZiAocHJvdmlkZXIpIHtcbiAgICAgICAgY29uc3QgW25hbWUsIHZlcnNpb25dID0gcHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB7IC4uLmFjYywgW25hbWVdOiB2ZXJzaW9uIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYFdyaXRpbmcgdmVyc2lvbnMgZmlsZSAoJHtmaWxlUGF0aH0pOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICB2ZXJzaW9ucyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMixcbiAgICAgICl9YCxcbiAgICApO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5GaWxlKGZpbGVQYXRoKTtcbiAgICB0aGlzLmNvZGUubGluZShKU09OLnN0cmluZ2lmeSh7IC4uLnZlcnNpb25zLCAuLi50aGlzLnZlcnNpb25zIH0sIG51bGwsIDIpKTtcbiAgICB0aGlzLmNvZGUuY2xvc2VGaWxlKGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVtb3ZlRm9sZGVyc1RoYXRTaG91bGROb3RFeGlzdChcbiAgICBjb25zdHJhaW50c1RoYXRTaG91bGRFeGlzdDogVGVycmFmb3JtRGVwZW5kZW5jeUNvbnN0cmFpbnRbXSxcbiAgKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYFJlbW92aW5nIHByb3ZpZGVycyBleGNlcHQgZm9yICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGNvbnN0cmFpbnRzVGhhdFNob3VsZEV4aXN0LFxuICAgICAgICBudWxsLFxuICAgICAgICAyLFxuICAgICAgKX1gLFxuICAgICk7XG5cbiAgICAvLyBBbGwgbGFuZ3VhZ2VzIGJlc2lkZXMgVFMga2VlcCB0aGVpciBwcm92aWRlcnMgaW4gdGhlIHNhbWUgZm9sZGVycyBhcyBtb2R1bGVzXG4gICAgLy8gdGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIGZvciB1cyB0byBkaXN0aW5ndWlzaCBhIG5vIGxvbmdlciByZXF1aXJlZCBwcm92aWRlclxuICAgIC8vIGZyb20gYSBtYW51YWxseSB3cml0dGVuIGNvbnN0cnVjdCBvciBhIG1vZHVsZVxuICAgIGlmICghdGhpcy5pc0phdmFzY3JpcHRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZmlsZXNJblByb3ZpZGVyczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwcm92aWRlcnNGb2xkZXIgPSBwYXRoLnJlc29sdmUodGhpcy5jb2RlTWFrZXJPdXRkaXIsIFwicHJvdmlkZXJzXCIpO1xuICAgIHRyeSB7XG4gICAgICBmaWxlc0luUHJvdmlkZXJzID0gYXdhaXQgZnMucmVhZGRpcihwcm92aWRlcnNGb2xkZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYEVycm9yIGxpc3RpbmcgZmlsZXMgaW4gcHJvdmlkZXJzIGZvbGRlciAnJHtwcm92aWRlcnNGb2xkZXJ9JzogJHtlfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlcnMgPSBmaWxlc0luUHJvdmlkZXJzLmZpbHRlcigoZmlsZSkgPT5cbiAgICAgIGZzXG4gICAgICAgIC5zdGF0U3luYyhwYXRoLnJlc29sdmUodGhpcy5jb2RlTWFrZXJPdXRkaXIsIFwicHJvdmlkZXJzXCIsIGZpbGUpKVxuICAgICAgICAuaXNEaXJlY3RvcnkoKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGZvbGRlcnMuZm9yRWFjaCgoZm9sZGVyKSA9PiB7XG4gICAgICBjb25zdCBzaG91bGRFeGlzdCA9IGNvbnN0cmFpbnRzVGhhdFNob3VsZEV4aXN0LnNvbWUoXG4gICAgICAgIChjb25zdHJhaW50KSA9PiBjb25zdHJhaW50Lm5hbWUgPT09IGZvbGRlcixcbiAgICAgICk7XG5cbiAgICAgIGlmICghc2hvdWxkRXhpc3QpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZW1vdmluZyBmb2xkZXIgJHtmb2xkZXJ9IGZyb20gcHJvdmlkZXJzYCk7XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5yZXNvbHZlKHRoaXMuY29kZU1ha2VyT3V0ZGlyLCBcInByb3ZpZGVyc1wiLCBmb2xkZXIpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGVtaXRzIGEgY29uc3RyYWludHMuanNvbiBmaWxlIHdpdGggYSBtYXAgb2YgdGhlIHVzZWQgcHJvdmlkZXIgZnFwbnMgYW5kIHZlcnNpb24gY29uc3RyYWludHNcbiAgLy8gdGhpcyBpcyB1c2VkIGZvciBjYWNoaW5nIHB1cnBvc2VzXG4gIHByaXZhdGUgZW1pdENvbnN0cmFpbnRzRmlsZShcbiAgICBhbGxvd2VkQ29uc3RyYWludHM6IFRlcnJhZm9ybURlcGVuZGVuY3lDb25zdHJhaW50W10sXG4gICkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gXCJjb25zdHJhaW50cy5qc29uXCI7XG5cbiAgICBjb25zdCBjb250ZW50OiBDb25zdHJhaW50RmlsZSA9IHtcbiAgICAgIGNka3RmOiBESVNQTEFZX1ZFUlNJT04sXG4gICAgICBwcm92aWRlcnM6IGFsbG93ZWRDb25zdHJhaW50c1xuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5mcW4ubG9jYWxlQ29tcGFyZShiLmZxbikpXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGNhcnJ5LCBpdGVtKSA9PiAoe1xuICAgICAgICAgICAgLi4uY2FycnksXG4gICAgICAgICAgICBbaXRlbS5mcW5dOiBpdGVtLnZlcnNpb24sXG4gICAgICAgICAgfSksXG4gICAgICAgICAge30sXG4gICAgICAgICksXG4gICAgfTtcblxuICAgIHRoaXMuY29kZS5vcGVuRmlsZShmaWxlUGF0aCk7XG4gICAgdGhpcy5jb2RlLmxpbmUoSlNPTi5zdHJpbmdpZnkoY29udGVudCwgbnVsbCwgMikpO1xuICAgIHRoaXMuY29kZS5jbG9zZUZpbGUoZmlsZVBhdGgpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVKc2lpTGFuZ3VhZ2UodGFyZ2V0OiBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQpIHtcbiAgICAvLyB0aGVzZSBhcmUgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgd2UgY29tcGlsZSBhZ2FpbnN0XG4gICAgY29uc3QgZGVwcyA9IFtcIkB0eXBlcy9ub2RlXCIsIFwiY29uc3RydWN0c1wiLCBcImNka3RuXCJdO1xuICAgIGNvbnN0IG9wdHM6IEdlbmVyYXRlSlNJSU9wdGlvbnMgPSB7XG4gICAgICBlbnRyeXBvaW50OiB0YXJnZXQuZmlsZU5hbWUsXG4gICAgICBkZXBzOiBkZXBzLm1hcCgoZGVwKSA9PlxuICAgICAgICBwYXRoLmRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKGAke2RlcH0vcGFja2FnZS5qc29uYCkpLFxuICAgICAgKSxcbiAgICAgIG1vZHVsZUtleTogdGFyZ2V0Lm1vZHVsZUtleSxcbiAgICAgIGV4cG9ydHM6IHRhcmdldC5pc1Byb3ZpZGVyIC8vIE1vZHVsZXMgYXJlIHNtYWxsIGVub3VnaCB0aGF0IHdlIGRvbid0IG5lZWQgdGhpcyBvcHRpbWl6YXRpb25cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBcIi5cIjoge1xuICAgICAgICAgICAgICBpbXBvcnQ6IGAuL3Byb3ZpZGVycy8ke3RhcmdldC5uYW1lfS9pbmRleC5qc2AsXG4gICAgICAgICAgICAgIHJlcXVpcmU6IGAuL3Byb3ZpZGVycy8ke3RhcmdldC5uYW1lfS9sYXp5LWluZGV4LmpzYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgLy8gdXNlZCBmb3IgdGVzdGluZy5cbiAgICBpZiAodGhpcy5vcHRpb25zLm91dHB1dEpzaWkpIHtcbiAgICAgIG9wdHMuanNpaSA9IHsgcGF0aDogdGhpcy5vcHRpb25zLm91dHB1dEpzaWkgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1B5dGhvblRhcmdldCkge1xuICAgICAgb3B0cy5weXRob24gPSB7XG4gICAgICAgIG91dGRpcjogdGhpcy5jb2RlTWFrZXJPdXRkaXIsXG4gICAgICAgIG1vZHVsZU5hbWU6IHRhcmdldC5zcmNNYWtOYW1lLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0phdmFUYXJnZXQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvZGVNYWtlck91dHB1dC5pbmNsdWRlcyhcIi9cIikgfHxcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvZGVNYWtlck91dHB1dC5pbmNsdWRlcyhcIlxcXFxcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBFcnJvcnMuVXNhZ2UoXG4gICAgICAgICAgYFdoZW4gdXNpbmcgSmF2YSB0aGUgXCJjb2RlTWFrZXJPdXRwdXRcIiBvcHRpb24gaW4gdGhlIGNka3RmLmpzb24gbXVzdCBiZSB0aGUgb3JnYW5pemF0aW9uIGlkZW50aWZpZXIgZm9yIHlvdXIgcHJvamVjdCAoZS5nLiBjb20ubXktY29tcGFueSksIG5vdCBhIHBhdGguIFRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlIHdpbGwgYmUgcGxhY2VkIGluIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBnaXZlbiBkaXJlY3RvcnkuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYSA8IDAuMTkgdmVyc2lvbiBvZiBjZGt0ZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGNvZGVtYWtlck91dHB1dCB0byBcImltcG9ydHNcIi5gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBvcHRzLmphdmEgPSB7XG4gICAgICAgIG91dGRpcjogXCIuXCIsIC8vIGdlbmVyYXRlZCBqYXZhIGZpbGVzIGFyZW4ndCBwYWNrYWdlZCwgc28ganVzdCBpbmNsdWRlIGRpcmVjdGx5IGluIGFwcFxuICAgICAgICBwYWNrYWdlOiBgJHt0aGlzLm9wdGlvbnMuY29kZU1ha2VyT3V0cHV0fS4ke3RhcmdldC5zcmNNYWtOYW1lfWAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ3NoYXJwVGFyZ2V0KSB7XG4gICAgICBvcHRzLmNzaGFycCA9IHtcbiAgICAgICAgb3V0ZGlyOiB0aGlzLmNvZGVNYWtlck91dGRpcixcbiAgICAgICAgbmFtZXNwYWNlOiB0YXJnZXQuc3JjTWFrTmFtZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNHb1RhcmdldCkge1xuICAgICAgLy8gVE9ETzogY2hlY2sgaWYgbmVlZGVkIGZvciBtb2R1bGVzIHNvbWVob3dcbiAgICAgIC8vIGNvbnN0IHRhcmdldFR5cGUgPSB0YXJnZXQuaXNQcm92aWRlciA/ICdwcm92aWRlcicgOiAnbW9kdWxlJztcblxuICAgICAgLy8ganNpaS1zcmNtYWMgd2lsbCBwcm9kdWNlIGEgZm9sZGVyIGluc2lkZSB0aGlzIGRpciBuYW1lZCBhZnRlciBcInBhY2thZ2VOYW1lXCJcbiAgICAgIC8vIHNvIHRoaXMgcmVzdWx0cyBpbiBlLmcuIC5nZW4vaGFzaGljb3JwL3JhbmRvbVxuICAgICAgY29uc3Qgb3V0ZGlyID0gcGF0aC5qb2luKHRoaXMuY29kZU1ha2VyT3V0ZGlyLCB0YXJnZXQubmFtZXNwYWNlID8/IFwiXCIpO1xuXG4gICAgICBvcHRzLmdvbGFuZyA9IHtcbiAgICAgICAgb3V0ZGlyLFxuICAgICAgICBtb2R1bGVOYW1lOiBhd2FpdCBkZXRlcm1pbmVHb01vZHVsZU5hbWUob3V0ZGlyKSwgLy8gZS5nLiBgZ2l0aHViLmNvbS9vcmcvdXNlcnByb2plY3QvLmdlbi9oYXNoaWNvcnBgXG4gICAgICAgIHBhY2thZ2VOYW1lOiB0YXJnZXQuc3JjTWFrTmFtZSwgLy8gcGFja2FnZSB3aWxsIGJlIG5hbWVkIGUuZy4gcmFuZG9tIGZvciBoYXNoaWNvcnAvcmFuZG9tXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OUyAmJlxuICAgICAgIXByb2Nlc3MuZW52Lk5PREVfT1BUSU9OUy5pbmNsdWRlcyhgLS1tYXgtb2xkLXNwYWNlLXNpemVgKVxuICAgICkge1xuICAgICAgbG9nZ2VyLndhcm4oYGZvdW5kIE5PREVfT1BUSU9OUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRob3V0IGEgc2V0dGluZyBmb3IgLS1tYXgtb2xkLXNwYWNlLXNpemUuXG5UaGUgcHJvdmlkZXIgZ2VuZXJhdGlvbiBuZWVkcyBhIHN1YnN0YW50aWFsIGFtb3VudCBvZiBtZW1vcnkgKH4xM0dCKSBmb3Igc29tZSBwcm92aWRlcnMgYW5kIGxhbmd1YWdlcy5cblNvIGNka3RuLWNsaSBzZXRzIGl0IHRvIE5PREVfT1BUSU9OUz1cIi0tbWF4LW9sZC1zcGFjZS1zaXplPTE2Mzg0XCIgYnkgZGVmYXVsdC4gQXMgeW91ciBlbnZpcm9ubWVudCBhbHJlYWR5IGNvbnRhaW5zXG5hIE5PREVfT1BUSU9OUyB2YXJpYWJsZSwgd2Ugd29uJ3Qgb3ZlcnJpZGUgaXQuIEhlbmNlLCB0aGUgcHJvdmlkZXIgZ2VuZXJhdGlvbiBtaWdodCBmYWlsIHdpdGggYW4gb3V0IG9mIG1lbW9yeSBlcnJvci5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW5jcmVhc2UgbWVtb3J5IHRvIGFsbG93IGdlbmVyYXRpbmcgbGFyZ2UgcHJvdmlkZXJzIChpLmUuIGF3cyBvciBhenVyZXJtIGZvciBHbylcbiAgICAgIC8vIHNyY21hayBpcyBnb2luZyB0byBzcGF3biBhIGNoaWxkcHJvY2VzcyAoZm9yIGpzaWktcGFjbWFrKSB3aGljaCBpcyBnb2luZyB0byBiZSBhZmZlY3RlZCBieSB0aGlzIGVudiB2YXJcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OUyA9IFwiLS1tYXgtb2xkLXNwYWNlLXNpemU9MTYzODRcIjtcbiAgICB9XG5cbiAgICBjb25zdCBqc2lpVGltZXIgPSBsb2dUaW1lc3BhbihcIkpTSUlcIik7XG4gICAgYXdhaXQgZ2VuZXJhdGVKc2lpTGFuZ3VhZ2UodGhpcy5jb2RlLCBvcHRzLCB0aGlzLmNvZGVNYWtlck91dGRpciwgW1xuICAgICAgdGFyZ2V0LmlzTW9kdWxlID8gXCJwcm92aWRlcnMvKipcIiA6IFwibW9kdWxlcy8qKlwiLFxuICAgIF0pO1xuICAgIGpzaWlUaW1lcigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNjaGVtYXModGFyZ2V0czogVGVycmFmb3JtRGVwZW5kZW5jeUNvbnN0cmFpbnRbXSkge1xuICAgIHJldHVybiBhd2FpdCByZWFkU2NoZW1hKHRhcmdldHMsIHRoaXMuc2NoZW1hQ2FjaGVQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZW5lcmF0ZShcbiAgICBhbGxDb25zdHJhaW50czogVGVycmFmb3JtRGVwZW5kZW5jeUNvbnN0cmFpbnRbXSxcbiAgICBjb25zdHJhaW50c1RvR2VuZXJhdGUgPSBhbGxDb25zdHJhaW50cyxcbiAgKSB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGNvbnN0cmFpbnRzVG9HZW5lcmF0ZS5tYXAoKGNvbnN0cmFpbnQpID0+XG4gICAgICBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQuZnJvbShjb25zdHJhaW50LCB0aGlzLm9wdGlvbnMudGFyZ2V0TGFuZ3VhZ2UpLFxuICAgICk7XG5cbiAgICBjb25zdCBlbmRTY2hlbWFUaW1lciA9IGxvZ1RpbWVzcGFuKFwiR2F0aGVyaW5nIHNjaGVtYVwiKTtcbiAgICBjb25zdCBzY2hlbWFzID0gYXdhaXQgdGhpcy5nZXRTY2hlbWFzKGNvbnN0cmFpbnRzVG9HZW5lcmF0ZSk7XG4gICAgZW5kU2NoZW1hVGltZXIoKTtcblxuICAgIGNvbnN0IGVuZEdlbmVyYXRlVGltZXIgPSBsb2dUaW1lc3BhbihcIkdlbmVyYXRlIFRTXCIpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4gdGhpcy5nZW5lcmF0ZVR5cGVzY3JpcHQodGFyZ2V0LCBzY2hlbWFzKSksXG4gICAgKTtcbiAgICBlbmRHZW5lcmF0ZVRpbWVyKCk7XG5cbiAgICB0aGlzLnVwZGF0ZVZlcnNpb25zRmlsZShhbGxDb25zdHJhaW50cyk7XG4gICAgdGhpcy5lbWl0Q29uc3RyYWludHNGaWxlKGFsbENvbnN0cmFpbnRzKTtcblxuICAgIGlmICh0aGlzLmlzSmF2YXNjcmlwdFRhcmdldCkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzSmF2YXNjcmlwdFRhcmdldCB8fCB0aGlzLm9wdGlvbnMub3V0cHV0SnNpaSkge1xuICAgICAgY29uc3QgbnVtYmVyT2ZXb3JrZXJzID0gTWF0aC5tYXgoXG4gICAgICAgIDEsXG4gICAgICAgIHRoaXMub3B0aW9ucy5qc2lpUGFyYWxsZWxpc20gPT09IC0xXG4gICAgICAgICAgPyB0YXJnZXRzLmxlbmd0aFxuICAgICAgICAgIDogdGhpcy5vcHRpb25zLmpzaWlQYXJhbGxlbGlzbSB8fCAxLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgd29yayA9IFsuLi50YXJnZXRzXTtcbiAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkobnVtYmVyT2ZXb3JrZXJzKS5maWxsKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IHRhcmdldDogQ29uc3RydWN0c01ha2VyVGFyZ2V0IHwgdW5kZWZpbmVkO1xuICAgICAgICB3aGlsZSAoKHRhcmdldCA9IHdvcmsucG9wKCkpKSB7XG4gICAgICAgICAgY29uc3QgZW5kSnNpaVRhcmdldCA9IGxvZ1RpbWVzcGFuKFxuICAgICAgICAgICAgYEdlbmVyYXRpbmcgSlNJSSBiaW5kaW5ncyBmb3IgJHt0YXJnZXQubmFtZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUpzaWlMYW5ndWFnZSh0YXJnZXQpO1xuICAgICAgICAgIGVuZEpzaWlUYXJnZXQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdvcmtlcnMubWFwKChmbikgPT4gZm4oKSkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVwb3J0VGVsZW1ldHJ5KHtcbiAgICAgICAgdHJhY2tpbmdQYXlsb2FkOiB0YXJnZXQudHJhY2tpbmdQYXlsb2FkLFxuICAgICAgICB0YXJnZXRMYW5ndWFnZTogdGFyZ2V0LnRhcmdldExhbmd1YWdlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNQeXRob25UYXJnZXQpIHtcbiAgICAgIGNvbnN0IGVuZFB5dGhvblRpbWVyID0gbG9nVGltZXNwYW4oXCJQeXRob24gcG9zdC1wcm9jZXNzaW5nXCIpO1xuICAgICAgLy8gUmVtb3ZlIGZyb20gLiBpbXBvcnQgLi4uIHN0YXRlbWVudHMgZnJvbSByb290IGxldmVsIF9faW5pdF9fLnB5XG4gICAgICAvLyBUaGlzIHJlbW92ZXMgcm9vdC1sZXZlbCBpbXBvcnRzIG9mIG5hbWVzcGFjZXMsIGJ1dCBzYXZlcyAyNXMgc3ludGggdGltZSBmb3IgdGhlIGF3cyBwcm92aWRlciBhbG9uZVxuICAgICAgY29uc3QgYWxsSW5pdFB5UGF0aHMgPSBnbG9iXG4gICAgICAgIC5zeW5jKFwiKiovX19pbml0X18ucHlcIiwge1xuICAgICAgICAgIGN3ZDogdGhpcy5jb2RlTWFrZXJPdXRkaXIsXG4gICAgICAgIH0pXG4gICAgICAgIC8vIHNvcnQgYnkgZGVwdGgsIHNvIHdlIHN0YXJ0IHdpdGggdGhlIHNoYWxsb3dlc3QgZmlsZXNcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuc3BsaXQoXCIvXCIpLmxlbmd0aCAtIGIuc3BsaXQoXCIvXCIpLmxlbmd0aCk7XG5cbiAgICAgIGNvbnN0IHZpc2l0ZWREaXJlY3Rvcmllczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgaW5pdFB5UGF0aCBvZiBhbGxJbml0UHlQYXRocykge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnlQYXRoID0gcGF0aC5kaXJuYW1lKGluaXRQeVBhdGgpO1xuICAgICAgICBpZiAodmlzaXRlZERpcmVjdG9yaWVzLnNvbWUoKGRpcikgPT4gZGlyZWN0b3J5UGF0aC5zdGFydHNXaXRoKGRpcikpKSB7XG4gICAgICAgICAgLy8gd2UgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBkaXJlY3RvcnlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2aXNpdGVkRGlyZWN0b3JpZXMucHVzaChkaXJlY3RvcnlQYXRoKTtcblxuICAgICAgICBjb25zdCBhYnNvbHV0ZUluaXRQeVBhdGggPSBwYXRoLmpvaW4odGhpcy5jb2RlTWFrZXJPdXRkaXIsIGluaXRQeVBhdGgpO1xuICAgICAgICBjb25zdCBpbml0UHkgPSBhd2FpdCBmcy5yZWFkRmlsZShhYnNvbHV0ZUluaXRQeVBhdGgsIFwidXRmOFwiKTtcbiAgICAgICAgY29uc3QgaW5pdFB5V2l0aG91dEltcG9ydHMgPSBpbml0UHkucmVwbGFjZSgvZnJvbSBcXC4gaW1wb3J0IC4qXFxuL2csIFwiXCIpO1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoYWJzb2x1dGVJbml0UHlQYXRoLCBpbml0UHlXaXRob3V0SW1wb3J0cyk7XG4gICAgICB9XG5cbiAgICAgIGVuZFB5dGhvblRpbWVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlKG91dGRpciA9IHRoaXMuY29kZU1ha2VyT3V0ZGlyKSB7XG4gICAgYXdhaXQgdGhpcy5jb2RlLnNhdmUob3V0ZGlyKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzSmF2YXNjcmlwdFRhcmdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnRhcmdldExhbmd1YWdlID09PSBMYW5ndWFnZS5UWVBFU0NSSVBUO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaXNQeXRob25UYXJnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50YXJnZXRMYW5ndWFnZSA9PT0gTGFuZ3VhZ2UuUFlUSE9OO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaXNKYXZhVGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGFyZ2V0TGFuZ3VhZ2UgPT09IExhbmd1YWdlLkpBVkE7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc0NzaGFycFRhcmdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnRhcmdldExhbmd1YWdlID09PSBMYW5ndWFnZS5DU0hBUlA7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc0dvVGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGFyZ2V0TGFuZ3VhZ2UgPT09IExhbmd1YWdlLkdPO1xuICB9XG59XG5cbi8qKlxuICogc2VhcmNoZXMgZm9yIHRoZSBjbG9zZXN0IGBnby5tb2RgIGZpbGUgYW5kIHJldHVybnMgdGhlIG5lc3RlZCBnbyBtb2R1bGUgbmFtZSBmb3IgYGRpcmBcbiAqIGUuZy4gKC9kaXIvLmdlbi8pID0+IGNkay50Zi9zdGFjay8uZ2VuIGlmIHRoZSBwYXJlbnQgZGlyIG9mIC5nZW4gaGFzIGEgZ28ubW9kIGZvciBcIm1vZHVsZSBjZGsudGYvc3RhY2tcIlxuICpcbiAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20gKHNlYXJjaGVzIHVwd2FyZHMpXG4gKiBAcmV0dXJucyB0aGUgcGFja2FnZSBuYW1lIGZvciBgZGlyYFxuICogQHRocm93cyBhbiBFcnJvciBpZiBubyBnby5tb2Qgd2FzIGZvdW5kXG4gKi9cbmV4cG9ydCBjb25zdCBkZXRlcm1pbmVHb01vZHVsZU5hbWUgPSBhc3luYyAoZGlyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBsZXQgcHJldmlvdXNEaXI7XG4gIGxldCBjdXJyZW50RGlyID0gcGF0aC5yZXNvbHZlKGRpcik7XG5cbiAgZG8ge1xuICAgIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGN1cnJlbnREaXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgLy8gZGlyZWN0b3J5IG1pZ2h0IG5vdCBleGlzdCB5ZXQsIGJ1dCB3ZSBzdGlsbCB3YWxrIHVwd2FyZHMgZnJvbSB0aGVyZSwgc28gaWdub3JlICdFTk9FTlQnXG4gICAgICBpZiAoZS5jb2RlICE9PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWxlcy5pbmNsdWRlcyhcImdvLm1vZFwiKSkge1xuICAgICAgY29uc3QgZmlsZSA9IHBhdGgucmVzb2x2ZShjdXJyZW50RGlyLCBcImdvLm1vZFwiKTtcbiAgICAgIGNvbnN0IGdvbW9kID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZSk7XG4gICAgICBjb25zdCBtYXRjaCA9IC9ebW9kdWxlXFxzKihcXFMqKVxccyokL20uZXhlYyhnb21vZC50b1N0cmluZygpKTtcbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFsxXSkge1xuICAgICAgICBjb25zdCBjaGlsZGRpciA9IHBhdGgucmVsYXRpdmUoY3VycmVudERpciwgZGlyKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTsgLy8gcmVwbGFjZSAnXFwnIHdpdGggJy8nIGZvciB3aW5kb3dzIHBhdGhzXG4gICAgICAgIHJldHVybiBjaGlsZGRpci5sZW5ndGggPiAwID8gYCR7bWF0Y2hbMV19LyR7Y2hpbGRkaXJ9YCA6IG1hdGNoWzFdO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGRldGVybWluZSB0aGUgcm9vdCBHbyBtb2R1bGUgbmFtZS4gRm91bmQgJHtmaWxlfSBidXQgZmFpbGVkIHRvIHJlZ2V4IG1hdGNoIHRoZSBtb2R1bGUgbmFtZSBkaXJlY3RpdmVgLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gZ28gdXAgb25lIGRpcmVjdG9yeS4gQXMgZGlybmFtZSgnLycpIHdpbGwgcmV0dXJuICcvJyB3ZSBjYW5jZWwgdGhlIGxvb3BcbiAgICAvLyBhcyBzb29uIGFzIHRoZSBkaXIgZG9lcyBub3QgY2hhbmdlIGFueW1vcmUuXG4gICAgcHJldmlvdXNEaXIgPSBjdXJyZW50RGlyO1xuICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gIH0gd2hpbGUgKGN1cnJlbnREaXIgIT09IHByZXZpb3VzRGlyKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIHJvb3QgR28gbW9kdWxlIG5hbWUuIE5vIGdvLm1vZCBmb3VuZCBpbiAke2Rpcn0gYW5kIGFueSBwYXJlbnQgZGlyZWN0b3JpZXNgLFxuICApO1xufTtcbiJdfQ==
@@ -1,3 +1,4 @@
1
1
  export declare const CUSTOM_DEFAULTS: {
2
2
  [fullName: string]: any;
3
3
  };
4
+ //# sourceMappingURL=custom-defaults.d.ts.map