@rocketshow/designer 1.33.0 → 1.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/assets/i18n/de.json +2 -1
  2. package/assets/i18n/en.json +2 -1
  3. package/esm2022/lib/designer.component.mjs +197 -130
  4. package/esm2022/lib/designer.module.mjs +5 -2
  5. package/esm2022/lib/dropzone/dropzone.component.mjs +93 -0
  6. package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +14 -6
  7. package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +5 -5
  8. package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +6 -4
  9. package/esm2022/lib/fixture/fixture.component.mjs +25 -15
  10. package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +4 -4
  11. package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +73 -21
  12. package/esm2022/lib/models/cached-fixture.mjs +1 -1
  13. package/esm2022/lib/models/fixture-matrix-pixel-group-constraints.mjs +27 -0
  14. package/esm2022/lib/models/fixture-matrix-pixel-group.mjs +12 -0
  15. package/esm2022/lib/models/fixture-matrix.mjs +25 -0
  16. package/esm2022/lib/models/fixture-mode-channel.mjs +26 -0
  17. package/esm2022/lib/models/fixture-mode.mjs +5 -2
  18. package/esm2022/lib/models/fixture-physical.mjs +14 -0
  19. package/esm2022/lib/models/fixture-profile.mjs +16 -1
  20. package/esm2022/lib/models/fixture.mjs +2 -2
  21. package/esm2022/lib/models/preset-fixture.mjs +10 -0
  22. package/esm2022/lib/models/preset.mjs +10 -1
  23. package/esm2022/lib/models/project.mjs +11 -1
  24. package/esm2022/lib/preview/models/color-changer-3d.mjs +5 -108
  25. package/esm2022/lib/preview/models/fixture-3d.mjs +125 -1
  26. package/esm2022/lib/preview/models/moving-head-3d.mjs +3 -122
  27. package/esm2022/lib/preview/preview.component.mjs +21 -16
  28. package/esm2022/lib/services/config.service.mjs +2 -1
  29. package/esm2022/lib/services/fixture.service.mjs +306 -44
  30. package/esm2022/lib/services/preset.service.mjs +92 -42
  31. package/esm2022/lib/services/preview.service.mjs +29 -60
  32. package/esm2022/lib/services/project-load.service.mjs +61 -4
  33. package/esm2022/lib/services/project.service.mjs +11 -15
  34. package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +14 -44
  35. package/fesm2022/rocketshow-designer.mjs +1319 -758
  36. package/fesm2022/rocketshow-designer.mjs.map +1 -1
  37. package/lib/designer.component.d.ts +5 -5
  38. package/lib/designer.module.d.ts +15 -14
  39. package/lib/dropzone/dropzone.component.d.ts +24 -0
  40. package/lib/fixture/fixture.component.d.ts +4 -3
  41. package/lib/models/cached-fixture.d.ts +1 -0
  42. package/lib/models/fixture-matrix-pixel-group-constraints.d.ts +8 -0
  43. package/lib/models/fixture-matrix-pixel-group.d.ts +6 -0
  44. package/lib/models/fixture-matrix.d.ts +6 -0
  45. package/lib/models/fixture-mode-channel.d.ts +8 -0
  46. package/lib/models/fixture-mode.d.ts +3 -1
  47. package/lib/models/fixture-physical.d.ts +4 -0
  48. package/lib/models/fixture-profile.d.ts +5 -0
  49. package/lib/models/preset-fixture.d.ts +5 -0
  50. package/lib/models/preset.d.ts +2 -0
  51. package/lib/models/project.d.ts +3 -0
  52. package/lib/preview/models/color-changer-3d.d.ts +1 -11
  53. package/lib/preview/models/fixture-3d.d.ts +11 -0
  54. package/lib/preview/models/moving-head-3d.d.ts +1 -11
  55. package/lib/services/config.service.d.ts +1 -0
  56. package/lib/services/fixture.service.d.ts +12 -2
  57. package/lib/services/preset.service.d.ts +5 -2
  58. package/lib/services/preview.service.d.ts +2 -5
  59. package/lib/services/project-load.service.d.ts +5 -1
  60. package/lib/services/project.service.d.ts +2 -3
  61. package/lib/services/timeline.service.d.ts +1 -1
  62. package/lib/timeline/composition-settings/composition-settings.component.d.ts +2 -1
  63. package/package.json +1 -1
  64. package/rocketshow-designer-1.36.0.tgz +0 -0
  65. package/esm2022/lib/models/universe.mjs +0 -11
  66. package/esm2022/lib/services/universe.service.mjs +0 -23
  67. package/lib/models/universe.d.ts +0 -8
  68. package/lib/services/universe.service.d.ts +0 -9
  69. package/rocketshow-designer-1.33.0.tgz +0 -0
@@ -38,9 +38,21 @@ export class FixtureService {
38
38
  }
39
39
  }
40
40
  }
41
- getCachedFixtureByUuid(uuid) {
41
+ fixtureUuidAndPixelKeyEquals(fixtureUuid1, fixtureUuid2, pixelKey1, pixelKey2) {
42
+ return fixtureUuid1 === fixtureUuid2 && ((pixelKey1 == null && pixelKey2 == null) || pixelKey1 === pixelKey2);
43
+ }
44
+ getCachedFixtureByUuid(uuid, pixelKey) {
42
45
  for (const fixture of this.cachedFixtures) {
43
- if (fixture.fixture.uuid === uuid) {
46
+ if (this.fixtureUuidAndPixelKeyEquals(fixture.fixture.uuid, uuid, fixture.pixelKey, pixelKey)) {
47
+ return fixture;
48
+ }
49
+ }
50
+ // not yet found -> try searching the fixture without pixelKey for the general channels
51
+ if (pixelKey) {
52
+ return undefined;
53
+ }
54
+ for (const fixture of this.cachedFixtures) {
55
+ if (!fixture.pixelKey && fixture.fixture.uuid === uuid) {
44
56
  return fixture;
45
57
  }
46
58
  }
@@ -250,14 +262,6 @@ export class FixtureService {
250
262
  }
251
263
  return undefined;
252
264
  }
253
- // private channelInList(channels: CachedFixtureChannel[], name: string): boolean {
254
- // for (let channel of channels) {
255
- // if (channel.channelName === name) {
256
- // return true;
257
- // }
258
- // }
259
- // return false;
260
- // }
261
265
  getChannelByName(fixture, channelName) {
262
266
  for (const channel of fixture.channels) {
263
267
  if ((channel.name && channel.name === channelName) ||
@@ -267,51 +271,306 @@ export class FixtureService {
267
271
  }
268
272
  return undefined;
269
273
  }
270
- getCachedChannels(profile, mode) {
274
+ getChannelNameWithPixelKey(templateChannelName, pixelKey) {
275
+ return templateChannelName.replace('$pixelKey', pixelKey);
276
+ }
277
+ addCachedChannel(channels, channel, templateChannelName, pixelKey, profile) {
278
+ const cachedFixtureChannel = new CachedFixtureChannel();
279
+ const channelName = this.getChannelNameWithPixelKey(templateChannelName, pixelKey);
280
+ cachedFixtureChannel.channel = channel;
281
+ cachedFixtureChannel.name = channelName;
282
+ cachedFixtureChannel.capabilities = this.getCapabilitiesByChannel(cachedFixtureChannel.channel, channelName, profile);
283
+ const defaultValue = this.getDefaultValueByChannel(cachedFixtureChannel.channel);
284
+ if (defaultValue) {
285
+ cachedFixtureChannel.defaultValue = defaultValue;
286
+ }
287
+ cachedFixtureChannel.maxValue = this.getMaxValueByChannel(cachedFixtureChannel.channel);
288
+ cachedFixtureChannel.colorWheel = this.getColorWheelByChannel(cachedFixtureChannel, profile);
289
+ channels.push(cachedFixtureChannel);
290
+ }
291
+ alphanumericSort(a, b) {
292
+ return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });
293
+ }
294
+ getAllPixelKeys(profile) {
295
+ let result = [];
296
+ for (let pixelKeyX of profile.matrix.pixelKeys) {
297
+ for (let pixelKeyY of pixelKeyX) {
298
+ for (let pixelKeyZ of pixelKeyY) {
299
+ if (pixelKeyZ) {
300
+ result.push(pixelKeyZ);
301
+ }
302
+ }
303
+ }
304
+ }
305
+ return result;
306
+ }
307
+ getAllPixelGroups(profile) {
308
+ let result = [];
309
+ for (const property of Object.keys(profile.matrix.pixelGroups)) {
310
+ result.push(property);
311
+ }
312
+ return result;
313
+ }
314
+ getPixelKeysInOrder(profile, repeatFor) {
315
+ let result = [];
316
+ // could contain just a single string (e.g. 'eachPixelABC') or
317
+ if (repeatFor.length > 1) {
318
+ // an array of pixel (groups)
319
+ result = repeatFor;
320
+ }
321
+ else if (repeatFor.length === 0) {
322
+ return result;
323
+ }
324
+ else if (repeatFor[0] === 'eachPixelABC') {
325
+ // Gets computed into an alphanumerically sorted list of all pixelKeys
326
+ if (profile.matrix.pixelCount.length === 3) {
327
+ for (let x = 0; x < profile.matrix.pixelCount[0]; x++) {
328
+ for (let y = 0; y < profile.matrix.pixelCount[1]; y++) {
329
+ for (let z = 0; z < profile.matrix.pixelCount[2]; z++) {
330
+ result.push('Pixel ' + (x + 1) + '-' + (y + 1) + '-' + (z + 1));
331
+ }
332
+ }
333
+ }
334
+ }
335
+ else {
336
+ result = result.concat(this.getAllPixelKeys(profile));
337
+ }
338
+ result.sort(this.alphanumericSort);
339
+ }
340
+ else if (repeatFor[0] === 'eachPixelGroup') {
341
+ // Gets computed into an array of all pixel group keys, ordered by appearance in the JSON file
342
+ result = result.concat(this.getAllPixelGroups(profile));
343
+ }
344
+ else if (repeatFor[0] === 'eachPixelXYZ') {
345
+ for (let x = 0; x < profile.matrix.pixelKeys.length; x++) {
346
+ for (let y = 0; y < profile.matrix.pixelKeys[x].length; y++) {
347
+ for (let z = 0; z < profile.matrix.pixelKeys[x][y].length; z++) {
348
+ const pixel = profile.matrix.pixelKeys[x][y][z];
349
+ if (pixel) {
350
+ result.push(pixel);
351
+ }
352
+ }
353
+ }
354
+ }
355
+ }
356
+ else if (repeatFor[0] === 'eachPixelXZY') {
357
+ for (let x = 0; x < profile.matrix.pixelKeys.length; x++) {
358
+ for (let z = 0; z < profile.matrix.pixelKeys[x][0].length; z++) {
359
+ for (let y = 0; y < profile.matrix.pixelKeys[x].length; y++) {
360
+ const pixel = profile.matrix.pixelKeys[x][y][z];
361
+ if (pixel) {
362
+ result.push(pixel);
363
+ }
364
+ }
365
+ }
366
+ }
367
+ }
368
+ else if (repeatFor[0] === 'eachPixelYXZ') {
369
+ for (let y = 0; y < profile.matrix.pixelKeys[0].length; y++) {
370
+ for (let x = 0; x < profile.matrix.pixelKeys.length; x++) {
371
+ for (let z = 0; z < profile.matrix.pixelKeys[x][y].length; z++) {
372
+ const pixel = profile.matrix.pixelKeys[x][y][z];
373
+ if (pixel) {
374
+ result.push(pixel);
375
+ }
376
+ }
377
+ }
378
+ }
379
+ }
380
+ else if (repeatFor[0] === 'eachPixelYZX') {
381
+ for (let y = 0; y < profile.matrix.pixelKeys[0].length; y++) {
382
+ for (let z = 0; z < profile.matrix.pixelKeys[0][y].length; z++) {
383
+ for (let x = 0; x < profile.matrix.pixelKeys.length; x++) {
384
+ const pixel = profile.matrix.pixelKeys[x][y][z];
385
+ if (pixel) {
386
+ result.push(pixel);
387
+ }
388
+ }
389
+ }
390
+ }
391
+ }
392
+ else if (repeatFor[0] === 'eachPixelZXY') {
393
+ for (let z = 0; z < profile.matrix.pixelKeys[0][0].length; z++) {
394
+ for (let x = 0; x < profile.matrix.pixelKeys.length; x++) {
395
+ for (let y = 0; y < profile.matrix.pixelKeys[x].length; y++) {
396
+ const pixel = profile.matrix.pixelKeys[x][y][z];
397
+ if (pixel) {
398
+ result.push(pixel);
399
+ }
400
+ }
401
+ }
402
+ }
403
+ }
404
+ else if (repeatFor[0] === 'eachPixelZYX') {
405
+ for (let z = 0; z < profile.matrix.pixelKeys[0][0].length; z++) {
406
+ for (let y = 0; y < profile.matrix.pixelKeys[0].length; y++) {
407
+ for (let x = 0; x < profile.matrix.pixelKeys.length; x++) {
408
+ const pixel = profile.matrix.pixelKeys[x][y][z];
409
+ if (pixel) {
410
+ result.push(pixel);
411
+ }
412
+ }
413
+ }
414
+ }
415
+ }
416
+ return result;
417
+ }
418
+ getModeChannelCount(profile, mode) {
419
+ let count = 0;
420
+ // already calculated?
421
+ if (mode.channelCount) {
422
+ return mode.channelCount;
423
+ }
424
+ for (let channel of mode.channels) {
425
+ if (channel.insert === 'matrixChannels') {
426
+ if (channel.repeatFor.length > 1) {
427
+ count += channel.repeatFor.length * channel.templateChannels.length;
428
+ }
429
+ else if (channel.repeatFor[0] === 'eachPixelGroup') {
430
+ count += profile.matrix.pixelGroups.length * channel.templateChannels.length;
431
+ }
432
+ else if (channel.repeatFor[0].startsWith('eachPixel')) {
433
+ if (profile.matrix.pixelCount.length === 3) {
434
+ count +=
435
+ profile.matrix.pixelCount[0] * profile.matrix.pixelCount[1] * profile.matrix.pixelCount[2] * channel.templateChannels.length;
436
+ }
437
+ else {
438
+ for (let x = 0; x < profile.matrix.pixelKeys.length; x++) {
439
+ for (let y = 0; y < profile.matrix.pixelKeys[x].length; y++) {
440
+ for (let z = 0; z < profile.matrix.pixelKeys[x][y].length; z++) {
441
+ const pixel = profile.matrix.pixelKeys[x][y][z];
442
+ if (pixel) {
443
+ count += channel.templateChannels.length;
444
+ }
445
+ }
446
+ }
447
+ }
448
+ }
449
+ }
450
+ }
451
+ else {
452
+ count++;
453
+ }
454
+ }
455
+ mode.channelCount = count;
456
+ return mode.channelCount;
457
+ }
458
+ getCachedChannels(profile, mode, pixelKey) {
271
459
  const channels = [];
272
460
  if (!mode) {
273
461
  return channels;
274
462
  }
275
- for (const availableChannelName of Object.keys(profile.availableChannels)) {
276
- const availableChannel = profile.availableChannels[availableChannelName];
277
- for (const channel of mode.channels) {
278
- // check for string channel. It can get creepy for matrix modes
279
- if (typeof channel === 'string') {
280
- const modeChannel = channel;
281
- // don't check the fine channels. only add the coarse channel.
282
- if (modeChannel === availableChannelName) {
283
- const cachedFixtureChannel = new CachedFixtureChannel();
284
- cachedFixtureChannel.channel = availableChannel;
285
- cachedFixtureChannel.name = availableChannelName;
286
- cachedFixtureChannel.capabilities = this.getCapabilitiesByChannel(cachedFixtureChannel.channel, availableChannelName, profile);
287
- const defaultValue = this.getDefaultValueByChannel(cachedFixtureChannel.channel);
288
- if (defaultValue) {
289
- cachedFixtureChannel.defaultValue = defaultValue;
463
+ for (const channel of mode.channels) {
464
+ if (channel.name && !pixelKey) {
465
+ // direct reference to a channel
466
+ // don't check the fine channels. only add the coarse channel.
467
+ let channelFound = false;
468
+ for (const availableChannelName of Object.keys(profile.availableChannels)) {
469
+ if (channel.name === availableChannelName) {
470
+ const availableChannel = profile.availableChannels[availableChannelName];
471
+ this.addCachedChannel(channels, availableChannel, availableChannelName, null, profile);
472
+ }
473
+ }
474
+ // check the template channels, if not found in the available channels
475
+ if (!channelFound) {
476
+ for (const templateChannelName of Object.keys(profile.templateChannels)) {
477
+ let existingPixelKeys = this.getAllPixelKeys(profile).concat(this.getAllPixelGroups(profile));
478
+ for (const existingPixelKey of existingPixelKeys) {
479
+ const channelName = this.getChannelNameWithPixelKey(templateChannelName, existingPixelKey);
480
+ if (channel.name === channelName) {
481
+ const templateChannel = profile.templateChannels[templateChannelName];
482
+ this.addCachedChannel(channels, templateChannel, channelName, existingPixelKey, profile);
483
+ }
290
484
  }
291
- cachedFixtureChannel.maxValue = this.getMaxValueByChannel(cachedFixtureChannel.channel);
292
- cachedFixtureChannel.colorWheel = this.getColorWheelByChannel(cachedFixtureChannel, profile);
293
- channels.push(cachedFixtureChannel);
294
485
  }
295
486
  }
296
- else {
297
- // null may be passed as a placeholder for an undefined channel
298
- channels.push(new CachedFixtureChannel());
487
+ }
488
+ else {
489
+ // reference a channel through a pixel matrix
490
+ const availablePixelKeys = this.getPixelKeysInOrder(profile, channel.repeatFor);
491
+ if (channel.channelOrder === 'perPixel') {
492
+ // each channel for each pixel
493
+ for (const availablePixelKey of availablePixelKeys) {
494
+ if (availablePixelKey === pixelKey) {
495
+ for (const modeTemplateChannelName of channel.templateChannels) {
496
+ for (const templateChannelName of Object.keys(profile.templateChannels)) {
497
+ // don't check the fine channels. only add the coarse channel.
498
+ if (modeTemplateChannelName === templateChannelName) {
499
+ const templateChannel = profile.templateChannels[templateChannelName];
500
+ this.addCachedChannel(channels, templateChannel, templateChannelName, availablePixelKey, profile);
501
+ }
502
+ }
503
+ }
504
+ }
505
+ }
506
+ }
507
+ else if (channel.channelOrder === 'perChannel') {
508
+ // each pixel for each channel
509
+ for (const modeTemplateChannelName of channel.templateChannels) {
510
+ for (const availablePixelKey of availablePixelKeys) {
511
+ if (availablePixelKey === pixelKey) {
512
+ for (const templateChannelName of Object.keys(profile.templateChannels)) {
513
+ // don't check the fine channels. only add the coarse channel.
514
+ if (modeTemplateChannelName === templateChannelName) {
515
+ const templateChannel = profile.templateChannels[templateChannelName];
516
+ this.addCachedChannel(channels, templateChannel, templateChannelName, availablePixelKey, profile);
517
+ }
518
+ }
519
+ }
520
+ }
521
+ }
299
522
  }
300
523
  }
301
524
  }
302
525
  return channels;
303
526
  }
527
+ fixtureGetUniquePixelKeys(fixture) {
528
+ let pixelKeys = new Set();
529
+ let profile = this.getProfileByUuid(fixture.profileUuid);
530
+ let mode = this.getModeByFixture(profile, fixture);
531
+ // add the unique pixel keys
532
+ for (let channel of mode.channels) {
533
+ this.getPixelKeysInOrder(profile, channel.repeatFor).forEach((str) => {
534
+ pixelKeys.add(str);
535
+ });
536
+ }
537
+ return Array.from(pixelKeys);
538
+ }
539
+ // does the fixture have a general channel without reference to specific pixel keys in the current mode?
540
+ fixtureHasGeneralChannel(fixture) {
541
+ let profile = this.getProfileByUuid(fixture.profileUuid);
542
+ let mode = this.getModeByFixture(profile, fixture);
543
+ // add the unique pixel keys
544
+ for (let channel of mode.channels) {
545
+ if (this.getPixelKeysInOrder(profile, channel.repeatFor).length === 0) {
546
+ return true;
547
+ }
548
+ }
549
+ return false;
550
+ }
304
551
  updateCachedFixtures() {
305
552
  // calculate some frequently used values as a cache to save cpu time
306
553
  // afterwards
307
554
  this.cachedFixtures = [];
308
555
  for (const fixture of this.projectService.project.fixtures) {
309
- const cachedFixture = new CachedFixture();
310
- cachedFixture.fixture = fixture;
311
- cachedFixture.profile = this.getProfileByUuid(fixture.profileUuid);
312
- cachedFixture.mode = this.getModeByFixture(cachedFixture.profile, fixture);
313
- cachedFixture.channels = this.getCachedChannels(cachedFixture.profile, cachedFixture.mode);
314
- this.cachedFixtures.push(cachedFixture);
556
+ if (this.fixtureHasGeneralChannel(fixture)) {
557
+ const cachedFixture = new CachedFixture();
558
+ cachedFixture.fixture = fixture;
559
+ cachedFixture.profile = this.getProfileByUuid(fixture.profileUuid);
560
+ cachedFixture.mode = this.getModeByFixture(cachedFixture.profile, fixture);
561
+ cachedFixture.channels = this.getCachedChannels(cachedFixture.profile, cachedFixture.mode, null);
562
+ this.cachedFixtures.push(cachedFixture);
563
+ }
564
+ const pixelKeys = this.fixtureGetUniquePixelKeys(fixture);
565
+ for (let pixelKey of pixelKeys) {
566
+ const cachedFixture = new CachedFixture();
567
+ cachedFixture.fixture = fixture;
568
+ cachedFixture.pixelKey = pixelKey;
569
+ cachedFixture.profile = this.getProfileByUuid(fixture.profileUuid);
570
+ cachedFixture.mode = this.getModeByFixture(cachedFixture.profile, fixture);
571
+ cachedFixture.channels = this.getCachedChannels(cachedFixture.profile, cachedFixture.mode, pixelKey);
572
+ this.cachedFixtures.push(cachedFixture);
573
+ }
315
574
  }
316
575
  }
317
576
  capabilitiesMatch(type1, type2, color1, color2, wheel1, wheel2, profileUuid1, profileUuid2) {
@@ -358,11 +617,13 @@ export class FixtureService {
358
617
  for (let i = 0; i < 512; i++) {
359
618
  let occupiedChannels = 0;
360
619
  for (const fixture of fixturePool) {
620
+ const profile = this.getProfileByUuid(fixture.profileUuid);
361
621
  const mode = this.getModeByFixture(this.getProfileByUuid(fixture.profileUuid), fixture);
362
- if (i >= fixture.dmxFirstChannel && i < fixture.dmxFirstChannel + mode.channels.length) {
622
+ const channelCount = this.getModeChannelCount(profile, mode);
623
+ if (i >= fixture.dmxFirstChannel && i < fixture.dmxFirstChannel + channelCount) {
363
624
  // this channel is already occupied by a fixture -> move forward to the end of the fixture
364
- if (mode.channels.length > occupiedChannels) {
365
- occupiedChannels = mode.channels.length - (i - fixture.dmxFirstChannel);
625
+ if (channelCount > occupiedChannels) {
626
+ occupiedChannels = channelCount - (i - fixture.dmxFirstChannel);
366
627
  }
367
628
  }
368
629
  }
@@ -403,8 +664,9 @@ export class FixtureService {
403
664
  else {
404
665
  fixture.modeShortName = profile.modes[0].shortName || profile.modes[0].name;
405
666
  }
406
- const mode = this.getModeByFixture(this.getProfileByUuid(fixture.profileUuid), fixture);
407
- const firstChannel = this.getNextFreeDmxChannel(fixturePool, mode.channels.length);
667
+ const mode = this.getModeByFixture(profile, fixture);
668
+ const channelCount = this.getModeChannelCount(profile, mode);
669
+ const firstChannel = this.getNextFreeDmxChannel(fixturePool, channelCount);
408
670
  if (firstChannel >= 0) {
409
671
  fixture.dmxFirstChannel = firstChannel;
410
672
  fixturePool.push(fixture);
@@ -428,4 +690,4 @@ export class FixtureService {
428
690
  providedIn: 'root',
429
691
  }]
430
692
  }], () => [{ type: i1.HttpClient }, { type: i2.ProjectService }, { type: i3.TranslateService }, { type: i4.ToastrService }, { type: i5.UuidService }], null); })();
431
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduZXIvc3JjL2xpYi9zZXJ2aWNlcy9maXh0dXJlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFBb0Isb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBSzdDLE1BQU0sT0FBTyxjQUFjO0lBUXpCLFlBQ1UsSUFBZ0IsRUFDaEIsY0FBOEIsRUFDOUIsZ0JBQWtDLEVBQ2xDLGFBQTRC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TSxZQUFZLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRW5GLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxlQUFlLEdBQUcsWUFBWSxDQUFDO1lBQ3ZDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUIsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQzthQUFNLENBQUM7WUFDTix3QkFBd0I7WUFDeEIsTUFBTSxHQUFHLEdBQUcscUNBQXFDLENBQUM7WUFDbEQsTUFBTSxLQUFLLEdBQUcsMkNBQTJDLENBQUM7WUFFMUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQzsrRUE3ZVUsY0FBYzt1RUFBZCxjQUFjLFdBQWQsY0FBYyxtQkFGYixNQUFNOztpRkFFUCxjQUFjO2NBSDFCLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENhY2hlZEZpeHR1cmUgfSBmcm9tICcuLi9tb2RlbHMvY2FjaGVkLWZpeHR1cmUnO1xuaW1wb3J0IHsgQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHkgfSBmcm9tICcuLi9tb2RlbHMvY2FjaGVkLWZpeHR1cmUtY2FwYWJpbGl0eSc7XG5pbXBvcnQgeyBDYWNoZWRGaXh0dXJlQ2hhbm5lbCB9IGZyb20gJy4uL21vZGVscy9jYWNoZWQtZml4dHVyZS1jaGFubmVsJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbW9kZWxzL2NvbG9yJztcbmltcG9ydCB7IEZpeHR1cmUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZSc7XG5pbXBvcnQgeyBGaXh0dXJlQ2FwYWJpbGl0eSwgRml4dHVyZUNhcGFiaWxpdHlDb2xvciwgRml4dHVyZUNhcGFiaWxpdHlUeXBlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtY2FwYWJpbGl0eSc7XG5pbXBvcnQgeyBGaXh0dXJlQ2hhbm5lbCB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLWNoYW5uZWwnO1xuaW1wb3J0IHsgRml4dHVyZU1vZGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1tb2RlJztcbmltcG9ydCB7IEZpeHR1cmVQcm9maWxlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtcHJvZmlsZSc7XG5pbXBvcnQgeyBGaXh0dXJlV2hlZWwgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS13aGVlbCc7XG5pbXBvcnQgeyBGaXh0dXJlV2hlZWxTbG90LCBGaXh0dXJlV2hlZWxTbG90VHlwZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLXdoZWVsLXNsb3QnO1xuaW1wb3J0IHsgUHJvamVjdFNlcnZpY2UgfSBmcm9tICcuL3Byb2plY3Quc2VydmljZSc7XG5pbXBvcnQgeyBVdWlkU2VydmljZSB9IGZyb20gJy4vdXVpZC5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEZpeHR1cmVTZXJ2aWNlIHtcbiAgY2FjaGVkRml4dHVyZXM6IENhY2hlZEZpeHR1cmVbXSA9IFtdO1xuXG4gIC8vIGlzIHRoZSBzaWRlLXRhYiBzZXR0aW5ncyBjdXJyZW50bHkgc2VsZWN0ZWQ/XG4gIHNldHRpbmdzU2VsZWN0aW9uID0gZmFsc2U7XG5cbiAgc2VsZWN0ZWRTZXR0aW5nc0ZpeHR1cmVzOiBGaXh0dXJlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBwcm9qZWN0U2VydmljZTogUHJvamVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RyU2VydmljZSxcbiAgICBwcml2YXRlIHV1aWRTZXJ2aWNlOiBVdWlkU2VydmljZVxuICApIHt9XG5cbiAgZ2V0Rml4dHVyZUJ5VXVpZCh1dWlkOiBzdHJpbmcpOiBGaXh0dXJlIHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVzKSB7XG4gICAgICBpZiAoZml4dHVyZS51dWlkID09PSB1dWlkKSB7XG4gICAgICAgIHJldHVybiBmaXh0dXJlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldENhY2hlZEZpeHR1cmVCeVV1aWQodXVpZDogc3RyaW5nKTogQ2FjaGVkRml4dHVyZSB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuY2FjaGVkRml4dHVyZXMpIHtcbiAgICAgIGlmIChmaXh0dXJlLmZpeHR1cmUudXVpZCA9PT0gdXVpZCkge1xuICAgICAgICByZXR1cm4gZml4dHVyZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBHZXQgYWxsIHByb2ZpbGVzIHRvIHNlYXJjaCBmb3IgKG9ubHkgbWV0YWRhdGEpXG4gIGdldFNlYXJjaFByb2ZpbGVzKCk6IE9ic2VydmFibGU8Rml4dHVyZVByb2ZpbGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KCdmaXh0dXJlcycpLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlOiBvYmplY3RbXSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQcm9maWxlczogRml4dHVyZVByb2ZpbGVbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvZmlsZSBvZiByZXNwb25zZSkge1xuICAgICAgICAgIHNlYXJjaFByb2ZpbGVzLnB1c2gobmV3IEZpeHR1cmVQcm9maWxlKHByb2ZpbGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWFyY2hQcm9maWxlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldFByb2ZpbGVCeVV1aWQodXVpZDogc3RyaW5nKTogRml4dHVyZVByb2ZpbGUge1xuICAgIGZvciAoY29uc3QgZml4dHVyZVByb2ZpbGUgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVQcm9maWxlcykge1xuICAgICAgaWYgKGZpeHR1cmVQcm9maWxlLnV1aWQgPT09IHV1aWQpIHtcbiAgICAgICAgcmV0dXJuIGZpeHR1cmVQcm9maWxlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvYWRQcm9maWxlQnlVdWlkKHV1aWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IGxvYWRlZFByb2ZpbGUgPSB0aGlzLmdldFByb2ZpbGVCeVV1aWQodXVpZCk7XG5cbiAgICBpZiAobG9hZGVkUHJvZmlsZSkge1xuICAgICAgLy8gVGhpcyBwcm9maWxlIGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHRoZSBtZXRhZGF0YSBhbmQgdGhlIHByb2ZpbGVcbiAgICByZXR1cm4gZm9ya0pvaW4oW3RoaXMuaHR0cC5nZXQoJ2ZpeHR1cmVzP3V1aWQ9JyArIGVuY29kZVVSSSh1dWlkKSksIHRoaXMuaHR0cC5nZXQoJ2ZpeHR1cmU/dXVpZD0nICsgZW5jb2RlVVJJKHV1aWQpKV0pLnBpcGUoXG4gICAgICBtYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zdCBtZXJnZWREYXRhID0geyAuLi5yZXN1bHRbMF1bMF0sIC4uLnJlc3VsdFsxXSB9O1xuICAgICAgICBjb25zdCBmaXh0dXJlUHJvZmlsZSA9IG5ldyBGaXh0dXJlUHJvZmlsZShtZXJnZWREYXRhKTtcbiAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVQcm9maWxlcy5wdXNoKGZpeHR1cmVQcm9maWxlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldFJvdGF0aW9uQW5nbGVEZWcodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8gY29udmVydCBhIHJvdGF0aW9uIGFuZ2xlIHZhbHVlIGludG8gZGVncmVlc1xuICAgIGlmICh2YWx1ZS5lbmRzV2l0aCgnZGVnJykpIHtcbiAgICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQodmFsdWUucmVwbGFjZSgnZGVnJywgJycpLCAxMCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5lbmRzV2l0aCgnJScpKSB7XG4gICAgICBjb25zdCBwZXJjID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlLnJlcGxhY2UoJyUnLCAnJyksIDEwKTtcbiAgICAgIHJldHVybiAocGVyYyAvIDEwMCkgKiAzNjA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFdoZWVsU2xvdENvbG9ycyh3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGNvbG9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3aGVlbFNsb3RzID0gdGhpcy5nZXRXaGVlbFNsb3RzKHdoZWVsLCBzbG90TnVtYmVyKTtcblxuICAgIGZvciAoY29uc3Qgc2xvdCBvZiB3aGVlbFNsb3RzKSB7XG4gICAgICBpZiAoc2xvdC5jb2xvcnMgJiYgc2xvdC5jb2xvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb2xvcnMgPSBjb2xvcnMuY29uY2F0KHNsb3QuY29sb3JzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZ2V0TWl4ZWRXaGVlbFNsb3RDb2xvcih3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBDb2xvciB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5nZXRXaGVlbFNsb3RDb2xvcnMod2hlZWwsIHNsb3ROdW1iZXIpO1xuICAgIGNvbnN0IGNvbG9yc1JnYjogQ29sb3JbXSA9IFtdO1xuXG4gICAgaWYgKGNvbG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb2xvciBvZiBjb2xvcnMpIHtcbiAgICAgIGNvbG9yc1JnYi5wdXNoKHRoaXMuaGV4VG9SZ2IoY29sb3IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5taXhDb2xvcnMoY29sb3JzUmdiKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcG9uZW50VG9IZXgoYzogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBoZXggPSBjLnRvU3RyaW5nKDE2KTtcbiAgICByZXR1cm4gaGV4Lmxlbmd0aCA9PT0gMSA/ICcwJyArIGhleCA6IGhleDtcbiAgfVxuXG4gIHJnYlRvSGV4KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAnIycgKyB0aGlzLmNvbXBvbmVudFRvSGV4KHIpICsgdGhpcy5jb21wb25lbnRUb0hleChnKSArIHRoaXMuY29tcG9uZW50VG9IZXgoYik7XG4gIH1cblxuICBoZXhUb1JnYihoZXg6IHN0cmluZyk6IENvbG9yIHtcbiAgICAvLyBleHBhbmQgc2hvcnRoYW5kIGZvcm0gKGUuZy4gXCIwM0ZcIikgdG8gZnVsbCBmb3JtIChlLmcuIFwiMDAzM0ZGXCIpXG4gICAgY29uc3Qgc2hvcnRoYW5kUmVnZXggPSAvXiM/KFthLWZcXGRdKShbYS1mXFxkXSkoW2EtZlxcZF0pJC9pO1xuICAgIGhleCA9IGhleC5yZXBsYWNlKHNob3J0aGFuZFJlZ2V4LCAobSwgciwgZywgYikgPT4ge1xuICAgICAgcmV0dXJuIHIgKyByICsgZyArIGcgKyBiICsgYjtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpO1xuICAgIHJldHVybiByZXN1bHQgPyBuZXcgQ29sb3IocGFyc2VJbnQocmVzdWx0WzFdLCAxNiksIHBhcnNlSW50KHJlc3VsdFsyXSwgMTYpLCBwYXJzZUludChyZXN1bHRbM10sIDE2KSkgOiBudWxsO1xuICB9XG5cbiAgbWl4Q29sb3JzKGNvbG9yczogQ29sb3JbXSk6IENvbG9yIHtcbiAgICAvLyBtaXggYW4gYXJyYXkgb2YgcmdiLWNvbG9ycyBjb250YWluaW5nIHIsIGcsIGIgdmFsdWVzIHRvIGEgbmV3IGNvbG9yXG4gICAgbGV0IHIgPSAwO1xuICAgIGxldCBnID0gMDtcbiAgICBsZXQgYiA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGNvbG9yIG9mIGNvbG9ycykge1xuICAgICAgciArPSBjb2xvci5yZWQ7XG4gICAgICBnICs9IGNvbG9yLmdyZWVuO1xuICAgICAgYiArPSBjb2xvci5ibHVlO1xuICAgIH1cblxuICAgIHIgLz0gY29sb3JzLmxlbmd0aDtcbiAgICBnIC89IGNvbG9ycy5sZW5ndGg7XG4gICAgYiAvPSBjb2xvcnMubGVuZ3RoO1xuXG4gICAgcmV0dXJuIG5ldyBDb2xvcihyLCBnLCBiKTtcbiAgfVxuXG4gIHdoZWVsSGFzU2xvdFR5cGUod2hlZWw6IEZpeHR1cmVXaGVlbCwgc2xvdFR5cGU6IEZpeHR1cmVXaGVlbFNsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzbG90IG9mIHdoZWVsLnNsb3RzKSB7XG4gICAgICBpZiAoc2xvdC50eXBlID09PSBzbG90VHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRXaGVlbEJ5TmFtZShwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSwgd2hlZWxOYW1lOiBzdHJpbmcpOiBGaXh0dXJlV2hlZWwge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvZmlsZS53aGVlbHMpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSA9PT0gd2hlZWxOYW1lKSB7XG4gICAgICAgIHJldHVybiBwcm9maWxlLndoZWVsc1twcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gd2hlZWwgbm90IGZvdW5kXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2hlZWxTbG90cyh3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBGaXh0dXJlV2hlZWxTbG90W10ge1xuICAgIC8vIHJldHVybiBvbmUgc2xvdCBvciB0d28gc2xvdHMsIGlmIHRoZXkgYXJlIG1peGVkIChlLmcuIHNsb3IgbnVtYmVyIDIuNSByZXR1cm5zIHRoZSBzbG90cyAyIGFuZCAzKVxuICAgIGNvbnN0IHNsb3RzOiBGaXh0dXJlV2hlZWxTbG90W10gPSBbXTtcblxuICAgIGlmICghd2hlZWwpIHtcbiAgICAgIHJldHVybiBzbG90cztcbiAgICB9XG5cbiAgICBpZiAoc2xvdE51bWJlciAtIE1hdGguZmxvb3Ioc2xvdE51bWJlcikgPiAwKSB7XG4gICAgICAvLyB0d28gc2xvdHMgYXJlIHNldFxuICAgICAgY29uc3QgbnVtYmVyID0gTWF0aC5mbG9vcihzbG90TnVtYmVyKTtcbiAgICAgIHNsb3RzLnB1c2god2hlZWwuc2xvdHNbbnVtYmVyIC0gMV0pO1xuICAgICAgaWYgKG51bWJlciA+PSAwICYmIG51bWJlciA8IHdoZWVsLnNsb3RzLmxlbmd0aCkge1xuICAgICAgICBzbG90cy5wdXNoKHdoZWVsLnNsb3RzW251bWJlcl0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IG9uZSBzbG90IGlzIHNldFxuICAgICAgc2xvdHMucHVzaCh3aGVlbC5zbG90c1tzbG90TnVtYmVyIC0gMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBzbG90cztcbiAgfVxuXG4gIGdldE1vZGVCeUZpeHR1cmUocHJvZmlsZTogRml4dHVyZVByb2ZpbGUsIGZpeHR1cmU6IEZpeHR1cmUpOiBGaXh0dXJlTW9kZSB7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHByb2ZpbGUubW9kZXMpIHtcbiAgICAgIGlmIChtb2RlLnNob3J0TmFtZSkge1xuICAgICAgICBpZiAobW9kZS5zaG9ydE5hbWUgPT09IGZpeHR1cmUubW9kZVNob3J0TmFtZSkge1xuICAgICAgICAgIHJldHVybiBtb2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobW9kZS5uYW1lID09PSBmaXh0dXJlLm1vZGVTaG9ydE5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gbW9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rml4dHVyZUNhcGFiaWxpdHkoY2FwYWJpbGl0eTogRml4dHVyZUNhcGFiaWxpdHksIGNoYW5uZWxOYW1lOiBzdHJpbmcsIHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKTogQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHkge1xuICAgIGNvbnN0IGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5ID0gbmV3IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5KCk7XG4gICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7XG4gICAgaWYgKGNhcGFiaWxpdHkuc2xvdE51bWJlcikge1xuICAgICAgLy8gdGhlcmUgaXMgYSB3aGVlbCBjb25uZWN0ZWQgdG8gdGhpcyBjYXBhYmlsaXR5XG4gICAgICBpZiAodHlwZW9mIGNhcGFiaWxpdHkud2hlZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsTmFtZSA9IGNhcGFiaWxpdHkud2hlZWwgYXMgc3RyaW5nO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNhcGFiaWxpdHkud2hlZWwpKSB7XG4gICAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsTmFtZSA9IGNhcGFiaWxpdHkud2hlZWxbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbE5hbWUgPSBjaGFubmVsTmFtZTtcbiAgICAgIH1cbiAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsID0gdGhpcy5nZXRXaGVlbEJ5TmFtZShwcm9maWxlLCBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbE5hbWUpO1xuICAgICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkud2hlZWxTbG90cyA9IHRoaXMuZ2V0V2hlZWxTbG90cyhjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbCwgY2FwYWJpbGl0eS5zbG90TnVtYmVyKTtcbiAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsSXNDb2xvciA9IHRoaXMud2hlZWxIYXNTbG90VHlwZShjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbCwgRml4dHVyZVdoZWVsU2xvdFR5cGUuQ29sb3IpO1xuICAgIH1cbiAgICBpZiAoY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZSAmJiBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LmRteFJhbmdlLmxlbmd0aCA9PT0gMikge1xuICAgICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2VudGVyVmFsdWUgPSBNYXRoLmZsb29yKFxuICAgICAgICAoY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZVswXSArIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LmNhcGFiaWxpdHkuZG14UmFuZ2VbMV0pIC8gMlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYXBhYmlsaXRpZXNCeUNoYW5uZWwoXG4gICAgZml4dHVyZUNoYW5uZWw6IEZpeHR1cmVDaGFubmVsLFxuICAgIGNoYW5uZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvZmlsZTogRml4dHVyZVByb2ZpbGVcbiAgKTogQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHlbXSB7XG4gICAgY29uc3QgY2FwYWJpbGl0ZXM6IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5W10gPSBbXTtcblxuICAgIGlmIChmaXh0dXJlQ2hhbm5lbC5jYXBhYmlsaXR5KSB7XG4gICAgICBjYXBhYmlsaXRlcy5wdXNoKHRoaXMuZ2V0Rml4dHVyZUNhcGFiaWxpdHkoZml4dHVyZUNoYW5uZWwuY2FwYWJpbGl0eSwgY2hhbm5lbE5hbWUsIHByb2ZpbGUpKTtcbiAgICB9IGVsc2UgaWYgKGZpeHR1cmVDaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIGZpeHR1cmVDaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgICBjYXBhYmlsaXRlcy5wdXNoKHRoaXMuZ2V0Rml4dHVyZUNhcGFiaWxpdHkoY2FwYWJpbGl0eSwgY2hhbm5lbE5hbWUsIHByb2ZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2FwYWJpbGl0ZXM7XG4gIH1cblxuICBwcml2YXRlIGdldE1heFZhbHVlQnlDaGFubmVsKGZpeHR1cmVDaGFubmVsOiBGaXh0dXJlQ2hhbm5lbCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDI1NiwgMSArIGZpeHR1cmVDaGFubmVsLmZpbmVDaGFubmVsQWxpYXNlcy5sZW5ndGgpIC0gMTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZhbHVlQnlDaGFubmVsKGZpeHR1cmVDaGFubmVsOiBGaXh0dXJlQ2hhbm5lbCk6IG51bWJlciB7XG4gICAgaWYgKCFmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFOKGZpeHR1cmVDaGFubmVsLmRlZmF1bHRWYWx1ZSBhcyBhbnkpICYmIChmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKS5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAvLyBwZXJjZW50YWdlIHZhbHVlXG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gTnVtYmVyLnBhcnNlSW50KChmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKS5yZXBsYWNlKCclJywgJycpLCAxMCk7XG4gICAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMuZ2V0TWF4VmFsdWVCeUNoYW5uZWwoZml4dHVyZUNoYW5uZWwpO1xuICAgICAgcmV0dXJuIChtYXhWYWx1ZSAvIDEwMCkgKiBwZXJjZW50YWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBETVggdmFsdWVcbiAgICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQoZml4dHVyZUNoYW5uZWwuZGVmYXVsdFZhbHVlIGFzIGFueSwgMTApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sb3JXaGVlbEJ5Q2hhbm5lbChjaGFubmVsOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbCwgcHJvZmlsZTogRml4dHVyZVByb2ZpbGUpOiBGaXh0dXJlV2hlZWwge1xuICAgIGZvciAoY29uc3QgY2hhbm5lbENhcGFiaWxpdHkgb2YgY2hhbm5lbC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgIGlmIChjaGFubmVsQ2FwYWJpbGl0eS53aGVlbElzQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWxDYXBhYmlsaXR5LndoZWVsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBwcml2YXRlIGNoYW5uZWxJbkxpc3QoY2hhbm5lbHM6IENhY2hlZEZpeHR1cmVDaGFubmVsW10sIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyAgIGZvciAobGV0IGNoYW5uZWwgb2YgY2hhbm5lbHMpIHtcbiAgLy8gICAgIGlmIChjaGFubmVsLmNoYW5uZWxOYW1lID09PSBuYW1lKSB7XG4gIC8vICAgICAgIHJldHVybiB0cnVlO1xuICAvLyAgICAgfVxuICAvLyAgIH1cblxuICAvLyAgIHJldHVybiBmYWxzZTtcbiAgLy8gfVxuXG4gIGdldENoYW5uZWxCeU5hbWUoZml4dHVyZTogQ2FjaGVkRml4dHVyZSwgY2hhbm5lbE5hbWU6IHN0cmluZyk6IENhY2hlZEZpeHR1cmVDaGFubmVsIHtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgZml4dHVyZS5jaGFubmVscykge1xuICAgICAgaWYgKFxuICAgICAgICAoY2hhbm5lbC5uYW1lICYmIGNoYW5uZWwubmFtZSA9PT0gY2hhbm5lbE5hbWUpIHx8XG4gICAgICAgIChjaGFubmVsLmNoYW5uZWwgJiYgY2hhbm5lbC5jaGFubmVsLmZpbmVDaGFubmVsQWxpYXNlcy5pbmRleE9mKGNoYW5uZWxOYW1lKSA+IC0xKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBjaGFubmVsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRDYWNoZWRDaGFubmVscyhwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSwgbW9kZTogRml4dHVyZU1vZGUpOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbFtdIHtcbiAgICBjb25zdCBjaGFubmVsczogQ2FjaGVkRml4dHVyZUNoYW5uZWxbXSA9IFtdO1xuXG4gICAgaWYgKCFtb2RlKSB7XG4gICAgICByZXR1cm4gY2hhbm5lbHM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdmFpbGFibGVDaGFubmVsTmFtZSBvZiBPYmplY3Qua2V5cyhwcm9maWxlLmF2YWlsYWJsZUNoYW5uZWxzKSkge1xuICAgICAgY29uc3QgYXZhaWxhYmxlQ2hhbm5lbDogRml4dHVyZUNoYW5uZWwgPSBwcm9maWxlLmF2YWlsYWJsZUNoYW5uZWxzW2F2YWlsYWJsZUNoYW5uZWxOYW1lXTtcblxuICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIG1vZGUuY2hhbm5lbHMpIHtcbiAgICAgICAgLy8gY2hlY2sgZm9yIHN0cmluZyBjaGFubmVsLiBJdCBjYW4gZ2V0IGNyZWVweSBmb3IgbWF0cml4IG1vZGVzXG4gICAgICAgIGlmICh0eXBlb2YgY2hhbm5lbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCBtb2RlQ2hhbm5lbDogc3RyaW5nID0gY2hhbm5lbCBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAvLyBkb24ndCBjaGVjayB0aGUgZmluZSBjaGFubmVscy4gb25seSBhZGQgdGhlIGNvYXJzZSBjaGFubmVsLlxuICAgICAgICAgIGlmIChtb2RlQ2hhbm5lbCA9PT0gYXZhaWxhYmxlQ2hhbm5lbE5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZEZpeHR1cmVDaGFubmVsID0gbmV3IENhY2hlZEZpeHR1cmVDaGFubmVsKCk7XG4gICAgICAgICAgICBjYWNoZWRGaXh0dXJlQ2hhbm5lbC5jaGFubmVsID0gYXZhaWxhYmxlQ2hhbm5lbDtcbiAgICAgICAgICAgIGNhY2hlZEZpeHR1cmVDaGFubmVsLm5hbWUgPSBhdmFpbGFibGVDaGFubmVsTmFtZTtcbiAgICAgICAgICAgIGNhY2hlZEZpeHR1cmVDaGFubmVsLmNhcGFiaWxpdGllcyA9IHRoaXMuZ2V0Q2FwYWJpbGl0aWVzQnlDaGFubmVsKGNhY2hlZEZpeHR1cmVDaGFubmVsLmNoYW5uZWwsIGF2YWlsYWJsZUNoYW5uZWxOYW1lLCBwcm9maWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlQnlDaGFubmVsKGNhY2hlZEZpeHR1cmVDaGFubmVsLmNoYW5uZWwpO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICBjYWNoZWRGaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWNoZWRGaXh0dXJlQ2hhbm5lbC5tYXhWYWx1ZSA9IHRoaXMuZ2V0TWF4VmFsdWVCeUNoYW5uZWwoY2FjaGVkRml4dHVyZUNoYW5uZWwuY2hhbm5lbCk7XG4gICAgICAgICAgICBjYWNoZWRGaXh0dXJlQ2hhbm5lbC5jb2xvcldoZWVsID0gdGhpcy5nZXRDb2xvcldoZWVsQnlDaGFubmVsKGNhY2hlZEZpeHR1cmVDaGFubmVsLCBwcm9maWxlKTtcbiAgICAgICAgICAgIGNoYW5uZWxzLnB1c2goY2FjaGVkRml4dHVyZUNoYW5uZWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBudWxsIG1heSBiZSBwYXNzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgYW4gdW5kZWZpbmVkIGNoYW5uZWxcbiAgICAgICAgICBjaGFubmVscy5wdXNoKG5ldyBDYWNoZWRGaXh0dXJlQ2hhbm5lbCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGFubmVscztcbiAgfVxuXG4gIHVwZGF0ZUNhY2hlZEZpeHR1cmVzKCkge1xuICAgIC8vIGNhbGN1bGF0ZSBzb21lIGZyZXF1ZW50bHkgdXNlZCB2YWx1ZXMgYXMgYSBjYWNoZSB0byBzYXZlIGNwdSB0aW1lXG4gICAgLy8gYWZ0ZXJ3YXJkc1xuICAgIHRoaXMuY2FjaGVkRml4dHVyZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGNhY2hlZEZpeHR1cmUgPSBuZXcgQ2FjaGVkRml4dHVyZSgpO1xuXG4gICAgICBjYWNoZWRGaXh0dXJlLmZpeHR1cmUgPSBmaXh0dXJlO1xuICAgICAgY2FjaGVkRml4dHVyZS5wcm9maWxlID0gdGhpcy5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgICAgY2FjaGVkRml4dHVyZS5tb2RlID0gdGhpcy5nZXRNb2RlQnlGaXh0dXJlKGNhY2hlZEZpeHR1cmUucHJvZmlsZSwgZml4dHVyZSk7XG4gICAgICBjYWNoZWRGaXh0dXJlLmNoYW5uZWxzID0gdGhpcy5nZXRDYWNoZWRDaGFubmVscyhjYWNoZWRGaXh0dXJlLnByb2ZpbGUsIGNhY2hlZEZpeHR1cmUubW9kZSk7XG5cbiAgICAgIHRoaXMuY2FjaGVkRml4dHVyZXMucHVzaChjYWNoZWRGaXh0dXJlKTtcbiAgICB9XG4gIH1cblxuICBjYXBhYmlsaXRpZXNNYXRjaChcbiAgICB0eXBlMTogRml4dHVyZUNhcGFiaWxpdHlUeXBlLFxuICAgIHR5cGUyOiBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUsXG4gICAgY29sb3IxOiBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLFxuICAgIGNvbG9yMjogRml4dHVyZUNhcGFiaWxpdHlDb2xvcixcbiAgICB3aGVlbDE6IHN0cmluZyxcbiAgICB3aGVlbDI6IHN0cmluZyxcbiAgICBwcm9maWxlVXVpZDE6IHN0cmluZyxcbiAgICBwcm9maWxlVXVpZDI6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICAvLyBjaGVja3MsIHdoZXRoZXIgdHdvIHByb3ZpZGVkIGNhcGFwYWJpbGl0aWVzIG1hdGNoXG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGUxID09PSB0eXBlMiAmJlxuICAgICAgKCFjb2xvcjEgfHwgY29sb3IxID09PSBjb2xvcjIpICYmXG4gICAgICAoIXdoZWVsMSB8fCB3aGVlbDEgPT09IHdoZWVsMikgJiZcbiAgICAgICghcHJvZmlsZVV1aWQxIHx8IHByb2ZpbGVVdWlkMSA9PT0gcHJvZmlsZVV1aWQyKVxuICAgICk7XG4gIH1cblxuICBzZXR0aW5nc0ZpeHR1cmVJc1NlbGVjdGVkKGZpeHR1cmU6IEZpeHR1cmUpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHNlbGVjdGVkRml4dHVyZSBvZiB0aGlzLnNlbGVjdGVkU2V0dGluZ3NGaXh0dXJlcykge1xuICAgICAgaWYgKHNlbGVjdGVkRml4dHVyZSA9PT0gZml4dHVyZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2hTZXR0aW5nc0ZpeHR1cmVTZWxlY3Rpb24oZml4dHVyZTogRml4dHVyZSkge1xuICAgIGlmICh0aGlzLnNldHRpbmdzRml4dHVyZUlzU2VsZWN0ZWQoZml4dHVyZSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZXR0aW5nc0ZpeHR1cmVzLnNwbGljZSh0aGlzLnNlbGVjdGVkU2V0dGluZ3NGaXh0dXJlcy5pbmRleE9mKGZpeHR1cmUpLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFNldHRpbmdzRml4dHVyZXMucHVzaChmaXh0dXJlKTtcbiAgICB9XG4gIH1cblxuICBnZXRGaXh0dXJlSWNvbkNsYXNzKHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKTogc3RyaW5nIHtcbiAgICBpZiAoIXByb2ZpbGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKHByb2ZpbGUuY2F0ZWdvcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKCFwcm9maWxlLmNhdGVnb3JpZXNbMF0pIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHByb2ZpbGUuY2F0ZWdvcmllc1swXS5yZXBsYWNlKCcgJywgJy0nKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICB9XG5cbiAgdXBkYXRlUHJvZmlsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KCd1cGRhdGUtcHJvZmlsZXMnLCBudWxsKTtcbiAgfVxuXG4gIGdldE5leHRGcmVlRG14Q2hhbm5lbChmaXh0dXJlUG9vbDogRml4dHVyZVtdLCBuZWVkZWRDaGFubmVsczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBnZXQgdGhlIG5leHQgZnJlZSBzcGFjZSBmb3IgdGhpcyBmaXh0dXJlXG4gICAgbGV0IGZyZWVDaGFubmVscyA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDUxMjsgaSsrKSB7XG4gICAgICBsZXQgb2NjdXBpZWRDaGFubmVscyA9IDA7XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlUG9vbCkge1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5nZXRNb2RlQnlGaXh0dXJlKHRoaXMuZ2V0UHJvZmlsZUJ5VXVpZChmaXh0dXJlLnByb2ZpbGVVdWlkKSwgZml4dHVyZSk7XG5cbiAgICAgICAgaWYgKGkgPj0gZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgJiYgaSA8IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgbW9kZS5jaGFubmVscy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyB0aGlzIGNoYW5uZWwgaXMgYWxyZWFkeSBvY2N1cGllZCBieSBhIGZpeHR1cmUgLT4gbW92ZSBmb3J3YXJkIHRvIHRoZSBlbmQgb2YgdGhlIGZpeHR1cmVcbiAgICAgICAgICBpZiAobW9kZS5jaGFubmVscy5sZW5ndGggPiBvY2N1cGllZENoYW5uZWxzKSB7XG4gICAgICAgICAgICBvY2N1cGllZENoYW5uZWxzID0gbW9kZS5jaGFubmVscy5sZW5ndGggLSAoaSAtIGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG9jY3VwaWVkQ2hhbm5lbHMgPiAwKSB7XG4gICAgICAgIGkgKz0gb2NjdXBpZWRDaGFubmVscyAtIDE7XG4gICAgICAgIGZyZWVDaGFubmVscyA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmVlQ2hhbm5lbHMrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGZyZWVDaGFubmVscyA9PT0gbmVlZGVkQ2hhbm5lbHMpIHtcbiAgICAgICAgcmV0dXJuIGkgLSBmcmVlQ2hhbm5lbHMgKyAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vIGZyZWUgc3BhY2UgbGVmdCBmb3IgdGhlIG5lZWRlZCBjaGFubmVsc1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGFkZEZpeHR1cmUocHJvZmlsZTogRml4dHVyZVByb2ZpbGUsIGZpeHR1cmVQb29sOiBGaXh0dXJlW10pOiBGaXh0dXJlIHtcbiAgICBjb25zdCBmaXh0dXJlID0gbmV3IEZpeHR1cmUoKTtcblxuICAgIGZpeHR1cmUudXVpZCA9IHRoaXMudXVpZFNlcnZpY2UuZ2V0VXVpZCgpO1xuICAgIGZpeHR1cmUucHJvZmlsZVV1aWQgPSBwcm9maWxlLnV1aWQ7XG4gICAgZml4dHVyZS5uYW1lID0gcHJvZmlsZS5uYW1lO1xuXG4gICAgaWYgKHByb2ZpbGUubW9kZXMgJiYgcHJvZmlsZS5tb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmaXh0dXJlLm1vZGVTaG9ydE5hbWUgPSBwcm9maWxlLm1vZGVzWzBdLnNob3J0TmFtZTtcbiAgICB9XG5cbiAgICAvLyBhZGQgdGhlIHNhbWUgbW9kZSBhcyBhbiBleGlzdGluZyBmaXh0dXJlLCBpZiBhdmFpbGFibGVcbiAgICBsZXQgZXhpc3RpbmdNb2RlU2hvcnROYW1lOiBzdHJpbmc7XG4gICAgZm9yIChjb25zdCBleGlzdGluZ0ZpeHR1cmUgb2YgZml4dHVyZVBvb2wpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUHJvZmlsZSA9IHRoaXMuZ2V0UHJvZmlsZUJ5VXVpZChleGlzdGluZ0ZpeHR1cmUucHJvZmlsZVV1aWQpO1xuXG4gICAgICBpZiAoZXhpc3RpbmdQcm9maWxlID09PSBwcm9maWxlKSB7XG4gICAgICAgIGV4aXN0aW5nTW9kZVNob3J0TmFtZSA9IGV4aXN0aW5nRml4dHVyZS5tb2RlU2hvcnROYW1lO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhpc3RpbmdNb2RlU2hvcnROYW1lKSB7XG4gICAgICBmaXh0dXJlLm1vZGVTaG9ydE5hbWUgPSBleGlzdGluZ01vZGVTaG9ydE5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpeHR1cmUubW9kZVNob3J0TmFtZSA9IHByb2ZpbGUubW9kZXNbMF0uc2hvcnROYW1lIHx8IHByb2ZpbGUubW9kZXNbMF0ubmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlID0gdGhpcy5nZXRNb2RlQnlGaXh0dXJlKHRoaXMuZ2V0UHJvZmlsZUJ5VXVpZChmaXh0dXJlLnByb2ZpbGVVdWlkKSwgZml4dHVyZSk7XG4gICAgY29uc3QgZmlyc3RDaGFubmVsID0gdGhpcy5nZXROZXh0RnJlZURteENoYW5uZWwoZml4dHVyZVBvb2wsIG1vZGUuY2hhbm5lbHMubGVuZ3RoKTtcblxuICAgIGlmIChmaXJzdENoYW5uZWwgPj0gMCkge1xuICAgICAgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgPSBmaXJzdENoYW5uZWw7XG4gICAgICBmaXh0dXJlUG9vbC5wdXNoKGZpeHR1cmUpO1xuICAgICAgcmV0dXJuIGZpeHR1cmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vIGZyZWUgc3BhY2UgYW55bW9yZVxuICAgICAgY29uc3QgbXNnID0gJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5uby1mcmVlLXNwYWNlJztcbiAgICAgIGNvbnN0IHRpdGxlID0gJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5uby1mcmVlLXNwYWNlLXRpdGxlJztcblxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChbbXNnLCB0aXRsZV0pLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSwgcmVzdWx0W3RpdGxlXSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
693
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduZXIvc3JjL2xpYi9zZXJ2aWNlcy9maXh0dXJlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFBb0Isb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBTTdDLE1BQU0sT0FBTyxjQUFjO0lBUXpCLFlBQ1UsSUFBZ0IsRUFDaEIsY0FBOEIsRUFDOUIsZ0JBQWtDLEVBQ2xDLGFBQTRC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QUM7WUFDMUIsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQzthQUFNLENBQUM7WUFDTix3QkFBd0I7WUFDeEIsTUFBTSxHQUFHLEdBQUcscUNBQXFDLENBQUM7WUFDbEQsTUFBTSxLQUFLLEdBQUcsMkNBQTJDLENBQUM7WUFFMUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQzsrRUF6d0JVLGNBQWM7dUVBQWQsY0FBYyxXQUFkLGNBQWMsbUJBRmIsTUFBTTs7aUZBRVAsY0FBYztjQUgxQixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDYWNoZWRGaXh0dXJlIH0gZnJvbSAnLi4vbW9kZWxzL2NhY2hlZC1maXh0dXJlJztcbmltcG9ydCB7IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5IH0gZnJvbSAnLi4vbW9kZWxzL2NhY2hlZC1maXh0dXJlLWNhcGFiaWxpdHknO1xuaW1wb3J0IHsgQ2FjaGVkRml4dHVyZUNoYW5uZWwgfSBmcm9tICcuLi9tb2RlbHMvY2FjaGVkLWZpeHR1cmUtY2hhbm5lbCc7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21vZGVscy9jb2xvcic7XG5pbXBvcnQgeyBGaXh0dXJlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUnO1xuaW1wb3J0IHsgRml4dHVyZUNhcGFiaWxpdHksIEZpeHR1cmVDYXBhYmlsaXR5Q29sb3IsIEZpeHR1cmVDYXBhYmlsaXR5VHlwZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLWNhcGFiaWxpdHknO1xuaW1wb3J0IHsgRml4dHVyZUNoYW5uZWwgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1jaGFubmVsJztcbmltcG9ydCB7IEZpeHR1cmVNb2RlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtbW9kZSc7XG5pbXBvcnQgeyBGaXh0dXJlUHJvZmlsZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLXByb2ZpbGUnO1xuaW1wb3J0IHsgRml4dHVyZVdoZWVsIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtd2hlZWwnO1xuaW1wb3J0IHsgRml4dHVyZVdoZWVsU2xvdCwgRml4dHVyZVdoZWVsU2xvdFR5cGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS13aGVlbC1zbG90JztcbmltcG9ydCB7IFByb2plY3RTZXJ2aWNlIH0gZnJvbSAnLi9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXVpZFNlcnZpY2UgfSBmcm9tICcuL3V1aWQuc2VydmljZSc7XG5pbXBvcnQgeyBGaXh0dXJlTW9kZUNoYW5uZWwgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1tb2RlLWNoYW5uZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRml4dHVyZVNlcnZpY2Uge1xuICBjYWNoZWRGaXh0dXJlczogQ2FjaGVkRml4dHVyZVtdID0gW107XG5cbiAgLy8gaXMgdGhlIHNpZGUtdGFiIHNldHRpbmdzIGN1cnJlbnRseSBzZWxlY3RlZD9cbiAgc2V0dGluZ3NTZWxlY3Rpb24gPSBmYWxzZTtcblxuICBzZWxlY3RlZFNldHRpbmdzRml4dHVyZXM6IEZpeHR1cmVbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOiBQcm9qZWN0U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFV1aWRTZXJ2aWNlXG4gICkge31cblxuICBnZXRGaXh0dXJlQnlVdWlkKHV1aWQ6IHN0cmluZyk6IEZpeHR1cmUge1xuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMpIHtcbiAgICAgIGlmIChmaXh0dXJlLnV1aWQgPT09IHV1aWQpIHtcbiAgICAgICAgcmV0dXJuIGZpeHR1cmU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaXh0dXJlVXVpZEFuZFBpeGVsS2V5RXF1YWxzKGZpeHR1cmVVdWlkMTogc3RyaW5nLCBmaXh0dXJlVXVpZDI6IHN0cmluZywgcGl4ZWxLZXkxOiBzdHJpbmcsIHBpeGVsS2V5Mjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZpeHR1cmVVdWlkMSA9PT0gZml4dHVyZVV1aWQyICYmICgocGl4ZWxLZXkxID09IG51bGwgJiYgcGl4ZWxLZXkyID09IG51bGwpIHx8IHBpeGVsS2V5MSA9PT0gcGl4ZWxLZXkyKTtcbiAgfVxuXG4gIGdldENhY2hlZEZpeHR1cmVCeVV1aWQodXVpZDogc3RyaW5nLCBwaXhlbEtleTogc3RyaW5nKTogQ2FjaGVkRml4dHVyZSB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuY2FjaGVkRml4dHVyZXMpIHtcbiAgICAgIGlmICh0aGlzLmZpeHR1cmVVdWlkQW5kUGl4ZWxLZXlFcXVhbHMoZml4dHVyZS5maXh0dXJlLnV1aWQsIHV1aWQsIGZpeHR1cmUucGl4ZWxLZXksIHBpeGVsS2V5KSkge1xuICAgICAgICByZXR1cm4gZml4dHVyZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBub3QgeWV0IGZvdW5kIC0+IHRyeSBzZWFyY2hpbmcgdGhlIGZpeHR1cmUgd2l0aG91dCBwaXhlbEtleSBmb3IgdGhlIGdlbmVyYWwgY2hhbm5lbHNcbiAgICBpZiAocGl4ZWxLZXkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuY2FjaGVkRml4dHVyZXMpIHtcbiAgICAgIGlmICghZml4dHVyZS5waXhlbEtleSAmJiBmaXh0dXJlLmZpeHR1cmUudXVpZCA9PT0gdXVpZCkge1xuICAgICAgICByZXR1cm4gZml4dHVyZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBHZXQgYWxsIHByb2ZpbGVzIHRvIHNlYXJjaCBmb3IgKG9ubHkgbWV0YWRhdGEpXG4gIGdldFNlYXJjaFByb2ZpbGVzKCk6IE9ic2VydmFibGU8Rml4dHVyZVByb2ZpbGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KCdmaXh0dXJlcycpLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlOiBvYmplY3RbXSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hQcm9maWxlczogRml4dHVyZVByb2ZpbGVbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvZmlsZSBvZiByZXNwb25zZSkge1xuICAgICAgICAgIHNlYXJjaFByb2ZpbGVzLnB1c2gobmV3IEZpeHR1cmVQcm9maWxlKHByb2ZpbGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWFyY2hQcm9maWxlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldFByb2ZpbGVCeVV1aWQodXVpZDogc3RyaW5nKTogRml4dHVyZVByb2ZpbGUge1xuICAgIGZvciAoY29uc3QgZml4dHVyZVByb2ZpbGUgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVQcm9maWxlcykge1xuICAgICAgaWYgKGZpeHR1cmVQcm9maWxlLnV1aWQgPT09IHV1aWQpIHtcbiAgICAgICAgcmV0dXJuIGZpeHR1cmVQcm9maWxlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvYWRQcm9maWxlQnlVdWlkKHV1aWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IGxvYWRlZFByb2ZpbGUgPSB0aGlzLmdldFByb2ZpbGVCeVV1aWQodXVpZCk7XG5cbiAgICBpZiAobG9hZGVkUHJvZmlsZSkge1xuICAgICAgLy8gVGhpcyBwcm9maWxlIGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHRoZSBtZXRhZGF0YSBhbmQgdGhlIHByb2ZpbGVcbiAgICByZXR1cm4gZm9ya0pvaW4oW3RoaXMuaHR0cC5nZXQoJ2ZpeHR1cmVzP3V1aWQ9JyArIGVuY29kZVVSSSh1dWlkKSksIHRoaXMuaHR0cC5nZXQoJ2ZpeHR1cmU/dXVpZD0nICsgZW5jb2RlVVJJKHV1aWQpKV0pLnBpcGUoXG4gICAgICBtYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zdCBtZXJnZWREYXRhID0geyAuLi5yZXN1bHRbMF1bMF0sIC4uLnJlc3VsdFsxXSB9O1xuICAgICAgICBjb25zdCBmaXh0dXJlUHJvZmlsZSA9IG5ldyBGaXh0dXJlUHJvZmlsZShtZXJnZWREYXRhKTtcbiAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVQcm9maWxlcy5wdXNoKGZpeHR1cmVQcm9maWxlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldFJvdGF0aW9uQW5nbGVEZWcodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8gY29udmVydCBhIHJvdGF0aW9uIGFuZ2xlIHZhbHVlIGludG8gZGVncmVlc1xuICAgIGlmICh2YWx1ZS5lbmRzV2l0aCgnZGVnJykpIHtcbiAgICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQodmFsdWUucmVwbGFjZSgnZGVnJywgJycpLCAxMCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5lbmRzV2l0aCgnJScpKSB7XG4gICAgICBjb25zdCBwZXJjID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlLnJlcGxhY2UoJyUnLCAnJyksIDEwKTtcbiAgICAgIHJldHVybiAocGVyYyAvIDEwMCkgKiAzNjA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFdoZWVsU2xvdENvbG9ycyh3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGNvbG9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3aGVlbFNsb3RzID0gdGhpcy5nZXRXaGVlbFNsb3RzKHdoZWVsLCBzbG90TnVtYmVyKTtcblxuICAgIGZvciAoY29uc3Qgc2xvdCBvZiB3aGVlbFNsb3RzKSB7XG4gICAgICBpZiAoc2xvdC5jb2xvcnMgJiYgc2xvdC5jb2xvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb2xvcnMgPSBjb2xvcnMuY29uY2F0KHNsb3QuY29sb3JzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZ2V0TWl4ZWRXaGVlbFNsb3RDb2xvcih3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBDb2xvciB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5nZXRXaGVlbFNsb3RDb2xvcnMod2hlZWwsIHNsb3ROdW1iZXIpO1xuICAgIGNvbnN0IGNvbG9yc1JnYjogQ29sb3JbXSA9IFtdO1xuXG4gICAgaWYgKGNvbG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb2xvciBvZiBjb2xvcnMpIHtcbiAgICAgIGNvbG9yc1JnYi5wdXNoKHRoaXMuaGV4VG9SZ2IoY29sb3IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5taXhDb2xvcnMoY29sb3JzUmdiKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcG9uZW50VG9IZXgoYzogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBoZXggPSBjLnRvU3RyaW5nKDE2KTtcbiAgICByZXR1cm4gaGV4Lmxlbmd0aCA9PT0gMSA/ICcwJyArIGhleCA6IGhleDtcbiAgfVxuXG4gIHJnYlRvSGV4KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAnIycgKyB0aGlzLmNvbXBvbmVudFRvSGV4KHIpICsgdGhpcy5jb21wb25lbnRUb0hleChnKSArIHRoaXMuY29tcG9uZW50VG9IZXgoYik7XG4gIH1cblxuICBoZXhUb1JnYihoZXg6IHN0cmluZyk6IENvbG9yIHtcbiAgICAvLyBleHBhbmQgc2hvcnRoYW5kIGZvcm0gKGUuZy4gXCIwM0ZcIikgdG8gZnVsbCBmb3JtIChlLmcuIFwiMDAzM0ZGXCIpXG4gICAgY29uc3Qgc2hvcnRoYW5kUmVnZXggPSAvXiM/KFthLWZcXGRdKShbYS1mXFxkXSkoW2EtZlxcZF0pJC9pO1xuICAgIGhleCA9IGhleC5yZXBsYWNlKHNob3J0aGFuZFJlZ2V4LCAobSwgciwgZywgYikgPT4ge1xuICAgICAgcmV0dXJuIHIgKyByICsgZyArIGcgKyBiICsgYjtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpO1xuICAgIHJldHVybiByZXN1bHQgPyBuZXcgQ29sb3IocGFyc2VJbnQocmVzdWx0WzFdLCAxNiksIHBhcnNlSW50KHJlc3VsdFsyXSwgMTYpLCBwYXJzZUludChyZXN1bHRbM10sIDE2KSkgOiBudWxsO1xuICB9XG5cbiAgbWl4Q29sb3JzKGNvbG9yczogQ29sb3JbXSk6IENvbG9yIHtcbiAgICAvLyBtaXggYW4gYXJyYXkgb2YgcmdiLWNvbG9ycyBjb250YWluaW5nIHIsIGcsIGIgdmFsdWVzIHRvIGEgbmV3IGNvbG9yXG4gICAgbGV0IHIgPSAwO1xuICAgIGxldCBnID0gMDtcbiAgICBsZXQgYiA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGNvbG9yIG9mIGNvbG9ycykge1xuICAgICAgciArPSBjb2xvci5yZWQ7XG4gICAgICBnICs9IGNvbG9yLmdyZWVuO1xuICAgICAgYiArPSBjb2xvci5ibHVlO1xuICAgIH1cblxuICAgIHIgLz0gY29sb3JzLmxlbmd0aDtcbiAgICBnIC89IGNvbG9ycy5sZW5ndGg7XG4gICAgYiAvPSBjb2xvcnMubGVuZ3RoO1xuXG4gICAgcmV0dXJuIG5ldyBDb2xvcihyLCBnLCBiKTtcbiAgfVxuXG4gIHdoZWVsSGFzU2xvdFR5cGUod2hlZWw6IEZpeHR1cmVXaGVlbCwgc2xvdFR5cGU6IEZpeHR1cmVXaGVlbFNsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzbG90IG9mIHdoZWVsLnNsb3RzKSB7XG4gICAgICBpZiAoc2xvdC50eXBlID09PSBzbG90VHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRXaGVlbEJ5TmFtZShwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSwgd2hlZWxOYW1lOiBzdHJpbmcpOiBGaXh0dXJlV2hlZWwge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvZmlsZS53aGVlbHMpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSA9PT0gd2hlZWxOYW1lKSB7XG4gICAgICAgIHJldHVybiBwcm9maWxlLndoZWVsc1twcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gd2hlZWwgbm90IGZvdW5kXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2hlZWxTbG90cyh3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBGaXh0dXJlV2hlZWxTbG90W10ge1xuICAgIC8vIHJldHVybiBvbmUgc2xvdCBvciB0d28gc2xvdHMsIGlmIHRoZXkgYXJlIG1peGVkIChlLmcuIHNsb3IgbnVtYmVyIDIuNSByZXR1cm5zIHRoZSBzbG90cyAyIGFuZCAzKVxuICAgIGNvbnN0IHNsb3RzOiBGaXh0dXJlV2hlZWxTbG90W10gPSBbXTtcblxuICAgIGlmICghd2hlZWwpIHtcbiAgICAgIHJldHVybiBzbG90cztcbiAgICB9XG5cbiAgICBpZiAoc2xvdE51bWJlciAtIE1hdGguZmxvb3Ioc2xvdE51bWJlcikgPiAwKSB7XG4gICAgICAvLyB0d28gc2xvdHMgYXJlIHNldFxuICAgICAgY29uc3QgbnVtYmVyID0gTWF0aC5mbG9vcihzbG90TnVtYmVyKTtcbiAgICAgIHNsb3RzLnB1c2god2hlZWwuc2xvdHNbbnVtYmVyIC0gMV0pO1xuICAgICAgaWYgKG51bWJlciA+PSAwICYmIG51bWJlciA8IHdoZWVsLnNsb3RzLmxlbmd0aCkge1xuICAgICAgICBzbG90cy5wdXNoKHdoZWVsLnNsb3RzW251bWJlcl0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IG9uZSBzbG90IGlzIHNldFxuICAgICAgc2xvdHMucHVzaCh3aGVlbC5zbG90c1tzbG90TnVtYmVyIC0gMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBzbG90cztcbiAgfVxuXG4gIGdldE1vZGVCeUZpeHR1cmUocHJvZmlsZTogRml4dHVyZVByb2ZpbGUsIGZpeHR1cmU6IEZpeHR1cmUpOiBGaXh0dXJlTW9kZSB7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHByb2ZpbGUubW9kZXMpIHtcbiAgICAgIGlmIChtb2RlLnNob3J0TmFtZSkge1xuICAgICAgICBpZiAobW9kZS5zaG9ydE5hbWUgPT09IGZpeHR1cmUubW9kZVNob3J0TmFtZSkge1xuICAgICAgICAgIHJldHVybiBtb2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobW9kZS5uYW1lID09PSBmaXh0dXJlLm1vZGVTaG9ydE5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gbW9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rml4dHVyZUNhcGFiaWxpdHkoY2FwYWJpbGl0eTogRml4dHVyZUNhcGFiaWxpdHksIGNoYW5uZWxOYW1lOiBzdHJpbmcsIHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKTogQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHkge1xuICAgIGNvbnN0IGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5ID0gbmV3IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5KCk7XG4gICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7XG4gICAgaWYgKGNhcGFiaWxpdHkuc2xvdE51bWJlcikge1xuICAgICAgLy8gdGhlcmUgaXMgYSB3aGVlbCBjb25uZWN0ZWQgdG8gdGhpcyBjYXBhYmlsaXR5XG4gICAgICBpZiAodHlwZW9mIGNhcGFiaWxpdHkud2hlZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsTmFtZSA9IGNhcGFiaWxpdHkud2hlZWwgYXMgc3RyaW5nO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNhcGFiaWxpdHkud2hlZWwpKSB7XG4gICAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsTmFtZSA9IGNhcGFiaWxpdHkud2hlZWxbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbE5hbWUgPSBjaGFubmVsTmFtZTtcbiAgICAgIH1cbiAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsID0gdGhpcy5nZXRXaGVlbEJ5TmFtZShwcm9maWxlLCBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbE5hbWUpO1xuICAgICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkud2hlZWxTbG90cyA9IHRoaXMuZ2V0V2hlZWxTbG90cyhjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbCwgY2FwYWJpbGl0eS5zbG90TnVtYmVyKTtcbiAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsSXNDb2xvciA9IHRoaXMud2hlZWxIYXNTbG90VHlwZShjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbCwgRml4dHVyZVdoZWVsU2xvdFR5cGUuQ29sb3IpO1xuICAgIH1cbiAgICBpZiAoY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZSAmJiBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LmRteFJhbmdlLmxlbmd0aCA9PT0gMikge1xuICAgICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2VudGVyVmFsdWUgPSBNYXRoLmZsb29yKFxuICAgICAgICAoY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZVswXSArIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LmNhcGFiaWxpdHkuZG14UmFuZ2VbMV0pIC8gMlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYXBhYmlsaXRpZXNCeUNoYW5uZWwoXG4gICAgZml4dHVyZUNoYW5uZWw6IEZpeHR1cmVDaGFubmVsLFxuICAgIGNoYW5uZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvZmlsZTogRml4dHVyZVByb2ZpbGVcbiAgKTogQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHlbXSB7XG4gICAgY29uc3QgY2FwYWJpbGl0ZXM6IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5W10gPSBbXTtcblxuICAgIGlmIChmaXh0dXJlQ2hhbm5lbC5jYXBhYmlsaXR5KSB7XG4gICAgICBjYXBhYmlsaXRlcy5wdXNoKHRoaXMuZ2V0Rml4dHVyZUNhcGFiaWxpdHkoZml4dHVyZUNoYW5uZWwuY2FwYWJpbGl0eSwgY2hhbm5lbE5hbWUsIHByb2ZpbGUpKTtcbiAgICB9IGVsc2UgaWYgKGZpeHR1cmVDaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIGZpeHR1cmVDaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgICBjYXBhYmlsaXRlcy5wdXNoKHRoaXMuZ2V0Rml4dHVyZUNhcGFiaWxpdHkoY2FwYWJpbGl0eSwgY2hhbm5lbE5hbWUsIHByb2ZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2FwYWJpbGl0ZXM7XG4gIH1cblxuICBwcml2YXRlIGdldE1heFZhbHVlQnlDaGFubmVsKGZpeHR1cmVDaGFubmVsOiBGaXh0dXJlQ2hhbm5lbCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDI1NiwgMSArIGZpeHR1cmVDaGFubmVsLmZpbmVDaGFubmVsQWxpYXNlcy5sZW5ndGgpIC0gMTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZhbHVlQnlDaGFubmVsKGZpeHR1cmVDaGFubmVsOiBGaXh0dXJlQ2hhbm5lbCk6IG51bWJlciB7XG4gICAgaWYgKCFmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFOKGZpeHR1cmVDaGFubmVsLmRlZmF1bHRWYWx1ZSBhcyBhbnkpICYmIChmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKS5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAvLyBwZXJjZW50YWdlIHZhbHVlXG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gTnVtYmVyLnBhcnNlSW50KChmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKS5yZXBsYWNlKCclJywgJycpLCAxMCk7XG4gICAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMuZ2V0TWF4VmFsdWVCeUNoYW5uZWwoZml4dHVyZUNoYW5uZWwpO1xuICAgICAgcmV0dXJuIChtYXhWYWx1ZSAvIDEwMCkgKiBwZXJjZW50YWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBETVggdmFsdWVcbiAgICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQoZml4dHVyZUNoYW5uZWwuZGVmYXVsdFZhbHVlIGFzIGFueSwgMTApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sb3JXaGVlbEJ5Q2hhbm5lbChjaGFubmVsOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbCwgcHJvZmlsZTogRml4dHVyZVByb2ZpbGUpOiBGaXh0dXJlV2hlZWwge1xuICAgIGZvciAoY29uc3QgY2hhbm5lbENhcGFiaWxpdHkgb2YgY2hhbm5lbC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgIGlmIChjaGFubmVsQ2FwYWJpbGl0eS53aGVlbElzQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWxDYXBhYmlsaXR5LndoZWVsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRDaGFubmVsQnlOYW1lKGZpeHR1cmU6IENhY2hlZEZpeHR1cmUsIGNoYW5uZWxOYW1lOiBzdHJpbmcpOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbCB7XG4gICAgZm9yIChjb25zdCBjaGFubmVsIG9mIGZpeHR1cmUuY2hhbm5lbHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGNoYW5uZWwubmFtZSAmJiBjaGFubmVsLm5hbWUgPT09IGNoYW5uZWxOYW1lKSB8fFxuICAgICAgICAoY2hhbm5lbC5jaGFubmVsICYmIGNoYW5uZWwuY2hhbm5lbC5maW5lQ2hhbm5lbEFsaWFzZXMuaW5kZXhPZihjaGFubmVsTmFtZSkgPiAtMSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gY2hhbm5lbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDaGFubmVsTmFtZVdpdGhQaXhlbEtleSh0ZW1wbGF0ZUNoYW5uZWxOYW1lOiBzdHJpbmcsIHBpeGVsS2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGVtcGxhdGVDaGFubmVsTmFtZS5yZXBsYWNlKCckcGl4ZWxLZXknLCBwaXhlbEtleSk7XG4gIH1cblxuICBwcml2YXRlIGFkZENhY2hlZENoYW5uZWwoXG4gICAgY2hhbm5lbHM6IENhY2hlZEZpeHR1cmVDaGFubmVsW10sXG4gICAgY2hhbm5lbDogRml4dHVyZUNoYW5uZWwsXG4gICAgdGVtcGxhdGVDaGFubmVsTmFtZTogc3RyaW5nLFxuICAgIHBpeGVsS2V5OiBzdHJpbmcsXG4gICAgcHJvZmlsZTogRml4dHVyZVByb2ZpbGVcbiAgKSB7XG4gICAgY29uc3QgY2FjaGVkRml4dHVyZUNoYW5uZWwgPSBuZXcgQ2FjaGVkRml4dHVyZUNoYW5uZWwoKTtcbiAgICBjb25zdCBjaGFubmVsTmFtZSA9IHRoaXMuZ2V0Q2hhbm5lbE5hbWVXaXRoUGl4ZWxLZXkodGVtcGxhdGVDaGFubmVsTmFtZSwgcGl4ZWxLZXkpO1xuXG4gICAgY2FjaGVkRml4dHVyZUNoYW5uZWwuY2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgY2FjaGVkRml4dHVyZUNoYW5uZWwubmFtZSA9IGNoYW5uZWxOYW1lO1xuICAgIGNhY2hlZEZpeHR1cmVDaGFubmVsLmNhcGFiaWxpdGllcyA9IHRoaXMuZ2V0Q2FwYWJpbGl0aWVzQnlDaGFubmVsKGNhY2hlZEZpeHR1cmVDaGFubmVsLmNoYW5uZWwsIGNoYW5uZWxOYW1lLCBwcm9maWxlKTtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZUJ5Q2hhbm5lbChjYWNoZWRGaXh0dXJlQ2hhbm5lbC5jaGFubmVsKTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICBjYWNoZWRGaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIGNhY2hlZEZpeHR1cmVDaGFubmVsLm1heFZhbHVlID0gdGhpcy5nZXRNYXhWYWx1ZUJ5Q2hhbm5lbChjYWNoZWRGaXh0dXJlQ2hhbm5lbC5jaGFubmVsKTtcbiAgICBjYWNoZWRGaXh0dXJlQ2hhbm5lbC5jb2xvcldoZWVsID0gdGhpcy5nZXRDb2xvcldoZWVsQnlDaGFubmVsKGNhY2hlZEZpeHR1cmVDaGFubmVsLCBwcm9maWxlKTtcbiAgICBjaGFubmVscy5wdXNoKGNhY2hlZEZpeHR1cmVDaGFubmVsKTtcbiAgfVxuXG4gIHByaXZhdGUgYWxwaGFudW1lcmljU29ydChhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6ICdiYXNlJyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxsUGl4ZWxLZXlzKHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKSB7XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBwaXhlbEtleVggb2YgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzKSB7XG4gICAgICBmb3IgKGxldCBwaXhlbEtleVkgb2YgcGl4ZWxLZXlYKSB7XG4gICAgICAgIGZvciAobGV0IHBpeGVsS2V5WiBvZiBwaXhlbEtleVkpIHtcbiAgICAgICAgICBpZiAocGl4ZWxLZXlaKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChwaXhlbEtleVopO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxQaXhlbEdyb3Vwcyhwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSkge1xuICAgIGxldCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyhwcm9maWxlLm1hdHJpeC5waXhlbEdyb3VwcykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGl4ZWxLZXlzSW5PcmRlcihwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSwgcmVwZWF0Rm9yOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gY291bGQgY29udGFpbiBqdXN0IGEgc2luZ2xlIHN0cmluZyAoZS5nLiAnZWFjaFBpeGVsQUJDJykgb3JcbiAgICBpZiAocmVwZWF0Rm9yLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIGFuIGFycmF5IG9mIHBpeGVsIChncm91cHMpXG4gICAgICByZXN1bHQgPSByZXBlYXRGb3I7XG4gICAgfSBlbHNlIGlmIChyZXBlYXRGb3IubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSBpZiAocmVwZWF0Rm9yWzBdID09PSAnZWFjaFBpeGVsQUJDJykge1xuICAgICAgLy8gR2V0cyBjb21wdXRlZCBpbnRvIGFuIGFscGhhbnVtZXJpY2FsbHkgc29ydGVkIGxpc3Qgb2YgYWxsIHBpeGVsS2V5c1xuICAgICAgaWYgKHByb2ZpbGUubWF0cml4LnBpeGVsQ291bnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxDb3VudFswXTsgeCsrKSB7XG4gICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBwcm9maWxlLm1hdHJpeC5waXhlbENvdW50WzFdOyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxDb3VudFsyXTsgeisrKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCdQaXhlbCAnICsgKHggKyAxKSArICctJyArICh5ICsgMSkgKyAnLScgKyAoeiArIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQodGhpcy5nZXRBbGxQaXhlbEtleXMocHJvZmlsZSkpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnNvcnQodGhpcy5hbHBoYW51bWVyaWNTb3J0KTtcbiAgICB9IGVsc2UgaWYgKHJlcGVhdEZvclswXSA9PT0gJ2VhY2hQaXhlbEdyb3VwJykge1xuICAgICAgLy8gR2V0cyBjb21wdXRlZCBpbnRvIGFuIGFycmF5IG9mIGFsbCBwaXhlbCBncm91cCBrZXlzLCBvcmRlcmVkIGJ5IGFwcGVhcmFuY2UgaW4gdGhlIEpTT04gZmlsZVxuICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0aGlzLmdldEFsbFBpeGVsR3JvdXBzKHByb2ZpbGUpKTtcbiAgICB9IGVsc2UgaWYgKHJlcGVhdEZvclswXSA9PT0gJ2VhY2hQaXhlbFhZWicpIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzW3hdLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgICAgZm9yIChsZXQgeiA9IDA7IHogPCBwcm9maWxlLm1hdHJpeC5waXhlbEtleXNbeF1beV0ubGVuZ3RoOyB6KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzW3hdW3ldW3pdO1xuICAgICAgICAgICAgaWYgKHBpeGVsKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBpeGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlcGVhdEZvclswXSA9PT0gJ2VhY2hQaXhlbFhaWScpIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzW3hdWzBdLmxlbmd0aDsgeisrKSB7XG4gICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBwcm9maWxlLm1hdHJpeC5waXhlbEtleXNbeF0ubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzW3hdW3ldW3pdO1xuICAgICAgICAgICAgaWYgKHBpeGVsKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBpeGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlcGVhdEZvclswXSA9PT0gJ2VhY2hQaXhlbFlYWicpIHtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzWzBdLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgZm9yIChsZXQgeiA9IDA7IHogPCBwcm9maWxlLm1hdHJpeC5waXhlbEtleXNbeF1beV0ubGVuZ3RoOyB6KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzW3hdW3ldW3pdO1xuICAgICAgICAgICAgaWYgKHBpeGVsKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBpeGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlcGVhdEZvclswXSA9PT0gJ2VhY2hQaXhlbFlaWCcpIHtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzWzBdLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzWzBdW3ldLmxlbmd0aDsgeisrKSB7XG4gICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBwcm9maWxlLm1hdHJpeC5waXhlbEtleXMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzW3hdW3ldW3pdO1xuICAgICAgICAgICAgaWYgKHBpeGVsKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBpeGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlcGVhdEZvclswXSA9PT0gJ2VhY2hQaXhlbFpYWScpIHtcbiAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzWzBdWzBdLmxlbmd0aDsgeisrKSB7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBwcm9maWxlLm1hdHJpeC5waXhlbEtleXNbeF0ubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzW3hdW3ldW3pdO1xuICAgICAgICAgICAgaWYgKHBpeGVsKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBpeGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlcGVhdEZvclswXSA9PT0gJ2VhY2hQaXhlbFpZWCcpIHtcbiAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzWzBdWzBdLmxlbmd0aDsgeisrKSB7XG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzWzBdLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBwcm9maWxlLm1hdHJpeC5waXhlbEtleXMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzW3hdW3ldW3pdO1xuICAgICAgICAgICAgaWYgKHBpeGVsKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBpeGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0TW9kZUNoYW5uZWxDb3VudChwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSwgbW9kZTogRml4dHVyZU1vZGUpOiBudW1iZXIge1xuICAgIGxldCBjb3VudDogbnVtYmVyID0gMDtcblxuICAgIC8vIGFscmVhZHkgY2FsY3VsYXRlZD9cbiAgICBpZiAobW9kZS5jaGFubmVsQ291bnQpIHtcbiAgICAgIHJldHVybiBtb2RlLmNoYW5uZWxDb3VudDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBjaGFubmVsIG9mIG1vZGUuY2hhbm5lbHMpIHtcbiAgICAgIGlmIChjaGFubmVsLmluc2VydCA9PT0gJ21hdHJpeENoYW5uZWxzJykge1xuICAgICAgICBpZiAoY2hhbm5lbC5yZXBlYXRGb3IubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGNvdW50ICs9IGNoYW5uZWwucmVwZWF0Rm9yLmxlbmd0aCAqIGNoYW5uZWwudGVtcGxhdGVDaGFubmVscy5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbC5yZXBlYXRGb3JbMF0gPT09ICdlYWNoUGl4ZWxHcm91cCcpIHtcbiAgICAgICAgICBjb3VudCArPSBwcm9maWxlLm1hdHJpeC5waXhlbEdyb3Vwcy5sZW5ndGggKiBjaGFubmVsLnRlbXBsYXRlQ2hhbm5lbHMubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWwucmVwZWF0Rm9yWzBdLnN0YXJ0c1dpdGgoJ2VhY2hQaXhlbCcpKSB7XG4gICAgICAgICAgaWYgKHByb2ZpbGUubWF0cml4LnBpeGVsQ291bnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBjb3VudCArPVxuICAgICAgICAgICAgICBwcm9maWxlLm1hdHJpeC5waXhlbENvdW50WzBdICogcHJvZmlsZS5tYXRyaXgucGl4ZWxDb3VudFsxXSAqIHByb2ZpbGUubWF0cml4LnBpeGVsQ291bnRbMl0gKiBjaGFubmVsLnRlbXBsYXRlQ2hhbm5lbHMubGVuZ3RoO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHByb2ZpbGUubWF0cml4LnBpeGVsS2V5cy5sZW5ndGg7IHgrKykge1xuICAgICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHByb2ZpbGUubWF0cml4LnBpeGVsS2V5c1t4XS5sZW5ndGg7IHkrKykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgcHJvZmlsZS5tYXRyaXgucGl4ZWxLZXlzW3hdW3ldLmxlbmd0aDsgeisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IHByb2ZpbGUubWF0cml4LnBpeGVsS2V5c1t4XVt5XVt6XTtcbiAgICAgICAgICAgICAgICAgIGlmIChwaXhlbCkge1xuICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGFubmVsLnRlbXBsYXRlQ2hhbm5lbHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtb2RlLmNoYW5uZWxDb3VudCA9IGNvdW50O1xuXG4gICAgcmV0dXJuIG1vZGUuY2hhbm5lbENvdW50O1xuICB9XG5cbiAgZ2V0Q2FjaGVkQ2hhbm5lbHMocHJvZmlsZTogRml4dHVyZVByb2ZpbGUsIG1vZGU6IEZpeHR1cmVNb2RlLCBwaXhlbEtleTogc3RyaW5nKTogQ2FjaGVkRml4dHVyZUNoYW5uZWxbXSB7XG4gICAgY29uc3QgY2hhbm5lbHM6IENhY2hlZEZpeHR1cmVDaGFubmVsW10gPSBbXTtcblxuICAgIGlmICghbW9kZSkge1xuICAgICAgcmV0dXJuIGNoYW5uZWxzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBtb2RlLmNoYW5uZWxzKSB7XG4gICAgICBpZiAoY2hhbm5lbC5uYW1lICYmICFwaXhlbEtleSkge1xuICAgICAgICAvLyBkaXJlY3QgcmVmZXJlbmNlIHRvIGEgY2hhbm5lbFxuICAgICAgICAvLyBkb24ndCBjaGVjayB0aGUgZmluZSBjaGFubmVscy4gb25seSBhZGQgdGhlIGNvYXJzZSBjaGFubmVsLlxuICAgICAgICBsZXQgY2hhbm5lbEZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBhdmFpbGFibGVDaGFubmVsTmFtZSBvZiBPYmplY3Qua2V5cyhwcm9maWxlLmF2YWlsYWJsZUNoYW5uZWxzKSkge1xuICAgICAgICAgIGlmIChjaGFubmVsLm5hbWUgPT09IGF2YWlsYWJsZUNoYW5uZWxOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVDaGFubmVsOiBGaXh0dXJlQ2hhbm5lbCA9IHByb2ZpbGUuYXZhaWxhYmxlQ2hhbm5lbHNbYXZhaWxhYmxlQ2hhbm5lbE5hbWVdO1xuXG4gICAgICAgICAgICB0aGlzLmFkZENhY2hlZENoYW5uZWwoY2hhbm5lbHMsIGF2YWlsYWJsZUNoYW5uZWwsIGF2YWlsYWJsZUNoYW5uZWxOYW1lLCBudWxsLCBwcm9maWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayB0aGUgdGVtcGxhdGUgY2hhbm5lbHMsIGlmIG5vdCBmb3VuZCBpbiB0aGUgYXZhaWxhYmxlIGNoYW5uZWxzXG4gICAgICAgIGlmICghY2hhbm5lbEZvdW5kKSB7XG4gICAgICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZUNoYW5uZWxOYW1lIG9mIE9iamVjdC5rZXlzKHByb2ZpbGUudGVtcGxhdGVDaGFubmVscykpIHtcbiAgICAgICAgICAgIGxldCBleGlzdGluZ1BpeGVsS2V5cyA9IHRoaXMuZ2V0QWxsUGl4ZWxLZXlzKHByb2ZpbGUpLmNvbmNhdCh0aGlzLmdldEFsbFBpeGVsR3JvdXBzKHByb2ZpbGUpKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBleGlzdGluZ1BpeGVsS2V5IG9mIGV4aXN0aW5nUGl4ZWxLZXlzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxOYW1lID0gdGhpcy5nZXRDaGFubmVsTmFtZVdpdGhQaXhlbEtleSh0ZW1wbGF0ZUNoYW5uZWxOYW1lLCBleGlzdGluZ1BpeGVsS2V5KTtcblxuICAgICAgICAgICAgICBpZiAoY2hhbm5lbC5uYW1lID09PSBjaGFubmVsTmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlQ2hhbm5lbDogRml4dHVyZUNoYW5uZWwgPSBwcm9maWxlLnRlbXBsYXRlQ2hhbm5lbHNbdGVtcGxhdGVDaGFubmVsTmFtZV07XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFkZENhY2hlZENoYW5uZWwoY2hhbm5lbHMsIHRlbXBsYXRlQ2hhbm5lbCwgY2hhbm5lbE5hbWUsIGV4aXN0aW5nUGl4ZWxLZXksIHByb2ZpbGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZWZlcmVuY2UgYSBjaGFubmVsIHRocm91Z2ggYSBwaXhlbCBtYXRyaXhcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlUGl4ZWxLZXlzID0gdGhpcy5nZXRQaXhlbEtleXNJbk9yZGVyKHByb2ZpbGUsIGNoYW5uZWwucmVwZWF0Rm9yKTtcblxuICAgICAgICBpZiAoY2hhbm5lbC5jaGFubmVsT3JkZXIgPT09ICdwZXJQaXhlbCcpIHtcbiAgICAgICAgICAvLyBlYWNoIGNoYW5uZWwgZm9yIGVhY2ggcGl4ZWxcblxuICAgICAgICAgIGZvciAoY29uc3QgYXZhaWxhYmxlUGl4ZWxLZXkgb2YgYXZhaWxhYmxlUGl4ZWxLZXlzKSB7XG4gICAgICAgICAgICBpZiAoYXZhaWxhYmxlUGl4ZWxLZXkgPT09IHBpeGVsS2V5KSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbW9kZVRlbXBsYXRlQ2hhbm5lbE5hbWUgb2YgY2hhbm5lbC50ZW1wbGF0ZUNoYW5uZWxzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZUNoYW5uZWxOYW1lIG9mIE9iamVjdC5rZXlzKHByb2ZpbGUudGVtcGxhdGVDaGFubmVscykpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGNoZWNrIHRoZSBmaW5lIGNoYW5uZWxzLiBvbmx5IGFkZCB0aGUgY29hcnNlIGNoYW5uZWwuXG4gICAgICAgICAgICAgICAgICBpZiAobW9kZVRlbXBsYXRlQ2hhbm5lbE5hbWUgPT09IHRlbXBsYXRlQ2hhbm5lbE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVDaGFubmVsOiBGaXh0dXJlQ2hhbm5lbCA9IHByb2ZpbGUudGVtcGxhdGVDaGFubmVsc1t0ZW1wbGF0ZUNoYW5uZWxOYW1lXTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENhY2hlZENoYW5uZWwoY2hhbm5lbHMsIHRlbXBsYXRlQ2hhbm5lbCwgdGVtcGxhdGVDaGFubmVsTmFtZSwgYXZhaWxhYmxlUGl4ZWxLZXksIHByb2ZpbGUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsLmNoYW5uZWxPcmRlciA9PT0gJ3BlckNoYW5uZWwnKSB7XG4gICAgICAgICAgLy8gZWFjaCBwaXhlbCBmb3IgZWFjaCBjaGFubmVsXG5cbiAgICAgICAgICBmb3IgKGNvbnN0IG1vZGVUZW1wbGF0ZUNoYW5uZWxOYW1lIG9mIGNoYW5uZWwudGVtcGxhdGVDaGFubmVscykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdmFpbGFibGVQaXhlbEtleSBvZiBhdmFpbGFibGVQaXhlbEtleXMpIHtcbiAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVBpeGVsS2V5ID09PSBwaXhlbEtleSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGVtcGxhdGVDaGFubmVsTmFtZSBvZiBPYmplY3Qua2V5cyhwcm9maWxlLnRlbXBsYXRlQ2hhbm5lbHMpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBkb24ndCBjaGVjayB0aGUgZmluZSBjaGFubmVscy4gb25seSBhZGQgdGhlIGNvYXJzZSBjaGFubmVsLlxuICAgICAgICAgICAgICAgICAgaWYgKG1vZGVUZW1wbGF0ZUNoYW5uZWxOYW1lID09PSB0ZW1wbGF0ZUNoYW5uZWxOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlQ2hhbm5lbDogRml4dHVyZUNoYW5uZWwgPSBwcm9maWxlLnRlbXBsYXRlQ2hhbm5lbHNbdGVtcGxhdGVDaGFubmVsTmFtZV07XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDYWNoZWRDaGFubmVsKGNoYW5uZWxzLCB0ZW1wbGF0ZUNoYW5uZWwsIHRlbXBsYXRlQ2hhbm5lbE5hbWUsIGF2YWlsYWJsZVBpeGVsS2V5LCBwcm9maWxlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbm5lbHM7XG4gIH1cblxuICBmaXh0dXJlR2V0VW5pcXVlUGl4ZWxLZXlzKGZpeHR1cmU6IEZpeHR1cmUpOiBzdHJpbmdbXSB7XG4gICAgbGV0IHBpeGVsS2V5czogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgICBsZXQgcHJvZmlsZSA9IHRoaXMuZ2V0UHJvZmlsZUJ5VXVpZChmaXh0dXJlLnByb2ZpbGVVdWlkKTtcbiAgICBsZXQgbW9kZSA9IHRoaXMuZ2V0TW9kZUJ5Rml4dHVyZShwcm9maWxlLCBmaXh0dXJlKTtcblxuICAgIC8vIGFkZCB0aGUgdW5pcXVlIHBpeGVsIGtleXNcbiAgICBmb3IgKGxldCBjaGFubmVsIG9mIG1vZGUuY2hhbm5lbHMpIHtcbiAgICAgIHRoaXMuZ2V0UGl4ZWxLZXlzSW5PcmRlcihwcm9maWxlLCBjaGFubmVsLnJlcGVhdEZvcikuZm9yRWFjaCgoc3RyKSA9PiB7XG4gICAgICAgIHBpeGVsS2V5cy5hZGQoc3RyKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKHBpeGVsS2V5cyk7XG4gIH1cblxuICAvLyBkb2VzIHRoZSBmaXh0dXJlIGhhdmUgYSBnZW5lcmFsIGNoYW5uZWwgd2l0aG91dCByZWZlcmVuY2UgdG8gc3BlY2lmaWMgcGl4ZWwga2V5cyBpbiB0aGUgY3VycmVudCBtb2RlP1xuICBmaXh0dXJlSGFzR2VuZXJhbENoYW5uZWwoZml4dHVyZTogRml4dHVyZSk6IGJvb2xlYW4ge1xuICAgIGxldCBwcm9maWxlID0gdGhpcy5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgIGxldCBtb2RlID0gdGhpcy5nZXRNb2RlQnlGaXh0dXJlKHByb2ZpbGUsIGZpeHR1cmUpO1xuXG4gICAgLy8gYWRkIHRoZSB1bmlxdWUgcGl4ZWwga2V5c1xuICAgIGZvciAobGV0IGNoYW5uZWwgb2YgbW9kZS5jaGFubmVscykge1xuICAgICAgaWYgKHRoaXMuZ2V0UGl4ZWxLZXlzSW5PcmRlcihwcm9maWxlLCBjaGFubmVsLnJlcGVhdEZvcikubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHVwZGF0ZUNhY2hlZEZpeHR1cmVzKCkge1xuICAgIC8vIGNhbGN1bGF0ZSBzb21lIGZyZXF1ZW50bHkgdXNlZCB2YWx1ZXMgYXMgYSBjYWNoZSB0byBzYXZlIGNwdSB0aW1lXG4gICAgLy8gYWZ0ZXJ3YXJkc1xuICAgIHRoaXMuY2FjaGVkRml4dHVyZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMpIHtcbiAgICAgIGlmICh0aGlzLmZpeHR1cmVIYXNHZW5lcmFsQ2hhbm5lbChmaXh0dXJlKSkge1xuICAgICAgICBjb25zdCBjYWNoZWRGaXh0dXJlID0gbmV3IENhY2hlZEZpeHR1cmUoKTtcbiAgICAgICAgY2FjaGVkRml4dHVyZS5maXh0dXJlID0gZml4dHVyZTtcbiAgICAgICAgY2FjaGVkRml4dHVyZS5wcm9maWxlID0gdGhpcy5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgICAgICBjYWNoZWRGaXh0dXJlLm1vZGUgPSB0aGlzLmdldE1vZGVCeUZpeHR1cmUoY2FjaGVkRml4dHVyZS5wcm9maWxlLCBmaXh0dXJlKTtcbiAgICAgICAgY2FjaGVkRml4dHVyZS5jaGFubmVscyA9IHRoaXMuZ2V0Q2FjaGVkQ2hhbm5lbHMoY2FjaGVkRml4dHVyZS5wcm9maWxlLCBjYWNoZWRGaXh0dXJlLm1vZGUsIG51bGwpO1xuICAgICAgICB0aGlzLmNhY2hlZEZpeHR1cmVzLnB1c2goY2FjaGVkRml4dHVyZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBpeGVsS2V5cyA9IHRoaXMuZml4dHVyZUdldFVuaXF1ZVBpeGVsS2V5cyhmaXh0dXJlKTtcblxuICAgICAgZm9yIChsZXQgcGl4ZWxLZXkgb2YgcGl4ZWxLZXlzKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlZEZpeHR1cmUgPSBuZXcgQ2FjaGVkRml4dHVyZSgpO1xuICAgICAgICBjYWNoZWRGaXh0dXJlLmZpeHR1cmUgPSBmaXh0dXJlO1xuICAgICAgICBjYWNoZWRGaXh0dXJlLnBpeGVsS2V5ID0gcGl4ZWxLZXk7XG4gICAgICAgIGNhY2hlZEZpeHR1cmUucHJvZmlsZSA9IHRoaXMuZ2V0UHJvZmlsZUJ5VXVpZChmaXh0dXJlLnByb2ZpbGVVdWlkKTtcbiAgICAgICAgY2FjaGVkRml4dHVyZS5tb2RlID0gdGhpcy5nZXRNb2RlQnlGaXh0dXJlKGNhY2hlZEZpeHR1cmUucHJvZmlsZSwgZml4dHVyZSk7XG4gICAgICAgIGNhY2hlZEZpeHR1cmUuY2hhbm5lbHMgPSB0aGlzLmdldENhY2hlZENoYW5uZWxzKGNhY2hlZEZpeHR1cmUucHJvZmlsZSwgY2FjaGVkRml4dHVyZS5tb2RlLCBwaXhlbEtleSk7XG4gICAgICAgIHRoaXMuY2FjaGVkRml4dHVyZXMucHVzaChjYWNoZWRGaXh0dXJlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjYXBhYmlsaXRpZXNNYXRjaChcbiAgICB0eXBlMTogRml4dHVyZUNhcGFiaWxpdHlUeXBlLFxuICAgIHR5cGUyOiBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUsXG4gICAgY29sb3IxOiBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLFxuICAgIGNvbG9yMjogRml4dHVyZUNhcGFiaWxpdHlDb2xvcixcbiAgICB3aGVlbDE6IHN0cmluZyxcbiAgICB3aGVlbDI6IHN0cmluZyxcbiAgICBwcm9maWxlVXVpZDE6IHN0cmluZyxcbiAgICBwcm9maWxlVXVpZDI6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICAvLyBjaGVja3MsIHdoZXRoZXIgdHdvIHByb3ZpZGVkIGNhcGFwYWJpbGl0aWVzIG1hdGNoXG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGUxID09PSB0eXBlMiAmJlxuICAgICAgKCFjb2xvcjEgfHwgY29sb3IxID09PSBjb2xvcjIpICYmXG4gICAgICAoIXdoZWVsMSB8fCB3aGVlbDEgPT09IHdoZWVsMikgJiZcbiAgICAgICghcHJvZmlsZVV1aWQxIHx8IHByb2ZpbGVVdWlkMSA9PT0gcHJvZmlsZVV1aWQyKVxuICAgICk7XG4gIH1cblxuICBzZXR0aW5nc0ZpeHR1cmVJc1NlbGVjdGVkKGZpeHR1cmU6IEZpeHR1cmUpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHNlbGVjdGVkRml4dHVyZSBvZiB0aGlzLnNlbGVjdGVkU2V0dGluZ3NGaXh0dXJlcykge1xuICAgICAgaWYgKHNlbGVjdGVkRml4dHVyZSA9PT0gZml4dHVyZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2hTZXR0aW5nc0ZpeHR1cmVTZWxlY3Rpb24oZml4dHVyZTogRml4dHVyZSkge1xuICAgIGlmICh0aGlzLnNldHRpbmdzRml4dHVyZUlzU2VsZWN0ZWQoZml4dHVyZSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZXR0aW5nc0ZpeHR1cmVzLnNwbGljZSh0aGlzLnNlbGVjdGVkU2V0dGluZ3NGaXh0dXJlcy5pbmRleE9mKGZpeHR1cmUpLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFNldHRpbmdzRml4dHVyZXMucHVzaChmaXh0dXJlKTtcbiAgICB9XG4gIH1cblxuICBnZXRGaXh0dXJlSWNvbkNsYXNzKHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKTogc3RyaW5nIHtcbiAgICBpZiAoIXByb2ZpbGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKHByb2ZpbGUuY2F0ZWdvcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKCFwcm9maWxlLmNhdGVnb3JpZXNbMF0pIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHByb2ZpbGUuY2F0ZWdvcmllc1swXS5yZXBsYWNlKCcgJywgJy0nKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICB9XG5cbiAgdXBkYXRlUHJvZmlsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KCd1cGRhdGUtcHJvZmlsZXMnLCBudWxsKTtcbiAgfVxuXG4gIGdldE5leHRGcmVlRG14Q2hhbm5lbChmaXh0dXJlUG9vbDogRml4dHVyZVtdLCBuZWVkZWRDaGFubmVsczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBnZXQgdGhlIG5leHQgZnJlZSBzcGFjZSBmb3IgdGhpcyBmaXh0dXJlXG4gICAgbGV0IGZyZWVDaGFubmVscyA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDUxMjsgaSsrKSB7XG4gICAgICBsZXQgb2NjdXBpZWRDaGFubmVscyA9IDA7XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlUG9vbCkge1xuICAgICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5nZXRNb2RlQnlGaXh0dXJlKHRoaXMuZ2V0UHJvZmlsZUJ5VXVpZChmaXh0dXJlLnByb2ZpbGVVdWlkKSwgZml4dHVyZSk7XG4gICAgICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHRoaXMuZ2V0TW9kZUNoYW5uZWxDb3VudChwcm9maWxlLCBtb2RlKTtcblxuICAgICAgICBpZiAoaSA+PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCAmJiBpIDwgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgKyBjaGFubmVsQ291bnQpIHtcbiAgICAgICAgICAvLyB0aGlzIGNoYW5uZWwgaXMgYWxyZWFkeSBvY2N1cGllZCBieSBhIGZpeHR1cmUgLT4gbW92ZSBmb3J3YXJkIHRvIHRoZSBlbmQgb2YgdGhlIGZpeHR1cmVcbiAgICAgICAgICBpZiAoY2hhbm5lbENvdW50ID4gb2NjdXBpZWRDaGFubmVscykge1xuICAgICAgICAgICAgb2NjdXBpZWRDaGFubmVscyA9IGNoYW5uZWxDb3VudCAtIChpIC0gZml4dHVyZS5kbXhGaXJzdENoYW5uZWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob2NjdXBpZWRDaGFubmVscyA+IDApIHtcbiAgICAgICAgaSArPSBvY2N1cGllZENoYW5uZWxzIC0gMTtcbiAgICAgICAgZnJlZUNoYW5uZWxzID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyZWVDaGFubmVscysrO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnJlZUNoYW5uZWxzID09PSBuZWVkZWRDaGFubmVscykge1xuICAgICAgICByZXR1cm4gaSAtIGZyZWVDaGFubmVscyArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm8gZnJlZSBzcGFjZSBsZWZ0IGZvciB0aGUgbmVlZGVkIGNoYW5uZWxzXG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgYWRkRml4dHVyZShwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSwgZml4dHVyZVBvb2w6IEZpeHR1cmVbXSk6IEZpeHR1cmUge1xuICAgIGNvbnN0IGZpeHR1cmUgPSBuZXcgRml4dHVyZSgpO1xuXG4gICAgZml4dHVyZS51dWlkID0gdGhpcy51dWlkU2VydmljZS5nZXRVdWlkKCk7XG4gICAgZml4dHVyZS5wcm9maWxlVXVpZCA9IHByb2ZpbGUudXVpZDtcbiAgICBmaXh0dXJlLm5hbWUgPSBwcm9maWxlLm5hbWU7XG5cbiAgICBpZiAocHJvZmlsZS5tb2RlcyAmJiBwcm9maWxlLm1vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpeHR1cmUubW9kZVNob3J0TmFtZSA9IHByb2ZpbGUubW9kZXNbMF0uc2hvcnROYW1lO1xuICAgIH1cblxuICAgIC8vIGFkZCB0aGUgc2FtZSBtb2RlIGFzIGFuIGV4aXN0aW5nIGZpeHR1cmUsIGlmIGF2YWlsYWJsZVxuICAgIGxldCBleGlzdGluZ01vZGVTaG9ydE5hbWU6IHN0cmluZztcbiAgICBmb3IgKGNvbnN0IGV4aXN0aW5nRml4dHVyZSBvZiBmaXh0dXJlUG9vbCkge1xuICAgICAgY29uc3QgZXhpc3RpbmdQcm9maWxlID0gdGhpcy5nZXRQcm9maWxlQnlVdWlkKGV4aXN0aW5nRml4dHVyZS5wcm9maWxlVXVpZCk7XG5cbiAgICAgIGlmIChleGlzdGluZ1Byb2ZpbGUgPT09IHByb2ZpbGUpIHtcbiAgICAgICAgZXhpc3RpbmdNb2RlU2hvcnROYW1lID0gZXhpc3RpbmdGaXh0dXJlLm1vZGVTaG9ydE5hbWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleGlzdGluZ01vZGVTaG9ydE5hbWUpIHtcbiAgICAgIGZpeHR1cmUubW9kZVNob3J0TmFtZSA9IGV4aXN0aW5nTW9kZVNob3J0TmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZml4dHVyZS5tb2RlU2hvcnROYW1lID0gcHJvZmlsZS5tb2Rlc1swXS5zaG9ydE5hbWUgfHwgcHJvZmlsZS5tb2Rlc1swXS5uYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZGUgPSB0aGlzLmdldE1vZGVCeUZpeHR1cmUocHJvZmlsZSwgZml4dHVyZSk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gdGhpcy5nZXRNb2RlQ2hhbm5lbENvdW50KHByb2ZpbGUsIG1vZGUpO1xuICAgIGNvbnN0IGZpcnN0Q2hhbm5lbCA9IHRoaXMuZ2V0TmV4dEZyZWVEbXhDaGFubmVsKGZpeHR1cmVQb29sLCBjaGFubmVsQ291bnQpO1xuXG4gICAgaWYgKGZpcnN0Q2hhbm5lbCA+PSAwKSB7XG4gICAgICBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCA9IGZpcnN0Q2hhbm5lbDtcbiAgICAgIGZpeHR1cmVQb29sLnB1c2goZml4dHVyZSk7XG4gICAgICByZXR1cm4gZml4dHVyZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm8gZnJlZSBzcGFjZSBhbnltb3JlXG4gICAgICBjb25zdCBtc2cgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLm5vLWZyZWUtc3BhY2UnO1xuICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLm5vLWZyZWUtc3BhY2UtdGl0bGUnO1xuXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFttc2csIHRpdGxlXSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLmVycm9yKHJlc3VsdFttc2ddLCByZXN1bHRbdGl0bGVdKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19