cdk-nextjs 0.7.6 → 0.7.7

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 (43) hide show
  1. package/.jsii +3 -3
  2. package/.jsii.tabl.json +1 -1
  3. package/README.md +12 -3
  4. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
  5. package/docs/caching-guide.md +11 -1
  6. package/docs/harness-coverage.md +2 -1
  7. package/lib/adapter/aws-cache-store.d.ts +214 -3
  8. package/lib/adapter/aws-cache-store.js +470 -35
  9. package/lib/adapter/aws-cache-store.test.js +675 -3
  10. package/lib/adapter/cache-handler.mjs +421 -30
  11. package/lib/adapter/use-cache-common.d.ts +53 -1
  12. package/lib/adapter/use-cache-common.js +121 -14
  13. package/lib/adapter/use-cache-common.test.js +138 -1
  14. package/lib/adapter/use-cache-default-handler.js +36 -6
  15. package/lib/adapter/use-cache-default-handler.mjs +525 -42
  16. package/lib/adapter/use-cache-handlers.test.js +247 -7
  17. package/lib/adapter/use-cache-remote-handler.js +9 -7
  18. package/lib/adapter/use-cache-remote-handler.mjs +516 -40
  19. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
  20. package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
  21. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
  22. package/lib/nextjs-api.js +1 -1
  23. package/lib/nextjs-build/nextjs-build.js +1 -1
  24. package/lib/nextjs-cache.js +1 -1
  25. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  26. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  27. package/lib/nextjs-distribution.js +1 -1
  28. package/lib/nextjs-post-deploy.js +1 -1
  29. package/lib/nextjs-static-assets.js +1 -1
  30. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  31. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  32. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  33. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  34. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  35. package/lib/runtime/core.js +18 -4
  36. package/lib/runtime/core.test.js +17 -1
  37. package/lib/runtime/lambda.mjs +16 -3
  38. package/lib/runtime/server.mjs +16 -3
  39. package/lib/runtime/tag-manifest.d.ts +15 -0
  40. package/lib/runtime/tag-manifest.js +24 -0
  41. package/lib/runtime/tag-manifest.test.d.ts +1 -0
  42. package/lib/runtime/tag-manifest.test.js +21 -0
  43. package/package.json +1 -1
@@ -352,6 +352,677 @@ describe("CacheBucket", () => {
352
352
  });
353
353
  });
354
354
  describe("TrackedTagMarkers", () => {
355
+ it("never counts a render the runtime caught up as behind", async () => {
356
+ let clock = 1_000_000;
357
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
358
+ markers: { read: jest.fn() },
359
+ log: { query: jest.fn() },
360
+ refreshIntervalMs: 1000,
361
+ clock: () => clock,
362
+ });
363
+ // Just short of the line as the request came in: `catchUp` lets it go.
364
+ clock += 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS;
365
+ expect(markers.behind).toBe(false);
366
+ await markers.catchUp(async () => {
367
+ // However long the render takes, its lookups never wait: waiting is
368
+ // what the catch-up before it was for.
369
+ clock += 100;
370
+ expect(markers.behind).toBe(true);
371
+ expect(markers.behindInRender).toBe(false);
372
+ clock += 60_000;
373
+ expect(markers.behindInRender).toBe(false);
374
+ });
375
+ // Outside it - a route handler alongside, in a container - it waits.
376
+ expect(markers.behindInRender).toBe(true);
377
+ });
378
+ it("gives a render no grace when catchUp, holding nothing, did not catch up", async () => {
379
+ let clock = 1_000_000;
380
+ let held = false;
381
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
382
+ markers: { read: jest.fn() },
383
+ log: {
384
+ query: jest.fn(async () => ({ rows: [], truncated: false })),
385
+ },
386
+ refreshIntervalMs: 1000,
387
+ clock: () => clock,
388
+ });
389
+ markers.judgeEntriesOf(() => (held ? 0 : Infinity), () => held);
390
+ clock += 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS + 100;
391
+ await markers.catchUp(async () => {
392
+ // Another request stores an entry before this render's first lookup.
393
+ held = true;
394
+ expect(markers.behindInRender).toBe(true);
395
+ });
396
+ });
397
+ it("starts a refresh for a page that is not behind, without waiting for it", async () => {
398
+ let clock = 1_000_000;
399
+ let release;
400
+ const query = jest.fn(() => new Promise((resolve) => (release = () => resolve({ rows: [], truncated: false }))));
401
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
402
+ markers: { read: jest.fn() },
403
+ log: { query },
404
+ refreshIntervalMs: 1000,
405
+ clock: () => clock,
406
+ });
407
+ markers.judgeEntriesOf(() => 0);
408
+ clock += 1000;
409
+ expect(markers.behind).toBe(false);
410
+ // A page that reads no cache still keeps the instance current.
411
+ await expect(markers.catchUp(async () => "page")).resolves.toBe("page");
412
+ expect(query).toHaveBeenCalledTimes(1);
413
+ release();
414
+ });
415
+ it("catches up on the log without waiting for the rolling re-read", async () => {
416
+ let clock = 1_000_000;
417
+ let release;
418
+ const read = jest.fn(async (tags) => {
419
+ if (read.mock.calls.length > 1) {
420
+ await new Promise((resolve) => (release = resolve));
421
+ }
422
+ return new Map(tags.map((tag) => [tag, {}]));
423
+ });
424
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
425
+ markers: { read },
426
+ log: {
427
+ query: jest.fn(async () => ({ rows: [], truncated: false })),
428
+ },
429
+ refreshIntervalMs: 1000,
430
+ resyncIntervalMs: 1000,
431
+ random: () => 0,
432
+ clock: () => clock,
433
+ });
434
+ markers.judgeEntriesOf(() => 0);
435
+ await markers.ensure(["posts"]);
436
+ // Due for its re-read, and behind, as after a quiet spell.
437
+ clock += 5000;
438
+ expect(markers.behind).toBe(true);
439
+ let rendered = false;
440
+ await markers.catchUp(async () => (rendered = true));
441
+ // A throttled `BatchGetItem` would otherwise hold the page.
442
+ expect(rendered).toBe(true);
443
+ expect(read).toHaveBeenCalledTimes(2);
444
+ // Nor does a lookup of the tracked tag wait on it.
445
+ let ensured = false;
446
+ void markers.ensure(["posts"]).then(() => (ensured = true));
447
+ await new Promise((resolve) => setImmediate(resolve));
448
+ expect(ensured).toBe(true);
449
+ // Still in flight an interval later: not read a second time meanwhile.
450
+ clock += 1000;
451
+ await markers.refresh();
452
+ expect(read).toHaveBeenCalledTimes(2);
453
+ release();
454
+ });
455
+ it("gives a route handler, which no catch-up precedes, no grace more", async () => {
456
+ let clock = 1_000_000;
457
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
458
+ markers: { read: jest.fn() },
459
+ log: { query: jest.fn() },
460
+ refreshIntervalMs: 1000,
461
+ clock: () => clock,
462
+ });
463
+ clock += 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS + 100;
464
+ expect(markers.behindInRender).toBe(true);
465
+ });
466
+ it("reads again only once, however many forgets land meanwhile", async () => {
467
+ let clock = 1_000_000;
468
+ const releases = [];
469
+ const read = jest.fn(async () => {
470
+ await new Promise((resolve) => releases.push(resolve));
471
+ return new Map([["posts", { revalidatedAt: 1 }]]);
472
+ });
473
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
474
+ markers: { read },
475
+ log: {
476
+ query: jest.fn(async () => ({ rows: [], truncated: false })),
477
+ },
478
+ refreshIntervalMs: 0,
479
+ clock: () => clock,
480
+ });
481
+ markers.judgeEntriesOf(() => 0);
482
+ const forget = async () => {
483
+ clock += aws_cache_store_1.MAX_REVALIDATION_LOG_GAP_MS + 1;
484
+ await markers.refresh();
485
+ };
486
+ const ensuring = markers.ensure(["posts"]);
487
+ await forget();
488
+ releases.shift()();
489
+ await new Promise((resolve) => setImmediate(resolve));
490
+ await forget();
491
+ releases.shift()();
492
+ await ensuring;
493
+ // A truncated log forgets on every query: waiting for a read no forget
494
+ // overtook would keep the requests waiting on this one for as long.
495
+ expect(read).toHaveBeenCalledTimes(2);
496
+ expect(markers.get("posts")).toEqual({ revalidatedAt: 1 });
497
+ });
498
+ it("reads again what a read from before a forget found", async () => {
499
+ let clock = 1_000_000;
500
+ let release;
501
+ const held = new Promise((resolve) => (release = resolve));
502
+ let revalidatedAt;
503
+ const read = jest.fn(async () => {
504
+ await held;
505
+ return new Map(revalidatedAt === undefined ? [] : [["posts", { revalidatedAt }]]);
506
+ });
507
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
508
+ markers: { read },
509
+ log: {
510
+ query: jest.fn(async () => ({ rows: [], truncated: false })),
511
+ },
512
+ refreshIntervalMs: 0,
513
+ clock: () => clock,
514
+ });
515
+ markers.judgeEntriesOf(() => 0);
516
+ // A background read in flight as the sandbox froze, past the log's TTL.
517
+ const ensuring = markers.ensure(["posts"]);
518
+ clock += aws_cache_store_1.MAX_REVALIDATION_LOG_GAP_MS + 1;
519
+ await markers.refresh();
520
+ // Read again once the stale read returns: tracked, its marker would
521
+ // vouch for every entry with the tag, revalidated during the freeze or
522
+ // not; untracked, the request waiting on it would judge by nothing.
523
+ revalidatedAt = (0, aws_cache_store_1.markerClock)();
524
+ release();
525
+ await ensuring;
526
+ expect(read).toHaveBeenCalledTimes(2);
527
+ expect(markers.get("posts")).toEqual({ revalidatedAt });
528
+ });
529
+ it("moves completeSince past what it forgets", async () => {
530
+ let clock = 1_000_000;
531
+ const later = (0, aws_cache_store_1.markerClock)() + 60_000;
532
+ const rows = ["a", "b"].map((tag, i) => ({
533
+ sk: `${String(clock).padStart(15, "0")}#${tag}`,
534
+ at: clock,
535
+ tag,
536
+ marker: { revalidatedAt: later + i },
537
+ }));
538
+ const query = jest.fn(async () => ({ rows, truncated: false }));
539
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
540
+ markers: { read: jest.fn() },
541
+ log: { query },
542
+ refreshIntervalMs: 0,
543
+ maxTrackedTags: 1,
544
+ clock: () => clock,
545
+ });
546
+ // An entry store holding something older than every row.
547
+ markers.judgeEntriesOf(() => 0);
548
+ const start = markers.completeSince;
549
+ expect(start).toBeLessThanOrEqual((0, aws_cache_store_1.markerClock)());
550
+ // Untracked tags' rows are known from the log alone, as far as they fit.
551
+ await markers.refresh();
552
+ expect(markers.state(["b"], later)).toBe("expired");
553
+ // "a" was dropped for space, and with it what it knew.
554
+ expect(markers.state(["a"], later)).toBe("fresh");
555
+ expect(markers.completeSince).toBe(later);
556
+ // Forgetting everything moves it to now, or past what it forgot: "b".
557
+ clock += aws_cache_store_1.MAX_REVALIDATION_LOG_GAP_MS + 1;
558
+ await markers.refresh();
559
+ expect(markers.completeSince).toBe(later + 1);
560
+ });
561
+ it("moves completeSince past a row it lets go of with no entry held", async () => {
562
+ const clock = 1_000_000;
563
+ const revalidatedAt = (0, aws_cache_store_1.markerClock)() + 60_000;
564
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
565
+ markers: { read: jest.fn() },
566
+ log: {
567
+ query: jest.fn(async () => ({
568
+ rows: [
569
+ {
570
+ sk: `${String(clock).padStart(15, "0")}#posts`,
571
+ at: clock,
572
+ tag: "posts",
573
+ marker: { revalidatedAt },
574
+ },
575
+ ],
576
+ truncated: false,
577
+ })),
578
+ },
579
+ refreshIntervalMs: 0,
580
+ clock: () => clock,
581
+ });
582
+ markers.judgeEntriesOf(() => Infinity);
583
+ await markers.refresh();
584
+ // An entry whose generation started before the revalidation, stored once
585
+ // the row is gone, is older than `completeSince`, and so read first.
586
+ expect(markers.state(["posts"], revalidatedAt - 1)).toBe("fresh");
587
+ expect(markers.completeSince).toBe(revalidatedAt);
588
+ });
589
+ it("prunes a profile's row, and moves completeSince to its expiredAt once past", async () => {
590
+ const clock = 1_000_000;
591
+ const staleAt = (0, aws_cache_store_1.markerClock)() + 1000;
592
+ const expiredAt = staleAt + 60_000;
593
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
594
+ markers: { read: jest.fn() },
595
+ log: {
596
+ query: jest.fn(async () => ({
597
+ rows: [
598
+ {
599
+ sk: `${String(clock).padStart(15, "0")}#posts`,
600
+ at: clock,
601
+ tag: "posts",
602
+ marker: { staleAt, expiredAt },
603
+ },
604
+ ],
605
+ truncated: false,
606
+ })),
607
+ },
608
+ refreshIntervalMs: 0,
609
+ clock: () => clock,
610
+ });
611
+ markers.judgeEntriesOf(() => staleAt + 1);
612
+ await markers.refresh();
613
+ expect(markers.state(["posts"], staleAt - 1)).toBe("fresh");
614
+ expect(markers.completeSince).toBe(staleAt);
615
+ const now = jest
616
+ .spyOn(performance, "now")
617
+ .mockReturnValue(expiredAt - performance.timeOrigin);
618
+ try {
619
+ expect(markers.completeSince).toBe(expiredAt);
620
+ }
621
+ finally {
622
+ now.mockRestore();
623
+ }
624
+ });
625
+ it("queues a pruned row's future expiredAt once, however often the lookback returns it", async () => {
626
+ let clock = 1_000_000;
627
+ const staleAt = (0, aws_cache_store_1.markerClock)() + 1000;
628
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
629
+ markers: { read: jest.fn() },
630
+ log: {
631
+ query: jest.fn(async () => ({
632
+ rows: [
633
+ {
634
+ sk: `${String(1_000_000).padStart(15, "0")}#posts`,
635
+ at: 1_000_000,
636
+ tag: "posts",
637
+ marker: { staleAt, expiredAt: staleAt + 60_000 },
638
+ },
639
+ ],
640
+ truncated: false,
641
+ })),
642
+ },
643
+ refreshIntervalMs: 0,
644
+ clock: () => clock,
645
+ });
646
+ markers.judgeEntriesOf(() => staleAt + 1);
647
+ for (let i = 0; i < 3; i++) {
648
+ await markers.refresh();
649
+ clock += 1000;
650
+ }
651
+ // Pruned rows are not marked applied, so each query applies it again.
652
+ expect(markers.laterFloors).toHaveLength(1);
653
+ });
654
+ it("merges future expiredAts past its bound without moving completeSince early", async () => {
655
+ const at = (0, aws_cache_store_1.markerClock)();
656
+ const expiries = new Map([
657
+ ["a", at + 60_000],
658
+ ["b", at + 60_010],
659
+ ["c", at + 120_000],
660
+ ]);
661
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
662
+ markers: {
663
+ read: jest.fn(async (tags) => new Map(tags.map((tag) => [
664
+ tag,
665
+ { staleAt: at - 1000, expiredAt: expiries.get(tag) },
666
+ ]))),
667
+ },
668
+ log: { query: jest.fn() },
669
+ maxTrackedTags: 1,
670
+ });
671
+ const start = markers.completeSince;
672
+ // "a", then "b", dropped for space: two expiredAts past a bound of one.
673
+ for (const tag of ["a", "b", "c"]) {
674
+ await markers.ensure([tag]);
675
+ }
676
+ expect(markers.completeSince).toBe(start);
677
+ const now = jest.spyOn(performance, "now");
678
+ try {
679
+ now.mockReturnValue(at + 59_999 - performance.timeOrigin);
680
+ expect(markers.completeSince).toBe(start);
681
+ // Merged: "b"'s from "a"'s, 10 ms early.
682
+ now.mockReturnValue(at + 60_000 - performance.timeOrigin);
683
+ expect(markers.completeSince).toBe(at + 60_010);
684
+ }
685
+ finally {
686
+ now.mockRestore();
687
+ }
688
+ });
689
+ it("does not join a near expiredAt to far ones past its bound", async () => {
690
+ const at = (0, aws_cache_store_1.markerClock)();
691
+ const year = 365 * 24 * 60 * 60 * 1000;
692
+ const expiries = new Map([
693
+ ["a", at + year],
694
+ ["b", at + year + 10],
695
+ ["c", at + 60_000],
696
+ ]);
697
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
698
+ markers: {
699
+ read: jest.fn(async (tags) => new Map(tags.map((tag) => [
700
+ tag,
701
+ { staleAt: at - 1000, expiredAt: expiries.get(tag) },
702
+ ]))),
703
+ },
704
+ log: { query: jest.fn() },
705
+ maxTrackedTags: 2,
706
+ });
707
+ for (const tag of ["a", "b", "c", "d", "e"]) {
708
+ await markers.ensure([tag]);
709
+ }
710
+ const now = jest
711
+ .spyOn(performance, "now")
712
+ .mockReturnValue(at + 60_000 - performance.timeOrigin);
713
+ try {
714
+ // "a" and "b" are merged, not "c" into "a": `completeSince` a year
715
+ // early would have every held entry read its markers first until then.
716
+ expect(markers.completeSince).toBe(at + 60_000);
717
+ }
718
+ finally {
719
+ now.mockRestore();
720
+ }
721
+ });
722
+ it("merges the closest future expiredAts past its bound", async () => {
723
+ const at = (0, aws_cache_store_1.markerClock)();
724
+ const expiries = new Map([
725
+ ["a", at + 60_000],
726
+ ["b", at + 120_000],
727
+ ["c", at + 60_010],
728
+ ]);
729
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
730
+ markers: {
731
+ read: jest.fn(async (tags) => new Map(tags.map((tag) => [
732
+ tag,
733
+ { staleAt: at - 1000, expiredAt: expiries.get(tag) },
734
+ ]))),
735
+ },
736
+ log: { query: jest.fn() },
737
+ maxTrackedTags: 2,
738
+ });
739
+ // "a", "b", then "c" dropped for space: three expiredAts past a bound of
740
+ // two, and "c" is 10 ms from "a".
741
+ for (const tag of ["a", "b", "c", "d", "e"]) {
742
+ await markers.ensure([tag]);
743
+ }
744
+ const start = markers.completeSince;
745
+ const now = jest.spyOn(performance, "now");
746
+ try {
747
+ now.mockReturnValue(at + 59_999 - performance.timeOrigin);
748
+ expect(markers.completeSince).toBe(start);
749
+ now.mockReturnValue(at + 60_000 - performance.timeOrigin);
750
+ expect(markers.completeSince).toBe(at + 60_010);
751
+ now.mockReturnValue(at + 119_999 - performance.timeOrigin);
752
+ expect(markers.completeSince).toBe(at + 60_010);
753
+ now.mockReturnValue(at + 120_000 - performance.timeOrigin);
754
+ expect(markers.completeSince).toBe(at + 120_000);
755
+ }
756
+ finally {
757
+ now.mockRestore();
758
+ }
759
+ });
760
+ it("catches up only for an entry store holding entries, and not when every check asks anyway", async () => {
761
+ let clock = 1_000_000;
762
+ const instance = (refreshIntervalMs) => {
763
+ const query = jest.fn(async () => ({ rows: [], truncated: false }));
764
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
765
+ markers: { read: jest.fn() },
766
+ log: { query },
767
+ refreshIntervalMs,
768
+ clock: () => clock,
769
+ });
770
+ return { markers, query };
771
+ };
772
+ const noStore = instance(1000);
773
+ const everyCheck = instance(0);
774
+ everyCheck.markers.judgeEntriesOf(() => Infinity);
775
+ // A store, but holding nothing a refresh could expire.
776
+ const emptyStore = instance(1000);
777
+ emptyStore.markers.judgeEntriesOf(() => Infinity);
778
+ const store = instance(1000);
779
+ store.markers.judgeEntriesOf(() => 0);
780
+ clock += 60_000;
781
+ for (const { markers } of [noStore, everyCheck, emptyStore, store]) {
782
+ expect(markers.behind).toBe(true);
783
+ await markers.catchUp(async () => { });
784
+ }
785
+ expect(noStore.query).not.toHaveBeenCalled();
786
+ expect(everyCheck.query).not.toHaveBeenCalled();
787
+ expect(emptyStore.query).not.toHaveBeenCalled();
788
+ expect(store.query).toHaveBeenCalledTimes(1);
789
+ });
790
+ it("moves completeSince to a dropped marker's future expiredAt only once it is past", async () => {
791
+ const at = (0, aws_cache_store_1.markerClock)();
792
+ const read = jest.fn(async (tags) => new Map(tags.map((tag) => [
793
+ tag,
794
+ { staleAt: at - 1000, expiredAt: at + 60_000 },
795
+ ])));
796
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
797
+ markers: { read },
798
+ log: { query: jest.fn() },
799
+ maxTrackedTags: 1,
800
+ });
801
+ const start = markers.completeSince;
802
+ await markers.ensure(["a"]);
803
+ // "a" is dropped for space: a year-long `expire` would otherwise keep
804
+ // every entry reading its markers first for as long.
805
+ await markers.ensure(["b"]);
806
+ expect(markers.completeSince).toBe(start);
807
+ const clock = jest
808
+ .spyOn(performance, "now")
809
+ .mockReturnValue(at + 60_001 - performance.timeOrigin);
810
+ try {
811
+ expect(markers.completeSince).toBe(at + 60_000);
812
+ }
813
+ finally {
814
+ clock.mockRestore();
815
+ }
816
+ });
817
+ it("keeps only the log rows that could apply to an entry held", async () => {
818
+ let clock = 1_000_000;
819
+ const later = (0, aws_cache_store_1.markerClock)() + 60_000;
820
+ const rows = ["old", "new"].map((tag, i) => ({
821
+ sk: `${String(clock).padStart(15, "0")}#${tag}`,
822
+ at: clock,
823
+ tag,
824
+ marker: { revalidatedAt: i === 0 ? 1 : later },
825
+ }));
826
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
827
+ markers: { read: jest.fn() },
828
+ log: {
829
+ query: jest.fn(async () => ({ rows, truncated: false })),
830
+ },
831
+ refreshIntervalMs: 0,
832
+ maxTrackedTags: 1,
833
+ clock: () => clock,
834
+ });
835
+ let oldest = 2;
836
+ markers.judgeEntriesOf(() => oldest);
837
+ const start = markers.completeSince;
838
+ // "old" can expire nothing held, so it takes no room, and "new" is
839
+ // kept without dropping anything for space.
840
+ await markers.refresh();
841
+ expect(markers.state(["new"], later - 1)).toBe("expired");
842
+ expect(markers.completeSince).toBe(start);
843
+ // Once every entry held is newer than it, "new" goes too, taking
844
+ // `completeSince` no further than the oldest entry held.
845
+ oldest = later;
846
+ clock += 1000;
847
+ await markers.refresh();
848
+ expect(markers.state(["new"], later - 1)).toBe("fresh");
849
+ expect(markers.completeSince).toBe(later);
850
+ });
851
+ it("scans the entry stores once a minute, pruning only when the oldest moves", async () => {
852
+ let clock = 1_000_000;
853
+ const later = (0, aws_cache_store_1.markerClock)() + 60_000;
854
+ const rows = [
855
+ {
856
+ sk: `${String(clock).padStart(15, "0")}#new`,
857
+ at: clock,
858
+ tag: "new",
859
+ marker: { revalidatedAt: later },
860
+ },
861
+ ];
862
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
863
+ markers: { read: jest.fn() },
864
+ // The row leaves the lookback after the first query: only the prune
865
+ // can let it go.
866
+ log: {
867
+ query: jest
868
+ .fn()
869
+ .mockResolvedValueOnce({ rows, truncated: false })
870
+ .mockResolvedValue({ rows: [], truncated: false }),
871
+ },
872
+ refreshIntervalMs: 0,
873
+ clock: () => clock,
874
+ });
875
+ let bound = 2;
876
+ let exact = 2;
877
+ const oldest = jest.fn((scan) => (scan ? exact : bound));
878
+ markers.judgeEntriesOf(oldest);
879
+ const prune = jest.spyOn(markers, "pruneLogged");
880
+ await markers.refresh();
881
+ expect(oldest).toHaveBeenLastCalledWith(true);
882
+ expect(prune).toHaveBeenCalledTimes(1);
883
+ // Within the minute: the bound, and no prune while it stays put.
884
+ clock += 1000;
885
+ exact = later;
886
+ await markers.refresh();
887
+ expect(oldest).toHaveBeenLastCalledWith(false);
888
+ expect(prune).toHaveBeenCalledTimes(1);
889
+ expect(markers.state(["new"], later - 1)).toBe("expired");
890
+ // The minute's scan finds every entry newer than the row: it goes.
891
+ clock += 60_000;
892
+ await markers.refresh();
893
+ expect(oldest).toHaveBeenLastCalledWith(true);
894
+ expect(prune).toHaveBeenCalledTimes(2);
895
+ expect(markers.state(["new"], later - 1)).toBe("fresh");
896
+ expect(markers.completeSince).toBe(later);
897
+ // An entry set since moves the bound back: nothing to prune.
898
+ clock += 1000;
899
+ bound = 1;
900
+ await markers.refresh();
901
+ expect(prune).toHaveBeenCalledTimes(2);
902
+ });
903
+ it("waits for a fresh query rather than one started before a freeze", async () => {
904
+ let clock = 1_000_000;
905
+ const queries = [];
906
+ const query = jest.fn(() => new Promise((resolve) => queries.push(() => resolve({ rows: [], truncated: false }))));
907
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
908
+ markers: { read: jest.fn() },
909
+ log: { query },
910
+ refreshIntervalMs: 1000,
911
+ clock: () => clock,
912
+ canFreeze: true,
913
+ });
914
+ markers.judgeEntriesOf(() => 0);
915
+ clock += 1000;
916
+ // Started, not waited for, and then the sandbox froze.
917
+ void markers.refresh();
918
+ clock += 60_000;
919
+ expect(markers.behind).toBe(true);
920
+ let caughtUp = false;
921
+ const catchUp = markers
922
+ .catchUp(async () => { })
923
+ .then(() => (caughtUp = true));
924
+ queries.shift()();
925
+ await new Promise((resolve) => setImmediate(resolve));
926
+ expect(caughtUp).toBe(false);
927
+ expect(query).toHaveBeenCalledTimes(2);
928
+ queries.shift()();
929
+ await catchUp;
930
+ expect(markers.behind).toBe(false);
931
+ });
932
+ describe("with a refresh in flight", () => {
933
+ let clock;
934
+ beforeEach(() => {
935
+ clock = 1_000_000;
936
+ jest.useFakeTimers({ doNotFake: ["setImmediate", "nextTick"] });
937
+ });
938
+ afterEach(() => jest.useRealTimers());
939
+ /** Move the clock and the timers on together: no freeze. */
940
+ const run = (ms) => {
941
+ for (let step = 0; step < ms; step += 250) {
942
+ clock += 250;
943
+ jest.advanceTimersByTime(250);
944
+ }
945
+ };
946
+ const instance = (fails = false, canFreeze = true) => {
947
+ const queries = [];
948
+ const query = jest.fn(() => new Promise((resolve, reject) => queries.push(() => fails
949
+ ? reject(new Error("throttled"))
950
+ : resolve({ rows: [], truncated: false }))));
951
+ const markers = new aws_cache_store_1.TrackedTagMarkers({
952
+ markers: { read: jest.fn() },
953
+ log: { query },
954
+ refreshIntervalMs: 1000,
955
+ clock: () => clock,
956
+ canFreeze,
957
+ });
958
+ markers.judgeEntriesOf(() => 0);
959
+ return { markers, query, queries };
960
+ };
961
+ it("waits for a fresh query after a freeze, even once the late tick has run", async () => {
962
+ const { markers, query, queries } = instance();
963
+ clock += 1000;
964
+ void markers.refresh();
965
+ clock += 60_000;
966
+ // After the thaw the overdue tick can run before any request does.
967
+ jest.advanceTimersByTime(250);
968
+ let caughtUp = false;
969
+ const catchUp = markers
970
+ .catchUp(async () => { })
971
+ .then(() => (caughtUp = true));
972
+ queries.shift()();
973
+ await new Promise((resolve) => setImmediate(resolve));
974
+ // What the first query knew predates the freeze.
975
+ expect(markers.behind).toBe(true);
976
+ expect(caughtUp).toBe(false);
977
+ expect(query).toHaveBeenCalledTimes(2);
978
+ queries.shift()();
979
+ await catchUp;
980
+ expect(markers.behind).toBe(false);
981
+ });
982
+ it("in a container, which is never frozen, waits only for the query in flight", async () => {
983
+ const { markers, query, queries } = instance(false, false);
984
+ clock += 1000;
985
+ void markers.refresh();
986
+ // A long stall, not a freeze: no timer to tell them apart, none needed.
987
+ clock += 60_000;
988
+ const catchUp = markers.catchUp(async () => { });
989
+ queries.shift()();
990
+ await catchUp;
991
+ expect(query).toHaveBeenCalledTimes(1);
992
+ expect(markers.behind).toBe(false);
993
+ });
994
+ it("is caught up once the catch-up's slow query returns, the process running throughout", async () => {
995
+ for (const fails of [false, true]) {
996
+ const { markers, queries } = instance(fails);
997
+ clock += 60_000;
998
+ expect(markers.behind).toBe(true);
999
+ const catchUp = markers.catchUp(async () => { });
1000
+ run(3000);
1001
+ queries.shift()();
1002
+ await catchUp;
1003
+ // Or the first `'use cache'` lookup would wait for another query,
1004
+ // inside the render: one request, two waits.
1005
+ expect(markers.behind).toBe(false);
1006
+ }
1007
+ });
1008
+ it("waits only for a slow query in flight, the process running throughout", async () => {
1009
+ const { markers, query, queries } = instance();
1010
+ clock += 60_000;
1011
+ const first = markers.catchUp(async () => { });
1012
+ run(2500);
1013
+ // Past the grace into the query, but the query is as fresh as any.
1014
+ let caughtUp = false;
1015
+ const second = markers
1016
+ .catchUp(async () => { })
1017
+ .then(() => (caughtUp = true));
1018
+ queries.shift()();
1019
+ await first;
1020
+ await new Promise((resolve) => setImmediate(resolve));
1021
+ expect(caughtUp).toBe(true);
1022
+ await second;
1023
+ expect(query).toHaveBeenCalledTimes(1);
1024
+ });
1025
+ });
355
1026
  it("does not skip a row for an untracked tag that its first read missed", async () => {
356
1027
  // The writer puts the log row and the marker at the same time, and the
357
1028
  // marker read is eventually consistent: `refresh` can see the row, then
@@ -379,12 +1050,13 @@ describe("TrackedTagMarkers", () => {
379
1050
  clock: () => clock,
380
1051
  random: () => 0,
381
1052
  });
382
- // Something tracked, so the refresh queries the log.
1053
+ markers.judgeEntriesOf(() => 0);
383
1054
  await markers.ensure(["other"]);
384
1055
  clock += 1000;
385
1056
  await markers.refresh();
1057
+ // The row seen before the read is applied to what the read found.
386
1058
  await markers.ensure(["posts"]);
387
- expect(markers.get("posts")).toEqual({});
1059
+ expect(markers.get("posts")).toEqual({ revalidatedAt });
388
1060
  clock += 1000;
389
1061
  await markers.refresh();
390
1062
  expect(query).toHaveBeenCalledTimes(2);
@@ -393,4 +1065,4 @@ describe("TrackedTagMarkers", () => {
393
1065
  expect(read).toHaveBeenCalledTimes(2);
394
1066
  });
395
1067
  });
