speechrecorderng 3.0.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/esm2020/lib/action/action.mjs +2 -1
  2. package/esm2020/lib/audio/array_audio_buffer.mjs +65 -2
  3. package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +2 -2
  4. package/esm2020/lib/audio/array_audio_buffer_random_access_stream.mjs +16 -0
  5. package/esm2020/lib/audio/audio_data_holder.mjs +203 -48
  6. package/esm2020/lib/audio/audio_display.mjs +10 -34
  7. package/esm2020/lib/audio/audio_player.mjs +18 -45
  8. package/esm2020/lib/audio/capture/capture.mjs +293 -69
  9. package/esm2020/lib/audio/dsp/level_measure.mjs +211 -88
  10. package/esm2020/lib/audio/impl/wavformat.mjs +1 -1
  11. package/esm2020/lib/audio/impl/wavreader.mjs +134 -0
  12. package/esm2020/lib/audio/impl/wavwriter.mjs +10 -9
  13. package/esm2020/lib/audio/inddb_audio_buffer.mjs +508 -0
  14. package/esm2020/lib/audio/net_audio_buffer.mjs +297 -0
  15. package/esm2020/lib/audio/persistor.mjs +8 -2
  16. package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +15 -154
  17. package/esm2020/lib/audio/playback/audio_source_node.mjs +18 -0
  18. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  19. package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +167 -0
  20. package/esm2020/lib/audio/playback/net_audio_buffer_source_node.mjs +218 -0
  21. package/esm2020/lib/audio/playback/player.mjs +190 -171
  22. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +35 -76
  23. package/esm2020/lib/audio/ui/audio_display_control.mjs +12 -24
  24. package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +14 -45
  25. package/esm2020/lib/audio/ui/audiosignal.mjs +333 -267
  26. package/esm2020/lib/audio/ui/container.mjs +40 -57
  27. package/esm2020/lib/audio/ui/livelevel.mjs +53 -52
  28. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +5 -19
  29. package/esm2020/lib/audio/ui/sonagram.mjs +386 -339
  30. package/esm2020/lib/db/inddb.mjs +120 -0
  31. package/esm2020/lib/io/BinaryReader.mjs +85 -0
  32. package/esm2020/lib/io/stream.mjs +101 -1
  33. package/esm2020/lib/net/uploader.mjs +111 -5
  34. package/esm2020/lib/recorder_component.mjs +59 -1
  35. package/esm2020/lib/speechrecorder/project/project.mjs +10 -1
  36. package/esm2020/lib/speechrecorder/project/project.service.mjs +3 -3
  37. package/esm2020/lib/speechrecorder/recording.mjs +30 -6
  38. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +213 -0
  39. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +732 -65
  40. package/esm2020/lib/speechrecorder/script/script.service.mjs +3 -3
  41. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +358 -184
  42. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +181 -28
  43. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +47 -129
  44. package/esm2020/lib/speechrecorder/session/item.mjs +13 -1
  45. package/esm2020/lib/speechrecorder/session/progress.mjs +26 -55
  46. package/esm2020/lib/speechrecorder/session/prompting.mjs +33 -176
  47. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -6
  48. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +28 -15
  49. package/esm2020/lib/speechrecorder/session/recording_list.mjs +92 -55
  50. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +9 -13
  51. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +9 -18
  52. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +10 -36
  53. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +10 -37
  54. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +80 -56
  55. package/esm2020/lib/speechrecorder/session/session.service.mjs +3 -3
  56. package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
  57. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +409 -165
  58. package/esm2020/lib/speechrecorder/session/warning_bar.mjs +6 -29
  59. package/esm2020/lib/speechrecorder/spruploader.mjs +3 -3
  60. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +6 -41
  61. package/esm2020/lib/speechrecorderng.component.mjs +42 -31
  62. package/esm2020/lib/speechrecorderng.module.mjs +5 -5
  63. package/esm2020/lib/spr.config.mjs +3 -3
  64. package/esm2020/lib/spr.module.version.mjs +2 -2
  65. package/esm2020/lib/ui/canvas_layer_comp.mjs +3 -3
  66. package/esm2020/lib/ui/message_dialog.mjs +7 -7
  67. package/esm2020/lib/ui/recordingitem_display.mjs +26 -59
  68. package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +3 -3
  69. package/esm2020/lib/utils/ua-parser.mjs +28 -4
  70. package/esm2020/lib/utils/utils.mjs +29 -1
  71. package/fesm2015/speechrecorderng.mjs +12755 -9195
  72. package/fesm2015/speechrecorderng.mjs.map +1 -1
  73. package/fesm2020/speechrecorderng.mjs +12652 -9101
  74. package/fesm2020/speechrecorderng.mjs.map +1 -1
  75. package/{speechrecorderng.d.ts → index.d.ts} +0 -0
  76. package/lib/audio/array_audio_buffer.d.ts +17 -1
  77. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -0
  78. package/lib/audio/audio_data_holder.d.ts +69 -14
  79. package/lib/audio/audio_display.d.ts +1 -1
  80. package/lib/audio/audio_player.d.ts +3 -7
  81. package/lib/audio/capture/capture.d.ts +24 -4
  82. package/lib/audio/dsp/level_measure.d.ts +2 -23
  83. package/lib/audio/impl/wavformat.d.ts +3 -3
  84. package/lib/audio/impl/wavreader.d.ts +16 -0
  85. package/lib/audio/impl/wavwriter.d.ts +1 -4
  86. package/lib/audio/inddb_audio_buffer.d.ts +68 -0
  87. package/lib/audio/net_audio_buffer.d.ts +59 -0
  88. package/lib/audio/persistor.d.ts +3 -9
  89. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +2 -8
  90. package/lib/audio/playback/audio_source_node.d.ts +10 -0
  91. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -0
  92. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -0
  93. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -0
  94. package/lib/audio/playback/player.d.ts +19 -16
  95. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +3 -3
  96. package/lib/audio/ui/audio_display_control.d.ts +3 -6
  97. package/lib/audio/ui/audio_display_scroll_pane.d.ts +1 -1
  98. package/lib/audio/ui/audiosignal.d.ts +4 -3
  99. package/lib/audio/ui/container.d.ts +1 -1
  100. package/lib/audio/ui/livelevel.d.ts +11 -4
  101. package/lib/audio/ui/scroll_pane_horizontal.d.ts +1 -1
  102. package/lib/audio/ui/sonagram.d.ts +4 -3
  103. package/lib/db/inddb.d.ts +21 -0
  104. package/lib/io/BinaryReader.d.ts +18 -0
  105. package/lib/io/stream.d.ts +18 -0
  106. package/lib/net/uploader.d.ts +20 -2
  107. package/lib/recorder_component.d.ts +5 -0
  108. package/lib/speechrecorder/project/project.d.ts +9 -0
  109. package/lib/speechrecorder/recording.d.ts +8 -2
  110. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -0
  111. package/lib/speechrecorder/recordings/recordings.service.d.ts +21 -6
  112. package/lib/speechrecorder/session/audiorecorder.d.ts +7 -18
  113. package/lib/speechrecorder/session/basicrecorder.d.ts +28 -4
  114. package/lib/speechrecorder/session/controlpanel.d.ts +7 -7
  115. package/lib/speechrecorder/session/item.d.ts +1 -0
  116. package/lib/speechrecorder/session/progress.d.ts +2 -1
  117. package/lib/speechrecorder/session/prompting.d.ts +5 -5
  118. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +1 -1
  119. package/lib/speechrecorder/session/recording_file_cache.d.ts +7 -4
  120. package/lib/speechrecorder/session/recording_list.d.ts +2 -1
  121. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -1
  122. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +1 -1
  123. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +1 -1
  124. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -1
  125. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +4 -5
  126. package/lib/speechrecorder/session/session_finished_dialog.d.ts +1 -1
  127. package/lib/speechrecorder/session/sessionmanager.d.ts +10 -10
  128. package/lib/speechrecorder/session/warning_bar.d.ts +1 -1
  129. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +1 -1
  130. package/lib/speechrecorderng.component.d.ts +2 -1
  131. package/lib/spr.module.version.d.ts +1 -1
  132. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  133. package/lib/ui/message_dialog.d.ts +1 -1
  134. package/lib/ui/recordingitem_display.d.ts +3 -2
  135. package/lib/utils/scrollIntoViewToBottom.d.ts +1 -1
  136. package/lib/utils/ua-parser.d.ts +4 -1
  137. package/lib/utils/utils.d.ts +6 -0
  138. package/package.json +5 -4
  139. package/esm2020/lib/math/utils.mjs +0 -14
  140. package/esm2020/lib/utils/css_utils.mjs +0 -7
  141. package/lib/math/utils.d.ts +0 -3
  142. package/lib/utils/css_utils.d.ts +0 -3
@@ -1,10 +1,9 @@
1
1
  import { DFTFloat32 } from '../../math/dft';
2
- import { DSPUtils } from '../../dsp/utils';
3
- import { CSSUtils } from '../../utils/css_utils';
4
2
  import { Point } from './common';
5
3
  import { Component, ViewChild } from "@angular/core";
6
4
  import { AudioCanvasLayerComponent } from "./audio_canvas_layer_comp";
7
5
  import { WorkerHelper } from "../../utils/utils";
6
+ import { AudioBufferSource } from "../audio_data_holder";
8
7
  import * as i0 from "@angular/core";
9
8
  const DEFAULT_DFT_SIZE = 1024;
