claude-code-sync 0.1.13 → 0.1.14

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.
package/dist/cli.js CHANGED
@@ -48,6 +48,38 @@ const readline = __importStar(require("readline"));
48
48
  const fs = __importStar(require("fs"));
49
49
  const path = __importStar(require("path"));
50
50
  const index_1 = require("./index");
51
+ // Pricing per million tokens (USD) with cache pricing
52
+ // Source: https://www.anthropic.com/pricing
53
+ const MODEL_PRICING = {
54
+ "claude-sonnet-4-20250514": { input: 3.00, output: 15.00, cacheWrite: 3.75, cacheRead: 0.30 },
55
+ "claude-opus-4-20250514": { input: 15.00, output: 75.00, cacheWrite: 18.75, cacheRead: 1.50 },
56
+ "claude-opus-4-5-20251101": { input: 15.00, output: 75.00, cacheWrite: 18.75, cacheRead: 1.50 },
57
+ "claude-3-5-sonnet-20241022": { input: 3.00, output: 15.00, cacheWrite: 3.75, cacheRead: 0.30 },
58
+ "claude-3-opus-20240229": { input: 15.00, output: 75.00, cacheWrite: 18.75, cacheRead: 1.50 },
59
+ "claude-3-5-haiku-20241022": { input: 0.80, output: 4.00, cacheWrite: 1.00, cacheRead: 0.08 },
60
+ };
61
+ // Calculate cost from model and token usage with proper cache pricing
62
+ function calculateCost(model, stats) {
63
+ if (!model)
64
+ return 0;
65
+ // Try exact match first
66
+ let pricing = MODEL_PRICING[model];
67
+ // Try partial match if exact match fails
68
+ if (!pricing) {
69
+ const matchingKey = Object.keys(MODEL_PRICING).find(k => model.includes(k) || k.includes(model));
70
+ if (matchingKey) {
71
+ pricing = MODEL_PRICING[matchingKey];
72
+ }
73
+ }
74
+ if (!pricing)
75
+ return 0;
76
+ // Calculate cost with proper cache pricing
77
+ const inputCost = stats.inputTokens * pricing.input;
78
+ const cacheWriteCost = stats.cacheCreationTokens * pricing.cacheWrite;
79
+ const cacheReadCost = stats.cacheReadTokens * pricing.cacheRead;
80
+ const outputCost = stats.outputTokens * pricing.output;
81
+ return (inputCost + cacheWriteCost + cacheReadCost + outputCost) / 1_000_000;
82
+ }
51
83
  // Read version from package.json