396
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNhY2hlLXN0b3JlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci9hd3MtY2FjaGUtc3RvcmUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBRXRDLDhEQU1rQztBQUNsQyxrREFLNEI7QUFDNUIsdURBaUIyQjtBQUUzQixnRUFBZ0U7QUFDaEUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFnQixFQUFFLElBQWEsRUFBRSxFQUFFO0lBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQWlCLENBQUM7SUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDLENBQUM7QUFFRixRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE9BQU8sQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNaLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixHQUFHLFFBQVEsQ0FBQztRQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxHQUFHLE9BQU8sQ0FBQztR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LElBQUk7WUFDdkIsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7WUFDbEIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gscURBQXFEO1FBQ3JELE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFaEMsS0FBSyxJQUFJLElBQUksQ0FBQztRQUNkLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFekMsS0FBSyxJQUFJLElBQUksQ0FBQztRQUNkLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDeEQsZ0RBQWdEO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtczNcIik7XG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIik7XG5cbmltcG9ydCB7XG4gIEJhdGNoR2V0SXRlbUNvbW1hbmQsXG4gIER5bmFtb0RCQ2xpZW50LFxuICBQdXRJdGVtQ29tbWFuZCxcbiAgUXVlcnlDb21tYW5kLFxuICBVcGRhdGVJdGVtQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IHtcbiAgR2V0T2JqZWN0Q29tbWFuZCxcbiAgTm9TdWNoS2V5LFxuICBQdXRPYmplY3RDb21tYW5kLFxuICBTM0NsaWVudCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHtcbiAgYnVpbGRTM0tleSxcbiAgQ2FjaGVCdWNrZXQsXG4gIGhhc2hlZFRhZyxcbiAgbWFya2VyRm9yLFxuICBtYXJrZXJTdGF0ZSxcbiAgbWFya2VyVXBkYXRlLFxuICBtZXJnZU1hcmtlcnMsXG4gIHJlc29sdmVBd3NDYWNoZUNvbmZpZyxcbiAgUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVMsXG4gIFJFVkFMSURBVElPTl9MT0dfVFRMX01TLFxuICBSZXZhbGlkYXRpb25Mb2csXG4gIFJldmFsaWRhdGlvbkxvZ1JvdyxcbiAgVGFnTWFya2VyLFxuICBUYWdNYXJrZXJUYWJsZSxcbiAgVHJhY2tlZFRhZ01hcmtlcnMsXG4gIHVzZUNhY2hlUzNLZXksXG59IGZyb20gXCIuL2F3cy1jYWNoZS1zdG9yZVwiO1xuXG4vKiogVGhlIGlucHV0IGFuIGF1dG9tb2NrZWQgU0RLIGNvbW1hbmQgd2FzIGNvbnN0cnVjdGVkIHdpdGguICovXG5jb25zdCBjb21tYW5kSW5wdXQgPSAoY29tbWFuZDogdW5rbm93biwgdHlwZTogdW5rbm93bikgPT4ge1xuICBjb25zdCBtb2NrID0gdHlwZSBhcyBqZXN0Lk1vY2s7XG4gIHJldHVybiBtb2NrLm1vY2suY2FsbHNbbW9jay5tb2NrLmluc3RhbmNlcy5pbmRleE9mKGNvbW1hbmQpXVswXTtcbn07XG5cbmRlc2NyaWJlKFwicmVzb2x2ZUF3c0NhY2hlQ29uZmlnXCIsICgpID0+IHtcbiAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHByb2Nlc3MuZW52ID0geyAuLi5lbnYgfTtcbiAgfSk7XG4gIGFmdGVyQWxsKCgpID0+IHtcbiAgICBwcm9jZXNzLmVudiA9IGVudjtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyB0aGUgZW52aXJvbm1lbnQgdGhlIGNvbnN0cnVjdHMgc2V0XCIsICgpID0+IHtcbiAgICBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FID0gXCJidWNrZXRcIjtcbiAgICBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FID0gXCJ0YWJsZVwiO1xuICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfQlVJTERfSUQgPSBcImJ1aWxkXCI7XG4gICAgcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiA9IFwiZXUtd2VzdC0xXCI7XG4gICAgZXhwZWN0KHJlc29sdmVBd3NDYWNoZUNvbmZpZygpKS50b0VxdWFsKHtcbiAgICAgIGJ1Y2tldE5hbWU6IFwiYnVja2V0XCIsXG4gICAgICB0YWJsZU5hbWU6IFwidGFibGVcIixcbiAgICAgIGJ1aWxkSWQ6IFwiYnVpbGRcIixcbiAgICAgIHJlZ2lvbjogXCJldS13ZXN0LTFcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJyZXBvcnRzIHdoYXQgaXMgdW5zZXQgYXMgZW1wdHlcIiwgKCkgPT4ge1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0JVSUxEX0lEO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5BV1NfUkVHSU9OO1xuICAgIGV4cGVjdChyZXNvbHZlQXdzQ2FjaGVDb25maWcoKSkudG9FcXVhbCh7XG4gICAgICBidWNrZXROYW1lOiBcIlwiLFxuICAgICAgdGFibGVOYW1lOiBcIlwiLFxuICAgICAgYnVpbGRJZDogXCJcIixcbiAgICAgIHJlZ2lvbjogXCJ1cy1lYXN0LTFcIixcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJTMyBrZXlzXCIsICgpID0+IHtcbiAgaXQoXCJrZWVwcyB0aGUgaW5jcmVtZW50YWwgY2FjaGUncyB7YnVpbGRJZH0ve2tleX0uanNvbiBjb252ZW50aW9uXCIsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCIvXCIpKS50b0JlKFwiYi9pbmRleC5qc29uXCIpO1xuICAgIGV4cGVjdChidWlsZFMzS2V5KFwiYlwiLCBcIlwiKSkudG9CZShcImIvaW5kZXguanNvblwiKTtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCIvYmxvZy9wb3N0XCIpKS50b0JlKFwiYi9ibG9nL3Bvc3QuanNvblwiKTtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCJhYmMxMjNcIikpLnRvQmUoXCJiL2FiYzEyMy5qc29uXCIpO1xuICB9KTtcblxuICBpdChcInB1dHMgJ3VzZSBjYWNoZScgZW50cmllcyB3aGVyZSBubyBpbmNyZW1lbnRhbCBrZXkgY2FuIGxhbmRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IHVzZUNhY2hlUzNLZXkoXCJiXCIsIFwiZlwiLnJlcGVhdCg2NCkpO1xuICAgIGV4cGVjdChrZXkpLnRvQmUoYGIvX3VzZS1jYWNoZS8ke1wiZlwiLnJlcGVhdCg2NCl9LmVudHJ5YCk7XG4gICAgLy8gRXZlbiBhIHJvdXRlIHNwZWxsZWQgbGlrZSB0aGUgdXNlLWNhY2hlIGtleSBnZXRzIGAuanNvbmAgYXBwZW5kZWQuXG4gICAgZXhwZWN0KGJ1aWxkUzNLZXkoXCJiXCIsIGAvX3VzZS1jYWNoZS8ke1wiZlwiLnJlcGVhdCg2NCl9LmVudHJ5YCkpLm5vdC50b0JlKFxuICAgICAga2V5LFxuICAgICk7XG4gICAgZXhwZWN0KGtleS5lbmRzV2l0aChcIi5qc29uXCIpKS50b0JlKGZhbHNlKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJ0YWcgbWFya2Vyc1wiLCAoKSA9PiB7XG4gIGl0KFwid3JpdGVzIHdoYXQgbWFya2VyRm9yIGFwcGxpZXMgbG9jYWxseVwiLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBkdXJhdGlvbnMgb2YgW3VuZGVmaW5lZCwge30sIHsgZXhwaXJlOiA2MCB9XSkge1xuICAgICAgY29uc3QgdXBkYXRlID0gbWFya2VyVXBkYXRlKDEwMDAsIGR1cmF0aW9ucyk7XG4gICAgICBjb25zdCBsb2NhbCA9IG1hcmtlckZvcigxMDAwLCBkdXJhdGlvbnMpO1xuICAgICAgY29uc3Qgd3JpdHRlbjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICB1cGRhdGUuRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyEsXG4gICAgICApKSB7XG4gICAgICAgIHdyaXR0ZW5bbmFtZS5zbGljZSgxKV0gPSBOdW1iZXIodmFsdWUuTik7XG4gICAgICB9XG4gICAgICBleHBlY3Qod3JpdHRlbikudG9FcXVhbChsb2NhbCk7XG4gICAgfVxuICAgIGV4cGVjdChtYXJrZXJGb3IoMTAwMCwgeyBleHBpcmU6IDYwIH0pKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDEwMDAsXG4gICAgICBleHBpcmVkQXQ6IDYxMDAwLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcImtlZXBzIGFuIGVhcmxpZXIgZXhwaXJlZEF0IGEgcHJvZmlsZSB3aXRoIG5vIGV4cGlyZSBsZWF2ZXNcIiwgKCkgPT4ge1xuICAgIC8vIFRoZSByb3cga2VlcHMgaXQgKGBTRVQgc3RhbGVBdGAgb25seSksIHNvIGFuIGluc3RhbmNlIGxlYXJuaW5nIG9mIHRoZVxuICAgIC8vIHNlY29uZCByZXZhbGlkYXRpb24gZnJvbSB0aGUgbG9nIGhhcyB0byBrZWVwIGl0IHRvby5cbiAgICBjb25zdCBmaXJzdCA9IG1hcmtlckZvcigxMDAwLCB7IGV4cGlyZTogNjAgfSk7XG4gICAgY29uc3Qgc2Vjb25kID0gbWFya2VyRm9yKDIwMDAsIHt9KTtcbiAgICBleHBlY3QobWVyZ2VNYXJrZXJzKGZpcnN0LCBzZWNvbmQpKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDIwMDAsXG4gICAgICBleHBpcmVkQXQ6IDYxMDAwLFxuICAgIH0pO1xuICAgIGV4cGVjdChtZXJnZU1hcmtlcnMoc2Vjb25kLCBmaXJzdCkpLnRvRXF1YWwoe1xuICAgICAgc3RhbGVBdDogMjAwMCxcbiAgICAgIGV4cGlyZWRBdDogNjEwMDAsXG4gICAgfSk7XG4gICAgLy8gQSBuZXdlciBgZXhwaXJlYCBzdGlsbCByZXBsYWNlcyBpdC5cbiAgICBleHBlY3QobWVyZ2VNYXJrZXJzKGZpcnN0LCBtYXJrZXJGb3IoMjAwMCwgeyBleHBpcmU6IDEgfSkpKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDIwMDAsXG4gICAgICBleHBpcmVkQXQ6IDMwMDAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwianVkZ2VzIGFuIGVudHJ5IHRoZSB3YXkgdGhlIGluY3JlbWVudGFsIGNhY2hlIGFsd2F5cyBoYXNcIiwgKCkgPT4ge1xuICAgIC8vIEV4cGlyZWQgb3V0cmlnaHQgYWZ0ZXIgY3JlYXRpb24uXG4gICAgZXhwZWN0KG1hcmtlclN0YXRlKHsgcmV2YWxpZGF0ZWRBdDogMjAgfSwgMTAsIDMwKSkudG9CZShcImV4cGlyZWRcIik7XG4gICAgLy8gUmV2YWxpZGF0ZWQgYmVmb3JlIHRoZSBlbnRyeSB3YXMgY3JlYXRlZDogbm8gZWZmZWN0LlxuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHJldmFsaWRhdGVkQXQ6IDUgfSwgMTAsIDMwKSkudG9CZShcImZyZXNoXCIpO1xuICAgIC8vIEEgcHJvZmlsZTogc3RhbGUgbm93LCBleHBpcmVkIG9uY2UgYGV4cGlyZWRBdGAgcGFzc2VzLlxuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHN0YWxlQXQ6IDIwLCBleHBpcmVkQXQ6IDUwIH0sIDEwLCAzMCkpLnRvQmUoXCJzdGFsZVwiKTtcbiAgICBleHBlY3QobWFya2VyU3RhdGUoeyBzdGFsZUF0OiAyMCwgZXhwaXJlZEF0OiA1MCB9LCAxMCwgNjApKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICAvLyBgZXhwaXJlOiAwYDogc3RhbGUgYW5kIGV4cGlyZWQgYXQgb25jZS5cbiAgICBleHBlY3QobWFya2VyU3RhdGUoeyBzdGFsZUF0OiAyMCwgZXhwaXJlZEF0OiAyMCB9LCAxMCwgMzApKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICBleHBlY3QobWFya2VyU3RhdGUoe30sIDEwLCAzMCkpLnRvQmUoXCJmcmVzaFwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJUYWdNYXJrZXJUYWJsZVwiLCAoKSA9PiB7XG4gIGNvbnN0IHNlbmQgPSBqZXN0LmZuKCk7XG4gIGxldCB0YWJsZTogVGFnTWFya2VyVGFibGU7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoRHluYW1vREJDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgdGFibGUgPSBuZXcgVGFnTWFya2VyVGFibGUobmV3IER5bmFtb0RCQ2xpZW50KHt9KSwgXCJ0YmxcIiwgXCJidWlsZFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJ3cml0ZXMgdGhlIG1hcmtlciByb3cgdW5kZXIgdGhlIGJ1aWxkXCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHt9KTtcbiAgICBhd2FpdCB0YWJsZS53cml0ZShcInBvc3RzXCIsIDEwMDAsIHsgZXhwaXJlOiAxIH0pO1xuICAgIGNvbnN0IGlucHV0ID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgVXBkYXRlSXRlbUNvbW1hbmQpO1xuICAgIGV4cGVjdChpbnB1dCkudG9FcXVhbCh7XG4gICAgICBUYWJsZU5hbWU6IFwidGJsXCIsXG4gICAgICBLZXk6IHsgcGs6IHsgUzogXCJidWlsZFwiIH0sIHNrOiB7IFM6IFwicG9zdHNcIiB9IH0sXG4gICAgICBVcGRhdGVFeHByZXNzaW9uOiBcIlNFVCBzdGFsZUF0ID0gOnN0YWxlQXQsIGV4cGlyZWRBdCA9IDpleHBpcmVkQXRcIixcbiAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgXCI6c3RhbGVBdFwiOiB7IE46IFwiMTAwMFwiIH0sXG4gICAgICAgIFwiOmV4cGlyZWRBdFwiOiB7IE46IFwiMjAwMFwiIH0sXG4gICAgICB9LFxuICAgICAgUmV0dXJuVmFsdWVzOiBcIkFMTF9ORVdcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBtYXJrZXJzIGluIGJhdGNoZXMgb2YgMTAwIGFuZCBwYXJzZXMgdGhlbVwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrSW1wbGVtZW50YXRpb24oKGNvbW1hbmQ6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHsgUmVxdWVzdEl0ZW1zIH0gPSBjb21tYW5kSW5wdXQoY29tbWFuZCwgQmF0Y2hHZXRJdGVtQ29tbWFuZCk7XG4gICAgICBjb25zdCBrZXlzID0gUmVxdWVzdEl0ZW1zLnRibC5LZXlzIGFzIHsgc2s6IHsgUzogc3RyaW5nIH0gfVtdO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIFJlc3BvbnNlczoge1xuICAgICAgICAgIHRibDoga2V5c1xuICAgICAgICAgICAgLmZpbHRlcigoeyBzayB9KSA9PiBzay5TLmVuZHNXaXRoKFwiMFwiKSlcbiAgICAgICAgICAgIC5tYXAoKHsgc2sgfSkgPT4gKHsgc2ssIHJldmFsaWRhdGVkQXQ6IHsgTjogXCI3XCIgfSB9KSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCB0YWdzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTUwIH0sIChfLCBpKSA9PiBgdCR7aX1gKTtcbiAgICBjb25zdCBtYXJrZXJzID0gYXdhaXQgdGFibGUucmVhZChbLi4udGFncywgXCJ0MFwiXSk7XG4gICAgZXhwZWN0KHNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICBleHBlY3QobWFya2Vycy5zaXplKS50b0JlKDE1KTtcbiAgICBleHBlY3QobWFya2Vycy5nZXQoXCJ0MTBcIikpLnRvRXF1YWwoe1xuICAgICAgcmV2YWxpZGF0ZWRBdDogNyxcbiAgICAgIHN0YWxlQXQ6IHVuZGVmaW5lZCxcbiAgICAgIGV4cGlyZWRBdDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcImtleXMgYSB0YWcgcGFzdCB0aGUgc29ydCBrZXkgbGltaXQgYnkgaXRzIGhhc2gsIGFuZCByZWFkcyBpdCBiYWNrIGFzIHRoZSB0YWdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIGByZXZhbGlkYXRlUGF0aGAgb24gYSBsb25nIHBhdGg6IGFuIGltcGxpY2l0IHRhZyBpcyBhcyBsb25nIGFzIHRoZSBwYXRoLlxuICAgIGNvbnN0IHRhZyA9IGBfTl9UXy8ke1wicFwiLnJlcGVhdCgxMTAwKX1gO1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGF3YWl0IHRhYmxlLndyaXRlKHRhZywgMTAwMCwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCB3cml0dGVuID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgVXBkYXRlSXRlbUNvbW1hbmQpO1xuICAgIGV4cGVjdCh3cml0dGVuLktleS5zay5TKS50b0JlKGhhc2hlZFRhZyh0YWcpKTtcbiAgICBleHBlY3QoaGFzaGVkVGFnKHRhZykpLnRvTWF0Y2goL14jWzAtOWEtZl17NjR9JC8pO1xuXG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICBzZW5kLm1vY2tJbXBsZW1lbnRhdGlvbigoY29tbWFuZDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgeyBSZXF1ZXN0SXRlbXMgfSA9IGNvbW1hbmRJbnB1dChjb21tYW5kLCBCYXRjaEdldEl0ZW1Db21tYW5kKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBSZXNwb25zZXM6IHtcbiAgICAgICAgICB0Ymw6IFJlcXVlc3RJdGVtcy50YmwuS2V5cy5tYXAoKHsgc2sgfTogeyBzazogdW5rbm93biB9KSA9PiAoe1xuICAgICAgICAgICAgc2ssXG4gICAgICAgICAgICByZXZhbGlkYXRlZEF0OiB7IE46IFwiN1wiIH0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgbWFya2VycyA9IGF3YWl0IHRhYmxlLnJlYWQoW3RhZywgXCJzaG9ydFwiXSk7XG4gICAgZXhwZWN0KFsuLi5tYXJrZXJzLmtleXMoKV0uc29ydCgpKS50b0VxdWFsKFtcInNob3J0XCIsIHRhZ10uc29ydCgpKTtcbiAgfSk7XG5cbiAgLy8gQSByZWFkLWJhY2sgYWZ0ZXIgdGhlIHdyaXRlIGlzIGV2ZW50dWFsbHkgY29uc2lzdGVudCwgc28gaXQgY2FuIHJldHVyblxuICAvLyB0aGUgbWFya2VyIGZyb20gYmVmb3JlIGl0OiB0aGUgd3JpdGVyIHRyYWNrcyB3aGF0IHRoZSB3cml0ZSByZXR1cm5lZC5cbiAgaXQoXCJyZXR1cm5zIHRoZSByb3cgYXMgdGhlIHdyaXRlIGxlZnQgaXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgIEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2s6IHsgUzogXCJwb3N0c1wiIH0sXG4gICAgICAgIHJldmFsaWRhdGVkQXQ6IHsgTjogXCI1MDAwXCIgfSxcbiAgICAgICAgc3RhbGVBdDogeyBOOiBcIjEwXCIgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KGF3YWl0IHRhYmxlLndyaXRlKFwicG9zdHNcIiwgNTAwMCwgdW5kZWZpbmVkKSkudG9FcXVhbCh7XG4gICAgICByZXZhbGlkYXRlZEF0OiA1MDAwLFxuICAgICAgc3RhbGVBdDogMTAsXG4gICAgICBleHBpcmVkQXQ6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7fSk7XG4gICAgZXhwZWN0KGF3YWl0IHRhYmxlLndyaXRlKFwicG9zdHNcIiwgNjAwMCwgdW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcblxuICBpdChcImFza3MgYWdhaW4gZm9yIHVucHJvY2Vzc2VkIGtleXMsIGFuZCBnaXZlcyB1cCBhZnRlciB0aHJlZSB0cmllc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdW5wcm9jZXNzZWQgPSB7XG4gICAgICBVbnByb2Nlc3NlZEtleXM6IHtcbiAgICAgICAgdGJsOiB7IEtleXM6IFt7IHBrOiB7IFM6IFwiYnVpbGRcIiB9LCBzazogeyBTOiBcImFcIiB9IH1dIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UodW5wcm9jZXNzZWQpLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7XG4gICAgICBSZXNwb25zZXM6IHsgdGJsOiBbeyBzazogeyBTOiBcImFcIiB9LCBzdGFsZUF0OiB7IE46IFwiM1wiIH0gfV0gfSxcbiAgICB9KTtcbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLnJlYWQoW1wiYVwiXSkpLmdldChcImFcIik/LnN0YWxlQXQpLnRvQmUoMyk7XG5cbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHVucHJvY2Vzc2VkKTtcbiAgICBhd2FpdCBleHBlY3QodGFibGUucmVhZChbXCJhXCJdKSkucmVqZWN0cy50b1Rocm93KC91bnJlYWQgYWZ0ZXIgcmV0cnlpbmcvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSZXZhbGlkYXRpb25Mb2dcIiwgKCkgPT4ge1xuICBjb25zdCBzZW5kID0gamVzdC5mbigpO1xuICBsZXQgbG9nOiBSZXZhbGlkYXRpb25Mb2c7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoRHluYW1vREJDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgbG9nID0gbmV3IFJldmFsaWRhdGlvbkxvZyhuZXcgRHluYW1vREJDbGllbnQoe30pLCBcInRibFwiLCBcImJ1aWxkXCIpO1xuICB9KTtcblxuICBpdChcInB1dHMgb25lIHJvdyBwZXIgcmV2YWxpZGF0aW9uIHVuZGVyIHRoZSBidWlsZCdzIGxvZywgd2l0aCBhIFRUTFwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgY29uc3QgYXQgPSAxXzcyN18wMDBfMDAwXzEyMztcbiAgICBhd2FpdCBsb2cucHV0KFwidXNlciM0MlwiLCBhdCwgeyBzdGFsZUF0OiA1LCBleHBpcmVkQXQ6IDYgfSk7XG4gICAgZXhwZWN0KGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIFB1dEl0ZW1Db21tYW5kKSkudG9FcXVhbCh7XG4gICAgICBUYWJsZU5hbWU6IFwidGJsXCIsXG4gICAgICBJdGVtOiB7XG4gICAgICAgIHBrOiB7IFM6IFwiYnVpbGQjbG9nXCIgfSxcbiAgICAgICAgc2s6IHsgUzogXCIwMDE3MjcwMDAwMDAxMjMjdXNlciM0MlwiIH0sXG4gICAgICAgIHR0bDogeyBOOiBTdHJpbmcoTWF0aC5jZWlsKChhdCArIFJFVkFMSURBVElPTl9MT0dfVFRMX01TKSAvIDEwMDApKSB9LFxuICAgICAgICBzdGFsZUF0OiB7IE46IFwiNVwiIH0sXG4gICAgICAgIGV4cGlyZWRBdDogeyBOOiBcIjZcIiB9LFxuICAgICAgfSxcbiAgICAgIENvbmRpdGlvbkV4cHJlc3Npb246IFwiYXR0cmlidXRlX25vdF9leGlzdHMoc2spXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwibW92ZXMgYSByb3cgdG8gdGhlIG5leHQgbWlsbGlzZWNvbmQgcmF0aGVyIHRoYW4gb3ZlcndyaXRlIGFub3RoZXIgcmV2YWxpZGF0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBgdXBkYXRlVGFnKCd4JylgIGFuZCBgcmV2YWxpZGF0ZVRhZygneCcsICdtYXgnKWAgaW4gb25lIG1pbGxpc2Vjb25kLlxuICAgIGNvbnN0IHRha2VuID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJ0YWtlblwiKSwge1xuICAgICAgbmFtZTogXCJDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uXCIsXG4gICAgfSk7XG4gICAgc2VuZC5tb2NrUmVqZWN0ZWRWYWx1ZU9uY2UodGFrZW4pLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7fSk7XG4gICAgYXdhaXQgbG9nLnB1dChcInhcIiwgMTAwMC41LCB7IHJldmFsaWRhdGVkQXQ6IDUgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgc2VuZC5tb2NrLmNhbGxzLm1hcChcbiAgICAgICAgKFtjb21tYW5kXSkgPT4gY29tbWFuZElucHV0KGNvbW1hbmQsIFB1dEl0ZW1Db21tYW5kKS5JdGVtLnNrLlMsXG4gICAgICApLFxuICAgICkudG9FcXVhbChbXCIwMDAwMDAwMDAwMDEwMDAjeFwiLCBcIjAwMDAwMDAwMDAwMTAwMSN4XCJdKTtcbiAgfSk7XG5cbiAgaXQoXCJnaXZlcyB1cCBhZnRlciBhIGJvdW5kZWQgbnVtYmVyIG9mIGNvbGxpc2lvbnMsIGFuZCBvbiBvdGhlciBlcnJvcnMgYXQgb25jZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFrZW4gPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcInRha2VuXCIpLCB7XG4gICAgICBuYW1lOiBcIkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRFeGNlcHRpb25cIixcbiAgICB9KTtcbiAgICBzZW5kLm1vY2tSZWplY3RlZFZhbHVlKHRha2VuKTtcbiAgICBhd2FpdCBleHBlY3QobG9nLnB1dChcInhcIiwgMTAwMCwge30pKS5yZWplY3RzLnRvQmUodGFrZW4pO1xuICAgIGV4cGVjdChzZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoNSk7XG5cbiAgICBzZW5kLm1vY2tSZXNldCgpO1xuICAgIGNvbnN0IHRocm90dGxlZCA9IG5ldyBFcnJvcihcInRocm90dGxlZFwiKTtcbiAgICBzZW5kLm1vY2tSZWplY3RlZFZhbHVlKHRocm90dGxlZCk7XG4gICAgYXdhaXQgZXhwZWN0KGxvZy5wdXQoXCJ4XCIsIDEwMDAsIHt9KSkucmVqZWN0cy50b0JlKHRocm90dGxlZCk7XG4gICAgZXhwZWN0KHNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG5cbiAgaXQoXCJxdWVyaWVzIGZyb20gYSB6ZXJvLXBhZGRlZCBjdXJzb3IgYW5kIHBhcnNlcyB0aGUgdGFnIGFmdGVyIGl0XCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kXG4gICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgICAgSXRlbXM6IFtcbiAgICAgICAgICB7IHNrOiB7IFM6IFwiMDAwMDAwMDAwMDAxMDAwI2FcIiB9LCByZXZhbGlkYXRlZEF0OiB7IE46IFwiN1wiIH0gfSxcbiAgICAgICAgICB7IHNrOiB7IFM6IFwibm90IGEgbG9nIHJvd1wiIH0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgTGFzdEV2YWx1YXRlZEtleTogeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSxcbiAgICAgIH0pXG4gICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgICAgSXRlbXM6IFt7IHNrOiB7IFM6IFwiMDAwMDAwMDAwMDAyMDAwI3VzZXIjNDJcIiB9LCBzdGFsZUF0OiB7IE46IFwiOFwiIH0gfV0sXG4gICAgICB9KTtcbiAgICBjb25zdCB7IHJvd3MsIHRydW5jYXRlZCB9ID0gYXdhaXQgbG9nLnF1ZXJ5KDk5OS41KTtcblxuICAgIGNvbnN0IGZpcnN0ID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgUXVlcnlDb21tYW5kKTtcbiAgICBleHBlY3QoZmlyc3QpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgVGFibGVOYW1lOiBcInRibFwiLFxuICAgICAgS2V5Q29uZGl0aW9uRXhwcmVzc2lvbjogXCJwayA9IDpwayBBTkQgc2sgPj0gOnNpbmNlXCIsXG4gICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgIFwiOnBrXCI6IHsgUzogXCJidWlsZCNsb2dcIiB9LFxuICAgICAgICBcIjpzaW5jZVwiOiB7IFM6IFwiMDAwMDAwMDAwMDAwOTk5XCIgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1sxXVswXSwgUXVlcnlDb21tYW5kKS5FeGNsdXNpdmVTdGFydEtleSxcbiAgICApLnRvRXF1YWwoeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSk7XG4gICAgZXhwZWN0KHRydW5jYXRlZCkudG9CZShmYWxzZSk7XG4gICAgZXhwZWN0KHJvd3MpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICBzazogXCIwMDAwMDAwMDAwMDEwMDAjYVwiLFxuICAgICAgICBhdDogMTAwMCxcbiAgICAgICAgdGFnOiBcImFcIixcbiAgICAgICAgbWFya2VyOiB7IHJldmFsaWRhdGVkQXQ6IDcsIHN0YWxlQXQ6IHVuZGVmaW5lZCwgZXhwaXJlZEF0OiB1bmRlZmluZWQgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNrOiBcIjAwMDAwMDAwMDAwMjAwMCN1c2VyIzQyXCIsXG4gICAgICAgIGF0OiAyMDAwLFxuICAgICAgICB0YWc6IFwidXNlciM0MlwiLFxuICAgICAgICBtYXJrZXI6IHsgcmV2YWxpZGF0ZWRBdDogdW5kZWZpbmVkLCBzdGFsZUF0OiA4LCBleHBpcmVkQXQ6IHVuZGVmaW5lZCB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoXCJoYXNoZXMgYSB0YWcgdG9vIGxvbmcgZm9yIHRoZSBzb3J0IGtleSwgY2FycnlpbmcgaXQgaW4gbG9uZ1RhZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFnID0gYF9OX1RfLyR7XCJwXCIucmVwZWF0KDExMDApfWA7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgYXdhaXQgbG9nLnB1dCh0YWcsIDEwMDAsIHsgcmV2YWxpZGF0ZWRBdDogNSB9KTtcbiAgICBjb25zdCB7IEl0ZW0gfSA9IGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIFB1dEl0ZW1Db21tYW5kKTtcbiAgICBleHBlY3QoSXRlbS5zay5TKS50b0JlKGAwMDAwMDAwMDAwMDEwMDAjJHtoYXNoZWRUYWcodGFnKX1gKTtcbiAgICBleHBlY3QoSXRlbS5sb25nVGFnKS50b0VxdWFsKHsgUzogdGFnIH0pO1xuXG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IEl0ZW1zOiBbeyAuLi5JdGVtIH1dIH0pO1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgbG9nLnF1ZXJ5KDApO1xuICAgIGV4cGVjdChyb3dzLm1hcCgocm93KSA9PiByb3cudGFnKSkudG9FcXVhbChbdGFnXSk7XG4gIH0pO1xuXG4gIGl0KFwic3RvcHMgYWZ0ZXIgaXRzIHBhZ2UgYm91bmQgYW5kIHNheXMgc29cIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgSXRlbXM6IFtdLFxuICAgICAgTGFzdEV2YWx1YXRlZEtleTogeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSxcbiAgICB9KTtcbiAgICBleHBlY3QoKGF3YWl0IGxvZy5xdWVyeSgwKSkudHJ1bmNhdGVkKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChzZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVMpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIkNhY2hlQnVja2V0XCIsICgpID0+IHtcbiAgY29uc3Qgc2VuZCA9IGplc3QuZm4oKTtcbiAgbGV0IGJ1Y2tldDogQ2FjaGVCdWNrZXQ7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoUzNDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgYnVja2V0ID0gbmV3IENhY2hlQnVja2V0KG5ldyBTM0NsaWVudCh7fSksIFwiYmt0XCIpO1xuICB9KTtcblxuICBpdChcInJlYWRzIGFuIG9iamVjdCBhcyB0ZXh0XCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IHsgdHJhbnNmb3JtVG9TdHJpbmc6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShcInt9XCIpIH0sXG4gICAgICBDb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgfSk7XG4gICAgZXhwZWN0KGF3YWl0IGJ1Y2tldC5nZXQoXCJrXCIpKS50b0JlKFwie31cIik7XG4gICAgZXhwZWN0KGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIEdldE9iamVjdENvbW1hbmQpKS50b0VxdWFsKHtcbiAgICAgIEJ1Y2tldDogXCJia3RcIixcbiAgICAgIEtleTogXCJrXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiYW5zd2VycyBhIG1pc3Npbmcgb2JqZWN0IG9yIGJvZHkgd2l0aCB1bmRlZmluZWQsIGFuZCB0aHJvd3MgdGhlIHJlc3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWVPbmNlKFxuICAgICAgbmV3IE5vU3VjaEtleSh7IG1lc3NhZ2U6IFwibWlzc2luZ1wiLCAkbWV0YWRhdGE6IHt9IH0pLFxuICAgICk7XG4gICAgZXhwZWN0KGF3YWl0IGJ1Y2tldC5nZXQoXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBCb2R5OiBudWxsIH0pO1xuICAgIGV4cGVjdChhd2FpdCBidWNrZXQuZ2V0KFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWVPbmNlKG5ldyBFcnJvcihcIkFjY2Vzc0RlbmllZFwiKSk7XG4gICAgYXdhaXQgZXhwZWN0KGJ1Y2tldC5nZXQoXCJrXCIpKS5yZWplY3RzLnRvVGhyb3coXCJBY2Nlc3NEZW5pZWRcIik7XG4gIH0pO1xuXG4gIGl0KFwid3JpdGVzIEpTT05cIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGF3YWl0IGJ1Y2tldC5wdXRKc29uKFwia1wiLCBcInt9XCIpO1xuICAgIGV4cGVjdChjb21tYW5kSW5wdXQoc2VuZC5tb2NrLmNhbGxzWzBdWzBdLCBQdXRPYmplY3RDb21tYW5kKSkudG9FcXVhbCh7XG4gICAgICBCdWNrZXQ6IFwiYmt0XCIsXG4gICAgICBLZXk6IFwia1wiLFxuICAgICAgQm9keTogXCJ7fVwiLFxuICAgICAgQ29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlRyYWNrZWRUYWdNYXJrZXJzXCIsICgpID0+IHtcbiAgaXQoXCJkb2VzIG5vdCBza2lwIGEgcm93IGZvciBhbiB1bnRyYWNrZWQgdGFnIHRoYXQgaXRzIGZpcnN0IHJlYWQgbWlzc2VkXCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGUgd3JpdGVyIHB1dHMgdGhlIGxvZyByb3cgYW5kIHRoZSBtYXJrZXIgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHRoZVxuICAgIC8vIG1hcmtlciByZWFkIGlzIGV2ZW50dWFsbHkgY29uc2lzdGVudDogYHJlZnJlc2hgIGNhbiBzZWUgdGhlIHJvdywgdGhlblxuICAgIC8vIGBlbnN1cmVgIHJlYWQgdGhlIG1hcmtlciBmcm9tIGJlZm9yZSBpdC4gTWFya2VkIGFwcGxpZWQgd2hpbGUgdGhlIHRhZ1xuICAgIC8vIHdhcyB1bnRyYWNrZWQsIHRoZSByb3cgd2FzIHNraXBwZWQgYnkgZXZlcnkgcXVlcnkgdGhlIGxvb2tiYWNrIHJldHVybmVkXG4gICAgLy8gaXQgdG8sIGFuZCB0aGUgaW5zdGFuY2Ugc2VydmVkIHRoZSBzdGFsZSBlbnRyeSB1bnRpbCB0aGUgcm9sbGluZyByZS1yZWFkLlxuICAgIGxldCBjbG9jayA9IDFfMDAwXzAwMDtcbiAgICBjb25zdCByZXZhbGlkYXRlZEF0ID0gOTk5XzAwMDtcbiAgICBjb25zdCByb3c6IFJldmFsaWRhdGlvbkxvZ1JvdyA9IHtcbiAgICAgIHNrOiBgJHtTdHJpbmcoY2xvY2spLnBhZFN0YXJ0KDE1LCBcIjBcIil9I3Bvc3RzYCxcbiAgICAgIGF0OiBjbG9jayxcbiAgICAgIHRhZzogXCJwb3N0c1wiLFxuICAgICAgbWFya2VyOiB7IHJldmFsaWRhdGVkQXQgfSxcbiAgICB9O1xuICAgIGNvbnN0IHF1ZXJ5ID0gamVzdC5mbihhc3luYyAoc2luY2U6IG51bWJlcikgPT4gKHtcbiAgICAgIHJvd3M6IFtyb3ddLmZpbHRlcigocikgPT4gci5hdCA+PSBzaW5jZSksXG4gICAgICB0cnVuY2F0ZWQ6IGZhbHNlLFxuICAgIH0pKTtcbiAgICAvLyBBIHJlcGxpY2EgdGhhdCBoYXMgbm90IHNlZW4gdGhlIHdyaXRlIHlldC5cbiAgICBjb25zdCByZWFkID0gamVzdC5mbihhc3luYyAoKSA9PiBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPigpKTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZCB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHsgcXVlcnkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgICAgcmFuZG9tOiAoKSA9PiAwLFxuICAgIH0pO1xuICAgIC8vIFNvbWV0aGluZyB0cmFja2VkLCBzbyB0aGUgcmVmcmVzaCBxdWVyaWVzIHRoZSBsb2cuXG4gICAgYXdhaXQgbWFya2Vycy5lbnN1cmUoW1wib3RoZXJcIl0pO1xuXG4gICAgY2xvY2sgKz0gMTAwMDtcbiAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbXCJwb3N0c1wiXSk7XG4gICAgZXhwZWN0KG1hcmtlcnMuZ2V0KFwicG9zdHNcIikpLnRvRXF1YWwoe30pO1xuXG4gICAgY2xvY2sgKz0gMTAwMDtcbiAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICBleHBlY3QocXVlcnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICBleHBlY3QobWFya2Vycy5nZXQoXCJwb3N0c1wiKSkudG9FcXVhbCh7IHJldmFsaWRhdGVkQXQgfSk7XG4gICAgLy8gT25seSB0aGUgb25lIHJlYWQgZWFjaCB0YWcncyBmaXJzdCB1c2UgY29zdHMuXG4gICAgZXhwZWN0KHJlYWQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgfSk7XG59KTtcbiJdfQ==
1068
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNhY2hlLXN0b3JlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci9hd3MtY2FjaGUtc3RvcmUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBRXRDLDhEQU1rQztBQUNsQyxrREFLNEI7QUFDNUIsdURBb0IyQjtBQUUzQixnRUFBZ0U7QUFDaEUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFnQixFQUFFLElBQWEsRUFBRSxFQUFFO0lBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQWlCLENBQUM7SUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDLENBQUM7QUFFRixRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE9BQU8sQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNaLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixHQUFHLFFBQVEsQ0FBQztRQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxHQUFHLE9BQU8sQ0FBQztR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b3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKTtcbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiKTtcblxuaW1wb3J0IHtcbiAgQmF0Y2hHZXRJdGVtQ29tbWFuZCxcbiAgRHluYW1vREJDbGllbnQsXG4gIFB1dEl0ZW1Db21tYW5kLFxuICBRdWVyeUNvbW1hbmQsXG4gIFVwZGF0ZUl0ZW1Db21tYW5kLFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCI7XG5pbXBvcnQge1xuICBHZXRPYmplY3RDb21tYW5kLFxuICBOb1N1Y2hLZXksXG4gIFB1dE9iamVjdENvbW1hbmQsXG4gIFMzQ2xpZW50LFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQge1xuICBidWlsZFMzS2V5LFxuICBDYWNoZUJ1Y2tldCxcbiAgaGFzaGVkVGFnLFxuICBtYXJrZXJDbG9jayxcbiAgbWFya2VyRm9yLFxuICBtYXJrZXJTdGF0ZSxcbiAgbWFya2VyVXBkYXRlLFxuICBtZXJnZU1hcmtlcnMsXG4gIHJlc29sdmVBd3NDYWNoZUNvbmZpZyxcbiAgTUFYX1JFVkFMSURBVElPTl9MT0dfR0FQX01TLFxuICBSRVZBTElEQVRJT05fTE9HX01BWF9QQUdFUyxcbiAgUkVWQUxJREFUSU9OX0xPR19UVExfTVMsXG4gIFRBR19SRUZSRVNIX0dSQUNFX01TLFxuICBSZXZhbGlkYXRpb25Mb2csXG4gIFJldmFsaWRhdGlvbkxvZ1JvdyxcbiAgVGFnTWFya2VyLFxuICBUYWdNYXJrZXJUYWJsZSxcbiAgVHJhY2tlZFRhZ01hcmtlcnMsXG4gIHVzZUNhY2hlUzNLZXksXG59IGZyb20gXCIuL2F3cy1jYWNoZS1zdG9yZVwiO1xuXG4vKiogVGhlIGlucHV0IGFuIGF1dG9tb2NrZWQgU0RLIGNvbW1hbmQgd2FzIGNvbnN0cnVjdGVkIHdpdGguICovXG5jb25zdCBjb21tYW5kSW5wdXQgPSAoY29tbWFuZDogdW5rbm93biwgdHlwZTogdW5rbm93bikgPT4ge1xuICBjb25zdCBtb2NrID0gdHlwZSBhcyBqZXN0Lk1vY2s7XG4gIHJldHVybiBtb2NrLm1vY2suY2FsbHNbbW9jay5tb2NrLmluc3RhbmNlcy5pbmRleE9mKGNvbW1hbmQpXVswXTtcbn07XG5cbmRlc2NyaWJlKFwicmVzb2x2ZUF3c0NhY2hlQ29uZmlnXCIsICgpID0+IHtcbiAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHByb2Nlc3MuZW52ID0geyAuLi5lbnYgfTtcbiAgfSk7XG4gIGFmdGVyQWxsKCgpID0+IHtcbiAgICBwcm9jZXNzLmVudiA9IGVudjtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyB0aGUgZW52aXJvbm1lbnQgdGhlIGNvbnN0cnVjdHMgc2V0XCIsICgpID0+IHtcbiAgICBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FID0gXCJidWNrZXRcIjtcbiAgICBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FID0gXCJ0YWJsZVwiO1xuICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfQlVJTERfSUQgPSBcImJ1aWxkXCI7XG4gICAgcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiA9IFwiZXUtd2VzdC0xXCI7XG4gICAgZXhwZWN0KHJlc29sdmVBd3NDYWNoZUNvbmZpZygpKS50b0VxdWFsKHtcbiAgICAgIGJ1Y2tldE5hbWU6IFwiYnVja2V0XCIsXG4gICAgICB0YWJsZU5hbWU6IFwidGFibGVcIixcbiAgICAgIGJ1aWxkSWQ6IFwiYnVpbGRcIixcbiAgICAgIHJlZ2lvbjogXCJldS13ZXN0LTFcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJyZXBvcnRzIHdoYXQgaXMgdW5zZXQgYXMgZW1wdHlcIiwgKCkgPT4ge1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0JVSUxEX0lEO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5BV1NfUkVHSU9OO1xuICAgIGV4cGVjdChyZXNvbHZlQXdzQ2FjaGVDb25maWcoKSkudG9FcXVhbCh7XG4gICAgICBidWNrZXROYW1lOiBcIlwiLFxuICAgICAgdGFibGVOYW1lOiBcIlwiLFxuICAgICAgYnVpbGRJZDogXCJcIixcbiAgICAgIHJlZ2lvbjogXCJ1cy1lYXN0LTFcIixcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJTMyBrZXlzXCIsICgpID0+IHtcbiAgaXQoXCJrZWVwcyB0aGUgaW5jcmVtZW50YWwgY2FjaGUncyB7YnVpbGRJZH0ve2tleX0uanNvbiBjb252ZW50aW9uXCIsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCIvXCIpKS50b0JlKFwiYi9pbmRleC5qc29uXCIpO1xuICAgIGV4cGVjdChidWlsZFMzS2V5KFwiYlwiLCBcIlwiKSkudG9CZShcImIvaW5kZXguanNvblwiKTtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCIvYmxvZy9wb3N0XCIpKS50b0JlKFwiYi9ibG9nL3Bvc3QuanNvblwiKTtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCJhYmMxMjNcIikpLnRvQmUoXCJiL2FiYzEyMy5qc29uXCIpO1xuICB9KTtcblxuICBpdChcInB1dHMgJ3VzZSBjYWNoZScgZW50cmllcyB3aGVyZSBubyBpbmNyZW1lbnRhbCBrZXkgY2FuIGxhbmRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IHVzZUNhY2hlUzNLZXkoXCJiXCIsIFwiZlwiLnJlcGVhdCg2NCkpO1xuICAgIGV4cGVjdChrZXkpLnRvQmUoYGIvX3VzZS1jYWNoZS8ke1wiZlwiLnJlcGVhdCg2NCl9LmVudHJ5YCk7XG4gICAgLy8gRXZlbiBhIHJvdXRlIHNwZWxsZWQgbGlrZSB0aGUgdXNlLWNhY2hlIGtleSBnZXRzIGAuanNvbmAgYXBwZW5kZWQuXG4gICAgZXhwZWN0KGJ1aWxkUzNLZXkoXCJiXCIsIGAvX3VzZS1jYWNoZS8ke1wiZlwiLnJlcGVhdCg2NCl9LmVudHJ5YCkpLm5vdC50b0JlKFxuICAgICAga2V5LFxuICAgICk7XG4gICAgZXhwZWN0KGtleS5lbmRzV2l0aChcIi5qc29uXCIpKS50b0JlKGZhbHNlKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJ0YWcgbWFya2Vyc1wiLCAoKSA9PiB7XG4gIGl0KFwid3JpdGVzIHdoYXQgbWFya2VyRm9yIGFwcGxpZXMgbG9jYWxseVwiLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBkdXJhdGlvbnMgb2YgW3VuZGVmaW5lZCwge30sIHsgZXhwaXJlOiA2MCB9XSkge1xuICAgICAgY29uc3QgdXBkYXRlID0gbWFya2VyVXBkYXRlKDEwMDAsIGR1cmF0aW9ucyk7XG4gICAgICBjb25zdCBsb2NhbCA9IG1hcmtlckZvcigxMDAwLCBkdXJhdGlvbnMpO1xuICAgICAgY29uc3Qgd3JpdHRlbjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICB1cGRhdGUuRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyEsXG4gICAgICApKSB7XG4gICAgICAgIHdyaXR0ZW5bbmFtZS5zbGljZSgxKV0gPSBOdW1iZXIodmFsdWUuTik7XG4gICAgICB9XG4gICAgICBleHBlY3Qod3JpdHRlbikudG9FcXVhbChsb2NhbCk7XG4gICAgfVxuICAgIGV4cGVjdChtYXJrZXJGb3IoMTAwMCwgeyBleHBpcmU6IDYwIH0pKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDEwMDAsXG4gICAgICBleHBpcmVkQXQ6IDYxMDAwLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcImtlZXBzIGFuIGVhcmxpZXIgZXhwaXJlZEF0IGEgcHJvZmlsZSB3aXRoIG5vIGV4cGlyZSBsZWF2ZXNcIiwgKCkgPT4ge1xuICAgIC8vIFRoZSByb3cga2VlcHMgaXQgKGBTRVQgc3RhbGVBdGAgb25seSksIHNvIGFuIGluc3RhbmNlIGxlYXJuaW5nIG9mIHRoZVxuICAgIC8vIHNlY29uZCByZXZhbGlkYXRpb24gZnJvbSB0aGUgbG9nIGhhcyB0byBrZWVwIGl0IHRvby5cbiAgICBjb25zdCBmaXJzdCA9IG1hcmtlckZvcigxMDAwLCB7IGV4cGlyZTogNjAgfSk7XG4gICAgY29uc3Qgc2Vjb25kID0gbWFya2VyRm9yKDIwMDAsIHt9KTtcbiAgICBleHBlY3QobWVyZ2VNYXJrZXJzKGZpcnN0LCBzZWNvbmQpKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDIwMDAsXG4gICAgICBleHBpcmVkQXQ6IDYxMDAwLFxuICAgIH0pO1xuICAgIGV4cGVjdChtZXJnZU1hcmtlcnMoc2Vjb25kLCBmaXJzdCkpLnRvRXF1YWwoe1xuICAgICAgc3RhbGVBdDogMjAwMCxcbiAgICAgIGV4cGlyZWRBdDogNjEwMDAsXG4gICAgfSk7XG4gICAgLy8gQSBuZXdlciBgZXhwaXJlYCBzdGlsbCByZXBsYWNlcyBpdC5cbiAgICBleHBlY3QobWVyZ2VNYXJrZXJzKGZpcnN0LCBtYXJrZXJGb3IoMjAwMCwgeyBleHBpcmU6IDEgfSkpKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDIwMDAsXG4gICAgICBleHBpcmVkQXQ6IDMwMDAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwianVkZ2VzIGFuIGVudHJ5IHRoZSB3YXkgdGhlIGluY3JlbWVudGFsIGNhY2hlIGFsd2F5cyBoYXNcIiwgKCkgPT4ge1xuICAgIC8vIEV4cGlyZWQgb3V0cmlnaHQgYWZ0ZXIgY3JlYXRpb24uXG4gICAgZXhwZWN0KG1hcmtlclN0YXRlKHsgcmV2YWxpZGF0ZWRBdDogMjAgfSwgMTAsIDMwKSkudG9CZShcImV4cGlyZWRcIik7XG4gICAgLy8gUmV2YWxpZGF0ZWQgYmVmb3JlIHRoZSBlbnRyeSB3YXMgY3JlYXRlZDogbm8gZWZmZWN0LlxuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHJldmFsaWRhdGVkQXQ6IDUgfSwgMTAsIDMwKSkudG9CZShcImZyZXNoXCIpO1xuICAgIC8vIEEgcHJvZmlsZTogc3RhbGUgbm93LCBleHBpcmVkIG9uY2UgYGV4cGlyZWRBdGAgcGFzc2VzLlxuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHN0YWxlQXQ6IDIwLCBleHBpcmVkQXQ6IDUwIH0sIDEwLCAzMCkpLnRvQmUoXCJzdGFsZVwiKTtcbiAgICBleHBlY3QobWFya2VyU3RhdGUoeyBzdGFsZUF0OiAyMCwgZXhwaXJlZEF0OiA1MCB9LCAxMCwgNjApKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICAvLyBgZXhwaXJlOiAwYDogc3RhbGUgYW5kIGV4cGlyZWQgYXQgb25jZS5cbiAgICBleHBlY3QobWFya2VyU3RhdGUoeyBzdGFsZUF0OiAyMCwgZXhwaXJlZEF0OiAyMCB9LCAxMCwgMzApKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICBleHBlY3QobWFya2VyU3RhdGUoe30sIDEwLCAzMCkpLnRvQmUoXCJmcmVzaFwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJUYWdNYXJrZXJUYWJsZVwiLCAoKSA9PiB7XG4gIGNvbnN0IHNlbmQgPSBqZXN0LmZuKCk7XG4gIGxldCB0YWJsZTogVGFnTWFya2VyVGFibGU7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoRHluYW1vREJDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgdGFibGUgPSBuZXcgVGFnTWFya2VyVGFibGUobmV3IER5bmFtb0RCQ2xpZW50KHt9KSwgXCJ0YmxcIiwgXCJidWlsZFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJ3cml0ZXMgdGhlIG1hcmtlciByb3cgdW5kZXIgdGhlIGJ1aWxkXCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHt9KTtcbiAgICBhd2FpdCB0YWJsZS53cml0ZShcInBvc3RzXCIsIDEwMDAsIHsgZXhwaXJlOiAxIH0pO1xuICAgIGNvbnN0IGlucHV0ID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgVXBkYXRlSXRlbUNvbW1hbmQpO1xuICAgIGV4cGVjdChpbnB1dCkudG9FcXVhbCh7XG4gICAgICBUYWJsZU5hbWU6IFwidGJsXCIsXG4gICAgICBLZXk6IHsgcGs6IHsgUzogXCJidWlsZFwiIH0sIHNrOiB7IFM6IFwicG9zdHNcIiB9IH0sXG4gICAgICBVcGRhdGVFeHByZXNzaW9uOiBcIlNFVCBzdGFsZUF0ID0gOnN0YWxlQXQsIGV4cGlyZWRBdCA9IDpleHBpcmVkQXRcIixcbiAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgXCI6c3RhbGVBdFwiOiB7IE46IFwiMTAwMFwiIH0sXG4gICAgICAgIFwiOmV4cGlyZWRBdFwiOiB7IE46IFwiMjAwMFwiIH0sXG4gICAgICB9LFxuICAgICAgUmV0dXJuVmFsdWVzOiBcIkFMTF9ORVdcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBtYXJrZXJzIGluIGJhdGNoZXMgb2YgMTAwIGFuZCBwYXJzZXMgdGhlbVwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrSW1wbGVtZW50YXRpb24oKGNvbW1hbmQ6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHsgUmVxdWVzdEl0ZW1zIH0gPSBjb21tYW5kSW5wdXQoY29tbWFuZCwgQmF0Y2hHZXRJdGVtQ29tbWFuZCk7XG4gICAgICBjb25zdCBrZXlzID0gUmVxdWVzdEl0ZW1zLnRibC5LZXlzIGFzIHsgc2s6IHsgUzogc3RyaW5nIH0gfVtdO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIFJlc3BvbnNlczoge1xuICAgICAgICAgIHRibDoga2V5c1xuICAgICAgICAgICAgLmZpbHRlcigoeyBzayB9KSA9PiBzay5TLmVuZHNXaXRoKFwiMFwiKSlcbiAgICAgICAgICAgIC5tYXAoKHsgc2sgfSkgPT4gKHsgc2ssIHJldmFsaWRhdGVkQXQ6IHsgTjogXCI3XCIgfSB9KSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCB0YWdzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTUwIH0sIChfLCBpKSA9PiBgdCR7aX1gKTtcbiAgICBjb25zdCBtYXJrZXJzID0gYXdhaXQgdGFibGUucmVhZChbLi4udGFncywgXCJ0MFwiXSk7XG4gICAgZXhwZWN0KHNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICBleHBlY3QobWFya2Vycy5zaXplKS50b0JlKDE1KTtcbiAgICBleHBlY3QobWFya2Vycy5nZXQoXCJ0MTBcIikpLnRvRXF1YWwoe1xuICAgICAgcmV2YWxpZGF0ZWRBdDogNyxcbiAgICAgIHN0YWxlQXQ6IHVuZGVmaW5lZCxcbiAgICAgIGV4cGlyZWRBdDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcImtleXMgYSB0YWcgcGFzdCB0aGUgc29ydCBrZXkgbGltaXQgYnkgaXRzIGhhc2gsIGFuZCByZWFkcyBpdCBiYWNrIGFzIHRoZSB0YWdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIGByZXZhbGlkYXRlUGF0aGAgb24gYSBsb25nIHBhdGg6IGFuIGltcGxpY2l0IHRhZyBpcyBhcyBsb25nIGFzIHRoZSBwYXRoLlxuICAgIGNvbnN0IHRhZyA9IGBfTl9UXy8ke1wicFwiLnJlcGVhdCgxMTAwKX1gO1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGF3YWl0IHRhYmxlLndyaXRlKHRhZywgMTAwMCwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCB3cml0dGVuID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgVXBkYXRlSXRlbUNvbW1hbmQpO1xuICAgIGV4cGVjdCh3cml0dGVuLktleS5zay5TKS50b0JlKGhhc2hlZFRhZyh0YWcpKTtcbiAgICBleHBlY3QoaGFzaGVkVGFnKHRhZykpLnRvTWF0Y2goL14jWzAtOWEtZl17NjR9JC8pO1xuXG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICBzZW5kLm1vY2tJbXBsZW1lbnRhdGlvbigoY29tbWFuZDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgeyBSZXF1ZXN0SXRlbXMgfSA9IGNvbW1hbmRJbnB1dChjb21tYW5kLCBCYXRjaEdldEl0ZW1Db21tYW5kKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBSZXNwb25zZXM6IHtcbiAgICAgICAgICB0Ymw6IFJlcXVlc3RJdGVtcy50YmwuS2V5cy5tYXAoKHsgc2sgfTogeyBzazogdW5rbm93biB9KSA9PiAoe1xuICAgICAgICAgICAgc2ssXG4gICAgICAgICAgICByZXZhbGlkYXRlZEF0OiB7IE46IFwiN1wiIH0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgbWFya2VycyA9IGF3YWl0IHRhYmxlLnJlYWQoW3RhZywgXCJzaG9ydFwiXSk7XG4gICAgZXhwZWN0KFsuLi5tYXJrZXJzLmtleXMoKV0uc29ydCgpKS50b0VxdWFsKFtcInNob3J0XCIsIHRhZ10uc29ydCgpKTtcbiAgfSk7XG5cbiAgLy8gQSByZWFkLWJhY2sgYWZ0ZXIgdGhlIHdyaXRlIGlzIGV2ZW50dWFsbHkgY29uc2lzdGVudCwgc28gaXQgY2FuIHJldHVyblxuICAvLyB0aGUgbWFya2VyIGZyb20gYmVmb3JlIGl0OiB0aGUgd3JpdGVyIHRyYWNrcyB3aGF0IHRoZSB3cml0ZSByZXR1cm5lZC5cbiAgaXQoXCJyZXR1cm5zIHRoZSByb3cgYXMgdGhlIHdyaXRlIGxlZnQgaXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgIEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2s6IHsgUzogXCJwb3N0c1wiIH0sXG4gICAgICAgIHJldmFsaWRhdGVkQXQ6IHsgTjogXCI1MDAwXCIgfSxcbiAgICAgICAgc3RhbGVBdDogeyBOOiBcIjEwXCIgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KGF3YWl0IHRhYmxlLndyaXRlKFwicG9zdHNcIiwgNTAwMCwgdW5kZWZpbmVkKSkudG9FcXVhbCh7XG4gICAgICByZXZhbGlkYXRlZEF0OiA1MDAwLFxuICAgICAgc3RhbGVBdDogMTAsXG4gICAgICBleHBpcmVkQXQ6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7fSk7XG4gICAgZXhwZWN0KGF3YWl0IHRhYmxlLndyaXRlKFwicG9zdHNcIiwgNjAwMCwgdW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcblxuICBpdChcImFza3MgYWdhaW4gZm9yIHVucHJvY2Vzc2VkIGtleXMsIGFuZCBnaXZlcyB1cCBhZnRlciB0aHJlZSB0cmllc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdW5wcm9jZXNzZWQgPSB7XG4gICAgICBVbnByb2Nlc3NlZEtleXM6IHtcbiAgICAgICAgdGJsOiB7IEtleXM6IFt7IHBrOiB7IFM6IFwiYnVpbGRcIiB9LCBzazogeyBTOiBcImFcIiB9IH1dIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UodW5wcm9jZXNzZWQpLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7XG4gICAgICBSZXNwb25zZXM6IHsgdGJsOiBbeyBzazogeyBTOiBcImFcIiB9LCBzdGFsZUF0OiB7IE46IFwiM1wiIH0gfV0gfSxcbiAgICB9KTtcbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLnJlYWQoW1wiYVwiXSkpLmdldChcImFcIik/LnN0YWxlQXQpLnRvQmUoMyk7XG5cbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHVucHJvY2Vzc2VkKTtcbiAgICBhd2FpdCBleHBlY3QodGFibGUucmVhZChbXCJhXCJdKSkucmVqZWN0cy50b1Rocm93KC91bnJlYWQgYWZ0ZXIgcmV0cnlpbmcvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSZXZhbGlkYXRpb25Mb2dcIiwgKCkgPT4ge1xuICBjb25zdCBzZW5kID0gamVzdC5mbigpO1xuICBsZXQgbG9nOiBSZXZhbGlkYXRpb25Mb2c7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoRHluYW1vREJDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgbG9nID0gbmV3IFJldmFsaWRhdGlvbkxvZyhuZXcgRHluYW1vREJDbGllbnQoe30pLCBcInRibFwiLCBcImJ1aWxkXCIpO1xuICB9KTtcblxuICBpdChcInB1dHMgb25lIHJvdyBwZXIgcmV2YWxpZGF0aW9uIHVuZGVyIHRoZSBidWlsZCdzIGxvZywgd2l0aCBhIFRUTFwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgY29uc3QgYXQgPSAxXzcyN18wMDBfMDAwXzEyMztcbiAgICBhd2FpdCBsb2cucHV0KFwidXNlciM0MlwiLCBhdCwgeyBzdGFsZUF0OiA1LCBleHBpcmVkQXQ6IDYgfSk7XG4gICAgZXhwZWN0KGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIFB1dEl0ZW1Db21tYW5kKSkudG9FcXVhbCh7XG4gICAgICBUYWJsZU5hbWU6IFwidGJsXCIsXG4gICAgICBJdGVtOiB7XG4gICAgICAgIHBrOiB7IFM6IFwiYnVpbGQjbG9nXCIgfSxcbiAgICAgICAgc2s6IHsgUzogXCIwMDE3MjcwMDAwMDAxMjMjdXNlciM0MlwiIH0sXG4gICAgICAgIHR0bDogeyBOOiBTdHJpbmcoTWF0aC5jZWlsKChhdCArIFJFVkFMSURBVElPTl9MT0dfVFRMX01TKSAvIDEwMDApKSB9LFxuICAgICAgICBzdGFsZUF0OiB7IE46IFwiNVwiIH0sXG4gICAgICAgIGV4cGlyZWRBdDogeyBOOiBcIjZcIiB9LFxuICAgICAgfSxcbiAgICAgIENvbmRpdGlvbkV4cHJlc3Npb246IFwiYXR0cmlidXRlX25vdF9leGlzdHMoc2spXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwibW92ZXMgYSByb3cgdG8gdGhlIG5leHQgbWlsbGlzZWNvbmQgcmF0aGVyIHRoYW4gb3ZlcndyaXRlIGFub3RoZXIgcmV2YWxpZGF0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBgdXBkYXRlVGFnKCd4JylgIGFuZCBgcmV2YWxpZGF0ZVRhZygneCcsICdtYXgnKWAgaW4gb25lIG1pbGxpc2Vjb25kLlxuICAgIGNvbnN0IHRha2VuID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJ0YWtlblwiKSwge1xuICAgICAgbmFtZTogXCJDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uXCIsXG4gICAgfSk7XG4gICAgc2VuZC5tb2NrUmVqZWN0ZWRWYWx1ZU9uY2UodGFrZW4pLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7fSk7XG4gICAgYXdhaXQgbG9nLnB1dChcInhcIiwgMTAwMC41LCB7IHJldmFsaWRhdGVkQXQ6IDUgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgc2VuZC5tb2NrLmNhbGxzLm1hcChcbiAgICAgICAgKFtjb21tYW5kXSkgPT4gY29tbWFuZElucHV0KGNvbW1hbmQsIFB1dEl0ZW1Db21tYW5kKS5JdGVtLnNrLlMsXG4gICAgICApLFxuICAgICkudG9FcXVhbChbXCIwMDAwMDAwMDAwMDEwMDAjeFwiLCBcIjAwMDAwMDAwMDAwMTAwMSN4XCJdKTtcbiAgfSk7XG5cbiAgaXQoXCJnaXZlcyB1cCBhZnRlciBhIGJvdW5kZWQgbnVtYmVyIG9mIGNvbGxpc2lvbnMsIGFuZCBvbiBvdGhlciBlcnJvcnMgYXQgb25jZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFrZW4gPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcInRha2VuXCIpLCB7XG4gICAgICBuYW1lOiBcIkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRFeGNlcHRpb25cIixcbiAgICB9KTtcbiAgICBzZW5kLm1vY2tSZWplY3RlZFZhbHVlKHRha2VuKTtcbiAgICBhd2FpdCBleHBlY3QobG9nLnB1dChcInhcIiwgMTAwMCwge30pKS5yZWplY3RzLnRvQmUodGFrZW4pO1xuICAgIGV4cGVjdChzZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoNSk7XG5cbiAgICBzZW5kLm1vY2tSZXNldCgpO1xuICAgIGNvbnN0IHRocm90dGxlZCA9IG5ldyBFcnJvcihcInRocm90dGxlZFwiKTtcbiAgICBzZW5kLm1vY2tSZWplY3RlZFZhbHVlKHRocm90dGxlZCk7XG4gICAgYXdhaXQgZXhwZWN0KGxvZy5wdXQoXCJ4XCIsIDEwMDAsIHt9KSkucmVqZWN0cy50b0JlKHRocm90dGxlZCk7XG4gICAgZXhwZWN0KHNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG5cbiAgaXQoXCJxdWVyaWVzIGZyb20gYSB6ZXJvLXBhZGRlZCBjdXJzb3IgYW5kIHBhcnNlcyB0aGUgdGFnIGFmdGVyIGl0XCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kXG4gICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgICAgSXRlbXM6IFtcbiAgICAgICAgICB7IHNrOiB7IFM6IFwiMDAwMDAwMDAwMDAxMDAwI2FcIiB9LCByZXZhbGlkYXRlZEF0OiB7IE46IFwiN1wiIH0gfSxcbiAgICAgICAgICB7IHNrOiB7IFM6IFwibm90IGEgbG9nIHJvd1wiIH0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgTGFzdEV2YWx1YXRlZEtleTogeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSxcbiAgICAgIH0pXG4gICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgICAgSXRlbXM6IFt7IHNrOiB7IFM6IFwiMDAwMDAwMDAwMDAyMDAwI3VzZXIjNDJcIiB9LCBzdGFsZUF0OiB7IE46IFwiOFwiIH0gfV0sXG4gICAgICB9KTtcbiAgICBjb25zdCB7IHJvd3MsIHRydW5jYXRlZCB9ID0gYXdhaXQgbG9nLnF1ZXJ5KDk5OS41KTtcblxuICAgIGNvbnN0IGZpcnN0ID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgUXVlcnlDb21tYW5kKTtcbiAgICBleHBlY3QoZmlyc3QpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgVGFibGVOYW1lOiBcInRibFwiLFxuICAgICAgS2V5Q29uZGl0aW9uRXhwcmVzc2lvbjogXCJwayA9IDpwayBBTkQgc2sgPj0gOnNpbmNlXCIsXG4gICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgIFwiOnBrXCI6IHsgUzogXCJidWlsZCNsb2dcIiB9LFxuICAgICAgICBcIjpzaW5jZVwiOiB7IFM6IFwiMDAwMDAwMDAwMDAwOTk5XCIgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1sxXVswXSwgUXVlcnlDb21tYW5kKS5FeGNsdXNpdmVTdGFydEtleSxcbiAgICApLnRvRXF1YWwoeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSk7XG4gICAgZXhwZWN0KHRydW5jYXRlZCkudG9CZShmYWxzZSk7XG4gICAgZXhwZWN0KHJvd3MpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICBzazogXCIwMDAwMDAwMDAwMDEwMDAjYVwiLFxuICAgICAgICBhdDogMTAwMCxcbiAgICAgICAgdGFnOiBcImFcIixcbiAgICAgICAgbWFya2VyOiB7IHJldmFsaWRhdGVkQXQ6IDcsIHN0YWxlQXQ6IHVuZGVmaW5lZCwgZXhwaXJlZEF0OiB1bmRlZmluZWQgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNrOiBcIjAwMDAwMDAwMDAwMjAwMCN1c2VyIzQyXCIsXG4gICAgICAgIGF0OiAyMDAwLFxuICAgICAgICB0YWc6IFwidXNlciM0MlwiLFxuICAgICAgICBtYXJrZXI6IHsgcmV2YWxpZGF0ZWRBdDogdW5kZWZpbmVkLCBzdGFsZUF0OiA4LCBleHBpcmVkQXQ6IHVuZGVmaW5lZCB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoXCJoYXNoZXMgYSB0YWcgdG9vIGxvbmcgZm9yIHRoZSBzb3J0IGtleSwgY2FycnlpbmcgaXQgaW4gbG9uZ1RhZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFnID0gYF9OX1RfLyR7XCJwXCIucmVwZWF0KDExMDApfWA7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgYXdhaXQgbG9nLnB1dCh0YWcsIDEwMDAsIHsgcmV2YWxpZGF0ZWRBdDogNSB9KTtcbiAgICBjb25zdCB7IEl0ZW0gfSA9IGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIFB1dEl0ZW1Db21tYW5kKTtcbiAgICBleHBlY3QoSXRlbS5zay5TKS50b0JlKGAwMDAwMDAwMDAwMDEwMDAjJHtoYXNoZWRUYWcodGFnKX1gKTtcbiAgICBleHBlY3QoSXRlbS5sb25nVGFnKS50b0VxdWFsKHsgUzogdGFnIH0pO1xuXG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IEl0ZW1zOiBbeyAuLi5JdGVtIH1dIH0pO1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgbG9nLnF1ZXJ5KDApO1xuICAgIGV4cGVjdChyb3dzLm1hcCgocm93KSA9PiByb3cudGFnKSkudG9FcXVhbChbdGFnXSk7XG4gIH0pO1xuXG4gIGl0KFwic3RvcHMgYWZ0ZXIgaXRzIHBhZ2UgYm91bmQgYW5kIHNheXMgc29cIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgSXRlbXM6IFtdLFxuICAgICAgTGFzdEV2YWx1YXRlZEtleTogeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSxcbiAgICB9KTtcbiAgICBleHBlY3QoKGF3YWl0IGxvZy5xdWVyeSgwKSkudHJ1bmNhdGVkKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChzZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVMpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIkNhY2hlQnVja2V0XCIsICgpID0+IHtcbiAgY29uc3Qgc2VuZCA9IGplc3QuZm4oKTtcbiAgbGV0IGJ1Y2tldDogQ2FjaGVCdWNrZXQ7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoUzNDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgYnVja2V0ID0gbmV3IENhY2hlQnVja2V0KG5ldyBTM0NsaWVudCh7fSksIFwiYmt0XCIpO1xuICB9KTtcblxuICBpdChcInJlYWRzIGFuIG9iamVjdCBhcyB0ZXh0XCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IHsgdHJhbnNmb3JtVG9TdHJpbmc6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShcInt9XCIpIH0sXG4gICAgICBDb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgfSk7XG4gICAgZXhwZWN0KGF3YWl0IGJ1Y2tldC5nZXQoXCJrXCIpKS50b0JlKFwie31cIik7XG4gICAgZXhwZWN0KGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIEdldE9iamVjdENvbW1hbmQpKS50b0VxdWFsKHtcbiAgICAgIEJ1Y2tldDogXCJia3RcIixcbiAgICAgIEtleTogXCJrXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiYW5zd2VycyBhIG1pc3Npbmcgb2JqZWN0IG9yIGJvZHkgd2l0aCB1bmRlZmluZWQsIGFuZCB0aHJvd3MgdGhlIHJlc3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWVPbmNlKFxuICAgICAgbmV3IE5vU3VjaEtleSh7IG1lc3NhZ2U6IFwibWlzc2luZ1wiLCAkbWV0YWRhdGE6IHt9IH0pLFxuICAgICk7XG4gICAgZXhwZWN0KGF3YWl0IGJ1Y2tldC5nZXQoXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBCb2R5OiBudWxsIH0pO1xuICAgIGV4cGVjdChhd2FpdCBidWNrZXQuZ2V0KFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWVPbmNlKG5ldyBFcnJvcihcIkFjY2Vzc0RlbmllZFwiKSk7XG4gICAgYXdhaXQgZXhwZWN0KGJ1Y2tldC5nZXQoXCJrXCIpKS5yZWplY3RzLnRvVGhyb3coXCJBY2Nlc3NEZW5pZWRcIik7XG4gIH0pO1xuXG4gIGl0KFwid3JpdGVzIEpTT05cIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGF3YWl0IGJ1Y2tldC5wdXRKc29uKFwia1wiLCBcInt9XCIpO1xuICAgIGV4cGVjdChjb21tYW5kSW5wdXQoc2VuZC5tb2NrLmNhbGxzWzBdWzBdLCBQdXRPYmplY3RDb21tYW5kKSkudG9FcXVhbCh7XG4gICAgICBCdWNrZXQ6IFwiYmt0XCIsXG4gICAgICBLZXk6IFwia1wiLFxuICAgICAgQm9keTogXCJ7fVwiLFxuICAgICAgQ29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlRyYWNrZWRUYWdNYXJrZXJzXCIsICgpID0+IHtcbiAgaXQoXCJuZXZlciBjb3VudHMgYSByZW5kZXIgdGhlIHJ1bnRpbWUgY2F1Z2h0IHVwIGFzIGJlaGluZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5OiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIC8vIEp1c3Qgc2hvcnQgb2YgdGhlIGxpbmUgYXMgdGhlIHJlcXVlc3QgY2FtZSBpbjogYGNhdGNoVXBgIGxldHMgaXQgZ28uXG4gICAgY2xvY2sgKz0gMTAwMCArIFRBR19SRUZSRVNIX0dSQUNFX01TO1xuICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZShmYWxzZSk7XG4gICAgYXdhaXQgbWFya2Vycy5jYXRjaFVwKGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEhvd2V2ZXIgbG9uZyB0aGUgcmVuZGVyIHRha2VzLCBpdHMgbG9va3VwcyBuZXZlciB3YWl0OiB3YWl0aW5nIGlzXG4gICAgICAvLyB3aGF0IHRoZSBjYXRjaC11cCBiZWZvcmUgaXQgd2FzIGZvci5cbiAgICAgIGNsb2NrICs9IDEwMDtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZEluUmVuZGVyKS50b0JlKGZhbHNlKTtcbiAgICAgIGNsb2NrICs9IDYwXzAwMDtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZEluUmVuZGVyKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgICAvLyBPdXRzaWRlIGl0IC0gYSByb3V0ZSBoYW5kbGVyIGFsb25nc2lkZSwgaW4gYSBjb250YWluZXIgLSBpdCB3YWl0cy5cbiAgICBleHBlY3QobWFya2Vycy5iZWhpbmRJblJlbmRlcikudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoXCJnaXZlcyBhIHJlbmRlciBubyBncmFjZSB3aGVuIGNhdGNoVXAsIGhvbGRpbmcgbm90aGluZywgZGlkIG5vdCBjYXRjaCB1cFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGxldCBoZWxkID0gZmFsc2U7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoXG4gICAgICAoKSA9PiAoaGVsZCA/IDAgOiBJbmZpbml0eSksXG4gICAgICAoKSA9PiBoZWxkLFxuICAgICk7XG4gICAgY2xvY2sgKz0gMTAwMCArIFRBR19SRUZSRVNIX0dSQUNFX01TICsgMTAwO1xuICAgIGF3YWl0IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiB7XG4gICAgICAvLyBBbm90aGVyIHJlcXVlc3Qgc3RvcmVzIGFuIGVudHJ5IGJlZm9yZSB0aGlzIHJlbmRlcidzIGZpcnN0IGxvb2t1cC5cbiAgICAgIGhlbGQgPSB0cnVlO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kSW5SZW5kZXIpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic3RhcnRzIGEgcmVmcmVzaCBmb3IgYSBwYWdlIHRoYXQgaXMgbm90IGJlaGluZCwgd2l0aG91dCB3YWl0aW5nIGZvciBpdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGxldCByZWxlYXNlITogKCkgPT4gdm9pZDtcbiAgICBjb25zdCBxdWVyeSA9IGplc3QuZm4oXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgUHJvbWlzZTx7IHJvd3M6IFJldmFsaWRhdGlvbkxvZ1Jvd1tdOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfT4oXG4gICAgICAgICAgKHJlc29sdmUpID0+XG4gICAgICAgICAgICAocmVsZWFzZSA9ICgpID0+IHJlc29sdmUoeyByb3dzOiBbXSwgdHJ1bmNhdGVkOiBmYWxzZSB9KSksXG4gICAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZDogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeSB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDEwMDAsXG4gICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgfSk7XG4gICAgbWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiAwKTtcbiAgICBjbG9jayArPSAxMDAwO1xuICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZShmYWxzZSk7XG4gICAgLy8gQSBwYWdlIHRoYXQgcmVhZHMgbm8gY2FjaGUgc3RpbGwga2VlcHMgdGhlIGluc3RhbmNlIGN1cnJlbnQuXG4gICAgYXdhaXQgZXhwZWN0KG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiBcInBhZ2VcIikpLnJlc29sdmVzLnRvQmUoXCJwYWdlXCIpO1xuICAgIGV4cGVjdChxdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgIHJlbGVhc2UoKTtcbiAgfSk7XG5cbiAgaXQoXCJjYXRjaGVzIHVwIG9uIHRoZSBsb2cgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgcm9sbGluZyByZS1yZWFkXCIsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgbGV0IHJlbGVhc2UhOiAoKSA9PiB2b2lkO1xuICAgIGNvbnN0IHJlYWQgPSBqZXN0LmZuKGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgaWYgKHJlYWQubW9jay5jYWxscy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAocmVsZWFzZSA9IHJlc29sdmUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPih0YWdzLm1hcCgodGFnKSA9PiBbdGFnLCB7fV0pKTtcbiAgICB9KTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZCB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgcmVzeW5jSW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIHJhbmRvbTogKCkgPT4gMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIGF3YWl0IG1hcmtlcnMuZW5zdXJlKFtcInBvc3RzXCJdKTtcbiAgICAvLyBEdWUgZm9yIGl0cyByZS1yZWFkLCBhbmQgYmVoaW5kLCBhcyBhZnRlciBhIHF1aWV0IHNwZWxsLlxuICAgIGNsb2NrICs9IDUwMDA7XG4gICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKHRydWUpO1xuICAgIGxldCByZW5kZXJlZCA9IGZhbHNlO1xuICAgIGF3YWl0IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiAocmVuZGVyZWQgPSB0cnVlKSk7XG4gICAgLy8gQSB0aHJvdHRsZWQgYEJhdGNoR2V0SXRlbWAgd291bGQgb3RoZXJ3aXNlIGhvbGQgdGhlIHBhZ2UuXG4gICAgZXhwZWN0KHJlbmRlcmVkKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChyZWFkKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG5cbiAgICAvLyBOb3IgZG9lcyBhIGxvb2t1cCBvZiB0aGUgdHJhY2tlZCB0YWcgd2FpdCBvbiBpdC5cbiAgICBsZXQgZW5zdXJlZCA9IGZhbHNlO1xuICAgIHZvaWQgbWFya2Vycy5lbnN1cmUoW1wicG9zdHNcIl0pLnRoZW4oKCkgPT4gKGVuc3VyZWQgPSB0cnVlKSk7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7XG4gICAgZXhwZWN0KGVuc3VyZWQpLnRvQmUodHJ1ZSk7XG5cbiAgICAvLyBTdGlsbCBpbiBmbGlnaHQgYW4gaW50ZXJ2YWwgbGF0ZXI6IG5vdCByZWFkIGEgc2Vjb25kIHRpbWUgbWVhbndoaWxlLlxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KHJlYWQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICByZWxlYXNlKCk7XG4gIH0pO1xuXG4gIGl0KFwiZ2l2ZXMgYSByb3V0ZSBoYW5kbGVyLCB3aGljaCBubyBjYXRjaC11cCBwcmVjZWRlcywgbm8gZ3JhY2UgbW9yZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5OiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIGNsb2NrICs9IDEwMDAgKyBUQUdfUkVGUkVTSF9HUkFDRV9NUyArIDEwMDtcbiAgICBleHBlY3QobWFya2Vycy5iZWhpbmRJblJlbmRlcikudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBhZ2FpbiBvbmx5IG9uY2UsIGhvd2V2ZXIgbWFueSBmb3JnZXRzIGxhbmQgbWVhbndoaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgY29uc3QgcmVsZWFzZXM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gICAgY29uc3QgcmVhZCA9IGplc3QuZm4oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHJlbGVhc2VzLnB1c2gocmVzb2x2ZSkpO1xuICAgICAgcmV0dXJuIG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KFtbXCJwb3N0c1wiLCB7IHJldmFsaWRhdGVkQXQ6IDEgfV1dKTtcbiAgICB9KTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZCB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gMCk7XG4gICAgY29uc3QgZm9yZ2V0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY2xvY2sgKz0gTUFYX1JFVkFMSURBVElPTl9MT0dfR0FQX01TICsgMTtcbiAgICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIH07XG4gICAgY29uc3QgZW5zdXJpbmcgPSBtYXJrZXJzLmVuc3VyZShbXCJwb3N0c1wiXSk7XG4gICAgYXdhaXQgZm9yZ2V0KCk7XG4gICAgcmVsZWFzZXMuc2hpZnQoKSEoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0SW1tZWRpYXRlKHJlc29sdmUpKTtcbiAgICBhd2FpdCBmb3JnZXQoKTtcbiAgICByZWxlYXNlcy5zaGlmdCgpISgpO1xuICAgIGF3YWl0IGVuc3VyaW5nO1xuICAgIC8vIEEgdHJ1bmNhdGVkIGxvZyBmb3JnZXRzIG9uIGV2ZXJ5IHF1ZXJ5OiB3YWl0aW5nIGZvciBhIHJlYWQgbm8gZm9yZ2V0XG4gICAgLy8gb3ZlcnRvb2sgd291bGQga2VlcCB0aGUgcmVxdWVzdHMgd2FpdGluZyBvbiB0aGlzIG9uZSBmb3IgYXMgbG9uZy5cbiAgICBleHBlY3QocmVhZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgIGV4cGVjdChtYXJrZXJzLmdldChcInBvc3RzXCIpKS50b0VxdWFsKHsgcmV2YWxpZGF0ZWRBdDogMSB9KTtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBhZ2FpbiB3aGF0IGEgcmVhZCBmcm9tIGJlZm9yZSBhIGZvcmdldCBmb3VuZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGxldCByZWxlYXNlITogKCkgPT4gdm9pZDtcbiAgICBjb25zdCBoZWxkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IChyZWxlYXNlID0gcmVzb2x2ZSkpO1xuICAgIGxldCByZXZhbGlkYXRlZEF0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVhZCA9IGplc3QuZm4oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgaGVsZDtcbiAgICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPihcbiAgICAgICAgcmV2YWxpZGF0ZWRBdCA9PT0gdW5kZWZpbmVkID8gW10gOiBbW1wicG9zdHNcIiwgeyByZXZhbGlkYXRlZEF0IH1dXSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7XG4gICAgICAgIHF1ZXJ5OiBqZXN0LmZuKGFzeW5jICgpID0+ICh7IHJvd3M6IFtdLCB0cnVuY2F0ZWQ6IGZhbHNlIH0pKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIC8vIEEgYmFja2dyb3VuZCByZWFkIGluIGZsaWdodCBhcyB0aGUgc2FuZGJveCBmcm96ZSwgcGFzdCB0aGUgbG9nJ3MgVFRMLlxuICAgIGNvbnN0IGVuc3VyaW5nID0gbWFya2Vycy5lbnN1cmUoW1wicG9zdHNcIl0pO1xuICAgIGNsb2NrICs9IE1BWF9SRVZBTElEQVRJT05fTE9HX0dBUF9NUyArIDE7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG5cbiAgICAvLyBSZWFkIGFnYWluIG9uY2UgdGhlIHN0YWxlIHJlYWQgcmV0dXJuczogdHJhY2tlZCwgaXRzIG1hcmtlciB3b3VsZFxuICAgIC8vIHZvdWNoIGZvciBldmVyeSBlbnRyeSB3aXRoIHRoZSB0YWcsIHJldmFsaWRhdGVkIGR1cmluZyB0aGUgZnJlZXplIG9yXG4gICAgLy8gbm90OyB1bnRyYWNrZWQsIHRoZSByZXF1ZXN0IHdhaXRpbmcgb24gaXQgd291bGQganVkZ2UgYnkgbm90aGluZy5cbiAgICByZXZhbGlkYXRlZEF0ID0gbWFya2VyQ2xvY2soKTtcbiAgICByZWxlYXNlKCk7XG4gICAgYXdhaXQgZW5zdXJpbmc7XG4gICAgZXhwZWN0KHJlYWQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICBleHBlY3QobWFya2Vycy5nZXQoXCJwb3N0c1wiKSkudG9FcXVhbCh7IHJldmFsaWRhdGVkQXQgfSk7XG4gIH0pO1xuXG4gIGl0KFwibW92ZXMgY29tcGxldGVTaW5jZSBwYXN0IHdoYXQgaXQgZm9yZ2V0c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IGxhdGVyID0gbWFya2VyQ2xvY2soKSArIDYwXzAwMDtcbiAgICBjb25zdCByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXSA9IFtcImFcIiwgXCJiXCJdLm1hcCgodGFnLCBpKSA9PiAoe1xuICAgICAgc2s6IGAke1N0cmluZyhjbG9jaykucGFkU3RhcnQoMTUsIFwiMFwiKX0jJHt0YWd9YCxcbiAgICAgIGF0OiBjbG9jayxcbiAgICAgIHRhZyxcbiAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0OiBsYXRlciArIGkgfSxcbiAgICB9KSk7XG4gICAgY29uc3QgcXVlcnkgPSBqZXN0LmZuKGFzeW5jICgpID0+ICh7IHJvd3MsIHRydW5jYXRlZDogZmFsc2UgfSkpO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5IH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMCxcbiAgICAgIG1heFRyYWNrZWRUYWdzOiAxLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIC8vIEFuIGVudHJ5IHN0b3JlIGhvbGRpbmcgc29tZXRoaW5nIG9sZGVyIHRoYW4gZXZlcnkgcm93LlxuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gMCk7XG4gICAgY29uc3Qgc3RhcnQgPSBtYXJrZXJzLmNvbXBsZXRlU2luY2U7XG4gICAgZXhwZWN0KHN0YXJ0KS50b0JlTGVzc1RoYW5PckVxdWFsKG1hcmtlckNsb2NrKCkpO1xuXG4gICAgLy8gVW50cmFja2VkIHRhZ3MnIHJvd3MgYXJlIGtub3duIGZyb20gdGhlIGxvZyBhbG9uZSwgYXMgZmFyIGFzIHRoZXkgZml0LlxuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChtYXJrZXJzLnN0YXRlKFtcImJcIl0sIGxhdGVyKSkudG9CZShcImV4cGlyZWRcIik7XG4gICAgLy8gXCJhXCIgd2FzIGRyb3BwZWQgZm9yIHNwYWNlLCBhbmQgd2l0aCBpdCB3aGF0IGl0IGtuZXcuXG4gICAgZXhwZWN0KG1hcmtlcnMuc3RhdGUoW1wiYVwiXSwgbGF0ZXIpKS50b0JlKFwiZnJlc2hcIik7XG4gICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShsYXRlcik7XG5cbiAgICAvLyBGb3JnZXR0aW5nIGV2ZXJ5dGhpbmcgbW92ZXMgaXQgdG8gbm93LCBvciBwYXN0IHdoYXQgaXQgZm9yZ290OiBcImJcIi5cbiAgICBjbG9jayArPSBNQVhfUkVWQUxJREFUSU9OX0xPR19HQVBfTVMgKyAxO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUobGF0ZXIgKyAxKTtcbiAgfSk7XG5cbiAgaXQoXCJtb3ZlcyBjb21wbGV0ZVNpbmNlIHBhc3QgYSByb3cgaXQgbGV0cyBnbyBvZiB3aXRoIG5vIGVudHJ5IGhlbGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IHJldmFsaWRhdGVkQXQgPSBtYXJrZXJDbG9jaygpICsgNjBfMDAwO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7XG4gICAgICAgIHF1ZXJ5OiBqZXN0LmZuKGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgcm93czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzazogYCR7U3RyaW5nKGNsb2NrKS5wYWRTdGFydCgxNSwgXCIwXCIpfSNwb3N0c2AsXG4gICAgICAgICAgICAgIGF0OiBjbG9jayxcbiAgICAgICAgICAgICAgdGFnOiBcInBvc3RzXCIsXG4gICAgICAgICAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0IH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgICAgICAgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gSW5maW5pdHkpO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIC8vIEFuIGVudHJ5IHdob3NlIGdlbmVyYXRpb24gc3RhcnRlZCBiZWZvcmUgdGhlIHJldmFsaWRhdGlvbiwgc3RvcmVkIG9uY2VcbiAgICAvLyB0aGUgcm93IGlzIGdvbmUsIGlzIG9sZGVyIHRoYW4gYGNvbXBsZXRlU2luY2VgLCBhbmQgc28gcmVhZCBmaXJzdC5cbiAgICBleHBlY3QobWFya2Vycy5zdGF0ZShbXCJwb3N0c1wiXSwgcmV2YWxpZGF0ZWRBdCAtIDEpKS50b0JlKFwiZnJlc2hcIik7XG4gICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShyZXZhbGlkYXRlZEF0KTtcbiAgfSk7XG5cbiAgaXQoXCJwcnVuZXMgYSBwcm9maWxlJ3Mgcm93LCBhbmQgbW92ZXMgY29tcGxldGVTaW5jZSB0byBpdHMgZXhwaXJlZEF0IG9uY2UgcGFzdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgY29uc3Qgc3RhbGVBdCA9IG1hcmtlckNsb2NrKCkgKyAxMDAwO1xuICAgIGNvbnN0IGV4cGlyZWRBdCA9IHN0YWxlQXQgKyA2MF8wMDA7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNrOiBgJHtTdHJpbmcoY2xvY2spLnBhZFN0YXJ0KDE1LCBcIjBcIil9I3Bvc3RzYCxcbiAgICAgICAgICAgICAgYXQ6IGNsb2NrLFxuICAgICAgICAgICAgICB0YWc6IFwicG9zdHNcIixcbiAgICAgICAgICAgICAgbWFya2VyOiB7IHN0YWxlQXQsIGV4cGlyZWRBdCB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRydW5jYXRlZDogZmFsc2UsXG4gICAgICAgIH0pKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IHN0YWxlQXQgKyAxKTtcbiAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICBleHBlY3QobWFya2Vycy5zdGF0ZShbXCJwb3N0c1wiXSwgc3RhbGVBdCAtIDEpKS50b0JlKFwiZnJlc2hcIik7XG4gICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShzdGFsZUF0KTtcblxuICAgIGNvbnN0IG5vdyA9IGplc3RcbiAgICAgIC5zcHlPbihwZXJmb3JtYW5jZSwgXCJub3dcIilcbiAgICAgIC5tb2NrUmV0dXJuVmFsdWUoZXhwaXJlZEF0IC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgdHJ5IHtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoZXhwaXJlZEF0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbm93Lm1vY2tSZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICBpdChcInF1ZXVlcyBhIHBydW5lZCByb3cncyBmdXR1cmUgZXhwaXJlZEF0IG9uY2UsIGhvd2V2ZXIgb2Z0ZW4gdGhlIGxvb2tiYWNrIHJldHVybnMgaXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjbG9jayA9IDFfMDAwXzAwMDtcbiAgICBjb25zdCBzdGFsZUF0ID0gbWFya2VyQ2xvY2soKSArIDEwMDA7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNrOiBgJHtTdHJpbmcoMV8wMDBfMDAwKS5wYWRTdGFydCgxNSwgXCIwXCIpfSNwb3N0c2AsXG4gICAgICAgICAgICAgIGF0OiAxXzAwMF8wMDAsXG4gICAgICAgICAgICAgIHRhZzogXCJwb3N0c1wiLFxuICAgICAgICAgICAgICBtYXJrZXI6IHsgc3RhbGVBdCwgZXhwaXJlZEF0OiBzdGFsZUF0ICsgNjBfMDAwIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgICAgICAgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gc3RhbGVBdCArIDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICAgIGNsb2NrICs9IDEwMDA7XG4gICAgfVxuICAgIC8vIFBydW5lZCByb3dzIGFyZSBub3QgbWFya2VkIGFwcGxpZWQsIHNvIGVhY2ggcXVlcnkgYXBwbGllcyBpdCBhZ2Fpbi5cbiAgICBleHBlY3QoXG4gICAgICAobWFya2VycyBhcyB1bmtub3duIGFzIHsgbGF0ZXJGbG9vcnM6IHVua25vd25bXSB9KS5sYXRlckZsb29ycyxcbiAgICApLnRvSGF2ZUxlbmd0aCgxKTtcbiAgfSk7XG5cbiAgaXQoXCJtZXJnZXMgZnV0dXJlIGV4cGlyZWRBdHMgcGFzdCBpdHMgYm91bmQgd2l0aG91dCBtb3ZpbmcgY29tcGxldGVTaW5jZSBlYXJseVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYXQgPSBtYXJrZXJDbG9jaygpO1xuICAgIGNvbnN0IGV4cGlyaWVzID0gbmV3IE1hcChbXG4gICAgICBbXCJhXCIsIGF0ICsgNjBfMDAwXSxcbiAgICAgIFtcImJcIiwgYXQgKyA2MF8wMTBdLFxuICAgICAgW1wiY1wiLCBhdCArIDEyMF8wMDBdLFxuICAgIF0pO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2Vyczoge1xuICAgICAgICByZWFkOiBqZXN0LmZuKFxuICAgICAgICAgIGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgICAgIG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KFxuICAgICAgICAgICAgICB0YWdzLm1hcCgodGFnKSA9PiBbXG4gICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgIHsgc3RhbGVBdDogYXQgLSAxMDAwLCBleHBpcmVkQXQ6IGV4cGlyaWVzLmdldCh0YWcpIH0sXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeTogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICBtYXhUcmFja2VkVGFnczogMSxcbiAgICB9KTtcbiAgICBjb25zdCBzdGFydCA9IG1hcmtlcnMuY29tcGxldGVTaW5jZTtcbiAgICAvLyBcImFcIiwgdGhlbiBcImJcIiwgZHJvcHBlZCBmb3Igc3BhY2U6IHR3byBleHBpcmVkQXRzIHBhc3QgYSBib3VuZCBvZiBvbmUuXG4gICAgZm9yIChjb25zdCB0YWcgb2YgW1wiYVwiLCBcImJcIiwgXCJjXCJdKSB7XG4gICAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbdGFnXSk7XG4gICAgfVxuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuXG4gICAgY29uc3Qgbm93ID0gamVzdC5zcHlPbihwZXJmb3JtYW5jZSwgXCJub3dcIik7XG4gICAgdHJ5IHtcbiAgICAgIG5vdy5tb2NrUmV0dXJuVmFsdWUoYXQgKyA1OV85OTkgLSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luKTtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuICAgICAgLy8gTWVyZ2VkOiBcImJcIidzIGZyb20gXCJhXCIncywgMTAgbXMgZWFybHkuXG4gICAgICBub3cubW9ja1JldHVyblZhbHVlKGF0ICsgNjBfMDAwIC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgICBleHBlY3QobWFya2Vycy5jb21wbGV0ZVNpbmNlKS50b0JlKGF0ICsgNjBfMDEwKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbm93Lm1vY2tSZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICBpdChcImRvZXMgbm90IGpvaW4gYSBuZWFyIGV4cGlyZWRBdCB0byBmYXIgb25lcyBwYXN0IGl0cyBib3VuZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYXQgPSBtYXJrZXJDbG9jaygpO1xuICAgIGNvbnN0IHllYXIgPSAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGNvbnN0IGV4cGlyaWVzID0gbmV3IE1hcChbXG4gICAgICBbXCJhXCIsIGF0ICsgeWVhcl0sXG4gICAgICBbXCJiXCIsIGF0ICsgeWVhciArIDEwXSxcbiAgICAgIFtcImNcIiwgYXQgKyA2MF8wMDBdLFxuICAgIF0pO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2Vyczoge1xuICAgICAgICByZWFkOiBqZXN0LmZuKFxuICAgICAgICAgIGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgICAgIG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KFxuICAgICAgICAgICAgICB0YWdzLm1hcCgodGFnKSA9PiBbXG4gICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgIHsgc3RhbGVBdDogYXQgLSAxMDAwLCBleHBpcmVkQXQ6IGV4cGlyaWVzLmdldCh0YWcpIH0sXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeTogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICBtYXhUcmFja2VkVGFnczogMixcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBbXCJhXCIsIFwiYlwiLCBcImNcIiwgXCJkXCIsIFwiZVwiXSkge1xuICAgICAgYXdhaXQgbWFya2Vycy5lbnN1cmUoW3RhZ10pO1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBqZXN0XG4gICAgICAuc3B5T24ocGVyZm9ybWFuY2UsIFwibm93XCIpXG4gICAgICAubW9ja1JldHVyblZhbHVlKGF0ICsgNjBfMDAwIC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFwiYVwiIGFuZCBcImJcIiBhcmUgbWVyZ2VkLCBub3QgXCJjXCIgaW50byBcImFcIjogYGNvbXBsZXRlU2luY2VgIGEgeWVhclxuICAgICAgLy8gZWFybHkgd291bGQgaGF2ZSBldmVyeSBoZWxkIGVudHJ5IHJlYWQgaXRzIG1hcmtlcnMgZmlyc3QgdW50aWwgdGhlbi5cbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoYXQgKyA2MF8wMDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBub3cubW9ja1Jlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwibWVyZ2VzIHRoZSBjbG9zZXN0IGZ1dHVyZSBleHBpcmVkQXRzIHBhc3QgaXRzIGJvdW5kXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhdCA9IG1hcmtlckNsb2NrKCk7XG4gICAgY29uc3QgZXhwaXJpZXMgPSBuZXcgTWFwKFtcbiAgICAgIFtcImFcIiwgYXQgKyA2MF8wMDBdLFxuICAgICAgW1wiYlwiLCBhdCArIDEyMF8wMDBdLFxuICAgICAgW1wiY1wiLCBhdCArIDYwXzAxMF0sXG4gICAgXSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7XG4gICAgICAgIHJlYWQ6IGplc3QuZm4oXG4gICAgICAgICAgYXN5bmMgKHRhZ3M6IHN0cmluZ1tdKSA9PlxuICAgICAgICAgICAgbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oXG4gICAgICAgICAgICAgIHRhZ3MubWFwKCh0YWcpID0+IFtcbiAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgeyBzdGFsZUF0OiBhdCAtIDEwMDAsIGV4cGlyZWRBdDogZXhwaXJpZXMuZ2V0KHRhZykgfSxcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5OiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIG1heFRyYWNrZWRUYWdzOiAyLFxuICAgIH0pO1xuICAgIC8vIFwiYVwiLCBcImJcIiwgdGhlbiBcImNcIiBkcm9wcGVkIGZvciBzcGFjZTogdGhyZWUgZXhwaXJlZEF0cyBwYXN0IGEgYm91bmQgb2ZcbiAgICAvLyB0d28sIGFuZCBcImNcIiBpcyAxMCBtcyBmcm9tIFwiYVwiLlxuICAgIGZvciAoY29uc3QgdGFnIG9mIFtcImFcIiwgXCJiXCIsIFwiY1wiLCBcImRcIiwgXCJlXCJdKSB7XG4gICAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbdGFnXSk7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gbWFya2Vycy5jb21wbGV0ZVNpbmNlO1xuXG4gICAgY29uc3Qgbm93ID0gamVzdC5zcHlPbihwZXJmb3JtYW5jZSwgXCJub3dcIik7XG4gICAgdHJ5IHtcbiAgICAgIG5vdy5tb2NrUmV0dXJuVmFsdWUoYXQgKyA1OV85OTkgLSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luKTtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuICAgICAgbm93Lm1vY2tSZXR1cm5WYWx1ZShhdCArIDYwXzAwMCAtIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShhdCArIDYwXzAxMCk7XG4gICAgICBub3cubW9ja1JldHVyblZhbHVlKGF0ICsgMTE5Xzk5OSAtIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShhdCArIDYwXzAxMCk7XG4gICAgICBub3cubW9ja1JldHVyblZhbHVlKGF0ICsgMTIwXzAwMCAtIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShhdCArIDEyMF8wMDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBub3cubW9ja1Jlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwiY2F0Y2hlcyB1cCBvbmx5IGZvciBhbiBlbnRyeSBzdG9yZSBob2xkaW5nIGVudHJpZXMsIGFuZCBub3Qgd2hlbiBldmVyeSBjaGVjayBhc2tzIGFueXdheVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IGluc3RhbmNlID0gKHJlZnJlc2hJbnRlcnZhbE1zOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gamVzdC5mbihhc3luYyAoKSA9PiAoeyByb3dzOiBbXSwgdHJ1bmNhdGVkOiBmYWxzZSB9KSk7XG4gICAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgICBsb2c6IHsgcXVlcnkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgICAgcmVmcmVzaEludGVydmFsTXMsXG4gICAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgbWFya2VycywgcXVlcnkgfTtcbiAgICB9O1xuICAgIGNvbnN0IG5vU3RvcmUgPSBpbnN0YW5jZSgxMDAwKTtcbiAgICBjb25zdCBldmVyeUNoZWNrID0gaW5zdGFuY2UoMCk7XG4gICAgZXZlcnlDaGVjay5tYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IEluZmluaXR5KTtcbiAgICAvLyBBIHN0b3JlLCBidXQgaG9sZGluZyBub3RoaW5nIGEgcmVmcmVzaCBjb3VsZCBleHBpcmUuXG4gICAgY29uc3QgZW1wdHlTdG9yZSA9IGluc3RhbmNlKDEwMDApO1xuICAgIGVtcHR5U3RvcmUubWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiBJbmZpbml0eSk7XG4gICAgY29uc3Qgc3RvcmUgPSBpbnN0YW5jZSgxMDAwKTtcbiAgICBzdG9yZS5tYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIGNsb2NrICs9IDYwXzAwMDtcbiAgICBmb3IgKGNvbnN0IHsgbWFya2VycyB9IG9mIFtub1N0b3JlLCBldmVyeUNoZWNrLCBlbXB0eVN0b3JlLCBzdG9yZV0pIHtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZSh0cnVlKTtcbiAgICAgIGF3YWl0IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiB7fSk7XG4gICAgfVxuICAgIGV4cGVjdChub1N0b3JlLnF1ZXJ5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChldmVyeUNoZWNrLnF1ZXJ5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChlbXB0eVN0b3JlLnF1ZXJ5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChzdG9yZS5xdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICB9KTtcblxuICBpdChcIm1vdmVzIGNvbXBsZXRlU2luY2UgdG8gYSBkcm9wcGVkIG1hcmtlcidzIGZ1dHVyZSBleHBpcmVkQXQgb25seSBvbmNlIGl0IGlzIHBhc3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGF0ID0gbWFya2VyQ2xvY2soKTtcbiAgICBjb25zdCByZWFkID0gamVzdC5mbihcbiAgICAgIGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oXG4gICAgICAgICAgdGFncy5tYXAoKHRhZykgPT4gW1xuICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgeyBzdGFsZUF0OiBhdCAtIDEwMDAsIGV4cGlyZWRBdDogYXQgKyA2MF8wMDAgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICApO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeTogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICBtYXhUcmFja2VkVGFnczogMSxcbiAgICB9KTtcbiAgICBjb25zdCBzdGFydCA9IG1hcmtlcnMuY29tcGxldGVTaW5jZTtcbiAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbXCJhXCJdKTtcbiAgICAvLyBcImFcIiBpcyBkcm9wcGVkIGZvciBzcGFjZTogYSB5ZWFyLWxvbmcgYGV4cGlyZWAgd291bGQgb3RoZXJ3aXNlIGtlZXBcbiAgICAvLyBldmVyeSBlbnRyeSByZWFkaW5nIGl0cyBtYXJrZXJzIGZpcnN0IGZvciBhcyBsb25nLlxuICAgIGF3YWl0IG1hcmtlcnMuZW5zdXJlKFtcImJcIl0pO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuXG4gICAgY29uc3QgY2xvY2sgPSBqZXN0XG4gICAgICAuc3B5T24ocGVyZm9ybWFuY2UsIFwibm93XCIpXG4gICAgICAubW9ja1JldHVyblZhbHVlKGF0ICsgNjBfMDAxIC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgdHJ5IHtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoYXQgKyA2MF8wMDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbG9jay5tb2NrUmVzdG9yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyBvbmx5IHRoZSBsb2cgcm93cyB0aGF0IGNvdWxkIGFwcGx5IHRvIGFuIGVudHJ5IGhlbGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjbG9jayA9IDFfMDAwXzAwMDtcbiAgICBjb25zdCBsYXRlciA9IG1hcmtlckNsb2NrKCkgKyA2MF8wMDA7XG4gICAgY29uc3Qgcm93czogUmV2YWxpZGF0aW9uTG9nUm93W10gPSBbXCJvbGRcIiwgXCJuZXdcIl0ubWFwKCh0YWcsIGkpID0+ICh7XG4gICAgICBzazogYCR7U3RyaW5nKGNsb2NrKS5wYWRTdGFydCgxNSwgXCIwXCIpfSMke3RhZ31gLFxuICAgICAgYXQ6IGNsb2NrLFxuICAgICAgdGFnLFxuICAgICAgbWFya2VyOiB7IHJldmFsaWRhdGVkQXQ6IGkgPT09IDAgPyAxIDogbGF0ZXIgfSxcbiAgICB9KSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93cywgdHJ1bmNhdGVkOiBmYWxzZSB9KSksXG4gICAgICB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDAsXG4gICAgICBtYXhUcmFja2VkVGFnczogMSxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBsZXQgb2xkZXN0ID0gMjtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IG9sZGVzdCk7XG4gICAgY29uc3Qgc3RhcnQgPSBtYXJrZXJzLmNvbXBsZXRlU2luY2U7XG5cbiAgICAvLyBcIm9sZFwiIGNhbiBleHBpcmUgbm90aGluZyBoZWxkLCBzbyBpdCB0YWtlcyBubyByb29tLCBhbmQgXCJuZXdcIiBpc1xuICAgIC8vIGtlcHQgd2l0aG91dCBkcm9wcGluZyBhbnl0aGluZyBmb3Igc3BhY2UuXG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KG1hcmtlcnMuc3RhdGUoW1wibmV3XCJdLCBsYXRlciAtIDEpKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICBleHBlY3QobWFya2Vycy5jb21wbGV0ZVNpbmNlKS50b0JlKHN0YXJ0KTtcblxuICAgIC8vIE9uY2UgZXZlcnkgZW50cnkgaGVsZCBpcyBuZXdlciB0aGFuIGl0LCBcIm5ld1wiIGdvZXMgdG9vLCB0YWtpbmdcbiAgICAvLyBgY29tcGxldGVTaW5jZWAgbm8gZnVydGhlciB0aGFuIHRoZSBvbGRlc3QgZW50cnkgaGVsZC5cbiAgICBvbGRlc3QgPSBsYXRlcjtcbiAgICBjbG9jayArPSAxMDAwO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChtYXJrZXJzLnN0YXRlKFtcIm5ld1wiXSwgbGF0ZXIgLSAxKSkudG9CZShcImZyZXNoXCIpO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUobGF0ZXIpO1xuICB9KTtcblxuICBpdChcInNjYW5zIHRoZSBlbnRyeSBzdG9yZXMgb25jZSBhIG1pbnV0ZSwgcHJ1bmluZyBvbmx5IHdoZW4gdGhlIG9sZGVzdCBtb3Zlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IGxhdGVyID0gbWFya2VyQ2xvY2soKSArIDYwXzAwMDtcbiAgICBjb25zdCByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgc2s6IGAke1N0cmluZyhjbG9jaykucGFkU3RhcnQoMTUsIFwiMFwiKX0jbmV3YCxcbiAgICAgICAgYXQ6IGNsb2NrLFxuICAgICAgICB0YWc6IFwibmV3XCIsXG4gICAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0OiBsYXRlciB9LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgLy8gVGhlIHJvdyBsZWF2ZXMgdGhlIGxvb2tiYWNrIGFmdGVyIHRoZSBmaXJzdCBxdWVyeTogb25seSB0aGUgcHJ1bmVcbiAgICAgIC8vIGNhbiBsZXQgaXQgZ28uXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3RcbiAgICAgICAgICAuZm4oKVxuICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyByb3dzLCB0cnVuY2F0ZWQ6IGZhbHNlIH0pXG4gICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSksXG4gICAgICB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDAsXG4gICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgfSk7XG4gICAgbGV0IGJvdW5kID0gMjtcbiAgICBsZXQgZXhhY3QgPSAyO1xuICAgIGNvbnN0IG9sZGVzdCA9IGplc3QuZm4oKHNjYW46IGJvb2xlYW4pID0+IChzY2FuID8gZXhhY3QgOiBib3VuZCkpO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2Yob2xkZXN0KTtcbiAgICBjb25zdCBwcnVuZSA9IGplc3Quc3B5T24oXG4gICAgICBtYXJrZXJzIGFzIHVua25vd24gYXMgeyBwcnVuZUxvZ2dlZDogKG9sZGVzdDogbnVtYmVyKSA9PiB2b2lkIH0sXG4gICAgICBcInBydW5lTG9nZ2VkXCIsXG4gICAgKTtcblxuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChvbGRlc3QpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCh0cnVlKTtcbiAgICBleHBlY3QocHJ1bmUpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcblxuICAgIC8vIFdpdGhpbiB0aGUgbWludXRlOiB0aGUgYm91bmQsIGFuZCBubyBwcnVuZSB3aGlsZSBpdCBzdGF5cyBwdXQuXG4gICAgY2xvY2sgKz0gMTAwMDtcbiAgICBleGFjdCA9IGxhdGVyO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChvbGRlc3QpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aChmYWxzZSk7XG4gICAgZXhwZWN0KHBydW5lKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgZXhwZWN0KG1hcmtlcnMuc3RhdGUoW1wibmV3XCJdLCBsYXRlciAtIDEpKS50b0JlKFwiZXhwaXJlZFwiKTtcblxuICAgIC8vIFRoZSBtaW51dGUncyBzY2FuIGZpbmRzIGV2ZXJ5IGVudHJ5IG5ld2VyIHRoYW4gdGhlIHJvdzogaXQgZ29lcy5cbiAgICBjbG9jayArPSA2MF8wMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KG9sZGVzdCkudG9IYXZlQmVlbkxhc3RDYWxsZWRXaXRoKHRydWUpO1xuICAgIGV4cGVjdChwcnVuZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgIGV4cGVjdChtYXJrZXJzLnN0YXRlKFtcIm5ld1wiXSwgbGF0ZXIgLSAxKSkudG9CZShcImZyZXNoXCIpO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUobGF0ZXIpO1xuXG4gICAgLy8gQW4gZW50cnkgc2V0IHNpbmNlIG1vdmVzIHRoZSBib3VuZCBiYWNrOiBub3RoaW5nIHRvIHBydW5lLlxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYm91bmQgPSAxO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChwcnVuZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICB9KTtcblxuICBpdChcIndhaXRzIGZvciBhIGZyZXNoIHF1ZXJ5IHJhdGhlciB0aGFuIG9uZSBzdGFydGVkIGJlZm9yZSBhIGZyZWV6ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IHF1ZXJpZXM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gICAgY29uc3QgcXVlcnkgPSBqZXN0LmZuKFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IFByb21pc2U8eyByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXTsgdHJ1bmNhdGVkOiBib29sZWFuIH0+KFxuICAgICAgICAgIChyZXNvbHZlKSA9PlxuICAgICAgICAgICAgcXVlcmllcy5wdXNoKCgpID0+IHJlc29sdmUoeyByb3dzOiBbXSwgdHJ1bmNhdGVkOiBmYWxzZSB9KSksXG4gICAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZDogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeSB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDEwMDAsXG4gICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgICBjYW5GcmVlemU6IHRydWUsXG4gICAgfSk7XG4gICAgbWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiAwKTtcbiAgICBjbG9jayArPSAxMDAwO1xuICAgIC8vIFN0YXJ0ZWQsIG5vdCB3YWl0ZWQgZm9yLCBhbmQgdGhlbiB0aGUgc2FuZGJveCBmcm96ZS5cbiAgICB2b2lkIG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGNsb2NrICs9IDYwXzAwMDtcbiAgICBleHBlY3QobWFya2Vycy5iZWhpbmQpLnRvQmUodHJ1ZSk7XG5cbiAgICBsZXQgY2F1Z2h0VXAgPSBmYWxzZTtcbiAgICBjb25zdCBjYXRjaFVwID0gbWFya2Vyc1xuICAgICAgLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pXG4gICAgICAudGhlbigoKSA9PiAoY2F1Z2h0VXAgPSB0cnVlKSk7XG4gICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgIGV4cGVjdChjYXVnaHRVcCkudG9CZShmYWxzZSk7XG4gICAgZXhwZWN0KHF1ZXJ5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgIGF3YWl0IGNhdGNoVXA7XG4gICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJ3aXRoIGEgcmVmcmVzaCBpbiBmbGlnaHRcIiwgKCkgPT4ge1xuICAgIGxldCBjbG9jazogbnVtYmVyO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgICBqZXN0LnVzZUZha2VUaW1lcnMoeyBkb05vdEZha2U6IFtcInNldEltbWVkaWF0ZVwiLCBcIm5leHRUaWNrXCJdIH0pO1xuICAgIH0pO1xuICAgIGFmdGVyRWFjaCgoKSA9PiBqZXN0LnVzZVJlYWxUaW1lcnMoKSk7XG5cbiAgICAvKiogTW92ZSB0aGUgY2xvY2sgYW5kIHRoZSB0aW1lcnMgb24gdG9nZXRoZXI6IG5vIGZyZWV6ZS4gKi9cbiAgICBjb25zdCBydW4gPSAobXM6IG51bWJlcikgPT4ge1xuICAgICAgZm9yIChsZXQgc3RlcCA9IDA7IHN0ZXAgPCBtczsgc3RlcCArPSAyNTApIHtcbiAgICAgICAgY2xvY2sgKz0gMjUwO1xuICAgICAgICBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoMjUwKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGluc3RhbmNlID0gKGZhaWxzID0gZmFsc2UsIGNhbkZyZWV6ZSA9IHRydWUpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJpZXM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gICAgICBjb25zdCBxdWVyeSA9IGplc3QuZm4oXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IFByb21pc2U8eyByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXTsgdHJ1bmNhdGVkOiBib29sZWFuIH0+KFxuICAgICAgICAgICAgKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgICAgICAgICAgcXVlcmllcy5wdXNoKCgpID0+XG4gICAgICAgICAgICAgICAgZmFpbHNcbiAgICAgICAgICAgICAgICAgID8gcmVqZWN0KG5ldyBFcnJvcihcInRocm90dGxlZFwiKSlcbiAgICAgICAgICAgICAgICAgIDogcmVzb2x2ZSh7IHJvd3M6IFtdLCB0cnVuY2F0ZWQ6IGZhbHNlIH0pLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICApO1xuICAgICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICAgIG1hcmtlcnM6IHsgcmVhZDogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgICAgbG9nOiB7IHF1ZXJ5IH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgICAgIGNhbkZyZWV6ZSxcbiAgICAgIH0pO1xuICAgICAgbWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiAwKTtcbiAgICAgIHJldHVybiB7IG1hcmtlcnMsIHF1ZXJ5LCBxdWVyaWVzIH07XG4gICAgfTtcblxuICAgIGl0KFwid2FpdHMgZm9yIGEgZnJlc2ggcXVlcnkgYWZ0ZXIgYSBmcmVlemUsIGV2ZW4gb25jZSB0aGUgbGF0ZSB0aWNrIGhhcyBydW5cIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBtYXJrZXJzLCBxdWVyeSwgcXVlcmllcyB9ID0gaW5zdGFuY2UoKTtcbiAgICAgIGNsb2NrICs9IDEwMDA7XG4gICAgICB2b2lkIG1hcmtlcnMucmVmcmVzaCgpO1xuICAgICAgY2xvY2sgKz0gNjBfMDAwO1xuICAgICAgLy8gQWZ0ZXIgdGhlIHRoYXcgdGhlIG92ZXJkdWUgdGljayBjYW4gcnVuIGJlZm9yZSBhbnkgcmVxdWVzdCBkb2VzLlxuICAgICAgamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDI1MCk7XG5cbiAgICAgIGxldCBjYXVnaHRVcCA9IGZhbHNlO1xuICAgICAgY29uc3QgY2F0Y2hVcCA9IG1hcmtlcnNcbiAgICAgICAgLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pXG4gICAgICAgIC50aGVuKCgpID0+IChjYXVnaHRVcCA9IHRydWUpKTtcbiAgICAgIHF1ZXJpZXMuc2hpZnQoKSEoKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgICAgLy8gV2hhdCB0aGUgZmlyc3QgcXVlcnkga25ldyBwcmVkYXRlcyB0aGUgZnJlZXplLlxuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KGNhdWdodFVwKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdChxdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgICAgYXdhaXQgY2F0Y2hVcDtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdChcImluIGEgY29udGFpbmVyLCB3aGljaCBpcyBuZXZlciBmcm96ZW4sIHdhaXRzIG9ubHkgZm9yIHRoZSBxdWVyeSBpbiBmbGlnaHRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBtYXJrZXJzLCBxdWVyeSwgcXVlcmllcyB9ID0gaW5zdGFuY2UoZmFsc2UsIGZhbHNlKTtcbiAgICAgIGNsb2NrICs9IDEwMDA7XG4gICAgICB2b2lkIG1hcmtlcnMucmVmcmVzaCgpO1xuICAgICAgLy8gQSBsb25nIHN0YWxsLCBub3QgYSBmcmVlemU6IG5vIHRpbWVyIHRvIHRlbGwgdGhlbSBhcGFydCwgbm9uZSBuZWVkZWQuXG4gICAgICBjbG9jayArPSA2MF8wMDA7XG5cbiAgICAgIGNvbnN0IGNhdGNoVXAgPSBtYXJrZXJzLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pO1xuICAgICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgICAgYXdhaXQgY2F0Y2hVcDtcbiAgICAgIGV4cGVjdChxdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KFwiaXMgY2F1Z2h0IHVwIG9uY2UgdGhlIGNhdGNoLXVwJ3Mgc2xvdyBxdWVyeSByZXR1cm5zLCB0aGUgcHJvY2VzcyBydW5uaW5nIHRocm91Z2hvdXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBmYWlscyBvZiBbZmFsc2UsIHRydWVdKSB7XG4gICAgICAgIGNvbnN0IHsgbWFya2VycywgcXVlcmllcyB9ID0gaW5zdGFuY2UoZmFpbHMpO1xuICAgICAgICBjbG9jayArPSA2MF8wMDA7XG4gICAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZSh0cnVlKTtcbiAgICAgICAgY29uc3QgY2F0Y2hVcCA9IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiB7fSk7XG4gICAgICAgIHJ1bigzMDAwKTtcbiAgICAgICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgICAgICBhd2FpdCBjYXRjaFVwO1xuICAgICAgICAvLyBPciB0aGUgZmlyc3QgYCd1c2UgY2FjaGUnYCBsb29rdXAgd291bGQgd2FpdCBmb3IgYW5vdGhlciBxdWVyeSxcbiAgICAgICAgLy8gaW5zaWRlIHRoZSByZW5kZXI6IG9uZSByZXF1ZXN0LCB0d28gd2FpdHMuXG4gICAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdChcIndhaXRzIG9ubHkgZm9yIGEgc2xvdyBxdWVyeSBpbiBmbGlnaHQsIHRoZSBwcm9jZXNzIHJ1bm5pbmcgdGhyb3VnaG91dFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IG1hcmtlcnMsIHF1ZXJ5LCBxdWVyaWVzIH0gPSBpbnN0YW5jZSgpO1xuICAgICAgY2xvY2sgKz0gNjBfMDAwO1xuICAgICAgY29uc3QgZmlyc3QgPSBtYXJrZXJzLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pO1xuICAgICAgcnVuKDI1MDApO1xuICAgICAgLy8gUGFzdCB0aGUgZ3JhY2UgaW50byB0aGUgcXVlcnksIGJ1dCB0aGUgcXVlcnkgaXMgYXMgZnJlc2ggYXMgYW55LlxuICAgICAgbGV0IGNhdWdodFVwID0gZmFsc2U7XG4gICAgICBjb25zdCBzZWNvbmQgPSBtYXJrZXJzXG4gICAgICAgIC5jYXRjaFVwKGFzeW5jICgpID0+IHt9KVxuICAgICAgICAudGhlbigoKSA9PiAoY2F1Z2h0VXAgPSB0cnVlKSk7XG4gICAgICBxdWVyaWVzLnNoaWZ0KCkhKCk7XG4gICAgICBhd2FpdCBmaXJzdDtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgICAgZXhwZWN0KGNhdWdodFVwKS50b0JlKHRydWUpO1xuICAgICAgYXdhaXQgc2Vjb25kO1xuICAgICAgZXhwZWN0KHF1ZXJ5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3Qgc2tpcCBhIHJvdyBmb3IgYW4gdW50cmFja2VkIHRhZyB0aGF0IGl0cyBmaXJzdCByZWFkIG1pc3NlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGhlIHdyaXRlciBwdXRzIHRoZSBsb2cgcm93IGFuZCB0aGUgbWFya2VyIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGVcbiAgICAvLyBtYXJrZXIgcmVhZCBpcyBldmVudHVhbGx5IGNvbnNpc3RlbnQ6IGByZWZyZXNoYCBjYW4gc2VlIHRoZSByb3csIHRoZW5cbiAgICAvLyBgZW5zdXJlYCByZWFkIHRoZSBtYXJrZXIgZnJvbSBiZWZvcmUgaXQuIE1hcmtlZCBhcHBsaWVkIHdoaWxlIHRoZSB0YWdcbiAgICAvLyB3YXMgdW50cmFja2VkLCB0aGUgcm93IHdhcyBza2lwcGVkIGJ5IGV2ZXJ5IHF1ZXJ5IHRoZSBsb29rYmFjayByZXR1cm5lZFxuICAgIC8vIGl0IHRvLCBhbmQgdGhlIGluc3RhbmNlIHNlcnZlZCB0aGUgc3RhbGUgZW50cnkgdW50aWwgdGhlIHJvbGxpbmcgcmUtcmVhZC5cbiAgICBsZXQgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgY29uc3QgcmV2YWxpZGF0ZWRBdCA9IDk5OV8wMDA7XG4gICAgY29uc3Qgcm93OiBSZXZhbGlkYXRpb25Mb2dSb3cgPSB7XG4gICAgICBzazogYCR7U3RyaW5nKGNsb2NrKS5wYWRTdGFydCgxNSwgXCIwXCIpfSNwb3N0c2AsXG4gICAgICBhdDogY2xvY2ssXG4gICAgICB0YWc6IFwicG9zdHNcIixcbiAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0IH0sXG4gICAgfTtcbiAgICBjb25zdCBxdWVyeSA9IGplc3QuZm4oYXN5bmMgKHNpbmNlOiBudW1iZXIpID0+ICh7XG4gICAgICByb3dzOiBbcm93XS5maWx0ZXIoKHIpID0+IHIuYXQgPj0gc2luY2UpLFxuICAgICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgICB9KSk7XG4gICAgLy8gQSByZXBsaWNhIHRoYXQgaGFzIG5vdCBzZWVuIHRoZSB3cml0ZSB5ZXQuXG4gICAgY29uc3QgcmVhZCA9IGplc3QuZm4oYXN5bmMgKCkgPT4gbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oKSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5IH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICAgIHJhbmRvbTogKCkgPT4gMCxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIGF3YWl0IG1hcmtlcnMuZW5zdXJlKFtcIm90aGVyXCJdKTtcblxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgLy8gVGhlIHJvdyBzZWVuIGJlZm9yZSB0aGUgcmVhZCBpcyBhcHBsaWVkIHRvIHdoYXQgdGhlIHJlYWQgZm91bmQuXG4gICAgYXdhaXQgbWFya2Vycy5lbnN1cmUoW1wicG9zdHNcIl0pO1xuICAgIGV4cGVjdChtYXJrZXJzLmdldChcInBvc3RzXCIpKS50b0VxdWFsKHsgcmV2YWxpZGF0ZWRBdCB9KTtcblxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KHF1ZXJ5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgZXhwZWN0KG1hcmtlcnMuZ2V0KFwicG9zdHNcIikpLnRvRXF1YWwoeyByZXZhbGlkYXRlZEF0IH0pO1xuICAgIC8vIE9ubHkgdGhlIG9uZSByZWFkIGVhY2ggdGFnJ3MgZmlyc3QgdXNlIGNvc3RzLlxuICAgIGV4cGVjdChyZWFkKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gIH0pO1xufSk7XG4iXX0=