10
9
  export class Sonagram extends AudioCanvasLayerComponent {
@@ -12,6 +11,7 @@ export class Sonagram extends AudioCanvasLayerComponent {
12
11
  super();
13
12
  this.ref = ref;
14
13
  this._playFramePosition = null;
14
+ this.raAsSubsc = null;
15
15
  this.dftSize = DEFAULT_DFT_SIZE;
16
16
  this.worker = null;
17
17
  this._audioDataHolder = null;
@@ -50,6 +50,19 @@ export class Sonagram extends AudioCanvasLayerComponent {
50
50
  const y = e.y - cr.top;
51
51
  return new Point(x, y);
52
52
  }
53
+ drawStateText(stateText) {
54
+ if (stateText) {
55
+ const g = this.sonagramCanvas.getContext("2d");
56
+ const w = this.sonagramCanvas.width;
57
+ const h = this.sonagramCanvas.height;
58
+ if (g && w && h) {
59
+ g.strokeStyle = 'black';
60
+ g.fillStyle = 'black';
61
+ g.font = '20px sans-serif';
62
+ g.fillText(stateText, 10, 25);
63
+ }
64
+ }
65
+ }
53
66
  drawCursorPosition(e, show) {
54
67
  if (this.cursorCanvas) {
55
68
  const w = this.cursorCanvas.width;
@@ -58,7 +71,7 @@ export class Sonagram extends AudioCanvasLayerComponent {
58
71
  if (g) {
59
72
  g.clearRect(0, 0, w, h);
60
73
  if (show) {
61
- const pp = this.canvasMousePos(this.cursorCanvas, e);
74
+ //const pp = this.canvasMousePos(this.cursorCanvas, e);
62
75
  let xViewPortPixelpos = e.offsetX;
63
76
  g.fillStyle = 'yellow';
64
77
  g.strokeStyle = 'yellow';
@@ -81,9 +94,9 @@ export class Sonagram extends AudioCanvasLayerComponent {
81
94
  }
82
95
  drawPlayPosition() {
83
96
  if (this.markerCanvas) {
84
- var w = this.markerCanvas.width;
85
- var h = this.markerCanvas.height;
86
- var g = this.markerCanvas.getContext("2d");
97
+ const w = this.markerCanvas.width;
98
+ const h = this.markerCanvas.height;
99
+ const g = this.markerCanvas.getContext("2d");
87
100
  if (g) {
88
101
  g.clearRect(0, 0, w, h);
89
102
  if (this._playFramePosition != null) {
@@ -101,53 +114,6 @@ export class Sonagram extends AudioCanvasLayerComponent {
101
114
  }
102
115
  }
103
116
  }
104
- // layout() {
105
- //
106
- //
107
- // var offW = this.sonagramCanvas.offsetWidth;
108
- // var offH = this.sonagramCanvas.offsetHeight;
109
- // this.layoutBounds(0, 0, offW, offH, true);
110
- // }
111
- // layoutBounds(left: number, top: number, offW: number, offH: number, virtualWidth:number,redraw: boolean) {
112
- //
113
- // const leftStr = left.toString() + 'px';
114
- // this.sonagramCanvas.style.left = leftStr;
115
- // const topStr = top.toString() + 'px';
116
- // this.sonagramCanvas.style.top = topStr;
117
- // this.cursorCanvas.style.top = topStr;
118
- // this.markerCanvas.style.top = topStr;
119
- //
120
- // if (offW) {
121
- // const wStr = offW.toString() + 'px';
122
- // if (redraw) {
123
- //
124
- // this.cursorCanvas.width = offW;
125
- // this.markerCanvas.width = offW;
126
- // }
127
- // this.sonagramCanvas.style.width = wStr;
128
- // this.cursorCanvas.style.width = wStr;
129
- // this.markerCanvas.style.width = wStr;
130
- // }
131
- // if (offH) {
132
- // const hStr = offH.toString() + 'px';
133
- // if (redraw) {
134
- // this.cursorCanvas.height = offH;
135
- // this.markerCanvas.height = offH;
136
- // }
137
- // this.sonagramCanvas.style.height = hStr;
138
- // this.cursorCanvas.style.height = hStr;
139
- // this.markerCanvas.style.height = hStr;
140
- //
141
- // }
142
- // if (redraw) {
143
- // //this.redraw();
144
- // if (offW > 0) {
145
- // if (offH > 0) {
146
- // this.startDraw(left,top,offW, offH,virtualWidth);
147
- // }
148
- // }
149
- // }
150
- // }
151
117
  /*
152
118
  * Method used as worker code.
153
119
  */
@@ -369,11 +335,8 @@ export class Sonagram extends AudioCanvasLayerComponent {
369
335
  //console.debug("Render: ", w, "x", h);
370
336
  let b = new Float32Array(dftSize);
371
337
  let sona = new Array(chs);
372
- //let p = 0;
373
338
  for (let ch = 0; ch < chs; ch++) {
374
- //p = ch * frameLength;
375
339
  let chDataLen = audioData[ch].length;
376
- let x = 0;
377
340
  // initialize DFT array buffer
378
341
  sona[ch] = new Array(w);
379
342
  let framePos = 0;
@@ -421,7 +384,7 @@ export class Sonagram extends AudioCanvasLayerComponent {
421
384
  let allBlack = true;
422
385
  for (let y = 0; y < chH; y++) {
423
386
  let freqIdx = Math.round(y * dftBands / chH);
424
- // calculate the one sided power spectral density PSD (f, t) in Pa2/Hz
387
+ // calculate the one-sided power spectral density PSD (f, t) in Pa2/Hz
425
388
  // PSD(f) proportional to 2|X(f)|2 / (t2 - t1)
426
389
  let val = sona[ch][pii][freqIdx];
427
390
  let psd = (2 * Math.pow(val, 2)) / dftBands;
@@ -498,199 +461,280 @@ export class Sonagram extends AudioCanvasLayerComponent {
498
461
  this.drawCursorLayer();
499
462
  }
500
463
  startRender() {
464
+ //console.debug("Sonagram start render...");
501
465
  if (this.worker) {
502
466
  this.worker.terminate();
503
467
  this.worker = null;
504
468
  }
505
- if (this.bounds) {
506
- let w = Math.round(this.bounds.dimension.width);
507
- let h = Math.round(this.bounds.dimension.height);
508
- if (this._audioDataHolder && w > 0 && h > 0) {
509
- this.worker = new Worker(this.workerURL);
510
- //this.wo = new Worker('./worker/sonagram.worker', { type: `module` });
511
- let chs = this._audioDataHolder.numberOfChannels;
512
- let vw = Math.round(this.virtualDimension.width);
513
- let frameLength = this._audioDataHolder.frameLen;
514
- let framesPerPixel = Math.ceil(frameLength / vw);
515
- let leftPos = Math.round(this.bounds.position.left);
516
- let renderPos = leftPos;
517
- let audioBuffer = this._audioDataHolder.buffer;
518
- //let arrayAudioBuffer=this._audioDataHolder.arrayBuffer;
519
- let arrAbBuf;
520
- let imgData;
521
- let maxPsd = -Infinity;
522
- let norender = true;
523
- if (this.worker) {
524
- this.worker.onmessage = (me) => {
525
- if (true === me.data.terminate) {
526
- let drawImgData;
527
- if (imgData) {
528
- drawImgData = imgData;
529
- }
530
- else {
531
- drawImgData = me.data.imgData;
532
- }
533
- this.drawRendered(w, h, drawImgData);
534
- if (this.worker) {
535
- this.worker.terminate();
536
- }
537
- this.worker = null;
469
+ if (this.raAsSubsc) {
470
+ this.raAsSubsc.unsubscribe();
471
+ }
472
+ if (this._audioDataHolder) {
473
+ this._audioDataHolder.addOnReadyListener(() => {
474
+ if (this._audioDataHolder && this.bounds && this.bounds.dimension) {
475
+ let w = Math.round(this.bounds.dimension.width);
476
+ let h = Math.round(this.bounds.dimension.height);
477
+ let vw = Math.round(this.virtualDimension.width);
478
+ if (w > 0 && h > 0 && vw > 0) {
479
+ this.worker = new Worker(this.workerURL);
480
+ //this.wo = new Worker('./worker/sonagram.worker', { type: `module` });
481
+ let chs = this._audioDataHolder.numberOfChannels;
482
+ let vw = Math.round(this.virtualDimension.width);
483
+ let frameLength = this._audioDataHolder.frameLen;
484
+ let framesPerPixel = Math.ceil(frameLength / vw);
485
+ let leftPos = Math.round(this.bounds.position.left);
486
+ let renderPos = leftPos;
487
+ let raAs = this._audioDataHolder.randomAccessAudioStream();
488
+ let audioBuffer = null;
489
+ let audioSource = this._audioDataHolder.audioSource;
490
+ if (audioSource instanceof AudioBufferSource) {
491
+ audioBuffer = audioSource.audioBuffer;
538
492
  }
539
- else {
540
- // set rendered vertical values of one pixel of timescale
541
- //let dataPos = renderPos * h * 4;
542
- if (norender) {
543
- if (me.data.maxPsd > maxPsd) {
544
- maxPsd = me.data.maxPsd;
545
- //console.debug("new maxPsd: "+maxPsd);
546
- }
547
- }
548
- else {
549
- let chH = Math.round(h / chs);
550
- let idp = me.data.l - leftPos;
551
- for (let ch = 0; ch < chs; ch++) {
552
- for (let y = 0; y < chH; y++) {
553
- let py = chH - y;
554
- let dataPos = ((((ch * chH) + py) * w) + idp) * 4;
555
- let mePos = ((ch * chH) + py) * 4;
556
- //let lastPos = dataPos + me.data.imgData.length;
557
- //if (lastPos < imgData.length) {
558
- // set one pixel
559
- imgData[dataPos] = me.data.imgData[mePos];
560
- imgData[dataPos + 1] = me.data.imgData[mePos + 1];
561
- imgData[dataPos + 2] = me.data.imgData[mePos + 2];
562
- imgData[dataPos + 3] = me.data.imgData[mePos + 3];
563
- //} else {
564
- //console.error("Out of range: " + dataPos + "+" + me.data.imgData.length + ">=" + imgData.length);
565
- // }
493
+ //let arrayAudioBuffer=this._audioDataHolder.arrayBuffer;
494
+ let arrAbBuf;
495
+ let ada = new Array(chs);
496
+ // for(let ch=0;ch<chs;ch++) {
497
+ // ada[ch] = new Float32Array(this.dftSize);
498
+ // }
499
+ let imgData;
500
+ let maxPsd = -Infinity;
501
+ let norender = true;
502
+ if (this.worker) {
503
+ this.worker.onmessage = (me) => {
504
+ if (true === me.data.terminate) {
505
+ let drawImgData;
506
+ if (imgData) {
507
+ drawImgData = imgData;
566
508
  }
509
+ else {
510
+ drawImgData = me.data.imgData;
511
+ }
512
+ this.drawRendered(w, h, drawImgData);
513
+ if (this.worker) {
514
+ this.worker.terminate();
515
+ }
516
+ this.worker = null;
517
+ raAs.close();
567
518
  }
568
- }
569
- if (this._audioDataHolder && arrAbBuf && this.worker) {
570
- // proceed with next pixel
571
- renderPos++;
572
- //console.debug("Render pos: "+renderPos);
573
- let terminate = false;
574
- let windowEnd = renderPos >= leftPos + w;
575
- if (windowEnd) {
519
+ else {
520
+ // set rendered vertical values of one pixel of timescale
521
+ //let dataPos = renderPos * h * 4;
576
522
  if (norender) {
577
- // phase two: rendering
578
- norender = false;
579
- // start from beginning
580
- renderPos = leftPos;
581
- //console.debug("now rendering: maxPsd: "+maxPsd);
523
+ if (me.data.maxPsd > maxPsd) {
524
+ maxPsd = me.data.maxPsd;
525
+ //console.debug("new maxPsd: "+maxPsd);
526
+ }
582
527
  }
583
528
  else {
584
- // terminate render phase
585
- terminate = true;
586
- }
587
- }
588
- let leftFramePos = Math.floor(frameLength * renderPos / vw) - this.dftSize / 2;
589
- if (leftFramePos < 0) {
590
- leftFramePos = 0;
591
- }
592
- let ada = new Array(chs);
593
- //console.debug("Render pos: "+renderPos+" leftFramePos: "+leftFramePos);
594
- if (!terminate) {
595
- if (this._audioDataHolder) {
596
- let read = this._audioDataHolder.frames(leftFramePos, this.dftSize, arrAbBuf);
529
+ let chH = Math.round(h / chs);
530
+ let idp = me.data.l - leftPos;
597
531
  for (let ch = 0; ch < chs; ch++) {
598
- // Need a copy here for the worker, otherwise this.audioData is not accessible after posting to the worker
599
- ada[ch] = arrAbBuf[ch].buffer.slice(0);
532
+ for (let y = 0; y < chH; y++) {
533
+ let py = chH - y;
534
+ let dataPos = ((((ch * chH) + py) * w) + idp) * 4;
535
+ let mePos = ((ch * chH) + py) * 4;
536
+ //let lastPos = dataPos + me.data.imgData.length;
537
+ //if (lastPos < imgData.length) {
538
+ // set one pixel
539
+ imgData[dataPos] = me.data.imgData[mePos];
540
+ imgData[dataPos + 1] = me.data.imgData[mePos + 1];
541
+ imgData[dataPos + 2] = me.data.imgData[mePos + 2];
542
+ imgData[dataPos + 3] = me.data.imgData[mePos + 3];
543
+ //} else {
544
+ //console.error("Out of range: " + dataPos + "+" + me.data.imgData.length + ">=" + imgData.length);
545
+ // }
546
+ }
600
547
  }
601
548
  }
602
- }
603
- else {
604
- for (let ch = 0; ch < chs; ch++) {
605
- ada[ch] = new ArrayBuffer(0);
549
+ if (this._audioDataHolder && arrAbBuf && this.worker) {
550
+ // proceed with next pixel
551
+ renderPos++;
552
+ //console.debug("Render pos: "+renderPos);
553
+ let terminate = false;
554
+ let windowEnd = renderPos >= leftPos + w;
555
+ if (windowEnd) {
556
+ if (norender) {
557
+ // phase two: rendering
558
+ norender = false;
559
+ // start from beginning
560
+ renderPos = leftPos;
561
+ //console.debug("now rendering: maxPsd: "+maxPsd);
562
+ }
563
+ else {
564
+ // terminate render phase
565
+ terminate = true;
566
+ }
567
+ }
568
+ let leftFramePos = Math.floor(frameLength * renderPos / vw) - this.dftSize / 2;
569
+ if (leftFramePos < 0) {
570
+ leftFramePos = 0;
571
+ }
572
+ //let ada = new Array<ArrayBuffer>(chs);
573
+ //console.debug("Render pos: "+renderPos+" leftFramePos: "+leftFramePos);
574
+ if (!terminate) {
575
+ if (this._audioDataHolder) {
576
+ //let read = this._audioDataHolder.frames(leftFramePos, this.dftSize, arrAbBuf);
577
+ this.raAsSubsc = raAs.framesObs(leftFramePos, this.dftSize, arrAbBuf).subscribe({
578
+ next: (read) => {
579
+ if (arrAbBuf && this.worker) {
580
+ if (read < this.dftSize) {
581
+ // zero padding
582
+ for (let ch = 0; ch < chs; ch++) {
583
+ for (let zp = read; zp < this.dftSize; zp++) {
584
+ arrAbBuf[ch][zp] = 0;
585
+ }
586
+ }
587
+ }
588
+ for (let ch = 0; ch < chs; ch++) {
589
+ // Need a copy here for the worker, otherwise this.audioData is not accessible after posting to the worker
590
+ //ada[ch] = arrAbBuf[ch].buffer.slice(0);
591
+ const arrAbBufCh = arrAbBuf[ch];
592
+ const adLen = arrAbBufCh.buffer.byteLength;
593
+ if (!ada[ch] || ada[ch].byteLength !== adLen) {
594
+ ada[ch] = new ArrayBuffer(adLen);
595
+ }
596
+ let fAdaCh = new Float32Array(ada[ch]);
597
+ fAdaCh.set(arrAbBuf[ch]);
598
+ }
599
+ this.worker.postMessage({
600
+ audioData: ada,
601
+ audioDataOffset: leftFramePos,
602
+ l: renderPos,
603
+ w: me.data.w,
604
+ h: h,
605
+ vw: vw,
606
+ chs: chs,
607
+ frameLength: frameLength,
608
+ dftSize: this.dftSize,
609
+ maxPsd: maxPsd,
610
+ norender: norender,
611
+ terminate: terminate
612
+ }, ada);
613
+ }
614
+ },
615
+ error: (err) => {
616
+ console.error("Sonagram: Error reading audio data: " + err);
617
+ }
618
+ });
619
+ }
620
+ }
621
+ else {
622
+ for (let ch = 0; ch < chs; ch++) {
623
+ ada[ch] = new ArrayBuffer(0);
624
+ }
625
+ this.worker.postMessage({
626
+ audioData: ada,
627
+ audioDataOffset: leftFramePos,
628
+ l: renderPos,
629
+ w: me.data.w,
630
+ h: h,
631
+ vw: vw,
632
+ chs: chs,
633
+ frameLength: frameLength,
634
+ dftSize: this.dftSize,
635
+ maxPsd: maxPsd,
636
+ norender: norender,
637
+ terminate: terminate
638
+ }, ada);
639
+ }
606
640
  }
607
641
  }
608
- this.worker.postMessage({
609
- audioData: ada,
610
- audioDataOffset: leftFramePos,
611
- l: renderPos,
612
- w: me.data.w,
613
- h: h,
614
- vw: vw,
615
- chs: chs,
616
- frameLength: frameLength,
617
- dftSize: this.dftSize,
618
- maxPsd: maxPsd,
619
- norender: norender,
620
- terminate: terminate
621
- }, ada);
622
- }
623
- }
624
- };
625
- }
626
- if (audioBuffer && audioBuffer.length * audioBuffer.numberOfChannels < AudioCanvasLayerComponent.ENABLE_STREAMING_NUMBER_OF_SAMPLES_THRESHOLD) {
627
- let ada = new Array(chs);
628
- for (let ch = 0; ch < chs; ch++) {
629
- // Need a copy here for the worker, otherwise this.audioData is not accessible after posting to the worker
630
- ada[ch] = audioBuffer.getChannelData(ch).buffer.slice(0);
631
- }
632
- let start = Date.now();
633
- if (this.markerCanvas) {
634
- let g = this.markerCanvas.getContext("2d");
635
- if (g) {
636
- g.fillText("Rendering...", 10, 20);
642
+ };
637
643
  }
638
- }
639
- this.worker.postMessage({
640
- audioData: ada,
641
- l: leftPos,
642
- w: w,
643
- h: h,
644
- vw: Math.round(this.virtualDimension.width),
645
- chs: chs,
646
- frameLength: frameLength,
647
- dftSize: this.dftSize,
648
- terminate: true
649
- }, ada);
650
- }
651
- else {
652
- if (w > 0) {
653
- if (framesPerPixel > 0) {
654
- let arrSize = w * h * 4;
655
- if (arrSize < 0) {
656
- arrSize = 0;
657
- }
658
- imgData = new Uint8ClampedArray(arrSize);
659
- let rw = 1;
660
- //ais = new ArrayAudioBufferInputStream(arrayAudioBuffer);
661
- arrAbBuf = new Array(chs);
644
+ if (audioBuffer && audioBuffer.length * audioBuffer.numberOfChannels < AudioCanvasLayerComponent.ENABLE_STREAMING_NUMBER_OF_SAMPLES_THRESHOLD) {
645
+ let ada = new Array(chs);
662
646
  for (let ch = 0; ch < chs; ch++) {
663
- arrAbBuf[ch] = new Float32Array(this.dftSize);
664
- }
665
- let leftFramePos = Math.floor(frameLength * renderPos / vw) - this.dftSize / 2;
666
- let framesToRead = this.dftSize;
667
- if (leftFramePos < 0) {
668
- //framesToRead=this.dftSize+leftFramePos;
669
- leftFramePos = 0;
647
+ // Need a copy here for the worker, otherwise this.audioData is not accessible after posting to the worker
648
+ ada[ch] = audioBuffer.getChannelData(ch).buffer.slice(0);
670
649
  }
671
- let read = this._audioDataHolder.frames(leftFramePos, framesToRead, arrAbBuf);
672
- let ad = new Float32Array(chs * framesToRead);
673
- for (let ch = 0; ch < chs; ch++) {
674
- ad.set(arrAbBuf[ch], ch * framesToRead);
650
+ //let start = Date.now();
651
+ if (this.markerCanvas) {
652
+ let g = this.markerCanvas.getContext("2d");
653
+ if (g) {
654
+ g.fillText("Rendering...", 10, 20);
655
+ }
675
656
  }
676
657
  this.worker.postMessage({
677
- l: renderPos,
678
- w: rw,
658
+ audioData: ada,
659
+ l: leftPos,
660
+ w: w,
679
661
  h: h,
680
- vw: vw,
662
+ vw: Math.round(this.virtualDimension.width),
681
663
  chs: chs,
682
664
  frameLength: frameLength,
683
- audioData: ad,
684
- audioDataOffset: leftFramePos,
685
665
  dftSize: this.dftSize,
686
- norender: norender,
687
- terminate: false
688
- }, [ad.buffer]);
666
+ terminate: true
667
+ }, ada);
668
+ }
669
+ else {
670
+ if (w > 0) {
671
+ if (framesPerPixel > 0) {
672
+ let arrSize = w * h * 4;
673
+ if (arrSize < 0) {
674
+ arrSize = 0;
675
+ }
676
+ imgData = new Uint8ClampedArray(arrSize);
677
+ let rw = 1;
678
+ arrAbBuf = new Array(chs);
679
+ for (let ch = 0; ch < chs; ch++) {
680
+ arrAbBuf[ch] = new Float32Array(this.dftSize);
681
+ }
682
+ let leftFramePos = Math.floor(frameLength * renderPos / vw) - this.dftSize / 2;
683
+ let framesToRead = this.dftSize;
684
+ if (leftFramePos < 0) {
685
+ leftFramePos = 0;
686
+ }
687
+ this.drawStateText('Loading/Rendering...');
688
+ this.raAsSubsc = raAs.framesObs(leftFramePos, framesToRead, arrAbBuf).subscribe({
689
+ next: (read) => {
690
+ if (arrAbBuf && this.worker) {
691
+ if (read < this.dftSize) {
692
+ // zero padding
693
+ for (let ch = 0; ch < chs; ch++) {
694
+ for (let zp = read; zp < this.dftSize; zp++) {
695
+ arrAbBuf[ch][zp] = 0;
696
+ }
697
+ }
698
+ }
699
+ for (let ch = 0; ch < chs; ch++) {
700
+ const arrAbBufCh = arrAbBuf[ch];
701
+ const adLen = arrAbBufCh.buffer.byteLength;
702
+ if (!ada[ch] || ada[ch].byteLength !== adLen) {
703
+ ada[ch] = new ArrayBuffer(adLen);
704
+ }
705
+ let fAdaCh = new Float32Array(ada[ch]);
706
+ fAdaCh.set(arrAbBuf[ch]);
707
+ }
708
+ this.worker.postMessage({
709
+ l: renderPos,
710
+ w: rw,
711
+ h: h,
712
+ vw: vw,
713
+ chs: chs,
714
+ frameLength: frameLength,
715
+ audioData: ada,
716
+ audioDataOffset: leftFramePos,
717
+ dftSize: this.dftSize,
718
+ norender: norender,
719
+ terminate: false
720
+ }, ada);
721
+ }
722
+ },
723
+ error: (err) => {
724
+ console.error("Sonagram: Error reading audio data: " + err);
725
+ }
726
+ });
727
+ }
728
+ }
689
729
  }
690
730
  }
691
731
  }
692
- }
693
- else {
732
+ });
733
+ }
734
+ else {
735
+ if (this.bounds && this.bounds.dimension) {
736
+ let w = Math.round(this.bounds.dimension.width);
737
+ let h = Math.round(this.bounds.dimension.height);
694
738
  let g = this.sonagramCanvas.getContext("2d");
695
739
  if (g) {
696
740
  g.clearRect(0, 0, w, h);
@@ -704,10 +748,9 @@ export class Sonagram extends AudioCanvasLayerComponent {
704
748
  this.sonagramCanvas.height = h;
705
749
  let g = this.sonagramCanvas.getContext("2d");
706
750
  if (g) {
707
- let imgDataArr = imgData;
708
751
  if (w > 0 && h > 0) {
709
752
  let gImgData = g.createImageData(w, h);
710
- gImgData.data.set(imgDataArr);
753
+ gImgData.data.set(imgData);
711
754
  g.putImageData(gImgData, 0, 0);
712
755
  }
713
756
  }
@@ -715,134 +758,138 @@ export class Sonagram extends AudioCanvasLayerComponent {
715
758
  this.drawBg();
716
759
  this.drawPlayPosition();
717
760
  }
718
- // synchronous draw (not used anymore)
719
- redraw() {
720
- let g = this.sonagramCanvas.getContext("2d");
721
- let w = this.sonagramCanvas.width;
722
- let h = this.sonagramCanvas.height;
723
- if (g) {
724
- g.clearRect(0, 0, w, h);
725
- g.fillStyle = "white";
726
- g.fillRect(0, 0, w, h);
727
- if (this._audioDataHolder) {
728
- let spectSize = Math.floor(this.dftSize / 2);
729
- let chs = this._audioDataHolder.numberOfChannels;
730
- let chH = h / chs;
731
- let frameLength = this._audioDataHolder.frameLen;
732
- let framesPerPixel = frameLength / w;
733
- let y = 0;
734
- let audioBuffer = this._audioDataHolder.buffer;
735
- let arrayAudioBuffer = this._audioDataHolder.arrayBuffer;
736
- if (audioBuffer) {
737
- let b = new Float32Array(this.dftSize);
738
- let sona = new Array(chs);
739
- let max = 0;
740
- let maxPsd = -Infinity;
741
- for (let ch = 0; ch < chs; ch++) {
742
- let x = 0;
743
- sona[ch] = new Array(w);
744
- let chData = audioBuffer.getChannelData(ch);
745
- // TODO center buffer
746
- let framePos = 0;
747
- for (let pii = 0; pii < w; pii++) {
748
- framePos = Math.round(pii * framesPerPixel);
749
- // calculate DFT at pixel position
750
- for (let i = 0; i < this.dftSize; i++) {
751
- let chDat = chData[framePos + i];
752
- b[i] = chDat;
753
- }
754
- let spectr = this.dft.processRealMagnitude(b);
755
- sona[ch][pii] = spectr;
756
- // @ts-ignore
757
- let pMax = Math.max.apply(null, spectr);
758
- if (pMax > max) {
759
- max = pMax;
760
- }
761
- for (let s = 0; s < spectSize; s++) {
762
- let psd = (2 * Math.pow(spectr[s], 2)) / spectSize;
763
- if (psd > maxPsd) {
764
- maxPsd = psd;
765
- }
766
- }
767
- }
768
- }
769
- //console.log("max: ", max);
770
- maxPsd = (2 * Math.pow(max, 2)) / spectSize;
771
- for (let ch = 0; ch < chs; ch++) {
772
- let framePos = 0;
773
- for (let pii = 0; pii < w; pii++) {
774
- framePos = pii * framesPerPixel;
775
- for (let y = 0; y < h; y++) {
776
- let freqIdx = Math.round(y * spectSize / h);
777
- // calculate the one sided power spectral density PSD (f, t) in Pa2/Hz
778
- // PSD(f) proportional to 2|X(f)|2 / (t2 - t1)
779
- let val = sona[ch][pii][freqIdx];
780
- let psd = (2 * Math.pow(val, 2)) / spectSize;
781
- // Calculate logarithmic
782
- let psdLog = DSPUtils.toLevelInDB(psd / maxPsd);
783
- let dynRangeInDb = 70;
784
- let scaledVal = (psdLog + dynRangeInDb) / dynRangeInDb;
785
- if (scaledVal > 1)
786
- scaledVal = 1;
787
- if (scaledVal < 0) {
788
- scaledVal = 0;
789
- }
790
- let rgbVal = (255 * scaledVal);
791
- if (rgbVal < 0) {
792
- // System.out.println("Neg RGB val: "+rgbVal);
793
- rgbVal = 0;
794
- }
795
- if (rgbVal > 255) {
796
- rgbVal = 255;
797
- }
798
- rgbVal = 255 - rgbVal;
799
- let colorStr = CSSUtils.toColorString(rgbVal, rgbVal, rgbVal);
800
- g.fillStyle = colorStr;
801
- g.fillRect(pii, chH - y, 1, 1);
802
- }
803
- }
804
- }
805
- this.drawPlayPosition();
806
- }
807
- else if (arrayAudioBuffer) {
808
- throw Error("Redraw with array audio buffer not supported.");
809
- }
810
- }
811
- }
812
- }
761
+ // // synchronous draw (not used anymore)
762
+ // redraw() {
763
+ //
764
+ // let g = this.sonagramCanvas.getContext("2d");
765
+ //
766
+ // let w = this.sonagramCanvas.width;
767
+ // let h = this.sonagramCanvas.height;
768
+ // if (g) {
769
+ // g.clearRect(0, 0, w, h);
770
+ // g.fillStyle = "white";
771
+ // g.fillRect(0, 0, w, h);
772
+ // if (this._audioDataHolder) {
773
+ // let spectSize = Math.floor(this.dftSize / 2)
774
+ // let chs = this._audioDataHolder.numberOfChannels;
775
+ // let chH = h / chs;
776
+ //
777
+ // let frameLength = this._audioDataHolder.frameLen;
778
+ //
779
+ // let framesPerPixel = frameLength / w;
780
+ // let y = 0;
781
+ // let audioBuffer:AudioBuffer|null=null;
782
+ // let audioSource=this._audioDataHolder.audioSource;
783
+ // if(audioSource instanceof AudioBufferSource){
784
+ // audioBuffer=audioSource.audioBuffer;
785
+ // }
786
+ //
787
+ // if(audioBuffer) {
788
+ // let b = new Float32Array(this.dftSize)
789
+ //
790
+ // let sona = new Array<Array<Float32Array>>(chs);
791
+ // let max = 0;
792
+ // let maxPsd = -Infinity;
793
+ // for (let ch = 0; ch < chs; ch++) {
794
+ // let x = 0;
795
+ // sona[ch] = new Array<Float32Array>(w);
796
+ //
797
+ // let chData = audioBuffer.getChannelData(ch);
798
+ // // TODO center buffer
799
+ //
800
+ // let framePos = 0;
801
+ // for (let pii = 0; pii < w; pii++) {
802
+ // framePos = Math.round(pii * framesPerPixel);
803
+ // // calculate DFT at pixel position
804
+ // for (let i = 0; i < this.dftSize; i++) {
805
+ // let chDat = chData[framePos + i];
806
+ // b[i] = chDat;
807
+ // }
808
+ // let spectr = this.dft.processRealMagnitude(b);
809
+ // sona[ch][pii] = spectr;
810
+ // // @ts-ignore
811
+ // let pMax = Math.max.apply(null, spectr);
812
+ // if (pMax > max) {
813
+ // max = pMax;
814
+ // }
815
+ //
816
+ // for (let s = 0; s < spectSize; s++) {
817
+ // let psd = (2 * Math.pow(spectr[s], 2)) / spectSize;
818
+ // if (psd > maxPsd) {
819
+ // maxPsd = psd;
820
+ // }
821
+ // }
822
+ // }
823
+ // }
824
+ // //console.log("max: ", max);
825
+ // maxPsd = (2 * Math.pow(max, 2)) / spectSize;
826
+ // for (let ch = 0; ch < chs; ch++) {
827
+ //
828
+ // let framePos = 0;
829
+ // for (let pii = 0; pii < w; pii++) {
830
+ // framePos = pii * framesPerPixel;
831
+ //
832
+ // for (let y = 0; y < h; y++) {
833
+ // let freqIdx = Math.round(y * spectSize / h);
834
+ //
835
+ // // calculate the one sided power spectral density PSD (f, t) in Pa2/Hz
836
+ // // PSD(f) proportional to 2|X(f)|2 / (t2 - t1)
837
+ // let val = sona[ch][pii][freqIdx];
838
+ // let psd = (2 * Math.pow(val, 2)) / spectSize;
839
+ //
840
+ // // Calculate logarithmic
841
+ // let psdLog = DSPUtils.toLevelInDB(psd / maxPsd);
842
+ // let dynRangeInDb = 70;
843
+ // let scaledVal = (psdLog + dynRangeInDb) / dynRangeInDb;
844
+ //
845
+ // if (scaledVal > 1)
846
+ // scaledVal = 1;
847
+ // if (scaledVal < 0) {
848
+ // scaledVal = 0;
849
+ // }
850
+ // let rgbVal = (255 * scaledVal);
851
+ // if (rgbVal < 0) {
852
+ // // System.out.println("Neg RGB val: "+rgbVal);
853
+ // rgbVal = 0;
854
+ // }
855
+ // if (rgbVal > 255) {
856
+ // rgbVal = 255;
857
+ // }
858
+ // rgbVal = 255 - rgbVal;
859
+ // let colorStr = CSSUtils.toColorString(rgbVal, rgbVal, rgbVal);
860
+ // g.fillStyle = colorStr;
861
+ // g.fillRect(pii, chH - y, 1, 1);
862
+ // }
863
+ // }
864
+ // }
865
+ // this.drawPlayPosition();
866
+ // }else{
867
+ // throw Error("Redraw only supported with audio buffer.")
868
+ // }
869
+ // }
870
+ // }
871
+ // }
872
+ //
813
873
  setData(audioData) {
814
874
  this._audioDataHolder = audioData;
815
875
  this.playFramePosition = 0;
816
876
  }
817
877
  }
818
- Sonagram.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: Sonagram, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
819
- Sonagram.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: Sonagram, selector: "audio-sonagram", viewQueries: [{ propertyName: "sonagramCanvasRef", first: true, predicate: ["sonagram"], descendants: true, static: true }, { propertyName: "markerCanvasRef", first: true, predicate: ["marker"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
878
+ Sonagram.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: Sonagram, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
879
+ Sonagram.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: Sonagram, selector: "audio-sonagram", viewQueries: [{ propertyName: "sonagramCanvasRef", first: true, predicate: ["sonagram"], descendants: true, static: true }, { propertyName: "markerCanvasRef", first: true, predicate: ["marker"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
820
880
  <canvas #sonagram height="10"></canvas>
821
881
  <canvas #bg height="10"></canvas>
822
882
  <canvas #cursor height="10" (mousedown)="selectionStart($event)" (mouseover)="updateCursorCanvas($event)" (mousemove)="updateCursorCanvas($event)"
823
883
  (mouseleave)="updateCursorCanvas($event, false)"></canvas>
824
884
  <canvas #marker height="10"></canvas>`, isInline: true, styles: [":host{min-height:0px}\n", "canvas{top:0;left:0;width:0;height:0;min-height:0px;position:absolute}\n"] });
825
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: Sonagram, decorators: [{
885
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: Sonagram, decorators: [{
826
886
  type: Component,
827
- args: [{
828
- selector: 'audio-sonagram',
829
- template: `
887
+ args: [{ selector: 'audio-sonagram', template: `
830
888
  <canvas #sonagram height="10"></canvas>
831
889
  <canvas #bg height="10"></canvas>
832
890
  <canvas #cursor height="10" (mousedown)="selectionStart($event)" (mouseover)="updateCursorCanvas($event)" (mousemove)="updateCursorCanvas($event)"
833
891
  (mouseleave)="updateCursorCanvas($event, false)"></canvas>
834
- <canvas #marker height="10"></canvas>`,
835
- styles: [`:host{
836
- min-height: 0px;
837
- }`, `canvas {
838
- top: 0;
839
- left: 0;
840
- width: 0;
841
- height: 0;
842
- min-height: 0px;
843
- position: absolute;
844
- }`]
845
- }]
892
+ <canvas #marker height="10"></canvas>`, styles: [":host{min-height:0px}\n", "canvas{top:0;left:0;width:0;height:0;min-height:0px;position:absolute}\n"] }]
846
893
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { sonagramCanvasRef: [{
847
894
  type: ViewChild,
848
895
  args: ['sonagram', { static: true }]
@@ -850,4 +897,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
850
897
  type: ViewChild,
851
898
  args: ['marker', { static: true }]
852
899
  }] } });
853
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYWdyYW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vdWkvc29uYWdyYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sdUJBQXVCLENBQUE7QUFDOUMsT0FBTyxFQUFTLEtBQUssRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFjLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7O0FBSy9DLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBd0I5QixNQUFNLE9BQU8sUUFBUyxTQUFRLHlCQUF5QjtJQWtCbkQsWUFBb0IsR0FBZTtRQUMvQixLQUFLLEVBQUUsQ0FBQztRQURRLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFOM0IsdUJBQWtCLEdBQWMsSUFBSSxDQUFDO1FBSXJDLFlBQU8sR0FBRyxnQkFBZ0IsQ0FBQztRQUkvQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNuQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4QyxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMs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RUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7REZURmxvYXQzMn0gZnJvbSAnLi4vLi4vbWF0aC9kZnQnO1xyXG5pbXBvcnQge0RTUFV0aWxzfSBmcm9tICcuLi8uLi9kc3AvdXRpbHMnXHJcbmltcG9ydCB7Q1NTVXRpbHN9IGZyb20gJy4uLy4uL3V0aWxzL2Nzc191dGlscydcclxuaW1wb3J0IHtNYXJrZXIsIFBvaW50fSBmcm9tICcuL2NvbW1vbic7XHJcbmltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGR9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7QXVkaW9DYW52YXNMYXllckNvbXBvbmVudH0gZnJvbSBcIi4vYXVkaW9fY2FudmFzX2xheWVyX2NvbXBcIjtcclxuaW1wb3J0IHtXb3JrZXJIZWxwZXJ9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xyXG5pbXBvcnQge0F1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4uL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcblxyXG5kZWNsYXJlIGZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2U6IGFueSwgdHJhbnNmZXI6IEFycmF5PGFueT4pOiB2b2lkO1xyXG5cclxuY29uc3QgREVGQVVMVF9ERlRfU0laRSA9IDEwMjQ7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgICBzZWxlY3RvcjogJ2F1ZGlvLXNvbmFncmFtJyxcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgICAgPGNhbnZhcyAjc29uYWdyYW0gaGVpZ2h0PVwiMTBcIj48L2NhbnZhcz5cclxuICAgICAgICA8Y2FudmFzICNiZyBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPlxyXG4gICAgICAgIDxjYW52YXMgI2N1cnNvciBoZWlnaHQ9XCIxMFwiIChtb3VzZWRvd24pPVwic2VsZWN0aW9uU3RhcnQoJGV2ZW50KVwiIChtb3VzZW92ZXIpPVwidXBkYXRlQ3Vyc29yQ2FudmFzKCRldmVudClcIiAobW91c2Vtb3ZlKT1cInVwZGF0ZUN1cnNvckNhbnZhcygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInVwZGF0ZUN1cnNvckNhbnZhcygkZXZlbnQsIGZhbHNlKVwiPjwvY2FudmFzPlxyXG4gICAgICAgIDxjYW52YXMgI21hcmtlciBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPmAsXHJcblxyXG4gICAgc3R5bGVzOiBbYDpob3N0e1xyXG4gICAgICBtaW4taGVpZ2h0OiAwcHg7XHJcbiAgICB9YCxgY2FudmFzIHtcclxuICAgICAgICB0b3A6IDA7XHJcbiAgICAgICAgbGVmdDogMDtcclxuICAgICAgICB3aWR0aDogMDtcclxuICAgICAgICBoZWlnaHQ6IDA7XHJcbiAgICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB9YF1cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTb25hZ3JhbSBleHRlbmRzIEF1ZGlvQ2FudmFzTGF5ZXJDb21wb25lbnQge1xyXG5cclxuICAgIGRmdDogREZURmxvYXQzMjtcclxuICAgIG46IGFueTtcclxuICAgIGNlITogSFRNTERpdkVsZW1lbnQ7XHJcbiAgICBzb25hZ3JhbUNhbnZhcyE6IEhUTUxDYW52YXNFbGVtZW50O1xyXG4gICAgLy9jdXJzb3JDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xyXG4gICAgbWFya2VyQ2FudmFzITogSFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgICBAVmlld0NoaWxkKCdzb25hZ3JhbScsIHsgc3RhdGljOiB0cnVlIH0pIHNvbmFncmFtQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdtYXJrZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBtYXJrZXJDYW52YXNSZWYhOiBFbGVtZW50UmVmO1xyXG4gICAgbWFya2VyczogQXJyYXk8TWFya2VyPjtcclxuICAgIHByaXZhdGUgX3BsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbD1udWxsO1xyXG5cclxuICAgIHByaXZhdGUgd29ya2VyOiBXb3JrZXIgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSB3b3JrZXJVUkw6IHN0cmluZztcclxuICAgIHByaXZhdGUgZGZ0U2l6ZSA9IERFRkFVTFRfREZUX1NJWkU7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9hdWRpb0RhdGFIb2xkZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubWFya2VycyA9IG5ldyBBcnJheTxNYXJrZXI+KCk7XHJcbiAgICAgICAgdGhpcy5kZnQgPSBuZXcgREZURmxvYXQzMih0aGlzLmRmdFNpemUpO1xyXG5cclxuICAgICAgICB0aGlzLndvcmtlclVSTCA9IFdvcmtlckhlbHBlci5idWlsZFdvcmtlckJsb2JVUkwodGhpcy53b3JrZXJGdW5jdGlvbilcclxuICAgICAgIHRoaXMuX2JnQ29sb3I9bnVsbDtcclxuICAgICAgIHRoaXMuX3NlbGVjdENvbG9yPSdyZ2JhKDI1NSwyNTUsMCwwLjEpJ1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHJcbiAgICAgICAgdGhpcy5jZSA9IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5zb25hZ3JhbUNhbnZhcyA9IHRoaXMuc29uYWdyYW1DYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgICB0aGlzLnNvbmFncmFtQ2FudmFzLnN0eWxlLnpJbmRleCA9ICcxJztcclxuICAgICAgdGhpcy5iZ0NhbnZhcyA9IHRoaXMuYmdDYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgdGhpcy5iZ0NhbnZhcy5zdHlsZS56SW5kZXggPSAnMic7XHJcbiAgICAgICAgdGhpcy5jdXJzb3JDYW52YXMgPSB0aGlzLmN1cnNvckNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuY3Vyc29yQ2FudmFzLnN0eWxlLnpJbmRleCA9ICc0JztcclxuICAgICAgICB0aGlzLm1hcmtlckNhbnZhcyA9IHRoaXMubWFya2VyQ2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5tYXJrZXJDYW52YXMuc3R5bGUuekluZGV4ID0gJzMnO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhc0xheWVyc1swXSA9IHRoaXMuc29uYWdyYW1DYW52YXM7XHJcbiAgICAgIHRoaXMuY2FudmFzTGF5ZXJzWzFdID0gdGhpcy5iZ0NhbnZhcztcclxuICAgICAgdGhpcy5jYW52YXNMYXllcnNbMl0gPSB0aGlzLmN1cnNvckNhbnZhcztcclxuICAgICAgICB0aGlzLmNhbnZhc0xheWVyc1szXSA9IHRoaXMubWFya2VyQ2FudmFzO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGxheUZyYW1lUG9zaXRpb24oKTogbnVtYmVyfG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgcGxheUZyYW1lUG9zaXRpb24ocGxheUZyYW1lUG9zaXRpb246IG51bWJlcnxudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fcGxheUZyYW1lUG9zaXRpb24gPSBwbGF5RnJhbWVQb3NpdGlvbjtcclxuICAgICAgICAvLyB0aGlzLnJlZHJhdygpO1xyXG4gICAgICAgIHRoaXMuZHJhd1BsYXlQb3NpdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FudmFzTW91c2VQb3MoYzogSFRNTENhbnZhc0VsZW1lbnQsIGU6IE1vdXNlRXZlbnQpOiBQb2ludCB7XHJcbiAgICAgICAgY29uc3QgY3IgPSBjLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB4ID0gZS54IC0gY3IubGVmdDtcclxuICAgICAgICBjb25zdCB5ID0gZS55IC0gY3IudG9wO1xyXG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoeCx5KTtcclxuICAgIH1cclxuXHJcbiAgZHJhd0N1cnNvclBvc2l0aW9uKGU6IE1vdXNlRXZlbnQsIHNob3c6IGJvb2xlYW4pIHtcclxuXHJcbiAgICBpZiAodGhpcy5jdXJzb3JDYW52YXMpIHtcclxuICAgICAgY29uc3QgdyA9IHRoaXMuY3Vyc29yQ2FudmFzLndpZHRoO1xyXG4gICAgICBjb25zdCBoID0gdGhpcy5jdXJzb3JDYW52YXMuaGVpZ2h0O1xyXG4gICAgICBjb25zdCBnID0gdGhpcy5jdXJzb3JDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgaWYgKGcpIHtcclxuICAgICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICBpZiAoc2hvdykge1xyXG4gICAgICAgICAgY29uc3QgcHAgPSB0aGlzLmNhbnZhc01vdXNlUG9zKHRoaXMuY3Vyc29yQ2FudmFzLCBlKTtcclxuICAgICAgICAgIGxldCB4Vmlld1BvcnRQaXhlbHBvcyA9IGUub2Zmc2V0WDtcclxuXHJcbiAgICAgICAgICBnLmZpbGxTdHlsZSA9ICd5ZWxsb3cnO1xyXG4gICAgICAgICAgZy5zdHJva2VTdHlsZSA9ICd5ZWxsb3cnO1xyXG4gICAgICAgICAgZy5iZWdpblBhdGgoKTtcclxuICAgICAgICAgIGcubW92ZVRvKHhWaWV3UG9ydFBpeGVscG9zLCAwKTtcclxuICAgICAgICAgIGcubGluZVRvKHhWaWV3UG9ydFBpeGVscG9zLCBoKTtcclxuICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcblxyXG4gICAgICAgICAgZy5zdHJva2UoKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fYXVkaW9EYXRhSG9sZGVyKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZnJhbWVQb3NSb3VuZCA9IHRoaXMudmlld1BvcnRYUGl4ZWxUb0ZyYW1lUG9zaXRpb24oeFZpZXdQb3J0UGl4ZWxwb3MpO1xyXG4gICAgICAgICAgICBpZihmcmFtZVBvc1JvdW5kIT1udWxsKSB7XHJcbiAgICAgICAgICAgICAgZy5mb250ID0gJzE0cHggc2Fucy1zZXJpZic7XHJcbiAgICAgICAgICAgICAgZy5maWxsU3R5bGUgPSAneWVsbG93JztcclxuICAgICAgICAgICAgICBnLmZpbGxUZXh0KGZyYW1lUG9zUm91bmQudG9TdHJpbmcoKSwgeFZpZXdQb3J0UGl4ZWxwb3MgKyAyLCA1MCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICAgZHJhd1BsYXlQb3NpdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5tYXJrZXJDYW52YXMpIHtcclxuICAgICAgICAgICAgdmFyIHcgPSB0aGlzLm1hcmtlckNhbnZhcy53aWR0aDtcclxuICAgICAgICAgICAgdmFyIGggPSB0aGlzLm1hcmtlckNhbnZhcy5oZWlnaHQ7XHJcbiAgICAgICAgICAgIHZhciBnID0gdGhpcy5tYXJrZXJDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgICAgICBpZiAoZykge1xyXG5cclxuICAgICAgICAgICAgICAgIGcuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5fcGxheUZyYW1lUG9zaXRpb24hPW51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGl4ZWxQb3MgPSB0aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxQb3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZy5maWxsU3R5bGUgPSAncmVkJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZy5zdHJva2VTdHlsZSA9ICdyZWQnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnLm1vdmVUbyhwaXhlbFBvcywgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGcubGluZVRvKHBpeGVsUG9zLCBoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZy5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZy5zdHJva2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbGF5b3V0KCkge1xyXG4gICAgLy9cclxuICAgIC8vXHJcbiAgICAvLyAgIHZhciBvZmZXID0gdGhpcy5zb25hZ3JhbUNhbnZhcy5vZmZzZXRXaWR0aDtcclxuICAgIC8vICAgdmFyIG9mZkggPSB0aGlzLnNvbmFncmFtQ2FudmFzLm9mZnNldEhlaWdodDtcclxuICAgIC8vICAgdGhpcy5sYXlvdXRCb3VuZHMoMCwgMCwgb2ZmVywgb2ZmSCwgdHJ1ZSk7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIC8vIGxheW91dEJvdW5kcyhsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyLCBvZmZXOiBudW1iZXIsIG9mZkg6IG51bWJlciwgdmlydHVhbFdpZHRoOm51bWJlcixyZWRyYXc6IGJvb2xlYW4pIHtcclxuICAgIC8vXHJcbiAgICAvLyAgIGNvbnN0IGxlZnRTdHIgPSBsZWZ0LnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgLy8gICB0aGlzLnNvbmFncmFtQ2FudmFzLnN0eWxlLmxlZnQgPSBsZWZ0U3RyO1xyXG4gICAgLy8gICBjb25zdCB0b3BTdHIgPSB0b3AudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICAvLyAgIHRoaXMuc29uYWdyYW1DYW52YXMuc3R5bGUudG9wID0gdG9wU3RyO1xyXG4gICAgLy8gICB0aGlzLmN1cnNvckNhbnZhcy5zdHlsZS50b3AgPSB0b3BTdHI7XHJcbiAgICAvLyAgIHRoaXMubWFya2VyQ2FudmFzLnN0eWxlLnRvcCA9IHRvcFN0cjtcclxuICAgIC8vXHJcbiAgICAvLyAgIGlmIChvZmZXKSB7XHJcbiAgICAvLyAgICAgY29uc3Qgd1N0ciA9IG9mZlcudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICAvLyAgICAgaWYgKHJlZHJhdykge1xyXG4gICAgLy9cclxuICAgIC8vICAgICAgIHRoaXMuY3Vyc29yQ2FudmFzLndpZHRoID0gb2ZmVztcclxuICAgIC8vICAgICAgIHRoaXMubWFya2VyQ2FudmFzLndpZHRoID0gb2ZmVztcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgdGhpcy5zb25hZ3JhbUNhbnZhcy5zdHlsZS53aWR0aCA9IHdTdHI7XHJcbiAgICAvLyAgICAgdGhpcy5jdXJzb3JDYW52YXMuc3R5bGUud2lkdGggPSB3U3RyO1xyXG4gICAgLy8gICAgIHRoaXMubWFya2VyQ2FudmFzLnN0eWxlLndpZHRoID0gd1N0cjtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBpZiAob2ZmSCkge1xyXG4gICAgLy8gICAgIGNvbnN0IGhTdHIgPSBvZmZILnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgLy8gICAgIGlmIChyZWRyYXcpIHtcclxuICAgIC8vICAgICAgIHRoaXMuY3Vyc29yQ2FudmFzLmhlaWdodCA9IG9mZkg7XHJcbiAgICAvLyAgICAgICB0aGlzLm1hcmtlckNhbnZhcy5oZWlnaHQgPSBvZmZIO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICB0aGlzLnNvbmFncmFtQ2FudmFzLnN0eWxlLmhlaWdodCA9IGhTdHI7XHJcbiAgICAvLyAgICAgdGhpcy5jdXJzb3JDYW52YXMuc3R5bGUuaGVpZ2h0ID0gaFN0cjtcclxuICAgIC8vICAgICB0aGlzLm1hcmtlckNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoU3RyO1xyXG4gICAgLy9cclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBpZiAocmVkcmF3KSB7XHJcbiAgICAvLyAgICAgLy90aGlzLnJlZHJhdygpO1xyXG4gICAgLy8gICAgIGlmIChvZmZXID4gMCkge1xyXG4gICAgLy8gICAgICAgaWYgKG9mZkggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuc3RhcnREcmF3KGxlZnQsdG9wLG9mZlcsIG9mZkgsdmlydHVhbFdpZHRoKTtcclxuICAgIC8vICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLypcclxuICAgICAqICBNZXRob2QgdXNlZCBhcyB3b3JrZXIgY29kZS5cclxuICAgICAqL1xyXG4gICAgd29ya2VyRnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIC8vIFJlZGVmaW5lIHNvbWUgRFNQIGNsYXNzZXMgZm9yIHdvcmtlciBmdW5jdGlvblxyXG4gICAgICAgIC8vIFNlZSBlLmcuIGF1ZGlvLm1hdGguQ29tcGxleFxyXG4gICAgICAgIGNsYXNzIENvbXBsZXgge1xyXG5cclxuICAgICAgICAgICAgcmVhbDogbnVtYmVyO1xyXG4gICAgICAgICAgICBpbWc6IG51bWJlcjtcclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbVBvbGFyRm9ybShtYWduaXR1ZGU6IG51bWJlciwgYXJndW1lbnQ6IG51bWJlcik6IENvbXBsZXgge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgciA9IE1hdGguY29zKGFyZ3VtZW50KSAqIG1hZ25pdHVkZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLnNpbihhcmd1bWVudCkgKiBtYWduaXR1ZGU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgociwgaSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHJlYWw6IG51bWJlciwgaW1nOiBudW1iZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVhbCA9IHJlYWw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IGltZztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcHVibGljIG1hZ25pdHVkZSgpOiBudW1iZXIge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydCgodGhpcy5yZWFsICogdGhpcy5yZWFsKSArICh0aGlzLmltZyAqIHRoaXMuaW1nKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBhcmd1bWVudCgpOiBudW1iZXIge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy5pbWcsIHRoaXMucmVhbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBhZGQoYWRkQzogQ29tcGxleCk6IENvbXBsZXgge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KHRoaXMucmVhbCArIGFkZEMucmVhbCwgdGhpcy5pbWcgKyBhZGRDLmltZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBzdWIoc3ViQzogQ29tcGxleCk6IENvbXBsZXgge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KHRoaXMucmVhbCAtIHN1YkMucmVhbCwgdGhpcy5pbWcgLSBzdWJDLmltZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBtdWx0KG11bHRDOiBDb21wbGV4KTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtdWx0UiA9ICh0aGlzLnJlYWwgKiBtdWx0Qy5yZWFsKSAtICh0aGlzLmltZyAqIG11bHRDLmltZyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtdWx0SSA9ICh0aGlzLnJlYWwgKiBtdWx0Qy5pbWcpICsgKG11bHRDLnJlYWwgKiB0aGlzLmltZyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgobXVsdFIsIG11bHRJKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcHVibGljIG11bHRSZWFsKG11bHRGOiBudW1iZXIpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwgKiBtdWx0RiwgdGhpcy5pbWcgKiBtdWx0Rik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBkaXYoZGl2aXNvcjogQ29tcGxleCk6IENvbXBsZXgge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGl2UmVhbCA9IGRpdmlzb3IucmVhbDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpdkltZyA9IGRpdmlzb3IuaW1nO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGl2ID0gKGRpdlJlYWwgKiBkaXZSZWFsKSArIChkaXZJbWcgKiBkaXZJbWcpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGl2aXNpb25SZWFsID0gKCh0aGlzLnJlYWwgKiBkaXZSZWFsKSArICh0aGlzLmltZyAqIGRpdkltZykpIC8gZGl2O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGl2aXNpb25JbWcgPSAoKGRpdlJlYWwgKiB0aGlzLmltZykgLSAodGhpcy5yZWFsICogZGl2SW1nKSkgLyBkaXY7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KGRpdmlzaW9uUmVhbCwgZGl2aXNpb25JbWcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgZGl2UmVhbChkaXZpc29yOiBudW1iZXIpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRpdmlzb3IgKiBkaXZpc29yO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGl2c2lvblJlYWwgPSAodGhpcy5yZWFsICogZGl2aXNvcikgLyBkaXY7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXZzaW9uSW1nID0gKGRpdmlzb3IgKiB0aGlzLmltZykgLyBkaXY7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KGRpdnNpb25SZWFsLCBkaXZzaW9uSW1nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcHVibGljIGNvbmp1Z2F0ZSgpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwsIC10aGlzLmltZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBlcXVhbHMoYzogQ29tcGxleCk6IGJvb2xlYW4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGMgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMucmVhbCA9PT0gYy5yZWFsICYmIHRoaXMuaW1nID09PSBjLmltZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdSZWFsOiAnICsgdGhpcy5yZWFsICsgJywgSW1nOiAnICsgdGhpcy5pbWc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNsYXNzIERGVEZsb2F0MzIge1xyXG5cclxuICAgICAgICAgICAgcHJpdmF0ZSBuOiBudW1iZXI7XHJcbiAgICAgICAgICAgIHByaXZhdGUgbTogbnVtYmVyO1xyXG5cclxuICAgICAgICAgICAgcHJpdmF0ZSBjb3NMb29rdXA6IEZsb2F0MzJBcnJheTtcclxuICAgICAgICAgICAgcHJpdmF0ZSBzaW5Mb29rdXA6IEZsb2F0MzJBcnJheTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKG46IG51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uID0gbjtcclxuICAgICAgICAgICAgICAgIHRoaXMubSA9IE1hdGgubG9nKG4pIC8gTWF0aC5sb2coMik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaWYobiAhPSAoMSA8PCBtKSl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcImxlbmd0aCBOIG11c3QgYmUgcG93ZXIgb2YgMlwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBsb29rdXAgdGFibGVzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvc0xvb2t1cCA9IG5ldyBGbG9hdDMyQXJyYXkobiAvIDIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaW5Mb29rdXAgPSBuZXcgRmxvYXQzMkFycmF5KG4gLyAyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLyAyOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmMgPSAoLTIgKiBNYXRoLlBJICogaSkgLyBuO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29zTG9va3VwW2ldID0gTWF0aC5jb3MoYXJjKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNpbkxvb2t1cFtpXSA9IE1hdGguc2luKGFyYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBwcm9jZXNzUmVhbChzcmNCdWY6IEZsb2F0MzJBcnJheSk6IEFycmF5PENvbXBsZXg+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzcmNCdWYuc2xpY2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBuZXcgRmxvYXQzMkFycmF5KHNyY0J1Zi5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeWkgPSAwOyB5aSA8IHkubGVuZ3RoOyB5aSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeVt5aV0gPSAwLjA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZmdENvb2xleVR1a2V5KHgsIHkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmMgPSBuZXcgQXJyYXk8Q29tcGxleD4oeC5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmNbaV0gPSBuZXcgQ29tcGxleCh4W2ldLCB5W2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByYztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcHVibGljIHByb2Nlc3NSZWFsTWFnbml0dWRlKHNyY0J1ZjogRmxvYXQzMkFycmF5KTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzcmNCdWYuc2xpY2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBuZXcgRmxvYXQzMkFycmF5KHNyY0J1Zi5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeWkgPSAwOyB5aSA8IHkubGVuZ3RoOyB5aSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeVt5aV0gPSAwLjA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZmdENvb2xleVR1a2V5KHgsIHkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmMgPSBuZXcgRmxvYXQzMkFycmF5KHgubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJjYyA9IG5ldyBDb21wbGV4KHhbaV0sIHlbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJjW2ldID0gcmNjLm1hZ25pdHVkZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJjO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgZmZ0Q29vbGV5VHVrZXkocmVhbDogRmxvYXQzMkFycmF5LCBpbWc6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xyXG4gICAgICAgICAgICAgICAgbGV0IGk6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIGxldCBqID0gMDtcclxuICAgICAgICAgICAgICAgIGxldCBrOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBsZXQgbjE6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIGxldCBuMjogbnVtYmVyID0gdGhpcy5uIC8gMjtcclxuICAgICAgICAgICAgICAgIGxldCBhOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBsZXQgYzogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgbGV0IHM6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIGxldCB0MTogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgbGV0IHQyOiBudW1iZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHRoaXMubiAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIG4xID0gbjI7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPj0gbjEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGogLSBuMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbjEgPSBuMSAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGogPSBqICsgbjE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgaikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0MSA9IHJlYWxbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxbaV0gPSByZWFsW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFsW2pdID0gdDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gaW1nW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWdbaV0gPSBpbWdbal07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZ1tqXSA9IHQxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBuMSA9IDA7XHJcbiAgICAgICAgICAgICAgICBuMiA9IDE7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5tOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBuMSA9IG4yO1xyXG4gICAgICAgICAgICAgICAgICAgIG4yID0gbjIgKyBuMjtcclxuICAgICAgICAgICAgICAgICAgICBhID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjE7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gdGhpcy5jb3NMb29rdXBbYV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0aGlzLnNpbkxvb2t1cFthXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYSArPSAoMSA8PCAodGhpcy5tIC0gaSAtIDEpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IGo7IGsgPCB0aGlzLm47IGsgPSBrICsgbjIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gYyAqIHJlYWxbayArIG4xXSAtIHMgKiBpbWdbayArIG4xXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQyID0gcyAqIHJlYWxbayArIG4xXSArIGMgKiBpbWdbayArIG4xXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxbayArIG4xXSA9IHJlYWxba10gLSB0MTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1trICsgbjFdID0gaW1nW2tdIC0gdDI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsW2tdID0gcmVhbFtrXSArIHQxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nW2tdID0gaW1nW2tdICsgdDI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgcHJvY2Vzcyh0OiBBcnJheTxDb21wbGV4Pik6IEFycmF5PENvbXBsZXg+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWxzOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbWdzOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuczogQXJyYXk8Q29tcGxleD4gPSBuZXcgQXJyYXk8Q29tcGxleD4odGhpcy5uKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICByZWFsc1tpXSA9IHRbaV0ucmVhbDtcclxuICAgICAgICAgICAgICAgICAgICBpbWdzW2ldID0gdFtpXS5pbWc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZmdENvb2xleVR1a2V5KHJlYWxzLCBpbWdzKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc1tpXSA9IG5ldyBDb21wbGV4KHJlYWxzW2ldLCBpbWdzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cmFucztcclxuXHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW50ZXJmYWNlIFdpbmRvd0Z1bmN0aW9uIHtcclxuICAgICAgICAgICAgZ2V0U2NhbGUoaTogbnVtYmVyKTogbnVtYmVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2xhc3MgR2F1c3NpYW5XaW5kb3cgaW1wbGVtZW50cyBXaW5kb3dGdW5jdGlvbiB7XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIERFRkFVTFRfU0lHTUEgPSAwLjM7XHJcbiAgICAgICAgICAgIC8vIEdhdXNzaWFuIHdpbmRvdyBmdW5jdGlvbixcclxuICAgICAgICAgICAgLy8gaHR0cDovL3JlZmVyZW5jZS53b2xmcmFtLmNvbS9sYW5ndWFnZS9yZWYvR2F1c3NpYW5XaW5kb3cuaHRtbFxyXG4gICAgICAgICAgICAvLyB2YWw9ZXhwKC01MCp4KngvOSkgPT4gc2lnbWE9MC4zXHJcblxyXG4gICAgICAgICAgICBwcml2YXRlIGJ1ZjogRmxvYXQzMkFycmF5O1xyXG5cclxuICAgICAgICAgICAgY29uc3RydWN0b3Ioc2l6ZTogbnVtYmVyLCBzaWdtYTogbnVtYmVyID0gR2F1c3NpYW5XaW5kb3cuREVGQVVMVF9TSUdNQSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idWYgPSBuZXcgRmxvYXQzMkFycmF5KHNpemUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2VudGVyID0gKHNpemUgLSAxKSAvIDI7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1b3QgPSAoaSAtIGNlbnRlcikgLyAoc2lnbWEgKiBjZW50ZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cCA9IC0wLjUgKiBxdW90ICogcXVvdDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZltpXSA9IE1hdGguZXhwKGV4cCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdldFNjYWxlKGk6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5idWZbaV07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChtc2c6TWVzc2FnZUV2ZW50KSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNvbmFncmFtIHJlbmRlciB0aHJlYWRcIik7XHJcbiAgICAgICAgICAgIGxldCBsID0gbXNnLmRhdGEubDtcclxuICAgICAgICAgICAgbGV0IHcgPSBtc2cuZGF0YS53O1xyXG4gICAgICAgICAgICBsZXQgaCA9IG1zZy5kYXRhLmg7XHJcbiAgICAgICAgICAgIGxldCB2dyA9IG1zZy5kYXRhLnZ3O1xyXG4gICAgICAgICAgICBsZXQgY2hzID0gbXNnLmRhdGEuY2hzO1xyXG4gICAgICAgICAgICBsZXQgYXVkaW9EYXRhT2Zmc2V0PTA7XHJcbiAgICAgICAgICAgIGxldCBhZE9mZnNldD1tc2cuZGF0YS5hdWRpb0RhdGFPZmZzZXQ7XHJcbiAgICAgICAgICAgIGlmKGFkT2Zmc2V0KXtcclxuICAgICAgICAgICAgICBhdWRpb0RhdGFPZmZzZXQ9YWRPZmZzZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICBsZXQgbWF4UHNkID0gbnVsbDtcclxuICAgICAgICAgICAgaWYobXNnLmRhdGEubWF4UHNkIT09dW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICBtYXhQc2Q9bXNnLmRhdGEubWF4UHNkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgYXVkaW9EYXRhID0gbmV3IEFycmF5KGNocyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgIGF1ZGlvRGF0YVtjaF0gPSBuZXcgRmxvYXQzMkFycmF5KG1zZy5kYXRhWydhdWRpb0RhdGEnXVtjaF0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZnJhbWVMZW5ndGggPSBtc2cuZGF0YS5mcmFtZUxlbmd0aDtcclxuICAgICAgICAgICAgbGV0IGRmdFNpemUgPSBtc2cuZGF0YS5kZnRTaXplO1xyXG5cclxuICAgICAgICAgICAgbGV0IGRmdEJhbmRzID0gZGZ0U2l6ZSAvIDI7XHJcbiAgICAgICAgICAgIGxldCBkZnQgPSBuZXcgREZURmxvYXQzMihkZnRTaXplKTtcclxuICAgICAgICAgICAgbGV0IHdmID0gbmV3IEdhdXNzaWFuV2luZG93KGRmdFNpemUpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGFyclNpemU9dypoKjQ7XHJcbiAgICAgICAgICAgIGlmKGFyclNpemU8MCl7XHJcbiAgICAgICAgICAgICAgICBhcnJTaXplPTBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaW1nRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShhcnJTaXplKTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlJlbmRlciBtZXRob2Q6XCIpO1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ3JlYXRlZCBpbWdEYXRhIGFyclNpemU6IFwiK2FyclNpemUrXCIgXCIsIHcsIFwieFwiLCBoKTtcclxuICAgICAgICAgIGxldCBjYWxjTWF4UHNkPS1JbmZpbml0eTtcclxuICAgICAgICAgICAgaWYgKGFyclNpemU+MCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjaEggPSBNYXRoLnJvdW5kKGggLyBjaHMpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZyYW1lc1BlclBpeGVsID0gZnJhbWVMZW5ndGggLyB2dztcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlJlbmRlcjogXCIsIHcsIFwieFwiLCBoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgYiA9IG5ldyBGbG9hdDMyQXJyYXkoZGZ0U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgc29uYSA9IG5ldyBBcnJheShjaHMpO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCBwID0gMDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3AgPSBjaCAqIGZyYW1lTGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaERhdGFMZW49YXVkaW9EYXRhW2NoXS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgREZUIGFycmF5IGJ1ZmZlclxyXG4gICAgICAgICAgICAgICAgICAgIHNvbmFbY2hdID0gbmV3IEFycmF5KHcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmcmFtZVBvcyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcGlpID0gMDsgcGlpIDwgdzsgcGlpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpcnRQaWkgPSBsICsgcGlpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQb3NpdGlvbiBvZiBzYW1wbGUgZGF0YSBmcmFtZSBpcyBwaXhlbCBwb3NpdGlvbiBtYXBwZWQgdG8gYXVkaW8gZnJhbWUgcG9zaXRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlbiBcImNlbnRlclwiIHRoZSBmcmFtZSBieSBzaGlmdGluZyBsZWZ0IGJ5IGhhbGYgdGhlIERGVCBzaXplICg9ZGZ0QmFuZHMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUG9zID0gTWF0aC5yb3VuZCgodmlydFBpaSAqIGZyYW1lc1BlclBpeGVsKS1kZnRCYW5kcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgREZUIGJ1ZmZlciB3aXRoIHdpbmRvd2VkIHNhbXBsZSB2YWx1ZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZnRTaXplOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzYW1wbGVQb3M9ZnJhbWVQb3MgKyBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBmb3IgbmVnYXRpdmUgc2FtcGxlIHBvc2l0aW9ucyBhbmQgb3V0IG9mIGJvdW5kcyBwb3NpdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaERhdD0wO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBhdWRpbyBzYW1wbGUgaWYgYXZhaWxhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRwPXNhbXBsZVBvcy1hdWRpb0RhdGFPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhZHA+PTAgJiYgYWRwIDwgY2hEYXRhTGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoRGF0ID0gYXVkaW9EYXRhW2NoXVthZHBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJBdWRpbyBkYXRhOiBcIitjaERhdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2FtcGxlIGJ1ZiBwb3Mgb29iOiBhZHA6IFwiK2FkcCtcIiwgY2hEYXRhTGVuOiBcIitjaERhdGFMZW4rXCIsIHNhbXBsZVBvczogXCIrc2FtcGxlUG9zK1wiLCBpOiBcIitpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBXaW5kb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJbaV0gPSBjaERhdCAqIHdmLmdldFNjYWxlKGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGMgREZUIG1hZ25pdHVkZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwZWN0ciA9IGRmdC5wcm9jZXNzUmVhbE1hZ25pdHVkZShiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBtYXhpbXVtIHZhbHVlIG9mIHNwZWN0cmFsIGVuZXJneVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IGRmdEJhbmRzOyBzKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwc2QgPSAoMiAqIE1hdGgucG93KHNwZWN0cltzXSwgMikpIC8gZGZ0QmFuZHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHNkID4gY2FsY01heFBzZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNNYXhQc2QgPSBwc2Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHJlbmRlciBtb2RlbCBkYXRhIGZvciB0aGlzIHBpeGVsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvbmFbY2hdW3BpaV0gPSBzcGVjdHI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmKCFtc2cuZGF0YS5ub3JlbmRlcikge1xyXG4gICAgICAgICAgICAgICAgICBpZighbWF4UHNkKXtcclxuICAgICAgICAgICAgICAgICAgICBtYXhQc2Q9Y2FsY01heFBzZDtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcGlpID0gMDsgcGlpIDwgdzsgcGlpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYWxsQmxhY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgY2hIOyB5KyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBmcmVxSWR4ID0gTWF0aC5yb3VuZCh5ICogZGZ0QmFuZHMgLyBjaEgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBvbmUgc2lkZWQgcG93ZXIgc3BlY3RyYWwgZGVuc2l0eSBQU0QgKGYsIHQpIGluIFBhMi9IelxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUFNEKGYpIHByb3BvcnRpb25hbCB0byAyfFgoZil8MiAvICh0MiAtIHQxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbCA9IHNvbmFbY2hdW3BpaV1bZnJlcUlkeF07XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcHNkID0gKDIgKiBNYXRoLnBvdyh2YWwsIDIpKSAvIGRmdEJhbmRzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGxvZ2FyaXRobWljIHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAvL2xldCBwc2RMb2cgPSBpcHMuZHNwLkRTUFV0aWxzLnRvTGV2ZWxJbkRCKHBzZCAvIG1heFBzZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZWFyTGV2ZWwgPSBwc2QgLyBtYXhQc2Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcHNkTG9nID0gMTAgKiBNYXRoLmxvZyhsaW5lYXJMZXZlbCkgLyBNYXRoLmxvZygxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhlZCBkeW5hbWljIFJhbmdlIHZhbHVlIG9mIDcwZEIgZm9yIG5vd1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGR5blJhbmdlSW5EYiA9IDcwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHNjYWxlZFZhbCA9IChwc2RMb2cgKyBkeW5SYW5nZUluRGIpIC8gZHluUmFuZ2VJbkRiO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB0aGUgZm9sbG93aW5nIGNoZWNrcyBuZWNlc3NhcnkgZm9yIGNsYW1wZWQgYXJyYXkgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxlZFZhbCA+IDEuMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkVmFsID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2FsZWRWYWwgPCAwLjApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkVmFsID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGxldCByZ2JWYWwgPSBNYXRoLnJvdW5kKDI1NSAqIHNjYWxlZFZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocmdiVmFsIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1x0XHRcdFx0XHRcdFx0U3lzdGVtLm91dC5wcmludGxuKFwiTmVnIFJHQiB2YWw6IFwiK3JnYlZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJnYlZhbCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocmdiVmFsID4gMjU1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJnYlZhbCA9IDI1NTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIHJnYlZhbCA9IDI1NSAtIHJnYlZhbDtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZ2JWYWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbEJsYWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcHkgPSBjaEggLSB5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFQb3MgPSAoKCgoY2ggKiBjaEgpICsgcHkpICogdykgKyBwaWkpICogNDtcclxuICAgICAgICAgICAgICAgICAgICAgIGltZ0RhdGFbZGF0YVBvcyArIDBdID0gcmdiVmFsOyAvL1JcclxuICAgICAgICAgICAgICAgICAgICAgIGltZ0RhdGFbZGF0YVBvcyArIDFdID0gcmdiVmFsOyAvL0dcclxuICAgICAgICAgICAgICAgICAgICAgIGltZ0RhdGFbZGF0YVBvcyArIDJdID0gcmdiVmFsOyAvL0JcclxuICAgICAgICAgICAgICAgICAgICAgIGltZ0RhdGFbZGF0YVBvcyArIDNdID0gMjU1OyAvL0EgKGFscGhhOiBmdWxseSBvcGFxdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJSZW5kZXJlZDogcHk6IFwiK3B5K1wiLCByZ2J2YWw6IFwiK3JnYlZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlIDF4MSwgMmNoc1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gIGNoMHgweTBSLGNoMHgweTBHLGNoMHgweTBCLGNoMHgweTBBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gIGNoMHgxeTBSLGNoMHgxeTBHLGNoMHgxeTBCLGNoMHgxeTBBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gIGNoMHgweTBSLGNoMHgweTBHLGNoMHgweTBCLGNoMHgweTBBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gIGNoMHgxeTFSLGNoMHgxeTFHLGNoMHgxeTFCLGNoMHgxeTFBLFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIC8vICBjaDF4MHkwUixjaDF4MHkwRyxjaDF4MHkwQixjaDF4MHkwQSxcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICBjaDF4MXkwUixjaDF4MXkwRyxjaDF4MXkwQixjaDF4MXkwQSxcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICBjaDF4MHkwUixjaDF4MHkwRyxjaDF4MHkwQixjaDF4MHkwQSxcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICBjaDF4MXkxUixjaDF4MXkxRyxjaDF4MXkxQixjaDF4MXkxQVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoYWxsQmxhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKFwiQmxhY2s6IFwiLCBwaWksIFwiIFwiLCBjaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUmVuZGVyIHRocmVhZCBwb3N0IG1lc3NhZ2UgaW1nRGF0YTogXCIraW1nRGF0YS5sZW5ndGgpXHJcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtpbWdEYXRhOiBpbWdEYXRhLCBsOiBsLCB3OiBtc2cuZGF0YS53LCBoOiBtc2cuZGF0YS5oLCB2dzogdncsbWF4UHNkOmNhbGNNYXhQc2QsdGVybWluYXRlOm1zZy5kYXRhLnRlcm1pbmF0ZX0sIFtpbWdEYXRhLmJ1ZmZlcl0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGFydERyYXcoY2xlYXIgPSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKGNsZWFyKSB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuYm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvbmFncmFtQ2FudmFzLnN0eWxlLmxlZnQgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnBvc2l0aW9uLmxlZnQpLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgbGV0IGludFcgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aClcclxuICAgICAgICAgICAgICAgIGxldCBpbnRIID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24uaGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zb25hZ3JhbUNhbnZhcy53aWR0aCA9IGludFc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvbmFncmFtQ2FudmFzLmhlaWdodCA9IGludEg7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGcgPSB0aGlzLnNvbmFncmFtQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9nLmNsZWFyUmVjdCgwLCAwLHcsIGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGcuZmlsbFN0eWxlID0gXCJ3aGl0ZVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGcuZmlsbFJlY3QoMCwgMCwgaW50VywgaW50SCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zdGFydFJlbmRlcigpO1xyXG4gICAgICAgIHRoaXMuZHJhd0N1cnNvckxheWVyKClcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0UmVuZGVyKCkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy53b3JrZXIudGVybWluYXRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmJvdW5kcykge1xyXG4gICAgICAgICAgICBsZXQgdyA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLndpZHRoKTtcclxuICAgICAgICAgICAgbGV0IGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGFIb2xkZXIgJiYgdz4wICYmIGg+MCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMud29ya2VyID0gbmV3IFdvcmtlcih0aGlzLndvcmtlclVSTCk7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMud28gPSBuZXcgV29ya2VyKCcuL3dvcmtlci9zb25hZ3JhbS53b3JrZXInLCB7IHR5cGU6IGBtb2R1bGVgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjaHMgPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICAgICAgICBsZXQgdnc9TWF0aC5yb3VuZCh0aGlzLnZpcnR1YWxEaW1lbnNpb24ud2lkdGgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBmcmFtZUxlbmd0aCA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5mcmFtZUxlbjtcclxuICAgICAgICAgICAgICBsZXQgZnJhbWVzUGVyUGl4ZWwgPSBNYXRoLmNlaWwoZnJhbWVMZW5ndGggLyB2dyk7XHJcbiAgICAgICAgICAgICAgbGV0IGxlZnRQb3M9IE1hdGgucm91bmQodGhpcy5ib3VuZHMucG9zaXRpb24ubGVmdCk7XHJcbiAgICAgICAgICAgICAgbGV0IHJlbmRlclBvcz1sZWZ0UG9zO1xyXG4gICAgICAgICAgICAgIGxldCBhdWRpb0J1ZmZlcj10aGlzLl9hdWRpb0RhdGFIb2xkZXIuYnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgLy9sZXQgYXJyYXlBdWRpb0J1ZmZlcj10aGlzLl9hdWRpb0RhdGFIb2xkZXIuYXJyYXlCdWZmZXI7XHJcbiAgICAgICAgICAgICAgbGV0IGFyckFiQnVmOkZsb2F0MzJBcnJheVtdfG51bGw7XHJcbiAgICAgICAgICAgICAgbGV0IGltZ0RhdGE6VWludDhDbGFtcGVkQXJyYXk7XHJcbiAgICAgICAgICAgICAgbGV0IG1heFBzZD0tSW5maW5pdHk7XHJcbiAgICAgICAgICAgICAgbGV0IG5vcmVuZGVyPXRydWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLndvcmtlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JrZXIub25tZXNzYWdlID0gKG1lKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmKHRydWU9PT1tZS5kYXRhLnRlcm1pbmF0ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRyYXdJbWdEYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGltZ0RhdGEpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgZHJhd0ltZ0RhdGE9aW1nRGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgIGRyYXdJbWdEYXRhPW1lLmRhdGEuaW1nRGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3UmVuZGVyZWQodywgaCwgZHJhd0ltZ0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLndvcmtlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXIudGVybWluYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgfWVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgcmVuZGVyZWQgdmVydGljYWwgdmFsdWVzIG9mIG9uZSBwaXhlbCBvZiB0aW1lc2NhbGVcclxuICAgICAgICAgICAgICAgICAgICAvL2xldCBkYXRhUG9zID0gcmVuZGVyUG9zICogaCAqIDQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYobm9yZW5kZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKG1lLmRhdGEubWF4UHNkPm1heFBzZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFBzZD1tZS5kYXRhLm1heFBzZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwibmV3IG1heFBzZDogXCIrbWF4UHNkKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBjaEggPSBNYXRoLnJvdW5kKGggLyBjaHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGlkcD1tZS5kYXRhLmwtbGVmdFBvcztcclxuICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBjaEg7IHkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBweSA9IGNoSCAtIHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFQb3MgPSAoKCgoY2ggKiBjaEgpICsgcHkpICogdykgKyBpZHApICogNDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVQb3MgPSAoKGNoICogY2hIKSArIHB5KSAqIDQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgbGFzdFBvcyA9IGRhdGFQb3MgKyBtZS5kYXRhLmltZ0RhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKGxhc3RQb3MgPCBpbWdEYXRhLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvbmUgcGl4ZWxcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nRGF0YVtkYXRhUG9zXSA9IG1lLmRhdGEuaW1nRGF0YVttZVBvc107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nRGF0YVtkYXRhUG9zICsgMV0gPSBtZS5kYXRhLmltZ0RhdGFbbWVQb3MgKyAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdEYXRhW2RhdGFQb3MgKyAyXSA9IG1lLmRhdGEuaW1nRGF0YVttZVBvcyArIDJdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGltZ0RhdGFbZGF0YVBvcyArIDNdID0gbWUuZGF0YS5pbWdEYXRhW21lUG9zICsgM107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy99IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcihcIk91dCBvZiByYW5nZTogXCIgKyBkYXRhUG9zICsgXCIrXCIgKyBtZS5kYXRhLmltZ0RhdGEubGVuZ3RoICsgXCI+PVwiICsgaW1nRGF0YS5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9hdWRpb0RhdGFIb2xkZXIgJiYgYXJyQWJCdWYgJiYgdGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2NlZWQgd2l0aCBuZXh0IHBpeGVsXHJcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJQb3MrKztcclxuICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlJlbmRlciBwb3M6IFwiK3JlbmRlclBvcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHRlcm1pbmF0ZT1mYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCB3aW5kb3dFbmQ9IHJlbmRlclBvcyA+PSBsZWZ0UG9zICsgdztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3dFbmQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihub3JlbmRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBoYXNlIHR3bzogcmVuZGVyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9yZW5kZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBmcm9tIGJlZ2lubmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBvcz1sZWZ0UG9zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIm5vdyByZW5kZXJpbmc6IG1heFBzZDogXCIrbWF4UHNkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0ZSByZW5kZXIgcGhhc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGU9dHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0RnJhbWVQb3MgPSBNYXRoLmZsb29yKGZyYW1lTGVuZ3RoICogcmVuZGVyUG9zIC8gdncpLXRoaXMuZGZ0U2l6ZS8yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYobGVmdEZyYW1lUG9zPDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0RnJhbWVQb3M9MDtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGEgPSBuZXcgQXJyYXk8QXJyYXlCdWZmZXI+KGNocyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUmVuZGVyIHBvczogXCIrcmVuZGVyUG9zK1wiIGxlZnRGcmFtZVBvczogXCIrbGVmdEZyYW1lUG9zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRlcm1pbmF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9hdWRpb0RhdGFIb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZCA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5mcmFtZXMobGVmdEZyYW1lUG9zLCB0aGlzLmRmdFNpemUsIGFyckFiQnVmKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCBhIGNvcHkgaGVyZSBmb3IgdGhlIHdvcmtlciwgb3RoZXJ3aXNlIHRoaXMuYXVkaW9EYXRhIGlzIG5vdCBhY2Nlc3NpYmxlIGFmdGVyIHBvc3RpbmcgdG8gdGhlIHdvcmtlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhW2NoXSA9IGFyckFiQnVmW2NoXS5idWZmZXIuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhW2NoXSA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGF0YTogYWRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0RhdGFPZmZzZXQ6bGVmdEZyYW1lUG9zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsOiByZW5kZXJQb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHc6IG1lLmRhdGEudyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaDogaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdnc6IHZ3LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaHM6IGNocyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg6IGZyYW1lTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZnRTaXplOiB0aGlzLmRmdFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFBzZDptYXhQc2QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcmVuZGVyOm5vcmVuZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGU6dGVybWluYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICB9LCBhZGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyICYmIGF1ZGlvQnVmZmVyLmxlbmd0aCphdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzIDwgQXVkaW9DYW52YXNMYXllckNvbXBvbmVudC5FTkFCTEVfU1RSRUFNSU5HX05VTUJFUl9PRl9TQU1QTEVTX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgYWRhID0gbmV3IEFycmF5PEFycmF5QnVmZmVyPihjaHMpO1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCBhIGNvcHkgaGVyZSBmb3IgdGhlIHdvcmtlciwgb3RoZXJ3aXNlIHRoaXMuYXVkaW9EYXRhIGlzIG5vdCBhY2Nlc3NpYmxlIGFmdGVyIHBvc3RpbmcgdG8gdGhlIHdvcmtlclxyXG4gICAgICAgICAgICAgICAgICAgIGFkYVtjaF0gPSBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShjaCkuYnVmZmVyLnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXJrZXJDYW52YXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZyA9IHRoaXMubWFya2VyQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZy5maWxsVGV4dChcIlJlbmRlcmluZy4uLlwiLCAxMCwgMjApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhOiBhZGEsXHJcbiAgICAgICAgICAgICAgICAgICAgbDogbGVmdFBvcyxcclxuICAgICAgICAgICAgICAgICAgICB3OiB3LFxyXG4gICAgICAgICAgICAgICAgICAgIGg6IGgsXHJcbiAgICAgICAgICAgICAgICAgICAgdnc6IE1hdGgucm91bmQodGhpcy52aXJ0dWFsRGltZW5zaW9uLndpZHRoKSxcclxuICAgICAgICAgICAgICAgICAgICBjaHM6IGNocyxcclxuICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aDogZnJhbWVMZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgZGZ0U2l6ZTogdGhpcy5kZnRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZTp0cnVlXHJcbiAgICAgICAgICAgICAgICAgIH0sIGFkYSk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgaWYodz4wKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNQZXJQaXhlbCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnJTaXplPXcqaCo0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYoYXJyU2l6ZTwwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyU2l6ZT0wXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpbWdEYXRhPW5ldyBVaW50OENsYW1wZWRBcnJheShhcnJTaXplKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHJ3PTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvL2FpcyA9IG5ldyBBcnJheUF1ZGlvQnVmZmVySW5wdXRTdHJlYW0oYXJyYXlBdWRpb0J1ZmZlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcnJBYkJ1ZiA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KGNocyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJBYkJ1ZltjaF0gPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuZGZ0U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnRGcmFtZVBvcz1NYXRoLmZsb29yKGZyYW1lTGVuZ3RoKnJlbmRlclBvcy92dyktdGhpcy5kZnRTaXplLzI7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZnJhbWVzVG9SZWFkPXRoaXMuZGZ0U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmKGxlZnRGcmFtZVBvczwwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9mcmFtZXNUb1JlYWQ9dGhpcy5kZnRTaXplK2xlZnRGcmFtZVBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEZyYW1lUG9zPTA7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZD10aGlzLl9hdWRpb0RhdGFIb2xkZXIuZnJhbWVzKGxlZnRGcmFtZVBvcyxmcmFtZXNUb1JlYWQsYXJyQWJCdWYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGFkPW5ldyBGbG9hdDMyQXJyYXkoY2hzKmZyYW1lc1RvUmVhZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkLnNldChhcnJBYkJ1ZltjaF0sY2gqZnJhbWVzVG9SZWFkKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGw6IHJlbmRlclBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdzogcncsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGg6IGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZ3OiB2dyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hzOiBjaHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoOiBmcmFtZUxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhOiBhZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhT2Zmc2V0OmxlZnRGcmFtZVBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGZ0U2l6ZTogdGhpcy5kZnRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBub3JlbmRlcjpub3JlbmRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlOmZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICB9LCBbYWQuYnVmZmVyXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBnID0gdGhpcy5zb25hZ3JhbUNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGcuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRyYXdSZW5kZXJlZCh3Om51bWJlcixoOm51bWJlcixpbWdEYXRhOlVpbnQ4Q2xhbXBlZEFycmF5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc29uYWdyYW1DYW52YXMpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc29uYWdyYW1DYW52YXMud2lkdGggPSB3O1xyXG4gICAgICAgICAgICB0aGlzLnNvbmFncmFtQ2FudmFzLmhlaWdodCA9IGg7XHJcbiAgICAgICAgICAgIGxldCBnID0gdGhpcy5zb25hZ3JhbUNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW1nRGF0YUFycjogVWludDhDbGFtcGVkQXJyYXkgPSBpbWdEYXRhO1xyXG4gICAgICAgICAgICAgICAgaWYgKHcgPiAwICYmIGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdJbWdEYXRhID0gZy5jcmVhdGVJbWFnZURhdGEodywgaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZ0ltZ0RhdGEuZGF0YS5zZXQoaW1nRGF0YUFycik7XHJcbiAgICAgICAgICAgICAgICAgICAgZy5wdXRJbWFnZURhdGEoZ0ltZ0RhdGEsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZHJhd0JnKClcclxuICAgICAgICB0aGlzLmRyYXdQbGF5UG9zaXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzeW5jaHJvbm91cyBkcmF3IChub3QgdXNlZCBhbnltb3JlKVxyXG4gIHJlZHJhdygpIHtcclxuXHJcbiAgICBsZXQgZyA9IHRoaXMuc29uYWdyYW1DYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG5cclxuICAgIGxldCB3ID0gdGhpcy5zb25hZ3JhbUNhbnZhcy53aWR0aDtcclxuICAgIGxldCBoID0gdGhpcy5zb25hZ3JhbUNhbnZhcy5oZWlnaHQ7XHJcbiAgICBpZiAoZykge1xyXG4gICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgZy5maWxsU3R5bGUgPSBcIndoaXRlXCI7XHJcbiAgICAgIGcuZmlsbFJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGFIb2xkZXIpIHtcclxuICAgICAgICBsZXQgc3BlY3RTaXplID0gTWF0aC5mbG9vcih0aGlzLmRmdFNpemUgLyAyKVxyXG4gICAgICAgIGxldCBjaHMgPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICBsZXQgY2hIID0gaCAvIGNocztcclxuXHJcbiAgICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLmZyYW1lTGVuO1xyXG5cclxuICAgICAgICBsZXQgZnJhbWVzUGVyUGl4ZWwgPSBmcmFtZUxlbmd0aCAvIHc7XHJcbiAgICAgICAgbGV0IHkgPSAwO1xyXG4gICAgICAgIGxldCBhdWRpb0J1ZmZlcj10aGlzLl9hdWRpb0RhdGFIb2xkZXIuYnVmZmVyO1xyXG4gICAgICAgIGxldCBhcnJheUF1ZGlvQnVmZmVyPXRoaXMuX2F1ZGlvRGF0YUhvbGRlci5hcnJheUJ1ZmZlcjtcclxuICAgICAgICBpZihhdWRpb0J1ZmZlcikge1xyXG4gICAgICAgICAgbGV0IGIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuZGZ0U2l6ZSlcclxuXHJcbiAgICAgICAgICBsZXQgc29uYSA9IG5ldyBBcnJheTxBcnJheTxGbG9hdDMyQXJyYXk+PihjaHMpO1xyXG4gICAgICAgICAgbGV0IG1heCA9IDA7XHJcbiAgICAgICAgICBsZXQgbWF4UHNkID0gLUluZmluaXR5O1xyXG4gICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICBsZXQgeCA9IDA7XHJcbiAgICAgICAgICAgIHNvbmFbY2hdID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4odyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY2hEYXRhID0gYXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4gICAgICAgICAgICAvLyBUT0RPIGNlbnRlciBidWZmZXJcclxuXHJcbiAgICAgICAgICAgIGxldCBmcmFtZVBvcyA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHBpaSA9IDA7IHBpaSA8IHc7IHBpaSsrKSB7XHJcbiAgICAgICAgICAgICAgZnJhbWVQb3MgPSBNYXRoLnJvdW5kKHBpaSAqIGZyYW1lc1BlclBpeGVsKTtcclxuICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgREZUIGF0IHBpeGVsIHBvc2l0aW9uXHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRmdFNpemU7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNoRGF0ID0gY2hEYXRhW2ZyYW1lUG9zICsgaV07XHJcbiAgICAgICAgICAgICAgICBiW2ldID0gY2hEYXQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCBzcGVjdHIgPSB0aGlzLmRmdC5wcm9jZXNzUmVhbE1hZ25pdHVkZShiKTtcclxuICAgICAgICAgICAgICBzb25hW2NoXVtwaWldID0gc3BlY3RyO1xyXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICBsZXQgcE1heCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIHNwZWN0cik7XHJcbiAgICAgICAgICAgICAgaWYgKHBNYXggPiBtYXgpIHtcclxuICAgICAgICAgICAgICAgIG1heCA9IHBNYXg7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IHNwZWN0U2l6ZTsgcysrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHNkID0gKDIgKiBNYXRoLnBvdyhzcGVjdHJbc10sIDIpKSAvIHNwZWN0U2l6ZTtcclxuICAgICAgICAgICAgICAgIGlmIChwc2QgPiBtYXhQc2QpIHtcclxuICAgICAgICAgICAgICAgICAgbWF4UHNkID0gcHNkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhcIm1heDogXCIsIG1heCk7XHJcbiAgICAgICAgICBtYXhQc2QgPSAoMiAqIE1hdGgucG93KG1heCwgMikpIC8gc3BlY3RTaXplO1xyXG4gICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG5cclxuICAgICAgICAgICAgbGV0IGZyYW1lUG9zID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgcGlpID0gMDsgcGlpIDwgdzsgcGlpKyspIHtcclxuICAgICAgICAgICAgICBmcmFtZVBvcyA9IHBpaSAqIGZyYW1lc1BlclBpeGVsO1xyXG5cclxuICAgICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGg7IHkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGZyZXFJZHggPSBNYXRoLnJvdW5kKHkgKiBzcGVjdFNpemUgLyBoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIG9uZSBzaWRlZCBwb3dlciBzcGVjdHJhbCBkZW5zaXR5IFBTRCAoZiwgdCkgaW4gUGEyL0h6XHJcbiAgICAgICAgICAgICAgICAvLyBQU0QoZikgcHJvcG9ydGlvbmFsIHRvIDJ8WChmKXwyIC8gKHQyIC0gdDEpXHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gc29uYVtjaF1bcGlpXVtmcmVxSWR4XTtcclxuICAgICAgICAgICAgICAgIGxldCBwc2QgPSAoMiAqIE1hdGgucG93KHZhbCwgMikpIC8gc3BlY3RTaXplO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBsb2dhcml0aG1pY1xyXG4gICAgICAgICAgICAgICAgbGV0IHBzZExvZyA9IERTUFV0aWxzLnRvTGV2ZWxJbkRCKHBzZCAvIG1heFBzZCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZHluUmFuZ2VJbkRiID0gNzA7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2NhbGVkVmFsID0gKHBzZExvZyArIGR5blJhbmdlSW5EYikgLyBkeW5SYW5nZUluRGI7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNjYWxlZFZhbCA+IDEpXHJcbiAgICAgICAgICAgICAgICAgIHNjYWxlZFZhbCA9IDE7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2NhbGVkVmFsIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICBzY2FsZWRWYWwgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHJnYlZhbCA9ICgyNTUgKiBzY2FsZWRWYWwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJnYlZhbCA8IDApIHtcclxuLy9cdFx0XHRcdFx0XHRcdFN5c3RlbS5vdXQucHJpbnRsbihcIk5lZyBSR0IgdmFsOiBcIityZ2JWYWwpO1xyXG4gICAgICAgICAgICAgICAgICByZ2JWYWwgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJnYlZhbCA+IDI1NSkge1xyXG4gICAgICAgICAgICAgICAgICByZ2JWYWwgPSAyNTU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZ2JWYWwgPSAyNTUgLSByZ2JWYWw7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29sb3JTdHIgPSBDU1NVdGlscy50b0NvbG9yU3RyaW5nKHJnYlZhbCwgcmdiVmFsLCByZ2JWYWwpO1xyXG4gICAgICAgICAgICAgICAgZy5maWxsU3R5bGUgPSBjb2xvclN0cjtcclxuICAgICAgICAgICAgICAgIGcuZmlsbFJlY3QocGlpLCBjaEggLSB5LCAxLCAxKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZHJhd1BsYXlQb3NpdGlvbigpO1xyXG4gICAgICAgIH1lbHNlIGlmKGFycmF5QXVkaW9CdWZmZXIpe1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIlJlZHJhdyB3aXRoIGFycmF5IGF1ZGlvIGJ1ZmZlciBub3Qgc3VwcG9ydGVkLlwiKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gICAgc2V0RGF0YShhdWRpb0RhdGE6IEF1ZGlvRGF0YUhvbGRlciB8IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9hdWRpb0RhdGFIb2xkZXIgPSBhdWRpb0RhdGE7XHJcbiAgICAgICAgdGhpcy5wbGF5RnJhbWVQb3NpdGlvbiA9IDA7XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG5cclxuIl19
900
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYWdyYW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vdWkvc29uYWdyYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBUyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDdkMsT0FBTyxFQUFDLFNBQVMsRUFBYyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxpQkFBaUIsRUFBa0IsTUFBTSxzQkFBc0IsQ0FBQzs7QUFLeEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUF3QjlCLE1BQU0sT0FBTyxRQUFTLFNBQVEseUJBQXlCO0lBb0JuRCxZQUFvQixHQUFlO1FBQy9CLEtBQUssRUFBRSxDQUFDO1FBRFEsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQVIzQix1QkFBa0IsR0FBYyxJQUFJLENBQUM7UUFJckMsY0FBUyxHQUFtQixJQUFJLENBQUM7UUFFakMsWUFBTyxHQUFHLGdCQUFnQixDQUFDO1FBSS9CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FB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RUFBRSxDQUFDO29CQUNiLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ04sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ3JCLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN0QixDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDdEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFFN0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFOzRCQUNoQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7NEJBQ3hDLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQzs0QkFDeEMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDOzRCQUM1QixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQzFCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDOzRCQUN2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt5QkFDeEI7cUJBQ0o7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Y2VzQ29udGVudCI6WyJpbXBvcnQge0RGVEZsb2F0MzJ9IGZyb20gJy4uLy4uL21hdGgvZGZ0JztcclxuaW1wb3J0IHtNYXJrZXIsIFBvaW50fSBmcm9tICcuL2NvbW1vbic7XHJcbmltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGR9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7QXVkaW9DYW52YXNMYXllckNvbXBvbmVudH0gZnJvbSBcIi4vYXVkaW9fY2FudmFzX2xheWVyX2NvbXBcIjtcclxuaW1wb3J0IHtXb3JrZXJIZWxwZXJ9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xyXG5pbXBvcnQge0F1ZGlvQnVmZmVyU291cmNlLCBBdWRpb0RhdGFIb2xkZXJ9IGZyb20gXCIuLi9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmRlY2xhcmUgZnVuY3Rpb24gcG9zdE1lc3NhZ2UobWVzc2FnZTogYW55LCB0cmFuc2ZlcjogQXJyYXk8YW55Pik6IHZvaWQ7XHJcblxyXG5jb25zdCBERUZBVUxUX0RGVF9TSVpFID0gMTAyNDtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICAgIHNlbGVjdG9yOiAnYXVkaW8tc29uYWdyYW0nLFxyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8Y2FudmFzICNzb25hZ3JhbSBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPlxyXG4gICAgICAgIDxjYW52YXMgI2JnIGhlaWdodD1cIjEwXCI+PC9jYW52YXM+XHJcbiAgICAgICAgPGNhbnZhcyAjY3Vyc29yIGhlaWdodD1cIjEwXCIgKG1vdXNlZG93bik9XCJzZWxlY3Rpb25TdGFydCgkZXZlbnQpXCIgKG1vdXNlb3Zlcik9XCJ1cGRhdGVDdXJzb3JDYW52YXMoJGV2ZW50KVwiIChtb3VzZW1vdmUpPVwidXBkYXRlQ3Vyc29yQ2FudmFzKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwidXBkYXRlQ3Vyc29yQ2FudmFzKCRldmVudCwgZmFsc2UpXCI+PC9jYW52YXM+XHJcbiAgICAgICAgPGNhbnZhcyAjbWFya2VyIGhlaWdodD1cIjEwXCI+PC9jYW52YXM+YCxcclxuXHJcbiAgICBzdHlsZXM6IFtgOmhvc3R7XHJcbiAgICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuICAgIH1gLGBjYW52YXMge1xyXG4gICAgICAgIHRvcDogMDtcclxuICAgICAgICBsZWZ0OiAwO1xyXG4gICAgICAgIHdpZHRoOiAwO1xyXG4gICAgICAgIGhlaWdodDogMDtcclxuICAgICAgbWluLWhlaWdodDogMHB4O1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIFNvbmFncmFtIGV4dGVuZHMgQXVkaW9DYW52YXNMYXllckNvbXBvbmVudCB7XHJcblxyXG4gICAgZGZ0OiBERlRGbG9hdDMyO1xyXG4gICAgbjogYW55O1xyXG4gICAgY2UhOiBIVE1MRGl2RWxlbWVudDtcclxuICAgIHNvbmFncmFtQ2FudmFzITogSFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgICAvL2N1cnNvckNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgICBtYXJrZXJDYW52YXMhOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuICAgIEBWaWV3Q2hpbGQoJ3NvbmFncmFtJywgeyBzdGF0aWM6IHRydWUgfSkgc29uYWdyYW1DYW52YXNSZWYhOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ21hcmtlcicsIHsgc3RhdGljOiB0cnVlIH0pIG1hcmtlckNhbnZhc1JlZiE6IEVsZW1lbnRSZWY7XHJcbiAgICBtYXJrZXJzOiBBcnJheTxNYXJrZXI+O1xyXG4gICAgcHJpdmF0ZSBfcGxheUZyYW1lUG9zaXRpb246IG51bWJlcnxudWxsPW51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSB3b3JrZXI6IFdvcmtlciB8IG51bGw7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmtlclVSTDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSByYUFzU3Vic2M6U3Vic2NyaXB0aW9ufG51bGw9bnVsbDtcclxuXHJcbiAgICBwcml2YXRlIGRmdFNpemUgPSBERUZBVUxUX0RGVF9TSVpFO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLndvcmtlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYXVkaW9EYXRhSG9sZGVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLm1hcmtlcnMgPSBuZXcgQXJyYXk8TWFya2VyPigpO1xyXG4gICAgICAgIHRoaXMuZGZ0ID0gbmV3IERGVEZsb2F0MzIodGhpcy5kZnRTaXplKTtcclxuXHJcbiAgICAgICAgdGhpcy53b3JrZXJVUkwgPSBXb3JrZXJIZWxwZXIuYnVpbGRXb3JrZXJCbG9iVVJMKHRoaXMud29ya2VyRnVuY3Rpb24pXHJcbiAgICAgICB0aGlzLl9iZ0NvbG9yPW51bGw7XHJcbiAgICAgICB0aGlzLl9zZWxlY3RDb2xvcj0ncmdiYSgyNTUsMjU1LDAsMC4xKSdcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcblxyXG4gICAgICAgIHRoaXMuY2UgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuc29uYWdyYW1DYW52YXMgPSB0aGlzLnNvbmFncmFtQ2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5zb25hZ3JhbUNhbnZhcy5zdHlsZS56SW5kZXggPSAnMSc7XHJcbiAgICAgIHRoaXMuYmdDYW52YXMgPSB0aGlzLmJnQ2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIHRoaXMuYmdDYW52YXMuc3R5bGUuekluZGV4ID0gJzInO1xyXG4gICAgICAgIHRoaXMuY3Vyc29yQ2FudmFzID0gdGhpcy5jdXJzb3JDYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgICB0aGlzLmN1cnNvckNhbnZhcy5zdHlsZS56SW5kZXggPSAnNCc7XHJcbiAgICAgICAgdGhpcy5tYXJrZXJDYW52YXMgPSB0aGlzLm1hcmtlckNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHRoaXMubWFya2VyQ2FudmFzLnN0eWxlLnpJbmRleCA9ICczJztcclxuXHJcbiAgICAgICAgdGhpcy5jYW52YXNMYXllcnNbMF0gPSB0aGlzLnNvbmFncmFtQ2FudmFzO1xyXG4gICAgICB0aGlzLmNhbnZhc0xheWVyc1sxXSA9IHRoaXMuYmdDYW52YXM7XHJcbiAgICAgIHRoaXMuY2FudmFzTGF5ZXJzWzJdID0gdGhpcy5jdXJzb3JDYW52YXM7XHJcbiAgICAgICAgdGhpcy5jYW52YXNMYXllcnNbM10gPSB0aGlzLm1hcmtlckNhbnZhcztcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBsYXlGcmFtZVBvc2l0aW9uKCk6IG51bWJlcnxudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcGxheUZyYW1lUG9zaXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHBsYXlGcmFtZVBvc2l0aW9uKHBsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbCkge1xyXG4gICAgICAgIHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uID0gcGxheUZyYW1lUG9zaXRpb247XHJcbiAgICAgICAgLy8gdGhpcy5yZWRyYXcoKTtcclxuICAgICAgICB0aGlzLmRyYXdQbGF5UG9zaXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbnZhc01vdXNlUG9zKGM6IEhUTUxDYW52YXNFbGVtZW50LCBlOiBNb3VzZUV2ZW50KTogUG9pbnQge1xyXG4gICAgICAgIGNvbnN0IGNyID0gYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgY29uc3QgeCA9IGUueCAtIGNyLmxlZnQ7XHJcbiAgICAgICAgY29uc3QgeSA9IGUueSAtIGNyLnRvcDtcclxuICAgICAgICByZXR1cm4gbmV3IFBvaW50KHgseSk7XHJcbiAgICB9XHJcblxyXG4gIGRyYXdTdGF0ZVRleHQoc3RhdGVUZXh0OnN0cmluZykge1xyXG4gICAgICAgIGlmKHN0YXRlVGV4dCkge1xyXG4gICAgICAgICAgICBjb25zdCBnID0gdGhpcy5zb25hZ3JhbUNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLnNvbmFncmFtQ2FudmFzLndpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCBoID0gdGhpcy5zb25hZ3JhbUNhbnZhcy5oZWlnaHQ7XHJcbiAgICAgICAgICAgIGlmIChnICYmIHcgJiYgaCkge1xyXG4gICAgICAgICAgICAgICAgZy5zdHJva2VTdHlsZSA9ICdibGFjayc7XHJcbiAgICAgICAgICAgICAgICBnLmZpbGxTdHlsZSA9ICdibGFjayc7XHJcbiAgICAgICAgICAgICAgICBnLmZvbnQgPSAnMjBweCBzYW5zLXNlcmlmJztcclxuICAgICAgICAgICAgICAgIGcuZmlsbFRleHQoc3RhdGVUZXh0LCAxMCwgMjUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gIH1cclxuXHJcbiAgZHJhd0N1cnNvclBvc2l0aW9uKGU6IE1vdXNlRXZlbnQsIHNob3c6IGJvb2xlYW4pIHtcclxuXHJcbiAgICBpZiAodGhpcy5jdXJzb3JDYW52YXMpIHtcclxuICAgICAgY29uc3QgdyA9IHRoaXMuY3Vyc29yQ2FudmFzLndpZHRoO1xyXG4gICAgICBjb25zdCBoID0gdGhpcy5jdXJzb3JDYW52YXMuaGVpZ2h0O1xyXG4gICAgICBjb25zdCBnID0gdGhpcy5jdXJzb3JDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgaWYgKGcpIHtcclxuICAgICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICBpZiAoc2hvdykge1xyXG4gICAgICAgICAgLy9jb25zdCBwcCA9IHRoaXMuY2FudmFzTW91c2VQb3ModGhpcy5jdXJzb3JDYW52YXMsIGUpO1xyXG4gICAgICAgICAgbGV0IHhWaWV3UG9ydFBpeGVscG9zID0gZS5vZmZzZXRYO1xyXG5cclxuICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ3llbGxvdyc7XHJcbiAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ3llbGxvdyc7XHJcbiAgICAgICAgICBnLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgICAgZy5tb3ZlVG8oeFZpZXdQb3J0UGl4ZWxwb3MsIDApO1xyXG4gICAgICAgICAgZy5saW5lVG8oeFZpZXdQb3J0UGl4ZWxwb3MsIGgpO1xyXG4gICAgICAgICAgZy5jbG9zZVBhdGgoKTtcclxuXHJcbiAgICAgICAgICBnLnN0cm9rZSgpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGFIb2xkZXIpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBmcmFtZVBvc1JvdW5kID0gdGhpcy52aWV3UG9ydFhQaXhlbFRvRnJhbWVQb3NpdGlvbih4Vmlld1BvcnRQaXhlbHBvcyk7XHJcbiAgICAgICAgICAgIGlmKGZyYW1lUG9zUm91bmQhPW51bGwpIHtcclxuICAgICAgICAgICAgICBnLmZvbnQgPSAnMTRweCBzYW5zLXNlcmlmJztcclxuICAgICAgICAgICAgICBnLmZpbGxTdHlsZSA9ICd5ZWxsb3cnO1xyXG4gICAgICAgICAgICAgIGcuZmlsbFRleHQoZnJhbWVQb3NSb3VuZC50b1N0cmluZygpLCB4Vmlld1BvcnRQaXhlbHBvcyArIDIsIDUwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgICBkcmF3UGxheVBvc2l0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm1hcmtlckNhbnZhcykge1xyXG4gICAgICAgICAgICBjb25zdCB3ID0gdGhpcy5tYXJrZXJDYW52YXMud2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLm1hcmtlckNhbnZhcy5oZWlnaHQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGcgPSB0aGlzLm1hcmtlckNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgICAgICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uIT1udWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBpeGVsUG9zID0gdGhpcy5mcmFtZVRvVmlld1BvcnRYUGl4ZWxQb3NpdGlvbih0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsUG9zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ3JlZCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAncmVkJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZy5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZy5tb3ZlVG8ocGl4ZWxQb3MsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnLmxpbmVUbyhwaXhlbFBvcywgaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiAgTWV0aG9kIHVzZWQgYXMgd29ya2VyIGNvZGUuXHJcbiAgICAgKi9cclxuICAgIHdvcmtlckZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICAvLyBSZWRlZmluZSBzb21lIERTUCBjbGFzc2VzIGZvciB3b3JrZXIgZnVuY3Rpb25cclxuICAgICAgICAvLyBTZWUgZS5nLiBhdWRpby5tYXRoLkNvbXBsZXhcclxuICAgICAgICBjbGFzcyBDb21wbGV4IHtcclxuXHJcbiAgICAgICAgICAgIHJlYWw6IG51bWJlcjtcclxuICAgICAgICAgICAgaW1nOiBudW1iZXI7XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZyb21Qb2xhckZvcm0obWFnbml0dWRlOiBudW1iZXIsIGFyZ3VtZW50OiBudW1iZXIpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLmNvcyhhcmd1bWVudCkgKiBtYWduaXR1ZGU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpID0gTWF0aC5zaW4oYXJndW1lbnQpICogbWFnbml0dWRlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KHIsIGkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcihyZWFsOiBudW1iZXIsIGltZzogbnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWwgPSByZWFsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbWcgPSBpbWc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBtYWduaXR1ZGUoKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoKHRoaXMucmVhbCAqIHRoaXMucmVhbCkgKyAodGhpcy5pbWcgKiB0aGlzLmltZykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgYXJndW1lbnQoKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMuaW1nLCB0aGlzLnJlYWwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgYWRkKGFkZEM6IENvbXBsZXgpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwgKyBhZGRDLnJlYWwsIHRoaXMuaW1nICsgYWRkQy5pbWcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgc3ViKHN1YkM6IENvbXBsZXgpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwgLSBzdWJDLnJlYWwsIHRoaXMuaW1nIC0gc3ViQy5pbWcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgbXVsdChtdWx0QzogQ29tcGxleCk6IENvbXBsZXgge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbXVsdFIgPSAodGhpcy5yZWFsICogbXVsdEMucmVhbCkgLSAodGhpcy5pbWcgKiBtdWx0Qy5pbWcpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbXVsdEkgPSAodGhpcy5yZWFsICogbXVsdEMuaW1nKSArIChtdWx0Qy5yZWFsICogdGhpcy5pbWcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KG11bHRSLCBtdWx0SSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBtdWx0UmVhbChtdWx0RjogbnVtYmVyKTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgodGhpcy5yZWFsICogbXVsdEYsIHRoaXMuaW1nICogbXVsdEYpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgZGl2KGRpdmlzb3I6IENvbXBsZXgpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpdlJlYWwgPSBkaXZpc29yLnJlYWw7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXZJbWcgPSBkaXZpc29yLmltZztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpdiA9IChkaXZSZWFsICogZGl2UmVhbCkgKyAoZGl2SW1nICogZGl2SW1nKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpdmlzaW9uUmVhbCA9ICgodGhpcy5yZWFsICogZGl2UmVhbCkgKyAodGhpcy5pbWcgKiBkaXZJbWcpKSAvIGRpdjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpdmlzaW9uSW1nID0gKChkaXZSZWFsICogdGhpcy5pbWcpIC0gKHRoaXMucmVhbCAqIGRpdkltZykpIC8gZGl2O1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleChkaXZpc2lvblJlYWwsIGRpdmlzaW9uSW1nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcHVibGljIGRpdlJlYWwoZGl2aXNvcjogbnVtYmVyKTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYgPSBkaXZpc29yICogZGl2aXNvcjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpdnNpb25SZWFsID0gKHRoaXMucmVhbCAqIGRpdmlzb3IpIC8gZGl2O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGl2c2lvbkltZyA9IChkaXZpc29yICogdGhpcy5pbWcpIC8gZGl2O1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleChkaXZzaW9uUmVhbCwgZGl2c2lvbkltZyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBjb25qdWdhdGUoKTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgodGhpcy5yZWFsLCAtdGhpcy5pbWcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgZXF1YWxzKGM6IENvbXBsZXgpOiBib29sZWFuIHtcclxuICAgICAgICAgICAgICAgIGlmIChjID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnJlYWwgPT09IGMucmVhbCAmJiB0aGlzLmltZyA9PT0gYy5pbWcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnUmVhbDogJyArIHRoaXMucmVhbCArICcsIEltZzogJyArIHRoaXMuaW1nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjbGFzcyBERlRGbG9hdDMyIHtcclxuXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbjogbnVtYmVyO1xyXG4gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG06IG51bWJlcjtcclxuXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29zTG9va3VwOiBGbG9hdDMyQXJyYXk7XHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2luTG9va3VwOiBGbG9hdDMyQXJyYXk7XHJcblxyXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcihuOiBudW1iZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubiA9IG47XHJcbiAgICAgICAgICAgICAgICB0aGlzLm0gPSBNYXRoLmxvZyhuKSAvIE1hdGgubG9nKDIpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGlmKG4gIT0gKDEgPDwgbSkpdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCJsZW5ndGggTiBtdXN0IGJlIHBvd2VyIG9mIDJcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbG9va3VwIHRhYmxlc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3NMb29rdXAgPSBuZXcgRmxvYXQzMkFycmF5KG4gLyAyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2luTG9va3VwID0gbmV3IEZsb2F0MzJBcnJheShuIC8gMik7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuIC8gMjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJjID0gKC0yICogTWF0aC5QSSAqIGkpIC8gbjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvc0xvb2t1cFtpXSA9IE1hdGguY29zKGFyYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaW5Mb29rdXBbaV0gPSBNYXRoLnNpbihhcmMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwdWJsaWMgcHJvY2Vzc1JlYWwoc3JjQnVmOiBGbG9hdDMyQXJyYXkpOiBBcnJheTxDb21wbGV4PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gc3JjQnVmLnNsaWNlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gbmV3IEZsb2F0MzJBcnJheShzcmNCdWYubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHlpID0gMDsgeWkgPCB5Lmxlbmd0aDsgeWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHlbeWldID0gMC4wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mZnRDb29sZXlUdWtleSh4LCB5KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJjID0gbmV3IEFycmF5PENvbXBsZXg+KHgubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJjW2ldID0gbmV3IENvbXBsZXgoeFtpXSwgeVtpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHB1YmxpYyBwcm9jZXNzUmVhbE1hZ25pdHVkZShzcmNCdWY6IEZsb2F0MzJBcnJheSk6IEZsb2F0MzJBcnJheSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gc3JjQnVmLnNsaWNlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gbmV3IEZsb2F0MzJBcnJheShzcmNCdWYubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHlpID0gMDsgeWkgPCB5Lmxlbmd0aDsgeWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHlbeWldID0gMC4wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mZnRDb29sZXlUdWtleSh4LCB5KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJjID0gbmV3IEZsb2F0MzJBcnJheSh4Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByY2MgPSBuZXcgQ29tcGxleCh4W2ldLCB5W2ldKTtcclxuICAgICAgICAgICAgICAgICAgICByY1tpXSA9IHJjYy5tYWduaXR1ZGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByYztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcHVibGljIGZmdENvb2xleVR1a2V5KHJlYWw6IEZsb2F0MzJBcnJheSwgaW1nOiBGbG9hdDMyQXJyYXkpOiB2b2lkIHtcclxuICAgICAgICAgICAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XHJcbiAgICAgICAgICAgICAgICBsZXQgazogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgbGV0IG4xOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBsZXQgbjI6IG51bWJlciA9IHRoaXMubiAvIDI7XHJcbiAgICAgICAgICAgICAgICBsZXQgYTogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgbGV0IGM6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIGxldCBzOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBsZXQgdDE6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIGxldCB0MjogbnVtYmVyO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCB0aGlzLm4gLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBuMSA9IG4yO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChqID49IG4xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBqIC0gbjE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG4xID0gbjEgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBqID0gaiArIG4xO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGopIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdDEgPSByZWFsW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFsW2ldID0gcmVhbFtqXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFtqXSA9IHQxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0MSA9IGltZ1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nW2ldID0gaW1nW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWdbal0gPSB0MTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbjEgPSAwO1xyXG4gICAgICAgICAgICAgICAgbjIgPSAxO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbjEgPSBuMjtcclxuICAgICAgICAgICAgICAgICAgICBuMiA9IG4yICsgbjI7XHJcbiAgICAgICAgICAgICAgICAgICAgYSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG4xOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHRoaXMuY29zTG9va3VwW2FdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzID0gdGhpcy5zaW5Mb29rdXBbYV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGEgKz0gKDEgPDwgKHRoaXMubSAtIGkgLSAxKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSBqOyBrIDwgdGhpcy5uOyBrID0gayArIG4yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSA9IGMgKiByZWFsW2sgKyBuMV0gLSBzICogaW1nW2sgKyBuMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MiA9IHMgKiByZWFsW2sgKyBuMV0gKyBjICogaW1nW2sgKyBuMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsW2sgKyBuMV0gPSByZWFsW2tdIC0gdDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdbayArIG4xXSA9IGltZ1trXSAtIHQyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFtrXSA9IHJlYWxba10gKyB0MTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1trXSA9IGltZ1trXSArIHQyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgcHVibGljIHByb2Nlc3ModDogQXJyYXk8Q29tcGxleD4pOiBBcnJheTxDb21wbGV4PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWFsczogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLm4pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW1nczogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLm4pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnM6IEFycmF5PENvbXBsZXg+ID0gbmV3IEFycmF5PENvbXBsZXg+KHRoaXMubik7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVhbHNbaV0gPSB0W2ldLnJlYWw7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1nc1tpXSA9IHRbaV0uaW1nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mZnRDb29sZXlUdWtleShyZWFscywgaW1ncyk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNbaV0gPSBuZXcgQ29tcGxleChyZWFsc1tpXSwgaW1nc1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnM7XHJcblxyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGludGVyZmFjZSBXaW5kb3dGdW5jdGlvbiB7XHJcbiAgICAgICAgICAgIGdldFNjYWxlKGk6IG51bWJlcik6IG51bWJlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNsYXNzIEdhdXNzaWFuV2luZG93IGltcGxlbWVudHMgV2luZG93RnVuY3Rpb24ge1xyXG5cclxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBERUZBVUxUX1NJR01BID0gMC4zO1xyXG4gICAgICAgICAgICAvLyBHYXVzc2lhbiB3aW5kb3cgZnVuY3Rpb24sXHJcbiAgICAgICAgICAgIC8vIGh0dHA6Ly9yZWZlcmVuY2Uud29sZnJhbS5jb20vbGFuZ3VhZ2UvcmVmL0dhdXNzaWFuV2luZG93Lmh0bWxcclxuICAgICAgICAgICAgLy8gdmFsPWV4cCgtNTAqeCp4LzkpID0+IHNpZ21hPTAuM1xyXG5cclxuICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBidWY6IEZsb2F0MzJBcnJheTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHNpemU6IG51bWJlciwgc2lnbWE6IG51bWJlciA9IEdhdXNzaWFuV2luZG93LkRFRkFVTFRfU0lHTUEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVmID0gbmV3IEZsb2F0MzJBcnJheShzaXplKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IChzaXplIC0gMSkgLyAyO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBxdW90ID0gKGkgLSBjZW50ZXIpIC8gKHNpZ21hICogY2VudGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHAgPSAtMC41ICogcXVvdCAqIHF1b3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZbaV0gPSBNYXRoLmV4cChleHApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBnZXRTY2FsZShpOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmW2ldO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VsZi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAobXNnOk1lc3NhZ2VFdmVudCkge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTb25hZ3JhbSByZW5kZXIgdGhyZWFkXCIpO1xyXG4gICAgICAgICAgICBsZXQgbCA9IG1zZy5kYXRhLmw7XHJcbiAgICAgICAgICAgIGxldCB3ID0gbXNnLmRhdGEudztcclxuICAgICAgICAgICAgbGV0IGggPSBtc2cuZGF0YS5oO1xyXG4gICAgICAgICAgICBsZXQgdncgPSBtc2cuZGF0YS52dztcclxuICAgICAgICAgICAgbGV0IGNocyA9IG1zZy5kYXRhLmNocztcclxuICAgICAgICAgICAgbGV0IGF1ZGlvRGF0YU9mZnNldD0wO1xyXG4gICAgICAgICAgICBsZXQgYWRPZmZzZXQ9bXNnLmRhdGEuYXVkaW9EYXRhT2Zmc2V0O1xyXG4gICAgICAgICAgICBpZihhZE9mZnNldCl7XHJcbiAgICAgICAgICAgICAgYXVkaW9EYXRhT2Zmc2V0PWFkT2Zmc2V0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgbGV0IG1heFBzZCA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmKG1zZy5kYXRhLm1heFBzZCE9PXVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgICAgbWF4UHNkPW1zZy5kYXRhLm1heFBzZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGF1ZGlvRGF0YSA9IG5ldyBBcnJheShjaHMpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICBhdWRpb0RhdGFbY2hdID0gbmV3IEZsb2F0MzJBcnJheShtc2cuZGF0YVsnYXVkaW9EYXRhJ11bY2hdKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gbXNnLmRhdGEuZnJhbWVMZW5ndGg7XHJcbiAgICAgICAgICAgIGxldCBkZnRTaXplID0gbXNnLmRhdGEuZGZ0U2l6ZTtcclxuXHJcbiAgICAgICAgICAgIGxldCBkZnRCYW5kcyA9IGRmdFNpemUgLyAyO1xyXG4gICAgICAgICAgICBsZXQgZGZ0ID0gbmV3IERGVEZsb2F0MzIoZGZ0U2l6ZSk7XHJcbiAgICAgICAgICAgIGxldCB3ZiA9IG5ldyBHYXVzc2lhbldpbmRvdyhkZnRTaXplKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBhcnJTaXplPXcqaCo0O1xyXG4gICAgICAgICAgICBpZihhcnJTaXplPDApe1xyXG4gICAgICAgICAgICAgICAgYXJyU2l6ZT0wXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGltZ0RhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoYXJyU2l6ZSk7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJSZW5kZXIgbWV0aG9kOlwiKTtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNyZWF0ZWQgaW1nRGF0YSBhcnJTaXplOiBcIithcnJTaXplK1wiIFwiLCB3LCBcInhcIiwgaCk7XHJcbiAgICAgICAgICBsZXQgY2FsY01heFBzZD0tSW5maW5pdHk7XHJcbiAgICAgICAgICAgIGlmIChhcnJTaXplPjApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY2hIID0gTWF0aC5yb3VuZChoIC8gY2hzKTtcclxuICAgICAgICAgICAgICAgIGxldCBmcmFtZXNQZXJQaXhlbCA9IGZyYW1lTGVuZ3RoIC8gdnc7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJSZW5kZXI6IFwiLCB3LCBcInhcIiwgaCk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGIgPSBuZXcgRmxvYXQzMkFycmF5KGRmdFNpemUpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHNvbmEgPSBuZXcgQXJyYXkoY2hzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaERhdGFMZW49YXVkaW9EYXRhW2NoXS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBERlQgYXJyYXkgYnVmZmVyXHJcbiAgICAgICAgICAgICAgICAgICAgc29uYVtjaF0gPSBuZXcgQXJyYXkodyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lUG9zID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwaWkgPSAwOyBwaWkgPCB3OyBwaWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlydFBpaSA9IGwgKyBwaWk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvc2l0aW9uIG9mIHNhbXBsZSBkYXRhIGZyYW1lIGlzIHBpeGVsIHBvc2l0aW9uIG1hcHBlZCB0byBhdWRpbyBmcmFtZSBwb3NpdGlvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVuIFwiY2VudGVyXCIgdGhlIGZyYW1lIGJ5IHNoaWZ0aW5nIGxlZnQgYnkgaGFsZiB0aGUgREZUIHNpemUgKD1kZnRCYW5kcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVQb3MgPSBNYXRoLnJvdW5kKCh2aXJ0UGlpICogZnJhbWVzUGVyUGl4ZWwpLWRmdEJhbmRzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsbCBERlQgYnVmZmVyIHdpdGggd2luZG93ZWQgc2FtcGxlIHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRmdFNpemU7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNhbXBsZVBvcz1mcmFtZVBvcyArIGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGZvciBuZWdhdGl2ZSBzYW1wbGUgcG9zaXRpb25zIGFuZCBvdXQgb2YgYm91bmRzIHBvc2l0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoRGF0PTA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGF1ZGlvIHNhbXBsZSBpZiBhdmFpbGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZHA9c2FtcGxlUG9zLWF1ZGlvRGF0YU9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkcD49MCAmJiBhZHAgPCBjaERhdGFMZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hEYXQgPSBhdWRpb0RhdGFbY2hdW2FkcF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIGRhdGE6IFwiK2NoRGF0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTYW1wbGUgYnVmIHBvcyBvb2I6IGFkcDogXCIrYWRwK1wiLCBjaERhdGFMZW46IFwiK2NoRGF0YUxlbitcIiwgc2FtcGxlUG9zOiBcIitzYW1wbGVQb3MrXCIsIGk6IFwiK2kpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IFdpbmRvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYltpXSA9IGNoRGF0ICogd2YuZ2V0U2NhbGUoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FsYyBERlQgbWFnbml0dWRlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BlY3RyID0gZGZ0LnByb2Nlc3NSZWFsTWFnbml0dWRlKGIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IG1heGltdW0gdmFsdWUgb2Ygc3BlY3RyYWwgZW5lcmd5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgZGZ0QmFuZHM7IHMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBzZCA9ICgyICogTWF0aC5wb3coc3BlY3RyW3NdLCAyKSkgLyBkZnRCYW5kcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwc2QgPiBjYWxjTWF4UHNkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY01heFBzZCA9IHBzZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgcmVuZGVyIG1vZGVsIGRhdGEgZm9yIHRoaXMgcGl4ZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29uYVtjaF1bcGlpXSA9IHNwZWN0cjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoIW1zZy5kYXRhLm5vcmVuZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmKCFtYXhQc2Qpe1xyXG4gICAgICAgICAgICAgICAgICAgIG1heFBzZD1jYWxjTWF4UHNkO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBwaWkgPSAwOyBwaWkgPCB3OyBwaWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhbGxCbGFjayA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBjaEg7IHkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGZyZXFJZHggPSBNYXRoLnJvdW5kKHkgKiBkZnRCYW5kcyAvIGNoSCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIG9uZS1zaWRlZCBwb3dlciBzcGVjdHJhbCBkZW5zaXR5IFBTRCAoZiwgdCkgaW4gUGEyL0h6XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQU0QoZikgcHJvcG9ydGlvbmFsIHRvIDJ8WChmKXwyIC8gKHQyIC0gdDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsID0gc29uYVtjaF1bcGlpXVtmcmVxSWR4XTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBwc2QgPSAoMiAqIE1hdGgucG93KHZhbCwgMikpIC8gZGZ0QmFuZHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgbG9nYXJpdGhtaWMgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IHBzZExvZyA9IGlwcy5kc3AuRFNQVXRpbHMudG9MZXZlbEluREIocHNkIC8gbWF4UHNkKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lYXJMZXZlbCA9IHBzZCAvIG1heFBzZDtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBwc2RMb2cgPSAxMCAqIE1hdGgubG9nKGxpbmVhckxldmVsKSAvIE1hdGgubG9nKDEwKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeGVkIGR5bmFtaWMgUmFuZ2UgdmFsdWUgb2YgNzBkQiBmb3Igbm93XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZHluUmFuZ2VJbkRiID0gNzA7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgc2NhbGVkVmFsID0gKHBzZExvZyArIGR5blJhbmdlSW5EYikgLyBkeW5SYW5nZUluRGI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHRoZSBmb2xsb3dpbmcgY2hlY2tzIG5lY2Vzc2FyeSBmb3IgY2xhbXBlZCBhcnJheSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGVkVmFsID4gMS4wKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRWYWwgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxlZFZhbCA8IDAuMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRWYWwgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHJnYlZhbCA9IE1hdGgucm91bmQoMjU1ICogc2NhbGVkVmFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZ2JWYWwgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXHRcdFx0XHRcdFx0XHRTeXN0ZW0ub3V0LnByaW50bG4oXCJOZWcgUkdCIHZhbDogXCIrcmdiVmFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmdiVmFsID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZ2JWYWwgPiAyNTUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmdiVmFsID0gMjU1O1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmdiVmFsID0gMjU1IC0gcmdiVmFsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHJnYlZhbCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsQmxhY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBweSA9IGNoSCAtIHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVBvcyA9ICgoKChjaCAqIGNoSCkgKyBweSkgKiB3KSArIHBpaSkgKiA0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgaW1nRGF0YVtkYXRhUG9zICsgMF0gPSByZ2JWYWw7IC8vUlxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1nRGF0YVtkYXRhUG9zICsgMV0gPSByZ2JWYWw7IC8vR1xyXG4gICAgICAgICAgICAgICAgICAgICAgaW1nRGF0YVtkYXRhUG9zICsgMl0gPSByZ2JWYWw7IC8vQlxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1nRGF0YVtkYXRhUG9zICsgM10gPSAyNTU7IC8vQSAoYWxwaGE6IGZ1bGx5IG9wYXF1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlJlbmRlcmVkOiBweTogXCIrcHkrXCIsIHJnYnZhbDogXCIrcmdiVmFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGUgMXgxLCAyY2hzXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgY2gweDB5MFIsY2gweDB5MEcsY2gweDB5MEIsY2gweDB5MEEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgY2gweDF5MFIsY2gweDF5MEcsY2gweDF5MEIsY2gweDF5MEEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgY2gweDB5MFIsY2gweDB5MEcsY2gweDB5MEIsY2gweDB5MEEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgY2gweDF5MVIsY2gweDF5MUcsY2gweDF5MUIsY2gweDF5MUEsXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gIGNoMXgweTBSLGNoMXgweTBHLGNoMXgweTBCLGNoMXgweTBBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gIGNoMXgxeTBSLGNoMXgxeTBHLGNoMXgxeTBCLGNoMXgxeTBBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gIGNoMXgweTBSLGNoMXgweTBHLGNoMXgweTBCLGNoMXgweTBBLFxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gIGNoMXgxeTFSLGNoMXgxeTFHLGNoMXgxeTFCLGNoMXgxeTFBXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhbGxCbGFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2coXCJCbGFjazogXCIsIHBpaSwgXCIgXCIsIGNoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJSZW5kZXIgdGhyZWFkIHBvc3QgbWVzc2FnZSBpbWdEYXRhOiBcIitpbWdEYXRhLmxlbmd0aClcclxuICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe2ltZ0RhdGE6IGltZ0RhdGEsIGw6IGwsIHc6IG1zZy5kYXRhLncsIGg6IG1zZy5kYXRhLmgsIHZ3OiB2dyxtYXhQc2Q6Y2FsY01heFBzZCx0ZXJtaW5hdGU6bXNnLmRhdGEudGVybWluYXRlfSwgW2ltZ0RhdGEuYnVmZmVyXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0RHJhdyhjbGVhciA9IHRydWUpIHtcclxuICAgICAgICBpZiAoY2xlYXIpIHtcclxuICAgICAgICAgICAgaWYodGhpcy5ib3VuZHMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc29uYWdyYW1DYW52YXMuc3R5bGUubGVmdCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMucG9zaXRpb24ubGVmdCkudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW50VyA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLndpZHRoKVxyXG4gICAgICAgICAgICAgICAgbGV0IGludEggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvbmFncmFtQ2FudmFzLndpZHRoID0gaW50VztcclxuICAgICAgICAgICAgICAgIHRoaXMuc29uYWdyYW1DYW52YXMuaGVpZ2h0ID0gaW50SDtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZyA9IHRoaXMuc29uYWdyYW1DYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGcpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2cuY2xlYXJSZWN0KDAsIDAsdywgaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZy5maWxsU3R5bGUgPSBcIndoaXRlXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgZy5maWxsUmVjdCgwLCAwLCBpbnRXLCBpbnRIKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0YXJ0UmVuZGVyKCk7XHJcbiAgICAgICAgdGhpcy5kcmF3Q3Vyc29yTGF5ZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhcnRSZW5kZXIoKSB7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNvbmFncmFtIHN0YXJ0IHJlbmRlci4uLlwiKTtcclxuICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy53b3JrZXIudGVybWluYXRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgIGlmKHRoaXMucmFBc1N1YnNjKXtcclxuICAgICAgICB0aGlzLnJhQXNTdWJzYy51bnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGFIb2xkZXIpIHtcclxuICAgICAgICB0aGlzLl9hdWRpb0RhdGFIb2xkZXIuYWRkT25SZWFkeUxpc3RlbmVyKCgpPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YUhvbGRlciAmJiB0aGlzLmJvdW5kcyAmJiB0aGlzLmJvdW5kcy5kaW1lbnNpb24pIHtcclxuICAgICAgICAgICAgbGV0IHcgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aCk7XHJcbiAgICAgICAgICAgIGxldCBoID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24uaGVpZ2h0KTtcclxuICAgICAgICAgICAgbGV0IHZ3ID0gTWF0aC5yb3VuZCh0aGlzLnZpcnR1YWxEaW1lbnNpb24ud2lkdGgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHcgPiAwICYmIGggPiAwICYmIHZ3ID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIodGhpcy53b3JrZXJVUkwpO1xyXG4gICAgICAgICAgICAgIC8vdGhpcy53byA9IG5ldyBXb3JrZXIoJy4vd29ya2VyL3NvbmFncmFtLndvcmtlcicsIHsgdHlwZTogYG1vZHVsZWAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBjaHMgPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICAgICAgICBsZXQgdncgPSBNYXRoLnJvdW5kKHRoaXMudmlydHVhbERpbWVuc2lvbi53aWR0aCk7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBmcmFtZUxlbmd0aCA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5mcmFtZUxlbjtcclxuICAgICAgICAgICAgICBsZXQgZnJhbWVzUGVyUGl4ZWwgPSBNYXRoLmNlaWwoZnJhbWVMZW5ndGggLyB2dyk7XHJcbiAgICAgICAgICAgICAgbGV0IGxlZnRQb3MgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnBvc2l0aW9uLmxlZnQpO1xyXG4gICAgICAgICAgICAgIGxldCByZW5kZXJQb3MgPSBsZWZ0UG9zO1xyXG4gICAgICAgICAgICAgIGxldCByYUFzID0gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLnJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtKCk7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBhdWRpb0J1ZmZlcjogQXVkaW9CdWZmZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICAgICAgICBsZXQgYXVkaW9Tb3VyY2UgPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIuYXVkaW9Tb3VyY2U7XHJcbiAgICAgICAgICAgICAgaWYgKGF1ZGlvU291cmNlIGluc3RhbmNlb2YgQXVkaW9CdWZmZXJTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyID0gYXVkaW9Tb3VyY2UuYXVkaW9CdWZmZXI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vbGV0IGFycmF5QXVkaW9CdWZmZXI9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmFycmF5QnVmZmVyO1xyXG4gICAgICAgICAgICAgIGxldCBhcnJBYkJ1ZjogRmxvYXQzMkFycmF5W10gfCBudWxsO1xyXG4gICAgICAgICAgICAgIGxldCBhZGEgPSBuZXcgQXJyYXk8QXJyYXlCdWZmZXI+KGNocyk7XHJcbiAgICAgICAgICAgICAgLy8gZm9yKGxldCBjaD0wO2NoPGNocztjaCsrKSB7XHJcbiAgICAgICAgICAgICAgLy8gICBhZGFbY2hdID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmRmdFNpemUpO1xyXG4gICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICBsZXQgaW1nRGF0YTogVWludDhDbGFtcGVkQXJyYXk7XHJcbiAgICAgICAgICAgICAgbGV0IG1heFBzZCA9IC1JbmZpbml0eTtcclxuICAgICAgICAgICAgICBsZXQgbm9yZW5kZXIgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29ya2VyLm9ubWVzc2FnZSA9IChtZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAodHJ1ZSA9PT0gbWUuZGF0YS50ZXJtaW5hdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZHJhd0ltZ0RhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltZ0RhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGRyYXdJbWdEYXRhID0gaW1nRGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZHJhd0ltZ0RhdGEgPSBtZS5kYXRhLmltZ0RhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd1JlbmRlcmVkKHcsIGgsIGRyYXdJbWdEYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2VyLnRlcm1pbmF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtlciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFBcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgcmVuZGVyZWQgdmVydGljYWwgdmFsdWVzIG9mIG9uZSBwaXhlbCBvZiB0aW1lc2NhbGVcclxuICAgICAgICAgICAgICAgICAgICAvL2xldCBkYXRhUG9zID0gcmVuZGVyUG9zICogaCAqIDQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vcmVuZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobWUuZGF0YS5tYXhQc2QgPiBtYXhQc2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHNkID0gbWUuZGF0YS5tYXhQc2Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIm5ldyBtYXhQc2Q6IFwiK21heFBzZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBjaEggPSBNYXRoLnJvdW5kKGggLyBjaHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGlkcCA9IG1lLmRhdGEubCAtIGxlZnRQb3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgY2hIOyB5KyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHkgPSBjaEggLSB5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhUG9zID0gKCgoKGNoICogY2hIKSArIHB5KSAqIHcpICsgaWRwKSAqIDQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lUG9zID0gKChjaCAqIGNoSCkgKyBweSkgKiA0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IGxhc3RQb3MgPSBkYXRhUG9zICsgbWUuZGF0YS5pbWdEYXRhLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChsYXN0UG9zIDwgaW1nRGF0YS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb25lIHBpeGVsXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGltZ0RhdGFbZGF0YVBvc10gPSBtZS5kYXRhLmltZ0RhdGFbbWVQb3NdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGltZ0RhdGFbZGF0YVBvcyArIDFdID0gbWUuZGF0YS5pbWdEYXRhW21lUG9zICsgMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nRGF0YVtkYXRhUG9zICsgMl0gPSBtZS5kYXRhLmltZ0RhdGFbbWVQb3MgKyAyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdEYXRhW2RhdGFQb3MgKyAzXSA9IG1lLmRhdGEuaW1nRGF0YVttZVBvcyArIDNdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoXCJPdXQgb2YgcmFuZ2U6IFwiICsgZGF0YVBvcyArIFwiK1wiICsgbWUuZGF0YS5pbWdEYXRhLmxlbmd0aCArIFwiPj1cIiArIGltZ0RhdGEubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YUhvbGRlciAmJiBhcnJBYkJ1ZiAmJiB0aGlzLndvcmtlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VlZCB3aXRoIG5leHQgcGl4ZWxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBvcysrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUmVuZGVyIHBvczogXCIrcmVuZGVyUG9zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVybWluYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgd2luZG93RW5kID0gcmVuZGVyUG9zID49IGxlZnRQb3MgKyB3O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3dFbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcmVuZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGhhc2UgdHdvOiByZW5kZXJpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3JlbmRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGZyb20gYmVnaW5uaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyUG9zID0gbGVmdFBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJub3cgcmVuZGVyaW5nOiBtYXhQc2Q6IFwiK21heFBzZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYXRlIHJlbmRlciBwaGFzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdEZyYW1lUG9zID0gTWF0aC5mbG9vcihmcmFtZUxlbmd0aCAqIHJlbmRlclBvcyAvIHZ3KSAtIHRoaXMuZGZ0U2l6ZSAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobGVmdEZyYW1lUG9zIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0RnJhbWVQb3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy9sZXQgYWRhID0gbmV3IEFycmF5PEFycmF5QnVmZmVyPihjaHMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlJlbmRlciBwb3M6IFwiK3JlbmRlclBvcytcIiBsZWZ0RnJhbWVQb3M6IFwiK2xlZnRGcmFtZVBvcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXJtaW5hdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YUhvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IHJlYWQgPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXIuZnJhbWVzKGxlZnRGcmFtZVBvcywgdGhpcy5kZnRTaXplLCBhcnJBYkJ1Zik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yYUFzU3Vic2MgPSByYUFzLmZyYW1lc09icyhsZWZ0RnJhbWVQb3MsIHRoaXMuZGZ0U2l6ZSwgYXJyQWJCdWYpLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlYWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyQWJCdWYgJiYgdGhpcy53b3JrZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkIDwgdGhpcy5kZnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHplcm8gcGFkZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgenAgPSByZWFkOyB6cCA8IHRoaXMuZGZ0U2l6ZTsgenArKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyQWJCdWZbY2hdW3pwXSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgYSBjb3B5IGhlcmUgZm9yIHRoZSB3b3JrZXIsIG90aGVyd2lzZSB0aGlzLmF1ZGlvRGF0YSBpcyBub3QgYWNjZXNzaWJsZSBhZnRlciBwb3N0aW5nIHRvIHRoZSB3b3JrZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hZGFbY2hdID0gYXJyQWJCdWZbY2hdLmJ1ZmZlci5zbGljZSgwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyQWJCdWZDaCA9IGFyckFiQnVmW2NoXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRMZW4gPSBhcnJBYkJ1ZkNoLmJ1ZmZlci5ieXRlTGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkYVtjaF0gfHwgYWRhW2NoXS5ieXRlTGVuZ3RoICE9PSBhZExlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYVtjaF0gPSBuZXcgQXJyYXlCdWZmZXIoYWRMZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmQWRhQ2ggPSBuZXcgRmxvYXQzMkFycmF5KGFkYVtjaF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQWRhQ2guc2V0KGFyckFiQnVmW2NoXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0RhdGE6IGFkYSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhT2Zmc2V0OiBsZWZ0RnJhbWVQb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGw6IHJlbmRlclBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogbWUuZGF0YS53LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dzogdncsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoczogY2hzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aDogZnJhbWVMZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmdFNpemU6IHRoaXMuZGZ0U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHNkOiBtYXhQc2QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcmVuZGVyOiBub3JlbmRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlOiB0ZXJtaW5hdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGFkYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTb25hZ3JhbTogRXJyb3IgcmVhZGluZyBhdWRpbyBkYXRhOiBcIiArIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFkYVtjaF0gPSBuZXcgQXJyYXlCdWZmZXIoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGF0YTogYWRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGF0YU9mZnNldDogbGVmdEZyYW1lUG9zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGw6IHJlbmRlclBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBtZS5kYXRhLncsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaDogaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2dzogdncsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzOiBjaHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg6IGZyYW1lTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRmdFNpemU6IHRoaXMuZGZ0U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQc2Q6IG1heFBzZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3JlbmRlcjogbm9yZW5kZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlOiB0ZXJtaW5hdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyICYmIGF1ZGlvQnVmZmVyLmxlbmd0aCAqIGF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHMgPCBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50LkVOQUJMRV9TVFJFQU1JTkdfTlVNQkVSX09GX1NBTVBMRVNfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWRhID0gbmV3IEFycmF5PEFycmF5QnVmZmVyPihjaHMpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAvLyBOZWVkIGEgY29weSBoZXJlIGZvciB0aGUgd29ya2VyLCBvdGhlcndpc2UgdGhpcy5hdWRpb0RhdGEgaXMgbm90IGFjY2Vzc2libGUgYWZ0ZXIgcG9zdGluZyB0byB0aGUgd29ya2VyXHJcbiAgICAgICAgICAgICAgICAgIGFkYVtjaF0gPSBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShjaCkuYnVmZmVyLnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9sZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcmtlckNhbnZhcykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZyA9IHRoaXMubWFya2VyQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGcpIHtcclxuICAgICAgICAgICAgICAgICAgICBnLmZpbGxUZXh0KFwiUmVuZGVyaW5nLi4uXCIsIDEwLCAyMCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgIGF1ZGlvRGF0YTogYWRhLFxyXG4gICAgICAgICAgICAgICAgICBsOiBsZWZ0UG9zLFxyXG4gICAgICAgICAgICAgICAgICB3OiB3LFxyXG4gICAgICAgICAgICAgICAgICBoOiBoLFxyXG4gICAgICAgICAgICAgICAgICB2dzogTWF0aC5yb3VuZCh0aGlzLnZpcnR1YWxEaW1lbnNpb24ud2lkdGgpLFxyXG4gICAgICAgICAgICAgICAgICBjaHM6IGNocyxcclxuICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg6IGZyYW1lTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICBkZnRTaXplOiB0aGlzLmRmdFNpemUsXHJcbiAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSwgYWRhKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHcgPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzUGVyUGl4ZWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyclNpemUgPSB3ICogaCAqIDQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyclNpemUgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcnJTaXplID0gMFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpbWdEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGFyclNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBydyA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyQWJCdWYgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihjaHMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcnJBYkJ1ZltjaF0gPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuZGZ0U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdEZyYW1lUG9zID0gTWF0aC5mbG9vcihmcmFtZUxlbmd0aCAqIHJlbmRlclBvcyAvIHZ3KSAtIHRoaXMuZGZ0U2l6ZSAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lc1RvUmVhZCA9IHRoaXMuZGZ0U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdEZyYW1lUG9zIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGVmdEZyYW1lUG9zID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3U3RhdGVUZXh0KCdMb2FkaW5nL1JlbmRlcmluZy4uLicpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmFBc1N1YnNjID0gcmFBcy5mcmFtZXNPYnMobGVmdEZyYW1lUG9zLCBmcmFtZXNUb1JlYWQsIGFyckFiQnVmKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IChyZWFkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyckFiQnVmICYmIHRoaXMud29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZCA8IHRoaXMuZGZ0U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIHBhZGRpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHpwID0gcmVhZDsgenAgPCB0aGlzLmRmdFNpemU7IHpwKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyckFiQnVmW2NoXVt6cF0gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJBYkJ1ZkNoID0gYXJyQWJCdWZbY2hdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZExlbiA9IGFyckFiQnVmQ2guYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWRhW2NoXSB8fCBhZGFbY2hdLmJ5dGVMZW5ndGggIT09IGFkTGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhW2NoXSA9IG5ldyBBcnJheUJ1ZmZlcihhZExlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZBZGFDaCA9IG5ldyBGbG9hdDMyQXJyYXkoYWRhW2NoXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZBZGFDaC5zZXQoYXJyQWJCdWZbY2hdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGw6IHJlbmRlclBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogcncsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ3OiB2dyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzOiBjaHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoOiBmcmFtZUxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhOiBhZGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGF0YU9mZnNldDogbGVmdEZyYW1lUG9zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZnRTaXplOiB0aGlzLmRmdFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcmVuZGVyOiBub3JlbmRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlNvbmFncmFtOiBFcnJvciByZWFkaW5nIGF1ZGlvIGRhdGE6IFwiICsgZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5ib3VuZHMgJiYgdGhpcy5ib3VuZHMuZGltZW5zaW9uKSB7XHJcbiAgICAgICAgICBsZXQgdyA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLndpZHRoKTtcclxuICAgICAgICAgIGxldCBoID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24uaGVpZ2h0KTtcclxuICAgICAgICAgIGxldCBnID0gdGhpcy5zb25hZ3JhbUNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICBpZiAoZykge1xyXG4gICAgICAgICAgICBnLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkcmF3UmVuZGVyZWQodzpudW1iZXIsaDpudW1iZXIsaW1nRGF0YTpVaW50OENsYW1wZWRBcnJheSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNvbmFncmFtQ2FudmFzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc29uYWdyYW1DYW52YXMud2lkdGggPSB3O1xyXG4gICAgICAgICAgICB0aGlzLnNvbmFncmFtQ2FudmFzLmhlaWdodCA9IGg7XHJcbiAgICAgICAgICAgIGxldCBnID0gdGhpcy5zb25hZ3JhbUNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgIGlmIChnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodyA+IDAgJiYgaCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZ0ltZ0RhdGEgPSBnLmNyZWF0ZUltYWdlRGF0YSh3LCBoKTtcclxuICAgICAgICAgICAgICAgICAgICBnSW1nRGF0YS5kYXRhLnNldChpbWdEYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBnLnB1dEltYWdlRGF0YShnSW1nRGF0YSwgMCwgMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kcmF3QmcoKTtcclxuICAgICAgICB0aGlzLmRyYXdQbGF5UG9zaXRpb24oKTtcclxuICAgIH1cclxuXHJcbi8vICAgICAvLyBzeW5jaHJvbm91cyBkcmF3IChub3QgdXNlZCBhbnltb3JlKVxyXG4vLyAgIHJlZHJhdygpIHtcclxuLy9cclxuLy8gICAgIGxldCBnID0gdGhpcy5zb25hZ3JhbUNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbi8vXHJcbi8vICAgICBsZXQgdyA9IHRoaXMuc29uYWdyYW1DYW52YXMud2lkdGg7XHJcbi8vICAgICBsZXQgaCA9IHRoaXMuc29uYWdyYW1DYW52YXMuaGVpZ2h0O1xyXG4vLyAgICAgaWYgKGcpIHtcclxuLy8gICAgICAgZy5jbGVhclJlY3QoMCwgMCwgdywgaCk7XHJcbi8vICAgICAgIGcuZmlsbFN0eWxlID0gXCJ3aGl0ZVwiO1xyXG4vLyAgICAgICBnLmZpbGxSZWN0KDAsIDAsIHcsIGgpO1xyXG4vLyAgICAgICBpZiAodGhpcy5fYXVkaW9EYXRhSG9sZGVyKSB7XHJcbi8vICAgICAgICAgbGV0IHNwZWN0U2l6ZSA9IE1hdGguZmxvb3IodGhpcy5kZnRTaXplIC8gMilcclxuLy8gICAgICAgICBsZXQgY2hzID0gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLm51bWJlck9mQ2hhbm5lbHM7XHJcbi8vICAgICAgICAgbGV0IGNoSCA9IGggLyBjaHM7XHJcbi8vXHJcbi8vICAgICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLmZyYW1lTGVuO1xyXG4vL1xyXG4vLyAgICAgICAgIGxldCBmcmFtZXNQZXJQaXhlbCA9IGZyYW1lTGVuZ3RoIC8gdztcclxuLy8gICAgICAgICBsZXQgeSA9IDA7XHJcbi8vICAgICAgICAgbGV0IGF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyfG51bGw9bnVsbDtcclxuLy8gICAgICAgICBsZXQgYXVkaW9Tb3VyY2U9dGhpcy5fYXVkaW9EYXRhSG9sZGVyLmF1ZGlvU291cmNlO1xyXG4vLyAgICAgICAgIGlmKGF1ZGlvU291cmNlIGluc3RhbmNlb2YgQXVkaW9CdWZmZXJTb3VyY2Upe1xyXG4vLyAgICAgICAgICAgYXVkaW9CdWZmZXI9YXVkaW9Tb3VyY2UuYXVkaW9CdWZmZXI7XHJcbi8vICAgICAgICAgfVxyXG4vL1xyXG4vLyAgICAgICAgIGlmKGF1ZGlvQnVmZmVyKSB7XHJcbi8vICAgICAgICAgICBsZXQgYiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5kZnRTaXplKVxyXG4vL1xyXG4vLyAgICAgICAgICAgbGV0IHNvbmEgPSBuZXcgQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj4oY2hzKTtcclxuLy8gICAgICAgICAgIGxldCBtYXggPSAwO1xyXG4vLyAgICAgICAgICAgbGV0IG1heFBzZCA9IC1JbmZpbml0eTtcclxuLy8gICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuLy8gICAgICAgICAgICAgbGV0IHggPSAwO1xyXG4vLyAgICAgICAgICAgICBzb25hW2NoXSA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KHcpO1xyXG4vL1xyXG4vLyAgICAgICAgICAgICBsZXQgY2hEYXRhID0gYXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4vLyAgICAgICAgICAgICAvLyBUT0RPIGNlbnRlciBidWZmZXJcclxuLy9cclxuLy8gICAgICAgICAgICAgbGV0IGZyYW1lUG9zID0gMDtcclxuLy8gICAgICAgICAgICAgZm9yIChsZXQgcGlpID0gMDsgcGlpIDwgdzsgcGlpKyspIHtcclxuLy8gICAgICAgICAgICAgICBmcmFtZVBvcyA9IE1hdGgucm91bmQocGlpICogZnJhbWVzUGVyUGl4ZWwpO1xyXG4vLyAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBERlQgYXQgcGl4ZWwgcG9zaXRpb25cclxuLy8gICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGZ0U2l6ZTsgaSsrKSB7XHJcbi8vICAgICAgICAgICAgICAgICBsZXQgY2hEYXQgPSBjaERhdGFbZnJhbWVQb3MgKyBpXTtcclxuLy8gICAgICAgICAgICAgICAgIGJbaV0gPSBjaERhdDtcclxuLy8gICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgICAgbGV0IHNwZWN0ciA9IHRoaXMuZGZ0LnByb2Nlc3NSZWFsTWFnbml0dWRlKGIpO1xyXG4vLyAgICAgICAgICAgICAgIHNvbmFbY2hdW3BpaV0gPSBzcGVjdHI7XHJcbi8vICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4vLyAgICAgICAgICAgICAgIGxldCBwTWF4ID0gTWF0aC5tYXguYXBwbHkobnVsbCwgc3BlY3RyKTtcclxuLy8gICAgICAgICAgICAgICBpZiAocE1heCA+IG1heCkge1xyXG4vLyAgICAgICAgICAgICAgICAgbWF4ID0gcE1heDtcclxuLy8gICAgICAgICAgICAgICB9XHJcbi8vXHJcbi8vICAgICAgICAgICAgICAgZm9yIChsZXQgcyA9IDA7IHMgPCBzcGVjdFNpemU7IHMrKykge1xyXG4vLyAgICAgICAgICAgICAgICAgbGV0IHBzZCA9ICgyICogTWF0aC5wb3coc3BlY3RyW3NdLCAyKSkgLyBzcGVjdFNpemU7XHJcbi8vICAgICAgICAgICAgICAgICBpZiAocHNkID4gbWF4UHNkKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgIG1heFBzZCA9IHBzZDtcclxuLy8gICAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIC8vY29uc29sZS5sb2coXCJtYXg6IFwiLCBtYXgpO1xyXG4vLyAgICAgICAgICAgbWF4UHNkID0gKDIgKiBNYXRoLnBvdyhtYXgsIDIpKSAvIHNwZWN0U2l6ZTtcclxuLy8gICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuLy9cclxuLy8gICAgICAgICAgICAgbGV0IGZyYW1lUG9zID0gMDtcclxuLy8gICAgICAgICAgICAgZm9yIChsZXQgcGlpID0gMDsgcGlpIDwgdzsgcGlpKyspIHtcclxuLy8gICAgICAgICAgICAgICBmcmFtZVBvcyA9IHBpaSAqIGZyYW1lc1BlclBpeGVsO1xyXG4vL1xyXG4vLyAgICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaDsgeSsrKSB7XHJcbi8vICAgICAgICAgICAgICAgICBsZXQgZnJlcUlkeCA9IE1hdGgucm91bmQoeSAqIHNwZWN0U2l6ZSAvIGgpO1xyXG4vL1xyXG4vLyAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBvbmUgc2lkZWQgcG93ZXIgc3BlY3RyYWwgZGVuc2l0eSBQU0QgKGYsIHQpIGluIFBhMi9IelxyXG4vLyAgICAgICAgICAgICAgICAgLy8gUFNEKGYpIHByb3BvcnRpb25hbCB0byAyfFgoZil8MiAvICh0MiAtIHQxKVxyXG4vLyAgICAgICAgICAgICAgICAgbGV0IHZhbCA9IHNvbmFbY2hdW3BpaV1bZnJlcUlkeF07XHJcbi8vICAgICAgICAgICAgICAgICBsZXQgcHNkID0gKDIgKiBNYXRoLnBvdyh2YWwsIDIpKSAvIHNwZWN0U2l6ZTtcclxuLy9cclxuLy8gICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBsb2dhcml0aG1pY1xyXG4vLyAgICAgICAgICAgICAgICAgbGV0IHBzZExvZyA9IERTUFV0aWxzLnRvTGV2ZWxJbkRCKHBzZCAvIG1heFBzZCk7XHJcbi8vICAgICAgICAgICAgICAgICBsZXQgZHluUmFuZ2VJbkRiID0gNzA7XHJcbi8vICAgICAgICAgICAgICAgICBsZXQgc2NhbGVkVmFsID0gKHBzZExvZyArIGR5blJhbmdlSW5EYikgLyBkeW5SYW5nZUluRGI7XHJcbi8vXHJcbi8vICAgICAgICAgICAgICAgICBpZiAoc2NhbGVkVmFsID4gMSlcclxuLy8gICAgICAgICAgICAgICAgICAgc2NhbGVkVmFsID0gMTtcclxuLy8gICAgICAgICAgICAgICAgIGlmIChzY2FsZWRWYWwgPCAwKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgIHNjYWxlZFZhbCA9IDA7XHJcbi8vICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgICAgICBsZXQgcmdiVmFsID0gKDI1NSAqIHNjYWxlZFZhbCk7XHJcbi8vICAgICAgICAgICAgICAgICBpZiAocmdiVmFsIDwgMCkge1xyXG4vLyAvL1x0XHRcdFx0XHRcdFx0U3lzdGVtLm91dC5wcmludGxuKFwiTmVnIFJHQiB2YWw6IFwiK3JnYlZhbCk7XHJcbi8vICAgICAgICAgICAgICAgICAgIHJnYlZhbCA9IDA7XHJcbi8vICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgICAgICBpZiAocmdiVmFsID4gMjU1KSB7XHJcbi8vICAgICAgICAgICAgICAgICAgIHJnYlZhbCA9IDI1NTtcclxuLy8gICAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgICAgIHJnYlZhbCA9IDI1NSAtIHJnYlZhbDtcclxuLy8gICAgICAgICAgICAgICAgIGxldCBjb2xvclN0ciA9IENTU1V0aWxzLnRvQ29sb3JTdHJpbmcocmdiVmFsLCByZ2JWYWwsIHJnYlZhbCk7XHJcbi8vICAgICAgICAgICAgICAgICBnLmZpbGxTdHlsZSA9IGNvbG9yU3RyO1xyXG4vLyAgICAgICAgICAgICAgICAgZy5maWxsUmVjdChwaWksIGNoSCAtIHksIDEsIDEpO1xyXG4vLyAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgdGhpcy5kcmF3UGxheVBvc2l0aW9uKCk7XHJcbi8vICAgICAgICAgfWVsc2V7XHJcbi8vICAgICAgICAgICB0aHJvdyBFcnJvcihcIlJlZHJhdyBvbmx5IHN1cHBvcnRlZCB3aXRoIGF1ZGlvIGJ1ZmZlci5cIilcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICB9XHJcbi8vXHJcblxyXG4gICAgc2V0RGF0YShhdWRpb0RhdGE6IEF1ZGlvRGF0YUhvbGRlciB8IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9hdWRpb0RhdGFIb2xkZXIgPSBhdWRpb0RhdGE7XHJcbiAgICAgICAgdGhpcy5wbGF5RnJhbWVQb3NpdGlvbiA9IDA7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4iXX0=