52
84
  function getVersion() {
53
85
  try {
@@ -525,7 +557,20 @@ function generateTitle(prompt) {
525
557
  function parseTranscriptFile(transcriptPath) {
526
558
  const result = {
527
559
  assistantMessages: [],
528
- tokenUsage: { input: 0, output: 0 },
560
+ stats: {
561
+ model: undefined,
562
+ inputTokens: 0,
563
+ cacheCreationTokens: 0,
564
+ cacheReadTokens: 0,
565
+ outputTokens: 0,
566
+ messageCount: 0,
567
+ toolCallCount: 0,
568
+ title: undefined,
569
+ cwd: undefined,
570
+ startedAt: undefined,
571
+ endedAt: undefined,
572
+ durationMs: undefined,
573
+ },
529
574
  };
530
575
  try {
531
576
  if (!fs.existsSync(transcriptPath)) {
@@ -534,16 +579,40 @@ function parseTranscriptFile(transcriptPath) {
534
579
  const content = fs.readFileSync(transcriptPath, "utf-8");
535
580
  const lines = content.trim().split("\n");
536
581
  const seenUuids = new Set();
582
+ let firstTimestamp;
583
+ let lastTimestamp;
537
584
  for (const line of lines) {
538
585
  if (!line.trim())
539
586
  continue;
540
587
  try {
541
588
  const entry = JSON.parse(line);
542
- // Only process assistant messages
589
+ // Track timestamps for duration calculation
590
+ if (entry.timestamp) {
591
+ if (!firstTimestamp) {
592
+ firstTimestamp = entry.timestamp;
593
+ }
594
+ lastTimestamp = entry.timestamp;
595
+ }
596
+ // Get cwd and title from first entry that has them
597
+ if (!result.stats.cwd && entry.cwd) {
598
+ result.stats.cwd = entry.cwd;
599
+ }
600
+ if (!result.stats.title && entry.slug) {
601
+ result.stats.title = entry.slug;
602
+ }
603
+ // Count user messages
604
+ if (entry.type === "user") {
605
+ result.stats.messageCount++;
606
+ }
607
+ // Process assistant messages
543
608
  if (entry.type === "assistant" && entry.message) {
544
609
  const msg = entry.message;
545
610
  const uuid = entry.uuid || "";
546
- // Skip if we've already seen this UUID (dedup)
611
+ // Get model from first assistant message
612
+ if (msg.model && !result.stats.model) {
613
+ result.stats.model = msg.model;
614
+ }
615
+ // Skip duplicate UUIDs for message extraction
547
616
  if (uuid && seenUuids.has(uuid))
548
617
  continue;
549
618
  if (uuid)
@@ -559,15 +628,18 @@ function parseTranscriptFile(transcriptPath) {
559
628
  model: msg.model,
560
629
  });
561
630
  }
631
+ // Count tool uses
632
+ if (part.type === "tool_use") {
633
+ result.stats.toolCallCount++;
634
+ }
562
635
  }
563
636
  }
564
- // Accumulate token usage from all assistant messages
637
+ // Accumulate token usage (separate cache tokens for cost calculation)
565
638
  if (msg.usage) {
566
- result.tokenUsage.input +=
567
- (msg.usage.input_tokens || 0) +
568
- (msg.usage.cache_read_input_tokens || 0) +
569
- (msg.usage.cache_creation_input_tokens || 0);
570
- result.tokenUsage.output += msg.usage.output_tokens || 0;
639
+ result.stats.inputTokens += msg.usage.input_tokens || 0;
640
+ result.stats.cacheCreationTokens += msg.usage.cache_creation_input_tokens || 0;
641
+ result.stats.cacheReadTokens += msg.usage.cache_read_input_tokens || 0;
642
+ result.stats.outputTokens += msg.usage.output_tokens || 0;
571
643
  }
572
644
  }
573
645
  }
@@ -575,6 +647,16 @@ function parseTranscriptFile(transcriptPath) {
575
647
  // Skip malformed lines
576
648
  }
577
649
  }
650
+ // Calculate duration from timestamps
651
+ if (firstTimestamp && lastTimestamp) {
652
+ result.stats.startedAt = firstTimestamp;
653
+ result.stats.endedAt = lastTimestamp;
654
+ const startMs = new Date(firstTimestamp).getTime();
655
+ const endMs = new Date(lastTimestamp).getTime();
656
+ if (!isNaN(startMs) && !isNaN(endMs)) {
657
+ result.stats.durationMs = endMs - startMs;
658
+ }
659
+ }
578
660
  }
579
661
  catch {
580
662
  // Return empty result on error
@@ -607,44 +689,112 @@ program
607
689
  switch (event) {
608
690
  case "SessionStart": {
609
691
  const data = JSON.parse(input);
692
+ // Parse transcript if available to get initial info
693
+ let stats;
694
+ if (data.transcript_path && fs.existsSync(data.transcript_path)) {
695
+ const parsed = parseTranscriptFile(data.transcript_path);
696
+ stats = parsed.stats;
697
+ }
698
+ const cwd = stats?.cwd || data.cwd;
699
+ const startedAt = new Date().toISOString();
610
700
  // Initialize session state
611
701
  sessionState[data.session_id] = {
612
- model: data.model,
702
+ model: stats?.model || data.model,
613
703
  tokenUsage: { input: 0, output: 0 },
704
+ cacheCreationTokens: 0,
705
+ cacheReadTokens: 0,
614
706
  messageCount: 0,
707
+ toolCallCount: 0,
708
+ startedAt,
709
+ title: stats?.title,
710
+ cwd,
615
711
  };
616
712
  saveSessionState(sessionState);
617
713
  const session = {
618
714
  sessionId: data.session_id,
619
715
  source: "claude-code",
620
- cwd: data.cwd,
621
- model: data.model,
716
+ cwd,
717
+ model: stats?.model || data.model,
718
+ title: stats?.title,
622
719
  permissionMode: data.permission_mode,
623
720
  thinkingEnabled: data.thinking_enabled,
624
721
  mcpServers: data.mcp_servers,
625
722
  startType: data.source === "startup" ? "new" : data.source,
626
- startedAt: new Date().toISOString(),
627
- projectPath: data.cwd,
628
- projectName: data.cwd ? data.cwd.split("/").pop() : undefined,
723
+ startedAt,
724
+ projectPath: cwd,
725
+ projectName: cwd ? path.basename(cwd) : undefined,
629
726
  };
727
+ // Try to get git branch from cwd
728
+ if (cwd) {
729
+ try {
730
+ const gitDir = path.join(cwd, ".git");
731
+ if (fs.existsSync(gitDir)) {
732
+ const headFile = path.join(gitDir, "HEAD");
733
+ if (fs.existsSync(headFile)) {
734
+ const head = fs.readFileSync(headFile, "utf-8").trim();
735
+ if (head.startsWith("ref: refs/heads/")) {
736
+ session.gitBranch = head.replace("ref: refs/heads/", "");
737
+ }
738
+ }
739
+ }
740
+ }
741
+ catch {
742
+ // Ignore git errors
743
+ }
744
+ }
630
745
  await client.syncSession(session);
631
746
  break;
632
747
  }
633
748
  case "SessionEnd": {
634
749
  const data = JSON.parse(input);
635
750
  const state = sessionState[data.session_id] || {};
636
- // Calculate final token usage
637
- const finalTokenUsage = data.total_token_usage || state.tokenUsage;
751
+ // Parse transcript to get final stats including model, tokens, cost
752
+ let stats = {
753
+ model: state.model,
754
+ inputTokens: state.tokenUsage?.input || 0,
755
+ cacheCreationTokens: state.cacheCreationTokens || 0,
756
+ cacheReadTokens: state.cacheReadTokens || 0,
757
+ outputTokens: state.tokenUsage?.output || 0,
758
+ messageCount: state.messageCount || 0,
759
+ toolCallCount: state.toolCallCount || 0,
760
+ title: state.title,
761
+ cwd: state.cwd || data.cwd,
762
+ startedAt: state.startedAt,
763
+ endedAt: state.endedAt,
764
+ durationMs: state.durationMs,
765
+ };
766
+ if (data.transcript_path && fs.existsSync(data.transcript_path)) {
767
+ const parsed = parseTranscriptFile(data.transcript_path);
768
+ stats = parsed.stats;
769
+ }
770
+ // Calculate cost from tokens (with proper cache pricing)
771
+ let cost = data.cost_estimate;
772
+ if ((cost === undefined || cost === null || cost === 0) && stats.model) {
773
+ if (stats.inputTokens || stats.outputTokens || stats.cacheReadTokens || stats.cacheCreationTokens) {
774
+ cost = calculateCost(stats.model, stats);
775
+ }
776
+ }
777
+ const cwd = stats.cwd || data.cwd;
778
+ const totalInputTokens = stats.inputTokens + stats.cacheCreationTokens + stats.cacheReadTokens;
779
+ const endedAt = stats.endedAt || new Date().toISOString();
638
780
  const session = {
639
781
  sessionId: data.session_id,
640
782
  source: "claude-code",
641
- title: state.firstPrompt ? generateTitle(state.firstPrompt) : undefined,
783
+ model: stats.model,
784
+ title: stats.title || (state.firstPrompt ? generateTitle(state.firstPrompt) : undefined),
785
+ cwd,
786
+ projectPath: cwd,
787
+ projectName: cwd ? path.basename(cwd) : undefined,
642
788
  endReason: data.reason,
643
- messageCount: data.message_count || state.messageCount,
644
- toolCallCount: data.tool_call_count,
645
- tokenUsage: finalTokenUsage,
646
- costEstimate: data.cost_estimate,
647
- endedAt: new Date().toISOString(),
789
+ messageCount: data.message_count || stats.messageCount,
790
+ toolCallCount: data.tool_call_count || stats.toolCallCount,
791
+ tokenUsage: {
792
+ input: totalInputTokens,
793
+ output: stats.outputTokens,
794
+ },
795
+ costEstimate: cost,
796
+ startedAt: stats.startedAt,
797
+ endedAt,
648
798
  };
649
799
  await client.syncSession(session);
650
800
  // Clean up session state
@@ -709,9 +859,36 @@ program
709
859
  // Parse transcript file to extract assistant messages and token usage
710
860
  if (data.transcript_path) {
711
861
  const transcript = parseTranscriptFile(data.transcript_path);
712
- // Update token usage from transcript
713
- if (transcript.tokenUsage.input > 0 || transcript.tokenUsage.output > 0) {
714
- state.tokenUsage = transcript.tokenUsage;
862
+ const { stats } = transcript;
863
+ // Update token usage from transcript (track cache tokens separately)
864
+ if (stats.inputTokens > 0 || stats.outputTokens > 0 || stats.cacheReadTokens > 0) {
865
+ const totalInput = stats.inputTokens + stats.cacheCreationTokens + stats.cacheReadTokens;
866
+ state.tokenUsage = { input: totalInput, output: stats.outputTokens };
867
+ state.cacheCreationTokens = stats.cacheCreationTokens;
868
+ state.cacheReadTokens = stats.cacheReadTokens;
869
+ }
870
+ // Update model if found
871
+ if (stats.model && !state.model) {
872
+ state.model = stats.model;
873
+ }
874
+ // Update title if found from transcript slug
875
+ if (stats.title && !state.title) {
876
+ state.title = stats.title;
877
+ }
878
+ // Update duration info
879
+ if (stats.startedAt)
880
+ state.startedAt = stats.startedAt;
881
+ if (stats.endedAt)
882
+ state.endedAt = stats.endedAt;
883
+ if (stats.durationMs)
884
+ state.durationMs = stats.durationMs;
885
+ // Update tool call count
886
+ if (stats.toolCallCount > 0) {
887
+ state.toolCallCount = stats.toolCallCount;
888
+ }
889
+ // Calculate cost if we have model and tokens
890
+ if (stats.model && (stats.inputTokens || stats.outputTokens || stats.cacheReadTokens)) {
891
+ state.costEstimate = calculateCost(stats.model, stats);
715
892
  }
716
893
  // Track which messages we've already synced to avoid duplicates
717
894
  const syncedMessages = state.syncedMessageUuids instanceof Set
@@ -742,12 +919,15 @@ program
742
919
  }
743
920
  sessionState[data.session_id] = state;
744
921
  saveSessionState(sessionState);
745
- // Update session with token usage from transcript
922
+ // Update session with token usage, model, and cost from transcript
746
923
  const session = {
747
924
  sessionId: data.session_id,
748
925
  source: "claude-code",
926
+ model: state.model,
749
927
  tokenUsage: state.tokenUsage,
750
928
  messageCount: state.messageCount,
929
+ toolCallCount: state.toolCallCount,
930
+ costEstimate: state.costEstimate,
751
931
  };
752
932
  await client.syncSession(session);
753
933
  break;
@@ -766,4 +946,4 @@ program
766
946
  });
767
947
  // Parse and run
768
948
  program.parse();
769
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHlDQUFvQztBQUNwQyxtREFBcUM7QUFDckMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixtQ0FRaUI7QUFpR2pCLGlDQUFpQztBQUNqQyxTQUFTLFVBQVU7SUFDakIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQWdCLENBQUM7UUFDekUsT0FBTyxHQUFHLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztBQUU5QixPQUFPO0tBQ0osSUFBSSxDQUFDLGtCQUFrQixDQUFDO0tBQ3hCLFdBQVcsQ0FBQyxpREFBaUQsQ0FBQztLQUM5RCxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUV6QiwrRUFBK0U7QUFDL0UsbUJBQW1CO0FBQ25CLCtFQUErRTtBQUUvRSxTQUFTLE1BQU0sQ0FBQyxRQUFnQjtJQUM5QixNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFB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QyxDQUFDO2dCQUNGLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEMsTUFBTTtZQUNSLENBQUM7WUFFRDtnQkFDRSx3QkFBd0I7Z0JBQ3hCLE1BQU07UUFDVixDQUFDO1FBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLDRDQUE0QztRQUM1QyxPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDO0FBRUwsZ0JBQWdCO0FBQ2hCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuLyoqXG4gKiBDbGF1ZGUgQ29kZSBTeW5jIENMSVxuICpcbiAqIENvbW1hbmRzOlxuICogICBsb2dpbiAgIC0gQ29uZmlndXJlIENvbnZleCBVUkwgYW5kIEFQSSBLZXlcbiAqICAgbG9nb3V0ICAtIENsZWFyIHN0b3JlZCBjcmVkZW50aWFsc1xuICogICBzdGF0dXMgIC0gU2hvdyBjb25uZWN0aW9uIHN0YXR1c1xuICogICBjb25maWcgIC0gU2hvdyBjdXJyZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSBcInJlYWRsaW5lXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7XG4gIGxvYWRDb25maWcsXG4gIHNhdmVDb25maWcsXG4gIGNsZWFyQ29uZmlnLFxuICBTeW5jQ2xpZW50LFxuICBDb25maWcsXG4gIFNlc3Npb25EYXRhLFxuICBNZXNzYWdlRGF0YSxcbn0gZnJvbSBcIi4vaW5kZXhcIjtcblxuLy8gVHlwZXMgZm9yIENsYXVkZSBDb2RlIGhvb2sgZXZlbnQgZGF0YSBmcm9tIHN0ZGluXG5pbnRlcmZhY2UgSG9va1Nlc3Npb25TdGFydERhdGEge1xuICBzZXNzaW9uX2lkOiBzdHJpbmc7XG4gIGN3ZD86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25fbW9kZT86IHN0cmluZztcbiAgc291cmNlPzogc3RyaW5nO1xuICB0aGlua2luZ19lbmFibGVkPzogYm9vbGVhbjtcbiAgbWNwX3NlcnZlcnM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEhvb2tTZXNzaW9uRW5kRGF0YSB7XG4gIHNlc3Npb25faWQ6IHN0cmluZztcbiAgcmVhc29uPzogXCJ1c2VyX3N0b3BcIiB8IFwibWF4X3R1cm5zXCIgfCBcImVycm9yXCIgfCBcImNvbXBsZXRlZFwiO1xuICBtZXNzYWdlX2NvdW50PzogbnVtYmVyO1xuICB0b29sX2NhbGxfY291bnQ/OiBudW1iZXI7XG4gIHRvdGFsX3Rva2VuX3VzYWdlPzoge1xuICAgIGlucHV0OiBudW1iZXI7XG4gICAgb3V0cHV0OiBudW1iZXI7XG4gIH07XG4gIGNvc3RfZXN0aW1hdGU/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBIb29rVXNlclByb21wdERhdGEge1xuICBzZXNzaW9uX2lkOiBzdHJpbmc7XG4gIHByb21wdDogc3RyaW5nO1xuICB0aW1lc3RhbXA/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBIb29rVG9vbFVzZURhdGEge1xuICBzZXNzaW9uX2lkOiBzdHJpbmc7XG4gIHRvb2xfbmFtZTogc3RyaW5nO1xuICB0b29sX3VzZV9pZD86IHN0cmluZztcbiAgdG9vbF9pbnB1dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB0b29sX3Jlc3VsdD86IHtcbiAgICBvdXRwdXQ/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG4gIH07XG4gIGR1cmF0aW9uX21zPzogbnVtYmVyO1xuICBzdWNjZXNzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEhvb2tTdG9wRGF0YSB7XG4gIHNlc3Npb25faWQ6IHN0cmluZztcbiAgdHJhbnNjcmlwdF9wYXRoPzogc3RyaW5nO1xuICBzdG9wX2hvb2tfYWN0aXZlPzogYm9vbGVhbjtcbiAgcGVybWlzc2lvbl9tb2RlPzogc3RyaW5nO1xuICBjd2Q/OiBzdHJpbmc7XG4gIGhvb2tfZXZlbnRfbmFtZT86IHN0cmluZztcbn1cblxuLy8gVHlwZXMgZm9yIENsYXVkZSBDb2RlIHRyYW5zY3JpcHQgSlNPTkwgZW50cmllc1xuaW50ZXJmYWNlIFRyYW5zY3JpcHRVc2FnZSB7XG4gIGlucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgb3V0cHV0X3Rva2Vucz86IG51bWJlcjtcbiAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2Vucz86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFRyYW5zY3JpcHRDb250ZW50UGFydCB7XG4gIHR5cGU6IFwidGV4dFwiIHwgXCJ0aGlua2luZ1wiIHwgXCJ0b29sX3VzZVwiIHwgXCJ0b29sX3Jlc3VsdFwiO1xuICB0ZXh0Pzogc3RyaW5nO1xuICB0aGlua2luZz86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGlucHV0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBUcmFuc2NyaXB0TWVzc2FnZSB7XG4gIGNvbnRlbnQ/OiBUcmFuc2NyaXB0Q29udGVudFBhcnRbXTtcbiAgdXNhZ2U/OiBUcmFuc2NyaXB0VXNhZ2U7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBzdG9wX3JlYXNvbj86IHN0cmluZyB8IG51bGw7XG59XG5cbmludGVyZmFjZSBUcmFuc2NyaXB0RW50cnkge1xuICB0eXBlPzogc3RyaW5nO1xuICB1dWlkPzogc3RyaW5nO1xuICB0aW1lc3RhbXA/OiBzdHJpbmc7XG4gIG1lc3NhZ2U/OiBUcmFuc2NyaXB0TWVzc2FnZTtcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICBwYXJlbnRVdWlkPzogc3RyaW5nO1xufVxuXG4vLyBUeXBlcyBmb3IgQ2xhdWRlIENvZGUgc2V0dGluZ3MuanNvblxuaW50ZXJmYWNlIENsYXVkZVNldHRpbmdzIHtcbiAgaG9va3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gVHlwZSBmb3IgcGFja2FnZS5qc29uIHZlcnNpb24gZmllbGRcbmludGVyZmFjZSBQYWNrYWdlSnNvbiB7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8vIFJlYWQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBrZ1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwicGFja2FnZS5qc29uXCIpO1xuICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBrZ1BhdGgsIFwidXRmLThcIikpIGFzIFBhY2thZ2VKc29uO1xuICAgIHJldHVybiBwa2cudmVyc2lvbiB8fCBcIjAuMC4wXCI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcIjAuMC4wXCI7XG4gIH1cbn1cblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoXCJjbGF1ZGUtY29kZS1zeW5jXCIpXG4gIC5kZXNjcmlwdGlvbihcIlN5bmMgQ2xhdWRlIENvZGUgc2Vzc2lvbnMgdG8gT3BlblN5bmMgZGFzaGJvYXJkXCIpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhlbHBlciBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcHJvbXB0KHF1ZXN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmwucXVlc3Rpb24ocXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWFza0FwaUtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChrZXkubGVuZ3RoIDw9IDgpIHJldHVybiBcIioqKipcIjtcbiAgcmV0dXJuIGtleS5zdWJzdHJpbmcoMCwgNCkgKyBcIioqKipcIiArIGtleS5zdWJzdHJpbmcoa2V5Lmxlbmd0aCAtIDQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb21tYW5kc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwibG9naW5cIilcbiAgLmRlc2NyaXB0aW9uKFwiQ29uZmlndXJlIENvbnZleCBVUkwgYW5kIEFQSSBLZXlcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJcXG4gIENsYXVkZSBDb2RlIFN5bmMgLSBMb2dpblxcblwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkdldCB5b3VyIEFQSSBrZXkgZnJvbSB5b3VyIE9wZW5TeW5jLmRldiBTZXR0aW5ncyBwYWdlLCBzdGFydHMgd2l0aCBvc2tfLiBFbnRlciBpdCBoZXJlOlwiKTtcbiAgICBjb25zb2xlLmxvZyhcIiAgMS4gR28gdG8gU2V0dGluZ3NcIik7XG4gICAgY29uc29sZS5sb2coXCIgIDIuIENsaWNrICdHZW5lcmF0ZSBBUEkgS2V5J1wiKTtcbiAgICBjb25zb2xlLmxvZyhcIiAgMy4gQ29weSB0aGUga2V5IChzdGFydHMgd2l0aCBvc2tfKVxcblwiKTtcblxuICAgIGNvbnN0IGNvbnZleFVybCA9IGF3YWl0IHByb21wdChcIkNvbnZleCBVUkwgKGUuZy4sIGh0dHBzOi8veW91ci1wcm9qZWN0LmNvbnZleC5jbG91ZCk6IFwiKTtcblxuICAgIGlmICghY29udmV4VXJsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IENvbnZleCBVUkwgaXMgcmVxdWlyZWRcIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKCFjb252ZXhVcmwuaW5jbHVkZXMoXCJjb252ZXguY2xvdWRcIikgJiYgIWNvbnZleFVybC5pbmNsdWRlcyhcImNvbnZleC5zaXRlXCIpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IEludmFsaWQgQ29udmV4IFVSTC4gTXVzdCBjb250YWluIGNvbnZleC5jbG91ZCBvciBjb252ZXguc2l0ZVwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlLZXkgPSBhd2FpdCBwcm9tcHQoXCJBUEkgS2V5IChvc2tfLi4uKTogXCIpO1xuXG4gICAgaWYgKCFhcGlLZXkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogQVBJIEtleSBpcyByZXF1aXJlZFwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleS5zdGFydHNXaXRoKFwib3NrX1wiKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOiBJbnZhbGlkIEFQSSBLZXkuIE11c3Qgc3RhcnQgd2l0aCBvc2tfXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogQ29uZmlnID0ge1xuICAgICAgY29udmV4VXJsLFxuICAgICAgYXBpS2V5LFxuICAgICAgYXV0b1N5bmM6IHRydWUsXG4gICAgICBzeW5jVG9vbENhbGxzOiB0cnVlLFxuICAgICAgc3luY1RoaW5raW5nOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gVGVzdCBjb25uZWN0aW9uXG4gICAgY29uc29sZS5sb2coXCJcXG5UZXN0aW5nIGNvbm5lY3Rpb24uLi5cIik7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFN5bmNDbGllbnQoY29uZmlnKTtcbiAgICBjb25zdCBjb25uZWN0ZWQgPSBhd2FpdCBjbGllbnQudGVzdENvbm5lY3Rpb24oKTtcblxuICAgIGlmICghY29ubmVjdGVkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIENvbnZleCBiYWNrZW5kXCIpO1xuICAgICAgY29uc29sZS5lcnJvcihcIiAgIENoZWNrIHlvdXIgVVJMIGFuZCB0cnkgYWdhaW5cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSBjb25maWdcbiAgICBzYXZlQ29uZmlnKGNvbmZpZyk7XG4gICAgY29uc29sZS5sb2coXCJcXG5Db25maWd1cmF0aW9uIHNhdmVkIVwiKTtcbiAgICBjb25zb2xlLmxvZyhgICAgVVJMOiAke2NvbnZleFVybH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICAgS2V5OiAke21hc2tBcGlLZXkoYXBpS2V5KX1gKTtcbiAgICBjb25zb2xlLmxvZyhcIlxcbk5leHQgc3RlcDogUnVuIHRoZSBzZXR1cCBjb21tYW5kIHRvIGNvbmZpZ3VyZSBDbGF1ZGUgQ29kZSBob29rczpcXG5cIik7XG4gICAgY29uc29sZS5sb2coXCIgICBjbGF1ZGUtY29kZS1zeW5jIHNldHVwXFxuXCIpO1xuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcImxvZ291dFwiKVxuICAuZGVzY3JpcHRpb24oXCJDbGVhciBzdG9yZWQgY3JlZGVudGlhbHNcIilcbiAgLmFjdGlvbigoKSA9PiB7XG4gICAgY2xlYXJDb25maWcoKTtcbiAgICBjb25zb2xlLmxvZyhcIkNyZWRlbnRpYWxzIGNsZWFyZWRcIik7XG4gIH0pO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwic3RhdHVzXCIpXG4gIC5kZXNjcmlwdGlvbihcIlNob3cgY29ubmVjdGlvbiBzdGF0dXNcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuXG4gICAgY29uc29sZS5sb2coXCJcXG4gIENsYXVkZSBDb2RlIFN5bmMgLSBTdGF0dXNcXG5cIik7XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgY29uc29sZS5sb2coXCJOb3QgY29uZmlndXJlZFwiKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiICAgUnVuICdjbGF1ZGUtY29kZS1zeW5jIGxvZ2luJyB0byBzZXQgdXBcXG5cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXCJDb25maWd1cmF0aW9uOlwiKTtcbiAgICBjb25zb2xlLmxvZyhgICBDb252ZXggVVJMOiAke2NvbmZpZy5jb252ZXhVcmx9YCk7XG4gICAgY29uc29sZS5sb2coYCAgQVBJIEtleTogICAgJHttYXNrQXBpS2V5KGNvbmZpZy5hcGlLZXkpfWApO1xuICAgIGNvbnNvbGUubG9nKGAgIEF1dG8gU3luYzogICR7Y29uZmlnLmF1dG9TeW5jICE9PSBmYWxzZSA/IFwiZW5hYmxlZFwiIDogXCJkaXNhYmxlZFwifWApO1xuICAgIGNvbnNvbGUubG9nKGAgIFRvb2wgQ2FsbHM6ICR7Y29uZmlnLnN5bmNUb29sQ2FsbHMgIT09IGZhbHNlID8gXCJlbmFibGVkXCIgOiBcImRpc2FibGVkXCJ9YCk7XG4gICAgY29uc29sZS5sb2coYCAgVGhpbmtpbmc6ICAgJHtjb25maWcuc3luY1RoaW5raW5nID8gXCJlbmFibGVkXCIgOiBcImRpc2FibGVkXCJ9YCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIlxcblRlc3RpbmcgY29ubmVjdGlvbi4uLlwiKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgU3luY0NsaWVudChjb25maWcpO1xuICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IGNsaWVudC50ZXN0Q29ubmVjdGlvbigpO1xuXG4gICAgaWYgKGNvbm5lY3RlZCkge1xuICAgICAgY29uc29sZS5sb2coXCJDb25uZWN0ZWQgdG8gQ29udmV4IGJhY2tlbmRcXG5cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIENvbnZleCBiYWNrZW5kXFxuXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJjb25maWdcIilcbiAgLmRlc2NyaXB0aW9uKFwiU2hvdyBjdXJyZW50IGNvbmZpZ3VyYXRpb25cIilcbiAgLm9wdGlvbihcIi0tanNvblwiLCBcIk91dHB1dCBhcyBKU09OXCIpXG4gIC5hY3Rpb24oKG9wdGlvbnM6IHsganNvbj86IGJvb2xlYW4gfSkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgY29uZmlndXJlZDogZmFsc2UgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJOb3QgY29uZmlndXJlZC4gUnVuICdjbGF1ZGUtY29kZS1zeW5jIGxvZ2luJyB0byBzZXQgdXAuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25maWd1cmVkOiB0cnVlLFxuICAgICAgICAgICAgY29udmV4VXJsOiBjb25maWcuY29udmV4VXJsLFxuICAgICAgICAgICAgYXBpS2V5OiBtYXNrQXBpS2V5KGNvbmZpZy5hcGlLZXkpLFxuICAgICAgICAgICAgYXV0b1N5bmM6IGNvbmZpZy5hdXRvU3luYyAhPT0gZmFsc2UsXG4gICAgICAgICAgICBzeW5jVG9vbENhbGxzOiBjb25maWcuc3luY1Rvb2xDYWxscyAhPT0gZmFsc2UsXG4gICAgICAgICAgICBzeW5jVGhpbmtpbmc6IGNvbmZpZy5zeW5jVGhpbmtpbmcgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIDJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJcXG4gIEN1cnJlbnQgQ29uZmlndXJhdGlvblxcblwiKTtcbiAgICAgIGNvbnNvbGUubG9nKGBDb252ZXggVVJMOiAgJHtjb25maWcuY29udmV4VXJsfWApO1xuICAgICAgY29uc29sZS5sb2coYEFQSSBLZXk6ICAgICAke21hc2tBcGlLZXkoY29uZmlnLmFwaUtleSl9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgQXV0byBTeW5jOiAgICR7Y29uZmlnLmF1dG9TeW5jICE9PSBmYWxzZX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBUb29sIENhbGxzOiAgJHtjb25maWcuc3luY1Rvb2xDYWxscyAhPT0gZmFsc2V9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgVGhpbmtpbmc6ICAgICR7Y29uZmlnLnN5bmNUaGlua2luZyA9PT0gdHJ1ZX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBcXG5Db25maWcgZmlsZTogfi8uY29uZmlnL2NsYXVkZS1jb2RlLXN5bmMvY29uZmlnLmpzb25cXG5gKTtcbiAgICB9XG4gIH0pO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwic2V0IDxrZXk+IDx2YWx1ZT5cIilcbiAgLmRlc2NyaXB0aW9uKFwiU2V0IGEgY29uZmlndXJhdGlvbiB2YWx1ZVwiKVxuICAuYWN0aW9uKChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiTm90IGNvbmZpZ3VyZWQuIFJ1biAnY2xhdWRlLWNvZGUtc3luYyBsb2dpbicgZmlyc3QuXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkS2V5cyA9IFtcImF1dG9TeW5jXCIsIFwic3luY1Rvb2xDYWxsc1wiLCBcInN5bmNUaGlua2luZ1wiXTtcbiAgICBpZiAoIXZhbGlkS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIGtleS4gVmFsaWQga2V5czogJHt2YWxpZEtleXMuam9pbihcIiwgXCIpfWApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvb2xWYWx1ZSA9IHZhbHVlID09PSBcInRydWVcIiB8fCB2YWx1ZSA9PT0gXCIxXCIgfHwgdmFsdWUgPT09IFwieWVzXCI7XG4gICAgXG4gICAgLy8gVHlwZS1zYWZlIGNvbmZpZyB1cGRhdGVcbiAgICBpZiAoa2V5ID09PSBcImF1dG9TeW5jXCIpIHtcbiAgICAgIGNvbmZpZy5hdXRvU3luYyA9IGJvb2xWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzeW5jVG9vbENhbGxzXCIpIHtcbiAgICAgIGNvbmZpZy5zeW5jVG9vbENhbGxzID0gYm9vbFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN5bmNUaGlua2luZ1wiKSB7XG4gICAgICBjb25maWcuc3luY1RoaW5raW5nID0gYm9vbFZhbHVlO1xuICAgIH1cblxuICAgIHNhdmVDb25maWcoY29uZmlnKTtcbiAgICBjb25zb2xlLmxvZyhgU2V0ICR7a2V5fSA9ICR7Ym9vbFZhbHVlfWApO1xuICB9KTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2V0dXAgQ29tbWFuZCAoY29uZmlndXJlcyBDbGF1ZGUgQ29kZSBob29rcylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ2xhdWRlIENvZGUgaG9va3MgY29uZmlndXJhdGlvblxuY29uc3QgQ0xBVURFX0hPT0tTX0NPTkZJRyA9IHtcbiAgaG9va3M6IHtcbiAgICBTZXNzaW9uU3RhcnQ6IFtcbiAgICAgIHtcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImNvbW1hbmRcIixcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiY2xhdWRlLWNvZGUtc3luYyBob29rIFNlc3Npb25TdGFydFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gICAgU2Vzc2lvbkVuZDogW1xuICAgICAge1xuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiY29tbWFuZFwiLFxuICAgICAgICAgICAgY29tbWFuZDogXCJjbGF1ZGUtY29kZS1zeW5jIGhvb2sgU2Vzc2lvbkVuZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gICAgVXNlclByb21wdFN1Ym1pdDogW1xuICAgICAge1xuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiY29tbWFuZFwiLFxuICAgICAgICAgICAgY29tbWFuZDogXCJjbGF1ZGUtY29kZS1zeW5jIGhvb2sgVXNlclByb21wdFN1Ym1pdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gICAgUG9zdFRvb2xVc2U6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2hlcjogXCIqXCIsXG4gICAgICAgIGhvb2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJjb21tYW5kXCIsXG4gICAgICAgICAgICBjb21tYW5kOiBcImNsYXVkZS1jb2RlLXN5bmMgaG9vayBQb3N0VG9vbFVzZVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gICAgU3RvcDogW1xuICAgICAge1xuICAgICAgICBtYXRjaGVyOiBcIipcIixcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImNvbW1hbmRcIixcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiY2xhdWRlLWNvZGUtc3luYyBob29rIFN0b3BcIixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcInNldHVwXCIpXG4gIC5kZXNjcmlwdGlvbihcIkFkZCBob29rcyB0byBDbGF1ZGUgQ29kZSBzZXR0aW5ncyAoY29uZmlndXJlcyB+Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbilcIilcbiAgLm9wdGlvbihcIi0tZm9yY2VcIiwgXCJPdmVyd3JpdGUgZXhpc3RpbmcgaG9va3MgY29uZmlndXJhdGlvblwiKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiB7IGZvcmNlPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgY29uc3QgY2xhdWRlRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUgfHwgXCJ+XCIsIFwiLmNsYXVkZVwiKTtcbiAgICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4oY2xhdWRlRGlyLCBcInNldHRpbmdzLmpzb25cIik7XG5cbiAgICBjb25zb2xlLmxvZyhcIlxcbiAgQ2xhdWRlIENvZGUgU3luYyAtIFNldHVwXFxuXCIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgcGx1Z2luIGNyZWRlbnRpYWxzIGFyZSBjb25maWd1cmVkXG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIldhcm5pbmc6IFBsdWdpbiBub3QgY29uZmlndXJlZCB5ZXQuXCIpO1xuICAgICAgY29uc29sZS5sb2coXCIgICBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIGZpcnN0IHRvIHNldCB1cCBjcmVkZW50aWFscy5cXG5cIik7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIC5jbGF1ZGUgZGlyZWN0b3J5IGlmIG5lZWRlZFxuICAgIGlmICghZnMuZXhpc3RzU3luYyhjbGF1ZGVEaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoY2xhdWRlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRlZCB+Ly5jbGF1ZGUgZGlyZWN0b3J5XCIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBleGlzdGluZyBzZXR0aW5nc1xuICAgIGxldCBleGlzdGluZ1NldHRpbmdzOiBDbGF1ZGVTZXR0aW5ncyA9IHt9O1xuICAgIGxldCBoYXNFeGlzdGluZ0hvb2tzID0gZmFsc2U7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNldHRpbmdzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgZXhpc3RpbmdTZXR0aW5ncyA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgQ2xhdWRlU2V0dGluZ3M7XG4gICAgICAgIGhhc0V4aXN0aW5nSG9va3MgPSAhIWV4aXN0aW5nU2V0dGluZ3MuaG9va3M7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRm91bmQgZXhpc3Rpbmcgc2V0dGluZ3MuanNvblwiKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLmxvZyhcIldhcm5pbmc6IENvdWxkIG5vdCBwYXJzZSBleGlzdGluZyBzZXR0aW5ncy5qc29uLCB3aWxsIGNyZWF0ZSBuZXcgb25lXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBleGlzdGluZyBob29rc1xuICAgIGlmIChoYXNFeGlzdGluZ0hvb2tzICYmICFvcHRpb25zLmZvcmNlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlxcbkV4aXN0aW5nIGhvb2tzIGNvbmZpZ3VyYXRpb24gZm91bmQuXCIpO1xuICAgICAgY29uc29sZS5sb2coXCIgICBVc2UgLS1mb3JjZSB0byBvdmVyd3JpdGUsIG9yIG1hbnVhbGx5IG1lcmdlIHRoZSBob29rcy5cXG5cIik7XG4gICAgICBjb25zb2xlLmxvZyhcIlRvIG1hbnVhbGx5IGFkZCwgaW5jbHVkZSB0aGVzZSBob29rcyBpbiB5b3VyIHNldHRpbmdzLmpzb246XCIpO1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoQ0xBVURFX0hPT0tTX0NPTkZJRywgbnVsbCwgMikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHNldHRpbmdzXG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5leGlzdGluZ1NldHRpbmdzLFxuICAgICAgLi4uQ0xBVURFX0hPT0tTX0NPTkZJRyxcbiAgICB9O1xuXG4gICAgLy8gV3JpdGUgc2V0dGluZ3NcbiAgICB0cnkge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhzZXR0aW5nc1BhdGgsIEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCBudWxsLCAyKSk7XG4gICAgICBjb25zb2xlLmxvZyhcIlxcbkNsYXVkZSBDb2RlIGhvb2tzIGNvbmZpZ3VyZWQhXCIpO1xuICAgICAgY29uc29sZS5sb2coYCAgIFNldHRpbmdzIGZpbGU6ICR7c2V0dGluZ3NQYXRofWApO1xuICAgICAgY29uc29sZS5sb2coXCJcXG5TZXR1cCBjb21wbGV0ZS4gU2Vzc2lvbnMgd2lsbCBzeW5jIGF1dG9tYXRpY2FsbHkuXFxuXCIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd3JpdGluZyBzZXR0aW5nczpcIiwgZXJyb3IpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJ2ZXJpZnlcIilcbiAgLmRlc2NyaXB0aW9uKFwiVmVyaWZ5IGNyZWRlbnRpYWxzIGFuZCBDbGF1ZGUgQ29kZSBjb25maWd1cmF0aW9uXCIpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiXFxuICBPcGVuU3luYyBTZXR1cCBWZXJpZmljYXRpb25cXG5cIik7XG5cbiAgICAvLyBDaGVjayBjcmVkZW50aWFsc1xuICAgIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoKTtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNyZWRlbnRpYWxzOiBPS1wiKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICBDb252ZXggVVJMOiAke2NvbmZpZy5jb252ZXhVcmx9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgICAgQVBJIEtleTogJHttYXNrQXBpS2V5KGNvbmZpZy5hcGlLZXkpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNyZWRlbnRpYWxzOiBOT1QgQ09ORklHVVJFRFwiKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiICAgUnVuICdjbGF1ZGUtY29kZS1zeW5jIGxvZ2luJyB0byBzZXQgdXBcIik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgQ2xhdWRlIENvZGUgY29uZmlnXG4gICAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUgfHwgXCJ+XCIsIFwiLmNsYXVkZVwiLCBcInNldHRpbmdzLmpzb25cIik7XG4gICAgbGV0IGhvb2tzQ29uZmlndXJlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzZXR0aW5nc1BhdGgsIFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShjb250ZW50KSBhcyBDbGF1ZGVTZXR0aW5ncztcbiAgICAgICAgaG9va3NDb25maWd1cmVkID0gISFzZXR0aW5ncy5ob29rcz8uU2Vzc2lvblN0YXJ0O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElnbm9yZSBwYXJzZSBlcnJvcnNcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhcIlwiKTtcbiAgICBpZiAoaG9va3NDb25maWd1cmVkKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNsYXVkZSBDb2RlIENvbmZpZzogT0tcIik7XG4gICAgICBjb25zb2xlLmxvZyhgICAgQ29uZmlnIGZpbGU6ICR7c2V0dGluZ3NQYXRofWApO1xuICAgICAgY29uc29sZS5sb2coXCIgICBIb29rcyByZWdpc3RlcmVkOiBjbGF1ZGUtY29kZS1zeW5jXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNsYXVkZSBDb2RlIENvbmZpZzogTk9UIENPTkZJR1VSRURcIik7XG4gICAgICBjb25zb2xlLmxvZyhcIiAgIFJ1biAnY2xhdWRlLWNvZGUtc3luYyBzZXR1cCcgdG8gY29uZmlndXJlIGhvb2tzXCIpO1xuICAgIH1cblxuICAgIC8vIFRlc3QgY29ubmVjdGlvbiBpZiBjcmVkZW50aWFscyBleGlzdFxuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxuVGVzdGluZyBjb25uZWN0aW9uLi4uXCIpO1xuICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFN5bmNDbGllbnQoY29uZmlnKTtcbiAgICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IGNsaWVudC50ZXN0Q29ubmVjdGlvbigpO1xuICAgICAgaWYgKGNvbm5lY3RlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkNvbm5lY3Rpb246IE9LXFxuXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJDb25uZWN0aW9uOiBGQUlMRURcXG5cIik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnICYmIGhvb2tzQ29uZmlndXJlZCkge1xuICAgICAgY29uc29sZS5sb2coXCJSZWFkeSEgU3RhcnQgQ2xhdWRlIENvZGUgYW5kIHNlc3Npb25zIHdpbGwgc3luYyBhdXRvbWF0aWNhbGx5LlxcblwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJcIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3luYyBUZXN0IENvbW1hbmQgKHRlc3QgY29ubmVjdGl2aXR5KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwic3luY3Rlc3RcIilcbiAgLmRlc2NyaXB0aW9uKFwiVGVzdCBjb25uZWN0aXZpdHkgYW5kIGNyZWF0ZSBhIHRlc3Qgc2Vzc2lvblwiKVxuICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIlxcbiAgQ2xhdWRlIENvZGUgU3luYyAtIENvbm5lY3Rpb24gVGVzdFxcblwiKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIk5vdCBjb25maWd1cmVkXCIpO1xuICAgICAgY29uc29sZS5sb2coXCIgICBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIHRvIHNldCB1cFxcblwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhcIkNvbmZpZ3VyYXRpb246XCIpO1xuICAgIGNvbnNvbGUubG9nKGAgIENvbnZleCBVUkw6ICR7Y29uZmlnLmNvbnZleFVybH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBBUEkgS2V5OiAgICAke21hc2tBcGlLZXkoY29uZmlnLmFwaUtleSl9YCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIlxcblRlc3RpbmcgY29ubmVjdGlvbi4uLlwiKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgU3luY0NsaWVudChjb25maWcpO1xuICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IGNsaWVudC50ZXN0Q29ubmVjdGlvbigpO1xuXG4gICAgaWYgKGNvbm5lY3RlZCkge1xuICAgICAgY29uc29sZS5sb2coXCJDb25uZWN0aW9uOiBPS1wiKTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGEgdGVzdCBzZXNzaW9uIHRvIHZlcmlmeSBmdWxsIHN5bmMgd29ya3NcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxuQ3JlYXRpbmcgdGVzdCBzZXNzaW9uLi4uXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVzdFNlc3Npb24gPSB7XG4gICAgICAgICAgc2Vzc2lvbklkOiBgdGVzdC0ke0RhdGUubm93KCl9YCxcbiAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIiBhcyBjb25zdCxcbiAgICAgICAgICB0aXRsZTogXCJDb25uZWN0aW9uIFRlc3RcIixcbiAgICAgICAgICBwcm9qZWN0TmFtZTogXCJzeW5jdGVzdFwiLFxuICAgICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgY2xpZW50LnN5bmNTZXNzaW9uKHRlc3RTZXNzaW9uKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJUZXN0IHNlc3Npb24gY3JlYXRlZCBzdWNjZXNzZnVsbHlcIik7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiXFxuU3luYyB0ZXN0IHBhc3NlZC4gUmVhZHkgdG8gc3luYyBDbGF1ZGUgQ29kZSBzZXNzaW9ucy5cXG5cIik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhgVGVzdCBzZXNzaW9uIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJcXG5Db25uZWN0aW9uIHdvcmtzIGJ1dCBzeW5jIG1heSBoYXZlIGlzc3Vlcy5cXG5cIik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJDb25uZWN0aW9uOiBGQUlMRURcIik7XG4gICAgICBjb25zb2xlLmxvZyhcIlxcbkNoZWNrIHlvdXIgQ29udmV4IFVSTCBhbmQgQVBJIGtleS5cXG5cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSG9vayBDb21tYW5kIChmb3IgQ2xhdWRlIENvZGUgaW50ZWdyYXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIFRyYWNrIHNlc3Npb24gc3RhdGUgZm9yIHRpdGxlIGdlbmVyYXRpb24gKGZpcnN0IHVzZXIgcHJvbXB0KVxuY29uc3QgU0VTU0lPTl9TVEFURV9GSUxFID0gcGF0aC5qb2luKFxuICBwcm9jZXNzLmVudi5IT01FIHx8IFwiflwiLFxuICBcIi5jb25maWdcIixcbiAgXCJjbGF1ZGUtY29kZS1zeW5jXCIsXG4gIFwic2Vzc2lvbi1zdGF0ZS5qc29uXCJcbik7XG5cbmludGVyZmFjZSBTZXNzaW9uU3RhdGUge1xuICBbc2Vzc2lvbklkOiBzdHJpbmddOiB7XG4gICAgbW9kZWw/OiBzdHJpbmc7XG4gICAgZmlyc3RQcm9tcHQ/OiBzdHJpbmc7XG4gICAgdG9rZW5Vc2FnZT86IHsgaW5wdXQ6IG51bWJlcjsgb3V0cHV0OiBudW1iZXIgfTtcbiAgICBtZXNzYWdlQ291bnQ/OiBudW1iZXI7XG4gICAgc3luY2VkTWVzc2FnZVV1aWRzPzogU2V0PHN0cmluZz4gfCBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gbG9hZFNlc3Npb25TdGF0ZSgpOiBTZXNzaW9uU3RhdGUge1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKFNFU1NJT05fU1RBVEVfRklMRSkpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhTRVNTSU9OX1NUQVRFX0ZJTEUsIFwidXRmLThcIikpIGFzIFNlc3Npb25TdGF0ZTtcbiAgICAgIC8vIENvbnZlcnQgYXJyYXlzIGJhY2sgdG8gU2V0cyBmb3Igc3luY2VkTWVzc2FnZVV1aWRzXG4gICAgICBmb3IgKGNvbnN0IHNlc3Npb25JZCBvZiBPYmplY3Qua2V5cyhkYXRhKSkge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gZGF0YVtzZXNzaW9uSWRdO1xuICAgICAgICBpZiAoc2Vzc2lvbi5zeW5jZWRNZXNzYWdlVXVpZHMgJiYgQXJyYXkuaXNBcnJheShzZXNzaW9uLnN5bmNlZE1lc3NhZ2VVdWlkcykpIHtcbiAgICAgICAgICBzZXNzaW9uLnN5bmNlZE1lc3NhZ2VVdWlkcyA9IG5ldyBTZXQoc2Vzc2lvbi5zeW5jZWRNZXNzYWdlVXVpZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgfVxuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIHNhdmVTZXNzaW9uU3RhdGUoc3RhdGU6IFNlc3Npb25TdGF0ZSk6IHZvaWQge1xuICB0cnkge1xuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShTRVNTSU9OX1NUQVRFX0ZJTEUpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gQ29udmVydCBTZXRzIHRvIGFycmF5cyBmb3IgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAgY29uc3Qgc2VyaWFsaXphYmxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qgc2Vzc2lvbklkIG9mIE9iamVjdC5rZXlzKHN0YXRlKSkge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IHN0YXRlW3Nlc3Npb25JZF07XG4gICAgICBzZXJpYWxpemFibGVbc2Vzc2lvbklkXSA9IHtcbiAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgc3luY2VkTWVzc2FnZVV1aWRzOiBzZXNzaW9uLnN5bmNlZE1lc3NhZ2VVdWlkcyBpbnN0YW5jZW9mIFNldFxuICAgICAgICAgID8gQXJyYXkuZnJvbShzZXNzaW9uLnN5bmNlZE1lc3NhZ2VVdWlkcylcbiAgICAgICAgICA6IHNlc3Npb24uc3luY2VkTWVzc2FnZVV1aWRzLFxuICAgICAgfTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhTRVNTSU9OX1NUQVRFX0ZJTEUsIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6YWJsZSwgbnVsbCwgMikpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZ25vcmUgZXJyb3JzXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVUaXRsZShwcm9tcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFVzZSBmaXJzdCA4MCBjaGFycyBvZiBmaXJzdCBwcm9tcHQgYXMgdGl0bGUsIHRyaW0gYXQgd29yZCBib3VuZGFyeVxuICBjb25zdCB0cmltbWVkID0gcHJvbXB0LnNsaWNlKDAsIDgwKS50cmltKCk7XG4gIGlmIChwcm9tcHQubGVuZ3RoID4gODApIHtcbiAgICBjb25zdCBsYXN0U3BhY2UgPSB0cmltbWVkLmxhc3RJbmRleE9mKFwiIFwiKTtcbiAgICBpZiAobGFzdFNwYWNlID4gNDApIHtcbiAgICAgIHJldHVybiB0cmltbWVkLnNsaWNlKDAsIGxhc3RTcGFjZSkgKyBcIi4uLlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJpbW1lZCArIFwiLi4uXCI7XG4gIH1cbiAgcmV0dXJuIHRyaW1tZWQ7XG59XG5cbi8vIFBhcnNlIHRyYW5zY3JpcHQgZmlsZSB0byBleHRyYWN0IGFzc2lzdGFudCBtZXNzYWdlcyBhbmQgdG9rZW4gdXNhZ2VcbmludGVyZmFjZSBQYXJzZWRUcmFuc2NyaXB0IHtcbiAgYXNzaXN0YW50TWVzc2FnZXM6IEFycmF5PHtcbiAgICB1dWlkOiBzdHJpbmc7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIG1vZGVsPzogc3RyaW5nO1xuICB9PjtcbiAgdG9rZW5Vc2FnZToge1xuICAgIGlucHV0OiBudW1iZXI7XG4gICAgb3V0cHV0OiBudW1iZXI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHJhbnNjcmlwdEZpbGUodHJhbnNjcmlwdFBhdGg6IHN0cmluZyk6IFBhcnNlZFRyYW5zY3JpcHQge1xuICBjb25zdCByZXN1bHQ6IFBhcnNlZFRyYW5zY3JpcHQgPSB7XG4gICAgYXNzaXN0YW50TWVzc2FnZXM6IFtdLFxuICAgIHRva2VuVXNhZ2U6IHsgaW5wdXQ6IDAsIG91dHB1dDogMCB9LFxuICB9O1xuXG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRyYW5zY3JpcHRQYXRoKSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRyYW5zY3JpcHRQYXRoLCBcInV0Zi04XCIpO1xuICAgIGNvbnN0IGxpbmVzID0gY29udGVudC50cmltKCkuc3BsaXQoXCJcXG5cIik7XG4gICAgY29uc3Qgc2VlblV1aWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGlmICghbGluZS50cmltKCkpIGNvbnRpbnVlO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IEpTT04ucGFyc2UobGluZSkgYXMgVHJhbnNjcmlwdEVudHJ5O1xuXG4gICAgICAgIC8vIE9ubHkgcHJvY2VzcyBhc3Npc3RhbnQgbWVzc2FnZXNcbiAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09IFwiYXNzaXN0YW50XCIgJiYgZW50cnkubWVzc2FnZSkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGVudHJ5Lm1lc3NhZ2U7XG4gICAgICAgICAgY29uc3QgdXVpZCA9IGVudHJ5LnV1aWQgfHwgXCJcIjtcblxuICAgICAgICAgIC8vIFNraXAgaWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgVVVJRCAoZGVkdXApXG4gICAgICAgICAgaWYgKHV1aWQgJiYgc2VlblV1aWRzLmhhcyh1dWlkKSkgY29udGludWU7XG4gICAgICAgICAgaWYgKHV1aWQpIHNlZW5VdWlkcy5hZGQodXVpZCk7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRleHQgY29udGVudCBmcm9tIG1lc3NhZ2VcbiAgICAgICAgICBpZiAobXNnLmNvbnRlbnQgJiYgQXJyYXkuaXNBcnJheShtc2cuY29udGVudCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBtc2cuY29udGVudCkge1xuICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcInRleHRcIiAmJiBwYXJ0LnRleHQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYXNzaXN0YW50TWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICB1dWlkLFxuICAgICAgICAgICAgICAgICAgdGV4dDogcGFydC50ZXh0LFxuICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBlbnRyeS50aW1lc3RhbXAgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgbW9kZWw6IG1zZy5tb2RlbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFjY3VtdWxhdGUgdG9rZW4gdXNhZ2UgZnJvbSBhbGwgYXNzaXN0YW50IG1lc3NhZ2VzXG4gICAgICAgICAgaWYgKG1zZy51c2FnZSkge1xuICAgICAgICAgICAgcmVzdWx0LnRva2VuVXNhZ2UuaW5wdXQgKz1cbiAgICAgICAgICAgICAgKG1zZy51c2FnZS5pbnB1dF90b2tlbnMgfHwgMCkgK1xuICAgICAgICAgICAgICAobXNnLnVzYWdlLmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zIHx8IDApICtcbiAgICAgICAgICAgICAgKG1zZy51c2FnZS5jYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMgfHwgMCk7XG4gICAgICAgICAgICByZXN1bHQudG9rZW5Vc2FnZS5vdXRwdXQgKz0gbXNnLnVzYWdlLm91dHB1dF90b2tlbnMgfHwgMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTa2lwIG1hbGZvcm1lZCBsaW5lc1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gUmV0dXJuIGVtcHR5IHJlc3VsdCBvbiBlcnJvclxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxucHJvZ3JhbVxuICAuY29tbWFuZChcImhvb2sgPGV2ZW50PlwiKVxuICAuZGVzY3JpcHRpb24oXCJIYW5kbGUgQ2xhdWRlIENvZGUgaG9vayBldmVudHMgKHJlYWRzIHN0ZGluKVwiKVxuICAuYWN0aW9uKGFzeW5jIChldmVudDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIC8vIEV4aXQgc2lsZW50bHkgaWYgbm90IGNvbmZpZ3VyZWQgKGRvbid0IGJsb2NrIENsYXVkZSBDb2RlKVxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuYXV0b1N5bmMgPT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuXG4gICAgLy8gUmVhZCBKU09OIGlucHV0IGZyb20gc3RkaW5cbiAgICBsZXQgaW5wdXQgPSBcIlwiO1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcHJvY2Vzcy5zdGRpbikge1xuICAgICAgaW5wdXQgKz0gY2h1bms7XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC50cmltKCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFN5bmNDbGllbnQoY29uZmlnKTtcbiAgICAgIGNvbnN0IHNlc3Npb25TdGF0ZSA9IGxvYWRTZXNzaW9uU3RhdGUoKTtcblxuICAgICAgc3dpdGNoIChldmVudCkge1xuICAgICAgICBjYXNlIFwiU2Vzc2lvblN0YXJ0XCI6IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShpbnB1dCkgYXMgSG9va1Nlc3Npb25TdGFydERhdGE7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSBzZXNzaW9uIHN0YXRlXG4gICAgICAgICAgc2Vzc2lvblN0YXRlW2RhdGEuc2Vzc2lvbl9pZF0gPSB7XG4gICAgICAgICAgICBtb2RlbDogZGF0YS5tb2RlbCxcbiAgICAgICAgICAgIHRva2VuVXNhZ2U6IHsgaW5wdXQ6IDAsIG91dHB1dDogMCB9LFxuICAgICAgICAgICAgbWVzc2FnZUNvdW50OiAwLFxuICAgICAgICAgIH07XG4gICAgICAgICAgc2F2ZVNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHNlc3Npb246IFNlc3Npb25EYXRhID0ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBkYXRhLnNlc3Npb25faWQsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgICAgIGN3ZDogZGF0YS5jd2QsXG4gICAgICAgICAgICBtb2RlbDogZGF0YS5tb2RlbCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25Nb2RlOiBkYXRhLnBlcm1pc3Npb25fbW9kZSxcbiAgICAgICAgICAgIHRoaW5raW5nRW5hYmxlZDogZGF0YS50aGlua2luZ19lbmFibGVkLFxuICAgICAgICAgICAgbWNwU2VydmVyczogZGF0YS5tY3Bfc2VydmVycyxcbiAgICAgICAgICAgIHN0YXJ0VHlwZTogZGF0YS5zb3VyY2UgPT09IFwic3RhcnR1cFwiID8gXCJuZXdcIiA6IChkYXRhLnNvdXJjZSBhcyBTZXNzaW9uRGF0YVtcInN0YXJ0VHlwZVwiXSksXG4gICAgICAgICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIHByb2plY3RQYXRoOiBkYXRhLmN3ZCxcbiAgICAgICAgICAgIHByb2plY3ROYW1lOiBkYXRhLmN3ZCA/IGRhdGEuY3dkLnNwbGl0KFwiL1wiKS5wb3AoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IGNsaWVudC5zeW5jU2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgXCJTZXNzaW9uRW5kXCI6IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShpbnB1dCkgYXMgSG9va1Nlc3Npb25FbmREYXRhO1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gc2Vzc2lvblN0YXRlW2RhdGEuc2Vzc2lvbl9pZF0gfHwge307XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIGZpbmFsIHRva2VuIHVzYWdlXG4gICAgICAgICAgY29uc3QgZmluYWxUb2tlblVzYWdlID0gZGF0YS50b3RhbF90b2tlbl91c2FnZSB8fCBzdGF0ZS50b2tlblVzYWdlO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHNlc3Npb246IFNlc3Npb25EYXRhID0ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBkYXRhLnNlc3Npb25faWQsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgICAgIHRpdGxlOiBzdGF0ZS5maXJzdFByb21wdCA/IGdlbmVyYXRlVGl0bGUoc3RhdGUuZmlyc3RQcm9tcHQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW5kUmVhc29uOiBkYXRhLnJlYXNvbixcbiAgICAgICAgICAgIG1lc3NhZ2VDb3VudDogZGF0YS5tZXNzYWdlX2NvdW50IHx8IHN0YXRlLm1lc3NhZ2VDb3VudCxcbiAgICAgICAgICAgIHRvb2xDYWxsQ291bnQ6IGRhdGEudG9vbF9jYWxsX2NvdW50LFxuICAgICAgICAgICAgdG9rZW5Vc2FnZTogZmluYWxUb2tlblVzYWdlLFxuICAgICAgICAgICAgY29zdEVzdGltYXRlOiBkYXRhLmNvc3RfZXN0aW1hdGUsXG4gICAgICAgICAgICBlbmRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCBjbGllbnQuc3luY1Nlc3Npb24oc2Vzc2lvbik7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ2xlYW4gdXAgc2Vzc2lvbiBzdGF0ZVxuICAgICAgICAgIGRlbGV0ZSBzZXNzaW9uU3RhdGVbZGF0YS5zZXNzaW9uX2lkXTtcbiAgICAgICAgICBzYXZlU2Vzc2lvblN0YXRlKHNlc3Npb25TdGF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFwiVXNlclByb21wdFN1Ym1pdFwiOiB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoaW5wdXQpIGFzIEhvb2tVc2VyUHJvbXB0RGF0YTtcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNlc3Npb25TdGF0ZVtkYXRhLnNlc3Npb25faWRdIHx8IHt9O1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFRyYWNrIGZpcnN0IHByb21wdCBmb3IgdGl0bGUgZ2VuZXJhdGlvblxuICAgICAgICAgIGlmICghc3RhdGUuZmlyc3RQcm9tcHQpIHtcbiAgICAgICAgICAgIHN0YXRlLmZpcnN0UHJvbXB0ID0gZGF0YS5wcm9tcHQ7XG4gICAgICAgICAgICBzZXNzaW9uU3RhdGVbZGF0YS5zZXNzaW9uX2lkXSA9IHN0YXRlO1xuICAgICAgICAgICAgc2F2ZVNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBVcGRhdGUgc2Vzc2lvbiB3aXRoIHRpdGxlXG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uOiBTZXNzaW9uRGF0YSA9IHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkOiBkYXRhLnNlc3Npb25faWQsXG4gICAgICAgICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiLFxuICAgICAgICAgICAgICB0aXRsZTogZ2VuZXJhdGVUaXRsZShkYXRhLnByb21wdCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgY2xpZW50LnN5bmNTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBJbmNyZW1lbnQgbWVzc2FnZSBjb3VudFxuICAgICAgICAgIHN0YXRlLm1lc3NhZ2VDb3VudCA9IChzdGF0ZS5tZXNzYWdlQ291bnQgfHwgMCkgKyAxO1xuICAgICAgICAgIHNlc3Npb25TdGF0ZVtkYXRhLnNlc3Npb25faWRdID0gc3RhdGU7XG4gICAgICAgICAgc2F2ZVNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VEYXRhID0ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBkYXRhLnNlc3Npb25faWQsXG4gICAgICAgICAgICBtZXNzYWdlSWQ6IGAke2RhdGEuc2Vzc2lvbl9pZH0tdXNlci0ke0RhdGUubm93KCl9YCxcbiAgICAgICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiLFxuICAgICAgICAgICAgcm9sZTogXCJ1c2VyXCIsXG4gICAgICAgICAgICBjb250ZW50OiBkYXRhLnByb21wdCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogZGF0YS50aW1lc3RhbXAgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgY2xpZW50LnN5bmNNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBcIlBvc3RUb29sVXNlXCI6IHtcbiAgICAgICAgICBpZiAoIWNvbmZpZy5zeW5jVG9vbENhbGxzKSBicmVhaztcbiAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShpbnB1dCkgYXMgSG9va1Rvb2xVc2VEYXRhO1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gc2Vzc2lvblN0YXRlW2RhdGEuc2Vzc2lvbl9pZF0gfHwge307XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbWVzc2FnZTogTWVzc2FnZURhdGEgPSB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IGRhdGEuc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogZGF0YS50b29sX3VzZV9pZCB8fCBgJHtkYXRhLnNlc3Npb25faWR9LXRvb2wtJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgICAgICB0b29sTmFtZTogZGF0YS50b29sX25hbWUsXG4gICAgICAgICAgICB0b29sQXJnczogZGF0YS50b29sX2lucHV0LFxuICAgICAgICAgICAgdG9vbFJlc3VsdDogZGF0YS50b29sX3Jlc3VsdD8ub3V0cHV0IHx8IGRhdGEudG9vbF9yZXN1bHQ/LmVycm9yLFxuICAgICAgICAgICAgZHVyYXRpb25NczogZGF0YS5kdXJhdGlvbl9tcyxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgY2xpZW50LnN5bmNNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBcIlN0b3BcIjoge1xuICAgICAgICAgIC8vIFN0b3AgZXZlbnQgcHJvdmlkZXMgdHJhbnNjcmlwdF9wYXRoIC0gd2UgcmVhZCBpdCB0byBnZXQgbWVzc2FnZXMgYW5kIHRva2Vuc1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGlucHV0KSBhcyBIb29rU3RvcERhdGE7XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXNzaW9uU3RhdGVbZGF0YS5zZXNzaW9uX2lkXSB8fCB7fTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBQYXJzZSB0cmFuc2NyaXB0IGZpbGUgdG8gZXh0cmFjdCBhc3Npc3RhbnQgbWVzc2FnZXMgYW5kIHRva2VuIHVzYWdlXG4gICAgICAgICAgaWYgKGRhdGEudHJhbnNjcmlwdF9wYXRoKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2NyaXB0ID0gcGFyc2VUcmFuc2NyaXB0RmlsZShkYXRhLnRyYW5zY3JpcHRfcGF0aCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0b2tlbiB1c2FnZSBmcm9tIHRyYW5zY3JpcHRcbiAgICAgICAgICAgIGlmICh0cmFuc2NyaXB0LnRva2VuVXNhZ2UuaW5wdXQgPiAwIHx8IHRyYW5zY3JpcHQudG9rZW5Vc2FnZS5vdXRwdXQgPiAwKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnRva2VuVXNhZ2UgPSB0cmFuc2NyaXB0LnRva2VuVXNhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFRyYWNrIHdoaWNoIG1lc3NhZ2VzIHdlJ3ZlIGFscmVhZHkgc3luY2VkIHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgIGNvbnN0IHN5bmNlZE1lc3NhZ2VzID0gc3RhdGUuc3luY2VkTWVzc2FnZVV1aWRzIGluc3RhbmNlb2YgU2V0XG4gICAgICAgICAgICAgID8gc3RhdGUuc3luY2VkTWVzc2FnZVV1aWRzXG4gICAgICAgICAgICAgIDogbmV3IFNldDxzdHJpbmc+KEFycmF5LmlzQXJyYXkoc3RhdGUuc3luY2VkTWVzc2FnZVV1aWRzKSA/IHN0YXRlLnN5bmNlZE1lc3NhZ2VVdWlkcyA6IFtdKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU3luYyBuZXcgYXNzaXN0YW50IG1lc3NhZ2VzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiB0cmFuc2NyaXB0LmFzc2lzdGFudE1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgaWYgd2UndmUgYWxyZWFkeSBzeW5jZWQgdGhpcyBtZXNzYWdlXG4gICAgICAgICAgICAgIGlmIChtc2cudXVpZCAmJiBzeW5jZWRNZXNzYWdlcy5oYXMobXNnLnV1aWQpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgaWYgKG1zZy51dWlkKSBzeW5jZWRNZXNzYWdlcy5hZGQobXNnLnV1aWQpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IG1lc3NhZ2UgY291bnRcbiAgICAgICAgICAgICAgc3RhdGUubWVzc2FnZUNvdW50ID0gKHN0YXRlLm1lc3NhZ2VDb3VudCB8fCAwKSArIDE7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlOiBNZXNzYWdlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IGRhdGEuc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IG1zZy51dWlkIHx8IGAke2RhdGEuc2Vzc2lvbl9pZH0tYXNzaXN0YW50LSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiLFxuICAgICAgICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgICAgICAgICAgY29udGVudDogbXNnLnRleHQsXG4gICAgICAgICAgICAgICAgbW9kZWw6IG1zZy5tb2RlbCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG1zZy50aW1lc3RhbXAsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zeW5jTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU3RvcmUgc3luY2VkIG1lc3NhZ2UgVVVJRHMgKGNvbnZlcnQgU2V0IHRvIGFycmF5IGZvciBKU09OKVxuICAgICAgICAgICAgc3RhdGUuc3luY2VkTWVzc2FnZVV1aWRzID0gc3luY2VkTWVzc2FnZXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHNlc3Npb25TdGF0ZVtkYXRhLnNlc3Npb25faWRdID0gc3RhdGU7XG4gICAgICAgICAgc2F2ZVNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVwZGF0ZSBzZXNzaW9uIHdpdGggdG9rZW4gdXNhZ2UgZnJvbSB0cmFuc2NyaXB0XG4gICAgICAgICAgY29uc3Qgc2Vzc2lvbjogU2Vzc2lvbkRhdGEgPSB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IGRhdGEuc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiLFxuICAgICAgICAgICAgdG9rZW5Vc2FnZTogc3RhdGUudG9rZW5Vc2FnZSxcbiAgICAgICAgICAgIG1lc3NhZ2VDb3VudDogc3RhdGUubWVzc2FnZUNvdW50LFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgY2xpZW50LnN5bmNTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBVbmtub3duIGV2ZW50LCBpZ25vcmVcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgdG8gc3RkZXJyIGJ1dCBkb24ndCBibG9jayBDbGF1ZGUgQ29kZVxuICAgICAgY29uc29sZS5lcnJvcihgW2NsYXVkZS1jb2RlLXN5bmNdIEVycm9yOiAke2Vycm9yfWApO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgfSk7XG5cbi8vIFBhcnNlIGFuZCBydW5cbnByb2dyYW0ucGFyc2UoKTtcbiJdfQ==
949
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHlDQUFvQztBQUNwQyxtREFBcUM7QUFDckMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixtQ0FRaUI7QUEyR2pCLHNEQUFzRDtBQUN0RCw0Q0FBNEM7QUFDNUMsTUFBTSxhQUFhLEdBQTZGO0lBQzlHLDBCQUEwQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTtJQUM3Rix3QkFBd0IsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7SUFDN0YsMEJBQTBCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0lBQy9GLDRCQUE0QixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTtJQUMvRix3QkFBd0IsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7SUFDN0YsMkJBQTJCLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0NBQzlGLENBQUM7QUFFRixzRUFB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U3luYyBDTElcbiAqXG4gKiBDb21tYW5kczpcbiAqICAgbG9naW4gICAtIENvbmZpZ3VyZSBDb252ZXggVVJMIGFuZCBBUEkgS2V5XG4gKiAgIGxvZ291dCAgLSBDbGVhciBzdG9yZWQgY3JlZGVudGlhbHNcbiAqICAgc3RhdHVzICAtIFNob3cgY29ubmVjdGlvbiBzdGF0dXNcbiAqICAgY29uZmlnICAtIFNob3cgY3VycmVudCBjb25maWd1cmF0aW9uXG4gKi9cblxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gXCJyZWFkbGluZVwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge1xuICBsb2FkQ29uZmlnLFxuICBzYXZlQ29uZmlnLFxuICBjbGVhckNvbmZpZyxcbiAgU3luY0NsaWVudCxcbiAgQ29uZmlnLFxuICBTZXNzaW9uRGF0YSxcbiAgTWVzc2FnZURhdGEsXG59IGZyb20gXCIuL2luZGV4XCI7XG5cbi8vIFR5cGVzIGZvciBDbGF1ZGUgQ29kZSBob29rIGV2ZW50IGRhdGEgZnJvbSBzdGRpblxuaW50ZXJmYWNlIEhvb2tTZXNzaW9uU3RhcnREYXRhIHtcbiAgc2Vzc2lvbl9pZDogc3RyaW5nO1xuICB0cmFuc2NyaXB0X3BhdGg/OiBzdHJpbmc7XG4gIGN3ZD86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25fbW9kZT86IHN0cmluZztcbiAgc291cmNlPzogc3RyaW5nO1xuICB0aGlua2luZ19lbmFibGVkPzogYm9vbGVhbjtcbiAgbWNwX3NlcnZlcnM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEhvb2tTZXNzaW9uRW5kRGF0YSB7XG4gIHNlc3Npb25faWQ6IHN0cmluZztcbiAgdHJhbnNjcmlwdF9wYXRoPzogc3RyaW5nO1xuICBjd2Q/OiBzdHJpbmc7XG4gIHJlYXNvbj86IHN0cmluZztcbiAgbWVzc2FnZV9jb3VudD86IG51bWJlcjtcbiAgdG9vbF9jYWxsX2NvdW50PzogbnVtYmVyO1xuICB0b3RhbF90b2tlbl91c2FnZT86IHtcbiAgICBpbnB1dDogbnVtYmVyO1xuICAgIG91dHB1dDogbnVtYmVyO1xuICB9O1xuICBjb3N0X2VzdGltYXRlPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSG9va1VzZXJQcm9tcHREYXRhIHtcbiAgc2Vzc2lvbl9pZDogc3RyaW5nO1xuICBwcm9tcHQ6IHN0cmluZztcbiAgdGltZXN0YW1wPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSG9va1Rvb2xVc2VEYXRhIHtcbiAgc2Vzc2lvbl9pZDogc3RyaW5nO1xuICB0b29sX25hbWU6IHN0cmluZztcbiAgdG9vbF91c2VfaWQ/OiBzdHJpbmc7XG4gIHRvb2xfaW5wdXQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdG9vbF9yZXN1bHQ/OiB7XG4gICAgb3V0cHV0Pzogc3RyaW5nO1xuICAgIGVycm9yPzogc3RyaW5nO1xuICB9O1xuICBkdXJhdGlvbl9tcz86IG51bWJlcjtcbiAgc3VjY2Vzcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBIb29rU3RvcERhdGEge1xuICBzZXNzaW9uX2lkOiBzdHJpbmc7XG4gIHRyYW5zY3JpcHRfcGF0aD86IHN0cmluZztcbiAgc3RvcF9ob29rX2FjdGl2ZT86IGJvb2xlYW47XG4gIHBlcm1pc3Npb25fbW9kZT86IHN0cmluZztcbiAgY3dkPzogc3RyaW5nO1xuICBob29rX2V2ZW50X25hbWU/OiBzdHJpbmc7XG59XG5cbi8vIFR5cGVzIGZvciBDbGF1ZGUgQ29kZSB0cmFuc2NyaXB0IEpTT05MIGVudHJpZXNcbmludGVyZmFjZSBUcmFuc2NyaXB0VXNhZ2Uge1xuICBpbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gIG91dHB1dF90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBUcmFuc2NyaXB0Q29udGVudFBhcnQge1xuICB0eXBlOiBcInRleHRcIiB8IFwidGhpbmtpbmdcIiB8IFwidG9vbF91c2VcIiB8IFwidG9vbF9yZXN1bHRcIjtcbiAgdGV4dD86IHN0cmluZztcbiAgdGhpbmtpbmc/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICBpbnB1dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgVHJhbnNjcmlwdE1lc3NhZ2Uge1xuICBjb250ZW50PzogVHJhbnNjcmlwdENvbnRlbnRQYXJ0W107XG4gIHVzYWdlPzogVHJhbnNjcmlwdFVzYWdlO1xuICBtb2RlbD86IHN0cmluZztcbiAgc3RvcF9yZWFzb24/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgVHJhbnNjcmlwdEVudHJ5IHtcbiAgdHlwZT86IHN0cmluZztcbiAgdXVpZD86IHN0cmluZztcbiAgdGltZXN0YW1wPzogc3RyaW5nO1xuICBtZXNzYWdlPzogVHJhbnNjcmlwdE1lc3NhZ2U7XG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgcGFyZW50VXVpZD86IHN0cmluZztcbiAgY3dkPzogc3RyaW5nO1xuICBzbHVnPzogc3RyaW5nO1xufVxuXG4vLyBFeHRlbmRlZCBzdGF0cyBmcm9tIHRyYW5zY3JpcHQgcGFyc2luZyAoaW5jbHVkZXMgY2FjaGUgdG9rZW5zIGFuZCBkdXJhdGlvbilcbmludGVyZmFjZSBUcmFuc2NyaXB0U3RhdHMge1xuICBtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uVG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlUmVhZFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgbWVzc2FnZUNvdW50OiBudW1iZXI7XG4gIHRvb2xDYWxsQ291bnQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY3dkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHN0YXJ0ZWRBdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlbmRlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGR1cmF0aW9uTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbn1cblxuLy8gUHJpY2luZyBwZXIgbWlsbGlvbiB0b2tlbnMgKFVTRCkgd2l0aCBjYWNoZSBwcmljaW5nXG4vLyBTb3VyY2U6IGh0dHBzOi8vd3d3LmFudGhyb3BpYy5jb20vcHJpY2luZ1xuY29uc3QgTU9ERUxfUFJJQ0lORzogUmVjb3JkPHN0cmluZywgeyBpbnB1dDogbnVtYmVyOyBvdXRwdXQ6IG51bWJlcjsgY2FjaGVXcml0ZTogbnVtYmVyOyBjYWNoZVJlYWQ6IG51bWJlciB9PiA9IHtcbiAgXCJjbGF1ZGUtc29ubmV0LTQtMjAyNTA1MTRcIjogeyBpbnB1dDogMy4wMCwgb3V0cHV0OiAxNS4wMCwgY2FjaGVXcml0ZTogMy43NSwgY2FjaGVSZWFkOiAwLjMwIH0sXG4gIFwiY2xhdWRlLW9wdXMtNC0yMDI1MDUxNFwiOiB7IGlucHV0OiAxNS4wMCwgb3V0cHV0OiA3NS4wMCwgY2FjaGVXcml0ZTogMTguNzUsIGNhY2hlUmVhZDogMS41MCB9LFxuICBcImNsYXVkZS1vcHVzLTQtNS0yMDI1MTEwMVwiOiB7IGlucHV0OiAxNS4wMCwgb3V0cHV0OiA3NS4wMCwgY2FjaGVXcml0ZTogMTguNzUsIGNhY2hlUmVhZDogMS41MCB9LFxuICBcImNsYXVkZS0zLTUtc29ubmV0LTIwMjQxMDIyXCI6IHsgaW5wdXQ6IDMuMDAsIG91dHB1dDogMTUuMDAsIGNhY2hlV3JpdGU6IDMuNzUsIGNhY2hlUmVhZDogMC4zMCB9LFxuICBcImNsYXVkZS0zLW9wdXMtMjAyNDAyMjlcIjogeyBpbnB1dDogMTUuMDAsIG91dHB1dDogNzUuMDAsIGNhY2hlV3JpdGU6IDE4Ljc1LCBjYWNoZVJlYWQ6IDEuNTAgfSxcbiAgXCJjbGF1ZGUtMy01LWhhaWt1LTIwMjQxMDIyXCI6IHsgaW5wdXQ6IDAuODAsIG91dHB1dDogNC4wMCwgY2FjaGVXcml0ZTogMS4wMCwgY2FjaGVSZWFkOiAwLjA4IH0sXG59O1xuXG4vLyBDYWxjdWxhdGUgY29zdCBmcm9tIG1vZGVsIGFuZCB0b2tlbiB1c2FnZSB3aXRoIHByb3BlciBjYWNoZSBwcmljaW5nXG5mdW5jdGlvbiBjYWxjdWxhdGVDb3N0KG1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YXRzOiBUcmFuc2NyaXB0U3RhdHMpOiBudW1iZXIge1xuICBpZiAoIW1vZGVsKSByZXR1cm4gMDtcblxuICAvLyBUcnkgZXhhY3QgbWF0Y2ggZmlyc3RcbiAgbGV0IHByaWNpbmcgPSBNT0RFTF9QUklDSU5HW21vZGVsXTtcblxuICAvLyBUcnkgcGFydGlhbCBtYXRjaCBpZiBleGFjdCBtYXRjaCBmYWlsc1xuICBpZiAoIXByaWNpbmcpIHtcbiAgICBjb25zdCBtYXRjaGluZ0tleSA9IE9iamVjdC5rZXlzKE1PREVMX1BSSUNJTkcpLmZpbmQoayA9PiBtb2RlbC5pbmNsdWRlcyhrKSB8fCBrLmluY2x1ZGVzKG1vZGVsKSk7XG4gICAgaWYgKG1hdGNoaW5nS2V5KSB7XG4gICAgICBwcmljaW5nID0gTU9ERUxfUFJJQ0lOR1ttYXRjaGluZ0tleV07XG4gICAgfVxuICB9XG5cbiAgaWYgKCFwcmljaW5nKSByZXR1cm4gMDtcblxuICAvLyBDYWxjdWxhdGUgY29zdCB3aXRoIHByb3BlciBjYWNoZSBwcmljaW5nXG4gIGNvbnN0IGlucHV0Q29zdCA9IHN0YXRzLmlucHV0VG9rZW5zICogcHJpY2luZy5pbnB1dDtcbiAgY29uc3QgY2FjaGVXcml0ZUNvc3QgPSBzdGF0cy5jYWNoZUNyZWF0aW9uVG9rZW5zICogcHJpY2luZy5jYWNoZVdyaXRlO1xuICBjb25zdCBjYWNoZVJlYWRDb3N0ID0gc3RhdHMuY2FjaGVSZWFkVG9rZW5zICogcHJpY2luZy5jYWNoZVJlYWQ7XG4gIGNvbnN0IG91dHB1dENvc3QgPSBzdGF0cy5vdXRwdXRUb2tlbnMgKiBwcmljaW5nLm91dHB1dDtcblxuICByZXR1cm4gKGlucHV0Q29zdCArIGNhY2hlV3JpdGVDb3N0ICsgY2FjaGVSZWFkQ29zdCArIG91dHB1dENvc3QpIC8gMV8wMDBfMDAwO1xufVxuXG4vLyBUeXBlcyBmb3IgQ2xhdWRlIENvZGUgc2V0dGluZ3MuanNvblxuaW50ZXJmYWNlIENsYXVkZVNldHRpbmdzIHtcbiAgaG9va3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gVHlwZSBmb3IgcGFja2FnZS5qc29uIHZlcnNpb24gZmllbGRcbmludGVyZmFjZSBQYWNrYWdlSnNvbiB7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8vIFJlYWQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBrZ1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwicGFja2FnZS5qc29uXCIpO1xuICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBrZ1BhdGgsIFwidXRmLThcIikpIGFzIFBhY2thZ2VKc29uO1xuICAgIHJldHVybiBwa2cudmVyc2lvbiB8fCBcIjAuMC4wXCI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcIjAuMC4wXCI7XG4gIH1cbn1cblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoXCJjbGF1ZGUtY29kZS1zeW5jXCIpXG4gIC5kZXNjcmlwdGlvbihcIlN5bmMgQ2xhdWRlIENvZGUgc2Vzc2lvbnMgdG8gT3BlblN5bmMgZGFzaGJvYXJkXCIpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhlbHBlciBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcHJvbXB0KHF1ZXN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmwucXVlc3Rpb24ocXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWFza0FwaUtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChrZXkubGVuZ3RoIDw9IDgpIHJldHVybiBcIioqKipcIjtcbiAgcmV0dXJuIGtleS5zdWJzdHJpbmcoMCwgNCkgKyBcIioqKipcIiArIGtleS5zdWJzdHJpbmcoa2V5Lmxlbmd0aCAtIDQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb21tYW5kc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwibG9naW5cIilcbiAgLmRlc2NyaXB0aW9uKFwiQ29uZmlndXJlIENvbnZleCBVUkwgYW5kIEFQSSBLZXlcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJcXG4gIENsYXVkZSBDb2RlIFN5bmMgLSBMb2dpblxcblwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkdldCB5b3VyIEFQSSBrZXkgZnJvbSB5b3VyIE9wZW5TeW5jLmRldiBTZXR0aW5ncyBwYWdlLCBzdGFydHMgd2l0aCBvc2tfLiBFbnRlciBpdCBoZXJlOlwiKTtcbiAgICBjb25zb2xlLmxvZyhcIiAgMS4gR28gdG8gU2V0dGluZ3NcIik7XG4gICAgY29uc29sZS5sb2coXCIgIDIuIENsaWNrICdHZW5lcmF0ZSBBUEkgS2V5J1wiKTtcbiAgICBjb25zb2xlLmxvZyhcIiAgMy4gQ29weSB0aGUga2V5IChzdGFydHMgd2l0aCBvc2tfKVxcblwiKTtcblxuICAgIGNvbnN0IGNvbnZleFVybCA9IGF3YWl0IHByb21wdChcIkNvbnZleCBVUkwgKGUuZy4sIGh0dHBzOi8veW91ci1wcm9qZWN0LmNvbnZleC5jbG91ZCk6IFwiKTtcblxuICAgIGlmICghY29udmV4VXJsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IENvbnZleCBVUkwgaXMgcmVxdWlyZWRcIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKCFjb252ZXhVcmwuaW5jbHVkZXMoXCJjb252ZXguY2xvdWRcIikgJiYgIWNvbnZleFVybC5pbmNsdWRlcyhcImNvbnZleC5zaXRlXCIpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IEludmFsaWQgQ29udmV4IFVSTC4gTXVzdCBjb250YWluIGNvbnZleC5jbG91ZCBvciBjb252ZXguc2l0ZVwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlLZXkgPSBhd2FpdCBwcm9tcHQoXCJBUEkgS2V5IChvc2tfLi4uKTogXCIpO1xuXG4gICAgaWYgKCFhcGlLZXkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogQVBJIEtleSBpcyByZXF1aXJlZFwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleS5zdGFydHNXaXRoKFwib3NrX1wiKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOiBJbnZhbGlkIEFQSSBLZXkuIE11c3Qgc3RhcnQgd2l0aCBvc2tfXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogQ29uZmlnID0ge1xuICAgICAgY29udmV4VXJsLFxuICAgICAgYXBpS2V5LFxuICAgICAgYXV0b1N5bmM6IHRydWUsXG4gICAgICBzeW5jVG9vbENhbGxzOiB0cnVlLFxuICAgICAgc3luY1RoaW5raW5nOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gVGVzdCBjb25uZWN0aW9uXG4gICAgY29uc29sZS5sb2coXCJcXG5UZXN0aW5nIGNvbm5lY3Rpb24uLi5cIik7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFN5bmNDbGllbnQoY29uZmlnKTtcbiAgICBjb25zdCBjb25uZWN0ZWQgPSBhd2FpdCBjbGllbnQudGVzdENvbm5lY3Rpb24oKTtcblxuICAgIGlmICghY29ubmVjdGVkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIENvbnZleCBiYWNrZW5kXCIpO1xuICAgICAgY29uc29sZS5lcnJvcihcIiAgIENoZWNrIHlvdXIgVVJMIGFuZCB0cnkgYWdhaW5cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSBjb25maWdcbiAgICBzYXZlQ29uZmlnKGNvbmZpZyk7XG4gICAgY29uc29sZS5sb2coXCJcXG5Db25maWd1cmF0aW9uIHNhdmVkIVwiKTtcbiAgICBjb25zb2xlLmxvZyhgICAgVVJMOiAke2NvbnZleFVybH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICAgS2V5OiAke21hc2tBcGlLZXkoYXBpS2V5KX1gKTtcbiAgICBjb25zb2xlLmxvZyhcIlxcbk5leHQgc3RlcDogUnVuIHRoZSBzZXR1cCBjb21tYW5kIHRvIGNvbmZpZ3VyZSBDbGF1ZGUgQ29kZSBob29rczpcXG5cIik7XG4gICAgY29uc29sZS5sb2coXCIgICBjbGF1ZGUtY29kZS1zeW5jIHNldHVwXFxuXCIpO1xuICB9KTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcImxvZ291dFwiKVxuICAuZGVzY3JpcHRpb24oXCJDbGVhciBzdG9yZWQgY3JlZGVudGlhbHNcIilcbiAgLmFjdGlvbigoKSA9PiB7XG4gICAgY2xlYXJDb25maWcoKTtcbiAgICBjb25zb2xlLmxvZyhcIkNyZWRlbnRpYWxzIGNsZWFyZWRcIik7XG4gIH0pO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwic3RhdHVzXCIpXG4gIC5kZXNjcmlwdGlvbihcIlNob3cgY29ubmVjdGlvbiBzdGF0dXNcIilcbiAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuXG4gICAgY29uc29sZS5sb2coXCJcXG4gIENsYXVkZSBDb2RlIFN5bmMgLSBTdGF0dXNcXG5cIik7XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgY29uc29sZS5sb2coXCJOb3QgY29uZmlndXJlZFwiKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiICAgUnVuICdjbGF1ZGUtY29kZS1zeW5jIGxvZ2luJyB0byBzZXQgdXBcXG5cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXCJDb25maWd1cmF0aW9uOlwiKTtcbiAgICBjb25zb2xlLmxvZyhgICBDb252ZXggVVJMOiAke2NvbmZpZy5jb252ZXhVcmx9YCk7XG4gICAgY29uc29sZS5sb2coYCAgQVBJIEtleTogICAgJHttYXNrQXBpS2V5KGNvbmZpZy5hcGlLZXkpfWApO1xuICAgIGNvbnNvbGUubG9nKGAgIEF1dG8gU3luYzogICR7Y29uZmlnLmF1dG9TeW5jICE9PSBmYWxzZSA/IFwiZW5hYmxlZFwiIDogXCJkaXNhYmxlZFwifWApO1xuICAgIGNvbnNvbGUubG9nKGAgIFRvb2wgQ2FsbHM6ICR7Y29uZmlnLnN5bmNUb29sQ2FsbHMgIT09IGZhbHNlID8gXCJlbmFibGVkXCIgOiBcImRpc2FibGVkXCJ9YCk7XG4gICAgY29uc29sZS5sb2coYCAgVGhpbmtpbmc6ICAgJHtjb25maWcuc3luY1RoaW5raW5nID8gXCJlbmFibGVkXCIgOiBcImRpc2FibGVkXCJ9YCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIlxcblRlc3RpbmcgY29ubmVjdGlvbi4uLlwiKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgU3luY0NsaWVudChjb25maWcpO1xuICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IGNsaWVudC50ZXN0Q29ubmVjdGlvbigpO1xuXG4gICAgaWYgKGNvbm5lY3RlZCkge1xuICAgICAgY29uc29sZS5sb2coXCJDb25uZWN0ZWQgdG8gQ29udmV4IGJhY2tlbmRcXG5cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3I6IENvdWxkIG5vdCBjb25uZWN0IHRvIENvbnZleCBiYWNrZW5kXFxuXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJjb25maWdcIilcbiAgLmRlc2NyaXB0aW9uKFwiU2hvdyBjdXJyZW50IGNvbmZpZ3VyYXRpb25cIilcbiAgLm9wdGlvbihcIi0tanNvblwiLCBcIk91dHB1dCBhcyBKU09OXCIpXG4gIC5hY3Rpb24oKG9wdGlvbnM6IHsganNvbj86IGJvb2xlYW4gfSkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgY29uZmlndXJlZDogZmFsc2UgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJOb3QgY29uZmlndXJlZC4gUnVuICdjbGF1ZGUtY29kZS1zeW5jIGxvZ2luJyB0byBzZXQgdXAuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25maWd1cmVkOiB0cnVlLFxuICAgICAgICAgICAgY29udmV4VXJsOiBjb25maWcuY29udmV4VXJsLFxuICAgICAgICAgICAgYXBpS2V5OiBtYXNrQXBpS2V5KGNvbmZpZy5hcGlLZXkpLFxuICAgICAgICAgICAgYXV0b1N5bmM6IGNvbmZpZy5hdXRvU3luYyAhPT0gZmFsc2UsXG4gICAgICAgICAgICBzeW5jVG9vbENhbGxzOiBjb25maWcuc3luY1Rvb2xDYWxscyAhPT0gZmFsc2UsXG4gICAgICAgICAgICBzeW5jVGhpbmtpbmc6IGNvbmZpZy5zeW5jVGhpbmtpbmcgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIDJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJcXG4gIEN1cnJlbnQgQ29uZmlndXJhdGlvblxcblwiKTtcbiAgICAgIGNvbnNvbGUubG9nKGBDb252ZXggVVJMOiAgJHtjb25maWcuY29udmV4VXJsfWApO1xuICAgICAgY29uc29sZS5sb2coYEFQSSBLZXk6ICAgICAke21hc2tBcGlLZXkoY29uZmlnLmFwaUtleSl9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgQXV0byBTeW5jOiAgICR7Y29uZmlnLmF1dG9TeW5jICE9PSBmYWxzZX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBUb29sIENhbGxzOiAgJHtjb25maWcuc3luY1Rvb2xDYWxscyAhPT0gZmFsc2V9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgVGhpbmtpbmc6ICAgICR7Y29uZmlnLnN5bmNUaGlua2luZyA9PT0gdHJ1ZX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBcXG5Db25maWcgZmlsZTogfi8uY29uZmlnL2NsYXVkZS1jb2RlLXN5bmMvY29uZmlnLmpzb25cXG5gKTtcbiAgICB9XG4gIH0pO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwic2V0IDxrZXk+IDx2YWx1ZT5cIilcbiAgLmRlc2NyaXB0aW9uKFwiU2V0IGEgY29uZmlndXJhdGlvbiB2YWx1ZVwiKVxuICAuYWN0aW9uKChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiTm90IGNvbmZpZ3VyZWQuIFJ1biAnY2xhdWRlLWNvZGUtc3luYyBsb2dpbicgZmlyc3QuXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkS2V5cyA9IFtcImF1dG9TeW5jXCIsIFwic3luY1Rvb2xDYWxsc1wiLCBcInN5bmNUaGlua2luZ1wiXTtcbiAgICBpZiAoIXZhbGlkS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIGtleS4gVmFsaWQga2V5czogJHt2YWxpZEtleXMuam9pbihcIiwgXCIpfWApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvb2xWYWx1ZSA9IHZhbHVlID09PSBcInRydWVcIiB8fCB2YWx1ZSA9PT0gXCIxXCIgfHwgdmFsdWUgPT09IFwieWVzXCI7XG4gICAgXG4gICAgLy8gVHlwZS1zYWZlIGNvbmZpZyB1cGRhdGVcbiAgICBpZiAoa2V5ID09PSBcImF1dG9TeW5jXCIpIHtcbiAgICAgIGNvbmZpZy5hdXRvU3luYyA9IGJvb2xWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzeW5jVG9vbENhbGxzXCIpIHtcbiAgICAgIGNvbmZpZy5zeW5jVG9vbENhbGxzID0gYm9vbFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN5bmNUaGlua2luZ1wiKSB7XG4gICAgICBjb25maWcuc3luY1RoaW5raW5nID0gYm9vbFZhbHVlO1xuICAgIH1cblxuICAgIHNhdmVDb25maWcoY29uZmlnKTtcbiAgICBjb25zb2xlLmxvZyhgU2V0ICR7a2V5fSA9ICR7Ym9vbFZhbHVlfWApO1xuICB9KTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2V0dXAgQ29tbWFuZCAoY29uZmlndXJlcyBDbGF1ZGUgQ29kZSBob29rcylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ2xhdWRlIENvZGUgaG9va3MgY29uZmlndXJhdGlvblxuY29uc3QgQ0xBVURFX0hPT0tTX0NPTkZJRyA9IHtcbiAgaG9va3M6IHtcbiAgICBTZXNzaW9uU3RhcnQ6IFtcbiAgICAgIHtcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImNvbW1hbmRcIixcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiY2xhdWRlLWNvZGUtc3luYyBob29rIFNlc3Npb25TdGFydFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gICAgU2Vzc2lvbkVuZDogW1xuICAgICAge1xuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiY29tbWFuZFwiLFxuICAgICAgICAgICAgY29tbWFuZDogXCJjbGF1ZGUtY29kZS1zeW5jIGhvb2sgU2Vzc2lvbkVuZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gICAgVXNlclByb21wdFN1Ym1pdDogW1xuICAgICAge1xuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwiY29tbWFuZFwiLFxuICAgICAgICAgICAgY29tbWFuZDogXCJjbGF1ZGUtY29kZS1zeW5jIGhvb2sgVXNlclByb21wdFN1Ym1pdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gICAgUG9zdFRvb2xVc2U6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2hlcjogXCIqXCIsXG4gICAgICAgIGhvb2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJjb21tYW5kXCIsXG4gICAgICAgICAgICBjb21tYW5kOiBcImNsYXVkZS1jb2RlLXN5bmMgaG9vayBQb3N0VG9vbFVzZVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gICAgU3RvcDogW1xuICAgICAge1xuICAgICAgICBtYXRjaGVyOiBcIipcIixcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcImNvbW1hbmRcIixcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiY2xhdWRlLWNvZGUtc3luYyBob29rIFN0b3BcIixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxucHJvZ3JhbVxuICAuY29tbWFuZChcInNldHVwXCIpXG4gIC5kZXNjcmlwdGlvbihcIkFkZCBob29rcyB0byBDbGF1ZGUgQ29kZSBzZXR0aW5ncyAoY29uZmlndXJlcyB+Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbilcIilcbiAgLm9wdGlvbihcIi0tZm9yY2VcIiwgXCJPdmVyd3JpdGUgZXhpc3RpbmcgaG9va3MgY29uZmlndXJhdGlvblwiKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiB7IGZvcmNlPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgY29uc3QgY2xhdWRlRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUgfHwgXCJ+XCIsIFwiLmNsYXVkZVwiKTtcbiAgICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4oY2xhdWRlRGlyLCBcInNldHRpbmdzLmpzb25cIik7XG5cbiAgICBjb25zb2xlLmxvZyhcIlxcbiAgQ2xhdWRlIENvZGUgU3luYyAtIFNldHVwXFxuXCIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgcGx1Z2luIGNyZWRlbnRpYWxzIGFyZSBjb25maWd1cmVkXG4gICAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIldhcm5pbmc6IFBsdWdpbiBub3QgY29uZmlndXJlZCB5ZXQuXCIpO1xuICAgICAgY29uc29sZS5sb2coXCIgICBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIGZpcnN0IHRvIHNldCB1cCBjcmVkZW50aWFscy5cXG5cIik7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIC5jbGF1ZGUgZGlyZWN0b3J5IGlmIG5lZWRlZFxuICAgIGlmICghZnMuZXhpc3RzU3luYyhjbGF1ZGVEaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoY2xhdWRlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRlZCB+Ly5jbGF1ZGUgZGlyZWN0b3J5XCIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBleGlzdGluZyBzZXR0aW5nc1xuICAgIGxldCBleGlzdGluZ1NldHRpbmdzOiBDbGF1ZGVTZXR0aW5ncyA9IHt9O1xuICAgIGxldCBoYXNFeGlzdGluZ0hvb2tzID0gZmFsc2U7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNldHRpbmdzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgZXhpc3RpbmdTZXR0aW5ncyA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgQ2xhdWRlU2V0dGluZ3M7XG4gICAgICAgIGhhc0V4aXN0aW5nSG9va3MgPSAhIWV4aXN0aW5nU2V0dGluZ3MuaG9va3M7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRm91bmQgZXhpc3Rpbmcgc2V0dGluZ3MuanNvblwiKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLmxvZyhcIldhcm5pbmc6IENvdWxkIG5vdCBwYXJzZSBleGlzdGluZyBzZXR0aW5ncy5qc29uLCB3aWxsIGNyZWF0ZSBuZXcgb25lXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBleGlzdGluZyBob29rc1xuICAgIGlmIChoYXNFeGlzdGluZ0hvb2tzICYmICFvcHRpb25zLmZvcmNlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlxcbkV4aXN0aW5nIGhvb2tzIGNvbmZpZ3VyYXRpb24gZm91bmQuXCIpO1xuICAgICAgY29uc29sZS5sb2coXCIgICBVc2UgLS1mb3JjZSB0byBvdmVyd3JpdGUsIG9yIG1hbnVhbGx5IG1lcmdlIHRoZSBob29rcy5cXG5cIik7XG4gICAgICBjb25zb2xlLmxvZyhcIlRvIG1hbnVhbGx5IGFkZCwgaW5jbHVkZSB0aGVzZSBob29rcyBpbiB5b3VyIHNldHRpbmdzLmpzb246XCIpO1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoQ0xBVURFX0hPT0tTX0NPTkZJRywgbnVsbCwgMikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHNldHRpbmdzXG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5leGlzdGluZ1NldHRpbmdzLFxuICAgICAgLi4uQ0xBVURFX0hPT0tTX0NPTkZJRyxcbiAgICB9O1xuXG4gICAgLy8gV3JpdGUgc2V0dGluZ3NcbiAgICB0cnkge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhzZXR0aW5nc1BhdGgsIEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCBudWxsLCAyKSk7XG4gICAgICBjb25zb2xlLmxvZyhcIlxcbkNsYXVkZSBDb2RlIGhvb2tzIGNvbmZpZ3VyZWQhXCIpO1xuICAgICAgY29uc29sZS5sb2coYCAgIFNldHRpbmdzIGZpbGU6ICR7c2V0dGluZ3NQYXRofWApO1xuICAgICAgY29uc29sZS5sb2coXCJcXG5TZXR1cCBjb21wbGV0ZS4gU2Vzc2lvbnMgd2lsbCBzeW5jIGF1dG9tYXRpY2FsbHkuXFxuXCIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd3JpdGluZyBzZXR0aW5nczpcIiwgZXJyb3IpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJ2ZXJpZnlcIilcbiAgLmRlc2NyaXB0aW9uKFwiVmVyaWZ5IGNyZWRlbnRpYWxzIGFuZCBDbGF1ZGUgQ29kZSBjb25maWd1cmF0aW9uXCIpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiXFxuICBPcGVuU3luYyBTZXR1cCBWZXJpZmljYXRpb25cXG5cIik7XG5cbiAgICAvLyBDaGVjayBjcmVkZW50aWFsc1xuICAgIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoKTtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNyZWRlbnRpYWxzOiBPS1wiKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICBDb252ZXggVVJMOiAke2NvbmZpZy5jb252ZXhVcmx9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgICAgQVBJIEtleTogJHttYXNrQXBpS2V5KGNvbmZpZy5hcGlLZXkpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNyZWRlbnRpYWxzOiBOT1QgQ09ORklHVVJFRFwiKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiICAgUnVuICdjbGF1ZGUtY29kZS1zeW5jIGxvZ2luJyB0byBzZXQgdXBcIik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgQ2xhdWRlIENvZGUgY29uZmlnXG4gICAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUgfHwgXCJ+XCIsIFwiLmNsYXVkZVwiLCBcInNldHRpbmdzLmpzb25cIik7XG4gICAgbGV0IGhvb2tzQ29uZmlndXJlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzZXR0aW5nc1BhdGgsIFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShjb250ZW50KSBhcyBDbGF1ZGVTZXR0aW5ncztcbiAgICAgICAgaG9va3NDb25maWd1cmVkID0gISFzZXR0aW5ncy5ob29rcz8uU2Vzc2lvblN0YXJ0O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElnbm9yZSBwYXJzZSBlcnJvcnNcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhcIlwiKTtcbiAgICBpZiAoaG9va3NDb25maWd1cmVkKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNsYXVkZSBDb2RlIENvbmZpZzogT0tcIik7XG4gICAgICBjb25zb2xlLmxvZyhgICAgQ29uZmlnIGZpbGU6ICR7c2V0dGluZ3NQYXRofWApO1xuICAgICAgY29uc29sZS5sb2coXCIgICBIb29rcyByZWdpc3RlcmVkOiBjbGF1ZGUtY29kZS1zeW5jXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNsYXVkZSBDb2RlIENvbmZpZzogTk9UIENPTkZJR1VSRURcIik7XG4gICAgICBjb25zb2xlLmxvZyhcIiAgIFJ1biAnY2xhdWRlLWNvZGUtc3luYyBzZXR1cCcgdG8gY29uZmlndXJlIGhvb2tzXCIpO1xuICAgIH1cblxuICAgIC8vIFRlc3QgY29ubmVjdGlvbiBpZiBjcmVkZW50aWFscyBleGlzdFxuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxuVGVzdGluZyBjb25uZWN0aW9uLi4uXCIpO1xuICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFN5bmNDbGllbnQoY29uZmlnKTtcbiAgICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IGNsaWVudC50ZXN0Q29ubmVjdGlvbigpO1xuICAgICAgaWYgKGNvbm5lY3RlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkNvbm5lY3Rpb246IE9LXFxuXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJDb25uZWN0aW9uOiBGQUlMRURcXG5cIik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnICYmIGhvb2tzQ29uZmlndXJlZCkge1xuICAgICAgY29uc29sZS5sb2coXCJSZWFkeSEgU3RhcnQgQ2xhdWRlIENvZGUgYW5kIHNlc3Npb25zIHdpbGwgc3luYyBhdXRvbWF0aWNhbGx5LlxcblwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJcIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3luYyBUZXN0IENvbW1hbmQgKHRlc3QgY29ubmVjdGl2aXR5KVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5wcm9ncmFtXG4gIC5jb21tYW5kKFwic3luY3Rlc3RcIilcbiAgLmRlc2NyaXB0aW9uKFwiVGVzdCBjb25uZWN0aXZpdHkgYW5kIGNyZWF0ZSBhIHRlc3Qgc2Vzc2lvblwiKVxuICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIlxcbiAgQ2xhdWRlIENvZGUgU3luYyAtIENvbm5lY3Rpb24gVGVzdFxcblwiKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIk5vdCBjb25maWd1cmVkXCIpO1xuICAgICAgY29uc29sZS5sb2coXCIgICBSdW4gJ2NsYXVkZS1jb2RlLXN5bmMgbG9naW4nIHRvIHNldCB1cFxcblwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhcIkNvbmZpZ3VyYXRpb246XCIpO1xuICAgIGNvbnNvbGUubG9nKGAgIENvbnZleCBVUkw6ICR7Y29uZmlnLmNvbnZleFVybH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBBUEkgS2V5OiAgICAke21hc2tBcGlLZXkoY29uZmlnLmFwaUtleSl9YCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIlxcblRlc3RpbmcgY29ubmVjdGlvbi4uLlwiKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgU3luY0NsaWVudChjb25maWcpO1xuICAgIGNvbnN0IGNvbm5lY3RlZCA9IGF3YWl0IGNsaWVudC50ZXN0Q29ubmVjdGlvbigpO1xuXG4gICAgaWYgKGNvbm5lY3RlZCkge1xuICAgICAgY29uc29sZS5sb2coXCJDb25uZWN0aW9uOiBPS1wiKTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGEgdGVzdCBzZXNzaW9uIHRvIHZlcmlmeSBmdWxsIHN5bmMgd29ya3NcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxuQ3JlYXRpbmcgdGVzdCBzZXNzaW9uLi4uXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVzdFNlc3Npb24gPSB7XG4gICAgICAgICAgc2Vzc2lvbklkOiBgdGVzdC0ke0RhdGUubm93KCl9YCxcbiAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIiBhcyBjb25zdCxcbiAgICAgICAgICB0aXRsZTogXCJDb25uZWN0aW9uIFRlc3RcIixcbiAgICAgICAgICBwcm9qZWN0TmFtZTogXCJzeW5jdGVzdFwiLFxuICAgICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgY2xpZW50LnN5bmNTZXNzaW9uKHRlc3RTZXNzaW9uKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJUZXN0IHNlc3Npb24gY3JlYXRlZCBzdWNjZXNzZnVsbHlcIik7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiXFxuU3luYyB0ZXN0IHBhc3NlZC4gUmVhZHkgdG8gc3luYyBDbGF1ZGUgQ29kZSBzZXNzaW9ucy5cXG5cIik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhgVGVzdCBzZXNzaW9uIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJcXG5Db25uZWN0aW9uIHdvcmtzIGJ1dCBzeW5jIG1heSBoYXZlIGlzc3Vlcy5cXG5cIik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJDb25uZWN0aW9uOiBGQUlMRURcIik7XG4gICAgICBjb25zb2xlLmxvZyhcIlxcbkNoZWNrIHlvdXIgQ29udmV4IFVSTCBhbmQgQVBJIGtleS5cXG5cIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSG9vayBDb21tYW5kIChmb3IgQ2xhdWRlIENvZGUgaW50ZWdyYXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIFRyYWNrIHNlc3Npb24gc3RhdGUgZm9yIHRpdGxlIGdlbmVyYXRpb24gKGZpcnN0IHVzZXIgcHJvbXB0KVxuY29uc3QgU0VTU0lPTl9TVEFURV9GSUxFID0gcGF0aC5qb2luKFxuICBwcm9jZXNzLmVudi5IT01FIHx8IFwiflwiLFxuICBcIi5jb25maWdcIixcbiAgXCJjbGF1ZGUtY29kZS1zeW5jXCIsXG4gIFwic2Vzc2lvbi1zdGF0ZS5qc29uXCJcbik7XG5cbmludGVyZmFjZSBTZXNzaW9uU3RhdGUge1xuICBbc2Vzc2lvbklkOiBzdHJpbmddOiB7XG4gICAgbW9kZWw/OiBzdHJpbmc7XG4gICAgZmlyc3RQcm9tcHQ/OiBzdHJpbmc7XG4gICAgdG9rZW5Vc2FnZT86IHsgaW5wdXQ6IG51bWJlcjsgb3V0cHV0OiBudW1iZXIgfTtcbiAgICBjYWNoZUNyZWF0aW9uVG9rZW5zPzogbnVtYmVyO1xuICAgIGNhY2hlUmVhZFRva2Vucz86IG51bWJlcjtcbiAgICBtZXNzYWdlQ291bnQ/OiBudW1iZXI7XG4gICAgdG9vbENhbGxDb3VudD86IG51bWJlcjtcbiAgICBzeW5jZWRNZXNzYWdlVXVpZHM/OiBTZXQ8c3RyaW5nPiB8IHN0cmluZ1tdO1xuICAgIHN0YXJ0ZWRBdD86IHN0cmluZztcbiAgICBlbmRlZEF0Pzogc3RyaW5nO1xuICAgIGR1cmF0aW9uTXM/OiBudW1iZXI7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgY3dkPzogc3RyaW5nO1xuICAgIGNvc3RFc3RpbWF0ZT86IG51bWJlcjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gbG9hZFNlc3Npb25TdGF0ZSgpOiBTZXNzaW9uU3RhdGUge1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKFNFU1NJT05fU1RBVEVfRklMRSkpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhTRVNTSU9OX1NUQVRFX0ZJTEUsIFwidXRmLThcIikpIGFzIFNlc3Npb25TdGF0ZTtcbiAgICAgIC8vIENvbnZlcnQgYXJyYXlzIGJhY2sgdG8gU2V0cyBmb3Igc3luY2VkTWVzc2FnZVV1aWRzXG4gICAgICBmb3IgKGNvbnN0IHNlc3Npb25JZCBvZiBPYmplY3Qua2V5cyhkYXRhKSkge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gZGF0YVtzZXNzaW9uSWRdO1xuICAgICAgICBpZiAoc2Vzc2lvbi5zeW5jZWRNZXNzYWdlVXVpZHMgJiYgQXJyYXkuaXNBcnJheShzZXNzaW9uLnN5bmNlZE1lc3NhZ2VVdWlkcykpIHtcbiAgICAgICAgICBzZXNzaW9uLnN5bmNlZE1lc3NhZ2VVdWlkcyA9IG5ldyBTZXQoc2Vzc2lvbi5zeW5jZWRNZXNzYWdlVXVpZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgfVxuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIHNhdmVTZXNzaW9uU3RhdGUoc3RhdGU6IFNlc3Npb25TdGF0ZSk6IHZvaWQge1xuICB0cnkge1xuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShTRVNTSU9OX1NUQVRFX0ZJTEUpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gQ29udmVydCBTZXRzIHRvIGFycmF5cyBmb3IgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAgY29uc3Qgc2VyaWFsaXphYmxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qgc2Vzc2lvbklkIG9mIE9iamVjdC5rZXlzKHN0YXRlKSkge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IHN0YXRlW3Nlc3Npb25JZF07XG4gICAgICBzZXJpYWxpemFibGVbc2Vzc2lvbklkXSA9IHtcbiAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgc3luY2VkTWVzc2FnZVV1aWRzOiBzZXNzaW9uLnN5bmNlZE1lc3NhZ2VVdWlkcyBpbnN0YW5jZW9mIFNldFxuICAgICAgICAgID8gQXJyYXkuZnJvbShzZXNzaW9uLnN5bmNlZE1lc3NhZ2VVdWlkcylcbiAgICAgICAgICA6IHNlc3Npb24uc3luY2VkTWVzc2FnZVV1aWRzLFxuICAgICAgfTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhTRVNTSU9OX1NUQVRFX0ZJTEUsIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6YWJsZSwgbnVsbCwgMikpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZ25vcmUgZXJyb3JzXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVUaXRsZShwcm9tcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFVzZSBmaXJzdCA4MCBjaGFycyBvZiBmaXJzdCBwcm9tcHQgYXMgdGl0bGUsIHRyaW0gYXQgd29yZCBib3VuZGFyeVxuICBjb25zdCB0cmltbWVkID0gcHJvbXB0LnNsaWNlKDAsIDgwKS50cmltKCk7XG4gIGlmIChwcm9tcHQubGVuZ3RoID4gODApIHtcbiAgICBjb25zdCBsYXN0U3BhY2UgPSB0cmltbWVkLmxhc3RJbmRleE9mKFwiIFwiKTtcbiAgICBpZiAobGFzdFNwYWNlID4gNDApIHtcbiAgICAgIHJldHVybiB0cmltbWVkLnNsaWNlKDAsIGxhc3RTcGFjZSkgKyBcIi4uLlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJpbW1lZCArIFwiLi4uXCI7XG4gIH1cbiAgcmV0dXJuIHRyaW1tZWQ7XG59XG5cbi8vIFBhcnNlIHRyYW5zY3JpcHQgZmlsZSB0byBleHRyYWN0IGFzc2lzdGFudCBtZXNzYWdlcywgdG9rZW4gdXNhZ2UsIGFuZCBzdGF0c1xuaW50ZXJmYWNlIFBhcnNlZFRyYW5zY3JpcHQge1xuICBhc3Npc3RhbnRNZXNzYWdlczogQXJyYXk8e1xuICAgIHV1aWQ6IHN0cmluZztcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgbW9kZWw/OiBzdHJpbmc7XG4gIH0+O1xuICBzdGF0czogVHJhbnNjcmlwdFN0YXRzO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRyYW5zY3JpcHRGaWxlKHRyYW5zY3JpcHRQYXRoOiBzdHJpbmcpOiBQYXJzZWRUcmFuc2NyaXB0IHtcbiAgY29uc3QgcmVzdWx0OiBQYXJzZWRUcmFuc2NyaXB0ID0ge1xuICAgIGFzc2lzdGFudE1lc3NhZ2VzOiBbXSxcbiAgICBzdGF0czoge1xuICAgICAgbW9kZWw6IHVuZGVmaW5lZCxcbiAgICAgIGlucHV0VG9rZW5zOiAwLFxuICAgICAgY2FjaGVDcmVhdGlvblRva2VuczogMCxcbiAgICAgIGNhY2hlUmVhZFRva2VuczogMCxcbiAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgIG1lc3NhZ2VDb3VudDogMCxcbiAgICAgIHRvb2xDYWxsQ291bnQ6IDAsXG4gICAgICB0aXRsZTogdW5kZWZpbmVkLFxuICAgICAgY3dkOiB1bmRlZmluZWQsXG4gICAgICBzdGFydGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgIGVuZGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgIGR1cmF0aW9uTXM6IHVuZGVmaW5lZCxcbiAgICB9LFxuICB9O1xuXG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRyYW5zY3JpcHRQYXRoKSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRyYW5zY3JpcHRQYXRoLCBcInV0Zi04XCIpO1xuICAgIGNvbnN0IGxpbmVzID0gY29udGVudC50cmltKCkuc3BsaXQoXCJcXG5cIik7XG4gICAgY29uc3Qgc2VlblV1aWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IGZpcnN0VGltZXN0YW1wOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGxhc3RUaW1lc3RhbXA6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkgY29udGludWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gSlNPTi5wYXJzZShsaW5lKSBhcyBUcmFuc2NyaXB0RW50cnk7XG5cbiAgICAgICAgLy8gVHJhY2sgdGltZXN0YW1wcyBmb3IgZHVyYXRpb24gY2FsY3VsYXRpb25cbiAgICAgICAgaWYgKGVudHJ5LnRpbWVzdGFtcCkge1xuICAgICAgICAgIGlmICghZmlyc3RUaW1lc3RhbXApIHtcbiAgICAgICAgICAgIGZpcnN0VGltZXN0YW1wID0gZW50cnkudGltZXN0YW1wO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsYXN0VGltZXN0YW1wID0gZW50cnkudGltZXN0YW1wO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGN3ZCBhbmQgdGl0bGUgZnJvbSBmaXJzdCBlbnRyeSB0aGF0IGhhcyB0aGVtXG4gICAgICAgIGlmICghcmVzdWx0LnN0YXRzLmN3ZCAmJiBlbnRyeS5jd2QpIHtcbiAgICAgICAgICByZXN1bHQuc3RhdHMuY3dkID0gZW50cnkuY3dkO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzdWx0LnN0YXRzLnRpdGxlICYmIGVudHJ5LnNsdWcpIHtcbiAgICAgICAgICByZXN1bHQuc3RhdHMudGl0bGUgPSBlbnRyeS5zbHVnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ291bnQgdXNlciBtZXNzYWdlc1xuICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gXCJ1c2VyXCIpIHtcbiAgICAgICAgICByZXN1bHQuc3RhdHMubWVzc2FnZUNvdW50Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9jZXNzIGFzc2lzdGFudCBtZXNzYWdlc1xuICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gXCJhc3Npc3RhbnRcIiAmJiBlbnRyeS5tZXNzYWdlKSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gZW50cnkubWVzc2FnZTtcbiAgICAgICAgICBjb25zdCB1dWlkID0gZW50cnkudXVpZCB8fCBcIlwiO1xuXG4gICAgICAgICAgLy8gR2V0IG1vZGVsIGZyb20gZmlyc3QgYXNzaXN0YW50IG1lc3NhZ2VcbiAgICAgICAgICBpZiAobXNnLm1vZGVsICYmICFyZXN1bHQuc3RhdHMubW9kZWwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGF0cy5tb2RlbCA9IG1zZy5tb2RlbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTa2lwIGR1cGxpY2F0ZSBVVUlEcyBmb3IgbWVzc2FnZSBleHRyYWN0aW9uXG4gICAgICAgICAgaWYgKHV1aWQgJiYgc2VlblV1aWRzLmhhcyh1dWlkKSkgY29udGludWU7XG4gICAgICAgICAgaWYgKHV1aWQpIHNlZW5VdWlkcy5hZGQodXVpZCk7XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRleHQgY29udGVudCBmcm9tIG1lc3NhZ2VcbiAgICAgICAgICBpZiAobXNnLmNvbnRlbnQgJiYgQXJyYXkuaXNBcnJheShtc2cuY29udGVudCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBtc2cuY29udGVudCkge1xuICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcInRleHRcIiAmJiBwYXJ0LnRleHQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYXNzaXN0YW50TWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICB1dWlkLFxuICAgICAgICAgICAgICAgICAgdGV4dDogcGFydC50ZXh0LFxuICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBlbnRyeS50aW1lc3RhbXAgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgbW9kZWw6IG1zZy5tb2RlbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBDb3VudCB0b29sIHVzZXNcbiAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJ0b29sX3VzZVwiKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXRzLnRvb2xDYWxsQ291bnQrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFjY3VtdWxhdGUgdG9rZW4gdXNhZ2UgKHNlcGFyYXRlIGNhY2hlIHRva2VucyBmb3IgY29zdCBjYWxjdWxhdGlvbilcbiAgICAgICAgICBpZiAobXNnLnVzYWdlKSB7XG4gICAgICAgICAgICByZXN1bHQuc3RhdHMuaW5wdXRUb2tlbnMgKz0gbXNnLnVzYWdlLmlucHV0X3Rva2VucyB8fCAwO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXRzLmNhY2hlQ3JlYXRpb25Ub2tlbnMgKz0gbXNnLnVzYWdlLmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyB8fCAwO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXRzLmNhY2hlUmVhZFRva2VucyArPSBtc2cudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMgfHwgMDtcbiAgICAgICAgICAgIHJlc3VsdC5zdGF0cy5vdXRwdXRUb2tlbnMgKz0gbXNnLnVzYWdlLm91dHB1dF90b2tlbnMgfHwgMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTa2lwIG1hbGZvcm1lZCBsaW5lc1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBkdXJhdGlvbiBmcm9tIHRpbWVzdGFtcHNcbiAgICBpZiAoZmlyc3RUaW1lc3RhbXAgJiYgbGFzdFRpbWVzdGFtcCkge1xuICAgICAgcmVzdWx0LnN0YXRzLnN0YXJ0ZWRBdCA9IGZpcnN0VGltZXN0YW1wO1xuICAgICAgcmVzdWx0LnN0YXRzLmVuZGVkQXQgPSBsYXN0VGltZXN0YW1wO1xuICAgICAgY29uc3Qgc3RhcnRNcyA9IG5ldyBEYXRlKGZpcnN0VGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICBjb25zdCBlbmRNcyA9IG5ldyBEYXRlKGxhc3RUaW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgIGlmICghaXNOYU4oc3RhcnRNcykgJiYgIWlzTmFOKGVuZE1zKSkge1xuICAgICAgICByZXN1bHQuc3RhdHMuZHVyYXRpb25NcyA9IGVuZE1zIC0gc3RhcnRNcztcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIFJldHVybiBlbXB0eSByZXN1bHQgb24gZXJyb3JcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoXCJob29rIDxldmVudD5cIilcbiAgLmRlc2NyaXB0aW9uKFwiSGFuZGxlIENsYXVkZSBDb2RlIGhvb2sgZXZlbnRzIChyZWFkcyBzdGRpbilcIilcbiAgLmFjdGlvbihhc3luYyAoZXZlbnQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGxvYWRDb25maWcoKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICAvLyBFeGl0IHNpbGVudGx5IGlmIG5vdCBjb25maWd1cmVkIChkb24ndCBibG9jayBDbGF1ZGUgQ29kZSlcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmF1dG9TeW5jID09PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cblxuICAgIC8vIFJlYWQgSlNPTiBpbnB1dCBmcm9tIHN0ZGluXG4gICAgbGV0IGlucHV0ID0gXCJcIjtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHByb2Nlc3Muc3RkaW4pIHtcbiAgICAgIGlucHV0ICs9IGNodW5rO1xuICAgIH1cblxuICAgIGlmICghaW5wdXQudHJpbSgpKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBTeW5jQ2xpZW50KGNvbmZpZyk7XG4gICAgICBjb25zdCBzZXNzaW9uU3RhdGUgPSBsb2FkU2Vzc2lvblN0YXRlKCk7XG5cbiAgICAgIHN3aXRjaCAoZXZlbnQpIHtcbiAgICAgICAgY2FzZSBcIlNlc3Npb25TdGFydFwiOiB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoaW5wdXQpIGFzIEhvb2tTZXNzaW9uU3RhcnREYXRhO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdHJhbnNjcmlwdCBpZiBhdmFpbGFibGUgdG8gZ2V0IGluaXRpYWwgaW5mb1xuICAgICAgICAgIGxldCBzdGF0czogVHJhbnNjcmlwdFN0YXRzIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChkYXRhLnRyYW5zY3JpcHRfcGF0aCAmJiBmcy5leGlzdHNTeW5jKGRhdGEudHJhbnNjcmlwdF9wYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VUcmFuc2NyaXB0RmlsZShkYXRhLnRyYW5zY3JpcHRfcGF0aCk7XG4gICAgICAgICAgICBzdGF0cyA9IHBhcnNlZC5zdGF0cztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjd2QgPSBzdGF0cz8uY3dkIHx8IGRhdGEuY3dkO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBJbml0aWFsaXplIHNlc3Npb24gc3RhdGVcbiAgICAgICAgICBzZXNzaW9uU3RhdGVbZGF0YS5zZXNzaW9uX2lkXSA9IHtcbiAgICAgICAgICAgIG1vZGVsOiBzdGF0cz8ubW9kZWwgfHwgZGF0YS5tb2RlbCxcbiAgICAgICAgICAgIHRva2VuVXNhZ2U6IHsgaW5wdXQ6IDAsIG91dHB1dDogMCB9LFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvblRva2VuczogMCxcbiAgICAgICAgICAgIGNhY2hlUmVhZFRva2VuczogMCxcbiAgICAgICAgICAgIG1lc3NhZ2VDb3VudDogMCxcbiAgICAgICAgICAgIHRvb2xDYWxsQ291bnQ6IDAsXG4gICAgICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgICAgICB0aXRsZTogc3RhdHM/LnRpdGxlLFxuICAgICAgICAgICAgY3dkLFxuICAgICAgICAgIH07XG4gICAgICAgICAgc2F2ZVNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHNlc3Npb246IFNlc3Npb25EYXRhID0ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBkYXRhLnNlc3Npb25faWQsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICAgIG1vZGVsOiBzdGF0cz8ubW9kZWwgfHwgZGF0YS5tb2RlbCxcbiAgICAgICAgICAgIHRpdGxlOiBzdGF0cz8udGl0bGUsXG4gICAgICAgICAgICBwZXJtaXNzaW9uTW9kZTogZGF0YS5wZXJtaXNzaW9uX21vZGUsXG4gICAgICAgICAgICB0aGlua2luZ0VuYWJsZWQ6IGRhdGEudGhpbmtpbmdfZW5hYmxlZCxcbiAgICAgICAgICAgIG1jcFNlcnZlcnM6IGRhdGEubWNwX3NlcnZlcnMsXG4gICAgICAgICAgICBzdGFydFR5cGU6IGRhdGEuc291cmNlID09PSBcInN0YXJ0dXBcIiA/IFwibmV3XCIgOiAoZGF0YS5zb3VyY2UgYXMgU2Vzc2lvbkRhdGFbXCJzdGFydFR5cGVcIl0pLFxuICAgICAgICAgICAgc3RhcnRlZEF0LFxuICAgICAgICAgICAgcHJvamVjdFBhdGg6IGN3ZCxcbiAgICAgICAgICAgIHByb2plY3ROYW1lOiBjd2QgPyBwYXRoLmJhc2VuYW1lKGN3ZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIFRyeSB0byBnZXQgZ2l0IGJyYW5jaCBmcm9tIGN3ZFxuICAgICAgICAgIGlmIChjd2QpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGdpdERpciA9IHBhdGguam9pbihjd2QsIFwiLmdpdFwiKTtcbiAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZ2l0RGlyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRGaWxlID0gcGF0aC5qb2luKGdpdERpciwgXCJIRUFEXCIpO1xuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGhlYWRGaWxlKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZCA9IGZzLnJlYWRGaWxlU3luYyhoZWFkRmlsZSwgXCJ1dGYtOFwiKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoaGVhZC5zdGFydHNXaXRoKFwicmVmOiByZWZzL2hlYWRzL1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdpdEJyYW5jaCA9IGhlYWQucmVwbGFjZShcInJlZjogcmVmcy9oZWFkcy9cIiwgXCJcIik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgLy8gSWdub3JlIGdpdCBlcnJvcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCBjbGllbnQuc3luY1Nlc3Npb24oc2Vzc2lvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFwiU2Vzc2lvbkVuZFwiOiB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoaW5wdXQpIGFzIEhvb2tTZXNzaW9uRW5kRGF0YTtcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNlc3Npb25TdGF0ZVtkYXRhLnNlc3Npb25faWRdIHx8IHt9O1xuXG4gICAgICAgICAgLy8gUGFyc2UgdHJhbnNjcmlwdCB0byBnZXQgZmluYWwgc3RhdHMgaW5jbHVkaW5nIG1vZGVsLCB0b2tlbnMsIGNvc3RcbiAgICAgICAgICBsZXQgc3RhdHM6IFRyYW5zY3JpcHRTdGF0cyA9IHtcbiAgICAgICAgICAgIG1vZGVsOiBzdGF0ZS5tb2RlbCxcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiBzdGF0ZS50b2tlblVzYWdlPy5pbnB1dCB8fCAwLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvblRva2Vuczogc3RhdGUuY2FjaGVDcmVhdGlvblRva2VucyB8fCAwLFxuICAgICAgICAgICAgY2FjaGVSZWFkVG9rZW5zOiBzdGF0ZS5jYWNoZVJlYWRUb2tlbnMgfHwgMCxcbiAgICAgICAgICAgIG91dHB1dFRva2Vuczogc3RhdGUudG9rZW5Vc2FnZT8ub3V0cHV0IHx8IDAsXG4gICAgICAgICAgICBtZXNzYWdlQ291bnQ6IHN0YXRlLm1lc3NhZ2VDb3VudCB8fCAwLFxuICAgICAgICAgICAgdG9vbENhbGxDb3VudDogc3RhdGUudG9vbENhbGxDb3VudCB8fCAwLFxuICAgICAgICAgICAgdGl0bGU6IHN0YXRlLnRpdGxlLFxuICAgICAgICAgICAgY3dkOiBzdGF0ZS5jd2QgfHwgZGF0YS5jd2QsXG4gICAgICAgICAgICBzdGFydGVkQXQ6IHN0YXRlLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgIGVuZGVkQXQ6IHN0YXRlLmVuZGVkQXQsXG4gICAgICAgICAgICBkdXJhdGlvbk1zOiBzdGF0ZS5kdXJhdGlvbk1zLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoZGF0YS50cmFuc2NyaXB0X3BhdGggJiYgZnMuZXhpc3RzU3luYyhkYXRhLnRyYW5zY3JpcHRfcGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVHJhbnNjcmlwdEZpbGUoZGF0YS50cmFuc2NyaXB0X3BhdGgpO1xuICAgICAgICAgICAgc3RhdHMgPSBwYXJzZWQuc3RhdHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIGNvc3QgZnJvbSB0b2tlbnMgKHdpdGggcHJvcGVyIGNhY2hlIHByaWNpbmcpXG4gICAgICAgICAgbGV0IGNvc3QgPSBkYXRhLmNvc3RfZXN0aW1hdGU7XG4gICAgICAgICAgaWYgKChjb3N0ID09PSB1bmRlZmluZWQgfHwgY29zdCA9PT0gbnVsbCB8fCBjb3N0ID09PSAwKSAmJiBzdGF0cy5tb2RlbCkge1xuICAgICAgICAgICAgaWYgKHN0YXRzLmlucHV0VG9rZW5zIHx8IHN0YXRzLm91dHB1dFRva2VucyB8fCBzdGF0cy5jYWNoZVJlYWRUb2tlbnMgfHwgc3RhdHMuY2FjaGVDcmVhdGlvblRva2Vucykge1xuICAgICAgICAgICAgICBjb3N0ID0gY2FsY3VsYXRlQ29zdChzdGF0cy5tb2RlbCwgc3RhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGN3ZCA9IHN0YXRzLmN3ZCB8fCBkYXRhLmN3ZDtcbiAgICAgICAgICBjb25zdCB0b3RhbElucHV0VG9rZW5zID0gc3RhdHMuaW5wdXRUb2tlbnMgKyBzdGF0cy5jYWNoZUNyZWF0aW9uVG9rZW5zICsgc3RhdHMuY2FjaGVSZWFkVG9rZW5zO1xuICAgICAgICAgIGNvbnN0IGVuZGVkQXQgPSBzdGF0cy5lbmRlZEF0IHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgICAgICAgIGNvbnN0IHNlc3Npb246IFNlc3Npb25EYXRhID0ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBkYXRhLnNlc3Npb25faWQsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgICAgIG1vZGVsOiBzdGF0cy5tb2RlbCxcbiAgICAgICAgICAgIHRpdGxlOiBzdGF0cy50aXRsZSB8fCAoc3RhdGUuZmlyc3RQcm9tcHQgPyBnZW5lcmF0ZVRpdGxlKHN0YXRlLmZpcnN0UHJvbXB0KSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICBwcm9qZWN0UGF0aDogY3dkLFxuICAgICAgICAgICAgcHJvamVjdE5hbWU6IGN3ZCA/IHBhdGguYmFzZW5hbWUoY3dkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVuZFJlYXNvbjogZGF0YS5yZWFzb24sXG4gICAgICAgICAgICBtZXNzYWdlQ291bnQ6IGRhdGEubWVzc2FnZV9jb3VudCB8fCBzdGF0cy5tZXNzYWdlQ291bnQsXG4gICAgICAgICAgICB0b29sQ2FsbENvdW50OiBkYXRhLnRvb2xfY2FsbF9jb3VudCB8fCBzdGF0cy50b29sQ2FsbENvdW50LFxuICAgICAgICAgICAgdG9rZW5Vc2FnZToge1xuICAgICAgICAgICAgICBpbnB1dDogdG90YWxJbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgb3V0cHV0OiBzdGF0cy5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29zdEVzdGltYXRlOiBjb3N0LFxuICAgICAgICAgICAgc3RhcnRlZEF0OiBzdGF0cy5zdGFydGVkQXQsXG4gICAgICAgICAgICBlbmRlZEF0LFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgY2xpZW50LnN5bmNTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIENsZWFuIHVwIHNlc3Npb24gc3RhdGVcbiAgICAgICAgICBkZWxldGUgc2Vzc2lvblN0YXRlW2RhdGEuc2Vzc2lvbl9pZF07XG4gICAgICAgICAgc2F2ZVNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBcIlVzZXJQcm9tcHRTdWJtaXRcIjoge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGlucHV0KSBhcyBIb29rVXNlclByb21wdERhdGE7XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXNzaW9uU3RhdGVbZGF0YS5zZXNzaW9uX2lkXSB8fCB7fTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBUcmFjayBmaXJzdCBwcm9tcHQgZm9yIHRpdGxlIGdlbmVyYXRpb25cbiAgICAgICAgICBpZiAoIXN0YXRlLmZpcnN0UHJvbXB0KSB7XG4gICAgICAgICAgICBzdGF0ZS5maXJzdFByb21wdCA9IGRhdGEucHJvbXB0O1xuICAgICAgICAgICAgc2Vzc2lvblN0YXRlW2RhdGEuc2Vzc2lvbl9pZF0gPSBzdGF0ZTtcbiAgICAgICAgICAgIHNhdmVTZXNzaW9uU3RhdGUoc2Vzc2lvblN0YXRlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIHNlc3Npb24gd2l0aCB0aXRsZVxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbjogU2Vzc2lvbkRhdGEgPSB7XG4gICAgICAgICAgICAgIHNlc3Npb25JZDogZGF0YS5zZXNzaW9uX2lkLFxuICAgICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgICAgICAgdGl0bGU6IGdlbmVyYXRlVGl0bGUoZGF0YS5wcm9tcHQpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zeW5jU2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gSW5jcmVtZW50IG1lc3NhZ2UgY291bnRcbiAgICAgICAgICBzdGF0ZS5tZXNzYWdlQ291bnQgPSAoc3RhdGUubWVzc2FnZUNvdW50IHx8IDApICsgMTtcbiAgICAgICAgICBzZXNzaW9uU3RhdGVbZGF0YS5zZXNzaW9uX2lkXSA9IHN0YXRlO1xuICAgICAgICAgIHNhdmVTZXNzaW9uU3RhdGUoc2Vzc2lvblN0YXRlKTtcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBtZXNzYWdlOiBNZXNzYWdlRGF0YSA9IHtcbiAgICAgICAgICAgIHNlc3Npb25JZDogZGF0YS5zZXNzaW9uX2lkLFxuICAgICAgICAgICAgbWVzc2FnZUlkOiBgJHtkYXRhLnNlc3Npb25faWR9LXVzZXItJHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICBzb3VyY2U6IFwiY2xhdWRlLWNvZGVcIixcbiAgICAgICAgICAgIHJvbGU6IFwidXNlclwiLFxuICAgICAgICAgICAgY29udGVudDogZGF0YS5wcm9tcHQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGRhdGEudGltZXN0YW1wIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IGNsaWVudC5zeW5jTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgXCJQb3N0VG9vbFVzZVwiOiB7XG4gICAgICAgICAgaWYgKCFjb25maWcuc3luY1Rvb2xDYWxscykgYnJlYWs7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoaW5wdXQpIGFzIEhvb2tUb29sVXNlRGF0YTtcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNlc3Npb25TdGF0ZVtkYXRhLnNlc3Npb25faWRdIHx8IHt9O1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2U6IE1lc3NhZ2VEYXRhID0ge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiBkYXRhLnNlc3Npb25faWQsXG4gICAgICAgICAgICBtZXNzYWdlSWQ6IGRhdGEudG9vbF91c2VfaWQgfHwgYCR7ZGF0YS5zZXNzaW9uX2lkfS10b29sLSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgICAgc291cmNlOiBcImNsYXVkZS1jb2RlXCIsXG4gICAgICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICAgICAgdG9vbE5hbWU6IGRhdGEudG9vbF9uYW1lLFxuICAgICAgICAgICAgdG9vbEFyZ3M6IGRhdGEudG9vbF9pbnB1dCxcbiAgICAgICAgICAgIHRvb2xSZXN1bHQ6IGRhdGEudG9vbF9yZXN1bHQ/Lm91dHB1dCB8fCBkYXRhLnRvb2xfcmVzdWx0Py5lcnJvcixcbiAgICAgICAgICAgIGR1cmF0aW9uTXM6IGRhdGEuZHVyYXRpb25fbXMsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IGNsaWVudC5zeW5jTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgXCJTdG9wXCI6IHtcbiAgICAgICAgICAvLyBTdG9wIGV2ZW50IHByb3ZpZGVzIHRyYW5zY3JpcHRfcGF0aCAtIHdlIHJlYWQgaXQgdG8gZ2V0IG1lc3NhZ2VzIGFuZCB0b2tlbnNcbiAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShpbnB1dCkgYXMgSG9va1N0b3BEYXRhO1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gc2Vzc2lvblN0YXRlW2RhdGEuc2Vzc2lvbl9pZF0gfHwge307XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUGFyc2UgdHJhbnNjcmlwdCBmaWxlIHRvIGV4dHJhY3QgYXNzaXN0YW50IG1lc3NhZ2VzIGFuZCB0b2tlbiB1c2FnZVxuICAgICAgICAgIGlmIChkYXRhLnRyYW5zY3JpcHRfcGF0aCkge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNjcmlwdCA9IHBhcnNlVHJhbnNjcmlwdEZpbGUoZGF0YS50cmFuc2NyaXB0X3BhdGgpO1xuICAgICAgICAgICAgY29uc3QgeyBzdGF0cyB9ID0gdHJhbnNjcmlwdDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIHRva2VuIHVzYWdlIGZyb20gdHJhbnNjcmlwdCAodHJhY2sgY2FjaGUgdG9rZW5zIHNlcGFyYXRlbHkpXG4gICAgICAgICAgICBpZiAoc3RhdHMuaW5wdXRUb2tlbnMgPiAwIHx8IHN0YXRzLm91dHB1dFRva2VucyA+IDAgfHwgc3RhdHMuY2FjaGVSZWFkVG9rZW5zID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCB0b3RhbElucHV0ID0gc3RhdHMuaW5wdXRUb2tlbnMgKyBzdGF0cy5jYWNoZUNyZWF0aW9uVG9rZW5zICsgc3RhdHMuY2FjaGVSZWFkVG9rZW5zO1xuICAgICAgICAgICAgICBzdGF0ZS50b2tlblVzYWdlID0geyBpbnB1dDogdG90YWxJbnB1dCwgb3V0cHV0OiBzdGF0cy5vdXRwdXRUb2tlbnMgfTtcbiAgICAgICAgICAgICAgc3RhdGUuY2FjaGVDcmVhdGlvblRva2VucyA9IHN0YXRzLmNhY2hlQ3JlYXRpb25Ub2tlbnM7XG4gICAgICAgICAgICAgIHN0YXRlLmNhY2hlUmVhZFRva2VucyA9IHN0YXRzLmNhY2hlUmVhZFRva2VucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIG1vZGVsIGlmIGZvdW5kXG4gICAgICAgICAgICBpZiAoc3RhdHMubW9kZWwgJiYgIXN0YXRlLm1vZGVsKSB7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGVsID0gc3RhdHMubW9kZWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aXRsZSBpZiBmb3VuZCBmcm9tIHRyYW5zY3JpcHQgc2x1Z1xuICAgICAgICAgICAgaWYgKHN0YXRzLnRpdGxlICYmICFzdGF0ZS50aXRsZSkge1xuICAgICAgICAgICAgICBzdGF0ZS50aXRsZSA9IHN0YXRzLnRpdGxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgZHVyYXRpb24gaW5mb1xuICAgICAgICAgICAgaWYgKHN0YXRzLnN0YXJ0ZWRBdCkgc3RhdGUuc3RhcnRlZEF0ID0gc3RhdHMuc3RhcnRlZEF0O1xuICAgICAgICAgICAgaWYgKHN0YXRzLmVuZGVkQXQpIHN0YXRlLmVuZGVkQXQgPSBzdGF0cy5lbmRlZEF0O1xuICAgICAgICAgICAgaWYgKHN0YXRzLmR1cmF0aW9uTXMpIHN0YXRlLmR1cmF0aW9uTXMgPSBzdGF0cy5kdXJhdGlvbk1zO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgdG9vbCBjYWxsIGNvdW50XG4gICAgICAgICAgICBpZiAoc3RhdHMudG9vbENhbGxDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgc3RhdGUudG9vbENhbGxDb3VudCA9IHN0YXRzLnRvb2xDYWxsQ291bnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBjb3N0IGlmIHdlIGhhdmUgbW9kZWwgYW5kIHRva2Vuc1xuICAgICAgICAgICAgaWYgKHN0YXRzLm1vZGVsICYmIChzdGF0cy5pbnB1dFRva2VucyB8fCBzdGF0cy5vdXRwdXRUb2tlbnMgfHwgc3RhdHMuY2FjaGVSZWFkVG9rZW5zKSkge1xuICAgICAgICAgICAgICBzdGF0ZS5jb3N0RXN0aW1hdGUgPSBjYWxjdWxhdGVDb3N0KHN0YXRzLm1vZGVsLCBzdGF0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFRyYWNrIHdoaWNoIG1lc3NhZ2VzIHdlJ3ZlIGFscmVhZHkgc3luY2VkIHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgIGNvbnN0IHN5bmNlZE1lc3NhZ2VzID0gc3RhdGUuc3luY2VkTWVzc2FnZVV1aWRzIGluc3RhbmNlb2YgU2V0XG4gICAgICAgICAgICAgID8gc3RhdGUuc3luY2VkTWVzc2FnZVV1aWRzXG4gICAgICAgICAgICAgIDogbmV3IFNldDxzdHJpbmc+KEFycmF5LmlzQXJyYXkoc3RhdGUuc3luY2VkTWVzc2FnZVV1aWRzKSA/IHN0YXRlLnN5bmNlZE1lc3NhZ2VVdWlkcyA6IFtdKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU3luYyBuZXcgYXNzaXN0YW50IG1lc3NhZ2VzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiB0cmFuc2NyaXB0LmFzc2lzdGFudE1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgaWYgd2UndmUgYWxyZWFkeSBzeW5jZWQgdGhpcyBtZXNzYWdlXG4gICAgICAgICAgICAgIGlmIChtc2cudXVpZCAmJiBzeW5jZWRNZXNzYWdlcy5oYXMobXNnLnV1aWQpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgaWYgKG1zZy51dWlkKSBzeW5jZWRNZXNzYWdlcy5hZGQobXNnLnV1aWQpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IG1lc3NhZ2UgY291bnRcbiAgICAgICAgICAgICAgc3RhdGUubWVzc2FnZUNvdW50ID0gKHN0YXRlLm1lc3NhZ2VDb3VudCB8fCAwKSArIDE7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlOiBNZXNzYWdlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IGRhdGEuc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IG1zZy51dWlkIHx8IGAke2RhdGEuc2Vzc2lvbl9pZH0tYXNzaXN0YW50LSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogXCJjbGF1ZGUtY29kZVwiLFxuICAgICAgICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgICAgICAgICAgY29udGVudDogbXNnLnRleHQsXG4gICAgICAgICAgICAgICAgbW9kZWw6IG1zZy5tb2RlbCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG1zZy50aW1lc3RhbXAsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zeW5jTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU3RvcmUgc3luY2VkIG1lc3NhZ2UgVVVJRHMgKGNvbnZlcnQgU2V0IHRvIGFycmF5IGZvciBKU09OKVxuICAgICAgICAgICAgc3RhdGUuc3luY2VkTWVzc2FnZVV1aWRzID0gc3luY2VkTWVzc2FnZXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHNlc3Npb25TdGF0ZVtkYXRhLnNlc3Npb25faWRdID0gc3RhdGU7XG4gICAgICAgICAgc2F2ZVNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVwZGF0ZSBzZXNzaW9uIHdpdGggdG9rZW4gdXNhZ2UsIG1vZGVsLCBhbmQgY29zdCBmcm9tIHRyYW5zY3JpcHRcbiAgICAgICAgICBjb25zdCBzZXNzaW9uOiBTZXNzaW9uRGF0YSA9IHtcbiAgICAgICAgICAgIHNlc3Npb25JZDogZGF0YS5zZXNzaW9uX2lkLFxuICAgICAgICAgICAgc291cmNlOiBcImNsYXVkZS1jb2RlXCIsXG4gICAgICAgICAgICBtb2RlbDogc3RhdGUubW9kZWwsXG4gICAgICAgICAgICB0b2tlblVzYWdlOiBzdGF0ZS50b2tlblVzYWdlLFxuICAgICAgICAgICAgbWVzc2FnZUNvdW50OiBzdGF0ZS5tZXNzYWdlQ291bnQsXG4gICAgICAgICAgICB0b29sQ2FsbENvdW50OiBzdGF0ZS50b29sQ2FsbENvdW50LFxuICAgICAgICAgICAgY29zdEVzdGltYXRlOiBzdGF0ZS5jb3N0RXN0aW1hdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCBjbGllbnQuc3luY1Nlc3Npb24oc2Vzc2lvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIFVua25vd24gZXZlbnQsIGlnbm9yZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyB0byBzdGRlcnIgYnV0IGRvbid0IGJsb2NrIENsYXVkZSBDb2RlXG4gICAgICBjb25zb2xlLmVycm9yKGBbY2xhdWRlLWNvZGUtc3luY10gRXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICB9KTtcblxuLy8gUGFyc2UgYW5kIHJ1blxucHJvZ3JhbS5wYXJzZSgpO1xuIl19