fantasy-ngzorro 2.2.37 → 2.2.39

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.
@@ -14,6 +14,67 @@ import { Page } from "../model/common-type";
14
14
  import { CommonSessionService } from "../service/common-session.service";
15
15
  import { getTableScrollXViewportWidth, getTableViewportWidth, } from "../utils/hd-table-scroll.util";
16
16
  import { TableCacheOption, TreeGrid, } from "./hd-table.service";
17
+ /**
18
+ * 勾选列宽(px),与模板 nzWidth、less 兜底保持一致
19
+ * @type {?}
20
+ */
21
+ var SELECT_COL_WIDTH = 40;
22
+ /**
23
+ * 横向布局计算结果
24
+ * @record
25
+ */
26
+ function HdTableHorizontalLayout() { }
27
+ if (false) {
28
+ /**
29
+ * 传给 nzScroll.x;只有列宽总和 <= 0 时为 null
30
+ * @type {?}
31
+ */
32
+ HdTableHorizontalLayout.prototype.scrollX;
33
+ /**
34
+ * 按声明宽比例分给各业务列的总补宽,列多时为 0
35
+ * @type {?}
36
+ */
37
+ HdTableHorizontalLayout.prototype.fluidExtra;
38
+ /**
39
+ * 实际渲染总宽 = 声明总宽 + fluidExtra
40
+ * @type {?}
41
+ */
42
+ HdTableHorizontalLayout.prototype.displayTotal;
43
+ /**
44
+ * 列少、靠补宽吃满容器,不需要真正横滚
45
+ * @type {?}
46
+ */
47
+ HdTableHorizontalLayout.prototype.isFluid;
48
+ }
49
+ /**
50
+ * 列多(或量不到容器宽):scroll.x = 声明总宽,正常横滚
51
+ * @param {?} declaredWidth
52
+ * @return {?}
53
+ */
54
+ function fixedLayout(declaredWidth) {
55
+ return {
56
+ scrollX: Math.ceil(declaredWidth) + "px",
57
+ fluidExtra: 0,
58
+ displayTotal: declaredWidth,
59
+ isFluid: false,
60
+ };
61
+ }
62
+ /**
63
+ * 列少:scroll.x = 容器宽,差额按声明宽比例分到各业务列
64
+ * @param {?} containerWidth
65
+ * @param {?} declaredWidth
66
+ * @return {?}
67
+ */
68
+ function fluidLayout(containerWidth, declaredWidth) {
69
+ /** @type {?} */
70
+ var fluidExtra = Math.max(0, containerWidth - declaredWidth);
71
+ return {
72
+ scrollX: containerWidth + "px",
73
+ fluidExtra: fluidExtra,
74
+ displayTotal: declaredWidth + fluidExtra,
75
+ isFluid: true,
76
+ };
77
+ }
17
78
  var HdTableComponent = /** @class */ (function () {
18
79
  function HdTableComponent(hostEl, cdr, commonSessionService) {
19
80
  var _this = this;
@@ -99,23 +160,21 @@ var HdTableComponent = /** @class */ (function () {
99
160
  */
100
161
  this.virtualScrollActive = null;
101
162
  /**
102
- * 列宽合计(含勾选/序号 + fluid 补宽),footer 表宽与横向 scroll 共用
163
+ * 实际渲染列宽合计(含勾选/序号 + 补宽),合计 footer 表宽用
103
164
  */
104
165
  this.tableColWidthTotal = 0;
105
166
  /**
106
- * fluid:声明列总宽 < 容器时,把差额补到最后一列业务列(不改缓存宽),
107
- * 并设 scroll.x = 容器宽,避免表宽 100% 均摊撑开勾选列;拖拽改宽仍写 col.width。
167
+ * 待按比例分给各业务列的总补宽;只影响展示,不写回 col.width(列宽缓存、拖拽仍用声明宽)
108
168
  */
109
169
  this.fluidExtraWidth = 0;
110
170
  /**
111
- * 列总宽未超出容器(fluid 补宽吃满):不需要真正横滚,
112
- * 用于关掉 ng-zorro fixed-header 带来的常驻 X 轴滚动条。
171
+ * 列少、靠补宽吃满容器:模板据此加 hd-table--fluid-x,隐藏 fixed-header 常驻的横滚槽
113
172
  */
114
173
  this.fluidHorizontal = false;
115
174
  /**
116
- * fluid 补宽目标列缓存,避免模板每格 CD 时反复扫 tableCols
175
+ * 各业务列分到的补宽(按列对象取,applyHorizontalLayout 时整表重建)
117
176
  */
118
- this.fluidExtraTargetCol = null;
177
+ this.fluidExtraByCol = new Map();
119
178
  /**
120
179
  * 数据更新后待复位纵向滚动位置
121
180
  */
@@ -337,10 +396,8 @@ var HdTableComponent = /** @class */ (function () {
337
396
  changes["tableData"]["currentValue"]["pageNumber"] !==
338
397
  changes["tableData"]["previousValue"]["pageNumber"]) {
339
398
  this.pendingResetScrollTop = true;
340
- // pageSize/pageNumber 变化也要重算 scroll / fluid。
341
- // 业务常把 Page.pageSize 写成 content.length(如收款编辑 toPage),
342
- // virtualScroll=false 时若这里跳过,空表初始化后的 fluid 不会补上,勾选列被撑开。
343
- // applyTableScrollMode(false) 在模式未变时只 dealScroll,不会强制重建清排序态。
399
+ // 业务可能把 Page.pageSize 写成 content.length,换数据时就会走到这里,
400
+ // 必须重算横向布局。滚动模式不变时不会重建,排序态不会被清掉。
344
401
  this.applyTableScrollMode(false);
345
402
  // 翻页/改 pageSize:主动多次复位,覆盖 CDK 异步渲染时序
346
403
  this.scheduleResetTableBodyScrollTop();
@@ -352,9 +409,7 @@ var HdTableComponent = /** @class */ (function () {
352
409
  }
353
410
  if (changes["tableData"]) {
354
411
  this.pendingResetScrollTop = true;
355
- // 不论是否虚拟滚动都要重算 scroll / fluid。
356
- // 收款/付款编辑等页 [virtualScroll]=false + 异步灌数据:原先跳过会导致
357
- // 空表初始化后不再补宽,勾选列被均摊撑开。
412
+ // 不论是否虚拟滚动,数据变化后都要重算横向布局
358
413
  this.applyTableScrollMode(false);
359
414
  // 数据更新后复位纵向滚动(含虚拟滚动场景)
360
415
  this.scheduleResetTableBodyScrollTop();
@@ -595,13 +650,13 @@ var HdTableComponent = /** @class */ (function () {
595
650
  return col.fixed === "left" ? (col.fixedWidth || 0) + "px" : null;
596
651
  };
597
652
  Object.defineProperty(HdTableComponent.prototype, "lineNumberLeft", {
598
- /** 开启合计时序号列的 left(勾选列占 40px) */
653
+ /** 开启合计时序号列的 left(跟在勾选列后面) */
599
654
  get: /**
600
- * 开启合计时序号列的 left(勾选列占 40px)
655
+ * 开启合计时序号列的 left(跟在勾选列后面)
601
656
  * @return {?}
602
657
  */
603
658
  function () {
604
- return this.showSelected ? "40px" : "0px";
659
+ return (this.showSelected ? SELECT_COL_WIDTH : 0) + "px";
605
660
  },
606
661
  enumerable: true,
607
662
  configurable: true
@@ -632,64 +687,194 @@ var HdTableComponent = /** @class */ (function () {
632
687
  enumerable: true,
633
688
  configurable: true
634
689
  });
635
- /** 展示用列宽:fluid 时最后一列业务列 = 声明宽 + fluidExtraWidth */
636
690
  /**
637
- * 展示用列宽:fluid 时最后一列业务列 = 声明宽 + fluidExtraWidth
691
+ * @private
692
+ * @param {?} col
693
+ * @return {?}
694
+ */
695
+ HdTableComponent.prototype.isColVisible = /**
696
+ * @private
697
+ * @param {?} col
698
+ * @return {?}
699
+ */
700
+ function (col) {
701
+ return !!col && col.isShow !== false;
702
+ };
703
+ /** 业务列声明宽:未配置时按 fixColWidth */
704
+ /**
705
+ * 业务列声明宽:未配置时按 fixColWidth
706
+ * @private
707
+ * @param {?} col
708
+ * @return {?}
709
+ */
710
+ HdTableComponent.prototype.getColDeclaredWidth = /**
711
+ * 业务列声明宽:未配置时按 fixColWidth
712
+ * @private
713
+ * @param {?} col
714
+ * @return {?}
715
+ */
716
+ function (col) {
717
+ return col && col.width > 0 ? col.width : ColWidth.fixColWidth;
718
+ };
719
+ /** 声明列宽合计:勾选列 + 序号列 + 可见业务列,不含补宽 */
720
+ /**
721
+ * 声明列宽合计:勾选列 + 序号列 + 可见业务列,不含补宽
722
+ * @private
723
+ * @return {?}
724
+ */
725
+ HdTableComponent.prototype.getDeclaredColWidthTotal = /**
726
+ * 声明列宽合计:勾选列 + 序号列 + 可见业务列,不含补宽
727
+ * @private
728
+ * @return {?}
729
+ */
730
+ function () {
731
+ var _this = this;
732
+ /** @type {?} */
733
+ var total = 0;
734
+ if (this.showSelected) {
735
+ total += SELECT_COL_WIDTH;
736
+ }
737
+ if (this.showTableTotal) {
738
+ total += this.lineNumberColWidth;
739
+ }
740
+ (this.tableCols || []).forEach((/**
741
+ * @param {?} col
742
+ * @return {?}
743
+ */
744
+ function (col) {
745
+ if (_this.isColVisible(col)) {
746
+ total += _this.getColDeclaredWidth(col);
747
+ }
748
+ }));
749
+ return total;
750
+ };
751
+ /** 模板里 th / td / 合计 col 用的列宽:声明宽 + 该列按比例分到的补宽 */
752
+ /**
753
+ * 模板里 th / td / 合计 col 用的列宽:声明宽 + 该列按比例分到的补宽
638
754
  * @param {?} col
639
755
  * @return {?}
640
756
  */
641
757
  HdTableComponent.prototype.getColDisplayWidth = /**
642
- * 展示用列宽:fluid 时最后一列业务列 = 声明宽 + fluidExtraWidth
758
+ * 模板里 th / td / 合计 col 用的列宽:声明宽 + 该列按比例分到的补宽
643
759
  * @param {?} col
644
760
  * @return {?}
645
761
  */
646
762
  function (col) {
647
763
  /** @type {?} */
648
- var base = col && col.width != null && col.width > 0
649
- ? col.width
650
- : ColWidth.fixColWidth;
651
- if (this.fluidExtraWidth <= 0 ||
652
- !col ||
653
- !this.fluidExtraTargetCol ||
654
- col !== this.fluidExtraTargetCol) {
655
- return base;
764
+ var declared = this.getColDeclaredWidth(col);
765
+ if (!col || this.fluidExtraWidth <= 0) {
766
+ return declared;
656
767
  }
657
- return base + this.fluidExtraWidth;
768
+ /** @type {?} */
769
+ var extra = this.fluidExtraByCol.get(col);
770
+ return declared + (extra > 0 ? extra : 0);
658
771
  };
659
- /** 按当前 layout 刷新 fluid 补宽目标列(仅 dealScroll / sync 时调用) */
660
772
  /**
661
- * 按当前 layout 刷新 fluid 补宽目标列(仅 dealScroll / sync 时调用)
773
+ * 把 fluidExtra 按各可见业务列声明宽比例分配(最大余数法),
774
+ * 勾选列 / 序号列不参与;保证各列补宽之和等于 fluidExtra。
775
+ */
776
+ /**
777
+ * 把 fluidExtra 按各可见业务列声明宽比例分配(最大余数法),
778
+ * 勾选列 / 序号列不参与;保证各列补宽之和等于 fluidExtra。
662
779
  * @private
780
+ * @param {?} fluidExtra
663
781
  * @return {?}
664
782
  */
665
- HdTableComponent.prototype.refreshFluidExtraTargetCol = /**
666
- * 按当前 layout 刷新 fluid 补宽目标列(仅 dealScroll / sync 时调用)
783
+ HdTableComponent.prototype.rebuildFluidExtraByCol = /**
784
+ * 把 fluidExtra 按各可见业务列声明宽比例分配(最大余数法),
785
+ * 勾选列 / 序号列不参与;保证各列补宽之和等于 fluidExtra。
667
786
  * @private
787
+ * @param {?} fluidExtra
668
788
  * @return {?}
669
789
  */
670
- function () {
671
- this.fluidExtraTargetCol = null;
672
- if (this.fluidExtraWidth <= 0 ||
673
- !this.tableCols ||
674
- !this.tableCols.length) {
790
+ function (fluidExtra) {
791
+ var _this = this;
792
+ this.fluidExtraByCol = new Map();
793
+ if (fluidExtra <= 0 || !this.tableCols || !this.tableCols.length) {
675
794
  return;
676
795
  }
677
- for (var i = this.tableCols.length - 1; i >= 0; i--) {
678
- /** @type {?} */
679
- var c = this.tableCols[i];
680
- if (c && c.isShow && c.fixed !== "right") {
681
- this.fluidExtraTargetCol = c;
796
+ /** @type {?} */
797
+ var parts = [];
798
+ /** @type {?} */
799
+ var sumDeclared = 0;
800
+ this.tableCols.forEach((/**
801
+ * @param {?} col
802
+ * @return {?}
803
+ */
804
+ function (col) {
805
+ if (!_this.isColVisible(col)) {
682
806
  return;
683
807
  }
808
+ /** @type {?} */
809
+ var declared = _this.getColDeclaredWidth(col);
810
+ sumDeclared += declared;
811
+ parts.push({ col: col, declared: declared, share: 0, frac: 0 });
812
+ }));
813
+ if (sumDeclared <= 0 || !parts.length) {
814
+ return;
684
815
  }
685
- for (var i = this.tableCols.length - 1; i >= 0; i--) {
816
+ /** @type {?} */
817
+ var assigned = 0;
818
+ parts.forEach((/**
819
+ * @param {?} part
820
+ * @return {?}
821
+ */
822
+ function (part) {
686
823
  /** @type {?} */
687
- var c = this.tableCols[i];
688
- if (c && c.isShow) {
689
- this.fluidExtraTargetCol = c;
824
+ var exact = (fluidExtra * part.declared) / sumDeclared;
825
+ part.share = Math.floor(exact);
826
+ part.frac = exact - part.share;
827
+ assigned += part.share;
828
+ }));
829
+ /** @type {?} */
830
+ var remain = fluidExtra - assigned;
831
+ parts
832
+ .slice()
833
+ .sort((/**
834
+ * @param {?} a
835
+ * @param {?} b
836
+ * @return {?}
837
+ */
838
+ function (a, b) { return b.frac - a.frac; }))
839
+ .forEach((/**
840
+ * @param {?} part
841
+ * @return {?}
842
+ */
843
+ function (part) {
844
+ if (remain <= 0) {
690
845
  return;
691
846
  }
692
- }
847
+ part.share += 1;
848
+ remain -= 1;
849
+ }));
850
+ parts.forEach((/**
851
+ * @param {?} part
852
+ * @return {?}
853
+ */
854
+ function (part) {
855
+ if (part.share > 0) {
856
+ _this.fluidExtraByCol.set(part.col, part.share);
857
+ }
858
+ }));
859
+ };
860
+ /** 把横向布局结果写回组件状态(dealScroll / syncHorizontalScroll 共用) */
861
+ /**
862
+ * 把横向布局结果写回组件状态(dealScroll / syncHorizontalScroll 共用)
863
+ * @private
864
+ * @param {?} layout
865
+ * @return {?}
866
+ */
867
+ HdTableComponent.prototype.applyHorizontalLayout = /**
868
+ * 把横向布局结果写回组件状态(dealScroll / syncHorizontalScroll 共用)
869
+ * @private
870
+ * @param {?} layout
871
+ * @return {?}
872
+ */
873
+ function (layout) {
874
+ this.fluidExtraWidth = layout.fluidExtra;
875
+ this.fluidHorizontal = layout.isFluid;
876
+ this.rebuildFluidExtraByCol(layout.fluidExtra);
877
+ this.tableColWidthTotal = layout.displayTotal;
693
878
  };
694
879
  Object.defineProperty(HdTableComponent.prototype, "totalFooterTableWidth", {
695
880
  /** fluid → 100%;固定 → scroll.x(与表体同一套横向宽度) */
@@ -817,7 +1002,6 @@ var HdTableComponent = /** @class */ (function () {
817
1002
  * @return {?}
818
1003
  */
819
1004
  function (forceRemount) {
820
- var _this = this;
821
1005
  if (forceRemount === void 0) { forceRemount = false; }
822
1006
  /** @type {?} */
823
1007
  var useVirtual = this.useVirtualScroll;
@@ -830,23 +1014,7 @@ var HdTableComponent = /** @class */ (function () {
830
1014
  // ng-zorro 只在 AfterViewInit 绑一次 header/body 的 scroll 同步;
831
1015
  // 若先以 y=null 创建再改成有 y,表头监听会丢,表现为列头不跟着横滚。
832
1016
  this.presetScrollBeforeRemount(useVirtual);
833
- this.showTable = false;
834
- this.cdr.markForCheck();
835
- setTimeout((/**
836
- * @return {?}
837
- */
838
- function () {
839
- _this.showTable = true;
840
- _this.cdr.markForCheck();
841
- setTimeout((/**
842
- * @return {?}
843
- */
844
- function () {
845
- _this.dealScroll();
846
- _this.cdr.markForCheck();
847
- _this.afterTableRender(useVirtual);
848
- }));
849
- }));
1017
+ this.remountTable(useVirtual);
850
1018
  return;
851
1019
  }
852
1020
  /** @type {?} */
@@ -858,32 +1026,48 @@ var HdTableComponent = /** @class */ (function () {
858
1026
  var nextHasX = !!(this.scroll && this.scroll.x);
859
1027
  /** @type {?} */
860
1028
  var nextHasY = !!(this.scroll && this.scroll.y);
861
- // 运行中 x/y 从有变无/从无变有时,也必须重建:
862
- // - y:ng-zorro 只在 AfterViewInit 绑一次 header/body 同步
863
- // - x:空表 scroll.x=null(table-layout:auto)→ 有数据后设 scroll.x(fixed),
864
- // 不重建时勾选列仍按 auto 均摊撑开(收款编辑等异步灌数页)
1029
+ // scroll.x / scroll.y 从无到有(或反过来)时必须重建,原地改值不生效:
1030
+ // - y:ng-zorro 8 只在 AfterViewInit 绑一次表头/表体滚动同步,且决定表头是否拆成独立 table
1031
+ // - x:决定是否带 ant-table-fixed(table-layout: fixed),勾选列锁宽依赖它
865
1032
  if (prevHasY !== nextHasY || prevHasX !== nextHasX) {
866
- this.showTable = false;
867
- this.cdr.markForCheck();
1033
+ this.remountTable(useVirtual);
1034
+ return;
1035
+ }
1036
+ this.cdr.markForCheck();
1037
+ this.afterTableRender(useVirtual);
1038
+ };
1039
+ /** 销毁并重建 nz-table:等 DOM 出来后再按真实容器宽重算一次横向布局 */
1040
+ /**
1041
+ * 销毁并重建 nz-table:等 DOM 出来后再按真实容器宽重算一次横向布局
1042
+ * @private
1043
+ * @param {?} useVirtual
1044
+ * @return {?}
1045
+ */
1046
+ HdTableComponent.prototype.remountTable = /**
1047
+ * 销毁并重建 nz-table:等 DOM 出来后再按真实容器宽重算一次横向布局
1048
+ * @private
1049
+ * @param {?} useVirtual
1050
+ * @return {?}
1051
+ */
1052
+ function (useVirtual) {
1053
+ var _this = this;
1054
+ this.showTable = false;
1055
+ this.cdr.markForCheck();
1056
+ setTimeout((/**
1057
+ * @return {?}
1058
+ */
1059
+ function () {
1060
+ _this.showTable = true;
1061
+ _this.cdr.markForCheck();
868
1062
  setTimeout((/**
869
1063
  * @return {?}
870
1064
  */
871
1065
  function () {
872
- _this.showTable = true;
1066
+ _this.dealScroll();
873
1067
  _this.cdr.markForCheck();
874
- setTimeout((/**
875
- * @return {?}
876
- */
877
- function () {
878
- _this.dealScroll();
879
- _this.cdr.markForCheck();
880
- _this.afterTableRender(useVirtual);
881
- }));
1068
+ _this.afterTableRender(useVirtual);
882
1069
  }));
883
- return;
884
- }
885
- this.cdr.markForCheck();
886
- this.afterTableRender(useVirtual);
1070
+ }));
887
1071
  };
888
1072
  /** 重建前预设 scroll,保证 AfterViewInit 时 header/body 结构已正确 */
889
1073
  /**
@@ -1748,48 +1932,62 @@ var HdTableComponent = /** @class */ (function () {
1748
1932
  function (maxOffset) {
1749
1933
  return "calc(100vh - " + maxOffset + "px)";
1750
1934
  };
1751
- /**
1752
- * @private
1753
- * @return {?}
1754
- */
1755
- HdTableComponent.prototype.hasTableData = /**
1756
- * @private
1757
- * @return {?}
1758
- */
1759
- function () {
1760
- return !!(this.tableData &&
1761
- this.tableData.content &&
1762
- this.tableData.content.length);
1763
- };
1764
- /**
1765
- * 按声明列总宽 + 容器宽,计算 scroll.x 与 fluid 补宽。
1766
- * 列少:scroll.x = 内容区宽(clientWidth),差额加到最后业务列(勾选保持 40);
1767
- * 列多:scroll.x = 声明总宽。
1768
- * 比较是否超宽用 offsetWidth(含 Y 槽),避免「仅因纵滚条」误开横滚;
1769
- * 补宽目标用 clientWidth,且 scroll.x 用 floor,避免表宽多 1px 逼出 X 轴滚动条。
1770
- */
1771
- /**
1772
- * 按声明列总宽 + 容器宽,计算 scroll.x 与 fluid 补宽。
1773
- * 列少:scroll.x = 内容区宽(clientWidth),差额加到最后业务列(勾选保持 40);
1774
- * 列多:scroll.x = 声明总宽。
1775
- * 比较是否超宽用 offsetWidth(含 Y 槽),避免「仅因纵滚条」误开横滚;
1776
- * 补宽目标用 clientWidth,且 scroll.x 用 floor,避免表宽多 1px 逼出 X 轴滚动条。
1935
+ /*
1936
+ * 横向布局(勾选列锁 40px 的关键)
1937
+ *
1938
+ * 勾选列只有在 table-layout: fixed 下才锁得住:ng-zorro 8 仅在 nzScroll.x 有值时
1939
+ * 给 table 加 ant-table-fixed;auto 布局下 table 宽 100%、每列都有 nzWidth,
1940
+ * 剩余空间会按比例摊到所有列(含勾选列),单元格上的 max-width 也不生效。
1941
+ * 所以只要有列(无论有没有数据)就一定设置 scroll.x:
1942
+ * - 列少:scroll.x = 容器宽,差额按声明宽比例分到各业务列(fluid,不出真横滚)
1943
+ * - 列多:scroll.x = 声明总宽,正常横滚
1944
+ * less 里勾选列的 40px 只是 fixed 布局下的兜底。
1945
+ */
1946
+ /**
1947
+ * 按声明列宽合计 + 容器宽算出横向布局。
1948
+ * 判断「是否超宽」用 offsetWidth(含竖滚条槽),避免只因竖滚条就误开横滚;
1949
+ * 补宽目标用 clientWidth 并向下取整,避免表宽多 1px 逼出横滚条。
1950
+ */
1951
+ /*
1952
+ * 横向布局(勾选列锁 40px 的关键)
1953
+ *
1954
+ * 勾选列只有在 table-layout: fixed 下才锁得住:ng-zorro 8 仅在 nzScroll.x 有值时
1955
+ * 给 table 加 ant-table-fixed;auto 布局下 table 宽 100%、每列都有 nzWidth,
1956
+ * 剩余空间会按比例摊到所有列(含勾选列),单元格上的 max-width 也不生效。
1957
+ * 所以只要有列(无论有没有数据)就一定设置 scroll.x:
1958
+ * - 列少:scroll.x = 容器宽,差额按声明宽比例分到各业务列(fluid,不出真横滚)
1959
+ * - 列多:scroll.x = 声明总宽,正常横滚
1960
+ * less 里勾选列的 40px 只是 fixed 布局下的兜底。
1961
+ */
1962
+ /**
1963
+ * 按声明列宽合计 + 容器宽算出横向布局。
1964
+ * 判断「是否超宽」用 offsetWidth(含竖滚条槽),避免只因竖滚条就误开横滚;
1965
+ * 补宽目标用 clientWidth 并向下取整,避免表宽多 1px 逼出横滚条。
1777
1966
  * @private
1778
1967
  * @param {?} declaredColWidth
1779
1968
  * @return {?}
1780
1969
  */
1781
- HdTableComponent.prototype.resolveHorizontalLayout = /**
1782
- * 按声明列总宽 + 容器宽,计算 scroll.x 与 fluid 补宽。
1783
- * 列少:scroll.x = 内容区宽(clientWidth),差额加到最后业务列(勾选保持 40);
1784
- * 列多:scroll.x = 声明总宽。
1785
- * 比较是否超宽用 offsetWidth(含 Y 槽),避免「仅因纵滚条」误开横滚;
1786
- * 补宽目标用 clientWidth,且 scroll.x 用 floor,避免表宽多 1px 逼出 X 轴滚动条。
1970
+ HdTableComponent.prototype.resolveHorizontalLayout = /*
1971
+ * 横向布局(勾选列锁 40px 的关键)
1972
+ *
1973
+ * 勾选列只有在 table-layout: fixed 下才锁得住:ng-zorro 8 仅在 nzScroll.x 有值时
1974
+ * 给 table 加 ant-table-fixed;auto 布局下 table 宽 100%、每列都有 nzWidth,
1975
+ * 剩余空间会按比例摊到所有列(含勾选列),单元格上的 max-width 也不生效。
1976
+ * 所以只要有列(无论有没有数据)就一定设置 scroll.x:
1977
+ * - 列少:scroll.x = 容器宽,差额按声明宽比例分到各业务列(fluid,不出真横滚)
1978
+ * - 列多:scroll.x = 声明总宽,正常横滚
1979
+ * less 里勾选列的 40px 只是 fixed 布局下的兜底。
1980
+ */
1981
+ /**
1982
+ * 按声明列宽合计 + 容器宽算出横向布局。
1983
+ * 判断「是否超宽」用 offsetWidth(含竖滚条槽),避免只因竖滚条就误开横滚;
1984
+ * 补宽目标用 clientWidth 并向下取整,避免表宽多 1px 逼出横滚条。
1787
1985
  * @private
1788
1986
  * @param {?} declaredColWidth
1789
1987
  * @return {?}
1790
1988
  */
1791
1989
  function (declaredColWidth) {
1792
- if (!this.hasTableData() || declaredColWidth <= 0) {
1990
+ if (declaredColWidth <= 0) {
1793
1991
  return {
1794
1992
  scrollX: null,
1795
1993
  fluidExtra: 0,
@@ -1798,115 +1996,64 @@ var HdTableComponent = /** @class */ (function () {
1798
1996
  };
1799
1997
  }
1800
1998
  /** @type {?} */
1801
- var viewportCompare = this.nzTableComponent
1999
+ var compareWidth = this.nzTableComponent
1802
2000
  ? getTableScrollXViewportWidth(this.nzTableComponent)
1803
2001
  : 0;
1804
- // 表体尚未量到宽时(异步灌数 / spin / 刚 remount),用宿主宽兜底
1805
- if (viewportCompare <= 0 && this.hostEl && this.hostEl.nativeElement) {
1806
- /** @type {?} */
1807
- var hostW = ((/** @type {?} */ (this.hostEl.nativeElement))).offsetWidth;
1808
- if (hostW > 0) {
1809
- viewportCompare = hostW;
1810
- }
2002
+ // 表体还没渲染出来(刚重建 / 在 spin 里)时用宿主宽兜底
2003
+ if (compareWidth <= 0 && this.hostEl && this.hostEl.nativeElement) {
2004
+ compareWidth = ((/** @type {?} */ (this.hostEl.nativeElement))).offsetWidth;
1811
2005
  }
1812
- if (viewportCompare > 0) {
1813
- if (declaredColWidth > viewportCompare + 1) {
1814
- return {
1815
- scrollX: Math.ceil(declaredColWidth) + "px",
1816
- fluidExtra: 0,
1817
- displayTotal: declaredColWidth,
1818
- isFluid: false,
1819
- };
1820
- }
1821
- /** @type {?} */
1822
- var fillWidth = this.nzTableComponent
1823
- ? getTableViewportWidth(this.nzTableComponent)
1824
- : 0;
1825
- /** @type {?} */
1826
- var target = Math.floor(fillWidth > 0 ? fillWidth : viewportCompare);
1827
- /** @type {?} */
1828
- var fluidExtra = Math.max(0, target - declaredColWidth);
1829
- return {
1830
- scrollX: target + "px",
1831
- fluidExtra: fluidExtra,
1832
- displayTotal: declaredColWidth + fluidExtra,
1833
- isFluid: true,
1834
- };
2006
+ // 仍量不到(如宿主在 display:none 里):先按声明宽走 fixed,等 ResizeObserver 触发再转 fluid
2007
+ if (compareWidth <= 0) {
2008
+ return fixedLayout(declaredColWidth);
1835
2009
  }
1836
- // 视口仍测不到:至少用声明宽设 scroll.x,强制 fixed 布局锁勾选列,
1837
- // 避免落回 table-layout:auto 被均摊撑开;后续 sync/remount 再转 fluid。
1838
- return {
1839
- scrollX: Math.ceil(declaredColWidth) + "px",
1840
- fluidExtra: 0,
1841
- displayTotal: declaredColWidth,
1842
- isFluid: false,
1843
- };
2010
+ // 1px 容差,避免亚像素误判
2011
+ if (declaredColWidth > compareWidth + 1) {
2012
+ return fixedLayout(declaredColWidth);
2013
+ }
2014
+ /** @type {?} */
2015
+ var fillWidth = this.nzTableComponent
2016
+ ? getTableViewportWidth(this.nzTableComponent)
2017
+ : 0;
2018
+ /** @type {?} */
2019
+ var containerWidth = Math.floor(fillWidth > 0 ? fillWidth : compareWidth);
2020
+ return fluidLayout(containerWidth, declaredColWidth);
1844
2021
  };
1845
- /** 表格渲染后按实际容器宽度校正横向 scroll / fluid 补宽 */
2022
+ /** 表格渲染后按真实容器宽校正横向布局;只改 x,y 保持不变 */
1846
2023
  /**
1847
- * 表格渲染后按实际容器宽度校正横向 scroll / fluid 补宽
2024
+ * 表格渲染后按真实容器宽校正横向布局;只改 x,y 保持不变
1848
2025
  * @private
1849
2026
  * @return {?}
1850
2027
  */
1851
2028
  HdTableComponent.prototype.syncHorizontalScroll = /**
1852
- * 表格渲染后按实际容器宽度校正横向 scroll / fluid 补宽
2029
+ * 表格渲染后按真实容器宽校正横向布局;只改 x,y 保持不变
1853
2030
  * @private
1854
2031
  * @return {?}
1855
2032
  */
1856
2033
  function () {
1857
2034
  var _this = this;
1858
2035
  /** @type {?} */
1859
- var declared = 0;
1860
- if (this.showSelected) {
1861
- declared += 40;
1862
- }
1863
- if (this.showTableTotal) {
1864
- declared += this.lineNumberColWidth;
1865
- }
1866
- if (this.tableCols) {
1867
- this.tableCols.forEach((/**
1868
- * @param {?} item
1869
- * @return {?}
1870
- */
1871
- function (item) {
1872
- if (item && item.isShow !== false) {
1873
- declared += item.width > 0 ? item.width : ColWidth.fixColWidth;
1874
- }
1875
- }));
1876
- }
1877
- /** @type {?} */
1878
2036
  var prevHasX = !!(this.scroll && this.scroll.x);
1879
2037
  /** @type {?} */
1880
- var layout = this.resolveHorizontalLayout(declared);
1881
- /** @type {?} */
1882
- var currentY = this.scroll ? this.scroll.y : null;
1883
- /** @type {?} */
1884
- var nextHasX = !!layout.scrollX;
1885
- /** @type {?} */
1886
- var sameX = this.scroll && this.scroll.x === layout.scrollX;
1887
- /** @type {?} */
1888
- var sameExtra = this.fluidExtraWidth === layout.fluidExtra;
2038
+ var layout = this.resolveHorizontalLayout(this.getDeclaredColWidthTotal());
1889
2039
  /** @type {?} */
1890
- var sameFluid = this.fluidHorizontal === layout.isFluid;
1891
- if (sameX &&
1892
- sameExtra &&
1893
- sameFluid &&
1894
- this.scroll &&
1895
- this.scroll.y === currentY) {
2040
+ var unchanged = this.scroll &&
2041
+ this.scroll.x === layout.scrollX &&
2042
+ this.fluidExtraWidth === layout.fluidExtra &&
2043
+ this.fluidHorizontal === layout.isFluid;
2044
+ if (unchanged) {
1896
2045
  setTimeout((/**
1897
2046
  * @return {?}
1898
2047
  */
1899
2048
  function () { return _this.syncTotalFooterWithBody(); }));
1900
2049
  return;
1901
2050
  }
1902
- this.fluidExtraWidth = layout.fluidExtra;
1903
- this.fluidHorizontal = layout.isFluid;
1904
- this.refreshFluidExtraTargetCol();
1905
- this.tableColWidthTotal = layout.displayTotal;
1906
- this.scroll = { x: layout.scrollX, y: currentY };
2051
+ this.applyHorizontalLayout(layout);
2052
+ this.refreshStickyOffsets();
2053
+ this.scroll = { x: layout.scrollX, y: this.scroll ? this.scroll.y : null };
1907
2054
  this.cdr.markForCheck();
1908
- // sync 阶段若补上了 scroll.x,需重建才能切到 fixed 布局
1909
- if (prevHasX !== nextHasX) {
2055
+ // x 从无到有(或反过来)要重建才能切换 table-layout
2056
+ if (prevHasX !== !!layout.scrollX) {
1910
2057
  this.applyTableScrollMode(true);
1911
2058
  return;
1912
2059
  }
@@ -2220,21 +2367,32 @@ var HdTableComponent = /** @class */ (function () {
2220
2367
  }), 100);
2221
2368
  };
2222
2369
  /**
2370
+ * 左/右冻结偏移按展示宽累计(fluid 比例补宽后各列变宽,不能再用声明宽)。
2371
+ * 须在 applyHorizontalLayout 之后调用。
2372
+ */
2373
+ /**
2374
+ * 左/右冻结偏移按展示宽累计(fluid 比例补宽后各列变宽,不能再用声明宽)。
2375
+ * 须在 applyHorizontalLayout 之后调用。
2376
+ * @private
2223
2377
  * @return {?}
2224
2378
  */
2225
- HdTableComponent.prototype.dealScroll = /**
2379
+ HdTableComponent.prototype.refreshStickyOffsets = /**
2380
+ * 左/右冻结偏移按展示宽累计(fluid 比例补宽后各列变宽,不能再用声明宽)。
2381
+ * 须在 applyHorizontalLayout 之后调用。
2382
+ * @private
2226
2383
  * @return {?}
2227
2384
  */
2228
2385
  function () {
2386
+ var _this = this;
2229
2387
  /** @type {?} */
2230
- var colWidth = 0;
2388
+ var leftOffset = 0;
2231
2389
  if (this.showSelected) {
2232
- colWidth += 40;
2390
+ leftOffset += SELECT_COL_WIDTH;
2233
2391
  }
2234
2392
  if (this.showTableTotal) {
2235
- colWidth += this.lineNumberColWidth; // 序号列(固定宽,不随位数变化)
2393
+ leftOffset += this.lineNumberColWidth;
2236
2394
  }
2237
- this.tableCols.forEach((/**
2395
+ (this.tableCols || []).forEach((/**
2238
2396
  * @param {?} item
2239
2397
  * @return {?}
2240
2398
  */
@@ -2242,34 +2400,48 @@ var HdTableComponent = /** @class */ (function () {
2242
2400
  if (!item.width) {
2243
2401
  item.width = ColWidth.fixColWidth;
2244
2402
  }
2245
- if (item.isShow !== false) {
2246
- item.fixedWidth = colWidth;
2247
- colWidth += item.width;
2403
+ if (_this.isColVisible(item)) {
2404
+ item.fixedWidth = leftOffset;
2405
+ leftOffset += _this.getColDisplayWidth(item);
2248
2406
  }
2249
2407
  }));
2250
- // 右侧固定列:从右往左累计偏移,避免多列都 right:0 互相遮挡
2251
2408
  /** @type {?} */
2252
2409
  var rightOffset = 0;
2253
- for (var i = this.tableCols.length - 1; i >= 0; i--) {
2410
+ for (var i = (this.tableCols || []).length - 1; i >= 0; i--) {
2254
2411
  /** @type {?} */
2255
2412
  var item = this.tableCols[i];
2256
- if (item.isShow === false) {
2413
+ if (!this.isColVisible(item)) {
2257
2414
  continue;
2258
2415
  }
2259
2416
  if (item.fixed === "right") {
2260
2417
  item.fixedRightWidth = rightOffset;
2261
- rightOffset += item.width;
2418
+ rightOffset += this.getColDisplayWidth(item);
2262
2419
  }
2263
2420
  else {
2264
2421
  item.fixedRightWidth = 0;
2265
2422
  }
2266
2423
  }
2424
+ };
2425
+ /**
2426
+ * @return {?}
2427
+ */
2428
+ HdTableComponent.prototype.dealScroll = /**
2429
+ * @return {?}
2430
+ */
2431
+ function () {
2432
+ (this.tableCols || []).forEach((/**
2433
+ * @param {?} item
2434
+ * @return {?}
2435
+ */
2436
+ function (item) {
2437
+ if (!item.width) {
2438
+ item.width = ColWidth.fixColWidth;
2439
+ }
2440
+ }));
2267
2441
  /** @type {?} */
2268
- var layout = this.resolveHorizontalLayout(colWidth);
2269
- this.fluidExtraWidth = layout.fluidExtra;
2270
- this.fluidHorizontal = layout.isFluid;
2271
- this.refreshFluidExtraTargetCol();
2272
- this.tableColWidthTotal = layout.displayTotal;
2442
+ var layout = this.resolveHorizontalLayout(this.getDeclaredColWidthTotal());
2443
+ this.applyHorizontalLayout(layout);
2444
+ this.refreshStickyOffsets();
2273
2445
  /** @type {?} */
2274
2446
  var maxOffset = this.getScrollYMaxOffset();
2275
2447
  /** @type {?} */
@@ -3506,7 +3678,7 @@ var HdTableComponent = /** @class */ (function () {
3506
3678
  HdTableComponent.decorators = [
3507
3679
  { type: Component, args: [{
3508
3680
  selector: "hd-table",
3509
- template: "<ng-container>\n <hd-button-group>\n <ng-template #buttonGroupLeft>\n <ng-container *ngTemplateOutlet=\"tableLeftButton\"></ng-container>\n <hd-button *ngIf=\"showOperateColWarpButton\" type=\"default\" (click)=\"toggleShowDetail()\">{{showDetail ?\n '\u7F29\u7565\u663E\u793A': '\u5C55\u5F00\u663E\u793A'}}</hd-button>\n </ng-template>\n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"tableRightButton\"></ng-container>\n <ng-container *ngIf=\"showColSettings\">\n <span class=\"hd-table-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-table-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"hd-table-col-settings-dropdown\">\n <div class=\"hd-table-col-settings-list\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzDraggable nzBlockNode\n nzShowExpand=\"false\" (nzCheckBoxChange)=\"checkAction($event)\" [nzBeforeDrop]=\"beforeDrop\"\n [nzTreeTemplate]=\"nzTreeTemplate\">\n </nz-tree>\n <ng-template #nzTreeTemplate let-node>\n <span\n class=\"ng-tns-c31-110 draggable ng-star-inserted ant-tree-node-content-wrapper ant-tree-node-content-wrapper-close\"\n [title]=\"node.key\" draggable=\"true\" aria-grabbed=\"true\">\n <span class=\"ant-tree-title\">\n <div class=\"hd-table-tree-node\">\n <span>{{node.key}}</span>\n <div *ngIf=\"!node.origin.disabled\" class=\"hd-table-tree-node-img\">\n <i nz-icon nzType=\"caret-up\" nzTheme=\"outline\"></i>\n <i nz-icon nzType=\"caret-down\" nzTheme=\"outline\"></i>\n </div>\n </div>\n </span>\n </span>\n </ng-template>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div class=\"hd-table-col-settings-footer\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </div>\n </nz-dropdown-menu>\n </ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space type=\"row\" size=\"12\"></hd-space>\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" type=\"row\" size=\"12\"></hd-space>\n <nz-table *ngIf=\"showTable\" #hdTable class=\"hd-table-container\" [class.hd-table--virtual]=\"useVirtualScroll\"\n [class.hd-table--scroll-y]=\"!!(scroll && scroll.y)\" [class.hd-table--scroll-x]=\"!!(scroll && scroll.x)\"\n [class.hd-table--fluid-x]=\"fluidHorizontal\" [class.hd-table--has-select]=\"showSelected\"\n [class.hd-table--has-total]=\"showTableTotal\" [nzScroll]=\"scroll\" [nzShowPagination]=\"pagination\"\n [nzShowSizeChanger]=\"pagination\" [nzShowQuickJumper]=\"pagination\" [nzFrontPagination]=\"useFrontPagination\"\n nzSize=\"middle\" [nzData]=\"tableData.content\" [nzTotal]=\"getTableTotalCount()\" [(nzPageIndex)]=\"tablePageIndex\"\n [nzLoading]=\"tableLoading\" [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\" [(nzPageSize)]=\"tablePageSize\"\n (nzPageSizeChange)=\"pagination ? search(true) : null\" (nzPageIndexChange)=\"pagination ? search(false) : null\"\n (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\" [nzShowTotal]=\"tableTotalTemplate\"\n [nzFooter]=\"showTableTotal ? tableTotalFooter : null\" [nzVirtualScroll]=\"useVirtualScroll\"\n [nzVirtualItemSize]=\"useVirtualScroll ? effectiveVirtualItemSize : 0\" [nzVirtualForTrackBy]=\"virtualTrackByRow\">\n <thead (nzSortChange)=\"sort($event)\" nzSingleSort>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType !== 'radio'\" nzShowCheckbox\n [(nzChecked)]=\"isAllDisplayDataChecked\" [nzIndeterminate]=\"isIndeterminate\"\n (nzCheckedChange)=\"checkAll($event)\"></th>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType === 'radio'\"></th>\n <th class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\"\n *ngIf=\"showTableTotal\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let col of tableCols\">\n <th *ngIf=\"col.isShow\" [nzWidth]=\"getColDisplayWidth(col) + 'px'\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\" [nzRight]=\"getRightSticky(col)\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\"\n [nzSort]=\"getColSort(col)\">\n <span class=\"hd-table-col-title\">\n <span class=\"hd-table-col-require\" *ngIf=\"col.require && col.editType\">*</span>\n <ng-container *ngIf=\"getTitleParts(col) as titleParts; else plainTitle\">\n <span class=\"hd-table-title-with-bar\">{{ titleParts[0] }}<i class=\"hd-table-row-no-bar\"></i>{{\n titleParts[1] }}</span>\n </ng-container>\n <ng-template #plainTitle>{{ col.title }}</ng-template>\n </span>\n <nz-resize-handle nzDirection=\"right\">\n <div class=\"resize-trigger\"></div>\n </nz-resize-handle>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-template *ngIf=\"useVirtualScroll\" nz-virtual-scroll let-data let-index=\"index\">\n <tr class=\"hd-table-virtual-row\" [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: index }\"></ng-container>\n </tr>\n </ng-template>\n <ng-container *ngIf=\"!useVirtualScroll\">\n <tr *ngFor=\"let data of hdTable.data; trackBy: trackByRow; index as i\"\n [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: i }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n <ng-template #tableTotalTemplate>\n \u5171 {{ getTableTotalCount() }} \u6761\u6570\u636E\n </ng-template>\n <ng-template #tableTotalFooter>\n <!--\n \u5217\u603B\u5BBD < \u5BB9\u5668\uFF1Ascroll.x=\u5BB9\u5668\u5BBD\uFF0C\u5DEE\u989D\u8865\u5230\u6700\u540E\u4E1A\u52A1\u5217\uFF08\u52FE\u9009\u4FDD\u6301 40\uFF09\uFF1B\u53EF\u62D6\u62FD\u3002\n \u5217\u603B\u5BBD > \u5BB9\u5668\uFF1Ascroll.x=\u58F0\u660E\u603B\u5BBD\uFF0C\u6A2A\u6EDA\u540C\u6B65\u3002\n -->\n <div class=\"hd-table-total-footer\" [class.hd-table-total-footer--fluid]=\"isTotalFooterFluid\"\n [class.hd-table-total-footer--y-gutter]=\"totalFooterNeedYGutter\">\n <table class=\"hd-table-total-footer-table\" [style.width]=\"totalFooterTableWidth\">\n <colgroup>\n <!-- \u52FE\u9009/\u5E8F\u53F7\u9501\u5BBD\uFF0C\u4E0D\u53C2\u4E0E\u5747\u644A -->\n <col *ngIf=\"showSelected\" style=\"width: 40px; min-width: 40px; max-width: 40px;\" />\n <col *ngIf=\"showTableTotal\" [style.width.px]=\"lineNumberColWidth\" [style.min-width.px]=\"lineNumberColWidth\"\n [style.max-width.px]=\"lineNumberColWidth\" />\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <col *ngIf=\"col.isShow\" [style.width.px]=\"getColDisplayWidth(col)\" />\n </ng-container>\n </colgroup>\n <tr class=\"hd-table-total\">\n <td *ngIf=\"showSelected\" class=\"hd-table-total-footer-cell hd-table-total-footer-select\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\" style=\"left: 0;\">&nbsp;</td>\n <td class=\"hd-table-total-footer-cell hd-table-total-footer-line-no\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\"\n [style.left]=\"!isTotalFooterFluid ? lineNumberLeft : null\">\u5408\u8BA1</td>\n <ng-container *ngFor=\"let col of tableCols; let colIndex = index; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" class=\"hd-table-total-footer-cell\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid && col.fixed === 'left'\"\n [class.hd-table-total-footer-sticky-right]=\"!isTotalFooterFluid && col.fixed === 'right'\"\n [class.hd-table-total-align-left]=\"getTableTotalCellAlign(col, colIndex) === 'left'\"\n [class.hd-table-total-align-center]=\"getTableTotalCellAlign(col, colIndex) === 'center'\"\n [class.hd-table-total-align-right]=\"getTableTotalCellAlign(col, colIndex) === 'right'\"\n [style.left]=\"!isTotalFooterFluid && col.fixed === 'left' ? (col.fixedWidth || 0) + 'px' : null\"\n [style.right]=\"!isTotalFooterFluid && col.fixed === 'right' ? (col.fixedRightWidth || 0) + 'px' : null\"\n [ngStyle]=\"{'text-align': getTableTotalCellAlign(col, colIndex)}\">\n {{ getTableTotalCellValue(col, colIndex) }}\n </td>\n </ng-container>\n </tr>\n </table>\n </div>\n </ng-template>\n </nz-table>\n</ng-container>\n\n<ng-template #tableCells let-data let-index=\"index\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType !== 'radio'\" nzShowCheckbox\n [nzChecked]=\"mapOfCheckedId[data[selectField]]\" [nzDisabled]=\"isSelectDisabled(data)\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <td nzWidth=\"40px\" nzLeft=\"0px\" class=\"hd-table-select-radio\" *ngIf=\"showSelected && selectType === 'radio'\">\n <label nz-radio [nzDisabled]=\"isSelectDisabled(data)\" [ngModel]=\"!!mapOfCheckedId[data[selectField]]\"\n (ngModelChange)=\"onRadioSelect($event, data)\"></label>\n </td>\n <td class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showTableTotal\">{{\n getLineNumber(index) }}</td>\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" [style.max-width.px]=\"getColDisplayWidth(col)\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\" [nzRight]=\"getRightSticky(col)\"\n [ngClass]=\"(col.canWarp && showDetail) ? 'common-td-wrap' : ''\">\n <ng-container *ngIf=\"col.title === '\u64CD\u4F5C';else notOperateTemplate\">\n <div class=\"common-btn-group\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else showConfirmTemplate\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"hasInlineEdit(col); else displayCellTpl\">\n <div class=\"hd-table-cell-edit\">\n <ng-container [ngSwitch]=\"col.editType\">\n <input *ngSwitchCase=\"'input'\" nz-input class=\"hd-table-cell-edit-control\"\n [placeholder]=\"col.placeholder || ''\" [disabled]=\"isEditDisabled(col, data)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\" />\n <nz-input-number *ngSwitchCase=\"'inputNumber'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || ''\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzMin]=\"getInputNumberProp(col, 'min', 0)\" [nzMax]=\"getInputNumberProp(col, 'max', 99999999)\"\n [nzStep]=\"getInputNumberProp(col, 'step', 1)\" [nzPrecision]=\"getInputNumberProp(col, 'precision', 4)\"\n [ngModel]=\"data[col.name]\" (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-input-number>\n <nz-select *ngSwitchCase=\"'select'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9'\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzAllowClear]=\"col.selectOption && col.selectOption.hdAllowClear !== false\"\n [nzShowSearch]=\"!col.selectOption || col.selectOption.hdShowSearch !== false\"\n [nzServerSearch]=\"!!(col.selectOption && col.selectOption.hdServerSearch)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onSelectChange(col, data, $event)\"\n (nzOpenChange)=\"onSelectOpenChange(col, data, $event)\" (nzOnSearch)=\"onSelectSearch(col, data, $event)\">\n <nz-option *ngFor=\"let selectItem of getSelectList(col, data)\"\n [nzValue]=\"selectItem[col.selectOption.value]\" [nzLabel]=\"getSelectOptionLabel(col, selectItem)\">\n </nz-option>\n </nz-select>\n <nz-date-picker *ngSwitchCase=\"'date'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9\u65E5\u671F'\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzDisabledDate]=\"getDisabledDate(col)\" [nzShowToday]=\"isDateShowToday(col)\"\n [nzShowTime]=\"isDateShowTime(col)\" [nzFormat]=\"getDateFormat(col, false)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-date-picker>\n <nz-range-picker *ngSwitchCase=\"'dateRange'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"getRangePlaceholder(col)\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzDisabledDate]=\"getDisabledDate(col)\" [nzFormat]=\"getDateFormat(col, true)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-range-picker>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #displayCellTpl>\n <div [class.hd-table-cell-with-actions]=\"col.btnList && col.btnList.length\">\n <div class=\"hd-table-cell-value\" [class.hd-table-cell-value--rowno]=\"hasRowNo(col)\"\n [class.hd-table-cell-value--edit]=\"isEditable(col, data)\">\n <ng-container *ngIf=\"col.name === 'state' || col.isState;else otherTemplate\">\n <hd-status [status]=\"data[getStateField(col)]\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\"\n nz-tooltip [nzTooltipTitle]=\"cell.title\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\">{{ cell.display }}</span>\n </ng-container>\n </hd-status>\n </ng-container>\n <ng-template #otherTemplate>\n <ng-container *ngIf=\"col.click && (!col.canClick || col.canClick(data));else noClickTemplate\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <a *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\" [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n <a *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n </ng-container>\n </ng-container>\n <ng-template #noClickTemplate>\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\"\n nz-tooltip [nzTooltipTitle]=\"cell.title\" [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{\n cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n </ng-container>\n </ng-template>\n </ng-template>\n <span class=\"hd-table-row-no\" *ngIf=\"hasRowNo(col) && getRowNoText(col, data, index)\">\n <i class=\"hd-table-row-no-bar\"></i>{{ getRowNoText(col, data, index) }}\n </span>\n <a *ngIf=\"isEditable(col, data)\" class=\"hd-table-edit-icon\" href=\"javascript:;\" title=\"\u7F16\u8F91\"\n (click)=\"onEditClick($event, col, data)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M8.10797 1.42626C8.44968 1.08456 9.0037 1.08456 9.34541 1.42626L10.9746 3.05542C11.3163 3.39713 11.3163 3.95115 10.9746 4.29286L5.01002 10.2574C4.87077 10.3967 4.68863 10.4849 4.49305 10.5078L2.72936 10.7142C2.18281 10.7782 1.71357 10.3278 1.7551 9.77914L1.89441 7.93871C1.9102 7.73007 2.00024 7.53399 2.14819 7.38604L8.10797 1.42626ZM7.67304 3.51111L8.88972 4.72779L9.94337 3.67414L8.72669 2.45746L7.67304 3.51111ZM8.06477 5.55274L6.84808 4.33606L3.04959 8.13456L2.94515 9.51434L4.25672 9.36079L8.06477 5.55274ZM12.25 12.8333L1.75 12.8333V11.6666L12.25 11.6666V12.8333Z\"\n fill=\"currentColor\" />\n </svg>\n </a>\n </div>\n <div class=\"common-btn-group hd-table-cell-actions\" *ngIf=\"col.btnList && col.btnList.length\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else cellActionConfirmTpl\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #cellActionConfirmTpl>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n</ng-template>",
3681
+ template: "<ng-container>\n <hd-button-group>\n <ng-template #buttonGroupLeft>\n <ng-container *ngTemplateOutlet=\"tableLeftButton\"></ng-container>\n <hd-button *ngIf=\"showOperateColWarpButton\" type=\"default\" (click)=\"toggleShowDetail()\">{{showDetail ?\n '\u7F29\u7565\u663E\u793A': '\u5C55\u5F00\u663E\u793A'}}</hd-button>\n </ng-template>\n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"tableRightButton\"></ng-container>\n <ng-container *ngIf=\"showColSettings\">\n <span class=\"hd-table-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-table-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"hd-table-col-settings-dropdown\">\n <div class=\"hd-table-col-settings-list\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzDraggable nzBlockNode\n nzShowExpand=\"false\" (nzCheckBoxChange)=\"checkAction($event)\" [nzBeforeDrop]=\"beforeDrop\"\n [nzTreeTemplate]=\"nzTreeTemplate\">\n </nz-tree>\n <ng-template #nzTreeTemplate let-node>\n <span\n class=\"ng-tns-c31-110 draggable ng-star-inserted ant-tree-node-content-wrapper ant-tree-node-content-wrapper-close\"\n [title]=\"node.key\" draggable=\"true\" aria-grabbed=\"true\">\n <span class=\"ant-tree-title\">\n <div class=\"hd-table-tree-node\">\n <span>{{node.key}}</span>\n <div *ngIf=\"!node.origin.disabled\" class=\"hd-table-tree-node-img\">\n <i nz-icon nzType=\"caret-up\" nzTheme=\"outline\"></i>\n <i nz-icon nzType=\"caret-down\" nzTheme=\"outline\"></i>\n </div>\n </div>\n </span>\n </span>\n </ng-template>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div class=\"hd-table-col-settings-footer\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </div>\n </nz-dropdown-menu>\n </ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space type=\"row\" size=\"12\"></hd-space>\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" type=\"row\" size=\"12\"></hd-space>\n <nz-table *ngIf=\"showTable\" #hdTable class=\"hd-table-container\" [class.hd-table--virtual]=\"useVirtualScroll\"\n [class.hd-table--scroll-y]=\"!!(scroll && scroll.y)\" [class.hd-table--scroll-x]=\"!!(scroll && scroll.x)\"\n [class.hd-table--fluid-x]=\"fluidHorizontal\" [class.hd-table--has-select]=\"showSelected\"\n [class.hd-table--has-total]=\"showTableTotal\" [nzScroll]=\"scroll\" [nzShowPagination]=\"pagination\"\n [nzShowSizeChanger]=\"pagination\" [nzShowQuickJumper]=\"pagination\" [nzFrontPagination]=\"useFrontPagination\"\n nzSize=\"middle\" [nzData]=\"tableData.content\" [nzTotal]=\"getTableTotalCount()\" [(nzPageIndex)]=\"tablePageIndex\"\n [nzLoading]=\"tableLoading\" [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\" [(nzPageSize)]=\"tablePageSize\"\n (nzPageSizeChange)=\"pagination ? search(true) : null\" (nzPageIndexChange)=\"pagination ? search(false) : null\"\n (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\" [nzShowTotal]=\"tableTotalTemplate\"\n [nzFooter]=\"showTableTotal ? tableTotalFooter : null\" [nzVirtualScroll]=\"useVirtualScroll\"\n [nzVirtualItemSize]=\"useVirtualScroll ? effectiveVirtualItemSize : 0\" [nzVirtualForTrackBy]=\"virtualTrackByRow\">\n <thead (nzSortChange)=\"sort($event)\" nzSingleSort>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType !== 'radio'\" nzShowCheckbox\n [(nzChecked)]=\"isAllDisplayDataChecked\" [nzIndeterminate]=\"isIndeterminate\"\n (nzCheckedChange)=\"checkAll($event)\"></th>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType === 'radio'\"></th>\n <th class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\"\n *ngIf=\"showTableTotal\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let col of tableCols\">\n <th *ngIf=\"col.isShow\" [nzWidth]=\"getColDisplayWidth(col) + 'px'\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\" [nzRight]=\"getRightSticky(col)\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\"\n [nzSort]=\"getColSort(col)\">\n <span class=\"hd-table-col-title\">\n <span class=\"hd-table-col-require\" *ngIf=\"col.require && col.editType\">*</span>\n <ng-container *ngIf=\"getTitleParts(col) as titleParts; else plainTitle\">\n <span class=\"hd-table-title-with-bar\">{{ titleParts[0] }}<i class=\"hd-table-row-no-bar\"></i>{{\n titleParts[1] }}</span>\n </ng-container>\n <ng-template #plainTitle>{{ col.title }}</ng-template>\n </span>\n <nz-resize-handle nzDirection=\"right\">\n <div class=\"resize-trigger\"></div>\n </nz-resize-handle>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-template *ngIf=\"useVirtualScroll\" nz-virtual-scroll let-data let-index=\"index\">\n <tr class=\"hd-table-virtual-row\" [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: index }\"></ng-container>\n </tr>\n </ng-template>\n <ng-container *ngIf=\"!useVirtualScroll\">\n <tr *ngFor=\"let data of hdTable.data; trackBy: trackByRow; index as i\"\n [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: i }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n <ng-template #tableTotalTemplate>\n \u5171 {{ getTableTotalCount() }} \u6761\u6570\u636E\n </ng-template>\n <ng-template #tableTotalFooter>\n <!--\n \u5217\u603B\u5BBD < \u5BB9\u5668\uFF1Ascroll.x=\u5BB9\u5668\u5BBD\uFF0C\u5DEE\u989D\u6309\u58F0\u660E\u5BBD\u6BD4\u4F8B\u5206\u5230\u5404\u4E1A\u52A1\u5217\uFF08\u52FE\u9009\u4FDD\u6301 40\uFF09\uFF1B\u53EF\u62D6\u62FD\u3002\n \u5217\u603B\u5BBD > \u5BB9\u5668\uFF1Ascroll.x=\u58F0\u660E\u603B\u5BBD\uFF0C\u6A2A\u6EDA\u540C\u6B65\u3002\n -->\n <div class=\"hd-table-total-footer\" [class.hd-table-total-footer--fluid]=\"isTotalFooterFluid\"\n [class.hd-table-total-footer--y-gutter]=\"totalFooterNeedYGutter\">\n <table class=\"hd-table-total-footer-table\" [style.width]=\"totalFooterTableWidth\">\n <colgroup>\n <!-- \u52FE\u9009/\u5E8F\u53F7\u9501\u5BBD\uFF0C\u4E0D\u53C2\u4E0E\u5747\u644A -->\n <col *ngIf=\"showSelected\" style=\"width: 40px; min-width: 40px; max-width: 40px;\" />\n <col *ngIf=\"showTableTotal\" [style.width.px]=\"lineNumberColWidth\" [style.min-width.px]=\"lineNumberColWidth\"\n [style.max-width.px]=\"lineNumberColWidth\" />\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <col *ngIf=\"col.isShow\" [style.width.px]=\"getColDisplayWidth(col)\" />\n </ng-container>\n </colgroup>\n <tr class=\"hd-table-total\">\n <td *ngIf=\"showSelected\" class=\"hd-table-total-footer-cell hd-table-total-footer-select\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\" style=\"left: 0;\">&nbsp;</td>\n <td class=\"hd-table-total-footer-cell hd-table-total-footer-line-no\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\"\n [style.left]=\"!isTotalFooterFluid ? lineNumberLeft : null\">\u5408\u8BA1</td>\n <ng-container *ngFor=\"let col of tableCols; let colIndex = index; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" class=\"hd-table-total-footer-cell\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid && col.fixed === 'left'\"\n [class.hd-table-total-footer-sticky-right]=\"!isTotalFooterFluid && col.fixed === 'right'\"\n [class.hd-table-total-align-left]=\"getTableTotalCellAlign(col, colIndex) === 'left'\"\n [class.hd-table-total-align-center]=\"getTableTotalCellAlign(col, colIndex) === 'center'\"\n [class.hd-table-total-align-right]=\"getTableTotalCellAlign(col, colIndex) === 'right'\"\n [style.left]=\"!isTotalFooterFluid && col.fixed === 'left' ? (col.fixedWidth || 0) + 'px' : null\"\n [style.right]=\"!isTotalFooterFluid && col.fixed === 'right' ? (col.fixedRightWidth || 0) + 'px' : null\"\n [ngStyle]=\"{'text-align': getTableTotalCellAlign(col, colIndex)}\">\n {{ getTableTotalCellValue(col, colIndex) }}\n </td>\n </ng-container>\n </tr>\n </table>\n </div>\n </ng-template>\n </nz-table>\n</ng-container>\n\n<ng-template #tableCells let-data let-index=\"index\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType !== 'radio'\" nzShowCheckbox\n [nzChecked]=\"mapOfCheckedId[data[selectField]]\" [nzDisabled]=\"isSelectDisabled(data)\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <td nzWidth=\"40px\" nzLeft=\"0px\" class=\"hd-table-select-radio\" *ngIf=\"showSelected && selectType === 'radio'\">\n <label nz-radio [nzDisabled]=\"isSelectDisabled(data)\" [ngModel]=\"!!mapOfCheckedId[data[selectField]]\"\n (ngModelChange)=\"onRadioSelect($event, data)\"></label>\n </td>\n <td class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showTableTotal\">{{\n getLineNumber(index) }}</td>\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" [style.max-width.px]=\"getColDisplayWidth(col)\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\" [nzRight]=\"getRightSticky(col)\"\n [ngClass]=\"(col.canWarp && showDetail) ? 'common-td-wrap' : ''\">\n <ng-container *ngIf=\"col.title === '\u64CD\u4F5C';else notOperateTemplate\">\n <div class=\"common-btn-group\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else showConfirmTemplate\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"hasInlineEdit(col); else displayCellTpl\">\n <div class=\"hd-table-cell-edit\">\n <ng-container [ngSwitch]=\"col.editType\">\n <input *ngSwitchCase=\"'input'\" nz-input class=\"hd-table-cell-edit-control\"\n [placeholder]=\"col.placeholder || ''\" [disabled]=\"isEditDisabled(col, data)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\" />\n <nz-input-number *ngSwitchCase=\"'inputNumber'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || ''\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzMin]=\"getInputNumberProp(col, 'min', 0)\" [nzMax]=\"getInputNumberProp(col, 'max', 99999999)\"\n [nzStep]=\"getInputNumberProp(col, 'step', 1)\" [nzPrecision]=\"getInputNumberProp(col, 'precision', 4)\"\n [ngModel]=\"data[col.name]\" (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-input-number>\n <nz-select *ngSwitchCase=\"'select'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9'\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzAllowClear]=\"col.selectOption && col.selectOption.hdAllowClear !== false\"\n [nzShowSearch]=\"!col.selectOption || col.selectOption.hdShowSearch !== false\"\n [nzServerSearch]=\"!!(col.selectOption && col.selectOption.hdServerSearch)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onSelectChange(col, data, $event)\"\n (nzOpenChange)=\"onSelectOpenChange(col, data, $event)\" (nzOnSearch)=\"onSelectSearch(col, data, $event)\">\n <nz-option *ngFor=\"let selectItem of getSelectList(col, data)\"\n [nzValue]=\"selectItem[col.selectOption.value]\" [nzLabel]=\"getSelectOptionLabel(col, selectItem)\">\n </nz-option>\n </nz-select>\n <nz-date-picker *ngSwitchCase=\"'date'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9\u65E5\u671F'\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzDisabledDate]=\"getDisabledDate(col)\" [nzShowToday]=\"isDateShowToday(col)\"\n [nzShowTime]=\"isDateShowTime(col)\" [nzFormat]=\"getDateFormat(col, false)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-date-picker>\n <nz-range-picker *ngSwitchCase=\"'dateRange'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"getRangePlaceholder(col)\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzDisabledDate]=\"getDisabledDate(col)\" [nzFormat]=\"getDateFormat(col, true)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-range-picker>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #displayCellTpl>\n <div [class.hd-table-cell-with-actions]=\"col.btnList && col.btnList.length\">\n <div class=\"hd-table-cell-value\" [class.hd-table-cell-value--rowno]=\"hasRowNo(col)\"\n [class.hd-table-cell-value--edit]=\"isEditable(col, data)\">\n <ng-container *ngIf=\"col.name === 'state' || col.isState;else otherTemplate\">\n <hd-status [status]=\"data[getStateField(col)]\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\"\n nz-tooltip [nzTooltipTitle]=\"cell.title\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\">{{ cell.display }}</span>\n </ng-container>\n </hd-status>\n </ng-container>\n <ng-template #otherTemplate>\n <ng-container *ngIf=\"col.click && (!col.canClick || col.canClick(data));else noClickTemplate\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <a *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\" [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n <a *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n </ng-container>\n </ng-container>\n <ng-template #noClickTemplate>\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\"\n nz-tooltip [nzTooltipTitle]=\"cell.title\" [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{\n cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n </ng-container>\n </ng-template>\n </ng-template>\n <span class=\"hd-table-row-no\" *ngIf=\"hasRowNo(col) && getRowNoText(col, data, index)\">\n <i class=\"hd-table-row-no-bar\"></i>{{ getRowNoText(col, data, index) }}\n </span>\n <a *ngIf=\"isEditable(col, data)\" class=\"hd-table-edit-icon\" href=\"javascript:;\" title=\"\u7F16\u8F91\"\n (click)=\"onEditClick($event, col, data)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M8.10797 1.42626C8.44968 1.08456 9.0037 1.08456 9.34541 1.42626L10.9746 3.05542C11.3163 3.39713 11.3163 3.95115 10.9746 4.29286L5.01002 10.2574C4.87077 10.3967 4.68863 10.4849 4.49305 10.5078L2.72936 10.7142C2.18281 10.7782 1.71357 10.3278 1.7551 9.77914L1.89441 7.93871C1.9102 7.73007 2.00024 7.53399 2.14819 7.38604L8.10797 1.42626ZM7.67304 3.51111L8.88972 4.72779L9.94337 3.67414L8.72669 2.45746L7.67304 3.51111ZM8.06477 5.55274L6.84808 4.33606L3.04959 8.13456L2.94515 9.51434L4.25672 9.36079L8.06477 5.55274ZM12.25 12.8333L1.75 12.8333V11.6666L12.25 11.6666V12.8333Z\"\n fill=\"currentColor\" />\n </svg>\n </a>\n </div>\n <div class=\"common-btn-group hd-table-cell-actions\" *ngIf=\"col.btnList && col.btnList.length\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else cellActionConfirmTpl\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #cellActionConfirmTpl>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n</ng-template>",
3510
3682
  changeDetection: ChangeDetectionStrategy.OnPush,
3511
3683
  styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset;padding:0 6px!important}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection--multiple .ant-select-selection__rendered>ul>li.ant-select-search--inline:only-child{margin-left:4px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.nz-resizable-preview{position:absolute;top:0;left:0;z-index:8;border:1px dashed #d1d1d1}.nz-resizable-handle{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:9}.nz-resizable-handle-top{width:100%;height:10px;top:-5px;left:0}.nz-resizable-handle-right{height:100%}.nz-resizable-handle-bottom{width:100%;height:10px;bottom:-5px;left:0}.nz-resizable-handle-left{width:10px;height:100%;top:0;left:-5px}.nz-resizable-handle-topRight{width:20px;height:20px;top:-5px;right:-5px;z-index:10}.nz-resizable-handle-bottomRight{width:20px;height:20px;right:-5px;bottom:-5px;z-index:10}.nz-resizable-handle-bottomLeft{width:20px;height:20px;bottom:-5px;left:-5px;z-index:10}.nz-resizable-handle-topLeft{width:20px;height:20px;top:-5px;left:-5px;z-index:10}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottom,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-top{cursor:row-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-left,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-right{cursor:col-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomRight,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topLeft{cursor:nwse-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomLeft,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topRight{cursor:nesw-resize}.hd-table-col-settings{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px;padding:0;margin-left:12px;cursor:pointer;color:#2a3634;background:0 0;border:1px solid #e5e6eb;border-radius:4px;vertical-align:middle;flex-shrink:0}.hd-table-col-settings:hover{color:#20b95d;background:#f5f8f6;border-color:#20b95d}.hd-table-col-settings .hd-table-col-settings-icon{display:block;width:14px;height:14px;flex-shrink:0}.hd-table-cell-with-actions{display:inline-flex;flex-wrap:wrap;align-items:center;-moz-column-gap:12px;column-gap:12px;row-gap:6px;max-width:100%}.hd-table-cell-with-actions .hd-table-cell-value{min-width:0}.hd-table-cell-with-actions .hd-table-cell-actions{flex-shrink:0}.hd-table-col-settings-dropdown{background:#fff;border:1px solid #e5e6eb;border-radius:4px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);overflow:hidden}.hd-table-col-settings-list{max-height:400px;overflow-y:auto}.hd-table-col-settings-footer{text-align:right;background:#fff;padding:4px;border-top:1px solid #f0f0f0}.hd-table-container ::ng-deep .ant-pagination-options-quick-jumper input{border-radius:2px;border:1px solid #d9d9d9}.hd-table-container ::ng-deep .ant-pagination-options .ant-select-selection{border-radius:2px}.hd-table-container ::ng-deep .ant-table-thead>tr>th{border-bottom:1px solid #ecf1ed;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .ant-table-tbody>tr>td{border-bottom:1px solid #ecf1ed;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .ant-table-tbody>tr>td.hd-table-line-no-col,.hd-table-container ::ng-deep .ant-table-thead>tr>th.hd-table-line-no-col{width:72px!important;min-width:72px!important;max-width:72px!important;box-sizing:border-box}.hd-table-container ::ng-deep .ant-table-tbody>tr>td.ant-table-selection-column,.hd-table-container ::ng-deep .ant-table-thead>tr>th.ant-table-selection-column{width:40px!important;min-width:40px!important;max-width:40px!important;box-sizing:border-box;padding-left:8px!important;padding-right:8px!important}.hd-table-container .hd-table-cell-value--edit,.hd-table-container .hd-table-cell-value--rowno{display:inline-flex;align-items:center;min-width:0}.hd-table-container .hd-table-cell-value--edit>a:not(.hd-table-edit-icon),.hd-table-container .hd-table-cell-value--edit>hd-status,.hd-table-container .hd-table-cell-value--edit>span:not(.hd-table-row-no),.hd-table-container .hd-table-cell-value--rowno>a:not(.hd-table-edit-icon),.hd-table-container .hd-table-cell-value--rowno>hd-status,.hd-table-container .hd-table-cell-value--rowno>span:not(.hd-table-row-no){min-width:0}.hd-table-container .hd-table-row-no{display:inline-flex;flex-shrink:0;align-items:center;margin-left:4px;color:#1d1f29;font-size:14px;line-height:22px}.hd-table-container .hd-table-row-no-bar{display:inline-block;flex:0 0 auto;align-self:center;width:1px;height:14px;margin-right:4px;background:#1d1f29;vertical-align:middle}.hd-table-container .hd-table-edit-icon{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;margin-left:2px;width:14px;height:14px;color:#20b95d;line-height:1;cursor:pointer}.hd-table-container .hd-table-edit-icon:hover{color:#20bd62}.hd-table-container .hd-table-edit-icon svg{display:block;width:14px;height:14px}.hd-table-container .hd-table-col-title{display:inline-flex;align-items:center}.hd-table-container .hd-table-col-require{margin-right:4px;color:#f5222d;font-family:SimSun,sans-serif}.hd-table-container .hd-table-title-with-bar{display:inline-flex;align-items:center}.hd-table-container .hd-table-title-with-bar .hd-table-row-no-bar{width:1px;height:14px;margin:0 4px;align-self:center}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-right-sticky{background:#f7f8fa!important;color:#868a9c!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a{color:#20b95d!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a:hover{color:#20bd62!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group .common-danger-btn:hover{color:#f05b24!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-table-cell-value>a{color:#20b95d}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-billNumber>a{color:#3b77e3}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-status-text{color:#868a9c!important}.hd-table-container ::ng-deep cdk-virtual-scroll-viewport.ant-table-body .hd-table-virtual-row>td{box-sizing:border-box}.hd-table-container.hd-table--scroll-x ::ng-deep .ant-table-body>table,.hd-table-container.hd-table--scroll-x ::ng-deep .ant-table-header>table,.hd-table-container.hd-table--scroll-x ::ng-deep .cdk-virtual-scroll-content-wrapper>table{table-layout:fixed}.hd-table-container:not(.hd-table--scroll-y):not(.hd-table--scroll-x) ::ng-deep .ant-table-body{max-height:none!important;overflow-y:visible!important}.hd-table-container.hd-table--scroll-x:not(.hd-table--scroll-y) ::ng-deep .ant-table-body{overflow-y:hidden!important}.hd-table-container.hd-table--fluid-x ::ng-deep .ant-table-body{overflow-x:hidden!important}.hd-table-container.hd-table--fluid-x.hd-table--scroll-y ::ng-deep .ant-table-header{margin-bottom:0!important;padding-bottom:0!important;overflow-x:hidden!important}.hd-table-container.hd-table--has-total ::ng-deep .ant-table-footer{padding:0;overflow:hidden;background:#fafafa;border-top:1px solid #e8e8e8}.hd-table-total-footer{width:100%;box-sizing:border-box;overflow-x:auto;overflow-y:hidden;background:#fafafa;scrollbar-width:thin;scrollbar-color:transparent transparent}.hd-table-total-footer::-webkit-scrollbar{width:12px;height:0}.hd-table-total-footer::-webkit-scrollbar-track{background:0 0}.hd-table-total-footer::-webkit-scrollbar-thumb{background:padding-box;border:4px solid transparent}.hd-table-total-footer::-webkit-scrollbar-corner{background:0 0}.hd-table-total-footer.hd-table-total-footer--y-gutter{overflow-y:scroll}.hd-table-total-footer.hd-table-total-footer--fluid{overflow-x:hidden}.hd-table-total-footer-table{table-layout:fixed;border-collapse:separate;border-spacing:0}.hd-table-total-footer-cell{padding:12px 8px;font-weight:500;background:#fafafa;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-bottom:0}.hd-table-total-footer-cell.hd-table-total-align-left{text-align:left!important}.hd-table-total-footer-cell.hd-table-total-align-center{text-align:center!important}.hd-table-total-footer-cell.hd-table-total-align-right{text-align:right!important}.hd-table-select-radio{text-align:center}.hd-table-select-radio ::ng-deep .ant-radio-wrapper{margin-right:0}.hd-table-total-footer-select{width:40px;min-width:40px;max-width:40px;padding-left:8px;padding-right:8px;text-align:center}.hd-table-total-footer-line-no{width:72px;min-width:72px;max-width:72px}.hd-table-total-footer-sticky-left,.hd-table-total-footer-sticky-right{position:-webkit-sticky;position:sticky;z-index:2;background:#fafafa}::ng-deep .ant-dropdown-menu{border-radius:0}::ng-deep .ant-dropdown{margin-top:8px!important}.common-td-wrap{white-space:normal!important;word-break:break-all}.hd-table-cell-ellipsis{display:block;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.nz-resizable-preview{border-width:0 1px 0 0}.resize-trigger{width:10px;height:15px;position:relative;top:calc((100% - 15px)/ 2)}.resize-trigger::after{position:absolute;top:calc((100% - 15px)/ 2);left:0;background:#d5d5d5;content:'';width:1px;height:15px;z-index:1}.nz-resizable-handle-right{position:absolute;width:10px;top:0;right:-5px;z-index:inherit}::ng-deep .ant-table-th-right-sticky .nz-resizable-handle-right{right:0}.hd-table-tree-node{display:inline-flex;align-items:center;padding-right:10px}.hd-table-tree-node .hd-table-tree-node-img{display:flex;flex-direction:column;position:absolute;right:0;margin-top:-2.5px}.hd-table-tree-node .hd-table-tree-node-img i{opacity:.3}.hd-table-tree-node .hd-table-tree-node-img i:last-child{margin-top:-5px}img{width:20px;height:20px}.ant-table-th-left-sticky{z-index:2}::ng-deep .ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters>:not(.ant-table-column-sorter){position:unset}.hd-table-cell-edit{width:100%;min-width:0}.hd-table-cell-edit-control{width:100%!important}::ng-deep .hd-table-cell-edit .ant-calendar-picker,::ng-deep .hd-table-cell-edit .ant-input,::ng-deep .hd-table-cell-edit .ant-input-number,::ng-deep .hd-table-cell-edit .ant-select{width:100%}::ng-deep .hd-table-cell-edit .ant-input,::ng-deep .hd-table-cell-edit .ant-input-number,::ng-deep .hd-table-cell-edit .ant-select-selection{height:32px}::ng-deep .hd-table-cell-edit .ant-input-number-input{height:30px}::ng-deep .hd-table-cell-edit .ant-select-selection__rendered{line-height:30px}"]
3512
3684
  }] }
@@ -3745,28 +3917,26 @@ if (false) {
3745
3917
  */
3746
3918
  HdTableComponent.prototype.virtualScrollActive;
3747
3919
  /**
3748
- * 列宽合计(含勾选/序号 + fluid 补宽),footer 表宽与横向 scroll 共用
3920
+ * 实际渲染列宽合计(含勾选/序号 + 补宽),合计 footer 表宽用
3749
3921
  * @type {?}
3750
3922
  */
3751
3923
  HdTableComponent.prototype.tableColWidthTotal;
3752
3924
  /**
3753
- * fluid:声明列总宽 < 容器时,把差额补到最后一列业务列(不改缓存宽),
3754
- * 并设 scroll.x = 容器宽,避免表宽 100% 均摊撑开勾选列;拖拽改宽仍写 col.width。
3925
+ * 待按比例分给各业务列的总补宽;只影响展示,不写回 col.width(列宽缓存、拖拽仍用声明宽)
3755
3926
  * @type {?}
3756
3927
  */
3757
3928
  HdTableComponent.prototype.fluidExtraWidth;
3758
3929
  /**
3759
- * 列总宽未超出容器(fluid 补宽吃满):不需要真正横滚,
3760
- * 用于关掉 ng-zorro fixed-header 带来的常驻 X 轴滚动条。
3930
+ * 列少、靠补宽吃满容器:模板据此加 hd-table--fluid-x,隐藏 fixed-header 常驻的横滚槽
3761
3931
  * @type {?}
3762
3932
  */
3763
3933
  HdTableComponent.prototype.fluidHorizontal;
3764
3934
  /**
3765
- * fluid 补宽目标列缓存,避免模板每格 CD 时反复扫 tableCols
3935
+ * 各业务列分到的补宽(按列对象取,applyHorizontalLayout 时整表重建)
3766
3936
  * @type {?}
3767
3937
  * @private
3768
3938
  */
3769
- HdTableComponent.prototype.fluidExtraTargetCol;
3939
+ HdTableComponent.prototype.fluidExtraByCol;
3770
3940
  /**
3771
3941
  * 数据更新后待复位纵向滚动位置
3772
3942
  * @type {?}
@@ -3882,4 +4052,4 @@ if (false) {
3882
4052
  */
3883
4053
  HdTableComponent.prototype.commonSessionService;
3884
4054
  }
3885
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFudGFzeS1uZ3pvcnJvLyIsInNvdXJjZXMiOlsiaGQtdGFibGUvaGQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsWUFBWSxHQUdiLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHFCQUFxQixHQUN0QixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFJTCxnQkFBZ0IsRUFDaEIsUUFBUSxHQUNULE1BQU0sb0JBQW9CLENBQUM7QUFDNUI7SUF3S0UsMEJBQ1UsTUFBa0IsRUFDbEIsR0FBc0IsRUFDdEIsb0JBQTBDO1FBSHBELGlCQVdDO1FBVlMsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0Qix5QkFBb0IsR0FBcEIsb0JB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QUVyRCxzQ0FFRTs7SUEyWUYsc0NBZ0NFOzs7OztJQXB4QkEsa0NBQTBCOzs7OztJQUMxQiwrQkFBOEI7Ozs7O0lBQzlCLGdEQUFrRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZSxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCAqIGFzIGxvY2FsZm9yYWdlIGZyb20gXCJsb2NhbGZvcmFnZVwiO1xuaW1wb3J0IHtcbiAgSW5wdXRCb29sZWFuLFxuICBOekZvcm1hdEJlZm9yZURyb3BFdmVudCxcbiAgTnpGb3JtYXRFbWl0RXZlbnQsXG59IGZyb20gXCJuZy16b3Jyby1hbnRkL2NvcmVcIjtcbmltcG9ydCB7IE56UmVzaXplRXZlbnQgfSBmcm9tIFwibmctem9ycm8tYW50ZC9yZXNpemFibGVcIjtcbmltcG9ydCB7IE56VGFibGVDb21wb25lbnQgfSBmcm9tIFwibmctem9ycm8tYW50ZC90YWJsZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRlbGF5IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBUb3RhbE9wdGlvbiB9IGZyb20gXCIuLi9oZC1kZXRhaWwtbGluZXMvaGQtZGV0YWlsLWxpbmVzLnNlcnZpY2VcIjtcbmltcG9ydCB7IENvbFdpZHRoIH0gZnJvbSBcIi4uL21vZGVsL2NvbFdpZHRoXCI7XG5pbXBvcnQgeyBQYWdlIH0gZnJvbSBcIi4uL21vZGVsL2NvbW1vbi10eXBlXCI7XG5pbXBvcnQgeyBDb21tb25TZXNzaW9uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlL2NvbW1vbi1zZXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gIGdldFRhYmxlU2Nyb2xsWFZpZXdwb3J0V2lkdGgsXG4gIGdldFRhYmxlVmlld3BvcnRXaWR0aCxcbn0gZnJvbSBcIi4uL3V0aWxzL2hkLXRhYmxlLXNjcm9sbC51dGlsXCI7XG5pbXBvcnQge1xuICBIZFRhYmxlQ2VsbENoYW5nZSxcbiAgSGRUYWJsZUNvbHVtbixcbiAgT3BlcmF0ZUJ0bixcbiAgVGFibGVDYWNoZU9wdGlvbixcbiAgVHJlZUdyaWQsXG59IGZyb20gXCIuL2hkLXRhYmxlLnNlcnZpY2VcIjtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJoZC10YWJsZVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2hkLXRhYmxlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9oZC10YWJsZS5jb21wb25lbnQubGVzc1wiXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEhkVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZztcbiAgQElucHV0KCkgdGFibGVDb2xzOiBBcnJheTxIZFRhYmxlQ29sdW1uPiA9IFtdO1xuICBASW5wdXQoKSB0YWJsZURhdGE6IFBhZ2U8YW55PjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICog5Yu+6YCJ5YiX5b2i5oCB44CCY2hlY2tib3jvvJrlpJrpgInvvIjpu5jorqTvvInvvJtyYWRpb++8muWNlemAie+8jOaXoOihqOWktOWFqOmAie+8jHNlbGVjdEV2ZW50IOS7jeWbnuS8oOaVsOe7hO+8iDAg5oiWIDEg5p2h77yJ44CCXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RUeXBlOiBcImNoZWNrYm94XCIgfCBcInJhZGlvXCIgPSBcImNoZWNrYm94XCI7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93T3BlcmF0ZUNvbFdhcnBCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuWxleekuuWIl+iuvue9ru+8iOm9v+i9ru+8ie+8jOm7mOiupOW8gOWQr++8m+W8ueeql+etieWcuuaZr+WPr+S8oCBmYWxzZSDlhbPpl60gKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dDb2xTZXR0aW5nczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB2aXJ0dWFsU2Nyb2xsOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIOaJi+WKqOaMh+WumuihjOmrmO+8m+S4jeS8oOWImeWcqOmmluWxj+a4suafk+WQjuiHquWKqOa1i+mHjyAqL1xuICBASW5wdXQoKSB2aXJ0dWFsSXRlbVNpemU6IG51bWJlcjtcbiAgQElucHV0KCkgc2VsZWN0RmllbGQ6IHN0cmluZyA9IFwiYmlsbE51bWJlclwiO1xuICAvKipcbiAgICog6KGM5Yu+6YCJ56aB55So5a2X5q615ZCN44CC5a6a5LmJ5ZCO5Y+W5b2T5YmN6KGM6K+l5a2X5q6177yaXG4gICAqIOS4uiB0cnVlIOaXtuemgeeUqOivpeihjOWLvumAie+8iOWFqOmAieS5n+S8mui3s+i/h++8ieOAglxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0RGlzYWJsZWRGaWVsZDogc3RyaW5nO1xuICAvKipcbiAgICog6KGM5aSx5pWI5a2X5q615ZCN44CC5a6a5LmJ5ZCO5Y+W5b2T5YmN6KGM6K+l5a2X5q6177yaXG4gICAqIOS4uiB0cnVlIOaXtuaVtOihjOiDjOaZr+iJsuS4uiAjRjdGOEZB44CCXG4gICAqL1xuICBASW5wdXQoKSByb3dJbnZhbGlkRmllbGQ6IHN0cmluZztcbiAgLy8g5ZCI6K6h5Yy65Z+f77yI57G75Z6L5LiOIGhkLWRldGFpbC1saW5lcyDnmoQgVG90YWxPcHRpb24g5LiA6Ie077yJXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93VGFibGVUb3RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0YWJsZVRvdGFsT3B0aW9uOiBBcnJheTxUb3RhbE9wdGlvbj47XG4gIC8qKlxuICAgKiDlkIjorqHliJfmgLvmlbDvvIjlkKvluo/lj7fliJfvvIzkuI4gaGQtZGV0YWlsLWxpbmVzIOS4gOiHtO+8ie+8m1xuICAgKiDkuI3kvKDliJnmjInlvZPliY3lj6/op4HmlbDmja7liJfmlbAgKyAx77yI5bqP5Y+377yJ5o6o566X44CCXG4gICAqL1xuICBASW5wdXQoKSBjb2x1bW5zTnVtYmVyOiBudW1iZXIgfCBzdHJpbmc7XG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRhYmxlU2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiDooYzlhoXnvJbovpHlj5jmm7TvvIjlt7Llhpnlm57ooYzlr7nosaHvvJtwcmV2aW91cyog5L6b5o6l5Y+j5aSx6LSl5Zue5rua77yJICovXG4gIEBPdXRwdXQoKSBjZWxsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxIZFRhYmxlQ2VsbENoYW5nZT4oKTtcbiAgQElucHV0KCkgdGFibGVMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiDmmK/lkKbmmL7npLrliIbpobXvvJtmYWxzZSDml7bkuIDmrKHlsZXnpLogdGFibGVEYXRhLmNvbnRlbnQg5YWo6YOo6KGMICovXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBwYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqXG4gICAqIOaYr+WQpuWJjeerr+WIhumhte+8iOWvuSBjb250ZW50IOWFqOmHj+WIh+eJh++8ieOAglxuICAgKiB0cnVl77ya57+76aG15LiN6Kem5Y+RIHRhYmxlU2VhcmNoRXZlbnTvvIzpgILlkIjor6bmg4Xlhajph4/mlbDmja7vvJtcbiAgICogZmFsc2XvvIjpu5jorqTvvInvvJrmnI3liqHnq6/liIbpobXvvIznv7vpobXop6blj5Hmn6Xor6LvvIjnjrDmnInliJfooajooYzkuLrvvInjgIJcbiAgICog5LiOIHBhZ2luYXRpb249ZmFsc2Ug5ZCM5pe255So5pe25Lul5LiN5YiG6aG15Li65YeG44CCXG4gICAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgZnJvbnRQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIOihqOagvOWIhumhteWPguaVsFxuICBASW5wdXQoKSB0YWJsZVBhZ2VJbmRleDogbnVtYmVyID0gMTtcbiAgQElucHV0KCkgdGFibGVQYWdlU2l6ZTogbnVtYmVyID0gMTAwO1xuICBASW5wdXQoKSBpc0ZpcnN0RW50cnlTZWFyY2g6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzQ3Jvc3NQYWdlU2VsZWN0OiBib29sZWFuO1xuICBAT3V0cHV0KCkgdGFibGVQYWdlSW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRhYmxlUGFnZVNpemVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAQ29udGVudENoaWxkKFwidGFibGVUb3RhbFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgdGFibGVUb3RhbDogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChcInRhYmxlTGVmdEJ1dHRvblwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVMZWZ0QnV0dG9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidGFibGVSaWdodEJ1dHRvblwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVSaWdodEJ1dHRvbjogVGVtcGxhdGVSZWY8YW55PjtcbiAgc2Nyb2xsID0gbnVsbDtcblxuICAvLyDooajmoLzli77pgInlj4LmlbBcbiAgaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gIGxpc3RPZkRpc3BsYXlEYXRhID0gW107XG4gIGxpc3RPZkFsbERhdGEgPSBbXTtcbiAgbGlzdE9mU2VsZWN0aW9uOiBBcnJheTxhbnk+IHwgVGVtcGxhdGVSZWY8dm9pZD47XG4gIG1hcE9mQ2hlY2tlZElkOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBtYXBPZkNoZWNrTGlzdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAvLyDlkIjorqHlj4LmlbBcbiAgdGFibGVUb3RhbE9wdGlvbkxpc3QgPSBbXTtcbiAgLy8g57yT5a2Y5L+h5oGvXG4gIHRhYmxlQ2FjaGVPcHRpb246IFRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICB1c2VyU2Vzc2lvbjogYW55O1xuXG4gIHRhYmxlQ29sc0NhY2hlOiBBcnJheTxIZFRhYmxlQ29sdW1uPiA9IFtdO1xuICBzaG93VGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2VsZWN0Q29sTGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgc2VsZWN0Q29sTGlzdE5vZGVzQ2FjaGU6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBzaG93TGlzdE5vZGVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgaXNEcm9wZG93blZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8g6K6+572u5YiX55qE5Y+v6KeB5pON5L2c5pWw57uEXG4gIG5vd0xpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIC8vIOiuvue9ruWIl+eahOS4jeWPr+ingeaTjeS9nOaVsOe7hFxuICBoaWRlTGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcblxuICAvLyDngrnlh7vml7bpnIDopoHmnInkuLTml7bmlbDnu4TlrZjmlL7kuKTkuKp0cmVlLOeUqOS6juWPlua2iOaXtuWAmeaBouWkjeiwg+aVtOWJjeeahOeKtuaAgVxuICBjYW5jZWxOb3dMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBjYW5jZWxIaWRlTGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgc2hvd0RldGFpbDogYm9vbGVhbiA9IGZhbHNlO1xuICBsb2NhbGZvcmFnZTogYW55ID0gbnVsbDtcbiAgbG9jYWx0aW9uVG1wOiBzdHJpbmcgPSBcIlwiO1xuICBpc0ZpcnN0RW50cnlTZWFyY2hMb2NhbDogYm9vbGVhbiA9IHRydWU7XG4gIGlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiog6Ieq5Yqo5rWL6YeP5YmN55qE5YWc5bqV6KGM6auY77yM5rWL6YeP5a6M5oiQ5ZCO5Lya5pu05pawICovXG4gIG1lYXN1cmVkVmlydHVhbEl0ZW1TaXplID0gNDc7XG5cbiAgLyoqIOiusOW9leW9k+WJjeaYr+WQpuWkhOS6juiZmuaLn+a7muWKqOaooeW8j++8jOeUqOS6juWIh+aNoiBwYWdlU2l6ZSDml7bph43lu7rooajmoLwgKi9cbiAgcHJpdmF0ZSB2aXJ0dWFsU2Nyb2xsQWN0aXZlOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIOWIl+WuveWQiOiuoe+8iOWQq+WLvumAiS/luo/lj7cgKyBmbHVpZCDooaXlrr3vvInvvIxmb290ZXIg6KGo5a695LiO5qiq5ZCRIHNjcm9sbCDlhbHnlKggKi9cbiAgdGFibGVDb2xXaWR0aFRvdGFsID0gMDtcblxuICAvKipcbiAgICogZmx1aWTvvJrlo7DmmI7liJfmgLvlrr0gPCDlrrnlmajml7bvvIzmiorlt67pop3ooaXliLDmnIDlkI7kuIDliJfkuJrliqHliJfvvIjkuI3mlLnnvJPlrZjlrr3vvInvvIxcbiAgICog5bm26K6+IHNjcm9sbC54ID0g5a655Zmo5a6977yM6YG/5YWN6KGo5a69IDEwMCUg5Z2H5pGK5pKR5byA5Yu+6YCJ5YiX77yb5ouW5ou95pS55a695LuN5YaZIGNvbC53aWR0aOOAglxuICAgKi9cbiAgZmx1aWRFeHRyYVdpZHRoID0gMDtcblxuICAvKipcbiAgICog5YiX5oC75a695pyq6LaF5Ye65a655Zmo77yIZmx1aWQg6KGl5a695ZCD5ruh77yJ77ya5LiN6ZyA6KaB55yf5q2j5qiq5rua77yMXG4gICAqIOeUqOS6juWFs+aOiSBuZy16b3JybyBmaXhlZC1oZWFkZXIg5bim5p2l55qE5bi46am7IFgg6L205rua5Yqo5p2h44CCXG4gICAqL1xuICBmbHVpZEhvcml6b250YWwgPSBmYWxzZTtcblxuICAvKiogZmx1aWQg6KGl5a6955uu5qCH5YiX57yT5a2Y77yM6YG/5YWN5qih5p2/5q+P5qC8IENEIOaXtuWPjeWkjeaJqyB0YWJsZUNvbHMgKi9cbiAgcHJpdmF0ZSBmbHVpZEV4dHJhVGFyZ2V0Q29sOiBIZFRhYmxlQ29sdW1uID0gbnVsbDtcblxuICAvKiog5pWw5o2u5pu05paw5ZCO5b6F5aSN5L2N57q15ZCR5rua5Yqo5L2N572uICovXG4gIHByaXZhdGUgcGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gZmFsc2U7XG5cbiAgLyoqIOW9k+WJjeaOkuW6j++8jOihqOagvOmHjeW7uuWQjueUqOS6juaBouWkjeihqOWktOaOkuW6j+aAgSAqL1xuICBwcml2YXRlIGN1cnJlbnRTb3J0S2V5OiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRTb3J0VmFsdWU6IHN0cmluZyA9IG51bGw7XG5cbiAgQFZpZXdDaGlsZChcImhkVGFibGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIG56VGFibGVDb21wb25lbnQ6IE56VGFibGVDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSB0b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keTogSFRNTEVsZW1lbnQgPSBudWxsO1xuICBwcml2YXRlIHRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlcjogKCkgPT4gdm9pZCA9IG51bGw7XG4gIHByaXZhdGUgdG90YWxGb290ZXJTeW5jUmV0cnkgPSAwO1xuXG4gIC8qKiDooajkvZPmnInnq5bmu5rmnaHml7blkIjorqEgZm9vdGVyIOaJjemihOeVmeWPs+S+p+a7muWKqOadoeanvSAqL1xuICB0b3RhbEZvb3Rlck5lZWRZR3V0dGVyID0gZmFsc2U7XG5cbiAgLyoqIOinhuWPoy/lrrnlmajlsLrlr7jlj5jljJbml7bph43nrpcgc2Nyb2xsLngg5LiO5ZCI6K6h5a+56b2QICovXG4gIHByaXZhdGUgdmlld3BvcnRSZXNpemVUaW1lcjogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBib3VuZE9uVmlld3BvcnRSZXNpemU6ICgpID0+IHZvaWQgPSBudWxsO1xuICBwcml2YXRlIGhvc3RSZXNpemVPYnNlcnZlcjogYW55ID0gbnVsbDtcblxuICAvKiogc2VsZWN0IOWxleW8gCAvIOaQnOe0oumYsuaKlu+8iOWvuem9kCBmb3JtLWxpbmVz77yJICovXG4gIHByaXZhdGUgc2VsZWN0T3BlbkNoYW5nZVN1YmplY3QgPSBuZXcgU3ViamVjdDx7XG4gICAgZm46IChvcGVuOiBib29sZWFuLCBsaW5lOiBhbnkpID0+IGFueTtcbiAgICBvcGVuOiBib29sZWFuO1xuICAgIGxpbmU6IGFueTtcbiAgICBjb2w6IEhkVGFibGVDb2x1bW47XG4gIH0+KCk7XG4gIHByaXZhdGUgc2VsZWN0T3BlbkNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNlbGVjdFNlYXJjaFN1YmplY3QgPSBuZXcgU3ViamVjdDx7XG4gICAgZm46IChrZXl3b3JkOiBzdHJpbmcsIGxpbmU6IGFueSkgPT4gYW55O1xuICAgIGtleXdvcmQ6IHN0cmluZztcbiAgICBsaW5lOiBhbnk7XG4gICAgY29sOiBIZFRhYmxlQ29sdW1uO1xuICB9PigpO1xuICBwcml2YXRlIHNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICAvKiog5byC5q2l5Zue5YaZIG9wdGlvbnMg55qE6K6i6ZiF77yM6YG/5YWN6L+e54K55pCc57Si5rOE5ryPICovXG4gIHByaXZhdGUgc2VsZWN0TG9hZGVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBob3N0RWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgY29tbW9uU2Vzc2lvblNlcnZpY2U6IENvbW1vblNlc3Npb25TZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmxvY2FsZm9yYWdlID0gbG9jYWxmb3JhZ2UuY3JlYXRlSW5zdGFuY2Uoe1xuICAgICAgZHJpdmVyOiBsb2NhbGZvcmFnZS5JTkRFWEVEREIsXG4gICAgICBuYW1lOiBcImhkLWZzY21cIiwgLy8g6K6+572u5a2Y5YKo5bqT55qE5ZCN56ewXG4gICAgICB2ZXJzaW9uOiAxLjAsIC8vIOiuvue9ruWtmOWCqOW6k+eahOeJiOacrFxuICAgICAgc3RvcmVOYW1lOiBcImhkLWZzY20tc3RvcmVcIiwgLy8g6K6+572u5a2Y5YKo5bqT55qE5a2Y5YKo56m66Ze05ZCN56ewXG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpO1xuICAgIHRoaXMudW5iaW5kVmlld3BvcnRSZXNpemVTeW5jKCk7XG4gICAgaWYgKHRoaXMuc2VsZWN0T3BlbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RTZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0TG9hZGVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdExvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiDkvpvkuJrliqHlnKjoh6rooYzlhpnlm54gb3B0aW9ucyDlkI7op6blj5EgT25QdXNoIOWIt+aWsO+8iOS8mOWFiCByZXR1cm4gT2JzZXJ2YWJsZS9Qcm9taXNlIOeUsee7hOS7tuWkhOeQhu+8iSAqL1xuICBtYXJrRm9yQ2hlY2soKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0RW50cnlTZWFyY2ggPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmlzRmlyc3RFbnRyeVNlYXJjaExvY2FsID0gdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2g7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWwgPSB0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0O1xuICAgIH1cbiAgICB0aGlzLmxvY2FsdGlvblRtcCA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0aGlzLmxvY2FsdGlvblRtcCkge1xuICAgICAgdGhpcy5sb2NhbHRpb25UbXAgPSB0aGlzLmxvY2FsdGlvblRtcC5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xuICAgIH1cbiAgICB0aGlzLnVzZXJTZXNzaW9uID0gdGhpcy5jb21tb25TZXNzaW9uU2VydmljZS5nZXRTZXNzaW9uKFxuICAgICAgXCJfX2p5X2F1dGhvcml6YXRpb25fc2Vzc2lvbl9fXCIsXG4gICAgKTtcbiAgICAvLyDnlKjkuo7lvIDlj5Hnjq/looPosIPor5VcbiAgICBpZiAoIXRoaXMudXNlclNlc3Npb24pIHtcbiAgICAgIHRoaXMudXNlclNlc3Npb24gPSB7XG4gICAgICAgIHVzZXJDb2RlOiBcImRldlwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRWaWV3cG9ydFJlc2l6ZVN5bmMoKTtcbiAgICB0aGlzLmRlbGV0ZUhpZGVJdGVtKCk7XG4gICAgaWYgKCF0aGlzLnRhYmxlQ29scyB8fCB0aGlzLnRhYmxlQ29scy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvY2FsZm9yYWdlXG4gICAgICAucmVhZHkoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmdldEluaXRMb2NhbGZvcmFnZSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4c3RlcDFcIiwgZSk7XG4gICAgICAgIHRocm93IFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhcIjtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlKSB7XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcInNlbGVjdFR5cGVcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJzZWxlY3RUeXBlXCJdW1wicHJldmlvdXNWYWx1ZVwiXSAhPSBudWxsICYmXG4gICAgICBjaGFuZ2VzW1wic2VsZWN0VHlwZVwiXVtcImN1cnJlbnRWYWx1ZVwiXSAhPT1cbiAgICAgICAgY2hhbmdlc1tcInNlbGVjdFR5cGVcIl1bXCJwcmV2aW91c1ZhbHVlXCJdXG4gICAgKSB7XG4gICAgICB0aGlzLnJlc2V0U3RhdHVzKCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZVRvdGFsT3B0aW9uXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wic2hvd1RhYmxlVG90YWxcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJjb2x1bW5zTnVtYmVyXCJdIHx8XG4gICAgICBjaGFuZ2VzW1widGFibGVDb2xzXCJdXG4gICAgKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRhYmxlVG90YWwoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdW1wicGFnZVNpemVcIl0gIT09XG4gICAgICAgICAgY2hhbmdlc1tcInRhYmxlRGF0YVwiXVtcInByZXZpb3VzVmFsdWVcIl1bXCJwYWdlU2l6ZVwiXSB8fFxuICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdW1wicGFnZU51bWJlclwiXSAhPT1cbiAgICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVtcInBhZ2VOdW1iZXJcIl1cbiAgICAgICkge1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXNldFNjcm9sbFRvcCA9IHRydWU7XG4gICAgICAgIC8vIHBhZ2VTaXplL3BhZ2VOdW1iZXIg5Y+Y5YyW5Lmf6KaB6YeN566XIHNjcm9sbCAvIGZsdWlk44CCXG4gICAgICAgIC8vIOS4muWKoeW4uOaKiiBQYWdlLnBhZ2VTaXplIOWGmeaIkCBjb250ZW50Lmxlbmd0aO+8iOWmguaUtuasvue8lui+kSB0b1BhZ2XvvInvvIxcbiAgICAgICAgLy8gdmlydHVhbFNjcm9sbD1mYWxzZSDml7boi6Xov5nph4zot7Pov4fvvIznqbrooajliJ3lp4vljJblkI7nmoQgZmx1aWQg5LiN5Lya6KGl5LiK77yM5Yu+6YCJ5YiX6KKr5pKR5byA44CCXG4gICAgICAgIC8vIGFwcGx5VGFibGVTY3JvbGxNb2RlKGZhbHNlKSDlnKjmqKHlvI/mnKrlj5jml7blj6ogZGVhbFNjcm9sbO+8jOS4jeS8muW8uuWItumHjeW7uua4heaOkuW6j+aAgeOAglxuICAgICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKGZhbHNlKTtcbiAgICAgICAgLy8g57+76aG1L+aUuSBwYWdlU2l6Ze+8muS4u+WKqOWkmuasoeWkjeS9je+8jOimhuebliBDREsg5byC5q2l5riy5p+T5pe25bqPXG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbCkge1xuICAgICAgICB0aGlzLnJlc2V0U3RhdHVzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0pIHtcbiAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgIC8vIOS4jeiuuuaYr+WQpuiZmuaLn+a7muWKqOmDveimgemHjeeulyBzY3JvbGwgLyBmbHVpZOOAglxuICAgICAgLy8g5pS25qy+L+S7mOasvue8lui+keetiemhtSBbdmlydHVhbFNjcm9sbF09ZmFsc2UgKyDlvILmraXngYzmlbDmja7vvJrljp/lhYjot7Pov4fkvJrlr7zoh7RcbiAgICAgIC8vIOepuuihqOWIneWni+WMluWQjuS4jeWGjeihpeWuve+8jOWLvumAieWIl+iiq+Wdh+aRiuaSkeW8gOOAglxuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICAvLyDmlbDmja7mm7TmlrDlkI7lpI3kvY3nurXlkJHmu5rliqjvvIjlkKvomZrmi5/mu5rliqjlnLrmma/vvIlcbiAgICAgIHRoaXMuc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0gJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0uY3VycmVudFZhbHVlKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5wcmV2aW91c1ZhbHVlKSAmJlxuICAgICAgY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5wcmV2aW91c1ZhbHVlICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuZGVsZXRlSGlkZUl0ZW0oKTtcbiAgICAgIGlmICghdGhpcy50YWJsZUNvbHMgfHwgdGhpcy50YWJsZUNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgICAgLnJlYWR5KClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZ2V0SW5pdExvY2FsZm9yYWdlKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhzdGVwMlwiLCBlKTtcbiAgICAgICAgICB0aHJvdyBcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4XCI7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChjaGFuZ2VzW1wicGFnaW5hdGlvblwiXSAmJiAhY2hhbmdlc1tcInBhZ2luYXRpb25cIl0uZmlyc3RDaGFuZ2UpIHx8XG4gICAgICAoY2hhbmdlc1tcImZyb250UGFnaW5hdGlvblwiXSAmJiAhY2hhbmdlc1tcImZyb250UGFnaW5hdGlvblwiXS5maXJzdENoYW5nZSlcbiAgICApIHtcbiAgICAgIC8vIOWIhumhteaooeW8j+WIh+aNoumcgOmHjeW7uiBuei10YWJsZe+8iGZyb250IC8gc2VydmVyIC8gbm9uZe+8iVxuICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleCA9IDE7XG4gICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKHRydWUpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOaYr+WQpui1sOWJjeerr+WIhumhte+8iOWvuSBjb250ZW50IOWIh+eJh++8jOS4jeivt+axguWQjuerr++8iSAqL1xuICBnZXQgdXNlRnJvbnRQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMucGFnaW5hdGlvbiAmJiAhIXRoaXMuZnJvbnRQYWdpbmF0aW9uO1xuICB9XG5cbiAgZGVsZXRlSGlkZUl0ZW0oKSB7XG4gICAgLy8g6aaW5YWI5oqKaXNTaG935Li6ZmFsc2XmlbDmja7liZTpmaTmjolcbiAgICB0aGlzLnRhYmxlQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgLy8g5aaC5p6c5a+56LGh5rKh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnpu5jorqTkuLogdHJ1Ze+8jOS/neeVmeivpeWvueixoVxuICAgICAgaWYgKCFpdGVtLmhhc093blByb3BlcnR5KFwiaXNTaG93XCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8g5aaC5p6c5a+56LGh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnmo4Dmn6XlhbblgLzmmK/lkKbkuLogdHJ1ZVxuICAgICAgcmV0dXJuIGl0ZW0uaXNTaG93ID09PSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgc29ydChzb3J0OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmN1cnJlbnRTb3J0S2V5ID0gc29ydCAmJiBzb3J0LmtleTtcbiAgICB0aGlzLmN1cnJlbnRTb3J0VmFsdWUgPSBzb3J0ICYmIHNvcnQudmFsdWU7XG4gICAgdGhpcy5zb3J0RXZlbnQuZW1pdChzb3J0KTtcbiAgfVxuXG4gIGdldENvbFNvcnQoY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5jYW5Tb3J0IHx8ICF0aGlzLmN1cnJlbnRTb3J0S2V5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5uYW1lID09PSB0aGlzLmN1cnJlbnRTb3J0S2V5ID8gdGhpcy5jdXJyZW50U29ydFZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIHRvZ2dsZVNob3dEZXRhaWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RGV0YWlsID0gIXRoaXMuc2hvd0RldGFpbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQodHJ1ZSk7XG4gIH1cblxuICBnZXQgZWZmZWN0aXZlVmlydHVhbEl0ZW1TaXplKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudmlydHVhbEl0ZW1TaXplICE9IG51bGwgJiYgdGhpcy52aXJ0dWFsSXRlbVNpemUgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXJ0dWFsSXRlbVNpemU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIOe6teWQkeWPr+eUqOmrmOW6puaJo+WHj++8muaMiemSruWMui/lkIjorqEv5YiG6aG1562J5Zu65a6a5Y2g5L2N44CCXG4gICAqIOW/hemhu+S4jiBkZWFsU2Nyb2xsIC8gcHJlc2V0U2Nyb2xsQmVmb3JlUmVtb3VudCDkvb/nlKjlkIzkuIDlpZfvvIzlkKbliJnkvJror6/liKTjgIzog73mlL7kuIvjgI3ogIzkuI3orr4gc2Nyb2xsLnnjgIJcbiAgICovXG4gIHByaXZhdGUgZ2V0U2Nyb2xsWU1heE9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy50YWJsZVRvdGFsID8gMTgwIDogMTQwKSArIDIxNjtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvZPliY3op4blj6Plrp7pmYXlsZXnpLrnmoTooYzmlbDjgIJcbiAgICog5YmN56uv5YiG6aG15oyJIHBhZ2VJbmRleC9wYWdlU2l6ZSDliIfniYfkvLDnrpfvvIzpgb/lhY3nlKjlhajph48gbGVuZ3RoIOivr+WIpOmcgOimgee6teWQkea7muWKqOOAglxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWaXNpYmxlUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50IDogW107XG4gICAgY29uc3QgdG90YWwgPSBjb250ZW50Lmxlbmd0aDtcbiAgICBpZiAoIXRoaXMudXNlRnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICByZXR1cm4gdG90YWw7XG4gICAgfVxuICAgIGlmICh0b3RhbCA8PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgcGFnZVNpemUgPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgOiAxMDtcbiAgICBjb25zdCBwYWdlSW5kZXggPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA6IDE7XG4gICAgY29uc3Qgc3RhcnQgPSAocGFnZUluZGV4IC0gMSkgKiBwYWdlU2l6ZTtcbiAgICBpZiAoc3RhcnQgPj0gdG90YWwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4ocGFnZVNpemUsIHRvdGFsIC0gc3RhcnQpO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteWGheWuuemrmOW6puaYr+WQpui2heWHuuinhuWPo++8iOmcgOimgeihqOWGhee6teWQkea7muWKqO+8iSAqL1xuICBnZXQgbmVlZHNWZXJ0aWNhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICBjb25zdCByb3dDb3VudCA9IHRoaXMuZ2V0VmlzaWJsZVJvd0NvdW50KCk7XG4gICAgaWYgKHJvd0NvdW50IDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgZXN0aW1hdGVkSGVpZ2h0ID0gcm93Q291bnQgKiB0aGlzLmVmZmVjdGl2ZVZpcnR1YWxJdGVtU2l6ZTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIGVzdGltYXRlZEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCAtIG1heE9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHJvd0NvdW50ID4gMTAwO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteaVsOaNruiDveWujOaVtOWxleekuuaXtuS4jeWQr+eUqOiZmuaLn+a7muWKqO+8jOmBv+WFjeWwkemHj+aVsOaNruS5n+WHuueOsOa7muWKqOadoSAqL1xuICBnZXQgdXNlVmlydHVhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZWVkc1ZlcnRpY2FsU2Nyb2xsO1xuICB9XG5cbiAgZ2V0UmlnaHRTdGlja3koY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGNvbC5maXhlZCA9PT0gXCJyaWdodFwiID8gYCR7Y29sLmZpeGVkUmlnaHRXaWR0aCB8fCAwfXB4YCA6IG51bGw7XG4gIH1cblxuICBnZXRMZWZ0U3RpY2t5KGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBjb2wuZml4ZWQgPT09IFwibGVmdFwiID8gYCR7Y29sLmZpeGVkV2lkdGggfHwgMH1weGAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOW6j+WPt+WIl+WbuuWumuWuve+8iOWQqyBwYWRkaW5n77yM5Y+v5a6557qzIDYg5L2N5aaCIDE5OTk5Ne+8ieOAglxuICAgKiDkuI3plIHmrbvml7booajkvZPkvJrpmo/kvY3mlbDlj5jlrr3vvIgx4oaSfjY0cHjvvIwxOTk5OTXihpJ+NjdweO+8ie+8jOWQiOiuoeihjOWvueS4jem9kOOAglxuICAgKi9cbiAgcmVhZG9ubHkgbGluZU51bWJlckNvbFdpZHRoID0gNzI7XG5cbiAgLyoqIOW8gOWQr+WQiOiuoeaXtuW6j+WPt+WIl+eahCBsZWZ077yI5Yu+6YCJ5YiX5Y2gIDQwcHjvvIkgKi9cbiAgZ2V0IGxpbmVOdW1iZXJMZWZ0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1NlbGVjdGVkID8gXCI0MHB4XCIgOiBcIjBweFwiO1xuICB9XG5cbiAgZ2V0IGxpbmVOdW1iZXJDb2xXaWR0aFB4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGluZU51bWJlckNvbFdpZHRoICsgXCJweFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOaXoCBzY3JvbGwueCDml7blkIjorqHotbAgZmx1aWTvvIh3aWR0aDoxMDAl77yJ44CCXG4gICAqIOWIl+WwkeaXtuS5n+S8muiuviBzY3JvbGwueO+8iOihpeWuveWQg+a7oe+8ie+8jOWQiOiuoei1sOWbuuWumuihqOWuveOAglxuICAgKi9cbiAgZ2V0IGlzVG90YWxGb290ZXJGbHVpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC54KTtcbiAgfVxuXG4gIC8qKiDlsZXnpLrnlKjliJflrr3vvJpmbHVpZCDml7bmnIDlkI7kuIDliJfkuJrliqHliJcgPSDlo7DmmI7lrr0gKyBmbHVpZEV4dHJhV2lkdGggKi9cbiAgZ2V0Q29sRGlzcGxheVdpZHRoKGNvbDogSGRUYWJsZUNvbHVtbik6IG51bWJlciB7XG4gICAgY29uc3QgYmFzZSA9XG4gICAgICBjb2wgJiYgY29sLndpZHRoICE9IG51bGwgJiYgY29sLndpZHRoID4gMFxuICAgICAgICA/IGNvbC53aWR0aFxuICAgICAgICA6IENvbFdpZHRoLmZpeENvbFdpZHRoO1xuICAgIGlmIChcbiAgICAgIHRoaXMuZmx1aWRFeHRyYVdpZHRoIDw9IDAgfHxcbiAgICAgICFjb2wgfHxcbiAgICAgICF0aGlzLmZsdWlkRXh0cmFUYXJnZXRDb2wgfHxcbiAgICAgIGNvbCAhPT0gdGhpcy5mbHVpZEV4dHJhVGFyZ2V0Q29sXG4gICAgKSB7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2UgKyB0aGlzLmZsdWlkRXh0cmFXaWR0aDtcbiAgfVxuXG4gIC8qKiDmjInlvZPliY0gbGF5b3V0IOWIt+aWsCBmbHVpZCDooaXlrr3nm67moIfliJfvvIjku4UgZGVhbFNjcm9sbCAvIHN5bmMg5pe26LCD55So77yJICovXG4gIHByaXZhdGUgcmVmcmVzaEZsdWlkRXh0cmFUYXJnZXRDb2woKTogdm9pZCB7XG4gICAgdGhpcy5mbHVpZEV4dHJhVGFyZ2V0Q29sID0gbnVsbDtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZsdWlkRXh0cmFXaWR0aCA8PSAwIHx8XG4gICAgICAhdGhpcy50YWJsZUNvbHMgfHxcbiAgICAgICF0aGlzLnRhYmxlQ29scy5sZW5ndGhcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHRoaXMudGFibGVDb2xzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy50YWJsZUNvbHNbaV07XG4gICAgICBpZiAoYyAmJiBjLmlzU2hvdyAmJiBjLmZpeGVkICE9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgdGhpcy5mbHVpZEV4dHJhVGFyZ2V0Q29sID0gYztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gdGhpcy50YWJsZUNvbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLnRhYmxlQ29sc1tpXTtcbiAgICAgIGlmIChjICYmIGMuaXNTaG93KSB7XG4gICAgICAgIHRoaXMuZmx1aWRFeHRyYVRhcmdldENvbCA9IGM7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogZmx1aWQg4oaSIDEwMCXvvJvlm7rlrpog4oaSIHNjcm9sbC5477yI5LiO6KGo5L2T5ZCM5LiA5aWX5qiq5ZCR5a695bqm77yJICovXG4gIGdldCB0b3RhbEZvb3RlclRhYmxlV2lkdGgoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc1RvdGFsRm9vdGVyRmx1aWQpIHtcbiAgICAgIHJldHVybiBcIjEwMCVcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnhcbiAgICAgID8gU3RyaW5nKHRoaXMuc2Nyb2xsLngpXG4gICAgICA6IHRoaXMudGFibGVDb2xXaWR0aFRvdGFsID4gMFxuICAgICAgICA/IHRoaXMudGFibGVDb2xXaWR0aFRvdGFsICsgXCJweFwiXG4gICAgICAgIDogXCIxMDAlXCI7XG4gIH1cblxuICAvKiog5b2T5YmN6aG16KGM5Y+377yI6Leo6aG16L+e57ut77yM5LuOIDEg5byA5aeL77yJICovXG4gIGdldExpbmVOdW1iZXIoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGFnZSA9XG4gICAgICBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpIDogMTtcbiAgICBjb25zdCBzaXplID1cbiAgICAgIE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpIDogMDtcbiAgICBjb25zdCByb3dJbmRleCA9IE51bWJlcihpbmRleCkgPj0gMCA/IE51bWJlcihpbmRleCkgOiAwO1xuICAgIHJldHVybiAocGFnZSAtIDEpICogc2l6ZSArIHJvd0luZGV4ICsgMTtcbiAgfVxuXG4gIHRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlciwgZGF0YTogYW55KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBrZXkgPSBkYXRhICYmIGRhdGFbdGhpcy5zZWxlY3RGaWVsZF07XG4gICAgcmV0dXJuIGtleSAhPSBudWxsID8gU3RyaW5nKGtleSkgOiBgcm93LSR7aW5kZXh9YDtcbiAgfTtcblxuICAvKiog6Jma5ouf5rua5Yqo5oyJ5pWw57uE5LiL5qCH6L+96Liq77yM6YG/5YWN5Lia5Yqh5Li76ZSuIHRyYWNrQnkg5a+86Ie0IENESyDooYzlpI3nlKjplJnkvY0gKi9cbiAgdmlydHVhbFRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICB0cmFja0J5Q29sID0gKF9pbmRleDogbnVtYmVyLCBjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBjb2wudGl0bGU7XG4gIH07XG5cbiAgZ2V0SW5pdExvY2FsZm9yYWdlKCkge1xuICAgIC8vIOmmluWFiOiOt+WPluW9k+WJjWhkLXRhYmxl5a2Y5YKo55qE5pWw5o2uIOWmguaenOayoeacie+8jOWImeWIneWni+WMluS4i+W9k+WJjeeahOaVsOaNrlxuICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgIC5nZXRJdGVtKFxuICAgICAgICBcImhkLXRhYmxlX1wiICtcbiAgICAgICAgICB0aGlzLnVzZXJTZXNzaW9uLnVzZXJDb2RlICtcbiAgICAgICAgICBcIl9cIiArXG4gICAgICAgICAgdGhpcy5sb2NhbHRpb25UbXAgK1xuICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICB0aGlzLnV1aWQsXG4gICAgICApXG4gICAgICAudGhlbigodmFsdWU6IFRhYmxlQ2FjaGVPcHRpb24pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5ub3JtYWxpemVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uICYmXG4gICAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgJiZcbiAgICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemUgPSB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemU7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA9IHRoaXMudGFibGVQYWdlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyDmnI3liqHnq6/liIbpobXmiY3lnKjliJ3lp4vljJbml7bmipsgcGFnZVNpemVDaGFuZ2VFdmVudCDop6blj5HniLbmn6Xor6LvvJvliY3nq6/liIbpobXkuI3miptcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMucGFnaW5hdGlvbiAmJlxuICAgICAgICAgICF0aGlzLmZyb250UGFnaW5hdGlvbiAmJlxuICAgICAgICAgIHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gbmV3IFRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgICAgICB0aGlzLmluaXRUYWJsZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBpbml0VGFibGUoKSB7XG4gICAgdGhpcy5zaG93VGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMudXVpZCkge1xuICAgICAgdGhyb3cgXCJoZC10YWJsZee8uuWksXV1aWTlj4LmlbDvvIzor7fkvb/nlKjnvJbovpHlmajmj5Lku7bnlJ/miJDlubbnu5loZC10YWJsZei1i+S6iHV1aWTlsZ7mgKdcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuanVkZ2VSZXBlYXRDb2xzKCkpIHtcbiAgICAgIHRoaXMuZGVhbENvbHMoKTtcbiAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgdGhpcy5kZWFsT3BlcmF0ZUJ0bigpO1xuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlID0gbnVsbDtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOiZmuaLny/mma7pgJrmqKHlvI/liIfmjaLml7bph43lu7rooajmoLzvvIzpgb/lhY3mrovnlZnmu5rliqjlrrnlmaggKi9cbiAgYXBwbHlUYWJsZVNjcm9sbE1vZGUoZm9yY2VSZW1vdW50ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCB1c2VWaXJ0dWFsID0gdGhpcy51c2VWaXJ0dWFsU2Nyb2xsO1xuICAgIGNvbnN0IG1vZGVDaGFuZ2VkID1cbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlICE9PSB1c2VWaXJ0dWFsO1xuICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSA9IHVzZVZpcnR1YWw7XG5cbiAgICBpZiAoZm9yY2VSZW1vdW50IHx8IG1vZGVDaGFuZ2VkKSB7XG4gICAgICAvLyDlv4XpobvlhYjlhpnlpb0gc2Nyb2xsLnnvvIzlho3liJvlu7ogbnotdGFibGXjgIJcbiAgICAgIC8vIG5nLXpvcnJvIOWPquWcqCBBZnRlclZpZXdJbml0IOe7keS4gOasoSBoZWFkZXIvYm9keSDnmoQgc2Nyb2xsIOWQjOatpe+8m1xuICAgICAgLy8g6Iul5YWI5LulIHk9bnVsbCDliJvlu7rlho3mlLnmiJDmnIkgee+8jOihqOWktOebkeWQrOS8muS4ou+8jOihqOeOsOS4uuWIl+WktOS4jei3n+edgOaoqua7muOAglxuICAgICAgdGhpcy5wcmVzZXRTY3JvbGxCZWZvcmVSZW1vdW50KHVzZVZpcnR1YWwpO1xuICAgICAgdGhpcy5zaG93VGFibGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd1RhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHRoaXMuYWZ0ZXJUYWJsZVJlbmRlcih1c2VWaXJ0dWFsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2SGFzWCA9ICEhKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLngpO1xuICAgIGNvbnN0IHByZXZIYXNZID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueSk7XG4gICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgY29uc3QgbmV4dEhhc1ggPSAhISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC54KTtcbiAgICBjb25zdCBuZXh0SGFzWSA9ICEhKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnkpO1xuICAgIC8vIOi/kOihjOS4rSB4L3kg5LuO5pyJ5Y+Y5pegL+S7juaXoOWPmOacieaXtu+8jOS5n+W/hemhu+mHjeW7uu+8mlxuICAgIC8vIC0gee+8mm5nLXpvcnJvIOWPquWcqCBBZnRlclZpZXdJbml0IOe7keS4gOasoSBoZWFkZXIvYm9keSDlkIzmraVcbiAgICAvLyAtIHjvvJrnqbrooaggc2Nyb2xsLng9bnVsbO+8iHRhYmxlLWxheW91dDphdXRv77yJ4oaSIOacieaVsOaNruWQjuiuviBzY3JvbGwueO+8iGZpeGVk77yJ77yMXG4gICAgLy8gICDkuI3ph43lu7rml7bli77pgInliJfku43mjIkgYXV0byDlnYfmkYrmkpHlvIDvvIjmlLbmrL7nvJbovpHnrYnlvILmraXngYzmlbDpobXvvIlcbiAgICBpZiAocHJldkhhc1kgIT09IG5leHRIYXNZIHx8IHByZXZIYXNYICE9PSBuZXh0SGFzWCkge1xuICAgICAgdGhpcy5zaG93VGFibGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd1RhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHRoaXMuYWZ0ZXJUYWJsZVJlbmRlcih1c2VWaXJ0dWFsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmFmdGVyVGFibGVSZW5kZXIodXNlVmlydHVhbCk7XG4gIH1cblxuICAvKiog6YeN5bu65YmN6aKE6K6+IHNjcm9sbO+8jOS/neivgSBBZnRlclZpZXdJbml0IOaXtiBoZWFkZXIvYm9keSDnu5PmnoTlt7LmraPnoa4gKi9cbiAgcHJpdmF0ZSBwcmVzZXRTY3JvbGxCZWZvcmVSZW1vdW50KHVzZVZpcnR1YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBtYXhPZmZzZXQgPSB0aGlzLmdldFNjcm9sbFlNYXhPZmZzZXQoKTtcbiAgICBjb25zdCB4ID0gdGhpcy5zY3JvbGwgPyB0aGlzLnNjcm9sbC54IDogbnVsbDtcbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsICYmICF1c2VWaXJ0dWFsKSB7XG4gICAgICB0aGlzLnNjcm9sbCA9IHsgeCwgeTogbnVsbCB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjcm9sbCA9IHtcbiAgICAgIHgsXG4gICAgICB5OiBgY2FsYygxMDB2aCAtICR7bWF4T2Zmc2V0fXB4KWAsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYWZ0ZXJUYWJsZVJlbmRlcih1c2VWaXJ0dWFsOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHVzZVZpcnR1YWwpIHtcbiAgICAgIHRoaXMucmVmcmVzaFZpcnR1YWxTY3JvbGxWaWV3cG9ydCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgdGhpcy5tZWFzdXJlVmlydHVhbEl0ZW1TaXplKHRydWUpO1xuICAgICAgLy8g5a6e5rWL6KGM6auY5ZCO5Y+v6IO95LuO44CM6IO95pS+5LiL44CN5Y+Y5Li644CM6LaF5Ye644CN77yM6ZyA5YiH5o2i5rua5Yqo5qih5byPXG4gICAgICBpZiAodGhpcy51c2VWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgfSk7XG4gIH1cblxuICByZWZyZXNoVmlydHVhbFNjcm9sbFZpZXdwb3J0KGZvcmNlTWVhc3VyZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnVzZVZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIGlmIChmb3JjZU1lYXN1cmUpIHtcbiAgICAgICAgdGhpcy5tZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlTWVhc3VyZSk7XG4gICAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0ID1cbiAgICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50ICYmIHRoaXMubnpUYWJsZUNvbXBvbmVudC5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gICAgICBpZiAoIXZpZXdwb3J0KSB7XG4gICAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lYXN1cmVkID0gdGhpcy5tZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlTWVhc3VyZSk7XG4gICAgICBpZiAobWVhc3VyZWQpIHtcbiAgICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB2aWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2VNZWFzdXJlKTtcbiAgICAgICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICAgICAgdmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIOaVsOaNruWIt+aWsOWQjuWwhuihqOS9k+e6teWQkea7muWKqOWkjeS9jeWIsOmhtumDqCAqL1xuICBwcml2YXRlIHJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uelRhYmxlQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG56VGFibGUgPSB0aGlzLm56VGFibGVDb21wb25lbnQgYXMgYW55O1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5uelRhYmxlQ29tcG9uZW50LmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICBpZiAodmlld3BvcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgKHZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9PZmZzZXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAodmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb09mZnNldCgwKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgKHZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9JbmRleCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICh2aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICB9XG4gICAgICBjb25zdCB2aWV3cG9ydEVsID1cbiAgICAgICAgdmlld3BvcnQuZWxlbWVudFJlZiAmJlxuICAgICAgICAodmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgIHZpZXdwb3J0RWwuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYm9keUNhbmRpZGF0ZXMgPSBbXG4gICAgICBuelRhYmxlLm1peFRhYmxlQm9keU5hdGl2ZUVsZW1lbnQsXG4gICAgICBuelRhYmxlLnRhYmxlQm9keU5hdGl2ZUVsZW1lbnQsXG4gICAgICBuelRhYmxlLnRhYmxlQm9keUVsZW1lbnQgJiYgbnpUYWJsZS50YWJsZUJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgXTtcbiAgICBib2R5Q2FuZGlkYXRlcy5mb3JFYWNoKChlbDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHRhYmxlTWFpbiA9XG4gICAgICBuelRhYmxlLnRhYmxlTWFpbkVsZW1lbnQgJiZcbiAgICAgIChuelRhYmxlLnRhYmxlTWFpbkVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgaWYgKCF0YWJsZU1haW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZXMgPSB0YWJsZU1haW4ucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiLmFudC10YWJsZS1ib2R5LCBjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcIixcbiAgICApO1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobm9kZXMsIChlbDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGVsLnNjcm9sbFRvcCA9IDA7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5pWw5o2u5pu05paw5ZCO5aSa5qyh5bCd6K+V5aSN5L2N44CCXG4gICAqIG5nLXpvcnJvIDggKyBDREsg6Jma5ouf5rua5Yqo5Lya5Zyo5pWw5o2u5Yi35paw5ZCO5byC5q2l5pS55YaZIHNjcm9sbFRvcO+8jOWNleasoeWkjeS9jee7j+W4uOiiq+imhuebluOAglxuICAgKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk6IHZvaWQge1xuICAgIC8vIOWkmuasoeWwneivle+8muimhuebliBuei10YWJsZSAvIENESyDomZrmi5/mu5rliqjlvILmraXmlLnlhpkgc2Nyb2xsVG9wXG4gICAgY29uc3QgZGVsYXlzID0gWzAsIDUwLCAxMDBdO1xuICAgIGRlbGF5cy5mb3JFYWNoKChtcywgaW5kZXgpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gZGVsYXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdSZXNldFNjcm9sbFRvcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LCBtcyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBlbmRpbmdSZXNldFNjcm9sbFRvcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gIH1cblxuICAvKiog5pyq5omL5Yqo5LygIHZpcnR1YWxJdGVtU2l6ZSDml7bvvIzku47lt7LmuLLmn5PooYzmtYvph4/nnJ/lrp7pq5jluqYgKi9cbiAgbWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZSA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMudmlydHVhbEl0ZW1TaXplICE9IG51bGwgJiYgdGhpcy52aXJ0dWFsSXRlbVNpemUgPiAwICYmICFmb3JjZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2aWV3cG9ydCA9XG4gICAgICB0aGlzLm56VGFibGVDb21wb25lbnQgJiYgdGhpcy5uelRhYmxlQ29tcG9uZW50LmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICBjb25zdCB0YWJsZUJvZHkgPVxuICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50ICYmXG4gICAgICAodGhpcy5uelRhYmxlQ29tcG9uZW50LnRhYmxlQm9keU5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIGNvbnN0IHJvdyA9XG4gICAgICAodmlld3BvcnQgJiZcbiAgICAgICAgKCh2aWV3cG9ydC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgXCJ0ci5oZC10YWJsZS12aXJ0dWFsLXJvd1wiLFxuICAgICAgICApIGFzIEhUTUxFbGVtZW50KSkgfHxcbiAgICAgICh0YWJsZUJvZHkgJiYgKHRhYmxlQm9keS5xdWVyeVNlbGVjdG9yKFwidGJvZHkgdHJcIikgYXMgSFRNTEVsZW1lbnQpKTtcbiAgICBpZiAoIXJvdyB8fCByb3cub2Zmc2V0SGVpZ2h0IDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaGVpZ2h0ID0gcm93Lm9mZnNldEhlaWdodDtcbiAgICBpZiAoaGVpZ2h0ID09PSB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMubWVhc3VyZWRWaXJ0dWFsSXRlbVNpemUgPSBoZWlnaHQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyDorr7nva7liJfngrnlh7vlj5bmtohcbiAgY2FuY2VsRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jYW5jZWxIaWRlTGlzdE5vZGVzKSk7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2FuY2VsTm93TGlzdE5vZGVzKSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyDngrnlh7vop6blj5Horr7nva7liJdcbiAgY29uZmlybURyb3Bkb3duKCk6IHZvaWQge1xuICAgIC8vIOS4tOaXtuWtmOaUvuS4i++8jOWPlua2iOeahOaXtuWAmeaBouWkjeWOn+adpeeahOeKtuaAgSAgIOa3seaLt+i0neS4i+WvueixoeaVsOe7hFxuICAgIHRoaXMuY2FuY2VsSGlkZUxpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5oaWRlTGlzdE5vZGVzKSk7XG4gICAgdGhpcy5jYW5jZWxOb3dMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMubm93TGlzdE5vZGVzKSk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzdWJtaXRHcmlkcygpIHtcbiAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scyA9IFtdO1xuICAgIHRoaXMubm93TGlzdE5vZGVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLnB1c2goaXRlbS50aXRsZSk7XG4gICAgfSk7XG4gICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g5LuO57yT5a2Y6K6+572u5YiXXG4gIHNldENvbHMoKSB7XG4gICAgdGhpcy5zaG93TGlzdE5vZGVzID0gZmFsc2U7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSBbXTtcbiAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSBbXTtcbiAgICBpZiAodGhpcy5oYXNDb2xzQ2FjaGUoKSkge1xuICAgICAgbGV0IHsgbm90SW5jb2xzLCBpbmNvbHMgfSA9IHRoaXMudGFibGVDb2xzQ2FjaGUucmVkdWNlKFxuICAgICAgICAoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGl0ZW0udGl0bGUpKSB7XG4gICAgICAgICAgICBhY2MuaW5jb2xzLnB1c2goaXRlbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5ub3RJbmNvbHMucHVzaChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgeyBub3RJbmNvbHM6IFtdLCBpbmNvbHM6IFtdIH0sXG4gICAgICApO1xuICAgICAgaW5jb2xzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmRleE9mKGEudGl0bGUpIC1cbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmRleE9mKGIudGl0bGUpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudGFibGVDb2xzID0gaW5jb2xzLmNvbmNhdChub3RJbmNvbHMpO1xuICAgIH1cblxuICAgIHRoaXMudGFibGVDb2xzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNDb2xzQ2FjaGUoKSkge1xuICAgICAgICBlbGVtZW50LmlzU2hvdyA9IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQudGl0bGUpXG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNTaG93KSB7XG4gICAgICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGtleTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LmZpeGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgLy8gc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhlbGVtZW50LnRpdGxlKVxuICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGtleTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LmZpeGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgLy8gc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhlbGVtZW50LnRpdGxlKVxuICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5pc1Nob3cgPSB0cnVlO1xuICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICBrZXk6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgY2hlY2tlZDogdHJ1ZSxcbiAgICAgICAgICAvLyBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICBkaXNhYmxlZDogZWxlbWVudC5maXhlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDosIPmlbTliJflrr3kuLrnvJPlrZjlrr3luqZcbiAgICBpZiAoXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuc2l6ZSAhPT0gMFxuICAgICkge1xuICAgICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLmhhcyhjb2wudGl0bGUpKSB7XG4gICAgICAgICAgY29sLndpZHRoID0gdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5nZXQoY29sLnRpdGxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWFsQ29scygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93TGlzdE5vZGVzID0gdHJ1ZTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIOaLluaLveaTjeS9nFxuICBiZWZvcmVEcm9wID0gKGFyZzogTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQpOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAoXG4gICAgICBhcmcubm9kZS5vcmlnaW4uZGlzYWJsZWQgfHxcbiAgICAgICFhcmcuZHJhZ05vZGUub3JpZ2luLmNoZWNrZWQgfHxcbiAgICAgIGFyZy5wb3MgPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBub2RlOiBUcmVlR3JpZCA9IG5ldyBUcmVlR3JpZCgpO1xuICAgICAgbm9kZS5jaGVja2VkID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5jaGVja2VkO1xuICAgICAgbm9kZS5kaXNhYmxlZCA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uZGlzYWJsZWQ7XG4gICAgICBub2RlLmV4cGFuZGVkID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5leHBhbmRlZDtcbiAgICAgIG5vZGUuaXNMZWFmID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5pc0xlYWY7XG4gICAgICBub2RlLmtleSA9IGFyZy5kcmFnTm9kZS5vcmlnaW4ua2V5O1xuICAgICAgbm9kZS5zZWxlY3RhYmxlID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5zZWxlY3RhYmxlO1xuICAgICAgbm9kZS50aXRsZSA9IGFyZy5kcmFnTm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICAvLyDmi5bmi73lhYPntKDkuIvmoIdcbiAgICAgIGxldCBkcmFnTm9kZUluZGV4ID0gdGhpcy5ub3dMaXN0Tm9kZXMuZmluZEluZGV4KChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnRpdGxlID09IGFyZy5kcmFnTm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICAgIC8vIOebruagh+S9jee9rueahOS4i+agh1xuICAgICAgbGV0IG5vZGVJbmRleCA9XG4gICAgICAgIHRoaXMubm93TGlzdE5vZGVzLmZpbmRJbmRleCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLnRpdGxlID09IGFyZy5ub2RlLm9yaWdpbi50aXRsZTtcbiAgICAgICAgfSkgKyAoYXJnLnBvcyA9PT0gLTEgPyAwIDogYXJnLnBvcyk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5zcGxpY2Uobm9kZUluZGV4LCAwLCBub2RlKTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzLnNwbGljZShcbiAgICAgICAgbm9kZUluZGV4ID49IGRyYWdOb2RlSW5kZXggPyBkcmFnTm9kZUluZGV4IDogZHJhZ05vZGVJbmRleCArIDEsXG4gICAgICAgIDEsXG4gICAgICApO1xuICAgICAgcmV0dXJuIG9mKHRydWUpLnBpcGUoZGVsYXkoMTAwKSk7XG4gICAgfVxuICB9O1xuXG4gIG1vdmVFbGVtZW50TmVhcmJ5KGFyciwgZWxlbWVudFRvTW92ZVRpdGxlLCB0YXJnZXRFbGVtZW50VGl0bGUsIHBvcykge1xuICAgIGNvbnN0IHRtcEFycmF5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhcnIpKTtcbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IHRtcEFycmF5LmZpbmRJbmRleChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnRpdGxlID09PSB0YXJnZXRFbGVtZW50VGl0bGUsXG4gICAgKTtcbiAgICBjb25zdCBlbGVtZW50SW5kZXggPSB0bXBBcnJheS5maW5kSW5kZXgoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50aXRsZSA9PT0gZWxlbWVudFRvTW92ZVRpdGxlLFxuICAgICk7XG4gICAgY29uc3QgbmV3SW5kZXggPSBwb3MgPCAwID8gdGFyZ2V0SW5kZXggKyBwb3MgOiB0YXJnZXRJbmRleDtcbiAgICAvLyDnp7vpmaTnm67moIflhYPntKDvvIzlubbmj5LlhaXliLDmlrDnmoTkvY3nva5cbiAgICBjb25zdCByZW1vdmVkRWxlbWVudCA9IHRtcEFycmF5LnNwbGljZShlbGVtZW50SW5kZXgsIDEpO1xuICAgIHRtcEFycmF5LnNwbGljZShuZXdJbmRleCArIDEsIDAsIHJlbW92ZWRFbGVtZW50WzBdKTtcbiAgICByZXR1cm4gdG1wQXJyYXk7XG4gIH1cblxuICAvLyDli77pgInmk43kvZxcbiAgY2hlY2tBY3Rpb24oZXZlbnQ6IE56Rm9ybWF0RW1pdEV2ZW50KTogdm9pZCB7XG4gICAgLy8g5Yu+6YCJ5Y+q5pyJ5ZyoaGlkZUxpc3ROb2Rlcyzlj5bmtojli77pgInlj6rmnInlnKhub3dMaXN0Tm9kZXNcbiAgICBpZiAoZXZlbnQubm9kZS5vcmlnaW4uY2hlY2tlZCkge1xuICAgICAgbGV0IG5vZGU6IFRyZWVHcmlkID0gbmV3IFRyZWVHcmlkKCk7XG4gICAgICBub2RlID0gdGhpcy5oaWRlTGlzdE5vZGVzLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgPT09IGV2ZW50Lm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgfSk7XG4gICAgICBub2RlLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgLy8g5om+5Yiw56ys5LiA5LiqZml4ZWTlsZ7mgKfkuLpyaWdodOeahHRpdGxl77yM5om+5Yiw5o+S5YWl5YWD57Sg55qE5L2N572uXG4gICAgICBsZXQgdGl0bGUgPSBudWxsO1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMudGFibGVDb2xzQ2FjaGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb2xzQ2FjaGVbaV0uZml4ZWQgPT09IFwicmlnaHRcIikge1xuICAgICAgICAgIHRpdGxlID0gdGhpcy50YWJsZUNvbHNDYWNoZVtpXS50aXRsZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHRlbXBvcmFyeU5vZGVMaXN0ID0gdGhpcy5ub3dMaXN0Tm9kZXMuc2xpY2UoMCk7XG4gICAgICBpZiAoIXRpdGxlKSB7XG4gICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2gobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubm93TGlzdE5vZGVzLmZpbmRJbmRleChcbiAgICAgICAgICAobm9kZSkgPT4gbm9kZS50aXRsZSA9PT0gdGl0bGUsXG4gICAgICAgICk7XG4gICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnNwbGljZShpbmRleCwgMCwgbm9kZSk7XG4gICAgICB9XG4gICAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRlbXBvcmFyeU5vZGVMaXN0O1xuICAgICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gdGhpcy5oaWRlTGlzdE5vZGVzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSAhPT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgKHRoaXMuaGlkZUxpc3ROb2Rlcy5sZW5ndGggPT09IDAgJiYgdGhpcy50YWJsZUNhY2hlT3B0aW9uICYmIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzKSB7XG4gICAgICAvLyAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRoaXMuZ2V0SGlkZUxpc3ROb2RlcygpO1xuICAgICAgLy8gfVxuICAgICAgbGV0IHRlbXBvcmFyeU5vZGVMaXN0ID0gdGhpcy5oaWRlTGlzdE5vZGVzLnNsaWNlKDApO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS50aXRsZSA9PT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGUpIHtcbiAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0pKTtcbiAgICAgICAgICBpbm5lckl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2goaW5uZXJJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0ZW1wb3JhcnlOb2RlTGlzdDtcblxuICAgICAgLy8g5Li65LqG6Ziy5q2i5pyq6YCJ5oup55qE5pWw57uE6aG65bqP5Zug5Li6cHVzaOaWueazleiAjOaUueWPmO+8jOmAmui/h+WIneWni+aVsOaNruiOt+WPluaYvuekuueahOWtl+auteWIl+ihqFxuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSB0aGlzLm5vd0xpc3ROb2Rlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgIT09IGV2ZW50Lm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g6Ziy5q2i5pyq6YCJ5oup55qE5pWw57uE6aG65bqP5Zug5Li6cHVzaOaWueazleiAjOaUueWPmO+8jOS7juWIneWni+aVsOaNruiOt+WPlumakOiXj+acquaYvuekuueahOWtl+auteWIl+ihqFxuICBnZXRIaWRlTGlzdE5vZGVzKCk6IEFycmF5PFRyZWVHcmlkPiB7XG4gICAgbGV0IHRlbXBvcmFyeU5vZGVMaXN0OiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgICAvLyDku450YWJsZUNvbHNDYWNoZemHjOmdouaJvuayoeacieWcqHN0b3JhZ2Xph4zpnaLlh7rnjrDnmoTlrZfmrrUs57uE5oiQaGlkZUxpc3RcbiAgICB0aGlzLnRhYmxlQ29sc0NhY2hlLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmICghdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoaXRlbS50aXRsZSkpIHtcbiAgICAgICAgbGV0IG5vZGVJdGVtOiBUcmVlR3JpZCA9IG5ldyBUcmVlR3JpZCgpO1xuICAgICAgICBub2RlSXRlbS50aXRsZSA9IGl0ZW0udGl0bGU7XG4gICAgICAgIG5vZGVJdGVtLmtleSA9IGl0ZW0udGl0bGU7XG4gICAgICAgIG5vZGVJdGVtLmRpc2FibGVkID0gaXRlbS5maXhlZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgbm9kZUl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB0ZW1wb3JhcnlOb2RlTGlzdC5wdXNoKG5vZGVJdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGVtcG9yYXJ5Tm9kZUxpc3Q7XG4gIH1cblxuICBkZWFsQ29scygpIHtcbiAgICBpZiAoIXRoaXMudGFibGVDb2xzWzBdLm1pbldpZHRoKSB7XG4gICAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgc3Bhbi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS53aGl0ZVNwYWNlID0gXCJub3dyYXBcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IFwiMTRweFwiO1xuICAgICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiOyAvLyDlsIbmoLflvI/kv67mlLnkuLogaW5saW5lLWJsb2NrXG4gICAgICAgIHNwYW4uaW5uZXJUZXh0ID0gaXRlbS50aXRsZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICAgICAgaXRlbS5taW5XaWR0aCA9IHNwYW4ub2Zmc2V0V2lkdGggKyAxNjtcbiAgICAgICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8g5aSE55CG5bem5Y+z5ZC46ZmE55qE5pWw5o2u5Zyo5pWw57uE5Lit55qE5L2N572uXG4gICAgY29uc3QgbGVmdEZpeGVkQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoY29sKSA9PiBjb2wuZml4ZWQgPT09IFwibGVmdFwiKTtcbiAgICBjb25zdCByaWdodEZpeGVkQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcihcbiAgICAgIChjb2wpID0+IGNvbC5maXhlZCA9PT0gXCJyaWdodFwiLFxuICAgICk7XG4gICAgY29uc3Qgbm9ybWFsQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoY29sKSA9PiAhY29sLmZpeGVkKTtcbiAgICBjb25zdCByZXN1bHRDb2xzID0gbGVmdEZpeGVkQ29scy5jb25jYXQobm9ybWFsQ29scykuY29uY2F0KHJpZ2h0Rml4ZWRDb2xzKTtcbiAgICB0aGlzLnRhYmxlQ29scyA9IHJlc3VsdENvbHM7XG4gICAgaWYgKCF0aGlzLnRhYmxlQ29sc0NhY2hlIHx8IHRoaXMudGFibGVDb2xzQ2FjaGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyDnvJPlrZjkuIDkuIvooajmoLznmoTmlbDmja5cbiAgICAgIHRoaXMudGFibGVDb2xzQ2FjaGUgPSBbLi4udGhpcy50YWJsZUNvbHNdO1xuICAgIH1cbiAgfVxuXG4gIG5vcm1hbGl6ZVRhYmxlQ2FjaGVPcHRpb24oKSB7XG4gICAgaWYgKCF0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzKSB7XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICB9IGVsc2UgaWYgKCEodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgIGNvbnN0IGNvbFdpZHRocyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29sV2lkdGhzLnNldChrZXksICh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzIGFzIGFueSlba2V5XSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgPSBjb2xXaWR0aHM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNDb2xzQ2FjaGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uICYmXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scyAmJlxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMubGVuZ3RoID4gMFxuICAgICk7XG4gIH1cblxuICBzYXZlVGFibGVDYWNoZU9wdGlvbigpIHtcbiAgICB0aGlzLmxvY2FsZm9yYWdlLnNldEl0ZW0oXG4gICAgICBcImhkLXRhYmxlX1wiICtcbiAgICAgICAgdGhpcy51c2VyU2Vzc2lvbi51c2VyQ29kZSArXG4gICAgICAgIFwiX1wiICtcbiAgICAgICAgdGhpcy5sb2NhbHRpb25UbXAgK1xuICAgICAgICBcIl9cIiArXG4gICAgICAgIHRoaXMudXVpZCxcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbixcbiAgICApO1xuICB9XG5cbiAganVkZ2VSZXBlYXRDb2xzKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50YWJsZUNvbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHRoaXMudGFibGVDb2xzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlQ29sc1tpXS50aXRsZSA9PT0gdGhpcy50YWJsZUNvbHNbal0udGl0bGUpIHtcbiAgICAgICAgICB0aHJvdyBgaGQtdGFibGXnu4Tku7bkuK3liJflkI0gJHt0aGlzLnRhYmxlQ29sc1tpXS50aXRsZX0g6YeN5aSNYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uUmVzaXplKHsgd2lkdGggfTogTnpSZXNpemVFdmVudCwgY29sOiBIZFRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgdGhpcy5ub3JtYWxpemVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgbGV0IHRlbXBXaWR0aCA9IDA7XG4gICAgaWYgKHdpZHRoID4gY29sLm1pbldpZHRoKSB7XG4gICAgICB0ZW1wV2lkdGggPSB3aWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVtcFdpZHRoID0gY29sLm1pbldpZHRoO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLnNldChjb2wudGl0bGUsIHRlbXBXaWR0aCk7XG4gICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIHRoaXMudGFibGVDb2xzID0gdGhpcy50YWJsZUNvbHMubWFwKChlKSA9PlxuICAgICAgZS50aXRsZSA9PT0gY29sLnRpdGxlID8geyAuLi5lLCB3aWR0aDogdGVtcFdpZHRoIH0gOiBlLFxuICAgICk7XG4gICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCkpO1xuICB9XG5cbiAgZGVhbE9wZXJhdGVCdG4oKSB7XG4gICAgbGV0IG9wZXJhdGVDb2wgPSB0aGlzLnRhYmxlQ29scy5maW5kKChjb2wpID0+IGNvbC50aXRsZSA9PT0gXCLmk43kvZxcIikgfHwgbnVsbDtcbiAgICBpZiAob3BlcmF0ZUNvbCkge1xuICAgICAgbGV0IHRleHRTdHIgPSBcIlwiO1xuICAgICAgb3BlcmF0ZUNvbC5idG5MaXN0LmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgICBpZiAoIWJ0bi5pc1JlcGVhdCkge1xuICAgICAgICAgIHRleHRTdHIgKz0gdHlwZW9mIGJ0bi5uYW1lID09PSBcImZ1bmN0aW9uXCIgPyBcIuaTjeS9nFwiIDogYnRuLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgc3Bhbi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9IFwibm93cmFwXCI7XG4gICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiOyAvLyDlsIbmoLflvI/kv67mlLnkuLogaW5saW5lLWJsb2NrXG4gICAgICBzcGFuLmlubmVyVGV4dCA9IHRleHRTdHI7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgb3BlcmF0ZUNvbC53aWR0aCA9XG4gICAgICAgIHNwYW4ub2Zmc2V0V2lkdGggK1xuICAgICAgICAob3BlcmF0ZUNvbC5idG5MaXN0LmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNSZXBlYXQpLmxlbmd0aCAtIDEpICogNCArXG4gICAgICAgIDE2O1xuICAgICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJFdmVudChmbjogYW55LCBldmVudDogYW55KSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICBmbihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgbmVlZFNob3dDb25maXJtKGJ0bjogT3BlcmF0ZUJ0biwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBidG4uc2hvd0NvbmZpcm0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGJ0bi5zaG93Q29uZmlybShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuICEhYnRuLnNob3dDb25maXJtO1xuICB9XG5cbiAgZ2V0QnRuTmFtZShidG46IE9wZXJhdGVCdG4sIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBidG4ubmFtZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYnRuLm5hbWUoZGF0YSkgfHwgXCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIGJ0bi5uYW1lICE9IG51bGwgPyBTdHJpbmcoYnRuLm5hbWUpIDogXCJcIjtcbiAgfVxuXG4gIGlzRGFuZ2VyQnRuKGJ0bjogT3BlcmF0ZUJ0biwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QnRuTmFtZShidG4sIGRhdGEpID09PSBcIuWIoOmZpFwiO1xuICB9XG5cbiAgLyoqIOiZmuaLn+a7muWKqOW8gOWQr+aXtuS9v+eUqOinhuWPo+acgOWkp+mrmOW6piAqL1xuICBwcml2YXRlIGdldFZpcnR1YWxTY3JvbGxZKG1heE9mZnNldDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGNhbGMoMTAwdmggLSAke21heE9mZnNldH1weClgO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNUYWJsZURhdGEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy50YWJsZURhdGEgJiZcbiAgICAgIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgJiZcbiAgICAgIHRoaXMudGFibGVEYXRhLmNvbnRlbnQubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjInlo7DmmI7liJfmgLvlrr0gKyDlrrnlmajlrr3vvIzorqHnrpcgc2Nyb2xsLngg5LiOIGZsdWlkIOihpeWuveOAglxuICAgKiDliJflsJHvvJpzY3JvbGwueCA9IOWGheWuueWMuuWuve+8iGNsaWVudFdpZHRo77yJ77yM5beu6aKd5Yqg5Yiw5pyA5ZCO5Lia5Yqh5YiX77yI5Yu+6YCJ5L+d5oyBIDQw77yJ77ybXG4gICAqIOWIl+Wkmu+8mnNjcm9sbC54ID0g5aOw5piO5oC75a6944CCXG4gICAqIOavlOi+g+aYr+WQpui2heWuveeUqCBvZmZzZXRXaWR0aO+8iOWQqyBZIOanve+8ie+8jOmBv+WFjeOAjOS7heWboOe6tea7muadoeOAjeivr+W8gOaoqua7mu+8m1xuICAgKiDooaXlrr3nm67moIfnlKggY2xpZW50V2lkdGjvvIzkuJQgc2Nyb2xsLngg55SoIGZsb29y77yM6YG/5YWN6KGo5a695aSaIDFweCDpgLzlh7ogWCDovbTmu5rliqjmnaHjgIJcbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUhvcml6b250YWxMYXlvdXQoZGVjbGFyZWRDb2xXaWR0aDogbnVtYmVyKToge1xuICAgIHNjcm9sbFg6IHN0cmluZyB8IG51bGw7XG4gICAgZmx1aWRFeHRyYTogbnVtYmVyO1xuICAgIGRpc3BsYXlUb3RhbDogbnVtYmVyO1xuICAgIGlzRmx1aWQ6IGJvb2xlYW47XG4gIH0ge1xuICAgIGlmICghdGhpcy5oYXNUYWJsZURhdGEoKSB8fCBkZWNsYXJlZENvbFdpZHRoIDw9IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjcm9sbFg6IG51bGwsXG4gICAgICAgIGZsdWlkRXh0cmE6IDAsXG4gICAgICAgIGRpc3BsYXlUb3RhbDogZGVjbGFyZWRDb2xXaWR0aCxcbiAgICAgICAgaXNGbHVpZDogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cbiAgICBsZXQgdmlld3BvcnRDb21wYXJlID0gdGhpcy5uelRhYmxlQ29tcG9uZW50XG4gICAgICA/IGdldFRhYmxlU2Nyb2xsWFZpZXdwb3J0V2lkdGgodGhpcy5uelRhYmxlQ29tcG9uZW50KVxuICAgICAgOiAwO1xuICAgIC8vIOihqOS9k+WwmuacqumHj+WIsOWuveaXtu+8iOW8guatpeeBjOaVsCAvIHNwaW4gLyDliJogcmVtb3VudO+8ie+8jOeUqOWuv+S4u+WuveWFnOW6lVxuICAgIGlmICh2aWV3cG9ydENvbXBhcmUgPD0gMCAmJiB0aGlzLmhvc3RFbCAmJiB0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBjb25zdCBob3N0VyA9ICh0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5vZmZzZXRXaWR0aDtcbiAgICAgIGlmIChob3N0VyA+IDApIHtcbiAgICAgICAgdmlld3BvcnRDb21wYXJlID0gaG9zdFc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2aWV3cG9ydENvbXBhcmUgPiAwKSB7XG4gICAgICBpZiAoZGVjbGFyZWRDb2xXaWR0aCA+IHZpZXdwb3J0Q29tcGFyZSArIDEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzY3JvbGxYOiBgJHtNYXRoLmNlaWwoZGVjbGFyZWRDb2xXaWR0aCl9cHhgLFxuICAgICAgICAgIGZsdWlkRXh0cmE6IDAsXG4gICAgICAgICAgZGlzcGxheVRvdGFsOiBkZWNsYXJlZENvbFdpZHRoLFxuICAgICAgICAgIGlzRmx1aWQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsbFdpZHRoID0gdGhpcy5uelRhYmxlQ29tcG9uZW50XG4gICAgICAgID8gZ2V0VGFibGVWaWV3cG9ydFdpZHRoKHRoaXMubnpUYWJsZUNvbXBvbmVudClcbiAgICAgICAgOiAwO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gTWF0aC5mbG9vcihmaWxsV2lkdGggPiAwID8gZmlsbFdpZHRoIDogdmlld3BvcnRDb21wYXJlKTtcbiAgICAgIGNvbnN0IGZsdWlkRXh0cmEgPSBNYXRoLm1heCgwLCB0YXJnZXQgLSBkZWNsYXJlZENvbFdpZHRoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjcm9sbFg6IGAke3RhcmdldH1weGAsXG4gICAgICAgIGZsdWlkRXh0cmEsXG4gICAgICAgIGRpc3BsYXlUb3RhbDogZGVjbGFyZWRDb2xXaWR0aCArIGZsdWlkRXh0cmEsXG4gICAgICAgIGlzRmx1aWQ6IHRydWUsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyDop4blj6Pku43mtYvkuI3liLDvvJroh7PlsJHnlKjlo7DmmI7lrr3orr4gc2Nyb2xsLnjvvIzlvLrliLYgZml4ZWQg5biD5bGA6ZSB5Yu+6YCJ5YiX77yMXG4gICAgLy8g6YG/5YWN6JC95ZueIHRhYmxlLWxheW91dDphdXRvIOiiq+Wdh+aRiuaSkeW8gO+8m+WQjue7rSBzeW5jL3JlbW91bnQg5YaN6L2sIGZsdWlk44CCXG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbFg6IGAke01hdGguY2VpbChkZWNsYXJlZENvbFdpZHRoKX1weGAsXG4gICAgICBmbHVpZEV4dHJhOiAwLFxuICAgICAgZGlzcGxheVRvdGFsOiBkZWNsYXJlZENvbFdpZHRoLFxuICAgICAgaXNGbHVpZDogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiDooajmoLzmuLLmn5PlkI7mjInlrp7pmYXlrrnlmajlrr3luqbmoKHmraPmqKrlkJEgc2Nyb2xsIC8gZmx1aWQg6KGl5a69ICovXG4gIHByaXZhdGUgc3luY0hvcml6b250YWxTY3JvbGwoKTogdm9pZCB7XG4gICAgbGV0IGRlY2xhcmVkID0gMDtcbiAgICBpZiAodGhpcy5zaG93U2VsZWN0ZWQpIHtcbiAgICAgIGRlY2xhcmVkICs9IDQwO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93VGFibGVUb3RhbCkge1xuICAgICAgZGVjbGFyZWQgKz0gdGhpcy5saW5lTnVtYmVyQ29sV2lkdGg7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhYmxlQ29scykge1xuICAgICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmlzU2hvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBkZWNsYXJlZCArPSBpdGVtLndpZHRoID4gMCA/IGl0ZW0ud2lkdGggOiBDb2xXaWR0aC5maXhDb2xXaWR0aDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHByZXZIYXNYID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueCk7XG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5yZXNvbHZlSG9yaXpvbnRhbExheW91dChkZWNsYXJlZCk7XG4gICAgY29uc3QgY3VycmVudFkgPSB0aGlzLnNjcm9sbCA/IHRoaXMuc2Nyb2xsLnkgOiBudWxsO1xuICAgIGNvbnN0IG5leHRIYXNYID0gISFsYXlvdXQuc2Nyb2xsWDtcbiAgICBjb25zdCBzYW1lWCA9IHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnggPT09IGxheW91dC5zY3JvbGxYO1xuICAgIGNvbnN0IHNhbWVFeHRyYSA9IHRoaXMuZmx1aWRFeHRyYVdpZHRoID09PSBsYXlvdXQuZmx1aWRFeHRyYTtcbiAgICBjb25zdCBzYW1lRmx1aWQgPSB0aGlzLmZsdWlkSG9yaXpvbnRhbCA9PT0gbGF5b3V0LmlzRmx1aWQ7XG4gICAgaWYgKFxuICAgICAgc2FtZVggJiZcbiAgICAgIHNhbWVFeHRyYSAmJlxuICAgICAgc2FtZUZsdWlkICYmXG4gICAgICB0aGlzLnNjcm9sbCAmJlxuICAgICAgdGhpcy5zY3JvbGwueSA9PT0gY3VycmVudFlcbiAgICApIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jVG90YWxGb290ZXJXaXRoQm9keSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mbHVpZEV4dHJhV2lkdGggPSBsYXlvdXQuZmx1aWRFeHRyYTtcbiAgICB0aGlzLmZsdWlkSG9yaXpvbnRhbCA9IGxheW91dC5pc0ZsdWlkO1xuICAgIHRoaXMucmVmcmVzaEZsdWlkRXh0cmFUYXJnZXRDb2woKTtcbiAgICB0aGlzLnRhYmxlQ29sV2lkdGhUb3RhbCA9IGxheW91dC5kaXNwbGF5VG90YWw7XG4gICAgdGhpcy5zY3JvbGwgPSB7IHg6IGxheW91dC5zY3JvbGxYLCB5OiBjdXJyZW50WSB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIC8vIHN5bmMg6Zi25q616Iul6KGl5LiK5LqGIHNjcm9sbC5477yM6ZyA6YeN5bu65omN6IO95YiH5YiwIGZpeGVkIOW4g+WxgFxuICAgIGlmIChwcmV2SGFzWCAhPT0gbmV4dEhhc1gpIHtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jSGVhZGVyQm9keVNjcm9sbExlZnQoKSk7XG4gIH1cblxuICAvKiog5omL5Yqo5oqK6KGo5L2T5qiq5ZCR5rua5Yqo5ZCM5q2l5Yiw6KGo5aS0IC8g5ZCI6K6hIGZvb3Rlcu+8iOWFnOW6lSBuZy16b3JybyDnm5HlkKzkuKLlpLHnmoTmg4XlhrXvvIkgKi9cbiAgcHJpdmF0ZSBzeW5jSGVhZGVyQm9keVNjcm9sbExlZnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm56VGFibGVDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyID0gKHRoaXMubnpUYWJsZUNvbXBvbmVudCBhcyBhbnkpXG4gICAgICAudGFibGVIZWFkZXJOYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCBib2R5ID0gdGhpcy5nZXRUYWJsZUJvZHlTY3JvbGxFbCgpO1xuICAgIGlmICh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC54ICYmIGhlYWRlciAmJiBib2R5KSB7XG4gICAgICBpZiAoaGVhZGVyLnNjcm9sbExlZnQgIT09IGJvZHkuc2Nyb2xsTGVmdCkge1xuICAgICAgICBoZWFkZXIuc2Nyb2xsTGVmdCA9IGJvZHkuc2Nyb2xsTGVmdDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zeW5jVG90YWxGb290ZXJXaXRoQm9keSgpO1xuICB9XG5cbiAgLyoqIOWPluihqOS9k+aoquWQkea7muWKqOWuueWZqO+8iOiZmuaLn+a7muWKqOS8mOWFiCB2aWV3cG9ydO+8iSAqL1xuICBwcml2YXRlIGdldFRhYmxlQm9keVNjcm9sbEVsKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm56VGFibGVDb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtaXggPSAodGhpcy5uelRhYmxlQ29tcG9uZW50IGFzIGFueSlcbiAgICAgIC5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAobWl4KSB7XG4gICAgICByZXR1cm4gbWl4O1xuICAgIH1cbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0RWwgJiYgKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIGlmICghaG9zdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICAoaG9zdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydC5hbnQtdGFibGUtYm9keVwiLFxuICAgICAgKSBhcyBIVE1MRWxlbWVudCkgfHxcbiAgICAgIChob3N0LnF1ZXJ5U2VsZWN0b3IoXCIuYW50LXRhYmxlLWJvZHlcIikgYXMgSFRNTEVsZW1lbnQpIHx8XG4gICAgICBudWxsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG90YWxGb290ZXJTY3JvbGxFbCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmhvc3RFbCAmJiAodGhpcy5ob3N0RWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgcmV0dXJuIGhvc3RcbiAgICAgID8gKGhvc3QucXVlcnlTZWxlY3RvcihcIi5oZC10YWJsZS10b3RhbC1mb290ZXJcIikgYXMgSFRNTEVsZW1lbnQpXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKiog6KGo5L2T5piv5ZCm5Ye6546w57q15ZCR5rua5Yqo5p2h77yI5ZCr5rua5Yqo5p2h5qe95a6977yJICovXG4gIHByaXZhdGUgYm9keUhhc1ZlcnRpY2FsU2Nyb2xsYmFyKGJvZHk6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBib2R5LnNjcm9sbEhlaWdodCA+IGJvZHkuY2xpZW50SGVpZ2h0ICsgMSB8fFxuICAgICAgYm9keS5vZmZzZXRXaWR0aCAtIGJvZHkuY2xpZW50V2lkdGggPiAxXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkIjorqEgZm9vdGVyIOS4juihqOS9k+iBlOWKqO+8mlxuICAgKiAtIGZsdWlk77yI5YiX5pyq5pKR5ruh77yJ77ya5LiN5qiq5rua44CB5LiN5rWL5a6977yM6KGo5a69IDEwMCUg5LiO6KGo5L2T5ZCM5q+U5L6L5ouJ5Ly477ybXG4gICAqIC0gZml4ZWTvvIjmnIkgc2Nyb2xsLnjvvInvvJrlkIzmraUgc2Nyb2xsTGVmdO+8m1xuICAgKiAtIOS7heW9k+ihqOS9k+acieerlua7muadoeaXtumihOeVmeWPs+S+p+anve+8jOihjOWwkeaXoOerlua7muaXtuS4jeWNoOS9jeOAglxuICAgKi9cbiAgcHJpdmF0ZSBzeW5jVG90YWxGb290ZXJXaXRoQm9keSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1RhYmxlVG90YWwpIHtcbiAgICAgIHRoaXMudW5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKCk7XG4gICAgICBpZiAodGhpcy50b3RhbEZvb3Rlck5lZWRZR3V0dGVyKSB7XG4gICAgICAgIHRoaXMudG90YWxGb290ZXJOZWVkWUd1dHRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZm9vdGVyID0gdGhpcy5nZXRUb3RhbEZvb3RlclNjcm9sbEVsKCk7XG4gICAgY29uc3QgYm9keSA9IHRoaXMuZ2V0VGFibGVCb2R5U2Nyb2xsRWwoKTtcbiAgICBpZiAoIWZvb3Rlcikge1xuICAgICAgaWYgKHRoaXMudG90YWxGb290ZXJTeW5jUmV0cnkgPCAxMCkge1xuICAgICAgICB0aGlzLnRvdGFsRm9vdGVyU3luY1JldHJ5Kys7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jVG90YWxGb290ZXJXaXRoQm9keSgpLCA1MCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudG90YWxGb290ZXJTeW5jUmV0cnkgPSAwO1xuICAgIGNvbnN0IG5lZWRZR3V0dGVyID0gISEoYm9keSAmJiB0aGlzLmJvZHlIYXNWZXJ0aWNhbFNjcm9sbGJhcihib2R5KSk7XG4gICAgaWYgKHRoaXMudG90YWxGb290ZXJOZWVkWUd1dHRlciAhPT0gbmVlZFlHdXR0ZXIpIHtcbiAgICAgIHRoaXMudG90YWxGb290ZXJOZWVkWUd1dHRlciA9IG5lZWRZR3V0dGVyO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzVG90YWxGb290ZXJGbHVpZCkge1xuICAgICAgdGhpcy51bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTtcbiAgICAgIGZvb3Rlci5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGJvZHkpIHtcbiAgICAgIHRoaXMuc3luY1RvdGFsRm9vdGVyU2Nyb2xsTGVmdChib2R5LnNjcm9sbExlZnQpO1xuICAgICAgdGhpcy5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKGJvZHkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY1RvdGFsRm9vdGVyU2Nyb2xsTGVmdChzY3JvbGxMZWZ0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb290ZXIgPSB0aGlzLmdldFRvdGFsRm9vdGVyU2Nyb2xsRWwoKTtcbiAgICBpZiAoZm9vdGVyICYmIGZvb3Rlci5zY3JvbGxMZWZ0ICE9PSBzY3JvbGxMZWZ0KSB7XG4gICAgICBmb290ZXIuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBiaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKGJvZHk6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dUYWJsZVRvdGFsIHx8ICFib2R5IHx8IHRoaXMuaXNUb3RhbEZvb3RlckZsdWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkgPT09IGJvZHkgJiZcbiAgICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudW5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKCk7XG4gICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keSA9IGJvZHk7XG4gICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnN5bmNUb3RhbEZvb3RlclNjcm9sbExlZnQoYm9keS5zY3JvbGxMZWZ0KTtcbiAgICB9O1xuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlciwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICB9IGFzIGFueSk7XG4gIH1cblxuICBwcml2YXRlIHVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keSAmJiB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlcikge1xuICAgICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICBcInNjcm9sbFwiLFxuICAgICAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlcixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkgPSBudWxsO1xuICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm5HlkKznqpflj6MgLyDlrrnlmajlrr3luqblj5jljJbvvJrph43mlrDliKTlrpogc2Nyb2xsLnjvvIhmbHVpZOKGlGZpeGVk77yJ5LiO5ZCI6K6h5Y+z5L6n56uW5rua5qe977yMXG4gICAqIOmBv+WFjeaLieWuvS/nvKnnqoTlsY/luZXlkI7lkIjorqHooYzlrr3kuI7ooajkvZPplJnkvY3jgIJcbiAgICovXG4gIHByaXZhdGUgYmluZFZpZXdwb3J0UmVzaXplU3luYygpOiB2b2lkIHtcbiAgICB0aGlzLmJvdW5kT25WaWV3cG9ydFJlc2l6ZSA9ICgpID0+IHRoaXMuc2NoZWR1bGVWaWV3cG9ydFNjcm9sbFN5bmMoKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5ib3VuZE9uVmlld3BvcnRSZXNpemUpO1xuICAgIH1cbiAgICBjb25zdCBSTyA9XG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gKHdpbmRvdyBhcyBhbnkpLlJlc2l6ZU9ic2VydmVyIDogbnVsbDtcbiAgICBpZiAoUk8gJiYgdGhpcy5ob3N0RWwgJiYgdGhpcy5ob3N0RWwubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5ob3N0UmVzaXplT2JzZXJ2ZXIgPSBuZXcgUk8oKCkgPT4gdGhpcy5zY2hlZHVsZVZpZXdwb3J0U2Nyb2xsU3luYygpKTtcbiAgICAgIHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5ob3N0RWwubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1bmJpbmRWaWV3cG9ydFJlc2l6ZVN5bmMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYm91bmRPblZpZXdwb3J0UmVzaXplICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMuYm91bmRPblZpZXdwb3J0UmVzaXplKTtcbiAgICB9XG4gICAgdGhpcy5ib3VuZE9uVmlld3BvcnRSZXNpemUgPSBudWxsO1xuICAgIGlmICh0aGlzLmhvc3RSZXNpemVPYnNlcnZlcikge1xuICAgICAgdGhpcy5ob3N0UmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5ob3N0UmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIpO1xuICAgICAgdGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVmlld3BvcnRTY3JvbGxTeW5jKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudmlld3BvcnRSZXNpemVUaW1lcik7XG4gICAgfVxuICAgIHRoaXMudmlld3BvcnRSZXNpemVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyID0gbnVsbDtcbiAgICAgIGlmICghdGhpcy50YWJsZUNvbHMgfHwgIXRoaXMudGFibGVDb2xzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICAvLyDnrYnooajkvZPluIPlsYDnqLPlrprlkI7lho3moKHlkIjorqHnq5bmu5rmp70gLyDmqKrmu5rlkIzmraVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jVG90YWxGb290ZXJXaXRoQm9keSgpLCA1MCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGRlYWxTY3JvbGwoKSB7XG4gICAgbGV0IGNvbFdpZHRoID0gMDtcbiAgICBpZiAodGhpcy5zaG93U2VsZWN0ZWQpIHtcbiAgICAgIGNvbFdpZHRoICs9IDQwO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93VGFibGVUb3RhbCkge1xuICAgICAgY29sV2lkdGggKz0gdGhpcy5saW5lTnVtYmVyQ29sV2lkdGg7IC8vIOW6j+WPt+WIl++8iOWbuuWumuWuve+8jOS4jemaj+S9jeaVsOWPmOWMlu+8iVxuICAgIH1cbiAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0ud2lkdGgpIHtcbiAgICAgICAgaXRlbS53aWR0aCA9IENvbFdpZHRoLmZpeENvbFdpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uaXNTaG93ICE9PSBmYWxzZSkge1xuICAgICAgICBpdGVtLmZpeGVkV2lkdGggPSBjb2xXaWR0aDtcbiAgICAgICAgY29sV2lkdGggKz0gaXRlbS53aWR0aDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOWPs+S+p+WbuuWumuWIl++8muS7juWPs+W+gOW3pue0r+iuoeWBj+enu++8jOmBv+WFjeWkmuWIl+mDvSByaWdodDowIOS6kuebuOmBruaMoVxuICAgIGxldCByaWdodE9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMudGFibGVDb2xzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy50YWJsZUNvbHNbaV07XG4gICAgICBpZiAoaXRlbS5pc1Nob3cgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uZml4ZWQgPT09IFwicmlnaHRcIikge1xuICAgICAgICBpdGVtLmZpeGVkUmlnaHRXaWR0aCA9IHJpZ2h0T2Zmc2V0O1xuICAgICAgICByaWdodE9mZnNldCArPSBpdGVtLndpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5maXhlZFJpZ2h0V2lkdGggPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMucmVzb2x2ZUhvcml6b250YWxMYXlvdXQoY29sV2lkdGgpO1xuICAgIHRoaXMuZmx1aWRFeHRyYVdpZHRoID0gbGF5b3V0LmZsdWlkRXh0cmE7XG4gICAgdGhpcy5mbHVpZEhvcml6b250YWwgPSBsYXlvdXQuaXNGbHVpZDtcbiAgICB0aGlzLnJlZnJlc2hGbHVpZEV4dHJhVGFyZ2V0Q29sKCk7XG4gICAgdGhpcy50YWJsZUNvbFdpZHRoVG90YWwgPSBsYXlvdXQuZGlzcGxheVRvdGFsO1xuICAgIGNvbnN0IG1heE9mZnNldCA9IHRoaXMuZ2V0U2Nyb2xsWU1heE9mZnNldCgpO1xuICAgIGNvbnN0IHVzZVZpcnR1YWwgPSB0aGlzLnVzZVZpcnR1YWxTY3JvbGw7XG4gICAgY29uc3Qgc2Nyb2xsWCA9IGxheW91dC5zY3JvbGxYO1xuXG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCAmJiAhdXNlVmlydHVhbCkge1xuICAgICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICAgIHg6IHNjcm9sbFgsXG4gICAgICAgIHk6IG51bGwsXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICB0aGlzLnNjcm9sbCA9IHtcbiAgICAgICAgeDogc2Nyb2xsWCxcbiAgICAgICAgeTogYGNhbGMoMTAwdmggLSAke21heE9mZnNldH1weClgLFxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbCA9IHtcbiAgICAgIHg6IHNjcm9sbFgsXG4gICAgICB5OiB0aGlzLmdldFZpcnR1YWxTY3JvbGxZKG1heE9mZnNldCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIOihqOagvOWLvumAiemAu+i+kVxuICBjdXJyZW50UGFnZURhdGFDaGFuZ2UoJGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhID0gJGV2ZW50O1xuICAgIHRoaXMucmVmcmVzaFN0YXR1cygpO1xuICAgIGlmICghdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdExvY2FsKSB7XG4gICAgICB0aGlzLnJlc2V0U3RhdHVzKCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgc2VhcmNoKHJlc2V0OiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5YmN56uv5YiG6aG177ya5Y+q5ZCM5q2l6aG156CBL+adoeaVsO+8jOS4jeinpuWPkeeItue7hOS7tuafpeivolxuICAgIGlmICh0aGlzLmZyb250UGFnaW5hdGlvbikge1xuICAgICAgaWYgKHJlc2V0KSB7XG4gICAgICAgIHRoaXMudGFibGVQYWdlSW5kZXggPSAxO1xuICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleENoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlSW5kZXgpO1xuICAgICAgfVxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgLy8g5oyJ5b2T5YmN6aG16KGM5pWw6YeN566X5piv5ZCm6ZyA6KaBIHNjcm9sbC5577yI5pyr6aG15pWw5o2u5bCR5pe25Y675o6J5Zu65a6a6auY5bqm77yM6YG/5YWN55WZ55m977yJXG4gICAgICB0aGlzLnBlbmRpbmdSZXNldFNjcm9sbFRvcCA9IHRydWU7XG4gICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKGZhbHNlKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA9IHRoaXMudGFibGVQYWdlU2l6ZTtcbiAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgaWYgKHJlc2V0KSB7XG4gICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRhYmxlUGFnZUluZGV4Q2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VJbmRleCk7XG4gICAgICAvLyDop6blj5HniLbnu4Tku7bmn6Xor6Lkuovku7ZcbiAgICAgIHRoaXMudGFibGVTZWFyY2hFdmVudC5lbWl0KHJlc2V0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5bqV6YOo5ZCI6K6h77ya5LiOIGhkLWRldGFpbC1saW5lcyDnm7jlkIzvvIzkvb/nlKggVG90YWxPcHRpb27vvIhpbnNlcnRJbmRleCAvIGluc2VydFZhbHVl77yJ44CCXG4gICAqIOW8gOWQr+WQjuW8uuWItuWxleekuuW6j+WPt+WIl++8jOOAjOWQiOiuoeOAjeiQveWcqOW6j+WPt+WIl+S4i++8m1xuICAgKiBpbnNlcnRJbmRleCDku44gMSDotbflr7nlupTlj6/op4HmlbDmja7liJfvvJvmnKrkvKAgaW5zZXJ0VmFsdWUg5pe25oyJ6K+l5YiXIG5hbWUg5a+5IGNvbnRlbnQg5rGC5ZKM44CCXG4gICAqL1xuICBjYWxjdWxhdGVUYWJsZVRvdGFsKCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnNob3dUYWJsZVRvdGFsIHx8XG4gICAgICAhdGhpcy50YWJsZVRvdGFsT3B0aW9uIHx8XG4gICAgICAhdGhpcy50YWJsZVRvdGFsT3B0aW9uLmxlbmd0aFxuICAgICkge1xuICAgICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2aXNpYmxlQ29scyA9ICh0aGlzLnRhYmxlQ29scyB8fCBbXSkuZmlsdGVyKFxuICAgICAgKGMpID0+IGMgJiYgYy5pc1Nob3cgIT09IGZhbHNlLFxuICAgICk7XG4gICAgLy8gY29sdW1uc051bWJlciDlkKvluo/lj7fliJfvvIjkuI4gZGV0YWlsLWxpbmVzIOS4gOiHtO+8ie+8jOaVsOaNruanveS9jeaVsCA9IGNvbHVtbnNOdW1iZXIgLSAxXG4gICAgY29uc3QgY29uZmlndXJlZCA9IE51bWJlcih0aGlzLmNvbHVtbnNOdW1iZXIpO1xuICAgIGNvbnN0IGNvbHVtbk51bWJlciA9XG4gICAgICBjb25maWd1cmVkID4gMVxuICAgICAgICA/IGNvbmZpZ3VyZWQgLSAxXG4gICAgICAgIDogY29uZmlndXJlZCA9PT0gMVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogdmlzaWJsZUNvbHMubGVuZ3RoO1xuICAgIGlmICghY29sdW1uTnVtYmVyIHx8IGNvbHVtbk51bWJlciA8IDEpIHtcbiAgICAgIHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdCA9IG5ldyBBcnJheShjb2x1bW5OdW1iZXIpLmZpbGwoXCJcIik7XG4gICAgY29uc3QgY29udGVudCA9XG4gICAgICB0aGlzLnRhYmxlRGF0YSAmJiB0aGlzLnRhYmxlRGF0YS5jb250ZW50ID8gdGhpcy50YWJsZURhdGEuY29udGVudCA6IFtdO1xuICAgIHRoaXMudGFibGVUb3RhbE9wdGlvbi5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbSA9PSBudWxsIHx8ICFpdGVtLmluc2VydEluZGV4IHx8IGl0ZW0uaW5zZXJ0SW5kZXggPCAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCB2YWx1ZTogYW55ID0gaXRlbS5pbnNlcnRWYWx1ZTtcbiAgICAgIC8vIOacquS8oCBpbnNlcnRWYWx1ZSDml7bvvJrmjIkgaW5zZXJ0SW5kZXgg5a+55bqU5Y+v6KeB5YiXIG5hbWUg6Ieq5Yqo5rGC5ZKMXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICBjb25zdCBjb2wgPSB2aXNpYmxlQ29sc1tpdGVtLmluc2VydEluZGV4IC0gMV07XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sICYmIHR5cGVvZiBjb2wubmFtZSA9PT0gXCJzdHJpbmdcIiA/IGNvbC5uYW1lIDogbnVsbDtcbiAgICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgbGV0IGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgIGNvbnRlbnQuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF3ID0gcm93ID8gcm93W2ZpZWxkXSA6IG51bGw7XG4gICAgICAgICAgaWYgKHJhdyA9PSBudWxsIHx8IHJhdyA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIocmF3KTtcbiAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIHtcbiAgICAgICAgICAgIHN1bSArPSBudW07XG4gICAgICAgICAgICBoYXNWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFoYXNWYWx1ZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IHN1bTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbEF0SW5kZXggPSB2aXNpYmxlQ29sc1tpdGVtLmluc2VydEluZGV4IC0gMV07XG4gICAgICB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0W2l0ZW0uaW5zZXJ0SW5kZXggLSAxXSA9IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGFsaWduOiBpdGVtLmFsaWduIHx8IChjb2xBdEluZGV4ICYmIGNvbEF0SW5kZXguYWxpZ24pIHx8IFwibGVmdFwiLFxuICAgICAgICBzaG93RGVjaW1hbDogaXRlbS5zaG93RGVjaW1hbCB8fCBmYWxzZSxcbiAgICAgICAgcHJlc2VydmVOdW1iZXI6IGl0ZW0ucHJlc2VydmVOdW1iZXIgIT0gbnVsbCA/IGl0ZW0ucHJlc2VydmVOdW1iZXIgOiAyLFxuICAgICAgICBpc0hpZGU6IGl0ZW0uaXNIaWRlIHx8IGZhbHNlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFibGVUb3RhbENlbGxNZXRhKGNvbDogSGRUYWJsZUNvbHVtbiwgY29sSW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKFxuICAgICAgIWNvbCB8fFxuICAgICAgIXRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QgfHxcbiAgICAgICF0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0Lmxlbmd0aFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCB2aXNpYmxlSW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBjb2xJbmRleDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy50YWJsZUNvbHNbaV07XG4gICAgICBpZiAoYyAmJiBjLmlzU2hvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgdmlzaWJsZUluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2aXNpYmxlSW5kZXggPCAwIHx8IHZpc2libGVJbmRleCA+PSB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0W3Zpc2libGVJbmRleF07XG4gICAgcmV0dXJuIG1ldGEgJiYgdHlwZW9mIG1ldGEgPT09IFwib2JqZWN0XCIgPyBtZXRhIDogbnVsbDtcbiAgfVxuXG4gIC8qKiDlkIjorqHljZXlhYPmoLzlsZXnpLrmlofmoYjvvIjlr7npvZAgZGV0YWlsLWxpbmVzIOWwj+aVsOinhOWIme+8iSAqL1xuICBnZXRUYWJsZVRvdGFsQ2VsbFZhbHVlKGNvbDogSGRUYWJsZUNvbHVtbiwgY29sSW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0VGFibGVUb3RhbENlbGxNZXRhKGNvbCwgY29sSW5kZXgpO1xuICAgIGlmICghbWV0YSB8fCBtZXRhLmlzSGlkZSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gbWV0YS52YWx1ZTtcbiAgICBpZiAoISh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBwcmVzZXJ2ZSA9XG4gICAgICBtZXRhLnByZXNlcnZlTnVtYmVyICE9IG51bGwgPyBOdW1iZXIobWV0YS5wcmVzZXJ2ZU51bWJlcikgOiAyO1xuICAgIGlmICh2YWx1ZSAlIDEgPT09IDAgJiYgIW1ldGEuc2hvd0RlY2ltYWwpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgZmFjdG9yID0gTWF0aC5wb3coMTAsIHByZXNlcnZlKTtcbiAgICByZXR1cm4gKE1hdGgucm91bmQoTnVtYmVyKHZhbHVlKSAqIGZhY3RvcikgLyBmYWN0b3IpLnRvRml4ZWQocHJlc2VydmUpO1xuICB9XG5cbiAgZ2V0VGFibGVUb3RhbENlbGxBbGlnbihjb2w6IEhkVGFibGVDb2x1bW4sIGNvbEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldFRhYmxlVG90YWxDZWxsTWV0YShjb2wsIGNvbEluZGV4KTtcbiAgICBjb25zdCBhbGlnbiA9IChtZXRhICYmIG1ldGEuYWxpZ24pIHx8IChjb2wgJiYgY29sLmFsaWduKSB8fCBcImxlZnRcIjtcbiAgICBpZiAoYWxpZ24gPT09IFwicmlnaHRcIiB8fCBhbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCBhbGlnbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgIHJldHVybiBhbGlnbjtcbiAgICB9XG4gICAgcmV0dXJuIFwibGVmdFwiO1xuICB9XG5cbiAgLyoqIOW6lemDqOOAjOWFsSBuIOadoeOAje+8mumdnuWIhumhtS/liY3nq6/liIbpobXnlKggY29udGVudC5sZW5ndGjvvIzmnI3liqHnq6/liIbpobXnlKggdG90YWxFbGVtZW50cyAqL1xuICBnZXRUYWJsZVRvdGFsQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMudGFibGVEYXRhKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRpb24gfHwgdGhpcy5mcm9udFBhZ2luYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlRGF0YS5jb250ZW50ID8gdGhpcy50YWJsZURhdGEuY29udGVudC5sZW5ndGggOiAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50YWJsZURhdGEudG90YWxFbGVtZW50cyAhPSBudWxsXG4gICAgICA/IHRoaXMudGFibGVEYXRhLnRvdGFsRWxlbWVudHNcbiAgICAgIDogMDtcbiAgfVxuXG4gIHJlc2V0U3RhdHVzKCkge1xuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgIC8vIOWFiOaYvuW8j+e9riBmYWxzZe+8jOmBv+WFjSBuei1jaGVja2JveCDlhoXpg6jnirbmgIHkuI4gbWFwT2ZDaGVja2VkSWQg5LiN5ZCM5q2l77yI6Jma5ouf5rua5Yqo5aSN55So6KGM5pe25bi46KeB77yJXG4gICAgT2JqZWN0LmtleXModGhpcy5tYXBPZkNoZWNrTGlzdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2tleV0gPSBmYWxzZTtcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW1bdGhpcy5zZWxlY3RGaWVsZF07XG4gICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtrZXldID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5tYXBPZkNoZWNrZWRJZCA9IHt9O1xuICAgIHRoaXMubWFwT2ZDaGVja0xpc3QgPSB7fTtcbiAgICB0aGlzLnNlbGVjdEV2ZW50LmVtaXQoW10pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIOWNlemAie+8mumAieS4reW9k+WJjeihjOW5tua4heaOieWFtuWug+ihjO+8m+W/veeVpSByYWRpbyDlm6DliIfmjaLogIzlj5Hlh7rnmoQgZmFsc2UgKi9cbiAgb25SYWRpb1NlbGVjdChjaGVja2VkOiBib29sZWFuLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWNoZWNrZWQgfHwgIWRhdGEpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1NlbGVjdERpc2FibGVkKGRhdGEpKSB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gZGF0YVt0aGlzLnNlbGVjdEZpZWxkXTtcbiAgICB0aGlzLm1hcE9mQ2hlY2tlZElkID0ge307XG4gICAgdGhpcy5tYXBPZkNoZWNrTGlzdCA9IHt9O1xuICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtrZXldID0gdHJ1ZTtcbiAgICAgIHRoaXMubWFwT2ZDaGVja0xpc3Rba2V5XSA9IGRhdGE7XG4gICAgfVxuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNlbGVjdEV2ZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdEV2ZW50LmVtaXQoa2V5ICE9IG51bGwgPyBbZGF0YV0gOiBbXSk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVmcmVzaFN0YXR1cyhldmVudDogYm9vbGVhbiA9IGZhbHNlLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0VHlwZSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICB0aGlzLm9uUmFkaW9TZWxlY3QoZXZlbnQsIGRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZGF0YSkge1xuICAgICAgLy8g56aB55So6KGM5LiN5YWB6K645Yu+6YCJ77yb5Y+W5raI5Yu+6YCJ5LuN5YWB6K6477yI5L6L5aaC5pWw5o2u5Y+Y5pu05YmN5bey5Yu+6YCJ77yJXG4gICAgICBpZiAoZXZlbnQgJiYgdGhpcy5pc1NlbGVjdERpc2FibGVkKGRhdGEpKSB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dID0gZXZlbnQ7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgIXRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgICAodGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSA9IGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgIGRlbGV0ZSB0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWxlY3RhYmxlTGlzdCA9IHRoaXMubGlzdE9mRGlzcGxheURhdGEuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+ICF0aGlzLmlzU2VsZWN0RGlzYWJsZWQoaXRlbSksXG4gICAgKTtcbiAgICB0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkID1cbiAgICAgIHNlbGVjdGFibGVMaXN0Lmxlbmd0aCA+IDAgJiZcbiAgICAgIHNlbGVjdGFibGVMaXN0LmV2ZXJ5KFxuICAgICAgICAoaXRlbSkgPT4gdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSxcbiAgICAgICk7XG4gICAgdGhpcy5pc0luZGV0ZXJtaW5hdGUgPVxuICAgICAgc2VsZWN0YWJsZUxpc3Quc29tZShcbiAgICAgICAgKGl0ZW0pID0+IHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0sXG4gICAgICApICYmICF0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkO1xuICAgIC8vIOinpuWPkXNlbGVjdOS6i+S7tlxuICAgIGlmICh0aGlzLnNlbGVjdEV2ZW50KSB7XG4gICAgICBjb25zdCBzZWxlY3RlZExpc3Q6IEFycmF5PGFueT4gPSBPYmplY3QudmFsdWVzKHRoaXMubWFwT2ZDaGVja0xpc3QpO1xuICAgICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KHNlbGVjdGVkTGlzdCk7XG4gICAgfVxuICAgIC8vIOWmguaenOaVsOaNruS4uuepuu+8jOWImea4heepuuWLvumAieagh+ivhlxuICAgIGlmICh0aGlzLnRhYmxlRGF0YS5jb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNoZWNrQWxsKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAvLyDlhajpgIkv5Y+W5raI5YWo6YCJ5Z2H6Lez6L+H56aB55So6KGM77yI56aB55So6KGM5L+d5oyB5Y6f5Yu+6YCJ54q25oCB77yJXG4gICAgICBpZiAodGhpcy5pc1NlbGVjdERpc2FibGVkKGl0ZW0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAhdGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgICh0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dID0gaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgZGVsZXRlIHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV07XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZnJlc2hTdGF0dXMoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiDlvZPliY3ooYzmmK/lkKbnpoHnlKjli77pgIkgKi9cbiAgaXNTZWxlY3REaXNhYmxlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnNlbGVjdERpc2FibGVkRmllbGQgJiZcbiAgICAgIGRhdGEgJiZcbiAgICAgIGRhdGFbdGhpcy5zZWxlY3REaXNhYmxlZEZpZWxkXSA9PT0gdHJ1ZVxuICAgICk7XG4gIH1cblxuICAvKiog5b2T5YmN6KGM5piv5ZCm5aSx5pWIICovXG4gIGlzSW52YWxpZFJvdyhkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnJvd0ludmFsaWRGaWVsZCAmJlxuICAgICAgZGF0YSAmJlxuICAgICAgZGF0YVt0aGlzLnJvd0ludmFsaWRGaWVsZF0gPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIl+aWh+Wtl+minOiJsu+8mmNvbG9yIOS4uuWHveaVsOaXtuaMieihjOiuoeeul++8iOeUqOS6juafkOS4gOihjOafkOS4gOWIl+agh+e6ou+8ie+8jOWQpuWImeaVtOWIl+WQjOiJsuOAglxuICAgKi9cbiAgcmVzb2x2ZUNlbGxDb2xvcihjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFjb2wgfHwgY29sLmNvbG9yID09IG51bGwgfHwgY29sLmNvbG9yID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2wuY29sb3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb2wuY29sb3IoZGF0YSk7XG4gICAgICByZXR1cm4gdmFsdWUgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5jb2xvcjtcbiAgfVxuXG4gIC8qKiDlj6/ngrnlh7vljZXlhYPmoLzpopzoibLvvJrnqbrlgLzlm7rlrprngbDvvIzlkKbliJnmjInliJcgY29sb3IgKi9cbiAgZ2V0TGlua0NlbGxDb2xvcihjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgaXNFbXB0eTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgIHJldHVybiBcIiMyQTM2MzRcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNlbGxDb2xvcihjb2wsIGRhdGEpO1xuICB9XG5cbiAgLyoqIOaZrumAmuaWh+acrOWNleWFg+agvOminOiJsu+8muWkseaViOihjOe7n+S4gOeBsO+8jOWQpuWImeeUqOWIl+mFjee9riBjb2xvciAqL1xuICBnZXRQbGFpbkNlbGxDb2xvcihjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNJbnZhbGlkUm93KGRhdGEpKSB7XG4gICAgICByZXR1cm4gXCIjODY4QTlDXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc29sdmVDZWxsQ29sb3IoY29sLCBkYXRhKTtcbiAgfVxuXG4gIGp1ZGdlQ29sRW1wdHkoc3RyOiBhbnkpIHtcbiAgICBpZiAoc3RyIHx8IHN0ciA9PT0gMCkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiPOepuj5cIjtcbiAgICB9XG4gIH1cblxuICBnZXRTdGF0ZUZpZWxkKGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5pc1N0YXRlKSB7XG4gICAgICByZXR1cm4gY29sLm5hbWUgYXMgc3RyaW5nO1xuICAgIH1cbiAgICByZXR1cm4gY29sLnN0YXRlRmllbGQgfHwgXCJzdGF0ZVwiO1xuICB9XG5cbiAgLyoqIOWtl+auteWAvOWQjuaYr+WQpuWxleekuuerlue6v+ihjOWPtyAqL1xuICBoYXNSb3dObyhjb2w6IEhkVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICBjb2wgJiZcbiAgICAgIChjb2wucm93Tm8gPT09IHRydWUgfHwgKHR5cGVvZiBjb2wucm93Tm8gPT09IFwic3RyaW5nXCIgJiYgY29sLnJvd05vKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOihjOWPt+aWh+ahiOOAgnJvd05vIOS4uuWtl+auteWQjeaXtuWPluihjOaVsOaNru+8m+S4uiB0cnVlIOaXtuaMieW9k+WJjemhteW6j+WPt++8iOi3qOmhtei/nue7re+8jOS7jiAxIOW8gOWni++8ieOAglxuICAgKi9cbiAgZ2V0Um93Tm9UZXh0KGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaGFzUm93Tm8oY29sKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLnJvd05vID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGEgPyBkYXRhW2NvbC5yb3dOb10gOiBudWxsO1xuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgcGFnZSA9XG4gICAgICBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpIDogMTtcbiAgICBjb25zdCBzaXplID1cbiAgICAgIE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpIDogMDtcbiAgICBjb25zdCByb3dJbmRleCA9IE51bWJlcihpbmRleCkgPj0gMCA/IE51bWJlcihpbmRleCkgOiAwO1xuICAgIHJldHVybiBTdHJpbmcoKHBhZ2UgLSAxKSAqIHNpemUgKyByb3dJbmRleCArIDEpO1xuICB9XG5cbiAgLyoqIOihqOWktOOAjOmFjemAgeWNleWPtyB8IOihjOOAjeaLhuaIkOefreerlue6v++8jOmBv+WFjeWtl+espiB8IOaLiea7oeihjOmrmCAqL1xuICBnZXRUaXRsZVBhcnRzKGNvbDogSGRUYWJsZUNvbHVtbik6IEFycmF5PHN0cmluZz4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmhhc1Jvd05vKGNvbCkgfHxcbiAgICAgICFjb2wgfHxcbiAgICAgICFjb2wudGl0bGUgfHxcbiAgICAgIFN0cmluZyhjb2wudGl0bGUpLmluZGV4T2YoXCJ8XCIpIDwgMFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJhdyA9IFN0cmluZyhjb2wudGl0bGUpLnNwbGl0KFwifFwiKTtcbiAgICBpZiAocmF3Lmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gW3Jhd1swXS50cmltKCksIHJhdy5zbGljZSgxKS5qb2luKFwifFwiKS50cmltKCldO1xuICB9XG5cbiAgLyoqIOaYr+WQpuaYvuekuue8lui+keeslOWbvuagh++8iOaciSBlZGl0VHlwZSDml7botbDooYzlhoXmjqfku7bvvIzkuI3lho3mmL7npLrnrJTvvIkgKi9cbiAgaXNFZGl0YWJsZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghY29sIHx8IHRoaXMuaGFzSW5saW5lRWRpdChjb2wpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb2wuZWRpdGFibGUgPT0gbnVsbCB8fCBjb2wuZWRpdGFibGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLmVkaXRhYmxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAhIWNvbC5lZGl0YWJsZShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuICEhY29sLmVkaXRhYmxlO1xuICB9XG5cbiAgLyoqIOeCueWHu+e8lui+keeslO+8jOWbnuiwg+eItue7hOS7tuS8oOWFpeeahCBlZGl0ICovXG4gIG9uRWRpdENsaWNrKGV2ZW50OiBFdmVudCwgY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoY29sLmVkaXQgfHwgbnVsbCwgZGF0YSk7XG4gIH1cblxuICAvKiog5YiX5piv5ZCm6YWN572u5LqG5Y+v55So55qE6KGM5YaF57yW6L6R77yIbmFtZSDlv4XpobvmmK8gc3RyaW5n77yJICovXG4gIGhhc0lubGluZUVkaXQoY29sOiBIZFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5lZGl0VHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5uYW1lICE9PSBcInN0cmluZ1wiIHx8ICFjb2wubmFtZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltoZC10YWJsZV0gZWRpdFR5cGUg6KaB5rGCIG5hbWUg5Li6IHN0cmluZ++8jOWIl+OAjFwiICtcbiAgICAgICAgICAoY29sLnRpdGxlIHx8IFwiXCIpICtcbiAgICAgICAgICBcIuOAjeW3suWbnumAgOWPquivu1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpc0VkaXREaXNhYmxlZChjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghY29sIHx8IGNvbC5lZGl0RGlzYWJsZWQgPT0gbnVsbCB8fCBjb2wuZWRpdERpc2FibGVkID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5lZGl0RGlzYWJsZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuICEhY29sLmVkaXREaXNhYmxlZChkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuICEhY29sLmVkaXREaXNhYmxlZDtcbiAgfVxuXG4gIGdldFNlbGVjdExpc3QoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBBcnJheTxhbnk+IHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLnNlbGVjdE9wdGlvbikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGlmIChvcHQuc2VsZWN0TGlzdE5hbWUgJiYgZGF0YSkge1xuICAgICAgY29uc3QgbGlzdCA9IGRhdGFbb3B0LnNlbGVjdExpc3ROYW1lXTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdCA6IFtdO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHQuc2VsZWN0TGlzdCkgPyBvcHQuc2VsZWN0TGlzdCA6IFtdO1xuICB9XG5cbiAgZ2V0U2VsZWN0T3B0aW9uTGFiZWwoY29sOiBIZFRhYmxlQ29sdW1uLCBpdGVtOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghY29sIHx8ICFjb2wuc2VsZWN0T3B0aW9uIHx8ICFpdGVtKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gY29sLnNlbGVjdE9wdGlvbjtcbiAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bb3B0LnZhbHVlXTtcbiAgICBjb25zdCBsYWJlbCA9IGl0ZW1bb3B0LmxhYmVsXTtcbiAgICBpZiAob3B0LnNob3dMYWJlbEFuZFZhbHVlIHx8IG9wdC5oZFNob3dJdGVtQ29kZSkge1xuICAgICAgcmV0dXJuIGBbJHt2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlfV0ke2xhYmVsID09IG51bGwgPyBcIlwiIDogbGFiZWx9YDtcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVsID09IG51bGwgPyBcIlwiIDogU3RyaW5nKGxhYmVsKTtcbiAgfVxuXG4gIGdldElucHV0TnVtYmVyUHJvcChcbiAgICBjb2w6IEhkVGFibGVDb2x1bW4sXG4gICAga2V5OiBcIm1pblwiIHwgXCJtYXhcIiB8IFwic3RlcFwiIHwgXCJwcmVjaXNpb25cIixcbiAgICBmYWxsYmFjazogbnVtYmVyLFxuICApOiBudW1iZXIge1xuICAgIGlmICghY29sIHx8ICFjb2wuaW5wdXROdW1iZXIpIHtcbiAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICB9XG4gICAgY29uc3QgdmFsID0gY29sLmlucHV0TnVtYmVyW2tleV07XG4gICAgcmV0dXJuIHZhbCAhPSBudWxsID8gTnVtYmVyKHZhbCkgOiBmYWxsYmFjaztcbiAgfVxuXG4gIGlzRGF0ZVNob3dUaW1lKGNvbDogSGRUYWJsZUNvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShjb2wgJiYgY29sLmRhdGVPcHRpb24gJiYgY29sLmRhdGVPcHRpb24uc2hvd1RpbWUpO1xuICB9XG5cbiAgaXNEYXRlU2hvd1RvZGF5KGNvbDogSGRUYWJsZUNvbHVtbik6IGJvb2xlYW4ge1xuICAgIGlmICghY29sIHx8ICFjb2wuZGF0ZU9wdGlvbiB8fCBjb2wuZGF0ZU9wdGlvbi5zaG93VG9kYXkgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBjb2wuZGF0ZU9wdGlvbi5zaG93VG9kYXkgIT09IGZhbHNlO1xuICB9XG5cbiAgZ2V0RGF0ZUZvcm1hdChjb2w6IEhkVGFibGVDb2x1bW4sIGlzUmFuZ2U6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmIChjb2wgJiYgY29sLmRhdGVPcHRpb24gJiYgY29sLmRhdGVPcHRpb24uZm9ybWF0KSB7XG4gICAgICByZXR1cm4gY29sLmRhdGVPcHRpb24uZm9ybWF0O1xuICAgIH1cbiAgICBpZiAoIWlzUmFuZ2UgJiYgdGhpcy5pc0RhdGVTaG93VGltZShjb2wpKSB7XG4gICAgICByZXR1cm4gXCJ5eXl5LU1NLWRkIEhIOm1tOnNzXCI7XG4gICAgfVxuICAgIHJldHVybiBcInl5eXktTU0tZGRcIjtcbiAgfVxuXG4gIGdldERpc2FibGVkRGF0ZShjb2w6IEhkVGFibGVDb2x1bW4pOiAoY3VycmVudDogRGF0ZSkgPT4gYm9vbGVhbiB7XG4gICAgaWYgKGNvbCAmJiBjb2wuZGF0ZU9wdGlvbiAmJiBjb2wuZGF0ZU9wdGlvbi5kaXNhYmxlZERhdGUpIHtcbiAgICAgIHJldHVybiBjb2wuZGF0ZU9wdGlvbi5kaXNhYmxlZERhdGU7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfVxuXG4gIGdldFJhbmdlUGxhY2Vob2xkZXIoY29sOiBIZFRhYmxlQ29sdW1uKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPVxuICAgICAgY29sICYmIGNvbC5kYXRlT3B0aW9uID8gY29sLmRhdGVPcHRpb24ucmFuZ2VQbGFjZWhvbGRlciA6IG51bGw7XG4gICAgaWYgKHBsYWNlaG9sZGVyICYmIHBsYWNlaG9sZGVyLmxlbmd0aCA+PSAyKSB7XG4gICAgICByZXR1cm4gW3BsYWNlaG9sZGVyWzBdLCBwbGFjZWhvbGRlclsxXV07XG4gICAgfVxuICAgIHJldHVybiBbXCLlvIDlp4vml6XmnJ9cIiwgXCLnu5PmnZ/ml6XmnJ9cIl07XG4gIH1cblxuICAvKiogSW5wdXQgLyBJbnB1dE51bWJlciAvIOaXpeacn+WPmOabtO+8muWFiOiusOaXp+WAvOWGjeWGmeWbnuW5tumAmuefpeeItue7hOS7tiAqL1xuICBvbkNlbGxDaGFuZ2UoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSW5saW5lRWRpdChjb2wpIHx8ICFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBjb2wubmFtZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGRhdGFbbmFtZV07XG4gICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIHRoaXMuY2VsbENoYW5nZS5lbWl0KHtcbiAgICAgIGxpbmU6IGRhdGEsXG4gICAgICBjb2wsXG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBwcmV2aW91c1ZhbHVlLFxuICAgIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCDlsZXlvIDvvJrmnIkgb25PcGVuQ2hhbmdlRXZlbnQg5pe25bGV5byA5YWI5riF56m66YCJ6aG55YaN5Zue6LCDIChvcGVuLCBsaW5lKe+8m+WFs+mXreS4jeWbnuiwg+S4muWKoeOAglxuICAgKiDlm57osIPoi6UgcmV0dXJuIOaVsOe7hCAvIFByb21pc2UgLyBPYnNlcnZhYmxl77yM55Sx57uE5Lu25YaZ5ZueIG9wdGlvbnMg5bm2IG1hcmtGb3JDaGVja+OAglxuICAgKi9cbiAgb25TZWxlY3RPcGVuQ2hhbmdlKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCBvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5vbk9wZW5DaGFuZ2VFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3Blbikge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdE9wdGlvbnNPbk9wZW4oY29sLCBkYXRhKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICBjb25zdCBmbiA9IGNvbC5vbk9wZW5DaGFuZ2VFdmVudDtcbiAgICBjb25zdCBkZWJvdW5jZU1zID1cbiAgICAgIGNvbC5vbk9wZW5DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgID8gY29sLm9uT3BlbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lXG4gICAgICAgIDogMDtcbiAgICBpZiAoIWRlYm91bmNlTXMpIHtcbiAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0TG9hZGVyUmVzdWx0KGNvbCwgZGF0YSwgZm4ob3BlbiwgZGF0YSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKGRlYm91bmNlTXMpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmbjogY2IsIG9wZW46IG8sIGxpbmUsIGNvbDogYyB9KSA9PiB7XG4gICAgICAgIGlmIChvKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3RMb2FkZXJSZXN1bHQoYywgbGluZSwgY2IobywgbGluZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJqZWN0Lm5leHQoeyBmbiwgb3BlbiwgbGluZTogZGF0YSwgY29sIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCDmkJzntKLvvJrmnIkgb25TZWFyY2hFdmVudCDml7blm57osIMgKGtleXdvcmQsIGxpbmUp77yM5LiN5riF56m6IG9wdGlvbnPjgIJcbiAgICog5Zue6LCD6IulIHJldHVybiDmlbDnu4QgLyBQcm9taXNlIC8gT2JzZXJ2YWJsZe+8jOeUsee7hOS7tuWGmeWbniBvcHRpb25zIOW5tiBtYXJrRm9yQ2hlY2vjgIJcbiAgICovXG4gIG9uU2VsZWN0U2VhcmNoKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCBrZXl3b3JkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLm9uU2VhcmNoRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZm4gPSBjb2wub25TZWFyY2hFdmVudDtcbiAgICBjb25zdCBkZWJvdW5jZU1zID1cbiAgICAgIGNvbC5vblNlYXJjaEV2ZW50RXZlbnREZWJvdW5jZVRpbWUgIT0gbnVsbFxuICAgICAgICA/IGNvbC5vblNlYXJjaEV2ZW50RXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgOiAwO1xuICAgIGlmICghZGVib3VuY2VNcykge1xuICAgICAgdGhpcy5oYW5kbGVTZWxlY3RMb2FkZXJSZXN1bHQoY29sLCBkYXRhLCBmbihrZXl3b3JkLCBkYXRhKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RTZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RTZWFyY2hTdWJzY3JpcHRpb24gPSB0aGlzLnNlbGVjdFNlYXJjaFN1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZShkZWJvdW5jZU1zKSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZm46IGNiLCBrZXl3b3JkOiBrdywgbGluZSwgY29sOiBjIH0pID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3RMb2FkZXJSZXN1bHQoYywgbGluZSwgY2Ioa3csIGxpbmUpKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0U2VhcmNoU3ViamVjdC5uZXh0KHsgZm4sIGtleXdvcmQsIGxpbmU6IGRhdGEsIGNvbCB9KTtcbiAgfVxuXG4gIC8qKiDlsZXlvIDml7bmuIXnqbrliJcgc2VsZWN0TGlzdCDmiJbooYzkuIogc2VsZWN0TGlzdE5hbWXvvIznlLHkuJrliqHlm57osIPlho3lhpnlhaUgKi9cbiAgcHJpdmF0ZSBjbGVhclNlbGVjdE9wdGlvbnNPbk9wZW4oY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLnNlbGVjdE9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGlmIChvcHQuc2VsZWN0TGlzdCAhPSBudWxsKSB7XG4gICAgICBvcHQuc2VsZWN0TGlzdCA9IFtdO1xuICAgIH1cbiAgICBpZiAob3B0LnNlbGVjdExpc3ROYW1lICYmIGRhdGEpIHtcbiAgICAgIGRhdGFbb3B0LnNlbGVjdExpc3ROYW1lXSA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlpITnkIbliqDovb3lm57osIPov5Tlm57lgLzvvJrmlbDnu4Tnm7TmjqXlhpnlm57vvJtQcm9taXNlL09ic2VydmFibGUg5a6M5oiQ5ZCO5YaZ5Zue77ybdm9pZCDku4UgbWFya0ZvckNoZWNr44CCXG4gICAqIOS8mOWFiOWGmSBzZWxlY3RMaXN0TmFtZe+8jOWQpuWImeWGmeWIl+S4iiBzZWxlY3RMaXN044CCXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNlbGVjdExvYWRlclJlc3VsdChcbiAgICBjb2w6IEhkVGFibGVDb2x1bW4sXG4gICAgZGF0YTogYW55LFxuICAgIHJlc3VsdDogYW55LFxuICApOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0ID09IG51bGwpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICB0aGlzLmFwcGx5U2VsZWN0T3B0aW9ucyhjb2wsIGRhdGEsIHJlc3VsdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmVzdWx0LnRoZW4oXG4gICAgICAgIChsaXN0OiBhbnkpID0+IHRoaXMuYXBwbHlTZWxlY3RPcHRpb25zKGNvbCwgZGF0YSwgbGlzdCksXG4gICAgICAgICgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQuc3Vic2NyaWJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdExvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnNlbGVjdExvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RMb2FkZXJTdWJzY3JpcHRpb24gPSByZXN1bHQuc3Vic2NyaWJlKFxuICAgICAgICAobGlzdDogYW55KSA9PiB0aGlzLmFwcGx5U2VsZWN0T3B0aW9ucyhjb2wsIGRhdGEsIGxpc3QpLFxuICAgICAgICAoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNlbGVjdE9wdGlvbnMoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIGxpc3Q6IGFueSk6IHZvaWQge1xuICAgIGlmICghY29sIHx8ICFjb2wuc2VsZWN0T3B0aW9uIHx8ICFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gY29sLnNlbGVjdE9wdGlvbjtcbiAgICBpZiAob3B0LnNlbGVjdExpc3ROYW1lICYmIGRhdGEpIHtcbiAgICAgIGRhdGFbb3B0LnNlbGVjdExpc3ROYW1lXSA9IGxpc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdC5zZWxlY3RMaXN0ID0gbGlzdDtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogU2VsZWN0IOWPmOabtO+8muWPjOWGmSB2YWx1ZSArIGxhYmVs77yM5bm25bimIHByZXZpb3VzKiAvIG9wdGlvbiAqL1xuICBvblNlbGVjdENoYW5nZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkgfHwgIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGNvbnN0IGxhYmVsRmllbGQgPSBvcHQgJiYgb3B0LmxhYmVsID8gb3B0LmxhYmVsIDogbnVsbDtcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZGF0YVtuYW1lXTtcbiAgICBjb25zdCBwcmV2aW91c0xhYmVsID0gbGFiZWxGaWVsZCA/IGRhdGFbbGFiZWxGaWVsZF0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMuZ2V0U2VsZWN0TGlzdChjb2wsIGRhdGEpO1xuICAgIGNvbnN0IHByZXZpb3VzT3B0aW9uID1cbiAgICAgIHByZXZpb3VzVmFsdWUgPT0gbnVsbCB8fCAhb3B0XG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGxpc3QuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtW29wdC52YWx1ZV0gPT09IHByZXZpb3VzVmFsdWUpIHx8XG4gICAgICAgICAgbnVsbDtcbiAgICBjb25zdCBvcHRpb24gPVxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCAhb3B0XG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGxpc3QuZmluZCgoaXRlbSkgPT4gaXRlbSAmJiBpdGVtW29wdC52YWx1ZV0gPT09IHZhbHVlKSB8fCBudWxsO1xuXG4gICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIGxldCBsYWJlbDogYW55ID0gdW5kZWZpbmVkO1xuICAgIGlmIChsYWJlbEZpZWxkKSB7XG4gICAgICBsYWJlbCA9IG9wdGlvbiA/IG9wdGlvbltvcHQubGFiZWxdIDogbnVsbDtcbiAgICAgIGRhdGFbbGFiZWxGaWVsZF0gPSBsYWJlbDtcbiAgICB9XG5cbiAgICB0aGlzLmNlbGxDaGFuZ2UuZW1pdCh7XG4gICAgICBsaW5lOiBkYXRhLFxuICAgICAgY29sLFxuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgcHJldmlvdXNWYWx1ZSxcbiAgICAgIGxhYmVsLFxuICAgICAgcHJldmlvdXNMYWJlbCxcbiAgICAgIG9wdGlvbixcbiAgICAgIHByZXZpb3VzT3B0aW9uLFxuICAgIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=
4055
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFudGFzeS1uZ3pvcnJvLyIsInNvdXJjZXMiOlsiaGQtdGFibGUvaGQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsWUFBWSxHQUdiLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHFCQUFxQixHQUN0QixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFJTCxnQkFBZ0IsRUFDaEIsUUFBUSxHQUNULE1BQU0sb0JBQW9CLENBQUM7Ozs7O0lBR3RCLGdCQUFnQixHQUFHLEVBQUU7Ozs7O0FBRzNCLHNDQVNDOzs7Ozs7SUFQQywwQ0FBdUI7Ozs7O0lBRXZCLDZDQUFtQjs7Ozs7SUFFbkIsK0NBQXFCOzs7OztJQUVyQiwwQ0FBaUI7Ozs7Ozs7QUFJbkIsU0FBUyxXQUFXLENBQUMsYUFBcUI7SUFDeEMsT0FBTztRQUNMLE9BQU8sRUFBSyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFJO1FBQ3hDLFVBQVUsRUFBRSxDQUFDO1FBQ2IsWUFBWSxFQUFFLGFBQWE7UUFDM0IsT0FBTyxFQUFFLEtBQUs7S0FDZixDQUFDO0FBQ0osQ0FBQzs7Ozs7OztBQUdELFNBQVMsV0FBVyxDQUNsQixjQUFzQixFQUN0QixhQUFxQjs7UUFFZixVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsY0FBYyxHQUFHLGFBQWEsQ0FBQztJQUM5RCxPQUFPO1FBQ0wsT0FBTyxFQUFLLGNBQWMsT0FBSTtRQUM5QixVQUFVLFlBQUE7UUFDVixZQUFZLEVBQUUsYUFBYSxHQUFHLFVBQVU7UUFDeEMsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDO0FBQ0osQ0FBQztBQUVEO0lBa0tFLDBCQUNVLE1BQWtCLEVBQ2xCLEdBQXNCLEVBQ3RCLG9CQUEwQztRQUhwRCxpQkFXQztRQVZTLFdBQU0sR0FBTixNQUFNLENBQVk7UUFDbEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQTdKM0MsY0FBUyxHQUF5QixFQUFFLENBQUM7UUFFckIsaUJBQVksR0FBWSxLQUFLLENBQUM7Ozs7UUFJOUMsZUFBVSxHQUF5QixVQUFVLENBQUM7UUFDOUIsNkJBQXdCLEdBQVksS0FBSyxDQUFDOzs7O1FBRTFDLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ2hDLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBRzlDLGdCQUFXLEdBQVcsWUFBWSxDQUFDOztRQVluQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQU8vQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMvQixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQzs7OztRQUV0QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFDcEQsaUJBQVksR0FBWSxLQUFLLENBQUM7Ozs7UUFFZCxlQUFVLEdBQVksSUFBSSxDQUFDOzs7Ozs7O1FBTzNCLG9CQUFlLEdBQVksS0FBSyxDQUFDOztRQUVqRCxtQkFBYyxHQUFXLENBQUMsQ0FBQztRQUMzQixrQkFBYSxHQUFXLEdBQUcsQ0FBQztRQUczQix5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQy9DLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDOUMsNkJBQXdCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQU03RCxXQUFNLEdBQUcsSUFBSSxDQUFDOztRQUdkLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNoQyxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixzQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDdkIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFFbkIsbUJBQWMsR0FBK0IsRUFBRSxDQUFDO1FBQ2hELG1CQUFjLEdBQTJCLEVBQUUsQ0FBQzs7UUFFNUMseUJBQW9CLEdBQUcsRUFBRSxDQUFDOztRQUUxQixxQkFBZ0IsR0FBcUIsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBRzVELG1CQUFjLEdBQXlCLEVBQUUsQ0FBQztRQUMxQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLHVCQUFrQixHQUFvQixFQUFFLENBQUM7UUFDekMsNEJBQXVCLEdBQW9CLEVBQUUsQ0FBQztRQUM5QyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUUvQixzQkFBaUIsR0FBWSxLQUFLLENBQUM7O1FBRW5DLGlCQUFZLEdBQW9CLEVBQUUsQ0FBQzs7UUFFbkMsa0JBQWEsR0FBb0IsRUFBRSxDQUFDOztRQUdwQyx1QkFBa0IsR0FBb0IsRUFBRSxDQUFDO1FBQ3pDLHdCQUFtQixHQUFvQixFQUFFLENBQUM7UUFDMUMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixnQkFBVyxHQUFRLElBQUksQ0FBQztRQUN4QixpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUMxQiw0QkFBdUIsR0FBWSxJQUFJLENBQUM7UUFDeEMsMkJBQXNCLEdBQVksS0FBSyxDQUFDOzs7O1FBR3hDLDRCQUF1QixHQUFHLEVBQUUsQ0FBQzs7OztRQUdyQix3QkFBbUIsR0FBbUIsSUFBSSxDQUFDOzs7O1FBR25ELHVCQUFrQixHQUFHLENBQUMsQ0FBQzs7OztRQUd2QixvQkFBZSxHQUFHLENBQUMsQ0FBQzs7OztRQUdwQixvQkFBZSxHQUFHLEtBQUssQ0FBQzs7OztRQUdoQixvQkFBZSxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDOzs7O1FBR3hELDBCQUFxQixHQUFHLEtBQUssQ0FBQzs7OztRQUc5QixtQkFBYyxHQUFXLElBQUksQ0FBQztRQUM5QixxQkFBZ0IsR0FBVyxJQUFJLENBQUM7UUFJaEMsK0JBQTBCLEdBQWdCLElBQUksQ0FBQztRQUMvQyw2QkFBd0IsR0FBZSxJQUFJLENBQUM7UUFDNUMseUJBQW9CLEdBQUcsQ0FBQyxDQUFDOzs7O1FBR2pDLDJCQUFzQixHQUFHLEtBQUssQ0FBQzs7OztRQUd2Qix3QkFBbUIsR0FBUSxJQUFJLENBQUM7UUFDaEMsMEJBQXFCLEdBQWUsSUFBSSxDQUFDO1FBQ3pDLHVCQUFrQixHQUFRLElBQUksQ0FBQzs7OztRQUcvQiw0QkFBdUIsR0FBRyxJQUFJLE9BQU8sRUFLekMsQ0FBQztRQUVHLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUtyQyxDQUFDOzs7OztRQTZRSSx1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUF5SWpDLGVBQVU7Ozs7O1FBQUcsVUFBQyxLQUFhLEVBQUUsSUFBUzs7Z0JBQzlCLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUksQ0FBQyxXQUFXLENBQUM7WUFDMUMsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQU8sS0FBTyxDQUFDO1FBQ3BELENBQUMsRUFBQzs7OztRQUdGLHNCQUFpQjs7OztRQUFHLFVBQUMsS0FBYSxJQUFhLE9BQUEsS0FBSyxFQUFMLENBQUssRUFBQztRQUVyRCxlQUFVOzs7OztRQUFHLFVBQUMsTUFBYyxFQUFFLEdBQWtCO1lBQzlDLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNuQixDQUFDLEVBQUM7O1FBcVlGLGVBQVU7Ozs7UUFBRyxVQUFDLEdBQTRCO1lBQ3hDLElBQ0UsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtnQkFDeEIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUM1QixHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsRUFDYjtnQkFDQSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsQjtpQkFBTTs7b0JBQ0QsSUFBSSxHQUFhLElBQUksUUFBUSxFQUFFO2dCQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDekMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzs7O29CQUVuQyxhQUFhLEdBQUcsS0FBSSxDQUFDLFlBQVksQ0FBQyxTQUFTOzs7O2dCQUFDLFVBQUMsSUFBSTtvQkFDbkQsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDakQsQ0FBQyxFQUFDOzs7b0JBRUUsU0FBUyxHQUNYLEtBQUksQ0FBQyxZQUFZLENBQUMsU0FBUzs7OztnQkFBQyxVQUFDLElBQUk7b0JBQy9CLE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQzdDLENBQUMsRUFBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUNyQyxLQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM3QyxLQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDdEIsU0FBUyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUM5RCxDQUFDLENBQ0YsQ0FBQztnQkFDRixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDbEM7UUFDSCxDQUFDLEVBQUM7UUEzekJBLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQztZQUM1QyxNQUFNLEVBQUUsV0FBVyxDQUFDLFNBQVM7WUFDN0IsSUFBSSxFQUFFLFNBQVM7O1lBQ2YsT0FBTyxFQUFFLEdBQUc7O1lBQ1osU0FBUyxFQUFFLGVBQWU7U0FDM0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7OztJQUVELHNDQUFXOzs7SUFBWDtRQUNFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFO1lBQ3JDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNqRDtRQUNELElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFO1lBQ2pDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM3QztRQUNELElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFO1lBQ2pDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFRCx5RUFBeUU7Ozs7O0lBQ3pFLHVDQUFZOzs7O0lBQVo7UUFDRSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7Ozs7SUFFRCxtQ0FBUTs7O0lBQVI7UUFBQSxpQkFvQ0M7UUFuQ0MsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssS0FBSyxFQUFFO1lBQ3JDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7U0FDeEQ7UUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLEVBQUU7WUFDbkMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztTQUN0RDtRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDM0Q7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQ3JELDhCQUE4QixDQUMvQixDQUFDO1FBQ0YsV0FBVztRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUc7Z0JBQ2pCLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFdBQVc7YUFDYixLQUFLLEVBQUU7YUFDUCxJQUFJOzs7UUFBQztZQUNKLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUMsRUFBQzthQUNELEtBQUs7Ozs7UUFBQyxVQUFVLENBQUM7WUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QyxNQUFNLGlCQUFpQixDQUFDO1FBQzFCLENBQUMsRUFBQyxDQUFDO0lBQ1AsQ0FBQzs7Ozs7SUFFRCxzQ0FBVzs7OztJQUFYLFVBQVksT0FBcUI7UUFBakMsaUJBa0ZDO1FBakZDLElBQ0UsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUNyQixPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksSUFBSTtZQUM5QyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsY0FBYyxDQUFDO2dCQUNuQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQ3hDO1lBQ0EsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO1FBQ0QsSUFDRSxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztZQUMzQixPQUFPLENBQUMsZ0JBQWdCLENBQUM7WUFDekIsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUN4QixPQUFPLENBQUMsV0FBVyxDQUFDLEVBQ3BCO1lBQ0EsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUI7UUFFRCxJQUNFLE9BQU87WUFDUCxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxjQUFjLENBQUM7WUFDcEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUNyQztZQUNBLElBQ0UsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztnQkFDOUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFVBQVUsQ0FBQztnQkFDbkQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFlBQVksQ0FBQztvQkFDaEQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUNyRDtnQkFDQSxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2dCQUNsQyxvREFBb0Q7Z0JBQ3BELGlDQUFpQztnQkFDakMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqQyxxQ0FBcUM7Z0JBQ3JDLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO2dCQUN2QyxPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUNoQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDcEI7U0FDRjtRQUVELElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7WUFDbEMseUJBQXlCO1lBQ3pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyx1QkFBdUI7WUFDdkIsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7U0FDeEM7UUFFRCxJQUNFLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsWUFBWSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDcEQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQ2hEO1lBQ0EsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDbEQsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLFdBQVc7aUJBQ2IsS0FBSyxFQUFFO2lCQUNQLElBQUk7OztZQUFDO2dCQUNKLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLENBQUMsRUFBQztpQkFDRCxLQUFLOzs7O1lBQUMsVUFBVSxDQUFDO2dCQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLGlCQUFpQixDQUFDO1lBQzFCLENBQUMsRUFBQyxDQUFDO1NBQ047UUFFRCxJQUNFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUM3RCxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsV0FBVyxDQUFDLEVBQ3ZFO1lBQ0EsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUdELHNCQUFJLGdEQUFrQjtRQUR0QixrQ0FBa0M7Ozs7O1FBQ2xDO1lBQ0UsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNyRCxDQUFDOzs7T0FBQTs7OztJQUVELHlDQUFjOzs7SUFBZDtRQUNFLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTs7OztRQUFDLFVBQUMsSUFBSTtZQUMxQyxtQ0FBbUM7WUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxnQ0FBZ0M7WUFDaEMsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQztRQUM5QixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRUQsK0JBQUk7Ozs7SUFBSixVQUFLLElBQW9DO1FBQ3ZDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7Ozs7O0lBRUQscUNBQVU7Ozs7SUFBVixVQUFXLEdBQWtCO1FBQzNCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNoRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pFLENBQUM7Ozs7SUFFRCwyQ0FBZ0I7OztJQUFoQjtRQUNFLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxzQkFBSSxzREFBd0I7Ozs7UUFBNUI7WUFDRSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxFQUFFO2dCQUM1RCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7YUFDN0I7WUFDRCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUN0QyxDQUFDOzs7T0FBQTtJQUVEOzs7T0FHRzs7Ozs7OztJQUNLLDhDQUFtQjs7Ozs7O0lBQTNCO1FBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7O09BR0c7Ozs7Ozs7SUFDSyw2Q0FBa0I7Ozs7OztJQUExQjs7WUFDUSxPQUFPLEdBQ1gsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7O1lBQ2xFLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzVCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDZCxPQUFPLENBQUMsQ0FBQztTQUNWOztZQUNLLFFBQVEsR0FDWixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs7WUFDNUQsU0FBUyxHQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUM3RCxLQUFLLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUTtRQUN4QyxJQUFJLEtBQUssSUFBSSxLQUFLLEVBQUU7WUFDbEIsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFHRCxzQkFBSSxpREFBbUI7UUFEdkIsOEJBQThCOzs7OztRQUM5Qjs7Z0JBQ1EsUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMxQyxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUU7Z0JBQ2pCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7O2dCQUNLLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7O2dCQUN0QyxlQUFlLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0I7WUFDaEUsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7Z0JBQ2pDLE9BQU8sZUFBZSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO2FBQ3pEO1lBQ0QsT0FBTyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLENBQUM7OztPQUFBO0lBR0Qsc0JBQUksOENBQWdCO1FBRHBCLHNDQUFzQzs7Ozs7UUFDdEM7WUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdkIsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ2xDLENBQUM7OztPQUFBOzs7OztJQUVELHlDQUFjOzs7O0lBQWQsVUFBZSxHQUFrQjtRQUMvQixPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFHLEdBQUcsQ0FBQyxlQUFlLElBQUksQ0FBQyxRQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4RSxDQUFDOzs7OztJQUVELHdDQUFhOzs7O0lBQWIsVUFBYyxHQUFrQjtRQUM5QixPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFHLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxRQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNsRSxDQUFDO0lBU0Qsc0JBQUksNENBQWM7UUFEbEIsOEJBQThCOzs7OztRQUM5QjtZQUNFLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzNELENBQUM7OztPQUFBO0lBRUQsc0JBQUksa0RBQW9COzs7O1FBQXhCO1lBQ0UsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQ3hDLENBQUM7OztPQUFBO0lBTUQsc0JBQUksZ0RBQWtCO1FBSnRCOzs7V0FHRzs7Ozs7O1FBQ0g7WUFDRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQzs7O09BQUE7Ozs7OztJQUVPLHVDQUFZOzs7OztJQUFwQixVQUFxQixHQUFrQjtRQUNyQyxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUVELCtCQUErQjs7Ozs7OztJQUN2Qiw4Q0FBbUI7Ozs7OztJQUEzQixVQUE0QixHQUFrQjtRQUM1QyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUNqRSxDQUFDO0lBRUQsb0NBQW9DOzs7Ozs7SUFDNUIsbURBQXdCOzs7OztJQUFoQztRQUFBLGlCQWNDOztZQWJLLEtBQUssR0FBRyxDQUFDO1FBQ2IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQztTQUMzQjtRQUNELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixLQUFLLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQ2xDO1FBQ0QsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLEdBQUc7WUFDakMsSUFBSSxLQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQixLQUFLLElBQUksS0FBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3hDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxpREFBaUQ7Ozs7OztJQUNqRCw2Q0FBa0I7Ozs7O0lBQWxCLFVBQW1CLEdBQWtCOztZQUM3QixRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQztRQUM5QyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sUUFBUSxDQUFDO1NBQ2pCOztZQUNLLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDM0MsT0FBTyxRQUFRLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7Ozs7Ozs7O0lBQ0ssaURBQXNCOzs7Ozs7O0lBQTlCLFVBQStCLFVBQWtCO1FBQWpELGlCQThDQztRQTdDQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakMsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQ2hFLE9BQU87U0FDUjs7WUFDSyxLQUFLLEdBS04sRUFBRTs7WUFDSCxXQUFXLEdBQUcsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLEdBQUc7WUFDekIsSUFBSSxDQUFDLEtBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzNCLE9BQU87YUFDUjs7Z0JBQ0ssUUFBUSxHQUFHLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUM7WUFDOUMsV0FBVyxJQUFJLFFBQVEsQ0FBQztZQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFBLEVBQUUsUUFBUSxVQUFBLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRCxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDckMsT0FBTztTQUNSOztZQUNHLFFBQVEsR0FBRyxDQUFDO1FBQ2hCLEtBQUssQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxJQUFJOztnQkFDWCxLQUFLLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVc7WUFDeEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDL0IsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsQ0FBQyxFQUFDLENBQUM7O1lBQ0MsTUFBTSxHQUFHLFVBQVUsR0FBRyxRQUFRO1FBQ2xDLEtBQUs7YUFDRixLQUFLLEVBQUU7YUFDUCxJQUFJOzs7OztRQUFDLFVBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBZixDQUFlLEVBQUM7YUFDL0IsT0FBTzs7OztRQUFDLFVBQUMsSUFBSTtZQUNaLElBQUksTUFBTSxJQUFJLENBQUMsRUFBRTtnQkFDZixPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNoQixNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxFQUFDLENBQUM7UUFDTCxLQUFLLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsSUFBSTtZQUNqQixJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUNsQixLQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNoRDtRQUNILENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDBEQUEwRDs7Ozs7OztJQUNsRCxnREFBcUI7Ozs7OztJQUE3QixVQUE4QixNQUErQjtRQUMzRCxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDaEQsQ0FBQztJQUdELHNCQUFJLG1EQUFxQjtRQUR6Qiw2Q0FBNkM7Ozs7O1FBQzdDO1lBQ0UsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzNCLE9BQU8sTUFBTSxDQUFDO2FBQ2Y7WUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNqQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUM7b0JBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSTtvQkFDaEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNmLENBQUM7OztPQUFBO0lBRUQseUJBQXlCOzs7Ozs7SUFDekIsd0NBQWE7Ozs7O0lBQWIsVUFBYyxLQUFhOztZQUNuQixJQUFJLEdBQ1IsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBQzdELElBQUksR0FDUixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFDM0QsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Ozs7SUFjRCw2Q0FBa0I7OztJQUFsQjtRQUFBLGlCQTRDQztRQTNDQyxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLFdBQVc7YUFDYixPQUFPLENBQ04sV0FBVztZQUNULElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUTtZQUN6QixHQUFHO1lBQ0gsSUFBSSxDQUFDLFlBQVk7WUFDakIsR0FBRztZQUNILElBQUksQ0FBQyxJQUFJLENBQ1o7YUFDQSxJQUFJOzs7O1FBQUMsVUFBQyxLQUF1QjtZQUM1QixJQUFJLEtBQUssRUFBRTtnQkFDVCxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QixLQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFDakMsSUFDRSxLQUFJLENBQUMsVUFBVTtvQkFDZixLQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUTtvQkFDOUIsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxFQUFFLEVBQ25DO29CQUNBLEtBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztvQkFDcEQsS0FBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ25EO2FBQ0Y7aUJBQU07Z0JBQ0wsS0FBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDL0MsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxLQUFJLENBQUMsYUFBYSxDQUFDO2FBQ3JEO1lBQ0QsZ0RBQWdEO1lBQ2hELElBQ0UsS0FBSSxDQUFDLFVBQVU7Z0JBQ2YsQ0FBQyxLQUFJLENBQUMsZUFBZTtnQkFDckIsS0FBSSxDQUFDLHVCQUF1QixFQUM1QjtnQkFDQSxLQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN4RDtpQkFBTTtnQkFDTCxLQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO2FBQ3JDO1lBQ0QsS0FBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLENBQUMsRUFBQzthQUNELEtBQUs7Ozs7UUFBQyxVQUFDLEdBQUc7WUFDVCxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQy9DLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEdBQUcsS0FBSSxDQUFDLGFBQWEsQ0FBQztZQUNwRCxLQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxFQUFDLENBQUM7SUFDUCxDQUFDOzs7O0lBRUQsb0NBQVM7OztJQUFUO1FBQ0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxNQUFNLCtDQUErQyxDQUFDO1NBQ3ZEO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7SUFFRCw4QkFBOEI7Ozs7OztJQUM5QiwrQ0FBb0I7Ozs7O0lBQXBCLFVBQXFCLFlBQW9CO1FBQXBCLDZCQUFBLEVBQUEsb0JBQW9COztZQUNqQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjs7WUFDbEMsV0FBVyxHQUNmLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJO1lBQ2pDLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxVQUFVO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUM7UUFFdEMsSUFBSSxZQUFZLElBQUksV0FBVyxFQUFFO1lBQy9CLCtCQUErQjtZQUMvQix5REFBeUQ7WUFDekQseUNBQXlDO1lBQ3pDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlCLE9BQU87U0FDUjs7WUFFSyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs7WUFDM0MsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDOztZQUNaLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOztZQUMzQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRCwrQ0FBK0M7UUFDL0MsaUVBQWlFO1FBQ2pFLDBEQUEwRDtRQUMxRCxJQUFJLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCw4Q0FBOEM7Ozs7Ozs7SUFDdEMsdUNBQVk7Ozs7OztJQUFwQixVQUFxQixVQUFtQjtRQUF4QyxpQkFZQztRQVhDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsVUFBVTs7O1FBQUM7WUFDVCxLQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixLQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLFVBQVU7OztZQUFDO2dCQUNULEtBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEIsS0FBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDeEIsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BDLENBQUMsRUFBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsd0RBQXdEOzs7Ozs7O0lBQ2hELG9EQUF5Qjs7Ozs7O0lBQWpDLFVBQWtDLFVBQW1COztZQUM3QyxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFOztZQUN0QyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDNUMsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLEdBQUEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLENBQUMsR0FBQTtZQUNELENBQUMsRUFBRSxrQkFBZ0IsU0FBUyxRQUFLO1NBQ2xDLENBQUM7SUFDSixDQUFDOzs7Ozs7SUFFTywyQ0FBZ0I7Ozs7O0lBQXhCLFVBQXlCLFVBQW1CO1FBQTVDLGlCQWlCQztRQWhCQyxJQUFJLFVBQVUsRUFBRTtZQUNkLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLDhCQUE4QjtZQUM5QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqQyxPQUFPO2FBQ1I7U0FDRjtRQUNELFVBQVU7OztRQUFDO1lBQ1QsS0FBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDNUIsS0FBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDdEMsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7OztJQUVELHVEQUE0Qjs7OztJQUE1QixVQUE2QixZQUFvQjtRQUFqRCxpQkFtQ0M7UUFuQzRCLDZCQUFBLEVBQUEsb0JBQW9CO1FBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDMUIsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3pCO1lBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDcEMsT0FBTztTQUNSO1FBQ0QsVUFBVTs7O1FBQUM7O2dCQUNILFFBQVEsR0FDWixLQUFJLENBQUMsZ0JBQWdCLElBQUksS0FBSSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QjtZQUN6RSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNiLEtBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QixLQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztnQkFDcEMsT0FBTzthQUNSOztnQkFDSyxRQUFRLEdBQUcsS0FBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQztZQUMxRCxJQUFJLFFBQVEsRUFBRTtnQkFDWixLQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLEtBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3hCLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUM3QixVQUFVOzs7Z0JBQUM7b0JBQ1QsS0FBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUMxQyxLQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDNUIsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQzdCLEtBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2dCQUN0QyxDQUFDLEVBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUM3QixLQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUIsS0FBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7YUFDckM7UUFDSCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx3QkFBd0I7Ozs7OztJQUNoQixrREFBdUI7Ozs7O0lBQS9CO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQixPQUFPO1NBQ1I7O1lBQ0ssT0FBTyxHQUFHLG1CQUFBLElBQUksQ0FBQyxnQkFBZ0IsRUFBTzs7WUFDdEMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0I7UUFDL0QsSUFBSSxRQUFRLEVBQUU7WUFDWixJQUFJLE9BQU8sQ0FBQyxtQkFBQSxRQUFRLEVBQU8sQ0FBQyxDQUFDLGNBQWMsS0FBSyxVQUFVLEVBQUU7Z0JBQzFELENBQUMsbUJBQUEsUUFBUSxFQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxtQkFBQSxRQUFRLEVBQU8sQ0FBQyxDQUFDLGFBQWEsS0FBSyxVQUFVLEVBQUU7Z0JBQ3pELENBQUMsbUJBQUEsUUFBUSxFQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEM7O2dCQUNLLFVBQVUsR0FDZCxRQUFRLENBQUMsVUFBVTtnQkFDbkIsQ0FBQyxtQkFBQSxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBZSxDQUFDO1lBQ3BELElBQUksVUFBVSxFQUFFO2dCQUNkLFVBQVUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2FBQzFCO1NBQ0Y7O1lBQ0ssY0FBYyxHQUFHO1lBQ3JCLE9BQU8sQ0FBQyx5QkFBeUI7WUFDakMsT0FBTyxDQUFDLHNCQUFzQjtZQUM5QixPQUFPLENBQUMsZ0JBQWdCLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWE7U0FDbkU7UUFDRCxjQUFjLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsRUFBZTtZQUNyQyxJQUFJLEVBQUUsRUFBRTtnQkFDTixFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQzthQUNsQjtRQUNILENBQUMsRUFBQyxDQUFDOztZQUNHLFNBQVMsR0FDYixPQUFPLENBQUMsZ0JBQWdCO1lBQ3hCLENBQUMsbUJBQUEsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBZSxDQUFDO1FBQ3pELElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxPQUFPO1NBQ1I7O1lBQ0ssS0FBSyxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FDdEMsOENBQThDLENBQy9DO1FBQ0QsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUs7Ozs7UUFBRSxVQUFDLEVBQWU7WUFDbEQsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7O0lBQ0ssMERBQStCOzs7Ozs7SUFBdkM7UUFBQSxpQkFXQzs7O1lBVE8sTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7UUFDM0IsTUFBTSxDQUFDLE9BQU87Ozs7O1FBQUMsVUFBQyxFQUFFLEVBQUUsS0FBSztZQUN2QixVQUFVOzs7WUFBQztnQkFDVCxLQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQy9CLEtBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7aUJBQ3BDO1lBQ0gsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7OztJQUVPLHVEQUE0Qjs7OztJQUFwQztRQUNFLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDL0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELHlDQUF5Qzs7Ozs7O0lBQ3pDLGlEQUFzQjs7Ozs7SUFBdEIsVUFBdUIsS0FBYTtRQUFiLHNCQUFBLEVBQUEsYUFBYTtRQUNsQyxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3RFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7O1lBQ0ssUUFBUSxHQUNaLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCOztZQUNuRSxTQUFTLEdBQ2IsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixDQUFDLG1CQUFBLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBZSxDQUFDOztZQUN6RCxHQUFHLEdBQ1AsQ0FBQyxRQUFRO1lBQ1AsQ0FBQyxtQkFBQSxDQUFDLG1CQUFBLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFlLENBQUMsQ0FBQyxhQUFhLENBQy9ELHlCQUF5QixDQUMxQixFQUFlLENBQUMsQ0FBQztZQUNwQixDQUFDLFNBQVMsSUFBSSxDQUFDLG1CQUFBLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQWUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksSUFBSSxDQUFDLEVBQUU7WUFDakMsT0FBTyxLQUFLLENBQUM7U0FDZDs7WUFDSyxNQUFNLEdBQUcsR0FBRyxDQUFDLFlBQVk7UUFDL0IsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQzNDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFVBQVU7Ozs7O0lBQ1YseUNBQWM7Ozs7O0lBQWQ7UUFDRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxVQUFVOzs7OztJQUNWLDBDQUFlOzs7OztJQUFmO1FBQ0UsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7OztJQUVELHNDQUFXOzs7SUFBWDtRQUFBLGlCQVNDO1FBUkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxJQUFJO1lBQzdCLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFNBQVM7Ozs7O0lBQ1Qsa0NBQU87Ozs7O0lBQVA7UUFBQSxpQkFnRkM7UUEvRUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDbkIsSUFBQTs7Ozs7Ozs7Ozs7Ozs4Q0FVSCxFQVZLLHdCQUFTLEVBQUUsa0JBVWhCO1lBQ0QsTUFBTSxDQUFDLElBQUk7Ozs7O1lBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQ0wsS0FBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDM0MsS0FBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUM1QyxDQUFDO1lBQ0osQ0FBQyxFQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Ozs7O1FBQUMsVUFBQyxPQUFPLEVBQUUsS0FBSztZQUNwQyxJQUFJLEtBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTtnQkFDdkIsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUNqRSxDQUFDLENBQUMsSUFBSTtvQkFDTixDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNWLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtvQkFDbEIsS0FBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7d0JBQ3JCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSzt3QkFDcEIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxLQUFLO3dCQUNsQixRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLOzt3QkFFdEMsT0FBTyxFQUFFLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7NEJBQ3pELENBQUMsQ0FBQyxJQUFJOzRCQUNOLENBQUMsQ0FBQyxLQUFLO3FCQUNWLENBQUMsQ0FBQztpQkFDSjtxQkFBTTtvQkFDTCxLQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQzt3QkFDdEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO3dCQUNwQixHQUFHLEVBQUUsT0FBTyxDQUFDLEtBQUs7d0JBQ2xCLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7O3dCQUV0QyxPQUFPLEVBQUUsS0FBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQzs0QkFDekQsQ0FBQyxDQUFDLElBQUk7NEJBQ04sQ0FBQyxDQUFDLEtBQUs7cUJBQ1YsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO29CQUNyQixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7b0JBQ3BCLEdBQUcsRUFBRSxPQUFPLENBQUMsS0FBSztvQkFDbEIsT0FBTyxFQUFFLElBQUk7O29CQUViLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7aUJBQ3ZDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFFSCxZQUFZO1FBQ1osSUFDRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTO1lBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDMUM7WUFDQSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Ozs7WUFBQyxVQUFDLEdBQUc7Z0JBQ3pCLElBQUksS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUNsRCxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDNUQ7WUFDSCxDQUFDLEVBQUMsQ0FBQztTQUNKO1FBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLFVBQVU7OztRQUFDO1lBQ1QsS0FBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDNUIsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7Ozs7Ozs7SUFxQ0QsNENBQWlCOzs7Ozs7O0lBQWpCLFVBQWtCLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxHQUFHOztZQUMxRCxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztZQUMxQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFNBQVM7Ozs7UUFDcEMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLENBQUMsS0FBSyxLQUFLLGtCQUFrQixFQUFqQyxDQUFpQyxFQUM1Qzs7WUFDSyxZQUFZLEdBQUcsUUFBUSxDQUFDLFNBQVM7Ozs7UUFDckMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLENBQUMsS0FBSyxLQUFLLGtCQUFrQixFQUFqQyxDQUFpQyxFQUM1Qzs7WUFDSyxRQUFRLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVzs7O1lBRXBELGNBQWMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDdkQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsT0FBTzs7Ozs7O0lBQ1Asc0NBQVc7Ozs7OztJQUFYLFVBQVksS0FBd0I7UUFDbEMseUNBQXlDO1FBQ3pDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFOztnQkFDekIsSUFBSSxHQUFhLElBQUksUUFBUSxFQUFFO1lBQ25DLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUk7Ozs7WUFBQyxVQUFDLElBQUk7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDaEQsQ0FBQyxFQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzs7O2dCQUVoQixPQUFLLEdBQUcsSUFBSTtZQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN4RCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLE9BQU8sRUFBRTtvQkFDNUMsT0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUNyQyxNQUFNO2lCQUNQO2FBQ0Y7O2dCQUNHLGlCQUFpQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsT0FBSyxFQUFFO2dCQUNWLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5QjtpQkFBTTs7b0JBQ0MsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUzs7OztnQkFDdkMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLENBQUMsS0FBSyxLQUFLLE9BQUssRUFBcEIsQ0FBb0IsRUFDL0I7Z0JBQ0QsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDMUM7WUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLGlCQUFpQixDQUFDO1lBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNOzs7O1lBQUMsVUFBQyxJQUFJO2dCQUNsRCxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2hELENBQUMsRUFBQyxDQUFDO1NBQ0o7YUFBTTs7Ozs7Z0JBSUQsbUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTzs7OztZQUFDLFVBQUMsSUFBSTtnQkFDN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTs7d0JBQ3BDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2xELFNBQVMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO29CQUMxQixtQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ25DO1lBQ0gsQ0FBQyxFQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLG1CQUFpQixDQUFDO1lBRXZDLDBDQUEwQztZQUMxQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTs7OztZQUFDLFVBQUMsSUFBSTtnQkFDaEQsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNoRCxDQUFDLEVBQUMsQ0FBQztTQUNKO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsMENBQTBDOzs7OztJQUMxQywyQ0FBZ0I7Ozs7O0lBQWhCO1FBQUEsaUJBY0M7O1lBYkssaUJBQWlCLEdBQW9CLEVBQUU7UUFDM0MsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsSUFBSTtZQUMvQixJQUFJLENBQUMsS0FBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFOztvQkFDaEQsUUFBUSxHQUFhLElBQUksUUFBUSxFQUFFO2dCQUN2QyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQzVCLFFBQVEsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDMUIsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDOUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsRUFBQyxDQUFDO1FBQ0gsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDOzs7O0lBRUQsbUNBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTzs7OztZQUFDLFVBQUMsSUFBSTs7b0JBQ3BCLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztnQkFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztnQkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO2dCQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsQ0FBQyxzQkFBc0I7Z0JBQzNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDNUIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztnQkFDNUIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsQ0FBQyxFQUFDLENBQUM7U0FDSjs7O1lBRUssYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTs7OztRQUFDLFVBQUMsR0FBRyxJQUFLLE9BQUEsR0FBRyxDQUFDLEtBQUssS0FBSyxNQUFNLEVBQXBCLENBQW9CLEVBQUM7O1lBQ3BFLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07Ozs7UUFDMUMsVUFBQyxHQUFHLElBQUssT0FBQSxHQUFHLENBQUMsS0FBSyxLQUFLLE9BQU8sRUFBckIsQ0FBcUIsRUFDL0I7O1lBQ0ssVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTs7OztRQUFDLFVBQUMsR0FBRyxJQUFLLE9BQUEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFWLENBQVUsRUFBQzs7WUFDdkQsVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUMxRSxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDNUQsWUFBWTtZQUNaLElBQUksQ0FBQyxjQUFjLG9CQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7Ozs7SUFFRCxvREFBeUI7OztJQUF6QjtRQUFBLGlCQVVDO1FBVEMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUU7WUFDcEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztTQUM3RDthQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLFlBQVksR0FBRyxDQUFDLEVBQUU7O2dCQUN0RCxXQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWtCO1lBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU87Ozs7WUFBQyxVQUFDLEdBQUc7Z0JBQ3ZELFdBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQUEsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwRSxDQUFDLEVBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsV0FBUyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQzs7Ozs7SUFFTyx1Q0FBWTs7OztJQUFwQjtRQUNFLE9BQU8sQ0FBQyxDQUFDLENBQ1AsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSTtZQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQ3RDLENBQUM7SUFDSixDQUFDOzs7O0lBRUQsK0NBQW9COzs7SUFBcEI7UUFDRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FDdEIsV0FBVztZQUNULElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUTtZQUN6QixHQUFHO1lBQ0gsSUFBSSxDQUFDLFlBQVk7WUFDakIsR0FBRztZQUNILElBQUksQ0FBQyxJQUFJLEVBQ1gsSUFBSSxDQUFDLGdCQUFnQixDQUN0QixDQUFDO0lBQ0osQ0FBQzs7OztJQUVELDBDQUFlOzs7SUFBZjtRQUNFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNsRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO29CQUN2RCxNQUFNLDRDQUFpQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssa0JBQUssQ0FBQztpQkFDckQ7YUFDRjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzs7Ozs7SUFFRCxtQ0FBUTs7Ozs7SUFBUixVQUFTLEVBQXdCLEVBQUUsR0FBa0I7UUFBckQsaUJBZ0JDO1lBaEJVLGdCQUFLO1FBQ2QsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7O1lBQzdCLFNBQVMsR0FBRyxDQUFDO1FBQ2pCLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUU7WUFDeEIsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUNuQjthQUFNO1lBQ0wsU0FBUyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHOzs7O1FBQUMsVUFBQyxDQUFDO1lBQ3BDLE9BQUEsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsc0JBQU0sQ0FBQyxJQUFFLEtBQUssRUFBRSxTQUFTLElBQUcsQ0FBQyxDQUFDLENBQUM7UUFBdEQsQ0FBc0QsRUFDdkQsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLFVBQVU7OztRQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBOUIsQ0FBOEIsRUFBQyxDQUFDO0lBQ25ELENBQUM7Ozs7SUFFRCx5Q0FBYzs7O0lBQWQ7O1lBQ00sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSTs7OztRQUFDLFVBQUMsR0FBRyxJQUFLLE9BQUEsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQWxCLENBQWtCLEVBQUMsSUFBSSxJQUFJO1FBQ3pFLElBQUksVUFBVSxFQUFFOztnQkFDVixTQUFPLEdBQUcsRUFBRTtZQUNoQixVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU87Ozs7WUFBQyxVQUFDLEdBQUc7Z0JBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO29CQUNqQixTQUFPLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO2lCQUM3RDtZQUNILENBQUMsRUFBQyxDQUFDOztnQkFFRyxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxDQUFDLHNCQUFzQjtZQUMzRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQU8sQ0FBQztZQUN6QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxVQUFVLENBQUMsS0FBSztnQkFDZCxJQUFJLENBQUMsV0FBVztvQkFDaEIsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU07Ozs7b0JBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQWQsQ0FBYyxFQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQ3BFLEVBQUUsQ0FBQztZQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUM1QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7Ozs7OztJQUVELHVDQUFZOzs7OztJQUFaLFVBQWEsRUFBTyxFQUFFLEtBQVU7UUFDOUIsSUFBSSxFQUFFLEVBQUU7WUFDTixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDWDtJQUNILENBQUM7Ozs7OztJQUVELDBDQUFlOzs7OztJQUFmLFVBQWdCLEdBQWUsRUFBRSxJQUFTO1FBQ3hDLElBQUksT0FBTyxHQUFHLENBQUMsV0FBVyxLQUFLLFVBQVUsRUFBRTtZQUN6QyxPQUFPLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7UUFDRCxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO0lBQzNCLENBQUM7Ozs7OztJQUVELHFDQUFVOzs7OztJQUFWLFVBQVcsR0FBZSxFQUFFLElBQVM7UUFDbkMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO1lBQ2xDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDN0I7UUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEQsQ0FBQzs7Ozs7O0lBRUQsc0NBQVc7Ozs7O0lBQVgsVUFBWSxHQUFlLEVBQUUsSUFBUztRQUNwQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQztJQUM3QyxDQUFDO0lBRUQsc0JBQXNCOzs7Ozs7O0lBQ2QsNENBQWlCOzs7Ozs7SUFBekIsVUFBMEIsU0FBaUI7UUFDekMsT0FBTyxrQkFBZ0IsU0FBUyxRQUFLLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFFSDs7OztPQUlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUNLLGtEQUF1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUEvQixVQUNFLGdCQUF3QjtRQUV4QixJQUFJLGdCQUFnQixJQUFJLENBQUMsRUFBRTtZQUN6QixPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJO2dCQUNiLFVBQVUsRUFBRSxDQUFDO2dCQUNiLFlBQVksRUFBRSxnQkFBZ0I7Z0JBQzlCLE9BQU8sRUFBRSxLQUFLO2FBQ2YsQ0FBQztTQUNIOztZQUNHLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3RDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDckQsQ0FBQyxDQUFDLENBQUM7UUFDTCxrQ0FBa0M7UUFDbEMsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7WUFDakUsWUFBWSxHQUFHLENBQUMsbUJBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQWUsQ0FBQyxDQUFDLFdBQVcsQ0FBQztTQUN2RTtRQUNELHFFQUFxRTtRQUNyRSxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUU7WUFDckIsT0FBTyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUN0QztRQUNELGlCQUFpQjtRQUNqQixJQUFJLGdCQUFnQixHQUFHLFlBQVksR0FBRyxDQUFDLEVBQUU7WUFDdkMsT0FBTyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUN0Qzs7WUFDSyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQyxDQUFDLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQzlDLENBQUMsQ0FBQyxDQUFDOztZQUNDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQzNFLE9BQU8sV0FBVyxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxvQ0FBb0M7Ozs7OztJQUM1QiwrQ0FBb0I7Ozs7O0lBQTVCO1FBQUEsaUJBd0JDOztZQXZCTyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs7WUFDM0MsTUFBTSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FDekMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQ2hDOztZQUNLLFNBQVMsR0FDYixJQUFJLENBQUMsTUFBTTtZQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxPQUFPO1lBQ2hDLElBQUksQ0FBQyxlQUFlLEtBQUssTUFBTSxDQUFDLFVBQVU7WUFDMUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxNQUFNLENBQUMsT0FBTztRQUN6QyxJQUFJLFNBQVMsRUFBRTtZQUNiLFVBQVU7OztZQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBOUIsQ0FBOEIsRUFBQyxDQUFDO1lBQ2pELE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLG1DQUFtQztRQUNuQyxJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNqQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsT0FBTztTQUNSO1FBQ0QsVUFBVTs7O1FBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUEvQixDQUErQixFQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELHNEQUFzRDs7Ozs7O0lBQzlDLG1EQUF3Qjs7Ozs7SUFBaEM7UUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzFCLE9BQU87U0FDUjs7WUFDSyxNQUFNLEdBQUcsbUJBQUEsQ0FBQyxtQkFBQSxJQUFJLENBQUMsZ0JBQWdCLEVBQU8sQ0FBQzthQUMxQyx3QkFBd0IsRUFBc0I7O1lBQzNDLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7UUFDeEMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDbEQsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3pDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNyQztTQUNGO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELGlDQUFpQzs7Ozs7O0lBQ3pCLCtDQUFvQjs7Ozs7SUFBNUI7UUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7O1lBQ0ssR0FBRyxHQUFHLG1CQUFBLENBQUMsbUJBQUEsSUFBSSxDQUFDLGdCQUFnQixFQUFPLENBQUM7YUFDdkMseUJBQXlCLEVBQXNCO1FBQ2xELElBQUksR0FBRyxFQUFFO1lBQ1AsT0FBTyxHQUFHLENBQUM7U0FDWjs7WUFDSyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLG1CQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFlLENBQUM7UUFDdEUsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLENBQ0wsQ0FBQyxtQkFBQSxJQUFJLENBQUMsYUFBYSxDQUNqQiw0Q0FBNEMsQ0FDN0MsRUFBZSxDQUFDO1lBQ2pCLENBQUMsbUJBQUEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFlLENBQUM7WUFDdEQsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDOzs7OztJQUVPLGlEQUFzQjs7OztJQUE5Qjs7WUFDUSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLG1CQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFlLENBQUM7UUFDdEUsT0FBTyxJQUFJO1lBQ1QsQ0FBQyxDQUFDLENBQUMsbUJBQUEsSUFBSSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFlLENBQUM7WUFDL0QsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFFRCwwQkFBMEI7Ozs7Ozs7SUFDbEIsbURBQXdCOzs7Ozs7SUFBaEMsVUFBaUMsSUFBaUI7UUFDaEQsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLENBQ0wsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FDeEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRzs7Ozs7Ozs7O0lBQ0ssa0RBQXVCOzs7Ozs7OztJQUEvQjtRQUFBLGlCQWlDQztRQWhDQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4QixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUNuQyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztnQkFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUN6QjtZQUNELE9BQU87U0FDUjs7WUFDSyxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFOztZQUN0QyxJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QixVQUFVOzs7Z0JBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUE5QixDQUE4QixHQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ3REO1lBQ0QsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQzs7WUFDeEIsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssV0FBVyxFQUFFO1lBQy9DLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxXQUFXLENBQUM7WUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN6QjtRQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLE9BQU87U0FDUjtRQUNELElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDOzs7Ozs7SUFFTyxvREFBeUI7Ozs7O0lBQWpDLFVBQWtDLFVBQWtCOztZQUM1QyxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1FBQzVDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO1lBQzlDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQzs7Ozs7O0lBRU8sb0RBQXlCOzs7OztJQUFqQyxVQUFrQyxJQUFpQjtRQUFuRCxpQkFrQkM7UUFqQkMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzVELE9BQU87U0FDUjtRQUNELElBQ0UsSUFBSSxDQUFDLDBCQUEwQixLQUFLLElBQUk7WUFDeEMsSUFBSSxDQUFDLHdCQUF3QixFQUM3QjtZQUNBLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDdkMsSUFBSSxDQUFDLHdCQUF3Qjs7O1FBQUc7WUFDOUIsS0FBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUEsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLG1CQUFBO1lBQzdELE9BQU8sRUFBRSxJQUFJO1NBQ2QsRUFBTyxDQUFDLENBQUM7SUFDWixDQUFDOzs7OztJQUVPLHNEQUEyQjs7OztJQUFuQztRQUNFLElBQUksSUFBSSxDQUFDLDBCQUEwQixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNwRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsbUJBQW1CLENBQ2pELFFBQVEsRUFDUixJQUFJLENBQUMsd0JBQXdCLENBQzlCLENBQUM7U0FDSDtRQUNELElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDdkMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7O0lBQ0ssaURBQXNCOzs7Ozs7SUFBOUI7UUFBQSxpQkFXQztRQVZDLElBQUksQ0FBQyxxQkFBcUI7OztRQUFHLGNBQU0sT0FBQSxLQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBakMsQ0FBaUMsQ0FBQSxDQUFDO1FBQ3JFLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO1lBQ2pDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDL0Q7O1lBQ0ssRUFBRSxHQUNOLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBQSxNQUFNLEVBQU8sQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUN2RSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFO1lBQ2xELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLEVBQUU7OztZQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBakMsQ0FBaUMsRUFBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7Ozs7O0lBRU8sbURBQXdCOzs7O0lBQWhDO1FBQ0UsSUFBSSxJQUFJLENBQUMscUJBQXFCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO1lBQy9ELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDbEU7UUFDRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxFQUFFO1lBQ3BDLFlBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQzs7Ozs7SUFFTyxxREFBMEI7Ozs7SUFBbEM7UUFBQSxpQkFhQztRQVpDLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksRUFBRTtZQUNwQyxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDeEM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVTs7O1FBQUM7WUFDcEMsS0FBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztZQUNoQyxJQUFJLENBQUMsS0FBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO2dCQUM3QyxPQUFPO2FBQ1I7WUFDRCxLQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1Qix5QkFBeUI7WUFDekIsVUFBVTs7O1lBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUE5QixDQUE4QixHQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsR0FBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRDs7O09BR0c7Ozs7Ozs7SUFDSywrQ0FBb0I7Ozs7OztJQUE1QjtRQUFBLGlCQStCQzs7WUE5QkssVUFBVSxHQUFHLENBQUM7UUFDbEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLFVBQVUsSUFBSSxnQkFBZ0IsQ0FBQztTQUNoQztRQUNELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixVQUFVLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQ3ZDO1FBQ0QsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLElBQUk7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO2FBQ25DO1lBQ0QsSUFBSSxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztnQkFDN0IsVUFBVSxJQUFJLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM3QztRQUNILENBQUMsRUFBQyxDQUFDOztZQUVDLFdBQVcsR0FBRyxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTs7Z0JBQ3JELElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDNUIsU0FBUzthQUNWO1lBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLE9BQU8sRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUM7Z0JBQ25DLFdBQVcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDOUM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7YUFDMUI7U0FDRjtJQUNILENBQUM7Ozs7SUFFRCxxQ0FBVTs7O0lBQVY7UUFDRSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsSUFBSTtZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7YUFDbkM7UUFDSCxDQUFDLEVBQUMsQ0FBQzs7WUFFRyxNQUFNLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUN6QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FDaEM7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7O1lBQ3RCLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7O1lBQ3RDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCOztZQUNsQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU87UUFFOUIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUc7Z0JBQ1osQ0FBQyxFQUFFLE9BQU87Z0JBQ1YsQ0FBQyxFQUFFLElBQUk7YUFDUixDQUFDO1lBQ0YsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRztnQkFDWixDQUFDLEVBQUUsT0FBTztnQkFDVixDQUFDLEVBQUUsa0JBQWdCLFNBQVMsUUFBSzthQUNsQyxDQUFDO1lBQ0YsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLENBQUMsRUFBRSxPQUFPO1lBQ1YsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7U0FDckMsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTOzs7Ozs7SUFDVCxnREFBcUI7Ozs7OztJQUFyQixVQUFzQixNQUFXO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7OztJQUVELGlDQUFNOzs7O0lBQU4sVUFBTyxLQUFjO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLE9BQU87U0FDUjtRQUNELHlCQUF5QjtRQUN6QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ25EO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ3JEO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3BELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVCLDJDQUEyQztZQUMzQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNwRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3hEO2FBQU07WUFDTCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNwRCxZQUFZO1lBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFRDs7OztPQUlHOzs7Ozs7O0lBQ0gsOENBQW1COzs7Ozs7SUFBbkI7UUFBQSxpQkFrRUM7UUFqRUMsSUFDRSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQ3BCLENBQUMsSUFBSSxDQUFDLGdCQUFnQjtZQUN0QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQzdCO1lBQ0EsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztZQUMvQixPQUFPO1NBQ1I7O1lBQ0ssV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNOzs7O1FBQy9DLFVBQUMsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUF2QixDQUF1QixFQUMvQjs7O1lBRUssVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDOztZQUN2QyxZQUFZLEdBQ2hCLFVBQVUsR0FBRyxDQUFDO1lBQ1osQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQztnQkFDaEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNO1FBQzFCLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1lBQy9CLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7O1lBQ3ZELE9BQU8sR0FDWCxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN4RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsSUFBSTtZQUNqQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFO2dCQUM3RCxPQUFPO2FBQ1I7O2dCQUNHLEtBQUssR0FBUSxJQUFJLENBQUMsV0FBVztZQUNqQyxpREFBaUQ7WUFDakQsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUU7O29CQUMzQixHQUFHLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDOztvQkFDdkMsT0FBSyxHQUFHLEdBQUcsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUNuRSxJQUFJLENBQUMsT0FBSyxFQUFFO29CQUNWLE9BQU87aUJBQ1I7O29CQUNHLEtBQUcsR0FBRyxDQUFDOztvQkFDUCxVQUFRLEdBQUcsS0FBSztnQkFDcEIsT0FBTyxDQUFDLE9BQU87Ozs7Z0JBQUMsVUFBQyxHQUFHOzt3QkFDWixHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQ25DLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFO3dCQUM3QixPQUFPO3FCQUNSOzt3QkFDSyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDZixLQUFHLElBQUksR0FBRyxDQUFDO3dCQUNYLFVBQVEsR0FBRyxJQUFJLENBQUM7cUJBQ2pCO2dCQUNILENBQUMsRUFBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxVQUFRLEVBQUU7b0JBQ2IsT0FBTztpQkFDUjtnQkFDRCxLQUFLLEdBQUcsS0FBRyxDQUFDO2FBQ2I7O2dCQUNLLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDcEQsS0FBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUc7Z0JBQ2hELEtBQUssT0FBQTtnQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTTtnQkFDL0QsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSztnQkFDdEMsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLO2FBQzdCLENBQUM7UUFDSixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7Ozs7SUFFTyxnREFBcUI7Ozs7OztJQUE3QixVQUE4QixHQUFrQixFQUFFLFFBQWdCO1FBQ2hFLElBQ0UsQ0FBQyxHQUFHO1lBQ0osQ0FBQyxJQUFJLENBQUMsb0JBQW9CO1lBQzFCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFDakM7WUFDQSxPQUFPLElBQUksQ0FBQztTQUNiOztZQUNHLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTs7Z0JBQzVCLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtnQkFDM0IsWUFBWSxFQUFFLENBQUM7YUFDaEI7U0FDRjtRQUNELElBQUksWUFBWSxHQUFHLENBQUMsSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRTtZQUN4RSxPQUFPLElBQUksQ0FBQztTQUNiOztZQUNLLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDO1FBQ3BELE9BQU8sSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEQsQ0FBQztJQUVELHNDQUFzQzs7Ozs7OztJQUN0QyxpREFBc0I7Ozs7OztJQUF0QixVQUF1QixHQUFrQixFQUFFLFFBQWdCOztZQUNuRCxJQUFJLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7UUFDdEQsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3hCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7O1lBQ0ssS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLO1FBQ3hCLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxFQUFFLENBQUM7U0FDWDs7WUFDSyxRQUFRLEdBQ1osSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDeEMsT0FBTyxLQUFLLENBQUM7U0FDZDs7WUFDSyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekUsQ0FBQzs7Ozs7O0lBRUQsaURBQXNCOzs7OztJQUF0QixVQUF1QixHQUFrQixFQUFFLFFBQWdCOztZQUNuRCxJQUFJLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7O1lBQ2hELEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU07UUFDbEUsSUFBSSxLQUFLLEtBQUssT0FBTyxJQUFJLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRTtZQUMvRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELDhEQUE4RDs7Ozs7SUFDOUQsNkNBQWtCOzs7O0lBQWxCO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkU7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxJQUFJLElBQUk7WUFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYTtZQUM5QixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7OztJQUVELHNDQUFXOzs7SUFBWDtRQUFBLGlCQWlCQztRQWhCQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLGlFQUFpRTtRQUNqRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxHQUFHO1lBQzNDLEtBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ25DLENBQUMsRUFBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLElBQUk7O2dCQUM1QixHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUksQ0FBQyxXQUFXLENBQUM7WUFDbEMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNmLEtBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ2xDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCw0Q0FBNEM7Ozs7Ozs7SUFDNUMsd0NBQWE7Ozs7OztJQUFiLFVBQWMsT0FBZ0IsRUFBRSxJQUFTO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLE9BQU87U0FDUjs7WUFDSyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDakM7UUFDRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7Ozs7O0lBRUQsd0NBQWE7Ozs7O0lBQWIsVUFBYyxLQUFzQixFQUFFLElBQWdCO1FBQXRELGlCQTRDQztRQTVDYSxzQkFBQSxFQUFBLGFBQXNCO1FBQUUscUJBQUEsRUFBQSxXQUFnQjtRQUNwRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssT0FBTyxFQUFFO1lBQy9CLElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2pDO1lBQ0QsT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLEVBQUU7WUFDUiwrQkFBK0I7WUFDL0IsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN4QixPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDcEQsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7YUFDeEQ7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN6QyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2FBQ3REO1NBQ0Y7O1lBQ0ssY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNOzs7O1FBQ2xELFVBQUMsSUFBSSxJQUFLLE9BQUEsQ0FBQyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQTVCLENBQTRCLEVBQ3ZDO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QjtZQUMxQixjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ3pCLGNBQWMsQ0FBQyxLQUFLOzs7O2dCQUNsQixVQUFDLElBQUksSUFBSyxPQUFBLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUEzQyxDQUEyQyxFQUN0RCxDQUFDO1FBQ0osSUFBSSxDQUFDLGVBQWU7WUFDbEIsY0FBYyxDQUFDLElBQUk7Ozs7WUFDakIsVUFBQyxJQUFJLElBQUssT0FBQSxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBM0MsQ0FBMkMsRUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUNyQyxhQUFhO1FBQ2IsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFOztnQkFDZCxZQUFZLEdBQWUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ25FLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsaUJBQWlCO1FBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1NBQ3RDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7OztJQUVELG1DQUFROzs7O0lBQVIsVUFBUyxLQUFjO1FBQXZCLGlCQWtCQztRQWpCQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsSUFBSTtZQUNsQyw0QkFBNEI7WUFDNUIsSUFBSSxLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQy9CLE9BQU87YUFDUjtZQUNELElBQUksS0FBSyxFQUFFO2dCQUNULENBQUMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMxQyxDQUFDLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2FBQ3hEO2lCQUFNO2dCQUNMLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDekMsT0FBTyxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzthQUN0RDtZQUVELEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0RCxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxnQkFBZ0I7Ozs7OztJQUNoQiwyQ0FBZ0I7Ozs7O0lBQWhCLFVBQWlCLElBQVM7UUFDeEIsT0FBTyxDQUFDLENBQUMsQ0FDUCxJQUFJLENBQUMsbUJBQW1CO1lBQ3hCLElBQUk7WUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxDQUN4QyxDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWM7Ozs7OztJQUNkLHVDQUFZOzs7OztJQUFaLFVBQWEsSUFBUztRQUNwQixPQUFPLENBQUMsQ0FBQyxDQUNQLElBQUksQ0FBQyxlQUFlO1lBQ3BCLElBQUk7WUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLElBQUksQ0FDcEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRzs7Ozs7OztJQUNILDJDQUFnQjs7Ozs7O0lBQWhCLFVBQWlCLEdBQWtCLEVBQUUsSUFBUztRQUM1QyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFO1lBQ2pELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUU7O2dCQUM3QixLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDN0IsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDO1NBQ3RCO1FBQ0QsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDO0lBQ25CLENBQUM7SUFFRCxnQ0FBZ0M7Ozs7Ozs7O0lBQ2hDLDJDQUFnQjs7Ozs7OztJQUFoQixVQUFpQixHQUFrQixFQUFFLElBQVMsRUFBRSxPQUFnQjtRQUM5RCxJQUFJLE9BQU8sRUFBRTtZQUNYLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxvQ0FBb0M7Ozs7Ozs7SUFDcEMsNENBQWlCOzs7Ozs7SUFBakIsVUFBa0IsR0FBa0IsRUFBRSxJQUFTO1FBQzdDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMzQixPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDOzs7OztJQUVELHdDQUFhOzs7O0lBQWIsVUFBYyxHQUFRO1FBQ3BCLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7WUFDcEIsT0FBTyxHQUFHLENBQUM7U0FDWjthQUFNO1lBQ0wsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7Ozs7O0lBRUQsd0NBQWE7Ozs7SUFBYixVQUFjLEdBQWtCO1FBQzlCLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtZQUNmLE9BQU8sbUJBQUEsR0FBRyxDQUFDLElBQUksRUFBVSxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxHQUFHLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQztJQUNuQyxDQUFDO0lBRUQsbUJBQW1COzs7Ozs7SUFDbkIsbUNBQVE7Ozs7O0lBQVIsVUFBUyxHQUFrQjtRQUN6QixPQUFPLENBQUMsQ0FBQyxDQUNQLEdBQUc7WUFDSCxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDckUsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRzs7Ozs7Ozs7SUFDSCx1Q0FBWTs7Ozs7OztJQUFaLFVBQWEsR0FBa0IsRUFBRSxJQUFTLEVBQUUsS0FBYTtRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN2QixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFOztnQkFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUMzQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRTtnQkFDakMsT0FBTyxFQUFFLENBQUM7YUFDWDtZQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RCOztZQUNLLElBQUksR0FDUixNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFDN0QsSUFBSSxHQUNSLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUMzRCxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sTUFBTSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELG9DQUFvQzs7Ozs7O0lBQ3BDLHdDQUFhOzs7OztJQUFiLFVBQWMsR0FBa0I7UUFDOUIsSUFDRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ25CLENBQUMsR0FBRztZQUNKLENBQUMsR0FBRyxDQUFDLEtBQUs7WUFDVixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQ2xDO1lBQ0EsT0FBTyxJQUFJLENBQUM7U0FDYjs7WUFDSyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3hDLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQseUNBQXlDOzs7Ozs7O0lBQ3pDLHFDQUFVOzs7Ozs7SUFBVixVQUFXLEdBQWtCLEVBQUUsSUFBUztRQUN0QyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7WUFDbEQsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksT0FBTyxHQUFHLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRTtZQUN0QyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUN4QixDQUFDO0lBRUQsMEJBQTBCOzs7Ozs7OztJQUMxQixzQ0FBVzs7Ozs7OztJQUFYLFVBQVksS0FBWSxFQUFFLEdBQWtCLEVBQUUsSUFBUztRQUNyRCxJQUFJLEtBQUssRUFBRTtZQUNULEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxxQ0FBcUM7Ozs7OztJQUNyQyx3Q0FBYTs7Ozs7SUFBYixVQUFjLEdBQWtCO1FBQzlCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQ1YseUNBQXlDO2dCQUN2QyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNqQixRQUFRLENBQ1gsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Ozs7OztJQUVELHlDQUFjOzs7OztJQUFkLFVBQWUsR0FBa0IsRUFBRSxJQUFTO1FBQzFDLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUU7WUFDbEUsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksT0FBTyxHQUFHLENBQUMsWUFBWSxLQUFLLFVBQVUsRUFBRTtZQUMxQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztJQUM1QixDQUFDOzs7Ozs7SUFFRCx3Q0FBYTs7Ozs7SUFBYixVQUFjLEdBQWtCLEVBQUUsSUFBUztRQUN6QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRTtZQUM3QixPQUFPLEVBQUUsQ0FBQztTQUNYOztZQUNLLEdBQUcsR0FBRyxHQUFHLENBQUMsWUFBWTtRQUM1QixJQUFJLEdBQUcsQ0FBQyxjQUFjLElBQUksSUFBSSxFQUFFOztnQkFDeEIsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1lBQ3JDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDeEM7UUFDRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDN0QsQ0FBQzs7Ozs7O0lBRUQsK0NBQW9COzs7OztJQUFwQixVQUFxQixHQUFrQixFQUFFLElBQVM7UUFDaEQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDdEMsT0FBTyxFQUFFLENBQUM7U0FDWDs7WUFDSyxHQUFHLEdBQUcsR0FBRyxDQUFDLFlBQVk7O1lBQ3RCLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQzs7WUFDdkIsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzdCLElBQUksR0FBRyxDQUFDLGlCQUFpQixJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUU7WUFDL0MsT0FBTyxPQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFFLENBQUM7U0FDdkU7UUFDRCxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7Ozs7Ozs7SUFFRCw2Q0FBa0I7Ozs7OztJQUFsQixVQUNFLEdBQWtCLEVBQ2xCLEdBQXlDLEVBQ3pDLFFBQWdCO1FBRWhCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFO1lBQzVCLE9BQU8sUUFBUSxDQUFDO1NBQ2pCOztZQUNLLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUNoQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQzlDLENBQUM7Ozs7O0lBRUQseUNBQWM7Ozs7SUFBZCxVQUFlLEdBQWtCO1FBQy9CLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5RCxDQUFDOzs7OztJQUVELDBDQUFlOzs7O0lBQWYsVUFBZ0IsR0FBa0I7UUFDaEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFO1lBQy9ELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQztJQUM1QyxDQUFDOzs7Ozs7SUFFRCx3Q0FBYTs7Ozs7SUFBYixVQUFjLEdBQWtCLEVBQUUsT0FBZ0I7UUFDaEQsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNsRCxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8scUJBQXFCLENBQUM7U0FDOUI7UUFDRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDOzs7OztJQUVELDBDQUFlOzs7O0lBQWYsVUFBZ0IsR0FBa0I7UUFDaEMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRTtZQUN4RCxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1NBQ3BDO1FBQ0Q7OztRQUFPO1lBQ0wsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEVBQUM7SUFDSixDQUFDOzs7OztJQUVELDhDQUFtQjs7OztJQUFuQixVQUFvQixHQUFrQjs7WUFDOUIsV0FBVyxHQUNmLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQ2hFLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQzFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekM7UUFDRCxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCwrQ0FBK0M7Ozs7Ozs7O0lBQy9DLHVDQUFZOzs7Ozs7O0lBQVosVUFBYSxHQUFrQixFQUFFLElBQVMsRUFBRSxLQUFVO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3JDLE9BQU87U0FDUjs7WUFDSyxJQUFJLEdBQUcsbUJBQUEsR0FBRyxDQUFDLElBQUksRUFBVTs7WUFDekIsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNuQixJQUFJLEVBQUUsSUFBSTtZQUNWLEdBQUcsS0FBQTtZQUNILElBQUksTUFBQTtZQUNKLEtBQUssT0FBQTtZQUNMLGFBQWEsZUFBQTtTQUNkLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7Ozs7O0lBQ0gsNkNBQWtCOzs7Ozs7OztJQUFsQixVQUFtQixHQUFrQixFQUFFLElBQVMsRUFBRSxJQUFhO1FBQS9ELGlCQThCQztRQTdCQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFO1lBQ2xDLE9BQU87U0FDUjtRQUNELElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3pCOztZQUNLLEVBQUUsR0FBRyxHQUFHLENBQUMsaUJBQWlCOztZQUMxQixVQUFVLEdBQ2QsR0FBRyxDQUFDLDZCQUE2QixJQUFJLElBQUk7WUFDdkMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkI7WUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFDUCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUU7WUFDckMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ2pEO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyx1QkFBdUI7YUFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM5QixTQUFTOzs7O1FBQUMsVUFBQyxFQUFpQztnQkFBL0IsVUFBTSxFQUFFLFdBQU8sRUFBRSxjQUFJLEVBQUUsVUFBTTtZQUN6QyxJQUFJLENBQUMsRUFBRTtnQkFDTCxLQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDckQ7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUEsRUFBRSxJQUFJLE1BQUEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBQSxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7Ozs7SUFDSCx5Q0FBYzs7Ozs7Ozs7SUFBZCxVQUFlLEdBQWtCLEVBQUUsSUFBUyxFQUFFLE9BQWU7UUFBN0QsaUJBc0JDO1FBckJDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFO1lBQzlCLE9BQU87U0FDUjs7WUFDSyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWE7O1lBQ3RCLFVBQVUsR0FDZCxHQUFHLENBQUMsOEJBQThCLElBQUksSUFBSTtZQUN4QyxDQUFDLENBQUMsR0FBRyxDQUFDLDhCQUE4QjtZQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNQLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUQsT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDakMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzdDO1FBQ0QsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxtQkFBbUI7YUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM5QixTQUFTOzs7O1FBQUMsVUFBQyxFQUFxQztnQkFBbkMsVUFBTSxFQUFFLGVBQVcsRUFBRSxjQUFJLEVBQUUsVUFBTTtZQUM3QyxLQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxFQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFBLEVBQUUsT0FBTyxTQUFBLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUEsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELG9EQUFvRDs7Ozs7Ozs7SUFDNUMsbURBQXdCOzs7Ozs7O0lBQWhDLFVBQWlDLEdBQWtCLEVBQUUsSUFBUztRQUM1RCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRTtZQUM3QixPQUFPO1NBQ1I7O1lBQ0ssR0FBRyxHQUFHLEdBQUcsQ0FBQyxZQUFZO1FBQzVCLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDMUIsR0FBRyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7U0FDckI7UUFDRCxJQUFJLEdBQUcsQ0FBQyxjQUFjLElBQUksSUFBSSxFQUFFO1lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7Ozs7OztJQUNLLG1EQUF3Qjs7Ozs7Ozs7O0lBQWhDLFVBQ0UsR0FBa0IsRUFDbEIsSUFBUyxFQUNULE1BQVc7UUFIYixpQkErQkM7UUExQkMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLE9BQU87U0FDUjtRQUNELElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtZQUNyQyxNQUFNLENBQUMsSUFBSTs7OztZQUNULFVBQUMsSUFBUyxJQUFLLE9BQUEsS0FBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQXhDLENBQXdDOzs7WUFDdkQsY0FBTSxPQUFBLEtBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQXZCLENBQXVCLEVBQzlCLENBQUM7WUFDRixPQUFPO1NBQ1I7UUFDRCxJQUFJLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUU7WUFDMUMsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUM3QztZQUNELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxNQUFNLENBQUMsU0FBUzs7OztZQUM5QyxVQUFDLElBQVMsSUFBSyxPQUFBLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUF4QyxDQUF3Qzs7O1lBQ3ZELGNBQU0sT0FBQSxLQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxFQUF2QixDQUF1QixFQUM5QixDQUFDO1lBQ0YsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7Ozs7OztJQUVPLDZDQUFrQjs7Ozs7OztJQUExQixVQUEyQixHQUFrQixFQUFFLElBQVMsRUFBRSxJQUFTO1FBQ2pFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLE9BQU87U0FDUjs7WUFDSyxHQUFHLEdBQUcsR0FBRyxDQUFDLFlBQVk7UUFDNUIsSUFBSSxHQUFHLENBQUMsY0FBYyxJQUFJLElBQUksRUFBRTtZQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUNqQzthQUFNO1lBQ0wsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDdkI7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCx1REFBdUQ7Ozs7Ozs7O0lBQ3ZELHlDQUFjOzs7Ozs7O0lBQWQsVUFBZSxHQUFrQixFQUFFLElBQVMsRUFBRSxLQUFVO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3JDLE9BQU87U0FDUjs7WUFDSyxJQUFJLEdBQUcsbUJBQUEsR0FBRyxDQUFDLElBQUksRUFBVTs7WUFDekIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxZQUFZOztZQUN0QixVQUFVLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUk7O1lBQ2hELGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDOztZQUMxQixhQUFhLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7O1lBQ3pELElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7O1lBQ3BDLGNBQWMsR0FDbEIsYUFBYSxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUc7WUFDM0IsQ0FBQyxDQUFDLElBQUk7WUFDTixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUk7Ozs7WUFBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLGFBQWEsRUFBekMsQ0FBeUMsRUFBQztnQkFDOUQsSUFBSTs7WUFDSixNQUFNLEdBQ1YsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUc7WUFDbkIsQ0FBQyxDQUFDLElBQUk7WUFDTixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUk7Ozs7WUFBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBakMsQ0FBaUMsRUFBQyxJQUFJLElBQUk7UUFFcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQzs7WUFDZixLQUFLLEdBQVEsU0FBUztRQUMxQixJQUFJLFVBQVUsRUFBRTtZQUNkLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQzFCO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDbkIsSUFBSSxFQUFFLElBQUk7WUFDVixHQUFHLEtBQUE7WUFDSCxJQUFJLE1BQUE7WUFDSixLQUFLLE9BQUE7WUFDTCxhQUFhLGVBQUE7WUFDYixLQUFLLE9BQUE7WUFDTCxhQUFhLGVBQUE7WUFDYixNQUFNLFFBQUE7WUFDTixjQUFjLGdCQUFBO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOztnQkFqdUVGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsNjBzQkFBd0M7b0JBRXhDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOztpQkFDaEQ7Ozs7Z0JBaEZDLFVBQVU7Z0JBSFYsaUJBQWlCO2dCQTBCVixvQkFBb0I7Ozt1QkEyRDFCLEtBQUs7NEJBQ0wsS0FBSzs0QkFDTCxLQUFLOytCQUNMLEtBQUs7NkJBSUwsS0FBSzsyQ0FDTCxLQUFLO2tDQUVMLEtBQUs7Z0NBQ0wsS0FBSztrQ0FFTCxLQUFLOzhCQUNMLEtBQUs7c0NBS0wsS0FBSztrQ0FLTCxLQUFLO2lDQUVMLEtBQUs7bUNBQ0wsS0FBSztnQ0FLTCxLQUFLOzRCQUNMLE1BQU07OEJBQ04sTUFBTTttQ0FDTixNQUFNOzZCQUVOLE1BQU07K0JBQ04sS0FBSzs2QkFFTCxLQUFLO2tDQU9MLEtBQUs7aUNBRUwsS0FBSztnQ0FDTCxLQUFLO3FDQUNMLEtBQUs7b0NBQ0wsS0FBSzt1Q0FDTCxNQUFNO3NDQUNOLE1BQU07MkNBQ04sTUFBTTs2QkFDTixZQUFZLFNBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtrQ0FDNUMsWUFBWSxTQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTttQ0FFakQsWUFBWSxTQUFDLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTttQ0FnRWxELFNBQVMsU0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOztJQXhIZDtRQUFmLFlBQVksRUFBRTs7MERBQStCO0lBSzlCO1FBQWYsWUFBWSxFQUFFOztzRUFBMkM7SUFFMUM7UUFBZixZQUFZLEVBQUU7OzZEQUFpQztJQUNoQztRQUFmLFlBQVksRUFBRTs7MkRBQStCO0lBZTlCO1FBQWYsWUFBWSxFQUFFOzs0REFBaUM7SUFjaEM7UUFBZixZQUFZLEVBQUU7O3dEQUE0QjtJQU8zQjtRQUFmLFlBQVksRUFBRTs7NkRBQWtDO0lBNHFFNUQsdUJBQUM7Q0FBQSxBQWx1RUQsSUFrdUVDO1NBNXRFWSxnQkFBZ0I7OztJQUMzQixnQ0FBc0I7O0lBQ3RCLHFDQUE4Qzs7SUFDOUMscUNBQThCOztJQUM5Qix3Q0FBdUQ7Ozs7O0lBSXZELHNDQUF1RDs7SUFDdkQsb0RBQW1FOzs7OztJQUVuRSwyQ0FBeUQ7O0lBQ3pELHlDQUF1RDs7Ozs7SUFFdkQsMkNBQWlDOztJQUNqQyx1Q0FBNEM7Ozs7OztJQUs1QywrQ0FBcUM7Ozs7OztJQUtyQywyQ0FBaUM7O0lBRWpDLDBDQUF5RDs7SUFDekQsNENBQThDOzs7Ozs7SUFLOUMseUNBQXdDOztJQUN4QyxxQ0FBeUM7O0lBQ3pDLHVDQUEyQzs7SUFDM0MsNENBQWdEOzs7OztJQUVoRCxzQ0FBNkQ7O0lBQzdELHdDQUF1Qzs7Ozs7SUFFdkMsc0NBQW9EOzs7Ozs7OztJQU9wRCwyQ0FBMEQ7O0lBRTFELDBDQUFvQzs7SUFDcEMseUNBQXFDOztJQUNyQyw4Q0FBcUM7O0lBQ3JDLDZDQUFvQzs7SUFDcEMsZ0RBQXlEOztJQUN6RCwrQ0FBd0Q7O0lBQ3hELG9EQUE2RDs7SUFDN0Qsc0NBQTRFOztJQUM1RSwyQ0FDa0M7O0lBQ2xDLDRDQUNtQzs7SUFDbkMsa0NBQWM7O0lBR2QsbURBQWdDOztJQUNoQywyQ0FBd0I7O0lBQ3hCLDZDQUF1Qjs7SUFDdkIseUNBQW1COztJQUNuQiwyQ0FBZ0Q7O0lBQ2hELDBDQUFnRDs7SUFDaEQsMENBQTRDOztJQUU1QyxnREFBMEI7O0lBRTFCLDRDQUE0RDs7SUFDNUQsdUNBQWlCOztJQUVqQiwwQ0FBMEM7O0lBQzFDLHFDQUEyQjs7SUFDM0IsOENBQXlDOztJQUN6QyxtREFBOEM7O0lBQzlDLHlDQUErQjs7SUFFL0IsNkNBQW1DOztJQUVuQyx3Q0FBbUM7O0lBRW5DLHlDQUFvQzs7SUFHcEMsOENBQXlDOztJQUN6QywrQ0FBMEM7O0lBQzFDLHNDQUE0Qjs7SUFDNUIsdUNBQXdCOztJQUN4Qix3Q0FBMEI7O0lBQzFCLG1EQUF3Qzs7SUFDeEMsa0RBQXdDOzs7OztJQUd4QyxtREFBNkI7Ozs7OztJQUc3QiwrQ0FBbUQ7Ozs7O0lBR25ELDhDQUF1Qjs7Ozs7SUFHdkIsMkNBQW9COzs7OztJQUdwQiwyQ0FBd0I7Ozs7OztJQUd4QiwyQ0FBZ0U7Ozs7OztJQUdoRSxpREFBc0M7Ozs7OztJQUd0QywwQ0FBc0M7Ozs7O0lBQ3RDLDRDQUF3Qzs7SUFFeEMsNENBQTRFOzs7OztJQUU1RSxzREFBdUQ7Ozs7O0lBQ3ZELG9EQUFvRDs7Ozs7SUFDcEQsZ0RBQWlDOzs7OztJQUdqQyxrREFBK0I7Ozs7OztJQUcvQiwrQ0FBd0M7Ozs7O0lBQ3hDLGlEQUFpRDs7Ozs7SUFDakQsOENBQXVDOzs7Ozs7SUFHdkMsbURBS0s7Ozs7O0lBQ0wsd0RBQStEOzs7OztJQUMvRCwrQ0FLSzs7Ozs7SUFDTCxvREFBMkQ7Ozs7OztJQUUzRCxvREFBMkQ7Ozs7OztJQTBRM0QsOENBQWlDOztJQXlJakMsc0NBR0U7Ozs7O0lBR0YsNkNBQXFEOztJQUVyRCxzQ0FFRTs7SUFxWUYsc0NBZ0NFOzs7OztJQS96QkEsa0NBQTBCOzs7OztJQUMxQiwrQkFBOEI7Ozs7O0lBQzlCLGdEQUFrRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZSxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCAqIGFzIGxvY2FsZm9yYWdlIGZyb20gXCJsb2NhbGZvcmFnZVwiO1xuaW1wb3J0IHtcbiAgSW5wdXRCb29sZWFuLFxuICBOekZvcm1hdEJlZm9yZURyb3BFdmVudCxcbiAgTnpGb3JtYXRFbWl0RXZlbnQsXG59IGZyb20gXCJuZy16b3Jyby1hbnRkL2NvcmVcIjtcbmltcG9ydCB7IE56UmVzaXplRXZlbnQgfSBmcm9tIFwibmctem9ycm8tYW50ZC9yZXNpemFibGVcIjtcbmltcG9ydCB7IE56VGFibGVDb21wb25lbnQgfSBmcm9tIFwibmctem9ycm8tYW50ZC90YWJsZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRlbGF5IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBUb3RhbE9wdGlvbiB9IGZyb20gXCIuLi9oZC1kZXRhaWwtbGluZXMvaGQtZGV0YWlsLWxpbmVzLnNlcnZpY2VcIjtcbmltcG9ydCB7IENvbFdpZHRoIH0gZnJvbSBcIi4uL21vZGVsL2NvbFdpZHRoXCI7XG5pbXBvcnQgeyBQYWdlIH0gZnJvbSBcIi4uL21vZGVsL2NvbW1vbi10eXBlXCI7XG5pbXBvcnQgeyBDb21tb25TZXNzaW9uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlL2NvbW1vbi1zZXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gIGdldFRhYmxlU2Nyb2xsWFZpZXdwb3J0V2lkdGgsXG4gIGdldFRhYmxlVmlld3BvcnRXaWR0aCxcbn0gZnJvbSBcIi4uL3V0aWxzL2hkLXRhYmxlLXNjcm9sbC51dGlsXCI7XG5pbXBvcnQge1xuICBIZFRhYmxlQ2VsbENoYW5nZSxcbiAgSGRUYWJsZUNvbHVtbixcbiAgT3BlcmF0ZUJ0bixcbiAgVGFibGVDYWNoZU9wdGlvbixcbiAgVHJlZUdyaWQsXG59IGZyb20gXCIuL2hkLXRhYmxlLnNlcnZpY2VcIjtcblxuLyoqIOWLvumAieWIl+Wuve+8iHB477yJ77yM5LiO5qih5p2/IG56V2lkdGjjgIFsZXNzIOWFnOW6leS/neaMgeS4gOiHtCAqL1xuY29uc3QgU0VMRUNUX0NPTF9XSURUSCA9IDQwO1xuXG4vKiog5qiq5ZCR5biD5bGA6K6h566X57uT5p6cICovXG5pbnRlcmZhY2UgSGRUYWJsZUhvcml6b250YWxMYXlvdXQge1xuICAvKiog5Lyg57uZIG56U2Nyb2xsLnjvvJvlj6rmnInliJflrr3mgLvlkowgPD0gMCDml7bkuLogbnVsbCAqL1xuICBzY3JvbGxYOiBzdHJpbmcgfCBudWxsO1xuICAvKiog5oyJ5aOw5piO5a695q+U5L6L5YiG57uZ5ZCE5Lia5Yqh5YiX55qE5oC76KGl5a6977yM5YiX5aSa5pe25Li6IDAgKi9cbiAgZmx1aWRFeHRyYTogbnVtYmVyO1xuICAvKiog5a6e6ZmF5riy5p+T5oC75a69ID0g5aOw5piO5oC75a69ICsgZmx1aWRFeHRyYSAqL1xuICBkaXNwbGF5VG90YWw6IG51bWJlcjtcbiAgLyoqIOWIl+WwkeOAgemdoOihpeWuveWQg+a7oeWuueWZqO+8jOS4jemcgOimgeecn+ato+aoqua7miAqL1xuICBpc0ZsdWlkOiBib29sZWFuO1xufVxuXG4vKiog5YiX5aSa77yI5oiW6YeP5LiN5Yiw5a655Zmo5a6977yJ77yac2Nyb2xsLnggPSDlo7DmmI7mgLvlrr3vvIzmraPluLjmqKrmu5ogKi9cbmZ1bmN0aW9uIGZpeGVkTGF5b3V0KGRlY2xhcmVkV2lkdGg6IG51bWJlcik6IEhkVGFibGVIb3Jpem9udGFsTGF5b3V0IHtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxYOiBgJHtNYXRoLmNlaWwoZGVjbGFyZWRXaWR0aCl9cHhgLFxuICAgIGZsdWlkRXh0cmE6IDAsXG4gICAgZGlzcGxheVRvdGFsOiBkZWNsYXJlZFdpZHRoLFxuICAgIGlzRmx1aWQ6IGZhbHNlLFxuICB9O1xufVxuXG4vKiog5YiX5bCR77yac2Nyb2xsLnggPSDlrrnlmajlrr3vvIzlt67pop3mjInlo7DmmI7lrr3mr5TkvovliIbliLDlkITkuJrliqHliJcgKi9cbmZ1bmN0aW9uIGZsdWlkTGF5b3V0KFxuICBjb250YWluZXJXaWR0aDogbnVtYmVyLFxuICBkZWNsYXJlZFdpZHRoOiBudW1iZXIsXG4pOiBIZFRhYmxlSG9yaXpvbnRhbExheW91dCB7XG4gIGNvbnN0IGZsdWlkRXh0cmEgPSBNYXRoLm1heCgwLCBjb250YWluZXJXaWR0aCAtIGRlY2xhcmVkV2lkdGgpO1xuICByZXR1cm4ge1xuICAgIHNjcm9sbFg6IGAke2NvbnRhaW5lcldpZHRofXB4YCxcbiAgICBmbHVpZEV4dHJhLFxuICAgIGRpc3BsYXlUb3RhbDogZGVjbGFyZWRXaWR0aCArIGZsdWlkRXh0cmEsXG4gICAgaXNGbHVpZDogdHJ1ZSxcbiAgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhkLXRhYmxlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vaGQtdGFibGUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2hkLXRhYmxlLmNvbXBvbmVudC5sZXNzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSGRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nO1xuICBASW5wdXQoKSB0YWJsZUNvbHM6IEFycmF5PEhkVGFibGVDb2x1bW4+ID0gW107XG4gIEBJbnB1dCgpIHRhYmxlRGF0YTogUGFnZTxhbnk+O1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd1NlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiDli77pgInliJflvaLmgIHjgIJjaGVja2JveO+8muWkmumAie+8iOm7mOiupO+8ie+8m3JhZGlv77ya5Y2V6YCJ77yM5peg6KGo5aS05YWo6YCJ77yMc2VsZWN0RXZlbnQg5LuN5Zue5Lyg5pWw57uE77yIMCDmiJYgMSDmnaHvvInjgIJcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdFR5cGU6IFwiY2hlY2tib3hcIiB8IFwicmFkaW9cIiA9IFwiY2hlY2tib3hcIjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dPcGVyYXRlQ29sV2FycEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiog5piv5ZCm5bGV56S65YiX6K6+572u77yI6b2/6L2u77yJ77yM6buY6K6k5byA5ZCv77yb5by556qX562J5Zy65pmv5Y+v5LygIGZhbHNlIOWFs+mXrSAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0NvbFNldHRpbmdzOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHZpcnR1YWxTY3JvbGw6IGJvb2xlYW4gPSB0cnVlO1xuICAvKiog5omL5Yqo5oyH5a6a6KGM6auY77yb5LiN5Lyg5YiZ5Zyo6aaW5bGP5riy5p+T5ZCO6Ieq5Yqo5rWL6YePICovXG4gIEBJbnB1dCgpIHZpcnR1YWxJdGVtU2l6ZTogbnVtYmVyO1xuICBASW5wdXQoKSBzZWxlY3RGaWVsZDogc3RyaW5nID0gXCJiaWxsTnVtYmVyXCI7XG4gIC8qKlxuICAgKiDooYzli77pgInnpoHnlKjlrZfmrrXlkI3jgILlrprkuYnlkI7lj5blvZPliY3ooYzor6XlrZfmrrXvvJpcbiAgICog5Li6IHRydWUg5pe256aB55So6K+l6KGM5Yu+6YCJ77yI5YWo6YCJ5Lmf5Lya6Lez6L+H77yJ44CCXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3REaXNhYmxlZEZpZWxkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiDooYzlpLHmlYjlrZfmrrXlkI3jgILlrprkuYnlkI7lj5blvZPliY3ooYzor6XlrZfmrrXvvJpcbiAgICog5Li6IHRydWUg5pe25pW06KGM6IOM5pmv6Imy5Li6ICNGN0Y4RkHjgIJcbiAgICovXG4gIEBJbnB1dCgpIHJvd0ludmFsaWRGaWVsZDogc3RyaW5nO1xuICAvLyDlkIjorqHljLrln5/vvIjnsbvlnovkuI4gaGQtZGV0YWlsLWxpbmVzIOeahCBUb3RhbE9wdGlvbiDkuIDoh7TvvIlcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dUYWJsZVRvdGFsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhYmxlVG90YWxPcHRpb246IEFycmF5PFRvdGFsT3B0aW9uPjtcbiAgLyoqXG4gICAqIOWQiOiuoeWIl+aAu+aVsO+8iOWQq+W6j+WPt+WIl++8jOS4jiBoZC1kZXRhaWwtbGluZXMg5LiA6Ie077yJ77ybXG4gICAqIOS4jeS8oOWImeaMieW9k+WJjeWPr+ingeaVsOaNruWIl+aVsCArIDHvvIjluo/lj7fvvInmjqjnrpfjgIJcbiAgICovXG4gIEBJbnB1dCgpIGNvbHVtbnNOdW1iZXI6IG51bWJlciB8IHN0cmluZztcbiAgQE91dHB1dCgpIHNvcnRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgdGFibGVTZWFyY2hFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqIOihjOWGhee8lui+keWPmOabtO+8iOW3suWGmeWbnuihjOWvueixoe+8m3ByZXZpb3VzKiDkvpvmjqXlj6PlpLHotKXlm57mu5rvvIkgKi9cbiAgQE91dHB1dCgpIGNlbGxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEhkVGFibGVDZWxsQ2hhbmdlPigpO1xuICBASW5wdXQoKSB0YWJsZUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuaYvuekuuWIhumhte+8m2ZhbHNlIOaXtuS4gOasoeWxleekuiB0YWJsZURhdGEuY29udGVudCDlhajpg6jooYwgKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHBhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICAvKipcbiAgICog5piv5ZCm5YmN56uv5YiG6aG177yI5a+5IGNvbnRlbnQg5YWo6YeP5YiH54mH77yJ44CCXG4gICAqIHRydWXvvJrnv7vpobXkuI3op6blj5EgdGFibGVTZWFyY2hFdmVudO+8jOmAguWQiOivpuaDheWFqOmHj+aVsOaNru+8m1xuICAgKiBmYWxzZe+8iOm7mOiupO+8ie+8muacjeWKoeerr+WIhumhte+8jOe/u+mhteinpuWPkeafpeivou+8iOeOsOacieWIl+ihqOihjOS4uu+8ieOAglxuICAgKiDkuI4gcGFnaW5hdGlvbj1mYWxzZSDlkIzml7bnlKjml7bku6XkuI3liIbpobXkuLrlh4bjgIJcbiAgICovXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBmcm9udFBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8g6KGo5qC85YiG6aG15Y+C5pWwXG4gIEBJbnB1dCgpIHRhYmxlUGFnZUluZGV4OiBudW1iZXIgPSAxO1xuICBASW5wdXQoKSB0YWJsZVBhZ2VTaXplOiBudW1iZXIgPSAxMDA7XG4gIEBJbnB1dCgpIGlzRmlyc3RFbnRyeVNlYXJjaDogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNDcm9zc1BhZ2VTZWxlY3Q6IGJvb2xlYW47XG4gIEBPdXRwdXQoKSB0YWJsZVBhZ2VJbmRleENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGFibGVQYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGFibGVQYWdlU2l6ZUNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZVRvdGFsXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB0YWJsZVRvdGFsOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidGFibGVMZWZ0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICB0YWJsZUxlZnRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZVJpZ2h0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICB0YWJsZVJpZ2h0QnV0dG9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBzY3JvbGwgPSBudWxsO1xuXG4gIC8vIOihqOagvOWLvumAieWPguaVsFxuICBpc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICBpc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgbGlzdE9mRGlzcGxheURhdGEgPSBbXTtcbiAgbGlzdE9mQWxsRGF0YSA9IFtdO1xuICBsaXN0T2ZTZWxlY3Rpb246IEFycmF5PGFueT4gfCBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgbWFwT2ZDaGVja2VkSWQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIG1hcE9mQ2hlY2tMaXN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIC8vIOWQiOiuoeWPguaVsFxuICB0YWJsZVRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuICAvLyDnvJPlrZjkv6Hmga9cbiAgdGFibGVDYWNoZU9wdGlvbjogVGFibGVDYWNoZU9wdGlvbiA9IG5ldyBUYWJsZUNhY2hlT3B0aW9uKCk7XG4gIHVzZXJTZXNzaW9uOiBhbnk7XG5cbiAgdGFibGVDb2xzQ2FjaGU6IEFycmF5PEhkVGFibGVDb2x1bW4+ID0gW107XG4gIHNob3dUYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RDb2xMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBzZWxlY3RDb2xMaXN0Tm9kZXNDYWNoZTogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNob3dMaXN0Tm9kZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBpc0Ryb3Bkb3duVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyDorr7nva7liJfnmoTlj6/op4Hmk43kvZzmlbDnu4RcbiAgbm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgLy8g6K6+572u5YiX55qE5LiN5Y+v6KeB5pON5L2c5pWw57uEXG4gIGhpZGVMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuXG4gIC8vIOeCueWHu+aXtumcgOimgeacieS4tOaXtuaVsOe7hOWtmOaUvuS4pOS4qnRyZWUs55So5LqO5Y+W5raI5pe25YCZ5oGi5aSN6LCD5pW05YmN55qE54q25oCBXG4gIGNhbmNlbE5vd0xpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIGNhbmNlbEhpZGVMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBzaG93RGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIGxvY2FsZm9yYWdlOiBhbnkgPSBudWxsO1xuICBsb2NhbHRpb25UbXA6IHN0cmluZyA9IFwiXCI7XG4gIGlzRmlyc3RFbnRyeVNlYXJjaExvY2FsOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiDoh6rliqjmtYvph4/liY3nmoTlhZzlupXooYzpq5jvvIzmtYvph4/lrozmiJDlkI7kvJrmm7TmlrAgKi9cbiAgbWVhc3VyZWRWaXJ0dWFsSXRlbVNpemUgPSA0NztcblxuICAvKiog6K6w5b2V5b2T5YmN5piv5ZCm5aSE5LqO6Jma5ouf5rua5Yqo5qih5byP77yM55So5LqO5YiH5o2iIHBhZ2VTaXplIOaXtumHjeW7uuihqOagvCAqL1xuICBwcml2YXRlIHZpcnR1YWxTY3JvbGxBY3RpdmU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICAvKiog5a6e6ZmF5riy5p+T5YiX5a695ZCI6K6h77yI5ZCr5Yu+6YCJL+W6j+WPtyArIOihpeWuve+8ie+8jOWQiOiuoSBmb290ZXIg6KGo5a6955SoICovXG4gIHRhYmxlQ29sV2lkdGhUb3RhbCA9IDA7XG5cbiAgLyoqIOW+heaMieavlOS+i+WIhue7meWQhOS4muWKoeWIl+eahOaAu+ihpeWuve+8m+WPquW9seWTjeWxleekuu+8jOS4jeWGmeWbniBjb2wud2lkdGjvvIjliJflrr3nvJPlrZjjgIHmi5bmi73ku43nlKjlo7DmmI7lrr3vvIkgKi9cbiAgZmx1aWRFeHRyYVdpZHRoID0gMDtcblxuICAvKiog5YiX5bCR44CB6Z2g6KGl5a695ZCD5ruh5a655Zmo77ya5qih5p2/5o2u5q2k5YqgIGhkLXRhYmxlLS1mbHVpZC1477yM6ZqQ6JePIGZpeGVkLWhlYWRlciDluLjpqbvnmoTmqKrmu5rmp70gKi9cbiAgZmx1aWRIb3Jpem9udGFsID0gZmFsc2U7XG5cbiAgLyoqIOWQhOS4muWKoeWIl+WIhuWIsOeahOihpeWuve+8iOaMieWIl+WvueixoeWPlu+8jGFwcGx5SG9yaXpvbnRhbExheW91dCDml7bmlbTooajph43lu7rvvIkgKi9cbiAgcHJpdmF0ZSBmbHVpZEV4dHJhQnlDb2w6IE1hcDxIZFRhYmxlQ29sdW1uLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKiDmlbDmja7mm7TmlrDlkI7lvoXlpI3kvY3nurXlkJHmu5rliqjkvY3nva4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSBmYWxzZTtcblxuICAvKiog5b2T5YmN5o6S5bqP77yM6KGo5qC86YeN5bu65ZCO55So5LqO5oGi5aSN6KGo5aS05o6S5bqP5oCBICovXG4gIHByaXZhdGUgY3VycmVudFNvcnRLZXk6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFNvcnRWYWx1ZTogc3RyaW5nID0gbnVsbDtcblxuICBAVmlld0NoaWxkKFwiaGRUYWJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgbnpUYWJsZUNvbXBvbmVudDogTnpUYWJsZUNvbXBvbmVudDtcblxuICBwcml2YXRlIHRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5OiBIVE1MRWxlbWVudCA9IG51bGw7XG4gIHByaXZhdGUgdG90YWxGb290ZXJTY3JvbGxIYW5kbGVyOiAoKSA9PiB2b2lkID0gbnVsbDtcbiAgcHJpdmF0ZSB0b3RhbEZvb3RlclN5bmNSZXRyeSA9IDA7XG5cbiAgLyoqIOihqOS9k+acieerlua7muadoeaXtuWQiOiuoSBmb290ZXIg5omN6aKE55WZ5Y+z5L6n5rua5Yqo5p2h5qe9ICovXG4gIHRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgPSBmYWxzZTtcblxuICAvKiog6KeG5Y+jL+WuueWZqOWwuuWvuOWPmOWMluaXtumHjeeulyBzY3JvbGwueCDkuI7lkIjorqHlr7npvZAgKi9cbiAgcHJpdmF0ZSB2aWV3cG9ydFJlc2l6ZVRpbWVyOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIGJvdW5kT25WaWV3cG9ydFJlc2l6ZTogKCkgPT4gdm9pZCA9IG51bGw7XG4gIHByaXZhdGUgaG9zdFJlc2l6ZU9ic2VydmVyOiBhbnkgPSBudWxsO1xuXG4gIC8qKiBzZWxlY3Qg5bGV5byAIC8g5pCc57Si6Ziy5oqW77yI5a+56b2QIGZvcm0tbGluZXPvvIkgKi9cbiAgcHJpdmF0ZSBzZWxlY3RPcGVuQ2hhbmdlU3ViamVjdCA9IG5ldyBTdWJqZWN0PHtcbiAgICBmbjogKG9wZW46IGJvb2xlYW4sIGxpbmU6IGFueSkgPT4gYW55O1xuICAgIG9wZW46IGJvb2xlYW47XG4gICAgbGluZTogYW55O1xuICAgIGNvbDogSGRUYWJsZUNvbHVtbjtcbiAgfT4oKTtcbiAgcHJpdmF0ZSBzZWxlY3RPcGVuQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2VsZWN0U2VhcmNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PHtcbiAgICBmbjogKGtleXdvcmQ6IHN0cmluZywgbGluZTogYW55KSA9PiBhbnk7XG4gICAga2V5d29yZDogc3RyaW5nO1xuICAgIGxpbmU6IGFueTtcbiAgICBjb2w6IEhkVGFibGVDb2x1bW47XG4gIH0+KCk7XG4gIHByaXZhdGUgc2VsZWN0U2VhcmNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIC8qKiDlvILmraXlm57lhpkgb3B0aW9ucyDnmoTorqLpmIXvvIzpgb/lhY3ov57ngrnmkJzntKLms4TmvI8gKi9cbiAgcHJpdmF0ZSBzZWxlY3RMb2FkZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3RFbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb21tb25TZXNzaW9uU2VydmljZTogQ29tbW9uU2Vzc2lvblNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMubG9jYWxmb3JhZ2UgPSBsb2NhbGZvcmFnZS5jcmVhdGVJbnN0YW5jZSh7XG4gICAgICBkcml2ZXI6IGxvY2FsZm9yYWdlLklOREVYRUREQixcbiAgICAgIG5hbWU6IFwiaGQtZnNjbVwiLCAvLyDorr7nva7lrZjlgqjlupPnmoTlkI3np7BcbiAgICAgIHZlcnNpb246IDEuMCwgLy8g6K6+572u5a2Y5YKo5bqT55qE54mI5pysXG4gICAgICBzdG9yZU5hbWU6IFwiaGQtZnNjbS1zdG9yZVwiLCAvLyDorr7nva7lrZjlgqjlupPnmoTlrZjlgqjnqbrpl7TlkI3np7BcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKCk7XG4gICAgdGhpcy51bmJpbmRWaWV3cG9ydFJlc2l6ZVN5bmMoKTtcbiAgICBpZiAodGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VhcmNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RMb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0TG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOS+m+S4muWKoeWcqOiHquihjOWGmeWbniBvcHRpb25zIOWQjuinpuWPkSBPblB1c2gg5Yi35paw77yI5LyY5YWIIHJldHVybiBPYnNlcnZhYmxlL1Byb21pc2Ug55Sx57uE5Lu25aSE55CG77yJICovXG4gIG1hcmtGb3JDaGVjaygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRmlyc3RFbnRyeVNlYXJjaCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWwgPSB0aGlzLmlzRmlyc3RFbnRyeVNlYXJjaDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNDcm9zc1BhZ2VTZWxlY3QgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbCA9IHRoaXMuaXNDcm9zc1BhZ2VTZWxlY3Q7XG4gICAgfVxuICAgIHRoaXMubG9jYWx0aW9uVG1wID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgaWYgKHRoaXMubG9jYWx0aW9uVG1wKSB7XG4gICAgICB0aGlzLmxvY2FsdGlvblRtcCA9IHRoaXMubG9jYWx0aW9uVG1wLnJlcGxhY2UoL1xcLy9nLCBcIl9cIik7XG4gICAgfVxuICAgIHRoaXMudXNlclNlc3Npb24gPSB0aGlzLmNvbW1vblNlc3Npb25TZXJ2aWNlLmdldFNlc3Npb24oXG4gICAgICBcIl9fanlfYXV0aG9yaXphdGlvbl9zZXNzaW9uX19cIixcbiAgICApO1xuICAgIC8vIOeUqOS6juW8gOWPkeeOr+Wig+iwg+ivlVxuICAgIGlmICghdGhpcy51c2VyU2Vzc2lvbikge1xuICAgICAgdGhpcy51c2VyU2Vzc2lvbiA9IHtcbiAgICAgICAgdXNlckNvZGU6IFwiZGV2XCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuYmluZFZpZXdwb3J0UmVzaXplU3luYygpO1xuICAgIHRoaXMuZGVsZXRlSGlkZUl0ZW0oKTtcbiAgICBpZiAoIXRoaXMudGFibGVDb2xzIHx8IHRoaXMudGFibGVDb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgIC5yZWFkeSgpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0SW5pdExvY2FsZm9yYWdlKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhzdGVwMVwiLCBlKTtcbiAgICAgICAgdGhyb3cgXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uFwiO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2UpIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wic2VsZWN0VHlwZVwiXSAmJlxuICAgICAgY2hhbmdlc1tcInNlbGVjdFR5cGVcIl1bXCJwcmV2aW91c1ZhbHVlXCJdICE9IG51bGwgJiZcbiAgICAgIGNoYW5nZXNbXCJzZWxlY3RUeXBlXCJdW1wiY3VycmVudFZhbHVlXCJdICE9PVxuICAgICAgICBjaGFuZ2VzW1wic2VsZWN0VHlwZVwiXVtcInByZXZpb3VzVmFsdWVcIl1cbiAgICApIHtcbiAgICAgIHRoaXMucmVzZXRTdGF0dXMoKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcInRhYmxlRGF0YVwiXSB8fFxuICAgICAgY2hhbmdlc1tcInRhYmxlVG90YWxPcHRpb25cIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJzaG93VGFibGVUb3RhbFwiXSB8fFxuICAgICAgY2hhbmdlc1tcImNvbHVtbnNOdW1iZXJcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl1cbiAgICApIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVGFibGVUb3RhbCgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNoYW5nZXMgJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJwcmV2aW91c1ZhbHVlXCJdXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl1bXCJwYWdlU2l6ZVwiXSAhPT1cbiAgICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVtcInBhZ2VTaXplXCJdIHx8XG4gICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl1bXCJwYWdlTnVtYmVyXCJdICE9PVxuICAgICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJwcmV2aW91c1ZhbHVlXCJdW1wicGFnZU51bWJlclwiXVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgICAgLy8g5Lia5Yqh5Y+v6IO95oqKIFBhZ2UucGFnZVNpemUg5YaZ5oiQIGNvbnRlbnQubGVuZ3Ro77yM5o2i5pWw5o2u5pe25bCx5Lya6LWw5Yiw6L+Z6YeM77yMXG4gICAgICAgIC8vIOW/hemhu+mHjeeul+aoquWQkeW4g+WxgOOAgua7muWKqOaooeW8j+S4jeWPmOaXtuS4jeS8mumHjeW7uu+8jOaOkuW6j+aAgeS4jeS8muiiq+a4heaOieOAglxuICAgICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKGZhbHNlKTtcbiAgICAgICAgLy8g57+76aG1L+aUuSBwYWdlU2l6Ze+8muS4u+WKqOWkmuasoeWkjeS9je+8jOimhuebliBDREsg5byC5q2l5riy5p+T5pe25bqPXG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbCkge1xuICAgICAgICB0aGlzLnJlc2V0U3RhdHVzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0pIHtcbiAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgIC8vIOS4jeiuuuaYr+WQpuiZmuaLn+a7muWKqO+8jOaVsOaNruWPmOWMluWQjumDveimgemHjeeul+aoquWQkeW4g+WxgFxuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICAvLyDmlbDmja7mm7TmlrDlkI7lpI3kvY3nurXlkJHmu5rliqjvvIjlkKvomZrmi5/mu5rliqjlnLrmma/vvIlcbiAgICAgIHRoaXMuc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0gJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0uY3VycmVudFZhbHVlKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5wcmV2aW91c1ZhbHVlKSAmJlxuICAgICAgY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5wcmV2aW91c1ZhbHVlICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuZGVsZXRlSGlkZUl0ZW0oKTtcbiAgICAgIGlmICghdGhpcy50YWJsZUNvbHMgfHwgdGhpcy50YWJsZUNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgICAgLnJlYWR5KClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZ2V0SW5pdExvY2FsZm9yYWdlKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhzdGVwMlwiLCBlKTtcbiAgICAgICAgICB0aHJvdyBcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4XCI7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChjaGFuZ2VzW1wicGFnaW5hdGlvblwiXSAmJiAhY2hhbmdlc1tcInBhZ2luYXRpb25cIl0uZmlyc3RDaGFuZ2UpIHx8XG4gICAgICAoY2hhbmdlc1tcImZyb250UGFnaW5hdGlvblwiXSAmJiAhY2hhbmdlc1tcImZyb250UGFnaW5hdGlvblwiXS5maXJzdENoYW5nZSlcbiAgICApIHtcbiAgICAgIC8vIOWIhumhteaooeW8j+WIh+aNoumcgOmHjeW7uiBuei10YWJsZe+8iGZyb250IC8gc2VydmVyIC8gbm9uZe+8iVxuICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleCA9IDE7XG4gICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKHRydWUpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOaYr+WQpui1sOWJjeerr+WIhumhte+8iOWvuSBjb250ZW50IOWIh+eJh++8jOS4jeivt+axguWQjuerr++8iSAqL1xuICBnZXQgdXNlRnJvbnRQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMucGFnaW5hdGlvbiAmJiAhIXRoaXMuZnJvbnRQYWdpbmF0aW9uO1xuICB9XG5cbiAgZGVsZXRlSGlkZUl0ZW0oKSB7XG4gICAgLy8g6aaW5YWI5oqKaXNTaG935Li6ZmFsc2XmlbDmja7liZTpmaTmjolcbiAgICB0aGlzLnRhYmxlQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgLy8g5aaC5p6c5a+56LGh5rKh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnpu5jorqTkuLogdHJ1Ze+8jOS/neeVmeivpeWvueixoVxuICAgICAgaWYgKCFpdGVtLmhhc093blByb3BlcnR5KFwiaXNTaG93XCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8g5aaC5p6c5a+56LGh5pyJIGlzU2hvdyDlsZ7mgKfvvIzliJnmo4Dmn6XlhbblgLzmmK/lkKbkuLogdHJ1ZVxuICAgICAgcmV0dXJuIGl0ZW0uaXNTaG93ID09PSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgc29ydChzb3J0OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmN1cnJlbnRTb3J0S2V5ID0gc29ydCAmJiBzb3J0LmtleTtcbiAgICB0aGlzLmN1cnJlbnRTb3J0VmFsdWUgPSBzb3J0ICYmIHNvcnQudmFsdWU7XG4gICAgdGhpcy5zb3J0RXZlbnQuZW1pdChzb3J0KTtcbiAgfVxuXG4gIGdldENvbFNvcnQoY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5jYW5Tb3J0IHx8ICF0aGlzLmN1cnJlbnRTb3J0S2V5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5uYW1lID09PSB0aGlzLmN1cnJlbnRTb3J0S2V5ID8gdGhpcy5jdXJyZW50U29ydFZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIHRvZ2dsZVNob3dEZXRhaWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RGV0YWlsID0gIXRoaXMuc2hvd0RldGFpbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQodHJ1ZSk7XG4gIH1cblxuICBnZXQgZWZmZWN0aXZlVmlydHVhbEl0ZW1TaXplKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudmlydHVhbEl0ZW1TaXplICE9IG51bGwgJiYgdGhpcy52aXJ0dWFsSXRlbVNpemUgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy52aXJ0dWFsSXRlbVNpemU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIOe6teWQkeWPr+eUqOmrmOW6puaJo+WHj++8muaMiemSruWMui/lkIjorqEv5YiG6aG1562J5Zu65a6a5Y2g5L2N44CCXG4gICAqIOW/hemhu+S4jiBkZWFsU2Nyb2xsIC8gcHJlc2V0U2Nyb2xsQmVmb3JlUmVtb3VudCDkvb/nlKjlkIzkuIDlpZfvvIzlkKbliJnkvJror6/liKTjgIzog73mlL7kuIvjgI3ogIzkuI3orr4gc2Nyb2xsLnnjgIJcbiAgICovXG4gIHByaXZhdGUgZ2V0U2Nyb2xsWU1heE9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy50YWJsZVRvdGFsID8gMTgwIDogMTQwKSArIDIxNjtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvZPliY3op4blj6Plrp7pmYXlsZXnpLrnmoTooYzmlbDjgIJcbiAgICog5YmN56uv5YiG6aG15oyJIHBhZ2VJbmRleC9wYWdlU2l6ZSDliIfniYfkvLDnrpfvvIzpgb/lhY3nlKjlhajph48gbGVuZ3RoIOivr+WIpOmcgOimgee6teWQkea7muWKqOOAglxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWaXNpYmxlUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50IDogW107XG4gICAgY29uc3QgdG90YWwgPSBjb250ZW50Lmxlbmd0aDtcbiAgICBpZiAoIXRoaXMudXNlRnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICByZXR1cm4gdG90YWw7XG4gICAgfVxuICAgIGlmICh0b3RhbCA8PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgcGFnZVNpemUgPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgOiAxMDtcbiAgICBjb25zdCBwYWdlSW5kZXggPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA6IDE7XG4gICAgY29uc3Qgc3RhcnQgPSAocGFnZUluZGV4IC0gMSkgKiBwYWdlU2l6ZTtcbiAgICBpZiAoc3RhcnQgPj0gdG90YWwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4ocGFnZVNpemUsIHRvdGFsIC0gc3RhcnQpO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteWGheWuuemrmOW6puaYr+WQpui2heWHuuinhuWPo++8iOmcgOimgeihqOWGhee6teWQkea7muWKqO+8iSAqL1xuICBnZXQgbmVlZHNWZXJ0aWNhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICBjb25zdCByb3dDb3VudCA9IHRoaXMuZ2V0VmlzaWJsZVJvd0NvdW50KCk7XG4gICAgaWYgKHJvd0NvdW50IDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgZXN0aW1hdGVkSGVpZ2h0ID0gcm93Q291bnQgKiB0aGlzLmVmZmVjdGl2ZVZpcnR1YWxJdGVtU2l6ZTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIGVzdGltYXRlZEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCAtIG1heE9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHJvd0NvdW50ID4gMTAwO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteaVsOaNruiDveWujOaVtOWxleekuuaXtuS4jeWQr+eUqOiZmuaLn+a7muWKqO+8jOmBv+WFjeWwkemHj+aVsOaNruS5n+WHuueOsOa7muWKqOadoSAqL1xuICBnZXQgdXNlVmlydHVhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZWVkc1ZlcnRpY2FsU2Nyb2xsO1xuICB9XG5cbiAgZ2V0UmlnaHRTdGlja3koY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGNvbC5maXhlZCA9PT0gXCJyaWdodFwiID8gYCR7Y29sLmZpeGVkUmlnaHRXaWR0aCB8fCAwfXB4YCA6IG51bGw7XG4gIH1cblxuICBnZXRMZWZ0U3RpY2t5KGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBjb2wuZml4ZWQgPT09IFwibGVmdFwiID8gYCR7Y29sLmZpeGVkV2lkdGggfHwgMH1weGAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOW6j+WPt+WIl+WbuuWumuWuve+8iOWQqyBwYWRkaW5n77yM5Y+v5a6557qzIDYg5L2N5aaCIDE5OTk5Ne+8ieOAglxuICAgKiDkuI3plIHmrbvml7booajkvZPkvJrpmo/kvY3mlbDlj5jlrr3vvIgx4oaSfjY0cHjvvIwxOTk5OTXihpJ+NjdweO+8ie+8jOWQiOiuoeihjOWvueS4jem9kOOAglxuICAgKi9cbiAgcmVhZG9ubHkgbGluZU51bWJlckNvbFdpZHRoID0gNzI7XG5cbiAgLyoqIOW8gOWQr+WQiOiuoeaXtuW6j+WPt+WIl+eahCBsZWZ077yI6Lef5Zyo5Yu+6YCJ5YiX5ZCO6Z2i77yJICovXG4gIGdldCBsaW5lTnVtYmVyTGVmdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5zaG93U2VsZWN0ZWQgPyBTRUxFQ1RfQ09MX1dJRFRIIDogMCkgKyBcInB4XCI7XG4gIH1cblxuICBnZXQgbGluZU51bWJlckNvbFdpZHRoUHgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyQ29sV2lkdGggKyBcInB4XCI7XG4gIH1cblxuICAvKipcbiAgICog5pegIHNjcm9sbC54IOaXtuWQiOiuoei1sCBmbHVpZO+8iHdpZHRoOjEwMCXvvInjgIJcbiAgICog5YiX5bCR5pe25Lmf5Lya6K6+IHNjcm9sbC5477yI6KGl5a695ZCD5ruh77yJ77yM5ZCI6K6h6LWw5Zu65a6a6KGo5a6944CCXG4gICAqL1xuICBnZXQgaXNUb3RhbEZvb3RlckZsdWlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLngpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NvbFZpc2libGUoY29sOiBIZFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhY29sICYmIGNvbC5pc1Nob3cgIT09IGZhbHNlO1xuICB9XG5cbiAgLyoqIOS4muWKoeWIl+WjsOaYjuWuve+8muacqumFjee9ruaXtuaMiSBmaXhDb2xXaWR0aCAqL1xuICBwcml2YXRlIGdldENvbERlY2xhcmVkV2lkdGgoY29sOiBIZFRhYmxlQ29sdW1uKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29sICYmIGNvbC53aWR0aCA+IDAgPyBjb2wud2lkdGggOiBDb2xXaWR0aC5maXhDb2xXaWR0aDtcbiAgfVxuXG4gIC8qKiDlo7DmmI7liJflrr3lkIjorqHvvJrli77pgInliJcgKyDluo/lj7fliJcgKyDlj6/op4HkuJrliqHliJfvvIzkuI3lkKvooaXlrr0gKi9cbiAgcHJpdmF0ZSBnZXREZWNsYXJlZENvbFdpZHRoVG90YWwoKTogbnVtYmVyIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGlmICh0aGlzLnNob3dTZWxlY3RlZCkge1xuICAgICAgdG90YWwgKz0gU0VMRUNUX0NPTF9XSURUSDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd1RhYmxlVG90YWwpIHtcbiAgICAgIHRvdGFsICs9IHRoaXMubGluZU51bWJlckNvbFdpZHRoO1xuICAgIH1cbiAgICAodGhpcy50YWJsZUNvbHMgfHwgW10pLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNDb2xWaXNpYmxlKGNvbCkpIHtcbiAgICAgICAgdG90YWwgKz0gdGhpcy5nZXRDb2xEZWNsYXJlZFdpZHRoKGNvbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG5cbiAgLyoqIOaooeadv+mHjCB0aCAvIHRkIC8g5ZCI6K6hIGNvbCDnlKjnmoTliJflrr3vvJrlo7DmmI7lrr0gKyDor6XliJfmjInmr5TkvovliIbliLDnmoTooaXlrr0gKi9cbiAgZ2V0Q29sRGlzcGxheVdpZHRoKGNvbDogSGRUYWJsZUNvbHVtbik6IG51bWJlciB7XG4gICAgY29uc3QgZGVjbGFyZWQgPSB0aGlzLmdldENvbERlY2xhcmVkV2lkdGgoY29sKTtcbiAgICBpZiAoIWNvbCB8fCB0aGlzLmZsdWlkRXh0cmFXaWR0aCA8PSAwKSB7XG4gICAgICByZXR1cm4gZGVjbGFyZWQ7XG4gICAgfVxuICAgIGNvbnN0IGV4dHJhID0gdGhpcy5mbHVpZEV4dHJhQnlDb2wuZ2V0KGNvbCk7XG4gICAgcmV0dXJuIGRlY2xhcmVkICsgKGV4dHJhID4gMCA/IGV4dHJhIDogMCk7XG4gIH1cblxuICAvKipcbiAgICog5oqKIGZsdWlkRXh0cmEg5oyJ5ZCE5Y+v6KeB5Lia5Yqh5YiX5aOw5piO5a695q+U5L6L5YiG6YWN77yI5pyA5aSn5L2Z5pWw5rOV77yJ77yMXG4gICAqIOWLvumAieWIlyAvIOW6j+WPt+WIl+S4jeWPguS4ju+8m+S/neivgeWQhOWIl+ihpeWuveS5i+WSjOetieS6jiBmbHVpZEV4dHJh44CCXG4gICAqL1xuICBwcml2YXRlIHJlYnVpbGRGbHVpZEV4dHJhQnlDb2woZmx1aWRFeHRyYTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mbHVpZEV4dHJhQnlDb2wgPSBuZXcgTWFwKCk7XG4gICAgaWYgKGZsdWlkRXh0cmEgPD0gMCB8fCAhdGhpcy50YWJsZUNvbHMgfHwgIXRoaXMudGFibGVDb2xzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0czogQXJyYXk8e1xuICAgICAgY29sOiBIZFRhYmxlQ29sdW1uO1xuICAgICAgZGVjbGFyZWQ6IG51bWJlcjtcbiAgICAgIHNoYXJlOiBudW1iZXI7XG4gICAgICBmcmFjOiBudW1iZXI7XG4gICAgfT4gPSBbXTtcbiAgICBsZXQgc3VtRGVjbGFyZWQgPSAwO1xuICAgIHRoaXMudGFibGVDb2xzLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzQ29sVmlzaWJsZShjb2wpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY2xhcmVkID0gdGhpcy5nZXRDb2xEZWNsYXJlZFdpZHRoKGNvbCk7XG4gICAgICBzdW1EZWNsYXJlZCArPSBkZWNsYXJlZDtcbiAgICAgIHBhcnRzLnB1c2goeyBjb2wsIGRlY2xhcmVkLCBzaGFyZTogMCwgZnJhYzogMCB9KTtcbiAgICB9KTtcbiAgICBpZiAoc3VtRGVjbGFyZWQgPD0gMCB8fCAhcGFydHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBhc3NpZ25lZCA9IDA7XG4gICAgcGFydHMuZm9yRWFjaCgocGFydCkgPT4ge1xuICAgICAgY29uc3QgZXhhY3QgPSAoZmx1aWRFeHRyYSAqIHBhcnQuZGVjbGFyZWQpIC8gc3VtRGVjbGFyZWQ7XG4gICAgICBwYXJ0LnNoYXJlID0gTWF0aC5mbG9vcihleGFjdCk7XG4gICAgICBwYXJ0LmZyYWMgPSBleGFjdCAtIHBhcnQuc2hhcmU7XG4gICAgICBhc3NpZ25lZCArPSBwYXJ0LnNoYXJlO1xuICAgIH0pO1xuICAgIGxldCByZW1haW4gPSBmbHVpZEV4dHJhIC0gYXNzaWduZWQ7XG4gICAgcGFydHNcbiAgICAgIC5zbGljZSgpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5mcmFjIC0gYS5mcmFjKVxuICAgICAgLmZvckVhY2goKHBhcnQpID0+IHtcbiAgICAgICAgaWYgKHJlbWFpbiA8PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhcnQuc2hhcmUgKz0gMTtcbiAgICAgICAgcmVtYWluIC09IDE7XG4gICAgICB9KTtcbiAgICBwYXJ0cy5mb3JFYWNoKChwYXJ0KSA9PiB7XG4gICAgICBpZiAocGFydC5zaGFyZSA+IDApIHtcbiAgICAgICAgdGhpcy5mbHVpZEV4dHJhQnlDb2wuc2V0KHBhcnQuY29sLCBwYXJ0LnNoYXJlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiDmiormqKrlkJHluIPlsYDnu5Pmnpzlhpnlm57nu4Tku7bnirbmgIHvvIhkZWFsU2Nyb2xsIC8gc3luY0hvcml6b250YWxTY3JvbGwg5YWx55So77yJICovXG4gIHByaXZhdGUgYXBwbHlIb3Jpem9udGFsTGF5b3V0KGxheW91dDogSGRUYWJsZUhvcml6b250YWxMYXlvdXQpOiB2b2lkIHtcbiAgICB0aGlzLmZsdWlkRXh0cmFXaWR0aCA9IGxheW91dC5mbHVpZEV4dHJhO1xuICAgIHRoaXMuZmx1aWRIb3Jpem9udGFsID0gbGF5b3V0LmlzRmx1aWQ7XG4gICAgdGhpcy5yZWJ1aWxkRmx1aWRFeHRyYUJ5Q29sKGxheW91dC5mbHVpZEV4dHJhKTtcbiAgICB0aGlzLnRhYmxlQ29sV2lkdGhUb3RhbCA9IGxheW91dC5kaXNwbGF5VG90YWw7XG4gIH1cblxuICAvKiogZmx1aWQg4oaSIDEwMCXvvJvlm7rlrpog4oaSIHNjcm9sbC5477yI5LiO6KGo5L2T5ZCM5LiA5aWX5qiq5ZCR5a695bqm77yJICovXG4gIGdldCB0b3RhbEZvb3RlclRhYmxlV2lkdGgoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc1RvdGFsRm9vdGVyRmx1aWQpIHtcbiAgICAgIHJldHVybiBcIjEwMCVcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnhcbiAgICAgID8gU3RyaW5nKHRoaXMuc2Nyb2xsLngpXG4gICAgICA6IHRoaXMudGFibGVDb2xXaWR0aFRvdGFsID4gMFxuICAgICAgICA/IHRoaXMudGFibGVDb2xXaWR0aFRvdGFsICsgXCJweFwiXG4gICAgICAgIDogXCIxMDAlXCI7XG4gIH1cblxuICAvKiog5b2T5YmN6aG16KGM5Y+377yI6Leo6aG16L+e57ut77yM5LuOIDEg5byA5aeL77yJICovXG4gIGdldExpbmVOdW1iZXIoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGFnZSA9XG4gICAgICBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpIDogMTtcbiAgICBjb25zdCBzaXplID1cbiAgICAgIE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpIDogMDtcbiAgICBjb25zdCByb3dJbmRleCA9IE51bWJlcihpbmRleCkgPj0gMCA/IE51bWJlcihpbmRleCkgOiAwO1xuICAgIHJldHVybiAocGFnZSAtIDEpICogc2l6ZSArIHJvd0luZGV4ICsgMTtcbiAgfVxuXG4gIHRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlciwgZGF0YTogYW55KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBrZXkgPSBkYXRhICYmIGRhdGFbdGhpcy5zZWxlY3RGaWVsZF07XG4gICAgcmV0dXJuIGtleSAhPSBudWxsID8gU3RyaW5nKGtleSkgOiBgcm93LSR7aW5kZXh9YDtcbiAgfTtcblxuICAvKiog6Jma5ouf5rua5Yqo5oyJ5pWw57uE5LiL5qCH6L+96Liq77yM6YG/5YWN5Lia5Yqh5Li76ZSuIHRyYWNrQnkg5a+86Ie0IENESyDooYzlpI3nlKjplJnkvY0gKi9cbiAgdmlydHVhbFRyYWNrQnlSb3cgPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICB0cmFja0J5Q29sID0gKF9pbmRleDogbnVtYmVyLCBjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBjb2wudGl0bGU7XG4gIH07XG5cbiAgZ2V0SW5pdExvY2FsZm9yYWdlKCkge1xuICAgIC8vIOmmluWFiOiOt+WPluW9k+WJjWhkLXRhYmxl5a2Y5YKo55qE5pWw5o2uIOWmguaenOayoeacie+8jOWImeWIneWni+WMluS4i+W9k+WJjeeahOaVsOaNrlxuICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgIC5nZXRJdGVtKFxuICAgICAgICBcImhkLXRhYmxlX1wiICtcbiAgICAgICAgICB0aGlzLnVzZXJTZXNzaW9uLnVzZXJDb2RlICtcbiAgICAgICAgICBcIl9cIiArXG4gICAgICAgICAgdGhpcy5sb2NhbHRpb25UbXAgK1xuICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICB0aGlzLnV1aWQsXG4gICAgICApXG4gICAgICAudGhlbigodmFsdWU6IFRhYmxlQ2FjaGVPcHRpb24pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5ub3JtYWxpemVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uICYmXG4gICAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgJiZcbiAgICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemUgPSB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemU7XG4gICAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA9IHRoaXMudGFibGVQYWdlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyDmnI3liqHnq6/liIbpobXmiY3lnKjliJ3lp4vljJbml7bmipsgcGFnZVNpemVDaGFuZ2VFdmVudCDop6blj5HniLbmn6Xor6LvvJvliY3nq6/liIbpobXkuI3miptcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMucGFnaW5hdGlvbiAmJlxuICAgICAgICAgICF0aGlzLmZyb250UGFnaW5hdGlvbiAmJlxuICAgICAgICAgIHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnRhYmxlUGFnZVNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gbmV3IFRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgICAgICB0aGlzLmluaXRUYWJsZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBpbml0VGFibGUoKSB7XG4gICAgdGhpcy5zaG93VGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMudXVpZCkge1xuICAgICAgdGhyb3cgXCJoZC10YWJsZee8uuWksXV1aWTlj4LmlbDvvIzor7fkvb/nlKjnvJbovpHlmajmj5Lku7bnlJ/miJDlubbnu5loZC10YWJsZei1i+S6iHV1aWTlsZ7mgKdcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuanVkZ2VSZXBlYXRDb2xzKCkpIHtcbiAgICAgIHRoaXMuZGVhbENvbHMoKTtcbiAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgdGhpcy5kZWFsT3BlcmF0ZUJ0bigpO1xuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlID0gbnVsbDtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOiZmuaLny/mma7pgJrmqKHlvI/liIfmjaLml7bph43lu7rooajmoLzvvIzpgb/lhY3mrovnlZnmu5rliqjlrrnlmaggKi9cbiAgYXBwbHlUYWJsZVNjcm9sbE1vZGUoZm9yY2VSZW1vdW50ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCB1c2VWaXJ0dWFsID0gdGhpcy51c2VWaXJ0dWFsU2Nyb2xsO1xuICAgIGNvbnN0IG1vZGVDaGFuZ2VkID1cbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlICE9PSB1c2VWaXJ0dWFsO1xuICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSA9IHVzZVZpcnR1YWw7XG5cbiAgICBpZiAoZm9yY2VSZW1vdW50IHx8IG1vZGVDaGFuZ2VkKSB7XG4gICAgICAvLyDlv4XpobvlhYjlhpnlpb0gc2Nyb2xsLnnvvIzlho3liJvlu7ogbnotdGFibGXjgIJcbiAgICAgIC8vIG5nLXpvcnJvIOWPquWcqCBBZnRlclZpZXdJbml0IOe7keS4gOasoSBoZWFkZXIvYm9keSDnmoQgc2Nyb2xsIOWQjOatpe+8m1xuICAgICAgLy8g6Iul5YWI5LulIHk9bnVsbCDliJvlu7rlho3mlLnmiJDmnIkgee+8jOihqOWktOebkeWQrOS8muS4ou+8jOihqOeOsOS4uuWIl+WktOS4jei3n+edgOaoqua7muOAglxuICAgICAgdGhpcy5wcmVzZXRTY3JvbGxCZWZvcmVSZW1vdW50KHVzZVZpcnR1YWwpO1xuICAgICAgdGhpcy5yZW1vdW50VGFibGUodXNlVmlydHVhbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJldkhhc1ggPSAhISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC54KTtcbiAgICBjb25zdCBwcmV2SGFzWSA9ICEhKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnkpO1xuICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgIGNvbnN0IG5leHRIYXNYID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueCk7XG4gICAgY29uc3QgbmV4dEhhc1kgPSAhISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC55KTtcbiAgICAvLyBzY3JvbGwueCAvIHNjcm9sbC55IOS7juaXoOWIsOacie+8iOaIluWPjei/h+adpe+8ieaXtuW/hemhu+mHjeW7uu+8jOWOn+WcsOaUueWAvOS4jeeUn+aViO+8mlxuICAgIC8vIC0gee+8mm5nLXpvcnJvIDgg5Y+q5ZyoIEFmdGVyVmlld0luaXQg57uR5LiA5qyh6KGo5aS0L+ihqOS9k+a7muWKqOWQjOatpe+8jOS4lOWGs+WumuihqOWktOaYr+WQpuaLhuaIkOeLrOeriyB0YWJsZVxuICAgIC8vIC0geO+8muWGs+WumuaYr+WQpuW4piBhbnQtdGFibGUtZml4ZWTvvIh0YWJsZS1sYXlvdXQ6IGZpeGVk77yJ77yM5Yu+6YCJ5YiX6ZSB5a695L6d6LWW5a6DXG4gICAgaWYgKHByZXZIYXNZICE9PSBuZXh0SGFzWSB8fCBwcmV2SGFzWCAhPT0gbmV4dEhhc1gpIHtcbiAgICAgIHRoaXMucmVtb3VudFRhYmxlKHVzZVZpcnR1YWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuYWZ0ZXJUYWJsZVJlbmRlcih1c2VWaXJ0dWFsKTtcbiAgfVxuXG4gIC8qKiDplIDmr4Hlubbph43lu7ogbnotdGFibGXvvJrnrYkgRE9NIOWHuuadpeWQjuWGjeaMieecn+WunuWuueWZqOWuvemHjeeul+S4gOasoeaoquWQkeW4g+WxgCAqL1xuICBwcml2YXRlIHJlbW91bnRUYWJsZSh1c2VWaXJ0dWFsOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zaG93VGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2hvd1RhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5hZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiog6YeN5bu65YmN6aKE6K6+IHNjcm9sbO+8jOS/neivgSBBZnRlclZpZXdJbml0IOaXtiBoZWFkZXIvYm9keSDnu5PmnoTlt7LmraPnoa4gKi9cbiAgcHJpdmF0ZSBwcmVzZXRTY3JvbGxCZWZvcmVSZW1vdW50KHVzZVZpcnR1YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBtYXhPZmZzZXQgPSB0aGlzLmdldFNjcm9sbFlNYXhPZmZzZXQoKTtcbiAgICBjb25zdCB4ID0gdGhpcy5zY3JvbGwgPyB0aGlzLnNjcm9sbC54IDogbnVsbDtcbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsICYmICF1c2VWaXJ0dWFsKSB7XG4gICAgICB0aGlzLnNjcm9sbCA9IHsgeCwgeTogbnVsbCB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjcm9sbCA9IHtcbiAgICAgIHgsXG4gICAgICB5OiBgY2FsYygxMDB2aCAtICR7bWF4T2Zmc2V0fXB4KWAsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYWZ0ZXJUYWJsZVJlbmRlcih1c2VWaXJ0dWFsOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHVzZVZpcnR1YWwpIHtcbiAgICAgIHRoaXMucmVmcmVzaFZpcnR1YWxTY3JvbGxWaWV3cG9ydCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgdGhpcy5tZWFzdXJlVmlydHVhbEl0ZW1TaXplKHRydWUpO1xuICAgICAgLy8g5a6e5rWL6KGM6auY5ZCO5Y+v6IO95LuO44CM6IO95pS+5LiL44CN5Y+Y5Li644CM6LaF5Ye644CN77yM6ZyA5YiH5o2i5rua5Yqo5qih5byPXG4gICAgICBpZiAodGhpcy51c2VWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgfSk7XG4gIH1cblxuICByZWZyZXNoVmlydHVhbFNjcm9sbFZpZXdwb3J0KGZvcmNlTWVhc3VyZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnVzZVZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIGlmIChmb3JjZU1lYXN1cmUpIHtcbiAgICAgICAgdGhpcy5tZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlTWVhc3VyZSk7XG4gICAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0ID1cbiAgICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50ICYmIHRoaXMubnpUYWJsZUNvbXBvbmVudC5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gICAgICBpZiAoIXZpZXdwb3J0KSB7XG4gICAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lYXN1cmVkID0gdGhpcy5tZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlTWVhc3VyZSk7XG4gICAgICBpZiAobWVhc3VyZWQpIHtcbiAgICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB2aWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2VNZWFzdXJlKTtcbiAgICAgICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICAgICAgdmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIOaVsOaNruWIt+aWsOWQjuWwhuihqOS9k+e6teWQkea7muWKqOWkjeS9jeWIsOmhtumDqCAqL1xuICBwcml2YXRlIHJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uelRhYmxlQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG56VGFibGUgPSB0aGlzLm56VGFibGVDb21wb25lbnQgYXMgYW55O1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5uelRhYmxlQ29tcG9uZW50LmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICBpZiAodmlld3BvcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgKHZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9PZmZzZXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAodmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb09mZnNldCgwKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgKHZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9JbmRleCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICh2aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICB9XG4gICAgICBjb25zdCB2aWV3cG9ydEVsID1cbiAgICAgICAgdmlld3BvcnQuZWxlbWVudFJlZiAmJlxuICAgICAgICAodmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgIHZpZXdwb3J0RWwuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYm9keUNhbmRpZGF0ZXMgPSBbXG4gICAgICBuelRhYmxlLm1peFRhYmxlQm9keU5hdGl2ZUVsZW1lbnQsXG4gICAgICBuelRhYmxlLnRhYmxlQm9keU5hdGl2ZUVsZW1lbnQsXG4gICAgICBuelRhYmxlLnRhYmxlQm9keUVsZW1lbnQgJiYgbnpUYWJsZS50YWJsZUJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgXTtcbiAgICBib2R5Q2FuZGlkYXRlcy5mb3JFYWNoKChlbDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHRhYmxlTWFpbiA9XG4gICAgICBuelRhYmxlLnRhYmxlTWFpbkVsZW1lbnQgJiZcbiAgICAgIChuelRhYmxlLnRhYmxlTWFpbkVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgaWYgKCF0YWJsZU1haW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZXMgPSB0YWJsZU1haW4ucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiLmFudC10YWJsZS1ib2R5LCBjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcIixcbiAgICApO1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobm9kZXMsIChlbDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGVsLnNjcm9sbFRvcCA9IDA7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5pWw5o2u5pu05paw5ZCO5aSa5qyh5bCd6K+V5aSN5L2N44CCXG4gICAqIG5nLXpvcnJvIDggKyBDREsg6Jma5ouf5rua5Yqo5Lya5Zyo5pWw5o2u5Yi35paw5ZCO5byC5q2l5pS55YaZIHNjcm9sbFRvcO+8jOWNleasoeWkjeS9jee7j+W4uOiiq+imhuebluOAglxuICAgKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk6IHZvaWQge1xuICAgIC8vIOWkmuasoeWwneivle+8muimhuebliBuei10YWJsZSAvIENESyDomZrmi5/mu5rliqjlvILmraXmlLnlhpkgc2Nyb2xsVG9wXG4gICAgY29uc3QgZGVsYXlzID0gWzAsIDUwLCAxMDBdO1xuICAgIGRlbGF5cy5mb3JFYWNoKChtcywgaW5kZXgpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gZGVsYXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdSZXNldFNjcm9sbFRvcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LCBtcyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBlbmRpbmdSZXNldFNjcm9sbFRvcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gIH1cblxuICAvKiog5pyq5omL5Yqo5LygIHZpcnR1YWxJdGVtU2l6ZSDml7bvvIzku47lt7LmuLLmn5PooYzmtYvph4/nnJ/lrp7pq5jluqYgKi9cbiAgbWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZSA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMudmlydHVhbEl0ZW1TaXplICE9IG51bGwgJiYgdGhpcy52aXJ0dWFsSXRlbVNpemUgPiAwICYmICFmb3JjZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2aWV3cG9ydCA9XG4gICAgICB0aGlzLm56VGFibGVDb21wb25lbnQgJiYgdGhpcy5uelRhYmxlQ29tcG9uZW50LmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICBjb25zdCB0YWJsZUJvZHkgPVxuICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50ICYmXG4gICAgICAodGhpcy5uelRhYmxlQ29tcG9uZW50LnRhYmxlQm9keU5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIGNvbnN0IHJvdyA9XG4gICAgICAodmlld3BvcnQgJiZcbiAgICAgICAgKCh2aWV3cG9ydC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgXCJ0ci5oZC10YWJsZS12aXJ0dWFsLXJvd1wiLFxuICAgICAgICApIGFzIEhUTUxFbGVtZW50KSkgfHxcbiAgICAgICh0YWJsZUJvZHkgJiYgKHRhYmxlQm9keS5xdWVyeVNlbGVjdG9yKFwidGJvZHkgdHJcIikgYXMgSFRNTEVsZW1lbnQpKTtcbiAgICBpZiAoIXJvdyB8fCByb3cub2Zmc2V0SGVpZ2h0IDw9IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaGVpZ2h0ID0gcm93Lm9mZnNldEhlaWdodDtcbiAgICBpZiAoaGVpZ2h0ID09PSB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMubWVhc3VyZWRWaXJ0dWFsSXRlbVNpemUgPSBoZWlnaHQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyDorr7nva7liJfngrnlh7vlj5bmtohcbiAgY2FuY2VsRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jYW5jZWxIaWRlTGlzdE5vZGVzKSk7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2FuY2VsTm93TGlzdE5vZGVzKSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyDngrnlh7vop6blj5Horr7nva7liJdcbiAgY29uZmlybURyb3Bkb3duKCk6IHZvaWQge1xuICAgIC8vIOS4tOaXtuWtmOaUvuS4i++8jOWPlua2iOeahOaXtuWAmeaBouWkjeWOn+adpeeahOeKtuaAgSAgIOa3seaLt+i0neS4i+WvueixoeaVsOe7hFxuICAgIHRoaXMuY2FuY2VsSGlkZUxpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5oaWRlTGlzdE5vZGVzKSk7XG4gICAgdGhpcy5jYW5jZWxOb3dMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMubm93TGlzdE5vZGVzKSk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzdWJtaXRHcmlkcygpIHtcbiAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scyA9IFtdO1xuICAgIHRoaXMubm93TGlzdE5vZGVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLnB1c2goaXRlbS50aXRsZSk7XG4gICAgfSk7XG4gICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g5LuO57yT5a2Y6K6+572u5YiXXG4gIHNldENvbHMoKSB7XG4gICAgdGhpcy5zaG93TGlzdE5vZGVzID0gZmFsc2U7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSBbXTtcbiAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSBbXTtcbiAgICBpZiAodGhpcy5oYXNDb2xzQ2FjaGUoKSkge1xuICAgICAgbGV0IHsgbm90SW5jb2xzLCBpbmNvbHMgfSA9IHRoaXMudGFibGVDb2xzQ2FjaGUucmVkdWNlKFxuICAgICAgICAoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGl0ZW0udGl0bGUpKSB7XG4gICAgICAgICAgICBhY2MuaW5jb2xzLnB1c2goaXRlbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5ub3RJbmNvbHMucHVzaChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgeyBub3RJbmNvbHM6IFtdLCBpbmNvbHM6IFtdIH0sXG4gICAgICApO1xuICAgICAgaW5jb2xzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmRleE9mKGEudGl0bGUpIC1cbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmRleE9mKGIudGl0bGUpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudGFibGVDb2xzID0gaW5jb2xzLmNvbmNhdChub3RJbmNvbHMpO1xuICAgIH1cblxuICAgIHRoaXMudGFibGVDb2xzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNDb2xzQ2FjaGUoKSkge1xuICAgICAgICBlbGVtZW50LmlzU2hvdyA9IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQudGl0bGUpXG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNTaG93KSB7XG4gICAgICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGtleTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LmZpeGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgLy8gc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhlbGVtZW50LnRpdGxlKVxuICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGtleTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LmZpeGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgLy8gc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhlbGVtZW50LnRpdGxlKVxuICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5pc1Nob3cgPSB0cnVlO1xuICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICBrZXk6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgY2hlY2tlZDogdHJ1ZSxcbiAgICAgICAgICAvLyBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICBkaXNhYmxlZDogZWxlbWVudC5maXhlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDosIPmlbTliJflrr3kuLrnvJPlrZjlrr3luqZcbiAgICBpZiAoXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuc2l6ZSAhPT0gMFxuICAgICkge1xuICAgICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLmhhcyhjb2wudGl0bGUpKSB7XG4gICAgICAgICAgY29sLndpZHRoID0gdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5nZXQoY29sLnRpdGxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWFsQ29scygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93TGlzdE5vZGVzID0gdHJ1ZTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIOaLluaLveaTjeS9nFxuICBiZWZvcmVEcm9wID0gKGFyZzogTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQpOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAoXG4gICAgICBhcmcubm9kZS5vcmlnaW4uZGlzYWJsZWQgfHxcbiAgICAgICFhcmcuZHJhZ05vZGUub3JpZ2luLmNoZWNrZWQgfHxcbiAgICAgIGFyZy5wb3MgPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBub2RlOiBUcmVlR3JpZCA9IG5ldyBUcmVlR3JpZCgpO1xuICAgICAgbm9kZS5jaGVja2VkID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5jaGVja2VkO1xuICAgICAgbm9kZS5kaXNhYmxlZCA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uZGlzYWJsZWQ7XG4gICAgICBub2RlLmV4cGFuZGVkID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5leHBhbmRlZDtcbiAgICAgIG5vZGUuaXNMZWFmID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5pc0xlYWY7XG4gICAgICBub2RlLmtleSA9IGFyZy5kcmFnTm9kZS5vcmlnaW4ua2V5O1xuICAgICAgbm9kZS5zZWxlY3RhYmxlID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5zZWxlY3RhYmxlO1xuICAgICAgbm9kZS50aXRsZSA9IGFyZy5kcmFnTm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICAvLyDmi5bmi73lhYPntKDkuIvmoIdcbiAgICAgIGxldCBkcmFnTm9kZUluZGV4ID0gdGhpcy5ub3dMaXN0Tm9kZXMuZmluZEluZGV4KChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnRpdGxlID09IGFyZy5kcmFnTm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICAgIC8vIOebruagh+S9jee9rueahOS4i+agh1xuICAgICAgbGV0IG5vZGVJbmRleCA9XG4gICAgICAgIHRoaXMubm93TGlzdE5vZGVzLmZpbmRJbmRleCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLnRpdGxlID09IGFyZy5ub2RlLm9yaWdpbi50aXRsZTtcbiAgICAgICAgfSkgKyAoYXJnLnBvcyA9PT0gLTEgPyAwIDogYXJnLnBvcyk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5zcGxpY2Uobm9kZUluZGV4LCAwLCBub2RlKTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzLnNwbGljZShcbiAgICAgICAgbm9kZUluZGV4ID49IGRyYWdOb2RlSW5kZXggPyBkcmFnTm9kZUluZGV4IDogZHJhZ05vZGVJbmRleCArIDEsXG4gICAgICAgIDEsXG4gICAgICApO1xuICAgICAgcmV0dXJuIG9mKHRydWUpLnBpcGUoZGVsYXkoMTAwKSk7XG4gICAgfVxuICB9O1xuXG4gIG1vdmVFbGVtZW50TmVhcmJ5KGFyciwgZWxlbWVudFRvTW92ZVRpdGxlLCB0YXJnZXRFbGVtZW50VGl0bGUsIHBvcykge1xuICAgIGNvbnN0IHRtcEFycmF5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhcnIpKTtcbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IHRtcEFycmF5LmZpbmRJbmRleChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnRpdGxlID09PSB0YXJnZXRFbGVtZW50VGl0bGUsXG4gICAgKTtcbiAgICBjb25zdCBlbGVtZW50SW5kZXggPSB0bXBBcnJheS5maW5kSW5kZXgoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50aXRsZSA9PT0gZWxlbWVudFRvTW92ZVRpdGxlLFxuICAgICk7XG4gICAgY29uc3QgbmV3SW5kZXggPSBwb3MgPCAwID8gdGFyZ2V0SW5kZXggKyBwb3MgOiB0YXJnZXRJbmRleDtcbiAgICAvLyDnp7vpmaTnm67moIflhYPntKDvvIzlubbmj5LlhaXliLDmlrDnmoTkvY3nva5cbiAgICBjb25zdCByZW1vdmVkRWxlbWVudCA9IHRtcEFycmF5LnNwbGljZShlbGVtZW50SW5kZXgsIDEpO1xuICAgIHRtcEFycmF5LnNwbGljZShuZXdJbmRleCArIDEsIDAsIHJlbW92ZWRFbGVtZW50WzBdKTtcbiAgICByZXR1cm4gdG1wQXJyYXk7XG4gIH1cblxuICAvLyDli77pgInmk43kvZxcbiAgY2hlY2tBY3Rpb24oZXZlbnQ6IE56Rm9ybWF0RW1pdEV2ZW50KTogdm9pZCB7XG4gICAgLy8g5Yu+6YCJ5Y+q5pyJ5ZyoaGlkZUxpc3ROb2Rlcyzlj5bmtojli77pgInlj6rmnInlnKhub3dMaXN0Tm9kZXNcbiAgICBpZiAoZXZlbnQubm9kZS5vcmlnaW4uY2hlY2tlZCkge1xuICAgICAgbGV0IG5vZGU6IFRyZWVHcmlkID0gbmV3IFRyZWVHcmlkKCk7XG4gICAgICBub2RlID0gdGhpcy5oaWRlTGlzdE5vZGVzLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgPT09IGV2ZW50Lm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgfSk7XG4gICAgICBub2RlLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgLy8g5om+5Yiw56ys5LiA5LiqZml4ZWTlsZ7mgKfkuLpyaWdodOeahHRpdGxl77yM5om+5Yiw5o+S5YWl5YWD57Sg55qE5L2N572uXG4gICAgICBsZXQgdGl0bGUgPSBudWxsO1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMudGFibGVDb2xzQ2FjaGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb2xzQ2FjaGVbaV0uZml4ZWQgPT09IFwicmlnaHRcIikge1xuICAgICAgICAgIHRpdGxlID0gdGhpcy50YWJsZUNvbHNDYWNoZVtpXS50aXRsZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHRlbXBvcmFyeU5vZGVMaXN0ID0gdGhpcy5ub3dMaXN0Tm9kZXMuc2xpY2UoMCk7XG4gICAgICBpZiAoIXRpdGxlKSB7XG4gICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2gobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubm93TGlzdE5vZGVzLmZpbmRJbmRleChcbiAgICAgICAgICAobm9kZSkgPT4gbm9kZS50aXRsZSA9PT0gdGl0bGUsXG4gICAgICAgICk7XG4gICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnNwbGljZShpbmRleCwgMCwgbm9kZSk7XG4gICAgICB9XG4gICAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRlbXBvcmFyeU5vZGVMaXN0O1xuICAgICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gdGhpcy5oaWRlTGlzdE5vZGVzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSAhPT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgKHRoaXMuaGlkZUxpc3ROb2Rlcy5sZW5ndGggPT09IDAgJiYgdGhpcy50YWJsZUNhY2hlT3B0aW9uICYmIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzKSB7XG4gICAgICAvLyAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRoaXMuZ2V0SGlkZUxpc3ROb2RlcygpO1xuICAgICAgLy8gfVxuICAgICAgbGV0IHRlbXBvcmFyeU5vZGVMaXN0ID0gdGhpcy5oaWRlTGlzdE5vZGVzLnNsaWNlKDApO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS50aXRsZSA9PT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGUpIHtcbiAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0pKTtcbiAgICAgICAgICBpbm5lckl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2goaW5uZXJJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0ZW1wb3JhcnlOb2RlTGlzdDtcblxuICAgICAgLy8g5Li65LqG6Ziy5q2i5pyq6YCJ5oup55qE5pWw57uE6aG65bqP5Zug5Li6cHVzaOaWueazleiAjOaUueWPmO+8jOmAmui/h+WIneWni+aVsOaNruiOt+WPluaYvuekuueahOWtl+auteWIl+ihqFxuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSB0aGlzLm5vd0xpc3ROb2Rlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgIT09IGV2ZW50Lm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g6Ziy5q2i5pyq6YCJ5oup55qE5pWw57uE6aG65bqP5Zug5Li6cHVzaOaWueazleiAjOaUueWPmO+8jOS7juWIneWni+aVsOaNruiOt+WPlumakOiXj+acquaYvuekuueahOWtl+auteWIl+ihqFxuICBnZXRIaWRlTGlzdE5vZGVzKCk6IEFycmF5PFRyZWVHcmlkPiB7XG4gICAgbGV0IHRlbXBvcmFyeU5vZGVMaXN0OiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgICAvLyDku450YWJsZUNvbHNDYWNoZemHjOmdouaJvuayoeacieWcqHN0b3JhZ2Xph4zpnaLlh7rnjrDnmoTlrZfmrrUs57uE5oiQaGlkZUxpc3RcbiAgICB0aGlzLnRhYmxlQ29sc0NhY2hlLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmICghdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoaXRlbS50aXRsZSkpIHtcbiAgICAgICAgbGV0IG5vZGVJdGVtOiBUcmVlR3JpZCA9IG5ldyBUcmVlR3JpZCgpO1xuICAgICAgICBub2RlSXRlbS50aXRsZSA9IGl0ZW0udGl0bGU7XG4gICAgICAgIG5vZGVJdGVtLmtleSA9IGl0ZW0udGl0bGU7XG4gICAgICAgIG5vZGVJdGVtLmRpc2FibGVkID0gaXRlbS5maXhlZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgbm9kZUl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB0ZW1wb3JhcnlOb2RlTGlzdC5wdXNoKG5vZGVJdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGVtcG9yYXJ5Tm9kZUxpc3Q7XG4gIH1cblxuICBkZWFsQ29scygpIHtcbiAgICBpZiAoIXRoaXMudGFibGVDb2xzWzBdLm1pbldpZHRoKSB7XG4gICAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgc3Bhbi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS53aGl0ZVNwYWNlID0gXCJub3dyYXBcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IFwiMTRweFwiO1xuICAgICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiOyAvLyDlsIbmoLflvI/kv67mlLnkuLogaW5saW5lLWJsb2NrXG4gICAgICAgIHNwYW4uaW5uZXJUZXh0ID0gaXRlbS50aXRsZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICAgICAgaXRlbS5taW5XaWR0aCA9IHNwYW4ub2Zmc2V0V2lkdGggKyAxNjtcbiAgICAgICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8g5aSE55CG5bem5Y+z5ZC46ZmE55qE5pWw5o2u5Zyo5pWw57uE5Lit55qE5L2N572uXG4gICAgY29uc3QgbGVmdEZpeGVkQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoY29sKSA9PiBjb2wuZml4ZWQgPT09IFwibGVmdFwiKTtcbiAgICBjb25zdCByaWdodEZpeGVkQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcihcbiAgICAgIChjb2wpID0+IGNvbC5maXhlZCA9PT0gXCJyaWdodFwiLFxuICAgICk7XG4gICAgY29uc3Qgbm9ybWFsQ29scyA9IHRoaXMudGFibGVDb2xzLmZpbHRlcigoY29sKSA9PiAhY29sLmZpeGVkKTtcbiAgICBjb25zdCByZXN1bHRDb2xzID0gbGVmdEZpeGVkQ29scy5jb25jYXQobm9ybWFsQ29scykuY29uY2F0KHJpZ2h0Rml4ZWRDb2xzKTtcbiAgICB0aGlzLnRhYmxlQ29scyA9IHJlc3VsdENvbHM7XG4gICAgaWYgKCF0aGlzLnRhYmxlQ29sc0NhY2hlIHx8IHRoaXMudGFibGVDb2xzQ2FjaGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyDnvJPlrZjkuIDkuIvooajmoLznmoTmlbDmja5cbiAgICAgIHRoaXMudGFibGVDb2xzQ2FjaGUgPSBbLi4udGhpcy50YWJsZUNvbHNdO1xuICAgIH1cbiAgfVxuXG4gIG5vcm1hbGl6ZVRhYmxlQ2FjaGVPcHRpb24oKSB7XG4gICAgaWYgKCF0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzKSB7XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICB9IGVsc2UgaWYgKCEodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgIGNvbnN0IGNvbFdpZHRocyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29sV2lkdGhzLnNldChrZXksICh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzIGFzIGFueSlba2V5XSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgPSBjb2xXaWR0aHM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNDb2xzQ2FjaGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uICYmXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scyAmJlxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMubGVuZ3RoID4gMFxuICAgICk7XG4gIH1cblxuICBzYXZlVGFibGVDYWNoZU9wdGlvbigpIHtcbiAgICB0aGlzLmxvY2FsZm9yYWdlLnNldEl0ZW0oXG4gICAgICBcImhkLXRhYmxlX1wiICtcbiAgICAgICAgdGhpcy51c2VyU2Vzc2lvbi51c2VyQ29kZSArXG4gICAgICAgIFwiX1wiICtcbiAgICAgICAgdGhpcy5sb2NhbHRpb25UbXAgK1xuICAgICAgICBcIl9cIiArXG4gICAgICAgIHRoaXMudXVpZCxcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbixcbiAgICApO1xuICB9XG5cbiAganVkZ2VSZXBlYXRDb2xzKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50YWJsZUNvbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHRoaXMudGFibGVDb2xzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlQ29sc1tpXS50aXRsZSA9PT0gdGhpcy50YWJsZUNvbHNbal0udGl0bGUpIHtcbiAgICAgICAgICB0aHJvdyBgaGQtdGFibGXnu4Tku7bkuK3liJflkI0gJHt0aGlzLnRhYmxlQ29sc1tpXS50aXRsZX0g6YeN5aSNYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uUmVzaXplKHsgd2lkdGggfTogTnpSZXNpemVFdmVudCwgY29sOiBIZFRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgdGhpcy5ub3JtYWxpemVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgbGV0IHRlbXBXaWR0aCA9IDA7XG4gICAgaWYgKHdpZHRoID4gY29sLm1pbldpZHRoKSB7XG4gICAgICB0ZW1wV2lkdGggPSB3aWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVtcFdpZHRoID0gY29sLm1pbldpZHRoO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLnNldChjb2wudGl0bGUsIHRlbXBXaWR0aCk7XG4gICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIHRoaXMudGFibGVDb2xzID0gdGhpcy50YWJsZUNvbHMubWFwKChlKSA9PlxuICAgICAgZS50aXRsZSA9PT0gY29sLnRpdGxlID8geyAuLi5lLCB3aWR0aDogdGVtcFdpZHRoIH0gOiBlLFxuICAgICk7XG4gICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCkpO1xuICB9XG5cbiAgZGVhbE9wZXJhdGVCdG4oKSB7XG4gICAgbGV0IG9wZXJhdGVDb2wgPSB0aGlzLnRhYmxlQ29scy5maW5kKChjb2wpID0+IGNvbC50aXRsZSA9PT0gXCLmk43kvZxcIikgfHwgbnVsbDtcbiAgICBpZiAob3BlcmF0ZUNvbCkge1xuICAgICAgbGV0IHRleHRTdHIgPSBcIlwiO1xuICAgICAgb3BlcmF0ZUNvbC5idG5MaXN0LmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgICBpZiAoIWJ0bi5pc1JlcGVhdCkge1xuICAgICAgICAgIHRleHRTdHIgKz0gdHlwZW9mIGJ0bi5uYW1lID09PSBcImZ1bmN0aW9uXCIgPyBcIuaTjeS9nFwiIDogYnRuLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgc3Bhbi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9IFwibm93cmFwXCI7XG4gICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiOyAvLyDlsIbmoLflvI/kv67mlLnkuLogaW5saW5lLWJsb2NrXG4gICAgICBzcGFuLmlubmVyVGV4dCA9IHRleHRTdHI7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgb3BlcmF0ZUNvbC53aWR0aCA9XG4gICAgICAgIHNwYW4ub2Zmc2V0V2lkdGggK1xuICAgICAgICAob3BlcmF0ZUNvbC5idG5MaXN0LmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNSZXBlYXQpLmxlbmd0aCAtIDEpICogNCArXG4gICAgICAgIDE2O1xuICAgICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJFdmVudChmbjogYW55LCBldmVudDogYW55KSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICBmbihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgbmVlZFNob3dDb25maXJtKGJ0bjogT3BlcmF0ZUJ0biwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBidG4uc2hvd0NvbmZpcm0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGJ0bi5zaG93Q29uZmlybShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuICEhYnRuLnNob3dDb25maXJtO1xuICB9XG5cbiAgZ2V0QnRuTmFtZShidG46IE9wZXJhdGVCdG4sIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBidG4ubmFtZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYnRuLm5hbWUoZGF0YSkgfHwgXCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIGJ0bi5uYW1lICE9IG51bGwgPyBTdHJpbmcoYnRuLm5hbWUpIDogXCJcIjtcbiAgfVxuXG4gIGlzRGFuZ2VyQnRuKGJ0bjogT3BlcmF0ZUJ0biwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QnRuTmFtZShidG4sIGRhdGEpID09PSBcIuWIoOmZpFwiO1xuICB9XG5cbiAgLyoqIOiZmuaLn+a7muWKqOW8gOWQr+aXtuS9v+eUqOinhuWPo+acgOWkp+mrmOW6piAqL1xuICBwcml2YXRlIGdldFZpcnR1YWxTY3JvbGxZKG1heE9mZnNldDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGNhbGMoMTAwdmggLSAke21heE9mZnNldH1weClgO1xuICB9XG5cbiAgLypcbiAgICog5qiq5ZCR5biD5bGA77yI5Yu+6YCJ5YiX6ZSBIDQwcHgg55qE5YWz6ZSu77yJXG4gICAqXG4gICAqIOWLvumAieWIl+WPquacieWcqCB0YWJsZS1sYXlvdXQ6IGZpeGVkIOS4i+aJjemUgeW+l+S9j++8mm5nLXpvcnJvIDgg5LuF5ZyoIG56U2Nyb2xsLngg5pyJ5YC85pe2XG4gICAqIOe7mSB0YWJsZSDliqAgYW50LXRhYmxlLWZpeGVk77ybYXV0byDluIPlsYDkuIsgdGFibGUg5a69IDEwMCXjgIHmr4/liJfpg73mnIkgbnpXaWR0aO+8jFxuICAgKiDliankvZnnqbrpl7TkvJrmjInmr5TkvovmkYrliLDmiYDmnInliJfvvIjlkKvli77pgInliJfvvInvvIzljZXlhYPmoLzkuIrnmoQgbWF4LXdpZHRoIOS5n+S4jeeUn+aViOOAglxuICAgKiDmiYDku6Xlj6ropoHmnInliJfvvIjml6DorrrmnInmsqHmnInmlbDmja7vvInlsLHkuIDlrprorr7nva4gc2Nyb2xsLnjvvJpcbiAgICogLSDliJflsJHvvJpzY3JvbGwueCA9IOWuueWZqOWuve+8jOW3rumineaMieWjsOaYjuWuveavlOS+i+WIhuWIsOWQhOS4muWKoeWIl++8iGZsdWlk77yM5LiN5Ye655yf5qiq5rua77yJXG4gICAqIC0g5YiX5aSa77yac2Nyb2xsLnggPSDlo7DmmI7mgLvlrr3vvIzmraPluLjmqKrmu5pcbiAgICogbGVzcyDph4zli77pgInliJfnmoQgNDBweCDlj6rmmK8gZml4ZWQg5biD5bGA5LiL55qE5YWc5bqV44CCXG4gICAqL1xuXG4gIC8qKlxuICAgKiDmjInlo7DmmI7liJflrr3lkIjorqEgKyDlrrnlmajlrr3nrpflh7rmqKrlkJHluIPlsYDjgIJcbiAgICog5Yik5pat44CM5piv5ZCm6LaF5a6944CN55SoIG9mZnNldFdpZHRo77yI5ZCr56uW5rua5p2h5qe977yJ77yM6YG/5YWN5Y+q5Zug56uW5rua5p2h5bCx6K+v5byA5qiq5rua77ybXG4gICAqIOihpeWuveebruagh+eUqCBjbGllbnRXaWR0aCDlubblkJHkuIvlj5bmlbTvvIzpgb/lhY3ooajlrr3lpJogMXB4IOmAvOWHuuaoqua7muadoeOAglxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlSG9yaXpvbnRhbExheW91dChcbiAgICBkZWNsYXJlZENvbFdpZHRoOiBudW1iZXIsXG4gICk6IEhkVGFibGVIb3Jpem9udGFsTGF5b3V0IHtcbiAgICBpZiAoZGVjbGFyZWRDb2xXaWR0aCA8PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzY3JvbGxYOiBudWxsLFxuICAgICAgICBmbHVpZEV4dHJhOiAwLFxuICAgICAgICBkaXNwbGF5VG90YWw6IGRlY2xhcmVkQ29sV2lkdGgsXG4gICAgICAgIGlzRmx1aWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG4gICAgbGV0IGNvbXBhcmVXaWR0aCA9IHRoaXMubnpUYWJsZUNvbXBvbmVudFxuICAgICAgPyBnZXRUYWJsZVNjcm9sbFhWaWV3cG9ydFdpZHRoKHRoaXMubnpUYWJsZUNvbXBvbmVudClcbiAgICAgIDogMDtcbiAgICAvLyDooajkvZPov5jmsqHmuLLmn5Plh7rmnaXvvIjliJrph43lu7ogLyDlnKggc3BpbiDph4zvvInml7bnlKjlrr/kuLvlrr3lhZzlupVcbiAgICBpZiAoY29tcGFyZVdpZHRoIDw9IDAgJiYgdGhpcy5ob3N0RWwgJiYgdGhpcy5ob3N0RWwubmF0aXZlRWxlbWVudCkge1xuICAgICAgY29tcGFyZVdpZHRoID0gKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFdpZHRoO1xuICAgIH1cbiAgICAvLyDku43ph4/kuI3liLDvvIjlpoLlrr/kuLvlnKggZGlzcGxheTpub25lIOmHjO+8ie+8muWFiOaMieWjsOaYjuWuvei1sCBmaXhlZO+8jOetiSBSZXNpemVPYnNlcnZlciDop6blj5Hlho3ovawgZmx1aWRcbiAgICBpZiAoY29tcGFyZVdpZHRoIDw9IDApIHtcbiAgICAgIHJldHVybiBmaXhlZExheW91dChkZWNsYXJlZENvbFdpZHRoKTtcbiAgICB9XG4gICAgLy8gMXB4IOWuueW3ru+8jOmBv+WFjeS6muWDj+e0oOivr+WIpFxuICAgIGlmIChkZWNsYXJlZENvbFdpZHRoID4gY29tcGFyZVdpZHRoICsgMSkge1xuICAgICAgcmV0dXJuIGZpeGVkTGF5b3V0KGRlY2xhcmVkQ29sV2lkdGgpO1xuICAgIH1cbiAgICBjb25zdCBmaWxsV2lkdGggPSB0aGlzLm56VGFibGVDb21wb25lbnRcbiAgICAgID8gZ2V0VGFibGVWaWV3cG9ydFdpZHRoKHRoaXMubnpUYWJsZUNvbXBvbmVudClcbiAgICAgIDogMDtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IE1hdGguZmxvb3IoZmlsbFdpZHRoID4gMCA/IGZpbGxXaWR0aCA6IGNvbXBhcmVXaWR0aCk7XG4gICAgcmV0dXJuIGZsdWlkTGF5b3V0KGNvbnRhaW5lcldpZHRoLCBkZWNsYXJlZENvbFdpZHRoKTtcbiAgfVxuXG4gIC8qKiDooajmoLzmuLLmn5PlkI7mjInnnJ/lrp7lrrnlmajlrr3moKHmraPmqKrlkJHluIPlsYDvvJvlj6rmlLkgeO+8jHkg5L+d5oyB5LiN5Y+YICovXG4gIHByaXZhdGUgc3luY0hvcml6b250YWxTY3JvbGwoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldkhhc1ggPSAhISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC54KTtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLnJlc29sdmVIb3Jpem9udGFsTGF5b3V0KFxuICAgICAgdGhpcy5nZXREZWNsYXJlZENvbFdpZHRoVG90YWwoKSxcbiAgICApO1xuICAgIGNvbnN0IHVuY2hhbmdlZCA9XG4gICAgICB0aGlzLnNjcm9sbCAmJlxuICAgICAgdGhpcy5zY3JvbGwueCA9PT0gbGF5b3V0LnNjcm9sbFggJiZcbiAgICAgIHRoaXMuZmx1aWRFeHRyYVdpZHRoID09PSBsYXlvdXQuZmx1aWRFeHRyYSAmJlxuICAgICAgdGhpcy5mbHVpZEhvcml6b250YWwgPT09IGxheW91dC5pc0ZsdWlkO1xuICAgIGlmICh1bmNoYW5nZWQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jVG90YWxGb290ZXJXaXRoQm9keSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hcHBseUhvcml6b250YWxMYXlvdXQobGF5b3V0KTtcbiAgICB0aGlzLnJlZnJlc2hTdGlja3lPZmZzZXRzKCk7XG4gICAgdGhpcy5zY3JvbGwgPSB7IHg6IGxheW91dC5zY3JvbGxYLCB5OiB0aGlzLnNjcm9sbCA/IHRoaXMuc2Nyb2xsLnkgOiBudWxsIH07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgLy8geCDku47ml6DliLDmnInvvIjmiJblj43ov4fmnaXvvInopoHph43lu7rmiY3og73liIfmjaIgdGFibGUtbGF5b3V0XG4gICAgaWYgKHByZXZIYXNYICE9PSAhIWxheW91dC5zY3JvbGxYKSB7XG4gICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY0hlYWRlckJvZHlTY3JvbGxMZWZ0KCkpO1xuICB9XG5cbiAgLyoqIOaJi+WKqOaKiuihqOS9k+aoquWQkea7muWKqOWQjOatpeWIsOihqOWktCAvIOWQiOiuoSBmb290ZXLvvIjlhZzlupUgbmctem9ycm8g55uR5ZCs5Lii5aSx55qE5oOF5Ya177yJICovXG4gIHByaXZhdGUgc3luY0hlYWRlckJvZHlTY3JvbGxMZWZ0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uelRhYmxlQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlciA9ICh0aGlzLm56VGFibGVDb21wb25lbnQgYXMgYW55KVxuICAgICAgLnRhYmxlSGVhZGVyTmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgY29uc3QgYm9keSA9IHRoaXMuZ2V0VGFibGVCb2R5U2Nyb2xsRWwoKTtcbiAgICBpZiAodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueCAmJiBoZWFkZXIgJiYgYm9keSkge1xuICAgICAgaWYgKGhlYWRlci5zY3JvbGxMZWZ0ICE9PSBib2R5LnNjcm9sbExlZnQpIHtcbiAgICAgICAgaGVhZGVyLnNjcm9sbExlZnQgPSBib2R5LnNjcm9sbExlZnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKTtcbiAgfVxuXG4gIC8qKiDlj5booajkvZPmqKrlkJHmu5rliqjlrrnlmajvvIjomZrmi5/mu5rliqjkvJjlhYggdmlld3BvcnTvvIkgKi9cbiAgcHJpdmF0ZSBnZXRUYWJsZUJvZHlTY3JvbGxFbCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGlmICghdGhpcy5uelRhYmxlQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWl4ID0gKHRoaXMubnpUYWJsZUNvbXBvbmVudCBhcyBhbnkpXG4gICAgICAubWl4VGFibGVCb2R5TmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKG1peCkge1xuICAgICAgcmV0dXJuIG1peDtcbiAgICB9XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuaG9zdEVsICYmICh0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgKGhvc3QucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQuYW50LXRhYmxlLWJvZHlcIixcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQpIHx8XG4gICAgICAoaG9zdC5xdWVyeVNlbGVjdG9yKFwiLmFudC10YWJsZS1ib2R5XCIpIGFzIEhUTUxFbGVtZW50KSB8fFxuICAgICAgbnVsbFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFRvdGFsRm9vdGVyU2Nyb2xsRWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0RWwgJiYgKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIHJldHVybiBob3N0XG4gICAgICA/IChob3N0LnF1ZXJ5U2VsZWN0b3IoXCIuaGQtdGFibGUtdG90YWwtZm9vdGVyXCIpIGFzIEhUTUxFbGVtZW50KVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqIOihqOS9k+aYr+WQpuWHuueOsOe6teWQkea7muWKqOadoe+8iOWQq+a7muWKqOadoeanveWuve+8iSAqL1xuICBwcml2YXRlIGJvZHlIYXNWZXJ0aWNhbFNjcm9sbGJhcihib2R5OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghYm9keSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgYm9keS5zY3JvbGxIZWlnaHQgPiBib2R5LmNsaWVudEhlaWdodCArIDEgfHxcbiAgICAgIGJvZHkub2Zmc2V0V2lkdGggLSBib2R5LmNsaWVudFdpZHRoID4gMVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5ZCI6K6hIGZvb3RlciDkuI7ooajkvZPogZTliqjvvJpcbiAgICogLSBmbHVpZO+8iOWIl+acquaSkea7oe+8ie+8muS4jeaoqua7muOAgeS4jea1i+Wuve+8jOihqOWuvSAxMDAlIOS4juihqOS9k+WQjOavlOS+i+aLieS8uO+8m1xuICAgKiAtIGZpeGVk77yI5pyJIHNjcm9sbC5477yJ77ya5ZCM5q2lIHNjcm9sbExlZnTvvJtcbiAgICogLSDku4XlvZPooajkvZPmnInnq5bmu5rmnaHml7bpooTnlZnlj7Pkvqfmp73vvIzooYzlsJHml6Dnq5bmu5rml7bkuI3ljaDkvY3jgIJcbiAgICovXG4gIHByaXZhdGUgc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dUYWJsZVRvdGFsKSB7XG4gICAgICB0aGlzLnVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpO1xuICAgICAgaWYgKHRoaXMudG90YWxGb290ZXJOZWVkWUd1dHRlcikge1xuICAgICAgICB0aGlzLnRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZvb3RlciA9IHRoaXMuZ2V0VG90YWxGb290ZXJTY3JvbGxFbCgpO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmdldFRhYmxlQm9keVNjcm9sbEVsKCk7XG4gICAgaWYgKCFmb290ZXIpIHtcbiAgICAgIGlmICh0aGlzLnRvdGFsRm9vdGVyU3luY1JldHJ5IDwgMTApIHtcbiAgICAgICAgdGhpcy50b3RhbEZvb3RlclN5bmNSZXRyeSsrO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSwgNTApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRvdGFsRm9vdGVyU3luY1JldHJ5ID0gMDtcbiAgICBjb25zdCBuZWVkWUd1dHRlciA9ICEhKGJvZHkgJiYgdGhpcy5ib2R5SGFzVmVydGljYWxTY3JvbGxiYXIoYm9keSkpO1xuICAgIGlmICh0aGlzLnRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgIT09IG5lZWRZR3V0dGVyKSB7XG4gICAgICB0aGlzLnRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgPSBuZWVkWUd1dHRlcjtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1RvdGFsRm9vdGVyRmx1aWQpIHtcbiAgICAgIHRoaXMudW5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKCk7XG4gICAgICBmb290ZXIuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChib2R5KSB7XG4gICAgICB0aGlzLnN5bmNUb3RhbEZvb3RlclNjcm9sbExlZnQoYm9keS5zY3JvbGxMZWZ0KTtcbiAgICAgIHRoaXMuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYyhib2R5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN5bmNUb3RhbEZvb3RlclNjcm9sbExlZnQoc2Nyb2xsTGVmdDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9vdGVyID0gdGhpcy5nZXRUb3RhbEZvb3RlclNjcm9sbEVsKCk7XG4gICAgaWYgKGZvb3RlciAmJiBmb290ZXIuc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsTGVmdCkge1xuICAgICAgZm9vdGVyLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYyhib2R5OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VGFibGVUb3RhbCB8fCAhYm9keSB8fCB0aGlzLmlzVG90YWxGb290ZXJGbHVpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5ID09PSBib2R5ICYmXG4gICAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlclxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpO1xuICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkgPSBib2R5O1xuICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zeW5jVG90YWxGb290ZXJTY3JvbGxMZWZ0KGJvZHkuc2Nyb2xsTGVmdCk7XG4gICAgfTtcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIsIHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgfSBhcyBhbnkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkgJiYgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxCb3VuZEJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJzY3JvbGxcIixcbiAgICAgICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5ID0gbnVsbDtcbiAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlciA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog55uR5ZCs56qX5Y+jIC8g5a655Zmo5a695bqm5Y+Y5YyW77ya6YeN5paw5Yik5a6aIHNjcm9sbC5477yIZmx1aWTihpRmaXhlZO+8ieS4juWQiOiuoeWPs+S+p+erlua7muanve+8jFxuICAgKiDpgb/lhY3mi4nlrr0v57yp56qE5bGP5bmV5ZCO5ZCI6K6h6KGM5a695LiO6KGo5L2T6ZSZ5L2N44CCXG4gICAqL1xuICBwcml2YXRlIGJpbmRWaWV3cG9ydFJlc2l6ZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5ib3VuZE9uVmlld3BvcnRSZXNpemUgPSAoKSA9PiB0aGlzLnNjaGVkdWxlVmlld3BvcnRTY3JvbGxTeW5jKCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMuYm91bmRPblZpZXdwb3J0UmVzaXplKTtcbiAgICB9XG4gICAgY29uc3QgUk8gPVxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/ICh3aW5kb3cgYXMgYW55KS5SZXNpemVPYnNlcnZlciA6IG51bGw7XG4gICAgaWYgKFJPICYmIHRoaXMuaG9zdEVsICYmIHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyID0gbmV3IFJPKCgpID0+IHRoaXMuc2NoZWR1bGVWaWV3cG9ydFNjcm9sbFN5bmMoKSk7XG4gICAgICB0aGlzLmhvc3RSZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5iaW5kVmlld3BvcnRSZXNpemVTeW5jKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJvdW5kT25WaWV3cG9ydFJlc2l6ZSAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLmJvdW5kT25WaWV3cG9ydFJlc2l6ZSk7XG4gICAgfVxuICAgIHRoaXMuYm91bmRPblZpZXdwb3J0UmVzaXplID0gbnVsbDtcbiAgICBpZiAodGhpcy5ob3N0UmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld3BvcnRSZXNpemVUaW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyKTtcbiAgICAgIHRoaXMudmlld3BvcnRSZXNpemVUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVZpZXdwb3J0U2Nyb2xsU3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudmlld3BvcnRSZXNpemVUaW1lciA9IG51bGw7XG4gICAgICBpZiAoIXRoaXMudGFibGVDb2xzIHx8ICF0aGlzLnRhYmxlQ29scy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgLy8g562J6KGo5L2T5biD5bGA56iz5a6a5ZCO5YaN5qCh5ZCI6K6h56uW5rua5qe9IC8g5qiq5rua5ZCM5q2lXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSwgNTApO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICAvKipcbiAgICog5bemL+WPs+WGu+e7k+WBj+enu+aMieWxleekuuWuvee0r+iuoe+8iGZsdWlkIOavlOS+i+ihpeWuveWQjuWQhOWIl+WPmOWuve+8jOS4jeiDveWGjeeUqOWjsOaYjuWuve+8ieOAglxuICAgKiDpobvlnKggYXBwbHlIb3Jpem9udGFsTGF5b3V0IOS5i+WQjuiwg+eUqOOAglxuICAgKi9cbiAgcHJpdmF0ZSByZWZyZXNoU3RpY2t5T2Zmc2V0cygpOiB2b2lkIHtcbiAgICBsZXQgbGVmdE9mZnNldCA9IDA7XG4gICAgaWYgKHRoaXMuc2hvd1NlbGVjdGVkKSB7XG4gICAgICBsZWZ0T2Zmc2V0ICs9IFNFTEVDVF9DT0xfV0lEVEg7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dUYWJsZVRvdGFsKSB7XG4gICAgICBsZWZ0T2Zmc2V0ICs9IHRoaXMubGluZU51bWJlckNvbFdpZHRoO1xuICAgIH1cbiAgICAodGhpcy50YWJsZUNvbHMgfHwgW10pLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmICghaXRlbS53aWR0aCkge1xuICAgICAgICBpdGVtLndpZHRoID0gQ29sV2lkdGguZml4Q29sV2lkdGg7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0NvbFZpc2libGUoaXRlbSkpIHtcbiAgICAgICAgaXRlbS5maXhlZFdpZHRoID0gbGVmdE9mZnNldDtcbiAgICAgICAgbGVmdE9mZnNldCArPSB0aGlzLmdldENvbERpc3BsYXlXaWR0aChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCByaWdodE9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9ICh0aGlzLnRhYmxlQ29scyB8fCBbXSkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnRhYmxlQ29sc1tpXTtcbiAgICAgIGlmICghdGhpcy5pc0NvbFZpc2libGUoaXRlbSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5maXhlZCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgIGl0ZW0uZml4ZWRSaWdodFdpZHRoID0gcmlnaHRPZmZzZXQ7XG4gICAgICAgIHJpZ2h0T2Zmc2V0ICs9IHRoaXMuZ2V0Q29sRGlzcGxheVdpZHRoKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5maXhlZFJpZ2h0V2lkdGggPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlYWxTY3JvbGwoKSB7XG4gICAgKHRoaXMudGFibGVDb2xzIHx8IFtdKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0ud2lkdGgpIHtcbiAgICAgICAgaXRlbS53aWR0aCA9IENvbFdpZHRoLmZpeENvbFdpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5yZXNvbHZlSG9yaXpvbnRhbExheW91dChcbiAgICAgIHRoaXMuZ2V0RGVjbGFyZWRDb2xXaWR0aFRvdGFsKCksXG4gICAgKTtcbiAgICB0aGlzLmFwcGx5SG9yaXpvbnRhbExheW91dChsYXlvdXQpO1xuICAgIHRoaXMucmVmcmVzaFN0aWNreU9mZnNldHMoKTtcbiAgICBjb25zdCBtYXhPZmZzZXQgPSB0aGlzLmdldFNjcm9sbFlNYXhPZmZzZXQoKTtcbiAgICBjb25zdCB1c2VWaXJ0dWFsID0gdGhpcy51c2VWaXJ0dWFsU2Nyb2xsO1xuICAgIGNvbnN0IHNjcm9sbFggPSBsYXlvdXQuc2Nyb2xsWDtcblxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwgJiYgIXVzZVZpcnR1YWwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgICB4OiBzY3JvbGxYLFxuICAgICAgICB5OiBudWxsLFxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICAgIHg6IHNjcm9sbFgsXG4gICAgICAgIHk6IGBjYWxjKDEwMHZoIC0gJHttYXhPZmZzZXR9cHgpYCxcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICB4OiBzY3JvbGxYLFxuICAgICAgeTogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsWShtYXhPZmZzZXQpLFxuICAgIH07XG4gIH1cblxuICAvLyDooajmoLzli77pgInpgLvovpFcbiAgY3VycmVudFBhZ2VEYXRhQ2hhbmdlKCRldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5saXN0T2ZEaXNwbGF5RGF0YSA9ICRldmVudDtcbiAgICB0aGlzLnJlZnJlc2hTdGF0dXMoKTtcbiAgICBpZiAoIXRoaXMuaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbCkge1xuICAgICAgdGhpcy5yZXNldFN0YXR1cygpO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNlYXJjaChyZXNldDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5wYWdpbmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOWJjeerr+WIhumhte+8muWPquWQjOatpemhteeggS/mnaHmlbDvvIzkuI3op6blj5HniLbnu4Tku7bmn6Xor6JcbiAgICBpZiAodGhpcy5mcm9udFBhZ2luYXRpb24pIHtcbiAgICAgIGlmIChyZXNldCkge1xuICAgICAgICB0aGlzLnRhYmxlUGFnZUluZGV4ID0gMTtcbiAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGFibGVQYWdlSW5kZXhDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZUluZGV4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA9IHRoaXMudGFibGVQYWdlU2l6ZTtcbiAgICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgIC8vIOaMieW9k+WJjemhteihjOaVsOmHjeeul+aYr+WQpumcgOimgSBzY3JvbGwuee+8iOacq+mhteaVsOaNruWwkeaXtuWOu+aOieWbuuWumumrmOW6pu+8jOmBv+WFjeeVmeeZve+8iVxuICAgICAgdGhpcy5wZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSB0cnVlO1xuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgdGhpcy5zYXZlVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIGlmIChyZXNldCkge1xuICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZUV2ZW50LmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleENoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlSW5kZXgpO1xuICAgICAgLy8g6Kem5Y+R54i257uE5Lu25p+l6K+i5LqL5Lu2XG4gICAgICB0aGlzLnRhYmxlU2VhcmNoRXZlbnQuZW1pdChyZXNldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOW6lemDqOWQiOiuoe+8muS4jiBoZC1kZXRhaWwtbGluZXMg55u45ZCM77yM5L2/55SoIFRvdGFsT3B0aW9u77yIaW5zZXJ0SW5kZXggLyBpbnNlcnRWYWx1Ze+8ieOAglxuICAgKiDlvIDlkK/lkI7lvLrliLblsZXnpLrluo/lj7fliJfvvIzjgIzlkIjorqHjgI3okL3lnKjluo/lj7fliJfkuIvvvJtcbiAgICogaW5zZXJ0SW5kZXgg5LuOIDEg6LW35a+55bqU5Y+v6KeB5pWw5o2u5YiX77yb5pyq5LygIGluc2VydFZhbHVlIOaXtuaMieivpeWIlyBuYW1lIOWvuSBjb250ZW50IOaxguWSjOOAglxuICAgKi9cbiAgY2FsY3VsYXRlVGFibGVUb3RhbCgpIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5zaG93VGFibGVUb3RhbCB8fFxuICAgICAgIXRoaXMudGFibGVUb3RhbE9wdGlvbiB8fFxuICAgICAgIXRoaXMudGFibGVUb3RhbE9wdGlvbi5sZW5ndGhcbiAgICApIHtcbiAgICAgIHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmlzaWJsZUNvbHMgPSAodGhpcy50YWJsZUNvbHMgfHwgW10pLmZpbHRlcihcbiAgICAgIChjKSA9PiBjICYmIGMuaXNTaG93ICE9PSBmYWxzZSxcbiAgICApO1xuICAgIC8vIGNvbHVtbnNOdW1iZXIg5ZCr5bqP5Y+35YiX77yI5LiOIGRldGFpbC1saW5lcyDkuIDoh7TvvInvvIzmlbDmja7mp73kvY3mlbAgPSBjb2x1bW5zTnVtYmVyIC0gMVxuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSBOdW1iZXIodGhpcy5jb2x1bW5zTnVtYmVyKTtcbiAgICBjb25zdCBjb2x1bW5OdW1iZXIgPVxuICAgICAgY29uZmlndXJlZCA+IDFcbiAgICAgICAgPyBjb25maWd1cmVkIC0gMVxuICAgICAgICA6IGNvbmZpZ3VyZWQgPT09IDFcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IHZpc2libGVDb2xzLmxlbmd0aDtcbiAgICBpZiAoIWNvbHVtbk51bWJlciB8fCBjb2x1bW5OdW1iZXIgPCAxKSB7XG4gICAgICB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0ID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QgPSBuZXcgQXJyYXkoY29sdW1uTnVtYmVyKS5maWxsKFwiXCIpO1xuICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgdGhpcy50YWJsZURhdGEgJiYgdGhpcy50YWJsZURhdGEuY29udGVudCA/IHRoaXMudGFibGVEYXRhLmNvbnRlbnQgOiBbXTtcbiAgICB0aGlzLnRhYmxlVG90YWxPcHRpb24uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0gPT0gbnVsbCB8fCAhaXRlbS5pbnNlcnRJbmRleCB8fCBpdGVtLmluc2VydEluZGV4IDwgMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgdmFsdWU6IGFueSA9IGl0ZW0uaW5zZXJ0VmFsdWU7XG4gICAgICAvLyDmnKrkvKAgaW5zZXJ0VmFsdWUg5pe277ya5oyJIGluc2VydEluZGV4IOWvueW6lOWPr+ingeWIlyBuYW1lIOiHquWKqOaxguWSjFxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgY29uc3QgY29sID0gdmlzaWJsZUNvbHNbaXRlbS5pbnNlcnRJbmRleCAtIDFdO1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbCAmJiB0eXBlb2YgY29sLm5hbWUgPT09IFwic3RyaW5nXCIgPyBjb2wubmFtZSA6IG51bGw7XG4gICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGxldCBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgICBjb250ZW50LmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhdyA9IHJvdyA/IHJvd1tmaWVsZF0gOiBudWxsO1xuICAgICAgICAgIGlmIChyYXcgPT0gbnVsbCB8fCByYXcgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHJhdyk7XG4gICAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XG4gICAgICAgICAgICBzdW0gKz0gbnVtO1xuICAgICAgICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBzdW07XG4gICAgICB9XG4gICAgICBjb25zdCBjb2xBdEluZGV4ID0gdmlzaWJsZUNvbHNbaXRlbS5pbnNlcnRJbmRleCAtIDFdO1xuICAgICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdFtpdGVtLmluc2VydEluZGV4IC0gMV0gPSB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBhbGlnbjogaXRlbS5hbGlnbiB8fCAoY29sQXRJbmRleCAmJiBjb2xBdEluZGV4LmFsaWduKSB8fCBcImxlZnRcIixcbiAgICAgICAgc2hvd0RlY2ltYWw6IGl0ZW0uc2hvd0RlY2ltYWwgfHwgZmFsc2UsXG4gICAgICAgIHByZXNlcnZlTnVtYmVyOiBpdGVtLnByZXNlcnZlTnVtYmVyICE9IG51bGwgPyBpdGVtLnByZXNlcnZlTnVtYmVyIDogMixcbiAgICAgICAgaXNIaWRlOiBpdGVtLmlzSGlkZSB8fCBmYWxzZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRhYmxlVG90YWxDZWxsTWV0YShjb2w6IEhkVGFibGVDb2x1bW4sIGNvbEluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChcbiAgICAgICFjb2wgfHxcbiAgICAgICF0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0IHx8XG4gICAgICAhdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdC5sZW5ndGhcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgdmlzaWJsZUluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY29sSW5kZXg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IHRoaXMudGFibGVDb2xzW2ldO1xuICAgICAgaWYgKGMgJiYgYy5pc1Nob3cgIT09IGZhbHNlKSB7XG4gICAgICAgIHZpc2libGVJbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmlzaWJsZUluZGV4IDwgMCB8fCB2aXNpYmxlSW5kZXggPj0gdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtZXRhID0gdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdFt2aXNpYmxlSW5kZXhdO1xuICAgIHJldHVybiBtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiID8gbWV0YSA6IG51bGw7XG4gIH1cblxuICAvKiog5ZCI6K6h5Y2V5YWD5qC85bGV56S65paH5qGI77yI5a+56b2QIGRldGFpbC1saW5lcyDlsI/mlbDop4TliJnvvIkgKi9cbiAgZ2V0VGFibGVUb3RhbENlbGxWYWx1ZShjb2w6IEhkVGFibGVDb2x1bW4sIGNvbEluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldFRhYmxlVG90YWxDZWxsTWV0YShjb2wsIGNvbEluZGV4KTtcbiAgICBpZiAoIW1ldGEgfHwgbWV0YS5pc0hpZGUpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IG1ldGEudmFsdWU7XG4gICAgaWYgKCEodmFsdWUgfHwgdmFsdWUgPT09IDApKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgY29uc3QgcHJlc2VydmUgPVxuICAgICAgbWV0YS5wcmVzZXJ2ZU51bWJlciAhPSBudWxsID8gTnVtYmVyKG1ldGEucHJlc2VydmVOdW1iZXIpIDogMjtcbiAgICBpZiAodmFsdWUgJSAxID09PSAwICYmICFtZXRhLnNob3dEZWNpbWFsKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGZhY3RvciA9IE1hdGgucG93KDEwLCBwcmVzZXJ2ZSk7XG4gICAgcmV0dXJuIChNYXRoLnJvdW5kKE51bWJlcih2YWx1ZSkgKiBmYWN0b3IpIC8gZmFjdG9yKS50b0ZpeGVkKHByZXNlcnZlKTtcbiAgfVxuXG4gIGdldFRhYmxlVG90YWxDZWxsQWxpZ24oY29sOiBIZFRhYmxlQ29sdW1uLCBjb2xJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRUYWJsZVRvdGFsQ2VsbE1ldGEoY29sLCBjb2xJbmRleCk7XG4gICAgY29uc3QgYWxpZ24gPSAobWV0YSAmJiBtZXRhLmFsaWduKSB8fCAoY29sICYmIGNvbC5hbGlnbikgfHwgXCJsZWZ0XCI7XG4gICAgaWYgKGFsaWduID09PSBcInJpZ2h0XCIgfHwgYWxpZ24gPT09IFwiY2VudGVyXCIgfHwgYWxpZ24gPT09IFwibGVmdFwiKSB7XG4gICAgICByZXR1cm4gYWxpZ247XG4gICAgfVxuICAgIHJldHVybiBcImxlZnRcIjtcbiAgfVxuXG4gIC8qKiDlupXpg6jjgIzlhbEgbiDmnaHjgI3vvJrpnZ7liIbpobUv5YmN56uv5YiG6aG155SoIGNvbnRlbnQubGVuZ3Ro77yM5pyN5Yqh56uv5YiG6aG155SoIHRvdGFsRWxlbWVudHMgKi9cbiAgZ2V0VGFibGVUb3RhbENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLnRhYmxlRGF0YSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmICghdGhpcy5wYWdpbmF0aW9uIHx8IHRoaXMuZnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWJsZURhdGEuY29udGVudCA/IHRoaXMudGFibGVEYXRhLmNvbnRlbnQubGVuZ3RoIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGFibGVEYXRhLnRvdGFsRWxlbWVudHMgIT0gbnVsbFxuICAgICAgPyB0aGlzLnRhYmxlRGF0YS50b3RhbEVsZW1lbnRzXG4gICAgICA6IDA7XG4gIH1cblxuICByZXNldFN0YXR1cygpIHtcbiAgICB0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5pc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAvLyDlhYjmmL7lvI/nva4gZmFsc2XvvIzpgb/lhY0gbnotY2hlY2tib3gg5YaF6YOo54q25oCB5LiOIG1hcE9mQ2hlY2tlZElkIOS4jeWQjOatpe+8iOiZmuaLn+a7muWKqOWkjeeUqOihjOaXtuW4uOinge+8iVxuICAgIE9iamVjdC5rZXlzKHRoaXMubWFwT2ZDaGVja0xpc3QpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtrZXldID0gZmFsc2U7XG4gICAgfSk7XG4gICAgdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtW3RoaXMuc2VsZWN0RmllbGRdO1xuICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRba2V5XSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubWFwT2ZDaGVja2VkSWQgPSB7fTtcbiAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0ID0ge307XG4gICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KFtdKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiDljZXpgInvvJrpgInkuK3lvZPliY3ooYzlubbmuIXmjonlhbblroPooYzvvJvlv73nlaUgcmFkaW8g5Zug5YiH5o2i6ICM5Y+R5Ye655qEIGZhbHNlICovXG4gIG9uUmFkaW9TZWxlY3QoY2hlY2tlZDogYm9vbGVhbiwgZGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFjaGVja2VkIHx8ICFkYXRhKSB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNTZWxlY3REaXNhYmxlZChkYXRhKSkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IGRhdGFbdGhpcy5zZWxlY3RGaWVsZF07XG4gICAgdGhpcy5tYXBPZkNoZWNrZWRJZCA9IHt9O1xuICAgIHRoaXMubWFwT2ZDaGVja0xpc3QgPSB7fTtcbiAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRba2V5XSA9IHRydWU7XG4gICAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0W2tleV0gPSBkYXRhO1xuICAgIH1cbiAgICB0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5pc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5zZWxlY3RFdmVudCkge1xuICAgICAgdGhpcy5zZWxlY3RFdmVudC5lbWl0KGtleSAhPSBudWxsID8gW2RhdGFdIDogW10pO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZnJlc2hTdGF0dXMoZXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSwgZGF0YTogYW55ID0gbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdFR5cGUgPT09IFwicmFkaW9cIikge1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgdGhpcy5vblJhZGlvU2VsZWN0KGV2ZW50LCBkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIC8vIOemgeeUqOihjOS4jeWFgeiuuOWLvumAie+8m+WPlua2iOWLvumAieS7jeWFgeiuuO+8iOS+i+WmguaVsOaNruWPmOabtOWJjeW3suWLvumAie+8iVxuICAgICAgaWYgKGV2ZW50ICYmIHRoaXMuaXNTZWxlY3REaXNhYmxlZChkYXRhKSkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSA9IGV2ZW50O1xuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICF0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgKHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gPSBkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgICBkZWxldGUgdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0YWJsZUxpc3QgPSB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhdGhpcy5pc1NlbGVjdERpc2FibGVkKGl0ZW0pLFxuICAgICk7XG4gICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9XG4gICAgICBzZWxlY3RhYmxlTGlzdC5sZW5ndGggPiAwICYmXG4gICAgICBzZWxlY3RhYmxlTGlzdC5ldmVyeShcbiAgICAgICAgKGl0ZW0pID0+IHRoaXMubWFwT2ZDaGVja2VkSWRbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0sXG4gICAgICApO1xuICAgIHRoaXMuaXNJbmRldGVybWluYXRlID1cbiAgICAgIHNlbGVjdGFibGVMaXN0LnNvbWUoXG4gICAgICAgIChpdGVtKSA9PiB0aGlzLm1hcE9mQ2hlY2tlZElkW2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dLFxuICAgICAgKSAmJiAhdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZDtcbiAgICAvLyDop6blj5FzZWxlY3Tkuovku7ZcbiAgICBpZiAodGhpcy5zZWxlY3RFdmVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRMaXN0OiBBcnJheTxhbnk+ID0gT2JqZWN0LnZhbHVlcyh0aGlzLm1hcE9mQ2hlY2tMaXN0KTtcbiAgICAgIHRoaXMuc2VsZWN0RXZlbnQuZW1pdChzZWxlY3RlZExpc3QpO1xuICAgIH1cbiAgICAvLyDlpoLmnpzmlbDmja7kuLrnqbrvvIzliJnmuIXnqbrli77pgInmoIfor4ZcbiAgICBpZiAodGhpcy50YWJsZURhdGEuY29udGVudC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjaGVja0FsbCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgLy8g5YWo6YCJL+WPlua2iOWFqOmAieWdh+i3s+i/h+emgeeUqOihjO+8iOemgeeUqOihjOS/neaMgeWOn+WLvumAieeKtuaAge+8iVxuICAgICAgaWYgKHRoaXMuaXNTZWxlY3REaXNhYmxlZChpdGVtKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgIXRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgICAodGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSA9IGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgIGRlbGV0ZSB0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dID0gdmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiog5b2T5YmN6KGM5piv5ZCm56aB55So5Yu+6YCJICovXG4gIGlzU2VsZWN0RGlzYWJsZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5zZWxlY3REaXNhYmxlZEZpZWxkICYmXG4gICAgICBkYXRhICYmXG4gICAgICBkYXRhW3RoaXMuc2VsZWN0RGlzYWJsZWRGaWVsZF0gPT09IHRydWVcbiAgICApO1xuICB9XG5cbiAgLyoqIOW9k+WJjeihjOaYr+WQpuWkseaViCAqL1xuICBpc0ludmFsaWRSb3coZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5yb3dJbnZhbGlkRmllbGQgJiZcbiAgICAgIGRhdGEgJiZcbiAgICAgIGRhdGFbdGhpcy5yb3dJbnZhbGlkRmllbGRdID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJfmloflrZfpopzoibLvvJpjb2xvciDkuLrlh73mlbDml7bmjInooYzorqHnrpfvvIjnlKjkuo7mn5DkuIDooYzmn5DkuIDliJfmoIfnuqLvvInvvIzlkKbliJnmlbTliJflkIzoibLjgIJcbiAgICovXG4gIHJlc29sdmVDZWxsQ29sb3IoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghY29sIHx8IGNvbC5jb2xvciA9PSBudWxsIHx8IGNvbC5jb2xvciA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLmNvbG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29sLmNvbG9yKGRhdGEpO1xuICAgICAgcmV0dXJuIHZhbHVlIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjb2wuY29sb3I7XG4gIH1cblxuICAvKiog5Y+v54K55Ye75Y2V5YWD5qC86aKc6Imy77ya56m65YC85Zu65a6a54Gw77yM5ZCm5YiZ5oyJ5YiXIGNvbG9yICovXG4gIGdldExpbmtDZWxsQ29sb3IoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIGlzRW1wdHk6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICByZXR1cm4gXCIjMkEzNjM0XCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc29sdmVDZWxsQ29sb3IoY29sLCBkYXRhKTtcbiAgfVxuXG4gIC8qKiDmma7pgJrmlofmnKzljZXlhYPmoLzpopzoibLvvJrlpLHmlYjooYznu5/kuIDngbDvvIzlkKbliJnnlKjliJfphY3nva4gY29sb3IgKi9cbiAgZ2V0UGxhaW5DZWxsQ29sb3IoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzSW52YWxpZFJvdyhkYXRhKSkge1xuICAgICAgcmV0dXJuIFwiIzg2OEE5Q1wiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ2VsbENvbG9yKGNvbCwgZGF0YSk7XG4gIH1cblxuICBqdWRnZUNvbEVtcHR5KHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciB8fCBzdHIgPT09IDApIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIjznqbo+XCI7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdGVGaWVsZChjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcge1xuICAgIGlmIChjb2wuaXNTdGF0ZSkge1xuICAgICAgcmV0dXJuIGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5zdGF0ZUZpZWxkIHx8IFwic3RhdGVcIjtcbiAgfVxuXG4gIC8qKiDlrZfmrrXlgLzlkI7mmK/lkKblsZXnpLrnq5bnur/ooYzlj7cgKi9cbiAgaGFzUm93Tm8oY29sOiBIZFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgY29sICYmXG4gICAgICAoY29sLnJvd05vID09PSB0cnVlIHx8ICh0eXBlb2YgY29sLnJvd05vID09PSBcInN0cmluZ1wiICYmIGNvbC5yb3dObykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDooYzlj7fmlofmoYjjgIJyb3dObyDkuLrlrZfmrrXlkI3ml7blj5booYzmlbDmja7vvJvkuLogdHJ1ZSDml7bmjInlvZPliY3pobXluo/lj7fvvIjot6jpobXov57nu63vvIzku44gMSDlvIDlp4vvvInjgIJcbiAgICovXG4gIGdldFJvd05vVGV4dChjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmhhc1Jvd05vKGNvbCkpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5yb3dObyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgdmFsdWUgPSBkYXRhID8gZGF0YVtjb2wucm93Tm9dIDogbnVsbDtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2UgPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9XG4gICAgICBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA6IDA7XG4gICAgY29uc3Qgcm93SW5kZXggPSBOdW1iZXIoaW5kZXgpID49IDAgPyBOdW1iZXIoaW5kZXgpIDogMDtcbiAgICByZXR1cm4gU3RyaW5nKChwYWdlIC0gMSkgKiBzaXplICsgcm93SW5kZXggKyAxKTtcbiAgfVxuXG4gIC8qKiDooajlpLTjgIzphY3pgIHljZXlj7cgfCDooYzjgI3mi4bmiJDnn63nq5bnur/vvIzpgb/lhY3lrZfnrKYgfCDmi4nmu6HooYzpq5ggKi9cbiAgZ2V0VGl0bGVQYXJ0cyhjb2w6IEhkVGFibGVDb2x1bW4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5oYXNSb3dObyhjb2wpIHx8XG4gICAgICAhY29sIHx8XG4gICAgICAhY29sLnRpdGxlIHx8XG4gICAgICBTdHJpbmcoY29sLnRpdGxlKS5pbmRleE9mKFwifFwiKSA8IDBcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByYXcgPSBTdHJpbmcoY29sLnRpdGxlKS5zcGxpdChcInxcIik7XG4gICAgaWYgKHJhdy5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIFtyYXdbMF0udHJpbSgpLCByYXcuc2xpY2UoMSkuam9pbihcInxcIikudHJpbSgpXTtcbiAgfVxuXG4gIC8qKiDmmK/lkKbmmL7npLrnvJbovpHnrJTlm77moIfvvIjmnIkgZWRpdFR5cGUg5pe26LWw6KGM5YaF5o6n5Lu277yM5LiN5YaN5pi+56S656yU77yJICovXG4gIGlzRWRpdGFibGUoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbCB8fCB0aGlzLmhhc0lubGluZUVkaXQoY29sKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29sLmVkaXRhYmxlID09IG51bGwgfHwgY29sLmVkaXRhYmxlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5lZGl0YWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gISFjb2wuZWRpdGFibGUoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiAhIWNvbC5lZGl0YWJsZTtcbiAgfVxuXG4gIC8qKiDngrnlh7vnvJbovpHnrJTvvIzlm57osIPniLbnu4Tku7bkvKDlhaXnmoQgZWRpdCAqL1xuICBvbkVkaXRDbGljayhldmVudDogRXZlbnQsIGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlckV2ZW50KGNvbC5lZGl0IHx8IG51bGwsIGRhdGEpO1xuICB9XG5cbiAgLyoqIOWIl+aYr+WQpumFjee9ruS6huWPr+eUqOeahOihjOWGhee8lui+ke+8iG5hbWUg5b+F6aG75pivIHN0cmluZ++8iSAqL1xuICBoYXNJbmxpbmVFZGl0KGNvbDogSGRUYWJsZUNvbHVtbik6IGJvb2xlYW4ge1xuICAgIGlmICghY29sIHx8ICFjb2wuZWRpdFR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2wubmFtZSAhPT0gXCJzdHJpbmdcIiB8fCAhY29sLm5hbWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbaGQtdGFibGVdIGVkaXRUeXBlIOimgeaxgiBuYW1lIOS4uiBzdHJpbmfvvIzliJfjgIxcIiArXG4gICAgICAgICAgKGNvbC50aXRsZSB8fCBcIlwiKSArXG4gICAgICAgICAgXCLjgI3lt7Llm57pgIDlj6ror7tcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaXNFZGl0RGlzYWJsZWQoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbCB8fCBjb2wuZWRpdERpc2FibGVkID09IG51bGwgfHwgY29sLmVkaXREaXNhYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2wuZWRpdERpc2FibGVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiAhIWNvbC5lZGl0RGlzYWJsZWQoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiAhIWNvbC5lZGl0RGlzYWJsZWQ7XG4gIH1cblxuICBnZXRTZWxlY3RMaXN0KGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogQXJyYXk8YW55PiB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5zZWxlY3RPcHRpb24pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gY29sLnNlbGVjdE9wdGlvbjtcbiAgICBpZiAob3B0LnNlbGVjdExpc3ROYW1lICYmIGRhdGEpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBkYXRhW29wdC5zZWxlY3RMaXN0TmFtZV07XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShsaXN0KSA/IGxpc3QgOiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3B0LnNlbGVjdExpc3QpID8gb3B0LnNlbGVjdExpc3QgOiBbXTtcbiAgfVxuXG4gIGdldFNlbGVjdE9wdGlvbkxhYmVsKGNvbDogSGRUYWJsZUNvbHVtbiwgaXRlbTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLnNlbGVjdE9wdGlvbiB8fCAhaXRlbSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IGNvbC5zZWxlY3RPcHRpb247XG4gICAgY29uc3QgdmFsdWUgPSBpdGVtW29wdC52YWx1ZV07XG4gICAgY29uc3QgbGFiZWwgPSBpdGVtW29wdC5sYWJlbF07XG4gICAgaWYgKG9wdC5zaG93TGFiZWxBbmRWYWx1ZSB8fCBvcHQuaGRTaG93SXRlbUNvZGUpIHtcbiAgICAgIHJldHVybiBgWyR7dmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZX1dJHtsYWJlbCA9PSBudWxsID8gXCJcIiA6IGxhYmVsfWA7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbCA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhsYWJlbCk7XG4gIH1cblxuICBnZXRJbnB1dE51bWJlclByb3AoXG4gICAgY29sOiBIZFRhYmxlQ29sdW1uLFxuICAgIGtleTogXCJtaW5cIiB8IFwibWF4XCIgfCBcInN0ZXBcIiB8IFwicHJlY2lzaW9uXCIsXG4gICAgZmFsbGJhY2s6IG51bWJlcixcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLmlucHV0TnVtYmVyKSB7XG4gICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgfVxuICAgIGNvbnN0IHZhbCA9IGNvbC5pbnB1dE51bWJlcltrZXldO1xuICAgIHJldHVybiB2YWwgIT0gbnVsbCA/IE51bWJlcih2YWwpIDogZmFsbGJhY2s7XG4gIH1cblxuICBpc0RhdGVTaG93VGltZShjb2w6IEhkVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoY29sICYmIGNvbC5kYXRlT3B0aW9uICYmIGNvbC5kYXRlT3B0aW9uLnNob3dUaW1lKTtcbiAgfVxuXG4gIGlzRGF0ZVNob3dUb2RheShjb2w6IEhkVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLmRhdGVPcHRpb24gfHwgY29sLmRhdGVPcHRpb24uc2hvd1RvZGF5ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gY29sLmRhdGVPcHRpb24uc2hvd1RvZGF5ICE9PSBmYWxzZTtcbiAgfVxuXG4gIGdldERhdGVGb3JtYXQoY29sOiBIZFRhYmxlQ29sdW1uLCBpc1JhbmdlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAoY29sICYmIGNvbC5kYXRlT3B0aW9uICYmIGNvbC5kYXRlT3B0aW9uLmZvcm1hdCkge1xuICAgICAgcmV0dXJuIGNvbC5kYXRlT3B0aW9uLmZvcm1hdDtcbiAgICB9XG4gICAgaWYgKCFpc1JhbmdlICYmIHRoaXMuaXNEYXRlU2hvd1RpbWUoY29sKSkge1xuICAgICAgcmV0dXJuIFwieXl5eS1NTS1kZCBISDptbTpzc1wiO1xuICAgIH1cbiAgICByZXR1cm4gXCJ5eXl5LU1NLWRkXCI7XG4gIH1cblxuICBnZXREaXNhYmxlZERhdGUoY29sOiBIZFRhYmxlQ29sdW1uKTogKGN1cnJlbnQ6IERhdGUpID0+IGJvb2xlYW4ge1xuICAgIGlmIChjb2wgJiYgY29sLmRhdGVPcHRpb24gJiYgY29sLmRhdGVPcHRpb24uZGlzYWJsZWREYXRlKSB7XG4gICAgICByZXR1cm4gY29sLmRhdGVPcHRpb24uZGlzYWJsZWREYXRlO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH1cblxuICBnZXRSYW5nZVBsYWNlaG9sZGVyKGNvbDogSGRUYWJsZUNvbHVtbik6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID1cbiAgICAgIGNvbCAmJiBjb2wuZGF0ZU9wdGlvbiA/IGNvbC5kYXRlT3B0aW9uLnJhbmdlUGxhY2Vob2xkZXIgOiBudWxsO1xuICAgIGlmIChwbGFjZWhvbGRlciAmJiBwbGFjZWhvbGRlci5sZW5ndGggPj0gMikge1xuICAgICAgcmV0dXJuIFtwbGFjZWhvbGRlclswXSwgcGxhY2Vob2xkZXJbMV1dO1xuICAgIH1cbiAgICByZXR1cm4gW1wi5byA5aeL5pel5pyfXCIsIFwi57uT5p2f5pel5pyfXCJdO1xuICB9XG5cbiAgLyoqIElucHV0IC8gSW5wdXROdW1iZXIgLyDml6XmnJ/lj5jmm7TvvJrlhYjorrDml6flgLzlho3lhpnlm57lubbpgJrnn6XniLbnu4Tku7YgKi9cbiAgb25DZWxsQ2hhbmdlKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0lubGluZUVkaXQoY29sKSB8fCAhZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gY29sLm5hbWUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBkYXRhW25hbWVdO1xuICAgIGRhdGFbbmFtZV0gPSB2YWx1ZTtcbiAgICB0aGlzLmNlbGxDaGFuZ2UuZW1pdCh7XG4gICAgICBsaW5lOiBkYXRhLFxuICAgICAgY29sLFxuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgcHJldmlvdXNWYWx1ZSxcbiAgICB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Qg5bGV5byA77ya5pyJIG9uT3BlbkNoYW5nZUV2ZW50IOaXtuWxleW8gOWFiOa4heepuumAiemhueWGjeWbnuiwgyAob3BlbiwgbGluZSnvvJvlhbPpl63kuI3lm57osIPkuJrliqHjgIJcbiAgICog5Zue6LCD6IulIHJldHVybiDmlbDnu4QgLyBQcm9taXNlIC8gT2JzZXJ2YWJsZe+8jOeUsee7hOS7tuWGmeWbniBvcHRpb25zIOW5tiBtYXJrRm9yQ2hlY2vjgIJcbiAgICovXG4gIG9uU2VsZWN0T3BlbkNoYW5nZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgb3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghY29sIHx8ICFjb2wub25PcGVuQ2hhbmdlRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3RPcHRpb25zT25PcGVuKGNvbCwgZGF0YSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgY29uc3QgZm4gPSBjb2wub25PcGVuQ2hhbmdlRXZlbnQ7XG4gICAgY29uc3QgZGVib3VuY2VNcyA9XG4gICAgICBjb2wub25PcGVuQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWUgIT0gbnVsbFxuICAgICAgICA/IGNvbC5vbk9wZW5DaGFuZ2VFdmVudERlYm91bmNlVGltZVxuICAgICAgICA6IDA7XG4gICAgaWYgKCFkZWJvdW5jZU1zKSB7XG4gICAgICBpZiAob3Blbikge1xuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdExvYWRlclJlc3VsdChjb2wsIGRhdGEsIGZuKG9wZW4sIGRhdGEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0T3BlbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0T3BlbkNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuc2VsZWN0T3BlbkNoYW5nZVN1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZShkZWJvdW5jZU1zKSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZm46IGNiLCBvcGVuOiBvLCBsaW5lLCBjb2w6IGMgfSkgPT4ge1xuICAgICAgICBpZiAobykge1xuICAgICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0TG9hZGVyUmVzdWx0KGMsIGxpbmUsIGNiKG8sIGxpbmUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgdGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3ViamVjdC5uZXh0KHsgZm4sIG9wZW4sIGxpbmU6IGRhdGEsIGNvbCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Qg5pCc57Si77ya5pyJIG9uU2VhcmNoRXZlbnQg5pe25Zue6LCDIChrZXl3b3JkLCBsaW5lKe+8jOS4jea4heepuiBvcHRpb25z44CCXG4gICAqIOWbnuiwg+iLpSByZXR1cm4g5pWw57uEIC8gUHJvbWlzZSAvIE9ic2VydmFibGXvvIznlLHnu4Tku7blhpnlm54gb3B0aW9ucyDlubYgbWFya0ZvckNoZWNr44CCXG4gICAqL1xuICBvblNlbGVjdFNlYXJjaChjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwga2V5d29yZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5vblNlYXJjaEV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZuID0gY29sLm9uU2VhcmNoRXZlbnQ7XG4gICAgY29uc3QgZGVib3VuY2VNcyA9XG4gICAgICBjb2wub25TZWFyY2hFdmVudEV2ZW50RGVib3VuY2VUaW1lICE9IG51bGxcbiAgICAgICAgPyBjb2wub25TZWFyY2hFdmVudEV2ZW50RGVib3VuY2VUaW1lXG4gICAgICAgIDogMDtcbiAgICBpZiAoIWRlYm91bmNlTXMpIHtcbiAgICAgIHRoaXMuaGFuZGxlU2VsZWN0TG9hZGVyUmVzdWx0KGNvbCwgZGF0YSwgZm4oa2V5d29yZCwgZGF0YSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RTZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0U2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0U2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWxlY3RTZWFyY2hTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoZGVib3VuY2VNcykpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZuOiBjYiwga2V5d29yZDoga3csIGxpbmUsIGNvbDogYyB9KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0TG9hZGVyUmVzdWx0KGMsIGxpbmUsIGNiKGt3LCBsaW5lKSk7XG4gICAgICB9KTtcbiAgICB0aGlzLnNlbGVjdFNlYXJjaFN1YmplY3QubmV4dCh7IGZuLCBrZXl3b3JkLCBsaW5lOiBkYXRhLCBjb2wgfSk7XG4gIH1cblxuICAvKiog5bGV5byA5pe25riF56m65YiXIHNlbGVjdExpc3Qg5oiW6KGM5LiKIHNlbGVjdExpc3ROYW1l77yM55Sx5Lia5Yqh5Zue6LCD5YaN5YaZ5YWlICovXG4gIHByaXZhdGUgY2xlYXJTZWxlY3RPcHRpb25zT25PcGVuKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5zZWxlY3RPcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gY29sLnNlbGVjdE9wdGlvbjtcbiAgICBpZiAob3B0LnNlbGVjdExpc3QgIT0gbnVsbCkge1xuICAgICAgb3B0LnNlbGVjdExpc3QgPSBbXTtcbiAgICB9XG4gICAgaWYgKG9wdC5zZWxlY3RMaXN0TmFtZSAmJiBkYXRhKSB7XG4gICAgICBkYXRhW29wdC5zZWxlY3RMaXN0TmFtZV0gPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5aSE55CG5Yqg6L295Zue6LCD6L+U5Zue5YC877ya5pWw57uE55u05o6l5YaZ5Zue77ybUHJvbWlzZS9PYnNlcnZhYmxlIOWujOaIkOWQjuWGmeWbnu+8m3ZvaWQg5LuFIG1hcmtGb3JDaGVja+OAglxuICAgKiDkvJjlhYjlhpkgc2VsZWN0TGlzdE5hbWXvvIzlkKbliJnlhpnliJfkuIogc2VsZWN0TGlzdOOAglxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTZWxlY3RMb2FkZXJSZXN1bHQoXG4gICAgY29sOiBIZFRhYmxlQ29sdW1uLFxuICAgIGRhdGE6IGFueSxcbiAgICByZXN1bHQ6IGFueSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgdGhpcy5hcHBseVNlbGVjdE9wdGlvbnMoY29sLCBkYXRhLCByZXN1bHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc3VsdC50aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJlc3VsdC50aGVuKFxuICAgICAgICAobGlzdDogYW55KSA9PiB0aGlzLmFwcGx5U2VsZWN0T3B0aW9ucyhjb2wsIGRhdGEsIGxpc3QpLFxuICAgICAgICAoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0LnN1YnNjcmliZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RMb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RMb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0TG9hZGVyU3Vic2NyaXB0aW9uID0gcmVzdWx0LnN1YnNjcmliZShcbiAgICAgICAgKGxpc3Q6IGFueSkgPT4gdGhpcy5hcHBseVNlbGVjdE9wdGlvbnMoY29sLCBkYXRhLCBsaXN0KSxcbiAgICAgICAgKCkgPT4gdGhpcy5jZHIubWFya0ZvckNoZWNrKCksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTZWxlY3RPcHRpb25zKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCBsaXN0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLnNlbGVjdE9wdGlvbiB8fCAhQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IGNvbC5zZWxlY3RPcHRpb247XG4gICAgaWYgKG9wdC5zZWxlY3RMaXN0TmFtZSAmJiBkYXRhKSB7XG4gICAgICBkYXRhW29wdC5zZWxlY3RMaXN0TmFtZV0gPSBsaXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHQuc2VsZWN0TGlzdCA9IGxpc3Q7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFNlbGVjdCDlj5jmm7TvvJrlj4zlhpkgdmFsdWUgKyBsYWJlbO+8jOW5tuW4piBwcmV2aW91cyogLyBvcHRpb24gKi9cbiAgb25TZWxlY3RDaGFuZ2UoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSW5saW5lRWRpdChjb2wpIHx8ICFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBjb2wubmFtZSBhcyBzdHJpbmc7XG4gICAgY29uc3Qgb3B0ID0gY29sLnNlbGVjdE9wdGlvbjtcbiAgICBjb25zdCBsYWJlbEZpZWxkID0gb3B0ICYmIG9wdC5sYWJlbCA/IG9wdC5sYWJlbCA6IG51bGw7XG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGRhdGFbbmFtZV07XG4gICAgY29uc3QgcHJldmlvdXNMYWJlbCA9IGxhYmVsRmllbGQgPyBkYXRhW2xhYmVsRmllbGRdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLmdldFNlbGVjdExpc3QoY29sLCBkYXRhKTtcbiAgICBjb25zdCBwcmV2aW91c09wdGlvbiA9XG4gICAgICBwcmV2aW91c1ZhbHVlID09IG51bGwgfHwgIW9wdFxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiBsaXN0LmZpbmQoKGl0ZW0pID0+IGl0ZW0gJiYgaXRlbVtvcHQudmFsdWVdID09PSBwcmV2aW91c1ZhbHVlKSB8fFxuICAgICAgICAgIG51bGw7XG4gICAgY29uc3Qgb3B0aW9uID1cbiAgICAgIHZhbHVlID09IG51bGwgfHwgIW9wdFxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiBsaXN0LmZpbmQoKGl0ZW0pID0+IGl0ZW0gJiYgaXRlbVtvcHQudmFsdWVdID09PSB2YWx1ZSkgfHwgbnVsbDtcblxuICAgIGRhdGFbbmFtZV0gPSB2YWx1ZTtcbiAgICBsZXQgbGFiZWw6IGFueSA9IHVuZGVmaW5lZDtcbiAgICBpZiAobGFiZWxGaWVsZCkge1xuICAgICAgbGFiZWwgPSBvcHRpb24gPyBvcHRpb25bb3B0LmxhYmVsXSA6IG51bGw7XG4gICAgICBkYXRhW2xhYmVsRmllbGRdID0gbGFiZWw7XG4gICAgfVxuXG4gICAgdGhpcy5jZWxsQ2hhbmdlLmVtaXQoe1xuICAgICAgbGluZTogZGF0YSxcbiAgICAgIGNvbCxcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgICBsYWJlbCxcbiAgICAgIHByZXZpb3VzTGFiZWwsXG4gICAgICBvcHRpb24sXG4gICAgICBwcmV2aW91c09wdGlvbixcbiAgICB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIl19