@cdktn/hcl2cdk 0.22.0-pre.2

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 (61) hide show
  1. package/README.md +95 -0
  2. package/ambient.d.ts +14 -0
  3. package/jest.config.js +16 -0
  4. package/lib/__tests__/coerceType.test.d.ts +2 -0
  5. package/lib/__tests__/coerceType.test.js +165 -0
  6. package/lib/__tests__/expressionToTs.test.d.ts +6 -0
  7. package/lib/__tests__/expressionToTs.test.js +693 -0
  8. package/lib/__tests__/expressions.test.d.ts +4 -0
  9. package/lib/__tests__/expressions.test.js +415 -0
  10. package/lib/__tests__/findExpressionType.test.d.ts +6 -0
  11. package/lib/__tests__/findExpressionType.test.js +105 -0
  12. package/lib/__tests__/functions.test.d.ts +6 -0
  13. package/lib/__tests__/functions.test.js +605 -0
  14. package/lib/__tests__/generation.test.d.ts +6 -0
  15. package/lib/__tests__/generation.test.js +45 -0
  16. package/lib/__tests__/jsii-rosetta-workarounds.test.d.ts +2 -0
  17. package/lib/__tests__/jsii-rosetta-workarounds.test.js +86 -0
  18. package/lib/__tests__/partialCode.test.d.ts +6 -0
  19. package/lib/__tests__/partialCode.test.js +390 -0
  20. package/lib/__tests__/terraformSchema.test.d.ts +6 -0
  21. package/lib/__tests__/terraformSchema.test.js +105 -0
  22. package/lib/__tests__/testHelpers.d.ts +7 -0
  23. package/lib/__tests__/testHelpers.js +16 -0
  24. package/lib/coerceType.d.ts +7 -0
  25. package/lib/coerceType.js +240 -0
  26. package/lib/dynamic-blocks.d.ts +8 -0
  27. package/lib/dynamic-blocks.js +44 -0
  28. package/lib/expressions.d.ts +9 -0
  29. package/lib/expressions.js +634 -0
  30. package/lib/function-bindings/functions.d.ts +31 -0
  31. package/lib/function-bindings/functions.generated.d.ts +806 -0
  32. package/lib/function-bindings/functions.generated.js +1142 -0
  33. package/lib/function-bindings/functions.js +73 -0
  34. package/lib/generation.d.ts +26 -0
  35. package/lib/generation.js +676 -0
  36. package/lib/index.d.ts +136 -0
  37. package/lib/index.js +364 -0
  38. package/lib/iteration.d.ts +23 -0
  39. package/lib/iteration.js +87 -0
  40. package/lib/jsii-rosetta-workarounds.d.ts +5 -0
  41. package/lib/jsii-rosetta-workarounds.js +126 -0
  42. package/lib/partialCode.d.ts +11 -0
  43. package/lib/partialCode.js +116 -0
  44. package/lib/provider.d.ts +8 -0
  45. package/lib/provider.js +40 -0
  46. package/lib/references.d.ts +11 -0
  47. package/lib/references.js +141 -0
  48. package/lib/schema.d.ts +297 -0
  49. package/lib/schema.js +81 -0
  50. package/lib/telemetryAllowList.json +24 -0
  51. package/lib/terraformSchema.d.ts +6 -0
  52. package/lib/terraformSchema.js +136 -0
  53. package/lib/types.d.ts +50 -0
  54. package/lib/types.js +3 -0
  55. package/lib/utils.d.ts +6 -0
  56. package/lib/utils.js +25 -0
  57. package/lib/variables.d.ts +10 -0
  58. package/lib/variables.js +172 -0
  59. package/package.json +71 -0
  60. package/package.sh +9 -0
  61. package/tsconfig.json +42 -0
@@ -0,0 +1,605 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) HashiCorp, Inc.
4
+ * SPDX-License-Identifier: MPL-2.0
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || function (mod) {
23
+ if (mod && mod.__esModule) return mod;
24
+ var result = {};
25
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
26
+ __setModuleDefault(result, mod);
27
+ return result;
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ const t = __importStar(require("@babel/types"));
31
+ const coerceType_1 = require("../coerceType");
32
+ const functions_1 = require("../function-bindings/functions");
33
+ const testHelpers_1 = require("./testHelpers");
34
+ const scope = {
35
+ providerSchema: {},
36
+ providerGenerator: {},
37
+ constructs: new Set(),
38
+ variables: {},
39
+ hasTokenBasedTypeCoercion: false,
40
+ nodeIds: [],
41
+ importables: [],
42
+ topLevelConfig: {},
43
+ };
44
+ // '${replace(module.foo.output, "-", var.bar)}'
45
+ // from https://github.com/hashicorp/terraform-cdk/pull/2729
46
+ const dummy2 = {
47
+ children: [
48
+ {
49
+ children: [
50
+ {
51
+ children: [],
52
+ meta: {
53
+ traversal: [
54
+ {
55
+ range: {
56
+ End: {
57
+ Byte: 16,
58
+ Column: 16,
59
+ Line: 0,
60
+ },
61
+ Filename: "",
62
+ Start: {
63
+ Byte: 10,
64
+ Column: 10,
65
+ Line: 0,
66
+ },
67
+ },
68
+ segment: "module",
69
+ },
70
+ {
71
+ range: {
72
+ End: {
73
+ Byte: 20,
74
+ Column: 20,
75
+ Line: 0,
76
+ },
77
+ Filename: "",
78
+ Start: {
79
+ Byte: 16,
80
+ Column: 16,
81
+ Line: 0,
82
+ },
83
+ },
84
+ segment: "foo",
85
+ },
86
+ {
87
+ range: {
88
+ End: {
89
+ Byte: 27,
90
+ Column: 27,
91
+ Line: 0,
92
+ },
93
+ Filename: "",
94
+ Start: {
95
+ Byte: 20,
96
+ Column: 20,
97
+ Line: 0,
98
+ },
99
+ },
100
+ segment: "output",
101
+ },
102
+ ],
103
+ },
104
+ range: {
105
+ end: {
106
+ byte: 27,
107
+ column: 27,
108
+ line: 0,
109
+ },
110
+ start: {
111
+ byte: 10,
112
+ column: 10,
113
+ line: 0,
114
+ },
115
+ },
116
+ type: "ScopeTraversal",
117
+ },
118
+ {
119
+ children: [
120
+ {
121
+ children: [],
122
+ meta: {
123
+ type: "string",
124
+ value: "-",
125
+ },
126
+ range: {
127
+ end: {
128
+ byte: 31,
129
+ column: 31,
130
+ line: 0,
131
+ },
132
+ start: {
133
+ byte: 30,
134
+ column: 30,
135
+ line: 0,
136
+ },
137
+ },
138
+ type: "LiteralValue",
139
+ },
140
+ ],
141
+ range: {
142
+ end: {
143
+ byte: 31,
144
+ column: 31,
145
+ line: 0,
146
+ },
147
+ start: {
148
+ byte: 30,
149
+ column: 30,
150
+ line: 0,
151
+ },
152
+ },
153
+ type: "Template",
154
+ },
155
+ {
156
+ children: [],
157
+ meta: {
158
+ traversal: [
159
+ {
160
+ range: {
161
+ End: {
162
+ Byte: 37,
163
+ Column: 37,
164
+ Line: 0,
165
+ },
166
+ Filename: "",
167
+ Start: {
168
+ Byte: 34,
169
+ Column: 34,
170
+ Line: 0,
171
+ },
172
+ },
173
+ segment: "var",
174
+ },
175
+ {
176
+ range: {
177
+ End: {
178
+ Byte: 41,
179
+ Column: 41,
180
+ Line: 0,
181
+ },
182
+ Filename: "",
183
+ Start: {
184
+ Byte: 37,
185
+ Column: 37,
186
+ Line: 0,
187
+ },
188
+ },
189
+ segment: "bar",
190
+ },
191
+ ],
192
+ },
193
+ range: {
194
+ end: {
195
+ byte: 41,
196
+ column: 41,
197
+ line: 0,
198
+ },
199
+ start: {
200
+ byte: 34,
201
+ column: 34,
202
+ line: 0,
203
+ },
204
+ },
205
+ type: "ScopeTraversal",
206
+ },
207
+ ],
208
+ meta: {
209
+ closeParenRange: {
210
+ end: {
211
+ byte: 42,
212
+ column: 42,
213
+ line: 0,
214
+ },
215
+ start: {
216
+ byte: 41,
217
+ column: 41,
218
+ line: 0,
219
+ },
220
+ },
221
+ expandedFinalArgument: false,
222
+ name: "replace",
223
+ nameRange: {
224
+ end: {
225
+ byte: 9,
226
+ column: 9,
227
+ line: 0,
228
+ },
229
+ start: {
230
+ byte: 2,
231
+ column: 2,
232
+ line: 0,
233
+ },
234
+ },
235
+ openParenRange: {
236
+ end: {
237
+ byte: 10,
238
+ column: 10,
239
+ line: 0,
240
+ },
241
+ start: {
242
+ byte: 9,
243
+ column: 9,
244
+ line: 0,
245
+ },
246
+ },
247
+ },
248
+ range: {
249
+ end: {
250
+ byte: 10,
251
+ column: 10,
252
+ line: 0,
253
+ },
254
+ start: {
255
+ byte: 2,
256
+ column: 2,
257
+ line: 0,
258
+ },
259
+ },
260
+ type: "function",
261
+ },
262
+ ],
263
+ range: {
264
+ end: {
265
+ byte: 43,
266
+ column: 43,
267
+ line: 0,
268
+ },
269
+ start: {
270
+ byte: 0,
271
+ column: 0,
272
+ line: 0,
273
+ },
274
+ },
275
+ type: "TemplateWrap",
276
+ };
277
+ describe("bindings for Terraform functions", () => {
278
+ it("should convert Terraform AST into TS AST", () => {
279
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, dummy2, "dynamic"))).toMatchInlineSnapshot(`"Fn.replace(TodoReference-module-foo-output, "-", TodoReference-var-bar)"`);
280
+ });
281
+ it("should convert Terraform AST into TS AST for overriden function name", () => {
282
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
283
+ type: "function",
284
+ meta: {
285
+ name: "length",
286
+ },
287
+ children: [
288
+ {
289
+ type: "ScopeTraversal",
290
+ meta: {
291
+ traversal: [
292
+ {
293
+ segment: "var",
294
+ },
295
+ {
296
+ segment: "list",
297
+ },
298
+ ],
299
+ },
300
+ children: [],
301
+ },
302
+ ],
303
+ }, "number"))).toMatchInlineSnapshot(`"Fn.lengthOf(TodoReference-var-list)"`);
304
+ });
305
+ it("should convert Terraform AST into TS AST for overriden function with variadic args for optional params", () => {
306
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
307
+ type: "function",
308
+ meta: {
309
+ name: "bcrypt",
310
+ },
311
+ children: [
312
+ {
313
+ type: "ScopeTraversal",
314
+ meta: {
315
+ traversal: [
316
+ {
317
+ segment: "var",
318
+ },
319
+ {
320
+ segment: "str",
321
+ },
322
+ ],
323
+ },
324
+ children: [],
325
+ },
326
+ {
327
+ type: "ScopeTraversal",
328
+ meta: {
329
+ traversal: [
330
+ {
331
+ segment: "var",
332
+ },
333
+ {
334
+ segment: "cost",
335
+ },
336
+ ],
337
+ },
338
+ children: [],
339
+ },
340
+ ],
341
+ }, "string"))).toMatchInlineSnapshot(`"Fn.bcrypt(TodoReference-var-str, TodoReference-var-cost)"`);
342
+ });
343
+ it("should convert Terraform AST into TS AST for overriden function with variadic args for optional params that are not passed", () => {
344
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
345
+ type: "function",
346
+ meta: {
347
+ name: "bcrypt",
348
+ },
349
+ children: [
350
+ {
351
+ type: "ScopeTraversal",
352
+ meta: {
353
+ traversal: [
354
+ {
355
+ segment: "var",
356
+ },
357
+ {
358
+ segment: "str",
359
+ },
360
+ ],
361
+ },
362
+ children: [],
363
+ },
364
+ ],
365
+ }, "string"))).toMatchInlineSnapshot(`"Fn.bcrypt(TodoReference-var-str)"`);
366
+ });
367
+ it("should convert Terraform AST into TS AST for function with variadic param", () => {
368
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
369
+ type: "function",
370
+ meta: {
371
+ name: "try",
372
+ },
373
+ children: [
374
+ {
375
+ type: "ScopeTraversal",
376
+ meta: {
377
+ traversal: [
378
+ {
379
+ segment: "var",
380
+ },
381
+ {
382
+ segment: "strA",
383
+ },
384
+ ],
385
+ },
386
+ children: [],
387
+ },
388
+ {
389
+ type: "ScopeTraversal",
390
+ meta: {
391
+ traversal: [
392
+ {
393
+ segment: "var",
394
+ },
395
+ {
396
+ segment: "strB",
397
+ },
398
+ ],
399
+ },
400
+ children: [],
401
+ },
402
+ ],
403
+ }, "dynamic"))).toMatchInlineSnapshot(`"Fn.try([TodoReference-var-strA, TodoReference-var-strB])"`);
404
+ });
405
+ it("should convert Terraform AST into TS AST for join function with single list param", () => {
406
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
407
+ type: "function",
408
+ meta: {
409
+ name: "join",
410
+ },
411
+ children: [
412
+ {
413
+ type: "ScopeTraversal",
414
+ meta: {
415
+ traversal: [
416
+ {
417
+ segment: "var",
418
+ },
419
+ {
420
+ segment: "str",
421
+ },
422
+ ],
423
+ },
424
+ children: [],
425
+ },
426
+ {
427
+ type: "ScopeTraversal",
428
+ meta: {
429
+ traversal: [
430
+ {
431
+ segment: "var",
432
+ },
433
+ {
434
+ segment: "list",
435
+ },
436
+ ],
437
+ },
438
+ children: [],
439
+ },
440
+ ],
441
+ }, "string"))).toMatchInlineSnapshot(`"Fn.join(TodoReference-var-str, TodoReference-var-list)"`);
442
+ });
443
+ it("should convert Terraform AST into TS AST for join function with multiple list params", () => {
444
+ expect((0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
445
+ type: "function",
446
+ meta: {
447
+ name: "join",
448
+ },
449
+ children: [
450
+ {
451
+ type: "ScopeTraversal",
452
+ meta: {
453
+ traversal: [
454
+ {
455
+ segment: "var",
456
+ },
457
+ {
458
+ segment: "str",
459
+ },
460
+ ],
461
+ },
462
+ children: [],
463
+ },
464
+ {
465
+ type: "ScopeTraversal",
466
+ meta: {
467
+ traversal: [
468
+ {
469
+ segment: "var",
470
+ },
471
+ {
472
+ segment: "listA",
473
+ },
474
+ ],
475
+ },
476
+ children: [],
477
+ },
478
+ {
479
+ type: "ScopeTraversal",
480
+ meta: {
481
+ traversal: [
482
+ {
483
+ segment: "var",
484
+ },
485
+ {
486
+ segment: "listB",
487
+ },
488
+ ],
489
+ },
490
+ children: [],
491
+ },
492
+ ],
493
+ }, "string"))).toMatchInlineSnapshot(`"Fn.join(TodoReference-var-str, Token.asList(Fn.concat([TodoReference-var-listA, TodoReference-var-listB])))"`);
494
+ });
495
+ it("should throw if not enough parameters were passed", () => {
496
+ expect(() => (0, testHelpers_1.astToCode)(terraformThingToTs(scope, {
497
+ type: "function",
498
+ meta: {
499
+ name: "bcrypt",
500
+ },
501
+ children: [],
502
+ }, "string"))).toThrowErrorMatchingInlineSnapshot(`"Terraform function call to "bcrypt" is not valid! Parameter at index 0 of type string is not optional but received no value. The following parameters were passed: []"`);
503
+ });
504
+ // TODO: tests for type coercion
505
+ });
506
+ function terraformThingToTs(scope, tfAst, targetType) {
507
+ switch (tfAst.type) {
508
+ case "function": {
509
+ return terraformFunctionCallToTs(scope, tfAst, targetType);
510
+ }
511
+ case "TemplateWrap": {
512
+ // If there's just one child, we can skip them
513
+ if (tfAst.children.length === 1) {
514
+ return terraformThingToTs(scope, tfAst.children[0], targetType);
515
+ }
516
+ throw new Error("TemplateWrap with not exactly one child is not supported yet: " +
517
+ tfAst.children);
518
+ }
519
+ case "ScopeTraversal": {
520
+ return terraformScopeTraversalToTs(tfAst, targetType);
521
+ }
522
+ case "Template": {
523
+ return terraformTemplateToTs(scope, tfAst, targetType);
524
+ }
525
+ case "LiteralValue": {
526
+ return terraformLiteralValueToTs(tfAst, targetType);
527
+ }
528
+ default:
529
+ throw new Error("Unsupported type: " + tfAst.type);
530
+ }
531
+ }
532
+ function terraformScopeTraversalToTs(tfAst, _targetType) {
533
+ return t.identifier("TodoReference-" + tfAst.meta.traversal.map((t) => t.segment).join("-"));
534
+ }
535
+ function terraformTemplateToTs(scope, tfAst, targetType) {
536
+ if (tfAst.children.length === 1) {
537
+ return terraformThingToTs(scope, tfAst.children[0], targetType);
538
+ }
539
+ throw new Error("Template currently only supports exactly one child");
540
+ }
541
+ function terraformLiteralValueToTs(tfAst, targetType) {
542
+ const literalExpression = t.stringLiteral(tfAst.meta.value);
543
+ return (0, coerceType_1.coerceType)(
544
+ // TODO: scope should be passed instead, even if coerceType won't need it probably
545
+ {
546
+ constructs: new Set(),
547
+ hasTokenBasedTypeCoercion: false,
548
+ providerGenerator: {},
549
+ providerSchema: {},
550
+ variables: {},
551
+ nodeIds: [],
552
+ importables: [],
553
+ topLevelConfig: {},
554
+ }, literalExpression, tfAst.meta.type, targetType);
555
+ }
556
+ function terraformFunctionCallToTs(scope, tfAst, targetType) {
557
+ const { name } = tfAst.meta;
558
+ const mapping = functions_1.functionsMap[name];
559
+ if (!mapping) {
560
+ throw new Error(`Mapping not found for function: ${name}`);
561
+ }
562
+ if (mapping.transformer) {
563
+ const newTfAst = mapping.transformer(tfAst);
564
+ if (newTfAst !== tfAst)
565
+ return terraformFunctionCallToTs(scope, newTfAst, targetType);
566
+ }
567
+ scope.importables.push({
568
+ constructName: "Fn",
569
+ provider: "cdktn",
570
+ });
571
+ const callee = t.memberExpression(t.identifier("Fn"), t.identifier(mapping.name));
572
+ const args = [];
573
+ mapping.parameters.forEach((param, idx) => {
574
+ if (param.variadic) {
575
+ // return an array with all remaining children (each mapped accordingly)
576
+ args.push(t.arrayExpression(tfAst.children
577
+ .slice(idx)
578
+ .map((child) => terraformThingToTs(scope, child, param.type))));
579
+ }
580
+ else {
581
+ const child = tfAst.children[idx];
582
+ if (child) {
583
+ args.push(terraformThingToTs(scope, child, param.type));
584
+ }
585
+ else if (!param.optional) {
586
+ throw new Error(`Terraform function call to "${name}" is not valid! Parameter at index ${idx} of type ${param.type} is not optional but received no value. The following parameters were passed: ${JSON.stringify(tfAst.children)}`);
587
+ }
588
+ }
589
+ });
590
+ const returnType = mapping.returnType;
591
+ const callExpression = t.callExpression(callee, args);
592
+ return (0, coerceType_1.coerceType)(
593
+ // TODO: scope should be passed instead, even if coerceType won't need it probably
594
+ {
595
+ constructs: new Set(),
596
+ hasTokenBasedTypeCoercion: false,
597
+ providerGenerator: {},
598
+ providerSchema: {},
599
+ variables: {},
600
+ nodeIds: [],
601
+ importables: [],
602
+ topLevelConfig: {},
603
+ }, callExpression, returnType, targetType);
604
+ }
605
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmdW5jdGlvbnMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsZ0RBQWtDO0FBRWxDLDhDQUEyQztBQUMzQyw4REFBOEQ7QUFFOUQsK0NBQTBDO0FBOEMxQyxNQUFNLEtBQUssR0FBaUI7SUFDMUIsY0FBYyxFQUFFLEVBQUU7SUFDbEIsaUJBQWlCLEVBQUUsRUFBRTtJQUNyQixVQUFVLEVBQUUsSUFBSSxHQUFHLEVBQUU7SUFDckIsU0FBUyxFQUFFLEVBQUU7SUFDYix5QkFBeUIsRUFBRSxLQUFLO0lBQ2hDLE9BQU8sRUFBRSxFQUFFO0lBQ1gsV0FBVyxFQUFFLEVBQUU7SUFDZixjQUFjLEVBQUUsRUFBRTtDQUNuQixDQUFDO0FBU0YsZ0RBQWdEO0FBQ2hELDREQUE0RDtBQUM1RCxNQUFNLE1BQU0sR0FBVTtJQUNwQixRQUFRLEVBQUU7UUFDUjtZQUNFLFFBQVEsRUFBRTtnQkFDUjtvQkFDRSxRQUFRLEVBQUUsRUFBRTtvQkFDWixJQUFJLEVBQUU7d0JBQ0osU0FBUyxFQUFFOzRCQUNUO2dDQUNFLEtBQUssRUFBRTtvQ0FDTCxHQUFHLEVBQUU7d0NBQ0gsSUFBSSxFQUFFLEVBQUU7d0NBQ1IsTUFBTSxFQUFFLEVBQUU7d0NBQ1YsSUFBSSxFQUFFLENBQUM7cUNBQ1I7b0NBQ0QsUUFBUSxFQUFFLEVBQUU7b0NBQ1osS0FBSyxFQUFFO3dDQUNMLElBQUksRUFBRSxFQUFFO3dDQUNSLE1BQU0sRUFBRSxFQUFFO3dDQUNWLElBQUksRUFBRSxDQUFDO3FDQUNSO2lDQUNGO2dDQUNELE9BQU8sRUFBRSxRQUFROzZCQUNsQjs0QkFDRDtnQ0FDRSxLQUFLLEVBQUU7b0NBQ0wsR0FBRyxFQUFFO3dDQUNILElBQUksRUFBRSxFQUFFO3dDQUNSLE1BQU0sRUFBRSxFQUFFO3dDQUNWLElBQUksRUFBRSxDQUFD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LEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FDYiwrQkFBK0IsSUFBSSxzQ0FBc0MsR0FBRyxZQUMxRSxLQUFLLENBQUMsSUFDUixpRkFBaUYsSUFBSSxDQUFDLFNBQVMsQ0FDN0YsS0FBSyxDQUFDLFFBQVEsQ0FDZixFQUFFLENBQ0osQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBRXRDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRXRELE9BQU8sSUFBQSx1QkFBVTtJQUNmLGtGQUFrRjtJQUNsRjtRQUNFLFVBQVUsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUNyQix5QkFBeUIsRUFBRSxLQUFLO1FBQ2hDLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsY0FBYyxFQUFFLEVBQUU7UUFDbEIsU0FBUyxFQUFFLEVBQUU7UUFDYixPQUFPLEVBQUUsRUFBRTtRQUNYLFdBQVcsRUFBRSxFQUFFO1FBQ2YsY0FBYyxFQUFFLEVBQUU7S0FDbkIsRUFDRCxjQUFjLEVBQ2QsVUFBVSxFQUNWLFVBQVUsQ0FDWCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgdCBmcm9tIFwiQGJhYmVsL3R5cGVzXCI7XG5pbXBvcnQgeyBBdHRyaWJ1dGVUeXBlIH0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQgeyBjb2VyY2VUeXBlIH0gZnJvbSBcIi4uL2NvZXJjZVR5cGVcIjtcbmltcG9ydCB7IGZ1bmN0aW9uc01hcCB9IGZyb20gXCIuLi9mdW5jdGlvbi1iaW5kaW5ncy9mdW5jdGlvbnNcIjtcbmltcG9ydCB7IFByb2dyYW1TY29wZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgYXN0VG9Db2RlIH0gZnJvbSBcIi4vdGVzdEhlbHBlcnNcIjtcblxudHlwZSBCYXNlVGhpbmcgPSB7XG4gIHR5cGU6IHN0cmluZztcbiAgY2hpbGRyZW46IFRoaW5nW107XG4gIG1ldGE/OiBvYmplY3Q7XG4gIHJhbmdlPzogdW5rbm93bjsgLy8gb3B0aW9uYWwgYXMgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdFxufTtcblxudHlwZSBGdW5jdGlvbkNhbGwgPSBCYXNlVGhpbmcgJiB7XG4gIHR5cGU6IFwiZnVuY3Rpb25cIjtcbiAgbWV0YToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBleHBhbmRlZEZpbmFsQXJndW1lbnQ/OiBib29sZWFuOyAvLyBvcHRpb25hbCBhcyB3ZSBkb24ndCBjYXJlIGFib3V0IGl0XG4gICAgY2xvc2VQYXJlblJhbmdlPzogdW5rbm93bjsgLy8gb3B0aW9uYWwgYXMgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdFxuICAgIG9wZW5QYXJlblJhbmdlPzogdW5rbm93bjsgLy8gb3B0aW9uYWwgYXMgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdFxuICAgIG5hbWVSYW5nZT86IHVua25vd247IC8vIG9wdGlvbmFsIGFzIHdlIGRvbid0IGNhcmUgYWJvdXQgaXRcbiAgfTtcbn07XG5cbnR5cGUgVGVtcGxhdGVXcmFwID0gQmFzZVRoaW5nICYge1xuICB0eXBlOiBcIlRlbXBsYXRlV3JhcFwiO1xufTtcblxudHlwZSBUZW1wbGF0ZSA9IEJhc2VUaGluZyAmIHtcbiAgdHlwZTogXCJUZW1wbGF0ZVwiO1xufTtcblxudHlwZSBMaXRlcmFsVmFsdWUgPSBCYXNlVGhpbmcgJiB7XG4gIHR5cGU6IFwiTGl0ZXJhbFZhbHVlXCI7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiO1xuICAgIHZhbHVlOiBzdHJpbmc7IC8vIHRoaXMgaXMgYXZhaWxhYmxlIGluIG90aGVyIFwiVGhpbmdzXCIgdG9vIGJ1dCB3ZSBvbmx5IG5lZWQgaXQgaGVyZSB5ZXRcbiAgfTtcbn07XG5cbnR5cGUgU2NvcGVUcmF2ZXJzYWwgPSBCYXNlVGhpbmcgJiB7XG4gIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIjtcbiAgbWV0YToge1xuICAgIHRyYXZlcnNhbDoge1xuICAgICAgc2VnbWVudDogc3RyaW5nO1xuICAgICAgcmFuZ2U/OiB1bmtub3duOyAvLyBvcHRpb25hbCBhcyB3ZSBkb24ndCBjYXJlIGFib3V0IGl0XG4gICAgfVtdO1xuICB9O1xufTtcblxuY29uc3Qgc2NvcGU6IFByb2dyYW1TY29wZSA9IHtcbiAgcHJvdmlkZXJTY2hlbWE6IHt9LFxuICBwcm92aWRlckdlbmVyYXRvcjoge30sXG4gIGNvbnN0cnVjdHM6IG5ldyBTZXQoKSxcbiAgdmFyaWFibGVzOiB7fSxcbiAgaGFzVG9rZW5CYXNlZFR5cGVDb2VyY2lvbjogZmFsc2UsXG4gIG5vZGVJZHM6IFtdLFxuICBpbXBvcnRhYmxlczogW10sXG4gIHRvcExldmVsQ29uZmlnOiB7fSxcbn07XG5cbnR5cGUgVGhpbmcgPVxuICB8IEZ1bmN0aW9uQ2FsbFxuICB8IFRlbXBsYXRlV3JhcFxuICB8IFRlbXBsYXRlXG4gIHwgU2NvcGVUcmF2ZXJzYWxcbiAgfCBMaXRlcmFsVmFsdWU7XG5cbi8vICcke3JlcGxhY2UobW9kdWxlLmZvby5vdXRwdXQsIFwiLVwiLCB2YXIuYmFyKX0nXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLWNkay9wdWxsLzI3MjlcbmNvbnN0IGR1bW15MjogVGhpbmcgPSB7XG4gIGNoaWxkcmVuOiBbXG4gICAge1xuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAge1xuICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICBFbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMTYsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMTYsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgRmlsZW5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBTdGFydDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWdtZW50OiBcIm1vZHVsZVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICAgICAgICAgIEVuZDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAyMCxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBGaWxlbmFtZTogXCJcIixcbiAgICAgICAgICAgICAgICAgIFN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDE2LFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDE2LFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwiZm9vXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgICAgICAgRW5kOiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDI3LFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDI3LFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIEZpbGVuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgU3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMjAsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMjAsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VnbWVudDogXCJvdXRwdXRcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgIGJ5dGU6IDI3LFxuICAgICAgICAgICAgICBjb2x1bW46IDI3LFxuICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICAgIGJ5dGU6IDEwLFxuICAgICAgICAgICAgICBjb2x1bW46IDEwLFxuICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiLVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAgICAgYnl0ZTogMzEsXG4gICAgICAgICAgICAgICAgICBjb2x1bW46IDMxLFxuICAgICAgICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgICAgICAgICBieXRlOiAzMCxcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogMzAsXG4gICAgICAgICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHR5cGU6IFwiTGl0ZXJhbFZhbHVlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICBieXRlOiAzMSxcbiAgICAgICAgICAgICAgY29sdW1uOiAzMSxcbiAgICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgICBieXRlOiAzMCxcbiAgICAgICAgICAgICAgY29sdW1uOiAzMCxcbiAgICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiBcIlRlbXBsYXRlXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgICAgICAgRW5kOiB7XG4gICAgICAgICAgICAgICAgICAgIEJ5dGU6IDM3LFxuICAgICAgICAgICAgICAgICAgICBDb2x1bW46IDM3LFxuICAgICAgICAgICAgICAgICAgICBMaW5lOiAwLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIEZpbGVuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgU3RhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogMzQsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogMzQsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICBFbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgQnl0ZTogNDEsXG4gICAgICAgICAgICAgICAgICAgIENvbHVtbjogNDEsXG4gICAgICAgICAgICAgICAgICAgIExpbmU6IDAsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgRmlsZW5hbWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBTdGFydDoge1xuICAgICAgICAgICAgICAgICAgICBCeXRlOiAzNyxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uOiAzNyxcbiAgICAgICAgICAgICAgICAgICAgTGluZTogMCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWdtZW50OiBcImJhclwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgYnl0ZTogNDEsXG4gICAgICAgICAgICAgIGNvbHVtbjogNDEsXG4gICAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgYnl0ZTogMzQsXG4gICAgICAgICAgICAgIGNvbHVtbjogMzQsXG4gICAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgY2xvc2VQYXJlblJhbmdlOiB7XG4gICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICBieXRlOiA0MixcbiAgICAgICAgICAgIGNvbHVtbjogNDIsXG4gICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgIGJ5dGU6IDQxLFxuICAgICAgICAgICAgY29sdW1uOiA0MSxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwYW5kZWRGaW5hbEFyZ3VtZW50OiBmYWxzZSxcbiAgICAgICAgbmFtZTogXCJyZXBsYWNlXCIsXG4gICAgICAgIG5hbWVSYW5nZToge1xuICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgYnl0ZTogOSxcbiAgICAgICAgICAgIGNvbHVtbjogOSxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgYnl0ZTogMixcbiAgICAgICAgICAgIGNvbHVtbjogMixcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgb3BlblBhcmVuUmFuZ2U6IHtcbiAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgIGJ5dGU6IDEwLFxuICAgICAgICAgICAgY29sdW1uOiAxMCxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgYnl0ZTogOSxcbiAgICAgICAgICAgIGNvbHVtbjogOSxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByYW5nZToge1xuICAgICAgICBlbmQ6IHtcbiAgICAgICAgICBieXRlOiAxMCxcbiAgICAgICAgICBjb2x1bW46IDEwLFxuICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgYnl0ZTogMixcbiAgICAgICAgICBjb2x1bW46IDIsXG4gICAgICAgICAgbGluZTogMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgfSxcbiAgXSxcbiAgcmFuZ2U6IHtcbiAgICBlbmQ6IHtcbiAgICAgIGJ5dGU6IDQzLFxuICAgICAgY29sdW1uOiA0MyxcbiAgICAgIGxpbmU6IDAsXG4gICAgfSxcbiAgICBzdGFydDoge1xuICAgICAgYnl0ZTogMCxcbiAgICAgIGNvbHVtbjogMCxcbiAgICAgIGxpbmU6IDAsXG4gICAgfSxcbiAgfSxcbiAgdHlwZTogXCJUZW1wbGF0ZVdyYXBcIixcbn07XG5cbmRlc2NyaWJlKFwiYmluZGluZ3MgZm9yIFRlcnJhZm9ybSBmdW5jdGlvbnNcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBjb252ZXJ0IFRlcnJhZm9ybSBBU1QgaW50byBUUyBBU1RcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZSh0ZXJyYWZvcm1UaGluZ1RvVHMoc2NvcGUsIGR1bW15MiwgXCJkeW5hbWljXCIpKSxcbiAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChcbiAgICAgIGBcIkZuLnJlcGxhY2UoVG9kb1JlZmVyZW5jZS1tb2R1bGUtZm9vLW91dHB1dCwgXCItXCIsIFRvZG9SZWZlcmVuY2UtdmFyLWJhcilcImAsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBvdmVycmlkZW4gZnVuY3Rpb24gbmFtZVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgYXN0VG9Db2RlKFxuICAgICAgICB0ZXJyYWZvcm1UaGluZ1RvVHMoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICBuYW1lOiBcImxlbmd0aFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibnVtYmVyXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KGBcIkZuLmxlbmd0aE9mKFRvZG9SZWZlcmVuY2UtdmFyLWxpc3QpXCJgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBvdmVycmlkZW4gZnVuY3Rpb24gd2l0aCB2YXJpYWRpYyBhcmdzIGZvciBvcHRpb25hbCBwYXJhbXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJiY3J5cHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwic3RyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwiY29zdFwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInN0cmluZ1wiLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChcbiAgICAgIGBcIkZuLmJjcnlwdChUb2RvUmVmZXJlbmNlLXZhci1zdHIsIFRvZG9SZWZlcmVuY2UtdmFyLWNvc3QpXCJgLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgVGVycmFmb3JtIEFTVCBpbnRvIFRTIEFTVCBmb3Igb3ZlcnJpZGVuIGZ1bmN0aW9uIHdpdGggdmFyaWFkaWMgYXJncyBmb3Igb3B0aW9uYWwgcGFyYW1zIHRoYXQgYXJlIG5vdCBwYXNzZWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJiY3J5cHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJTY29wZVRyYXZlcnNhbFwiLFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgIHRyYXZlcnNhbDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJ2YXJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwic3RyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KGBcIkZuLmJjcnlwdChUb2RvUmVmZXJlbmNlLXZhci1zdHIpXCJgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY29udmVydCBUZXJyYWZvcm0gQVNUIGludG8gVFMgQVNUIGZvciBmdW5jdGlvbiB3aXRoIHZhcmlhZGljIHBhcmFtXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBhc3RUb0NvZGUoXG4gICAgICAgIHRlcnJhZm9ybVRoaW5nVG9UcyhcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgIG5hbWU6IFwidHJ5XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInN0ckFcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJzdHJCXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZHluYW1pY1wiLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChcbiAgICAgIGBcIkZuLnRyeShbVG9kb1JlZmVyZW5jZS12YXItc3RyQSwgVG9kb1JlZmVyZW5jZS12YXItc3RyQl0pXCJgLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgVGVycmFmb3JtIEFTVCBpbnRvIFRTIEFTVCBmb3Igam9pbiBmdW5jdGlvbiB3aXRoIHNpbmdsZSBsaXN0IHBhcmFtXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBhc3RUb0NvZGUoXG4gICAgICAgIHRlcnJhZm9ybVRoaW5nVG9UcyhcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgIG5hbWU6IFwiam9pblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJzdHJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFwiRm4uam9pbihUb2RvUmVmZXJlbmNlLXZhci1zdHIsIFRvZG9SZWZlcmVuY2UtdmFyLWxpc3QpXCJgLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgVGVycmFmb3JtIEFTVCBpbnRvIFRTIEFTVCBmb3Igam9pbiBmdW5jdGlvbiB3aXRoIG11bHRpcGxlIGxpc3QgcGFyYW1zXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBhc3RUb0NvZGUoXG4gICAgICAgIHRlcnJhZm9ybVRoaW5nVG9UcyhcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgIG5hbWU6IFwiam9pblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJzdHJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNjb3BlVHJhdmVyc2FsXCIsXG4gICAgICAgICAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgICAgICAgdHJhdmVyc2FsOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcInZhclwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogXCJsaXN0QVwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU2NvcGVUcmF2ZXJzYWxcIixcbiAgICAgICAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWw6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQ6IFwidmFyXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50OiBcImxpc3RCXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFwiRm4uam9pbihUb2RvUmVmZXJlbmNlLXZhci1zdHIsIFRva2VuLmFzTGlzdChGbi5jb25jYXQoW1RvZG9SZWZlcmVuY2UtdmFyLWxpc3RBLCBUb2RvUmVmZXJlbmNlLXZhci1saXN0Ql0pKSlcImAsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgdGhyb3cgaWYgbm90IGVub3VnaCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkXCIsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIGFzdFRvQ29kZShcbiAgICAgICAgdGVycmFmb3JtVGhpbmdUb1RzKFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgbmFtZTogXCJiY3J5cHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInN0cmluZ1wiLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLnRvVGhyb3dFcnJvck1hdGNoaW5nSW5saW5lU25hcHNob3QoXG4gICAgICBgXCJUZXJyYWZvcm0gZnVuY3Rpb24gY2FsbCB0byBcImJjcnlwdFwiIGlzIG5vdCB2YWxpZCEgUGFyYW1ldGVyIGF0IGluZGV4IDAgb2YgdHlwZSBzdHJpbmcgaXMgbm90IG9wdGlvbmFsIGJ1dCByZWNlaXZlZCBubyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkOiBbXVwiYCxcbiAgICApO1xuICB9KTtcblxuICAvLyBUT0RPOiB0ZXN0cyBmb3IgdHlwZSBjb2VyY2lvblxufSk7XG5cbmZ1bmN0aW9uIHRlcnJhZm9ybVRoaW5nVG9UcyhcbiAgc2NvcGU6IFByb2dyYW1TY29wZSxcbiAgdGZBc3Q6IFRoaW5nLFxuICB0YXJnZXRUeXBlOiBBdHRyaWJ1dGVUeXBlIHwgdW5kZWZpbmVkLFxuKTogdC5FeHByZXNzaW9uIHtcbiAgc3dpdGNoICh0ZkFzdC50eXBlKSB7XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6IHtcbiAgICAgIHJldHVybiB0ZXJyYWZvcm1GdW5jdGlvbkNhbGxUb1RzKHNjb3BlLCB0ZkFzdCwgdGFyZ2V0VHlwZSk7XG4gICAgfVxuICAgIGNhc2UgXCJUZW1wbGF0ZVdyYXBcIjoge1xuICAgICAgLy8gSWYgdGhlcmUncyBqdXN0IG9uZSBjaGlsZCwgd2UgY2FuIHNraXAgdGhlbVxuICAgICAgaWYgKHRmQXN0LmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGVycmFmb3JtVGhpbmdUb1RzKHNjb3BlLCB0ZkFzdC5jaGlsZHJlblswXSwgdGFyZ2V0VHlwZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGVtcGxhdGVXcmFwIHdpdGggbm90IGV4YWN0bHkgb25lIGNoaWxkIGlzIG5vdCBzdXBwb3J0ZWQgeWV0OiBcIiArXG4gICAgICAgICAgdGZBc3QuY2hpbGRyZW4sXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlIFwiU2NvcGVUcmF2ZXJzYWxcIjoge1xuICAgICAgcmV0dXJuIHRlcnJhZm9ybVNjb3BlVHJhdmVyc2FsVG9Ucyh0ZkFzdCwgdGFyZ2V0VHlwZSk7XG4gICAgfVxuICAgIGNhc2UgXCJUZW1wbGF0ZVwiOiB7XG4gICAgICByZXR1cm4gdGVycmFmb3JtVGVtcGxhdGVUb1RzKHNjb3BlLCB0ZkFzdCwgdGFyZ2V0VHlwZSk7XG4gICAgfVxuICAgIGNhc2UgXCJMaXRlcmFsVmFsdWVcIjoge1xuICAgICAgcmV0dXJuIHRlcnJhZm9ybUxpdGVyYWxWYWx1ZVRvVHModGZBc3QsIHRhcmdldFR5cGUpO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgdHlwZTogXCIgKyAodGZBc3QgYXMgYW55KS50eXBlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXJyYWZvcm1TY29wZVRyYXZlcnNhbFRvVHMoXG4gIHRmQXN0OiBTY29wZVRyYXZlcnNhbCxcbiAgX3RhcmdldFR5cGU6IEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQsXG4pOiB0LkV4cHJlc3Npb24ge1xuICByZXR1cm4gdC5pZGVudGlmaWVyKFxuICAgIFwiVG9kb1JlZmVyZW5jZS1cIiArIHRmQXN0Lm1ldGEudHJhdmVyc2FsLm1hcCgodCkgPT4gdC5zZWdtZW50KS5qb2luKFwiLVwiKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gdGVycmFmb3JtVGVtcGxhdGVUb1RzKFxuICBzY29wZTogUHJvZ3JhbVNjb3BlLFxuICB0ZkFzdDogVGVtcGxhdGUsXG4gIHRhcmdldFR5cGU6IEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQsXG4pOiB0LkV4cHJlc3Npb24ge1xuICBpZiAodGZBc3QuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHRlcnJhZm9ybVRoaW5nVG9UcyhzY29wZSwgdGZBc3QuY2hpbGRyZW5bMF0sIHRhcmdldFR5cGUpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIlRlbXBsYXRlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIGV4YWN0bHkgb25lIGNoaWxkXCIpO1xufVxuXG5mdW5jdGlvbiB0ZXJyYWZvcm1MaXRlcmFsVmFsdWVUb1RzKFxuICB0ZkFzdDogTGl0ZXJhbFZhbHVlLFxuICB0YXJnZXRUeXBlOiBBdHRyaWJ1dGVUeXBlIHwgdW5kZWZpbmVkLFxuKTogdC5FeHByZXNzaW9uIHtcbiAgY29uc3QgbGl0ZXJhbEV4cHJlc3Npb24gPSB0LnN0cmluZ0xpdGVyYWwodGZBc3QubWV0YS52YWx1ZSk7XG4gIHJldHVybiBjb2VyY2VUeXBlKFxuICAgIC8vIFRPRE86IHNjb3BlIHNob3VsZCBiZSBwYXNzZWQgaW5zdGVhZCwgZXZlbiBpZiBjb2VyY2VUeXBlIHdvbid0IG5lZWQgaXQgcHJvYmFibHlcbiAgICB7XG4gICAgICBjb25zdHJ1Y3RzOiBuZXcgU2V0KCksXG4gICAgICBoYXNUb2tlbkJhc2VkVHlwZUNvZXJjaW9uOiBmYWxzZSxcbiAgICAgIHByb3ZpZGVyR2VuZXJhdG9yOiB7fSxcbiAgICAgIHByb3ZpZGVyU2NoZW1hOiB7fSxcbiAgICAgIHZhcmlhYmxlczoge30sXG4gICAgICBub2RlSWRzOiBbXSxcbiAgICAgIGltcG9ydGFibGVzOiBbXSxcbiAgICAgIHRvcExldmVsQ29uZmlnOiB7fSxcbiAgICB9LFxuICAgIGxpdGVyYWxFeHByZXNzaW9uLFxuICAgIHRmQXN0Lm1ldGEudHlwZSxcbiAgICB0YXJnZXRUeXBlLFxuICApO1xufVxuXG5mdW5jdGlvbiB0ZXJyYWZvcm1GdW5jdGlvbkNhbGxUb1RzKFxuICBzY29wZTogUHJvZ3JhbVNjb3BlLFxuICB0ZkFzdDogRnVuY3Rpb25DYWxsLFxuICB0YXJnZXRUeXBlOiBBdHRyaWJ1dGVUeXBlIHwgdW5kZWZpbmVkLFxuKTogdC5FeHByZXNzaW9uIHtcbiAgY29uc3QgeyBuYW1lIH0gPSB0ZkFzdC5tZXRhO1xuXG4gIGNvbnN0IG1hcHBpbmcgPSBmdW5jdGlvbnNNYXBbbmFtZV07XG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWFwcGluZyBub3QgZm91bmQgZm9yIGZ1bmN0aW9uOiAke25hbWV9YCk7XG4gIH1cblxuICBpZiAobWFwcGluZy50cmFuc2Zvcm1lcikge1xuICAgIGNvbnN0IG5ld1RmQXN0ID0gbWFwcGluZy50cmFuc2Zvcm1lcih0ZkFzdCk7XG4gICAgaWYgKG5ld1RmQXN0ICE9PSB0ZkFzdClcbiAgICAgIHJldHVybiB0ZXJyYWZvcm1GdW5jdGlvbkNhbGxUb1RzKHNjb3BlLCBuZXdUZkFzdCwgdGFyZ2V0VHlwZSk7XG4gIH1cblxuICBzY29wZS5pbXBvcnRhYmxlcy5wdXNoKHtcbiAgICBjb25zdHJ1Y3ROYW1lOiBcIkZuXCIsXG4gICAgcHJvdmlkZXI6IFwiY2RrdG5cIixcbiAgfSk7XG5cbiAgY29uc3QgY2FsbGVlID0gdC5tZW1iZXJFeHByZXNzaW9uKFxuICAgIHQuaWRlbnRpZmllcihcIkZuXCIpLFxuICAgIHQuaWRlbnRpZmllcihtYXBwaW5nLm5hbWUpLFxuICApO1xuXG4gIGNvbnN0IGFyZ3M6IHQuRXhwcmVzc2lvbltdID0gW107XG4gIG1hcHBpbmcucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbSwgaWR4KSA9PiB7XG4gICAgaWYgKHBhcmFtLnZhcmlhZGljKSB7XG4gICAgICAvLyByZXR1cm4gYW4gYXJyYXkgd2l0aCBhbGwgcmVtYWluaW5nIGNoaWxkcmVuIChlYWNoIG1hcHBlZCBhY2NvcmRpbmdseSlcbiAgICAgIGFyZ3MucHVzaChcbiAgICAgICAgdC5hcnJheUV4cHJlc3Npb24oXG4gICAgICAgICAgdGZBc3QuY2hpbGRyZW5cbiAgICAgICAgICAgIC5zbGljZShpZHgpXG4gICAgICAgICAgICAubWFwKChjaGlsZCkgPT4gdGVycmFmb3JtVGhpbmdUb1RzKHNjb3BlLCBjaGlsZCwgcGFyYW0udHlwZSkpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2hpbGQgPSB0ZkFzdC5jaGlsZHJlbltpZHhdO1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIGFyZ3MucHVzaCh0ZXJyYWZvcm1UaGluZ1RvVHMoc2NvcGUsIGNoaWxkLCBwYXJhbS50eXBlKSk7XG4gICAgICB9IGVsc2UgaWYgKCFwYXJhbS5vcHRpb25hbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRlcnJhZm9ybSBmdW5jdGlvbiBjYWxsIHRvIFwiJHtuYW1lfVwiIGlzIG5vdCB2YWxpZCEgUGFyYW1ldGVyIGF0IGluZGV4ICR7aWR4fSBvZiB0eXBlICR7XG4gICAgICAgICAgICBwYXJhbS50eXBlXG4gICAgICAgICAgfSBpcyBub3Qgb3B0aW9uYWwgYnV0IHJlY2VpdmVkIG5vIHZhbHVlLiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQ6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB0ZkFzdC5jaGlsZHJlbixcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCByZXR1cm5UeXBlID0gbWFwcGluZy5yZXR1cm5UeXBlO1xuXG4gIGNvbnN0IGNhbGxFeHByZXNzaW9uID0gdC5jYWxsRXhwcmVzc2lvbihjYWxsZWUsIGFyZ3MpO1xuXG4gIHJldHVybiBjb2VyY2VUeXBlKFxuICAgIC8vIFRPRE86IHNjb3BlIHNob3VsZCBiZSBwYXNzZWQgaW5zdGVhZCwgZXZlbiBpZiBjb2VyY2VUeXBlIHdvbid0IG5lZWQgaXQgcHJvYmFibHlcbiAgICB7XG4gICAgICBjb25zdHJ1Y3RzOiBuZXcgU2V0KCksXG4gICAgICBoYXNUb2tlbkJhc2VkVHlwZUNvZXJjaW9uOiBmYWxzZSxcbiAgICAgIHByb3ZpZGVyR2VuZXJhdG9yOiB7fSxcbiAgICAgIHByb3ZpZGVyU2NoZW1hOiB7fSxcbiAgICAgIHZhcmlhYmxlczoge30sXG4gICAgICBub2RlSWRzOiBbXSxcbiAgICAgIGltcG9ydGFibGVzOiBbXSxcbiAgICAgIHRvcExldmVsQ29uZmlnOiB7fSxcbiAgICB9LFxuICAgIGNhbGxFeHByZXNzaW9uLFxuICAgIHJldHVyblR5cGUsXG4gICAgdGFyZ2V0VHlwZSxcbiAgKTtcbn1cbiJdfQ==