nextlove 2.19.0 → 3.0.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.
@@ -1,3 +1,30 @@
1
+ import {
2
+ getArrayConstraints,
3
+ getArrayType,
4
+ getBrandedType,
5
+ getCatchall,
6
+ getChecks,
7
+ getCustomTypeGetter,
8
+ getDefaultValue,
9
+ getDiscriminator,
10
+ getEffect,
11
+ getEffectsSchema,
12
+ getEnumValues,
13
+ getFunctionParts,
14
+ getInnerType,
15
+ getIntersectionParts,
16
+ getLiteralValue,
17
+ getMapTypes,
18
+ getPipelineParts,
19
+ getPromiseType,
20
+ getRecordValueType,
21
+ getSetValueType,
22
+ getShape,
23
+ getTupleItems,
24
+ getTypeName,
25
+ getUnionOptions,
26
+ getUnknownKeys
27
+ } from "../chunk-GZTWRF2R.mjs";
1
28
  import {
2
29
  __require,
3
30
  __toESM,
@@ -81,7 +108,6 @@ var parseRoutesInPackage = async (opts) => {
81
108
 
82
109
  // src/generators/lib/zod-openapi.ts
83
110
  init_esm_shims();
84
- import merge from "ts-deepmerge";
85
111
  import { z } from "zod";
86
112
 
87
113
  // src/generators/lib/front-matter.ts
@@ -163,15 +189,25 @@ function dashifyObjectKeys(obj) {
163
189
  }
164
190
 
165
191
  // src/generators/lib/zod-openapi.ts
192
+ function mergeSchemas(...schemas) {
193
+ const result = {};
194
+ for (const schema of schemas) {
195
+ if (schema) {
196
+ Object.assign(result, schema);
197
+ }
198
+ }
199
+ return result;
200
+ }
166
201
  function iterateZodObject({
167
202
  zodRef,
168
203
  useOutput,
169
204
  hideDefinitions
170
205
  }) {
171
- const reduced = Object.keys(zodRef.shape).filter((key) => (hideDefinitions == null ? void 0 : hideDefinitions.includes(key)) === false).reduce(
206
+ const shape = getShape(zodRef) || {};
207
+ const reduced = Object.keys(shape).filter((key) => (hideDefinitions == null ? void 0 : hideDefinitions.includes(key)) === false).reduce(
172
208
  (carry, key) => ({
173
209
  ...carry,
174
- [key]: generateSchema(zodRef.shape[key], useOutput)
210
+ [key]: generateSchema(shape[key], useOutput)
175
211
  }),
176
212
  {}
177
213
  );
@@ -204,13 +240,15 @@ function parseTransformation({
204
240
  schemas,
205
241
  useOutput
206
242
  }) {
207
- const input = generateSchema(zodRef._def.schema, useOutput);
243
+ const innerSchema = getEffectsSchema(zodRef);
244
+ const input = innerSchema ? generateSchema(innerSchema, useOutput) : {};
208
245
  let output = "undefined";
209
- if (useOutput && zodRef._def.effect) {
210
- const effect = zodRef._def.effect.type === "transform" ? zodRef._def.effect : null;
211
- if (effect && "transform" in effect) {
246
+ const effect = getEffect(zodRef);
247
+ if (useOutput && effect) {
248
+ const transformEffect = effect.type === "transform" ? effect : null;
249
+ if (transformEffect && "transform" in transformEffect) {
212
250
  try {
213
- output = typeof effect.transform(
251
+ output = typeof transformEffect.transform(
214
252
  ["integer", "number"].includes(`${input.type}`) ? 0 : "string" === input.type ? "" : "boolean" === input.type ? false : "object" === input.type ? {} : "null" === input.type ? null : "array" === input.type ? [] : void 0,
215
253
  { addIssue: () => void 0, path: [] }
216
254
  );
@@ -218,7 +256,7 @@ function parseTransformation({
218
256
  }
219
257
  }
220
258
  }
221
- return merge(
259
+ return mergeSchemas(
222
260
  {
223
261
  ...zodRef.description ? { description: zodRef.description } : {},
224
262
  ...input,
@@ -236,9 +274,12 @@ function parseString({
236
274
  const baseSchema = {
237
275
  type: "string"
238
276
  };
239
- const { checks = [] } = zodRef._def;
277
+ const checks = getChecks(zodRef);
240
278
  checks.forEach((item) => {
241
- switch (item.kind) {
279
+ var _a, _b, _c, _d, _e;
280
+ const kind = item.kind || item.check;
281
+ const format = item.format;
282
+ switch (kind) {
242
283
  case "email":
243
284
  baseSchema.format = "email";
244
285
  break;
@@ -254,22 +295,36 @@ function parseString({
254
295
  case "datetime":
255
296
  baseSchema.format = "date-time";
256
297
  break;
298
+ case "string_format":
299
+ if (format === "email")
300
+ baseSchema.format = "email";
301
+ else if (format === "uuid")
302
+ baseSchema.format = "uuid";
303
+ else if (format === "cuid")
304
+ baseSchema.format = "cuid";
305
+ else if (format === "url")
306
+ baseSchema.format = "uri";
307
+ else if (format === "datetime")
308
+ baseSchema.format = "date-time";
309
+ break;
257
310
  case "length":
258
311
  baseSchema.minLength = item.value;
259
312
  baseSchema.maxLength = item.value;
260
313
  break;
261
314
  case "max":
262
- baseSchema.maxLength = item.value;
315
+ case "max_length":
316
+ baseSchema.maxLength = (_a = item.value) != null ? _a : item.maximum;
263
317
  break;
264
318
  case "min":
265
- baseSchema.minLength = item.value;
319
+ case "min_length":
320
+ baseSchema.minLength = (_b = item.value) != null ? _b : item.minimum;
266
321
  break;
267
322
  case "regex":
268
- baseSchema.pattern = item.regex.source;
323
+ baseSchema.pattern = (_e = (_c = item.regex) == null ? void 0 : _c.source) != null ? _e : (_d = item.pattern) == null ? void 0 : _d.source;
269
324
  break;
270
325
  }
271
326
  });
272
- return merge(baseSchema, parseDescription(zodRef), ...schemas);
327
+ return mergeSchemas(baseSchema, parseDescription(zodRef), ...schemas);
273
328
  }
274
329
  function parseNumber({
275
330
  zodRef,
@@ -279,7 +334,7 @@ function parseNumber({
279
334
  type: "number",
280
335
  format: "float"
281
336
  };
282
- const { checks = [] } = zodRef._def;
337
+ const checks = getChecks(zodRef);
283
338
  checks.forEach((item) => {
284
339
  switch (item.kind) {
285
340
  case "max":
@@ -300,7 +355,7 @@ function parseNumber({
300
355
  baseSchema.multipleOf = item.value;
301
356
  }
302
357
  });
303
- return merge(baseSchema, parseDescription(zodRef), ...schemas);
358
+ return mergeSchemas(baseSchema, parseDescription(zodRef), ...schemas);
304
359
  }
305
360
  function getExcludedDefinitionsFromSchema(schemas) {
306
361
  const excludedDefinitions = [];
@@ -317,23 +372,27 @@ function parseObject({
317
372
  useOutput,
318
373
  hideDefinitions
319
374
  }) {
320
- var _a;
321
375
  let additionalProperties;
322
- if (!(zodRef._def.catchall instanceof z.ZodNever || ((_a = zodRef._def.catchall) == null ? void 0 : _a._def.typeName) === "ZodNever"))
323
- additionalProperties = generateSchema(zodRef._def.catchall, useOutput);
324
- else if (zodRef._def.unknownKeys === "passthrough")
376
+ const catchall = getCatchall(zodRef);
377
+ const unknownKeys = getUnknownKeys(zodRef);
378
+ if (!(catchall instanceof z.ZodNever || catchall && getTypeName(catchall) === "ZodNever")) {
379
+ if (catchall) {
380
+ additionalProperties = generateSchema(catchall, useOutput);
381
+ }
382
+ } else if (unknownKeys === "passthrough") {
325
383
  additionalProperties = true;
326
- else if (zodRef._def.unknownKeys === "strict")
384
+ } else if (unknownKeys === "strict") {
327
385
  additionalProperties = false;
386
+ }
328
387
  additionalProperties = additionalProperties != null ? { additionalProperties } : {};
329
- const requiredProperties = Object.keys(
330
- zodRef.shape
331
- ).filter((key) => {
332
- const item = zodRef.shape[key];
333
- return !(item.isOptional() || item instanceof z.ZodDefault || item._def.typeName === "ZodDefault") && !(item instanceof z.ZodNever || item._def.typeName === "ZodDefault");
388
+ const objectShape = getShape(zodRef) || {};
389
+ const requiredProperties = Object.keys(objectShape).filter((key) => {
390
+ const item = objectShape[key];
391
+ const itemTypeName = getTypeName(item);
392
+ return !(item.isOptional() || item instanceof z.ZodDefault || itemTypeName === "ZodDefault") && !(item instanceof z.ZodNever || itemTypeName === "ZodDefault");
334
393
  });
335
394
  const required = requiredProperties.length > 0 ? { required: requiredProperties } : {};
336
- return merge(
395
+ return mergeSchemas(
337
396
  {
338
397
  type: "object",
339
398
  properties: iterateZodObject({
@@ -355,10 +414,11 @@ function parseRecord({
355
414
  schemas,
356
415
  useOutput
357
416
  }) {
358
- return merge(
417
+ const valueType = getRecordValueType(zodRef);
418
+ return mergeSchemas(
359
419
  {
360
420
  type: "object",
361
- additionalProperties: zodRef._def.valueType instanceof z.ZodUnknown ? {} : generateSchema(zodRef._def.valueType, useOutput)
421
+ additionalProperties: valueType instanceof z.ZodUnknown ? {} : valueType ? generateSchema(valueType, useOutput) : {}
362
422
  },
363
423
  parseDescription(zodRef),
364
424
  ...schemas
@@ -368,7 +428,7 @@ function parseBigInt({
368
428
  zodRef,
369
429
  schemas
370
430
  }) {
371
- return merge(
431
+ return mergeSchemas(
372
432
  { type: "integer", format: "int64" },
373
433
  parseDescription(zodRef),
374
434
  ...schemas
@@ -378,21 +438,21 @@ function parseBoolean({
378
438
  zodRef,
379
439
  schemas
380
440
  }) {
381
- return merge(
441
+ return mergeSchemas(
382
442
  { type: "boolean" },
383
443
  parseDescription(zodRef),
384
444
  ...schemas
385
445
  );
386
446
  }
387
447
  function parseDate({ zodRef, schemas }) {
388
- return merge(
448
+ return mergeSchemas(
389
449
  { type: "string", format: "date-time" },
390
450
  parseDescription(zodRef),
391
451
  ...schemas
392
452
  );
393
453
  }
394
454
  function parseNull({ zodRef, schemas }) {
395
- return merge(
455
+ return mergeSchemas(
396
456
  {
397
457
  nullable: true
398
458
  },
@@ -405,7 +465,7 @@ function parseOptional({
405
465
  zodRef,
406
466
  useOutput
407
467
  }) {
408
- return merge(
468
+ return mergeSchemas(
409
469
  generateSchema(zodRef.unwrap(), useOutput),
410
470
  parseDescription(zodRef),
411
471
  ...schemas
@@ -417,7 +477,7 @@ function parseNullable({
417
477
  useOutput
418
478
  }) {
419
479
  const schema = generateSchema(zodRef.unwrap(), useOutput);
420
- return merge(
480
+ return mergeSchemas(
421
481
  { ...schema, type: schema.type, nullable: true },
422
482
  parseDescription(zodRef),
423
483
  ...schemas
@@ -428,10 +488,11 @@ function parseDefault({
428
488
  zodRef,
429
489
  useOutput
430
490
  }) {
431
- return merge(
491
+ const innerType = getInnerType(zodRef);
492
+ return mergeSchemas(
432
493
  {
433
- default: zodRef._def.defaultValue(),
434
- ...generateSchema(zodRef._def.innerType, useOutput)
494
+ default: getDefaultValue(zodRef),
495
+ ...innerType ? generateSchema(innerType, useOutput) : {}
435
496
  },
436
497
  parseDescription(zodRef),
437
498
  ...schemas
@@ -443,15 +504,16 @@ function parseArray({
443
504
  useOutput
444
505
  }) {
445
506
  const constraints = {};
446
- if (zodRef._def.exactLength != null) {
447
- constraints.minItems = zodRef._def.exactLength.value;
448
- constraints.maxItems = zodRef._def.exactLength.value;
507
+ const { exactLength, minLength, maxLength } = getArrayConstraints(zodRef);
508
+ if (exactLength != null) {
509
+ constraints.minItems = exactLength.value;
510
+ constraints.maxItems = exactLength.value;
449
511
  }
450
- if (zodRef._def.minLength != null)
451
- constraints.minItems = zodRef._def.minLength.value;
452
- if (zodRef._def.maxLength != null)
453
- constraints.maxItems = zodRef._def.maxLength.value;
454
- return merge(
512
+ if (minLength != null)
513
+ constraints.minItems = minLength.value;
514
+ if (maxLength != null)
515
+ constraints.maxItems = maxLength.value;
516
+ return mergeSchemas(
455
517
  {
456
518
  type: "array",
457
519
  items: generateSchema(zodRef.element, useOutput),
@@ -461,27 +523,31 @@ function parseArray({
461
523
  ...schemas
462
524
  );
463
525
  }
464
- function parseLiteral({
465
- schemas,
466
- zodRef
467
- }) {
468
- return merge(
526
+ function parseLiteral({ schemas, zodRef }) {
527
+ const value = getLiteralValue(zodRef);
528
+ return mergeSchemas(
469
529
  {
470
- type: typeof zodRef._def.value,
471
- enum: [zodRef._def.value]
530
+ type: typeof value,
531
+ enum: [value]
472
532
  },
473
533
  parseDescription(zodRef),
474
534
  ...schemas
475
535
  );
476
536
  }
477
- function parseEnum({
478
- schemas,
479
- zodRef
480
- }) {
481
- return merge(
537
+ function parseEnum({ schemas, zodRef }) {
538
+ const values = getEnumValues(zodRef);
539
+ if (!values) {
540
+ return mergeSchemas(
541
+ { type: "string" },
542
+ parseDescription(zodRef),
543
+ ...schemas
544
+ );
545
+ }
546
+ const valuesArray = Array.isArray(values) ? values : Object.values(values);
547
+ return mergeSchemas(
482
548
  {
483
- type: typeof Object.values(zodRef._def.values)[0],
484
- enum: Object.values(zodRef._def.values)
549
+ type: typeof valuesArray[0],
550
+ enum: valuesArray
485
551
  },
486
552
  parseDescription(zodRef),
487
553
  ...schemas
@@ -492,11 +558,12 @@ function parseIntersection({
492
558
  zodRef,
493
559
  useOutput
494
560
  }) {
495
- return merge(
561
+ const { left, right } = getIntersectionParts(zodRef);
562
+ return mergeSchemas(
496
563
  {
497
564
  allOf: [
498
- generateSchema(zodRef._def.left, useOutput),
499
- generateSchema(zodRef._def.right, useOutput)
565
+ left ? generateSchema(left, useOutput) : {},
566
+ right ? generateSchema(right, useOutput) : {}
500
567
  ]
501
568
  },
502
569
  parseDescription(zodRef),
@@ -508,21 +575,21 @@ function parseUnion({
508
575
  zodRef,
509
576
  useOutput
510
577
  }) {
511
- const contents = zodRef._def.options;
578
+ const contents = getUnionOptions(zodRef);
512
579
  if (contents.reduce(
513
- (prev, content) => prev && content._def.typeName === "ZodLiteral",
580
+ (prev, content) => prev && getTypeName(content) === "ZodLiteral",
514
581
  true
515
582
  )) {
516
583
  const literals = contents;
517
- const type = literals.reduce(
518
- (prev, content) => !prev || prev === typeof content._def.value ? typeof content._def.value : null,
519
- null
520
- );
584
+ const type = literals.reduce((prev, content) => {
585
+ const value = getLiteralValue(content);
586
+ return !prev || prev === typeof value ? typeof value : null;
587
+ }, null);
521
588
  if (type) {
522
- return merge(
589
+ return mergeSchemas(
523
590
  {
524
591
  type,
525
- enum: literals.map((literal) => literal._def.value)
592
+ enum: literals.map((literal) => getLiteralValue(literal))
526
593
  },
527
594
  parseDescription(zodRef),
528
595
  ...schemas
@@ -530,12 +597,12 @@ function parseUnion({
530
597
  }
531
598
  }
532
599
  const isNullable = contents.some(
533
- (content) => content._def.typeName === "ZodNull"
600
+ (content) => getTypeName(content) === "ZodNull"
534
601
  );
535
602
  const nonNullContents = contents.filter(
536
- (content) => content._def.typeName !== "ZodNull"
603
+ (content) => getTypeName(content) !== "ZodNull"
537
604
  );
538
- return merge(
605
+ return mergeSchemas(
539
606
  {
540
607
  oneOf: nonNullContents.map((schema) => generateSchema(schema, useOutput)),
541
608
  ...isNullable ? { nullable: true } : {}
@@ -549,14 +616,12 @@ function parseDiscriminatedUnion({
549
616
  zodRef,
550
617
  useOutput
551
618
  }) {
552
- return merge(
619
+ const discriminator = getDiscriminator(zodRef);
620
+ const options = getUnionOptions(zodRef);
621
+ return mergeSchemas(
553
622
  {
554
- discriminator: {
555
- propertyName: zodRef._def.discriminator
556
- },
557
- oneOf: Array.from(
558
- zodRef._def.options.values()
559
- ).map((schema) => generateSchema(schema, useOutput))
623
+ ...discriminator ? { discriminator: { propertyName: discriminator } } : {},
624
+ oneOf: options.map((schema) => generateSchema(schema, useOutput))
560
625
  },
561
626
  parseDescription(zodRef),
562
627
  ...schemas
@@ -566,36 +631,33 @@ function parseNever({
566
631
  zodRef,
567
632
  schemas
568
633
  }) {
569
- return merge({ readOnly: true }, parseDescription(zodRef), ...schemas);
634
+ return mergeSchemas({ readOnly: true }, parseDescription(zodRef), ...schemas);
570
635
  }
571
- function parseBranded({
572
- schemas,
573
- zodRef
574
- }) {
575
- return merge(generateSchema(zodRef._def.type), ...schemas);
636
+ function parseBranded({ schemas, zodRef }) {
637
+ const type = getBrandedType(zodRef);
638
+ return mergeSchemas(type ? generateSchema(type) : {}, ...schemas);
576
639
  }
577
640
  function catchAllParser({
578
641
  zodRef,
579
642
  schemas
580
643
  }) {
581
- return merge(parseDescription(zodRef), ...schemas);
644
+ return mergeSchemas(parseDescription(zodRef), ...schemas);
582
645
  }
583
- function parsePipeline({
584
- zodRef,
585
- useOutput
586
- }) {
587
- if (useOutput) {
588
- return generateSchema(zodRef._def.out, useOutput);
646
+ function parsePipeline({ zodRef, useOutput }) {
647
+ const { in: inSchema, out: outSchema } = getPipelineParts(zodRef);
648
+ if (useOutput && outSchema) {
649
+ return generateSchema(outSchema, useOutput);
589
650
  }
590
- return generateSchema(zodRef._def.in, useOutput);
651
+ return inSchema ? generateSchema(inSchema, useOutput) : {};
591
652
  }
592
653
  function parseReadonly({
593
654
  zodRef,
594
655
  useOutput,
595
656
  schemas
596
657
  }) {
597
- return merge(
598
- generateSchema(zodRef._def.innerType, useOutput),
658
+ const innerType = getInnerType(zodRef);
659
+ return mergeSchemas(
660
+ innerType ? generateSchema(innerType, useOutput) : {},
599
661
  parseDescription(zodRef),
600
662
  ...schemas
601
663
  );
@@ -641,7 +703,7 @@ function generateSchema(zodRef, useOutput) {
641
703
  ...Array.isArray(metaOpenApi) ? metaOpenApi : [metaOpenApi]
642
704
  ];
643
705
  try {
644
- const typeName = zodRef._def.typeName;
706
+ const typeName = getTypeName(zodRef);
645
707
  if (typeName in workerMap) {
646
708
  return workerMap[typeName]({
647
709
  zodRef,
@@ -818,6 +880,12 @@ You can also define "securityObjects" this way, if you want to make the endpoint
818
880
  )) {
819
881
  globalSchemas[schemaName] = generateSchema(zodSchema);
820
882
  }
883
+ for (const [key, value] of Object.entries(globalSchemas)) {
884
+ if (key === "batch") {
885
+ const schemaWithReferences = embedSchemaReferences(value, globalSchemas);
886
+ globalSchemas[key] = schemaWithReferences;
887
+ }
888
+ }
821
889
  const builder = OpenApiBuilder.create({
822
890
  openapi: "3.0.0",
823
891
  info: {
@@ -869,9 +937,7 @@ You can also define "securityObjects" this way, if you want to make the endpoint
869
937
  if (isPostOrPutOrPatch) {
870
938
  body_to_generate_schema = (_c = routeSpec.jsonBody) != null ? _c : routeSpec.commonParams;
871
939
  if (routeSpec.jsonBody && routeSpec.commonParams) {
872
- body_to_generate_schema = routeSpec.jsonBody.merge(
873
- routeSpec.commonParams
874
- );
940
+ body_to_generate_schema = routeSpec.jsonBody.merge(routeSpec.commonParams);
875
941
  }
876
942
  } else {
877
943
  body_to_generate_schema = routeSpec.jsonBody;
@@ -882,9 +948,7 @@ You can also define "securityObjects" this way, if you want to make the endpoint
882
948
  } else {
883
949
  query_to_generate_schema = (_d = routeSpec.queryParams) != null ? _d : routeSpec.commonParams;
884
950
  if (routeSpec.queryParams && routeSpec.commonParams) {
885
- query_to_generate_schema = routeSpec.queryParams.merge(
886
- routeSpec.commonParams
887
- );
951
+ query_to_generate_schema = routeSpec.queryParams.merge(routeSpec.commonParams);
888
952
  }
889
953
  }
890
954
  const route = {
@@ -937,7 +1001,8 @@ You can also define "securityObjects" this way, if you want to make the endpoint
937
1001
  const { jsonResponse } = routeSpec;
938
1002
  const { addOkStatus = true } = setupParams;
939
1003
  if (jsonResponse) {
940
- if (!jsonResponse._def || !jsonResponse._def.typeName || jsonResponse._def.typeName !== "ZodObject") {
1004
+ const jsonResponseTypeName = getTypeName(jsonResponse);
1005
+ if (jsonResponseTypeName !== "ZodObject") {
941
1006
  console.warn(
942
1007
  chalk.yellow(
943
1008
  `Skipping route ${routePath} because the response is not a ZodObject.`
@@ -1070,9 +1135,9 @@ var resolveOptions = (raw) => {
1070
1135
  };
1071
1136
  var callGetType = (zod, identifier, options) => {
1072
1137
  let type;
1073
- const getTypeSchema = zod;
1074
- if (getTypeSchema._def.getType)
1075
- type = getTypeSchema._def.getType(ts, identifier, options);
1138
+ const getType = getCustomTypeGetter(zod);
1139
+ if (getType)
1140
+ type = getType(ts, identifier, options);
1076
1141
  return type;
1077
1142
  };
1078
1143
  var zodToTs = (zod, identifier, options) => {
@@ -1089,7 +1154,7 @@ var zodToTs = (zod, identifier, options) => {
1089
1154
  return { node, store };
1090
1155
  };
1091
1156
  var zodToTsNode = (zod, identifier, store, options) => {
1092
- const typeName = zod._def.typeName;
1157
+ const typeName = getTypeName(zod);
1093
1158
  const getTypeType = callGetType(zod, identifier, options);
1094
1159
  if (getTypeType && typeName !== "ZodNativeEnum") {
1095
1160
  return maybeIdentifierToTypeReference(getTypeType);
@@ -1139,7 +1204,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
1139
1204
  }
1140
1205
  case "ZodLiteral": {
1141
1206
  let literal;
1142
- const literalValue = zod._def.value;
1207
+ const literalValue = getLiteralValue(zod);
1143
1208
  switch (typeof literalValue) {
1144
1209
  case "number": {
1145
1210
  literal = f.createNumericLiteral(literalValue);
@@ -1157,11 +1222,12 @@ var zodToTsNode = (zod, identifier, store, options) => {
1157
1222
  return f.createLiteralTypeNode(literal);
1158
1223
  }
1159
1224
  case "ZodObject": {
1160
- const properties = Object.entries(zod._def.shape());
1225
+ const shape = getShape(zod) || {};
1226
+ const properties = Object.entries(shape);
1161
1227
  const members = properties.map(([key, value]) => {
1162
1228
  const nextZodNode = value;
1163
1229
  const type = zodToTsNode(nextZodNode, ...otherArguments);
1164
- const { typeName: nextZodNodeTypeName } = nextZodNode._def;
1230
+ const nextZodNodeTypeName = getTypeName(nextZodNode);
1165
1231
  const isOptional = nextZodNodeTypeName === "ZodOptional" || nextZodNode.isOptional();
1166
1232
  const propertySignature = f.createPropertySignature(
1167
1233
  void 0,
@@ -1177,43 +1243,48 @@ var zodToTsNode = (zod, identifier, store, options) => {
1177
1243
  return f.createTypeLiteralNode(members);
1178
1244
  }
1179
1245
  case "ZodArray": {
1180
- const type = zodToTsNode(zod._def.type, ...otherArguments);
1246
+ const arrayType = getArrayType(zod);
1247
+ const type = arrayType ? zodToTsNode(arrayType, ...otherArguments) : createUnknownKeywordNode();
1181
1248
  const node = f.createArrayTypeNode(type);
1182
1249
  return node;
1183
1250
  }
1184
1251
  case "ZodEnum": {
1185
- const types = zod._def.values.map(
1252
+ const values = getEnumValues(zod);
1253
+ const valuesArray = Array.isArray(values) ? values : Object.values(values);
1254
+ const types = valuesArray.map(
1186
1255
  (value) => f.createLiteralTypeNode(f.createStringLiteral(value))
1187
1256
  );
1188
1257
  return f.createUnionTypeNode(types);
1189
1258
  }
1190
1259
  case "ZodUnion": {
1191
- const options2 = zod._def.options;
1192
- const types = options2.map(
1260
+ const unionOptions = getUnionOptions(zod);
1261
+ const types = unionOptions.map(
1193
1262
  (option) => zodToTsNode(option, ...otherArguments)
1194
1263
  );
1195
1264
  return f.createUnionTypeNode(types);
1196
1265
  }
1197
1266
  case "ZodDiscriminatedUnion": {
1198
- const options2 = [...zod._def.options.values()];
1199
- const types = options2.map(
1267
+ const unionOptions = getUnionOptions(zod);
1268
+ const types = unionOptions.map(
1200
1269
  (option) => zodToTsNode(option, ...otherArguments)
1201
1270
  );
1202
1271
  return f.createUnionTypeNode(types);
1203
1272
  }
1204
1273
  case "ZodEffects": {
1205
- const node = zodToTsNode(
1206
- zod._def.schema,
1207
- ...otherArguments
1208
- );
1274
+ const effectsSchema = getEffectsSchema(zod);
1275
+ if (!effectsSchema)
1276
+ return createUnknownKeywordNode();
1277
+ const node = zodToTsNode(effectsSchema, ...otherArguments);
1209
1278
  return node;
1210
1279
  }
1211
1280
  case "ZodNativeEnum": {
1212
1281
  const type = getTypeType;
1282
+ const enumValues = getEnumValues(zod);
1283
+ const enumValuesObj = typeof enumValues === "object" && !Array.isArray(enumValues) ? enumValues : {};
1213
1284
  if (options.nativeEnums === "union") {
1214
1285
  if (type)
1215
1286
  return maybeIdentifierToTypeReference(type);
1216
- const types = Object.values(zod._def.values).map((value) => {
1287
+ const types = Object.values(enumValuesObj).map((value) => {
1217
1288
  if (typeof value === "number") {
1218
1289
  return f.createLiteralTypeNode(f.createNumericLiteral(value));
1219
1290
  }
@@ -1225,7 +1296,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
1225
1296
  return createUnknownKeywordNode();
1226
1297
  if (options.nativeEnums === "resolve") {
1227
1298
  const enumMembers = Object.entries(
1228
- zod._def.values
1299
+ enumValuesObj
1229
1300
  ).map(([key, value]) => {
1230
1301
  const literal = typeof value === "number" ? f.createNumericLiteral(value) : f.createStringLiteral(value);
1231
1302
  return f.createEnumMember(getIdentifierOrStringLiteral(key), literal);
@@ -1243,33 +1314,35 @@ var zodToTsNode = (zod, identifier, store, options) => {
1243
1314
  return maybeIdentifierToTypeReference(type);
1244
1315
  }
1245
1316
  case "ZodOptional": {
1246
- const innerType = zodToTsNode(
1247
- zod._def.innerType,
1248
- ...otherArguments
1249
- );
1317
+ const inner = getInnerType(zod);
1318
+ if (!inner)
1319
+ return createUnknownKeywordNode();
1320
+ const innerType = zodToTsNode(inner, ...otherArguments);
1250
1321
  return f.createUnionTypeNode([
1251
1322
  innerType,
1252
1323
  f.createKeywordTypeNode(SyntaxKind.UndefinedKeyword)
1253
1324
  ]);
1254
1325
  }
1255
1326
  case "ZodNullable": {
1256
- const innerType = zodToTsNode(
1257
- zod._def.innerType,
1258
- ...otherArguments
1259
- );
1327
+ const inner = getInnerType(zod);
1328
+ if (!inner)
1329
+ return createUnknownKeywordNode();
1330
+ const innerType = zodToTsNode(inner, ...otherArguments);
1260
1331
  return f.createUnionTypeNode([
1261
1332
  innerType,
1262
1333
  f.createLiteralTypeNode(f.createNull())
1263
1334
  ]);
1264
1335
  }
1265
1336
  case "ZodTuple": {
1266
- const types = zod._def.items.map(
1337
+ const items = getTupleItems(zod);
1338
+ const types = items.map(
1267
1339
  (option) => zodToTsNode(option, ...otherArguments)
1268
1340
  );
1269
1341
  return f.createTupleTypeNode(types);
1270
1342
  }
1271
1343
  case "ZodRecord": {
1272
- const valueType = zodToTsNode(zod._def.valueType, ...otherArguments);
1344
+ const recordValueType = getRecordValueType(zod);
1345
+ const valueType = recordValueType ? zodToTsNode(recordValueType, ...otherArguments) : createUnknownKeywordNode();
1273
1346
  const node = f.createTypeLiteralNode([
1274
1347
  f.createIndexSignature(
1275
1348
  void 0,
@@ -1288,8 +1361,9 @@ var zodToTsNode = (zod, identifier, store, options) => {
1288
1361
  return node;
1289
1362
  }
1290
1363
  case "ZodMap": {
1291
- const valueType = zodToTsNode(zod._def.valueType, ...otherArguments);
1292
- const keyType = zodToTsNode(zod._def.keyType, ...otherArguments);
1364
+ const { keyType: mapKeyType, valueType: mapValueType } = getMapTypes(zod);
1365
+ const valueType = mapValueType ? zodToTsNode(mapValueType, ...otherArguments) : createUnknownKeywordNode();
1366
+ const keyType = mapKeyType ? zodToTsNode(mapKeyType, ...otherArguments) : createUnknownKeywordNode();
1293
1367
  const node = f.createTypeReferenceNode(f.createIdentifier("Map"), [
1294
1368
  keyType,
1295
1369
  valueType
@@ -1297,25 +1371,30 @@ var zodToTsNode = (zod, identifier, store, options) => {
1297
1371
  return node;
1298
1372
  }
1299
1373
  case "ZodSet": {
1300
- const type = zodToTsNode(zod._def.valueType, ...otherArguments);
1374
+ const setValueType = getSetValueType(zod);
1375
+ const type = setValueType ? zodToTsNode(setValueType, ...otherArguments) : createUnknownKeywordNode();
1301
1376
  const node = f.createTypeReferenceNode(f.createIdentifier("Set"), [type]);
1302
1377
  return node;
1303
1378
  }
1304
1379
  case "ZodIntersection": {
1305
- const left = zodToTsNode(zod._def.left, ...otherArguments);
1306
- const right = zodToTsNode(zod._def.right, ...otherArguments);
1380
+ const { left: intersectLeft, right: intersectRight } = getIntersectionParts(zod);
1381
+ const left = intersectLeft ? zodToTsNode(intersectLeft, ...otherArguments) : createUnknownKeywordNode();
1382
+ const right = intersectRight ? zodToTsNode(intersectRight, ...otherArguments) : createUnknownKeywordNode();
1307
1383
  const node = f.createIntersectionTypeNode([left, right]);
1308
1384
  return node;
1309
1385
  }
1310
1386
  case "ZodPromise": {
1311
- const type = zodToTsNode(zod._def.type, ...otherArguments);
1387
+ const promiseType = getPromiseType(zod);
1388
+ const type = promiseType ? zodToTsNode(promiseType, ...otherArguments) : createUnknownKeywordNode();
1312
1389
  const node = f.createTypeReferenceNode(f.createIdentifier("Promise"), [
1313
1390
  type
1314
1391
  ]);
1315
1392
  return node;
1316
1393
  }
1317
1394
  case "ZodFunction": {
1318
- const argumentTypes = zod._def.args._def.items.map(
1395
+ const { args: funcArgs, returns: funcReturns } = getFunctionParts(zod);
1396
+ const argsItems = funcArgs ? getTupleItems(funcArgs) : [];
1397
+ const argumentTypes = argsItems.map(
1319
1398
  (argument, index) => {
1320
1399
  const argumentType = zodToTsNode(argument, ...otherArguments);
1321
1400
  return f.createParameterDeclaration(
@@ -1336,7 +1415,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
1336
1415
  f.createArrayTypeNode(createUnknownKeywordNode())
1337
1416
  )
1338
1417
  );
1339
- const returnType = zodToTsNode(zod._def.returns, ...otherArguments);
1418
+ const returnType = funcReturns ? zodToTsNode(funcReturns, ...otherArguments) : createUnknownKeywordNode();
1340
1419
  const node = f.createFunctionTypeNode(
1341
1420
  void 0,
1342
1421
  argumentTypes,
@@ -1345,10 +1424,10 @@ var zodToTsNode = (zod, identifier, store, options) => {
1345
1424
  return node;
1346
1425
  }
1347
1426
  case "ZodDefault": {
1348
- const type = zodToTsNode(
1349
- zod._def.innerType,
1350
- ...otherArguments
1351
- );
1427
+ const defaultInner = getInnerType(zod);
1428
+ if (!defaultInner)
1429
+ return createUnknownKeywordNode();
1430
+ const type = zodToTsNode(defaultInner, ...otherArguments);
1352
1431
  const filteredNodes = [];
1353
1432
  type.forEachChild((node) => {
1354
1433
  if (![SyntaxKind.UndefinedKeyword].includes(node.kind)) {
@@ -1366,7 +1445,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
1366
1445
  import prettier from "prettier";
1367
1446
  import { z as z3 } from "zod";
1368
1447
  var generateRouteTypes = async (opts) => {
1369
- var _a, _b, _c;
1448
+ var _a, _b;
1370
1449
  const filepathToRoute = await parseRoutesInPackage(opts);
1371
1450
  const sortedRoutes = Array.from(filepathToRoute.entries()).sort(
1372
1451
  (a, b) => a[1].route.localeCompare(b[1].route)
@@ -1377,17 +1456,29 @@ var generateRouteTypes = async (opts) => {
1377
1456
  const routeDefs = [];
1378
1457
  for (const [_2, { route, routeSpec, setupParams }] of filteredRoutes) {
1379
1458
  const maxDuration = (_a = routeSpec.maxDuration) != null ? _a : setupParams.maxDuration;
1380
- const queryKeys = Object.keys((_c = (_b = routeSpec.queryParams) == null ? void 0 : _b.shape) != null ? _c : {});
1459
+ const queryKeys = Object.keys(
1460
+ routeSpec.queryParams ? (_b = getShape(routeSpec.queryParams)) != null ? _b : {} : {}
1461
+ );
1381
1462
  const pathParameters = queryKeys.filter((key) => route.includes(`[${key}]`));
1382
1463
  let queryParams = routeSpec.queryParams;
1383
- while (queryParams && ("sourceType" in queryParams || "unwrap" in queryParams)) {
1384
- if ("sourceType" in queryParams) {
1385
- queryParams = queryParams.sourceType();
1386
- } else if ("unwrap" in queryParams) {
1387
- queryParams = queryParams.unwrap();
1464
+ while (queryParams) {
1465
+ const typeName = getTypeName(queryParams);
1466
+ if (typeName === "ZodEffects") {
1467
+ const inner = getEffectsSchema(queryParams);
1468
+ if (inner) {
1469
+ queryParams = inner;
1470
+ continue;
1471
+ }
1472
+ } else if (typeName === "ZodOptional") {
1473
+ const inner = getInnerType(queryParams);
1474
+ if (inner) {
1475
+ queryParams = inner;
1476
+ continue;
1477
+ }
1388
1478
  }
1479
+ break;
1389
1480
  }
1390
- if (queryParams && "omit" in queryParams) {
1481
+ if (queryParams && "omit" in queryParams && typeof queryParams.omit === "function") {
1391
1482
  queryParams = queryParams.omit(
1392
1483
  Object.fromEntries(pathParameters.map((param) => [param, true]))
1393
1484
  );
@@ -1565,4 +1656,4 @@ export {
1565
1656
  generateOpenAPI,
1566
1657
  generateRouteTypes
1567
1658
  };
1568
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9pbmRleC50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2UudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi96b2Qtb3BlbmFwaS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvZnJvbnQtbWF0dGVyLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1vcGVuYXBpL2VtYmVkLXNjaGVtYS1yZWZlcmVuY2VzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvZmVybi1zZGstdXRpbHMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtcm91dGUtdHlwZXMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL3pvZC10by10cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdGUtb3BlbmFwaVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1yb3V0ZS10eXBlc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hc1wiXG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7XG4gIE9wZW5BcGlCdWlsZGVyLFxuICBPcGVyYXRpb25PYmplY3QsXG4gIFBhcmFtZXRlck9iamVjdCxcbn0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCB7IFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyBnZW5lcmF0ZVNjaGVtYSB9IGZyb20gXCIuLi9saWIvem9kLW9wZW5hcGlcIlxuaW1wb3J0IHsgZW1iZWRTY2hlbWFSZWZlcmVuY2VzIH0gZnJvbSBcIi4vZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXNcIlxuaW1wb3J0IHsgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhIH0gZnJvbSBcIi4vZmVybi1zZGstdXRpbHNcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4uL2xpYi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcbmltcG9ydCB7IHByZWZpeE9iamVjdEtleXNXaXRoWCB9IGZyb20gXCIuLi91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14XCJcbmltcG9ydCB7IGRhc2hpZnlPYmplY3RLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXNcIlxuXG5mdW5jdGlvbiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBjb25zdCBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIGZpcnN0Q2hhciArIHN0ci5zbGljZSgxKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAucmVwbGFjZSgvLS9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgdHJhbnNmb3JtZWRQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gQnlQYXJhbVxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwYXJ0LnNsaWNlKDEsIC0xKVxuICAgICAgY29uc3Qgd29yZHMgPSBzZXJ2aWNlTmFtZS5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGBCeSR7Y2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpfWBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcGlfcGF0aCB0byBBcGlQYXRoXG4gICAgICBjb25zdCB3b3JkcyA9IHBhcnQuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZSh0cmFuc2Zvcm1lZFBhcnRzLmpvaW4oXCJcIikpXG59XG5cbmZ1bmN0aW9uIHBhc2NhbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQuc3BsaXQoXCIgXCIpXG4gIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcbiAgKVxuICBjb25zdCBwYXNjYWxDYXNlU3RyaW5nID0gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gIHJldHVybiBwYXNjYWxDYXNlU3RyaW5nXG59XG5cbmludGVyZmFjZSBUYWdPcHRpb24ge1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkb2VzUm91dGVIYXZlVGFnPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlT3BlbkFQSU9wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICB0YWdzPzogQXJyYXk8VGFnT3B0aW9uPlxuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gT3BlbkFQSSBzcGVjIGZyb20gdGhlIE5leHQuanMgQVBJIHJvdXRlcy5cbiAqXG4gKiBZb3Ugbm9ybWFsbHkgaW52b2tlIHRoaXMgd2l0aCBgbmV4dGFwaSBnZW5lcmF0ZS1vcGVuYXBpYCBpbiBhXG4gKiBcImJ1aWxkOm9wZW5hcGlcIiBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQVBJKG9wdHM6IEdlbmVyYXRlT3BlbkFQSU9wdHMpIHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgeyBvdXRwdXRGaWxlLCB0YWdzID0gW10gfSA9IG9wdHNcblxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgLy8gVE9ETyBkZXRlY3QgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNldHVwcyBhbmQgb3V0cHV0IGRpZmZlcmVudCBBUElzXG4gIGNvbnN0IHsgc2V0dXBQYXJhbXM6IGdsb2JhbFNldHVwUGFyYW1zIH0gPSBmaWxlcGF0aFRvUm91dGVGbi52YWx1ZXMoKS5uZXh0KClcbiAgICAudmFsdWUgYXMgeyBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXMgfVxuXG4gIGNvbnN0IHNlY3VyaXR5U2NoZW1lcyA9IGdsb2JhbFNldHVwUGFyYW1zLnNlY3VyaXR5U2NoZW1hcyA/PyB7fVxuICBjb25zdCBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZSA9IHt9XG4gIGZvciAoY29uc3QgYXV0aE5hbWUgb2YgT2JqZWN0LmtleXMoZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXApKSB7XG4gICAgY29uc3QgbXcgPSBnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcFthdXRoTmFtZV1cbiAgICBpZiAobXcuc2VjdXJpdHlTY2hlbWEpIHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lc1thdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eVNjaGVtYVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBcIiR7YXV0aE5hbWV9XCIgaGFzIG5vIHNlY3VyaXR5U2NoZW1hLiBZb3UgY2FuIGRlZmluZSB0aGlzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBhZnRlciB0aGUgZXhwb3J0IGRvLi4uIFxcblxcbm15TWlkZGxld2FyZS5zZWN1cml0eVNjaGVtYSA9IHtcXG4gIHR5cGU6IFwiaHR0cFwiXFxuICBzY2hlbWU6IFwiYmVhcmVyXCJcXG4gIGJlYXJlckZvcm1hdDogXCJKV1RcIlxcbiAvLyBvciBBUEkgVG9rZW4gZXRjLlxcbn1cXG5cXG5Zb3UgY2FuIGFsc28gZGVmaW5lIFwic2VjdXJpdHlPYmplY3RzXCIgdGhpcyB3YXksIGlmIHlvdSB3YW50IHRvIG1ha2UgdGhlIGVuZHBvaW50IHN1cHBvcnQgbXVsdGlwbGUgbW9kZXMgb2YgYXV0aGVudGljYXRpb24uXFxuXFxuYFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlPYmplY3RzIHx8IFtcbiAgICAgIHtcbiAgICAgICAgW2F1dGhOYW1lXTogW10sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGdsb2JhbFNjaGVtYXMgPSB7fVxuICBmb3IgKGNvbnN0IFtzY2hlbWFOYW1lLCB6b2RTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIGdsb2JhbFNldHVwUGFyYW1zLmdsb2JhbFNjaGVtYXMgPz8ge31cbiAgKSkge1xuICAgIGdsb2JhbFNjaGVtYXNbc2NoZW1hTmFtZV0gPSBnZW5lcmF0ZVNjaGVtYSh6b2RTY2hlbWEpXG4gIH1cblxuICAvLyBCdWlsZCBPcGVuQVBJIHNwZWNcbiAgY29uc3QgYnVpbGRlciA9IE9wZW5BcGlCdWlsZGVyLmNyZWF0ZSh7XG4gICAgb3BlbmFwaTogXCIzLjAuMFwiLFxuICAgIGluZm86IHtcbiAgICAgIHRpdGxlOiBnbG9iYWxTZXR1cFBhcmFtcy5hcGlOYW1lLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIH0sXG4gICAgc2VydmVyczogW1xuICAgICAge1xuICAgICAgICB1cmw6IGdsb2JhbFNldHVwUGFyYW1zLnByb2R1Y3Rpb25TZXJ2ZXJVcmwgfHwgXCJodHRwczovL2V4YW1wbGUuY29tXCIsXG4gICAgICB9LFxuICAgIF0sXG4gICAgdGFnczogdGFncy5tYXAoKHRhZykgPT4gKHsgbmFtZTogdGFnLm5hbWUsIGRlc2NyaXB0aW9uOiB0YWcuZGVzY3JpcHRpb24gfSkpLFxuICAgIHBhdGhzOiB7fSxcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICBzZWN1cml0eVNjaGVtZXMsXG4gICAgICBzY2hlbWFzOiBnbG9iYWxTY2hlbWFzLFxuICAgIH0sXG4gIH0pXG5cbiAgZm9yIChjb25zdCBbXG4gICAgZmlsZV9wYXRoLFxuICAgIHsgc2V0dXBQYXJhbXMsIHJvdXRlU3BlYywgcm91dGU6IHJvdXRlUGF0aCB9LFxuICBdIG9mIGZpbGVwYXRoVG9Sb3V0ZUZuKSB7XG4gICAgY29uc3QgbWV0aG9kcyA9IHJvdXRlU3BlYy5tZXRob2RzXG4gICAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgcm91dGUgJHtyb3V0ZVBhdGh9IGJlY2F1c2UgaXQgaGFzIG5vIG1ldGhvZHMuYClcbiAgICAgIClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgbGV0IGRlc2NyaXB0aW9uID0gcm91dGVTcGVjLmRlc2NyaXB0aW9uXG4gICAgbGV0IGRlc2NyaXB0aW9uTWV0YWRhdGE6IHtcbiAgICAgIHJlc3BvbnNlX2tleT86IHN0cmluZ1xuICAgICAgW2tleTogc3RyaW5nXTogYW55XG4gICAgfSA9IHt9XG5cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IHRyaW1tZWREZXNjcmlwdGlvbiA9IGRlZGVudChkZXNjcmlwdGlvbikudHJpbSgpXG5cbiAgICAgIGlmICh0ZXN0RnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKSkge1xuICAgICAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIGJvZHkgfSA9IHBhcnNlRnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKVxuICAgICAgICBkZXNjcmlwdGlvbk1ldGFkYXRhID0gYXR0cmlidXRlc1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGJvZHkudHJpbSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXNjcmlwdGlvbiA9IHRyaW1tZWREZXNjcmlwdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdHRlZERlc2NyaXB0aW9uTWV0YWRhdGEgPSBwcmVmaXhPYmplY3RLZXlzV2l0aFgoXG4gICAgICBkYXNoaWZ5T2JqZWN0S2V5cyhkZXNjcmlwdGlvbk1ldGFkYXRhKVxuICAgIClcblxuICAgIGNvbnN0IG1ldGhvZFJvdXRlczogUmVjb3JkPHN0cmluZywgT3BlcmF0aW9uT2JqZWN0PiA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICBjb25zdCBpc1Bvc3RPclB1dE9yUGF0Y2ggPSBbXCJQT1NUXCIsIFwiUFVUXCIsIFwiUEFUQ0hcIl0uaW5jbHVkZXMobWV0aG9kKVxuXG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IG11bHRpcGFydC9mb3JtLWRhdGFcbiAgICAgIGxldCBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYVxuICAgICAgaWYgKGlzUG9zdE9yUHV0T3JQYXRjaCkge1xuICAgICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keSA/PyByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG5cbiAgICAgICAgaWYgKHJvdXRlU3BlYy5qc29uQm9keSAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgICAgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMuanNvbkJvZHkubWVyZ2UoXG4gICAgICAgICAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keVxuICAgICAgfVxuXG4gICAgICBsZXQgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hXG4gICAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID1cbiAgICAgICAgICByb3V0ZVNwZWMucXVlcnlQYXJhbXMgPz8gcm91dGVTcGVjLmNvbW1vblBhcmFtc1xuXG4gICAgICAgIGlmIChyb3V0ZVNwZWMucXVlcnlQYXJhbXMgJiYgcm91dGVTcGVjLmNvbW1vblBhcmFtcykge1xuICAgICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtcy5tZXJnZShcbiAgICAgICAgICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm91dGU6IE9wZXJhdGlvbk9iamVjdCA9IHtcbiAgICAgICAgLi4ucm91dGVTcGVjLm9wZW5BcGlNZXRhZGF0YSxcbiAgICAgICAgLi4uZm9ybWF0dGVkRGVzY3JpcHRpb25NZXRhZGF0YSxcbiAgICAgICAgc3VtbWFyeTogcm91dGVQYXRoLFxuICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgb3BlcmF0aW9uSWQ6IGAke3RyYW5zZm9ybVBhdGhUb09wZXJhdGlvbklkKHJvdXRlUGF0aCl9JHtwYXNjYWxDYXNlKFxuICAgICAgICAgIG1ldGhvZFxuICAgICAgICApfWAsXG4gICAgICAgIHJlc3BvbnNlczoge1xuICAgICAgICAgIDIwMDoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT0tcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIDQwMDoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQmFkIFJlcXVlc3RcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIDQwMToge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVW5hdXRob3JpemVkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjdXJpdHk6IEFycmF5LmlzQXJyYXkocm91dGVTcGVjLmF1dGgpXG4gICAgICAgICAgPyByb3V0ZVNwZWMuYXV0aFxuICAgICAgICAgICAgICAubWFwKChhdXRoVHlwZSkgPT4gc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aFR5cGVdKVxuICAgICAgICAgICAgICAuZmxhdCgpXG4gICAgICAgICAgOiBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVtyb3V0ZVNwZWMuYXV0aF0sXG4gICAgICB9XG5cbiAgICAgIGlmIChib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgICByb3V0ZS5yZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgICAgICAgICAgICBzY2hlbWE6IGdlbmVyYXRlU2NoZW1hKGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hIGFzIGFueSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYShxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgYXMgYW55KVxuICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJPYmplY3RbXSA9IE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgc2NoZW1hLnByb3BlcnRpZXMgYXMgYW55XG4gICAgICAgICAgKS5tYXAoKG5hbWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGluOiBcInF1ZXJ5XCIsXG4gICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLnByb3BlcnRpZXMhW25hbWVdLFxuICAgICAgICAgICAgICByZXF1aXJlZDogc2NoZW1hLnJlcXVpcmVkPy5pbmNsdWRlcyhuYW1lKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcm91dGUucGFyYW1ldGVycyA9IHBhcmFtZXRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGpzb25SZXNwb25zZSB9ID0gcm91dGVTcGVjXG4gICAgICBjb25zdCB7IGFkZE9rU3RhdHVzID0gdHJ1ZSB9ID0gc2V0dXBQYXJhbXNcblxuICAgICAgaWYgKGpzb25SZXNwb25zZSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWpzb25SZXNwb25zZS5fZGVmIHx8XG4gICAgICAgICAgIWpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lIHx8XG4gICAgICAgICAganNvblJlc3BvbnNlLl9kZWYudHlwZU5hbWUgIT09IFwiWm9kT2JqZWN0XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgU2tpcHBpbmcgcm91dGUgJHtyb3V0ZVBhdGh9IGJlY2F1c2UgdGhlIHJlc3BvbnNlIGlzIG5vdCBhIFpvZE9iamVjdC5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZVNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKFxuICAgICAgICAgIGFkZE9rU3RhdHVzICYmIGpzb25SZXNwb25zZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0XG4gICAgICAgICAgICA/IGpzb25SZXNwb25zZS5leHRlbmQoeyBvazogei5ib29sZWFuKCkgfSlcbiAgICAgICAgICAgIDoganNvblJlc3BvbnNlXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBzY2hlbWFXaXRoUmVmZXJlbmNlcyA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhcbiAgICAgICAgICByZXNwb25zZVNjaGVtYSxcbiAgICAgICAgICBnbG9iYWxTY2hlbWFzXG4gICAgICAgIClcblxuICAgICAgICBpZiAocm91dGUucmVzcG9uc2VzICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGQgbm90IGhhcmRjb2RlIDIwMCBoZXJlXG4gICAgICAgICAgcm91dGUucmVzcG9uc2VzWzIwMF0uY29udGVudCA9IHtcbiAgICAgICAgICAgIFwiYXBwbGljYXRpb24vanNvblwiOiB7XG4gICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hV2l0aFJlZmVyZW5jZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByb3V0ZS50YWdzID0gW11cbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgaWYgKHRhZy5kb2VzUm91dGVIYXZlVGFnICYmIHRhZy5kb2VzUm91dGVIYXZlVGFnKHJvdXRlLnN1bW1hcnkgfHwgXCJcIikpIHtcbiAgICAgICAgICByb3V0ZS50YWdzLnB1c2godGFnLm5hbWUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0aG9kc01hcHBlZFRvRmVyblNka01ldGFkYXRhID0gYXdhaXQgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhKHtcbiAgICAgICAgbWV0aG9kczogW21ldGhvZF0sIC8vIE9ubHkgcGFzcyB0aGlzIHNwZWNpZmljIG1ldGhvZFxuICAgICAgICBwYXRoOiByb3V0ZVBhdGgsXG4gICAgICAgIHNka1JldHVyblZhbHVlOlxuICAgICAgICAgIGRlc2NyaXB0aW9uTWV0YWRhdGE/LnJlc3BvbnNlX2tleSA/PyByb3V0ZVNwZWMuc2RrUmV0dXJuVmFsdWUsXG4gICAgICB9KVxuXG4gICAgICBPYmplY3QuYXNzaWduKHJvdXRlLCBtZXRob2RzTWFwcGVkVG9GZXJuU2RrTWV0YWRhdGFbbWV0aG9kXSlcbiAgICAgIG1ldGhvZFJvdXRlc1ttZXRob2QudG9Mb3dlckNhc2UoKV0gPSByb3V0ZVxuICAgIH1cblxuICAgIGJ1aWxkZXIuYWRkUGF0aChyb3V0ZVBhdGgsIG1ldGhvZFJvdXRlcylcbiAgfVxuXG4gIGlmIChvdXRwdXRGaWxlKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKG91dHB1dEZpbGUsIGJ1aWxkZXIuZ2V0U3BlY0FzSnNvbih1bmRlZmluZWQsIDIpKVxuICB9XG5cbiAgcmV0dXJuIGJ1aWxkZXIuZ2V0U3BlY0FzSnNvbih1bmRlZmluZWQsIDIpXG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBSb3V0ZVNwZWMsIFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlIH0gZnJvbSBcIi4vZGVmYXVsdC1tYXAtZmlsZS1wYXRoLXRvLWh0dHAtcm91dGVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlSW5mbyB7XG4gIHNldHVwUGFyYW1zOiBTZXR1cFBhcmFtc1xuICByb3V0ZVNwZWM6IFJvdXRlU3BlY1xuICByb3V0ZUZuOiBGdW5jdGlvblxuICByb3V0ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJvdXRlc0luUGFja2FnZSA9IGFzeW5jIChvcHRzOiB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG59KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBSb3V0ZUluZm8+PiA9PiB7XG4gIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0XG4gIGNvbnN0IGdsb2JieSA9IChhd2FpdCBpbXBvcnQoXCJnbG9iYnlcIikpLmdsb2JieVxuICBjb25zdCB7XG4gICAgcGFja2FnZURpcixcbiAgICBwYXRoR2xvYiA9IFwiL3BhZ2VzL2FwaS8qKi8qLnRzXCIsXG4gICAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSA9IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlKG9wdHMuYXBpUHJlZml4KSxcbiAgfSA9IG9wdHNcbiAgLy8gTG9hZCBhbGwgcm91dGUgc3BlY3NcbiAgY29uc3QgZnVsbFBhdGhHbG9iID0gcGF0aC5wb3NpeC5qb2luKHBhY2thZ2VEaXIsIHBhdGhHbG9iKVxuICBjb25zb2xlLmxvZyhgc2VhcmNoaW5nIFwiJHtmdWxsUGF0aEdsb2J9XCIuLi5gKVxuICBjb25zdCBmaWxlcGF0aHMgPSBhd2FpdCBnbG9iYnkoYCR7ZnVsbFBhdGhHbG9ifWApXG4gIGNvbnNvbGUubG9nKGBmb3VuZCAke2ZpbGVwYXRocy5sZW5ndGh9IGZpbGVzYClcbiAgaWYgKGZpbGVwYXRocy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpbGVzIGZvdW5kIGF0IFwiJHtmdWxsUGF0aEdsb2J9XCJgKVxuICB9XG4gIGNvbnN0IGZpbGVwYXRoVG9Sb3V0ZUZuID0gbmV3IE1hcDxzdHJpbmcsIFJvdXRlSW5mbz4oKVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVwYXRocy5tYXAoYXN5bmMgKHApID0+IHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdDogcm91dGVGbiB9ID0gYXdhaXQgcmVxdWlyZShwYXRoLnJlc29sdmUocCkpXG5cbiAgICAgIGlmIChyb3V0ZUZuKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByb3V0ZUZuLl9yb3V0ZVNwZWM/LmV4Y2x1ZGVGcm9tT3BlbkFwaSAmJlxuICAgICAgICAgICFvcHRzLmluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICBgSWdub3JpbmcgXCIke3B9IGJlY2F1c2UgaXQgd2FzIGV4Y2x1ZGVkIGZyb20gT3BlbkFQSSBnZW5lcmF0aW9uXCJgXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghcm91dGVGbi5fc2V0dXBQYXJhbXMpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBJZ25vcmluZyBcIiR7cH1cIiBiZWNhdXNlIGl0IHdhc24ndCBjcmVhdGVkIHdpdGggd2l0aFJvdXRlU3BlY2BcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZmlsZXBhdGhUb1JvdXRlRm4uc2V0KHAsIHtcbiAgICAgICAgICBzZXR1cFBhcmFtczogcm91dGVGbi5fc2V0dXBQYXJhbXMsXG4gICAgICAgICAgcm91dGVTcGVjOiByb3V0ZUZuLl9yb3V0ZVNwZWMsXG4gICAgICAgICAgcm91dGU6IG1hcEZpbGVQYXRoVG9IVFRQUm91dGUocCksXG4gICAgICAgICAgcm91dGVGbixcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coYENvdWxkbid0IGZpbmQgcm91dGUgJHtwfWApKVxuICAgICAgfVxuICAgIH0pXG4gIClcblxuICByZXR1cm4gZmlsZXBhdGhUb1JvdXRlRm5cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSA9XG4gIChhcGlfcHJlZml4OiBzdHJpbmcgPSBcIi9hcGlcIikgPT5cbiAgKGZpbGVfcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm91dGUgPSBmaWxlX3BhdGhcbiAgICAgIC8vIHJlcGxhY2UgLi8gaWYgaXQgc3RhcnRzIHdpdGggLi9cbiAgICAgIC5yZXBsYWNlKC9eXFwuXFwvLywgXCIvXCIpXG4gICAgICAvLyByZXBsYWNlIHN0YXJ0aW5nIC9cbiAgICAgIC5yZXBsYWNlKC9eXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL3NyYyBpZiBpdCBzdGFydHMgd2l0aCAvc3JjXG4gICAgICAucmVwbGFjZSgvXnNyY1xcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9wYWdlcyBpZiBpdCBzdGFydHMgd2l0aCAvcGFnZXNcbiAgICAgIC5yZXBsYWNlKC9ecGFnZXNcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvYXBpIGlmIGl0IHN0YXJ0cyB3aXRoIC9hcGlcbiAgICAgIC5yZXBsYWNlKC9eYXBpXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgLnRzIGlmIGl0IGVuZHMgd2l0aCAudHNcbiAgICAgIC5yZXBsYWNlKC9cXC50cyQvLCBcIlwiKVxuICAgICAgLy8gcmVtb3ZlIHB1YmxpYyByZWZlcmVuY2VcbiAgICAgIC5yZXBsYWNlKFwicHVibGljXCIsIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIGluZGV4IGlmIGl0IGVuZHMgd2l0aCBpbmRleFxuICAgICAgLnJlcGxhY2UoL1xcL1xcaW5kZXgoPyEuKS8sIFwiXCIpXG5cbiAgICByZXR1cm4gcGF0aC5qb2luKGFwaV9wcmVmaXgsIHJvdXRlKVxuICB9XG4iLCAiLyoqXG4gKiBab2QgT3BlbkFQSSBHZW5lcmF0b3IuXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW5hdGluZS96b2QtcGx1Z2luc1xuICpcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIEJyaWFuIE1jQnJpZGVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU2NoZW1hT2JqZWN0LCBTY2hlbWFPYmplY3RUeXBlIH0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCBtZXJnZSBmcm9tIFwidHMtZGVlcG1lcmdlXCJcbmltcG9ydCB7IEFueVpvZE9iamVjdCwgeiwgWm9kVHlwZUFueSB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4vZnJvbnQtbWF0dGVyXCJcbmltcG9ydCBkZWRlbnQgZnJvbSBcImRlZGVudFwiXG5pbXBvcnQgeyBwcmVmaXhPYmplY3RLZXlzV2l0aFggfSBmcm9tIFwiLi4vdXRpbHMvcHJlZml4LW9iamVjdC1rZXlzLXdpdGgteFwiXG5pbXBvcnQgeyBkYXNoaWZ5T2JqZWN0S2V5cyB9IGZyb20gXCIuLi91dGlscy9kYXNoaWZ5LW9iamVjdC1rZXlzXCJcblxudHlwZSBBbmF0aW5lU2NoZW1hT2JqZWN0ID0gU2NoZW1hT2JqZWN0ICYgeyBoaWRlRGVmaW5pdGlvbnM/OiBzdHJpbmdbXSB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFwaVpvZEFueSBleHRlbmRzIFpvZFR5cGVBbnkge1xuICBtZXRhT3BlbkFwaT86IEFuYXRpbmVTY2hlbWFPYmplY3QgfCBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbn1cblxuaW50ZXJmYWNlIE9wZW5BcGlab2RBbnlPYmplY3QgZXh0ZW5kcyBBbnlab2RPYmplY3Qge1xuICBtZXRhT3BlbkFwaT86IEFuYXRpbmVTY2hlbWFPYmplY3QgfCBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbn1cblxuaW50ZXJmYWNlIFBhcnNpbmdBcmdzPFQ+IHtcbiAgem9kUmVmOiBUXG4gIHNjaGVtYXM6IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxuICB1c2VPdXRwdXQ/OiBib29sZWFuXG4gIGhpZGVEZWZpbml0aW9ucz86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRBcGk8VCBleHRlbmRzIE9wZW5BcGlab2RBbnk+KFxuICBzY2hlbWE6IFQsXG4gIHNjaGVtYU9iamVjdDogQW5hdGluZVNjaGVtYU9iamVjdCA9IHt9XG4pOiBUIHtcbiAgc2NoZW1hLm1ldGFPcGVuQXBpID0gT2JqZWN0LmFzc2lnbihzY2hlbWEubWV0YU9wZW5BcGkgfHwge30sIHNjaGVtYU9iamVjdClcbiAgcmV0dXJuIHNjaGVtYVxufVxuXG5mdW5jdGlvbiBpdGVyYXRlWm9kT2JqZWN0KHtcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG4gIGhpZGVEZWZpbml0aW9ucyxcbn06IFBhcnNpbmdBcmdzPE9wZW5BcGlab2RBbnlPYmplY3Q+KSB7XG4gIGNvbnN0IHJlZHVjZWQgPSBPYmplY3Qua2V5cyh6b2RSZWYuc2hhcGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiBoaWRlRGVmaW5pdGlvbnM/LmluY2x1ZGVzKGtleSkgPT09IGZhbHNlKVxuICAgIC5yZWR1Y2UoXG4gICAgICAoY2FycnksIGtleSkgPT4gKHtcbiAgICAgICAgLi4uY2FycnksXG4gICAgICAgIFtrZXldOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuc2hhcGVba2V5XSwgdXNlT3V0cHV0KSxcbiAgICAgIH0pLFxuICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgU2NoZW1hT2JqZWN0PlxuICAgIClcblxuICByZXR1cm4gcmVkdWNlZFxufVxuXG5mdW5jdGlvbiBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZjogT3BlbkFwaVpvZEFueSk6IFNjaGVtYU9iamVjdCB7XG4gIGlmICghem9kUmVmLmRlc2NyaXB0aW9uKSByZXR1cm4ge31cbiAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KHpvZFJlZi5kZXNjcmlwdGlvbilcbiAgaWYgKCF0ZXN0RnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKSlcbiAgICByZXR1cm4geyBkZXNjcmlwdGlvbjogem9kUmVmLmRlc2NyaXB0aW9uIH1cbiAgY29uc3QgeyBhdHRyaWJ1dGVzLCBib2R5IH0gPSBwYXJzZUZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbilcbiAgY29uc3Qgb3V0cHV0OiBTY2hlbWFPYmplY3QgPSB7fVxuICBpZiAoYm9keS50cmltKCkpIG91dHB1dC5kZXNjcmlwdGlvbiA9IGJvZHkudHJpbSgpXG4gIGlmICh0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIiAmJiBhdHRyaWJ1dGVzICE9PSBudWxsKSB7XG4gICAgaWYgKFwiZGVwcmVjYXRlZFwiIGluIGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5kZXByZWNhdGVkKSB7XG4gICAgICBvdXRwdXQuZGVwcmVjYXRlZCA9IHRydWVcbiAgICB9XG5cbiAgICBPYmplY3QuZW50cmllcyhcbiAgICAgIHByZWZpeE9iamVjdEtleXNXaXRoWChkYXNoaWZ5T2JqZWN0S2V5cyhhdHRyaWJ1dGVzKSlcbiAgICApLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgb3V0cHV0W2tleV0gPSB2YWx1ZVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gb3V0cHV0XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHJhbnNmb3JtYXRpb24oe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kVHJhbnNmb3JtZXI8bmV2ZXI+IHwgei5ab2RFZmZlY3RzPG5ldmVyPj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBpbnB1dCA9IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLnNjaGVtYSwgdXNlT3V0cHV0KVxuXG4gIGxldCBvdXRwdXQgPSBcInVuZGVmaW5lZFwiXG4gIGlmICh1c2VPdXRwdXQgJiYgem9kUmVmLl9kZWYuZWZmZWN0KSB7XG4gICAgY29uc3QgZWZmZWN0ID1cbiAgICAgIHpvZFJlZi5fZGVmLmVmZmVjdC50eXBlID09PSBcInRyYW5zZm9ybVwiID8gem9kUmVmLl9kZWYuZWZmZWN0IDogbnVsbFxuICAgIGlmIChlZmZlY3QgJiYgXCJ0cmFuc2Zvcm1cIiBpbiBlZmZlY3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG91dHB1dCA9IHR5cGVvZiBlZmZlY3QudHJhbnNmb3JtKFxuICAgICAgICAgIFtcImludGVnZXJcIiwgXCJudW1iZXJcIl0uaW5jbHVkZXMoYCR7aW5wdXQudHlwZX1gKVxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IFwic3RyaW5nXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgOiBcImJvb2xlYW5cIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgOiBcIm9iamVjdFwiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IFwibnVsbFwiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogXCJhcnJheVwiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB7IGFkZElzc3VlOiAoKSA9PiB1bmRlZmluZWQsIHBhdGg6IFtdIH0gLy8gVE9ETzogRGlzY292ZXIgaWYgY29udGV4dCBpcyBuZWNlc3NhcnkgaGVyZVxuICAgICAgICApXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qKi9cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIC4uLih6b2RSZWYuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiB6b2RSZWYuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIC4uLmlucHV0LFxuICAgICAgLi4uKFtcIm51bWJlclwiLCBcInN0cmluZ1wiLCBcImJvb2xlYW5cIiwgXCJudWxsXCJdLmluY2x1ZGVzKG91dHB1dClcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiBvdXRwdXQgYXMgXCJudW1iZXJcIiB8IFwic3RyaW5nXCIgfCBcImJvb2xlYW5cIiB8IFwibnVsbFwiLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VTdHJpbmcoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZFN0cmluZz4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBiYXNlU2NoZW1hOiBTY2hlbWFPYmplY3QgPSB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgfVxuICBjb25zdCB7IGNoZWNrcyA9IFtdIH0gPSB6b2RSZWYuX2RlZlxuICBjaGVja3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIHN3aXRjaCAoaXRlbS5raW5kKSB7XG4gICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImVtYWlsXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1dWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjdWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJjdWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcInVyaVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImRhdGUtdGltZVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibGVuZ3RoXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluTGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBiYXNlU2NoZW1hLm1heExlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5tYXhMZW5ndGggPSBpdGVtLnZhbHVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluTGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInJlZ2V4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEucGF0dGVybiA9IGl0ZW0ucmVnZXguc291cmNlXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9KVxuICByZXR1cm4gbWVyZ2UoYmFzZVNjaGVtYSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bWJlcih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kTnVtYmVyPik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGJhc2VTY2hlbWE6IFNjaGVtYU9iamVjdCA9IHtcbiAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgIGZvcm1hdDogXCJmbG9hdFwiLFxuICB9XG4gIGNvbnN0IHsgY2hlY2tzID0gW10gfSA9IHpvZFJlZi5fZGVmXG4gIGNoZWNrcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgc3dpdGNoIChpdGVtLmtpbmQpIHtcbiAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5tYXhpbXVtID0gaXRlbS52YWx1ZVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFVQU1RSRUFNOiBUaGUgb3BlbmFwaTMtdHMgdHlwZXMgYXJlIHdyb25nOiBleGNsdXNpdmVNYXhpbXVtIGlzIGEgYm9vbGVhbiBpbiB0aGlzIHZlcnNpb24uXG4gICAgICAgIC8vIGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vdjNfMC9kYXRhLW1vZGVscy9kYXRhLXR5cGVzL1xuICAgICAgICBpZiAoIWl0ZW0uaW5jbHVzaXZlKSBiYXNlU2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluaW11bSA9IGl0ZW0udmFsdWVcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBVUFNUUkVBTTogVGhlIG9wZW5hcGkzLXRzIHR5cGVzIGFyZSB3cm9uZzogZXhjbHVzaXZlTWluaW11bSBpcyBhIGJvb2xlYW4gaW4gdGhpcyB2ZXJzaW9uLlxuICAgICAgICAvLyBodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL3YzXzAvZGF0YS1tb2RlbHMvZGF0YS10eXBlcy9cbiAgICAgICAgaWYgKCFpdGVtLmluY2x1c2l2ZSkgYmFzZVNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImludFwiOlxuICAgICAgICBiYXNlU2NoZW1hLnR5cGUgPSBcImludGVnZXJcIlxuICAgICAgICBkZWxldGUgYmFzZVNjaGVtYS5mb3JtYXRcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtdWx0aXBsZU9mXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubXVsdGlwbGVPZiA9IGl0ZW0udmFsdWVcbiAgICB9XG4gIH0pXG4gIHJldHVybiBtZXJnZShiYXNlU2NoZW1hLCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGdldEV4Y2x1ZGVkRGVmaW5pdGlvbnNGcm9tU2NoZW1hKFxuICBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXhjbHVkZWREZWZpbml0aW9uczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHNjaGVtYSBvZiBzY2hlbWFzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmhpZGVEZWZpbml0aW9ucykpIHtcbiAgICAgIGV4Y2x1ZGVkRGVmaW5pdGlvbnMucHVzaCguLi5zY2hlbWEuaGlkZURlZmluaXRpb25zKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGNsdWRlZERlZmluaXRpb25zXG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG4gIGhpZGVEZWZpbml0aW9ucyxcbn06IFBhcnNpbmdBcmdzPFxuICB6LlpvZE9iamVjdDxuZXZlciwgXCJwYXNzdGhyb3VnaFwiIHwgXCJzdHJpY3RcIiB8IFwic3RyaXBcIj5cbj4pOiBTY2hlbWFPYmplY3Qge1xuICBsZXQgYWRkaXRpb25hbFByb3BlcnRpZXM6IFNjaGVtYU9iamVjdFtcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdXG5cbiAgLy8gYGNhdGNoYWxsYCBvYnZpYXRlcyBgc3RyaWN0YCwgYHN0cmlwYCwgYW5kIGBwYXNzdGhyb3VnaGBcbiAgaWYgKFxuICAgICEoXG4gICAgICB6b2RSZWYuX2RlZi5jYXRjaGFsbCBpbnN0YW5jZW9mIHouWm9kTmV2ZXIgfHxcbiAgICAgIHpvZFJlZi5fZGVmLmNhdGNoYWxsPy5fZGVmLnR5cGVOYW1lID09PSBcIlpvZE5ldmVyXCJcbiAgICApXG4gIClcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllcyA9IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmNhdGNoYWxsLCB1c2VPdXRwdXQpXG4gIGVsc2UgaWYgKHpvZFJlZi5fZGVmLnVua25vd25LZXlzID09PSBcInBhc3N0aHJvdWdoXCIpXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgPSB0cnVlXG4gIGVsc2UgaWYgKHpvZFJlZi5fZGVmLnVua25vd25LZXlzID09PSBcInN0cmljdFwiKSBhZGRpdGlvbmFsUHJvcGVydGllcyA9IGZhbHNlXG5cbiAgLy8gU28gdGhhdCBgdW5kZWZpbmVkYCB2YWx1ZXMgZG9uJ3QgZW5kIHVwIGluIHRoZSBzY2hlbWEgYW5kIGJlIHdlaXJkXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID1cbiAgICBhZGRpdGlvbmFsUHJvcGVydGllcyAhPSBudWxsID8geyBhZGRpdGlvbmFsUHJvcGVydGllcyB9IDoge31cblxuICBjb25zdCByZXF1aXJlZFByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhcbiAgICAoem9kUmVmIGFzIHouQW55Wm9kT2JqZWN0KS5zaGFwZVxuICApLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgY29uc3QgaXRlbSA9ICh6b2RSZWYgYXMgei5Bbnlab2RPYmplY3QpLnNoYXBlW2tleV1cbiAgICByZXR1cm4gKFxuICAgICAgIShcbiAgICAgICAgaXRlbS5pc09wdGlvbmFsKCkgfHxcbiAgICAgICAgaXRlbSBpbnN0YW5jZW9mIHouWm9kRGVmYXVsdCB8fFxuICAgICAgICBpdGVtLl9kZWYudHlwZU5hbWUgPT09IFwiWm9kRGVmYXVsdFwiXG4gICAgICApICYmICEoaXRlbSBpbnN0YW5jZW9mIHouWm9kTmV2ZXIgfHwgaXRlbS5fZGVmLnR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIilcbiAgICApXG4gIH0pXG5cbiAgY29uc3QgcmVxdWlyZWQgPVxuICAgIHJlcXVpcmVkUHJvcGVydGllcy5sZW5ndGggPiAwID8geyByZXF1aXJlZDogcmVxdWlyZWRQcm9wZXJ0aWVzIH0gOiB7fVxuXG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiIGFzIFNjaGVtYU9iamVjdFR5cGUsXG4gICAgICBwcm9wZXJ0aWVzOiBpdGVyYXRlWm9kT2JqZWN0KHtcbiAgICAgICAgem9kUmVmOiB6b2RSZWYgYXMgT3BlbkFwaVpvZEFueU9iamVjdCxcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgdXNlT3V0cHV0LFxuICAgICAgICBoaWRlRGVmaW5pdGlvbnM6IGdldEV4Y2x1ZGVkRGVmaW5pdGlvbnNGcm9tU2NoZW1hKHNjaGVtYXMpLFxuICAgICAgfSksXG4gICAgICAuLi5yZXF1aXJlZCxcbiAgICAgIC4uLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLFxuICAgICAgLi4uaGlkZURlZmluaXRpb25zLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVJlY29yZCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RSZWNvcmQ+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOlxuICAgICAgICB6b2RSZWYuX2RlZi52YWx1ZVR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd25cbiAgICAgICAgICA/IHt9XG4gICAgICAgICAgOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi52YWx1ZVR5cGUsIHVzZU91dHB1dCksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQmlnSW50KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCaWdJbnQ+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgdHlwZTogXCJpbnRlZ2VyXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSwgZm9ybWF0OiBcImludDY0XCIgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQm9vbGVhbih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kQm9vbGVhbj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgeyB0eXBlOiBcImJvb2xlYW5cIiBhcyBTY2hlbWFPYmplY3RUeXBlIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURhdGUoeyB6b2RSZWYsIHNjaGVtYXMgfTogUGFyc2luZ0FyZ3M8ei5ab2REYXRlPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7IHR5cGU6IFwic3RyaW5nXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSwgZm9ybWF0OiBcImRhdGUtdGltZVwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bGwoeyB6b2RSZWYsIHNjaGVtYXMgfTogUGFyc2luZ0FyZ3M8ei5ab2ROdWxsPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VPcHRpb25hbCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RPcHRpb25hbDxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnVud3JhcCgpLCB1c2VPdXRwdXQpLFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VOdWxsYWJsZSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROdWxsYWJsZTxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBzY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYudW53cmFwKCksIHVzZU91dHB1dClcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgLi4uc2NoZW1hLCB0eXBlOiBzY2hlbWEudHlwZSwgbnVsbGFibGU6IHRydWUgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVmYXVsdCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2REZWZhdWx0PE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBkZWZhdWx0OiB6b2RSZWYuX2RlZi5kZWZhdWx0VmFsdWUoKSxcbiAgICAgIC4uLmdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmlubmVyVHlwZSwgdXNlT3V0cHV0KSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VBcnJheSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RBcnJheTxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBjb25zdHJhaW50czogU2NoZW1hT2JqZWN0ID0ge31cbiAgaWYgKHpvZFJlZi5fZGVmLmV4YWN0TGVuZ3RoICE9IG51bGwpIHtcbiAgICBjb25zdHJhaW50cy5taW5JdGVtcyA9IHpvZFJlZi5fZGVmLmV4YWN0TGVuZ3RoLnZhbHVlXG4gICAgY29uc3RyYWludHMubWF4SXRlbXMgPSB6b2RSZWYuX2RlZi5leGFjdExlbmd0aC52YWx1ZVxuICB9XG5cbiAgaWYgKHpvZFJlZi5fZGVmLm1pbkxlbmd0aCAhPSBudWxsKVxuICAgIGNvbnN0cmFpbnRzLm1pbkl0ZW1zID0gem9kUmVmLl9kZWYubWluTGVuZ3RoLnZhbHVlXG4gIGlmICh6b2RSZWYuX2RlZi5tYXhMZW5ndGggIT0gbnVsbClcbiAgICBjb25zdHJhaW50cy5tYXhJdGVtcyA9IHpvZFJlZi5fZGVmLm1heExlbmd0aC52YWx1ZVxuXG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiBcImFycmF5XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGl0ZW1zOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuZWxlbWVudCwgdXNlT3V0cHV0KSxcbiAgICAgIC4uLmNvbnN0cmFpbnRzLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUxpdGVyYWwoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG59OiBQYXJzaW5nQXJnczx6LlpvZExpdGVyYWw8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IHR5cGVvZiB6b2RSZWYuX2RlZi52YWx1ZSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiLFxuICAgICAgZW51bTogW3pvZFJlZi5fZGVmLnZhbHVlXSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VFbnVtKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RFbnVtPG5ldmVyPiB8IHouWm9kTmF0aXZlRW51bTxuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IHR5cGVvZiBPYmplY3QudmFsdWVzKHpvZFJlZi5fZGVmLnZhbHVlcylbMF0gYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIsXG4gICAgICBlbnVtOiBPYmplY3QudmFsdWVzKHpvZFJlZi5fZGVmLnZhbHVlcyksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlSW50ZXJzZWN0aW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGVBbnksIHouWm9kVHlwZUFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIGFsbE9mOiBbXG4gICAgICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmxlZnQsIHVzZU91dHB1dCksXG4gICAgICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLnJpZ2h0LCB1c2VPdXRwdXQpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VVbmlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RVbmlvbjxbei5ab2RUeXBlQW55LCAuLi56LlpvZFR5cGVBbnlbXV0+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGNvbnRlbnRzID0gem9kUmVmLl9kZWYub3B0aW9uc1xuICBpZiAoXG4gICAgY29udGVudHMucmVkdWNlKFxuICAgICAgKHByZXYsIGNvbnRlbnQpID0+IHByZXYgJiYgY29udGVudC5fZGVmLnR5cGVOYW1lID09PSBcIlpvZExpdGVyYWxcIixcbiAgICAgIHRydWVcbiAgICApXG4gICkge1xuICAgIC8vIHNwZWNpYWwgY2FzZSB0byB0cmFuc2Zvcm0gdW5pb25zIG9mIGxpdGVyYWxzIGludG8gZW51bXNcbiAgICBjb25zdCBsaXRlcmFscyA9IGNvbnRlbnRzIGFzIHVua25vd24gYXMgei5ab2RMaXRlcmFsPE9wZW5BcGlab2RBbnk+W11cbiAgICBjb25zdCB0eXBlID0gbGl0ZXJhbHMucmVkdWNlKFxuICAgICAgKHByZXYsIGNvbnRlbnQpID0+XG4gICAgICAgICFwcmV2IHx8IHByZXYgPT09IHR5cGVvZiBjb250ZW50Ll9kZWYudmFsdWVcbiAgICAgICAgICA/IHR5cGVvZiBjb250ZW50Ll9kZWYudmFsdWVcbiAgICAgICAgICA6IG51bGwsXG4gICAgICBudWxsIGFzIG51bGwgfCBzdHJpbmdcbiAgICApXG5cbiAgICBpZiAodHlwZSkge1xuICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogdHlwZSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGVudW06IGxpdGVyYWxzLm1hcCgobGl0ZXJhbCkgPT4gbGl0ZXJhbC5fZGVmLnZhbHVlKSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgICAgICAuLi5zY2hlbWFzXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNOdWxsYWJsZSA9IGNvbnRlbnRzLnNvbWUoXG4gICAgKGNvbnRlbnQpID0+IGNvbnRlbnQuX2RlZi50eXBlTmFtZSA9PT0gXCJab2ROdWxsXCJcbiAgKVxuICBjb25zdCBub25OdWxsQ29udGVudHMgPSBjb250ZW50cy5maWx0ZXIoXG4gICAgKGNvbnRlbnQpID0+IGNvbnRlbnQuX2RlZi50eXBlTmFtZSAhPT0gXCJab2ROdWxsXCJcbiAgKVxuXG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBvbmVPZjogbm9uTnVsbENvbnRlbnRzLm1hcCgoc2NoZW1hKSA9PiBnZW5lcmF0ZVNjaGVtYShzY2hlbWEsIHVzZU91dHB1dCkpLFxuICAgICAgLi4uKGlzTnVsbGFibGUgPyB7IG51bGxhYmxlOiB0cnVlIH0gOiB7fSksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGlzY3JpbWluYXRlZFVuaW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczxcbiAgei5ab2REaXNjcmltaW5hdGVkVW5pb248c3RyaW5nLCB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbk9wdGlvbjxzdHJpbmc+W10+XG4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIGRpc2NyaW1pbmF0b3I6IHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiAoXG4gICAgICAgICAgem9kUmVmIGFzIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uPFxuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgei5ab2REaXNjcmltaW5hdGVkVW5pb25PcHRpb248c3RyaW5nPltdXG4gICAgICAgICAgPlxuICAgICAgICApLl9kZWYuZGlzY3JpbWluYXRvcixcbiAgICAgIH0sXG4gICAgICBvbmVPZjogQXJyYXkuZnJvbShcbiAgICAgICAgKFxuICAgICAgICAgIHpvZFJlZiBhcyB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbjxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uT3B0aW9uPHN0cmluZz5bXVxuICAgICAgICAgID5cbiAgICAgICAgKS5fZGVmLm9wdGlvbnMudmFsdWVzKClcbiAgICAgICkubWFwKChzY2hlbWEpID0+IGdlbmVyYXRlU2NoZW1hKHNjaGVtYSwgdXNlT3V0cHV0KSksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlTmV2ZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZE5ldmVyPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZSh7IHJlYWRPbmx5OiB0cnVlIH0sIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VCcmFuZGVkKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCcmFuZGVkPHouWm9kQW55LCBzdHJpbmc+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi50eXBlKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gY2F0Y2hBbGxQYXJzZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczxab2RUeXBlQW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlUGlwZWxpbmUoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kUGlwZWxpbmU8bmV2ZXIsIG5ldmVyPj4pOiBTY2hlbWFPYmplY3Qge1xuICBpZiAodXNlT3V0cHV0KSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLm91dCwgdXNlT3V0cHV0KVxuICB9XG4gIHJldHVybiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5pbiwgdXNlT3V0cHV0KVxufVxuXG5mdW5jdGlvbiBwYXJzZVJlYWRvbmx5KHtcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZFJlYWRvbmx5PHouWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYuaW5uZXJUeXBlLCB1c2VPdXRwdXQpLFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuY29uc3Qgd29ya2VyTWFwID0ge1xuICBab2RPYmplY3Q6IHBhcnNlT2JqZWN0LFxuICBab2RSZWNvcmQ6IHBhcnNlUmVjb3JkLFxuICBab2RTdHJpbmc6IHBhcnNlU3RyaW5nLFxuICBab2ROdW1iZXI6IHBhcnNlTnVtYmVyLFxuICBab2RCaWdJbnQ6IHBhcnNlQmlnSW50LFxuICBab2RCb29sZWFuOiBwYXJzZUJvb2xlYW4sXG4gIFpvZERhdGU6IHBhcnNlRGF0ZSxcbiAgWm9kTnVsbDogcGFyc2VOdWxsLFxuICBab2RPcHRpb25hbDogcGFyc2VPcHRpb25hbCxcbiAgWm9kTnVsbGFibGU6IHBhcnNlTnVsbGFibGUsXG4gIFpvZERlZmF1bHQ6IHBhcnNlRGVmYXVsdCxcbiAgWm9kQXJyYXk6IHBhcnNlQXJyYXksXG4gIFpvZExpdGVyYWw6IHBhcnNlTGl0ZXJhbCxcbiAgWm9kRW51bTogcGFyc2VFbnVtLFxuICBab2ROYXRpdmVFbnVtOiBwYXJzZUVudW0sXG4gIFpvZFRyYW5zZm9ybWVyOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RFZmZlY3RzOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RJbnRlcnNlY3Rpb246IHBhcnNlSW50ZXJzZWN0aW9uLFxuICBab2RVbmlvbjogcGFyc2VVbmlvbixcbiAgWm9kRGlzY3JpbWluYXRlZFVuaW9uOiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbixcbiAgWm9kTmV2ZXI6IHBhcnNlTmV2ZXIsXG4gIFpvZEJyYW5kZWQ6IHBhcnNlQnJhbmRlZCxcbiAgLy8gVE9ETyBUcmFuc2Zvcm0gdGhlIHJlc3QgdG8gc2NoZW1hc1xuICBab2RVbmRlZmluZWQ6IGNhdGNoQWxsUGFyc2VyLFxuICAvLyBUT0RPOiBgcHJlZml4SXRlbXNgIGlzIGFsbG93ZWQgaW4gT3BlbkFQSSAzLjEgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHR1cGxlc1xuICBab2RUdXBsZTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZE1hcDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZEZ1bmN0aW9uOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kTGF6eTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFByb21pc2U6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RBbnk6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RVbmtub3duOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kVm9pZDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFBpcGVsaW5lOiBwYXJzZVBpcGVsaW5lLFxuICBab2RSZWFkb25seTogcGFyc2VSZWFkb25seSxcbn1cbnR5cGUgV29ya2VyS2V5cyA9IGtleW9mIHR5cGVvZiB3b3JrZXJNYXBcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NoZW1hKFxuICB6b2RSZWY6IE9wZW5BcGlab2RBbnksXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHsgbWV0YU9wZW5BcGkgPSB7fSB9ID0gem9kUmVmXG4gIGNvbnN0IHNjaGVtYXM6IEFuYXRpbmVTY2hlbWFPYmplY3RbXSA9IFtcbiAgICAuLi4oQXJyYXkuaXNBcnJheShtZXRhT3BlbkFwaSkgPyBtZXRhT3BlbkFwaSA6IFttZXRhT3BlbkFwaV0pLFxuICBdXG4gIHRyeSB7XG4gICAgY29uc3QgdHlwZU5hbWUgPSB6b2RSZWYuX2RlZi50eXBlTmFtZSBhcyBXb3JrZXJLZXlzXG4gICAgaWYgKHR5cGVOYW1lIGluIHdvcmtlck1hcCkge1xuICAgICAgcmV0dXJuIHdvcmtlck1hcFt0eXBlTmFtZV0oe1xuICAgICAgICB6b2RSZWY6IHpvZFJlZiBhcyBuZXZlcixcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgdXNlT3V0cHV0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gY2F0Y2hBbGxQYXJzZXIoeyB6b2RSZWYsIHNjaGVtYXMgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgcmV0dXJuIGNhdGNoQWxsUGFyc2VyKHsgem9kUmVmLCBzY2hlbWFzIH0pXG4gIH1cbn1cbiIsICIvKipcbiAqIEZyb250LU1hdHRlclxuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2p4c29uL2Zyb250LW1hdHRlclxuICpcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSBKYXNvbiBDYW1wYmVsbCAoXCJBdXRob3JcIilcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7IGxvYWQgfSBmcm9tIFwianMteWFtbFwiXG5jb25zdCBvcHRpb25hbEJ5dGVPcmRlck1hcmsgPSBcIlxcXFx1ZmVmZj9cIlxuY29uc3QgcGxhdGZvcm0gPSB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiA/IHByb2Nlc3MucGxhdGZvcm0gOiBcIlwiXG5jb25zdCBwYXR0ZXJuID1cbiAgXCJeKFwiICtcbiAgb3B0aW9uYWxCeXRlT3JkZXJNYXJrICtcbiAgXCIoPSB5YW1sID18LS0tKVwiICtcbiAgXCIkKFtcXFxcc1xcXFxTXSo/KVwiICtcbiAgXCJeKD86XFxcXDJ8XFxcXC5cXFxcLlxcXFwuKVxcXFxzKlwiICtcbiAgXCIkXCIgK1xuICAocGxhdGZvcm0gPT09IFwid2luMzJcIiA/IFwiXFxcXHI/XCIgOiBcIlwiKSArXG4gIFwiKD86XFxcXG4pPylcIlxuLy8gTk9URTogSWYgdGhpcyBwYXR0ZXJuIHVzZXMgdGhlICdnJyBmbGFnIHRoZSBgcmVnZXhgIHZhcmlhYmxlIGRlZmluaXRpb24gd2lsbFxuLy8gbmVlZCB0byBiZSBtb3ZlZCBkb3duIGludG8gdGhlIGZ1bmN0aW9ucyB0aGF0IHVzZSBpdC5cbmNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcIm1cIilcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRnJvbnRNYXR0ZXIoXG4gIHN0cmluZzogc3RyaW5nLFxuICBvcHRpb25zID0ge31cbik6IHsgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGJvZHk6IHN0cmluZzsgYm9keUJlZ2luOiBudW1iZXIgfSB7XG4gIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiXG4gIHZhciBkZWZhdWx0T3B0aW9ucyA9IHsgYWxsb3dVbnNhZmU6IGZhbHNlIH1cbiAgb3B0aW9ucyA9XG4gICAgb3B0aW9ucyBpbnN0YW5jZW9mIE9iamVjdFxuICAgICAgPyB7IC4uLmRlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zIH1cbiAgICAgIDogZGVmYXVsdE9wdGlvbnNcbiAgdmFyIGxpbmVzID0gc3RyaW5nLnNwbGl0KC8oXFxyP1xcbikvKVxuICBpZiAobGluZXNbMF0gJiYgLz0geWFtbCA9fC0tLS8udGVzdChsaW5lc1swXSkpIHtcbiAgICByZXR1cm4gcGFyc2Uoc3RyaW5nKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGJvZHk6IHN0cmluZyxcbiAgICAgIGJvZHlCZWdpbjogMSxcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUxvY2F0aW9uKG1hdGNoOiBSZWdFeHBFeGVjQXJyYXksIGJvZHk6IHN0cmluZykge1xuICB2YXIgbGluZSA9IDFcbiAgdmFyIHBvcyA9IGJvZHkuaW5kZXhPZihcIlxcblwiKVxuICB2YXIgb2Zmc2V0ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcblxuICB3aGlsZSAocG9zICE9PSAtMSkge1xuICAgIGlmIChwb3MgPj0gb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gbGluZVxuICAgIH1cbiAgICBsaW5lKytcbiAgICBwb3MgPSBib2R5LmluZGV4T2YoXCJcXG5cIiwgcG9zICsgMSlcbiAgfVxuXG4gIHJldHVybiBsaW5lXG59XG5cbmZ1bmN0aW9uIHBhcnNlKHN0cmluZzogc3RyaW5nKToge1xuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBib2R5OiBzdHJpbmdcbiAgYm9keUJlZ2luOiBudW1iZXJcbn0ge1xuICB2YXIgbWF0Y2ggPSByZWdleC5leGVjKHN0cmluZylcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGJvZHk6IHN0cmluZyxcbiAgICAgIGJvZHlCZWdpbjogMSxcbiAgICB9XG4gIH1cblxuICB2YXIgeWFtbCA9IG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdLnJlcGxhY2UoL15cXHMrfFxccyskL2csIFwiXCIpXG4gIHZhciBhdHRyaWJ1dGVzID0gKGxvYWQoeWFtbCkgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHZhciBib2R5ID0gc3RyaW5nLnJlcGxhY2UobWF0Y2hbMF0sIFwiXCIpXG4gIHZhciBsaW5lID0gY29tcHV0ZUxvY2F0aW9uKG1hdGNoLCBzdHJpbmcpXG5cbiAgcmV0dXJuIHtcbiAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuICAgIGJvZHk6IGJvZHksXG4gICAgYm9keUJlZ2luOiBsaW5lLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RnJvbnRNYXR0ZXIoc3RyaW5nOiBzdHJpbmcpIHtcbiAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCJcblxuICByZXR1cm4gcmVnZXgudGVzdChzdHJpbmcpXG59XG4iLCAidHlwZSBQcmVmaXhlZE9iamVjdDxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBgeC0ke3N0cmluZyAmIEt9YF06IFRbS11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeE9iamVjdEtleXNXaXRoWDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb2JqOiBUXG4pOiBQcmVmaXhlZE9iamVjdDxUPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2B4LSR7a2V5fWAsIHZhbHVlXSlcbiAgKSBhcyBQcmVmaXhlZE9iamVjdDxUPlxufVxuIiwgInR5cGUgU25ha2VUb0Rhc2g8VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgSyBleHRlbmRzIHN0cmluZyA/IFNuYWtlVG9EYXNoU3RyaW5nPEs+IDogS106IFRbS11cbn1cblxudHlwZSBTbmFrZVRvRGFzaFN0cmluZzxTIGV4dGVuZHMgc3RyaW5nPiA9IFMgZXh0ZW5kcyBgJHtpbmZlciBUfV8ke2luZmVyIFV9YFxuICA/IGAke1R9LSR7U25ha2VUb0Rhc2hTdHJpbmc8VT59YFxuICA6IFNcblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hpZnlPYmplY3RLZXlzPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCk6IFNuYWtlVG9EYXNoPFQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LnJlcGxhY2UoL18vZywgXCItXCIpLCB2YWx1ZV0pXG4gICkgYXMgU25ha2VUb0Rhc2g8VD5cbn1cbiIsICJpbXBvcnQgXyBmcm9tIFwibG9kYXNoXCJcblxuZnVuY3Rpb24gZmluZEtleUluT2JqKG9iajogYW55LCB2YWx1ZTogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCByZXN1bHRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIF8uZm9yT3duKG9iaiwgKHYsIGspID0+IHtcbiAgICBpZiAoXy5pc09iamVjdCh2KSAmJiBfLmlzTWF0Y2godiwgdmFsdWUpKSB7XG4gICAgICByZXN1bHRLZXkgPSBrXG4gICAgICAvLyBTdG9wIHRoZSBpdGVyYXRpb25cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdEtleVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1iZWRTY2hlbWFSZWZlcmVuY2VzKG9iajE6IGFueSwgb2JqMjogYW55KTogYW55IHtcbiAgcmV0dXJuIF8udHJhbnNmb3JtKG9iajEsIChyZXN1bHQsIHZhbHVlLCBrZXkpID0+IHtcbiAgICBpZiAoXy5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nS2V5ID0gZmluZEtleUluT2JqKG9iajIsIHZhbHVlKVxuICAgICAgaWYgKG1hdGNoaW5nS2V5KSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0ge1xuICAgICAgICAgICRyZWY6IGAjL2NvbXBvbmVudHMvc2NoZW1hcy8ke21hdGNoaW5nS2V5fWAsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZW1iZWRTY2hlbWFSZWZlcmVuY2VzKHZhbHVlLCBvYmoyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9KVxufVxuIiwgImltcG9ydCB7IFJvdXRlU3BlYyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtNZXRob2ROYW1lKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVxuICBpZiAobGFzdFBhcnQuc3RhcnRzV2l0aChcIltcIikgJiYgbGFzdFBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgLy8gQ29udmVydCBbcGFyYW1dIHRvIGJ5X3BhcmFtXG4gICAgY29uc3QgcGFyYW0gPSBsYXN0UGFydC5zbGljZSgxLCAtMSlcbiAgICByZXR1cm4gYGJ5XyR7cGFyYW19YFxuICB9XG5cbiAgcmV0dXJuIGxhc3RQYXJ0XG59XG5cbi8vIGZlcm4gZG9jczogaHR0cHM6Ly9idWlsZHdpdGhmZXJuLmNvbS9kb2NzL3NwZWMvZXh0ZW5zaW9uc1xuZnVuY3Rpb24gdHJhbnNmb3JtUGF0aFRvRmVyblNka0dyb3VwTmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpXG4gIHJldHVybiBwYXJ0cy5zbGljZSgwLCBwYXJ0cy5sZW5ndGggLSAxKVxufVxuXG5mdW5jdGlvbiBnZXRGZXJuU2RrTWV0YWRhdGEoXG4gIHBhdGg6IHN0cmluZyxcbiAgc2RrUmV0dXJuVmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXVxuKTpcbiAgfCB7XG4gICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZVxuICAgIH1cbiAgfCB7XG4gICAgICBcIngtZmVybi1zZGstZ3JvdXAtbmFtZVwiOiBzdHJpbmdbXVxuICAgICAgXCJ4LWZlcm4tc2RrLW1ldGhvZC1uYW1lXCI6IHN0cmluZ1xuICAgIH0ge1xuICBpZiAocGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKS5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWUsXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBcIngtZmVybi1zZGstZ3JvdXAtbmFtZVwiOiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrR3JvdXBOYW1lKHBhdGgpLFxuICAgIFwieC1mZXJuLXNkay1tZXRob2QtbmFtZVwiOiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrTWV0aG9kTmFtZShwYXRoKSxcbiAgICAuLi4oc2RrUmV0dXJuVmFsdWVcbiAgICAgID8ge1xuICAgICAgICAgIFwieC1mZXJuLXNkay1yZXR1cm4tdmFsdWVcIjogc2RrUmV0dXJuVmFsdWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoe1xuICBtZXRob2RzLFxuICBwYXRoLFxuICBzZGtSZXR1cm5WYWx1ZSxcbn06IHtcbiAgbWV0aG9kczogUm91dGVTcGVjW1wibWV0aG9kc1wiXVxuICBwYXRoOiBzdHJpbmdcbiAgc2RrUmV0dXJuVmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXVxufSkge1xuICBjb25zdCBmZXJuU2RrTWV0YWRhdGEgPSBnZXRGZXJuU2RrTWV0YWRhdGEocGF0aCwgc2RrUmV0dXJuVmFsdWUpXG4gIGlmIChtZXRob2RzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBbbWV0aG9kc1swXV06IGZlcm5TZGtNZXRhZGF0YSxcbiAgICB9XG4gIH1cblxuICBjb25zdCBtYXBwZWRNZXRob2RzID0ge31cblxuICBtZXRob2RzLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgICBtYXBwZWRNZXRob2RzW21ldGhvZF0gPSBmZXJuU2RrTWV0YWRhdGFcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwcGVkTWV0aG9kc1ttZXRob2RdID0ge1xuICAgICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZSxcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG1hcHBlZE1ldGhvZHNcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgeyBwYXJzZVJvdXRlc0luUGFja2FnZSB9IGZyb20gXCIuLi9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2VcIlxuaW1wb3J0IHsgem9kVG9UcywgcHJpbnROb2RlIH0gZnJvbSBcIi4uL2xpYi96b2QtdG8tdHNcIlxuaW1wb3J0IHByZXR0aWVyIGZyb20gXCJwcmV0dGllclwiXG5pbXBvcnQgeyB6LCBab2RFZmZlY3RzLCBab2RPcHRpb25hbCB9IGZyb20gXCJ6b2RcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJvdXRlVHlwZXMgPSBhc3luYyAob3B0czogR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cykgPT4ge1xuICBjb25zdCBmaWxlcGF0aFRvUm91dGUgPSBhd2FpdCBwYXJzZVJvdXRlc0luUGFja2FnZShvcHRzKVxuXG4gIGNvbnN0IHNvcnRlZFJvdXRlcyA9IEFycmF5LmZyb20oZmlsZXBhdGhUb1JvdXRlLmVudHJpZXMoKSkuc29ydCgoYSwgYikgPT5cbiAgICBhWzFdLnJvdXRlLmxvY2FsZUNvbXBhcmUoYlsxXS5yb3V0ZSlcbiAgKVxuICBjb25zdCBmaWx0ZXJlZFJvdXRlcyA9IHNvcnRlZFJvdXRlcy5maWx0ZXIoXG4gICAgKFtfLCB7IHJvdXRlIH1dKSA9PiAhb3B0cy5maWx0ZXJSb3V0ZXMgfHwgb3B0cy5maWx0ZXJSb3V0ZXMocm91dGUpXG4gIClcblxuICAvLyBUT0RPIHdoZW4gbGVzcyBsYXp5LCB1c2UgdHMtbW9ycGggZm9yIGJldHRlciBnZW5lcmF0aW9uXG4gIGNvbnN0IHJvdXRlRGVmczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IFtfLCB7IHJvdXRlLCByb3V0ZVNwZWMsIHNldHVwUGFyYW1zIH1dIG9mIGZpbHRlcmVkUm91dGVzKSB7XG4gICAgY29uc3QgbWF4RHVyYXRpb24gPSByb3V0ZVNwZWMubWF4RHVyYXRpb24gPz8gc2V0dXBQYXJhbXMubWF4RHVyYXRpb25cbiAgICBjb25zdCBxdWVyeUtleXMgPSBPYmplY3Qua2V5cyhyb3V0ZVNwZWMucXVlcnlQYXJhbXM/LnNoYXBlID8/IHt9KVxuICAgIGNvbnN0IHBhdGhQYXJhbWV0ZXJzID0gcXVlcnlLZXlzLmZpbHRlcigoa2V5KSA9PiByb3V0ZS5pbmNsdWRlcyhgWyR7a2V5fV1gKSlcblxuICAgIC8vIHF1ZXJ5UGFyYW1zIG1pZ2h0IGJlIGEgWm9kRWZmZWN0cyBvciBab2RPcHRpb25hbCBpbiBzb21lIGNhc2VzXG4gICAgbGV0IHF1ZXJ5UGFyYW1zID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zXG4gICAgd2hpbGUgKFxuICAgICAgcXVlcnlQYXJhbXMgJiZcbiAgICAgIChcInNvdXJjZVR5cGVcIiBpbiBxdWVyeVBhcmFtcyB8fCBcInVud3JhcFwiIGluIHF1ZXJ5UGFyYW1zKVxuICAgICkge1xuICAgICAgaWYgKFwic291cmNlVHlwZVwiIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zIGFzIHVua25vd24gYXMgWm9kRWZmZWN0czxhbnk+KS5zb3VyY2VUeXBlKClcbiAgICAgIH0gZWxzZSBpZiAoXCJ1bndyYXBcIiBpbiBxdWVyeVBhcmFtcykge1xuICAgICAgICBxdWVyeVBhcmFtcyA9IChxdWVyeVBhcmFtcyBhcyB1bmtub3duIGFzIFpvZE9wdGlvbmFsPGFueT4pLnVud3JhcCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5UGFyYW1zICYmIFwib21pdFwiIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1zLm9taXQoXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhwYXRoUGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiBbcGFyYW0sIHRydWVdKSlcbiAgICAgIClcbiAgICB9XG5cbiAgICByb3V0ZURlZnMucHVzaChcbiAgICAgIGBcblwiJHtyb3V0ZX1cIjoge1xuICByb3V0ZTogXCIke3JvdXRlfVwiLFxuICBtZXRob2Q6ICR7cm91dGVTcGVjLm1ldGhvZHMubWFwKChtKSA9PiBgXCIke219XCJgKS5qb2luKFwiIHwgXCIpfSxcbiAgcXVlcnlQYXJhbXM6ICR7cXVlcnlQYXJhbXMgPyBwcmludE5vZGUoem9kVG9UcyhxdWVyeVBhcmFtcykubm9kZSkgOiBcInt9XCJ9LFxuICBqc29uQm9keTogJHtcbiAgICByb3V0ZVNwZWMuanNvbkJvZHkgPyBwcmludE5vZGUoem9kVG9Ucyhyb3V0ZVNwZWMuanNvbkJvZHkpLm5vZGUpIDogXCJ7fVwiXG4gIH0sXG4gIGNvbW1vblBhcmFtczogJHtcbiAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5jb21tb25QYXJhbXMpLm5vZGUpXG4gICAgICA6IFwie31cIlxuICB9LFxuICBmb3JtRGF0YTogJHtcbiAgICByb3V0ZVNwZWMuZm9ybURhdGEgPyBwcmludE5vZGUoem9kVG9Ucyhyb3V0ZVNwZWMuZm9ybURhdGEpLm5vZGUpIDogXCJ7fVwiXG4gIH0sXG4gIGpzb25SZXNwb25zZTogJHtcbiAgICByb3V0ZVNwZWMuanNvblJlc3BvbnNlXG4gICAgICA/IHByaW50Tm9kZShcbiAgICAgICAgICB6b2RUb1RzKFxuICAgICAgICAgICAgc2V0dXBQYXJhbXMuYWRkT2tTdGF0dXMgJiZcbiAgICAgICAgICAgICAgcm91dGVTcGVjLmpzb25SZXNwb25zZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0XG4gICAgICAgICAgICAgID8gcm91dGVTcGVjLmpzb25SZXNwb25zZS5leHRlbmQoeyBvazogei5ib29sZWFuKCkgfSlcbiAgICAgICAgICAgICAgOiByb3V0ZVNwZWMuanNvblJlc3BvbnNlXG4gICAgICAgICAgKS5ub2RlXG4gICAgICAgIClcbiAgICAgIDogXCJ7fVwiXG4gIH0sXG4gIG1heER1cmF0aW9uOiAke21heER1cmF0aW9uID8/IFwidW5kZWZpbmVkXCJ9XG59YC50cmltKClcbiAgICApXG4gIH1cbiAgY29uc3Qgcm91dGVEZWZTdHIgPSByb3V0ZURlZnMuam9pbihcIixcXG5cIilcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcHJldHRpZXIuZm9ybWF0KFxuICAgIGBleHBvcnQgdHlwZSBSb3V0ZXMgPSB7XG4ke3JvdXRlRGVmU3RyfVxufVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlc3BvbnNlPFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wianNvblJlc3BvbnNlXCJdXG5cbmV4cG9ydCB0eXBlIFJvdXRlUmVxdWVzdEJvZHk8UGF0aCBleHRlbmRzIGtleW9mIFJvdXRlcz4gPVxuICBSb3V0ZXNbUGF0aF1bXCJqc29uQm9keVwiXSAmIFJvdXRlc1tQYXRoXVtcImNvbW1vblBhcmFtc1wiXVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlcXVlc3RQYXJhbXM8UGF0aCBleHRlbmRzIGtleW9mIFJvdXRlcz4gPVxuICBSb3V0ZXNbUGF0aF1bXCJxdWVyeVBhcmFtc1wiXSAmIFJvdXRlc1tQYXRoXVtcImNvbW1vblBhcmFtc1wiXVxuYC50cmltKCksXG4gICAgeyBzZW1pOiBmYWxzZSwgcGFyc2VyOiBcInR5cGVzY3JpcHRcIiB9XG4gIClcblxuICBpZiAob3B0cy5vdXRwdXRGaWxlKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKG9wdHMub3V0cHV0RmlsZSwgb3V0cHV0KVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dFxufVxuIiwgIi8qKlxuICogWm9kIFRvIFRTXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2FjaGlucmFqYS96b2QtdG8tdHNcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMSBTYWNoaW4gUmFqYVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcbmltcG9ydCB7IFpvZFR5cGUsIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXIsIHRlc3RGcm9udE1hdHRlciB9IGZyb20gXCIuL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuXG5jb25zdCB7IGZhY3Rvcnk6IGYsIFN5bnRheEtpbmQsIFNjcmlwdEtpbmQsIFNjcmlwdFRhcmdldCwgRW1pdEhpbnQgfSA9IHRzXG5cbmNvbnN0IG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSA9IChcbiAgaWRlbnRpZmllcjogdHMuSWRlbnRpZmllciB8IHRzLlR5cGVOb2RlXG4pID0+IHtcbiAgaWYgKHRzLmlzSWRlbnRpZmllcihpZGVudGlmaWVyKSkge1xuICAgIHJldHVybiBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGlkZW50aWZpZXIpXG4gIH1cblxuICByZXR1cm4gaWRlbnRpZmllclxufVxuXG5jb25zdCBjcmVhdGVUeXBlUmVmZXJlbmNlRnJvbVN0cmluZyA9IChpZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gIGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKGlkZW50aWZpZXIpKVxuXG5jb25zdCBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUgPSAoKSA9PlxuICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVua25vd25LZXl3b3JkKVxuXG5leHBvcnQgY29uc3QgcHJpbnROb2RlID0gKFxuICBub2RlOiB0cy5Ob2RlLFxuICBwcmludGVyT3B0aW9ucz86IHRzLlByaW50ZXJPcHRpb25zXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBcInByaW50LnRzXCIsXG4gICAgXCJcIixcbiAgICBTY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIGZhbHNlLFxuICAgIFNjcmlwdEtpbmQuVFNcbiAgKVxuICBjb25zdCBwcmludGVyID0gdHMuY3JlYXRlUHJpbnRlcihwcmludGVyT3B0aW9ucylcbiAgcmV0dXJuIHByaW50ZXIucHJpbnROb2RlKEVtaXRIaW50LlVuc3BlY2lmaWVkLCBub2RlLCBzb3VyY2VGaWxlKVxufVxuXG5jb25zdCBpZGVudGlmaWVyUkUgPSAvXlskQS1aX2Etel1bXFx3JF0qJC9cblxuY29uc3QgZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbCA9IChzdHJpbmdfOiBzdHJpbmcpID0+IHtcbiAgaWYgKGlkZW50aWZpZXJSRS50ZXN0KHN0cmluZ18pKSB7XG4gICAgcmV0dXJuIGYuY3JlYXRlSWRlbnRpZmllcihzdHJpbmdfKVxuICB9XG5cbiAgcmV0dXJuIGYuY3JlYXRlU3RyaW5nTGl0ZXJhbChzdHJpbmdfKVxufVxuXG5jb25zdCBhZGRKc0RvY0NvbW1lbnQgPSAobm9kZTogdHMuTm9kZSwgdGV4dDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHsgZGVzY3JpcHRpb24sIGRlcHJlY2F0ZWQgfSA9IHBhcnNlRGVzY3JpcHRpb24odGV4dClcblxuICBsZXQgY29tbWVudCA9IGAqICR7ZGVzY3JpcHRpb259YFxuICBpZiAoZGVwcmVjYXRlZCkge1xuICAgIGNvbW1lbnQgKz0gYFxcbiAqIEBkZXByZWNhdGVkICR7XG4gICAgICB0eXBlb2YgZGVwcmVjYXRlZCA9PT0gXCJzdHJpbmdcIiA/IGRlcHJlY2F0ZWQgOiBcIlwiXG4gICAgfWBcbiAgfSBlbHNlIHtcbiAgICBjb21tZW50ICs9IGAgYFxuICB9XG5cbiAgdHMuYWRkU3ludGhldGljTGVhZGluZ0NvbW1lbnQoXG4gICAgbm9kZSxcbiAgICBTeW50YXhLaW5kLk11bHRpTGluZUNvbW1lbnRUcml2aWEsXG4gICAgY29tbWVudCxcbiAgICB0cnVlXG4gIClcbn1cblxudHlwZSBQYXJzZWREZXNjcmlwdGlvbiA9IHtcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkZXByZWNhdGVkPzogYm9vbGVhbiB8IHN0cmluZ1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IFBhcnNlZERlc2NyaXB0aW9uIHtcbiAgaWYgKCFkZXNjcmlwdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRpb246IFwiXCIsXG4gICAgfVxuICBjb25zdCB0cmltbWVkRGVzY3JpcHRpb24gPSBkZWRlbnQoZGVzY3JpcHRpb24pXG4gIGlmICghdGVzdEZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbikpIHJldHVybiB7IGRlc2NyaXB0aW9uIH1cbiAgY29uc3QgeyBhdHRyaWJ1dGVzLCBib2R5IH0gPSBwYXJzZUZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbilcbiAgY29uc3Qgb3V0cHV0OiBQYXJzZWREZXNjcmlwdGlvbiA9IHtcbiAgICBkZXNjcmlwdGlvbjogYm9keS50cmltKCksXG4gIH1cbiAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiICYmIGF0dHJpYnV0ZXMgIT09IG51bGwpIHtcbiAgICBpZiAoXCJkZXByZWNhdGVkXCIgaW4gYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcy5kZXByZWNhdGVkID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBvdXRwdXQuZGVwcmVjYXRlZCA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBvdXRwdXQuZGVwcmVjYXRlZCA9XG4gICAgICAgICAgYXR0cmlidXRlcy5kZXByZWNhdGVkLmxlbmd0aCA+IDAgPyBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgOiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImRlc2NyaXB0aW9uXCIgfHwga2V5ID09PSBcImRlcHJlY2F0ZWRcIikgY29udGludWVcbiAgICAgIG91dHB1dFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHB1dFxufVxuXG50eXBlIExpdGVyYWxUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxuXG50eXBlIFpvZFRvVHNPcHRpb25zID0ge1xuICAvKiogQGRlcHJlY2F0ZWQgdXNlIGBuYXRpdmVFbnVtc2AgaW5zdGVhZCAqL1xuICByZXNvbHZlTmF0aXZlRW51bXM/OiBib29sZWFuXG4gIG5hdGl2ZUVudW1zPzogXCJpZGVudGlmaWVyXCIgfCBcInJlc29sdmVcIiB8IFwidW5pb25cIlxufVxuXG5jb25zdCByZXNvbHZlT3B0aW9ucyA9IChyYXc/OiBab2RUb1RzT3B0aW9ucykgPT4ge1xuICBjb25zdCByZXNvbHZlZCA9IHtcbiAgICBuYXRpdmVFbnVtczogcmF3Py5yZXNvbHZlTmF0aXZlRW51bXMgPyBcInJlc29sdmVcIiA6IFwiaWRlbnRpZmllclwiLFxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb2x2ZWQsIC4uLnJhdyB9XG59XG5cbnR5cGUgUmVzb2x2ZWRab2RUb1RzT3B0aW9ucyA9IFJldHVyblR5cGU8dHlwZW9mIHJlc29sdmVPcHRpb25zPlxuXG50eXBlIFpvZFRvVHNTdG9yZSA9IHtcbiAgbmF0aXZlRW51bXM6IHRzLkVudW1EZWNsYXJhdGlvbltdXG59XG5cbnR5cGUgWm9kVG9Uc1JldHVybiA9IHtcbiAgbm9kZTogdHMuVHlwZU5vZGVcbiAgc3RvcmU6IFpvZFRvVHNTdG9yZVxufVxuXG50eXBlIEdldFR5cGVGdW5jdGlvbiA9IChcbiAgdHlwZXNjcmlwdDogdHlwZW9mIHRzLFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVkWm9kVG9Uc09wdGlvbnNcbikgPT4gdHMuSWRlbnRpZmllciB8IHRzLlR5cGVOb2RlXG5cbnR5cGUgR2V0VHlwZSA9IHsgX2RlZjogeyBnZXRUeXBlPzogR2V0VHlwZUZ1bmN0aW9uIH0gfVxuXG5jb25zdCBjYWxsR2V0VHlwZSA9IChcbiAgem9kOiBab2RUeXBlQW55LFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVkWm9kVG9Uc09wdGlvbnNcbikgPT4ge1xuICBsZXQgdHlwZTogUmV0dXJuVHlwZTxHZXRUeXBlRnVuY3Rpb24+IHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgZ2V0VHlwZVNjaGVtYSA9IHpvZCBhcyBHZXRUeXBlXG4gIC8vIHRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFjY2Vzc2luZyAndHlwZSdcbiAgaWYgKGdldFR5cGVTY2hlbWEuX2RlZi5nZXRUeXBlKVxuICAgIHR5cGUgPSBnZXRUeXBlU2NoZW1hLl9kZWYuZ2V0VHlwZSh0cywgaWRlbnRpZmllciwgb3B0aW9ucylcbiAgcmV0dXJuIHR5cGVcbn1cblxuZXhwb3J0IGNvbnN0IHpvZFRvVHMgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcj86IHN0cmluZyxcbiAgb3B0aW9ucz86IFpvZFRvVHNPcHRpb25zXG4pOiBab2RUb1RzUmV0dXJuID0+IHtcbiAgaWYgKCEoem9kIGluc3RhbmNlb2YgWm9kVHlwZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZTogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKCksXG4gICAgICBzdG9yZTogeyBuYXRpdmVFbnVtczogW10gfSxcbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWRJZGVudGlmaWVyID0gaWRlbnRpZmllciA/PyBcIklkZW50aWZpZXJcIlxuXG4gIGNvbnN0IHJlc29sdmVkT3B0aW9ucyA9IHJlc29sdmVPcHRpb25zKG9wdGlvbnMpXG5cbiAgY29uc3Qgc3RvcmU6IFpvZFRvVHNTdG9yZSA9IHsgbmF0aXZlRW51bXM6IFtdIH1cblxuICBjb25zdCBub2RlID0gem9kVG9Uc05vZGUoem9kLCByZXNvbHZlZElkZW50aWZpZXIsIHN0b3JlLCByZXNvbHZlZE9wdGlvbnMpXG5cbiAgcmV0dXJuIHsgbm9kZSwgc3RvcmUgfVxufVxuXG5jb25zdCB6b2RUb1RzTm9kZSA9IChcbiAgem9kOiBab2RUeXBlQW55LFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIHN0b3JlOiBab2RUb1RzU3RvcmUsXG4gIG9wdGlvbnM6IFJlc29sdmVkWm9kVG9Uc09wdGlvbnNcbikgPT4ge1xuICBjb25zdCB0eXBlTmFtZSA9IHpvZC5fZGVmLnR5cGVOYW1lXG5cbiAgY29uc3QgZ2V0VHlwZVR5cGUgPSBjYWxsR2V0VHlwZSh6b2QsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIC8vIHNwZWNpYWwgY2FzZSBuYXRpdmUgZW51bSwgd2hpY2ggbmVlZHMgYW4gaWRlbnRpZmllciBub2RlXG4gIGlmIChnZXRUeXBlVHlwZSAmJiB0eXBlTmFtZSAhPT0gXCJab2ROYXRpdmVFbnVtXCIpIHtcbiAgICByZXR1cm4gbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlKGdldFR5cGVUeXBlKVxuICB9XG5cbiAgY29uc3Qgb3RoZXJBcmd1bWVudHMgPSBbaWRlbnRpZmllciwgc3RvcmUsIG9wdGlvbnNdIGFzIGNvbnN0XG5cbiAgc3dpdGNoICh0eXBlTmFtZSkge1xuICAgIGNhc2UgXCJab2RTdHJpbmdcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE51bWJlclwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQmlnSW50XCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkJpZ0ludEtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RCb29sZWFuXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkJvb2xlYW5LZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kRGF0ZVwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJEYXRlXCIpKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVW5kZWZpbmVkXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROdWxsXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZU51bGwoKSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZFZvaWRcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVm9pZEtleXdvcmQpLFxuICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpLFxuICAgICAgXSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZEFueVwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5BbnlLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVW5rbm93blwiOiB7XG4gICAgICByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE5ldmVyXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLk5ldmVyS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZExhenlcIjoge1xuICAgICAgLy8gaXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hhdCB0aGUgbGF6eSB2YWx1ZSBpcyByZWZlcnJpbmcgdG9cbiAgICAgIC8vIHNvIHdlIGZvcmNlIHRoZSB1c2VyIHRvIGRlY2xhcmUgaXRcbiAgICAgIGlmICghZ2V0VHlwZVR5cGUpIHJldHVybiBjcmVhdGVUeXBlUmVmZXJlbmNlRnJvbVN0cmluZyhpZGVudGlmaWVyKVxuICAgICAgYnJlYWtcbiAgICB9XG4gICAgY2FzZSBcIlpvZExpdGVyYWxcIjoge1xuICAgICAgLy8gei5saXRlcmFsKCdoaScpIC0+ICdoaSdcbiAgICAgIGxldCBsaXRlcmFsOiB0cy5MaXRlcmFsRXhwcmVzc2lvbiB8IHRzLkJvb2xlYW5MaXRlcmFsXG5cbiAgICAgIGNvbnN0IGxpdGVyYWxWYWx1ZSA9IHpvZC5fZGVmLnZhbHVlIGFzIExpdGVyYWxUeXBlXG4gICAgICBzd2l0Y2ggKHR5cGVvZiBsaXRlcmFsVmFsdWUpIHtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOiB7XG4gICAgICAgICAgbGl0ZXJhbCA9IGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwobGl0ZXJhbFZhbHVlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjoge1xuICAgICAgICAgIGxpdGVyYWwgPSBsaXRlcmFsVmFsdWUgPT09IHRydWUgPyBmLmNyZWF0ZVRydWUoKSA6IGYuY3JlYXRlRmFsc2UoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGxpdGVyYWwgPSBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwobGl0ZXJhbFZhbHVlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGxpdGVyYWwpXG4gICAgfVxuICAgIGNhc2UgXCJab2RPYmplY3RcIjoge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5lbnRyaWVzKHpvZC5fZGVmLnNoYXBlKCkpXG5cbiAgICAgIGNvbnN0IG1lbWJlcnM6IHRzLlR5cGVFbGVtZW50W10gPSBwcm9wZXJ0aWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRab2ROb2RlID0gdmFsdWUgYXMgWm9kVHlwZUFueVxuICAgICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUobmV4dFpvZE5vZGUsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICAgIGNvbnN0IHsgdHlwZU5hbWU6IG5leHRab2ROb2RlVHlwZU5hbWUgfSA9IG5leHRab2ROb2RlLl9kZWZcbiAgICAgICAgY29uc3QgaXNPcHRpb25hbCA9XG4gICAgICAgICAgbmV4dFpvZE5vZGVUeXBlTmFtZSA9PT0gXCJab2RPcHRpb25hbFwiIHx8IG5leHRab2ROb2RlLmlzT3B0aW9uYWwoKVxuXG4gICAgICAgIGNvbnN0IHByb3BlcnR5U2lnbmF0dXJlID0gZi5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbChrZXkpLFxuICAgICAgICAgIGlzT3B0aW9uYWwgPyBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuUXVlc3Rpb25Ub2tlbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdHlwZVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKG5leHRab2ROb2RlLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgYWRkSnNEb2NDb21tZW50KHByb3BlcnR5U2lnbmF0dXJlLCBuZXh0Wm9kTm9kZS5kZXNjcmlwdGlvbilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eVNpZ25hdHVyZVxuICAgICAgfSlcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR5cGVMaXRlcmFsTm9kZShtZW1iZXJzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RBcnJheVwiOiB7XG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVBcnJheVR5cGVOb2RlKHR5cGUpXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RFbnVtXCI6IHtcbiAgICAgIC8vIHouZW51bVsnYScsICdiJywgJ2MnXSAtPiAnYScgfCAnYicgfCAnY1xuICAgICAgY29uc3QgdHlwZXMgPSB6b2QuX2RlZi52YWx1ZXMubWFwKCh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgICBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUpKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kVW5pb25cIjoge1xuICAgICAgLy8gei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pIC0+IHN0cmluZyB8IG51bWJlclxuICAgICAgY29uc3Qgb3B0aW9uczogWm9kVHlwZUFueVtdID0gem9kLl9kZWYub3B0aW9uc1xuICAgICAgY29uc3QgdHlwZXM6IHRzLlR5cGVOb2RlW10gPSBvcHRpb25zLm1hcCgob3B0aW9uKSA9PlxuICAgICAgICB6b2RUb1RzTm9kZShvcHRpb24sIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCI6IHtcbiAgICAgIC8vIHouZGlzY3JpbWluYXRlZFVuaW9uKCdraW5kJywgW3oub2JqZWN0KHsga2luZDogei5saXRlcmFsKCdhJyksIGE6IHouc3RyaW5nKCkgfSksIHoub2JqZWN0KHsga2luZDogei5saXRlcmFsKCdiJyksIGI6IHoubnVtYmVyKCkgfSldKSAtPiB7IGtpbmQ6ICdhJywgYTogc3RyaW5nIH0gfCB7IGtpbmQ6ICdiJywgYjogbnVtYmVyIH1cbiAgICAgIGNvbnN0IG9wdGlvbnM6IFpvZFR5cGVBbnlbXSA9IFsuLi56b2QuX2RlZi5vcHRpb25zLnZhbHVlcygpXVxuICAgICAgY29uc3QgdHlwZXM6IHRzLlR5cGVOb2RlW10gPSBvcHRpb25zLm1hcCgob3B0aW9uKSA9PlxuICAgICAgICB6b2RUb1RzTm9kZShvcHRpb24sIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRWZmZWN0c1wiOiB7XG4gICAgICAvLyBpZ25vcmUgYW55IGVmZmVjdHMsIHRoZXkgd29uJ3QgZmFjdG9yIGludG8gdGhlIHR5cGVzXG4gICAgICBjb25zdCBub2RlID0gem9kVG9Uc05vZGUoXG4gICAgICAgIHpvZC5fZGVmLnNjaGVtYSxcbiAgICAgICAgLi4ub3RoZXJBcmd1bWVudHNcbiAgICAgICkgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE5hdGl2ZUVudW1cIjoge1xuICAgICAgY29uc3QgdHlwZSA9IGdldFR5cGVUeXBlXG5cbiAgICAgIGlmIChvcHRpb25zLm5hdGl2ZUVudW1zID09PSBcInVuaW9uXCIpIHtcbiAgICAgICAgLy8gYWxsb3cgb3ZlcnJpZGluZyB3aXRoIHRoaXMgb3B0aW9uXG4gICAgICAgIGlmICh0eXBlKSByZXR1cm4gbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlKHR5cGUpXG5cbiAgICAgICAgY29uc3QgdHlwZXMgPSBPYmplY3QudmFsdWVzKHpvZC5fZGVmLnZhbHVlcykubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKHZhbHVlKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlU3RyaW5nTGl0ZXJhbCh2YWx1ZSBhcyBzdHJpbmcpKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKHR5cGVzKVxuICAgICAgfVxuXG4gICAgICAvLyB6Lm5hdGl2ZUVudW0oRnJ1aXRzKSAtPiBGcnVpdHNcbiAgICAgIC8vIGNhbiByZXNvbHZlIEZydWl0cyBpbnRvIHN0b3JlIGFuZCB1c2VyIGNhbiBoYW5kbGUgZW51bXNcbiAgICAgIGlmICghdHlwZSkgcmV0dXJuIGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG5cbiAgICAgIGlmIChvcHRpb25zLm5hdGl2ZUVudW1zID09PSBcInJlc29sdmVcIikge1xuICAgICAgICBjb25zdCBlbnVtTWVtYmVycyA9IE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgIHpvZC5fZGVmLnZhbHVlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+XG4gICAgICAgICkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaXRlcmFsID1cbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgICA/IGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwodmFsdWUpXG4gICAgICAgICAgICAgIDogZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKVxuXG4gICAgICAgICAgcmV0dXJuIGYuY3JlYXRlRW51bU1lbWJlcihnZXRJZGVudGlmaWVyT3JTdHJpbmdMaXRlcmFsKGtleSksIGxpdGVyYWwpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcih0eXBlKSkge1xuICAgICAgICAgIHN0b3JlLm5hdGl2ZUVudW1zLnB1c2goXG4gICAgICAgICAgICBmLmNyZWF0ZUVudW1EZWNsYXJhdGlvbih1bmRlZmluZWQsIHR5cGUsIGVudW1NZW1iZXJzKVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZ2V0VHlwZSBvbiBuYXRpdmVFbnVtIG11c3QgcmV0dXJuIGFuIGlkZW50aWZpZXIgd2hlbiBuYXRpdmVFbnVtcyBpcyBcInJlc29sdmVcIidcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RPcHRpb25hbFwiOiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKSxcbiAgICAgIF0pXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE51bGxhYmxlXCI6IHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5pbm5lclR5cGUsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG4gICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKFtcbiAgICAgICAgaW5uZXJUeXBlLFxuICAgICAgICBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZU51bGwoKSksXG4gICAgICBdKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RUdXBsZVwiOiB7XG4gICAgICAvLyB6LnR1cGxlKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSkgLT4gW3N0cmluZywgbnVtYmVyXVxuICAgICAgY29uc3QgdHlwZXMgPSB6b2QuX2RlZi5pdGVtcy5tYXAoKG9wdGlvbjogWm9kVHlwZUFueSkgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR1cGxlVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFJlY29yZFwiOiB7XG4gICAgICAvLyB6LnJlY29yZCh6Lm51bWJlcigpKSAtPiB7IFt4OiBzdHJpbmddOiBudW1iZXIgfVxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZUxpdGVyYWxOb2RlKFtcbiAgICAgICAgZi5jcmVhdGVJbmRleFNpZ25hdHVyZShcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihcInhcIiksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHZhbHVlVHlwZVxuICAgICAgICApLFxuICAgICAgXSlcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kTWFwXCI6IHtcbiAgICAgIC8vIHoubWFwKHouc3RyaW5nKCkpIC0+IE1hcDxzdHJpbmc+XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi52YWx1ZVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3Qga2V5VHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLmtleVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJNYXBcIiksIFtcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgXSlcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kU2V0XCI6IHtcbiAgICAgIC8vIHouc2V0KHouc3RyaW5nKCkpIC0+IFNldDxzdHJpbmc+XG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiU2V0XCIpLCBbdHlwZV0pXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RJbnRlcnNlY3Rpb25cIjoge1xuICAgICAgLy8gei5udW1iZXIoKS5hbmQoei5zdHJpbmcoKSkgLT4gbnVtYmVyICYgc3RyaW5nXG4gICAgICBjb25zdCBsZWZ0ID0gem9kVG9Uc05vZGUoem9kLl9kZWYubGVmdCwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCByaWdodCA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnJpZ2h0LCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUludGVyc2VjdGlvblR5cGVOb2RlKFtsZWZ0LCByaWdodF0pXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RQcm9taXNlXCI6IHtcbiAgICAgIC8vIHoucHJvbWlzZSh6LnN0cmluZygpKSAtPiBQcm9taXNlPHN0cmluZz5cbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi50eXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiUHJvbWlzZVwiKSwgW1xuICAgICAgICB0eXBlLFxuICAgICAgXSlcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRnVuY3Rpb25cIjoge1xuICAgICAgLy8gei5mdW5jdGlvbigpLmFyZ3Moei5zdHJpbmcoKSkucmV0dXJucyh6Lm51bWJlcigpKSAtPiAoYXJnc18wOiBzdHJpbmcpID0+IG51bWJlclxuICAgICAgY29uc3QgYXJndW1lbnRUeXBlcyA9IHpvZC5fZGVmLmFyZ3MuX2RlZi5pdGVtcy5tYXAoXG4gICAgICAgIChhcmd1bWVudDogWm9kVHlwZUFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGFyZ3VtZW50VHlwZSA9IHpvZFRvVHNOb2RlKGFyZ3VtZW50LCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZi5jcmVhdGVJZGVudGlmaWVyKGBhcmdzXyR7aW5kZXh9YCksXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmd1bWVudFR5cGVcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICkgYXMgdHMuUGFyYW1ldGVyRGVjbGFyYXRpb25bXVxuXG4gICAgICBhcmd1bWVudFR5cGVzLnB1c2goXG4gICAgICAgIGYuY3JlYXRlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGYuY3JlYXRlVG9rZW4oU3ludGF4S2luZC5Eb3REb3REb3RUb2tlbiksXG4gICAgICAgICAgZi5jcmVhdGVJZGVudGlmaWVyKGBhcmdzXyR7YXJndW1lbnRUeXBlcy5sZW5ndGh9YCksXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGYuY3JlYXRlQXJyYXlUeXBlTm9kZShjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKSlcbiAgICAgICAgKVxuICAgICAgKVxuXG4gICAgICBjb25zdCByZXR1cm5UeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYucmV0dXJucywgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUZ1bmN0aW9uVHlwZU5vZGUoXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYXJndW1lbnRUeXBlcyxcbiAgICAgICAgcmV0dXJuVHlwZVxuICAgICAgKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2REZWZhdWx0XCI6IHtcbiAgICAgIC8vIHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZWZhdWx0KCdoaScpIC0+IHN0cmluZ1xuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5pbm5lclR5cGUsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkTm9kZXM6IHRzLk5vZGVbXSA9IFtdXG5cbiAgICAgIHR5cGUuZm9yRWFjaENoaWxkKChub2RlKSA9PiB7XG4gICAgICAgIGlmICghW1N5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZF0uaW5jbHVkZXMobm9kZS5raW5kKSkge1xuICAgICAgICAgIGZpbHRlcmVkTm9kZXMucHVzaChub2RlKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lZWRlZCB0byBzZXQgY2hpbGRyZW5cbiAgICAgIHR5cGUudHlwZXMgPSBmaWx0ZXJlZE5vZGVzXG5cbiAgICAgIHJldHVybiB0eXBlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQW55S2V5d29yZClcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IFByb2plY3QsIFN5bnRheEtpbmQgfSBmcm9tIFwidHMtbW9ycGhcIlxuaW1wb3J0ICogYXMgZXNidWlsZCBmcm9tIFwiZXNidWlsZFwiXG5pbXBvcnQgeyBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSB9IGZyb20gXCIuL2xpYi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZVwiXG5cbmludGVyZmFjZSBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzIHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIGFsbG93ZWRJbXBvcnRQYXR0ZXJucz86IHN0cmluZ1tdXG4gIG91dHB1dEZpbGU/OiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIG9ubHkgcm91dGVzIHRoYXQgcmV0dXJuIHRydWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKi9cbiAgZmlsdGVyUm91dGVzPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHJvdXRlcyB0aGF0IGhhdmUgYGV4Y2x1ZGVGcm9tT3BlbkFwaWAgc2V0IHRvIHRydWUgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqIFNldCB0aGlzIHRvIHRydWUgdG8gaW5jbHVkZSB0aGVtLlxuICAgKi9cbiAgaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlcz86IGJvb2xlYW5cbiAgZXNidWlsZE9wdGlvbnM/OiBlc2J1aWxkLkJ1aWxkT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgZXh0cmFjdFJvdXRlU3BlY3MgPSBhc3luYyAob3B0czogR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cykgPT4ge1xuICBjb25zdCB7IHBhY2thZ2VEaXIsIHBhdGhHbG9iID0gXCIvcGFnZXMvYXBpLyoqLyoudHNcIiB9ID0gb3B0c1xuICBjb25zdCBmdWxsUGF0aEdsb2IgPSBwYXRoLnBvc2l4LmpvaW4ocGFja2FnZURpciwgcGF0aEdsb2IpXG5cbiAgY29uc3QgcHJvamVjdCA9IG5ldyBQcm9qZWN0KHsgY29tcGlsZXJPcHRpb25zOiB7IGRlY2xhcmF0aW9uOiB0cnVlIH0gfSlcblxuICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvamVjdC5hZGRTb3VyY2VGaWxlc0F0UGF0aHMoZnVsbFBhdGhHbG9iKSkge1xuICAgIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBzb3VyY2VGaWxlLmdldEV4cG9ydEFzc2lnbm1lbnQoXG4gICAgICAoZCkgPT4gIWQuaXNFeHBvcnRFcXVhbHMoKVxuICAgIClcbiAgICBpZiAoIWRlZmF1bHRFeHBvcnQpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgY3VycmllZFdpdGhSb3V0ZVNwZWNDYWxsID0gZGVmYXVsdEV4cG9ydFxuICAgICAgLmdldEV4cHJlc3Npb24oKVxuICAgICAgLmFzS2luZChTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKVxuICAgIGlmICghY3VycmllZFdpdGhSb3V0ZVNwZWNDYWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB3aXRoUm91dGVTcGVjQ2FsbCA9IGN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbFxuICAgICAgLmdldEV4cHJlc3Npb24oKVxuICAgICAgLmFzS2luZChTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKVxuICAgIGlmICghd2l0aFJvdXRlU3BlY0NhbGwpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgW3JvdXRlU3BlY10gPSB3aXRoUm91dGVTcGVjQ2FsbC5nZXRBcmd1bWVudHMoKVxuICAgIGlmICghcm91dGVTcGVjKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHNvdXJjZUZpbGUuYWRkU3RhdGVtZW50cyhcbiAgICAgIGBleHBvcnQgY29uc3QgZXh0cmFjdGVkUm91dGVTcGVjID0gJHtyb3V0ZVNwZWMuZ2V0VGV4dCgpfWBcbiAgICApXG5cbiAgICBkZWZhdWx0RXhwb3J0LnJlbW92ZSgpXG5cbiAgICAvLyBSZW1vdmUgYWxsIHVudXNlZCBpbXBvcnRzIHNvIGZpbGUgY2FuIGJlIHRyZWUgc2hha2VuXG4gICAgLy8gKEFzc3VtZXMgYWxsIGltcG9ydHMgYXJlIGZyZWUgb2Ygc2lkZS1lZmZlY3RzKVxuICAgIGxldCBsYXN0V2lkdGg6IG51bWJlclxuICAgIGRvIHtcbiAgICAgIGxhc3RXaWR0aCA9IHNvdXJjZUZpbGUuZ2V0RnVsbFdpZHRoKClcbiAgICAgIC8vIE1heSBuZWVkIHRvIGNhbGwgdGhpcyBtdWx0aXBsZSB0aW1lc1xuICAgICAgc291cmNlRmlsZS5maXhVbnVzZWRJZGVudGlmaWVycygpXG4gICAgfSB3aGlsZSAobGFzdFdpZHRoICE9PSBzb3VyY2VGaWxlLmdldEZ1bGxXaWR0aCgpKVxuXG4gICAgY29uc3QgYWJzb2x1dGVQYWNrYWdlRGlyID0gcGF0aC5yZXNvbHZlKHBhY2thZ2VEaXIpXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShcbiAgICAgIGFic29sdXRlUGFja2FnZURpcixcbiAgICAgIHNvdXJjZUZpbGUuZ2V0RmlsZVBhdGgoKVxuICAgIClcbiAgICBwYXRocy5wdXNoKHJlbGF0aXZlUGF0aClcbiAgfVxuXG4gIGNvbnN0IHBhdGhUb0lkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgLy8gYWRkIHByZWZpeCB0byBhdm9pZCBzdGFydGluZyB3aXRoIGEgbnVtYmVyXG4gICAgcGF0aFRvSWRbcGF0aF0gPVxuICAgICAgXCJoYXNoXCIgKyBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUocGF0aCkuZGlnZXN0KFwiaGV4XCIpXG4gIH1cblxuICBjb25zdCBlbnRyeVBvaW50Q29udGVudCA9IGBcbiAgJHtwYXRoc1xuICAgIC5tYXAoKHApID0+IGBpbXBvcnQge2V4dHJhY3RlZFJvdXRlU3BlYyBhcyAke3BhdGhUb0lkW3BdfX0gZnJvbSBcIi4vJHtwfVwiYClcbiAgICAuam9pbihcIlxcblwiKX1cblxuICBleHBvcnQgY29uc3Qgcm91dGVzID0ge1xuICAgICR7cGF0aHNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgaHR0cFJvdXRlID0gKFxuICAgICAgICAgIG9wdHMubWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSA/P1xuICAgICAgICAgIGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlKG9wdHMuYXBpUHJlZml4KVxuICAgICAgICApKHApXG5cbiAgICAgICAgcmV0dXJuIGBcIiR7aHR0cFJvdXRlfVwiOiAke3BhdGhUb0lkW3BdfWBcbiAgICAgIH0pXG4gICAgICAuam9pbihcIixcXG5cIil9XG4gIH1cbiAgYFxuXG4gIC8vIENvcHkgYWxsb3dlZCBpbXBvcnQgZ2xvYnMgaW50byBwcm9qZWN0XG4gIGlmIChvcHRzLmFsbG93ZWRJbXBvcnRQYXR0ZXJucykge1xuICAgIHByb2plY3QuYWRkU291cmNlRmlsZXNBdFBhdGhzKG9wdHMuYWxsb3dlZEltcG9ydFBhdHRlcm5zKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgdHlwZXMgKC5kLnRzKVxuICBjb25zdCBlbnRyeVBvaW50ID0gcHJvamVjdC5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIFwiZXh0cmFjdGVkLXJvdXRlLXNwZWNzLnRzXCIsXG4gICAgZW50cnlQb2ludENvbnRlbnRcbiAgKVxuICBjb25zdCBlbWl0UmVzdWx0ID0gZW50cnlQb2ludC5nZXRFbWl0T3V0cHV0KHsgZW1pdE9ubHlEdHNGaWxlczogdHJ1ZSB9KVxuICBpZiAob3B0cy5vdXRwdXRGaWxlKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb25GaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHBhdGguZGlybmFtZShvcHRzLm91dHB1dEZpbGUpLFxuICAgICAgcGF0aC5iYXNlbmFtZShvcHRzLm91dHB1dEZpbGUpLnJlcGxhY2UoXCIubWpzXCIsIFwiXCIpLnJlcGxhY2UoXCIuanNcIiwgXCJcIikgK1xuICAgICAgICBcIi5kLnRzXCJcbiAgICApXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgZGVjbGFyYXRpb25GaWxlUGF0aCxcbiAgICAgIGVtaXRSZXN1bHQuZ2V0T3V0cHV0RmlsZXMoKVswXS5nZXRUZXh0KClcbiAgICApXG4gIH1cblxuICAvLyBHZW5lcmF0ZSB2YWx1ZXMgKC5qcylcbiAgY29uc3QgcGtnUmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgcGF0aC5qb2luKHBhY2thZ2VEaXIsIFwicGFja2FnZS5qc29uXCIpLFxuICAgIFwidXRmLThcIlxuICApXG4gIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UocGtnUmF3KVxuXG4gIGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgIC4uLm9wdHMuZXNidWlsZE9wdGlvbnMsXG4gICAgc3RkaW46IHtcbiAgICAgIGNvbnRlbnRzOiBlbnRyeVBvaW50Q29udGVudCxcbiAgICAgIHJlc29sdmVEaXI6IHBhdGgucmVzb2x2ZShwYWNrYWdlRGlyKSxcbiAgICB9LFxuICAgIG91dGZpbGU6IG9wdHMub3V0cHV0RmlsZSxcbiAgICBidW5kbGU6IHRydWUsXG4gICAgcGxhdGZvcm06IFwibm9kZVwiLFxuICAgIGZvcm1hdDogXCJlc21cIixcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICBleHRlcm5hbDogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocGtnLmRlcGVuZGVuY2llcyksXG4gICAgICAuLi5PYmplY3Qua2V5cyhwa2cuZGV2RGVwZW5kZW5jaWVzKSxcbiAgICAgIC4uLihvcHRzLmVzYnVpbGRPcHRpb25zPy5leHRlcm5hbCA/PyBbXSksXG4gICAgXSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICAvLyBXaXRoIHRoaXMgcGx1Z2luLCBlc2J1aWxkIHdpbGwgbmV2ZXIgdG91Y2ggdGhlIGFjdHVhbCBmaWxlc3lzdGVtIGFuZCB0aHVzIGNhbm5vdCBpbnRlcmFjdCB3aXRoIGltcG9ydHMgdGhhdCBkb24ndCBtYXRjaCBhbGxvd2VkSW1wb3J0UGF0dGVybnNbXS5cbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJyZXNvbHZlLXZpcnR1YWwtZnNcIixcbiAgICAgICAgc2V0dXAoYnVpbGQpIHtcbiAgICAgICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IC8uKi8gfSwgKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcHJvamVjdC5nZXRTb3VyY2VGaWxlKGFyZ3MucGF0aCk/LmdldEZ1bGxUZXh0KClcbiAgICAgICAgICAgIGlmICghY29udGVudHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogXCJleHBvcnQgZGVmYXVsdCB7fVwiLFxuICAgICAgICAgICAgICAgIGxvYWRlcjogXCJ0c1wiLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnRzLFxuICAgICAgICAgICAgICBsb2FkZXI6IFwidHNcIixcbiAgICAgICAgICAgICAgcmVzb2x2ZURpcjogcGF0aC5kaXJuYW1lKGFyZ3MucGF0aCksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi4ob3B0cy5lc2J1aWxkT3B0aW9ucz8ucGx1Z2lucyA/PyBbXSksXG4gICAgXSxcbiAgfSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFBQTs7O0FDQUE7QUFBQSxPQUFPLFFBQVE7QUFDZjtBQUFBLEVBQ0U7QUFBQSxPQUdLO0FBRVAsU0FBUyxLQUFBQSxVQUFTOzs7QUNQbEI7QUFBQSxPQUFPQyxXQUFVOzs7QUNBakI7QUFBQSxPQUFPLFVBQVU7QUFFVixJQUFNLGdDQUNYLENBQUMsYUFBcUIsV0FDdEIsQ0FBQyxjQUFzQjtBQUNyQixRQUFNLFFBQVEsVUFFWCxRQUFRLFNBQVMsR0FBRyxFQUVwQixRQUFRLE9BQU8sRUFBRSxFQUVqQixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLFlBQVksRUFBRSxFQUV0QixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLFNBQVMsRUFBRSxFQUVuQixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLGlCQUFpQixFQUFFO0FBRTlCLFNBQU8sS0FBSyxLQUFLLFlBQVksS0FBSztBQUNwQzs7O0FEYkssSUFBTSx1QkFBdUIsT0FBTyxTQU1KO0FBQ3JDLFFBQU0sU0FBUyxNQUFNLCtDQUFPLDZCQUFVO0FBQ3RDLFFBQU0sVUFBVSxNQUFNLCtDQUFPLDZCQUFXO0FBQ3hDLFFBQU07QUFB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QixnQkFBQUEsSUFBa0M7QUFDbkQsZ0JBQUksQ0FBQyxVQUFVO0FBQ2IscUJBQU87QUFBQSxnQkFDTCxVQUFVO0FBQUEsZ0JBQ1YsUUFBUTtBQUFBLGNBQ1Y7QUFBQSxZQUNGO0FBRUEsbUJBQU87QUFBQSxjQUNMO0FBQUEsY0FDQSxRQUFRO0FBQUEsY0FDUixZQUFZRixNQUFLLFFBQVEsS0FBSyxJQUFJO0FBQUEsWUFDcEM7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSSxnQkFBSyxtQkFBTCxtQkFBcUIsWUFBckIsWUFBZ0MsQ0FBQztBQUFBLElBQ3ZDO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbInoiLCAicGF0aCIsICJwYXRoIiwgInBhdGgiLCAiZGVkZW50IiwgInBhdGgiLCAiZGVkZW50IiwgIl9hIiwgInoiLCAiZnMiLCAiZGVkZW50IiwgInBhcnNlRGVzY3JpcHRpb24iLCAib3B0aW9ucyIsICJ6IiwgIl8iLCAiZnMiLCAicGF0aCIsICJTeW50YXhLaW5kIiwgInBhdGgiLCAiU3ludGF4S2luZCIsICJfYSIsICJidWlsZCJdCn0K
1659
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9pbmRleC50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2UudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi96b2Qtb3BlbmFwaS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvZnJvbnQtbWF0dGVyLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1vcGVuYXBpL2VtYmVkLXNjaGVtYS1yZWZlcmVuY2VzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvZmVybi1zZGstdXRpbHMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtcm91dGUtdHlwZXMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL3pvZC10by10cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdGUtb3BlbmFwaVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1yb3V0ZS10eXBlc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hc1wiXG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7XG4gIE9wZW5BcGlCdWlsZGVyLFxuICBPcGVyYXRpb25PYmplY3QsXG4gIFBhcmFtZXRlck9iamVjdCxcbn0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCB7IFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyBnZW5lcmF0ZVNjaGVtYSB9IGZyb20gXCIuLi9saWIvem9kLW9wZW5hcGlcIlxuaW1wb3J0IHsgZW1iZWRTY2hlbWFSZWZlcmVuY2VzIH0gZnJvbSBcIi4vZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXNcIlxuaW1wb3J0IHsgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhIH0gZnJvbSBcIi4vZmVybi1zZGstdXRpbHNcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4uL2xpYi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcbmltcG9ydCB7IHByZWZpeE9iamVjdEtleXNXaXRoWCB9IGZyb20gXCIuLi91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14XCJcbmltcG9ydCB7IGRhc2hpZnlPYmplY3RLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXNcIlxuaW1wb3J0IHsgZ2V0VHlwZU5hbWUgfSBmcm9tIFwiLi4vLi4vbGliL3pvZC1jb21wYXRcIlxuXG5mdW5jdGlvbiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBjb25zdCBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIGZpcnN0Q2hhciArIHN0ci5zbGljZSgxKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAucmVwbGFjZSgvLS9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgdHJhbnNmb3JtZWRQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gQnlQYXJhbVxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwYXJ0LnNsaWNlKDEsIC0xKVxuICAgICAgY29uc3Qgd29yZHMgPSBzZXJ2aWNlTmFtZS5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGBCeSR7Y2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpfWBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcGlfcGF0aCB0byBBcGlQYXRoXG4gICAgICBjb25zdCB3b3JkcyA9IHBhcnQuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZSh0cmFuc2Zvcm1lZFBhcnRzLmpvaW4oXCJcIikpXG59XG5cbmZ1bmN0aW9uIHBhc2NhbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQuc3BsaXQoXCIgXCIpXG4gIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcbiAgKVxuICBjb25zdCBwYXNjYWxDYXNlU3RyaW5nID0gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gIHJldHVybiBwYXNjYWxDYXNlU3RyaW5nXG59XG5cbmludGVyZmFjZSBUYWdPcHRpb24ge1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkb2VzUm91dGVIYXZlVGFnPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlT3BlbkFQSU9wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICB0YWdzPzogQXJyYXk8VGFnT3B0aW9uPlxuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gT3BlbkFQSSBzcGVjIGZyb20gdGhlIE5leHQuanMgQVBJIHJvdXRlcy5cbiAqXG4gKiBZb3Ugbm9ybWFsbHkgaW52b2tlIHRoaXMgd2l0aCBgbmV4dGFwaSBnZW5lcmF0ZS1vcGVuYXBpYCBpbiBhXG4gKiBcImJ1aWxkOm9wZW5hcGlcIiBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQVBJKG9wdHM6IEdlbmVyYXRlT3BlbkFQSU9wdHMpIHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgeyBvdXRwdXRGaWxlLCB0YWdzID0gW10gfSA9IG9wdHNcblxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgLy8gVE9ETyBkZXRlY3QgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNldHVwcyBhbmQgb3V0cHV0IGRpZmZlcmVudCBBUElzXG4gIGNvbnN0IHsgc2V0dXBQYXJhbXM6IGdsb2JhbFNldHVwUGFyYW1zIH0gPSBmaWxlcGF0aFRvUm91dGVGbi52YWx1ZXMoKS5uZXh0KClcbiAgICAudmFsdWUgYXMgeyBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXMgfVxuXG4gIGNvbnN0IHNlY3VyaXR5U2NoZW1lcyA9IGdsb2JhbFNldHVwUGFyYW1zLnNlY3VyaXR5U2NoZW1hcyA/PyB7fVxuICBjb25zdCBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZSA9IHt9XG4gIGZvciAoY29uc3QgYXV0aE5hbWUgb2YgT2JqZWN0LmtleXMoZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXApKSB7XG4gICAgY29uc3QgbXcgPSBnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcFthdXRoTmFtZV1cbiAgICBpZiAobXcuc2VjdXJpdHlTY2hlbWEpIHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lc1thdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eVNjaGVtYVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBcIiR7YXV0aE5hbWV9XCIgaGFzIG5vIHNlY3VyaXR5U2NoZW1hLiBZb3UgY2FuIGRlZmluZSB0aGlzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBhZnRlciB0aGUgZXhwb3J0IGRvLi4uIFxcblxcbm15TWlkZGxld2FyZS5zZWN1cml0eVNjaGVtYSA9IHtcXG4gIHR5cGU6IFwiaHR0cFwiXFxuICBzY2hlbWU6IFwiYmVhcmVyXCJcXG4gIGJlYXJlckZvcm1hdDogXCJKV1RcIlxcbiAvLyBvciBBUEkgVG9rZW4gZXRjLlxcbn1cXG5cXG5Zb3UgY2FuIGFsc28gZGVmaW5lIFwic2VjdXJpdHlPYmplY3RzXCIgdGhpcyB3YXksIGlmIHlvdSB3YW50IHRvIG1ha2UgdGhlIGVuZHBvaW50IHN1cHBvcnQgbXVsdGlwbGUgbW9kZXMgb2YgYXV0aGVudGljYXRpb24uXFxuXFxuYFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlPYmplY3RzIHx8IFtcbiAgICAgIHtcbiAgICAgICAgW2F1dGhOYW1lXTogW10sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGdsb2JhbFNjaGVtYXMgPSB7fVxuICBmb3IgKGNvbnN0IFtzY2hlbWFOYW1lLCB6b2RTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIGdsb2JhbFNldHVwUGFyYW1zLmdsb2JhbFNjaGVtYXMgPz8ge31cbiAgKSkge1xuICAgIGdsb2JhbFNjaGVtYXNbc2NoZW1hTmFtZV0gPSBnZW5lcmF0ZVNjaGVtYSh6b2RTY2hlbWEpXG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnbG9iYWxTY2hlbWFzKSkge1xuICAgIGlmIChrZXkgPT09IFwiYmF0Y2hcIikge1xuICAgICAgY29uc3Qgc2NoZW1hV2l0aFJlZmVyZW5jZXMgPSBlbWJlZFNjaGVtYVJlZmVyZW5jZXModmFsdWUsIGdsb2JhbFNjaGVtYXMpXG4gICAgICBnbG9iYWxTY2hlbWFzW2tleV0gPSBzY2hlbWFXaXRoUmVmZXJlbmNlc1xuICAgIH1cbiAgfVxuXG4gIC8vIEJ1aWxkIE9wZW5BUEkgc3BlY1xuICBjb25zdCBidWlsZGVyID0gT3BlbkFwaUJ1aWxkZXIuY3JlYXRlKHtcbiAgICBvcGVuYXBpOiBcIjMuMC4wXCIsXG4gICAgaW5mbzoge1xuICAgICAgdGl0bGU6IGdsb2JhbFNldHVwUGFyYW1zLmFwaU5hbWUsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgfSxcbiAgICBzZXJ2ZXJzOiBbXG4gICAgICB7XG4gICAgICAgIHVybDogZ2xvYmFsU2V0dXBQYXJhbXMucHJvZHVjdGlvblNlcnZlclVybCB8fCBcImh0dHBzOi8vZXhhbXBsZS5jb21cIixcbiAgICAgIH0sXG4gICAgXSxcbiAgICB0YWdzOiB0YWdzLm1hcCgodGFnKSA9PiAoeyBuYW1lOiB0YWcubmFtZSwgZGVzY3JpcHRpb246IHRhZy5kZXNjcmlwdGlvbiB9KSksXG4gICAgcGF0aHM6IHt9LFxuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lcyxcbiAgICAgIHNjaGVtYXM6IGdsb2JhbFNjaGVtYXMsXG4gICAgfSxcbiAgfSlcblxuICBmb3IgKGNvbnN0IFtcbiAgICBmaWxlX3BhdGgsXG4gICAgeyBzZXR1cFBhcmFtcywgcm91dGVTcGVjLCByb3V0ZTogcm91dGVQYXRoIH0sXG4gIF0gb2YgZmlsZXBhdGhUb1JvdXRlRm4pIHtcbiAgICBjb25zdCBtZXRob2RzID0gcm91dGVTcGVjLm1ldGhvZHNcbiAgICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSBpdCBoYXMgbm8gbWV0aG9kcy5gKVxuICAgICAgKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsZXQgZGVzY3JpcHRpb24gPSByb3V0ZVNwZWMuZGVzY3JpcHRpb25cbiAgICBsZXQgZGVzY3JpcHRpb25NZXRhZGF0YToge1xuICAgICAgcmVzcG9uc2Vfa2V5Pzogc3RyaW5nXG4gICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICB9ID0ge31cblxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKS50cmltKClcblxuICAgICAgaWYgKHRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSB7XG4gICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gICAgICAgIGRlc2NyaXB0aW9uTWV0YWRhdGEgPSBhdHRyaWJ1dGVzXG4gICAgICAgIGRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gdHJpbW1lZERlc2NyaXB0aW9uXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0dGVkRGVzY3JpcHRpb25NZXRhZGF0YSA9IHByZWZpeE9iamVjdEtleXNXaXRoWChcbiAgICAgIGRhc2hpZnlPYmplY3RLZXlzKGRlc2NyaXB0aW9uTWV0YWRhdGEpXG4gICAgKVxuXG4gICAgY29uc3QgbWV0aG9kUm91dGVzOiBSZWNvcmQ8c3RyaW5nLCBPcGVyYXRpb25PYmplY3Q+ID0ge31cblxuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGlzUG9zdE9yUHV0T3JQYXRjaCA9IFtcIlBPU1RcIiwgXCJQVVRcIiwgXCJQQVRDSFwiXS5pbmNsdWRlcyhtZXRob2QpXG5cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgICAgbGV0IGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hXG4gICAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5ID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgICBpZiAocm91dGVTcGVjLmpzb25Cb2R5ICYmIHJvdXRlU3BlYy5jb21tb25QYXJhbXMpIHtcbiAgICAgICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IChcbiAgICAgICAgICAgIHJvdXRlU3BlYy5qc29uQm9keSBhcyB6LlpvZE9iamVjdDxhbnk+XG4gICAgICAgICAgKS5tZXJnZShyb3V0ZVNwZWMuY29tbW9uUGFyYW1zIGFzIHouWm9kT2JqZWN0PGFueT4pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5XG4gICAgICB9XG5cbiAgICAgIGxldCBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWFcbiAgICAgIGlmIChpc1Bvc3RPclB1dE9yUGF0Y2gpIHtcbiAgICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPVxuICAgICAgICAgIHJvdXRlU3BlYy5xdWVyeVBhcmFtcyA/PyByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG5cbiAgICAgICAgaWYgKHJvdXRlU3BlYy5xdWVyeVBhcmFtcyAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gKFxuICAgICAgICAgICAgcm91dGVTcGVjLnF1ZXJ5UGFyYW1zIGFzIHouWm9kT2JqZWN0PGFueT5cbiAgICAgICAgICApLm1lcmdlKHJvdXRlU3BlYy5jb21tb25QYXJhbXMgYXMgei5ab2RPYmplY3Q8YW55PilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByb3V0ZTogT3BlcmF0aW9uT2JqZWN0ID0ge1xuICAgICAgICAuLi5yb3V0ZVNwZWMub3BlbkFwaU1ldGFkYXRhLFxuICAgICAgICAuLi5mb3JtYXR0ZWREZXNjcmlwdGlvbk1ldGFkYXRhLFxuICAgICAgICBzdW1tYXJ5OiByb3V0ZVBhdGgsXG4gICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICBvcGVyYXRpb25JZDogYCR7dHJhbnNmb3JtUGF0aFRvT3BlcmF0aW9uSWQocm91dGVQYXRoKX0ke3Bhc2NhbENhc2UoXG4gICAgICAgICAgbWV0aG9kXG4gICAgICAgICl9YCxcbiAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPS1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgNDAwOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJCYWQgUmVxdWVzdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgNDAxOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJVbmF1dGhvcml6ZWRcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzZWN1cml0eTogQXJyYXkuaXNBcnJheShyb3V0ZVNwZWMuYXV0aClcbiAgICAgICAgICA/IHJvdXRlU3BlYy5hdXRoXG4gICAgICAgICAgICAgIC5tYXAoKGF1dGhUeXBlKSA9PiBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVthdXRoVHlwZV0pXG4gICAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICA6IHNlY3VyaXR5T2JqZWN0c0ZvckF1dGhUeXBlW3JvdXRlU3BlYy5hdXRoXSxcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICAgIHJvdXRlLnJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIFwiYXBwbGljYXRpb24vanNvblwiOiB7XG4gICAgICAgICAgICAgIHNjaGVtYTogZ2VuZXJhdGVTY2hlbWEoYm9keV90b19nZW5lcmF0ZV9zY2hlbWEgYXMgYW55KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSBhcyBhbnkpXG4gICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlck9iamVjdFtdID0gT2JqZWN0LmtleXMoXG4gICAgICAgICAgICBzY2hlbWEucHJvcGVydGllcyBhcyBhbnlcbiAgICAgICAgICApLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgaW46IFwicXVlcnlcIixcbiAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEucHJvcGVydGllcyFbbmFtZV0sXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiBzY2hlbWEucmVxdWlyZWQ/LmluY2x1ZGVzKG5hbWUpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByb3V0ZS5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyc1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsganNvblJlc3BvbnNlIH0gPSByb3V0ZVNwZWNcbiAgICAgIGNvbnN0IHsgYWRkT2tTdGF0dXMgPSB0cnVlIH0gPSBzZXR1cFBhcmFtc1xuXG4gICAgICBpZiAoanNvblJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGpzb25SZXNwb25zZVR5cGVOYW1lID0gZ2V0VHlwZU5hbWUoanNvblJlc3BvbnNlKVxuICAgICAgICBpZiAoanNvblJlc3BvbnNlVHlwZU5hbWUgIT09IFwiWm9kT2JqZWN0XCIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSB0aGUgcmVzcG9uc2UgaXMgbm90IGEgWm9kT2JqZWN0LmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEoXG4gICAgICAgICAgYWRkT2tTdGF0dXMgJiYganNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICAgID8ganNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgOiBqc29uUmVzcG9uc2VcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IHNjaGVtYVdpdGhSZWZlcmVuY2VzID0gZW1iZWRTY2hlbWFSZWZlcmVuY2VzKFxuICAgICAgICAgIHJlc3BvbnNlU2NoZW1hLFxuICAgICAgICAgIGdsb2JhbFNjaGVtYXNcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChyb3V0ZS5yZXNwb25zZXMgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBub3QgaGFyZGNvZGUgMjAwIGhlcmVcbiAgICAgICAgICByb3V0ZS5yZXNwb25zZXNbMjAwXS5jb250ZW50ID0ge1xuICAgICAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHtcbiAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFXaXRoUmVmZXJlbmNlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJvdXRlLnRhZ3MgPSBbXVxuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICBpZiAodGFnLmRvZXNSb3V0ZUhhdmVUYWcgJiYgdGFnLmRvZXNSb3V0ZUhhdmVUYWcocm91dGUuc3VtbWFyeSB8fCBcIlwiKSkge1xuICAgICAgICAgIHJvdXRlLnRhZ3MucHVzaCh0YWcubmFtZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRob2RzTWFwcGVkVG9GZXJuU2RrTWV0YWRhdGEgPSBhd2FpdCBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoe1xuICAgICAgICBtZXRob2RzOiBbbWV0aG9kXSwgLy8gT25seSBwYXNzIHRoaXMgc3BlY2lmaWMgbWV0aG9kXG4gICAgICAgIHBhdGg6IHJvdXRlUGF0aCxcbiAgICAgICAgc2RrUmV0dXJuVmFsdWU6XG4gICAgICAgICAgZGVzY3JpcHRpb25NZXRhZGF0YT8ucmVzcG9uc2Vfa2V5ID8/IHJvdXRlU3BlYy5zZGtSZXR1cm5WYWx1ZSxcbiAgICAgIH0pXG5cbiAgICAgIE9iamVjdC5hc3NpZ24ocm91dGUsIG1ldGhvZHNNYXBwZWRUb0Zlcm5TZGtNZXRhZGF0YVttZXRob2RdKVxuICAgICAgbWV0aG9kUm91dGVzW21ldGhvZC50b0xvd2VyQ2FzZSgpXSA9IHJvdXRlXG4gICAgfVxuXG4gICAgYnVpbGRlci5hZGRQYXRoKHJvdXRlUGF0aCwgbWV0aG9kUm91dGVzKVxuICB9XG5cbiAgaWYgKG91dHB1dEZpbGUpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUob3V0cHV0RmlsZSwgYnVpbGRlci5nZXRTcGVjQXNKc29uKHVuZGVmaW5lZCwgMikpXG4gIH1cblxuICByZXR1cm4gYnVpbGRlci5nZXRTcGVjQXNKc29uKHVuZGVmaW5lZCwgMilcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IFJvdXRlU3BlYywgU2V0dXBQYXJhbXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVJbmZvIHtcbiAgc2V0dXBQYXJhbXM6IFNldHVwUGFyYW1zXG4gIHJvdXRlU3BlYzogUm91dGVTcGVjXG4gIHJvdXRlRm46IEZ1bmN0aW9uXG4gIHJvdXRlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlUm91dGVzSW5QYWNrYWdlID0gYXN5bmMgKG9wdHM6IHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlcz86IGJvb2xlYW5cbn0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFJvdXRlSW5mbz4+ID0+IHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgZ2xvYmJ5ID0gKGF3YWl0IGltcG9ydChcImdsb2JieVwiKSkuZ2xvYmJ5XG4gIGNvbnN0IHtcbiAgICBwYWNrYWdlRGlyLFxuICAgIHBhdGhHbG9iID0gXCIvcGFnZXMvYXBpLyoqLyoudHNcIixcbiAgICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlID0gZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUob3B0cy5hcGlQcmVmaXgpLFxuICB9ID0gb3B0c1xuICAvLyBMb2FkIGFsbCByb3V0ZSBzcGVjc1xuICBjb25zdCBmdWxsUGF0aEdsb2IgPSBwYXRoLnBvc2l4LmpvaW4ocGFja2FnZURpciwgcGF0aEdsb2IpXG4gIGNvbnNvbGUubG9nKGBzZWFyY2hpbmcgXCIke2Z1bGxQYXRoR2xvYn1cIi4uLmApXG4gIGNvbnN0IGZpbGVwYXRocyA9IGF3YWl0IGdsb2JieShgJHtmdWxsUGF0aEdsb2J9YClcbiAgY29uc29sZS5sb2coYGZvdW5kICR7ZmlsZXBhdGhzLmxlbmd0aH0gZmlsZXNgKVxuICBpZiAoZmlsZXBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gZmlsZXMgZm91bmQgYXQgXCIke2Z1bGxQYXRoR2xvYn1cImApXG4gIH1cbiAgY29uc3QgZmlsZXBhdGhUb1JvdXRlRm4gPSBuZXcgTWFwPHN0cmluZywgUm91dGVJbmZvPigpXG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZmlsZXBhdGhzLm1hcChhc3luYyAocCkgPT4ge1xuICAgICAgY29uc3QgeyBkZWZhdWx0OiByb3V0ZUZuIH0gPSBhd2FpdCByZXF1aXJlKHBhdGgucmVzb2x2ZShwKSlcblxuICAgICAgaWYgKHJvdXRlRm4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJvdXRlRm4uX3JvdXRlU3BlYz8uZXhjbHVkZUZyb21PcGVuQXBpICYmXG4gICAgICAgICAgIW9wdHMuaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlc1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgIGBJZ25vcmluZyBcIiR7cH0gYmVjYXVzZSBpdCB3YXMgZXhjbHVkZWQgZnJvbSBPcGVuQVBJIGdlbmVyYXRpb25cImBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb3V0ZUZuLl9zZXR1cFBhcmFtcykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYElnbm9yaW5nIFwiJHtwfVwiIGJlY2F1c2UgaXQgd2Fzbid0IGNyZWF0ZWQgd2l0aCB3aXRoUm91dGVTcGVjYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBmaWxlcGF0aFRvUm91dGVGbi5zZXQocCwge1xuICAgICAgICAgIHNldHVwUGFyYW1zOiByb3V0ZUZuLl9zZXR1cFBhcmFtcyxcbiAgICAgICAgICByb3V0ZVNwZWM6IHJvdXRlRm4uX3JvdXRlU3BlYyxcbiAgICAgICAgICByb3V0ZTogbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShwKSxcbiAgICAgICAgICByb3V0ZUZuLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgQ291bGRuJ3QgZmluZCByb3V0ZSAke3B9YCkpXG4gICAgICB9XG4gICAgfSlcbiAgKVxuXG4gIHJldHVybiBmaWxlcGF0aFRvUm91dGVGblxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlID1cbiAgKGFwaV9wcmVmaXg6IHN0cmluZyA9IFwiL2FwaVwiKSA9PlxuICAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb3V0ZSA9IGZpbGVfcGF0aFxuICAgICAgLy8gcmVwbGFjZSAuLyBpZiBpdCBzdGFydHMgd2l0aCAuL1xuICAgICAgLnJlcGxhY2UoL15cXC5cXC8vLCBcIi9cIilcbiAgICAgIC8vIHJlcGxhY2Ugc3RhcnRpbmcgL1xuICAgICAgLnJlcGxhY2UoL15cXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvc3JjIGlmIGl0IHN0YXJ0cyB3aXRoIC9zcmNcbiAgICAgIC5yZXBsYWNlKC9ec3JjXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL3BhZ2VzIGlmIGl0IHN0YXJ0cyB3aXRoIC9wYWdlc1xuICAgICAgLnJlcGxhY2UoL15wYWdlc1xcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9hcGkgaWYgaXQgc3RhcnRzIHdpdGggL2FwaVxuICAgICAgLnJlcGxhY2UoL15hcGlcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAudHMgaWYgaXQgZW5kcyB3aXRoIC50c1xuICAgICAgLnJlcGxhY2UoL1xcLnRzJC8sIFwiXCIpXG4gICAgICAvLyByZW1vdmUgcHVibGljIHJlZmVyZW5jZVxuICAgICAgLnJlcGxhY2UoXCJwdWJsaWNcIiwgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgaW5kZXggaWYgaXQgZW5kcyB3aXRoIGluZGV4XG4gICAgICAucmVwbGFjZSgvXFwvXFxpbmRleCg/IS4pLywgXCJcIilcblxuICAgIHJldHVybiBwYXRoLmpvaW4oYXBpX3ByZWZpeCwgcm91dGUpXG4gIH1cbiIsICIvKipcbiAqIFpvZCBPcGVuQVBJIEdlbmVyYXRvci5cbiAqXG4gKiBWZW5kb3JlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmF0aW5lL3pvZC1wbHVnaW5zXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQnJpYW4gTWNCcmlkZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTY2hlbWFPYmplY3QsIFNjaGVtYU9iamVjdFR5cGUgfSBmcm9tIFwib3BlbmFwaTMtdHMvb2FzMzFcIlxuaW1wb3J0IHsgeiwgWm9kVHlwZUFueSB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4vZnJvbnQtbWF0dGVyXCJcbmltcG9ydCBkZWRlbnQgZnJvbSBcImRlZGVudFwiXG5pbXBvcnQgeyBwcmVmaXhPYmplY3RLZXlzV2l0aFggfSBmcm9tIFwiLi4vdXRpbHMvcHJlZml4LW9iamVjdC1rZXlzLXdpdGgteFwiXG5pbXBvcnQgeyBkYXNoaWZ5T2JqZWN0S2V5cyB9IGZyb20gXCIuLi91dGlscy9kYXNoaWZ5LW9iamVjdC1rZXlzXCJcbmltcG9ydCB7XG4gIGdldFR5cGVOYW1lLFxuICBnZXREZWYsXG4gIGdldEVmZmVjdHNTY2hlbWEsXG4gIGdldEVmZmVjdCxcbiAgZ2V0Q2hlY2tzLFxuICBnZXRJbm5lclR5cGUsXG4gIGdldEVudW1WYWx1ZXMsXG4gIGdldExpdGVyYWxWYWx1ZSxcbiAgZ2V0RGVmYXVsdFZhbHVlLFxuICBnZXRBcnJheUNvbnN0cmFpbnRzLFxuICBnZXRSZWNvcmRWYWx1ZVR5cGUsXG4gIGdldENhdGNoYWxsLFxuICBnZXRVbmtub3duS2V5cyxcbiAgZ2V0SW50ZXJzZWN0aW9uUGFydHMsXG4gIGdldFVuaW9uT3B0aW9ucyxcbiAgZ2V0RGlzY3JpbWluYXRvcixcbiAgZ2V0QnJhbmRlZFR5cGUsXG4gIGdldFBpcGVsaW5lUGFydHMsXG4gIGdldFNoYXBlLFxufSBmcm9tIFwiLi4vLi4vbGliL3pvZC1jb21wYXRcIlxuXG4vLyBUeXBlIGFsaWFzIGZvciBab2QgMy80IGNvbXBhdGliaWxpdHlcbnR5cGUgQW55Wm9kT2JqZWN0ID0gei5ab2RPYmplY3Q8YW55PlxuXG4vLyBFeHRlbmRlZCBTY2hlbWFPYmplY3QgdGhhdCBpbmNsdWRlcyBPcGVuQVBJIDMuMCdzIG51bGxhYmxlIHByb3BlcnR5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxudHlwZSBFeHRlbmRlZFNjaGVtYU9iamVjdCA9IFNjaGVtYU9iamVjdCAmIHsgbnVsbGFibGU/OiBib29sZWFuIH1cbnR5cGUgQW5hdGluZVNjaGVtYU9iamVjdCA9IEV4dGVuZGVkU2NoZW1hT2JqZWN0ICYgeyBoaWRlRGVmaW5pdGlvbnM/OiBzdHJpbmdbXSB9XG5cbi8qKlxuICogU2hhbGxvdyBtZXJnZSBtdWx0aXBsZSBzY2hlbWEgb2JqZWN0cyBpbnRvIG9uZS5cbiAqIERlZXAgbWVyZ2UgaXMgbm90IG5lZWRlZCBzaW5jZSBtZXRhT3BlbkFwaSBvbmx5IGNvbnRhaW5zIGZsYXQgbWV0YWRhdGFcbiAqIChkZXNjcmlwdGlvbiwgZGVwcmVjYXRlZCwgeC0qIGV4dGVuc2lvbnMpLCBub3QgbmVzdGVkIHNjaGVtYSBzdHJ1Y3R1cmVzLlxuICovXG5mdW5jdGlvbiBtZXJnZVNjaGVtYXMoXG4gIC4uLnNjaGVtYXM6IEFycmF5PFBhcnRpYWw8RXh0ZW5kZWRTY2hlbWFPYmplY3Q+IHwgdW5kZWZpbmVkPlxuKTogRXh0ZW5kZWRTY2hlbWFPYmplY3Qge1xuICBjb25zdCByZXN1bHQ6IEV4dGVuZGVkU2NoZW1hT2JqZWN0ID0ge31cbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBzY2hlbWEpXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQXBpWm9kQW55IGV4dGVuZHMgWm9kVHlwZUFueSB7XG4gIG1ldGFPcGVuQXBpPzogQW5hdGluZVNjaGVtYU9iamVjdCB8IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxufVxuXG5pbnRlcmZhY2UgT3BlbkFwaVpvZEFueU9iamVjdCBleHRlbmRzIEFueVpvZE9iamVjdCB7XG4gIG1ldGFPcGVuQXBpPzogQW5hdGluZVNjaGVtYU9iamVjdCB8IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxufVxuXG5pbnRlcmZhY2UgUGFyc2luZ0FyZ3M8VD4ge1xuICB6b2RSZWY6IFRcbiAgc2NoZW1hczogQW5hdGluZVNjaGVtYU9iamVjdFtdXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbiAgaGlkZURlZmluaXRpb25zPzogc3RyaW5nW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEFwaTxUIGV4dGVuZHMgT3BlbkFwaVpvZEFueT4oXG4gIHNjaGVtYTogVCxcbiAgc2NoZW1hT2JqZWN0OiBBbmF0aW5lU2NoZW1hT2JqZWN0ID0ge31cbik6IFQge1xuICBzY2hlbWEubWV0YU9wZW5BcGkgPSBPYmplY3QuYXNzaWduKHNjaGVtYS5tZXRhT3BlbkFwaSB8fCB7fSwgc2NoZW1hT2JqZWN0KVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmZ1bmN0aW9uIGl0ZXJhdGVab2RPYmplY3Qoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbiAgaGlkZURlZmluaXRpb25zLFxufTogUGFyc2luZ0FyZ3M8T3BlbkFwaVpvZEFueU9iamVjdD4pIHtcbiAgLy8gR2V0IHNoYXBlIHVzaW5nIHRoZSBjb21wYXQgaGVscGVyICh3b3JrcyBpbiBib3RoIFpvZCAzIGFuZCA0KVxuICBjb25zdCBzaGFwZSA9IGdldFNoYXBlKHpvZFJlZiBhcyBab2RUeXBlQW55KSB8fCB7fVxuICBjb25zdCByZWR1Y2VkID0gT2JqZWN0LmtleXMoc2hhcGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiBoaWRlRGVmaW5pdGlvbnM/LmluY2x1ZGVzKGtleSkgPT09IGZhbHNlKVxuICAgIC5yZWR1Y2UoXG4gICAgICAoY2FycnksIGtleSkgPT4gKHtcbiAgICAgICAgLi4uY2FycnksXG4gICAgICAgIFtrZXldOiBnZW5lcmF0ZVNjaGVtYShzaGFwZVtrZXldLCB1c2VPdXRwdXQpLFxuICAgICAgfSksXG4gICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBTY2hlbWFPYmplY3Q+XG4gICAgKVxuXG4gIHJldHVybiByZWR1Y2VkXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmOiBPcGVuQXBpWm9kQW55KTogU2NoZW1hT2JqZWN0IHtcbiAgaWYgKCF6b2RSZWYuZGVzY3JpcHRpb24pIHJldHVybiB7fVxuICBjb25zdCB0cmltbWVkRGVzY3JpcHRpb24gPSBkZWRlbnQoem9kUmVmLmRlc2NyaXB0aW9uKVxuICBpZiAoIXRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKVxuICAgIHJldHVybiB7IGRlc2NyaXB0aW9uOiB6b2RSZWYuZGVzY3JpcHRpb24gfVxuICBjb25zdCB7IGF0dHJpYnV0ZXMsIGJvZHkgfSA9IHBhcnNlRnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKVxuICBjb25zdCBvdXRwdXQ6IFNjaGVtYU9iamVjdCA9IHt9XG4gIGlmIChib2R5LnRyaW0oKSkgb3V0cHV0LmRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiICYmIGF0dHJpYnV0ZXMgIT09IG51bGwpIHtcbiAgICBpZiAoXCJkZXByZWNhdGVkXCIgaW4gYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIG91dHB1dC5kZXByZWNhdGVkID0gdHJ1ZVxuICAgIH1cblxuICAgIE9iamVjdC5lbnRyaWVzKFxuICAgICAgcHJlZml4T2JqZWN0S2V5c1dpdGhYKGRhc2hpZnlPYmplY3RLZXlzKGF0dHJpYnV0ZXMpKVxuICAgICkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBvdXRwdXRba2V5XSA9IHZhbHVlXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cblxuZnVuY3Rpb24gcGFyc2VUcmFuc2Zvcm1hdGlvbih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGlubmVyU2NoZW1hID0gZ2V0RWZmZWN0c1NjaGVtYSh6b2RSZWYpXG4gIGNvbnN0IGlucHV0ID0gaW5uZXJTY2hlbWEgPyBnZW5lcmF0ZVNjaGVtYShpbm5lclNjaGVtYSwgdXNlT3V0cHV0KSA6IHt9XG5cbiAgbGV0IG91dHB1dCA9IFwidW5kZWZpbmVkXCJcbiAgY29uc3QgZWZmZWN0ID0gZ2V0RWZmZWN0KHpvZFJlZilcbiAgaWYgKHVzZU91dHB1dCAmJiBlZmZlY3QpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1FZmZlY3QgPSBlZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGVmZmVjdCA6IG51bGxcbiAgICBpZiAodHJhbnNmb3JtRWZmZWN0ICYmIFwidHJhbnNmb3JtXCIgaW4gdHJhbnNmb3JtRWZmZWN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBvdXRwdXQgPSB0eXBlb2YgdHJhbnNmb3JtRWZmZWN0LnRyYW5zZm9ybShcbiAgICAgICAgICBbXCJpbnRlZ2VyXCIsIFwibnVtYmVyXCJdLmluY2x1ZGVzKGAke2lucHV0LnR5cGV9YClcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBcInN0cmluZ1wiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgIDogXCJib29sZWFuXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogXCJvYmplY3RcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBcIm51bGxcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IFwiYXJyYXlcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgeyBhZGRJc3N1ZTogKCkgPT4gdW5kZWZpbmVkLCBwYXRoOiBbXSB9IC8vIFRPRE86IERpc2NvdmVyIGlmIGNvbnRleHQgaXMgbmVjZXNzYXJ5IGhlcmVcbiAgICAgICAgKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiovXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgLi4uKHpvZFJlZi5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHpvZFJlZi5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgLi4uaW5wdXQsXG4gICAgICAuLi4oW1wibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwiYm9vbGVhblwiLCBcIm51bGxcIl0uaW5jbHVkZXMob3V0cHV0KVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6IG91dHB1dCBhcyBcIm51bWJlclwiIHwgXCJzdHJpbmdcIiB8IFwiYm9vbGVhblwiIHwgXCJudWxsXCIsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9LFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVN0cmluZyh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kU3RyaW5nPik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGJhc2VTY2hlbWE6IFNjaGVtYU9iamVjdCA9IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICB9XG4gIGNvbnN0IGNoZWNrcyA9IGdldENoZWNrcyh6b2RSZWYpXG4gIGNoZWNrcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgLy8gR2V0IHRoZSBraW5kIC0gWm9kIDMgdXNlcyBpdGVtLmtpbmQsIFpvZCA0IHVzZXMgaXRlbS5jaGVjayAobm9ybWFsaXplZCBieSBnZXRDaGVja3MpXG4gICAgY29uc3Qga2luZCA9IGl0ZW0ua2luZCB8fCBpdGVtLmNoZWNrXG4gICAgLy8gR2V0IGZvcm1hdCBmb3IgWm9kIDQgc3RyaW5nIGZvcm1hdCBjaGVja3NcbiAgICBjb25zdCBmb3JtYXQgPSBpdGVtLmZvcm1hdFxuXG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImVtYWlsXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1dWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjdWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJjdWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcInVyaVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImRhdGUtdGltZVwiXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBab2QgNCB1c2VzIFwic3RyaW5nX2Zvcm1hdFwiIGFzIHRoZSBjaGVjayB0eXBlIHdpdGggZm9ybWF0IHByb3BlcnR5XG4gICAgICBjYXNlIFwic3RyaW5nX2Zvcm1hdFwiOlxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImVtYWlsXCIpIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJlbWFpbFwiXG4gICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PT0gXCJ1dWlkXCIpIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1dWlkXCJcbiAgICAgICAgZWxzZSBpZiAoZm9ybWF0ID09PSBcImN1aWRcIikgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImN1aWRcIlxuICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT09IFwidXJsXCIpIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1cmlcIlxuICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT09IFwiZGF0ZXRpbWVcIikgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImRhdGUtdGltZVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibGVuZ3RoXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluTGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBiYXNlU2NoZW1hLm1heExlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgIGNhc2UgXCJtYXhfbGVuZ3RoXCI6XG4gICAgICAgIC8vIFpvZCAzOiBpdGVtLnZhbHVlLCBab2QgNCAobm9ybWFsaXplZCk6IGl0ZW0ubWF4aW11bVxuICAgICAgICBiYXNlU2NoZW1hLm1heExlbmd0aCA9IGl0ZW0udmFsdWUgPz8gaXRlbS5tYXhpbXVtXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWluXCI6XG4gICAgICBjYXNlIFwibWluX2xlbmd0aFwiOlxuICAgICAgICAvLyBab2QgMzogaXRlbS52YWx1ZSwgWm9kIDQgKG5vcm1hbGl6ZWQpOiBpdGVtLm1pbmltdW1cbiAgICAgICAgYmFzZVNjaGVtYS5taW5MZW5ndGggPSBpdGVtLnZhbHVlID8/IGl0ZW0ubWluaW11bVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInJlZ2V4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEucGF0dGVybiA9IGl0ZW0ucmVnZXg/LnNvdXJjZSA/PyBpdGVtLnBhdHRlcm4/LnNvdXJjZVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhiYXNlU2NoZW1hLCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROdW1iZXI+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgYmFzZVNjaGVtYTogU2NoZW1hT2JqZWN0ID0ge1xuICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgZm9ybWF0OiBcImZsb2F0XCIsXG4gIH1cbiAgY29uc3QgY2hlY2tzID0gZ2V0Q2hlY2tzKHpvZFJlZilcbiAgY2hlY2tzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBzd2l0Y2ggKGl0ZW0ua2luZCkge1xuICAgICAgY2FzZSBcIm1heFwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1heGltdW0gPSBpdGVtLnZhbHVlXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVVBTVFJFQU06IFRoZSBvcGVuYXBpMy10cyB0eXBlcyBhcmUgd3Jvbmc6IGV4Y2x1c2l2ZU1heGltdW0gaXMgYSBib29sZWFuIGluIHRoaXMgdmVyc2lvbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi92M18wL2RhdGEtbW9kZWxzL2RhdGEtdHlwZXMvXG4gICAgICAgIGlmICghaXRlbS5pbmNsdXNpdmUpIGJhc2VTY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtaW5cIjpcbiAgICAgICAgYmFzZVNjaGVtYS5taW5pbXVtID0gaXRlbS52YWx1ZVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFVQU1RSRUFNOiBUaGUgb3BlbmFwaTMtdHMgdHlwZXMgYXJlIHdyb25nOiBleGNsdXNpdmVNaW5pbXVtIGlzIGEgYm9vbGVhbiBpbiB0aGlzIHZlcnNpb24uXG4gICAgICAgIC8vIGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vdjNfMC9kYXRhLW1vZGVscy9kYXRhLXR5cGVzL1xuICAgICAgICBpZiAoIWl0ZW0uaW5jbHVzaXZlKSBiYXNlU2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiaW50XCI6XG4gICAgICAgIGJhc2VTY2hlbWEudHlwZSA9IFwiaW50ZWdlclwiXG4gICAgICAgIGRlbGV0ZSBiYXNlU2NoZW1hLmZvcm1hdFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm11bHRpcGxlT2ZcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5tdWx0aXBsZU9mID0gaXRlbS52YWx1ZVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhiYXNlU2NoZW1hLCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGdldEV4Y2x1ZGVkRGVmaW5pdGlvbnNGcm9tU2NoZW1hKFxuICBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXhjbHVkZWREZWZpbml0aW9uczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHNjaGVtYSBvZiBzY2hlbWFzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmhpZGVEZWZpbml0aW9ucykpIHtcbiAgICAgIGV4Y2x1ZGVkRGVmaW5pdGlvbnMucHVzaCguLi5zY2hlbWEuaGlkZURlZmluaXRpb25zKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGNsdWRlZERlZmluaXRpb25zXG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG4gIGhpZGVEZWZpbml0aW9ucyxcbn06IFBhcnNpbmdBcmdzPEFueVpvZE9iamVjdD4pOiBTY2hlbWFPYmplY3Qge1xuICBsZXQgYWRkaXRpb25hbFByb3BlcnRpZXM6IFNjaGVtYU9iamVjdFtcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdXG5cbiAgY29uc3QgY2F0Y2hhbGwgPSBnZXRDYXRjaGFsbCh6b2RSZWYpXG4gIGNvbnN0IHVua25vd25LZXlzID0gZ2V0VW5rbm93bktleXMoem9kUmVmKVxuXG4gIC8vIGBjYXRjaGFsbGAgb2J2aWF0ZXMgYHN0cmljdGAsIGBzdHJpcGAsIGFuZCBgcGFzc3Rocm91Z2hgXG4gIGlmIChcbiAgICAhKFxuICAgICAgY2F0Y2hhbGwgaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8XG4gICAgICAoY2F0Y2hhbGwgJiYgZ2V0VHlwZU5hbWUoY2F0Y2hhbGwpID09PSBcIlpvZE5ldmVyXCIpXG4gICAgKVxuICApIHtcbiAgICBpZiAoY2F0Y2hhbGwpIHtcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZ2VuZXJhdGVTY2hlbWEoY2F0Y2hhbGwsIHVzZU91dHB1dClcbiAgICB9XG4gIH0gZWxzZSBpZiAodW5rbm93bktleXMgPT09IFwicGFzc3Rocm91Z2hcIikge1xuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZVxuICB9IGVsc2UgaWYgKHVua25vd25LZXlzID09PSBcInN0cmljdFwiKSB7XG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZVxuICB9XG5cbiAgLy8gU28gdGhhdCBgdW5kZWZpbmVkYCB2YWx1ZXMgZG9uJ3QgZW5kIHVwIGluIHRoZSBzY2hlbWEgYW5kIGJlIHdlaXJkXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID1cbiAgICBhZGRpdGlvbmFsUHJvcGVydGllcyAhPSBudWxsID8geyBhZGRpdGlvbmFsUHJvcGVydGllcyB9IDoge31cblxuICBjb25zdCBvYmplY3RTaGFwZSA9IGdldFNoYXBlKHpvZFJlZiBhcyBab2RUeXBlQW55KSB8fCB7fVxuICBjb25zdCByZXF1aXJlZFByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvYmplY3RTaGFwZSkuZmlsdGVyKChrZXkpID0+IHtcbiAgICBjb25zdCBpdGVtID0gb2JqZWN0U2hhcGVba2V5XVxuICAgIGNvbnN0IGl0ZW1UeXBlTmFtZSA9IGdldFR5cGVOYW1lKGl0ZW0pXG4gICAgcmV0dXJuIChcbiAgICAgICEoXG4gICAgICAgIGl0ZW0uaXNPcHRpb25hbCgpIHx8XG4gICAgICAgIGl0ZW0gaW5zdGFuY2VvZiB6LlpvZERlZmF1bHQgfHxcbiAgICAgICAgaXRlbVR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIlxuICAgICAgKSAmJiAhKGl0ZW0gaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8IGl0ZW1UeXBlTmFtZSA9PT0gXCJab2REZWZhdWx0XCIpXG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IHJlcXVpcmVkID1cbiAgICByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoID4gMCA/IHsgcmVxdWlyZWQ6IHJlcXVpcmVkUHJvcGVydGllcyB9IDoge31cblxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIHByb3BlcnRpZXM6IGl0ZXJhdGVab2RPYmplY3Qoe1xuICAgICAgICB6b2RSZWY6IHpvZFJlZiBhcyBPcGVuQXBpWm9kQW55T2JqZWN0LFxuICAgICAgICBzY2hlbWFzLFxuICAgICAgICB1c2VPdXRwdXQsXG4gICAgICAgIGhpZGVEZWZpbml0aW9uczogZ2V0RXhjbHVkZWREZWZpbml0aW9uc0Zyb21TY2hlbWEoc2NoZW1hcyksXG4gICAgICB9KSxcbiAgICAgIC4uLnJlcXVpcmVkLFxuICAgICAgLi4uYWRkaXRpb25hbFByb3BlcnRpZXMsXG4gICAgICAuLi5oaWRlRGVmaW5pdGlvbnMsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVjb3JkKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFJlY29yZD4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCB2YWx1ZVR5cGUgPSBnZXRSZWNvcmRWYWx1ZVR5cGUoem9kUmVmKVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOlxuICAgICAgICB2YWx1ZVR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd25cbiAgICAgICAgICA/IHt9XG4gICAgICAgICAgOiB2YWx1ZVR5cGVcbiAgICAgICAgICA/IGdlbmVyYXRlU2NoZW1hKHZhbHVlVHlwZSwgdXNlT3V0cHV0KVxuICAgICAgICAgIDoge30sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQmlnSW50KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCaWdJbnQ+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7IHR5cGU6IFwiaW50ZWdlclwiIGFzIFNjaGVtYU9iamVjdFR5cGUsIGZvcm1hdDogXCJpbnQ2NFwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW4oe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZEJvb2xlYW4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7IHR5cGU6IFwiYm9vbGVhblwiIGFzIFNjaGVtYU9iamVjdFR5cGUgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF0ZSh7IHpvZFJlZiwgc2NoZW1hcyB9OiBQYXJzaW5nQXJnczx6LlpvZERhdGU+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7IHR5cGU6IFwic3RyaW5nXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSwgZm9ybWF0OiBcImRhdGUtdGltZVwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bGwoeyB6b2RSZWYsIHNjaGVtYXMgfTogUGFyc2luZ0FyZ3M8ei5ab2ROdWxsPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uYWwoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kT3B0aW9uYWw8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYudW53cmFwKCksIHVzZU91dHB1dCksXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bGxhYmxlKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZE51bGxhYmxlPE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi51bndyYXAoKSwgdXNlT3V0cHV0KVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHsgLi4uc2NoZW1hLCB0eXBlOiBzY2hlbWEudHlwZSwgbnVsbGFibGU6IHRydWUgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVmYXVsdCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2REZWZhdWx0PE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGlubmVyVHlwZSA9IGdldElubmVyVHlwZSh6b2RSZWYpXG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgZGVmYXVsdDogZ2V0RGVmYXVsdFZhbHVlKHpvZFJlZiksXG4gICAgICAuLi4oaW5uZXJUeXBlID8gZ2VuZXJhdGVTY2hlbWEoaW5uZXJUeXBlLCB1c2VPdXRwdXQpIDoge30pLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUFycmF5KHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZEFycmF5PE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGNvbnN0cmFpbnRzOiBTY2hlbWFPYmplY3QgPSB7fVxuICBjb25zdCB7IGV4YWN0TGVuZ3RoLCBtaW5MZW5ndGgsIG1heExlbmd0aCB9ID0gZ2V0QXJyYXlDb25zdHJhaW50cyh6b2RSZWYpXG5cbiAgaWYgKGV4YWN0TGVuZ3RoICE9IG51bGwpIHtcbiAgICBjb25zdHJhaW50cy5taW5JdGVtcyA9IGV4YWN0TGVuZ3RoLnZhbHVlXG4gICAgY29uc3RyYWludHMubWF4SXRlbXMgPSBleGFjdExlbmd0aC52YWx1ZVxuICB9XG5cbiAgaWYgKG1pbkxlbmd0aCAhPSBudWxsKSBjb25zdHJhaW50cy5taW5JdGVtcyA9IG1pbkxlbmd0aC52YWx1ZVxuICBpZiAobWF4TGVuZ3RoICE9IG51bGwpIGNvbnN0cmFpbnRzLm1heEl0ZW1zID0gbWF4TGVuZ3RoLnZhbHVlXG5cbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7XG4gICAgICB0eXBlOiBcImFycmF5XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGl0ZW1zOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuZWxlbWVudCwgdXNlT3V0cHV0KSxcbiAgICAgIC4uLmNvbnN0cmFpbnRzLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUxpdGVyYWwoeyBzY2hlbWFzLCB6b2RSZWYgfTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHZhbHVlID0gZ2V0TGl0ZXJhbFZhbHVlKHpvZFJlZilcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7XG4gICAgICB0eXBlOiB0eXBlb2YgdmFsdWUgYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIixcbiAgICAgIGVudW06IFt2YWx1ZV0sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRW51bSh7IHNjaGVtYXMsIHpvZFJlZiB9OiBQYXJzaW5nQXJnczxhbnk+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgdmFsdWVzID0gZ2V0RW51bVZhbHVlcyh6b2RSZWYpXG4gIGlmICghdmFsdWVzKSB7XG4gICAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICAgIHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgICAgLi4uc2NoZW1hc1xuICAgIClcbiAgfVxuICBjb25zdCB2YWx1ZXNBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IHZhbHVlcyA6IE9iamVjdC52YWx1ZXModmFsdWVzKVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHtcbiAgICAgIHR5cGU6IHR5cGVvZiB2YWx1ZXNBcnJheVswXSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIixcbiAgICAgIGVudW06IHZhbHVlc0FycmF5LFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUludGVyc2VjdGlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlQW55LCB6LlpvZFR5cGVBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHsgbGVmdCwgcmlnaHQgfSA9IGdldEludGVyc2VjdGlvblBhcnRzKHpvZFJlZilcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7XG4gICAgICBhbGxPZjogW1xuICAgICAgICBsZWZ0ID8gZ2VuZXJhdGVTY2hlbWEobGVmdCwgdXNlT3V0cHV0KSA6IHt9LFxuICAgICAgICByaWdodCA/IGdlbmVyYXRlU2NoZW1hKHJpZ2h0LCB1c2VPdXRwdXQpIDoge30sXG4gICAgICBdLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczxhbnk+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgY29udGVudHMgPSBnZXRVbmlvbk9wdGlvbnMoem9kUmVmKVxuICBpZiAoXG4gICAgY29udGVudHMucmVkdWNlKFxuICAgICAgKHByZXYsIGNvbnRlbnQpID0+IHByZXYgJiYgZ2V0VHlwZU5hbWUoY29udGVudCkgPT09IFwiWm9kTGl0ZXJhbFwiLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKSB7XG4gICAgLy8gc3BlY2lhbCBjYXNlIHRvIHRyYW5zZm9ybSB1bmlvbnMgb2YgbGl0ZXJhbHMgaW50byBlbnVtc1xuICAgIGNvbnN0IGxpdGVyYWxzID0gY29udGVudHMgYXMgWm9kVHlwZUFueVtdXG4gICAgY29uc3QgdHlwZSA9IGxpdGVyYWxzLnJlZHVjZSgocHJldiwgY29udGVudCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBnZXRMaXRlcmFsVmFsdWUoY29udGVudClcbiAgICAgIHJldHVybiAhcHJldiB8fCBwcmV2ID09PSB0eXBlb2YgdmFsdWUgPyB0eXBlb2YgdmFsdWUgOiBudWxsXG4gICAgfSwgbnVsbCBhcyBudWxsIHwgc3RyaW5nKVxuXG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiB0eXBlIGFzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIsXG4gICAgICAgICAgZW51bTogbGl0ZXJhbHMubWFwKChsaXRlcmFsKSA9PiBnZXRMaXRlcmFsVmFsdWUobGl0ZXJhbCkpLFxuICAgICAgICB9LFxuICAgICAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgICAgIC4uLnNjaGVtYXNcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc051bGxhYmxlID0gY29udGVudHMuc29tZShcbiAgICAoY29udGVudCkgPT4gZ2V0VHlwZU5hbWUoY29udGVudCkgPT09IFwiWm9kTnVsbFwiXG4gIClcbiAgY29uc3Qgbm9uTnVsbENvbnRlbnRzID0gY29udGVudHMuZmlsdGVyKFxuICAgIChjb250ZW50KSA9PiBnZXRUeXBlTmFtZShjb250ZW50KSAhPT0gXCJab2ROdWxsXCJcbiAgKVxuXG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgb25lT2Y6IG5vbk51bGxDb250ZW50cy5tYXAoKHNjaGVtYSkgPT4gZ2VuZXJhdGVTY2hlbWEoc2NoZW1hLCB1c2VPdXRwdXQpKSxcbiAgICAgIC4uLihpc051bGxhYmxlID8geyBudWxsYWJsZTogdHJ1ZSB9IDoge30pLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGRpc2NyaW1pbmF0b3IgPSBnZXREaXNjcmltaW5hdG9yKHpvZFJlZilcbiAgY29uc3Qgb3B0aW9ucyA9IGdldFVuaW9uT3B0aW9ucyh6b2RSZWYpXG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgLi4uKGRpc2NyaW1pbmF0b3JcbiAgICAgICAgPyB7IGRpc2NyaW1pbmF0b3I6IHsgcHJvcGVydHlOYW1lOiBkaXNjcmltaW5hdG9yIH0gfVxuICAgICAgICA6IHt9KSxcbiAgICAgIG9uZU9mOiBvcHRpb25zLm1hcCgoc2NoZW1hKSA9PiBnZW5lcmF0ZVNjaGVtYShzY2hlbWEsIHVzZU91dHB1dCkpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU5ldmVyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROZXZlcj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2VTY2hlbWFzKHsgcmVhZE9ubHk6IHRydWUgfSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJyYW5kZWQoeyBzY2hlbWFzLCB6b2RSZWYgfTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHR5cGUgPSBnZXRCcmFuZGVkVHlwZSh6b2RSZWYpXG4gIHJldHVybiBtZXJnZVNjaGVtYXModHlwZSA/IGdlbmVyYXRlU2NoZW1hKHR5cGUpIDoge30sIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGNhdGNoQWxsUGFyc2VyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8Wm9kVHlwZUFueT4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2VTY2hlbWFzKHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VQaXBlbGluZSh7IHpvZFJlZiwgdXNlT3V0cHV0IH06IFBhcnNpbmdBcmdzPGFueT4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCB7IGluOiBpblNjaGVtYSwgb3V0OiBvdXRTY2hlbWEgfSA9IGdldFBpcGVsaW5lUGFydHMoem9kUmVmKVxuICBpZiAodXNlT3V0cHV0ICYmIG91dFNjaGVtYSkge1xuICAgIHJldHVybiBnZW5lcmF0ZVNjaGVtYShvdXRTY2hlbWEsIHVzZU91dHB1dClcbiAgfVxuICByZXR1cm4gaW5TY2hlbWEgPyBnZW5lcmF0ZVNjaGVtYShpblNjaGVtYSwgdXNlT3V0cHV0KSA6IHt9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVhZG9ubHkoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPGFueT4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBpbm5lclR5cGUgPSBnZXRJbm5lclR5cGUoem9kUmVmKVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIGlubmVyVHlwZSA/IGdlbmVyYXRlU2NoZW1hKGlubmVyVHlwZSwgdXNlT3V0cHV0KSA6IHt9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuY29uc3Qgd29ya2VyTWFwID0ge1xuICBab2RPYmplY3Q6IHBhcnNlT2JqZWN0LFxuICBab2RSZWNvcmQ6IHBhcnNlUmVjb3JkLFxuICBab2RTdHJpbmc6IHBhcnNlU3RyaW5nLFxuICBab2ROdW1iZXI6IHBhcnNlTnVtYmVyLFxuICBab2RCaWdJbnQ6IHBhcnNlQmlnSW50LFxuICBab2RCb29sZWFuOiBwYXJzZUJvb2xlYW4sXG4gIFpvZERhdGU6IHBhcnNlRGF0ZSxcbiAgWm9kTnVsbDogcGFyc2VOdWxsLFxuICBab2RPcHRpb25hbDogcGFyc2VPcHRpb25hbCxcbiAgWm9kTnVsbGFibGU6IHBhcnNlTnVsbGFibGUsXG4gIFpvZERlZmF1bHQ6IHBhcnNlRGVmYXVsdCxcbiAgWm9kQXJyYXk6IHBhcnNlQXJyYXksXG4gIFpvZExpdGVyYWw6IHBhcnNlTGl0ZXJhbCxcbiAgWm9kRW51bTogcGFyc2VFbnVtLFxuICBab2ROYXRpdmVFbnVtOiBwYXJzZUVudW0sXG4gIFpvZFRyYW5zZm9ybWVyOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RFZmZlY3RzOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RJbnRlcnNlY3Rpb246IHBhcnNlSW50ZXJzZWN0aW9uLFxuICBab2RVbmlvbjogcGFyc2VVbmlvbixcbiAgWm9kRGlzY3JpbWluYXRlZFVuaW9uOiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbixcbiAgWm9kTmV2ZXI6IHBhcnNlTmV2ZXIsXG4gIFpvZEJyYW5kZWQ6IHBhcnNlQnJhbmRlZCxcbiAgLy8gVE9ETyBUcmFuc2Zvcm0gdGhlIHJlc3QgdG8gc2NoZW1hc1xuICBab2RVbmRlZmluZWQ6IGNhdGNoQWxsUGFyc2VyLFxuICAvLyBUT0RPOiBgcHJlZml4SXRlbXNgIGlzIGFsbG93ZWQgaW4gT3BlbkFQSSAzLjEgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHR1cGxlc1xuICBab2RUdXBsZTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZE1hcDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZEZ1bmN0aW9uOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kTGF6eTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFByb21pc2U6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RBbnk6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RVbmtub3duOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kVm9pZDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFBpcGVsaW5lOiBwYXJzZVBpcGVsaW5lLFxuICBab2RSZWFkb25seTogcGFyc2VSZWFkb25seSxcbn1cbnR5cGUgV29ya2VyS2V5cyA9IGtleW9mIHR5cGVvZiB3b3JrZXJNYXBcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NoZW1hKFxuICB6b2RSZWY6IE9wZW5BcGlab2RBbnksXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHsgbWV0YU9wZW5BcGkgPSB7fSB9ID0gem9kUmVmXG4gIGNvbnN0IHNjaGVtYXM6IEFuYXRpbmVTY2hlbWFPYmplY3RbXSA9IFtcbiAgICAuLi4oQXJyYXkuaXNBcnJheShtZXRhT3BlbkFwaSkgPyBtZXRhT3BlbkFwaSA6IFttZXRhT3BlbkFwaV0pLFxuICBdXG4gIHRyeSB7XG4gICAgY29uc3QgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZSh6b2RSZWYpIGFzIFdvcmtlcktleXNcbiAgICBpZiAodHlwZU5hbWUgaW4gd29ya2VyTWFwKSB7XG4gICAgICByZXR1cm4gd29ya2VyTWFwW3R5cGVOYW1lXSh7XG4gICAgICAgIHpvZFJlZjogem9kUmVmIGFzIG5ldmVyLFxuICAgICAgICBzY2hlbWFzLFxuICAgICAgICB1c2VPdXRwdXQsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBjYXRjaEFsbFBhcnNlcih7IHpvZFJlZiwgc2NoZW1hcyB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICByZXR1cm4gY2F0Y2hBbGxQYXJzZXIoeyB6b2RSZWYsIHNjaGVtYXMgfSlcbiAgfVxufVxuIiwgIi8qKlxuICogRnJvbnQtTWF0dGVyXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vanhzb24vZnJvbnQtbWF0dGVyXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEphc29uIENhbXBiZWxsIChcIkF1dGhvclwiKVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgbG9hZCB9IGZyb20gXCJqcy15YW1sXCJcbmNvbnN0IG9wdGlvbmFsQnl0ZU9yZGVyTWFyayA9IFwiXFxcXHVmZWZmP1wiXG5jb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiID8gcHJvY2Vzcy5wbGF0Zm9ybSA6IFwiXCJcbmNvbnN0IHBhdHRlcm4gPVxuICBcIl4oXCIgK1xuICBvcHRpb25hbEJ5dGVPcmRlck1hcmsgK1xuICBcIig9IHlhbWwgPXwtLS0pXCIgK1xuICBcIiQoW1xcXFxzXFxcXFNdKj8pXCIgK1xuICBcIl4oPzpcXFxcMnxcXFxcLlxcXFwuXFxcXC4pXFxcXHMqXCIgK1xuICBcIiRcIiArXG4gIChwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJcXFxccj9cIiA6IFwiXCIpICtcbiAgXCIoPzpcXFxcbik/KVwiXG4vLyBOT1RFOiBJZiB0aGlzIHBhdHRlcm4gdXNlcyB0aGUgJ2cnIGZsYWcgdGhlIGByZWdleGAgdmFyaWFibGUgZGVmaW5pdGlvbiB3aWxsXG4vLyBuZWVkIHRvIGJlIG1vdmVkIGRvd24gaW50byB0aGUgZnVuY3Rpb25zIHRoYXQgdXNlIGl0LlxuY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4sIFwibVwiKVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9udE1hdHRlcihcbiAgc3RyaW5nOiBzdHJpbmcsXG4gIG9wdGlvbnMgPSB7fVxuKTogeyBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgYm9keTogc3RyaW5nOyBib2R5QmVnaW46IG51bWJlciB9IHtcbiAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCJcbiAgdmFyIGRlZmF1bHRPcHRpb25zID0geyBhbGxvd1Vuc2FmZTogZmFsc2UgfVxuICBvcHRpb25zID1cbiAgICBvcHRpb25zIGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICA/IHsgLi4uZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfVxuICAgICAgOiBkZWZhdWx0T3B0aW9uc1xuICB2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoLyhcXHI/XFxuKS8pXG4gIGlmIChsaW5lc1swXSAmJiAvPSB5YW1sID18LS0tLy50ZXN0KGxpbmVzWzBdKSkge1xuICAgIHJldHVybiBwYXJzZShzdHJpbmcpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYm9keTogc3RyaW5nLFxuICAgICAgYm9keUJlZ2luOiAxLFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlTG9jYXRpb24obWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSwgYm9keTogc3RyaW5nKSB7XG4gIHZhciBsaW5lID0gMVxuICB2YXIgcG9zID0gYm9keS5pbmRleE9mKFwiXFxuXCIpXG4gIHZhciBvZmZzZXQgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aFxuXG4gIHdoaWxlIChwb3MgIT09IC0xKSB7XG4gICAgaWYgKHBvcyA+PSBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBsaW5lXG4gICAgfVxuICAgIGxpbmUrK1xuICAgIHBvcyA9IGJvZHkuaW5kZXhPZihcIlxcblwiLCBwb3MgKyAxKVxuICB9XG5cbiAgcmV0dXJuIGxpbmVcbn1cblxuZnVuY3Rpb24gcGFyc2Uoc3RyaW5nOiBzdHJpbmcpOiB7XG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGJvZHk6IHN0cmluZ1xuICBib2R5QmVnaW46IG51bWJlclxufSB7XG4gIHZhciBtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYm9keTogc3RyaW5nLFxuICAgICAgYm9keUJlZ2luOiAxLFxuICAgIH1cbiAgfVxuXG4gIHZhciB5YW1sID0gbWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV0ucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgXCJcIilcbiAgdmFyIGF0dHJpYnV0ZXMgPSAobG9hZCh5YW1sKSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgdmFyIGJvZHkgPSBzdHJpbmcucmVwbGFjZShtYXRjaFswXSwgXCJcIilcbiAgdmFyIGxpbmUgPSBjb21wdXRlTG9jYXRpb24obWF0Y2gsIHN0cmluZylcblxuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgYm9keTogYm9keSxcbiAgICBib2R5QmVnaW46IGxpbmUsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RGcm9udE1hdHRlcihzdHJpbmc6IHN0cmluZykge1xuICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIlxuXG4gIHJldHVybiByZWdleC50ZXN0KHN0cmluZylcbn1cbiIsICJ0eXBlIFByZWZpeGVkT2JqZWN0PFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIGB4LSR7c3RyaW5nICYgS31gXTogVFtLXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlZml4T2JqZWN0S2V5c1dpdGhYPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBvYmo6IFRcbik6IFByZWZpeGVkT2JqZWN0PFQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbYHgtJHtrZXl9YCwgdmFsdWVdKVxuICApIGFzIFByZWZpeGVkT2JqZWN0PFQ+XG59XG4iLCAidHlwZSBTbmFrZVRvRGFzaDxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBLIGV4dGVuZHMgc3RyaW5nID8gU25ha2VUb0Rhc2hTdHJpbmc8Sz4gOiBLXTogVFtLXVxufVxuXG50eXBlIFNuYWtlVG9EYXNoU3RyaW5nPFMgZXh0ZW5kcyBzdHJpbmc+ID0gUyBleHRlbmRzIGAke2luZmVyIFR9XyR7aW5mZXIgVX1gXG4gID8gYCR7VH0tJHtTbmFrZVRvRGFzaFN0cmluZzxVPn1gXG4gIDogU1xuXG5leHBvcnQgZnVuY3Rpb24gZGFzaGlmeU9iamVjdEtleXM8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogU25ha2VUb0Rhc2g8VD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXkucmVwbGFjZSgvXy9nLCBcIi1cIiksIHZhbHVlXSlcbiAgKSBhcyBTbmFrZVRvRGFzaDxUPlxufVxuIiwgImltcG9ydCBfIGZyb20gXCJsb2Rhc2hcIlxuXG5mdW5jdGlvbiBmaW5kS2V5SW5PYmoob2JqOiBhbnksIHZhbHVlOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgbGV0IHJlc3VsdEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgXy5mb3JPd24ob2JqLCAodiwgaykgPT4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHYpICYmIF8uaXNNYXRjaCh2LCB2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdEtleSA9IGtcbiAgICAgIC8vIFN0b3AgdGhlIGl0ZXJhdGlvblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9KVxuICByZXR1cm4gcmVzdWx0S2V5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbWJlZFNjaGVtYVJlZmVyZW5jZXMob2JqMTogYW55LCBvYmoyOiBhbnkpOiBhbnkge1xuICByZXR1cm4gXy50cmFuc2Zvcm0ob2JqMSwgKHJlc3VsdCwgdmFsdWUsIGtleSkgPT4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdLZXkgPSBmaW5kS2V5SW5PYmoob2JqMiwgdmFsdWUpXG4gICAgICBpZiAobWF0Y2hpbmdLZXkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB7XG4gICAgICAgICAgJHJlZjogYCMvY29tcG9uZW50cy9zY2hlbWFzLyR7bWF0Y2hpbmdLZXl9YCxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBlbWJlZFNjaGVtYVJlZmVyZW5jZXModmFsdWUsIG9iajIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgUm91dGVTcGVjIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcblxuZnVuY3Rpb24gdHJhbnNmb3JtUGF0aFRvRmVyblNka01ldGhvZE5hbWUocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXG4gIGlmIChsYXN0UGFydC5zdGFydHNXaXRoKFwiW1wiKSAmJiBsYXN0UGFydC5lbmRzV2l0aChcIl1cIikpIHtcbiAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gYnlfcGFyYW1cbiAgICBjb25zdCBwYXJhbSA9IGxhc3RQYXJ0LnNsaWNlKDEsIC0xKVxuICAgIHJldHVybiBgYnlfJHtwYXJhbX1gXG4gIH1cblxuICByZXR1cm4gbGFzdFBhcnRcbn1cblxuLy8gZmVybiBkb2NzOiBodHRwczovL2J1aWxkd2l0aGZlcm4uY29tL2RvY3Mvc3BlYy9leHRlbnNpb25zXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrR3JvdXBOYW1lKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgcmV0dXJuIHBhcnRzLnNsaWNlKDAsIHBhcnRzLmxlbmd0aCAtIDEpXG59XG5cbmZ1bmN0aW9uIGdldEZlcm5TZGtNZXRhZGF0YShcbiAgcGF0aDogc3RyaW5nLFxuICBzZGtSZXR1cm5WYWx1ZT86IHN0cmluZyB8IHN0cmluZ1tdXG4pOlxuICB8IHtcbiAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlXG4gICAgfVxuICB8IHtcbiAgICAgIFwieC1mZXJuLXNkay1ncm91cC1uYW1lXCI6IHN0cmluZ1tdXG4gICAgICBcIngtZmVybi1zZGstbWV0aG9kLW5hbWVcIjogc3RyaW5nXG4gICAgfSB7XG4gIGlmIChwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZSxcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFwieC1mZXJuLXNkay1ncm91cC1uYW1lXCI6IHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtHcm91cE5hbWUocGF0aCksXG4gICAgXCJ4LWZlcm4tc2RrLW1ldGhvZC1uYW1lXCI6IHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtNZXRob2ROYW1lKHBhdGgpLFxuICAgIC4uLihzZGtSZXR1cm5WYWx1ZVxuICAgICAgPyB7XG4gICAgICAgICAgXCJ4LWZlcm4tc2RrLXJldHVybi12YWx1ZVwiOiBzZGtSZXR1cm5WYWx1ZSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1hcE1ldGhvZHNUb0Zlcm5TZGtNZXRhZGF0YSh7XG4gIG1ldGhvZHMsXG4gIHBhdGgsXG4gIHNka1JldHVyblZhbHVlLFxufToge1xuICBtZXRob2RzOiBSb3V0ZVNwZWNbXCJtZXRob2RzXCJdXG4gIHBhdGg6IHN0cmluZ1xuICBzZGtSZXR1cm5WYWx1ZT86IHN0cmluZyB8IHN0cmluZ1tdXG59KSB7XG4gIGNvbnN0IGZlcm5TZGtNZXRhZGF0YSA9IGdldEZlcm5TZGtNZXRhZGF0YShwYXRoLCBzZGtSZXR1cm5WYWx1ZSlcbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFttZXRob2RzWzBdXTogZmVyblNka01ldGFkYXRhLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1hcHBlZE1ldGhvZHMgPSB7fVxuXG4gIG1ldGhvZHMuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgIG1hcHBlZE1ldGhvZHNbbWV0aG9kXSA9IGZlcm5TZGtNZXRhZGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICBtYXBwZWRNZXRob2RzW21ldGhvZF0gPSB7XG4gICAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlLFxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gbWFwcGVkTWV0aG9kc1xufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyB6b2RUb1RzLCBwcmludE5vZGUgfSBmcm9tIFwiLi4vbGliL3pvZC10by10c1wiXG5pbXBvcnQgcHJldHRpZXIgZnJvbSBcInByZXR0aWVyXCJcbmltcG9ydCB7IHosIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7XG4gIGdldFR5cGVOYW1lLFxuICBnZXRFZmZlY3RzU2NoZW1hLFxuICBnZXRJbm5lclR5cGUsXG4gIGdldFNoYXBlLFxufSBmcm9tIFwiLi4vLi4vbGliL3pvZC1jb21wYXRcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJvdXRlVHlwZXMgPSBhc3luYyAob3B0czogR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cykgPT4ge1xuICBjb25zdCBmaWxlcGF0aFRvUm91dGUgPSBhd2FpdCBwYXJzZVJvdXRlc0luUGFja2FnZShvcHRzKVxuXG4gIGNvbnN0IHNvcnRlZFJvdXRlcyA9IEFycmF5LmZyb20oZmlsZXBhdGhUb1JvdXRlLmVudHJpZXMoKSkuc29ydCgoYSwgYikgPT5cbiAgICBhWzFdLnJvdXRlLmxvY2FsZUNvbXBhcmUoYlsxXS5yb3V0ZSlcbiAgKVxuICBjb25zdCBmaWx0ZXJlZFJvdXRlcyA9IHNvcnRlZFJvdXRlcy5maWx0ZXIoXG4gICAgKFtfLCB7IHJvdXRlIH1dKSA9PiAhb3B0cy5maWx0ZXJSb3V0ZXMgfHwgb3B0cy5maWx0ZXJSb3V0ZXMocm91dGUpXG4gIClcblxuICAvLyBUT0RPIHdoZW4gbGVzcyBsYXp5LCB1c2UgdHMtbW9ycGggZm9yIGJldHRlciBnZW5lcmF0aW9uXG4gIGNvbnN0IHJvdXRlRGVmczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IFtfLCB7IHJvdXRlLCByb3V0ZVNwZWMsIHNldHVwUGFyYW1zIH1dIG9mIGZpbHRlcmVkUm91dGVzKSB7XG4gICAgY29uc3QgbWF4RHVyYXRpb24gPSByb3V0ZVNwZWMubWF4RHVyYXRpb24gPz8gc2V0dXBQYXJhbXMubWF4RHVyYXRpb25cbiAgICBjb25zdCBxdWVyeUtleXMgPSBPYmplY3Qua2V5cyhcbiAgICAgIHJvdXRlU3BlYy5xdWVyeVBhcmFtcyA/IGdldFNoYXBlKHJvdXRlU3BlYy5xdWVyeVBhcmFtcykgPz8ge30gOiB7fVxuICAgIClcbiAgICBjb25zdCBwYXRoUGFyYW1ldGVycyA9IHF1ZXJ5S2V5cy5maWx0ZXIoKGtleSkgPT4gcm91dGUuaW5jbHVkZXMoYFske2tleX1dYCkpXG5cbiAgICAvLyBxdWVyeVBhcmFtcyBtaWdodCBiZSBhIFpvZEVmZmVjdHMgb3IgWm9kT3B0aW9uYWwgaW4gc29tZSBjYXNlc1xuICAgIGxldCBxdWVyeVBhcmFtczogWm9kVHlwZUFueSB8IHVuZGVmaW5lZCA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtc1xuICAgIHdoaWxlIChxdWVyeVBhcmFtcykge1xuICAgICAgY29uc3QgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZShxdWVyeVBhcmFtcylcbiAgICAgIGlmICh0eXBlTmFtZSA9PT0gXCJab2RFZmZlY3RzXCIpIHtcbiAgICAgICAgY29uc3QgaW5uZXIgPSBnZXRFZmZlY3RzU2NoZW1hKHF1ZXJ5UGFyYW1zKVxuICAgICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgICBxdWVyeVBhcmFtcyA9IGlubmVyXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlTmFtZSA9PT0gXCJab2RPcHRpb25hbFwiKSB7XG4gICAgICAgIGNvbnN0IGlubmVyID0gZ2V0SW5uZXJUeXBlKHF1ZXJ5UGFyYW1zKVxuICAgICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgICBxdWVyeVBhcmFtcyA9IGlubmVyXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBxdWVyeVBhcmFtcyAmJlxuICAgICAgXCJvbWl0XCIgaW4gcXVlcnlQYXJhbXMgJiZcbiAgICAgIHR5cGVvZiAocXVlcnlQYXJhbXMgYXMgYW55KS5vbWl0ID09PSBcImZ1bmN0aW9uXCJcbiAgICApIHtcbiAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zIGFzIGFueSkub21pdChcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKHBhdGhQYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IFtwYXJhbSwgdHJ1ZV0pKVxuICAgICAgKVxuICAgIH1cblxuICAgIHJvdXRlRGVmcy5wdXNoKFxuICAgICAgYFxuXCIke3JvdXRlfVwiOiB7XG4gIHJvdXRlOiBcIiR7cm91dGV9XCIsXG4gIG1ldGhvZDogJHtyb3V0ZVNwZWMubWV0aG9kcy5tYXAoKG0pID0+IGBcIiR7bX1cImApLmpvaW4oXCIgfCBcIil9LFxuICBxdWVyeVBhcmFtczogJHtxdWVyeVBhcmFtcyA/IHByaW50Tm9kZSh6b2RUb1RzKHF1ZXJ5UGFyYW1zKS5ub2RlKSA6IFwie31cIn0sXG4gIGpzb25Cb2R5OiAke1xuICAgIHJvdXRlU3BlYy5qc29uQm9keSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5qc29uQm9keSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAgY29tbW9uUGFyYW1zOiAke1xuICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmNvbW1vblBhcmFtcykubm9kZSlcbiAgICAgIDogXCJ7fVwiXG4gIH0sXG4gIGZvcm1EYXRhOiAke1xuICAgIHJvdXRlU3BlYy5mb3JtRGF0YSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5mb3JtRGF0YSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAganNvblJlc3BvbnNlOiAke1xuICAgIHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgID8gcHJpbnROb2RlKFxuICAgICAgICAgIHpvZFRvVHMoXG4gICAgICAgICAgICBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1cyAmJlxuICAgICAgICAgICAgICByb3V0ZVNwZWMuanNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICAgICAgPyByb3V0ZVNwZWMuanNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgICA6IHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgICAgICApLm5vZGVcbiAgICAgICAgKVxuICAgICAgOiBcInt9XCJcbiAgfSxcbiAgbWF4RHVyYXRpb246ICR7bWF4RHVyYXRpb24gPz8gXCJ1bmRlZmluZWRcIn1cbn1gLnRyaW0oKVxuICAgIClcbiAgfVxuICBjb25zdCByb3V0ZURlZlN0ciA9IHJvdXRlRGVmcy5qb2luKFwiLFxcblwiKVxuICBjb25zdCBvdXRwdXQgPSBhd2FpdCBwcmV0dGllci5mb3JtYXQoXG4gICAgYGV4cG9ydCB0eXBlIFJvdXRlcyA9IHtcbiR7cm91dGVEZWZTdHJ9XG59XG5cbmV4cG9ydCB0eXBlIFJvdXRlUmVzcG9uc2U8UGF0aCBleHRlbmRzIGtleW9mIFJvdXRlcz4gPVxuICBSb3V0ZXNbUGF0aF1bXCJqc29uUmVzcG9uc2VcIl1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXF1ZXN0Qm9keTxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcImpzb25Cb2R5XCJdICYgUm91dGVzW1BhdGhdW1wiY29tbW9uUGFyYW1zXCJdXG5cbmV4cG9ydCB0eXBlIFJvdXRlUmVxdWVzdFBhcmFtczxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcInF1ZXJ5UGFyYW1zXCJdICYgUm91dGVzW1BhdGhdW1wiY29tbW9uUGFyYW1zXCJdXG5gLnRyaW0oKSxcbiAgICB7IHNlbWk6IGZhbHNlLCBwYXJzZXI6IFwidHlwZXNjcmlwdFwiIH1cbiAgKVxuXG4gIGlmIChvcHRzLm91dHB1dEZpbGUpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUob3B0cy5vdXRwdXRGaWxlLCBvdXRwdXQpXG4gIH1cblxuICByZXR1cm4gb3V0cHV0XG59XG4iLCAiLy8gQHRzLW5vY2hlY2sgLSBWZW5kb3JlZCBjb2RlIHdpdGggWm9kIDMvNCB0eXBlIGluY29tcGF0aWJpbGl0aWVzIChydW50aW1lIHdvcmtzIGNvcnJlY3RseSlcbi8qKlxuICogWm9kIFRvIFRTXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2FjaGlucmFqYS96b2QtdG8tdHNcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMSBTYWNoaW4gUmFqYVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcbmltcG9ydCB7IFpvZFR5cGUsIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXIsIHRlc3RGcm9udE1hdHRlciB9IGZyb20gXCIuL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuaW1wb3J0IHtcbiAgZ2V0VHlwZU5hbWUsXG4gIGdldERlZixcbiAgZ2V0TGl0ZXJhbFZhbHVlLFxuICBnZXRTaGFwZSxcbiAgZ2V0QXJyYXlUeXBlLFxuICBnZXRFbnVtVmFsdWVzLFxuICBnZXRVbmlvbk9wdGlvbnMsXG4gIGdldEVmZmVjdHNTY2hlbWEsXG4gIGdldElubmVyVHlwZSxcbiAgZ2V0VHVwbGVJdGVtcyxcbiAgZ2V0UmVjb3JkVmFsdWVUeXBlLFxuICBnZXRNYXBUeXBlcyxcbiAgZ2V0U2V0VmFsdWVUeXBlLFxuICBnZXRJbnRlcnNlY3Rpb25QYXJ0cyxcbiAgZ2V0UHJvbWlzZVR5cGUsXG4gIGdldEZ1bmN0aW9uUGFydHMsXG4gIGdldEN1c3RvbVR5cGVHZXR0ZXIsXG59IGZyb20gXCIuLi8uLi9saWIvem9kLWNvbXBhdFwiXG5cbmNvbnN0IHsgZmFjdG9yeTogZiwgU3ludGF4S2luZCwgU2NyaXB0S2luZCwgU2NyaXB0VGFyZ2V0LCBFbWl0SGludCB9ID0gdHNcblxuY29uc3QgbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlID0gKFxuICBpZGVudGlmaWVyOiB0cy5JZGVudGlmaWVyIHwgdHMuVHlwZU5vZGVcbikgPT4ge1xuICBpZiAodHMuaXNJZGVudGlmaWVyKGlkZW50aWZpZXIpKSB7XG4gICAgcmV0dXJuIGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoaWRlbnRpZmllcilcbiAgfVxuXG4gIHJldHVybiBpZGVudGlmaWVyXG59XG5cbmNvbnN0IGNyZWF0ZVR5cGVSZWZlcmVuY2VGcm9tU3RyaW5nID0gKGlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoaWRlbnRpZmllcikpXG5cbmNvbnN0IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSA9ICgpID0+XG4gIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5rbm93bktleXdvcmQpXG5cbmV4cG9ydCBjb25zdCBwcmludE5vZGUgPSAoXG4gIG5vZGU6IHRzLk5vZGUsXG4gIHByaW50ZXJPcHRpb25zPzogdHMuUHJpbnRlck9wdGlvbnNcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIFwicHJpbnQudHNcIixcbiAgICBcIlwiLFxuICAgIFNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgZmFsc2UsXG4gICAgU2NyaXB0S2luZC5UU1xuICApXG4gIGNvbnN0IHByaW50ZXIgPSB0cy5jcmVhdGVQcmludGVyKHByaW50ZXJPcHRpb25zKVxuICByZXR1cm4gcHJpbnRlci5wcmludE5vZGUoRW1pdEhpbnQuVW5zcGVjaWZpZWQsIG5vZGUsIHNvdXJjZUZpbGUpXG59XG5cbmNvbnN0IGlkZW50aWZpZXJSRSA9IC9eWyRBLVpfYS16XVtcXHckXSokL1xuXG5jb25zdCBnZXRJZGVudGlmaWVyT3JTdHJpbmdMaXRlcmFsID0gKHN0cmluZ186IHN0cmluZykgPT4ge1xuICBpZiAoaWRlbnRpZmllclJFLnRlc3Qoc3RyaW5nXykpIHtcbiAgICByZXR1cm4gZi5jcmVhdGVJZGVudGlmaWVyKHN0cmluZ18pXG4gIH1cblxuICByZXR1cm4gZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHN0cmluZ18pXG59XG5cbmNvbnN0IGFkZEpzRG9jQ29tbWVudCA9IChub2RlOiB0cy5Ob2RlLCB0ZXh0OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgeyBkZXNjcmlwdGlvbiwgZGVwcmVjYXRlZCB9ID0gcGFyc2VEZXNjcmlwdGlvbih0ZXh0KVxuXG4gIGxldCBjb21tZW50ID0gYCogJHtkZXNjcmlwdGlvbn1gXG4gIGlmIChkZXByZWNhdGVkKSB7XG4gICAgY29tbWVudCArPSBgXFxuICogQGRlcHJlY2F0ZWQgJHtcbiAgICAgIHR5cGVvZiBkZXByZWNhdGVkID09PSBcInN0cmluZ1wiID8gZGVwcmVjYXRlZCA6IFwiXCJcbiAgICB9YFxuICB9IGVsc2Uge1xuICAgIGNvbW1lbnQgKz0gYCBgXG4gIH1cblxuICB0cy5hZGRTeW50aGV0aWNMZWFkaW5nQ29tbWVudChcbiAgICBub2RlLFxuICAgIFN5bnRheEtpbmQuTXVsdGlMaW5lQ29tbWVudFRyaXZpYSxcbiAgICBjb21tZW50LFxuICAgIHRydWVcbiAgKVxufVxuXG50eXBlIFBhcnNlZERlc2NyaXB0aW9uID0ge1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIGRlcHJlY2F0ZWQ/OiBib29sZWFuIHwgc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZnVuY3Rpb24gcGFyc2VEZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogUGFyc2VkRGVzY3JpcHRpb24ge1xuICBpZiAoIWRlc2NyaXB0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJcIixcbiAgICB9XG4gIGNvbnN0IHRyaW1tZWREZXNjcmlwdGlvbiA9IGRlZGVudChkZXNjcmlwdGlvbilcbiAgaWYgKCF0ZXN0RnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKSkgcmV0dXJuIHsgZGVzY3JpcHRpb24gfVxuICBjb25zdCB7IGF0dHJpYnV0ZXMsIGJvZHkgfSA9IHBhcnNlRnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKVxuICBjb25zdCBvdXRwdXQ6IFBhcnNlZERlc2NyaXB0aW9uID0ge1xuICAgIGRlc2NyaXB0aW9uOiBib2R5LnRyaW0oKSxcbiAgfVxuICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIgJiYgYXR0cmlidXRlcyAhPT0gbnVsbCkge1xuICAgIGlmIChcImRlcHJlY2F0ZWRcIiBpbiBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIG91dHB1dC5kZXByZWNhdGVkID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXR0cmlidXRlcy5kZXByZWNhdGVkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG91dHB1dC5kZXByZWNhdGVkID1cbiAgICAgICAgICBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQubGVuZ3RoID4gMCA/IGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA6IHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiZGVzY3JpcHRpb25cIiB8fCBrZXkgPT09IFwiZGVwcmVjYXRlZFwiKSBjb250aW51ZVxuICAgICAgb3V0cHV0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0XG59XG5cbnR5cGUgTGl0ZXJhbFR5cGUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG5cbnR5cGUgWm9kVG9Uc09wdGlvbnMgPSB7XG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgYG5hdGl2ZUVudW1zYCBpbnN0ZWFkICovXG4gIHJlc29sdmVOYXRpdmVFbnVtcz86IGJvb2xlYW5cbiAgbmF0aXZlRW51bXM/OiBcImlkZW50aWZpZXJcIiB8IFwicmVzb2x2ZVwiIHwgXCJ1bmlvblwiXG59XG5cbmNvbnN0IHJlc29sdmVPcHRpb25zID0gKHJhdz86IFpvZFRvVHNPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVkID0ge1xuICAgIG5hdGl2ZUVudW1zOiByYXc/LnJlc29sdmVOYXRpdmVFbnVtcyA/IFwicmVzb2x2ZVwiIDogXCJpZGVudGlmaWVyXCIsXG4gIH1cblxuICByZXR1cm4geyAuLi5yZXNvbHZlZCwgLi4ucmF3IH1cbn1cblxudHlwZSBSZXNvbHZlZFpvZFRvVHNPcHRpb25zID0gUmV0dXJuVHlwZTx0eXBlb2YgcmVzb2x2ZU9wdGlvbnM+XG5cbnR5cGUgWm9kVG9Uc1N0b3JlID0ge1xuICBuYXRpdmVFbnVtczogdHMuRW51bURlY2xhcmF0aW9uW11cbn1cblxudHlwZSBab2RUb1RzUmV0dXJuID0ge1xuICBub2RlOiB0cy5UeXBlTm9kZVxuICBzdG9yZTogWm9kVG9Uc1N0b3JlXG59XG5cbnR5cGUgR2V0VHlwZUZ1bmN0aW9uID0gKFxuICB0eXBlc2NyaXB0OiB0eXBlb2YgdHMsXG4gIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZWRab2RUb1RzT3B0aW9uc1xuKSA9PiB0cy5JZGVudGlmaWVyIHwgdHMuVHlwZU5vZGVcblxuY29uc3QgY2FsbEdldFR5cGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgbGV0IHR5cGU6IFJldHVyblR5cGU8R2V0VHlwZUZ1bmN0aW9uPiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGdldFR5cGUgPSBnZXRDdXN0b21UeXBlR2V0dGVyKHpvZClcbiAgLy8gdGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYWNjZXNzaW5nICd0eXBlJ1xuICBpZiAoZ2V0VHlwZSkgdHlwZSA9IGdldFR5cGUodHMsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIHJldHVybiB0eXBlXG59XG5cbmV4cG9ydCBjb25zdCB6b2RUb1RzID0gKFxuICB6b2Q6IFpvZFR5cGVBbnksXG4gIGlkZW50aWZpZXI/OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBab2RUb1RzT3B0aW9uc1xuKTogWm9kVG9Uc1JldHVybiA9PiB7XG4gIGlmICghKHpvZCBpbnN0YW5jZW9mIFpvZFR5cGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpLFxuICAgICAgc3RvcmU6IHsgbmF0aXZlRW51bXM6IFtdIH0sXG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc29sdmVkSWRlbnRpZmllciA9IGlkZW50aWZpZXIgPz8gXCJJZGVudGlmaWVyXCJcblxuICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSByZXNvbHZlT3B0aW9ucyhvcHRpb25zKVxuXG4gIGNvbnN0IHN0b3JlOiBab2RUb1RzU3RvcmUgPSB7IG5hdGl2ZUVudW1zOiBbXSB9XG5cbiAgY29uc3Qgbm9kZSA9IHpvZFRvVHNOb2RlKHpvZCwgcmVzb2x2ZWRJZGVudGlmaWVyLCBzdG9yZSwgcmVzb2x2ZWRPcHRpb25zKVxuXG4gIHJldHVybiB7IG5vZGUsIHN0b3JlIH1cbn1cblxuY29uc3Qgem9kVG9Uc05vZGUgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBzdG9yZTogWm9kVG9Uc1N0b3JlLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHtcbiAgY29uc3QgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZSh6b2QpXG5cbiAgY29uc3QgZ2V0VHlwZVR5cGUgPSBjYWxsR2V0VHlwZSh6b2QsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIC8vIHNwZWNpYWwgY2FzZSBuYXRpdmUgZW51bSwgd2hpY2ggbmVlZHMgYW4gaWRlbnRpZmllciBub2RlXG4gIGlmIChnZXRUeXBlVHlwZSAmJiB0eXBlTmFtZSAhPT0gXCJab2ROYXRpdmVFbnVtXCIpIHtcbiAgICByZXR1cm4gbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlKGdldFR5cGVUeXBlKVxuICB9XG5cbiAgY29uc3Qgb3RoZXJBcmd1bWVudHMgPSBbaWRlbnRpZmllciwgc3RvcmUsIG9wdGlvbnNdIGFzIGNvbnN0XG5cbiAgc3dpdGNoICh0eXBlTmFtZSkge1xuICAgIGNhc2UgXCJab2RTdHJpbmdcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE51bWJlclwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQmlnSW50XCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkJpZ0ludEtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RCb29sZWFuXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkJvb2xlYW5LZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kRGF0ZVwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJEYXRlXCIpKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVW5kZWZpbmVkXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROdWxsXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZU51bGwoKSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZFZvaWRcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVm9pZEtleXdvcmQpLFxuICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpLFxuICAgICAgXSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZEFueVwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5BbnlLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVW5rbm93blwiOiB7XG4gICAgICByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE5ldmVyXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLk5ldmVyS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZExhenlcIjoge1xuICAgICAgLy8gaXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hhdCB0aGUgbGF6eSB2YWx1ZSBpcyByZWZlcnJpbmcgdG9cbiAgICAgIC8vIHNvIHdlIGZvcmNlIHRoZSB1c2VyIHRvIGRlY2xhcmUgaXRcbiAgICAgIGlmICghZ2V0VHlwZVR5cGUpIHJldHVybiBjcmVhdGVUeXBlUmVmZXJlbmNlRnJvbVN0cmluZyhpZGVudGlmaWVyKVxuICAgICAgYnJlYWtcbiAgICB9XG4gICAgY2FzZSBcIlpvZExpdGVyYWxcIjoge1xuICAgICAgLy8gei5saXRlcmFsKCdoaScpIC0+ICdoaSdcbiAgICAgIGxldCBsaXRlcmFsOiB0cy5MaXRlcmFsRXhwcmVzc2lvbiB8IHRzLkJvb2xlYW5MaXRlcmFsXG5cbiAgICAgIGNvbnN0IGxpdGVyYWxWYWx1ZSA9IGdldExpdGVyYWxWYWx1ZSh6b2QpIGFzIExpdGVyYWxUeXBlXG4gICAgICBzd2l0Y2ggKHR5cGVvZiBsaXRlcmFsVmFsdWUpIHtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOiB7XG4gICAgICAgICAgbGl0ZXJhbCA9IGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwobGl0ZXJhbFZhbHVlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjoge1xuICAgICAgICAgIGxpdGVyYWwgPSBsaXRlcmFsVmFsdWUgPT09IHRydWUgPyBmLmNyZWF0ZVRydWUoKSA6IGYuY3JlYXRlRmFsc2UoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGxpdGVyYWwgPSBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwobGl0ZXJhbFZhbHVlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGxpdGVyYWwpXG4gICAgfVxuICAgIGNhc2UgXCJab2RPYmplY3RcIjoge1xuICAgICAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZSh6b2QpIHx8IHt9XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmVudHJpZXMoc2hhcGUpXG5cbiAgICAgIGNvbnN0IG1lbWJlcnM6IHRzLlR5cGVFbGVtZW50W10gPSBwcm9wZXJ0aWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRab2ROb2RlID0gdmFsdWUgYXMgWm9kVHlwZUFueVxuICAgICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUobmV4dFpvZE5vZGUsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICAgIGNvbnN0IG5leHRab2ROb2RlVHlwZU5hbWUgPSBnZXRUeXBlTmFtZShuZXh0Wm9kTm9kZSlcbiAgICAgICAgY29uc3QgaXNPcHRpb25hbCA9XG4gICAgICAgICAgbmV4dFpvZE5vZGVUeXBlTmFtZSA9PT0gXCJab2RPcHRpb25hbFwiIHx8IG5leHRab2ROb2RlLmlzT3B0aW9uYWwoKVxuXG4gICAgICAgIGNvbnN0IHByb3BlcnR5U2lnbmF0dXJlID0gZi5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbChrZXkpLFxuICAgICAgICAgIGlzT3B0aW9uYWwgPyBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuUXVlc3Rpb25Ub2tlbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdHlwZVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKG5leHRab2ROb2RlLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgYWRkSnNEb2NDb21tZW50KHByb3BlcnR5U2lnbmF0dXJlLCBuZXh0Wm9kTm9kZS5kZXNjcmlwdGlvbilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eVNpZ25hdHVyZVxuICAgICAgfSlcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR5cGVMaXRlcmFsTm9kZShtZW1iZXJzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RBcnJheVwiOiB7XG4gICAgICBjb25zdCBhcnJheVR5cGUgPSBnZXRBcnJheVR5cGUoem9kKVxuICAgICAgY29uc3QgdHlwZSA9IGFycmF5VHlwZVxuICAgICAgICA/IHpvZFRvVHNOb2RlKGFycmF5VHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICAgIDogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUFycmF5VHlwZU5vZGUodHlwZSlcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEVudW1cIjoge1xuICAgICAgLy8gei5lbnVtWydhJywgJ2InLCAnYyddIC0+ICdhJyB8ICdiJyB8ICdjXG4gICAgICBjb25zdCB2YWx1ZXMgPSBnZXRFbnVtVmFsdWVzKHpvZClcbiAgICAgIGNvbnN0IHZhbHVlc0FycmF5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gdmFsdWVzIDogT2JqZWN0LnZhbHVlcyh2YWx1ZXMpXG4gICAgICBjb25zdCB0eXBlcyA9IHZhbHVlc0FycmF5Lm1hcCgodmFsdWU6IHN0cmluZykgPT5cbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKSlcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFVuaW9uXCI6IHtcbiAgICAgIC8vIHoudW5pb24oW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKSAtPiBzdHJpbmcgfCBudW1iZXJcbiAgICAgIGNvbnN0IHVuaW9uT3B0aW9ucyA9IGdldFVuaW9uT3B0aW9ucyh6b2QpXG4gICAgICBjb25zdCB0eXBlczogdHMuVHlwZU5vZGVbXSA9IHVuaW9uT3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiOiB7XG4gICAgICAvLyB6LmRpc2NyaW1pbmF0ZWRVbmlvbigna2luZCcsIFt6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYScpLCBhOiB6LnN0cmluZygpIH0pLCB6Lm9iamVjdCh7IGtpbmQ6IHoubGl0ZXJhbCgnYicpLCBiOiB6Lm51bWJlcigpIH0pXSkgLT4geyBraW5kOiAnYScsIGE6IHN0cmluZyB9IHwgeyBraW5kOiAnYicsIGI6IG51bWJlciB9XG4gICAgICBjb25zdCB1bmlvbk9wdGlvbnMgPSBnZXRVbmlvbk9wdGlvbnMoem9kKVxuICAgICAgY29uc3QgdHlwZXM6IHRzLlR5cGVOb2RlW10gPSB1bmlvbk9wdGlvbnMubWFwKChvcHRpb24pID0+XG4gICAgICAgIHpvZFRvVHNOb2RlKG9wdGlvbiwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICApXG4gICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKHR5cGVzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RFZmZlY3RzXCI6IHtcbiAgICAgIC8vIGlnbm9yZSBhbnkgZWZmZWN0cywgdGhleSB3b24ndCBmYWN0b3IgaW50byB0aGUgdHlwZXNcbiAgICAgIGNvbnN0IGVmZmVjdHNTY2hlbWEgPSBnZXRFZmZlY3RzU2NoZW1hKHpvZClcbiAgICAgIGlmICghZWZmZWN0c1NjaGVtYSkgcmV0dXJuIGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgICBjb25zdCBub2RlID0gem9kVG9Uc05vZGUoZWZmZWN0c1NjaGVtYSwgLi4ub3RoZXJBcmd1bWVudHMpIGFzIHRzLlR5cGVOb2RlXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROYXRpdmVFbnVtXCI6IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlVHlwZVxuICAgICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMoem9kKVxuICAgICAgY29uc3QgZW51bVZhbHVlc09iaiA9XG4gICAgICAgIHR5cGVvZiBlbnVtVmFsdWVzID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGVudW1WYWx1ZXMpXG4gICAgICAgICAgPyBlbnVtVmFsdWVzXG4gICAgICAgICAgOiB7fVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJ1bmlvblwiKSB7XG4gICAgICAgIC8vIGFsbG93IG92ZXJyaWRpbmcgd2l0aCB0aGlzIG9wdGlvblxuICAgICAgICBpZiAodHlwZSkgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuXG4gICAgICAgIGNvbnN0IHR5cGVzID0gT2JqZWN0LnZhbHVlcyhlbnVtVmFsdWVzT2JqKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwodmFsdWUpKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlIGFzIHN0cmluZykpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgICB9XG5cbiAgICAgIC8vIHoubmF0aXZlRW51bShGcnVpdHMpIC0+IEZydWl0c1xuICAgICAgLy8gY2FuIHJlc29sdmUgRnJ1aXRzIGludG8gc3RvcmUgYW5kIHVzZXIgY2FuIGhhbmRsZSBlbnVtc1xuICAgICAgaWYgKCF0eXBlKSByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcblxuICAgICAgaWYgKG9wdGlvbnMubmF0aXZlRW51bXMgPT09IFwicmVzb2x2ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVudW1NZW1iZXJzID0gT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgZW51bVZhbHVlc09iaiBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+XG4gICAgICAgICkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaXRlcmFsID1cbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgICA/IGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwodmFsdWUpXG4gICAgICAgICAgICAgIDogZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKVxuXG4gICAgICAgICAgcmV0dXJuIGYuY3JlYXRlRW51bU1lbWJlcihnZXRJZGVudGlmaWVyT3JTdHJpbmdMaXRlcmFsKGtleSksIGxpdGVyYWwpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcih0eXBlKSkge1xuICAgICAgICAgIHN0b3JlLm5hdGl2ZUVudW1zLnB1c2goXG4gICAgICAgICAgICBmLmNyZWF0ZUVudW1EZWNsYXJhdGlvbih1bmRlZmluZWQsIHR5cGUsIGVudW1NZW1iZXJzKVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZ2V0VHlwZSBvbiBuYXRpdmVFbnVtIG11c3QgcmV0dXJuIGFuIGlkZW50aWZpZXIgd2hlbiBuYXRpdmVFbnVtcyBpcyBcInJlc29sdmVcIidcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RPcHRpb25hbFwiOiB7XG4gICAgICBjb25zdCBpbm5lciA9IGdldElubmVyVHlwZSh6b2QpXG4gICAgICBpZiAoIWlubmVyKSByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFRvVHNOb2RlKGlubmVyLCAuLi5vdGhlckFyZ3VtZW50cykgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCksXG4gICAgICBdKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2ROdWxsYWJsZVwiOiB7XG4gICAgICBjb25zdCBpbm5lciA9IGdldElubmVyVHlwZSh6b2QpXG4gICAgICBpZiAoIWlubmVyKSByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFRvVHNOb2RlKGlubmVyLCAuLi5vdGhlckFyZ3VtZW50cykgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlTnVsbCgpKSxcbiAgICAgIF0pXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFR1cGxlXCI6IHtcbiAgICAgIC8vIHoudHVwbGUoW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKSAtPiBbc3RyaW5nLCBudW1iZXJdXG4gICAgICBjb25zdCBpdGVtcyA9IGdldFR1cGxlSXRlbXMoem9kKVxuICAgICAgY29uc3QgdHlwZXMgPSBpdGVtcy5tYXAoKG9wdGlvbjogWm9kVHlwZUFueSkgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR1cGxlVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFJlY29yZFwiOiB7XG4gICAgICAvLyB6LnJlY29yZCh6Lm51bWJlcigpKSAtPiB7IFt4OiBzdHJpbmddOiBudW1iZXIgfVxuICAgICAgY29uc3QgcmVjb3JkVmFsdWVUeXBlID0gZ2V0UmVjb3JkVmFsdWVUeXBlKHpvZClcbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHJlY29yZFZhbHVlVHlwZVxuICAgICAgICA/IHpvZFRvVHNOb2RlKHJlY29yZFZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICAgIDogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZUxpdGVyYWxOb2RlKFtcbiAgICAgICAgZi5jcmVhdGVJbmRleFNpZ25hdHVyZShcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihcInhcIiksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHZhbHVlVHlwZVxuICAgICAgICApLFxuICAgICAgXSlcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kTWFwXCI6IHtcbiAgICAgIC8vIHoubWFwKHouc3RyaW5nKCkpIC0+IE1hcDxzdHJpbmc+XG4gICAgICBjb25zdCB7IGtleVR5cGU6IG1hcEtleVR5cGUsIHZhbHVlVHlwZTogbWFwVmFsdWVUeXBlIH0gPSBnZXRNYXBUeXBlcyh6b2QpXG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSBtYXBWYWx1ZVR5cGVcbiAgICAgICAgPyB6b2RUb1RzTm9kZShtYXBWYWx1ZVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgICBjb25zdCBrZXlUeXBlID0gbWFwS2V5VHlwZVxuICAgICAgICA/IHpvZFRvVHNOb2RlKG1hcEtleVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIk1hcFwiKSwgW1xuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICBdKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RTZXRcIjoge1xuICAgICAgLy8gei5zZXQoei5zdHJpbmcoKSkgLT4gU2V0PHN0cmluZz5cbiAgICAgIGNvbnN0IHNldFZhbHVlVHlwZSA9IGdldFNldFZhbHVlVHlwZSh6b2QpXG4gICAgICBjb25zdCB0eXBlID0gc2V0VmFsdWVUeXBlXG4gICAgICAgID8gem9kVG9Uc05vZGUoc2V0VmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgICAgOiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJTZXRcIiksIFt0eXBlXSlcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEludGVyc2VjdGlvblwiOiB7XG4gICAgICAvLyB6Lm51bWJlcigpLmFuZCh6LnN0cmluZygpKSAtPiBudW1iZXIgJiBzdHJpbmdcbiAgICAgIGNvbnN0IHsgbGVmdDogaW50ZXJzZWN0TGVmdCwgcmlnaHQ6IGludGVyc2VjdFJpZ2h0IH0gPVxuICAgICAgICBnZXRJbnRlcnNlY3Rpb25QYXJ0cyh6b2QpXG4gICAgICBjb25zdCBsZWZ0ID0gaW50ZXJzZWN0TGVmdFxuICAgICAgICA/IHpvZFRvVHNOb2RlKGludGVyc2VjdExlZnQsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgICBjb25zdCByaWdodCA9IGludGVyc2VjdFJpZ2h0XG4gICAgICAgID8gem9kVG9Uc05vZGUoaW50ZXJzZWN0UmlnaHQsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVJbnRlcnNlY3Rpb25UeXBlTm9kZShbbGVmdCwgcmlnaHRdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kUHJvbWlzZVwiOiB7XG4gICAgICAvLyB6LnByb21pc2Uoei5zdHJpbmcoKSkgLT4gUHJvbWlzZTxzdHJpbmc+XG4gICAgICBjb25zdCBwcm9taXNlVHlwZSA9IGdldFByb21pc2VUeXBlKHpvZClcbiAgICAgIGNvbnN0IHR5cGUgPSBwcm9taXNlVHlwZVxuICAgICAgICA/IHpvZFRvVHNOb2RlKHByb21pc2VUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgICAgOiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJQcm9taXNlXCIpLCBbXG4gICAgICAgIHR5cGUsXG4gICAgICBdKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RGdW5jdGlvblwiOiB7XG4gICAgICAvLyB6LmZ1bmN0aW9uKCkuYXJncyh6LnN0cmluZygpKS5yZXR1cm5zKHoubnVtYmVyKCkpIC0+IChhcmdzXzA6IHN0cmluZykgPT4gbnVtYmVyXG4gICAgICBjb25zdCB7IGFyZ3M6IGZ1bmNBcmdzLCByZXR1cm5zOiBmdW5jUmV0dXJucyB9ID0gZ2V0RnVuY3Rpb25QYXJ0cyh6b2QpXG4gICAgICBjb25zdCBhcmdzSXRlbXMgPSBmdW5jQXJncyA/IGdldFR1cGxlSXRlbXMoZnVuY0FyZ3MpIDogW11cbiAgICAgIGNvbnN0IGFyZ3VtZW50VHlwZXMgPSBhcmdzSXRlbXMubWFwKFxuICAgICAgICAoYXJndW1lbnQ6IFpvZFR5cGVBbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBhcmd1bWVudFR5cGUgPSB6b2RUb1RzTm9kZShhcmd1bWVudCwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2luZGV4fWApLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJndW1lbnRUeXBlXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICApIGFzIHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uW11cblxuICAgICAgYXJndW1lbnRUeXBlcy5wdXNoKFxuICAgICAgICBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuRG90RG90RG90VG9rZW4pLFxuICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihgYXJnc18ke2FyZ3VtZW50VHlwZXMubGVuZ3RofWApLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBmLmNyZWF0ZUFycmF5VHlwZU5vZGUoY3JlYXRlVW5rbm93bktleXdvcmROb2RlKCkpXG4gICAgICAgIClcbiAgICAgIClcblxuICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IGZ1bmNSZXR1cm5zXG4gICAgICAgID8gem9kVG9Uc05vZGUoZnVuY1JldHVybnMsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUZ1bmN0aW9uVHlwZU5vZGUoXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYXJndW1lbnRUeXBlcyxcbiAgICAgICAgcmV0dXJuVHlwZVxuICAgICAgKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2REZWZhdWx0XCI6IHtcbiAgICAgIC8vIHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZWZhdWx0KCdoaScpIC0+IHN0cmluZ1xuICAgICAgY29uc3QgZGVmYXVsdElubmVyID0gZ2V0SW5uZXJUeXBlKHpvZClcbiAgICAgIGlmICghZGVmYXVsdElubmVyKSByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZShkZWZhdWx0SW5uZXIsIC4uLm90aGVyQXJndW1lbnRzKSBhcyB0cy5UeXBlTm9kZVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZE5vZGVzOiB0cy5Ob2RlW10gPSBbXVxuXG4gICAgICB0eXBlLmZvckVhY2hDaGlsZCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAoIVtTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmRdLmluY2x1ZGVzKG5vZGUua2luZCkpIHtcbiAgICAgICAgICBmaWx0ZXJlZE5vZGVzLnB1c2gobm9kZSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZWVkZWQgdG8gc2V0IGNoaWxkcmVuXG4gICAgICB0eXBlLnR5cGVzID0gZmlsdGVyZWROb2Rlc1xuXG4gICAgICByZXR1cm4gdHlwZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkFueUtleXdvcmQpXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBQcm9qZWN0LCBTeW50YXhLaW5kIH0gZnJvbSBcInRzLW1vcnBoXCJcbmltcG9ydCAqIGFzIGVzYnVpbGQgZnJvbSBcImVzYnVpbGRcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9saWIvZGVmYXVsdC1tYXAtZmlsZS1wYXRoLXRvLWh0dHAtcm91dGVcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBhbGxvd2VkSW1wb3J0UGF0dGVybnM/OiBzdHJpbmdbXVxuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG4gIGVzYnVpbGRPcHRpb25zPzogZXNidWlsZC5CdWlsZE9wdGlvbnNcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RSb3V0ZVNwZWNzID0gYXN5bmMgKG9wdHM6IEdlbmVyYXRlUm91dGVUeXBlc09wdHMpID0+IHtcbiAgY29uc3QgeyBwYWNrYWdlRGlyLCBwYXRoR2xvYiA9IFwiL3BhZ2VzL2FwaS8qKi8qLnRzXCIgfSA9IG9wdHNcbiAgY29uc3QgZnVsbFBhdGhHbG9iID0gcGF0aC5wb3NpeC5qb2luKHBhY2thZ2VEaXIsIHBhdGhHbG9iKVxuXG4gIGNvbnN0IHByb2plY3QgPSBuZXcgUHJvamVjdCh7IGNvbXBpbGVyT3B0aW9uczogeyBkZWNsYXJhdGlvbjogdHJ1ZSB9IH0pXG5cbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2plY3QuYWRkU291cmNlRmlsZXNBdFBhdGhzKGZ1bGxQYXRoR2xvYikpIHtcbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gc291cmNlRmlsZS5nZXRFeHBvcnRBc3NpZ25tZW50KFxuICAgICAgKGQpID0+ICFkLmlzRXhwb3J0RXF1YWxzKClcbiAgICApXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCA9IGRlZmF1bHRFeHBvcnRcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIWN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbCkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3Qgd2l0aFJvdXRlU3BlY0NhbGwgPSBjdXJyaWVkV2l0aFJvdXRlU3BlY0NhbGxcbiAgICAgIC5nZXRFeHByZXNzaW9uKClcbiAgICAgIC5hc0tpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbilcbiAgICBpZiAoIXdpdGhSb3V0ZVNwZWNDYWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IFtyb3V0ZVNwZWNdID0gd2l0aFJvdXRlU3BlY0NhbGwuZ2V0QXJndW1lbnRzKClcbiAgICBpZiAoIXJvdXRlU3BlYykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBzb3VyY2VGaWxlLmFkZFN0YXRlbWVudHMoXG4gICAgICBgZXhwb3J0IGNvbnN0IGV4dHJhY3RlZFJvdXRlU3BlYyA9ICR7cm91dGVTcGVjLmdldFRleHQoKX1gXG4gICAgKVxuXG4gICAgZGVmYXVsdEV4cG9ydC5yZW1vdmUoKVxuXG4gICAgLy8gUmVtb3ZlIGFsbCB1bnVzZWQgaW1wb3J0cyBzbyBmaWxlIGNhbiBiZSB0cmVlIHNoYWtlblxuICAgIC8vIChBc3N1bWVzIGFsbCBpbXBvcnRzIGFyZSBmcmVlIG9mIHNpZGUtZWZmZWN0cylcbiAgICBsZXQgbGFzdFdpZHRoOiBudW1iZXJcbiAgICBkbyB7XG4gICAgICBsYXN0V2lkdGggPSBzb3VyY2VGaWxlLmdldEZ1bGxXaWR0aCgpXG4gICAgICAvLyBNYXkgbmVlZCB0byBjYWxsIHRoaXMgbXVsdGlwbGUgdGltZXNcbiAgICAgIHNvdXJjZUZpbGUuZml4VW51c2VkSWRlbnRpZmllcnMoKVxuICAgIH0gd2hpbGUgKGxhc3RXaWR0aCAhPT0gc291cmNlRmlsZS5nZXRGdWxsV2lkdGgoKSlcblxuICAgIGNvbnN0IGFic29sdXRlUGFja2FnZURpciA9IHBhdGgucmVzb2x2ZShwYWNrYWdlRGlyKVxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICBhYnNvbHV0ZVBhY2thZ2VEaXIsXG4gICAgICBzb3VyY2VGaWxlLmdldEZpbGVQYXRoKClcbiAgICApXG4gICAgcGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpXG4gIH1cblxuICBjb25zdCBwYXRoVG9JZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgIC8vIGFkZCBwcmVmaXggdG8gYXZvaWQgc3RhcnRpbmcgd2l0aCBhIG51bWJlclxuICAgIHBhdGhUb0lkW3BhdGhdID1cbiAgICAgIFwiaGFzaFwiICsgY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKHBhdGgpLmRpZ2VzdChcImhleFwiKVxuICB9XG5cbiAgY29uc3QgZW50cnlQb2ludENvbnRlbnQgPSBgXG4gICR7cGF0aHNcbiAgICAubWFwKChwKSA9PiBgaW1wb3J0IHtleHRyYWN0ZWRSb3V0ZVNwZWMgYXMgJHtwYXRoVG9JZFtwXX19IGZyb20gXCIuLyR7cH1cImApXG4gICAgLmpvaW4oXCJcXG5cIil9XG5cbiAgZXhwb3J0IGNvbnN0IHJvdXRlcyA9IHtcbiAgICAke3BhdGhzXG4gICAgICAubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IGh0dHBSb3V0ZSA9IChcbiAgICAgICAgICBvcHRzLm1hcEZpbGVQYXRoVG9IVFRQUm91dGUgPz9cbiAgICAgICAgICBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShvcHRzLmFwaVByZWZpeClcbiAgICAgICAgKShwKVxuXG4gICAgICAgIHJldHVybiBgXCIke2h0dHBSb3V0ZX1cIjogJHtwYXRoVG9JZFtwXX1gXG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIsXFxuXCIpfVxuICB9XG4gIGBcblxuICAvLyBDb3B5IGFsbG93ZWQgaW1wb3J0IGdsb2JzIGludG8gcHJvamVjdFxuICBpZiAob3B0cy5hbGxvd2VkSW1wb3J0UGF0dGVybnMpIHtcbiAgICBwcm9qZWN0LmFkZFNvdXJjZUZpbGVzQXRQYXRocyhvcHRzLmFsbG93ZWRJbXBvcnRQYXR0ZXJucylcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIHR5cGVzICguZC50cylcbiAgY29uc3QgZW50cnlQb2ludCA9IHByb2plY3QuY3JlYXRlU291cmNlRmlsZShcbiAgICBcImV4dHJhY3RlZC1yb3V0ZS1zcGVjcy50c1wiLFxuICAgIGVudHJ5UG9pbnRDb250ZW50XG4gIClcbiAgY29uc3QgZW1pdFJlc3VsdCA9IGVudHJ5UG9pbnQuZ2V0RW1pdE91dHB1dCh7IGVtaXRPbmx5RHRzRmlsZXM6IHRydWUgfSlcbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwYXRoLmRpcm5hbWUob3B0cy5vdXRwdXRGaWxlKSxcbiAgICAgIHBhdGguYmFzZW5hbWUob3B0cy5vdXRwdXRGaWxlKS5yZXBsYWNlKFwiLm1qc1wiLCBcIlwiKS5yZXBsYWNlKFwiLmpzXCIsIFwiXCIpICtcbiAgICAgICAgXCIuZC50c1wiXG4gICAgKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgIGRlY2xhcmF0aW9uRmlsZVBhdGgsXG4gICAgICBlbWl0UmVzdWx0LmdldE91dHB1dEZpbGVzKClbMF0uZ2V0VGV4dCgpXG4gICAgKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgdmFsdWVzICguanMpXG4gIGNvbnN0IHBrZ1JhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgIHBhdGguam9pbihwYWNrYWdlRGlyLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICBcInV0Zi04XCJcbiAgKVxuICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHBrZ1JhdylcblxuICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAuLi5vcHRzLmVzYnVpbGRPcHRpb25zLFxuICAgIHN0ZGluOiB7XG4gICAgICBjb250ZW50czogZW50cnlQb2ludENvbnRlbnQsXG4gICAgICByZXNvbHZlRGlyOiBwYXRoLnJlc29sdmUocGFja2FnZURpciksXG4gICAgfSxcbiAgICBvdXRmaWxlOiBvcHRzLm91dHB1dEZpbGUsXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgICBmb3JtYXQ6IFwiZXNtXCIsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgZXh0ZXJuYWw6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHBrZy5kZXBlbmRlbmNpZXMpLFxuICAgICAgLi4uT2JqZWN0LmtleXMocGtnLmRldkRlcGVuZGVuY2llcyksXG4gICAgICAuLi4ob3B0cy5lc2J1aWxkT3B0aW9ucz8uZXh0ZXJuYWwgPz8gW10pLFxuICAgIF0sXG4gICAgcGx1Z2luczogW1xuICAgICAgLy8gV2l0aCB0aGlzIHBsdWdpbiwgZXNidWlsZCB3aWxsIG5ldmVyIHRvdWNoIHRoZSBhY3R1YWwgZmlsZXN5c3RlbSBhbmQgdGh1cyBjYW5ub3QgaW50ZXJhY3Qgd2l0aCBpbXBvcnRzIHRoYXQgZG9uJ3QgbWF0Y2ggYWxsb3dlZEltcG9ydFBhdHRlcm5zW10uXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwicmVzb2x2ZS12aXJ0dWFsLWZzXCIsXG4gICAgICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvLiovIH0sIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IHByb2plY3QuZ2V0U291cmNlRmlsZShhcmdzLnBhdGgpPy5nZXRGdWxsVGV4dCgpXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudHM6IFwiZXhwb3J0IGRlZmF1bHQge31cIixcbiAgICAgICAgICAgICAgICBsb2FkZXI6IFwidHNcIixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgICAgbG9hZGVyOiBcInRzXCIsXG4gICAgICAgICAgICAgIHJlc29sdmVEaXI6IHBhdGguZGlybmFtZShhcmdzLnBhdGgpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLi4uKG9wdHMuZXNidWlsZE9wdGlvbnM/LnBsdWdpbnMgPz8gW10pLFxuICAgIF0sXG4gIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7OztBQ0FBO0FBQUEsT0FBTyxRQUFRO0FBQ2Y7QUFBQSxFQUNFO0FBQUEsT0FHSztBQUVQLFNBQVMsS0FBQUEsVUFBUzs7O0FDUGxCO0FBQUEsT0FBT0MsV0FBVTs7O0FDQWpCO0FBQUEsT0FBTyxVQUFVO0FBRVYsSUFBTSxnQ0FDWCxDQUFDLGFBQXFCLFdBQ3RCLENBQUMsY0FBc0I7QUFDckIsUUFBTSxRQUFRLFVBRVgsUUFBUSxTQUFTLEdBQUcsRUFFcEIsUUFBUSxPQUFPLEVBQUUsRUFFakIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxZQUFZLEVBQUUsRUFFdEIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxTQUFTLEVBQUUsRUFFbkIsUUFBUSxVQUFVLEVBQUUsRUFFcEIsUUFBUSxpQkFBaUIsRUFBRTtBQUU5QixTQUFPLEtBQUssS0FBSyxZQUFZLEtBQUs7QUFDcEM7OztBRGJLLElBQU0sdUJBQXVCLE9BQU8sU0FNSjtBQUNyQyxRQUFNLFNBQVMsTUFBTSwrQ0FBTyw2QkFBVTtBQUN0QyxRQUFNLFVBQVUsTUFBTSwrQ0FBTyw2QkFBVztBQUN4QyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gseUJBQXlCLDhCQUE4QixLQUFLLFNBQVM7QUFBQSxFQUN2RSxJQUFJO0FBRUosUUFBTSxlQUFlQyxNQUFLLE1BQU0sS0FBSyxZQUFZLFFBQVE7QUFDekQsVUFBUSxJQUFJLGNBQWMsa0JBQWtCO0FBQzVDLFFBQU0sWUFBWSxNQUFNLE9BQU8sR0FBRyxjQUFjO0FBQ2hELFVBQVEsSUFBSSxTQUFTLFVBQVUsY0FBYztBQUM3QyxNQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzFCLFVBQU0sSUFBSSxNQUFNLHNCQUFzQixlQUFlO0FBQUEs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Q3pDO0FBQUEsRUFDRjtBQUdBLFFBQU0sU0FBUyxNQUFTO0FBQUEsSUFDdEJBLE1BQUssS0FBSyxZQUFZLGNBQWM7QUFBQSxJQUNwQztBQUFBLEVBQ0Y7QUFDQSxRQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU07QUFFN0IsUUFBYyxjQUFNO0FBQUEsSUFDbEIsR0FBRyxLQUFLO0FBQUEsSUFDUixPQUFPO0FBQUEsTUFDTCxVQUFVO0FBQUEsTUFDVixZQUFZQSxNQUFLLFFBQVEsVUFBVTtBQUFBLElBQ3JDO0FBQUEsSUFDQSxTQUFTLEtBQUs7QUFBQSxJQUNkLFFBQVE7QUFBQSxJQUNSLFVBQVU7QUFBQSxJQUNWLFFBQVE7QUFBQSxJQUNSLGFBQWE7QUFBQSxJQUNiLFVBQVU7QUFBQSxNQUNSLEdBQUcsT0FBTyxLQUFLLElBQUksWUFBWTtBQUFBLE1BQy9CLEdBQUcsT0FBTyxLQUFLLElBQUksZUFBZTtBQUFBLE1BQ2xDLElBQUksZ0JBQUssbUJBQUwsbUJBQXFCLGFBQXJCLFlBQWlDLENBQUM7QUFBQSxJQUN4QztBQUFBLElBQ0EsU0FBUztBQUFBLE1BRVA7QUFBQSxRQUNFLE1BQU07QUFBQSxRQUNOLE1BQU1HLFFBQU87QUFDWCxVQUFBQSxPQUFNLE9BQU8sRUFBRSxRQUFRLEtBQUssR0FBRyxDQUFDLFNBQVM7QUEvSm5ELGdCQUFBRDtBQWdLWSxrQkFBTSxZQUFXQSxNQUFBLFFBQVEsY0FBYyxLQUFLLElBQUksTUFBL0IsZ0JBQUFBLElBQWtDO0FBQ25ELGdCQUFJLENBQUMsVUFBVTtBQUNiLHFCQUFPO0FBQUEsZ0JBQ0wsVUFBVTtBQUFBLGdCQUNWLFFBQVE7QUFBQSxjQUNWO0FBQUEsWUFDRjtBQUVBLG1CQUFPO0FBQUEsY0FDTDtBQUFBLGNBQ0EsUUFBUTtBQUFBLGNBQ1IsWUFBWUYsTUFBSyxRQUFRLEtBQUssSUFBSTtBQUFBLFlBQ3BDO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLElBQUksZ0JBQUssbUJBQUwsbUJBQXFCLFlBQXJCLFlBQWdDLENBQUM7QUFBQSxJQUN2QztBQUFBLEVBQ0YsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJ6IiwgInBhdGgiLCAicGF0aCIsICJwYXRoIiwgImRlZGVudCIsICJwYXRoIiwgImRlZGVudCIsICJfYSIsICJ6IiwgImZzIiwgImRlZGVudCIsICJwYXJzZURlc2NyaXB0aW9uIiwgImRlZGVudCIsICJ6IiwgIl8iLCAieiIsICJmcyIsICJwYXRoIiwgIlN5bnRheEtpbmQiLCAicGF0aCIsICJTeW50YXhLaW5kIiwgIl9hIiwgImJ1aWxkIl0KfQo=