@chocbite/ts-lib-form 1.1.0 → 1.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.
package/dist/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  import './style.css';
2
2
  import { AccessTypes, Base, define_element } from "@chocbite/ts-lib-base";
3
- import { IPAddress, IPVersion, get_cursor_position, set_cursor_end, set_cursor_position, set_selection_all, sleep, sync_resolve } from "@chocbite/ts-lib-common";
3
+ import { IPAddress, IPVersion, get_cursor_position, node_clone, set_cursor_end, set_cursor_position, set_selection_all, sleep, sync_resolve } from "@chocbite/ts-lib-common";
4
4
  import { err, none, ok, some } from "@chocbite/ts-lib-result";
5
5
  import { BLUE, GREEN, GREY, ORANGE, RED, YELLOW } from "@chocbite/ts-lib-colors";
6
6
  import { ANIMATION_LEVEL, ANIMATION_SPEED, AnimationLevels, theme_init_variable_root } from "@chocbite/ts-lib-theme";
7
- import { material_action_calendar_month_rounded, material_action_schedule_rounded, material_content_add_rounded, material_content_remove_rounded, material_editor_drag_handle_rounded, material_navigation_close_rounded, material_navigation_unfold_less_rounded, material_navigation_unfold_more_rounded } from "@chocbite/ts-lib-icons";
7
+ import { material_add_rounded, material_calendar_month_rounded, material_close_rounded, material_drag_handle_rounded, material_remove_rounded, material_schedule_rounded, material_unfold_less_rounded, material_unfold_more_rounded } from "@chocbite/ts-lib-icons";
8
8
  import { ListField } from "@chocbite/ts-lib-list";
9
9
  import { number_step_start_decimal } from "@chocbite/ts-lib-math";
10
10
  import state from "@chocbite/ts-lib-state";
@@ -40,16 +40,16 @@ colors_basic.make_variable("red", "Basic Red Color", "Commonly used red color in
40
40
  colors_basic.make_variable("blue", "Basic Blue Color", "Commonly used blue color in form elements", BLUE["300"], BLUE["900"], "Color", void 0);
41
41
  colors_basic.make_variable("yellow", "Basic Yellow Color", "Commonly used yellow color in form elements", YELLOW["300"], ORANGE["900"], "Color", void 0);
42
42
  const sizes = theme_root.make_sub_group("size", "Size", "Sizes used in all form elements");
43
- sizes.make_variable("height", "Height", "Default height used in all form elements", "1.6rem", "1.6rem", "Length", {
43
+ sizes.make_variable("height", "Height", "Default height used in all form elements", "1.3rem", "1.3rem", "Length", {
44
44
  min: .1,
45
45
  max: 10
46
46
  });
47
- sizes.make_variable("touchHeight", "Touch Height", "Minimum height for touch devices used in all form elements", "2.6rem", "2.6rem", "Length", {
47
+ sizes.make_variable("touchHeight", "Touch Height", "Minimum height for touch devices used in all form elements", "2.0rem", "2.0rem", "Length", {
48
48
  min: .1,
49
49
  max: 10
50
50
  });
51
51
  const font = theme_root.make_sub_group("font", "Font", "Font settings used in all form elements");
52
- font.make_variable("size", "Font Size", "Default font size used in all form elements", "1rem", "1rem", "Length", {
52
+ font.make_variable("size", "Font Size", "Default font size used in all form elements", "0.9rem", "0.9rem", "Length", {
53
53
  min: .1,
54
54
  max: 10
55
55
  });
@@ -76,6 +76,7 @@ var FormElement = class extends Base {
76
76
  static element_name_space() {
77
77
  return "form";
78
78
  }
79
+ static apply_options(_element, _options) {}
79
80
  };
80
81
  /**Shared class for all components with values*/
81
82
  var FormValue = class extends FormElement {
@@ -86,6 +87,7 @@ var FormValue = class extends FormElement {
86
87
  if (options.description) element.description = options.description;
87
88
  if (options.value_by_state) element.value_by_state = options.value_by_state;
88
89
  else if (options.value !== void 0) element.value = options.value;
90
+ super.apply_options(element, options);
89
91
  }
90
92
  form_id;
91
93
  constructor(id) {
@@ -331,6 +333,14 @@ var FormButton = class extends FormValueWrite {
331
333
  if (color === FormColors.None) this.removeAttribute("color");
332
334
  else this.setAttribute("color", color);
333
335
  }
336
+ /**Centers text and icon */
337
+ set center(center) {
338
+ if (center) this.classList.add("center");
339
+ else this.classList.remove("center");
340
+ }
341
+ get center() {
342
+ return this.classList.contains("center");
343
+ }
334
344
  /**Called when value is changed */
335
345
  new_value(value) {
336
346
  if (value) this.classList.add("active");
@@ -362,6 +372,7 @@ function form_button(options) {
362
372
  if (options.on_click) butt.on_click = options.on_click;
363
373
  if (options.toggle) butt.toggle = options.toggle;
364
374
  if (options.color) butt.color = options.color;
375
+ if (options.center) butt.center = options.center;
365
376
  FormValue.apply_options(butt, options);
366
377
  }
367
378
  return butt;
@@ -398,6 +409,14 @@ var FormLamp = class extends FormValue {
398
409
  this.#colors = colors;
399
410
  this.new_value(this.buffer);
400
411
  }
412
+ /**Centers text and icon */
413
+ set center(center) {
414
+ if (center) this.classList.add("center");
415
+ else this.classList.remove("center");
416
+ }
417
+ get center() {
418
+ return this.classList.contains("center");
419
+ }
401
420
  /**Called when value is changed */
402
421
  new_value(value) {
403
422
  const color = this.#colors[Number(value)];
@@ -420,6 +439,7 @@ function from(options) {
420
439
  lamp.colors = options.colors;
421
440
  if (options.text) lamp.text = options.text;
422
441
  if (options.icon) lamp.icon = options.icon;
442
+ if (options.center) lamp.center = options.center;
423
443
  FormValue.apply_options(lamp, options);
424
444
  }
425
445
  return lamp;
@@ -544,7 +564,7 @@ function form_switch(options) {
544
564
  return swit;
545
565
  }
546
566
  //#endregion
547
- //#region src/group/group.ts
567
+ //#region src/group/group_base.ts
548
568
  /**Different border styles for the component group*/
549
569
  const FormGroupBorderStyle = {
550
570
  None: "none",
@@ -552,109 +572,19 @@ const FormGroupBorderStyle = {
552
572
  Outset: "outset",
553
573
  Line: "line"
554
574
  };
555
- /**Component group class which allows to add elements and controls the flow of the elements*/
556
- var FormGroup = class extends FormValue {
575
+ var FormGroupBase = class extends FormValue {
557
576
  static element_name() {
558
- return "group";
577
+ return "@abstract@";
559
578
  }
560
579
  static element_name_space() {
561
580
  return "form";
562
581
  }
563
- #collapsible;
564
- #collapsed = false;
565
- #collapse_button;
566
- #value_elements = /* @__PURE__ */ new Map();
567
- set elements(elements) {
568
- for (let i = 0, n = elements.length; i < n; i++) {
569
- const comp = elements[i];
570
- if (comp instanceof FormValue && comp.form_id) {
571
- if (this.#value_elements.has(comp.form_id)) {
572
- console.error("Form element with form id " + comp.form_id + " already exists in group");
573
- continue;
574
- }
575
- this.#value_elements.set(comp.form_id, comp);
576
- }
577
- if (this.#collapsible) this.#collapsible.appendChild(comp);
578
- else this.appendChild(comp);
579
- }
580
- }
581
- get elements() {
582
- return [...this.#value_elements.values()];
583
- }
582
+ value_elements = /* @__PURE__ */ new Map();
584
583
  /**This places the group at an absolute position in one of the corners of the container*/
585
584
  set border(border) {
586
585
  this.classList.remove(FormGroupBorderStyle.Inset, FormGroupBorderStyle.Outset);
587
586
  if (border && border !== FormGroupBorderStyle.None) this.classList.add(border);
588
587
  }
589
- set collapsible(collapsible) {
590
- if (collapsible && !this.#collapsible) {
591
- this.#collapsible = document.createElement("div");
592
- if (this.children.length > 1) this.#collapsible.replaceChildren(...this.children);
593
- this.appendChild(this.#collapsible);
594
- this.classList.add("collapsible");
595
- this.appendChild(this.#collapse_button || (this.collapse_text = "") || this.#collapse_button);
596
- this.collapsed = true;
597
- } else if (!collapsible && this.#collapsible) {
598
- this.collapsed = false;
599
- this.replaceChildren(...this.#collapsible.children);
600
- this.#collapsible = void 0;
601
- this.classList.remove("collapsible");
602
- }
603
- }
604
- get collapsible() {
605
- return this.#collapsible !== void 0;
606
- }
607
- set collapsed(collapsed) {
608
- if (this.#collapsible) {
609
- if (collapsed && !this.#collapsed) if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
610
- this.#collapsible.style.overflowY = "hidden";
611
- const full_height = this.#collapsible.getBoundingClientRect().height + "px";
612
- const animation = this.#collapsible.animate([{ height: full_height }, { height: "0" }], {
613
- duration: ANIMATION_SPEED.get().value,
614
- easing: "ease-in"
615
- });
616
- animation.onfinish = () => {
617
- this.classList.add("collapsed");
618
- if (this.#collapsible) this.#collapsible.style.overflowY = "";
619
- };
620
- } else this.classList.add("collapsed");
621
- else if (!collapsed && this.#collapsed) {
622
- this.classList.remove("collapsed");
623
- if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
624
- this.#collapsible.style.overflowY = "hidden";
625
- const full_height = this.#collapsible.getBoundingClientRect().height + "px";
626
- const animation = this.#collapsible.animate([{ height: "0" }, { height: full_height }], {
627
- duration: ANIMATION_SPEED.get().value,
628
- easing: "ease-out"
629
- });
630
- animation.onfinish = () => {
631
- if (this.#collapsible) this.#collapsible.style.overflowY = "";
632
- };
633
- }
634
- }
635
- this.#collapsed = collapsed;
636
- }
637
- }
638
- get collapsed() {
639
- return this.#collapsed;
640
- }
641
- set collapse_text(text) {
642
- if (!this.#collapse_button) {
643
- this.#collapse_button = document.createElement("span");
644
- this.#collapse_button.tabIndex = 0;
645
- this.#collapse_button.appendChild(document.createElement("span"));
646
- this.#collapse_button.appendChild(material_navigation_unfold_less_rounded());
647
- this.#collapse_button.appendChild(material_navigation_unfold_more_rounded());
648
- this.#collapse_button.onclick = () => this.collapsed = !this.collapsed;
649
- this.#collapse_button.onkeydown = (e) => {
650
- if (e.key === "Enter" || e.key === " ") {
651
- e.preventDefault();
652
- this.collapsed = !this.collapsed;
653
- }
654
- };
655
- }
656
- this.#collapse_button.firstChild.textContent = text;
657
- }
658
588
  set max_height(height) {
659
589
  this.style.setProperty("--max_height", height ? height + "rem" : "none");
660
590
  if (height) this.classList.add("max_height");
@@ -671,7 +601,7 @@ var FormGroup = class extends FormValue {
671
601
  get value() {
672
602
  if (this._state) return err("State based component");
673
603
  const result = {};
674
- for (const [key, comp] of this.#value_elements) {
604
+ for (const [key, comp] of this.value_elements) {
675
605
  const val = comp.value;
676
606
  if (val.err) return err("Component with id " + key + " has no value");
677
607
  result[key] = val.value;
@@ -679,10 +609,10 @@ var FormGroup = class extends FormValue {
679
609
  return ok(result);
680
610
  }
681
611
  new_value(val) {
682
- for (const key in val) if (this.#value_elements.has(key)) this.#value_elements.get(key).value = val[key];
612
+ for (const key in val) if (this.value_elements.has(key)) this.value_elements.get(key).value = val[key];
683
613
  }
684
614
  clear_value() {
685
- for (const comp of this.#value_elements.values()) comp.clear();
615
+ for (const comp of this.value_elements.values()) comp.clear();
686
616
  }
687
617
  new_error(err) {
688
618
  console.error(err);
@@ -704,23 +634,173 @@ var FormGroup = class extends FormValue {
704
634
  }
705
635
  }
706
636
  };
637
+ //#endregion
638
+ //#region src/group/group.ts
639
+ /**Component group class which allows to add elements and controls the flow of the elements*/
640
+ var FormGroup = class extends FormGroupBase {
641
+ static element_name() {
642
+ return "group";
643
+ }
644
+ static element_name_space() {
645
+ return "form";
646
+ }
647
+ constructor(id) {
648
+ super(id);
649
+ this.classList.add("flex-col");
650
+ }
651
+ set column(column) {
652
+ this.classList.remove("grid-row", "grid-col", "flex-row", "flex-col");
653
+ if (column === true) this.classList.add("flex-col");
654
+ else {
655
+ this.classList.add("grid-col");
656
+ if (typeof column === "string") this.style.gridTemplateColumns = "repeat(auto-fit, minmax(" + column + ", 1fr))";
657
+ else this.style.gridTemplateColumns = column.map((col) => "minmax(" + col + ", 1fr)").join(" ");
658
+ }
659
+ }
660
+ set row(row) {
661
+ this.classList.remove("grid-row", "grid-col", "flex-row", "flex-col");
662
+ if (row === true) this.classList.add("flex-row");
663
+ else {
664
+ this.classList.add("grid-row");
665
+ if (typeof row === "string") this.style.gridTemplateRows = "repeat(auto-fit, minmax(" + row + ", 1fr))";
666
+ else this.style.gridTemplateRows = row.map((col) => "minmax(" + col + ", 1fr)").join(" ");
667
+ }
668
+ }
669
+ set elements(elements) {
670
+ for (let i = 0, n = elements.length; i < n; i++) {
671
+ const comp = elements[i];
672
+ if (comp instanceof FormValue && comp.form_id) {
673
+ if (this.value_elements.has(comp.form_id)) {
674
+ console.error("Form element with form id " + comp.form_id + " already exists in group");
675
+ continue;
676
+ }
677
+ this.value_elements.set(comp.form_id, comp);
678
+ }
679
+ this.appendChild(comp);
680
+ }
681
+ }
682
+ get elements() {
683
+ return [...this.value_elements.values()];
684
+ }
685
+ };
707
686
  define_element(FormGroup);
708
- /**Creates a dropdown form element */
709
- function form_group(options) {
687
+ /**Creates a form group with elements in a column */
688
+ function form_group_col(options) {
710
689
  const slide = new FormGroup(options?.id);
711
690
  if (options) {
712
691
  if (options.border) slide.border = options.border;
713
692
  if (options.elements) slide.elements = options.elements;
714
- if (options.collapse_text) slide.collapse_text = options.collapse_text;
715
- if (options.collapsible) slide.collapsible = options.collapsible;
716
- if (options.collapsed) slide.collapsed = options.collapsed;
717
693
  if (options.max_height) slide.max_height = options.max_height;
718
694
  if (options.embed) slide.embed = options.embed;
695
+ if (options.column) slide.column = options.column;
696
+ else if (options.row) slide.row = options.row;
719
697
  FormValue.apply_options(slide, options);
720
698
  }
721
699
  return slide;
722
700
  }
723
701
  //#endregion
702
+ //#region src/group/group_collapser.ts
703
+ const open_text = document.createElement("span");
704
+ open_text.textContent = "Collapse";
705
+ const close_text = document.createElement("span");
706
+ close_text.textContent = "Expand";
707
+ /**Component group class which allows to add elements and controls the flow of the elements*/
708
+ var FormGroupCollapser = class extends FormElement {
709
+ static element_name() {
710
+ return "group-collapser";
711
+ }
712
+ static element_name_space() {
713
+ return "form";
714
+ }
715
+ #group;
716
+ #collapse_button;
717
+ #collapsed = false;
718
+ #open_text = node_clone(open_text);
719
+ #close_text = node_clone(close_text);
720
+ constructor(group, collapsed) {
721
+ super();
722
+ this.#group = this.appendChild(group);
723
+ if (collapsed) {
724
+ this.classList.add("collapsed");
725
+ this.#collapsed = true;
726
+ }
727
+ this.#collapse_button = this.appendChild(document.createElement("span"));
728
+ this.#collapse_button.tabIndex = 0;
729
+ this.#collapse_button.appendChild(collapsed ? this.#close_text : this.#open_text);
730
+ this.#collapse_button.appendChild(material_unfold_less_rounded());
731
+ this.#collapse_button.onclick = () => this.collapsed = !this.collapsed;
732
+ this.#collapse_button.onkeydown = (e) => {
733
+ if (e.key === "Enter" || e.key === " ") {
734
+ e.preventDefault();
735
+ this.collapsed = !this.collapsed;
736
+ }
737
+ };
738
+ }
739
+ set group(group) {
740
+ const old_group = this.#group;
741
+ this.#group = this.replaceChild(group, old_group);
742
+ }
743
+ get group() {
744
+ return this.#group;
745
+ }
746
+ set collapsed(collapsed) {
747
+ if (collapsed && !this.#collapsed) {
748
+ this.#collapse_button.replaceChildren(this.#close_text, material_unfold_more_rounded());
749
+ if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
750
+ this.#group.style.overflowY = "auto";
751
+ const full_height = this.#group.getBoundingClientRect().height + "px";
752
+ const animation = this.#group.animate([{ maxHeight: full_height }, {
753
+ maxHeight: "0px",
754
+ paddingBlock: "0px"
755
+ }], {
756
+ duration: ANIMATION_SPEED.get().value,
757
+ easing: "ease-in-out"
758
+ });
759
+ animation.onfinish = async () => {
760
+ this.classList.add("collapsed");
761
+ this.#group.style.overflowY = "";
762
+ };
763
+ } else this.classList.add("collapsed");
764
+ } else if (!collapsed && this.#collapsed) {
765
+ this.classList.remove("collapsed");
766
+ this.#collapse_button.replaceChildren(this.#open_text, material_unfold_less_rounded());
767
+ if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
768
+ this.#group.style.overflowY = "auto";
769
+ const full_height = this.#group.getBoundingClientRect().height + "px";
770
+ const animation = this.#group.animate([{
771
+ maxHeight: "0px",
772
+ paddingBlock: "0px"
773
+ }, { maxHeight: full_height }], {
774
+ duration: ANIMATION_SPEED.get().value,
775
+ easing: "ease-in-out"
776
+ });
777
+ animation.onfinish = () => this.#group.style.overflowY = "";
778
+ }
779
+ }
780
+ this.#collapsed = collapsed;
781
+ }
782
+ get collapsed() {
783
+ return this.#collapsed;
784
+ }
785
+ set open_text(text) {
786
+ this.#open_text.textContent = text;
787
+ }
788
+ set close_text(text) {
789
+ this.#close_text.textContent = text;
790
+ }
791
+ };
792
+ define_element(FormGroupCollapser);
793
+ /**Creates a dropdown form element */
794
+ function form_group_collapser(group, options) {
795
+ const slide = new FormGroupCollapser(group, options?.collapsed);
796
+ if (options) {
797
+ if (options.open_text) slide.open_text = options.open_text;
798
+ if (options.close_text) slide.close_text = options.close_text;
799
+ FormElement.apply_options(slide, options);
800
+ }
801
+ return slide;
802
+ }
803
+ //#endregion
724
804
  //#region src/list/list_field.ts
725
805
  var ListFormField = class extends ListField {
726
806
  static element_name() {
@@ -770,7 +850,7 @@ var FormNumberWrite = class extends FormValueWrite {
770
850
  }
771
851
  };
772
852
  //#endregion
773
- //#region src/number/numberInput/number_input.ts
853
+ //#region src/number/number_input/number_input.ts
774
854
  /**Slide Selector, displays all options in a slider*/
775
855
  var NumberInput = class extends FormNumberWrite {
776
856
  static element_name() {
@@ -863,14 +943,14 @@ var NumberInput = class extends FormNumberWrite {
863
943
  this.#update_min_legend();
864
944
  }
865
945
  #update_min_legend() {
866
- this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min: " + this.#min.toFixed(this.#decimals) + this.#unit;
946
+ this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min:" + this.#min.toFixed(this.#decimals);
867
947
  }
868
948
  set max(max) {
869
949
  this.#max = max ?? Infinity;
870
950
  this.#update_max_lengend();
871
951
  }
872
952
  #update_max_lengend() {
873
- this.#max_legend.textContent = this.#max === Infinity ? "" : "Max: " + this.#max.toFixed(this.#decimals) + this.#unit;
953
+ this.#max_legend.textContent = this.#max === Infinity ? "" : "Max:" + this.#max.toFixed(this.#decimals);
874
954
  }
875
955
  set step(step) {
876
956
  this.#step = step || 0;
@@ -1000,12 +1080,12 @@ var FormSlider = class extends FormNumberWrite {
1000
1080
  #step = 0;
1001
1081
  #start = 0;
1002
1082
  #live = false;
1003
- #icon_dec = this.#stepper_func(this.appendChild(material_content_remove_rounded()), false);
1083
+ #icon_dec = this.#stepper_func(this.appendChild(material_remove_rounded()), false);
1004
1084
  #slide = this.appendChild(document.createElement("div"));
1005
1085
  #legend = this.appendChild(document.createElement("span"));
1006
1086
  #left_legend = this.#legend.appendChild(document.createElement("span"));
1007
1087
  #right_legend = this.#legend.appendChild(document.createElement("span"));
1008
- #icon_inc = this.#stepper_func(this.appendChild(material_content_add_rounded()), true);
1088
+ #icon_inc = this.#stepper_func(this.appendChild(material_add_rounded()), true);
1009
1089
  #slider = this.#slide.appendChild(document.createElement("div"));
1010
1090
  #value_box = this.#slider.appendChild(document.createElement("span"));
1011
1091
  #unit_box = this.#slider.appendChild(document.createElement("span"));
@@ -1111,7 +1191,7 @@ var FormSlider = class extends FormNumberWrite {
1111
1191
  this.#update_min_legend();
1112
1192
  }
1113
1193
  #update_min_legend() {
1114
- this.#left_legend.textContent = this.#min === -Infinity ? "" : "Min: " + this.#min.toFixed(this.#decimals) + this.#unit;
1194
+ this.#left_legend.textContent = this.#min === -Infinity ? "" : "Min:" + this.#min.toFixed(this.#decimals);
1115
1195
  }
1116
1196
  set max(max) {
1117
1197
  this.#max = max ?? Infinity;
@@ -1119,7 +1199,7 @@ var FormSlider = class extends FormNumberWrite {
1119
1199
  this.#update_max_legend();
1120
1200
  }
1121
1201
  #update_max_legend() {
1122
- this.#right_legend.textContent = this.#max === Infinity ? "" : this.#max.toFixed(this.#decimals) + this.#unit + " :Max";
1202
+ this.#right_legend.textContent = this.#max === Infinity ? "" : this.#max.toFixed(this.#decimals) + ":Max";
1123
1203
  }
1124
1204
  #update_min_max() {
1125
1205
  this.#span = this.#max - this.#min;
@@ -1142,10 +1222,10 @@ var FormSlider = class extends FormNumberWrite {
1142
1222
  this.#live = live || false;
1143
1223
  }
1144
1224
  set icon_decrease(icon) {
1145
- this.replaceChild(this.#icon_dec, this.#stepper_func(icon ? icon() : material_content_remove_rounded(), false));
1225
+ this.replaceChild(this.#icon_dec, this.#stepper_func(icon ? icon() : material_remove_rounded(), false));
1146
1226
  }
1147
1227
  set icon_increase(icon) {
1148
- this.replaceChild(this.#icon_inc, this.#stepper_func(icon ? icon() : material_content_add_rounded(), true));
1228
+ this.replaceChild(this.#icon_inc, this.#stepper_func(icon ? icon() : material_add_rounded(), true));
1149
1229
  }
1150
1230
  new_value(value) {
1151
1231
  this.#move_value(value);
@@ -1266,9 +1346,9 @@ var FormStepper = class extends FormNumberWrite {
1266
1346
  #step = 0;
1267
1347
  #start = 0;
1268
1348
  #live = false;
1269
- #icon_dec = this.#stepper_func(this.appendChild(material_content_remove_rounded()), false);
1349
+ #icon_dec = this.#stepper_func(this.appendChild(material_remove_rounded()), false);
1270
1350
  #text = this.appendChild(document.createElement("span"));
1271
- #icon_inc = this.#stepper_func(this.appendChild(material_content_add_rounded()), true);
1351
+ #icon_inc = this.#stepper_func(this.appendChild(material_add_rounded()), true);
1272
1352
  #value_box = this.#text.appendChild(document.createElement("span"));
1273
1353
  #unit_box = this.#text.appendChild(document.createElement("span"));
1274
1354
  #legend = this.#text.appendChild(document.createElement("span"));
@@ -1379,14 +1459,14 @@ var FormStepper = class extends FormNumberWrite {
1379
1459
  this.#update_min_legend();
1380
1460
  }
1381
1461
  #update_min_legend() {
1382
- this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min: " + this.#min.toFixed(this.#decimals) + this.#unit;
1462
+ this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min:" + this.#min.toFixed(this.#decimals);
1383
1463
  }
1384
1464
  set max(max) {
1385
1465
  this.#max = max ?? Infinity;
1386
1466
  this.#update_max_lengend();
1387
1467
  }
1388
1468
  #update_max_lengend() {
1389
- this.#max_legend.textContent = this.#max === Infinity ? "" : "Max: " + this.#max.toFixed(this.#decimals) + this.#unit;
1469
+ this.#max_legend.textContent = this.#max === Infinity ? "" : "Max:" + this.#max.toFixed(this.#decimals);
1390
1470
  }
1391
1471
  set step(step) {
1392
1472
  this.#step = step || 0;
@@ -1399,10 +1479,10 @@ var FormStepper = class extends FormNumberWrite {
1399
1479
  this.#live = live || false;
1400
1480
  }
1401
1481
  set icon_decrease(icon) {
1402
- this.replaceChild(this.#icon_dec, this.#stepper_func(icon ? icon() : material_content_remove_rounded(), false));
1482
+ this.replaceChild(this.#icon_dec, this.#stepper_func(icon ? icon() : material_remove_rounded(), false));
1403
1483
  }
1404
1484
  set icon_increase(icon) {
1405
- this.replaceChild(this.#icon_inc, this.#stepper_func(icon ? icon() : material_content_add_rounded(), true));
1485
+ this.replaceChild(this.#icon_inc, this.#stepper_func(icon ? icon() : material_add_rounded(), true));
1406
1486
  }
1407
1487
  new_value(value) {
1408
1488
  this.#move_value(value);
@@ -1528,7 +1608,7 @@ var FormDropdown = class extends FormSelectorBase {
1528
1608
  #selected = -1;
1529
1609
  #icon;
1530
1610
  #text = this.appendChild(document.createElement("div"));
1531
- #open = this.appendChild(material_navigation_unfold_more_rounded());
1611
+ #open = this.appendChild(material_unfold_more_rounded());
1532
1612
  #default = document.createTextNode("Select something");
1533
1613
  #default_icon;
1534
1614
  is_open = false;
@@ -1592,10 +1672,14 @@ var FormDropdown = class extends FormSelectorBase {
1592
1672
  }
1593
1673
  set open(open) {
1594
1674
  if (open && !this.is_open) {
1595
- this.#open.replaceChildren(material_navigation_unfold_less_rounded());
1675
+ const old = this.#open;
1676
+ this.#open = material_unfold_less_rounded();
1677
+ old.replaceWith(this.#open);
1596
1678
  box.open_menu(this.#map, this, this.buffer);
1597
1679
  } else if (!open && this.is_open) {
1598
- this.#open.replaceChildren(material_navigation_unfold_more_rounded());
1680
+ const old = this.#open;
1681
+ this.#open = material_unfold_more_rounded();
1682
+ old.replaceWith(this.#open);
1599
1683
  box.close_menu();
1600
1684
  }
1601
1685
  this.is_open = open;
@@ -1691,7 +1775,7 @@ var DropDownBox = class extends Base {
1691
1775
  e.stopPropagation();
1692
1776
  e.preventDefault();
1693
1777
  };
1694
- this.#closer.appendChild(document.createElement("div")).appendChild(material_navigation_close_rounded());
1778
+ this.#closer.appendChild(document.createElement("div")).appendChild(material_close_rounded());
1695
1779
  this.#closer.appendChild(document.createElement("div")).innerHTML = "Close";
1696
1780
  this.#closer.tabIndex = 0;
1697
1781
  this.#closer.onclick = (e) => {
@@ -1769,6 +1853,7 @@ var DropDownBox = class extends Base {
1769
1853
  close_menu() {
1770
1854
  if (!this.#is_open) return;
1771
1855
  this.#is_open = false;
1856
+ if (this.#dropdown) this.#dropdown.open = false;
1772
1857
  this.classList.remove("open");
1773
1858
  this.#table.replaceChildren();
1774
1859
  if (this.#dropdown) {
@@ -1977,8 +2062,8 @@ var FormDateTimeInput = class extends FormValueWrite {
1977
2062
  this.warn_input.lang = "da-DK";
1978
2063
  this.warn_input.step = "0.1";
1979
2064
  this.appendChild(this.warn_input);
1980
- this.appendChild(material_action_calendar_month_rounded()).onclick = () => this.warn_input.showPicker();
1981
- this.appendChild(material_action_schedule_rounded()).onclick = () => this.warn_input.showPicker();
2065
+ this.appendChild(material_calendar_month_rounded()).onclick = () => this.warn_input.showPicker();
2066
+ this.appendChild(material_schedule_rounded()).onclick = () => this.warn_input.showPicker();
1982
2067
  this.warn_input.onchange = () => {
1983
2068
  if (this.warn_input.value) {
1984
2069
  if (this.#mode === DateTimeMode.DATE) this.set_value_check(new Date(this.warn_input.valueAsNumber));
@@ -2321,7 +2406,7 @@ function form_text_input(options) {
2321
2406
  return input;
2322
2407
  }
2323
2408
  //#endregion
2324
- //#region src/text/multiLine/text_multi_line.ts
2409
+ //#region src/text/multi_line/text_multi_line.ts
2325
2410
  var FormTextMultiline = class extends FormValueWrite {
2326
2411
  static element_name() {
2327
2412
  return "textmultiline";
@@ -2337,7 +2422,7 @@ var FormTextMultiline = class extends FormValueWrite {
2337
2422
  constructor(id) {
2338
2423
  super(id);
2339
2424
  this.appendChild(this.warn_input);
2340
- this.#resizer.appendChild(material_editor_drag_handle_rounded());
2425
+ this.#resizer.appendChild(material_drag_handle_rounded());
2341
2426
  this.#resizer.onpointerdown = (e) => {
2342
2427
  e.preventDefault();
2343
2428
  const height = this.#value_box.getBoundingClientRect().height;
@@ -2479,7 +2564,8 @@ var FormText = class extends FormElement {
2479
2564
  }
2480
2565
  /**Sets the current text of the element*/
2481
2566
  set size(size) {
2482
- this.style.fontSize = `${size}rem`;
2567
+ this.style.fontSize = size + "rem";
2568
+ this.style.lineHeight = size + "rem";
2483
2569
  }
2484
2570
  };
2485
2571
  define_element(FormText);
@@ -2495,7 +2581,8 @@ const form = {
2495
2581
  button: form_button,
2496
2582
  switch: form_switch,
2497
2583
  lamp: form_lamp,
2498
- group: form_group,
2584
+ group_col: form_group_col,
2585
+ group_collapser: form_group_collapser,
2499
2586
  color_input: form_color_input,
2500
2587
  date_time_input: form_date_time_input,
2501
2588
  FormDateTimeType,
@@ -2516,4 +2603,4 @@ const form = {
2516
2603
  //#endregion
2517
2604
  export { FormColors, FormDateTimeType, form as default, form };
2518
2605
 
2519
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiI2Z1bmMiLCIjZXJyb3IiLCIjY2hhbmdlIiwiI2NoYW5nZWQiLCIjd2Fybl90aW1lb3V0IiwiI3NldF92YWx1ZSIsIiNvbl9jbGljayIsIiN0b2dnbGUiLCIjdGV4dCIsIiNpY29uIiwiI3RleHQiLCIjaWNvbiIsIiNjb2xvcnMiLCIjc3dpdGNoIiwiI3ByZXZlbnRfY2xpY2siLCIjaWNvbiIsIiN2YWx1ZV9lbGVtZW50cyIsIiNjb2xsYXBzaWJsZSIsIiNjb2xsYXBzZV9idXR0b24iLCIjY29sbGFwc2VkIiwiI2xlZ2VuZCIsIiN2YWx1ZV9ib3giLCIjc2VsZWN0ZWQiLCIjc2V0IiwiI3N0ZXBfdmFsdWUiLCIjZGVjaW1hbHMiLCIjbWluIiwiI21heCIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heF9sZWdlbmQiLCIjc3RlcCIsIiNzdGFydCIsIiNtaW4iLCIjc3BhbiIsIiNtYXgiLCIjZGVjaW1hbHMiLCIjdW5pdCIsIiNiYXIiLCIjdmFsIiwiI3N0ZXBwZXJfZnVuYyIsIiNsZWdlbmQiLCIjc2xpZGUiLCIjc2xpZGVyIiwiI21pbiIsIiNtYXgiLCIjbGl2ZSIsIiNtb3ZlX3ZhbHVlIiwiI3hfdG9fcGVyYyIsIiNtb3ZlX3NsaWRlIiwiI3N0ZXAiLCIjbW92ZV9hYnNvbHV0ZSIsIiNzdGVwX3ZhbHVlIiwiI3VuaXQiLCIjdW5pdF9ib3giLCIjdXBkYXRlX21pbl9sZWdlbmQiLCIjdXBkYXRlX21heF9sZWdlbmQiLCIjdXBkYXRlX21pbl9tYXgiLCIjbGVmdF9sZWdlbmQiLCIjZGVjaW1hbHMiLCIjcmlnaHRfbGVnZW5kIiwiI3NwYW4iLCIjc3RhcnQiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjdmFsdWVfYm94IiwiI3BlcmNfdG9fdmFsdWUiLCIjc3RlcHBlcl9mdW5jIiwiI3RleHQiLCIjbGVnZW5kIiwiI3ZhbHVlX2JveCIsIiNtb3ZlX2RpZmYiLCIjc3RlcCIsIiNzdGVwX3ZhbHVlIiwiI2RlY2ltYWxzIiwiI21pbiIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heCIsIiNtYXhfbGVnZW5kIiwiI3N0YXJ0IiwiI2xpdmUiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjbW92ZV92YWx1ZSIsIiN0ZXh0IiwiI2RlZmF1bHQiLCIjc2VsZWN0X2FkamFjZW50IiwiI2RlZmF1bHRfaWNvbiIsIiNzZWxlY3RlZCIsIiNzZXRfaWNvbiIsIiNtYXAiLCIjdmFsdWVzIiwiI29wZW4iLCIjaWNvbiIsIiNjbGVhciIsIiNjb250YWluZXIiLCIjc2Nyb2xsIiwiI3RhYmxlIiwiI2Nsb3NlciIsIiNmb2N1c19vdXRfaGFuZGxlciIsIiNkcm9wZG93biIsIiNzZXRfdmFsdWUiLCIjd2luZG93X3Jlc2l6ZV9oYW5kbGVyIiwiI2lzX29wZW4iLCIjbWFwIiwiI3ZhbHVlcyIsIiNzZWxlY3RlZCIsIiNhZGRfc2VsZWN0aW9uIiwiI3NlbGVjdF9hZGphY2VudCIsIiNsaXZlIiwiI21vZGUiLCIjdHlwZSIsIiN0eXBlIiwiI3BhcnRzIiwiI2ZpbHRlciIsIiNzZXQiLCIjZmlsdGVyIiwiI21heF9sZW5ndGgiLCIjbWF4X2J5dGVzIiwiI3Jlc2l6ZXIiLCIjdmFsdWVfYm94IiwiI3NldCIsIiNmaWx0ZXIiLCIjbWF4X2xlbmd0aCIsIiNtYXhfYnl0ZXMiXSwic291cmNlcyI6WyIuLi9zcmMvc2hhcmVkLnRzIiwiLi4vc3JjL2Jhc2UudHMiLCIuLi9zcmMvYm9vbGVhbi9idXR0b24vYnV0dG9uLnRzIiwiLi4vc3JjL2Jvb2xlYW4vbGFtcC9sYW1wLnRzIiwiLi4vc3JjL2Jvb2xlYW4vc3dpdGNoL3N3aXRjaC50cyIsIi4uL3NyYy9ncm91cC9ncm91cC50cyIsIi4uL3NyYy9saXN0L2xpc3RfZmllbGQudHMiLCIuLi9zcmMvbnVtYmVyL251bWJlcl9iYXNlLnRzIiwiLi4vc3JjL251bWJlci9udW1iZXJJbnB1dC9udW1iZXJfaW5wdXQudHMiLCIuLi9zcmMvbnVtYmVyL3Byb2dyZXNzL3Byb2dyZXNzLnRzIiwiLi4vc3JjL251bWJlci9zbGlkZXIvc2xpZGVyLnRzIiwiLi4vc3JjL251bWJlci9zdGVwcGVyL3N0ZXBwZXIudHMiLCIuLi9zcmMvc2VsZWN0b3JzL3NlbGVjdG9yX2Jhc2UudHMiLCIuLi9zcmMvc2VsZWN0b3JzL2Ryb3BfZG93bi9kcm9wX2Rvd24udHMiLCIuLi9zcmMvc2VsZWN0b3JzL3RvZ2dsZV9idXR0b24vdG9nZ2xlX2J1dHRvbi50cyIsIi4uL3NyYy9zcGFjaW5nL3NwYWNlci50cyIsIi4uL3NyYy9zcGVjaWFsL2NvbG9yL2NvbG9yX2lucHV0LnRzIiwiLi4vc3JjL3NwZWNpYWwvZGF0ZV90aW1lL2RhdGVfdGltZV9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL2lwL2lwX2lucHV0LnRzIiwiLi4vc3JjL3NwZWNpYWwvcGFzc3dvcmQvcGFzc3dvcmRfaW5wdXQudHMiLCIuLi9zcmMvdGV4dC9pbnB1dC90ZXh0X2lucHV0LnRzIiwiLi4vc3JjL3RleHQvbXVsdGlMaW5lL3RleHRfbXVsdGlfbGluZS50cyIsIi4uL3NyYy90ZXh0L3RleHQvdGV4dC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCTFVFLFxuICBHUkVFTixcbiAgR1JFWSxcbiAgT1JBTkdFLFxuICBSRUQsXG4gIFlFTExPVyxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29sb3JzXCI7XG5pbXBvcnQgeyB0aGVtZV9pbml0X3ZhcmlhYmxlX3Jvb3QgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi10aGVtZVwiO1xuXG5jb25zdCB0aGVtZV9yb290ID0gdGhlbWVfaW5pdF92YXJpYWJsZV9yb290KFxuICBcImZvcm1cIixcbiAgXCJVSSBGb3JtIEVsZW1lbnRzXCIsXG4gIFwiVGhlbWUgdmFyaWFibGVzIGZvciBVSSBmb3JtIEVsZW1lbnRzXCIsXG4pO1xuXG4vLyAgICAgIF9fX19fICBfX19fX18gICAgICAgICAgX19fX18gICAgIF9fX18gIF8gICBfIF8gIF9fICAgICBfX1xuLy8gICAgIHwgIF9fIFxcfCAgX19fX3wgICAvXFwgICB8ICBfXyBcXCAgIC8gX18gXFx8IFxcIHwgfCB8IFxcIFxcICAgLyAvXG4vLyAgICAgfCB8X18pIHwgfF9fICAgICAvICBcXCAgfCB8ICB8IHwgfCB8ICB8IHwgIFxcfCB8IHwgIFxcIFxcXy8gL1xuLy8gICAgIHwgIF8gIC98ICBfX3wgICAvIC9cXCBcXCB8IHwgIHwgfCB8IHwgIHwgfCAuIGAgfCB8ICAgXFwgICAvXG4vLyAgICAgfCB8IFxcIFxcfCB8X19fXyAvIF9fX18gXFx8IHxfX3wgfCB8IHxfX3wgfCB8XFwgIHwgfF9fX198IHxcbi8vICAgICB8X3wgIFxcX1xcX19fX19fL18vICAgIFxcX1xcX19fX18vICAgXFxfX19fL3xffCBcXF98X19fX19ffF98XG5jb25zdCByZWFkX29ubHkgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcInJlYWRcIixcbiAgXCJSZWFkIE9ubHlcIixcbiAgXCJTZXR0aW5ncyBmb3IgZm9ybSBlbGVtZW50cyBpbiByZWFkIG9ubHkgbW9kZVwiLFxuKTtcbnJlYWRfb25seS5tYWtlX3ZhcmlhYmxlKFxuICBcImZpbHRlclwiLFxuICBcIlJlYWQgT25seSBGaWx0ZXJcIixcbiAgXCJGaWx0ZXIgYXBwbGllZCB0byBmb3JtIGVsZW1lbnRzIGluIHJlYWQgb25seSBtb2RlXCIsXG4gIFwib3BhY2l0eSgwLjYpXCIsXG4gIFwib3BhY2l0eSgwLjYpXCIsXG4gIFwiRmlsdGVyXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8ICBfICAvIFxcX19fIFxcXG4vLyAgICAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJjb2xvcnNcIixcbiAgXCJDb2xvcnNcIixcbiAgXCJDb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuLy8gICAgICBfX19fX19fIF9fX19fX19fICAgX19fX19fX19fICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfF9fICAgX198ICBfX19fXFwgXFwgLyAvX18gICBfX3wgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICAgICB8IHwgIHwgfF9fICAgXFwgViAvICAgfCB8ICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgICAgIHwgfCAgfCAgX198ICAgPiA8ICAgIHwgfCAgICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICAgICB8IHwgIHwgfF9fX18gLyAuIFxcICAgfCB8ICAgIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICAgICB8X3wgIHxfX19fX18vXy8gXFxfXFwgIHxffCAgICAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc190ZXh0ID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcInRleHRcIixcbiAgXCJUZXh0IENvbG9yc1wiLFxuICBcIlRleHQgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcImxhYmVsXCIsXG4gIFwiTGFiZWwgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb3JtIGVsZW1lbnRzIGxhYmVsc1wiLFxuICBHUkVZW1wiNzAwXCJdLFxuICBHUkVZW1wiMzAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBUZXh0IENvbG9yXCIsXG4gIFwiTm9ybWFsIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiODAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiOTAwXCJdLFxuICBHUkVZW1wiNTBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwidW5zZWxlY3RlZFwiLFxuICBcIlVuc2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlVuc2VsZWN0ZWQgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI2MDBcIl0sXG4gIEdSRVlbXCI0MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fX19fIF9fX19fX19fICAgX19fX19fX19fICAgX19fXyAgXyAgICAgICAgICAgICAgIF9fX19fIF8gIF9fXG4vLyAgICAgfF9fICAgX198ICBfX19fXFwgXFwgLyAvX18gICBfX3wgfCAgXyBcXHwgfCAgICAgICAgL1xcICAgLyBfX19ffCB8LyAvXG4vLyAgICAgICAgfCB8ICB8IHxfXyAgIFxcIFYgLyAgIHwgfCAgICB8IHxfKSB8IHwgICAgICAgLyAgXFwgfCB8ICAgIHwgJyAvXG4vLyAgICAgICAgfCB8ICB8ICBfX3wgICA+IDwgICAgfCB8ICAgIHwgIF8gPHwgfCAgICAgIC8gL1xcIFxcfCB8ICAgIHwgIDxcbi8vICAgICAgICB8IHwgIHwgfF9fX18gLyAuIFxcICAgfCB8ICAgIHwgfF8pIHwgfF9fX18gLyBfX19fIFxcIHxfX19ffCAuIFxcXG4vLyAgICAgICAgfF98ICB8X19fX19fL18vIFxcX1xcICB8X3wgICAgfF9fX18vfF9fX19fXy9fLyAgICBcXF9cXF9fX19ffF98XFxfXFxcbi8vXG4vL1xuY29uc3QgY29sb3JzX3RleHRfYmxhY2sgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwidGV4dEJsYWNrXCIsXG4gIFwiVGV4dCBDb2xvcnMgQmxhY2sgQmFja2dyb3VuZFwiLFxuICBcIlRleHQgY29sb3JzIHVzZWQgZm9yIGJsYWNrIGJhY2tncm91bmQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBUZXh0IENvbG9yXCIsXG4gIFwiTm9ybWFsIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiMjAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiNTBcIl0sXG4gIEdSRVlbXCI1MFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX3RleHRfYmxhY2subWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiVW5zZWxlY3RlZCB0ZXh0IGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX19fIF9fX19fIF9fX18gIF8gICBfICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfF8gICBfLyBfX19fLyBfXyBcXHwgXFwgfCB8ICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgICB8IHx8IHwgICB8IHwgIHwgfCAgXFx8IHwgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgICB8IHx8IHwgICB8IHwgIHwgfCAuIGAgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICAgX3wgfHwgfF9fX3wgfF9ffCB8IHxcXCAgfCB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgfF9fX19fXFxfX19fX1xcX19fXy98X3wgXFxffCAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc19pY29uID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImljb25cIixcbiAgXCJJY29uIENvbG9yc1wiLFxuICBcIkljb24gY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBJY29uIENvbG9yXCIsXG4gIFwiQ29sb3Igb2YgaWNvbnMgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiODAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgSWNvbiBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHNlbGVjdGVkIGljb25zIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjkwMFwiXSxcbiAgR1JFWVtcIjUwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEljb24gQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGljb25zIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX18gICAgICAgICAgX19fX18gXyAgX19fX19fXyBfX19fXyAgIF9fX18gIF8gICAgXyBfICAgXyBfX19fXyAgICAgX19fX18gX19fXyAgXyAgICAgIF9fX18gIF9fX19fICAgX19fX19cbi8vICAgICB8ICBfIFxcICAgL1xcICAgLyBfX19ffCB8LyAvIF9fX198ICBfXyBcXCAvIF9fIFxcfCB8ICB8IHwgXFwgfCB8ICBfXyBcXCAgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICB8IHxfKSB8IC8gIFxcIHwgfCAgICB8ICcgLyB8ICBfX3wgfF9fKSB8IHwgIHwgfCB8ICB8IHwgIFxcfCB8IHwgIHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgfF9fKSB8IChfX19cbi8vICAgICB8ICBfIDwgLyAvXFwgXFx8IHwgICAgfCAgPHwgfCB8XyB8ICBfICAvfCB8ICB8IHwgfCAgfCB8IC4gYCB8IHwgIHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfKSAvIF9fX18gXFwgfF9fX198IC4gXFwgfF9ffCB8IHwgXFwgXFx8IHxfX3wgfCB8X198IHwgfFxcICB8IHxfX3wgfCB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgfF9fX18vXy8gICAgXFxfXFxfX19fX3xffFxcX1xcX19fX198X3wgIFxcX1xcXFxfX19fLyBcXF9fX18vfF98IFxcX3xfX19fXy8gICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2JhY2tncm91bmQgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYmFja2dyb3VuZFwiLFxuICBcIkJhY2tncm91bmQgQ29sb3JzXCIsXG4gIFwiQmFja2dyb3VuZCBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19iYWNrZ3JvdW5kLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBub3JtYWwgZm9ybSBlbGVtZW50IGJhY2tncm91bmRzXCIsXG4gIEdSRVlbXCI1MFwiXSxcbiAgR1JFWVtcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2JhY2tncm91bmQubWFrZV92YXJpYWJsZShcbiAgXCJob3ZlclwiLFxuICBcIkhvdmVyIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb3JtIGVsZW1lbnQgYmFja2dyb3VuZHMgd2hlbiBob3ZlcmluZ1wiLFxuICBHUkVZW1wiNDAwXCJdLFxuICBHUkVZW1wiNzAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFja2dyb3VuZC5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGZvcm0gZWxlbWVudCBiYWNrZ3JvdW5kc1wiLFxuICBHUkVZW1wiMzAwXCJdLFxuICBHUkVZW1wiODAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vICAgICAgX19fXyAgIF9fX18gIF9fX19fICBfX19fXyAgX19fX19fIF9fX19fICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgLyBfXyBcXHwgIF9fIFxcfCAgX18gXFx8ICBfX19ffCAgX18gXFwgICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8XykgfCB8ICB8IHwgfF9fKSB8IHwgIHwgfCB8X18gIHwgfF9fKSB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPHwgfCAgfCB8ICBfICAvfCB8ICB8IHwgIF9ffCB8ICBfICAvICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfKSB8IHxfX3wgfCB8IFxcIFxcfCB8X198IHwgfF9fX198IHwgXFwgXFwgIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy8gXFxfX19fL3xffCAgXFxfXFxfX19fXy98X19fX19ffF98ICBcXF9cXCAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc19ib3JkZXIgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYm9yZGVyXCIsXG4gIFwiQm9yZGVyIENvbG9yc1wiLFxuICBcIkJvcmRlciBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19ib3JkZXIubWFrZV92YXJpYWJsZShcbiAgXCJub3JtYWxcIixcbiAgXCJOb3JtYWwgQm9yZGVyIENvbG9yXCIsXG4gIFwiQ29sb3Igb2Ygbm9ybWFsIGZvcm0gZWxlbWVudCBib3JkZXJzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19ib3JkZXIubWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBCb3JkZXIgQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGZvcm0gZWxlbWVudCBib3JkZXJzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fX18gX19fXyAgIF9fX19fIF8gICAgXyAgX19fX19cbi8vICAgICB8ICBfX19fLyBfXyBcXCAvIF9fX198IHwgIHwgfC8gX19fX3xcbi8vICAgICB8IHxfXyB8IHwgIHwgfCB8ICAgIHwgfCAgfCB8IChfX19cbi8vICAgICB8ICBfX3x8IHwgIHwgfCB8ICAgIHwgfCAgfCB8XFxfX18gXFxcbi8vICAgICB8IHwgICB8IHxfX3wgfCB8X19fX3wgfF9ffCB8X19fXykgfFxuLy8gICAgIHxffCAgICBcXF9fX18vIFxcX19fX198XFxfX19fL3xfX19fXy9cbmNvbnN0IGNvbG9yc19mb2N1cyA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJmb2N1c1wiLFxuICBcIkZvY3VzIENvbG9yc1wiLFxuICBcIkZvY3VzIGNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuY29sb3JzX2ZvY3VzLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiRm9jdXMgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb2N1c3NlZCBmb3JtIGVsZW1lbnRcIixcbiAgT1JBTkdFW1wiNjAwXCJdLFxuICBPUkFOR0VbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fICAgICAgICAgICBfX19fXyBfX19fXyBfX19fXyAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgICAvXFwgICAgLyBfX19ffF8gICBfLyBfX19ffCAgLyBfX19fLyBfXyBcXHwgfCAgICAvIF9fIFxcfCAgX18gXFwgLyBfX19ffFxuLy8gICAgIHwgfF8pIHwgLyAgXFwgIHwgKF9fXyAgIHwgfHwgfCAgICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPCAvIC9cXCBcXCAgXFxfX18gXFwgIHwgfHwgfCAgICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgIHwgfF8pIC8gX19fXyBcXCBfX19fKSB8X3wgfHwgfF9fX18gIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy9fLyAgICBcXF9cXF9fX19fL3xfX19fX1xcX19fX198ICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2Jhc2ljID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImJhc2ljXCIsXG4gIFwiQmFzaWMgQ29sb3JzXCIsXG4gIFwiQmFzaWMgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJncmVlblwiLFxuICBcIkJhc2ljIEdyZWVuIENvbG9yXCIsXG4gIFwiQ29tbW9ubHkgdXNlZCBncmVlbiBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRUVOW1wiMzAwXCJdLFxuICBHUkVFTltcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2Jhc2ljLm1ha2VfdmFyaWFibGUoXG4gIFwicmVkXCIsXG4gIFwiQmFzaWMgUmVkIENvbG9yXCIsXG4gIFwiQ29tbW9ubHkgdXNlZCByZWQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBSRURbXCIzMDBcIl0sXG4gIFJFRFtcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2Jhc2ljLm1ha2VfdmFyaWFibGUoXG4gIFwiYmx1ZVwiLFxuICBcIkJhc2ljIEJsdWUgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIGJsdWUgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBCTFVFW1wiMzAwXCJdLFxuICBCTFVFW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJ5ZWxsb3dcIixcbiAgXCJCYXNpYyBZZWxsb3cgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIHllbGxvdyBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIFlFTExPV1tcIjMwMFwiXSxcbiAgT1JBTkdFW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgICBfX19fXyBfX19fXyBfX19fX19fX19fX18gIF9fX19fXG4vLyAgICAgIC8gX19fX3xfICAgX3xfX18gIC8gIF9fX198LyBfX19ffFxuLy8gICAgIHwgKF9fXyAgIHwgfCAgICAvIC98IHxfXyAgfCAoX19fXG4vLyAgICAgIFxcX19fIFxcICB8IHwgICAvIC8gfCAgX198ICBcXF9fXyBcXFxuLy8gICAgICBfX19fKSB8X3wgfF8gLyAvX198IHxfX19fIF9fX18pIHxcbi8vICAgICB8X19fX18vfF9fX19fL19fX19ffF9fX19fX3xfX19fXy9cbmNvbnN0IHNpemVzID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJzaXplXCIsXG4gIFwiU2l6ZVwiLFxuICBcIlNpemVzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5cbnNpemVzLm1ha2VfdmFyaWFibGUoXG4gIFwiaGVpZ2h0XCIsXG4gIFwiSGVpZ2h0XCIsXG4gIFwiRGVmYXVsdCBoZWlnaHQgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuICBcIjEuNnJlbVwiLFxuICBcIjEuNnJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuXG5zaXplcy5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoSGVpZ2h0XCIsXG4gIFwiVG91Y2ggSGVpZ2h0XCIsXG4gIFwiTWluaW11bSBoZWlnaHQgZm9yIHRvdWNoIGRldmljZXMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuICBcIjIuNnJlbVwiLFxuICBcIjIuNnJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzNcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8gICAgICBfX19fX18gX19fXyAgXyAgIF8gX19fX19fX1xuLy8gICAgIHwgIF9fX18vIF9fIFxcfCBcXCB8IHxfXyAgIF9ffFxuLy8gICAgIHwgfF9fIHwgfCAgfCB8ICBcXHwgfCAgfCB8XG4vLyAgICAgfCAgX198fCB8ICB8IHwgLiBgIHwgIHwgfFxuLy8gICAgIHwgfCAgIHwgfF9ffCB8IHxcXCAgfCAgfCB8XG4vLyAgICAgfF98ICAgIFxcX19fXy98X3wgXFxffCAgfF98XG5jb25zdCBmb250ID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJmb250XCIsXG4gIFwiRm9udFwiLFxuICBcIkZvbnQgc2V0dGluZ3MgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInNpemVcIixcbiAgXCJGb250IFNpemVcIixcbiAgXCJEZWZhdWx0IGZvbnQgc2l6ZSB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4gIFwiMXJlbVwiLFxuICBcIjFyZW1cIixcbiAgXCJMZW5ndGhcIixcbiAgeyBtaW46IDAuMSwgbWF4OiAxMCB9LFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoX3NpemVcIixcbiAgXCJUb3VjaCBGb250IFNpemVcIixcbiAgXCJGb250IHNpemUgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50cyBmb3IgdG91Y2ggZGV2aWNlc1wiLFxuICBcIjEuMXJlbVwiLFxuICBcIjEuMXJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgZXJyLCBvaywgdHlwZSBPcHRpb24sIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlLCBTdGF0ZVN1YiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgXCIuL3NoYXJlZFwiO1xuXG4vKipDb2xvcnMgZm9yIGZvcm0gZWxlbWVudHMgdGhhdCBoYXZlIHNlbGVjdGFibGUgY29sb3JzKi9cbmV4cG9ydCBjb25zdCBGb3JtQ29sb3JzID0ge1xuICBOb25lOiBcIm5vbmVcIixcbiAgQmxhY2s6IFwiYmxhY2tcIixcbiAgR3JlZW46IFwiZ3JlZW5cIixcbiAgUmVkOiBcInJlZFwiLFxuICBCbHVlOiBcImJsdWVcIixcbiAgWWVsbG93OiBcInllbGxvd1wiLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZvcm1Db2xvcnMgPSAodHlwZW9mIEZvcm1Db2xvcnMpW2tleW9mIHR5cGVvZiBGb3JtQ29sb3JzXTtcblxuLyoqU2hhcmVkIGNvbXBvbmVudCBjbGFzcyBmb3Igb3RoZXIgY29tcG9uZW50cyB0byBpbmhlcml0IGZyb20qL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1FbGVtZW50IGV4dGVuZHMgQmFzZSB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cbn1cblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gICAgIF9fICAgICAgX18gICAgIF8gICAgIF8gICAgXyBfX19fX18gICBfX19fXyAgX19fX19fICAgICAgICAgIF9fX19fXG4vLyAgICAgXFwgXFwgICAgLyAvXFwgICB8IHwgICB8IHwgIHwgfCAgX19fX3wgfCAgX18gXFx8ICBfX19ffCAgIC9cXCAgIHwgIF9fIFxcXG4vLyAgICAgIFxcIFxcICAvIC8gIFxcICB8IHwgICB8IHwgIHwgfCB8X18gICAgfCB8X18pIHwgfF9fICAgICAvICBcXCAgfCB8ICB8IHxcbi8vICAgICAgIFxcIFxcLyAvIC9cXCBcXCB8IHwgICB8IHwgIHwgfCAgX198ICAgfCAgXyAgL3wgIF9ffCAgIC8gL1xcIFxcIHwgfCAgfCB8XG4vLyAgICAgICAgXFwgIC8gX19fXyBcXHwgfF9fX3wgfF9ffCB8IHxfX19fICB8IHwgXFwgXFx8IHxfX19fIC8gX19fXyBcXHwgfF9ffCB8XG4vLyAgICAgICAgIFxcL18vICAgIFxcX1xcX19fX19fXFxfX19fL3xfX19fX198IHxffCAgXFxfXFxfX19fX18vXy8gICAgXFxfXFxfX19fXy9cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVmFsdWVPcHRpb25zPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAvKipJRCBmb3JtIGZvcm0gZWxlbWVudCAqL1xuICBpZD86IElEO1xuICAvKipWYWx1ZSBmb3IgZm9ybSBlbGVtZW50ICovXG4gIHZhbHVlPzogUlQ7XG4gIHZhbHVlX2J5X3N0YXRlPzogU3RhdGU8UlQsIE9wdGlvbjx7fT4sIFJUPjtcbiAgLyoqTG9uZ2VyIGRlc2NyaXB0aW9uIHdoYXQgZm9ybSBlbGVtZW50IGRvZXMgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKkNoYW5nZSBsaXN0ZW5lciBmdW5jdGlvbiovXG4gIGNoYW5nZT86ICh2YWw6IFJUKSA9PiB2b2lkO1xufVxuXG4vKipTaGFyZWQgY2xhc3MgZm9yIGFsbCBjb21wb25lbnRzIHdpdGggdmFsdWVzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtVmFsdWU8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtRWxlbWVudCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG5cbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtVmFsdWU8UlQsIElEPixcbiAgICBvcHRpb25zOiBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4sXG4gICkge1xuICAgIGlmIChvcHRpb25zLmRlc2NyaXB0aW9uKSBlbGVtZW50LmRlc2NyaXB0aW9uID0gb3B0aW9ucy5kZXNjcmlwdGlvbjtcbiAgICBpZiAob3B0aW9ucy52YWx1ZV9ieV9zdGF0ZSkgZWxlbWVudC52YWx1ZV9ieV9zdGF0ZSA9IG9wdGlvbnMudmFsdWVfYnlfc3RhdGU7XG4gICAgZWxzZSBpZiAob3B0aW9ucy52YWx1ZSAhPT0gdW5kZWZpbmVkKSBlbGVtZW50LnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgfVxuXG4gIHJlYWRvbmx5IGZvcm1faWQ6IElEO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZm9ybV9pZCA9IGlkIGFzIElEO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9kZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqU2V0cyB0aGUgY3VycmVudCBsYWJlbCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCBkZXNjcmlwdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHRleHQ7XG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uIHx8IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2J1ZmZlcj86IFJUO1xuICBnZXQgYnVmZmVyKCk6IFJUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zdGF0ZT86IFN0YXRlPFJULCBPcHRpb248e30+LCBSVD47XG4gICNmdW5jPzogU3RhdGVTdWI8UmVzdWx0PFJULCBzdHJpbmc+PjtcbiAgLyoqVGhpcyBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50Ki9cbiAgc2V0IHZhbHVlX2J5X3N0YXRlKHN0YXRlOiBTdGF0ZTxSVCwgT3B0aW9uPHt9PiwgUlQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuI2Z1bmMpIHRoaXMuZGV0YWNoX3N0YXRlKHRoaXMuI2Z1bmMpO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdGhpcy5hdHRhY2hfc3RhdGUoc3RhdGUsICh2YWwpID0+IHtcbiAgICAgICAgaWYgKHZhbC5vaykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWwudmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMuI2Vycm9yKSB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgdGhpcy5lcnJvciA9IHZhbC5lcnJvcjtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVsYXRlZCA9IHN0YXRlLnJlbGF0ZWQoKTtcbiAgICAgIGlmIChyZWxhdGVkLnNvbWUpIHRoaXMuc3RhdGVfcmVsYXRlZChyZWxhdGVkLnZhbHVlKTtcbiAgICB9IGVsc2UgdGhpcy5zdGF0ZV9yZWxhdGVkKHt9KTtcbiAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgLyoqVGhpcyBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50Ki9cbiAgc2V0IHZhbHVlKHZhbDogUlQpIHtcbiAgICB0aGlzLl9idWZmZXIgPSB2YWw7XG4gICAgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIGdldCB2YWx1ZSgpOiBSZXN1bHQ8UlQsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZVxuICAgICAgPyBlcnIoXCJTdGF0ZSBiYXNlZCBjb21wb25lbnRcIilcbiAgICAgIDogdHlwZW9mIHRoaXMuX2J1ZmZlciA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IGVycihcIk5vIHZhbHVlIHlldFwiKVxuICAgICAgICA6IG9rKHRoaXMuX2J1ZmZlcik7XG4gIH1cblxuICAjZXJyb3IgPSBmYWxzZTtcbiAgc2V0IGVycm9yKGVycjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgdGhpcy5uZXdfZXJyb3IoZXJyKTtcbiAgICAgIHRoaXMuI2Vycm9yID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2Vycm9yKSB7XG4gICAgICB0aGlzLmNsZWFyX2Vycm9yKCk7XG4gICAgICB0aGlzLiNlcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKkNsZWFycyB0aGUgdmFsdWUgYW5kIGVycm9yIG9mIHRoZSBjb21wb25lbnQgaWYgbm90IHN0YXRlIGJhc2VkKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSByZXR1cm47XG4gICAgdGhpcy5fYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICB0aGlzLmNsZWFyX2Vycm9yKCk7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBzZXQgYnkgdmFsdWUgc2V0dGVyIG9yIHN0YXRlKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5ld192YWx1ZSh2YWw6IFJUKTogdm9pZDtcblxuICAvKipDbGVhcnMgZm9ybSBlbGVtZW50IGdyYXBoaWNhbGx5Ki9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNsZWFyX3ZhbHVlKCk6IHZvaWQ7XG5cbiAgLyoqQ2FsbGVkIHdoZW4gZXJyb3IgaXMgc2V0IGJ5IGVycm9yIG9yIHN0YXRlKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5ld19lcnJvcih2YWw6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqQ2FsbGVkIHdoZW4gZXJyb3IgaXMgY2xlYXJlZCBieSBlcnJvciBvciBzdGF0ZSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjbGVhcl9lcnJvcigpOiB2b2lkO1xuXG4gIC8qKkNhbGxlZCB3aGVuIHN0YXRlIGhhcyByZWxhdGVkIGluZm9ybWF0aW9uICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IHt9KTogdm9pZDtcbn1cblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gICAgIF9fICAgICAgX18gICAgIF8gICAgIF8gICAgXyBfX19fX18gIF9fICAgICAgICAgIF9fX19fX18gIF9fX19fIF9fX19fX18gX19fX19fXG4vLyAgICAgXFwgXFwgICAgLyAvXFwgICB8IHwgICB8IHwgIHwgfCAgX19fX3wgXFwgXFwgICAgICAgIC8gLyAgX18gXFx8XyAgIF98X18gICBfX3wgIF9fX198XG4vLyAgICAgIFxcIFxcICAvIC8gIFxcICB8IHwgICB8IHwgIHwgfCB8X18gICAgIFxcIFxcICAvXFwgIC8gL3wgfF9fKSB8IHwgfCAgICB8IHwgIHwgfF9fXG4vLyAgICAgICBcXCBcXC8gLyAvXFwgXFwgfCB8ICAgfCB8ICB8IHwgIF9ffCAgICAgXFwgXFwvICBcXC8gLyB8ICBfICAvICB8IHwgICAgfCB8ICB8ICBfX3xcbi8vICAgICAgICBcXCAgLyBfX19fIFxcfCB8X19ffCB8X198IHwgfF9fX18gICAgIFxcICAvXFwgIC8gIHwgfCBcXCBcXCBffCB8XyAgIHwgfCAgfCB8X19fX1xuLy8gICAgICAgICBcXC9fLyAgICBcXF9cXF9fX19fX1xcX19fXy98X19fX19ffCAgICAgXFwvICBcXC8gICB8X3wgIFxcX1xcX19fX198ICB8X3wgIHxfX19fX198XG4vKipTaGFyZWQgY2xhc3MgZm9yIGFsbCBjb21wb25lbnRzIHdpdGggdmFsdWVzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtVmFsdWVXcml0ZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJAYWJzdHJhY3RAXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2Fybl9pbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgI3dhcm5fdGltZW91dD86IG51bWJlcjtcbiAgI2NoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI2NoYW5nZT86ICh2YWw6IFJUKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy53YXJuX2lucHV0Lm5hbWUgPSBcInZhbFwiO1xuICB9XG5cbiAgc2V0IGNoYW5nZShmdW5jOiAodmFsOiBSVCkgPT4gdm9pZCkge1xuICAgIHRoaXMuI2NoYW5nZSA9IGZ1bmM7XG4gIH1cbiAgZ2V0IGNoYW5nZSgpOiAoKHZhbDogUlQpID0+IHZvaWQpIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jY2hhbmdlO1xuICB9XG5cbiAgLyoqUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBpZiBpdCBoYXMgY2hhbmdlZCovXG4gIGdldCBjaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjaGFuZ2VkO1xuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZSk7XG4gICAgdGhpcy53YXJuX2lucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgaWYgKHRoaXMuI3dhcm5fdGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMuI3dhcm5fdGltZW91dCk7XG4gICAgdGhpcy4jd2Fybl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhcm5faW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIik7XG4gICAgICB0aGlzLndhcm5faW5wdXQucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9LCA1MDAwKTtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGxpbWl0IHZhbHVlIGVudGVyZWQgKi9cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogUlQpOiBQcm9taXNlTGlrZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIGlmICh0aGlzLl9zdGF0ZS53cml0YWJsZSkgcmV0dXJuIHRoaXMuX3N0YXRlLmxpbWl0KHZhbCk7XG4gICAgICBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUoZXJyKFwiTm90IHdyaXRhYmxlXCIpKTtcbiAgICB9IGVsc2UgcmV0dXJuIHN5bmNfcmVzb2x2ZShvayh2YWwpKTtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGNoZWNrIHZhbHVlICovXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IFJUKTogUHJvbWlzZUxpa2U8UmVzdWx0PFJULCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUud3JpdGFibGUpIHJldHVybiB0aGlzLl9zdGF0ZS5jaGVjayh2YWwpO1xuICAgICAgZWxzZSByZXR1cm4gc3luY19yZXNvbHZlKGVycihcIk5vdCB3cml0YWJsZVwiKSk7XG4gICAgfSBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUob2sodmFsKSk7XG4gIH1cblxuICAvKipGdW5jdGlvbiB0byB1cGRhdGUgdmFsdWUqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2V0X3ZhbHVlX2xpbWl0KHZhbDogUlQpOiBQcm9taXNlPFJlc3VsdDxSVCwgc3RyaW5nPj4ge1xuICAgIGNvbnN0IGxpbWl0ZWQgPSBhd2FpdCB0aGlzLmxpbWl0X3ZhbHVlKHZhbCk7XG4gICAgaWYgKGxpbWl0ZWQuZXJyKSB7XG4gICAgICB0aGlzLndhcm4obGltaXRlZC5lcnJvcik7XG4gICAgICByZXR1cm4gbGltaXRlZDtcbiAgICB9XG4gICAgdGhpcy4jc2V0X3ZhbHVlKGxpbWl0ZWQudmFsdWUpO1xuICAgIHJldHVybiBsaW1pdGVkO1xuICB9XG5cbiAgLyoqRnVuY3Rpb24gdG8gdXBkYXRlIHZhbHVlKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNldF92YWx1ZV9jaGVjayh2YWw6IFJUKTogUHJvbWlzZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBjb25zdCBjaGVja2VkID0gYXdhaXQgdGhpcy5jaGVja192YWx1ZSh2YWwpO1xuICAgIGlmIChjaGVja2VkLmVycikge1xuICAgICAgdGhpcy53YXJuKGNoZWNrZWQuZXJyb3IpO1xuICAgICAgcmV0dXJuIGNoZWNrZWQ7XG4gICAgfVxuICAgIHRoaXMuI3NldF92YWx1ZShjaGVja2VkLnZhbHVlKTtcbiAgICByZXR1cm4gY2hlY2tlZDtcbiAgfVxuXG4gICNzZXRfdmFsdWUodmFsOiBSVCkge1xuICAgIGlmICh0aGlzLl9idWZmZXIgPT09IHZhbCkgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgICBpZiAodGhpcy4jY2hhbmdlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy4jY2hhbmdlKHZhbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgd2hpbGUgdXBkYXRpbmcgY2hhbmdlIGxpc3RlbmVyXCIsIGUpO1xuICAgICAgfVxuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgY29uc3QgYnVmZiA9IHRoaXMuX2J1ZmZlcjtcbiAgICAgIHRoaXMuX3N0YXRlLndyaXRlISh2YWwpLnRoZW4oKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyLmVycikge1xuICAgICAgICAgIGlmIChidWZmICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKGJ1ZmYpO1xuICAgICAgICAgIHRoaXMud2FybihlcnIuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgICAgIHRoaXMuX2J1ZmZlciA9IHZhbDtcbiAgICAgIHRoaXMuI2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQge1xuICBGb3JtQ29sb3JzLFxuICBGb3JtVmFsdWUsXG4gIEZvcm1WYWx1ZVdyaXRlLFxuICB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMsXG59IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuLi8uLi9zaGFyZWRcIjtcbmltcG9ydCBcIi4vYnV0dG9uLnNjc3NcIjtcblxuaW50ZXJmYWNlIEZvcm1CdXR0b25PcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPGJvb2xlYW4sIElEPiB7XG4gIC8qKkJ1dHRvbnMgdGV4dCAqL1xuICB0ZXh0Pzogc3RyaW5nO1xuICAvKipJY29uIGZvciBidXR0b24gKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkZ1bmN0aW9uIHRvIGNhbGwgb24gYnV0dG9uIGNsaWNrICovXG4gIG9uX2NsaWNrPzogKCkgPT4gdm9pZDtcbiAgLyoqU2V0IHRydWUgdG8gbWFrZSBidXR0b24gdG9nZ2xlIG9uIGNsaWNrIGluc3RlYWQgb2Ygbm9ybWFsICovXG4gIHRvZ2dsZT86IGJvb2xlYW47XG4gIC8qKkNoYW5nZXMgdGhlIGJ1dHRvbnMgY29sb3IgKi9cbiAgY29sb3I/OiBGb3JtQ29sb3JzO1xufVxuXG5jbGFzcyBGb3JtQnV0dG9uPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiYnV0dG9uXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN0ZXh0OiBIVE1MU3BhbkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI29uX2NsaWNrPzogKCkgPT4gdm9pZDtcbiAgI3RvZ2dsZT86IGJvb2xlYW47XG4gICNpY29uPzogU1ZHU1ZHRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuXG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNvbl9jbGljaykgdGhpcy4jb25fY2xpY2soKTtcbiAgICB9O1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gXCJ0b3VjaFwiICYmIGUuYnV0dG9uID09PSAwKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICBpZiAoIXRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodHJ1ZSk7XG4gICAgICAgIHRoaXMub25wb2ludGVydXAgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB0aGlzLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldi5wb2ludGVySWQpO1xuICAgICAgICAgIGlmICh0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgZWxzZSB0aGlzLnNldF92YWx1ZV9jaGVjayhmYWxzZSk7XG4gICAgICAgICAgdGhpcy5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9udG91Y2hzdGFydCA9IChlKSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKCF0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRydWUpO1xuICAgICAgdGhpcy5vbnRvdWNoZW5kID0gKGV2KSA9PiB7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoZXYudGFyZ2V0VG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAodGhpcy4jdG9nZ2xlKSB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgICAgIGVsc2UgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgIHRoaXMub250b3VjaGVuZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRydWUpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jb25fY2xpY2spIHRoaXMuI29uX2NsaWNrKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25rZXl1cCA9IG51bGw7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGJ1dHRvbiovXG4gIHNldCB0ZXh0KGxhYmVsOiBzdHJpbmcpIHtcbiAgICB0aGlzLiN0ZXh0LnRleHRDb250ZW50ID0gbGFiZWw7XG4gIH1cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RleHQudGV4dENvbnRlbnQ7XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBidXR0b24qL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3RleHQpO1xuICAgIGVsc2UgaWYgKHRoaXMuI2ljb24pIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy4jaWNvbik7XG4gICAgICB0aGlzLiNpY29uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGNhbGwgb24gYnV0dG9uIGNsaWNrKi9cbiAgc2V0IG9uX2NsaWNrKGZ1bmM6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI29uX2NsaWNrID0gZnVuYztcbiAgfVxuICBnZXQgb25fY2xpY2soKSB7XG4gICAgcmV0dXJuIHRoaXMuI29uX2NsaWNrO1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgY29sb3Igb2YgdGhlIGJ1dHRvbiovXG4gIHNldCBjb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUoXCJjb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICBlbHNlIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5ld192YWx1ZShmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihcIlRPRE9cIiwgZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG5cbiAgLyoqQ2hhbmdlcyB3aGV0aGVyIHRoZSBidXR0b24gaXMgbWFpbnRhaW5lZCBvciBtb21lbnRhcnkqL1xuICBzZXQgdG9nZ2xlKHRvZ2dsZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3RvZ2dsZSA9IEJvb2xlYW4odG9nZ2xlKTtcbiAgfVxuICBnZXQgdG9nZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLiN0b2dnbGU7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1CdXR0b24pO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fYnV0dG9uPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1CdXR0b25PcHRpb25zPElEPixcbik6IEZvcm1CdXR0b248SUQ+IHtcbiAgY29uc3QgYnV0dCA9IG5ldyBGb3JtQnV0dG9uPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgYnV0dC50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLmljb24pIGJ1dHQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jbGljaykgYnV0dC5vbl9jbGljayA9IG9wdGlvbnMub25fY2xpY2s7XG4gICAgaWYgKG9wdGlvbnMudG9nZ2xlKSBidXR0LnRvZ2dsZSA9IG9wdGlvbnMudG9nZ2xlO1xuICAgIGlmIChvcHRpb25zLmNvbG9yKSBidXR0LmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcbiAgICBGb3JtVmFsdWUuYXBwbHlfb3B0aW9ucyhidXR0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gYnV0dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlLCB0eXBlIEZvcm1Db2xvcnMsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2xhbXAuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1MYW1wT3B0aW9uczxcbiAgVCBleHRlbmRzIGJvb2xlYW4gfCBudW1iZXIsXG4gIEMgZXh0ZW5kcyBGb3JtQ29sb3JzW10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqU2V0cyB0aGUgbGFtcCBjb2xvcnMgKi9cbiAgY29sb3JzOiBDO1xuICAvKipMYW1wIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqSWNvbiBmb3IgbGFtcCAqL1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGNsYXNzIEZvcm1MYW1wPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibGFtcFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdGV4dDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uOiBTVkdTVkdFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAjY29sb3JzOiBGb3JtQ29sb3JzW10gPSBbXTtcblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGxhbXAqL1xuICBzZXQgdGV4dChsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdGV4dC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0LnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgbGFtcCovXG4gIHNldCBpY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikgdGhpcy4jaWNvbiA9IHRoaXMuaW5zZXJ0QmVmb3JlKGljb24oKSwgdGhpcy4jdGV4dCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGxhbXAqL1xuICBzZXQgY29sb3JzKGNvbG9yczogQykge1xuICAgIHRoaXMuI2NvbG9ycyA9IGNvbG9ycztcbiAgICB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlciEpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gdmFsdWUgaXMgY2hhbmdlZCAqL1xuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBudW1iZXIgfCBib29sZWFuKSB7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLiNjb2xvcnNbTnVtYmVyKHZhbHVlKV07XG4gICAgaWYgKGNvbG9yKSB0aGlzLnNldEF0dHJpYnV0ZShcImNvbG9yXCIsIGNvbG9yKTtcbiAgICBlbHNlIHRoaXMucmVtb3ZlQXR0cmlidXRlKFwiY29sb3JcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJjb2xvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybUxhbXApO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZnVuY3Rpb24gZnJvbTxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtTGFtcE9wdGlvbnM8XG4gICAgbnVtYmVyLFxuICAgIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCAuLi5Gb3JtQ29sb3JzW11dLFxuICAgIElEXG4gID4sXG4pOiBGb3JtTGFtcDxudW1iZXIsIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCAuLi5Gb3JtQ29sb3JzW11dLCBJRD47XG5mdW5jdGlvbiBmcm9tPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1MYW1wT3B0aW9uczxib29sZWFuLCBbRm9ybUNvbG9ycywgRm9ybUNvbG9yc10sIElEPixcbik6IEZvcm1MYW1wPGJvb2xlYW4sIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzXSwgSUQ+O1xuZnVuY3Rpb24gZnJvbTxcbiAgVCBleHRlbmRzIGJvb2xlYW4gfCBudW1iZXIsXG4gIEMgZXh0ZW5kcyBGb3JtQ29sb3JzW10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPihvcHRpb25zPzogRm9ybUxhbXBPcHRpb25zPFQsIEMsIElEPik6IEZvcm1MYW1wPFQsIEMsIElEPiB7XG4gIGNvbnN0IGxhbXAgPSBuZXcgRm9ybUxhbXA8VCwgQywgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBsYW1wLmNvbG9ycyA9IG9wdGlvbnMuY29sb3JzO1xuICAgIGlmIChvcHRpb25zLnRleHQpIGxhbXAudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICBpZiAob3B0aW9ucy5pY29uKSBsYW1wLmljb24gPSBvcHRpb25zLmljb247XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMobGFtcCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGxhbXA7XG59XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgY29uc3QgZm9ybV9sYW1wID0gZnJvbTtcbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybUNvbG9ycywgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3N3aXRjaC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3dpdGNoT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxib29sZWFuLCBJRD4ge1xuICAvKipJY29uIHRvIHVzZSBmb3IgbGVmdCBzaWRlKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkNvbG9yIHdoZW4gc3dpdGNoIGlzIG9uICovXG4gIG9uX2NvbG9yPzogRm9ybUNvbG9ycztcbiAgLyoqQ29sb3Igd2hlbiBzd2l0Y2ggaXMgb2ZmICovXG4gIG9mZl9jb2xvcj86IEZvcm1Db2xvcnM7XG59XG5cbmV4cG9ydCBjbGFzcyBGb3JtU3dpdGNoPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3dpdGNoXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNzd2l0Y2g6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI2ljb246IFNWR1NWR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICNwcmV2ZW50X2NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNzd2l0Y2guc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuI3N3aXRjaC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgY2FzZSBcIiBcIjoge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbmtleXVwID0gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgbGV0IGhhc19tb3ZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChoYXNfbW92ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IHRoaXMuI3N3aXRjaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pZF9jb3JkID0gYm94LnggKyBib3gud2lkdGggLyAyO1xuICAgICAgICAgICAgaWYgKGV2LmNsaWVudFggPiBtaWRfY29yZCkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFggLSBldi5jbGllbnRYKSA+IDEwIHx8XG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFkgLSBldi5jbGllbnRZKSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBoYXNfbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgaWYgKCFoYXNfbW92ZWQpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbmNsaWNrID0gKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLiNwcmV2ZW50X2NsaWNrKSByZXR1cm4gKHRoaXMuI3ByZXZlbnRfY2xpY2sgPSBmYWxzZSk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH07XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBzd2l0Y2gqL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3N3aXRjaCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgc2V0IG9uX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJvbi1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJvbi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IG9mZl9jb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLiNzd2l0Y2gucmVtb3ZlQXR0cmlidXRlKFwib2ZmLWNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy4jc3dpdGNoLnNldEF0dHJpYnV0ZShcIm9mZi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IGVycm9yX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuI3N3aXRjaC5jbGFzc0xpc3QuYWRkKFwib25cIik7XG4gICAgZWxzZSB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcIm9uXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMubmV3X3ZhbHVlKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX2Vycjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5hZGQoXCJlcnJvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcImVycm9yXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3dpdGNoKTtcblxuLyoqQ3JlYXRlcyBhIHN3aXRjaCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N3aXRjaDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU3dpdGNoT3B0aW9uczxJRD4sXG4pOiBGb3JtU3dpdGNoPElEPiB7XG4gIGNvbnN0IHN3aXQgPSBuZXcgRm9ybVN3aXRjaDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmljb24pIHN3aXQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jb2xvcikgc3dpdC5vbl9jb2xvciA9IG9wdGlvbnMub25fY29sb3I7XG4gICAgaWYgKG9wdGlvbnMub2ZmX2NvbG9yKSBzd2l0Lm9mZl9jb2xvciA9IG9wdGlvbnMub2ZmX2NvbG9yO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoc3dpdCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN3aXQ7XG59XG4iLCJpbXBvcnQgeyBBY2Nlc3NUeXBlcywgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IFByZXR0aWZ5IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQge1xuICBtYXRlcmlhbF9uYXZpZ2F0aW9uX3VuZm9sZF9sZXNzX3JvdW5kZWQsXG4gIG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX21vcmVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB7IGVyciwgb2ssIHR5cGUgT3B0aW9uLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHtcbiAgQU5JTUFUSU9OX0xFVkVMLFxuICBBTklNQVRJT05fU1BFRUQsXG4gIEFuaW1hdGlvbkxldmVscyxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItdGhlbWVcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50LCBGb3JtVmFsdWUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2dyb3VwLnNjc3NcIjtcblxuLyoqRGlmZmVyZW50IGJvcmRlciBzdHlsZXMgZm9yIHRoZSBjb21wb25lbnQgZ3JvdXAqL1xuZXhwb3J0IGNvbnN0IEZvcm1Hcm91cEJvcmRlclN0eWxlID0ge1xuICBOb25lOiBcIm5vbmVcIixcbiAgSW5zZXQ6IFwiaW5zZXRcIixcbiAgT3V0c2V0OiBcIm91dHNldFwiLFxuICBMaW5lOiBcImxpbmVcIixcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBGb3JtR3JvdXBCb3JkZXJTdHlsZSA9XG4gICh0eXBlb2YgRm9ybUdyb3VwQm9yZGVyU3R5bGUpW2tleW9mIHR5cGVvZiBGb3JtR3JvdXBCb3JkZXJTdHlsZV07XG5cbnR5cGUgRXh0cmFjdEI8QXJyIGV4dGVuZHMgYW55W10+ID0gQXJyIGV4dGVuZHMgW2luZmVyIEhlYWQsIC4uLmluZmVyIFRhaWxdXG4gID8gSGVhZCBleHRlbmRzIEZvcm1WYWx1ZTxpbmZlciBULCBpbmZlciBJRD5cbiAgICA/IFtGb3JtVmFsdWU8VCwgSUQ+LCAuLi5FeHRyYWN0QjxUYWlsPl1cbiAgICA6IFsuLi5FeHRyYWN0QjxUYWlsPl1cbiAgOiBbXTtcblxudHlwZSBUb0tleVZhbDxBcnIgZXh0ZW5kcyBGb3JtVmFsdWU8YW55LCBhbnk+W10+ID0ge1xuICBbSyBpbiBBcnJbbnVtYmVyXSBhcyBLW1wiZm9ybV9pZFwiXV06IEsgZXh0ZW5kcyBGb3JtVmFsdWU8aW5mZXIgVCwgYW55PlxuICAgID8gVFxuICAgIDogbmV2ZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Hcm91cE9wdGlvbnM8XG4gIEwgZXh0ZW5kcyBGb3JtRWxlbWVudFtdLFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgVCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFQsIElEPiB7XG4gIC8qKkVsZW1lbnRzIHRvIGFkZCB0byB0aGUgZ3JvdXAqL1xuICBlbGVtZW50cz86IFsuLi5MXTtcbiAgLyoqV2V0aGVyIHRoZSBncm91cCBpcyBjb2xsYXBzaWJsZSwgbWVhbmluZyBpdCBoYXMgYSBidXR0b24gdG8gY29sbGFwc2UgYW5kIGV4cGFuZCBhbGwgY29udGVudCB0byB0aGUgc2l6ZSBvZiB0aGF0IGJ1dHRvbiovXG4gIGNvbGxhcHNpYmxlPzogYm9vbGVhbjtcbiAgLyoqV2V0aGVyIHRoZSBncm91cCBpcyBjb2xsYXBzZWQgaW5pdGlhbGx5Ki9cbiAgY29sbGFwc2VkPzogYm9vbGVhbjtcbiAgLyoqVGV4dCB0byBzaG93IG9uIHRoZSBjb2xsYXBzZSBidXR0b24qL1xuICBjb2xsYXBzZV90ZXh0Pzogc3RyaW5nO1xuICAvKipCb3JkZXIgc3R5bGUgZm9yIGdyb3VwKi9cbiAgYm9yZGVyPzogRm9ybUdyb3VwQm9yZGVyU3R5bGU7XG4gIC8qKlJlbW92ZXMgcGFkZGluZyB3aGVuIHRydWUgYWxsb3dzIGZvciBwdXR0aW5nIGdyb3VwcyBpbiBncm91cHMgd2l0aG91dCBwYWRkaW5nIGJ1aWxkaW5nIHVwICovXG4gIGVtYmVkPzogYm9vbGVhbjtcbiAgLyoqR3JvdXAgbWF4IGhlaWdodCBpbiByZW0sIHVuZGVmaW5lZCBtZWFucyBubyBsaW1pdCovXG4gIG1heF9oZWlnaHQ/OiBudW1iZXI7XG59XG5cbi8qKkNvbXBvbmVudCBncm91cCBjbGFzcyB3aGljaCBhbGxvd3MgdG8gYWRkIGVsZW1lbnRzIGFuZCBjb250cm9scyB0aGUgZmxvdyBvZiB0aGUgZWxlbWVudHMqL1xuZXhwb3J0IGNsYXNzIEZvcm1Hcm91cDxcbiAgUlQgZXh0ZW5kcyBvYmplY3QsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJncm91cFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjY29sbGFwc2libGU/OiBIVE1MRGl2RWxlbWVudDtcbiAgI2NvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAjY29sbGFwc2VfYnV0dG9uPzogSFRNTFNwYW5FbGVtZW50O1xuICAjdmFsdWVfZWxlbWVudHM6IE1hcDxzdHJpbmcsIEZvcm1WYWx1ZTxhbnksIGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gIHNldCBlbGVtZW50cyhlbGVtZW50czogRm9ybUVsZW1lbnRbXSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBjb25zdCBjb21wID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIEZvcm1WYWx1ZSAmJiBjb21wLmZvcm1faWQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3ZhbHVlX2VsZW1lbnRzLmhhcyhjb21wLmZvcm1faWQgYXMgc3RyaW5nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkZvcm0gZWxlbWVudCB3aXRoIGZvcm0gaWQgXCIgK1xuICAgICAgICAgICAgICBjb21wLmZvcm1faWQgK1xuICAgICAgICAgICAgICBcIiBhbHJlYWR5IGV4aXN0cyBpbiBncm91cFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jdmFsdWVfZWxlbWVudHMuc2V0KGNvbXAuZm9ybV9pZCBhcyBzdHJpbmcsIGNvbXApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuI2NvbGxhcHNpYmxlKSB0aGlzLiNjb2xsYXBzaWJsZS5hcHBlbmRDaGlsZChjb21wKTtcbiAgICAgIGVsc2UgdGhpcy5hcHBlbmRDaGlsZChjb21wKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZWxlbWVudHMoKTogRm9ybUVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLiN2YWx1ZV9lbGVtZW50cy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipUaGlzIHBsYWNlcyB0aGUgZ3JvdXAgYXQgYW4gYWJzb2x1dGUgcG9zaXRpb24gaW4gb25lIG9mIHRoZSBjb3JuZXJzIG9mIHRoZSBjb250YWluZXIqL1xuICBzZXQgYm9yZGVyKGJvcmRlcjogRm9ybUdyb3VwQm9yZGVyU3R5bGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBGb3JtR3JvdXBCb3JkZXJTdHlsZS5JbnNldCxcbiAgICAgIEZvcm1Hcm91cEJvcmRlclN0eWxlLk91dHNldCxcbiAgICApO1xuICAgIGlmIChib3JkZXIgJiYgYm9yZGVyICE9PSBGb3JtR3JvdXBCb3JkZXJTdHlsZS5Ob25lKVxuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKGJvcmRlcik7XG4gIH1cblxuICBzZXQgY29sbGFwc2libGUoY29sbGFwc2libGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoY29sbGFwc2libGUgJiYgIXRoaXMuI2NvbGxhcHNpYmxlKSB7XG4gICAgICB0aGlzLiNjb2xsYXBzaWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAxKVxuICAgICAgICB0aGlzLiNjb2xsYXBzaWJsZS5yZXBsYWNlQ2hpbGRyZW4oLi4udGhpcy5jaGlsZHJlbik7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuI2NvbGxhcHNpYmxlKTtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImNvbGxhcHNpYmxlXCIpO1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZChcbiAgICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uIHx8XG4gICAgICAgICAgKHRoaXMuY29sbGFwc2VfdGV4dCA9IFwiXCIpIHx8XG4gICAgICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uISxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbGxhcHNlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICghY29sbGFwc2libGUgJiYgdGhpcy4jY29sbGFwc2libGUpIHtcbiAgICAgIHRoaXMuY29sbGFwc2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbiguLi50aGlzLiNjb2xsYXBzaWJsZS5jaGlsZHJlbik7XG4gICAgICB0aGlzLiNjb2xsYXBzaWJsZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImNvbGxhcHNpYmxlXCIpO1xuICAgIH1cbiAgfVxuICBnZXQgY29sbGFwc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbGxhcHNpYmxlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBzZXQgY29sbGFwc2VkKGNvbGxhcHNlZDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLiNjb2xsYXBzaWJsZSkge1xuICAgICAgaWYgKGNvbGxhcHNlZCAmJiAhdGhpcy4jY29sbGFwc2VkKSB7XG4gICAgICAgIC8vIyBBbmltYXRpb25cbiAgICAgICAgaWYgKEFOSU1BVElPTl9MRVZFTC5nZXQoKS52YWx1ZSA9PT0gQW5pbWF0aW9uTGV2ZWxzLkFsbCkge1xuICAgICAgICAgIHRoaXMuI2NvbGxhcHNpYmxlLnN0eWxlLm92ZXJmbG93WSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgY29uc3QgZnVsbF9oZWlnaHQgPVxuICAgICAgICAgICAgdGhpcy4jY29sbGFwc2libGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuI2NvbGxhcHNpYmxlLmFuaW1hdGUoXG4gICAgICAgICAgICBbeyBoZWlnaHQ6IGZ1bGxfaGVpZ2h0IH0sIHsgaGVpZ2h0OiBcIjBcIiB9XSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IEFOSU1BVElPTl9TUEVFRC5nZXQoKS52YWx1ZSxcbiAgICAgICAgICAgICAgZWFzaW5nOiBcImVhc2UtaW5cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhbmltYXRpb24ub25maW5pc2ggPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJjb2xsYXBzZWRcIik7XG4gICAgICAgICAgICBpZiAodGhpcy4jY29sbGFwc2libGUpIHRoaXMuI2NvbGxhcHNpYmxlLnN0eWxlLm92ZXJmbG93WSA9IFwiXCI7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJjb2xsYXBzZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWNvbGxhcHNlZCAmJiB0aGlzLiNjb2xsYXBzZWQpIHtcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwiY29sbGFwc2VkXCIpO1xuICAgICAgICAvLyMgQW5pbWF0aW9uXG4gICAgICAgIGlmIChBTklNQVRJT05fTEVWRUwuZ2V0KCkudmFsdWUgPT09IEFuaW1hdGlvbkxldmVscy5BbGwpIHtcbiAgICAgICAgICB0aGlzLiNjb2xsYXBzaWJsZS5zdHlsZS5vdmVyZmxvd1kgPSBcImhpZGRlblwiO1xuICAgICAgICAgIGNvbnN0IGZ1bGxfaGVpZ2h0ID1cbiAgICAgICAgICAgIHRoaXMuI2NvbGxhcHNpYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCArIFwicHhcIjtcbiAgICAgICAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLiNjb2xsYXBzaWJsZS5hbmltYXRlKFxuICAgICAgICAgICAgW3sgaGVpZ2h0OiBcIjBcIiB9LCB7IGhlaWdodDogZnVsbF9oZWlnaHQgfV0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiBBTklNQVRJT05fU1BFRUQuZ2V0KCkudmFsdWUsXG4gICAgICAgICAgICAgIGVhc2luZzogXCJlYXNlLW91dFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFuaW1hdGlvbi5vbmZpbmlzaCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNjb2xsYXBzaWJsZSkgdGhpcy4jY29sbGFwc2libGUuc3R5bGUub3ZlcmZsb3dZID0gXCJcIjtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLiNjb2xsYXBzZWQgPSBjb2xsYXBzZWQ7XG4gICAgfVxuICB9XG4gIGdldCBjb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbGxhcHNlZDtcbiAgfVxuXG4gIHNldCBjb2xsYXBzZV90ZXh0KHRleHQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy4jY29sbGFwc2VfYnV0dG9uKSB7XG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi50YWJJbmRleCA9IDA7XG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLmFwcGVuZENoaWxkKFxuICAgICAgICBtYXRlcmlhbF9uYXZpZ2F0aW9uX3VuZm9sZF9sZXNzX3JvdW5kZWQoKSxcbiAgICAgICk7XG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24uYXBwZW5kQ2hpbGQoXG4gICAgICAgIG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX21vcmVfcm91bmRlZCgpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5vbmNsaWNrID0gKCkgPT4gKHRoaXMuY29sbGFwc2VkID0gIXRoaXMuY29sbGFwc2VkKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIiB8fCBlLmtleSA9PT0gXCIgXCIpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5maXJzdENoaWxkIS50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICBzZXQgbWF4X2hlaWdodChoZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoXCItLW1heF9oZWlnaHRcIiwgaGVpZ2h0ID8gaGVpZ2h0ICsgXCJyZW1cIiA6IFwibm9uZVwiKTtcbiAgICBpZiAoaGVpZ2h0KSB0aGlzLmNsYXNzTGlzdC5hZGQoXCJtYXhfaGVpZ2h0XCIpO1xuICAgIGVsc2UgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwibWF4X2hlaWdodFwiKTtcbiAgfVxuXG4gIHNldCBlbWJlZChlbWJlZDogYm9vbGVhbikge1xuICAgIGlmIChlbWJlZCkgdGhpcy5jbGFzc0xpc3QuYWRkKFwiZW1iZWRcIik7XG4gICAgZWxzZSB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJlbWJlZFwiKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IFJUKSB7XG4gICAgc3VwZXIudmFsdWUgPSB2YWw7XG4gIH1cblxuICAvKipSZXR1cm5zIHZhbHVlIG9mIHRoZSBjb21wb25lbnQqL1xuICBnZXQgdmFsdWUoKTogUmVzdWx0PFJULCBzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHJldHVybiBlcnIoXCJTdGF0ZSBiYXNlZCBjb21wb25lbnRcIik7XG4gICAgY29uc3QgcmVzdWx0OiBSVCA9IHt9IGFzIFJUO1xuICAgIGZvciAoY29uc3QgW2tleSwgY29tcF0gb2YgdGhpcy4jdmFsdWVfZWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbXAudmFsdWU7XG4gICAgICBpZiAodmFsLmVycikgcmV0dXJuIGVycihcIkNvbXBvbmVudCB3aXRoIGlkIFwiICsga2V5ICsgXCIgaGFzIG5vIHZhbHVlXCIpO1xuICAgICAgcmVzdWx0W2tleSBhcyBrZXlvZiBSVF0gPSB2YWwudmFsdWUgYXMgUlRba2V5b2YgUlRdO1xuICAgIH1cbiAgICByZXR1cm4gb2socmVzdWx0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBSVCk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbClcbiAgICAgIGlmICh0aGlzLiN2YWx1ZV9lbGVtZW50cy5oYXMoa2V5KSlcbiAgICAgICAgdGhpcy4jdmFsdWVfZWxlbWVudHMuZ2V0KGtleSkhLnZhbHVlID0gdmFsW2tleSBhcyBrZXlvZiBSVF07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb21wIG9mIHRoaXMuI3ZhbHVlX2VsZW1lbnRzLnZhbHVlcygpKSBjb21wLmNsZWFyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgb25fYWNjZXNzKGFjY2VzczogQWNjZXNzVHlwZXMpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGFjY2Vzcykge1xuICAgICAgY2FzZSBBY2Nlc3NUeXBlcy5SZWFkOiB7XG4gICAgICAgIHRoaXMudGFiSW5kZXggPSAwO1xuICAgICAgICB0aGlzLm9uZm9jdXMgPSAoKSA9PiB7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5mb2N1cygpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgQWNjZXNzVHlwZXMuV3JpdGU6IHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJ0YWJJbmRleFwiKTtcbiAgICAgICAgdGhpcy5vbmZvY3VzID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtR3JvdXApO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9ncm91cDxcbiAgTCBleHRlbmRzIEZvcm1FbGVtZW50W10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBUIGV4dGVuZHMgb2JqZWN0ID0gUHJldHRpZnk8UGFydGlhbDxUb0tleVZhbDxFeHRyYWN0QjxMPj4+Pixcbj4ob3B0aW9ucz86IEZvcm1Hcm91cE9wdGlvbnM8TCwgSUQsIFQ+KTogRm9ybUdyb3VwPFQsIElEPiB7XG4gIGNvbnN0IHNsaWRlID0gbmV3IEZvcm1Hcm91cDxULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmJvcmRlcikgc2xpZGUuYm9yZGVyID0gb3B0aW9ucy5ib3JkZXI7XG4gICAgaWYgKG9wdGlvbnMuZWxlbWVudHMpIHNsaWRlLmVsZW1lbnRzID0gb3B0aW9ucy5lbGVtZW50cztcbiAgICBpZiAob3B0aW9ucy5jb2xsYXBzZV90ZXh0KSBzbGlkZS5jb2xsYXBzZV90ZXh0ID0gb3B0aW9ucy5jb2xsYXBzZV90ZXh0O1xuICAgIGlmIChvcHRpb25zLmNvbGxhcHNpYmxlKSBzbGlkZS5jb2xsYXBzaWJsZSA9IG9wdGlvbnMuY29sbGFwc2libGU7XG4gICAgaWYgKG9wdGlvbnMuY29sbGFwc2VkKSBzbGlkZS5jb2xsYXBzZWQgPSBvcHRpb25zLmNvbGxhcHNlZDtcbiAgICBpZiAob3B0aW9ucy5tYXhfaGVpZ2h0KSBzbGlkZS5tYXhfaGVpZ2h0ID0gb3B0aW9ucy5tYXhfaGVpZ2h0O1xuICAgIGlmIChvcHRpb25zLmVtYmVkKSBzbGlkZS5lbWJlZCA9IG9wdGlvbnMuZW1iZWQ7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMoc2xpZGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzbGlkZTtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgTGlzdEZpZWxkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItbGlzdFwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9saXN0X2ZpZWxkLnNjc3NcIjtcblxuZXhwb3J0IGNsYXNzIExpc3RGb3JtRmllbGQ8VCBleHRlbmRzIEZvcm1FbGVtZW50PiBleHRlbmRzIExpc3RGaWVsZCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibGlzdGZpZWxkXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIHNldCBlbGVtZW50KGNvbXBvbmVudDogVCkge1xuICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKGNvbXBvbmVudCk7XG4gIH1cblxuICBnZXQgZWxlbWVudCgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBUO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChMaXN0Rm9ybUZpZWxkKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fbGlzdF9maWVsZDxUIGV4dGVuZHMgRm9ybUVsZW1lbnQ+KGVsZW1lbnQ6IFQpIHtcbiAgY29uc3QgZmllbGQgPSBuZXcgTGlzdEZvcm1GaWVsZDxUPigpO1xuICBmaWVsZC5lbGVtZW50ID0gZWxlbWVudDtcbiAgcmV0dXJuIGZpZWxkO1xufVxuIiwiaW1wb3J0IHsgbm9uZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTdGF0ZU51bWJlclJlbGF0ZWQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vbnVtYmVyX2Jhc2Uuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1OdW1iZXJPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqTG93ZXIgbGltaXQgZm9yIHNsaWRlciB2YWx1ZSovXG4gIG1pbj86IG51bWJlcjtcbiAgLyoqVXBwZXIgbGltaXQgZm9yIHNsaWRlciB2YWx1ZSovXG4gIG1heD86IG51bWJlcjtcbiAgLyoqQW1vdW50IG9mIGRlY2ltYWxzIHRvIHNob3cqL1xuICBkZWNpbWFscz86IG51bWJlcjtcbiAgLyoqVW5pdCB0byB1c2UgZm9yIHNsaWRlciovXG4gIHVuaXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybU51bWJlcldyaXRlT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gbnVtYmVyLFxuPiBleHRlbmRzIEZvcm1OdW1iZXJPcHRpb25zPElELCBSVD4ge1xuICAvKipTdGVwIHNpemUsIHVzZSAwIGZvciBhdXRvbWF0aWMgc3RlcCBzaXplKi9cbiAgc3RlcD86IG51bWJlcjtcbiAgLyoqU3RhcnQgZm9yIHN0ZXAsIHVzZSAwIGZvciBhdXRvbWF0aWMgKi9cbiAgc3RhcnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVN0ZXBwZXJCYXNlT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gbnVtYmVyLFxuPiBleHRlbmRzIEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8SUQsIFJUPiB7XG4gIC8qKndldGhlciB0aGUgZXZlbnRzIGFyZSBsaXZlIGFzIHRoZSBzbGlkZXIgaXMgbW92ZWQgb3Igb25seSB3aGVuIG1vdmluZyBzdG9wcyAqL1xuICBsaXZlPzogYm9vbGVhbjtcbiAgLyoqSWNvbiB0byB1c2UgZm9yIGRlY3JlYXNpbmcgdmFsdWUqL1xuICBpY29uX2RlY3JlYXNlPzogU1ZHRnVuYztcbiAgLyoqSWNvbiB0byB1c2UgZm9yIGluY3JlYXNpbmcgdmFsdWUqL1xuICBpY29uX2luY3JlYXNlPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1OdW1iZXJXcml0ZTxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gbnVtYmVyLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICBzdGF0aWMgYXBwbHlfb3B0aW9uczxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIGVsZW1lbnQ6IEZvcm1OdW1iZXJXcml0ZTxJRCwgUlQ+LFxuICAgIG9wdGlvbnM6IEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8SUQsIFJUPixcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMudW5pdCkgZWxlbWVudC51bml0ID0gb3B0aW9ucy51bml0O1xuICAgIGlmIChvcHRpb25zLmRlY2ltYWxzKSBlbGVtZW50LmRlY2ltYWxzID0gb3B0aW9ucy5kZWNpbWFscztcbiAgICBpZiAob3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCkgZWxlbWVudC5taW4gPSBvcHRpb25zLm1pbjtcbiAgICBpZiAob3B0aW9ucy5tYXggIT09IHVuZGVmaW5lZCkgZWxlbWVudC5tYXggPSBvcHRpb25zLm1heDtcbiAgICBpZiAob3B0aW9ucy5zdGVwKSBlbGVtZW50LnN0ZXAgPSBvcHRpb25zLnN0ZXA7XG4gICAgaWYgKG9wdGlvbnMuc3RhcnQpIGVsZW1lbnQuc3RhcnQgPSBvcHRpb25zLnN0YXJ0O1xuICAgIHN1cGVyLmFwcGx5X29wdGlvbnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipTZXQgdGhlIG1pbmltdW0gdmFsdWUqL1xuICBhYnN0cmFjdCBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXQgdGhlIG1pbmltdW0gdmFsdWUqL1xuICBhYnN0cmFjdCBzZXQgbWF4KG1heDogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXRzIHRoZSBzaXplIG9mIG51bWJlciBjaGFuZ2Ugc3RlcHMqL1xuICBhYnN0cmFjdCBzZXQgc3RlcChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldHMgdGhlIHN0YXJ0IG9mZnNldCBmb3IgbnVtYmVyIHN0ZXBzKi9cbiAgYWJzdHJhY3Qgc2V0IHN0YXJ0KHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0cyB0aGUgYW1vdW50IG9mIGRlY2ltYWxzIHRoZSBlbGVtZW50IGNhbiBoYXZlKi9cbiAgYWJzdHJhY3Qgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXRzIHRoZSB1bml0IG9mIHRoZSBlbGVtZW50Ki9cbiAgYWJzdHJhY3Qgc2V0IHVuaXQodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKTtcblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlTnVtYmVyUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5taW4pXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWluXCIsIHJlbGF0ZWQubWluLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWluXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhcIiwgcmVsYXRlZC5tYXgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhcIik7XG4gICAgaWYgKHJlbGF0ZWQuc3RlcClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJzdGVwXCIsIHJlbGF0ZWQuc3RlcCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInN0ZXBcIik7XG4gICAgaWYgKHJlbGF0ZWQuc3RhcnQpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwic3RhcnRcIiwgcmVsYXRlZC5zdGFydCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInN0YXJ0XCIpO1xuICAgIGlmIChyZWxhdGVkLmRlY2ltYWxzKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcImRlY2ltYWxzXCIsIHJlbGF0ZWQuZGVjaW1hbHMsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJkZWNpbWFsc1wiKTtcbiAgICBpZiAocmVsYXRlZC51bml0KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcInVuaXRcIiwgcmVsYXRlZC51bml0LCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwidW5pdFwiKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQge1xuICBnZXRfY3Vyc29yX3Bvc2l0aW9uLFxuICBzZXRfY3Vyc29yX2VuZCxcbiAgc2V0X2N1cnNvcl9wb3NpdGlvbixcbiAgc2V0X3NlbGVjdGlvbl9hbGwsXG4gIHN5bmNfcmVzb2x2ZSxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQgeyBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItbWF0aFwiO1xuaW1wb3J0IHsgZXJyLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1OdW1iZXJXcml0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vbnVtYmVyX2lucHV0LnNjc3NcIjtcblxuLyoqU2xpZGUgU2VsZWN0b3IsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgc2xpZGVyKi9cbmNsYXNzIE51bWJlcklucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1OdW1iZXJXcml0ZTxJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcIm51bWJlcmlucHV0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNzZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAjdW5pdDogc3RyaW5nID0gXCJcIjtcbiAgI21pbjogbnVtYmVyID0gLUluZmluaXR5O1xuICAjbWF4OiBudW1iZXIgPSBJbmZpbml0eTtcbiAgI3N0ZXA6IG51bWJlciA9IDA7XG4gICNzdGFydDogbnVtYmVyID0gMDtcbiAgI2RlY2ltYWxzOiBudW1iZXIgPSAwO1xuXG4gICN2YWx1ZV9ib3ggPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3VuaXRfYm94ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNsZWdlbmQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjbWF4X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNtaW5fbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiN2YWx1ZV9ib3guY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIGlmIChlLnRhcmdldCAhPT0gdGhpcy4jdmFsdWVfYm94KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy4jdmFsdWVfYm94KTtcbiAgICAgIH0gZWxzZSB0aGlzLiN2YWx1ZV9ib3guZm9jdXMoKTtcbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKHRoaXMuI3NlbGVjdGVkKSByZXR1cm47XG4gICAgICBzZXRfc2VsZWN0aW9uX2FsbCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmJsdXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuI3NldChmYWxzZSk7XG4gICAgICB9LCAwKTtcbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB0aGlzLiNzZXQodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dVcFwiKSB0aGlzLiNzdGVwX3ZhbHVlKHRydWUpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dEb3duXCIpIHRoaXMuI3N0ZXBfdmFsdWUoZmFsc2UpO1xuICAgICAgZWxzZSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gICAgdGhpcy5vbmJlZm9yZWlucHV0ID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmlucHV0VHlwZSA9PT0gXCJpbnNlcnRQYXJhZ3JhcGhcIikgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZWxzZSBpZiAoZS5kYXRhKSB7XG4gICAgICAgIGlmICghL1tcXGQsLi1dL2cudGVzdChlLmRhdGEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKC9bLC5dL2cudGVzdChlLmRhdGEpICYmIHRoaXMuI2RlY2ltYWxzID09PSAwKVxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy4jbWluID49IDAgJiYgLy0vZy50ZXN0KGUuZGF0YSkpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgI3NldChjdXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzZWwgPSBnZXRfY3Vyc29yX3Bvc2l0aW9uKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgY29uc3QgYnVmZiA9IHRoaXMuYnVmZmVyO1xuICAgIChcbiAgICAgIGF3YWl0IHRoaXMuc2V0X3ZhbHVlX2NoZWNrKFxuICAgICAgICBwYXJzZUZsb2F0KHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8ucmVwbGFjZShcIixcIiwgXCIuXCIpIHx8IFwiXCIpIHx8IDAsXG4gICAgICApXG4gICAgKVxuICAgICAgLm1hcF9lcnIoKCkgPT4ge1xuICAgICAgICB0aGlzLm5ld192YWx1ZShidWZmIHx8IE1hdGgubWF4KE1hdGgubWluKDAsIHRoaXMuI21heCksIHRoaXMuI21pbikpO1xuICAgICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKCkgPT4ge1xuICAgICAgICBpZiAoIWN1cikgcmV0dXJuO1xuICAgICAgICBzZXRfY3Vyc29yX3Bvc2l0aW9uKHRoaXMuI3ZhbHVlX2JveCwgc2VsKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZm9jdXMob3B0aW9ucz86IEZvY3VzT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC5mb2N1cyhvcHRpb25zKTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgZGVjaW1hbHMoZGVjOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNkZWNpbWFscyA9IGRlYyB8fCAwO1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWluID0gbWluID8/IC1JbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWluX2xlZ2VuZCgpIHtcbiAgICB0aGlzLiNtaW5fbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21pbiA9PT0gLUluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IFwiTWluOiBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQ7XG4gIH1cblxuICBzZXQgbWF4KG1heDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4ID0gbWF4ID8/IEluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWF4X2xlbmdlbmQoKSB7XG4gICAgdGhpcy4jbWF4X2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtYXggPT09IEluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IFwiTWF4OiBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQ7XG4gIH1cblxuICBzZXQgc3RlcChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGVwID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgc2V0IHN0YXJ0KHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0YXJ0ID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IHZhbC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCh2YWwsIHRoaXMuI21pbiksIHRoaXMuI21heCksXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZShsaW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGlmICh2YWwgPCB0aGlzLiNtaW4pXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNaW5pbXVtIHZhbHVlIFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGlmICh2YWwgPiB0aGlzLiNtYXgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNYXhpbXVtIHZhbHVlIFwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgdmFsLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUobGltKTtcbiAgfVxuXG4gICNzdGVwX3ZhbHVlKGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgdGhpcy4jc3RlcCB8fFxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIHRoaXMuI2RlY2ltYWxzID8gMSAvIHRoaXMuI2RlY2ltYWxzIDogMSxcbiAgICAgICAgTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmJ1ZmZlciB8fCAwKSAvIDE1MCksXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLnNldF92YWx1ZV9jaGVjaygodGhpcy5idWZmZXIgfHwgMCkgKyAoZGlyID8gc3RlcCA6IC1zdGVwKSk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KE51bWJlcklucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fbnVtYmVyX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8SUQ+LFxuKTogTnVtYmVySW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgTnVtYmVySW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBGb3JtTnVtYmVyV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBub25lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlTnVtYmVyUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IHsgdHlwZSBGb3JtTnVtYmVyT3B0aW9ucyB9IGZyb20gXCIuLi9udW1iZXJfYmFzZVwiO1xuaW1wb3J0IFwiLi9wcm9ncmVzcy5zY3NzXCI7XG5cbmV4cG9ydCBjbGFzcyBGb3JtUHJvZ3Jlc3M8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlPFxuICBudW1iZXIsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJwcm9ncmVzc1wiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbWluOiBudW1iZXIgPSAwO1xuICAjbWF4OiBudW1iZXIgPSAxMDA7XG4gICNzcGFuOiBudW1iZXIgPSAxMDA7XG4gICNkZWNpbWFsczogbnVtYmVyID0gMDtcbiAgI2JhcjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjdmFsOiBIVE1MU3BhbkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3VuaXQ6IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIHNldCBtaW4obWluOiBudW1iZXIpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW47XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIHNldCBtYXgobWF4OiBudW1iZXIpIHtcbiAgICB0aGlzLiNtYXggPSBtYXg7XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGFtb3VudCBvZiBkZWNpbWFscyB0aGUgZWxlbWVudCBjYW4gaGF2ZSovXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gTWF0aC5tYXgoZGVjID8/IDAsIDApO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgdW5pdCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQudGV4dENvbnRlbnQgPSB1bml0ID8/IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLiNiYXIuc3R5bGUud2lkdGggPVxuICAgICAgTWF0aC5taW4oTWF0aC5tYXgoKCh2YWx1ZSAtIHRoaXMuI21pbikgLyB0aGlzLiNzcGFuKSAqIDEwMCwgMCksIDEwMCkgK1xuICAgICAgXCIlXCI7XG4gICAgdGhpcy4jdmFsLnRleHRDb250ZW50ID0gdmFsdWUudG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jYmFyLnN0eWxlLndpZHRoID0gXCIwJVwiO1xuICAgIHRoaXMuI3ZhbC50ZXh0Q29udGVudCA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlTnVtYmVyUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5taW4pXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWluXCIsIHJlbGF0ZWQubWluLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWluXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhcIiwgcmVsYXRlZC5tYXgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhcIik7XG4gICAgaWYgKHJlbGF0ZWQuZGVjaW1hbHMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwiZGVjaW1hbHNcIiwgcmVsYXRlZC5kZWNpbWFscywgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcImRlY2ltYWxzXCIpO1xuICAgIGlmIChyZWxhdGVkLnVuaXQpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwidW5pdFwiLCByZWxhdGVkLnVuaXQsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJ1bml0XCIpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtUHJvZ3Jlc3MpO1xuXG4vKipDcmVhdGVzIGEgcHJvZ3Jlc3MgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9wcm9ncmVzczxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtTnVtYmVyT3B0aW9uczxJRD4sXG4pOiBGb3JtUHJvZ3Jlc3M8SUQ+IHtcbiAgY29uc3QgcHJvZyA9IG5ldyBGb3JtUHJvZ3Jlc3M8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubWluICE9PSBcInVuZGVmaW5lZFwiKSBwcm9nLm1pbiA9IG9wdGlvbnMubWluO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5tYXggIT09IFwidW5kZWZpbmVkXCIpIHByb2cubWF4ID0gb3B0aW9ucy5tYXg7XG4gICAgcHJvZy5kZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgcHJvZy51bml0ID0gb3B0aW9ucy51bml0O1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKHByb2csIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBwcm9nO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzeW5jX3Jlc29sdmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7XG4gIG1hdGVyaWFsX2NvbnRlbnRfYWRkX3JvdW5kZWQsXG4gIG1hdGVyaWFsX2NvbnRlbnRfcmVtb3ZlX3JvdW5kZWQsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWljb25zXCI7XG5pbXBvcnQgeyBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItbWF0aFwiO1xuaW1wb3J0IHsgZXJyLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQgeyBGb3JtTnVtYmVyV3JpdGUsIHR5cGUgRm9ybVN0ZXBwZXJCYXNlT3B0aW9ucyB9IGZyb20gXCIuLi9udW1iZXJfYmFzZVwiO1xuaW1wb3J0IFwiLi9zbGlkZXIuc2Nzc1wiO1xuXG4vKipTbGlkZSBTZWxlY3RvciwgZGlzcGxheXMgYWxsIG9wdGlvbnMgaW4gYSBzbGlkZXIqL1xuZXhwb3J0IGNsYXNzIEZvcm1TbGlkZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPFxuICBJRCxcbiAgbnVtYmVyXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzbGlkZXJcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3VuaXQ6IHN0cmluZyA9IFwiXCI7XG4gICNkZWNpbWFsczogbnVtYmVyID0gMDtcbiAgI21pbjogbnVtYmVyID0gLUluZmluaXR5O1xuICAjbWF4OiBudW1iZXIgPSBJbmZpbml0eTtcbiAgI3NwYW46IG51bWJlciA9IEluZmluaXR5O1xuICAjc3RlcDogbnVtYmVyID0gMDtcbiAgI3N0YXJ0OiBudW1iZXIgPSAwO1xuICAjbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAjaWNvbl9kZWMgPSB0aGlzLiNzdGVwcGVyX2Z1bmMoXG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9jb250ZW50X3JlbW92ZV9yb3VuZGVkKCkpLFxuICAgIGZhbHNlLFxuICApO1xuICAjc2xpZGUgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjbGVnZW5kID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNsZWZ0X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNyaWdodF9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjaWNvbl9pbmMgPSB0aGlzLiNzdGVwcGVyX2Z1bmMoXG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9jb250ZW50X2FkZF9yb3VuZGVkKCkpLFxuICAgIHRydWUsXG4gICk7XG4gICNzbGlkZXIgPSB0aGlzLiNzbGlkZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI3ZhbHVlX2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLiNzbGlkZXIuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcblxuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcIm1vdXNlXCIgJiYgIXRoaXMuI3NsaWRlci5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuI3NsaWRlci5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgY29uc3QgYm94ID0gdGhpcy4jc2xpZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy4jc2xpZGVyLmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpXG4gICAgICAgID8gZS5jbGllbnRYID49IGJveC54XG4gICAgICAgICAgPyBlLmNsaWVudFggPD0gYm94LnggKyBib3gud2lkdGhcbiAgICAgICAgICAgID8gYm94LnggLSBlLmNsaWVudFhcbiAgICAgICAgICAgIDogLWJveC53aWR0aFxuICAgICAgICAgIDogMFxuICAgICAgICA6IC1ib3gud2lkdGggLyAyO1xuICAgICAgaWYgKHRoaXMuI21pbiA9PT0gLUluZmluaXR5IHx8IHRoaXMuI21heCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5idWZmZXIgfHwgMDtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gKHZhbHVlICs9IGRpZmYgLyA1MCk7XG4gICAgICAgICAgaWYgKHRoaXMuI2xpdmUpXG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsKSkubWFwKCh2KSA9PiAodmFsdWUgPSB2KSk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5saW1pdF92YWx1ZSh2YWwpKS5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy4jbW92ZV92YWx1ZSh2KTtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgICBsZXQgZGlmZiA9IHRoaXMuI3hfdG9fcGVyYyhlLmNsaWVudFggKyBvZmZzZXQpIC0gNTA7XG4gICAgICAgIHRoaXMuI21vdmVfc2xpZGUodGhpcy4jeF90b19wZXJjKGUuY2xpZW50WCArIG9mZnNldCkpO1xuICAgICAgICB0aGlzLiNzbGlkZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGNvbnN0IHBlcmMgPSB0aGlzLiN4X3RvX3BlcmMoZXYuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgICAgZGlmZiA9ICh0aGlzLiNzdGVwIHx8IDEpICogKChwZXJjIC0gNTApICogMik7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZShwZXJjKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZSg1MCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmJ1ZmZlciB8fCAwO1xuICAgICAgICB0aGlzLiNtb3ZlX2Fic29sdXRlKGUuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJtb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jc2xpZGUub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIpIHRoaXMuI3N0ZXBfdmFsdWUodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikgdGhpcy4jc3RlcF92YWx1ZShmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZWdlbmQoKTtcbiAgfVxuXG4gIHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW4gPz8gLUluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbWF4KCk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21pbl9sZWdlbmQoKSB7XG4gICAgdGhpcy4jbGVmdF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWluID09PSAtSW5maW5pdHlcbiAgICAgICAgPyBcIlwiXG4gICAgICAgIDogXCJNaW46IFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdDtcbiAgfVxuXG4gIHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXggPSBtYXggPz8gSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9tYXgoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgI3VwZGF0ZV9tYXhfbGVnZW5kKCkge1xuICAgIHRoaXMuI3JpZ2h0X2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtYXggPT09IEluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQgKyBcIiA6TWF4XCI7XG4gIH1cblxuICAjdXBkYXRlX21pbl9tYXgoKSB7XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgICBpZiAodGhpcy4jc3BhbiA9PT0gSW5maW5pdHkpIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICAgIGVsc2UgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gZGVjIHx8IDA7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RlcCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGFydCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIC8qKlNldCB3ZXRoZXIgdGhlIHNsaWRlciBpcyBpbiBsaXZlIG1vZGUqL1xuICBzZXQgbGl2ZShsaXZlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbGl2ZSA9IGxpdmUgfHwgZmFsc2U7XG4gIH1cblxuICBzZXQgaWNvbl9kZWNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2RlYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICAgICAgaWNvbiA/IGljb24oKSA6IG1hdGVyaWFsX2NvbnRlbnRfcmVtb3ZlX3JvdW5kZWQoKSxcbiAgICAgICAgZmFsc2UsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBzZXQgaWNvbl9pbmNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2luYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfY29udGVudF9hZGRfcm91bmRlZCgpLCB0cnVlKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy4jbW92ZV92YWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy4jbW92ZV9zbGlkZShcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KCgoLXRoaXMuI21pbiArIHZhbHVlKSAvIHRoaXMuI3NwYW4pICogMTAwLCAwKSwgMTAwKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgdGhpcy4jbW92ZV9zbGlkZSg1MCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCh2YWwsIHRoaXMuI21pbiksIHRoaXMuI21heCksXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZShsaW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGlmICh2YWwgPCB0aGlzLiNtaW4pXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNaW5pbXVtIHZhbHVlIFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGlmICh2YWwgPiB0aGlzLiNtYXgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNYXhpbXVtIHZhbHVlIFwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgdmFsLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUobGltKTtcbiAgfVxuXG4gIGFzeW5jICNtb3ZlX2Fic29sdXRlKHg6IG51bWJlciwgbGFzdD86IG51bWJlcikge1xuICAgIGNvbnN0IHBlcmMgPSB0aGlzLiN4X3RvX3BlcmMoeCk7XG4gICAgaWYgKHRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2xpbWl0KHRoaXMuI3BlcmNfdG9fdmFsdWUocGVyYykpO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMubGltaXRfdmFsdWUodGhpcy4jcGVyY190b192YWx1ZShwZXJjKSk7XG4gICAgICAgIGlmICh2YWx1ZS5vaykge1xuICAgICAgICAgIHRoaXMuI21vdmVfc2xpZGUoKCgtdGhpcy4jbWluICsgdmFsdWUudmFsdWUpIC8gdGhpcy4jc3BhbikgKiAxMDApO1xuICAgICAgICAgIHRoaXMuI21vdmVfdmFsdWUodmFsdWUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldF92YWx1ZV9saW1pdCh0aGlzLiNwZXJjX3RvX3ZhbHVlKHBlcmMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAjeF90b19wZXJjKHg6IG51bWJlcikge1xuICAgIGNvbnN0IGJveCA9IHRoaXMuI3NsaWRlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICgoeCAtIGJveC54KSAvIGJveC53aWR0aCkgKiAxMDApKTtcbiAgfVxuXG4gICNwZXJjX3RvX3ZhbHVlKHBlcmM6IG51bWJlcikge1xuICAgIHJldHVybiAocGVyYyAvIDEwMCkgKiB0aGlzLiNzcGFuICsgdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqQXR0YWNoZXMgY2xpY2sgYWN0aW9uIHRvIG92ZXIgdGltZSBpbmNyZWFzZSBzcGVlZCBvZiBzdGVwcGluZyB3aGVuIGhvbGRpbmcgc3RlcCBidXR0b25zICovXG4gICNzdGVwcGVyX2Z1bmMoaWNvbjogU1ZHU1ZHRWxlbWVudCwgZGlyOiBib29sZWFuKSB7XG4gICAgaWNvbi5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBsZXQgaW50ZXJ2YWwgPSAwO1xuICAgICAgICBsZXQgc2NhbGVyX2ludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlciA9IDI1MDtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9ICgpID0+IHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICBjbGVhckludGVydmFsKHNjYWxlcl9pbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIGljb24ub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgICAgIGljb24ucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgICBpY29uLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgIH07XG4gICAgICAgIGljb24uc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICBpY29uLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgc2NhbGVyX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjYWxlciA+IDIwKSBzY2FsZXIgLz0gMS4xO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHRoaXMuI3N0ZXBfdmFsdWUoZGlyKSwgc2NhbGVyKTtcbiAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgaWNvbi5vbnBvaW50ZXJ1cCA9ICgpID0+IHtcbiAgICAgICAgICBpZiAoaW50ZXJ2YWwgPT09IDApIHRoaXMuI3N0ZXBfdmFsdWUoZGlyKTtcbiAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gaWNvbjtcbiAgfVxuXG4gICNzdGVwX3ZhbHVlKGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgdGhpcy4jc3RlcCB8fFxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIHRoaXMuI2RlY2ltYWxzID8gMSAvIHRoaXMuI2RlY2ltYWxzIDogMSxcbiAgICAgICAgTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmJ1ZmZlciB8fCAwKSAvIDE1MCksXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLnNldF92YWx1ZV9jaGVjaygodGhpcy5idWZmZXIgfHwgMCkgKyAoZGlyID8gc3RlcCA6IC1zdGVwKSk7XG4gIH1cblxuICAjbW92ZV9zbGlkZShwZXJjOiBudW1iZXIpIHtcbiAgICB0aGlzLiNzbGlkZXIuc3R5bGUubGVmdCA9IHBlcmMgKyBcIiVcIjtcbiAgfVxuICAjbW92ZV92YWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gdmFsdWUudG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1TbGlkZXIpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9zbGlkZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVN0ZXBwZXJCYXNlT3B0aW9uczxJRD4sXG4pOiBGb3JtU2xpZGVyPElEPiB7XG4gIGNvbnN0IHNsaWRlID0gbmV3IEZvcm1TbGlkZXI8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5saXZlKSBzbGlkZS5saXZlID0gb3B0aW9ucy5saXZlO1xuICAgIGlmIChvcHRpb25zLmljb25fZGVjcmVhc2UpIHNsaWRlLmljb25fZGVjcmVhc2UgPSBvcHRpb25zLmljb25fZGVjcmVhc2U7XG4gICAgaWYgKG9wdGlvbnMuaWNvbl9pbmNyZWFzZSkgc2xpZGUuaWNvbl9pbmNyZWFzZSA9IG9wdGlvbnMuaWNvbl9pbmNyZWFzZTtcbiAgICBGb3JtTnVtYmVyV3JpdGUuYXBwbHlfb3B0aW9ucyhzbGlkZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHNsaWRlO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzbGVlcCwgc3luY19yZXNvbHZlIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQge1xuICBtYXRlcmlhbF9jb250ZW50X2FkZF9yb3VuZGVkLFxuICBtYXRlcmlhbF9jb250ZW50X3JlbW92ZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vc3RlcHBlci5zY3NzXCI7XG5cbi8qKlNsaWRlIFNlbGVjdG9yLCBkaXNwbGF5cyBhbGwgb3B0aW9ucyBpbiBhIHNsaWRlciovXG5leHBvcnQgY2xhc3MgRm9ybVN0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPFxuICBJRCxcbiAgbnVtYmVyXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzdGVwcGVyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzdGVwOiBudW1iZXIgPSAwO1xuICAjc3RhcnQ6IG51bWJlciA9IDA7XG4gICNsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gICNpY29uX2RlYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX2NvbnRlbnRfcmVtb3ZlX3JvdW5kZWQoKSksXG4gICAgZmFsc2UsXG4gICk7XG4gICN0ZXh0ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uX2luYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX2NvbnRlbnRfYWRkX3JvdW5kZWQoKSksXG4gICAgdHJ1ZSxcbiAgKTtcbiAgI3ZhbHVlX2JveCA9IHRoaXMuI3RleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjdW5pdF9ib3ggPSB0aGlzLiN0ZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI2xlZ2VuZCA9IHRoaXMuI3RleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbWF4X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNtaW5fbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcblxuICAgIHRoaXMuI3ZhbHVlX2JveC5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICBsZXQgZHJhZ19ibG9ja2VyID0gZmFsc2U7XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uZm9jdXMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBkcmFnX2Jsb2NrZXIgPSB0cnVlO1xuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uYmx1ciA9IGFzeW5jICgpID0+IHtcbiAgICAgIGRyYWdfYmxvY2tlciA9IGZhbHNlO1xuICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhcbiAgICAgICAgcGFyc2VGbG9hdCh0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQ/LnJlcGxhY2UoXCIsXCIsIFwiLlwiKSB8fCBcIlwiKSB8fCAwLFxuICAgICAgKTtcbiAgICB9O1xuICAgIGxldCByZXNldCA9ICgpID0+IHt9O1xuICAgIHRoaXMuI3RleHQub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDAgJiYgKGUudGFyZ2V0ICE9PSB0aGlzLiN2YWx1ZV9ib3ggfHwgIWRyYWdfYmxvY2tlcikpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29uc3QgaW5pdGlhbF92YWwgPSB0aGlzLmJ1ZmZlciB8fCAwO1xuICAgICAgICBsZXQgbW92aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI3RleHQuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiN0ZXh0Lm9ucG9pbnRlcm1vdmUgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBpZiAobW92aW5nKSB7XG4gICAgICAgICAgICB0aGlzLiNtb3ZlX2RpZmYoXG4gICAgICAgICAgICAgIGluaXRpYWxfdmFsICsgKChldi5jbGllbnRYIC0gZS5jbGllbnRYKSAvIDEwKSAqICh0aGlzLiNzdGVwIHx8IDEpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGUuY2xpZW50WCAtIGV2LmNsaWVudFgpID4gNSkge1xuICAgICAgICAgICAgdGhpcy4jdmFsdWVfYm94LmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIG1vdmluZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXNldCA9ICgpID0+IHtcbiAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3guY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgdGhpcy4jdGV4dC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICAgIHRoaXMuI3RleHQub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3RleHQub25wb2ludGVydXAgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgIGlmICghbW92aW5nICYmIGUudGFyZ2V0ICE9PSB0aGlzLiN2YWx1ZV9ib3gpIHtcbiAgICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5mb2N1cygpO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih0aGlzLiN2YWx1ZV9ib3guZmlyc3RDaGlsZCEpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5vd25lckRvY3VtZW50Py5kZWZhdWx0Vmlldz8uZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG1vdmluZykge1xuICAgICAgICAgICAgdGhpcy4jbW92ZV9kaWZmKFxuICAgICAgICAgICAgICBpbml0aWFsX3ZhbCArICgoZXYuY2xpZW50WCAtIGUuY2xpZW50WCkgLyAxMCkgKiAodGhpcy4jc3RlcCB8fCAxKSxcbiAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIgfHwgZS5rZXkgPT09IFwiQXJyb3dMZWZ0XCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLiNzdGVwX3ZhbHVlKGUua2V5ID09PSBcIkFycm93UmlnaHRcIik7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHJlc2V0KSByZXNldCgpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGhpcy4jdmFsdWVfYm94ICYmXG4gICAgICAgICAgL1tcXGQsLi1dL2cudGVzdChlLmtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3guZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikgdGhpcy4jdmFsdWVfYm94LmJsdXIoKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIiB8fCBlLmtleSA9PT0gXCJBcnJvd0xlZnRcIilcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmJlZm9yZWlucHV0ID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmlucHV0VHlwZSA9PT0gXCJpbnNlcnRQYXJhZ3JhcGhcIikgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGUuZGF0YSkge1xuICAgICAgICBpZiAoIS9bXFxkLC4tXS9nLnRlc3QoZS5kYXRhKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlbHNlIGlmICgvWywuXS9nLnRlc3QoZS5kYXRhKSAmJiB0aGlzLiNkZWNpbWFscyA9PT0gMClcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICh0aGlzLiNtaW4gPj0gMCAmJiAvLS9nLnRlc3QoZS5kYXRhKSkgfHxcbiAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQ/LmluY2x1ZGVzKFwiLVwiKVxuICAgICAgICApXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXQgdW5pdCh1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiN1bml0ID0gdW5pdCB8fCBcIlwiO1xuICAgIHRoaXMuI3VuaXRfYm94LnRleHRDb250ZW50ID0gdGhpcy4jdW5pdDtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG5cbiAgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZGVjaW1hbHMgPSBkZWMgfHwgMDtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG5cbiAgc2V0IG1pbihtaW46IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21pbiA9IG1pbiA/PyAtSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21pbl9sZWdlbmQoKSB7XG4gICAgdGhpcy4jbWluX2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtaW4gPT09IC1JbmZpbml0eVxuICAgICAgICA/IFwiXCJcbiAgICAgICAgOiBcIk1pbjogXCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0O1xuICB9XG5cbiAgc2V0IG1heChtYXg6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heCA9IG1heCA/PyBJbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21heF9sZW5nZW5kKCkge1xuICAgIHRoaXMuI21heF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWF4ID09PSBJbmZpbml0eVxuICAgICAgICA/IFwiXCJcbiAgICAgICAgOiBcIk1heDogXCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0O1xuICB9XG5cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RlcCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGFydCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIC8qKlNldCB3ZXRoZXIgdGhlIHNsaWRlciBpcyBpbiBsaXZlIG1vZGUqL1xuICBzZXQgbGl2ZShsaXZlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbGl2ZSA9IGxpdmUgfHwgZmFsc2U7XG4gIH1cblxuICBzZXQgaWNvbl9kZWNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2RlYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICAgICAgaWNvbiA/IGljb24oKSA6IG1hdGVyaWFsX2NvbnRlbnRfcmVtb3ZlX3JvdW5kZWQoKSxcbiAgICAgICAgZmFsc2UsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBzZXQgaWNvbl9pbmNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2luYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfY29udGVudF9hZGRfcm91bmRlZCgpLCB0cnVlKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy4jbW92ZV92YWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KHZhbCwgdGhpcy4jbWluKSwgdGhpcy4jbWF4KSxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKGxpbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgaWYgKHZhbCA8IHRoaXMuI21pbilcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1pbmltdW0gdmFsdWUgXCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgaWYgKHZhbCA+IHRoaXMuI21heClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1heGltdW0gdmFsdWUgXCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICB2YWwsXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZShsaW0pO1xuICB9XG5cbiAgLyoqTW92ZXMgdGhlIHZhbHVlIHRvIGEgcG9zaXRpb24gYnkgdGhlIG1vdXNlIHggY29vcmRpbmF0ZXMqL1xuICBhc3luYyAjbW92ZV9kaWZmKHZhbHVlOiBudW1iZXIsIGxhc3Q6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgZWxzZSB7XG4gICAgICBpZiAobGFzdCkgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsdWUpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpbSA9IGF3YWl0IHRoaXMubGltaXRfdmFsdWUodmFsdWUpO1xuICAgICAgICBpZiAobGltLm9rKSB0aGlzLiNtb3ZlX3ZhbHVlKGxpbS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqTW92ZXMgdGhlIHNsaWRlciB0byB0aGUgZ2l2ZW4gcGVyY2VudCBwb3NpdGlvbiovXG4gICNtb3ZlX3ZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSB2YWx1ZS50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIC8qKkF0dGFjaGVzIGNsaWNrIGFjdGlvbiB0byBvdmVyIHRpbWUgaW5jcmVhc2Ugc3BlZWQgb2Ygc3RlcHBpbmcgd2hlbiBob2xkaW5nIHN0ZXAgYnV0dG9ucyAqL1xuICAjc3RlcHBlcl9mdW5jKGljb246IFNWR1NWR0VsZW1lbnQsIGRpcjogYm9vbGVhbikge1xuICAgIGljb24ub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbGV0IGludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlcl9pbnRlcnZhbCA9IDA7XG4gICAgICAgIGxldCBzY2FsZXIgPSAyNTA7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzY2FsZXJfaW50ZXJ2YWwpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBpY29uLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICBpY29uLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWNvbi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpY29uLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc3RlcF92YWx1ZShkaXIpO1xuICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy4jc3RlcF92YWx1ZShkaXIpLCBzY2FsZXIpO1xuICAgICAgICAgIHNjYWxlcl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzY2FsZXIgPiAyMCkgc2NhbGVyIC89IDEuMTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGljb24ub25wb2ludGVydXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGludGVydmFsID09PSAwKSB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGljb247XG4gIH1cblxuICAjc3RlcF92YWx1ZShkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdGVwID1cbiAgICAgIHRoaXMuI3N0ZXAgfHxcbiAgICAgIE1hdGgubWF4KFxuICAgICAgICB0aGlzLiNkZWNpbWFscyA/IDEgLyB0aGlzLiNkZWNpbWFscyA6IDEsXG4gICAgICAgIE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5idWZmZXIgfHwgMCkgLyAxNTApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXRfdmFsdWVfY2hlY2soKHRoaXMuYnVmZmVyIHx8IDApICsgKGRpciA/IHN0ZXAgOiAtc3RlcCkpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3RlcHBlcik7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVN0ZXBwZXJCYXNlT3B0aW9uczxJRD4sXG4pOiBGb3JtU3RlcHBlcjxJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtU3RlcHBlcjxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmxpdmUpIHNsaWRlLmxpdmUgPSBvcHRpb25zLmxpdmU7XG4gICAgaWYgKG9wdGlvbnMuaWNvbl9kZWNyZWFzZSkgc2xpZGUuaWNvbl9kZWNyZWFzZSA9IG9wdGlvbnMuaWNvbl9kZWNyZWFzZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2luY3JlYXNlKSBzbGlkZS5pY29uX2luY3JlYXNlID0gb3B0aW9ucy5pY29uX2luY3JlYXNlO1xuICAgIEZvcm1OdW1iZXJXcml0ZS5hcHBseV9vcHRpb25zKHNsaWRlLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gc2xpZGU7XG59XG4iLCJpbXBvcnQgeyBzb21lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgc3RhdGUsIHsgdHlwZSBTdGF0ZUVudW1SZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi9iYXNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVNlbGVjdG9yT3B0aW9uPFJUPiB7XG4gIC8qKlZhbHVlIHRvIHNldCB3aGVuIG9wdGlvbiBpcyBzZWxlY3RlZCAqL1xuICB2YWx1ZTogUlQ7XG4gIC8qKlRleHQgZm9yIHNlbGVjdGlvbiAqL1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKkljb24gdG8gZGlzcGxheSBmb3Igb3B0aW9uKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8XG4gIFQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqT3B0aW9ucyBmb3Igc2VsZWN0b3IqL1xuICBzZWxlY3Rpb25zPzogRm9ybVNlbGVjdG9yT3B0aW9uPFQ+W107XG59XG5cbi8qKkJhc2UgZm9yIG51bWJlciBlbGVtZW50cyBlbGVtZW50cyovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybVNlbGVjdG9yQmFzZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICAvKipTZXRzIHRoZSBzZWxlY3Rpb24gb3B0aW9ucyBmb3IgdGhlIHNlbGVjdG9yICovXG4gIGFic3RyYWN0IHNldCBzZWxlY3Rpb25zKHNlbGVjdGlvbnM6IEZvcm1TZWxlY3Rvck9wdGlvbjxSVD5bXSB8IHVuZGVmaW5lZCk7XG5cbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtU2VsZWN0b3JCYXNlPFJULCBJRD4sXG4gICAgb3B0aW9uczogRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPixcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMuc2VsZWN0aW9ucykgZWxlbWVudC5zZWxlY3Rpb25zID0gb3B0aW9ucy5zZWxlY3Rpb25zO1xuICAgIHN1cGVyLmFwcGx5X29wdGlvbnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlRW51bVJlbGF0ZWQ+KTogdm9pZCB7XG4gICAgaWYgKHJlbGF0ZWQubGlzdCkge1xuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcF9tYXAoXG4gICAgICAgIFwic2VsZWN0aW9uc1wiLFxuICAgICAgICByZWxhdGVkLmxpc3QsXG4gICAgICAgICgpID0+IHNvbWUoW10pLFxuICAgICAgICAodmFsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNvbWUoXG4gICAgICAgICAgICBzdGF0ZS5lLm1hcCh2YWwsIChrZXksIHZhbCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRleHQ6IHZhbC5uYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXkgYXMgUlQsXG4gICAgICAgICAgICAgICAgaWNvbjogdmFsLmljb24sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2UsIGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfbmF2aWdhdGlvbl9jbG9zZV9yb3VuZGVkLFxuICBtYXRlcmlhbF9uYXZpZ2F0aW9uX3VuZm9sZF9sZXNzX3JvdW5kZWQsXG4gIG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX21vcmVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHtcbiAgRm9ybVNlbGVjdG9yQmFzZSxcbiAgdHlwZSBGb3JtU2VsZWN0b3JCYXNlT3B0aW9ucyxcbiAgdHlwZSBGb3JtU2VsZWN0b3JPcHRpb24sXG59IGZyb20gXCIuLi9zZWxlY3Rvcl9iYXNlXCI7XG5pbXBvcnQgXCIuL2Ryb3BfZG93bi5zY3NzXCI7XG5cbmludGVyZmFjZSBTZWxPcHRpb25zIHtcbiAgdGV4dDogc3RyaW5nO1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtRHJvcERvd25PcHRpb25zPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKkRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQqL1xuICBkZWZhdWx0Pzogc3RyaW5nO1xuICAvKipEZWZhdWx0IGljb24gZGlzcGxheWVkKi9cbiAgZGVmYXVsdF9pY29uPzogU1ZHRnVuYztcbn1cblxuLyoqRHJvcGRvd24gYm94IGZvciBzZWxlY3RpbmcgYmV0d2VlbiBtdWx0aXBsZSBjaG9pY2VzIGluIGEgc21hbGwgc3BhY2UqL1xuZXhwb3J0IGNsYXNzIEZvcm1Ecm9wZG93bjxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1TZWxlY3RvckJhc2U8UlQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiZHJvcGRvd25cIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI21hcDogTWFwPFJULCBTZWxPcHRpb25zPiA9IG5ldyBNYXAoKTtcbiAgI3ZhbHVlczogUlRbXSA9IFtdO1xuICAjc2VsZWN0ZWQ6IG51bWJlciA9IC0xO1xuXG4gICNpY29uPzogU1ZHU1ZHRWxlbWVudDtcbiAgI3RleHQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI29wZW46IFNWR1NWR0VsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKFxuICAgIG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX21vcmVfcm91bmRlZCgpLFxuICApO1xuICAjZGVmYXVsdDogVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiU2VsZWN0IHNvbWV0aGluZ1wiKTtcbiAgI2RlZmF1bHRfaWNvbj86IFNWR0Z1bmM7XG4gIHByaXZhdGUgaXNfb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy4jdGV4dC5hcHBlbmQodGhpcy4jZGVmYXVsdCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMudGFiSW5kZXggPSAwO1xuICAgIHRoaXMub25jbGljayA9ICgpID0+ICh0aGlzLm9wZW4gPSB0cnVlKTtcbiAgICB0aGlzLm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUucG9pbnRlclR5cGUgPT09IFwibW91c2VcIikge1xuICAgICAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jc2VsZWN0X2FkamFjZW50KGUua2V5ID09PSBcIkFycm93RG93blwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqR2V0cyB0aGUgZGVmYXVsdCB0ZXh0IGRpc3BsYXllZCB3aGVuIG5vdGhpbmcgaGFzIGJlZW4gc2VsZWN0ZWQgeWV0ICovXG4gIGdldCBkZWZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLiNkZWZhdWx0Lm5vZGVWYWx1ZSB8fCBcIlwiO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgZGVmYXVsdCB0ZXh0IGRpc3BsYXllZCB3aGVuIG5vdGhpbmcgaGFzIGJlZW4gc2VsZWN0ZWQgeWV0ICovXG4gIHNldCBkZWZhdWx0KGRlZjogc3RyaW5nKSB7XG4gICAgdGhpcy4jZGVmYXVsdC5ub2RlVmFsdWUgPSBkZWY7XG4gIH1cblxuICAvKipTZXRzIHRoZSBkZWZhdWx0IHRleHQgZGlzcGxheWVkIHdoZW4gbm90aGluZyBoYXMgYmVlbiBzZWxlY3RlZCB5ZXQgKi9cbiAgc2V0IGRlZmF1bHRfaWNvbihkZWY6IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNkZWZhdWx0X2ljb24gPSBkZWY7XG4gICAgaWYgKGRlZiAmJiB0aGlzLiNzZWxlY3RlZCA9PT0gLTEpIHRoaXMuI3NldF9pY29uID0gZGVmO1xuICB9XG5cbiAgc2V0IHNlbGVjdGlvbnMoc2VsZWN0aW9uczogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPltdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuI21hcC5zaXplID4gMCkge1xuICAgICAgdGhpcy4jbWFwLmNsZWFyKCk7XG4gICAgICB0aGlzLiN2YWx1ZXMgPSBbXTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gLTE7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBzZWxlY3Rpb25zICYmIGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCB0ZXh0LCBpY29uIH0gPSBzZWxlY3Rpb25zW2ldO1xuICAgICAgdGhpcy4jbWFwLnNldCh2YWx1ZSwgeyB0ZXh0LCBpY29uIH0pO1xuICAgICAgdGhpcy4jdmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICB9XG5cbiAgc2V0IG9wZW4ob3BlbjogYm9vbGVhbikge1xuICAgIGlmIChvcGVuICYmICF0aGlzLmlzX29wZW4pIHtcbiAgICAgIHRoaXMuI29wZW4ucmVwbGFjZUNoaWxkcmVuKG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX2xlc3Nfcm91bmRlZCgpKTtcbiAgICAgIGJveC5vcGVuX21lbnUodGhpcy4jbWFwLCB0aGlzLCB0aGlzLmJ1ZmZlcik7XG4gICAgfSBlbHNlIGlmICghb3BlbiAmJiB0aGlzLmlzX29wZW4pIHtcbiAgICAgIHRoaXMuI29wZW4ucmVwbGFjZUNoaWxkcmVuKG1hdGVyaWFsX25hdmlnYXRpb25fdW5mb2xkX21vcmVfcm91bmRlZCgpKTtcbiAgICAgIGJveC5jbG9zZV9tZW51KCk7XG4gICAgfVxuICAgIHRoaXMuaXNfb3BlbiA9IG9wZW47XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBidXR0b24qL1xuICBzZXQgI3NldF9pY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikge1xuICAgICAgY29uc3QgaSA9IGljb24oKTtcbiAgICAgIGlmICh0aGlzLiNpY29uKSB0aGlzLnJlcGxhY2VDaGlsZChpLCB0aGlzLiNpY29uKTtcbiAgICAgIGVsc2UgdGhpcy5pbnNlcnRCZWZvcmUoaSwgdGhpcy4jdGV4dCk7XG4gICAgICB0aGlzLiNpY29uID0gaTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2ljb24pIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy4jaWNvbik7XG4gICAgICB0aGlzLiNpY29uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlNlbGVjdHMgdGhlIHByZXZpb3VzIG9yIG5leHQgc2VsZWN0aW9uIGluIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBkaXIgZmFsc2UgaXMgbmV4dCB0cnVlIGlzIHByZXZpb3VzKi9cbiAgI3NlbGVjdF9hZGphY2VudChkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB5ID0gTWF0aC5taW4oXG4gICAgICB0aGlzLiN2YWx1ZXMubGVuZ3RoIC0gMSxcbiAgICAgIE1hdGgubWF4KDAsIGRpciA/IHRoaXMuI3NlbGVjdGVkICsgMSA6IHRoaXMuI3NlbGVjdGVkIC0gMSksXG4gICAgKTtcbiAgICBpZiAoeSAhPT0gdGhpcy4jc2VsZWN0ZWQpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMuI3ZhbHVlc1t5XSk7XG4gIH1cblxuICAjY2xlYXIoKSB7XG4gICAgdGhpcy5kZWZhdWx0X2ljb24gPSB0aGlzLiNkZWZhdWx0X2ljb25cbiAgICAgID8gKHRoaXMuI3NldF9pY29uID0gdGhpcy4jZGVmYXVsdF9pY29uKVxuICAgICAgOiAodGhpcy4jc2V0X2ljb24gPSB1bmRlZmluZWQpO1xuICAgIHRoaXMuI3RleHQucmVwbGFjZUNoaWxkcmVuKHRoaXMuI2RlZmF1bHQpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gVmFsdWUgaXMgY2hhbmdlZCAqL1xuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBSVCkge1xuICAgIGlmICghdGhpcy4jbWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuI2NsZWFyKCk7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IC0xO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSB0aGlzLiNtYXAuZ2V0KHZhbHVlKSE7XG4gICAgdGhpcy4jdGV4dC5pbm5lclRleHQgPSBvcHQudGV4dDtcbiAgICB0aGlzLiNzZWxlY3RlZCA9IHRoaXMuI3ZhbHVlcy5pbmRleE9mKHZhbHVlKTtcbiAgICBpZiAob3B0Lmljb24pIHRoaXMuI3NldF9pY29uID0gb3B0Lmljb247XG4gICAgZWxzZSB0aGlzLiNzZXRfaWNvbiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNjbGVhcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3VwZXIud2FybihtZXNzYWdlKTtcbiAgICB9LCAwKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybURyb3Bkb3duKTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fZHJvcGRvd248UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1Ecm9wRG93bk9wdGlvbnM8UlQsIElEPixcbik6IEZvcm1Ecm9wZG93bjxSVCwgSUQ+IHtcbiAgY29uc3QgZHJvcCA9IG5ldyBGb3JtRHJvcGRvd248UlQsIElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdCkgZHJvcC5kZWZhdWx0ID0gb3B0aW9ucy5kZWZhdWx0O1xuICAgIGlmIChvcHRpb25zLmRlZmF1bHRfaWNvbikgZHJvcC5kZWZhdWx0X2ljb24gPSBvcHRpb25zLmRlZmF1bHRfaWNvbjtcbiAgICBGb3JtU2VsZWN0b3JCYXNlLmFwcGx5X29wdGlvbnMoZHJvcCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGRyb3A7XG59XG5cbi8vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5jbGFzcyBEcm9wRG93bkJveCBleHRlbmRzIEJhc2Uge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImRyb3Bkb3duYm94XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNjbG9zZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgI2NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjc2Nyb2xsOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuI2NvbnRhaW5lci5hcHBlbmRDaGlsZChcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxuICApO1xuICAjdGFibGU6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy4jc2Nyb2xsLmFwcGVuZENoaWxkKFxuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICk7XG4gICNkcm9wZG93bjogRm9ybURyb3Bkb3duPGFueSwgYW55PiB8IHVuZGVmaW5lZDtcbiAgI2ZvY3VzX291dF9oYW5kbGVyID0gKGU6IEZvY3VzRXZlbnQpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIWUucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSkpXG4gICAgICB0aGlzLmNsb3NlX21lbnUoKTtcbiAgfTtcbiAgI3dpbmRvd19yZXNpemVfaGFuZGxlciA9ICgpID0+IHRoaXMuY2xvc2VfbWVudSgpO1xuICAjaXNfb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jY29udGFpbmVyLnRhYkluZGV4ID0gMDtcbiAgICB0aGlzLiNjb250YWluZXIub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikgdGhpcy5jbG9zZV9tZW51KCk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd1VwXCIgfHwgKGUuc2hpZnRLZXkgJiYgZS5rZXkgPT09IFwiVGFiXCIpKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPVxuICAgICAgICAgIGUudGFyZ2V0ID09PSB0aGlzLiNjb250YWluZXJcbiAgICAgICAgICAgID8gdGhpcy4jdGFibGUubGFzdEVsZW1lbnRDaGlsZFxuICAgICAgICAgICAgOiAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgIGlmIChlbGVtKSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dEb3duXCIgfHwgZS5rZXkgPT09IFwiVGFiXCIpIHtcbiAgICAgICAgY29uc3QgZWxlbSA9XG4gICAgICAgICAgZS50YXJnZXQgPT09IHRoaXMuI2NvbnRhaW5lclxuICAgICAgICAgICAgPyB0aGlzLiN0YWJsZS5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgICAgICAgOiAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgaWYgKGVsZW0pIChlbGVtIGFzIEhUTUxFbGVtZW50KS5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuXG4gICAgdGhpcy4jY2xvc2VyXG4gICAgICAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSlcbiAgICAgIC5hcHBlbmRDaGlsZChtYXRlcmlhbF9uYXZpZ2F0aW9uX2Nsb3NlX3JvdW5kZWQoKSk7XG4gICAgdGhpcy4jY2xvc2VyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpLmlubmVySFRNTCA9IFwiQ2xvc2VcIjtcbiAgICB0aGlzLiNjbG9zZXIudGFiSW5kZXggPSAwO1xuICAgIHRoaXMuI2Nsb3Nlci5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNsb3NlX21lbnUoKTtcbiAgICB9O1xuICAgIHRoaXMuI2Nsb3Nlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2ZvY3VzX291dF9oYW5kbGVyLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgI3NldF92YWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIC8vQHRzLWV4cGVjdC1lcnJvciBDYWxsIHByaXZhdGUgbWV0aG9kIGZyb20gc2lzdGVyIGNsYXNzXG4gICAgaWYgKHRoaXMuI2Ryb3Bkb3duKSB0aGlzLiNkcm9wZG93bi5zZXRfdmFsdWVfY2hlY2sodmFsdWUpO1xuICAgIHRoaXMuY2xvc2VfbWVudSgpO1xuICB9XG5cbiAgb3Blbl9tZW51KFxuICAgIG1hcDogTWFwPGFueSwgU2VsT3B0aW9ucz4sXG4gICAgcGFyZW50OiBGb3JtRHJvcGRvd248YW55LCBhbnk+LFxuICAgIHZhbHVlOiBhbnksXG4gICkge1xuICAgIGNvbnN0IGlubmVyX2hlaWdodCA9IHRoaXMub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldz8uaW5uZXJIZWlnaHQgfHwgMDtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJvcGVuXCIpO1xuICAgIGNvbnN0IGJvdW5kcyA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC8gMiA8IGlubmVyX2hlaWdodCAvIDIpIHtcbiAgICAgIGNvbnN0IHRvcCA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS50b3AgPSB0b3AgKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUuYm90dG9tID0gXCJcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSBpbm5lcl9oZWlnaHQgLSB0b3AgLSAxMCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJjb2x1bW5cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYm90dG9tID0gaW5uZXJfaGVpZ2h0IC0gYm91bmRzLnk7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUudG9wID0gXCJcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBib3R0b20gKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUubWF4SGVpZ2h0ID0gaW5uZXJfaGVpZ2h0IC0gYm90dG9tIC0gMTAgKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUuZmxleERpcmVjdGlvbiA9IFwiY29sdW1uLXJldmVyc2VcIjtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmxlZnQgPSBib3VuZHMueCArIFwicHhcIjtcbiAgICB0aGlzLiNjb250YWluZXIuc3R5bGUud2lkdGggPSBib3VuZHMud2lkdGggKyBcInB4XCI7XG4gICAgdGhpcy4jZHJvcGRvd24gPSBwYXJlbnQ7XG5cbiAgICBpZiAodGhpcy4jc2Nyb2xsLnNjcm9sbEhlaWdodCA+IHRoaXMuI3Njcm9sbC5jbGllbnRIZWlnaHQpXG4gICAgICB0aGlzLiNzY3JvbGwuY2xhc3NMaXN0LmFkZChcInNjcm9sbFwiKTtcbiAgICBlbHNlIHRoaXMuI3Njcm9sbC5jbGFzc0xpc3QucmVtb3ZlKFwic2Nyb2xsXCIpO1xuXG4gICAgbGV0IGZvY3VzOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLiN0YWJsZS5yZXBsYWNlQ2hpbGRyZW4oXG4gICAgICAuLi5BcnJheS5mcm9tKG1hcCkubWFwKChbdmFsLCBvcHRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBjb25zdCBpY29uID0gbGluZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgaWYgKG9wdC5pY29uKSBpY29uLmFwcGVuZENoaWxkKG9wdC5pY29uKCkpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gbGluZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgdGV4dC50ZXh0Q29udGVudCA9IG9wdC50ZXh0O1xuICAgICAgICBsaW5lLm9ucG9pbnRlcnVwID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gXCJ0b3VjaFwiKSB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGluZS5vbmNsaWNrID0gKCkgPT4gdGhpcy4jc2V0X3ZhbHVlKHZhbCk7XG4gICAgICAgIGxpbmUudGFiSW5kZXggPSAwO1xuICAgICAgICBsaW5lLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmICh2YWwgPT09IHZhbHVlKSBmb2N1cyA9IGxpbmU7XG4gICAgICAgIHJldHVybiBsaW5lO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vU2hvdyBjbG9zZXIgb3Igbm90XG4gICAgY29uc3QgYm94ID0gdGhpcy4jc2Nyb2xsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGJveF9hcmVhID0gYm94LndpZHRoICogYm94LmhlaWdodDtcbiAgICBjb25zdCBodG1sID0gdGhpcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBodG1sX2FyZWEgPSBodG1sLmNsaWVudFdpZHRoICogaHRtbC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKGJveF9hcmVhID4gaHRtbF9hcmVhICogMC41KSB7XG4gICAgICB0aGlzLiN0YWJsZS5wcmVwZW5kKHRoaXMuI2Nsb3Nlcik7XG4gICAgfVxuXG4gICAgaWYgKGZvY3VzKSB7XG4gICAgICBmb2N1cy5mb2N1cygpO1xuICAgICAgZm9jdXMuY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkXCIpO1xuICAgIH0gZWxzZSB0aGlzLiNjb250YWluZXIuZm9jdXMoKTtcblxuICAgIHRoaXMub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldz8uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIFwicmVzaXplXCIsXG4gICAgICB0aGlzLiN3aW5kb3dfcmVzaXplX2hhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IHRydWUgfSxcbiAgICApO1xuICAgIHRoaXMuI2lzX29wZW4gPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VfbWVudSgpIHtcbiAgICBpZiAoIXRoaXMuI2lzX29wZW4pIHJldHVybjtcbiAgICB0aGlzLiNpc19vcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwib3BlblwiKTtcbiAgICB0aGlzLiN0YWJsZS5yZXBsYWNlQ2hpbGRyZW4oKTtcbiAgICBpZiAodGhpcy4jZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuI2Ryb3Bkb3duLmZvY3VzKCk7XG4gICAgICAvL0B0cy1leHBlY3QtZXJyb3IgT3ZlcndyaXRlIHByaXZhdGUgcHJvcGVydHkgZnJvbSBzaXN0ZXIgY2xhc3NcbiAgICAgIHRoaXMuI2Ryb3Bkb3duLmlzX29wZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgXCJyZXNpemVcIixcbiAgICAgIHRoaXMuI3dpbmRvd19yZXNpemVfaGFuZGxlcixcbiAgICApO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChEcm9wRG93bkJveCk7XG5jb25zdCBib3ggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3IERyb3BEb3duQm94KCkpO1xuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQge1xuICBGb3JtU2VsZWN0b3JCYXNlLFxuICB0eXBlIEZvcm1TZWxlY3RvckJhc2VPcHRpb25zLFxuICB0eXBlIEZvcm1TZWxlY3Rvck9wdGlvbixcbn0gZnJvbSBcIi4uL3NlbGVjdG9yX2Jhc2VcIjtcbmltcG9ydCBcIi4vdG9nZ2xlX2J1dHRvbi5zY3NzXCI7XG5cbmludGVyZmFjZSBTZWxPcHRpb25zIHtcbiAgdG9wOiBIVE1MRGl2RWxlbWVudDtcbiAgYm90OiBIVE1MRGl2RWxlbWVudDtcbn1cblxuLyoqVG9nZ2xlIGJ1dHRvbnMsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgbXVsdGkgdG9nZ2xlciovXG5leHBvcnQgY2xhc3MgRm9ybVRvZ2dsZUJ1dHRvbjxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1TZWxlY3RvckJhc2U8UlQsIElEPiB7XG4gIC8qKlJldHVybnMgdGhlIG5hbWUgdXNlZCB0byBkZWZpbmUgdGhlIGVsZW1lbnQqL1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRvZ2dsZWJ1dHRvblwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbWFwOiBNYXA8UlQsIFNlbE9wdGlvbnM+ID0gbmV3IE1hcCgpO1xuICAjdmFsdWVzOiBSVFtdID0gW107XG4gICNzZWxlY3RlZDogbnVtYmVyID0gLTE7XG5cbiAgc2V0IHNlbGVjdGlvbnMoc2VsZWN0aW9uczogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPltdIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuI21hcC5zaXplID4gMCkge1xuICAgICAgdGhpcy4jbWFwLmNsZWFyKCk7XG4gICAgICB0aGlzLiN2YWx1ZXMgPSBbXTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gLTE7XG4gICAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgc2VsZWN0aW9ucyAmJiBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gc2VsZWN0aW9uc1tpXTtcbiAgICAgIHRoaXMuI21hcC5zZXQodmFsdWUsIHRoaXMuI2FkZF9zZWxlY3Rpb24oc2VsZWN0aW9uc1tpXSkpO1xuICAgICAgdGhpcy4jdmFsdWVzLnB1c2goc2VsZWN0aW9uc1tpXS52YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gIH1cblxuICAjYWRkX3NlbGVjdGlvbihzZWxlY3Rpb246IEZvcm1TZWxlY3Rvck9wdGlvbjxSVD4pIHtcbiAgICBjb25zdCB0b3AgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIHRvcC50YWJJbmRleCA9IDA7XG4gICAgY29uc3QgYm90ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICBpZiAoc2VsZWN0aW9uLmljb24pIHtcbiAgICAgIHRvcC5hcHBlbmRDaGlsZChzZWxlY3Rpb24uaWNvbigpKTtcbiAgICAgIGJvdC50ZXh0Q29udGVudCA9IHNlbGVjdGlvbi50ZXh0O1xuICAgIH0gZWxzZSB0b3AudGV4dENvbnRlbnQgPSBzZWxlY3Rpb24udGV4dDtcbiAgICBjb25zdCBjbGljayA9ICgpID0+IHtcbiAgICAgIHRvcC5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soc2VsZWN0aW9uLnZhbHVlKTtcbiAgICB9O1xuICAgIHRvcC5vbmNsaWNrID0gY2xpY2s7XG4gICAgYm90Lm9uY2xpY2sgPSBjbGljaztcbiAgICB0b3Aub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCIgXCIgfHwgZS5rZXkgPT09IFwiRW50ZXJcIikgY2xpY2soKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIikgdGhpcy4jc2VsZWN0X2FkamFjZW50KHRydWUpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dMZWZ0XCIpIHRoaXMuI3NlbGVjdF9hZGphY2VudChmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICByZXR1cm4geyB0b3AsIGJvdCB9O1xuICB9XG5cbiAgLyoqU2VsZWN0cyB0aGUgcHJldmlvdXMgb3IgbmV4dCBzZWxlY3Rpb24gaW4gdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGRpciBmYWxzZSBpcyBuZXh0IHRydWUgaXMgcHJldmlvdXMqL1xuICAjc2VsZWN0X2FkamFjZW50KGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHNlbCkgc2VsLnRvcC5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihcbiAgICAgIHRoaXMuI3ZhbHVlcy5sZW5ndGggLSAxLFxuICAgICAgTWF0aC5tYXgoMCwgZGlyID8gdGhpcy4jc2VsZWN0ZWQgKyAxIDogdGhpcy4jc2VsZWN0ZWQgLSAxKSxcbiAgICApO1xuICAgIGlmICh5ICE9PSB0aGlzLiNzZWxlY3RlZCkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy4jdmFsdWVzW3ldKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IFJUKTogdm9pZCB7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHByZXYudG9wLmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHByZXYuYm90LmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gdGhpcy4jbWFwLmdldCh2YWx1ZSkhO1xuICAgIGlmIChvcHQpIHtcbiAgICAgIG9wdC50b3AuY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkXCIpO1xuICAgICAgb3B0LmJvdC5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IHRoaXMuI3ZhbHVlcy5pbmRleE9mKHZhbHVlKTtcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIG9wdC50b3AuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHByZXYudG9wLmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHByZXYuYm90LmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRvZ2dsZUJ1dHRvbik7XG5cbi8qKkNyZWF0ZXMgYSB0b2dnbGUgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdG9nZ2xlX2J1dHRvbjxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPixcbik6IEZvcm1Ub2dnbGVCdXR0b248UlQsIElEPiB7XG4gIGNvbnN0IHRvZ2cgPSBuZXcgRm9ybVRvZ2dsZUJ1dHRvbjxSVCwgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIEZvcm1TZWxlY3RvckJhc2UuYXBwbHlfb3B0aW9ucyh0b2dnLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRvZ2c7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4uL3NoYXJlZFwiO1xuaW1wb3J0IFwiLi9zcGFjZXIuc2Nzc1wiO1xuXG5pbnRlcmZhY2UgRm9ybVNwYWNlck9wdGlvbnMge1xuICAvKipTcGFjaW5nIGFtb3VudCAgKi9cbiAgc3BhY2U/OiBudW1iZXI7XG59XG5cbmNsYXNzIEZvcm1TcGFjZXIgZXh0ZW5kcyBGb3JtRWxlbWVudCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3BhY2VyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipTZXRzIHRoZSBhbW91bnQgb2Ygc3BhY2UsIGluIHJlbSAqL1xuICBzZXQgc3BhY2Uoc3BhY2U6IG51bWJlcikge1xuICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gYCR7c3BhY2V9cmVtYDtcbiAgfVxuICBnZXQgc3BhY2UoKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpcy5zdHlsZS5oZWlnaHQpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3BhY2VyKTtcblxuLyoqQ3JlYXRlcyBhIHNwYWNlciBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3NwYWNlcihvcHRpb25zPzogRm9ybVNwYWNlck9wdGlvbnMpOiBGb3JtU3BhY2VyIHtcbiAgY29uc3Qgc3BhY2VyID0gbmV3IEZvcm1TcGFjZXIoKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5zcGFjZSkgc3BhY2VyLnNwYWNlID0gb3B0aW9ucy5zcGFjZTtcbiAgfVxuICByZXR1cm4gc3BhY2VyO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2NvbG9yX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtQ29sb3JJbnB1dE9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IHN0cmluZyxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4ge1xuICAvKipXaGV0aGVyIHRoZSBjb2xvciBpbnB1dCBzaG91bGQgdXBkYXRlIGxpdmUqL1xuICBsaXZlPzogYm9vbGVhbjtcbn1cblxuY2xhc3MgRm9ybUNvbG9ySW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImNvbG9yaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiY29sb3JcIjtcbiAgICB0aGlzLndhcm5faW5wdXQub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gIH1cblxuICBzZXQgbGl2ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiNsaXZlID0gdmFsO1xuICB9XG4gIGdldCBsaXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNsaXZlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIiMwMDAwMDBcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtQ29sb3JJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBjb2xvciBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2NvbG9yX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1Db2xvcklucHV0T3B0aW9uczxJRCwgc3RyaW5nPixcbik6IEZvcm1Db2xvcklucHV0PElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1Db2xvcklucHV0PElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubGl2ZSkgaW5wdXQubGl2ZSA9IG9wdGlvbnMubGl2ZTtcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIG1hdGVyaWFsX2FjdGlvbl9jYWxlbmRhcl9tb250aF9yb3VuZGVkLFxuICBtYXRlcmlhbF9hY3Rpb25fc2NoZWR1bGVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZGF0ZV90aW1lX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlVGltZUlucHV0T3B0aW9uczxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlR5cGUgb2YgZGF0ZSB0aW1lKi9cbiAgdHlwZT86IEZvcm1EYXRlVGltZVR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtRGF0ZVRpbWVUeXBlID0ge1xuICBEQVRFOiBcImRhdGVcIixcbiAgVElNRTogXCJ0aW1lXCIsXG4gIERBVEVUSU1FOiBcImRhdGV0aW1lXCIsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRm9ybURhdGVUaW1lVHlwZSA9XG4gICh0eXBlb2YgRm9ybURhdGVUaW1lVHlwZSlba2V5b2YgdHlwZW9mIEZvcm1EYXRlVGltZVR5cGVdO1xuXG5jb25zdCBEYXRlVGltZU1vZGUgPSB7XG4gIERBVEU6IFwiZGF0ZVwiLFxuICBTVFJJTkc6IFwic3RyaW5nXCIsXG4gIE5VTUJFUjogXCJudW1iZXJcIixcbn0gYXMgY29uc3Q7XG5cbmNsYXNzIEZvcm1EYXRlVGltZUlucHV0PFxuICBSVCBleHRlbmRzIERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImRhdGV0aW1laW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3R5cGU6IEZvcm1EYXRlVGltZVR5cGUgPSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEVUSU1FO1xuICAjbW9kZTogc3RyaW5nID0gRGF0ZVRpbWVNb2RlLkRBVEU7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICB0aGlzLndhcm5faW5wdXQubGFuZyA9IFwiZGEtREtcIjtcbiAgICB0aGlzLndhcm5faW5wdXQuc3RlcCA9IFwiMC4xXCI7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfYWN0aW9uX2NhbGVuZGFyX21vbnRoX3JvdW5kZWQoKSkub25jbGljayA9ICgpID0+XG4gICAgICB0aGlzLndhcm5faW5wdXQuc2hvd1BpY2tlcigpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfYWN0aW9uX3NjaGVkdWxlX3JvdW5kZWQoKSkub25jbGljayA9ICgpID0+XG4gICAgICB0aGlzLndhcm5faW5wdXQuc2hvd1BpY2tlcigpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLndhcm5faW5wdXQudmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuI21vZGUgPT09IERhdGVUaW1lTW9kZS5EQVRFKVxuICAgICAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKG5ldyBEYXRlKHRoaXMud2Fybl9pbnB1dC52YWx1ZUFzTnVtYmVyKSBhcyBSVCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI21vZGUgPT09IERhdGVUaW1lTW9kZS5TVFJJTkcpXG4gICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy53YXJuX2lucHV0LnZhbHVlIGFzIFJUKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy4jbW9kZSA9PT0gRGF0ZVRpbWVNb2RlLk5VTUJFUilcbiAgICAgICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWVBc051bWJlciBhcyBSVCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdGhlIGRhdGUgdGltZSB0eXBlKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3R5cGU7XG4gIH1cblxuICAvKipTZXRzIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIHNldCB0eXBlKHR5cGU6IEZvcm1EYXRlVGltZVR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gRm9ybURhdGVUaW1lVHlwZS5EQVRFKSB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiZGF0ZVwiO1xuICAgIGlmICh0eXBlID09PSBGb3JtRGF0ZVRpbWVUeXBlLlRJTUUpIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJ0aW1lXCI7XG4gICAgaWYgKHR5cGUgPT09IEZvcm1EYXRlVGltZVR5cGUuREFURVRJTUUpXG4gICAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdGhlIGRhdGUgdGltZSB0eXBlKi9cbiAgZ2V0IHN0ZXAoKSB7XG4gICAgcmV0dXJuIE51bWJlcih0aGlzLndhcm5faW5wdXQuc3RlcCk7XG4gIH1cbiAgLyoqU2V0cyB0aGUgZGF0ZSB0aW1lIHR5cGUqL1xuICBzZXQgc3RlcChzdGVwOiBudW1iZXIpIHtcbiAgICB0aGlzLndhcm5faW5wdXQuc3RlcCA9IFN0cmluZyhzdGVwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IFJUKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLiNtb2RlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB0aGlzLiNtb2RlID0gRGF0ZVRpbWVNb2RlLk5VTUJFUjtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgdGhpcy4jbW9kZSA9IERhdGVUaW1lTW9kZS5TVFJJTkc7XG4gICAgICBlbHNlIHRoaXMuI21vZGUgPSBEYXRlVGltZU1vZGUuREFURTtcbiAgICB9XG4gICAgbGV0IHRpbWU6IG51bWJlcjtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB0aW1lID0gdmFsdWU7XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB0aW1lID0gbmV3IERhdGUodmFsdWUpLmdldFRpbWUoKTtcbiAgICBlbHNlIHRpbWUgPSB2YWx1ZS5nZXRUaW1lKCk7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlQXNOdW1iZXIgPSB0aW1lO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1EYXRlVGltZUlucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGNvbG9yIGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fZGF0ZV90aW1lX2lucHV0PFxuICBSVCBleHRlbmRzIERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPihvcHRpb25zPzogRGF0ZVRpbWVJbnB1dE9wdGlvbnM8UlQsIElEPik6IEZvcm1EYXRlVGltZUlucHV0PFJULCBJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBGb3JtRGF0ZVRpbWVJbnB1dDxSVCwgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy50eXBlKSBpbnB1dC50eXBlID0gb3B0aW9ucy50eXBlO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgZ2V0X2N1cnNvcl9wb3NpdGlvbixcbiAgSVBBZGRyZXNzLFxuICBJUFZlcnNpb24sXG4gIHNldF9jdXJzb3JfZW5kLFxuICBzZXRfc2VsZWN0aW9uX2FsbCxcbiAgc2xlZXAsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9pcF9pbnB1dC5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXBJbnB1dE9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8SVBBZGRyZXNzLCBJRD4ge1xuICAvKipJcCBhZGRyZXNzIHR5cGUsIHRoaXMgaXMgb3ZlcndyaXR0ZW4gaWYgc3VwcGxpZWQgd2l0aCBhbiBpcGFkZHJlc3Mgd2l0aCBhIGRpZmZlcmVudCB0eXBlKi9cbiAgdHlwZTogSVBWZXJzaW9uO1xufVxuXG5jbGFzcyBGb3JtSXBJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxcbiAgSVBBZGRyZXNzLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiaXBpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdHlwZTogSVBWZXJzaW9uO1xuICAjcGFydHM6IEhUTUxEaXZFbGVtZW50W10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiA4IH0sIChfLCBpKSA9PiB7XG4gICAgY29uc3QgaW5wID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICBpZiAoaSA8IDcpIHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAgIGlucC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICBpbnAub25iZWZvcmVpbnB1dCA9IGFzeW5jIChldikgPT4ge1xuICAgICAgaWYgKGV2LmlucHV0VHlwZSA9PT0gXCJpbnNlcnRQYXJhZ3JhcGhcIikgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vQmFja3NwYWNlXG4gICAgICBlbHNlIGlmIChldi5pbnB1dFR5cGUgPT09IFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCIpIHtcbiAgICAgICAgaWYgKGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09IDAgJiYgaSA+IDApIHtcbiAgICAgICAgICBzZXRfY3Vyc29yX2VuZChpbnAucHJldmlvdXNFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRlXG4gICAgICB9IGVsc2UgaWYgKGV2LmlucHV0VHlwZSA9PT0gXCJkZWxldGVDb250ZW50Rm9yd2FyZFwiKSB7XG4gICAgICAgIGlmIChpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwICYmIGkgPCBsZW5ndGggLSAxKSB7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICAgICAgKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpPy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2LmRhdGEpIHtcbiAgICAgICAgLy9DaGVjayBmb3IgLiBvciA6XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZXYuZGF0YSA9PT0gXCIuXCIgfHwgZXYuZGF0YSA9PT0gXCI6XCIgfHwgZXYuZGF0YSA9PT0gXCIsXCIpICYmXG4gICAgICAgICAgaSA8IGxlbmd0aCAtIDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2V0X3NlbGVjdGlvbl9hbGwoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICAvL0NoZWNrIGZvciB2YWxpZCBjaGFyYWN0ZXJzXG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICFldi5kYXRhLm1hdGNoKFxuICAgICAgICAgICAgdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gL15bXFxkXSokLyA6IC9eW1xcZEEtRmEtZl0qJC8sXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy9QcmV2ZW50IHRvbyBsb25nIHZhbHVlc1xuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICBpbnAudGV4dENvbnRlbnQubGVuZ3RoID49ICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyAzIDogNClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAvL1ByZXZlbnQgdG9vIGJpZyB2YWx1ZXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBwb3MgPSBnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCk7XG4gICAgICAgICAgY29uc3QgcG90ZW50aWFsID1cbiAgICAgICAgICAgIGlucC50ZXh0Q29udGVudC5zbGljZSgwLCBwb3MpICtcbiAgICAgICAgICAgIGV2LmRhdGEgK1xuICAgICAgICAgICAgaW5wLnRleHRDb250ZW50LnNsaWNlKHBvcyk7XG4gICAgICAgICAgY29uc3QgbnVtID1cbiAgICAgICAgICAgIHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNFxuICAgICAgICAgICAgICA/IHBhcnNlSW50KHBvdGVudGlhbCwgMTApXG4gICAgICAgICAgICAgIDogcGFyc2VJbnQocG90ZW50aWFsLCAxNik7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCAmJiBudW0gPiAyNTUpIHx8XG4gICAgICAgICAgICAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY2ICYmIG51bSA+IDY1NTM1KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGkgPCB0aGlzLiNwYXJ0cy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICBzZXRfc2VsZWN0aW9uX2FsbChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgIGVsc2UgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGlucC5vbmlucHV0ID0gKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gMyA6IDQpICYmXG4gICAgICAgIGdldF9jdXJzb3JfcG9zaXRpb24oaW5wKSA9PT0gaW5wLnRleHRDb250ZW50Lmxlbmd0aCAmJlxuICAgICAgICBpIDwgdGhpcy4jcGFydHMubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIHNldF9zZWxlY3Rpb25fYWxsKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH07XG4gICAgaW5wLm9ua2V5ZG93biA9IGFzeW5jIChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiQXJyb3dVcFwiKSB7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93RG93blwiKSB7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93TGVmdFwiICYmIGkgPiAwKSB7XG4gICAgICAgIGlmIChnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCkgPT09IDAgfHwgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICBzZXRfY3Vyc29yX2VuZChpbnAucHJldmlvdXNFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIgJiYgaSA8IHRoaXMuI3BhcnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdldF9jdXJzb3JfcG9zaXRpb24oaW5wKSA9PT0gaW5wLnRleHRDb250ZW50Lmxlbmd0aCB8fFxuICAgICAgICAgIGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09IDBcbiAgICAgICAgKVxuICAgICAgICAgIChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KT8uZm9jdXMoKTtcbiAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICB9IGVsc2UgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIHJldHVybiBpbnA7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKHR5cGU6IElQVmVyc2lvbiwgaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLiNwYXJ0cy5pbmNsdWRlcyhlLnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudCkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiNwYXJ0c1t0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyAzIDogN10pO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbmRibGNsaWNrID0gKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCAhPT0gdGhpcykgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2V0X3NlbGVjdGlvbl9hbGwodGhpcy4jcGFydHNbMF0pO1xuICAgIH07XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS5yZWxhdGVkVGFyZ2V0ICYmIHRoaXMuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUpKSByZXR1cm47XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLnZhbHVlX2FzX2lwKTtcbiAgICB9KTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy52YWx1ZV9hc19pcCk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9uY29weSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLmNsaXBib2FyZERhdGE/LnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRoaXMudmFsdWVfYXNfaXAudG9fc3RyaW5nKCkpO1xuICAgIH07XG4gICAgdGhpcy5vbnBhc3RlID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHBhc3RlID0gZS5jbGlwYm9hcmREYXRhPy5nZXREYXRhKFwidGV4dC9wbGFpblwiKSB8fCBcIlwiO1xuICAgICAgY29uc3QgbmV3X2lwID0gbmV3IElQQWRkcmVzcyhwYXN0ZSk7XG4gICAgICBpZiAobmV3X2lwLnZlcnNpb24gIT09IHRoaXMuI3R5cGUpIHJldHVybjtcbiAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKG5ld19pcCk7XG4gICAgfTtcbiAgfVxuXG4gIGdldCB2YWx1ZV9hc19pcCgpOiBJUEFkZHJlc3Mge1xuICAgIHJldHVybiBuZXcgSVBBZGRyZXNzKFxuICAgICAgdGhpcy4jcGFydHNcbiAgICAgICAgLnNsaWNlKDAsIHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KVxuICAgICAgICAucmVkdWNlKChhY2MsIHBhcnQsIGkpID0+IHtcbiAgICAgICAgICBhY2MgKz0gcGFydC5pbm5lclRleHQ7XG4gICAgICAgICAgaWYgKGkgPCAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gNCA6IDgpIC0gMSlcbiAgICAgICAgICAgIGFjYyArPSB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyBcIi5cIiA6IFwiOlwiO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFwiXCIpLFxuICAgICk7XG4gIH1cblxuICBzZXQgdHlwZSh2YWw6IElQVmVyc2lvbikge1xuICAgIGlmICh0aGlzLiN0eXBlID09PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLiN0eXBlID0gdmFsO1xuICAgIHRoaXMuY2xhc3NMaXN0LnRvZ2dsZShcImlwdjRcIiwgdmFsID09PSBJUFZlcnNpb24uVjQpO1xuICAgIHRoaXMuY2xhc3NMaXN0LnRvZ2dsZShcImlwdjZcIiwgdmFsID09PSBJUFZlcnNpb24uVjYpO1xuICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKFxuICAgICAgLi4udGhpcy4jcGFydHNcbiAgICAgICAgLnNsaWNlKDAsIHZhbCA9PT0gSVBWZXJzaW9uLlY0ID8gNCA6IDgpXG4gICAgICAgIC5mbGF0TWFwKCh2LCBpKSA9PlxuICAgICAgICAgIGkgPCAodmFsID09PSBJUFZlcnNpb24uVjQgPyA0IDogOCkgLSAxXG4gICAgICAgICAgICA/IFt2LCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWwgPT09IElQVmVyc2lvbi5WNCA/IFwiLlwiIDogXCI6XCIpXVxuICAgICAgICAgICAgOiBbdl0sXG4gICAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBJUEFkZHJlc3MpOiB2b2lkIHtcbiAgICB0aGlzLnR5cGUgPSB2YWwudmVyc2lvbjtcbiAgICB2YWwuYXNfYXJyYXkuZm9yRWFjaCgocGFydCwgaSkgPT4ge1xuICAgICAgdGhpcy4jcGFydHNbaV0udGV4dENvbnRlbnQgPVxuICAgICAgICB2YWwudmVyc2lvbiA9PT0gSVBWZXJzaW9uLlY0ID8gcGFydC50b1N0cmluZygpIDogcGFydC50b1N0cmluZygxNik7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jcGFydHMuZm9yRWFjaCgocGFydCkgPT4ge1xuICAgICAgcGFydC50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybUlwSW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgY29sb3IgaW5wdXQgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9pcF9pbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM6IElwSW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1JcElucHV0PElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1JcElucHV0PElEPihvcHRpb25zLnR5cGUsIG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUsIEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9wYXNzd29yZF9pbnB1dC5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVBhc3N3b3JkSW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPHN0cmluZywgSUQ+IHtcbiAgLyoqQWxsb3dlZCBjaGFyYWN0ZXJzIGZvciB0aGUgcGFzc3dvcmQgaW5wdXQgKi9cbiAgZmlsdGVyPzogUmVnRXhwO1xufVxuXG5jbGFzcyBGb3JtUGFzc3dvcmRJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxcbiAgc3RyaW5nLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwicGFzc3dvcmRpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjZmlsdGVyPzogUmVnRXhwO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJwYXNzd29yZFwiO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmNoYW5nZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLndhcm5faW5wdXQub25iZWZvcmVpbnB1dCA9IChldikgPT4ge1xuICAgICAgaWYgKGV2LmRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuI2ZpbHRlciAmJiAhdGhpcy4jZmlsdGVyLnRlc3QoZXYuZGF0YSkpIHtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMud2FybihcIkludmFsaWQgY2hhcmFjdGVyIGVudGVyZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2V0IGZpbHRlcih2YWw6IFJlZ0V4cCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2ZpbHRlciA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtUGFzc3dvcmRJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3Bhc3N3b3JkX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1QYXNzd29yZElucHV0T3B0aW9uczxJRD4sXG4pOiBGb3JtUGFzc3dvcmRJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBGb3JtUGFzc3dvcmRJbnB1dDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmZpbHRlcikgaW5wdXQuZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgc2V0X2N1cnNvcl9lbmQsIHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgZXJyLCBub25lLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTdGF0ZVN0cmluZ1JlbGF0ZWQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdGF0ZVwiO1xuaW1wb3J0IHsgc3RyaW5nX2J5dGVfbGVuZ3RoLCBzdHJpbmdfYnl0ZV9saW1pdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0cmluZ1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3RleHRfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1UZXh0SW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBzdHJpbmcsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGlucHV0IGlzIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipNYXhpbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgLyoqTWF4aW11bSBieXRlcyBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2J5dGVzPzogbnVtYmVyO1xuICAvKipBbGxvd2VkIGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXh0IGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVRleHRJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxcbiAgc3RyaW5nLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwidGV4dGlucHV0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNmaWx0ZXI/OiBSZWdFeHA7XG4gICNtYXhfbGVuZ3RoPzogbnVtYmVyO1xuICAjbWF4X2J5dGVzPzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcInRleHRcIjtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uY2hhbmdlID0gKCkgPT4gdGhpcy4jc2V0KCk7XG4gICAgdGhpcy5vbmJlZm9yZWlucHV0ID0gKGUpID0+IHtcbiAgICAgIHRoaXMud2FybihcIlwiKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBlLmRhdGEgfHwgZS5kYXRhVHJhbnNmZXI/LmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuI2ZpbHRlciAmJiAhdGhpcy4jZmlsdGVyLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy53YXJuKFwiSW52YWxpZCBjaGFyYWN0ZXIgZW50ZXJlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfbGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLndhcm5faW5wdXQudmFsdWUubGVuZ3RoICsgZGF0YS5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfYnl0ZXMgJiZcbiAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aCh0aGlzLndhcm5faW5wdXQudmFsdWUpICtcbiAgICAgICAgICAgICAgc3RyaW5nX2J5dGVfbGVuZ3RoKGRhdGEpID5cbiAgICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyAjc2V0KCkge1xuICAgIGNvbnN0IGJ1ZmYgPSB0aGlzLmJ1ZmZlcjtcbiAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy53YXJuX2lucHV0LnZhbHVlIHx8IFwiXCIpKS5tYXBfZXJyKCgpID0+IHtcbiAgICAgIHRoaXMubmV3X3ZhbHVlKGJ1ZmYgfHwgXCJcIik7XG4gICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0IGZpbHRlcih2YWw6IFJlZ0V4cCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2ZpbHRlciA9IHZhbDtcbiAgfVxuICBnZXQgZmlsdGVyKCk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZpbHRlcjtcbiAgfVxuXG4gIHNldCBwbGFjZWhvbGRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMud2Fybl9pbnB1dC5wbGFjZWhvbGRlciA9IHZhbDtcbiAgfVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy53YXJuX2lucHV0LnBsYWNlaG9sZGVyO1xuICB9XG5cbiAgc2V0IG1heF9sZW5ndGgodmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfbGVuZ3RoID0gdmFsO1xuICAgIHRoaXMud2Fybl9pbnB1dC5tYXhMZW5ndGggPSB2YWwgPz8gLTE7XG4gIH1cbiAgZ2V0IG1heF9sZW5ndGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X2xlbmd0aDtcbiAgfVxuXG4gIHNldCBtYXhfYnl0ZXModmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfYnl0ZXMgPSB2YWw7XG4gIH1cbiAgZ2V0IG1heF9ieXRlcygpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfYnl0ZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHZhbCA9IHZhbC5zbGljZSgwLCB0aGlzLiNtYXhfbGVuZ3RoKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzKSB2YWwgPSBzdHJpbmdfYnl0ZV9saW1pdCh2YWwsIHRoaXMuI21heF9ieXRlcyk7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBzdHJpbmcpOiBQcm9taXNlTGlrZTxSZXN1bHQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuI21heF9sZW5ndGggJiYgdmFsLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzICYmIHN0cmluZ19ieXRlX2xlbmd0aCh2YWwpID4gdGhpcy4jbWF4X2J5dGVzKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlU3RyaW5nUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9sZW5ndGhcIiwgcmVsYXRlZC5tYXhfbGVuZ3RoLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4X2xlbmd0aFwiKTtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoX2J5dGVzKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9ieXRlc1wiLCByZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMsICgpID0+XG4gICAgICAgIG5vbmUoKSxcbiAgICAgICk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfYnl0ZXNcIik7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1UZXh0SW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgc2luZ2xlIGxpbmUgdGV4dCBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3RleHRfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVRleHRJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybVRleHRJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBGb3JtVGV4dElucHV0PElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuZmlsdGVyKSBpbnB1dC5maWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICBpZiAob3B0aW9ucy5wbGFjZWhvbGRlcikgaW5wdXQucGxhY2Vob2xkZXIgPSBvcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIGlmIChvcHRpb25zLm1heF9sZW5ndGgpIGlucHV0Lm1heF9sZW5ndGggPSBvcHRpb25zLm1heF9sZW5ndGg7XG4gICAgaWYgKG9wdGlvbnMubWF4X2J5dGVzKSBpbnB1dC5tYXhfYnl0ZXMgPSBvcHRpb25zLm1heF9ieXRlcztcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHNldF9jdXJzb3JfZW5kLCBzeW5jX3Jlc29sdmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7IG1hdGVyaWFsX2VkaXRvcl9kcmFnX2hhbmRsZV9yb3VuZGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB7IGVyciwgbm9uZSwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVTdHJpbmdSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IHN0cmluZ19ieXRlX2xlbmd0aCwgc3RyaW5nX2J5dGVfbGltaXQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdHJpbmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi90ZXh0X211bHRpX2xpbmUuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1UZXh0SW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBzdHJpbmcsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGlucHV0IGlzIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipNYXhpbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgLyoqTWF4aW11bSBieXRlcyBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2J5dGVzPzogbnVtYmVyO1xuICAvKipBbGxvd2VkIGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXh0IGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVRleHRNdWx0aWxpbmU8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRtdWx0aWxpbmVcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcbiAgI21heF9sZW5ndGg/OiBudW1iZXI7XG4gICNtYXhfYnl0ZXM/OiBudW1iZXI7XG4gICN2YWx1ZV9ib3g6IEhUTUxUZXh0QXJlYUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKFxuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSxcbiAgKTtcbiAgI3Jlc2l6ZXI6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNyZXNpemVyLmFwcGVuZENoaWxkKG1hdGVyaWFsX2VkaXRvcl9kcmFnX2hhbmRsZV9yb3VuZGVkKCkpO1xuICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLiN2YWx1ZV9ib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgY29uc3Qgc3RhcnRfeSA9IGUuY2xpZW50WTtcbiAgICAgIHRoaXMuI3Jlc2l6ZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJtb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgIGNvbnN0IGR5ID0gZXYuY2xpZW50WSAtIHN0YXJ0X3k7XG4gICAgICAgIHRoaXMuI3ZhbHVlX2JveC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHQgKyBkeX1weGA7XG4gICAgICB9O1xuICAgICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJ1cCA9IChfZXYpID0+IHtcbiAgICAgICAgdGhpcy4jcmVzaXplci5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgIH07XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25jaGFuZ2UgPSAoKSA9PiB0aGlzLiNzZXQoKTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25iZWZvcmVpbnB1dCA9IChlKSA9PiB7XG4gICAgICB0aGlzLndhcm4oXCJcIik7XG4gICAgICBjb25zdCBkYXRhID0gZS5kYXRhIHx8IGUuZGF0YVRyYW5zZmVyPy5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMud2FybihcIkludmFsaWQgY2hhcmFjdGVyIGVudGVyZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2xlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlLmxlbmd0aCArIGRhdGEubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzICYmXG4gICAgICAgICAgICBzdHJpbmdfYnl0ZV9sZW5ndGgodGhpcy4jdmFsdWVfYm94LnZhbHVlKSArXG4gICAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aChkYXRhKSA+XG4gICAgICAgICAgICAgIHRoaXMuI21heF9ieXRlc1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJFbnRlclwiICYmIGUuY3RybEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuI3NldCgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyAjc2V0KCkge1xuICAgIGNvbnN0IGJ1ZmYgPSB0aGlzLmJ1ZmZlcjtcbiAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy4jdmFsdWVfYm94LnZhbHVlIHx8IFwiXCIpKS5tYXBfZXJyKCgpID0+IHtcbiAgICAgIHRoaXMubmV3X3ZhbHVlKGJ1ZmYgfHwgXCJcIik7XG4gICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0IGZpbHRlcih2YWw6IFJlZ0V4cCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2ZpbHRlciA9IHZhbDtcbiAgfVxuICBnZXQgZmlsdGVyKCk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZpbHRlcjtcbiAgfVxuXG4gIHNldCBwbGFjZWhvbGRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuI3ZhbHVlX2JveC5wbGFjZWhvbGRlciA9IHZhbDtcbiAgfVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jdmFsdWVfYm94LnBsYWNlaG9sZGVyO1xuICB9XG5cbiAgc2V0IG1heF9sZW5ndGgodmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfbGVuZ3RoID0gdmFsO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5tYXhMZW5ndGggPSB2YWwgPz8gLTE7XG4gIH1cbiAgZ2V0IG1heF9sZW5ndGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X2xlbmd0aDtcbiAgfVxuXG4gIHNldCBtYXhfYnl0ZXModmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfYnl0ZXMgPSB2YWw7XG4gIH1cbiAgZ2V0IG1heF9ieXRlcygpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfYnl0ZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHZhbCA9IHZhbC5zbGljZSgwLCB0aGlzLiNtYXhfbGVuZ3RoKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzKSB2YWwgPSBzdHJpbmdfYnl0ZV9saW1pdCh2YWwsIHRoaXMuI21heF9ieXRlcyk7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBzdHJpbmcpOiBQcm9taXNlTGlrZTxSZXN1bHQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuI21heF9sZW5ndGggJiYgdmFsLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzICYmIHN0cmluZ19ieXRlX2xlbmd0aCh2YWwpID4gdGhpcy4jbWF4X2J5dGVzKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlU3RyaW5nUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9sZW5ndGhcIiwgcmVsYXRlZC5tYXhfbGVuZ3RoLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4X2xlbmd0aFwiKTtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoX2J5dGVzKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9ieXRlc1wiLCByZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMsICgpID0+XG4gICAgICAgIG5vbmUoKSxcbiAgICAgICk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfYnl0ZXNcIik7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1UZXh0TXVsdGlsaW5lKTtcblxuLyoqQ3JlYXRlcyBhIG11bHRpIGxpbmUgdGV4dCBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3RleHRfbXVsdGlsaW5lPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1UZXh0SW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1UZXh0TXVsdGlsaW5lPElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1UZXh0TXVsdGlsaW5lPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMucGxhY2Vob2xkZXIpIGlucHV0LnBsYWNlaG9sZGVyID0gb3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICBpZiAob3B0aW9ucy5tYXhfbGVuZ3RoKSBpbnB1dC5tYXhfbGVuZ3RoID0gb3B0aW9ucy5tYXhfbGVuZ3RoO1xuICAgIGlmIChvcHRpb25zLm1heF9ieXRlcykgaW5wdXQubWF4X2J5dGVzID0gb3B0aW9ucy5tYXhfYnl0ZXM7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3RleHQuc2Nzc1wiO1xuXG5pbnRlcmZhY2UgRm9ybVRleHRPcHRpb25zIHtcbiAgLyoqQnV0dG9ucyB0ZXh0ICovXG4gIHRleHQ/OiBzdHJpbmc7XG4gIC8qKlRleHQgc2l6ZSAqL1xuICBzaXplPzogbnVtYmVyO1xufVxuXG4vKipDb21wb25lbnQgZm9yIHNpbXBsZSB0ZXh0ICovXG5jbGFzcyBGb3JtVGV4dCBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEZvcm1UZXh0T3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLnNpemUpIHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGN1cnJlbnQgdGV4dCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCB0ZXh0KHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgY3VycmVudCB0ZXh0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdHlsZS5mb250U2l6ZSA9IGAke3NpemV9cmVtYDtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRleHQpO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdGV4dChvcHRpb25zOiBGb3JtVGV4dE9wdGlvbnMpOiBGb3JtVGV4dCB7XG4gIHJldHVybiBuZXcgRm9ybVRleHQob3B0aW9ucyk7XG59XG4iLCJpbXBvcnQgeyBGb3JtQ29sb3JzIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgZm9ybV9idXR0b24gfSBmcm9tIFwiLi9ib29sZWFuL2J1dHRvbi9idXR0b25cIjtcbmltcG9ydCB7IGZvcm1fbGFtcCB9IGZyb20gXCIuL2Jvb2xlYW4vbGFtcC9sYW1wXCI7XG5pbXBvcnQgeyBmb3JtX3N3aXRjaCB9IGZyb20gXCIuL2Jvb2xlYW4vc3dpdGNoL3N3aXRjaFwiO1xuaW1wb3J0IHsgZm9ybV9ncm91cCB9IGZyb20gXCIuL2dyb3VwL2dyb3VwXCI7XG5pbXBvcnQgeyBmb3JtX2xpc3RfZmllbGQgfSBmcm9tIFwiLi9saXN0L2xpc3RfZmllbGRcIjtcbmltcG9ydCB7IGZvcm1fbnVtYmVyX2lucHV0IH0gZnJvbSBcIi4vbnVtYmVyL251bWJlcklucHV0L251bWJlcl9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV9wcm9ncmVzcyB9IGZyb20gXCIuL251bWJlci9wcm9ncmVzcy9wcm9ncmVzc1wiO1xuaW1wb3J0IHsgZm9ybV9zbGlkZXIgfSBmcm9tIFwiLi9udW1iZXIvc2xpZGVyL3NsaWRlclwiO1xuaW1wb3J0IHsgZm9ybV9zdGVwcGVyIH0gZnJvbSBcIi4vbnVtYmVyL3N0ZXBwZXIvc3RlcHBlclwiO1xuaW1wb3J0IHsgZm9ybV9kcm9wZG93biB9IGZyb20gXCIuL3NlbGVjdG9ycy9kcm9wX2Rvd24vZHJvcF9kb3duXCI7XG5pbXBvcnQgeyBmb3JtX3RvZ2dsZV9idXR0b24gfSBmcm9tIFwiLi9zZWxlY3RvcnMvdG9nZ2xlX2J1dHRvbi90b2dnbGVfYnV0dG9uXCI7XG5pbXBvcnQgeyBmb3JtX3NwYWNlciB9IGZyb20gXCIuL3NwYWNpbmcvc3BhY2VyXCI7XG5pbXBvcnQgeyBmb3JtX2NvbG9yX2lucHV0IH0gZnJvbSBcIi4vc3BlY2lhbC9jb2xvci9jb2xvcl9pbnB1dFwiO1xuaW1wb3J0IHtcbiAgZm9ybV9kYXRlX3RpbWVfaW5wdXQsXG4gIEZvcm1EYXRlVGltZVR5cGUsXG59IGZyb20gXCIuL3NwZWNpYWwvZGF0ZV90aW1lL2RhdGVfdGltZV9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV9pcF9pbnB1dCB9IGZyb20gXCIuL3NwZWNpYWwvaXAvaXBfaW5wdXRcIjtcbmltcG9ydCB7IGZvcm1fcGFzc3dvcmRfaW5wdXQgfSBmcm9tIFwiLi9zcGVjaWFsL3Bhc3N3b3JkL3Bhc3N3b3JkX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX3RleHRfaW5wdXQgfSBmcm9tIFwiLi90ZXh0L2lucHV0L3RleHRfaW5wdXRcIjtcbmltcG9ydCB7IGZvcm1fdGV4dF9tdWx0aWxpbmUgfSBmcm9tIFwiLi90ZXh0L211bHRpTGluZS90ZXh0X211bHRpX2xpbmVcIjtcbmltcG9ydCB7IGZvcm1fdGV4dCB9IGZyb20gXCIuL3RleHQvdGV4dC90ZXh0XCI7XG5cbi8qKkZvcm0gZWxlbWVudHMgd2l0aCBsYWJlbCAqL1xuZXhwb3J0IGNvbnN0IGZvcm0gPSB7XG4gIEZvcm1Db2xvcnMsXG5cbiAgLy9Cb29sZWFuXG4gIGJ1dHRvbjogZm9ybV9idXR0b24sXG4gIHN3aXRjaDogZm9ybV9zd2l0Y2gsXG4gIGxhbXA6IGZvcm1fbGFtcCxcbiAgLy9Hcm91cFxuICBncm91cDogZm9ybV9ncm91cCxcblxuICAvL1NwZWNpYWxcbiAgY29sb3JfaW5wdXQ6IGZvcm1fY29sb3JfaW5wdXQsXG4gIGRhdGVfdGltZV9pbnB1dDogZm9ybV9kYXRlX3RpbWVfaW5wdXQsXG4gIEZvcm1EYXRlVGltZVR5cGUsXG4gIGlwX2lucHV0OiBmb3JtX2lwX2lucHV0LFxuICBwYXNzd29yZF9pbnB1dDogZm9ybV9wYXNzd29yZF9pbnB1dCxcblxuICAvL051bWJlclxuICBwcm9ncmVzczogZm9ybV9wcm9ncmVzcyxcbiAgaW5wdXRfbnVtYmVyOiBmb3JtX251bWJlcl9pbnB1dCxcbiAgc2xpZGVyOiBmb3JtX3NsaWRlcixcbiAgc3RlcHBlcjogZm9ybV9zdGVwcGVyLFxuXG4gIC8vU2VsZWN0b3JzXG4gIGRyb3Bkb3duOiBmb3JtX2Ryb3Bkb3duLFxuICB0b2dnbGVfYnV0dG9uOiBmb3JtX3RvZ2dsZV9idXR0b24sXG5cbiAgLy9TcGFjaW5nXG4gIHNwYWNlcjogZm9ybV9zcGFjZXIsXG5cbiAgLy9UZXh0XG4gIHRleHQ6IGZvcm1fdGV4dCxcbiAgaW5wdXRfdGV4dDogZm9ybV90ZXh0X2lucHV0LFxuICBtdWx0aWxpbmVfdGV4dDogZm9ybV90ZXh0X211bHRpbGluZSxcblxuICAvL0xpc3RcbiAgbGlzdF9maWVsZDogZm9ybV9saXN0X2ZpZWxkLFxufTtcbmV4cG9ydCBkZWZhdWx0IGZvcm07XG5cbmV4cG9ydCB7IEZvcm1Db2xvcnMgfSBmcm9tIFwiLi9iYXNlXCI7XG5leHBvcnQgeyBGb3JtRGF0ZVRpbWVUeXBlIH0gZnJvbSBcIi4vc3BlY2lhbC9kYXRlX3RpbWUvZGF0ZV90aW1lX2lucHV0XCI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQVVBLE1BQU0sYUFBYSx5QkFDakIsUUFDQSxvQkFDQSx1Q0FDRDtBQVFpQixXQUFXLGVBQzNCLFFBQ0EsYUFDQSwrQ0FDRCxDQUNTLGNBQ1IsVUFDQSxvQkFDQSxxREFDQSxnQkFDQSxnQkFDQSxVQUNBLEtBQUEsRUFDRDtBQVVELE1BQU0sU0FBUyxXQUFXLGVBQ3hCLFVBQ0EsVUFDQSxtQ0FDRDtBQVFELE1BQU0s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
2606
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiI2Z1bmMiLCIjZXJyb3IiLCIjY2hhbmdlIiwiI2NoYW5nZWQiLCIjd2Fybl90aW1lb3V0IiwiI3NldF92YWx1ZSIsIiNvbl9jbGljayIsIiN0b2dnbGUiLCIjdGV4dCIsIiNpY29uIiwiI3RleHQiLCIjaWNvbiIsIiNjb2xvcnMiLCIjc3dpdGNoIiwiI3ByZXZlbnRfY2xpY2siLCIjaWNvbiIsIiNncm91cCIsIiNjb2xsYXBzZWQiLCIjY29sbGFwc2VfYnV0dG9uIiwiI2Nsb3NlX3RleHQiLCIjb3Blbl90ZXh0IiwiI2xlZ2VuZCIsIiN2YWx1ZV9ib3giLCIjc2VsZWN0ZWQiLCIjc2V0IiwiI3N0ZXBfdmFsdWUiLCIjZGVjaW1hbHMiLCIjbWluIiwiI21heCIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heF9sZWdlbmQiLCIjc3RlcCIsIiNzdGFydCIsIiNtaW4iLCIjc3BhbiIsIiNtYXgiLCIjZGVjaW1hbHMiLCIjdW5pdCIsIiNiYXIiLCIjdmFsIiwiI3N0ZXBwZXJfZnVuYyIsIiNsZWdlbmQiLCIjc2xpZGUiLCIjc2xpZGVyIiwiI21pbiIsIiNtYXgiLCIjbGl2ZSIsIiNtb3ZlX3ZhbHVlIiwiI3hfdG9fcGVyYyIsIiNtb3ZlX3NsaWRlIiwiI3N0ZXAiLCIjbW92ZV9hYnNvbHV0ZSIsIiNzdGVwX3ZhbHVlIiwiI3VuaXQiLCIjdW5pdF9ib3giLCIjdXBkYXRlX21pbl9sZWdlbmQiLCIjdXBkYXRlX21heF9sZWdlbmQiLCIjdXBkYXRlX21pbl9tYXgiLCIjbGVmdF9sZWdlbmQiLCIjZGVjaW1hbHMiLCIjcmlnaHRfbGVnZW5kIiwiI3NwYW4iLCIjc3RhcnQiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjdmFsdWVfYm94IiwiI3BlcmNfdG9fdmFsdWUiLCIjc3RlcHBlcl9mdW5jIiwiI3RleHQiLCIjbGVnZW5kIiwiI3ZhbHVlX2JveCIsIiNtb3ZlX2RpZmYiLCIjc3RlcCIsIiNzdGVwX3ZhbHVlIiwiI2RlY2ltYWxzIiwiI21pbiIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heCIsIiNtYXhfbGVnZW5kIiwiI3N0YXJ0IiwiI2xpdmUiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjbW92ZV92YWx1ZSIsIiN0ZXh0IiwiI2RlZmF1bHQiLCIjc2VsZWN0X2FkamFjZW50IiwiI2RlZmF1bHRfaWNvbiIsIiNzZWxlY3RlZCIsIiNzZXRfaWNvbiIsIiNtYXAiLCIjdmFsdWVzIiwiI29wZW4iLCIjaWNvbiIsIiNjbGVhciIsIiNjb250YWluZXIiLCIjc2Nyb2xsIiwiI3RhYmxlIiwiI2Nsb3NlciIsIiNmb2N1c19vdXRfaGFuZGxlciIsIiNkcm9wZG93biIsIiNzZXRfdmFsdWUiLCIjd2luZG93X3Jlc2l6ZV9oYW5kbGVyIiwiI2lzX29wZW4iLCIjbWFwIiwiI3ZhbHVlcyIsIiNzZWxlY3RlZCIsIiNhZGRfc2VsZWN0aW9uIiwiI3NlbGVjdF9hZGphY2VudCIsIiNsaXZlIiwiI21vZGUiLCIjdHlwZSIsIiN0eXBlIiwiI3BhcnRzIiwiI2ZpbHRlciIsIiNzZXQiLCIjZmlsdGVyIiwiI21heF9sZW5ndGgiLCIjbWF4X2J5dGVzIiwiI3Jlc2l6ZXIiLCIjdmFsdWVfYm94IiwiI3NldCIsIiNmaWx0ZXIiLCIjbWF4X2xlbmd0aCIsIiNtYXhfYnl0ZXMiXSwic291cmNlcyI6WyIuLi9zcmMvc2hhcmVkLnRzIiwiLi4vc3JjL2Jhc2UudHMiLCIuLi9zcmMvYm9vbGVhbi9idXR0b24vYnV0dG9uLnRzIiwiLi4vc3JjL2Jvb2xlYW4vbGFtcC9sYW1wLnRzIiwiLi4vc3JjL2Jvb2xlYW4vc3dpdGNoL3N3aXRjaC50cyIsIi4uL3NyYy9ncm91cC9ncm91cF9iYXNlLnRzIiwiLi4vc3JjL2dyb3VwL2dyb3VwLnRzIiwiLi4vc3JjL2dyb3VwL2dyb3VwX2NvbGxhcHNlci50cyIsIi4uL3NyYy9saXN0L2xpc3RfZmllbGQudHMiLCIuLi9zcmMvbnVtYmVyL251bWJlcl9iYXNlLnRzIiwiLi4vc3JjL251bWJlci9udW1iZXJfaW5wdXQvbnVtYmVyX2lucHV0LnRzIiwiLi4vc3JjL251bWJlci9wcm9ncmVzcy9wcm9ncmVzcy50cyIsIi4uL3NyYy9udW1iZXIvc2xpZGVyL3NsaWRlci50cyIsIi4uL3NyYy9udW1iZXIvc3RlcHBlci9zdGVwcGVyLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy9zZWxlY3Rvcl9iYXNlLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy9kcm9wX2Rvd24vZHJvcF9kb3duLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy90b2dnbGVfYnV0dG9uL3RvZ2dsZV9idXR0b24udHMiLCIuLi9zcmMvc3BhY2luZy9zcGFjZXIudHMiLCIuLi9zcmMvc3BlY2lhbC9jb2xvci9jb2xvcl9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL2RhdGVfdGltZS9kYXRlX3RpbWVfaW5wdXQudHMiLCIuLi9zcmMvc3BlY2lhbC9pcC9pcF9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL3Bhc3N3b3JkL3Bhc3N3b3JkX2lucHV0LnRzIiwiLi4vc3JjL3RleHQvaW5wdXQvdGV4dF9pbnB1dC50cyIsIi4uL3NyYy90ZXh0L211bHRpX2xpbmUvdGV4dF9tdWx0aV9saW5lLnRzIiwiLi4vc3JjL3RleHQvdGV4dC90ZXh0LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJMVUUsXG4gIEdSRUVOLFxuICBHUkVZLFxuICBPUkFOR0UsXG4gIFJFRCxcbiAgWUVMTE9XLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb2xvcnNcIjtcbmltcG9ydCB7IHRoZW1lX2luaXRfdmFyaWFibGVfcm9vdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXRoZW1lXCI7XG5cbmNvbnN0IHRoZW1lX3Jvb3QgPSB0aGVtZV9pbml0X3ZhcmlhYmxlX3Jvb3QoXG4gIFwiZm9ybVwiLFxuICBcIlVJIEZvcm0gRWxlbWVudHNcIixcbiAgXCJUaGVtZSB2YXJpYWJsZXMgZm9yIFVJIGZvcm0gRWxlbWVudHNcIixcbik7XG5cbi8vICAgICAgX19fX18gIF9fX19fXyAgICAgICAgICBfX19fXyAgICAgX19fXyAgXyAgIF8gXyAgX18gICAgIF9fXG4vLyAgICAgfCAgX18gXFx8ICBfX19ffCAgIC9cXCAgIHwgIF9fIFxcICAgLyBfXyBcXHwgXFwgfCB8IHwgXFwgXFwgICAvIC9cbi8vICAgICB8IHxfXykgfCB8X18gICAgIC8gIFxcICB8IHwgIHwgfCB8IHwgIHwgfCAgXFx8IHwgfCAgXFwgXFxfLyAvXG4vLyAgICAgfCAgXyAgL3wgIF9ffCAgIC8gL1xcIFxcIHwgfCAgfCB8IHwgfCAgfCB8IC4gYCB8IHwgICBcXCAgIC9cbi8vICAgICB8IHwgXFwgXFx8IHxfX19fIC8gX19fXyBcXHwgfF9ffCB8IHwgfF9ffCB8IHxcXCAgfCB8X19fX3wgfFxuLy8gICAgIHxffCAgXFxfXFxfX19fX18vXy8gICAgXFxfXFxfX19fXy8gICBcXF9fX18vfF98IFxcX3xfX19fX198X3xcbmNvbnN0IHJlYWRfb25seSA9IHRoZW1lX3Jvb3QubWFrZV9zdWJfZ3JvdXAoXG4gIFwicmVhZFwiLFxuICBcIlJlYWQgT25seVwiLFxuICBcIlNldHRpbmdzIGZvciBmb3JtIGVsZW1lbnRzIGluIHJlYWQgb25seSBtb2RlXCIsXG4pO1xucmVhZF9vbmx5Lm1ha2VfdmFyaWFibGUoXG4gIFwiZmlsdGVyXCIsXG4gIFwiUmVhZCBPbmx5IEZpbHRlclwiLFxuICBcIkZpbHRlciBhcHBsaWVkIHRvIGZvcm0gZWxlbWVudHMgaW4gcmVhZCBvbmx5IG1vZGVcIixcbiAgXCJvcGFjaXR5KDAuNilcIixcbiAgXCJvcGFjaXR5KDAuNilcIixcbiAgXCJGaWx0ZXJcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzNcbi8vICAgICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgfF9fKSB8IChfX19cbi8vICAgICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgIFxcX19fX19cXF9fX18vfF9fX19fX1xcX19fXy98X3wgIFxcX1xcX19fX18vXG5jb25zdCBjb2xvcnMgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcImNvbG9yc1wiLFxuICBcIkNvbG9yc1wiLFxuICBcIkNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuXG4vLyAgICAgIF9fX19fX18gX19fX19fX18gICBfX19fX19fX18gICAgX19fX18gX19fXyAgXyAgICAgIF9fX18gIF9fX19fICAgX19fX19cbi8vICAgICB8X18gICBfX3wgIF9fX19cXCBcXCAvIC9fXyAgIF9ffCAgLyBfX19fLyBfXyBcXHwgfCAgICAvIF9fIFxcfCAgX18gXFwgLyBfX19ffFxuLy8gICAgICAgIHwgfCAgfCB8X18gICBcXCBWIC8gICB8IHwgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgICAgfCB8ICB8ICBfX3wgICA+IDwgICAgfCB8ICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgICAgIHwgfCAgfCB8X19fXyAvIC4gXFwgICB8IHwgICAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgICAgIHxffCAgfF9fX19fXy9fLyBcXF9cXCAgfF98ICAgICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX3RleHQgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwidGV4dFwiLFxuICBcIlRleHQgQ29sb3JzXCIsXG4gIFwiVGV4dCBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwibGFiZWxcIixcbiAgXCJMYWJlbCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIGZvcm0gZWxlbWVudHMgbGFiZWxzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIFRleHQgQ29sb3JcIixcbiAgXCJOb3JtYWwgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI4MDBcIl0sXG4gIEdSRVlbXCIyMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJTZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiU2VsZWN0ZWQgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI5MDBcIl0sXG4gIEdSRVlbXCI1MFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX3RleHQubWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiVW5zZWxlY3RlZCB0ZXh0IGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX19fX18gX19fX19fX18gICBfX19fX19fX18gICBfX19fICBfICAgICAgICAgICAgICAgX19fX18gXyAgX19cbi8vICAgICB8X18gICBfX3wgIF9fX19cXCBcXCAvIC9fXyAgIF9ffCB8ICBfIFxcfCB8ICAgICAgICAvXFwgICAvIF9fX198IHwvIC9cbi8vICAgICAgICB8IHwgIHwgfF9fICAgXFwgViAvICAgfCB8ICAgIHwgfF8pIHwgfCAgICAgICAvICBcXCB8IHwgICAgfCAnIC9cbi8vICAgICAgICB8IHwgIHwgIF9ffCAgID4gPCAgICB8IHwgICAgfCAgXyA8fCB8ICAgICAgLyAvXFwgXFx8IHwgICAgfCAgPFxuLy8gICAgICAgIHwgfCAgfCB8X19fXyAvIC4gXFwgICB8IHwgICAgfCB8XykgfCB8X19fXyAvIF9fX18gXFwgfF9fX198IC4gXFxcbi8vICAgICAgICB8X3wgIHxfX19fX18vXy8gXFxfXFwgIHxffCAgICB8X19fXy98X19fX19fL18vICAgIFxcX1xcX19fX198X3xcXF9cXFxuLy9cbi8vXG5jb25zdCBjb2xvcnNfdGV4dF9ibGFjayA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJ0ZXh0QmxhY2tcIixcbiAgXCJUZXh0IENvbG9ycyBCbGFjayBCYWNrZ3JvdW5kXCIsXG4gIFwiVGV4dCBjb2xvcnMgdXNlZCBmb3IgYmxhY2sgYmFja2dyb3VuZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc190ZXh0X2JsYWNrLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIFRleHQgQ29sb3JcIixcbiAgXCJOb3JtYWwgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCIyMDBcIl0sXG4gIEdSRVlbXCIyMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0X2JsYWNrLm1ha2VfdmFyaWFibGUoXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJTZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiU2VsZWN0ZWQgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI1MFwiXSxcbiAgR1JFWVtcIjUwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIFRleHQgQ29sb3JcIixcbiAgXCJVbnNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiNjAwXCJdLFxuICBHUkVZW1wiNDAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vICAgICAgX19fX18gX19fX18gX19fXyAgXyAgIF8gICAgX19fX18gX19fXyAgXyAgICAgIF9fX18gIF9fX19fICAgX19fX19cbi8vICAgICB8XyAgIF8vIF9fX18vIF9fIFxcfCBcXCB8IHwgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICAgIHwgfHwgfCAgIHwgfCAgfCB8ICBcXHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgfF9fKSB8IChfX19cbi8vICAgICAgIHwgfHwgfCAgIHwgfCAgfCB8IC4gYCB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgICBffCB8fCB8X19ffCB8X198IHwgfFxcICB8IHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fX19cXF9fX19fXFxfX19fL3xffCBcXF98ICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2ljb24gPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiaWNvblwiLFxuICBcIkljb24gQ29sb3JzXCIsXG4gIFwiSWNvbiBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19pY29uLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIEljb24gQ29sb3JcIixcbiAgXCJDb2xvciBvZiBpY29ucyBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI4MDBcIl0sXG4gIEdSRVlbXCIyMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19pY29uLm1ha2VfdmFyaWFibGUoXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJTZWxlY3RlZCBJY29uIENvbG9yXCIsXG4gIFwiQ29sb3Igb2Ygc2VsZWN0ZWQgaWNvbnMgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiOTAwXCJdLFxuICBHUkVZW1wiNTBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19pY29uLm1ha2VfdmFyaWFibGUoXG4gIFwidW5zZWxlY3RlZFwiLFxuICBcIlVuc2VsZWN0ZWQgSWNvbiBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHVuc2VsZWN0ZWQgaWNvbnMgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiNjAwXCJdLFxuICBHUkVZW1wiNDAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vICAgICAgX19fXyAgICAgICAgICBfX19fXyBfICBfX19fX19fIF9fX19fICAgX19fXyAgXyAgICBfIF8gICBfIF9fX19fICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgICAvXFwgICAvIF9fX198IHwvIC8gX19fX3wgIF9fIFxcIC8gX18gXFx8IHwgIHwgfCBcXCB8IHwgIF9fIFxcICAgLyBfX19fLyBfXyBcXHwgfCAgICAvIF9fIFxcfCAgX18gXFwgLyBfX19ffFxuLy8gICAgIHwgfF8pIHwgLyAgXFwgfCB8ICAgIHwgJyAvIHwgIF9ffCB8X18pIHwgfCAgfCB8IHwgIHwgfCAgXFx8IHwgfCAgfCB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPCAvIC9cXCBcXHwgfCAgICB8ICA8fCB8IHxfIHwgIF8gIC98IHwgIHwgfCB8ICB8IHwgLiBgIHwgfCAgfCB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgIHwgfF8pIC8gX19fXyBcXCB8X19fX3wgLiBcXCB8X198IHwgfCBcXCBcXHwgfF9ffCB8IHxfX3wgfCB8XFwgIHwgfF9ffCB8IHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy9fLyAgICBcXF9cXF9fX19ffF98XFxfXFxfX19fX3xffCAgXFxfXFxcXF9fX18vIFxcX19fXy98X3wgXFxffF9fX19fLyAgIFxcX19fX19cXF9fX18vfF9fX19fX1xcX19fXy98X3wgIFxcX1xcX19fX18vXG5jb25zdCBjb2xvcnNfYmFja2dyb3VuZCA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJiYWNrZ3JvdW5kXCIsXG4gIFwiQmFja2dyb3VuZCBDb2xvcnNcIixcbiAgXCJCYWNrZ3JvdW5kIGNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuY29sb3JzX2JhY2tncm91bmQubWFrZV92YXJpYWJsZShcbiAgXCJub3JtYWxcIixcbiAgXCJOb3JtYWwgQmFja2dyb3VuZCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIG5vcm1hbCBmb3JtIGVsZW1lbnQgYmFja2dyb3VuZHNcIixcbiAgR1JFWVtcIjUwXCJdLFxuICBHUkVZW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFja2dyb3VuZC5tYWtlX3ZhcmlhYmxlKFxuICBcImhvdmVyXCIsXG4gIFwiSG92ZXIgQmFja2dyb3VuZCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIGZvcm0gZWxlbWVudCBiYWNrZ3JvdW5kcyB3aGVuIGhvdmVyaW5nXCIsXG4gIEdSRVlbXCI0MDBcIl0sXG4gIEdSRVlbXCI3MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19iYWNrZ3JvdW5kLm1ha2VfdmFyaWFibGUoXG4gIFwidW5zZWxlY3RlZFwiLFxuICBcIlVuc2VsZWN0ZWQgQmFja2dyb3VuZCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHVuc2VsZWN0ZWQgZm9ybSBlbGVtZW50IGJhY2tncm91bmRzXCIsXG4gIEdSRVlbXCIzMDBcIl0sXG4gIEdSRVlbXCI4MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fICAgX19fXyAgX19fX18gIF9fX19fICBfX19fX18gX19fX18gICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfCAgXyBcXCAvIF9fIFxcfCAgX18gXFx8ICBfXyBcXHwgIF9fX198ICBfXyBcXCAgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICB8IHxfKSB8IHwgIHwgfCB8X18pIHwgfCAgfCB8IHxfXyAgfCB8X18pIHwgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgfCAgXyA8fCB8ICB8IHwgIF8gIC98IHwgIHwgfCAgX198IHwgIF8gIC8gIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgIHwgfF8pIHwgfF9ffCB8IHwgXFwgXFx8IHxfX3wgfCB8X19fX3wgfCBcXCBcXCAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgIHxfX19fLyBcXF9fX18vfF98ICBcXF9cXF9fX19fL3xfX19fX198X3wgIFxcX1xcICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2JvcmRlciA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJib3JkZXJcIixcbiAgXCJCb3JkZXIgQ29sb3JzXCIsXG4gIFwiQm9yZGVyIGNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuY29sb3JzX2JvcmRlci5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBCb3JkZXIgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBub3JtYWwgZm9ybSBlbGVtZW50IGJvcmRlcnNcIixcbiAgR1JFWVtcIjcwMFwiXSxcbiAgR1JFWVtcIjMwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2JvcmRlci5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEJvcmRlciBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHVuc2VsZWN0ZWQgZm9ybSBlbGVtZW50IGJvcmRlcnNcIixcbiAgR1JFWVtcIjcwMFwiXSxcbiAgR1JFWVtcIjMwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX19fXyBfX19fICAgX19fX18gXyAgICBfICBfX19fX1xuLy8gICAgIHwgIF9fX18vIF9fIFxcIC8gX19fX3wgfCAgfCB8LyBfX19ffFxuLy8gICAgIHwgfF9fIHwgfCAgfCB8IHwgICAgfCB8ICB8IHwgKF9fX1xuLy8gICAgIHwgIF9ffHwgfCAgfCB8IHwgICAgfCB8ICB8IHxcXF9fXyBcXFxuLy8gICAgIHwgfCAgIHwgfF9ffCB8IHxfX19ffCB8X198IHxfX19fKSB8XG4vLyAgICAgfF98ICAgIFxcX19fXy8gXFxfX19fX3xcXF9fX18vfF9fX19fL1xuY29uc3QgY29sb3JzX2ZvY3VzID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImZvY3VzXCIsXG4gIFwiRm9jdXMgQ29sb3JzXCIsXG4gIFwiRm9jdXMgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfZm9jdXMubWFrZV92YXJpYWJsZShcbiAgXCJub3JtYWxcIixcbiAgXCJGb2N1cyBDb2xvclwiLFxuICBcIkNvbG9yIG9mIGZvY3Vzc2VkIGZvcm0gZWxlbWVudFwiLFxuICBPUkFOR0VbXCI2MDBcIl0sXG4gIE9SQU5HRVtcIjMwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX18gICAgICAgICAgIF9fX19fIF9fX19fIF9fX19fICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfCAgXyBcXCAgIC9cXCAgICAvIF9fX198XyAgIF8vIF9fX198ICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8XykgfCAvICBcXCAgfCAoX19fICAgfCB8fCB8ICAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgfCAgXyA8IC8gL1xcIFxcICBcXF9fXyBcXCAgfCB8fCB8ICAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8ICBfICAvIFxcX19fIFxcXG4vLyAgICAgfCB8XykgLyBfX19fIFxcIF9fX18pIHxffCB8fCB8X19fXyAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgIHxfX19fL18vICAgIFxcX1xcX19fX18vfF9fX19fXFxfX19fX3wgIFxcX19fX19cXF9fX18vfF9fX19fX1xcX19fXy98X3wgIFxcX1xcX19fX18vXG5jb25zdCBjb2xvcnNfYmFzaWMgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYmFzaWNcIixcbiAgXCJCYXNpYyBDb2xvcnNcIixcbiAgXCJCYXNpYyBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19iYXNpYy5tYWtlX3ZhcmlhYmxlKFxuICBcImdyZWVuXCIsXG4gIFwiQmFzaWMgR3JlZW4gQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIGdyZWVuIGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFRU5bXCIzMDBcIl0sXG4gIEdSRUVOW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJyZWRcIixcbiAgXCJCYXNpYyBSZWQgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIHJlZCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIFJFRFtcIjMwMFwiXSxcbiAgUkVEW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJibHVlXCIsXG4gIFwiQmFzaWMgQmx1ZSBDb2xvclwiLFxuICBcIkNvbW1vbmx5IHVzZWQgYmx1ZSBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEJMVUVbXCIzMDBcIl0sXG4gIEJMVUVbXCI5MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19iYXNpYy5tYWtlX3ZhcmlhYmxlKFxuICBcInllbGxvd1wiLFxuICBcIkJhc2ljIFllbGxvdyBDb2xvclwiLFxuICBcIkNvbW1vbmx5IHVzZWQgeWVsbG93IGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgWUVMTE9XW1wiMzAwXCJdLFxuICBPUkFOR0VbXCI5MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzNcbi8vICAgICAgIF9fX19fIF9fX19fIF9fX19fX19fX19fXyAgX19fX19cbi8vICAgICAgLyBfX19ffF8gICBffF9fXyAgLyAgX19fX3wvIF9fX198XG4vLyAgICAgfCAoX19fICAgfCB8ICAgIC8gL3wgfF9fICB8IChfX19cbi8vICAgICAgXFxfX18gXFwgIHwgfCAgIC8gLyB8ICBfX3wgIFxcX19fIFxcXG4vLyAgICAgIF9fX18pIHxffCB8XyAvIC9fX3wgfF9fX18gX19fXykgfFxuLy8gICAgIHxfX19fXy98X19fX18vX19fX198X19fX19ffF9fX19fL1xuY29uc3Qgc2l6ZXMgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcInNpemVcIixcbiAgXCJTaXplXCIsXG4gIFwiU2l6ZXMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuc2l6ZXMubWFrZV92YXJpYWJsZShcbiAgXCJoZWlnaHRcIixcbiAgXCJIZWlnaHRcIixcbiAgXCJEZWZhdWx0IGhlaWdodCB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4gIFwiMS4zcmVtXCIsXG4gIFwiMS4zcmVtXCIsXG4gIFwiTGVuZ3RoXCIsXG4gIHsgbWluOiAwLjEsIG1heDogMTAgfSxcbik7XG5cbnNpemVzLm1ha2VfdmFyaWFibGUoXG4gIFwidG91Y2hIZWlnaHRcIixcbiAgXCJUb3VjaCBIZWlnaHRcIixcbiAgXCJNaW5pbXVtIGhlaWdodCBmb3IgdG91Y2ggZGV2aWNlcyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4gIFwiMi4wcmVtXCIsXG4gIFwiMi4wcmVtXCIsXG4gIFwiTGVuZ3RoXCIsXG4gIHsgbWluOiAwLjEsIG1heDogMTAgfSxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgIF9fX19fXyBfX19fICBfICAgXyBfX19fX19fXG4vLyAgICAgfCAgX19fXy8gX18gXFx8IFxcIHwgfF9fICAgX198XG4vLyAgICAgfCB8X18gfCB8ICB8IHwgIFxcfCB8ICB8IHxcbi8vICAgICB8ICBfX3x8IHwgIHwgfCAuIGAgfCAgfCB8XG4vLyAgICAgfCB8ICAgfCB8X198IHwgfFxcICB8ICB8IHxcbi8vICAgICB8X3wgICAgXFxfX19fL3xffCBcXF98ICB8X3xcbmNvbnN0IGZvbnQgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcImZvbnRcIixcbiAgXCJGb250XCIsXG4gIFwiRm9udCBzZXR0aW5ncyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuXG5mb250Lm1ha2VfdmFyaWFibGUoXG4gIFwic2l6ZVwiLFxuICBcIkZvbnQgU2l6ZVwiLFxuICBcIkRlZmF1bHQgZm9udCBzaXplIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbiAgXCIwLjlyZW1cIixcbiAgXCIwLjlyZW1cIixcbiAgXCJMZW5ndGhcIixcbiAgeyBtaW46IDAuMSwgbWF4OiAxMCB9LFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoX3NpemVcIixcbiAgXCJUb3VjaCBGb250IFNpemVcIixcbiAgXCJGb250IHNpemUgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50cyBmb3IgdG91Y2ggZGV2aWNlc1wiLFxuICBcIjEuMXJlbVwiLFxuICBcIjEuMXJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgZXJyLCBvaywgdHlwZSBPcHRpb24sIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlLCBTdGF0ZVN1YiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgXCIuL3NoYXJlZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1PcHRpb25zIHt9XG5cbi8qKkNvbG9ycyBmb3IgZm9ybSBlbGVtZW50cyB0aGF0IGhhdmUgc2VsZWN0YWJsZSBjb2xvcnMqL1xuZXhwb3J0IGNvbnN0IEZvcm1Db2xvcnMgPSB7XG4gIE5vbmU6IFwibm9uZVwiLFxuICBCbGFjazogXCJibGFja1wiLFxuICBHcmVlbjogXCJncmVlblwiLFxuICBSZWQ6IFwicmVkXCIsXG4gIEJsdWU6IFwiYmx1ZVwiLFxuICBZZWxsb3c6IFwieWVsbG93XCIsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRm9ybUNvbG9ycyA9ICh0eXBlb2YgRm9ybUNvbG9ycylba2V5b2YgdHlwZW9mIEZvcm1Db2xvcnNdO1xuXG4vKipTaGFyZWQgY29tcG9uZW50IGNsYXNzIGZvciBvdGhlciBjb21wb25lbnRzIHRvIGluaGVyaXQgZnJvbSovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybUVsZW1lbnQgZXh0ZW5kcyBCYXNlIHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJAYWJzdHJhY3RAXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIHN0YXRpYyBhcHBseV9vcHRpb25zKF9lbGVtZW50OiBGb3JtRWxlbWVudCwgX29wdGlvbnM6IEZvcm1PcHRpb25zKSB7fVxufVxuXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4vLyAgICAgX18gICAgICBfXyAgICAgXyAgICAgXyAgICBfIF9fX19fXyAgIF9fX19fICBfX19fX18gICAgICAgICAgX19fX19cbi8vICAgICBcXCBcXCAgICAvIC9cXCAgIHwgfCAgIHwgfCAgfCB8ICBfX19ffCB8ICBfXyBcXHwgIF9fX198ICAgL1xcICAgfCAgX18gXFxcbi8vICAgICAgXFwgXFwgIC8gLyAgXFwgIHwgfCAgIHwgfCAgfCB8IHxfXyAgICB8IHxfXykgfCB8X18gICAgIC8gIFxcICB8IHwgIHwgfFxuLy8gICAgICAgXFwgXFwvIC8gL1xcIFxcIHwgfCAgIHwgfCAgfCB8ICBfX3wgICB8ICBfICAvfCAgX198ICAgLyAvXFwgXFwgfCB8ICB8IHxcbi8vICAgICAgICBcXCAgLyBfX19fIFxcfCB8X19ffCB8X198IHwgfF9fX18gIHwgfCBcXCBcXHwgfF9fX18gLyBfX19fIFxcfCB8X198IHxcbi8vICAgICAgICAgXFwvXy8gICAgXFxfXFxfX19fX19cXF9fX18vfF9fX19fX3wgfF98ICBcXF9cXF9fX19fXy9fLyAgICBcXF9cXF9fX19fL1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1WYWx1ZU9wdGlvbnM8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtT3B0aW9ucyB7XG4gIC8qKklEIGZvcm0gZm9ybSBlbGVtZW50ICovXG4gIGlkPzogSUQ7XG4gIC8qKlZhbHVlIGZvciBmb3JtIGVsZW1lbnQgKi9cbiAgdmFsdWU/OiBSVDtcbiAgdmFsdWVfYnlfc3RhdGU/OiBTdGF0ZTxSVCwgT3B0aW9uPHt9PiwgUlQ+O1xuICAvKipMb25nZXIgZGVzY3JpcHRpb24gd2hhdCBmb3JtIGVsZW1lbnQgZG9lcyAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqQ2hhbmdlIGxpc3RlbmVyIGZ1bmN0aW9uKi9cbiAgY2hhbmdlPzogKHZhbDogUlQpID0+IHZvaWQ7XG59XG5cbi8qKlNoYXJlZCBjbGFzcyBmb3IgYWxsIGNvbXBvbmVudHMgd2l0aCB2YWx1ZXMqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1WYWx1ZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJAYWJzdHJhY3RAXCI7XG4gIH1cblxuICBzdGF0aWMgYXBwbHlfb3B0aW9uczxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIGVsZW1lbnQ6IEZvcm1WYWx1ZTxSVCwgSUQ+LFxuICAgIG9wdGlvbnM6IEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPixcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMuZGVzY3JpcHRpb24pIGVsZW1lbnQuZGVzY3JpcHRpb24gPSBvcHRpb25zLmRlc2NyaXB0aW9uO1xuICAgIGlmIChvcHRpb25zLnZhbHVlX2J5X3N0YXRlKSBlbGVtZW50LnZhbHVlX2J5X3N0YXRlID0gb3B0aW9ucy52YWx1ZV9ieV9zdGF0ZTtcbiAgICBlbHNlIGlmIChvcHRpb25zLnZhbHVlICE9PSB1bmRlZmluZWQpIGVsZW1lbnQudmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIHN1cGVyLmFwcGx5X29wdGlvbnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICByZWFkb25seSBmb3JtX2lkOiBJRDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZvcm1faWQgPSBpZCBhcyBJRDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlNldHMgdGhlIGN1cnJlbnQgbGFiZWwgb2YgdGhlIGVsZW1lbnQqL1xuICBzZXQgZGVzY3JpcHRpb24odGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB0ZXh0O1xuICB9XG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbiB8fCBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9idWZmZXI/OiBSVDtcbiAgZ2V0IGJ1ZmZlcigpOiBSVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2J1ZmZlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc3RhdGU/OiBTdGF0ZTxSVCwgT3B0aW9uPHt9PiwgUlQ+O1xuICAjZnVuYz86IFN0YXRlU3ViPFJlc3VsdDxSVCwgc3RyaW5nPj47XG4gIC8qKlRoaXMgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIHNldCB2YWx1ZV9ieV9zdGF0ZShzdGF0ZTogU3RhdGU8UlQsIE9wdGlvbjx7fT4sIFJUPiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLiNmdW5jKSB0aGlzLmRldGFjaF9zdGF0ZSh0aGlzLiNmdW5jKTtcbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlKHN0YXRlLCAodmFsKSA9PiB7XG4gICAgICAgIGlmICh2YWwub2spIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsLnZhbHVlO1xuICAgICAgICAgIGlmICh0aGlzLiNlcnJvcikgdGhpcy5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHRoaXMuZXJyb3IgPSB2YWwuZXJyb3I7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlbGF0ZWQgPSBzdGF0ZS5yZWxhdGVkKCk7XG4gICAgICBpZiAocmVsYXRlZC5zb21lKSB0aGlzLnN0YXRlX3JlbGF0ZWQocmVsYXRlZC52YWx1ZSk7XG4gICAgfSBlbHNlIHRoaXMuc3RhdGVfcmVsYXRlZCh7fSk7XG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIC8qKlRoaXMgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIHNldCB2YWx1ZSh2YWw6IFJUKSB7XG4gICAgdGhpcy5fYnVmZmVyID0gdmFsO1xuICAgIHRoaXMubmV3X3ZhbHVlKHZhbCk7XG4gIH1cblxuICAvKipSZXR1cm5zIHZhbHVlIG9mIHRoZSBjb21wb25lbnQqL1xuICBnZXQgdmFsdWUoKTogUmVzdWx0PFJULCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVcbiAgICAgID8gZXJyKFwiU3RhdGUgYmFzZWQgY29tcG9uZW50XCIpXG4gICAgICA6IHR5cGVvZiB0aGlzLl9idWZmZXIgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBlcnIoXCJObyB2YWx1ZSB5ZXRcIilcbiAgICAgICAgOiBvayh0aGlzLl9idWZmZXIpO1xuICB9XG5cbiAgI2Vycm9yID0gZmFsc2U7XG4gIHNldCBlcnJvcihlcnI6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHRoaXMubmV3X2Vycm9yKGVycik7XG4gICAgICB0aGlzLiNlcnJvciA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNlcnJvcikge1xuICAgICAgdGhpcy5jbGVhcl9lcnJvcigpO1xuICAgICAgdGhpcy4jZXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipDbGVhcnMgdGhlIHZhbHVlIGFuZCBlcnJvciBvZiB0aGUgY29tcG9uZW50IGlmIG5vdCBzdGF0ZSBiYXNlZCovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMuX2J1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgdGhpcy5jbGVhcl9lcnJvcigpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gdmFsdWUgaXMgc2V0IGJ5IHZhbHVlIHNldHRlciBvciBzdGF0ZSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBuZXdfdmFsdWUodmFsOiBSVCk6IHZvaWQ7XG5cbiAgLyoqQ2xlYXJzIGZvcm0gZWxlbWVudCBncmFwaGljYWxseSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjbGVhcl92YWx1ZSgpOiB2b2lkO1xuXG4gIC8qKkNhbGxlZCB3aGVuIGVycm9yIGlzIHNldCBieSBlcnJvciBvciBzdGF0ZSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBuZXdfZXJyb3IodmFsOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKkNhbGxlZCB3aGVuIGVycm9yIGlzIGNsZWFyZWQgYnkgZXJyb3Igb3Igc3RhdGUqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2xlYXJfZXJyb3IoKTogdm9pZDtcblxuICAvKipDYWxsZWQgd2hlbiBzdGF0ZSBoYXMgcmVsYXRlZCBpbmZvcm1hdGlvbiAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiB7fSk6IHZvaWQ7XG59XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICAgICBfXyAgICAgIF9fICAgICBfICAgICBfICAgIF8gX19fX19fICBfXyAgICAgICAgICBfX19fX19fICBfX19fXyBfX19fX19fIF9fX19fX1xuLy8gICAgIFxcIFxcICAgIC8gL1xcICAgfCB8ICAgfCB8ICB8IHwgIF9fX198IFxcIFxcICAgICAgICAvIC8gIF9fIFxcfF8gICBffF9fICAgX198ICBfX19ffFxuLy8gICAgICBcXCBcXCAgLyAvICBcXCAgfCB8ICAgfCB8ICB8IHwgfF9fICAgICBcXCBcXCAgL1xcICAvIC98IHxfXykgfCB8IHwgICAgfCB8ICB8IHxfX1xuLy8gICAgICAgXFwgXFwvIC8gL1xcIFxcIHwgfCAgIHwgfCAgfCB8ICBfX3wgICAgIFxcIFxcLyAgXFwvIC8gfCAgXyAgLyAgfCB8ICAgIHwgfCAgfCAgX198XG4vLyAgICAgICAgXFwgIC8gX19fXyBcXHwgfF9fX3wgfF9ffCB8IHxfX19fICAgICBcXCAgL1xcICAvICB8IHwgXFwgXFwgX3wgfF8gICB8IHwgIHwgfF9fX19cbi8vICAgICAgICAgXFwvXy8gICAgXFxfXFxfX19fX19cXF9fX18vfF9fX19fX3wgICAgIFxcLyAgXFwvICAgfF98ICBcXF9cXF9fX19ffCAgfF98ICB8X19fX19ffFxuLyoqU2hhcmVkIGNsYXNzIGZvciBhbGwgY29tcG9uZW50cyB3aXRoIHZhbHVlcyovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybVZhbHVlV3JpdGU8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWU8UlQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhcm5faW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICN3YXJuX3RpbWVvdXQ/OiBudW1iZXI7XG4gICNjaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG4gICNjaGFuZ2U/OiAodmFsOiBSVCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5uYW1lID0gXCJ2YWxcIjtcbiAgfVxuXG4gIHNldCBjaGFuZ2UoZnVuYzogKHZhbDogUlQpID0+IHZvaWQpIHtcbiAgICB0aGlzLiNjaGFuZ2UgPSBmdW5jO1xuICB9XG4gIGdldCBjaGFuZ2UoKTogKCh2YWw6IFJUKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2NoYW5nZTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgaWYgaXQgaGFzIGNoYW5nZWQqL1xuICBnZXQgY2hhbmdlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY2hhbmdlZDtcbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnNldEN1c3RvbVZhbGlkaXR5KG1lc3NhZ2UpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgIGlmICh0aGlzLiN3YXJuX3RpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLiN3YXJuX3RpbWVvdXQpO1xuICAgIHRoaXMuI3dhcm5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YXJuX2lucHV0LnNldEN1c3RvbVZhbGlkaXR5KFwiXCIpO1xuICAgICAgdGhpcy53YXJuX2lucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfSwgNTAwMCk7XG4gIH1cblxuICAvKipGdW5jdGlvbiB0byBsaW1pdCB2YWx1ZSBlbnRlcmVkICovXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IFJUKTogUHJvbWlzZUxpa2U8UmVzdWx0PFJULCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUud3JpdGFibGUpIHJldHVybiB0aGlzLl9zdGF0ZS5saW1pdCh2YWwpO1xuICAgICAgZWxzZSByZXR1cm4gc3luY19yZXNvbHZlKGVycihcIk5vdCB3cml0YWJsZVwiKSk7XG4gICAgfSBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUob2sodmFsKSk7XG4gIH1cblxuICAvKipGdW5jdGlvbiB0byBjaGVjayB2YWx1ZSAqL1xuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBSVCk6IFByb21pc2VMaWtlPFJlc3VsdDxSVCwgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuX3N0YXRlLndyaXRhYmxlKSByZXR1cm4gdGhpcy5fc3RhdGUuY2hlY2sodmFsKTtcbiAgICAgIGVsc2UgcmV0dXJuIHN5bmNfcmVzb2x2ZShlcnIoXCJOb3Qgd3JpdGFibGVcIikpO1xuICAgIH0gZWxzZSByZXR1cm4gc3luY19yZXNvbHZlKG9rKHZhbCkpO1xuICB9XG5cbiAgLyoqRnVuY3Rpb24gdG8gdXBkYXRlIHZhbHVlKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNldF92YWx1ZV9saW1pdCh2YWw6IFJUKTogUHJvbWlzZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBjb25zdCBsaW1pdGVkID0gYXdhaXQgdGhpcy5saW1pdF92YWx1ZSh2YWwpO1xuICAgIGlmIChsaW1pdGVkLmVycikge1xuICAgICAgdGhpcy53YXJuKGxpbWl0ZWQuZXJyb3IpO1xuICAgICAgcmV0dXJuIGxpbWl0ZWQ7XG4gICAgfVxuICAgIHRoaXMuI3NldF92YWx1ZShsaW1pdGVkLnZhbHVlKTtcbiAgICByZXR1cm4gbGltaXRlZDtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIHVwZGF0ZSB2YWx1ZSovXG4gIHByb3RlY3RlZCBhc3luYyBzZXRfdmFsdWVfY2hlY2sodmFsOiBSVCk6IFByb21pc2U8UmVzdWx0PFJULCBzdHJpbmc+PiB7XG4gICAgY29uc3QgY2hlY2tlZCA9IGF3YWl0IHRoaXMuY2hlY2tfdmFsdWUodmFsKTtcbiAgICBpZiAoY2hlY2tlZC5lcnIpIHtcbiAgICAgIHRoaXMud2FybihjaGVja2VkLmVycm9yKTtcbiAgICAgIHJldHVybiBjaGVja2VkO1xuICAgIH1cbiAgICB0aGlzLiNzZXRfdmFsdWUoY2hlY2tlZC52YWx1ZSk7XG4gICAgcmV0dXJuIGNoZWNrZWQ7XG4gIH1cblxuICAjc2V0X3ZhbHVlKHZhbDogUlQpIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyID09PSB2YWwpIHRoaXMubmV3X3ZhbHVlKHZhbCk7XG4gICAgaWYgKHRoaXMuI2NoYW5nZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuI2NoYW5nZSh2YWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHdoaWxlIHVwZGF0aW5nIGNoYW5nZSBsaXN0ZW5lclwiLCBlKTtcbiAgICAgIH1cbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIGNvbnN0IGJ1ZmYgPSB0aGlzLl9idWZmZXI7XG4gICAgICB0aGlzLl9zdGF0ZS53cml0ZSEodmFsKS50aGVuKChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVyci5lcnIpIHtcbiAgICAgICAgICBpZiAoYnVmZiAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZShidWZmKTtcbiAgICAgICAgICB0aGlzLndhcm4oZXJyLmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmV3X3ZhbHVlKHZhbCk7XG4gICAgICB0aGlzLl9idWZmZXIgPSB2YWw7XG4gICAgICB0aGlzLiNjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHtcbiAgRm9ybUNvbG9ycyxcbiAgRm9ybVZhbHVlLFxuICBGb3JtVmFsdWVXcml0ZSxcbiAgdHlwZSBGb3JtVmFsdWVPcHRpb25zLFxufSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi4vLi4vc2hhcmVkXCI7XG5pbXBvcnQgXCIuL2J1dHRvbi5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtQnV0dG9uT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxib29sZWFuLCBJRD4ge1xuICAvKipCdXR0b25zIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqSWNvbiBmb3IgYnV0dG9uICovXG4gIGljb24/OiBTVkdGdW5jO1xuICAvKipGdW5jdGlvbiB0byBjYWxsIG9uIGJ1dHRvbiBjbGljayAqL1xuICBvbl9jbGljaz86ICgpID0+IHZvaWQ7XG4gIC8qKlNldCB0cnVlIHRvIG1ha2UgYnV0dG9uIHRvZ2dsZSBvbiBjbGljayBpbnN0ZWFkIG9mIG5vcm1hbCAqL1xuICB0b2dnbGU/OiBib29sZWFuO1xuICAvKipDaGFuZ2VzIHRoZSBidXR0b25zIGNvbG9yICovXG4gIGNvbG9yPzogRm9ybUNvbG9ycztcbiAgLyoqQ2VudGVycyB0ZXh0IGFuZCBpY29uICovXG4gIGNlbnRlcj86IGJvb2xlYW47XG59XG5cbmNsYXNzIEZvcm1CdXR0b248SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIGJvb2xlYW4sXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJidXR0b25cIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3RleHQ6IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjb25fY2xpY2s/OiAoKSA9PiB2b2lkO1xuICAjdG9nZ2xlPzogYm9vbGVhbjtcbiAgI2ljb24/OiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG5cbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIik7XG4gICAgdGhpcy5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI29uX2NsaWNrKSB0aGlzLiNvbl9jbGljaygpO1xuICAgIH07XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcInRvdWNoXCIgJiYgZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIGlmICghdGhpcy4jdG9nZ2xlKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0cnVlKTtcbiAgICAgICAgdGhpcy5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2LnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWYgKHRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICBlbHNlIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKGZhbHNlKTtcbiAgICAgICAgICB0aGlzLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub250b3VjaHN0YXJ0ID0gKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoIXRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodHJ1ZSk7XG4gICAgICB0aGlzLm9udG91Y2hlbmQgPSAoZXYpID0+IHtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmIChldi50YXJnZXRUb3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGlmICh0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgZWxzZSB0aGlzLnNldF92YWx1ZV9jaGVjayhmYWxzZSk7XG4gICAgICAgICAgdGhpcy5vbnRvdWNoZW5kID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgY2FzZSBcIiBcIjpcbiAgICAgICAgY2FzZSBcIkVudGVyXCI6IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5vbmtleXVwID0gKGUpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkVudGVyXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCIgXCI6IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jdG9nZ2xlKSB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNvbl9jbGljaykgdGhpcy4jb25fY2xpY2soKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbmtleXVwID0gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGN1cnJlbnQgdGV4dCBvZiB0aGUgYnV0dG9uKi9cbiAgc2V0IHRleHQobGFiZWw6IHN0cmluZykge1xuICAgIHRoaXMuI3RleHQudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgfVxuICBnZXQgdGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGV4dC50ZXh0Q29udGVudDtcbiAgfVxuXG4gIC8qKkNoYW5nZXMgdGhlIGljb24gb2YgdGhlIGJ1dHRvbiovXG4gIHNldCBpY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikgdGhpcy4jaWNvbiA9IHRoaXMuaW5zZXJ0QmVmb3JlKGljb24oKSwgdGhpcy4jdGV4dCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqRnVuY3Rpb24gdG8gY2FsbCBvbiBidXR0b24gY2xpY2sqL1xuICBzZXQgb25fY2xpY2soZnVuYzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jb25fY2xpY2sgPSBmdW5jO1xuICB9XG4gIGdldCBvbl9jbGljaygpIHtcbiAgICByZXR1cm4gdGhpcy4jb25fY2xpY2s7XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBjb2xvciBvZiB0aGUgYnV0dG9uKi9cbiAgc2V0IGNvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMucmVtb3ZlQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShcImNvbG9yXCIsIGNvbG9yKTtcbiAgfVxuXG4gIC8qKkNlbnRlcnMgdGV4dCBhbmQgaWNvbiAqL1xuICBzZXQgY2VudGVyKGNlbnRlcjogYm9vbGVhbikge1xuICAgIGlmIChjZW50ZXIpIHRoaXMuY2xhc3NMaXN0LmFkZChcImNlbnRlclwiKTtcbiAgICBlbHNlIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImNlbnRlclwiKTtcbiAgfVxuXG4gIGdldCBjZW50ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKFwiY2VudGVyXCIpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gdmFsdWUgaXMgY2hhbmdlZCAqL1xuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlKSB0aGlzLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgZWxzZSB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5uZXdfdmFsdWUoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJUT0RPXCIsIGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxuXG4gIC8qKkNoYW5nZXMgd2hldGhlciB0aGUgYnV0dG9uIGlzIG1haW50YWluZWQgb3IgbW9tZW50YXJ5Ki9cbiAgc2V0IHRvZ2dsZSh0b2dnbGU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiN0b2dnbGUgPSBCb29sZWFuKHRvZ2dsZSk7XG4gIH1cbiAgZ2V0IHRvZ2dsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdG9nZ2xlO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtQnV0dG9uKTtcblxuLyoqQ3JlYXRlcyBhIGJ1dHRvbiBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2J1dHRvbjxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtQnV0dG9uT3B0aW9uczxJRD4sXG4pOiBGb3JtQnV0dG9uPElEPiB7XG4gIGNvbnN0IGJ1dHQgPSBuZXcgRm9ybUJ1dHRvbjxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnRleHQpIGJ1dHQudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICBpZiAob3B0aW9ucy5pY29uKSBidXR0Lmljb24gPSBvcHRpb25zLmljb247XG4gICAgaWYgKG9wdGlvbnMub25fY2xpY2spIGJ1dHQub25fY2xpY2sgPSBvcHRpb25zLm9uX2NsaWNrO1xuICAgIGlmIChvcHRpb25zLnRvZ2dsZSkgYnV0dC50b2dnbGUgPSBvcHRpb25zLnRvZ2dsZTtcbiAgICBpZiAob3B0aW9ucy5jb2xvcikgYnV0dC5jb2xvciA9IG9wdGlvbnMuY29sb3I7XG4gICAgaWYgKG9wdGlvbnMuY2VudGVyKSBidXR0LmNlbnRlciA9IG9wdGlvbnMuY2VudGVyO1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKGJ1dHQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBidXR0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUsIHR5cGUgRm9ybUNvbG9ycywgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vbGFtcC5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUxhbXBPcHRpb25zPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxULCBJRD4ge1xuICAvKipTZXRzIHRoZSBsYW1wIGNvbG9ycyAqL1xuICBjb2xvcnM6IEM7XG4gIC8qKkxhbXAgdGV4dCAqL1xuICB0ZXh0Pzogc3RyaW5nO1xuICAvKipJY29uIGZvciBsYW1wICovXG4gIGljb24/OiBTVkdGdW5jO1xuICAvKipDZW50ZXJzIHRleHQgYW5kIGljb24gKi9cbiAgY2VudGVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEZvcm1MYW1wPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibGFtcFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdGV4dDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uOiBTVkdTVkdFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAjY29sb3JzOiBGb3JtQ29sb3JzW10gPSBbXTtcblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGxhbXAqL1xuICBzZXQgdGV4dChsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdGV4dC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0LnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgbGFtcCovXG4gIHNldCBpY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikgdGhpcy4jaWNvbiA9IHRoaXMuaW5zZXJ0QmVmb3JlKGljb24oKSwgdGhpcy4jdGV4dCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGxhbXAqL1xuICBzZXQgY29sb3JzKGNvbG9yczogQykge1xuICAgIHRoaXMuI2NvbG9ycyA9IGNvbG9ycztcbiAgICB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlciEpO1xuICB9XG5cbiAgLyoqQ2VudGVycyB0ZXh0IGFuZCBpY29uICovXG4gIHNldCBjZW50ZXIoY2VudGVyOiBib29sZWFuKSB7XG4gICAgaWYgKGNlbnRlcikgdGhpcy5jbGFzc0xpc3QuYWRkKFwiY2VudGVyXCIpO1xuICAgIGVsc2UgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwiY2VudGVyXCIpO1xuICB9XG5cbiAgZ2V0IGNlbnRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoXCJjZW50ZXJcIik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlciB8IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuI2NvbG9yc1tOdW1iZXIodmFsdWUpXTtcbiAgICBpZiAoY29sb3IpIHRoaXMuc2V0QXR0cmlidXRlKFwiY29sb3JcIiwgY29sb3IpO1xuICAgIGVsc2UgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJjb2xvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImNvbG9yXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtTGFtcCk7XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5mdW5jdGlvbiBmcm9tPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1MYW1wT3B0aW9uczxcbiAgICBudW1iZXIsXG4gICAgW0Zvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIC4uLkZvcm1Db2xvcnNbXV0sXG4gICAgSURcbiAgPixcbik6IEZvcm1MYW1wPG51bWJlciwgW0Zvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIC4uLkZvcm1Db2xvcnNbXV0sIElEPjtcbmZ1bmN0aW9uIGZyb208SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybUxhbXBPcHRpb25zPGJvb2xlYW4sIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzXSwgSUQ+LFxuKTogRm9ybUxhbXA8Ym9vbGVhbiwgW0Zvcm1Db2xvcnMsIEZvcm1Db2xvcnNdLCBJRD47XG5mdW5jdGlvbiBmcm9tPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+KG9wdGlvbnM/OiBGb3JtTGFtcE9wdGlvbnM8VCwgQywgSUQ+KTogRm9ybUxhbXA8VCwgQywgSUQ+IHtcbiAgY29uc3QgbGFtcCA9IG5ldyBGb3JtTGFtcDxULCBDLCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGxhbXAuY29sb3JzID0gb3B0aW9ucy5jb2xvcnM7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgbGFtcC50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLmljb24pIGxhbXAuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5jZW50ZXIpIGxhbXAuY2VudGVyID0gb3B0aW9ucy5jZW50ZXI7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMobGFtcCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGxhbXA7XG59XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgY29uc3QgZm9ybV9sYW1wID0gZnJvbTtcbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybUNvbG9ycywgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3N3aXRjaC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3dpdGNoT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxib29sZWFuLCBJRD4ge1xuICAvKipJY29uIHRvIHVzZSBmb3IgbGVmdCBzaWRlKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkNvbG9yIHdoZW4gc3dpdGNoIGlzIG9uICovXG4gIG9uX2NvbG9yPzogRm9ybUNvbG9ycztcbiAgLyoqQ29sb3Igd2hlbiBzd2l0Y2ggaXMgb2ZmICovXG4gIG9mZl9jb2xvcj86IEZvcm1Db2xvcnM7XG59XG5cbmV4cG9ydCBjbGFzcyBGb3JtU3dpdGNoPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3dpdGNoXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNzd2l0Y2g6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI2ljb246IFNWR1NWR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICNwcmV2ZW50X2NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNzd2l0Y2guc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuI3N3aXRjaC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgY2FzZSBcIiBcIjoge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbmtleXVwID0gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgbGV0IGhhc19tb3ZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChoYXNfbW92ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IHRoaXMuI3N3aXRjaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pZF9jb3JkID0gYm94LnggKyBib3gud2lkdGggLyAyO1xuICAgICAgICAgICAgaWYgKGV2LmNsaWVudFggPiBtaWRfY29yZCkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFggLSBldi5jbGllbnRYKSA+IDEwIHx8XG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFkgLSBldi5jbGllbnRZKSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBoYXNfbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgaWYgKCFoYXNfbW92ZWQpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbmNsaWNrID0gKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLiNwcmV2ZW50X2NsaWNrKSByZXR1cm4gKHRoaXMuI3ByZXZlbnRfY2xpY2sgPSBmYWxzZSk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH07XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBzd2l0Y2gqL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3N3aXRjaCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgc2V0IG9uX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJvbi1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJvbi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IG9mZl9jb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLiNzd2l0Y2gucmVtb3ZlQXR0cmlidXRlKFwib2ZmLWNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy4jc3dpdGNoLnNldEF0dHJpYnV0ZShcIm9mZi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IGVycm9yX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuI3N3aXRjaC5jbGFzc0xpc3QuYWRkKFwib25cIik7XG4gICAgZWxzZSB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcIm9uXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMubmV3X3ZhbHVlKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX2Vycjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5hZGQoXCJlcnJvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcImVycm9yXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3dpdGNoKTtcblxuLyoqQ3JlYXRlcyBhIHN3aXRjaCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N3aXRjaDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU3dpdGNoT3B0aW9uczxJRD4sXG4pOiBGb3JtU3dpdGNoPElEPiB7XG4gIGNvbnN0IHN3aXQgPSBuZXcgRm9ybVN3aXRjaDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmljb24pIHN3aXQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jb2xvcikgc3dpdC5vbl9jb2xvciA9IG9wdGlvbnMub25fY29sb3I7XG4gICAgaWYgKG9wdGlvbnMub2ZmX2NvbG9yKSBzd2l0Lm9mZl9jb2xvciA9IG9wdGlvbnMub2ZmX2NvbG9yO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoc3dpdCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN3aXQ7XG59XG4iLCJpbXBvcnQgeyBBY2Nlc3NUeXBlcyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IGVyciwgb2ssIE9wdGlvbiwgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9ncm91cF9iYXNlLnNjc3NcIjtcblxuLyoqRGlmZmVyZW50IGJvcmRlciBzdHlsZXMgZm9yIHRoZSBjb21wb25lbnQgZ3JvdXAqL1xuZXhwb3J0IGNvbnN0IEZvcm1Hcm91cEJvcmRlclN0eWxlID0ge1xuICBOb25lOiBcIm5vbmVcIixcbiAgSW5zZXQ6IFwiaW5zZXRcIixcbiAgT3V0c2V0OiBcIm91dHNldFwiLFxuICBMaW5lOiBcImxpbmVcIixcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBGb3JtR3JvdXBCb3JkZXJTdHlsZSA9XG4gICh0eXBlb2YgRm9ybUdyb3VwQm9yZGVyU3R5bGUpW2tleW9mIHR5cGVvZiBGb3JtR3JvdXBCb3JkZXJTdHlsZV07XG5cbmV4cG9ydCB0eXBlIEdyb3VwRXh0cmFjdFZhbHM8QXJyIGV4dGVuZHMgYW55W10+ID0gQXJyIGV4dGVuZHMgW1xuICBpbmZlciBIZWFkLFxuICAuLi5pbmZlciBUYWlsLFxuXVxuICA/IEhlYWQgZXh0ZW5kcyBGb3JtVmFsdWU8aW5mZXIgVCwgaW5mZXIgSUQ+XG4gICAgPyBbRm9ybVZhbHVlPFQsIElEPiwgLi4uR3JvdXBFeHRyYWN0VmFsczxUYWlsPl1cbiAgICA6IFsuLi5Hcm91cEV4dHJhY3RWYWxzPFRhaWw+XVxuICA6IFtdO1xuXG5leHBvcnQgdHlwZSBHcm91cFRvS2V5VmFsPEFyciBleHRlbmRzIEZvcm1WYWx1ZTxhbnksIGFueT5bXT4gPSB7XG4gIFtLIGluIEFycltudW1iZXJdIGFzIEtbXCJmb3JtX2lkXCJdXTogSyBleHRlbmRzIEZvcm1WYWx1ZTxpbmZlciBULCBhbnk+XG4gICAgPyBUXG4gICAgOiBuZXZlcjtcbn07XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtR3JvdXBCYXNlPFxuICBSVCBleHRlbmRzIG9iamVjdCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcIkBhYnN0cmFjdEBcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbHVlX2VsZW1lbnRzOiBNYXA8c3RyaW5nLCBGb3JtVmFsdWU8YW55LCBhbnk+PiA9IG5ldyBNYXAoKTtcblxuICAvKipUaGlzIHBsYWNlcyB0aGUgZ3JvdXAgYXQgYW4gYWJzb2x1dGUgcG9zaXRpb24gaW4gb25lIG9mIHRoZSBjb3JuZXJzIG9mIHRoZSBjb250YWluZXIqL1xuICBzZXQgYm9yZGVyKGJvcmRlcjogRm9ybUdyb3VwQm9yZGVyU3R5bGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBGb3JtR3JvdXBCb3JkZXJTdHlsZS5JbnNldCxcbiAgICAgIEZvcm1Hcm91cEJvcmRlclN0eWxlLk91dHNldCxcbiAgICApO1xuICAgIGlmIChib3JkZXIgJiYgYm9yZGVyICE9PSBGb3JtR3JvdXBCb3JkZXJTdHlsZS5Ob25lKVxuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKGJvcmRlcik7XG4gIH1cblxuICBzZXQgbWF4X2hlaWdodChoZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoXCItLW1heF9oZWlnaHRcIiwgaGVpZ2h0ID8gaGVpZ2h0ICsgXCJyZW1cIiA6IFwibm9uZVwiKTtcbiAgICBpZiAoaGVpZ2h0KSB0aGlzLmNsYXNzTGlzdC5hZGQoXCJtYXhfaGVpZ2h0XCIpO1xuICAgIGVsc2UgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwibWF4X2hlaWdodFwiKTtcbiAgfVxuXG4gIHNldCBlbWJlZChlbWJlZDogYm9vbGVhbikge1xuICAgIGlmIChlbWJlZCkgdGhpcy5jbGFzc0xpc3QuYWRkKFwiZW1iZWRcIik7XG4gICAgZWxzZSB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJlbWJlZFwiKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IFJUKSB7XG4gICAgc3VwZXIudmFsdWUgPSB2YWw7XG4gIH1cblxuICAvKipSZXR1cm5zIHZhbHVlIG9mIHRoZSBjb21wb25lbnQqL1xuICBnZXQgdmFsdWUoKTogUmVzdWx0PFJULCBzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHJldHVybiBlcnIoXCJTdGF0ZSBiYXNlZCBjb21wb25lbnRcIik7XG4gICAgY29uc3QgcmVzdWx0OiBSVCA9IHt9IGFzIFJUO1xuICAgIGZvciAoY29uc3QgW2tleSwgY29tcF0gb2YgdGhpcy52YWx1ZV9lbGVtZW50cykge1xuICAgICAgY29uc3QgdmFsID0gY29tcC52YWx1ZTtcbiAgICAgIGlmICh2YWwuZXJyKSByZXR1cm4gZXJyKFwiQ29tcG9uZW50IHdpdGggaWQgXCIgKyBrZXkgKyBcIiBoYXMgbm8gdmFsdWVcIik7XG4gICAgICByZXN1bHRba2V5IGFzIGtleW9mIFJUXSA9IHZhbC52YWx1ZSBhcyBSVFtrZXlvZiBSVF07XG4gICAgfVxuICAgIHJldHVybiBvayhyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IFJUKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsKVxuICAgICAgaWYgKHRoaXMudmFsdWVfZWxlbWVudHMuaGFzKGtleSkpXG4gICAgICAgIHRoaXMudmFsdWVfZWxlbWVudHMuZ2V0KGtleSkhLnZhbHVlID0gdmFsW2tleSBhcyBrZXlvZiBSVF07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb21wIG9mIHRoaXMudmFsdWVfZWxlbWVudHMudmFsdWVzKCkpIGNvbXAuY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBvbl9hY2Nlc3MoYWNjZXNzOiBBY2Nlc3NUeXBlcyk6IHZvaWQge1xuICAgIHN3aXRjaCAoYWNjZXNzKSB7XG4gICAgICBjYXNlIEFjY2Vzc1R5cGVzLlJlYWQ6IHtcbiAgICAgICAgdGhpcy50YWJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMub25mb2N1cyA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmZvY3VzKCk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBBY2Nlc3NUeXBlcy5Xcml0ZToge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcInRhYkluZGV4XCIpO1xuICAgICAgICB0aGlzLm9uZm9jdXMgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgdHlwZSBQcmV0dGlmeSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQsIEZvcm1WYWx1ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZ3JvdXAuc2Nzc1wiO1xuaW1wb3J0IHtcbiAgRm9ybUdyb3VwQmFzZSxcbiAgRm9ybUdyb3VwQm9yZGVyU3R5bGUsXG4gIEdyb3VwRXh0cmFjdFZhbHMsXG4gIEdyb3VwVG9LZXlWYWwsXG59IGZyb20gXCIuL2dyb3VwX2Jhc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtR3JvdXBPcHRpb25zPFxuICBMIGV4dGVuZHMgRm9ybUVsZW1lbnRbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxULCBJRD4ge1xuICAvKipFbGVtZW50cyB0byBhZGQgdG8gdGhlIGdyb3VwKi9cbiAgZWxlbWVudHM/OiBbLi4uTF07XG4gIC8qKkJvcmRlciBzdHlsZSBmb3IgZ3JvdXAqL1xuICBib3JkZXI/OiBGb3JtR3JvdXBCb3JkZXJTdHlsZTtcbiAgLyoqUmVtb3ZlcyBwYWRkaW5nIHdoZW4gdHJ1ZSBhbGxvd3MgZm9yIHB1dHRpbmcgZ3JvdXBzIGluIGdyb3VwcyB3aXRob3V0IHBhZGRpbmcgYnVpbGRpbmcgdXAgKi9cbiAgZW1iZWQ/OiBib29sZWFuO1xuICAvKipHcm91cCBtYXggaGVpZ2h0IGluIHJlbSwgdW5kZWZpbmVkIG1lYW5zIG5vIGxpbWl0Ki9cbiAgbWF4X2hlaWdodD86IG51bWJlcjtcbiAgLyoqQ29sdW1ucywgdHJ1ZSBpcyBldmVyeXRoaW5nIGluIG9uZSBjb2x1bW5zLCBqdXN0IGEgbnVtYmVyIHdpbGwgbWFrZSByZXBlYXRpbmcgY29sdW1ucyBvZiBtaW5pbXVtIHRoYXQgcmVtIHdpZHRoLCBhbiBhcnJheSB3aWxsIG1ha2UgZXhhY3RseSB0aGF0IG1hbnkgY29sdW1zIHdpdGggc3BlY2lmaWVkIHJlbSB3aWR0aHMgKi9cbiAgY29sdW1uPzogdHJ1ZSB8IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipSb3dzLCB0cnVlIGlzIGV2ZXJ5dGhpbmcgaW4gb25lIHJvdywganVzdCBhIG51bWJlciB3aWxsIG1ha2UgcmVwZWF0aW5nIHJvd3Mgb2YgbWluaW11bSB0aGF0IHJlbSBoZWlnaHQsIGFuIGFycmF5IHdpbGwgbWFrZSBleGFjdGx5IHRoYXQgbWFueSByb3dzIHdpdGggc3BlY2lmaWVkIHJlbSBoZWlnaHRzICovXG4gIHJvdz86IHRydWUgfCBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuLyoqQ29tcG9uZW50IGdyb3VwIGNsYXNzIHdoaWNoIGFsbG93cyB0byBhZGQgZWxlbWVudHMgYW5kIGNvbnRyb2xzIHRoZSBmbG93IG9mIHRoZSBlbGVtZW50cyovXG5leHBvcnQgY2xhc3MgRm9ybUdyb3VwPFxuICBSVCBleHRlbmRzIG9iamVjdCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybUdyb3VwQmFzZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJncm91cFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImZsZXgtY29sXCIpO1xuICB9XG5cbiAgc2V0IGNvbHVtbihjb2x1bW46IHRydWUgfCBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImdyaWQtcm93XCIsIFwiZ3JpZC1jb2xcIiwgXCJmbGV4LXJvd1wiLCBcImZsZXgtY29sXCIpO1xuICAgIGlmIChjb2x1bW4gPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImZsZXgtY29sXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJncmlkLWNvbFwiKTtcblxuICAgICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID1cbiAgICAgICAgICBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KFwiICsgY29sdW1uICsgXCIsIDFmcikpXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnMgPSBjb2x1bW5cbiAgICAgICAgICAubWFwKChjb2wpID0+IFwibWlubWF4KFwiICsgY29sICsgXCIsIDFmcilcIilcbiAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0IHJvdyhyb3c6IHRydWUgfCBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImdyaWQtcm93XCIsIFwiZ3JpZC1jb2xcIiwgXCJmbGV4LXJvd1wiLCBcImZsZXgtY29sXCIpO1xuICAgIGlmIChyb3cgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImZsZXgtcm93XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJncmlkLXJvd1wiKTtcbiAgICAgIGlmICh0eXBlb2Ygcm93ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuZ3JpZFRlbXBsYXRlUm93cyA9XG4gICAgICAgICAgXCJyZXBlYXQoYXV0by1maXQsIG1pbm1heChcIiArIHJvdyArIFwiLCAxZnIpKVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdHlsZS5ncmlkVGVtcGxhdGVSb3dzID0gcm93XG4gICAgICAgICAgLm1hcCgoY29sKSA9PiBcIm1pbm1heChcIiArIGNvbCArIFwiLCAxZnIpXCIpXG4gICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldCBlbGVtZW50cyhlbGVtZW50czogRm9ybUVsZW1lbnRbXSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBjb25zdCBjb21wID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIEZvcm1WYWx1ZSAmJiBjb21wLmZvcm1faWQpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWVfZWxlbWVudHMuaGFzKGNvbXAuZm9ybV9pZCBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRm9ybSBlbGVtZW50IHdpdGggZm9ybSBpZCBcIiArXG4gICAgICAgICAgICAgIGNvbXAuZm9ybV9pZCArXG4gICAgICAgICAgICAgIFwiIGFscmVhZHkgZXhpc3RzIGluIGdyb3VwXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlX2VsZW1lbnRzLnNldChjb21wLmZvcm1faWQgYXMgc3RyaW5nLCBjb21wKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29tcCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGVsZW1lbnRzKCk6IEZvcm1FbGVtZW50W10ge1xuICAgIHJldHVybiBbLi4udGhpcy52YWx1ZV9lbGVtZW50cy52YWx1ZXMoKV07XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Hcm91cCk7XG5cbi8qKkNyZWF0ZXMgYSBmb3JtIGdyb3VwIHdpdGggZWxlbWVudHMgaW4gYSBjb2x1bW4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2dyb3VwX2NvbDxcbiAgTCBleHRlbmRzIEZvcm1FbGVtZW50W10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBUIGV4dGVuZHMgb2JqZWN0ID0gUHJldHRpZnk8UGFydGlhbDxHcm91cFRvS2V5VmFsPEdyb3VwRXh0cmFjdFZhbHM8TD4+Pj4sXG4+KG9wdGlvbnM/OiBGb3JtR3JvdXBPcHRpb25zPEwsIElELCBUPik6IEZvcm1Hcm91cDxULCBJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtR3JvdXA8VCwgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5ib3JkZXIpIHNsaWRlLmJvcmRlciA9IG9wdGlvbnMuYm9yZGVyO1xuICAgIGlmIChvcHRpb25zLmVsZW1lbnRzKSBzbGlkZS5lbGVtZW50cyA9IG9wdGlvbnMuZWxlbWVudHM7XG4gICAgaWYgKG9wdGlvbnMubWF4X2hlaWdodCkgc2xpZGUubWF4X2hlaWdodCA9IG9wdGlvbnMubWF4X2hlaWdodDtcbiAgICBpZiAob3B0aW9ucy5lbWJlZCkgc2xpZGUuZW1iZWQgPSBvcHRpb25zLmVtYmVkO1xuICAgIGlmIChvcHRpb25zLmNvbHVtbikgc2xpZGUuY29sdW1uID0gb3B0aW9ucy5jb2x1bW47XG4gICAgZWxzZSBpZiAob3B0aW9ucy5yb3cpIHNsaWRlLnJvdyA9IG9wdGlvbnMucm93O1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKHNsaWRlLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gc2xpZGU7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IG5vZGVfY2xvbmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7XG4gIG1hdGVyaWFsX3VuZm9sZF9sZXNzX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3VuZm9sZF9tb3JlX3JvdW5kZWQsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWljb25zXCI7XG5pbXBvcnQge1xuICBBTklNQVRJT05fTEVWRUwsXG4gIEFOSU1BVElPTl9TUEVFRCxcbiAgQW5pbWF0aW9uTGV2ZWxzLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi10aGVtZVwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQsIEZvcm1PcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IEZvcm1Hcm91cEJhc2UgfSBmcm9tIFwiLi9ncm91cF9iYXNlXCI7XG5pbXBvcnQgXCIuL2dyb3VwX2NvbGxhcHNlci5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUdyb3VwQ29sbGFwc2VyT3B0aW9ucyBleHRlbmRzIEZvcm1PcHRpb25zIHtcbiAgLyoqV2V0aGVyIHRoZSBncm91cCBpcyBjb2xsYXBzZWQgaW5pdGlhbGx5Ki9cbiAgY29sbGFwc2VkPzogYm9vbGVhbjtcbiAgLyoqVGV4dCB0byBzaG93IG9uIHRoZSBjb2xsYXBzZXIgd2hlbiBvcGVuKi9cbiAgb3Blbl90ZXh0Pzogc3RyaW5nO1xuICAvKipUZXh0IHRvIHNob3cgb24gdGhlIGNvbGxhcHNlciB3aGVuIGNsb3NlZCovXG4gIGNsb3NlX3RleHQ/OiBzdHJpbmc7XG59XG5cbmNvbnN0IG9wZW5fdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xub3Blbl90ZXh0LnRleHRDb250ZW50ID0gXCJDb2xsYXBzZVwiO1xuY29uc3QgY2xvc2VfdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuY2xvc2VfdGV4dC50ZXh0Q29udGVudCA9IFwiRXhwYW5kXCI7XG5cbi8qKkNvbXBvbmVudCBncm91cCBjbGFzcyB3aGljaCBhbGxvd3MgdG8gYWRkIGVsZW1lbnRzIGFuZCBjb250cm9scyB0aGUgZmxvdyBvZiB0aGUgZWxlbWVudHMqL1xuZXhwb3J0IGNsYXNzIEZvcm1Hcm91cENvbGxhcHNlciBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJncm91cC1jb2xsYXBzZXJcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2dyb3VwO1xuICAjY29sbGFwc2VfYnV0dG9uO1xuICAjY29sbGFwc2VkOiBib29sZWFuID0gZmFsc2U7XG4gICNvcGVuX3RleHQgPSBub2RlX2Nsb25lKG9wZW5fdGV4dCk7XG4gICNjbG9zZV90ZXh0ID0gbm9kZV9jbG9uZShjbG9zZV90ZXh0KTtcblxuICBjb25zdHJ1Y3Rvcihncm91cDogRm9ybUdyb3VwQmFzZTxhbnksIGFueT4sIGNvbGxhcHNlZD86IGJvb2xlYW4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI2dyb3VwID0gdGhpcy5hcHBlbmRDaGlsZChncm91cCk7XG4gICAgaWYgKGNvbGxhcHNlZCkge1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKFwiY29sbGFwc2VkXCIpO1xuICAgICAgdGhpcy4jY29sbGFwc2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLnRhYkluZGV4ID0gMDtcbiAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24uYXBwZW5kQ2hpbGQoXG4gICAgICBjb2xsYXBzZWQgPyB0aGlzLiNjbG9zZV90ZXh0IDogdGhpcy4jb3Blbl90ZXh0LFxuICAgICk7XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLmFwcGVuZENoaWxkKG1hdGVyaWFsX3VuZm9sZF9sZXNzX3JvdW5kZWQoKSk7XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiAodGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQpO1xuICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgfHwgZS5rZXkgPT09IFwiIFwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQ7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCBncm91cChncm91cDogRm9ybUdyb3VwQmFzZTxhbnksIGFueT4pIHtcbiAgICBjb25zdCBvbGRfZ3JvdXAgPSB0aGlzLiNncm91cDtcbiAgICB0aGlzLiNncm91cCA9IHRoaXMucmVwbGFjZUNoaWxkKGdyb3VwLCBvbGRfZ3JvdXApO1xuICB9XG5cbiAgZ2V0IGdyb3VwKCk6IEZvcm1Hcm91cEJhc2U8YW55LCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy4jZ3JvdXA7XG4gIH1cblxuICBzZXQgY29sbGFwc2VkKGNvbGxhcHNlZDogYm9vbGVhbikge1xuICAgIGlmIChjb2xsYXBzZWQgJiYgIXRoaXMuI2NvbGxhcHNlZCkge1xuICAgICAgLy8jIEFuaW1hdGlvblxuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLnJlcGxhY2VDaGlsZHJlbihcbiAgICAgICAgdGhpcy4jY2xvc2VfdGV4dCxcbiAgICAgICAgbWF0ZXJpYWxfdW5mb2xkX21vcmVfcm91bmRlZCgpLFxuICAgICAgKTtcbiAgICAgIGlmIChBTklNQVRJT05fTEVWRUwuZ2V0KCkudmFsdWUgPT09IEFuaW1hdGlvbkxldmVscy5BbGwpIHtcbiAgICAgICAgdGhpcy4jZ3JvdXAuc3R5bGUub3ZlcmZsb3dZID0gXCJhdXRvXCI7XG4gICAgICAgIGNvbnN0IGZ1bGxfaGVpZ2h0ID0gdGhpcy4jZ3JvdXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLiNncm91cC5hbmltYXRlKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgbWF4SGVpZ2h0OiBmdWxsX2hlaWdodCB9LFxuICAgICAgICAgICAgeyBtYXhIZWlnaHQ6IFwiMHB4XCIsIHBhZGRpbmdCbG9jazogXCIwcHhcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZHVyYXRpb246IEFOSU1BVElPTl9TUEVFRC5nZXQoKS52YWx1ZSxcbiAgICAgICAgICAgIGVhc2luZzogXCJlYXNlLWluLW91dFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIGFuaW1hdGlvbi5vbmZpbmlzaCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJjb2xsYXBzZWRcIik7XG4gICAgICAgICAgdGhpcy4jZ3JvdXAuc3R5bGUub3ZlcmZsb3dZID0gXCJcIjtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImNvbGxhcHNlZFwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFjb2xsYXBzZWQgJiYgdGhpcy4jY29sbGFwc2VkKSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJjb2xsYXBzZWRcIik7XG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24ucmVwbGFjZUNoaWxkcmVuKFxuICAgICAgICB0aGlzLiNvcGVuX3RleHQsXG4gICAgICAgIG1hdGVyaWFsX3VuZm9sZF9sZXNzX3JvdW5kZWQoKSxcbiAgICAgICk7XG4gICAgICAvLyMgQW5pbWF0aW9uXG4gICAgICBpZiAoQU5JTUFUSU9OX0xFVkVMLmdldCgpLnZhbHVlID09PSBBbmltYXRpb25MZXZlbHMuQWxsKSB7XG4gICAgICAgIHRoaXMuI2dyb3VwLnN0eWxlLm92ZXJmbG93WSA9IFwiYXV0b1wiO1xuICAgICAgICBjb25zdCBmdWxsX2hlaWdodCA9IHRoaXMuI2dyb3VwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCArIFwicHhcIjtcbiAgICAgICAgY29uc3QgYW5pbWF0aW9uID0gdGhpcy4jZ3JvdXAuYW5pbWF0ZShcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IG1heEhlaWdodDogXCIwcHhcIiwgcGFkZGluZ0Jsb2NrOiBcIjBweFwiIH0sXG4gICAgICAgICAgICB7IG1heEhlaWdodDogZnVsbF9oZWlnaHQgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBBTklNQVRJT05fU1BFRUQuZ2V0KCkudmFsdWUsXG4gICAgICAgICAgICBlYXNpbmc6IFwiZWFzZS1pbi1vdXRcIixcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICBhbmltYXRpb24ub25maW5pc2ggPSAoKSA9PiAodGhpcy4jZ3JvdXAuc3R5bGUub3ZlcmZsb3dZID0gXCJcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI2NvbGxhcHNlZCA9IGNvbGxhcHNlZDtcbiAgfVxuICBnZXQgY29sbGFwc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjb2xsYXBzZWQ7XG4gIH1cblxuICBzZXQgb3Blbl90ZXh0KHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuI29wZW5fdGV4dC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICBzZXQgY2xvc2VfdGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLiNjbG9zZV90ZXh0LnRleHRDb250ZW50ID0gdGV4dDtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybUdyb3VwQ29sbGFwc2VyKTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fZ3JvdXBfY29sbGFwc2VyKFxuICBncm91cDogRm9ybUdyb3VwQmFzZTxhbnksIGFueT4sXG4gIG9wdGlvbnM/OiBGb3JtR3JvdXBDb2xsYXBzZXJPcHRpb25zLFxuKTogRm9ybUdyb3VwQ29sbGFwc2VyIHtcbiAgY29uc3Qgc2xpZGUgPSBuZXcgRm9ybUdyb3VwQ29sbGFwc2VyKGdyb3VwLCBvcHRpb25zPy5jb2xsYXBzZWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLm9wZW5fdGV4dCkgc2xpZGUub3Blbl90ZXh0ID0gb3B0aW9ucy5vcGVuX3RleHQ7XG4gICAgaWYgKG9wdGlvbnMuY2xvc2VfdGV4dCkgc2xpZGUuY2xvc2VfdGV4dCA9IG9wdGlvbnMuY2xvc2VfdGV4dDtcbiAgICBGb3JtRWxlbWVudC5hcHBseV9vcHRpb25zKHNsaWRlLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gc2xpZGU7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IExpc3RGaWVsZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWxpc3RcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vbGlzdF9maWVsZC5zY3NzXCI7XG5cbmV4cG9ydCBjbGFzcyBMaXN0Rm9ybUZpZWxkPFQgZXh0ZW5kcyBGb3JtRWxlbWVudD4gZXh0ZW5kcyBMaXN0RmllbGQge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImxpc3RmaWVsZFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICBzZXQgZWxlbWVudChjb21wb25lbnQ6IFQpIHtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbihjb21wb25lbnQpO1xuICB9XG5cbiAgZ2V0IGVsZW1lbnQoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgVDtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoTGlzdEZvcm1GaWVsZCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2xpc3RfZmllbGQ8VCBleHRlbmRzIEZvcm1FbGVtZW50PihlbGVtZW50OiBUKSB7XG4gIGNvbnN0IGZpZWxkID0gbmV3IExpc3RGb3JtRmllbGQ8VD4oKTtcbiAgZmllbGQuZWxlbWVudCA9IGVsZW1lbnQ7XG4gIHJldHVybiBmaWVsZDtcbn1cbiIsImltcG9ydCB7IG5vbmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVOdW1iZXJSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgXCIuL251bWJlcl9iYXNlLnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtTnVtYmVyT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gbnVtYmVyLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKkxvd2VyIGxpbWl0IGZvciBzbGlkZXIgdmFsdWUqL1xuICBtaW4/OiBudW1iZXI7XG4gIC8qKlVwcGVyIGxpbWl0IGZvciBzbGlkZXIgdmFsdWUqL1xuICBtYXg/OiBudW1iZXI7XG4gIC8qKkFtb3VudCBvZiBkZWNpbWFscyB0byBzaG93Ki9cbiAgZGVjaW1hbHM/OiBudW1iZXI7XG4gIC8qKlVuaXQgdG8gdXNlIGZvciBzbGlkZXIqL1xuICB1bml0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IG51bWJlcixcbj4gZXh0ZW5kcyBGb3JtTnVtYmVyT3B0aW9uczxJRCwgUlQ+IHtcbiAgLyoqU3RlcCBzaXplLCB1c2UgMCBmb3IgYXV0b21hdGljIHN0ZXAgc2l6ZSovXG4gIHN0ZXA/OiBudW1iZXI7XG4gIC8qKlN0YXJ0IGZvciBzdGVwLCB1c2UgMCBmb3IgYXV0b21hdGljICovXG4gIHN0YXJ0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IG51bWJlcixcbj4gZXh0ZW5kcyBGb3JtTnVtYmVyV3JpdGVPcHRpb25zPElELCBSVD4ge1xuICAvKip3ZXRoZXIgdGhlIGV2ZW50cyBhcmUgbGl2ZSBhcyB0aGUgc2xpZGVyIGlzIG1vdmVkIG9yIG9ubHkgd2hlbiBtb3Zpbmcgc3RvcHMgKi9cbiAgbGl2ZT86IGJvb2xlYW47XG4gIC8qKkljb24gdG8gdXNlIGZvciBkZWNyZWFzaW5nIHZhbHVlKi9cbiAgaWNvbl9kZWNyZWFzZT86IFNWR0Z1bmM7XG4gIC8qKkljb24gdG8gdXNlIGZvciBpbmNyZWFzaW5nIHZhbHVlKi9cbiAgaWNvbl9pbmNyZWFzZT86IFNWR0Z1bmM7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtTnVtYmVyV3JpdGU8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IG51bWJlcixcbj4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtTnVtYmVyV3JpdGU8SUQsIFJUPixcbiAgICBvcHRpb25zOiBGb3JtTnVtYmVyV3JpdGVPcHRpb25zPElELCBSVD4sXG4gICkge1xuICAgIGlmIChvcHRpb25zLnVuaXQpIGVsZW1lbnQudW5pdCA9IG9wdGlvbnMudW5pdDtcbiAgICBpZiAob3B0aW9ucy5kZWNpbWFscykgZWxlbWVudC5kZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgaWYgKG9wdGlvbnMubWluICE9PSB1bmRlZmluZWQpIGVsZW1lbnQubWluID0gb3B0aW9ucy5taW47XG4gICAgaWYgKG9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQpIGVsZW1lbnQubWF4ID0gb3B0aW9ucy5tYXg7XG4gICAgaWYgKG9wdGlvbnMuc3RlcCkgZWxlbWVudC5zdGVwID0gb3B0aW9ucy5zdGVwO1xuICAgIGlmIChvcHRpb25zLnN0YXJ0KSBlbGVtZW50LnN0YXJ0ID0gb3B0aW9ucy5zdGFydDtcbiAgICBzdXBlci5hcHBseV9vcHRpb25zKGVsZW1lbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgYWJzdHJhY3Qgc2V0IG1pbihtaW46IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgYWJzdHJhY3Qgc2V0IG1heChtYXg6IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0cyB0aGUgc2l6ZSBvZiBudW1iZXIgY2hhbmdlIHN0ZXBzKi9cbiAgYWJzdHJhY3Qgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXRzIHRoZSBzdGFydCBvZmZzZXQgZm9yIG51bWJlciBzdGVwcyovXG4gIGFic3RyYWN0IHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldHMgdGhlIGFtb3VudCBvZiBkZWNpbWFscyB0aGUgZWxlbWVudCBjYW4gaGF2ZSovXG4gIGFic3RyYWN0IHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0cyB0aGUgdW5pdCBvZiB0aGUgZWxlbWVudCovXG4gIGFic3RyYWN0IHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQocmVsYXRlZDogUGFydGlhbDxTdGF0ZU51bWJlclJlbGF0ZWQ+KTogdm9pZCB7XG4gICAgaWYgKHJlbGF0ZWQubWluKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1pblwiLCByZWxhdGVkLm1pbiwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1pblwiKTtcbiAgICBpZiAocmVsYXRlZC5tYXgpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4XCIsIHJlbGF0ZWQubWF4LCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4XCIpO1xuICAgIGlmIChyZWxhdGVkLnN0ZXApXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwic3RlcFwiLCByZWxhdGVkLnN0ZXAsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJzdGVwXCIpO1xuICAgIGlmIChyZWxhdGVkLnN0YXJ0KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcInN0YXJ0XCIsIHJlbGF0ZWQuc3RhcnQsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJzdGFydFwiKTtcbiAgICBpZiAocmVsYXRlZC5kZWNpbWFscylcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJkZWNpbWFsc1wiLCByZWxhdGVkLmRlY2ltYWxzLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwiZGVjaW1hbHNcIik7XG4gICAgaWYgKHJlbGF0ZWQudW5pdClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJ1bml0XCIsIHJlbGF0ZWQudW5pdCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInVuaXRcIik7XG4gIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgZ2V0X2N1cnNvcl9wb3NpdGlvbixcbiAgc2V0X2N1cnNvcl9lbmQsXG4gIHNldF9jdXJzb3JfcG9zaXRpb24sXG4gIHNldF9zZWxlY3Rpb25fYWxsLFxuICBzeW5jX3Jlc29sdmUsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB7IEZvcm1OdW1iZXJXcml0ZSwgdHlwZSBGb3JtTnVtYmVyV3JpdGVPcHRpb25zIH0gZnJvbSBcIi4uL251bWJlcl9iYXNlXCI7XG5pbXBvcnQgXCIuL251bWJlcl9pbnB1dC5zY3NzXCI7XG5cbi8qKlNsaWRlIFNlbGVjdG9yLCBkaXNwbGF5cyBhbGwgb3B0aW9ucyBpbiBhIHNsaWRlciovXG5jbGFzcyBOdW1iZXJJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtTnVtYmVyV3JpdGU8SUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJudW1iZXJpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjc2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI3VuaXQ6IHN0cmluZyA9IFwiXCI7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzdGVwOiBudW1iZXIgPSAwO1xuICAjc3RhcnQ6IG51bWJlciA9IDA7XG4gICNkZWNpbWFsczogbnVtYmVyID0gMDtcblxuICAjdmFsdWVfYm94ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbGVnZW5kID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI21heF9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbWluX2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy4jdmFsdWVfYm94LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IHRydWU7XG4gICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgICB9IGVsc2UgdGhpcy4jdmFsdWVfYm94LmZvY3VzKCk7XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3guYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmICh0aGlzLiNzZWxlY3RlZCkgcmV0dXJuO1xuICAgICAgc2V0X3NlbGVjdGlvbl9hbGwodGhpcy4jdmFsdWVfYm94KTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25ibHVyID0gKCkgPT4ge1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLiNzZXQoZmFsc2UpO1xuICAgICAgfSwgMCk7XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikgdGhpcy4jc2V0KHRydWUpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93VXBcIikgdGhpcy4jc3RlcF92YWx1ZSh0cnVlKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93RG93blwiKSB0aGlzLiNzdGVwX3ZhbHVlKGZhbHNlKTtcbiAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIHRoaXMub25iZWZvcmVpbnB1dCA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5pbnB1dFR5cGUgPT09IFwiaW5zZXJ0UGFyYWdyYXBoXCIpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGVsc2UgaWYgKGUuZGF0YSkge1xuICAgICAgICBpZiAoIS9bXFxkLC4tXS9nLnRlc3QoZS5kYXRhKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlbHNlIGlmICgvWywuXS9nLnRlc3QoZS5kYXRhKSAmJiB0aGlzLiNkZWNpbWFscyA9PT0gMClcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI21pbiA+PSAwICYmIC8tL2cudGVzdChlLmRhdGEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jICNzZXQoY3VyOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc2VsID0gZ2V0X2N1cnNvcl9wb3NpdGlvbih0aGlzLiN2YWx1ZV9ib3gpO1xuICAgIGNvbnN0IGJ1ZmYgPSB0aGlzLmJ1ZmZlcjtcbiAgICAoXG4gICAgICBhd2FpdCB0aGlzLnNldF92YWx1ZV9jaGVjayhcbiAgICAgICAgcGFyc2VGbG9hdCh0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQ/LnJlcGxhY2UoXCIsXCIsIFwiLlwiKSB8fCBcIlwiKSB8fCAwLFxuICAgICAgKVxuICAgIClcbiAgICAgIC5tYXBfZXJyKCgpID0+IHtcbiAgICAgICAgdGhpcy5uZXdfdmFsdWUoYnVmZiB8fCBNYXRoLm1heChNYXRoLm1pbigwLCB0aGlzLiNtYXgpLCB0aGlzLiNtaW4pKTtcbiAgICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy4jdmFsdWVfYm94KTtcbiAgICAgIH0pXG4gICAgICAubWFwKCgpID0+IHtcbiAgICAgICAgaWYgKCFjdXIpIHJldHVybjtcbiAgICAgICAgc2V0X2N1cnNvcl9wb3NpdGlvbih0aGlzLiN2YWx1ZV9ib3gsIHNlbCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGZvY3VzKG9wdGlvbnM/OiBGb2N1c09wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3guZm9jdXMob3B0aW9ucyk7XG4gIH1cblxuICBzZXQgdW5pdCh1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiN1bml0ID0gdW5pdCB8fCBcIlwiO1xuICAgIHRoaXMuI3VuaXRfYm94LnRleHRDb250ZW50ID0gdGhpcy4jdW5pdDtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG5cbiAgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZGVjaW1hbHMgPSBkZWMgfHwgMDtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG5cbiAgc2V0IG1pbihtaW46IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21pbiA9IG1pbiA/PyAtSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21pbl9sZWdlbmQoKSB7XG4gICAgdGhpcy4jbWluX2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtaW4gPT09IC1JbmZpbml0eSA/IFwiXCIgOiBcIk1pbjpcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXggPSBtYXggPz8gSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cbiAgI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpIHtcbiAgICB0aGlzLiNtYXhfbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21heCA9PT0gSW5maW5pdHkgPyBcIlwiIDogXCJNYXg6XCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cblxuICBzZXQgc3RlcChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGVwID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgc2V0IHN0YXJ0KHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0YXJ0ID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IHZhbC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCh2YWwsIHRoaXMuI21pbiksIHRoaXMuI21heCksXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZShsaW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGlmICh2YWwgPCB0aGlzLiNtaW4pXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNaW5pbXVtIHZhbHVlIFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGlmICh2YWwgPiB0aGlzLiNtYXgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNYXhpbXVtIHZhbHVlIFwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgdmFsLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUobGltKTtcbiAgfVxuXG4gICNzdGVwX3ZhbHVlKGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgdGhpcy4jc3RlcCB8fFxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIHRoaXMuI2RlY2ltYWxzID8gMSAvIHRoaXMuI2RlY2ltYWxzIDogMSxcbiAgICAgICAgTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmJ1ZmZlciB8fCAwKSAvIDE1MCksXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLnNldF92YWx1ZV9jaGVjaygodGhpcy5idWZmZXIgfHwgMCkgKyAoZGlyID8gc3RlcCA6IC1zdGVwKSk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KE51bWJlcklucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fbnVtYmVyX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8SUQ+LFxuKTogTnVtYmVySW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgTnVtYmVySW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBGb3JtTnVtYmVyV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBub25lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlTnVtYmVyUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IHsgdHlwZSBGb3JtTnVtYmVyT3B0aW9ucyB9IGZyb20gXCIuLi9udW1iZXJfYmFzZVwiO1xuaW1wb3J0IFwiLi9wcm9ncmVzcy5zY3NzXCI7XG5cbmV4cG9ydCBjbGFzcyBGb3JtUHJvZ3Jlc3M8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlPFxuICBudW1iZXIsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJwcm9ncmVzc1wiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbWluOiBudW1iZXIgPSAwO1xuICAjbWF4OiBudW1iZXIgPSAxMDA7XG4gICNzcGFuOiBudW1iZXIgPSAxMDA7XG4gICNkZWNpbWFsczogbnVtYmVyID0gMDtcbiAgI2JhcjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjdmFsOiBIVE1MU3BhbkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3VuaXQ6IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIHNldCBtaW4obWluOiBudW1iZXIpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW47XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIHNldCBtYXgobWF4OiBudW1iZXIpIHtcbiAgICB0aGlzLiNtYXggPSBtYXg7XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGFtb3VudCBvZiBkZWNpbWFscyB0aGUgZWxlbWVudCBjYW4gaGF2ZSovXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gTWF0aC5tYXgoZGVjID8/IDAsIDApO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgdW5pdCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQudGV4dENvbnRlbnQgPSB1bml0ID8/IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLiNiYXIuc3R5bGUud2lkdGggPVxuICAgICAgTWF0aC5taW4oTWF0aC5tYXgoKCh2YWx1ZSAtIHRoaXMuI21pbikgLyB0aGlzLiNzcGFuKSAqIDEwMCwgMCksIDEwMCkgK1xuICAgICAgXCIlXCI7XG4gICAgdGhpcy4jdmFsLnRleHRDb250ZW50ID0gdmFsdWUudG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jYmFyLnN0eWxlLndpZHRoID0gXCIwJVwiO1xuICAgIHRoaXMuI3ZhbC50ZXh0Q29udGVudCA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlTnVtYmVyUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5taW4pXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWluXCIsIHJlbGF0ZWQubWluLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWluXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhcIiwgcmVsYXRlZC5tYXgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhcIik7XG4gICAgaWYgKHJlbGF0ZWQuZGVjaW1hbHMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwiZGVjaW1hbHNcIiwgcmVsYXRlZC5kZWNpbWFscywgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcImRlY2ltYWxzXCIpO1xuICAgIGlmIChyZWxhdGVkLnVuaXQpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwidW5pdFwiLCByZWxhdGVkLnVuaXQsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJ1bml0XCIpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtUHJvZ3Jlc3MpO1xuXG4vKipDcmVhdGVzIGEgcHJvZ3Jlc3MgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9wcm9ncmVzczxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtTnVtYmVyT3B0aW9uczxJRD4sXG4pOiBGb3JtUHJvZ3Jlc3M8SUQ+IHtcbiAgY29uc3QgcHJvZyA9IG5ldyBGb3JtUHJvZ3Jlc3M8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubWluICE9PSBcInVuZGVmaW5lZFwiKSBwcm9nLm1pbiA9IG9wdGlvbnMubWluO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5tYXggIT09IFwidW5kZWZpbmVkXCIpIHByb2cubWF4ID0gb3B0aW9ucy5tYXg7XG4gICAgcHJvZy5kZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgcHJvZy51bml0ID0gb3B0aW9ucy51bml0O1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKHByb2csIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBwcm9nO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzeW5jX3Jlc29sdmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7XG4gIG1hdGVyaWFsX2FkZF9yb3VuZGVkLFxuICBtYXRlcmlhbF9yZW1vdmVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB7IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1tYXRoXCI7XG5pbXBvcnQgeyBlcnIsIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFNWR0Z1bmMgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdmdcIjtcbmltcG9ydCB7IEZvcm1OdW1iZXJXcml0ZSwgdHlwZSBGb3JtU3RlcHBlckJhc2VPcHRpb25zIH0gZnJvbSBcIi4uL251bWJlcl9iYXNlXCI7XG5pbXBvcnQgXCIuL3NsaWRlci5zY3NzXCI7XG5cbi8qKlNsaWRlIFNlbGVjdG9yLCBkaXNwbGF5cyBhbGwgb3B0aW9ucyBpbiBhIHNsaWRlciovXG5leHBvcnQgY2xhc3MgRm9ybVNsaWRlcjxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtTnVtYmVyV3JpdGU8XG4gIElELFxuICBudW1iZXJcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInNsaWRlclwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdW5pdDogc3RyaW5nID0gXCJcIjtcbiAgI2RlY2ltYWxzOiBudW1iZXIgPSAwO1xuICAjbWluOiBudW1iZXIgPSAtSW5maW5pdHk7XG4gICNtYXg6IG51bWJlciA9IEluZmluaXR5O1xuICAjc3BhbjogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzdGVwOiBudW1iZXIgPSAwO1xuICAjc3RhcnQ6IG51bWJlciA9IDA7XG4gICNsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gICNpY29uX2RlYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkKCkpLFxuICAgIGZhbHNlLFxuICApO1xuICAjc2xpZGUgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjbGVnZW5kID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNsZWZ0X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNyaWdodF9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjaWNvbl9pbmMgPSB0aGlzLiNzdGVwcGVyX2Z1bmMoXG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9hZGRfcm91bmRlZCgpKSxcbiAgICB0cnVlLFxuICApO1xuICAjc2xpZGVyID0gdGhpcy4jc2xpZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICN2YWx1ZV9ib3ggPSB0aGlzLiNzbGlkZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjdW5pdF9ib3ggPSB0aGlzLiNzbGlkZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy4jc2xpZGVyLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG5cbiAgICB0aGlzLm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuYnV0dG9uICE9PSAwKSByZXR1cm47XG4gICAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gXCJtb3VzZVwiICYmICF0aGlzLiNzbGlkZXIuY29udGFpbnMoZS50YXJnZXQgYXMgTm9kZSkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLiNzbGlkZXIuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgIGNvbnN0IGJveCA9IHRoaXMuI3NsaWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuI3NsaWRlci5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKVxuICAgICAgICA/IGUuY2xpZW50WCA+PSBib3gueFxuICAgICAgICAgID8gZS5jbGllbnRYIDw9IGJveC54ICsgYm94LndpZHRoXG4gICAgICAgICAgICA/IGJveC54IC0gZS5jbGllbnRYXG4gICAgICAgICAgICA6IC1ib3gud2lkdGhcbiAgICAgICAgICA6IDBcbiAgICAgICAgOiAtYm94LndpZHRoIC8gMjtcbiAgICAgIGlmICh0aGlzLiNtaW4gPT09IC1JbmZpbml0eSB8fCB0aGlzLiNtYXggPT09IEluZmluaXR5KSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuYnVmZmVyIHx8IDA7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbCA9ICh2YWx1ZSArPSBkaWZmIC8gNTApO1xuICAgICAgICAgIGlmICh0aGlzLiNsaXZlKVxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuc2V0X3ZhbHVlX2xpbWl0KHZhbCkpLm1hcCgodikgPT4gKHZhbHVlID0gdikpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgKGF3YWl0IHRoaXMubGltaXRfdmFsdWUodmFsKSkubWFwKCh2KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuI21vdmVfdmFsdWUodik7XG4gICAgICAgICAgICAgIHZhbHVlID0gdjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgbGV0IGRpZmYgPSB0aGlzLiN4X3RvX3BlcmMoZS5jbGllbnRYICsgb2Zmc2V0KSAtIDUwO1xuICAgICAgICB0aGlzLiNtb3ZlX3NsaWRlKHRoaXMuI3hfdG9fcGVyYyhlLmNsaWVudFggKyBvZmZzZXQpKTtcbiAgICAgICAgdGhpcy4jc2xpZGVyLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBjb25zdCBwZXJjID0gdGhpcy4jeF90b19wZXJjKGV2LmNsaWVudFggKyBvZmZzZXQpO1xuICAgICAgICAgIGRpZmYgPSAodGhpcy4jc3RlcCB8fCAxKSAqICgocGVyYyAtIDUwKSAqIDIpO1xuICAgICAgICAgIHRoaXMuI21vdmVfc2xpZGUocGVyYyk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJtb3ZlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVydXAgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgIGlmICghdGhpcy4jbGl2ZSkgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzbGlkZXIub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5idWZmZXIgfHwgMDtcbiAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShlLmNsaWVudFggKyBvZmZzZXQpO1xuICAgICAgICB0aGlzLiNzbGlkZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMuI21vdmVfYWJzb2x1dGUoZXYuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJtb3ZlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVydXAgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgIHRoaXMuI21vdmVfYWJzb2x1dGUoZXYuY2xpZW50WCArIG9mZnNldCwgdmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzbGlkZXIub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuI3NsaWRlLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiKSB0aGlzLiNzdGVwX3ZhbHVlKHRydWUpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dMZWZ0XCIpIHRoaXMuI3N0ZXBfdmFsdWUoZmFsc2UpO1xuICAgICAgZWxzZSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gIH1cblxuICBzZXQgdW5pdCh1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiN1bml0ID0gdW5pdCB8fCBcIlwiO1xuICAgIHRoaXMuI3VuaXRfYm94LnRleHRDb250ZW50ID0gdGhpcy4jdW5pdDtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVnZW5kKCk7XG4gIH1cblxuICBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWluID0gbWluID8/IC1JbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX21heCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gIH1cbiAgI3VwZGF0ZV9taW5fbGVnZW5kKCkge1xuICAgIHRoaXMuI2xlZnRfbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21pbiA9PT0gLUluZmluaXR5ID8gXCJcIiA6IFwiTWluOlwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgc2V0IG1heChtYXg6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heCA9IG1heCA/PyBJbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX21heCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVnZW5kKCk7XG4gIH1cblxuICAjdXBkYXRlX21heF9sZWdlbmQoKSB7XG4gICAgdGhpcy4jcmlnaHRfbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21heCA9PT0gSW5maW5pdHkgPyBcIlwiIDogdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgXCI6TWF4XCI7XG4gIH1cblxuICAjdXBkYXRlX21pbl9tYXgoKSB7XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgICBpZiAodGhpcy4jc3BhbiA9PT0gSW5maW5pdHkpIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICAgIGVsc2UgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gZGVjIHx8IDA7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RlcCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGFydCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIC8qKlNldCB3ZXRoZXIgdGhlIHNsaWRlciBpcyBpbiBsaXZlIG1vZGUqL1xuICBzZXQgbGl2ZShsaXZlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbGl2ZSA9IGxpdmUgfHwgZmFsc2U7XG4gIH1cblxuICBzZXQgaWNvbl9kZWNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2RlYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQoKSwgZmFsc2UpLFxuICAgICk7XG4gIH1cblxuICBzZXQgaWNvbl9pbmNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2luYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfYWRkX3JvdW5kZWQoKSwgdHJ1ZSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI21vdmVfdmFsdWUodmFsdWUpO1xuICAgIHRoaXMuI21vdmVfc2xpZGUoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCgoKC10aGlzLiNtaW4gKyB2YWx1ZSkgLyB0aGlzLiNzcGFuKSAqIDEwMCwgMCksIDEwMCksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgTWF0aC5taW4oTWF0aC5tYXgodmFsLCB0aGlzLiNtaW4pLCB0aGlzLiNtYXgpLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUobGltKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBpZiAodmFsIDwgdGhpcy4jbWluKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWluaW11bSB2YWx1ZSBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBpZiAodmFsID4gdGhpcy4jbWF4KVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWF4aW11bSB2YWx1ZSBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIHZhbCxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKGxpbSk7XG4gIH1cblxuICBhc3luYyAjbW92ZV9hYnNvbHV0ZSh4OiBudW1iZXIsIGxhc3Q/OiBudW1iZXIpIHtcbiAgICBjb25zdCBwZXJjID0gdGhpcy4jeF90b19wZXJjKHgpO1xuICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh0aGlzLiNwZXJjX3RvX3ZhbHVlKHBlcmMpKTtcbiAgICBlbHNlIHtcbiAgICAgIGlmIChsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxpbWl0X3ZhbHVlKHRoaXMuI3BlcmNfdG9fdmFsdWUocGVyYykpO1xuICAgICAgICBpZiAodmFsdWUub2spIHtcbiAgICAgICAgICB0aGlzLiNtb3ZlX3NsaWRlKCgoLXRoaXMuI21pbiArIHZhbHVlLnZhbHVlKSAvIHRoaXMuI3NwYW4pICogMTAwKTtcbiAgICAgICAgICB0aGlzLiNtb3ZlX3ZhbHVlKHZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRfdmFsdWVfbGltaXQodGhpcy4jcGVyY190b192YWx1ZShwZXJjKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI3hfdG9fcGVyYyh4OiBudW1iZXIpIHtcbiAgICBjb25zdCBib3ggPSB0aGlzLiNzbGlkZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoKHggLSBib3gueCkgLyBib3gud2lkdGgpICogMTAwKSk7XG4gIH1cblxuICAjcGVyY190b192YWx1ZShwZXJjOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKHBlcmMgLyAxMDApICogdGhpcy4jc3BhbiArIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKkF0dGFjaGVzIGNsaWNrIGFjdGlvbiB0byBvdmVyIHRpbWUgaW5jcmVhc2Ugc3BlZWQgb2Ygc3RlcHBpbmcgd2hlbiBob2xkaW5nIHN0ZXAgYnV0dG9ucyAqL1xuICAjc3RlcHBlcl9mdW5jKGljb246IFNWR1NWR0VsZW1lbnQsIGRpcjogYm9vbGVhbikge1xuICAgIGljb24ub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbGV0IGludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlcl9pbnRlcnZhbCA9IDA7XG4gICAgICAgIGxldCBzY2FsZXIgPSAyNTA7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzY2FsZXJfaW50ZXJ2YWwpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBpY29uLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICBpY29uLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWNvbi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpY29uLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc3RlcF92YWx1ZShkaXIpO1xuICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy4jc3RlcF92YWx1ZShkaXIpLCBzY2FsZXIpO1xuICAgICAgICAgIHNjYWxlcl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzY2FsZXIgPiAyMCkgc2NhbGVyIC89IDEuMTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGljb24ub25wb2ludGVydXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGludGVydmFsID09PSAwKSB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGljb247XG4gIH1cblxuICAjc3RlcF92YWx1ZShkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdGVwID1cbiAgICAgIHRoaXMuI3N0ZXAgfHxcbiAgICAgIE1hdGgubWF4KFxuICAgICAgICB0aGlzLiNkZWNpbWFscyA/IDEgLyB0aGlzLiNkZWNpbWFscyA6IDEsXG4gICAgICAgIE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5idWZmZXIgfHwgMCkgLyAxNTApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXRfdmFsdWVfY2hlY2soKHRoaXMuYnVmZmVyIHx8IDApICsgKGRpciA/IHN0ZXAgOiAtc3RlcCkpO1xuICB9XG5cbiAgI21vdmVfc2xpZGUocGVyYzogbnVtYmVyKSB7XG4gICAgdGhpcy4jc2xpZGVyLnN0eWxlLmxlZnQgPSBwZXJjICsgXCIlXCI7XG4gIH1cbiAgI21vdmVfdmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IHZhbHVlLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU2xpZGVyKTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fc2xpZGVyPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1TdGVwcGVyQmFzZU9wdGlvbnM8SUQ+LFxuKTogRm9ybVNsaWRlcjxJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtU2xpZGVyPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubGl2ZSkgc2xpZGUubGl2ZSA9IG9wdGlvbnMubGl2ZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2RlY3JlYXNlKSBzbGlkZS5pY29uX2RlY3JlYXNlID0gb3B0aW9ucy5pY29uX2RlY3JlYXNlO1xuICAgIGlmIChvcHRpb25zLmljb25faW5jcmVhc2UpIHNsaWRlLmljb25faW5jcmVhc2UgPSBvcHRpb25zLmljb25faW5jcmVhc2U7XG4gICAgRm9ybU51bWJlcldyaXRlLmFwcGx5X29wdGlvbnMoc2xpZGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzbGlkZTtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgc2xlZXAsIHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfYWRkX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vc3RlcHBlci5zY3NzXCI7XG5cbi8qKlNsaWRlIFNlbGVjdG9yLCBkaXNwbGF5cyBhbGwgb3B0aW9ucyBpbiBhIHNsaWRlciovXG5leHBvcnQgY2xhc3MgRm9ybVN0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPFxuICBJRCxcbiAgbnVtYmVyXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzdGVwcGVyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzdGVwOiBudW1iZXIgPSAwO1xuICAjc3RhcnQ6IG51bWJlciA9IDA7XG4gICNsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gICNpY29uX2RlYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkKCkpLFxuICAgIGZhbHNlLFxuICApO1xuICAjdGV4dCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjaWNvbl9pbmMgPSB0aGlzLiNzdGVwcGVyX2Z1bmMoXG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9hZGRfcm91bmRlZCgpKSxcbiAgICB0cnVlLFxuICApO1xuICAjdmFsdWVfYm94ID0gdGhpcy4jdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuI3RleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbGVnZW5kID0gdGhpcy4jdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNtYXhfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI21pbl9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIik7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuXG4gICAgdGhpcy4jdmFsdWVfYm94LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIik7XG4gICAgdGhpcy4jdmFsdWVfYm94LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIGxldCBkcmFnX2Jsb2NrZXIgPSBmYWxzZTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25mb2N1cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGRyYWdfYmxvY2tlciA9IHRydWU7XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25ibHVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgZHJhZ19ibG9ja2VyID0gZmFsc2U7XG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKFxuICAgICAgICBwYXJzZUZsb2F0KHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8ucmVwbGFjZShcIixcIiwgXCIuXCIpIHx8IFwiXCIpIHx8IDAsXG4gICAgICApO1xuICAgIH07XG4gICAgbGV0IHJlc2V0ID0gKCkgPT4ge307XG4gICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCAmJiAoZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCB8fCAhZHJhZ19ibG9ja2VyKSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb25zdCBpbml0aWFsX3ZhbCA9IHRoaXMuYnVmZmVyIHx8IDA7XG4gICAgICAgIGxldCBtb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jdGV4dC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3RleHQub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChtb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuI21vdmVfZGlmZihcbiAgICAgICAgICAgICAgaW5pdGlhbF92YWwgKyAoKGV2LmNsaWVudFggLSBlLmNsaWVudFgpIC8gMTApICogKHRoaXMuI3N0ZXAgfHwgMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC0gZXYuY2xpZW50WCkgPiA1KSB7XG4gICAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3guY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICAgICAgbW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc2V0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICB0aGlzLiN0ZXh0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJtb3ZlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiN0ZXh0Lm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgaWYgKCFtb3ZpbmcgJiYgZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCkge1xuICAgICAgICAgICAgdGhpcy4jdmFsdWVfYm94LmZvY3VzKCk7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRoaXMuI3ZhbHVlX2JveC5maXJzdENoaWxkISk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLm93bmVyRG9jdW1lbnQ/LmRlZmF1bHRWaWV3Py5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobW92aW5nKSB7XG4gICAgICAgICAgICB0aGlzLiNtb3ZlX2RpZmYoXG4gICAgICAgICAgICAgIGluaXRpYWxfdmFsICsgKChldi5jbGllbnRYIC0gZS5jbGllbnRYKSAvIDEwKSAqICh0aGlzLiNzdGVwIHx8IDEpLFxuICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1vdmluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIiB8fCBlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuI3N0ZXBfdmFsdWUoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAocmVzZXQpIHJlc2V0KCk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0aGlzLiN2YWx1ZV9ib3ggJiZcbiAgICAgICAgICAvW1xcZCwuLV0vZy50ZXN0KGUua2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB0aGlzLiN2YWx1ZV9ib3guYmx1cigpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiIHx8IGUua2V5ID09PSBcIkFycm93TGVmdFwiKVxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uYmVmb3JlaW5wdXQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuaW5wdXRUeXBlID09PSBcImluc2VydFBhcmFncmFwaFwiKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZS5kYXRhKSB7XG4gICAgICAgIGlmICghL1tcXGQsLi1dL2cudGVzdChlLmRhdGEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKC9bLC5dL2cudGVzdChlLmRhdGEpICYmIHRoaXMuI2RlY2ltYWxzID09PSAwKVxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgKHRoaXMuI21pbiA+PSAwICYmIC8tL2cudGVzdChlLmRhdGEpKSB8fFxuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8uaW5jbHVkZXMoXCItXCIpXG4gICAgICAgIClcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgZGVjaW1hbHMoZGVjOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNkZWNpbWFscyA9IGRlYyB8fCAwO1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWluID0gbWluID8/IC1JbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWluX2xlZ2VuZCgpIHtcbiAgICB0aGlzLiNtaW5fbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21pbiA9PT0gLUluZmluaXR5ID8gXCJcIiA6IFwiTWluOlwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgc2V0IG1heChtYXg6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heCA9IG1heCA/PyBJbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21heF9sZW5nZW5kKCkge1xuICAgIHRoaXMuI21heF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWF4ID09PSBJbmZpbml0eSA/IFwiXCIgOiBcIk1heDpcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHNldCBzdGVwKHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0ZXAgPSBzdGVwIHx8IDA7XG4gIH1cblxuICBzZXQgc3RhcnQoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RhcnQgPSBzdGVwIHx8IDA7XG4gIH1cblxuICAvKipTZXQgd2V0aGVyIHRoZSBzbGlkZXIgaXMgaW4gbGl2ZSBtb2RlKi9cbiAgc2V0IGxpdmUobGl2ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2xpdmUgPSBsaXZlIHx8IGZhbHNlO1xuICB9XG5cbiAgc2V0IGljb25fZGVjcmVhc2UoaWNvbjogU1ZHRnVuYyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucmVwbGFjZUNoaWxkKFxuICAgICAgdGhpcy4jaWNvbl9kZWMsXG4gICAgICB0aGlzLiNzdGVwcGVyX2Z1bmMoaWNvbiA/IGljb24oKSA6IG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkKCksIGZhbHNlKSxcbiAgICApO1xuICB9XG5cbiAgc2V0IGljb25faW5jcmVhc2UoaWNvbjogU1ZHRnVuYyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucmVwbGFjZUNoaWxkKFxuICAgICAgdGhpcy4jaWNvbl9pbmMsXG4gICAgICB0aGlzLiNzdGVwcGVyX2Z1bmMoaWNvbiA/IGljb24oKSA6IG1hdGVyaWFsX2FkZF9yb3VuZGVkKCksIHRydWUpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLiNtb3ZlX3ZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgTWF0aC5taW4oTWF0aC5tYXgodmFsLCB0aGlzLiNtaW4pLCB0aGlzLiNtYXgpLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUobGltKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBpZiAodmFsIDwgdGhpcy4jbWluKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWluaW11bSB2YWx1ZSBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBpZiAodmFsID4gdGhpcy4jbWF4KVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWF4aW11bSB2YWx1ZSBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIHZhbCxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKGxpbSk7XG4gIH1cblxuICAvKipNb3ZlcyB0aGUgdmFsdWUgdG8gYSBwb3NpdGlvbiBieSB0aGUgbW91c2UgeCBjb29yZGluYXRlcyovXG4gIGFzeW5jICNtb3ZlX2RpZmYodmFsdWU6IG51bWJlciwgbGFzdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2xpbWl0KHZhbHVlKTtcbiAgICBlbHNlIHtcbiAgICAgIGlmIChsYXN0KSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgbGltID0gYXdhaXQgdGhpcy5saW1pdF92YWx1ZSh2YWx1ZSk7XG4gICAgICAgIGlmIChsaW0ub2spIHRoaXMuI21vdmVfdmFsdWUobGltLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipNb3ZlcyB0aGUgc2xpZGVyIHRvIHRoZSBnaXZlbiBwZXJjZW50IHBvc2l0aW9uKi9cbiAgI21vdmVfdmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IHZhbHVlLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgLyoqQXR0YWNoZXMgY2xpY2sgYWN0aW9uIHRvIG92ZXIgdGltZSBpbmNyZWFzZSBzcGVlZCBvZiBzdGVwcGluZyB3aGVuIGhvbGRpbmcgc3RlcCBidXR0b25zICovXG4gICNzdGVwcGVyX2Z1bmMoaWNvbjogU1ZHU1ZHRWxlbWVudCwgZGlyOiBib29sZWFuKSB7XG4gICAgaWNvbi5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBsZXQgaW50ZXJ2YWwgPSAwO1xuICAgICAgICBsZXQgc2NhbGVyX2ludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlciA9IDI1MDtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9ICgpID0+IHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICBjbGVhckludGVydmFsKHNjYWxlcl9pbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIGljb24ub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgICAgIGljb24ucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgICBpY29uLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgIH07XG4gICAgICAgIGljb24uc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICBpY29uLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgc2NhbGVyX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjYWxlciA+IDIwKSBzY2FsZXIgLz0gMS4xO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHRoaXMuI3N0ZXBfdmFsdWUoZGlyKSwgc2NhbGVyKTtcbiAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgaWNvbi5vbnBvaW50ZXJ1cCA9ICgpID0+IHtcbiAgICAgICAgICBpZiAoaW50ZXJ2YWwgPT09IDApIHRoaXMuI3N0ZXBfdmFsdWUoZGlyKTtcbiAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gaWNvbjtcbiAgfVxuXG4gICNzdGVwX3ZhbHVlKGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgdGhpcy4jc3RlcCB8fFxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIHRoaXMuI2RlY2ltYWxzID8gMSAvIHRoaXMuI2RlY2ltYWxzIDogMSxcbiAgICAgICAgTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmJ1ZmZlciB8fCAwKSAvIDE1MCksXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLnNldF92YWx1ZV9jaGVjaygodGhpcy5idWZmZXIgfHwgMCkgKyAoZGlyID8gc3RlcCA6IC1zdGVwKSk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1TdGVwcGVyKTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fc3RlcHBlcjxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU3RlcHBlckJhc2VPcHRpb25zPElEPixcbik6IEZvcm1TdGVwcGVyPElEPiB7XG4gIGNvbnN0IHNsaWRlID0gbmV3IEZvcm1TdGVwcGVyPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubGl2ZSkgc2xpZGUubGl2ZSA9IG9wdGlvbnMubGl2ZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2RlY3JlYXNlKSBzbGlkZS5pY29uX2RlY3JlYXNlID0gb3B0aW9ucy5pY29uX2RlY3JlYXNlO1xuICAgIGlmIChvcHRpb25zLmljb25faW5jcmVhc2UpIHNsaWRlLmljb25faW5jcmVhc2UgPSBvcHRpb25zLmljb25faW5jcmVhc2U7XG4gICAgRm9ybU51bWJlcldyaXRlLmFwcGx5X29wdGlvbnMoc2xpZGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzbGlkZTtcbn1cbiIsImltcG9ydCB7IHNvbWUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCBzdGF0ZSwgeyB0eXBlIFN0YXRlRW51bVJlbGF0ZWQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtU2VsZWN0b3JPcHRpb248UlQ+IHtcbiAgLyoqVmFsdWUgdG8gc2V0IHdoZW4gb3B0aW9uIGlzIHNlbGVjdGVkICovXG4gIHZhbHVlOiBSVDtcbiAgLyoqVGV4dCBmb3Igc2VsZWN0aW9uICovXG4gIHRleHQ6IHN0cmluZztcbiAgLyoqSWNvbiB0byBkaXNwbGF5IGZvciBvcHRpb24qL1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtU2VsZWN0b3JCYXNlT3B0aW9uczxcbiAgVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxULCBJRD4ge1xuICAvKipPcHRpb25zIGZvciBzZWxlY3RvciovXG4gIHNlbGVjdGlvbnM/OiBGb3JtU2VsZWN0b3JPcHRpb248VD5bXTtcbn1cblxuLyoqQmFzZSBmb3IgbnVtYmVyIGVsZW1lbnRzIGVsZW1lbnRzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtU2VsZWN0b3JCYXNlPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8UlQsIElEPiB7XG4gIC8qKlNldHMgdGhlIHNlbGVjdGlvbiBvcHRpb25zIGZvciB0aGUgc2VsZWN0b3IgKi9cbiAgYWJzdHJhY3Qgc2V0IHNlbGVjdGlvbnMoc2VsZWN0aW9uczogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPltdIHwgdW5kZWZpbmVkKTtcblxuICBzdGF0aWMgYXBwbHlfb3B0aW9uczxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIGVsZW1lbnQ6IEZvcm1TZWxlY3RvckJhc2U8UlQsIElEPixcbiAgICBvcHRpb25zOiBGb3JtU2VsZWN0b3JCYXNlT3B0aW9uczxSVCwgSUQ+LFxuICApIHtcbiAgICBpZiAob3B0aW9ucy5zZWxlY3Rpb25zKSBlbGVtZW50LnNlbGVjdGlvbnMgPSBvcHRpb25zLnNlbGVjdGlvbnM7XG4gICAgc3VwZXIuYXBwbHlfb3B0aW9ucyhlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVFbnVtUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5saXN0KSB7XG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wX21hcChcbiAgICAgICAgXCJzZWxlY3Rpb25zXCIsXG4gICAgICAgIHJlbGF0ZWQubGlzdCxcbiAgICAgICAgKCkgPT4gc29tZShbXSksXG4gICAgICAgICh2YWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gc29tZShcbiAgICAgICAgICAgIHN0YXRlLmUubWFwKHZhbCwgKGtleSwgdmFsKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGV4dDogdmFsLm5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGtleSBhcyBSVCxcbiAgICAgICAgICAgICAgICBpY29uOiB2YWwuaWNvbixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZSwgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQge1xuICBtYXRlcmlhbF9jbG9zZV9yb3VuZGVkLFxuICBtYXRlcmlhbF91bmZvbGRfbGVzc19yb3VuZGVkLFxuICBtYXRlcmlhbF91bmZvbGRfbW9yZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQge1xuICBGb3JtU2VsZWN0b3JCYXNlLFxuICB0eXBlIEZvcm1TZWxlY3RvckJhc2VPcHRpb25zLFxuICB0eXBlIEZvcm1TZWxlY3Rvck9wdGlvbixcbn0gZnJvbSBcIi4uL3NlbGVjdG9yX2Jhc2VcIjtcbmltcG9ydCBcIi4vZHJvcF9kb3duLnNjc3NcIjtcblxuaW50ZXJmYWNlIFNlbE9wdGlvbnMge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGljb24/OiBTVkdGdW5jO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Ecm9wRG93bk9wdGlvbnM8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtU2VsZWN0b3JCYXNlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqRGVmYXVsdCB0ZXh0IGRpc3BsYXllZCovXG4gIGRlZmF1bHQ/OiBzdHJpbmc7XG4gIC8qKkRlZmF1bHQgaWNvbiBkaXNwbGF5ZWQqL1xuICBkZWZhdWx0X2ljb24/OiBTVkdGdW5jO1xufVxuXG4vKipEcm9wZG93biBib3ggZm9yIHNlbGVjdGluZyBiZXR3ZWVuIG11bHRpcGxlIGNob2ljZXMgaW4gYSBzbWFsbCBzcGFjZSovXG5leHBvcnQgY2xhc3MgRm9ybURyb3Bkb3duPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVNlbGVjdG9yQmFzZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJkcm9wZG93blwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbWFwOiBNYXA8UlQsIFNlbE9wdGlvbnM+ID0gbmV3IE1hcCgpO1xuICAjdmFsdWVzOiBSVFtdID0gW107XG4gICNzZWxlY3RlZDogbnVtYmVyID0gLTE7XG5cbiAgI2ljb24/OiBTVkdTVkdFbGVtZW50O1xuICAjdGV4dDogSFRNTERpdkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjb3BlbjogU1ZHU1ZHRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfdW5mb2xkX21vcmVfcm91bmRlZCgpKTtcbiAgI2RlZmF1bHQ6IFRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlNlbGVjdCBzb21ldGhpbmdcIik7XG4gICNkZWZhdWx0X2ljb24/OiBTVkdGdW5jO1xuICBwcml2YXRlIGlzX29wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuI3RleHQuYXBwZW5kKHRoaXMuI2RlZmF1bHQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLnRhYkluZGV4ID0gMDtcbiAgICB0aGlzLm9uY2xpY2sgPSAoKSA9PiAodGhpcy5vcGVuID0gdHJ1ZSk7XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLnBvaW50ZXJUeXBlID09PSBcIm1vdXNlXCIpIHtcbiAgICAgICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiIFwiOlxuICAgICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFycm93RG93blwiOlxuICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMuI3NlbGVjdF9hZGphY2VudChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKkdldHMgdGhlIGRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQgd2hlbiBub3RoaW5nIGhhcyBiZWVuIHNlbGVjdGVkIHlldCAqL1xuICBnZXQgZGVmYXVsdCgpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVmYXVsdC5ub2RlVmFsdWUgfHwgXCJcIjtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQgd2hlbiBub3RoaW5nIGhhcyBiZWVuIHNlbGVjdGVkIHlldCAqL1xuICBzZXQgZGVmYXVsdChkZWY6IHN0cmluZykge1xuICAgIHRoaXMuI2RlZmF1bHQubm9kZVZhbHVlID0gZGVmO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgZGVmYXVsdCB0ZXh0IGRpc3BsYXllZCB3aGVuIG5vdGhpbmcgaGFzIGJlZW4gc2VsZWN0ZWQgeWV0ICovXG4gIHNldCBkZWZhdWx0X2ljb24oZGVmOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZGVmYXVsdF9pY29uID0gZGVmO1xuICAgIGlmIChkZWYgJiYgdGhpcy4jc2VsZWN0ZWQgPT09IC0xKSB0aGlzLiNzZXRfaWNvbiA9IGRlZjtcbiAgfVxuXG4gIHNldCBzZWxlY3Rpb25zKHNlbGVjdGlvbnM6IEZvcm1TZWxlY3Rvck9wdGlvbjxSVD5bXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLiNtYXAuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuI21hcC5jbGVhcigpO1xuICAgICAgdGhpcy4jdmFsdWVzID0gW107XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IC0xO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgc2VsZWN0aW9ucyAmJiBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgeyB2YWx1ZSwgdGV4dCwgaWNvbiB9ID0gc2VsZWN0aW9uc1tpXTtcbiAgICAgIHRoaXMuI21hcC5zZXQodmFsdWUsIHsgdGV4dCwgaWNvbiB9KTtcbiAgICAgIHRoaXMuI3ZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gIHNldCBvcGVuKG9wZW46IGJvb2xlYW4pIHtcbiAgICBpZiAob3BlbiAmJiAhdGhpcy5pc19vcGVuKSB7XG4gICAgICBjb25zdCBvbGQgPSB0aGlzLiNvcGVuO1xuICAgICAgdGhpcy4jb3BlbiA9IG1hdGVyaWFsX3VuZm9sZF9sZXNzX3JvdW5kZWQoKTtcbiAgICAgIG9sZC5yZXBsYWNlV2l0aCh0aGlzLiNvcGVuKTtcbiAgICAgIGJveC5vcGVuX21lbnUodGhpcy4jbWFwLCB0aGlzLCB0aGlzLmJ1ZmZlcik7XG4gICAgfSBlbHNlIGlmICghb3BlbiAmJiB0aGlzLmlzX29wZW4pIHtcbiAgICAgIGNvbnN0IG9sZCA9IHRoaXMuI29wZW47XG4gICAgICB0aGlzLiNvcGVuID0gbWF0ZXJpYWxfdW5mb2xkX21vcmVfcm91bmRlZCgpO1xuICAgICAgb2xkLnJlcGxhY2VXaXRoKHRoaXMuI29wZW4pO1xuICAgICAgYm94LmNsb3NlX21lbnUoKTtcbiAgICB9XG4gICAgdGhpcy5pc19vcGVuID0gb3BlbjtcbiAgfVxuXG4gIC8qKkNoYW5nZXMgdGhlIGljb24gb2YgdGhlIGJ1dHRvbiovXG4gIHNldCAjc2V0X2ljb24oaWNvbjogU1ZHRnVuYyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChpY29uKSB7XG4gICAgICBjb25zdCBpID0gaWNvbigpO1xuICAgICAgaWYgKHRoaXMuI2ljb24pIHRoaXMucmVwbGFjZUNoaWxkKGksIHRoaXMuI2ljb24pO1xuICAgICAgZWxzZSB0aGlzLmluc2VydEJlZm9yZShpLCB0aGlzLiN0ZXh0KTtcbiAgICAgIHRoaXMuI2ljb24gPSBpO1xuICAgIH0gZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqU2VsZWN0cyB0aGUgcHJldmlvdXMgb3IgbmV4dCBzZWxlY3Rpb24gaW4gdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGRpciBmYWxzZSBpcyBuZXh0IHRydWUgaXMgcHJldmlvdXMqL1xuICAjc2VsZWN0X2FkamFjZW50KGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihcbiAgICAgIHRoaXMuI3ZhbHVlcy5sZW5ndGggLSAxLFxuICAgICAgTWF0aC5tYXgoMCwgZGlyID8gdGhpcy4jc2VsZWN0ZWQgKyAxIDogdGhpcy4jc2VsZWN0ZWQgLSAxKSxcbiAgICApO1xuICAgIGlmICh5ICE9PSB0aGlzLiNzZWxlY3RlZCkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy4jdmFsdWVzW3ldKTtcbiAgfVxuXG4gICNjbGVhcigpIHtcbiAgICB0aGlzLmRlZmF1bHRfaWNvbiA9IHRoaXMuI2RlZmF1bHRfaWNvblxuICAgICAgPyAodGhpcy4jc2V0X2ljb24gPSB0aGlzLiNkZWZhdWx0X2ljb24pXG4gICAgICA6ICh0aGlzLiNzZXRfaWNvbiA9IHVuZGVmaW5lZCk7XG4gICAgdGhpcy4jdGV4dC5yZXBsYWNlQ2hpbGRyZW4odGhpcy4jZGVmYXVsdCk7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiBWYWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IFJUKSB7XG4gICAgaWYgKCF0aGlzLiNtYXAuaGFzKHZhbHVlKSkge1xuICAgICAgdGhpcy4jY2xlYXIoKTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gLTE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IHRoaXMuI21hcC5nZXQodmFsdWUpITtcbiAgICB0aGlzLiN0ZXh0LmlubmVyVGV4dCA9IG9wdC50ZXh0O1xuICAgIHRoaXMuI3NlbGVjdGVkID0gdGhpcy4jdmFsdWVzLmluZGV4T2YodmFsdWUpO1xuICAgIGlmIChvcHQuaWNvbikgdGhpcy4jc2V0X2ljb24gPSBvcHQuaWNvbjtcbiAgICBlbHNlIHRoaXMuI3NldF9pY29uID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI2NsZWFyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdXBlci53YXJuKG1lc3NhZ2UpO1xuICAgIH0sIDApO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtRHJvcGRvd24pO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9kcm9wZG93bjxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybURyb3BEb3duT3B0aW9uczxSVCwgSUQ+LFxuKTogRm9ybURyb3Bkb3duPFJULCBJRD4ge1xuICBjb25zdCBkcm9wID0gbmV3IEZvcm1Ecm9wZG93bjxSVCwgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0KSBkcm9wLmRlZmF1bHQgPSBvcHRpb25zLmRlZmF1bHQ7XG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdF9pY29uKSBkcm9wLmRlZmF1bHRfaWNvbiA9IG9wdGlvbnMuZGVmYXVsdF9pY29uO1xuICAgIEZvcm1TZWxlY3RvckJhc2UuYXBwbHlfb3B0aW9ucyhkcm9wLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gZHJvcDtcbn1cblxuLy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbmNsYXNzIERyb3BEb3duQm94IGV4dGVuZHMgQmFzZSB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiZHJvcGRvd25ib3hcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2Nsb3NlcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAjY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICNzY3JvbGw6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy4jY29udGFpbmVyLmFwcGVuZENoaWxkKFxuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICk7XG4gICN0YWJsZTogSFRNTERpdkVsZW1lbnQgPSB0aGlzLiNzY3JvbGwuYXBwZW5kQ2hpbGQoXG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgKTtcbiAgI2Ryb3Bkb3duOiBGb3JtRHJvcGRvd248YW55LCBhbnk+IHwgdW5kZWZpbmVkO1xuICAjZm9jdXNfb3V0X2hhbmRsZXIgPSAoZTogRm9jdXNFdmVudCkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghZS5yZWxhdGVkVGFyZ2V0IHx8ICF0aGlzLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCBhcyBOb2RlKSlcbiAgICAgIHRoaXMuY2xvc2VfbWVudSgpO1xuICB9O1xuICAjd2luZG93X3Jlc2l6ZV9oYW5kbGVyID0gKCkgPT4gdGhpcy5jbG9zZV9tZW51KCk7XG4gICNpc19vcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLiNjb250YWluZXIudGFiSW5kZXggPSAwO1xuICAgIHRoaXMuI2NvbnRhaW5lci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB0aGlzLmNsb3NlX21lbnUoKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93VXBcIiB8fCAoZS5zaGlmdEtleSAmJiBlLmtleSA9PT0gXCJUYWJcIikpIHtcbiAgICAgICAgY29uc3QgZWxlbSA9XG4gICAgICAgICAgZS50YXJnZXQgPT09IHRoaXMuI2NvbnRhaW5lclxuICAgICAgICAgICAgPyB0aGlzLiN0YWJsZS5sYXN0RWxlbWVudENoaWxkXG4gICAgICAgICAgICA6IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgaWYgKGVsZW0pIChlbGVtIGFzIEhUTUxFbGVtZW50KS5mb2N1cygpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIiB8fCBlLmtleSA9PT0gXCJUYWJcIikge1xuICAgICAgICBjb25zdCBlbGVtID1cbiAgICAgICAgICBlLnRhcmdldCA9PT0gdGhpcy4jY29udGFpbmVyXG4gICAgICAgICAgICA/IHRoaXMuI3RhYmxlLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgICAgICA6IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICBpZiAoZWxlbSkgKGVsZW0gYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICB0aGlzLiNjbG9zZXJcbiAgICAgIC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKVxuICAgICAgLmFwcGVuZENoaWxkKG1hdGVyaWFsX2Nsb3NlX3JvdW5kZWQoKSk7XG4gICAgdGhpcy4jY2xvc2VyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpLmlubmVySFRNTCA9IFwiQ2xvc2VcIjtcbiAgICB0aGlzLiNjbG9zZXIudGFiSW5kZXggPSAwO1xuICAgIHRoaXMuI2Nsb3Nlci5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNsb3NlX21lbnUoKTtcbiAgICB9O1xuICAgIHRoaXMuI2Nsb3Nlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2ZvY3VzX291dF9oYW5kbGVyLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgI3NldF92YWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIC8vQHRzLWV4cGVjdC1lcnJvciBDYWxsIHByaXZhdGUgbWV0aG9kIGZyb20gc2lzdGVyIGNsYXNzXG4gICAgaWYgKHRoaXMuI2Ryb3Bkb3duKSB0aGlzLiNkcm9wZG93bi5zZXRfdmFsdWVfY2hlY2sodmFsdWUpO1xuICAgIHRoaXMuY2xvc2VfbWVudSgpO1xuICB9XG5cbiAgb3Blbl9tZW51KFxuICAgIG1hcDogTWFwPGFueSwgU2VsT3B0aW9ucz4sXG4gICAgcGFyZW50OiBGb3JtRHJvcGRvd248YW55LCBhbnk+LFxuICAgIHZhbHVlOiBhbnksXG4gICkge1xuICAgIGNvbnN0IGlubmVyX2hlaWdodCA9IHRoaXMub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldz8uaW5uZXJIZWlnaHQgfHwgMDtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJvcGVuXCIpO1xuICAgIGNvbnN0IGJvdW5kcyA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC8gMiA8IGlubmVyX2hlaWdodCAvIDIpIHtcbiAgICAgIGNvbnN0IHRvcCA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS50b3AgPSB0b3AgKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUuYm90dG9tID0gXCJcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSBpbm5lcl9oZWlnaHQgLSB0b3AgLSAxMCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJjb2x1bW5cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYm90dG9tID0gaW5uZXJfaGVpZ2h0IC0gYm91bmRzLnk7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUudG9wID0gXCJcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBib3R0b20gKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUubWF4SGVpZ2h0ID0gaW5uZXJfaGVpZ2h0IC0gYm90dG9tIC0gMTAgKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUuZmxleERpcmVjdGlvbiA9IFwiY29sdW1uLXJldmVyc2VcIjtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmxlZnQgPSBib3VuZHMueCArIFwicHhcIjtcbiAgICB0aGlzLiNjb250YWluZXIuc3R5bGUud2lkdGggPSBib3VuZHMud2lkdGggKyBcInB4XCI7XG4gICAgdGhpcy4jZHJvcGRvd24gPSBwYXJlbnQ7XG5cbiAgICBpZiAodGhpcy4jc2Nyb2xsLnNjcm9sbEhlaWdodCA+IHRoaXMuI3Njcm9sbC5jbGllbnRIZWlnaHQpXG4gICAgICB0aGlzLiNzY3JvbGwuY2xhc3NMaXN0LmFkZChcInNjcm9sbFwiKTtcbiAgICBlbHNlIHRoaXMuI3Njcm9sbC5jbGFzc0xpc3QucmVtb3ZlKFwic2Nyb2xsXCIpO1xuXG4gICAgbGV0IGZvY3VzOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLiN0YWJsZS5yZXBsYWNlQ2hpbGRyZW4oXG4gICAgICAuLi5BcnJheS5mcm9tKG1hcCkubWFwKChbdmFsLCBvcHRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBjb25zdCBpY29uID0gbGluZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgaWYgKG9wdC5pY29uKSBpY29uLmFwcGVuZENoaWxkKG9wdC5pY29uKCkpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gbGluZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgdGV4dC50ZXh0Q29udGVudCA9IG9wdC50ZXh0O1xuICAgICAgICBsaW5lLm9ucG9pbnRlcnVwID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gXCJ0b3VjaFwiKSB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGluZS5vbmNsaWNrID0gKCkgPT4gdGhpcy4jc2V0X3ZhbHVlKHZhbCk7XG4gICAgICAgIGxpbmUudGFiSW5kZXggPSAwO1xuICAgICAgICBsaW5lLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmICh2YWwgPT09IHZhbHVlKSBmb2N1cyA9IGxpbmU7XG4gICAgICAgIHJldHVybiBsaW5lO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vU2hvdyBjbG9zZXIgb3Igbm90XG4gICAgY29uc3QgYm94ID0gdGhpcy4jc2Nyb2xsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGJveF9hcmVhID0gYm94LndpZHRoICogYm94LmhlaWdodDtcbiAgICBjb25zdCBodG1sID0gdGhpcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBodG1sX2FyZWEgPSBodG1sLmNsaWVudFdpZHRoICogaHRtbC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKGJveF9hcmVhID4gaHRtbF9hcmVhICogMC41KSB7XG4gICAgICB0aGlzLiN0YWJsZS5wcmVwZW5kKHRoaXMuI2Nsb3Nlcik7XG4gICAgfVxuXG4gICAgaWYgKGZvY3VzKSB7XG4gICAgICBmb2N1cy5mb2N1cygpO1xuICAgICAgZm9jdXMuY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkXCIpO1xuICAgIH0gZWxzZSB0aGlzLiNjb250YWluZXIuZm9jdXMoKTtcblxuICAgIHRoaXMub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldz8uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIFwicmVzaXplXCIsXG4gICAgICB0aGlzLiN3aW5kb3dfcmVzaXplX2hhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IHRydWUgfSxcbiAgICApO1xuICAgIHRoaXMuI2lzX29wZW4gPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VfbWVudSgpIHtcbiAgICBpZiAoIXRoaXMuI2lzX29wZW4pIHJldHVybjtcbiAgICB0aGlzLiNpc19vcGVuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuI2Ryb3Bkb3duKSB0aGlzLiNkcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwib3BlblwiKTtcbiAgICB0aGlzLiN0YWJsZS5yZXBsYWNlQ2hpbGRyZW4oKTtcbiAgICBpZiAodGhpcy4jZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuI2Ryb3Bkb3duLmZvY3VzKCk7XG4gICAgICAvL0B0cy1leHBlY3QtZXJyb3IgT3ZlcndyaXRlIHByaXZhdGUgcHJvcGVydHkgZnJvbSBzaXN0ZXIgY2xhc3NcbiAgICAgIHRoaXMuI2Ryb3Bkb3duLmlzX29wZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgXCJyZXNpemVcIixcbiAgICAgIHRoaXMuI3dpbmRvd19yZXNpemVfaGFuZGxlcixcbiAgICApO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChEcm9wRG93bkJveCk7XG5jb25zdCBib3ggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3IERyb3BEb3duQm94KCkpO1xuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQge1xuICBGb3JtU2VsZWN0b3JCYXNlLFxuICB0eXBlIEZvcm1TZWxlY3RvckJhc2VPcHRpb25zLFxuICB0eXBlIEZvcm1TZWxlY3Rvck9wdGlvbixcbn0gZnJvbSBcIi4uL3NlbGVjdG9yX2Jhc2VcIjtcbmltcG9ydCBcIi4vdG9nZ2xlX2J1dHRvbi5zY3NzXCI7XG5cbmludGVyZmFjZSBTZWxPcHRpb25zIHtcbiAgdG9wOiBIVE1MRGl2RWxlbWVudDtcbiAgYm90OiBIVE1MRGl2RWxlbWVudDtcbn1cblxuLyoqVG9nZ2xlIGJ1dHRvbnMsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgbXVsdGkgdG9nZ2xlciovXG5leHBvcnQgY2xhc3MgRm9ybVRvZ2dsZUJ1dHRvbjxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1TZWxlY3RvckJhc2U8UlQsIElEPiB7XG4gIC8qKlJldHVybnMgdGhlIG5hbWUgdXNlZCB0byBkZWZpbmUgdGhlIGVsZW1lbnQqL1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRvZ2dsZWJ1dHRvblwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbWFwOiBNYXA8UlQsIFNlbE9wdGlvbnM+ID0gbmV3IE1hcCgpO1xuICAjdmFsdWVzOiBSVFtdID0gW107XG4gICNzZWxlY3RlZDogbnVtYmVyID0gLTE7XG5cbiAgc2V0IHNlbGVjdGlvbnMoc2VsZWN0aW9uczogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPltdIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuI21hcC5zaXplID4gMCkge1xuICAgICAgdGhpcy4jbWFwLmNsZWFyKCk7XG4gICAgICB0aGlzLiN2YWx1ZXMgPSBbXTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gLTE7XG4gICAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgc2VsZWN0aW9ucyAmJiBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gc2VsZWN0aW9uc1tpXTtcbiAgICAgIHRoaXMuI21hcC5zZXQodmFsdWUsIHRoaXMuI2FkZF9zZWxlY3Rpb24oc2VsZWN0aW9uc1tpXSkpO1xuICAgICAgdGhpcy4jdmFsdWVzLnB1c2goc2VsZWN0aW9uc1tpXS52YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gIH1cblxuICAjYWRkX3NlbGVjdGlvbihzZWxlY3Rpb246IEZvcm1TZWxlY3Rvck9wdGlvbjxSVD4pIHtcbiAgICBjb25zdCB0b3AgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIHRvcC50YWJJbmRleCA9IDA7XG4gICAgY29uc3QgYm90ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICBpZiAoc2VsZWN0aW9uLmljb24pIHtcbiAgICAgIHRvcC5hcHBlbmRDaGlsZChzZWxlY3Rpb24uaWNvbigpKTtcbiAgICAgIGJvdC50ZXh0Q29udGVudCA9IHNlbGVjdGlvbi50ZXh0O1xuICAgIH0gZWxzZSB0b3AudGV4dENvbnRlbnQgPSBzZWxlY3Rpb24udGV4dDtcbiAgICBjb25zdCBjbGljayA9ICgpID0+IHtcbiAgICAgIHRvcC5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soc2VsZWN0aW9uLnZhbHVlKTtcbiAgICB9O1xuICAgIHRvcC5vbmNsaWNrID0gY2xpY2s7XG4gICAgYm90Lm9uY2xpY2sgPSBjbGljaztcbiAgICB0b3Aub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCIgXCIgfHwgZS5rZXkgPT09IFwiRW50ZXJcIikgY2xpY2soKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIikgdGhpcy4jc2VsZWN0X2FkamFjZW50KHRydWUpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dMZWZ0XCIpIHRoaXMuI3NlbGVjdF9hZGphY2VudChmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICByZXR1cm4geyB0b3AsIGJvdCB9O1xuICB9XG5cbiAgLyoqU2VsZWN0cyB0aGUgcHJldmlvdXMgb3IgbmV4dCBzZWxlY3Rpb24gaW4gdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGRpciBmYWxzZSBpcyBuZXh0IHRydWUgaXMgcHJldmlvdXMqL1xuICAjc2VsZWN0X2FkamFjZW50KGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHNlbCkgc2VsLnRvcC5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihcbiAgICAgIHRoaXMuI3ZhbHVlcy5sZW5ndGggLSAxLFxuICAgICAgTWF0aC5tYXgoMCwgZGlyID8gdGhpcy4jc2VsZWN0ZWQgKyAxIDogdGhpcy4jc2VsZWN0ZWQgLSAxKSxcbiAgICApO1xuICAgIGlmICh5ICE9PSB0aGlzLiNzZWxlY3RlZCkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy4jdmFsdWVzW3ldKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IFJUKTogdm9pZCB7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHByZXYudG9wLmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHByZXYuYm90LmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gdGhpcy4jbWFwLmdldCh2YWx1ZSkhO1xuICAgIGlmIChvcHQpIHtcbiAgICAgIG9wdC50b3AuY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkXCIpO1xuICAgICAgb3B0LmJvdC5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IHRoaXMuI3ZhbHVlcy5pbmRleE9mKHZhbHVlKTtcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIG9wdC50b3AuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHByZXYudG9wLmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHByZXYuYm90LmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRvZ2dsZUJ1dHRvbik7XG5cbi8qKkNyZWF0ZXMgYSB0b2dnbGUgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdG9nZ2xlX2J1dHRvbjxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPixcbik6IEZvcm1Ub2dnbGVCdXR0b248UlQsIElEPiB7XG4gIGNvbnN0IHRvZ2cgPSBuZXcgRm9ybVRvZ2dsZUJ1dHRvbjxSVCwgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIEZvcm1TZWxlY3RvckJhc2UuYXBwbHlfb3B0aW9ucyh0b2dnLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRvZ2c7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4uL3NoYXJlZFwiO1xuaW1wb3J0IFwiLi9zcGFjZXIuc2Nzc1wiO1xuXG5pbnRlcmZhY2UgRm9ybVNwYWNlck9wdGlvbnMge1xuICAvKipTcGFjaW5nIGFtb3VudCAgKi9cbiAgc3BhY2U/OiBudW1iZXI7XG59XG5cbmNsYXNzIEZvcm1TcGFjZXIgZXh0ZW5kcyBGb3JtRWxlbWVudCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3BhY2VyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipTZXRzIHRoZSBhbW91bnQgb2Ygc3BhY2UsIGluIHJlbSAqL1xuICBzZXQgc3BhY2Uoc3BhY2U6IG51bWJlcikge1xuICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gYCR7c3BhY2V9cmVtYDtcbiAgfVxuICBnZXQgc3BhY2UoKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpcy5zdHlsZS5oZWlnaHQpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3BhY2VyKTtcblxuLyoqQ3JlYXRlcyBhIHNwYWNlciBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3NwYWNlcihvcHRpb25zPzogRm9ybVNwYWNlck9wdGlvbnMpOiBGb3JtU3BhY2VyIHtcbiAgY29uc3Qgc3BhY2VyID0gbmV3IEZvcm1TcGFjZXIoKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5zcGFjZSkgc3BhY2VyLnNwYWNlID0gb3B0aW9ucy5zcGFjZTtcbiAgfVxuICByZXR1cm4gc3BhY2VyO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2NvbG9yX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtQ29sb3JJbnB1dE9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IHN0cmluZyxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4ge1xuICAvKipXaGV0aGVyIHRoZSBjb2xvciBpbnB1dCBzaG91bGQgdXBkYXRlIGxpdmUqL1xuICBsaXZlPzogYm9vbGVhbjtcbn1cblxuY2xhc3MgRm9ybUNvbG9ySW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImNvbG9yaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiY29sb3JcIjtcbiAgICB0aGlzLndhcm5faW5wdXQub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gIH1cblxuICBzZXQgbGl2ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiNsaXZlID0gdmFsO1xuICB9XG4gIGdldCBsaXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNsaXZlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIiMwMDAwMDBcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtQ29sb3JJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBjb2xvciBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2NvbG9yX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1Db2xvcklucHV0T3B0aW9uczxJRCwgc3RyaW5nPixcbik6IEZvcm1Db2xvcklucHV0PElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1Db2xvcklucHV0PElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubGl2ZSkgaW5wdXQubGl2ZSA9IG9wdGlvbnMubGl2ZTtcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIG1hdGVyaWFsX2NhbGVuZGFyX21vbnRoX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3NjaGVkdWxlX3JvdW5kZWQsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWljb25zXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2RhdGVfdGltZV9pbnB1dC5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVRpbWVJbnB1dE9wdGlvbnM8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4ge1xuICAvKipUeXBlIG9mIGRhdGUgdGltZSovXG4gIHR5cGU/OiBGb3JtRGF0ZVRpbWVUeXBlO1xufVxuXG5leHBvcnQgY29uc3QgRm9ybURhdGVUaW1lVHlwZSA9IHtcbiAgREFURTogXCJkYXRlXCIsXG4gIFRJTUU6IFwidGltZVwiLFxuICBEQVRFVElNRTogXCJkYXRldGltZVwiLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZvcm1EYXRlVGltZVR5cGUgPVxuICAodHlwZW9mIEZvcm1EYXRlVGltZVR5cGUpW2tleW9mIHR5cGVvZiBGb3JtRGF0ZVRpbWVUeXBlXTtcblxuY29uc3QgRGF0ZVRpbWVNb2RlID0ge1xuICBEQVRFOiBcImRhdGVcIixcbiAgU1RSSU5HOiBcInN0cmluZ1wiLFxuICBOVU1CRVI6IFwibnVtYmVyXCIsXG59IGFzIGNvbnN0O1xuXG5jbGFzcyBGb3JtRGF0ZVRpbWVJbnB1dDxcbiAgUlQgZXh0ZW5kcyBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJkYXRldGltZWlucHV0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN0eXBlOiBGb3JtRGF0ZVRpbWVUeXBlID0gRm9ybURhdGVUaW1lVHlwZS5EQVRFVElNRTtcbiAgI21vZGU6IHN0cmluZyA9IERhdGVUaW1lTW9kZS5EQVRFO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcImRhdGV0aW1lLWxvY2FsXCI7XG4gICAgdGhpcy53YXJuX2lucHV0LmxhbmcgPSBcImRhLURLXCI7XG4gICAgdGhpcy53YXJuX2lucHV0LnN0ZXAgPSBcIjAuMVwiO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX2NhbGVuZGFyX21vbnRoX3JvdW5kZWQoKSkub25jbGljayA9ICgpID0+XG4gICAgICB0aGlzLndhcm5faW5wdXQuc2hvd1BpY2tlcigpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfc2NoZWR1bGVfcm91bmRlZCgpKS5vbmNsaWNrID0gKCkgPT5cbiAgICAgIHRoaXMud2Fybl9pbnB1dC5zaG93UGlja2VyKCk7XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMud2Fybl9pbnB1dC52YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy4jbW9kZSA9PT0gRGF0ZVRpbWVNb2RlLkRBVEUpXG4gICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sobmV3IERhdGUodGhpcy53YXJuX2lucHV0LnZhbHVlQXNOdW1iZXIpIGFzIFJUKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy4jbW9kZSA9PT0gRGF0ZVRpbWVNb2RlLlNUUklORylcbiAgICAgICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUgYXMgUlQpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLiNtb2RlID09PSBEYXRlVGltZU1vZGUuTlVNQkVSKVxuICAgICAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZUFzTnVtYmVyIGFzIFJUKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqUmV0dXJucyB0aGUgZGF0ZSB0aW1lIHR5cGUqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdHlwZTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGRhdGUgdGltZSB0eXBlKi9cbiAgc2V0IHR5cGUodHlwZTogRm9ybURhdGVUaW1lVHlwZSkge1xuICAgIGlmICh0eXBlID09PSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEUpIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJkYXRlXCI7XG4gICAgaWYgKHR5cGUgPT09IEZvcm1EYXRlVGltZVR5cGUuVElNRSkgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcInRpbWVcIjtcbiAgICBpZiAodHlwZSA9PT0gRm9ybURhdGVUaW1lVHlwZS5EQVRFVElNRSlcbiAgICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJkYXRldGltZS1sb2NhbFwiO1xuICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqUmV0dXJucyB0aGUgZGF0ZSB0aW1lIHR5cGUqL1xuICBnZXQgc3RlcCgpIHtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMud2Fybl9pbnB1dC5zdGVwKTtcbiAgfVxuICAvKipTZXRzIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIHNldCBzdGVwKHN0ZXA6IG51bWJlcikge1xuICAgIHRoaXMud2Fybl9pbnB1dC5zdGVwID0gU3RyaW5nKHN0ZXApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogUlQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI21vZGUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHRoaXMuI21vZGUgPSBEYXRlVGltZU1vZGUuTlVNQkVSO1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB0aGlzLiNtb2RlID0gRGF0ZVRpbWVNb2RlLlNUUklORztcbiAgICAgIGVsc2UgdGhpcy4jbW9kZSA9IERhdGVUaW1lTW9kZS5EQVRFO1xuICAgIH1cbiAgICBsZXQgdGltZTogbnVtYmVyO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHRpbWUgPSB2YWx1ZTtcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHRpbWUgPSBuZXcgRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpO1xuICAgIGVsc2UgdGltZSA9IHZhbHVlLmdldFRpbWUoKTtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWVBc051bWJlciA9IHRpbWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybURhdGVUaW1lSW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgY29sb3IgaW5wdXQgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9kYXRlX3RpbWVfaW5wdXQ8XG4gIFJUIGV4dGVuZHMgRGF0ZSB8IHN0cmluZyB8IG51bWJlcixcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+KG9wdGlvbnM/OiBEYXRlVGltZUlucHV0T3B0aW9uczxSVCwgSUQ+KTogRm9ybURhdGVUaW1lSW5wdXQ8UlQsIElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1EYXRlVGltZUlucHV0PFJULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnR5cGUpIGlucHV0LnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQge1xuICBnZXRfY3Vyc29yX3Bvc2l0aW9uLFxuICBJUEFkZHJlc3MsXG4gIElQVmVyc2lvbixcbiAgc2V0X2N1cnNvcl9lbmQsXG4gIHNldF9zZWxlY3Rpb25fYWxsLFxuICBzbGVlcCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2lwX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJcElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxJUEFkZHJlc3MsIElEPiB7XG4gIC8qKklwIGFkZHJlc3MgdHlwZSwgdGhpcyBpcyBvdmVyd3JpdHRlbiBpZiBzdXBwbGllZCB3aXRoIGFuIGlwYWRkcmVzcyB3aXRoIGEgZGlmZmVyZW50IHR5cGUqL1xuICB0eXBlOiBJUFZlcnNpb247XG59XG5cbmNsYXNzIEZvcm1JcElucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBJUEFkZHJlc3MsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJpcGlucHV0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN0eXBlOiBJUFZlcnNpb247XG4gICNwYXJ0czogSFRNTERpdkVsZW1lbnRbXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDggfSwgKF8sIGkpID0+IHtcbiAgICBjb25zdCBpbnAgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIGlmIChpIDwgNykgdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICAgaW5wLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIGlucC5vbmJlZm9yZWlucHV0ID0gYXN5bmMgKGV2KSA9PiB7XG4gICAgICBpZiAoZXYuaW5wdXRUeXBlID09PSBcImluc2VydFBhcmFncmFwaFwiKSBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy9CYWNrc3BhY2VcbiAgICAgIGVsc2UgaWYgKGV2LmlucHV0VHlwZSA9PT0gXCJkZWxldGVDb250ZW50QmFja3dhcmRcIikge1xuICAgICAgICBpZiAoaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCAmJiBpID4gMCkge1xuICAgICAgICAgIHNldF9jdXJzb3JfZW5kKGlucC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxldGVcbiAgICAgIH0gZWxzZSBpZiAoZXYuaW5wdXRUeXBlID09PSBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCIpIHtcbiAgICAgICAgaWYgKGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09IDAgJiYgaSA8IGxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgICAgICAoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXYuZGF0YSkge1xuICAgICAgICAvL0NoZWNrIGZvciAuIG9yIDpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChldi5kYXRhID09PSBcIi5cIiB8fCBldi5kYXRhID09PSBcIjpcIiB8fCBldi5kYXRhID09PSBcIixcIikgJiZcbiAgICAgICAgICBpIDwgbGVuZ3RoIC0gMVxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRfc2VsZWN0aW9uX2FsbChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vQ2hlY2sgZm9yIHZhbGlkIGNoYXJhY3RlcnNcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgIWV2LmRhdGEubWF0Y2goXG4gICAgICAgICAgICB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyAvXltcXGRdKiQvIDogL15bXFxkQS1GYS1mXSokLyxcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvL1ByZXZlbnQgdG9vIGxvbmcgdmFsdWVzXG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgIGlucC50ZXh0Q29udGVudC5sZW5ndGggPj0gKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDMgOiA0KVxuICAgICAgICApIHtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIC8vUHJldmVudCB0b28gYmlnIHZhbHVlc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBvcyA9IGdldF9jdXJzb3JfcG9zaXRpb24oaW5wKTtcbiAgICAgICAgICBjb25zdCBwb3RlbnRpYWwgPVxuICAgICAgICAgICAgaW5wLnRleHRDb250ZW50LnNsaWNlKDAsIHBvcykgK1xuICAgICAgICAgICAgZXYuZGF0YSArXG4gICAgICAgICAgICBpbnAudGV4dENvbnRlbnQuc2xpY2UocG9zKTtcbiAgICAgICAgICBjb25zdCBudW0gPVxuICAgICAgICAgICAgdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0XG4gICAgICAgICAgICAgID8gcGFyc2VJbnQocG90ZW50aWFsLCAxMClcbiAgICAgICAgICAgICAgOiBwYXJzZUludChwb3RlbnRpYWwsIDE2KTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ICYmIG51bSA+IDI1NSkgfHxcbiAgICAgICAgICAgICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjYgJiYgbnVtID4gNjU1MzUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoaSA8IHRoaXMuI3BhcnRzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgIHNldF9zZWxlY3Rpb25fYWxsKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgZWxzZSBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaW5wLm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09ICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyAzIDogNCkgJiZcbiAgICAgICAgZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApID09PSBpbnAudGV4dENvbnRlbnQubGVuZ3RoICYmXG4gICAgICAgIGkgPCB0aGlzLiNwYXJ0cy5sZW5ndGggLSAxXG4gICAgICApIHtcbiAgICAgICAgc2V0X3NlbGVjdGlvbl9hbGwoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpbnAub25rZXlkb3duID0gYXN5bmMgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1VwXCIpIHtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dEb3duXCIpIHtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dMZWZ0XCIgJiYgaSA+IDApIHtcbiAgICAgICAgaWYgKGdldF9jdXJzb3JfcG9zaXRpb24oaW5wKSA9PT0gMCB8fCBpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwKVxuICAgICAgICAgIHNldF9jdXJzb3JfZW5kKGlucC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIiAmJiBpIDwgdGhpcy4jcGFydHMubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApID09PSBpbnAudGV4dENvbnRlbnQubGVuZ3RoIHx8XG4gICAgICAgICAgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMFxuICAgICAgICApXG4gICAgICAgICAgKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpPy5mb2N1cygpO1xuICAgICAgICBlbHNlIHJldHVybjtcbiAgICAgIH0gZWxzZSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gICAgcmV0dXJuIGlucDtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IodHlwZTogSVBWZXJzaW9uLCBpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy4jdHlwZSA9IHR5cGU7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuI3BhcnRzLmluY2x1ZGVzKGUudGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50KSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMuI3BhcnRzW3RoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDMgOiA3XSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9uZGJsY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0ICE9PSB0aGlzKSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRfc2VsZWN0aW9uX2FsbCh0aGlzLiNwYXJ0c1swXSk7XG4gICAgfTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgKGUpID0+IHtcbiAgICAgIGlmIChlLnJlbGF0ZWRUYXJnZXQgJiYgdGhpcy5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSkpIHJldHVybjtcbiAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMudmFsdWVfYXNfaXApO1xuICAgIH0pO1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLnZhbHVlX2FzX2lwKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25jb3B5ID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuY2xpcGJvYXJkRGF0YT8uc2V0RGF0YShcInRleHQvcGxhaW5cIiwgdGhpcy52YWx1ZV9hc19pcC50b19zdHJpbmcoKSk7XG4gICAgfTtcbiAgICB0aGlzLm9ucGFzdGUgPSAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgcGFzdGUgPSBlLmNsaXBib2FyZERhdGE/LmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpIHx8IFwiXCI7XG4gICAgICBjb25zdCBuZXdfaXAgPSBuZXcgSVBBZGRyZXNzKHBhc3RlKTtcbiAgICAgIGlmIChuZXdfaXAudmVyc2lvbiAhPT0gdGhpcy4jdHlwZSkgcmV0dXJuO1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sobmV3X2lwKTtcbiAgICB9O1xuICB9XG5cbiAgZ2V0IHZhbHVlX2FzX2lwKCk6IElQQWRkcmVzcyB7XG4gICAgcmV0dXJuIG5ldyBJUEFkZHJlc3MoXG4gICAgICB0aGlzLiNwYXJ0c1xuICAgICAgICAuc2xpY2UoMCwgdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gNCA6IDgpXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgcGFydCwgaSkgPT4ge1xuICAgICAgICAgIGFjYyArPSBwYXJ0LmlubmVyVGV4dDtcbiAgICAgICAgICBpZiAoaSA8ICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyA0IDogOCkgLSAxKVxuICAgICAgICAgICAgYWNjICs9IHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IFwiLlwiIDogXCI6XCI7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgXCJcIiksXG4gICAgKTtcbiAgfVxuXG4gIHNldCB0eXBlKHZhbDogSVBWZXJzaW9uKSB7XG4gICAgaWYgKHRoaXMuI3R5cGUgPT09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuI3R5cGUgPSB2YWw7XG4gICAgdGhpcy5jbGFzc0xpc3QudG9nZ2xlKFwiaXB2NFwiLCB2YWwgPT09IElQVmVyc2lvbi5WNCk7XG4gICAgdGhpcy5jbGFzc0xpc3QudG9nZ2xlKFwiaXB2NlwiLCB2YWwgPT09IElQVmVyc2lvbi5WNik7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGRyZW4oXG4gICAgICAuLi50aGlzLiNwYXJ0c1xuICAgICAgICAuc2xpY2UoMCwgdmFsID09PSBJUFZlcnNpb24uVjQgPyA0IDogOClcbiAgICAgICAgLmZsYXRNYXAoKHYsIGkpID0+XG4gICAgICAgICAgaSA8ICh2YWwgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KSAtIDFcbiAgICAgICAgICAgID8gW3YsIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbCA9PT0gSVBWZXJzaW9uLlY0ID8gXCIuXCIgOiBcIjpcIildXG4gICAgICAgICAgICA6IFt2XSxcbiAgICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IElQQWRkcmVzcyk6IHZvaWQge1xuICAgIHRoaXMudHlwZSA9IHZhbC52ZXJzaW9uO1xuICAgIHZhbC5hc19hcnJheS5mb3JFYWNoKChwYXJ0LCBpKSA9PiB7XG4gICAgICB0aGlzLiNwYXJ0c1tpXS50ZXh0Q29udGVudCA9XG4gICAgICAgIHZhbC52ZXJzaW9uID09PSBJUFZlcnNpb24uVjQgPyBwYXJ0LnRvU3RyaW5nKCkgOiBwYXJ0LnRvU3RyaW5nKDE2KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNwYXJ0cy5mb3JFYWNoKChwYXJ0KSA9PiB7XG4gICAgICBwYXJ0LnRleHRDb250ZW50ID0gXCJcIjtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtSXBJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBjb2xvciBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2lwX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9uczogSXBJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybUlwSW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybUlwSW5wdXQ8SUQ+KG9wdGlvbnMudHlwZSwgb3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZSwgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3Bhc3N3b3JkX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtUGFzc3dvcmRJbnB1dE9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8c3RyaW5nLCBJRD4ge1xuICAvKipBbGxvd2VkIGNoYXJhY3RlcnMgZm9yIHRoZSBwYXNzd29yZCBpbnB1dCAqL1xuICBmaWx0ZXI/OiBSZWdFeHA7XG59XG5cbmNsYXNzIEZvcm1QYXNzd29yZElucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBzdHJpbmcsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJwYXNzd29yZGlucHV0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNmaWx0ZXI/OiBSZWdFeHA7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcInBhc3N3b3JkXCI7XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy53YXJuX2lucHV0LnZhbHVlKTtcbiAgICB9O1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmJlZm9yZWlucHV0ID0gKGV2KSA9PiB7XG4gICAgICBpZiAoZXYuZGF0YSkge1xuICAgICAgICBpZiAodGhpcy4jZmlsdGVyICYmICF0aGlzLiNmaWx0ZXIudGVzdChldi5kYXRhKSkge1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy53YXJuKFwiSW52YWxpZCBjaGFyYWN0ZXIgZW50ZXJlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXQgZmlsdGVyKHZhbDogUmVnRXhwIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZmlsdGVyID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1QYXNzd29yZElucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fcGFzc3dvcmRfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVBhc3N3b3JkSW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1QYXNzd29yZElucHV0PElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1QYXNzd29yZElucHV0PElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuZmlsdGVyKSBpbnB1dC5maWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICBGb3JtVmFsdWUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzZXRfY3Vyc29yX2VuZCwgc3luY19yZXNvbHZlIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQgeyBlcnIsIG5vbmUsIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlU3RyaW5nUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgeyBzdHJpbmdfYnl0ZV9sZW5ndGgsIHN0cmluZ19ieXRlX2xpbWl0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RyaW5nXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vdGV4dF9pbnB1dC5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVRleHRJbnB1dE9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IHN0cmluZyxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4ge1xuICAvKipQbGFjZWhvbGRlciB0ZXh0IHdoZW4gaW5wdXQgaXMgZW1wdHkgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKk1heGltdW0gbGVuZ3RoIG9mIHRoZSBpbnB1dCAqL1xuICBtYXhfbGVuZ3RoPzogbnVtYmVyO1xuICAvKipNYXhpbXVtIGJ5dGVzIG9mIHRoZSBpbnB1dCAqL1xuICBtYXhfYnl0ZXM/OiBudW1iZXI7XG4gIC8qKkFsbG93ZWQgY2hhcmFjdGVycyBmb3IgdGhlIHRleHQgaW5wdXQgKi9cbiAgZmlsdGVyPzogUmVnRXhwO1xufVxuXG5jbGFzcyBGb3JtVGV4dElucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBzdHJpbmcsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJ0ZXh0aW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcbiAgI21heF9sZW5ndGg/OiBudW1iZXI7XG4gICNtYXhfYnl0ZXM/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwidGV4dFwiO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB0aGlzLiNzZXQoKTtcbiAgICB0aGlzLm9uYmVmb3JlaW5wdXQgPSAoZSkgPT4ge1xuICAgICAgdGhpcy53YXJuKFwiXCIpO1xuICAgICAgY29uc3QgZGF0YSA9IGUuZGF0YSB8fCBlLmRhdGFUcmFuc2Zlcj8uZ2V0RGF0YShcInRleHQvcGxhaW5cIik7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAodGhpcy4jZmlsdGVyICYmICF0aGlzLiNmaWx0ZXIudGVzdChkYXRhKSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLndhcm4oXCJJbnZhbGlkIGNoYXJhY3RlciBlbnRlcmVkXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuI21heF9sZW5ndGggJiZcbiAgICAgICAgICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZS5sZW5ndGggKyBkYXRhLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMud2FybihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2xlbmd0aH0gY2hhcmFjdGVycyBpcyBhbGxvd2VkYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuI21heF9ieXRlcyAmJlxuICAgICAgICAgICAgc3RyaW5nX2J5dGVfbGVuZ3RoKHRoaXMud2Fybl9pbnB1dC52YWx1ZSkgK1xuICAgICAgICAgICAgICBzdHJpbmdfYnl0ZV9sZW5ndGgoZGF0YSkgPlxuICAgICAgICAgICAgICB0aGlzLiNtYXhfYnl0ZXNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMud2FybihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2J5dGVzfSBieXRlcyBpcyBhbGxvd2VkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jICNzZXQoKSB7XG4gICAgY29uc3QgYnVmZiA9IHRoaXMuYnVmZmVyO1xuICAgIChhd2FpdCB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUgfHwgXCJcIikpLm1hcF9lcnIoKCkgPT4ge1xuICAgICAgdGhpcy5uZXdfdmFsdWUoYnVmZiB8fCBcIlwiKTtcbiAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXQgZmlsdGVyKHZhbDogUmVnRXhwIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZmlsdGVyID0gdmFsO1xuICB9XG4gIGdldCBmaWx0ZXIoKTogUmVnRXhwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jZmlsdGVyO1xuICB9XG5cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy53YXJuX2lucHV0LnBsYWNlaG9sZGVyID0gdmFsO1xuICB9XG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLndhcm5faW5wdXQucGxhY2Vob2xkZXI7XG4gIH1cblxuICBzZXQgbWF4X2xlbmd0aCh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9sZW5ndGggPSB2YWw7XG4gICAgdGhpcy53YXJuX2lucHV0Lm1heExlbmd0aCA9IHZhbCA/PyAtMTtcbiAgfVxuICBnZXQgbWF4X2xlbmd0aCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfbGVuZ3RoO1xuICB9XG5cbiAgc2V0IG1heF9ieXRlcyh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9ieXRlcyA9IHZhbDtcbiAgfVxuICBnZXQgbWF4X2J5dGVzKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21heF9ieXRlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogc3RyaW5nKTogUHJvbWlzZUxpa2U8UmVzdWx0PHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLiNtYXhfbGVuZ3RoICYmIHZhbC5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoKVxuICAgICAgdmFsID0gdmFsLnNsaWNlKDAsIHRoaXMuI21heF9sZW5ndGgpO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMpIHZhbCA9IHN0cmluZ19ieXRlX2xpbWl0KHZhbCwgdGhpcy4jbWF4X2J5dGVzKTtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2xlbmd0aH0gY2hhcmFjdGVycyBpcyBhbGxvd2VkYCksXG4gICAgICApO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMgJiYgc3RyaW5nX2J5dGVfbGVuZ3RoKHZhbCkgPiB0aGlzLiNtYXhfYnl0ZXMpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVTdHJpbmdSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGgpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2xlbmd0aFwiLCByZWxhdGVkLm1heF9sZW5ndGgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfbGVuZ3RoXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2J5dGVzXCIsIHJlbGF0ZWQubWF4X2xlbmd0aF9ieXRlcywgKCkgPT5cbiAgICAgICAgbm9uZSgpLFxuICAgICAgKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heF9ieXRlc1wiKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRleHRJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBzaW5nbGUgbGluZSB0ZXh0IGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdGV4dF9pbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtVGV4dElucHV0T3B0aW9uczxJRD4sXG4pOiBGb3JtVGV4dElucHV0PElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1UZXh0SW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5maWx0ZXIpIGlucHV0LmZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgIGlmIChvcHRpb25zLnBsYWNlaG9sZGVyKSBpbnB1dC5wbGFjZWhvbGRlciA9IG9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgaWYgKG9wdGlvbnMubWF4X2xlbmd0aCkgaW5wdXQubWF4X2xlbmd0aCA9IG9wdGlvbnMubWF4X2xlbmd0aDtcbiAgICBpZiAob3B0aW9ucy5tYXhfYnl0ZXMpIGlucHV0Lm1heF9ieXRlcyA9IG9wdGlvbnMubWF4X2J5dGVzO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgc2V0X2N1cnNvcl9lbmQsIHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgbWF0ZXJpYWxfZHJhZ19oYW5kbGVfcm91bmRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWljb25zXCI7XG5pbXBvcnQgeyBlcnIsIG5vbmUsIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlU3RyaW5nUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgeyBzdHJpbmdfYnl0ZV9sZW5ndGgsIHN0cmluZ19ieXRlX2xpbWl0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RyaW5nXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vdGV4dF9tdWx0aV9saW5lLnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVGV4dElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gc3RyaW5nLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlBsYWNlaG9sZGVyIHRleHQgd2hlbiBpbnB1dCBpcyBlbXB0eSAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqTWF4aW11bSBsZW5ndGggb2YgdGhlIGlucHV0ICovXG4gIG1heF9sZW5ndGg/OiBudW1iZXI7XG4gIC8qKk1heGltdW0gYnl0ZXMgb2YgdGhlIGlucHV0ICovXG4gIG1heF9ieXRlcz86IG51bWJlcjtcbiAgLyoqQWxsb3dlZCBjaGFyYWN0ZXJzIGZvciB0aGUgdGV4dCBpbnB1dCAqL1xuICBmaWx0ZXI/OiBSZWdFeHA7XG59XG5cbmNsYXNzIEZvcm1UZXh0TXVsdGlsaW5lPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBzdHJpbmcsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJ0ZXh0bXVsdGlsaW5lXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNmaWx0ZXI/OiBSZWdFeHA7XG4gICNtYXhfbGVuZ3RoPzogbnVtYmVyO1xuICAjbWF4X2J5dGVzPzogbnVtYmVyO1xuICAjdmFsdWVfYm94OiBIVE1MVGV4dEFyZWFFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIiksXG4gICk7XG4gICNyZXNpemVyOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy4jcmVzaXplci5hcHBlbmRDaGlsZChtYXRlcmlhbF9kcmFnX2hhbmRsZV9yb3VuZGVkKCkpO1xuICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLiN2YWx1ZV9ib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgY29uc3Qgc3RhcnRfeSA9IGUuY2xpZW50WTtcbiAgICAgIHRoaXMuI3Jlc2l6ZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJtb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgIGNvbnN0IGR5ID0gZXYuY2xpZW50WSAtIHN0YXJ0X3k7XG4gICAgICAgIHRoaXMuI3ZhbHVlX2JveC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHQgKyBkeX1weGA7XG4gICAgICB9O1xuICAgICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJ1cCA9IChfZXYpID0+IHtcbiAgICAgICAgdGhpcy4jcmVzaXplci5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgIH07XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25jaGFuZ2UgPSAoKSA9PiB0aGlzLiNzZXQoKTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25iZWZvcmVpbnB1dCA9IChlKSA9PiB7XG4gICAgICB0aGlzLndhcm4oXCJcIik7XG4gICAgICBjb25zdCBkYXRhID0gZS5kYXRhIHx8IGUuZGF0YVRyYW5zZmVyPy5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMud2FybihcIkludmFsaWQgY2hhcmFjdGVyIGVudGVyZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2xlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlLmxlbmd0aCArIGRhdGEubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzICYmXG4gICAgICAgICAgICBzdHJpbmdfYnl0ZV9sZW5ndGgodGhpcy4jdmFsdWVfYm94LnZhbHVlKSArXG4gICAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aChkYXRhKSA+XG4gICAgICAgICAgICAgIHRoaXMuI21heF9ieXRlc1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJFbnRlclwiICYmIGUuY3RybEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuI3NldCgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyAjc2V0KCkge1xuICAgIGNvbnN0IGJ1ZmYgPSB0aGlzLmJ1ZmZlcjtcbiAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy4jdmFsdWVfYm94LnZhbHVlIHx8IFwiXCIpKS5tYXBfZXJyKCgpID0+IHtcbiAgICAgIHRoaXMubmV3X3ZhbHVlKGJ1ZmYgfHwgXCJcIik7XG4gICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0IGZpbHRlcih2YWw6IFJlZ0V4cCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2ZpbHRlciA9IHZhbDtcbiAgfVxuICBnZXQgZmlsdGVyKCk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZpbHRlcjtcbiAgfVxuXG4gIHNldCBwbGFjZWhvbGRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuI3ZhbHVlX2JveC5wbGFjZWhvbGRlciA9IHZhbDtcbiAgfVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jdmFsdWVfYm94LnBsYWNlaG9sZGVyO1xuICB9XG5cbiAgc2V0IG1heF9sZW5ndGgodmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfbGVuZ3RoID0gdmFsO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5tYXhMZW5ndGggPSB2YWwgPz8gLTE7XG4gIH1cbiAgZ2V0IG1heF9sZW5ndGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X2xlbmd0aDtcbiAgfVxuXG4gIHNldCBtYXhfYnl0ZXModmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfYnl0ZXMgPSB2YWw7XG4gIH1cbiAgZ2V0IG1heF9ieXRlcygpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfYnl0ZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHZhbCA9IHZhbC5zbGljZSgwLCB0aGlzLiNtYXhfbGVuZ3RoKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzKSB2YWwgPSBzdHJpbmdfYnl0ZV9saW1pdCh2YWwsIHRoaXMuI21heF9ieXRlcyk7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBzdHJpbmcpOiBQcm9taXNlTGlrZTxSZXN1bHQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuI21heF9sZW5ndGggJiYgdmFsLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzICYmIHN0cmluZ19ieXRlX2xlbmd0aCh2YWwpID4gdGhpcy4jbWF4X2J5dGVzKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlU3RyaW5nUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9sZW5ndGhcIiwgcmVsYXRlZC5tYXhfbGVuZ3RoLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4X2xlbmd0aFwiKTtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoX2J5dGVzKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9ieXRlc1wiLCByZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMsICgpID0+XG4gICAgICAgIG5vbmUoKSxcbiAgICAgICk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfYnl0ZXNcIik7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1UZXh0TXVsdGlsaW5lKTtcblxuLyoqQ3JlYXRlcyBhIG11bHRpIGxpbmUgdGV4dCBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3RleHRfbXVsdGlsaW5lPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1UZXh0SW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1UZXh0TXVsdGlsaW5lPElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1UZXh0TXVsdGlsaW5lPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMucGxhY2Vob2xkZXIpIGlucHV0LnBsYWNlaG9sZGVyID0gb3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICBpZiAob3B0aW9ucy5tYXhfbGVuZ3RoKSBpbnB1dC5tYXhfbGVuZ3RoID0gb3B0aW9ucy5tYXhfbGVuZ3RoO1xuICAgIGlmIChvcHRpb25zLm1heF9ieXRlcykgaW5wdXQubWF4X2J5dGVzID0gb3B0aW9ucy5tYXhfYnl0ZXM7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3RleHQuc2Nzc1wiO1xuXG5pbnRlcmZhY2UgRm9ybVRleHRPcHRpb25zIHtcbiAgLyoqQnV0dG9ucyB0ZXh0ICovXG4gIHRleHQ/OiBzdHJpbmc7XG4gIC8qKlRleHQgc2l6ZSAqL1xuICBzaXplPzogbnVtYmVyO1xufVxuXG4vKipDb21wb25lbnQgZm9yIHNpbXBsZSB0ZXh0ICovXG5jbGFzcyBGb3JtVGV4dCBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEZvcm1UZXh0T3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLnNpemUpIHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGN1cnJlbnQgdGV4dCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCB0ZXh0KHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgY3VycmVudCB0ZXh0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdHlsZS5mb250U2l6ZSA9IHNpemUgKyBcInJlbVwiO1xuICAgIHRoaXMuc3R5bGUubGluZUhlaWdodCA9IHNpemUgKyBcInJlbVwiO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVGV4dCk7XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90ZXh0KG9wdGlvbnM6IEZvcm1UZXh0T3B0aW9ucyk6IEZvcm1UZXh0IHtcbiAgcmV0dXJuIG5ldyBGb3JtVGV4dChvcHRpb25zKTtcbn1cbiIsImltcG9ydCB7IEZvcm1Db2xvcnMgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBmb3JtX2J1dHRvbiB9IGZyb20gXCIuL2Jvb2xlYW4vYnV0dG9uL2J1dHRvblwiO1xuaW1wb3J0IHsgZm9ybV9sYW1wIH0gZnJvbSBcIi4vYm9vbGVhbi9sYW1wL2xhbXBcIjtcbmltcG9ydCB7IGZvcm1fc3dpdGNoIH0gZnJvbSBcIi4vYm9vbGVhbi9zd2l0Y2gvc3dpdGNoXCI7XG5pbXBvcnQgeyBmb3JtX2dyb3VwX2NvbCB9IGZyb20gXCIuL2dyb3VwL2dyb3VwXCI7XG5pbXBvcnQgeyBmb3JtX2dyb3VwX2NvbGxhcHNlciB9IGZyb20gXCIuL2dyb3VwL2dyb3VwX2NvbGxhcHNlclwiO1xuaW1wb3J0IHsgZm9ybV9saXN0X2ZpZWxkIH0gZnJvbSBcIi4vbGlzdC9saXN0X2ZpZWxkXCI7XG5pbXBvcnQgeyBmb3JtX251bWJlcl9pbnB1dCB9IGZyb20gXCIuL251bWJlci9udW1iZXJfaW5wdXQvbnVtYmVyX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX3Byb2dyZXNzIH0gZnJvbSBcIi4vbnVtYmVyL3Byb2dyZXNzL3Byb2dyZXNzXCI7XG5pbXBvcnQgeyBmb3JtX3NsaWRlciB9IGZyb20gXCIuL251bWJlci9zbGlkZXIvc2xpZGVyXCI7XG5pbXBvcnQgeyBmb3JtX3N0ZXBwZXIgfSBmcm9tIFwiLi9udW1iZXIvc3RlcHBlci9zdGVwcGVyXCI7XG5pbXBvcnQgeyBmb3JtX2Ryb3Bkb3duIH0gZnJvbSBcIi4vc2VsZWN0b3JzL2Ryb3BfZG93bi9kcm9wX2Rvd25cIjtcbmltcG9ydCB7IGZvcm1fdG9nZ2xlX2J1dHRvbiB9IGZyb20gXCIuL3NlbGVjdG9ycy90b2dnbGVfYnV0dG9uL3RvZ2dsZV9idXR0b25cIjtcbmltcG9ydCB7IGZvcm1fc3BhY2VyIH0gZnJvbSBcIi4vc3BhY2luZy9zcGFjZXJcIjtcbmltcG9ydCB7IGZvcm1fY29sb3JfaW5wdXQgfSBmcm9tIFwiLi9zcGVjaWFsL2NvbG9yL2NvbG9yX2lucHV0XCI7XG5pbXBvcnQge1xuICBmb3JtX2RhdGVfdGltZV9pbnB1dCxcbiAgRm9ybURhdGVUaW1lVHlwZSxcbn0gZnJvbSBcIi4vc3BlY2lhbC9kYXRlX3RpbWUvZGF0ZV90aW1lX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX2lwX2lucHV0IH0gZnJvbSBcIi4vc3BlY2lhbC9pcC9pcF9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV9wYXNzd29yZF9pbnB1dCB9IGZyb20gXCIuL3NwZWNpYWwvcGFzc3dvcmQvcGFzc3dvcmRfaW5wdXRcIjtcbmltcG9ydCB7IGZvcm1fdGV4dF9pbnB1dCB9IGZyb20gXCIuL3RleHQvaW5wdXQvdGV4dF9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV90ZXh0X211bHRpbGluZSB9IGZyb20gXCIuL3RleHQvbXVsdGlfbGluZS90ZXh0X211bHRpX2xpbmVcIjtcbmltcG9ydCB7IGZvcm1fdGV4dCB9IGZyb20gXCIuL3RleHQvdGV4dC90ZXh0XCI7XG5cbi8qKkZvcm0gZWxlbWVudHMgd2l0aCBsYWJlbCAqL1xuZXhwb3J0IGNvbnN0IGZvcm0gPSB7XG4gIEZvcm1Db2xvcnMsXG5cbiAgLy9Cb29sZWFuXG4gIGJ1dHRvbjogZm9ybV9idXR0b24sXG4gIHN3aXRjaDogZm9ybV9zd2l0Y2gsXG4gIGxhbXA6IGZvcm1fbGFtcCxcblxuICAvL0dyb3VwXG4gIGdyb3VwX2NvbDogZm9ybV9ncm91cF9jb2wsXG4gIGdyb3VwX2NvbGxhcHNlcjogZm9ybV9ncm91cF9jb2xsYXBzZXIsXG5cbiAgLy9TcGVjaWFsXG4gIGNvbG9yX2lucHV0OiBmb3JtX2NvbG9yX2lucHV0LFxuICBkYXRlX3RpbWVfaW5wdXQ6IGZvcm1fZGF0ZV90aW1lX2lucHV0LFxuICBGb3JtRGF0ZVRpbWVUeXBlLFxuICBpcF9pbnB1dDogZm9ybV9pcF9pbnB1dCxcbiAgcGFzc3dvcmRfaW5wdXQ6IGZvcm1fcGFzc3dvcmRfaW5wdXQsXG5cbiAgLy9OdW1iZXJcbiAgcHJvZ3Jlc3M6IGZvcm1fcHJvZ3Jlc3MsXG4gIGlucHV0X251bWJlcjogZm9ybV9udW1iZXJfaW5wdXQsXG4gIHNsaWRlcjogZm9ybV9zbGlkZXIsXG4gIHN0ZXBwZXI6IGZvcm1fc3RlcHBlcixcblxuICAvL1NlbGVjdG9yc1xuICBkcm9wZG93bjogZm9ybV9kcm9wZG93bixcbiAgdG9nZ2xlX2J1dHRvbjogZm9ybV90b2dnbGVfYnV0dG9uLFxuXG4gIC8vU3BhY2luZ1xuICBzcGFjZXI6IGZvcm1fc3BhY2VyLFxuXG4gIC8vVGV4dFxuICB0ZXh0OiBmb3JtX3RleHQsXG4gIGlucHV0X3RleHQ6IGZvcm1fdGV4dF9pbnB1dCxcbiAgbXVsdGlsaW5lX3RleHQ6IGZvcm1fdGV4dF9tdWx0aWxpbmUsXG5cbiAgLy9MaXN0XG4gIGxpc3RfZmllbGQ6IGZvcm1fbGlzdF9maWVsZCxcbn07XG5leHBvcnQgZGVmYXVsdCBmb3JtO1xuXG5leHBvcnQgeyBGb3JtQ29sb3JzIH0gZnJvbSBcIi4vYmFzZVwiO1xuZXhwb3J0IHsgRm9ybURhdGVUaW1lVHlwZSB9IGZyb20gXCIuL3NwZWNpYWwvZGF0ZV90aW1lL2RhdGVfdGltZV9pbnB1dFwiO1xuIl0sIm1hcHBpbmdz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