raise-common-lib-new 0.0.63 → 0.0.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/esm2022/lib/actions/toolbar/index.component.mjs +4 -3
  2. package/esm2022/lib/actions/toolbar-item/index.component.mjs +2 -2
  3. package/esm2022/lib/common-grid/grid-action/grid-action-item/grid-action-item.component.mjs +1 -1
  4. package/esm2022/lib/common-grid/grid-action/grid-action.component.mjs +3 -2
  5. package/esm2022/lib/common-grid/index.component.mjs +6 -3
  6. package/esm2022/lib/dashboard/api.mjs +33 -0
  7. package/esm2022/lib/dashboard/bar-charts/bar-charts.component.mjs +430 -0
  8. package/esm2022/lib/dashboard/bar-charts/utils.mjs +18 -0
  9. package/esm2022/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.mjs +442 -0
  10. package/esm2022/lib/dashboard/dashboard.service.mjs +295 -0
  11. package/esm2022/lib/dashboard/dashboardPorlets.service.mjs +2169 -0
  12. package/esm2022/lib/dashboard/dialog-group/download/index.component.mjs +212 -0
  13. package/esm2022/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.mjs +36 -0
  14. package/esm2022/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.mjs +3211 -0
  15. package/esm2022/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.mjs +3117 -0
  16. package/esm2022/lib/dashboard/gadget-group/gadget-table/gadget-table.component.mjs +1099 -0
  17. package/esm2022/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.mjs +583 -0
  18. package/esm2022/lib/dashboard/pane-group-new.component.mjs +2031 -0
  19. package/esm2022/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.mjs +637 -0
  20. package/esm2022/lib/dashboard/sidebar-iconlist/field-format/field-format.component.mjs +753 -0
  21. package/esm2022/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.mjs +216 -0
  22. package/esm2022/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.mjs +1239 -0
  23. package/esm2022/lib/dialog/common-delete-dialog/index.component.mjs +1 -1
  24. package/esm2022/lib/dialog/common-dialog/index.component.mjs +16 -5
  25. package/esm2022/lib/float-box/index.component.mjs +18 -4
  26. package/esm2022/lib/form/checkbox-group/index.component.mjs +35 -5
  27. package/esm2022/lib/form/drawer-form/drawer-form.component.mjs +177 -76
  28. package/esm2022/lib/layout/drawer/index.component.mjs +2 -2
  29. package/esm2022/lib/layout/page-list/index.component.mjs +9 -3
  30. package/esm2022/lib/layout/page-tab/index.component.mjs +5 -3
  31. package/esm2022/lib/layout/rs-stepper/constants.mjs +2 -0
  32. package/esm2022/lib/layout/rs-stepper/index.component.mjs +148 -0
  33. package/esm2022/lib/raise-common-lib.module.mjs +114 -7
  34. package/esm2022/lib/service/InjectionToken.mjs +5 -0
  35. package/esm2022/lib/service/keep-alive.service.mjs +2 -2
  36. package/esm2022/lib/smart-popup/index.component.mjs +1084 -0
  37. package/esm2022/public-api.mjs +19 -1
  38. package/fesm2022/raise-common-lib-new.mjs +18037 -220
  39. package/fesm2022/raise-common-lib-new.mjs.map +1 -1
  40. package/lib/common-grid/index.component.d.ts +2 -1
  41. package/lib/dashboard/api.d.ts +24 -0
  42. package/lib/dashboard/bar-charts/bar-charts.component.d.ts +63 -0
  43. package/lib/dashboard/bar-charts/utils.d.ts +1 -0
  44. package/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.d.ts +52 -0
  45. package/lib/dashboard/dashboard.service.d.ts +152 -0
  46. package/lib/dashboard/dashboardPorlets.service.d.ts +214 -0
  47. package/lib/dashboard/dialog-group/download/index.component.d.ts +36 -0
  48. package/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.d.ts +15 -0
  49. package/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.d.ts +128 -0
  50. package/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.d.ts +131 -0
  51. package/lib/dashboard/gadget-group/gadget-table/gadget-table.component.d.ts +77 -0
  52. package/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.d.ts +47 -0
  53. package/lib/dashboard/pane-group-new.component.d.ts +169 -0
  54. package/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.d.ts +56 -0
  55. package/lib/dashboard/sidebar-iconlist/field-format/field-format.component.d.ts +62 -0
  56. package/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.d.ts +30 -0
  57. package/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.d.ts +150 -0
  58. package/lib/dialog/common-dialog/index.component.d.ts +3 -1
  59. package/lib/float-box/index.component.d.ts +4 -3
  60. package/lib/form/checkbox-group/index.component.d.ts +5 -0
  61. package/lib/form/drawer-form/drawer-form.component.d.ts +21 -8
  62. package/lib/layout/page-list/index.component.d.ts +3 -1
  63. package/lib/layout/page-tab/index.component.d.ts +1 -0
  64. package/lib/layout/rs-stepper/constants.d.ts +5 -0
  65. package/lib/layout/rs-stepper/index.component.d.ts +31 -0
  66. package/lib/raise-common-lib.module.d.ts +61 -40
  67. package/lib/service/InjectionToken.d.ts +4 -0
  68. package/lib/smart-popup/index.component.d.ts +60 -0
  69. package/package.json +1 -1
  70. package/public-api.d.ts +18 -0
  71. package/src/assets/img/dashboard_icon/AddPerson.svg +4 -0
  72. package/src/assets/img/dashboard_icon/Angle-double-left.svg +12 -0
  73. package/src/assets/img/dashboard_icon/Angle-double-right.svg +12 -0
  74. package/src/assets/img/dashboard_icon/Arrow_collapse.svg +3 -0
  75. package/src/assets/img/dashboard_icon/Arrow_expand.svg +3 -0
  76. package/src/assets/img/dashboard_icon/Close.svg +4 -0
  77. package/src/assets/img/dashboard_icon/Edit_label.svg +3 -0
  78. package/src/assets/img/dashboard_icon/RemoveMini.svg +3 -0
  79. package/src/assets/img/dashboard_icon/ShareTo.svg +3 -0
  80. package/src/assets/img/dashboard_icon/add-dashboard.svg +4 -0
  81. package/src/assets/img/dashboard_icon/add-tab.svg +4 -0
  82. package/src/assets/img/dashboard_icon/angle-left.svg +12 -0
  83. package/src/assets/img/dashboard_icon/angle-right.svg +12 -0
  84. package/src/assets/img/dashboard_icon/area-white.svg +3 -0
  85. package/src/assets/img/dashboard_icon/area.svg +3 -0
  86. package/src/assets/img/dashboard_icon/bar-white.svg +14 -0
  87. package/src/assets/img/dashboard_icon/bar.svg +14 -0
  88. package/src/assets/img/dashboard_icon/basic-icon-filter.svg +14 -0
  89. package/src/assets/img/dashboard_icon/chart-combined-active.svg +7 -0
  90. package/src/assets/img/dashboard_icon/chart-combined.svg +7 -0
  91. package/src/assets/img/dashboard_icon/column-white.svg +14 -0
  92. package/src/assets/img/dashboard_icon/column.svg +26 -0
  93. package/src/assets/img/dashboard_icon/customize.png +0 -0
  94. package/src/assets/img/dashboard_icon/dashboard-description.svg +18 -0
  95. package/src/assets/img/dashboard_icon/dashboard-download.svg +18 -0
  96. package/src/assets/img/dashboard_icon/dashboard-drag.svg +28 -0
  97. package/src/assets/img/dashboard_icon/dashboard-duplicate.svg +24 -0
  98. package/src/assets/img/dashboard_icon/dashboard-icon.svg +12 -0
  99. package/src/assets/img/dashboard_icon/dashboard-properties.svg +18 -0
  100. package/src/assets/img/dashboard_icon/dashboard-rename.svg +18 -0
  101. package/src/assets/img/dashboard_icon/dashboard-share.svg +20 -0
  102. package/src/assets/img/dashboard_icon/dashboard-tab-delete.svg +4 -0
  103. package/src/assets/img/dashboard_icon/dashboard_Share.svg +3 -0
  104. package/src/assets/img/dashboard_icon/dashboard_ToolsHide.svg +4 -0
  105. package/src/assets/img/dashboard_icon/datamart_.svg +5 -0
  106. package/src/assets/img/dashboard_icon/datamart_Admin.svg +3 -0
  107. package/src/assets/img/dashboard_icon/datamart_Asset Portfolio.svg +4 -0
  108. package/src/assets/img/dashboard_icon/datamart_Bank.svg +3 -0
  109. package/src/assets/img/dashboard_icon/datamart_CRM.svg +6 -0
  110. package/src/assets/img/dashboard_icon/datamart_Company.svg +6 -0
  111. package/src/assets/img/dashboard_icon/datamart_Compliance.svg +3 -0
  112. package/src/assets/img/dashboard_icon/datamart_Contact.svg +3 -0
  113. package/src/assets/img/dashboard_icon/datamart_DASHBOARD.svg +4 -0
  114. package/src/assets/img/dashboard_icon/datamart_DOCX.svg +4 -0
  115. package/src/assets/img/dashboard_icon/datamart_ESG.svg +4 -0
  116. package/src/assets/img/dashboard_icon/datamart_Financials - Company.svg +3 -0
  117. package/src/assets/img/dashboard_icon/datamart_Fund.svg +4 -0
  118. package/src/assets/img/dashboard_icon/datamart_FundFinancial.svg +4 -0
  119. package/src/assets/img/dashboard_icon/datamart_HTML.svg +4 -0
  120. package/src/assets/img/dashboard_icon/datamart_Logs.svg +8 -0
  121. package/src/assets/img/dashboard_icon/datamart_PDF.svg +5 -0
  122. package/src/assets/img/dashboard_icon/datamart_Project.svg +3 -0
  123. package/src/assets/img/dashboard_icon/datamart_Templates.svg +7 -0
  124. package/src/assets/img/dashboard_icon/datamart_Track Change.svg +3 -0
  125. package/src/assets/img/dashboard_icon/datamart_VirtualGroup.svg +5 -0
  126. package/src/assets/img/dashboard_icon/datamart_XLS.svg +4 -0
  127. package/src/assets/img/dashboard_icon/desktop_selected.svg +10 -0
  128. package/src/assets/img/dashboard_icon/desktop_unselected.svg +10 -0
  129. package/src/assets/img/dashboard_icon/favourite-grey.svg +3 -0
  130. package/src/assets/img/dashboard_icon/favourite-yellow.svg +3 -0
  131. package/src/assets/img/dashboard_icon/forms-checkbox-square-tick.svg +3 -0
  132. package/src/assets/img/dashboard_icon/ftable-white.svg +24 -0
  133. package/src/assets/img/dashboard_icon/ftable.svg +24 -0
  134. package/src/assets/img/dashboard_icon/gadget-basic-arrow-down.svg +14 -0
  135. package/src/assets/img/dashboard_icon/gadget-basic-format.svg +21 -0
  136. package/src/assets/img/dashboard_icon/gadget-basic-sub-total.svg +18 -0
  137. package/src/assets/img/dashboard_icon/gadget-basic-total-1.svg +9 -0
  138. package/src/assets/img/dashboard_icon/gadget-basic-total.svg +16 -0
  139. package/src/assets/img/dashboard_icon/gadget-columns.svg +12 -0
  140. package/src/assets/img/dashboard_icon/gadget-delete.svg +18 -0
  141. package/src/assets/img/dashboard_icon/gadget-download.svg +18 -0
  142. package/src/assets/img/dashboard_icon/gadget-duplicate.svg +24 -0
  143. package/src/assets/img/dashboard_icon/gadget-edit.svg +18 -0
  144. package/src/assets/img/dashboard_icon/gadget-filters-light.svg +9 -0
  145. package/src/assets/img/dashboard_icon/gadget-filters.svg +9 -0
  146. package/src/assets/img/dashboard_icon/gadget-format-0.svg +8 -0
  147. package/src/assets/img/dashboard_icon/gadget-format-1.svg +8 -0
  148. package/src/assets/img/dashboard_icon/gadget-format.svg +19 -0
  149. package/src/assets/img/dashboard_icon/gadget-fullscreen.svg +30 -0
  150. package/src/assets/img/dashboard_icon/gadget-settings.svg +18 -0
  151. package/src/assets/img/dashboard_icon/gadget-sub-total-0.svg +18 -0
  152. package/src/assets/img/dashboard_icon/gadget-sub-total-1.svg +18 -0
  153. package/src/assets/img/dashboard_icon/gadget-thumbnail.svg +12 -0
  154. package/src/assets/img/dashboard_icon/gadget-type-light.svg +15 -0
  155. package/src/assets/img/dashboard_icon/gadget-type.svg +16 -0
  156. package/src/assets/img/dashboard_icon/geo-white.svg +14 -0
  157. package/src/assets/img/dashboard_icon/geo.svg +14 -0
  158. package/src/assets/img/dashboard_icon/historic-IRR-white.svg +9 -0
  159. package/src/assets/img/dashboard_icon/historic-IRR.svg +5 -0
  160. package/src/assets/img/dashboard_icon/information-1.png +0 -0
  161. package/src/assets/img/dashboard_icon/information-grey.svg +4 -0
  162. package/src/assets/img/dashboard_icon/menu-change-group.svg +3 -0
  163. package/src/assets/img/dashboard_icon/menu-close.svg +20 -0
  164. package/src/assets/img/dashboard_icon/menu-delete.svg +18 -0
  165. package/src/assets/img/dashboard_icon/menu-description.svg +19 -0
  166. package/src/assets/img/dashboard_icon/menu-download.svg +24 -0
  167. package/src/assets/img/dashboard_icon/menu-drag.svg +28 -0
  168. package/src/assets/img/dashboard_icon/menu-duplicate.svg +26 -0
  169. package/src/assets/img/dashboard_icon/menu-properties.svg +18 -0
  170. package/src/assets/img/dashboard_icon/menu-rename.svg +23 -0
  171. package/src/assets/img/dashboard_icon/menu-share.svg +20 -0
  172. package/src/assets/img/dashboard_icon/menu-toolbar.svg +10 -0
  173. package/src/assets/img/dashboard_icon/mobile_selected.svg +10 -0
  174. package/src/assets/img/dashboard_icon/mobile_unselected.svg +10 -0
  175. package/src/assets/img/dashboard_icon/more_Save.svg +3 -0
  176. package/src/assets/img/dashboard_icon/more_View.svg +3 -0
  177. package/src/assets/img/dashboard_icon/multi-series-white.svg +20 -0
  178. package/src/assets/img/dashboard_icon/multi-series.svg +6 -0
  179. package/src/assets/img/dashboard_icon/paint-bucket.svg +6 -0
  180. package/src/assets/img/dashboard_icon/pie-white.svg +16 -0
  181. package/src/assets/img/dashboard_icon/pie.svg +16 -0
  182. package/src/assets/img/dashboard_icon/pivot-chart-active.svg +8 -0
  183. package/src/assets/img/dashboard_icon/pivot-chart.svg +8 -0
  184. package/src/assets/img/dashboard_icon/pivot-white.svg +8 -0
  185. package/src/assets/img/dashboard_icon/pivot.svg +8 -0
  186. package/src/assets/img/dashboard_icon/pivot_column.svg +9 -0
  187. package/src/assets/img/dashboard_icon/pivot_column_active.svg +9 -0
  188. package/src/assets/img/dashboard_icon/pivot_line.svg +12 -0
  189. package/src/assets/img/dashboard_icon/pivot_line_active.svg +12 -0
  190. package/src/assets/img/dashboard_icon/print-A2.svg +3 -0
  191. package/src/assets/img/dashboard_icon/radar-white.svg +19 -0
  192. package/src/assets/img/dashboard_icon/radar.svg +19 -0
  193. package/src/assets/img/dashboard_icon/saveAs.svg +3 -0
  194. package/src/assets/img/dashboard_icon/search_input.svg +4 -0
  195. package/src/assets/img/dashboard_icon/table-3-white.svg +16 -0
  196. package/src/assets/img/dashboard_icon/table-3.svg +16 -0
  197. package/src/assets/img/dashboard_icon/table-filter-off.svg +5 -0
  198. package/src/assets/img/dashboard_icon/table-filter-on.svg +5 -0
  199. package/src/assets/img/dashboard_icon/tag_dashboard_selected.svg +3 -0
  200. package/src/assets/img/dashboard_icon/tag_dashboard_unselected.svg +3 -0
  201. package/src/assets/img/dashboard_icon/tag_share_selected.svg +3 -0
  202. package/src/assets/img/dashboard_icon/tag_share_unselected.svg +3 -0
  203. package/src/assets/img/dashboard_icon/tick.svg +26 -0
  204. package/src/assets/img/dashboard_icon/toolbar_AddDashboard.svg +5 -0
  205. package/src/assets/img/dashboard_icon/toolbar_AddGroup.svg +3 -0
  206. package/src/assets/img/dashboard_icon/toolbar_AddReport.svg +3 -0
  207. package/src/assets/img/dashboard_icon/toolbar_CollapseAll.svg +3 -0
  208. package/src/assets/img/dashboard_icon/toolbar_Customize.svg +3 -0
  209. package/src/assets/img/dashboard_icon/toolbar_DeleteDark.svg +3 -0
  210. package/src/assets/img/dashboard_icon/toolbar_Duplicate.svg +3 -0
  211. package/src/assets/img/dashboard_icon/toolbar_Edit.svg +3 -0
  212. package/src/assets/img/dashboard_icon/toolbar_ExpandAll.svg +3 -0
  213. package/src/assets/img/dashboard_icon/toolbar_Search.svg +3 -0
  214. package/src/assets/img/dashboard_icon/topbar-menu.svg +33 -0
  215. package/src/assets/img/dashboard_icon/topbar-refresh.svg +17 -0
  216. package/src/assets/img/dashboard_icon/topbar-tool-off.svg +12 -0
  217. package/src/assets/img/dashboard_icon/topbar-tool-on.svg +12 -0
  218. package/src/assets/img/dashboard_icon/trade-up-white.svg +14 -0
  219. package/src/assets/img/dashboard_icon/trade-up.svg +14 -0
  220. package/src/assets/img/dashboard_icon/transpose-white.svg +16 -0
  221. package/src/assets/img/dashboard_icon/transpose.svg +16 -0
@@ -0,0 +1,3117 @@
1
+ import { Component, Input, ViewChild, ChangeDetectionStrategy, EventEmitter, Output, Optional, Inject, } from "@angular/core";
2
+ import { ToolbarService, FieldListService, NumberFormattingService, CalculatedFieldService, GroupingBarService, VirtualScrollService, DrillThroughService, } from "@syncfusion/ej2-angular-pivotview";
3
+ import { L10n, createElement, enableRipple } from "@syncfusion/ej2-base";
4
+ import { PBF_TOKEN } from "../../../service/InjectionToken";
5
+ import { sortBy, differenceWith, startsWith, cloneDeep, uniqBy, filter as _filter, maxBy, minBy, sumBy, meanBy, mean, } from "lodash";
6
+ import { AGGREGATE_TYPES_TEXT, ALL_AGGREGATE_TYPES, } from "../../dashboardPorlets.service";
7
+ import { Browser } from "@syncfusion/ej2-base";
8
+ import { Observable } from "rxjs";
9
+ import { MaskedTextBox } from "@syncfusion/ej2-inputs/src/maskedtextbox/maskedtextbox";
10
+ import { DataManager } from "@syncfusion/ej2-data/src/manager";
11
+ import { Predicate, Query } from "@syncfusion/ej2-data/src/query";
12
+ import { DataUtil } from "@syncfusion/ej2-data";
13
+ import moment from "moment";
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "../../dashboardPorlets.service";
16
+ import * as i2 from "../../dashboard.service";
17
+ import * as i3 from "@angular/common";
18
+ import * as i4 from "@syncfusion/ej2-angular-pivotview";
19
+ enableRipple(false);
20
+ export class GadgetPivotChartComponent {
21
+ dashboardPorletsService;
22
+ dashboardService;
23
+ ref;
24
+ pbf;
25
+ portlet;
26
+ dashboard;
27
+ portlets;
28
+ updatePorletConfig = new EventEmitter();
29
+ Pivot_Data;
30
+ config;
31
+ dataSourceSettings;
32
+ excludeFields = [];
33
+ filterSettings = [];
34
+ datePipeFormat;
35
+ translation;
36
+ pivotObj;
37
+ fieldlistObj;
38
+ grandTotals = {};
39
+ subTotals = {};
40
+ previousSort;
41
+ subscriptions = [];
42
+ allDataValue;
43
+ // private calculatedFieldSettings;
44
+ isInit = true;
45
+ pivotSearchBox;
46
+ displayOption = {
47
+ view: "Both",
48
+ primary: "Chart",
49
+ };
50
+ chartSettings;
51
+ tooltipSettings = {
52
+ enable: false,
53
+ };
54
+ columnTexts = [];
55
+ configFields = [];
56
+ quarterFormat = [
57
+ { value: "03/2021", format: "MM/yyyy" },
58
+ { value: "03/21", format: "MM/dd" },
59
+ { value: "3/2021", format: "M/yyyy" },
60
+ { value: "3/21", format: "M/yy" },
61
+ { value: "March 2021", format: "MMMM yyyy" },
62
+ { value: "Mar, 2021", format: "MMM, yyyy" },
63
+ { value: "March, 2021", format: "MMMM, yyyy" },
64
+ { value: "2021", format: "yyyy" },
65
+ ];
66
+ zoomSettings = {
67
+ enable: false,
68
+ };
69
+ itemDataTypeSortArr = [
70
+ "Assets",
71
+ "Liabilities",
72
+ "Equity",
73
+ "P&L",
74
+ "Cashflow",
75
+ ];
76
+ formatDates = [];
77
+ customCalculatedFields = []; // 自定义计算列
78
+ allowedCalculatedFields = []; // 允许自定义算法的字段
79
+ zeroFormatData = {
80
+ emptyList: [],
81
+ hgList: [],
82
+ };
83
+ millionFields = [];
84
+ tempSubtotals = [];
85
+ orderByColumns; // Eg: "DueDate, Sequence"
86
+ isApplyIRR = false;
87
+ calcIRRData;
88
+ percentNumFields = [];
89
+ pageLoading;
90
+ observable = new Observable();
91
+ isloaded; // 是否已经初始化过
92
+ constructor(dashboardPorletsService, dashboardService, ref, pbf) {
93
+ this.dashboardPorletsService = dashboardPorletsService;
94
+ this.dashboardService = dashboardService;
95
+ this.ref = ref;
96
+ this.pbf = pbf;
97
+ }
98
+ ngOnInit() {
99
+ this.chartSettings = {
100
+ legendSettings: {
101
+ visible: false,
102
+ },
103
+ enableMultipleAxis: false,
104
+ showMultiLevelLabels: false,
105
+ chartSeries: {
106
+ type: "Column",
107
+ columnSpacing: 0.1,
108
+ columnWidth: 0.9,
109
+ },
110
+ multipleAxisMode: "Stacked",
111
+ primaryXAxis: {
112
+ title: " ",
113
+ labelFormat: "N2",
114
+ majorGridLines: { width: 0 },
115
+ minorGridLines: {
116
+ width: 0,
117
+ color: "transparent",
118
+ visible: false,
119
+ },
120
+ minorTickLines: { visible: false },
121
+ lineStyle: {
122
+ width: 0,
123
+ },
124
+ },
125
+ chartArea: {
126
+ opacity: 0,
127
+ border: {
128
+ width: 0,
129
+ },
130
+ },
131
+ palettes: [
132
+ "#594bb9",
133
+ "#f1af32",
134
+ "#4688ed",
135
+ "#e0563e",
136
+ "#803a63",
137
+ "#6dd8b5",
138
+ "#e87225",
139
+ "#c5df42",
140
+ "#c6437d",
141
+ ],
142
+ primaryYAxis: {
143
+ // Y轴标题设置为空
144
+ title: " ",
145
+ labelFormat: "N2",
146
+ },
147
+ zoomSettings: {
148
+ enableMouseWheelZooming: false,
149
+ enablePinchZooming: false,
150
+ enableSelectionZooming: false,
151
+ enableDeferredZooming: false,
152
+ toolbarItems: [],
153
+ enableScrollbar: false,
154
+ enableZooming: false,
155
+ },
156
+ title: " ",
157
+ };
158
+ this.getInfo();
159
+ this.getData();
160
+ }
161
+ ngAfterViewInit() {
162
+ this.subscriptions.push(this.dashboardService.getStartRefresh().subscribe((dashboardId) => {
163
+ if (this.dashboard.id === dashboardId) {
164
+ this.pageLoading = true;
165
+ this.ref.markForCheck();
166
+ }
167
+ }));
168
+ this.subscriptions.push(this.dashboardService.getRefreshGadget().subscribe((e) => {
169
+ if (!e) {
170
+ return;
171
+ }
172
+ const id = e["newId"];
173
+ const config = e["config"];
174
+ if (id === this.portlet.newId || id === this.portlet.id) {
175
+ this.pageLoading = false;
176
+ this.getData(config);
177
+ }
178
+ }));
179
+ this.subscriptions.push(this.dashboardService.getchangePivot().subscribe((updated) => {
180
+ if (updated === this.portlet.newId) {
181
+ this.getData();
182
+ }
183
+ }));
184
+ this.subscriptions.push(this.dashboardService.getUpdated().subscribe((newId) => {
185
+ if (newId === this.portlet.newId || newId === this.portlet.id) {
186
+ this.getData();
187
+ if (this.pivotObj)
188
+ this.pivotObj.refreshData();
189
+ }
190
+ }));
191
+ this.subscriptions.push(this.dashboardService.getTableFormat().subscribe((updated) => {
192
+ if (updated === this.portlet.newId) {
193
+ this.getData();
194
+ if (this.pivotObj)
195
+ this.pivotObj.refreshData();
196
+ }
197
+ }));
198
+ this.subscriptions.push(this.dashboardService
199
+ .clearFieldListObservable()
200
+ .subscribe((updated) => {
201
+ if (updated === this.portlet.newId) {
202
+ this.pivotObj.dataSourceSettings.dataSource = [];
203
+ if (this.pivotObj)
204
+ this.pivotObj.refreshData();
205
+ this.ref.markForCheck();
206
+ this.ref.detectChanges();
207
+ }
208
+ }));
209
+ this.subscriptions.push(this.dashboardService
210
+ .getPvtableDisplayOptionChartChange()
211
+ .subscribe((data) => {
212
+ if (!data ||
213
+ !this.portlet ||
214
+ this.portlet.newId !== data.newId) {
215
+ return;
216
+ }
217
+ if (this.chartSettings["pointRender"]) {
218
+ this.chartSettings["pointRender"].complete();
219
+ }
220
+ this.initChartSetting(data.chartType);
221
+ this.setConfigToPorlet();
222
+ if (this.pivotObj)
223
+ this.pivotObj.refreshData();
224
+ }));
225
+ this.subscriptions.push(this.dashboardService
226
+ .getEnableMultipleAxisChange()
227
+ .subscribe((data) => {
228
+ if (!data ||
229
+ !this.portlet ||
230
+ this.portlet.newId !== data.newId) {
231
+ return;
232
+ }
233
+ if (this.chartSettings["pointRender"]) {
234
+ this.chartSettings["pointRender"].complete();
235
+ }
236
+ this.chartSettings.enableMultipleAxis =
237
+ data.enableMultipleAxis;
238
+ this.chartSettings.multipleAxisMode = data.multipleAxisMode;
239
+ this.chartSettings.legendSettings = {
240
+ visible: data.visible,
241
+ };
242
+ this.chartSettings = Object.assign({}, this.chartSettings);
243
+ if (this.pivotObj)
244
+ setTimeout(() => this.pivotObj.refreshData());
245
+ this.setConfigToPorlet();
246
+ }));
247
+ this.subscriptions.push(this.dashboardService.getChartTypeChange().subscribe((data) => {
248
+ if (!data ||
249
+ !this.portlet ||
250
+ this.portlet.newId !== data.newId) {
251
+ return;
252
+ }
253
+ this.chartSettings.chartSeries.type =
254
+ data.chartSettings.chartSeries.type === "Stacked Column"
255
+ ? "StackingColumn"
256
+ : data.chartSettings.chartSeries.type;
257
+ this.chartSettings = Object.assign({}, this.chartSettings);
258
+ if (this.pivotObj)
259
+ this.pivotObj.refreshData();
260
+ this.setConfigToPorlet();
261
+ }));
262
+ this.subscriptions.push(this.dashboardService.getTheme().subscribe((data) => {
263
+ if (!data ||
264
+ !this.portlet ||
265
+ this.portlet.newId !== data.newId) {
266
+ return;
267
+ }
268
+ this.chartSettings.palettes = [...data.theme];
269
+ this.chartSettings = Object.assign({}, this.chartSettings);
270
+ if (this.pivotObj)
271
+ this.pivotObj.layoutRefresh();
272
+ this.setConfigToPorlet();
273
+ }));
274
+ }
275
+ ngOnDestroy() {
276
+ this.subscriptions.forEach((sub) => sub.unsubscribe());
277
+ }
278
+ // 找到数组中出现最多频次的元素
279
+ findMostFrequent(arr) {
280
+ let maxCount = 0;
281
+ let mostFrequentNum = null;
282
+ // 使用一个对象来计数
283
+ const countMap = {};
284
+ arr.forEach((num) => {
285
+ countMap[num] = (countMap[num] || 0) + 1;
286
+ // 检查是否是最多的
287
+ if (countMap[num] > maxCount) {
288
+ maxCount = countMap[num];
289
+ mostFrequentNum = num;
290
+ }
291
+ });
292
+ return mostFrequentNum;
293
+ }
294
+ loaded(args) {
295
+ // 找到所有y轴标签
296
+ const elements = document.querySelectorAll(`[id^="${this.pivotObj.element.id}_chart2_AxisLabel"],
297
+ [id^="${this.pivotObj.element.id}_chart3_AxisLabel"]`);
298
+ let isErrorAccuracy = false;
299
+ let xPosition = [];
300
+ elements.forEach((element) => {
301
+ // 是否有精度问题
302
+ if (Boolean(Number(element.innerHTML)) &&
303
+ element.innerHTML.length > 15) {
304
+ isErrorAccuracy = true;
305
+ }
306
+ // 记录一下y轴标签的x坐标
307
+ const currentX = parseFloat(element.getAttribute("x"));
308
+ xPosition.push(currentX);
309
+ if (element.innerHTML.endsWith("...")) {
310
+ let innerHTML = element.innerHTML.replace("...", "");
311
+ element.innerHTML = Number(innerHTML).toFixed(2);
312
+ element.setAttribute("x", currentX + innerHTML.length * 3 - 3 + ""); // 矫正长度
313
+ }
314
+ });
315
+ if (isErrorAccuracy) {
316
+ // 找到所有y轴标签中的平均x坐标
317
+ let x = mean(xPosition);
318
+ elements.forEach((element) => {
319
+ // 手动精度修正
320
+ element.innerHTML = Number(element.innerHTML).toFixed(2);
321
+ if (element.innerHTML === "-0.00") {
322
+ element.innerHTML = Number(0).toFixed(2);
323
+ }
324
+ // 手动设置 x坐标
325
+ element.setAttribute("x", x.toString());
326
+ });
327
+ }
328
+ }
329
+ setConfigToPorlet() {
330
+ const config = JSON.parse(this.portlet.config);
331
+ if (!config) {
332
+ return;
333
+ }
334
+ config.pvtableChartSetting = {
335
+ displayOption: this.displayOption,
336
+ chartSettings: this.chartSettings,
337
+ };
338
+ this.chartSettings["pointRender"] = null;
339
+ this.config = { ...config };
340
+ this.updatePorletConfig.emit({
341
+ newId: this.portlet.newId,
342
+ config,
343
+ });
344
+ }
345
+ chartSeriesCreated(e) { }
346
+ initChartSetting(type) {
347
+ const setting = this.config.pvtableChartSetting;
348
+ if (!setting) {
349
+ return;
350
+ }
351
+ setting.chartSettings.chartSeries.dataLabel = {
352
+ visible: true,
353
+ position: "Outside",
354
+ // Define the template for data label content
355
+ template: '<div style="color: Black"> ${(point.y).toLocaleString()}</div>',
356
+ };
357
+ this.chartSettings = {
358
+ ...setting.chartSettings,
359
+ primaryXAxis: {
360
+ title: " ",
361
+ labelFormat: "N2",
362
+ majorGridLines: { width: 0 },
363
+ minorGridLines: {
364
+ width: 0,
365
+ color: "transparent",
366
+ visible: false,
367
+ },
368
+ minorTickLines: { visible: false },
369
+ lineStyle: {
370
+ width: 0,
371
+ },
372
+ },
373
+ pointRender: this.observable.subscribe((args) => {
374
+ if (args && args.point && args.point.y) {
375
+ args.point.y = parseFloat(args.point.y.toFixed(2));
376
+ }
377
+ }),
378
+ chartArea: {
379
+ opacity: 0,
380
+ border: {
381
+ width: 0,
382
+ },
383
+ },
384
+ primaryYAxis: {
385
+ // Y轴标题设置为空
386
+ title: " ",
387
+ labelFormat: "N2",
388
+ },
389
+ loaded: this.isloaded
390
+ ? null
391
+ : this.observable.subscribe(this.loaded.bind(this)),
392
+ zoomSettings: {
393
+ enableMouseWheelZooming: false,
394
+ enablePinchZooming: false,
395
+ enableSelectionZooming: false,
396
+ enableDeferredZooming: false,
397
+ toolbarItems: [],
398
+ enableScrollbar: false,
399
+ enableZooming: false,
400
+ },
401
+ };
402
+ this.isloaded = true;
403
+ // @ts-ignore
404
+ if (!this.chartSettings.palettes) {
405
+ this.chartSettings.palettes = [
406
+ "#594bb9",
407
+ "#f1af32",
408
+ "#4688ed",
409
+ "#e0563e",
410
+ "#803a63",
411
+ "#6dd8b5",
412
+ "#e87225",
413
+ "#c5df42",
414
+ "#c6437d",
415
+ ];
416
+ }
417
+ this.chartSettings.chartSeries.columnSpacing = 0.1;
418
+ this.chartSettings.chartSeries.columnWidth = 0.9;
419
+ if (type) {
420
+ this.chartSettings.chartSeries = {
421
+ type,
422
+ columnSpacing: 0.1,
423
+ columnWidth: 0.9,
424
+ };
425
+ }
426
+ }
427
+ onMemberEditorOpen(args) {
428
+ // 你可以在这里根据需要修改args来自定义过滤窗口的行为
429
+ // 11247 专门为item data type而设置
430
+ if (args.fieldName === "AccountTypeCode") {
431
+ let res = new Array(5).fill(null);
432
+ const fieldMembers = [...args.fieldMembers];
433
+ for (let i = fieldMembers.length - 1; i >= 0; i--) {
434
+ let index = -1;
435
+ const item = this.itemDataTypeSortArr.find((name, ind) => {
436
+ if (fieldMembers[i].actualText === name) {
437
+ index = ind;
438
+ }
439
+ return fieldMembers[i].actualText === name;
440
+ });
441
+ if (!item) {
442
+ continue;
443
+ }
444
+ const fillItem = fieldMembers.splice(i, 1);
445
+ res[index] = fillItem[0];
446
+ }
447
+ res = res.filter((item) => item) || [];
448
+ args.fieldMembers = [...res, ...fieldMembers];
449
+ setTimeout(() => {
450
+ const ele = document.querySelector(".e-member-editor-dialog");
451
+ if (ele) {
452
+ ele.querySelector(".e-filter-sort").setAttribute("style", "display: none");
453
+ }
454
+ });
455
+ }
456
+ }
457
+ beforeExport(exportData) {
458
+ if (exportData) {
459
+ const keyMap = {};
460
+ this.dataSourceSettings.formatSettings.forEach((data) => {
461
+ if (data.format === "#,###,,.0;(#,###,,.0)" ||
462
+ data.format === "#,###,,;(#,###,,)" ||
463
+ data.format === "#,###,,.00;(#,###,,.00)") {
464
+ keyMap[data.name] = true;
465
+ }
466
+ });
467
+ if (exportData.dataCollections &&
468
+ exportData.dataCollections.length) {
469
+ exportData.dataCollections[0].forEach((row) => {
470
+ row.forEach((cell) => {
471
+ if (keyMap[cell.actualText]) {
472
+ cell.value = cell.actualValue;
473
+ }
474
+ });
475
+ });
476
+ }
477
+ }
478
+ }
479
+ async getData(config) {
480
+ this.pageLoading = false;
481
+ let columns = [];
482
+ let values = [];
483
+ let formatSettings = [];
484
+ let rows = [];
485
+ let fieldMapping = [];
486
+ // 清空grandTotals和subTotals
487
+ this.grandTotals = {};
488
+ this.subTotals = {};
489
+ this.config = config
490
+ ? JSON.parse(config)
491
+ : JSON.parse(this.portlet.config);
492
+ let type = this.config &&
493
+ this.config.pvtableChartSetting &&
494
+ this.config.pvtableChartSetting.chartSettings
495
+ ? this.config.pvtableChartSetting.chartSettings.chartSeries.type
496
+ : null;
497
+ if (type && type === "Stacked Column") {
498
+ type = "StackingColumn";
499
+ }
500
+ this.initChartSetting(type);
501
+ if (this.config.fields) {
502
+ this.configFields = JSON.parse(JSON.stringify(this.config.fields));
503
+ }
504
+ this.Pivot_Data = this.dashboardPorletsService.getResultByDataTable(this.portlet, false, false, this.dashboard.id);
505
+ this.orderByColumns = this.dashboardPorletsService.getOrderByColumnsNew(this.portlet.figureCode, this.dashboard);
506
+ this.Pivot_Data = DataUtil.parse.parseJson(this.Pivot_Data);
507
+ if (this.Pivot_Data && this.Pivot_Data.length > 0) {
508
+ this.getexcludeFields(this.configFields, this.Pivot_Data[0]);
509
+ if (!this.allowedCalculatedFields.length) {
510
+ this.allowedCalculatedFields = Object.keys(this.Pivot_Data[0]);
511
+ }
512
+ for (let item of this.configFields) {
513
+ fieldMapping.push({
514
+ name: item.colName,
515
+ caption: item.addtionName
516
+ ? `${item.langValue} ${item.addtionName}`
517
+ : item.langValue,
518
+ dataType: item.dataType,
519
+ });
520
+ }
521
+ }
522
+ if (this.configFields) {
523
+ this.percentNumFields = [];
524
+ this.formatDates = [];
525
+ this.zeroFormatData.hgList = [];
526
+ this.zeroFormatData.emptyList = [];
527
+ this.millionFields = [];
528
+ this.configFields.map((el) => {
529
+ // SMP2-2486 & percentNum的format问题
530
+ if (el.dataType == "percentNum") {
531
+ this.percentNumFields.push(el.colName);
532
+ }
533
+ if (el.format &&
534
+ el.format.length &&
535
+ el.format[0].formatChecked &&
536
+ [2, 5, 8, 11, 14, 17].includes(el.format[0].selectedFormat))
537
+ this.zeroFormatData.hgList.push(el.colName);
538
+ if (el.format &&
539
+ el.format.length &&
540
+ el.format[0].formatChecked &&
541
+ [3, 6, 9, 12, 15, 18].includes(el.format[0].selectedFormat))
542
+ this.zeroFormatData.emptyList.push(el.colName);
543
+ if (el.format &&
544
+ el.format.length &&
545
+ el.format[0].formatChecked &&
546
+ [10, 11, 12, 13, 14, 15, 16, 17, 18].includes(el.format[0].selectedFormat))
547
+ this.millionFields.push(el.colName);
548
+ if (el.dataType === "number" &&
549
+ (!el.format ||
550
+ (el.format &&
551
+ el.format.length &&
552
+ !el.format[0].formatChecked))) {
553
+ const formatData = {
554
+ name: el.colName,
555
+ //SMP2-3026 and SMP2-3059
556
+ format: el.colName !== "PortInvStk" &&
557
+ el.colName !== "PortFdInvStk"
558
+ ? this.dashboardPorletsService.formatNumber(el.dp)
559
+ : "##0.#######0",
560
+ useGrouping: true,
561
+ };
562
+ formatSettings.push(formatData);
563
+ }
564
+ if ((el.dataType === "percent" ||
565
+ el.dataType === "percentNum") &&
566
+ (!el.format ||
567
+ (el.format &&
568
+ el.format.length &&
569
+ !el.format[0].formatChecked))) {
570
+ const formatData = {
571
+ name: el.colName,
572
+ format: this.dashboardPorletsService.formatPercent(el.dp),
573
+ };
574
+ formatSettings.push(formatData);
575
+ }
576
+ if (el.dataType === "multiple" &&
577
+ (!el.format ||
578
+ (el.format &&
579
+ el.format.length &&
580
+ !el.format[0].formatChecked))) {
581
+ const formatData = {
582
+ name: el.colName,
583
+ format: this.dashboardPorletsService.formatMultiple(el.dp),
584
+ };
585
+ formatSettings.push(formatData);
586
+ }
587
+ if (el.dataType === "datetime" || el.dataType === "date") {
588
+ let format = "";
589
+ if (el.format &&
590
+ el.format.length &&
591
+ el.format[0].formatChecked) {
592
+ if (el.format[0].dateType == "Quarter") {
593
+ let format_ = el.format[0].selectedFormatDisplay;
594
+ let formatInfo = this.quarterFormat.filter((qur) => qur.value == format_);
595
+ if (formatInfo.length) {
596
+ format = formatInfo[0].format;
597
+ }
598
+ else {
599
+ const formatData = {
600
+ name: el.colName,
601
+ format: format_,
602
+ type: "date",
603
+ };
604
+ this.formatDates.push(formatData);
605
+ }
606
+ }
607
+ else if (el.format[0].dateType == "Date") {
608
+ let fromIdx = el.format[0].selectedFormatDisplay.indexOf("(");
609
+ let toIdx = el.format[0].selectedFormatDisplay.indexOf(")");
610
+ let format_ = el.format[0].selectedFormatDisplay.slice(fromIdx + 1, toIdx);
611
+ switch (format_) {
612
+ case "DD/MM/YYYY":
613
+ format = "dd/MM/yyyy";
614
+ break;
615
+ case "DD/MM/YY":
616
+ format = "dd/MM/yy";
617
+ break;
618
+ case "MM/DD/YYYY":
619
+ format = "MM/dd/yyyy";
620
+ break;
621
+ case "MM/DD/YY":
622
+ format = "MM/dd/yy";
623
+ break;
624
+ case "YYYY-MM-DD":
625
+ format = "yyyy-MM-dd";
626
+ break;
627
+ case "YY-MM-DD":
628
+ format = "yy-MM-dd";
629
+ break;
630
+ case "DD-MM-YYYY":
631
+ format = "dd-MM-yyyy";
632
+ break;
633
+ case "DD-MM-YY":
634
+ format = "dd-MM-yy";
635
+ break;
636
+ case "MM-DD-YYYY":
637
+ format = "MM-dd-yyyy";
638
+ break;
639
+ case "MM-DD-YY":
640
+ format = "MM-dd-yy";
641
+ break;
642
+ case "MMM DD, YYYY":
643
+ format = "MMM dd, yyyy";
644
+ break;
645
+ case "DD-MMM-YYYY":
646
+ format = "dd-MMM-yyyy";
647
+ break;
648
+ default:
649
+ break;
650
+ }
651
+ }
652
+ }
653
+ if (!format) {
654
+ const formatData = {
655
+ name: el.colName,
656
+ format: this.datePipeFormat,
657
+ type: "date",
658
+ };
659
+ formatSettings.push(formatData);
660
+ }
661
+ else {
662
+ const formatData = {
663
+ name: el.colName,
664
+ format: format,
665
+ type: "date",
666
+ };
667
+ formatSettings.push(formatData);
668
+ }
669
+ }
670
+ });
671
+ }
672
+ //calculatedFieldSettings format push to formatSettings
673
+ if (this.config.calculatedFieldSettings &&
674
+ this.config.calculatedFieldSettings.length > 0) {
675
+ this.config.calculatedFieldSettings.map((el) => {
676
+ if (el.formatString !== "") {
677
+ formatSettings.push({
678
+ name: el.name,
679
+ format: el.formatString,
680
+ });
681
+ }
682
+ });
683
+ }
684
+ let series = this.config.yaxis.series;
685
+ if (series) {
686
+ for (let item of series) {
687
+ const value = {
688
+ name: item.colName,
689
+ caption: item.title,
690
+ type: item.calMethod,
691
+ };
692
+ values.push(value);
693
+ }
694
+ }
695
+ let groups = this.config.xaxis.groups;
696
+ if (groups) {
697
+ for (let gitem of groups) {
698
+ const field = this.configFields.filter((el) => el.colName === gitem.name);
699
+ if (field.length > 0) {
700
+ gitem.showSubTotals = field[0].showSubTotals;
701
+ }
702
+ rows.push(gitem);
703
+ }
704
+ }
705
+ if (this.config.columnGroup && this.config.columnGroup.length) {
706
+ for (let item of this.config.columnGroup) {
707
+ const field = this.configFields.filter((el) => el.colName === item.name);
708
+ if (field.length > 0) {
709
+ item.showSubTotals = field[0].showSubTotals;
710
+ }
711
+ columns.push(item);
712
+ }
713
+ }
714
+ let conditionalFormatSettings = [];
715
+ this.configFields.forEach((field) => {
716
+ if (field.format && field.format.length) {
717
+ if (field.format[0].fontSettingChecked) {
718
+ let conditionalFormatObj = {
719
+ applyGrandTotals: true,
720
+ measure: "",
721
+ value1: null,
722
+ value2: null,
723
+ conditions: "",
724
+ style: {
725
+ backgroundColor: "",
726
+ color: "",
727
+ fontFamily: "",
728
+ fontSize: "",
729
+ },
730
+ };
731
+ let negaConditionalFormatObj = {
732
+ applyGrandTotals: true,
733
+ measure: "",
734
+ value1: null,
735
+ value2: null,
736
+ conditions: "",
737
+ style: {
738
+ backgroundColor: "",
739
+ color: "",
740
+ fontFamily: "",
741
+ fontSize: "",
742
+ },
743
+ };
744
+ // font setting start
745
+ negaConditionalFormatObj.measure =
746
+ field.format[0].selectedField;
747
+ conditionalFormatObj.measure =
748
+ field.format[0].selectedField;
749
+ if (field.format[0].formatChecked &&
750
+ field.format[0].compareSelect) {
751
+ this.setCompareConditional(negaConditionalFormatObj, conditionalFormatObj, field.format[0]);
752
+ }
753
+ else {
754
+ delete conditionalFormatObj.value2;
755
+ delete negaConditionalFormatObj.value2;
756
+ negaConditionalFormatObj.value1 = 0;
757
+ negaConditionalFormatObj.conditions = "LessThan";
758
+ conditionalFormatObj.value1 = 0;
759
+ conditionalFormatObj.conditions = "GreaterThan";
760
+ this.setFontSettingConditional(negaConditionalFormatObj, field.format[0], -1);
761
+ this.setFontSettingConditional(conditionalFormatObj, field.format[0], 1);
762
+ }
763
+ conditionalFormatSettings.push(negaConditionalFormatObj);
764
+ conditionalFormatSettings.unshift(conditionalFormatObj);
765
+ // font setting end
766
+ }
767
+ let formatSettingsObj = {
768
+ name: "",
769
+ format: "",
770
+ };
771
+ if (field.format[0].formatChecked) {
772
+ formatSettingsObj.name = field.format[0].selectedField;
773
+ formatSettingsObj.format =
774
+ this.dashboardPorletsService.pivotTableformatNumber(field.format[0].selectedFormat);
775
+ switch (field.format[0].dataType) {
776
+ case "number":
777
+ formatSettingsObj.format =
778
+ this.dashboardPorletsService.pivotTableformatNumber(field.format[0].selectedFormat);
779
+ break;
780
+ case "integer":
781
+ formatSettingsObj.format =
782
+ this.dashboardPorletsService.pivotTableformatInteger(field.format[0].selectedFormat);
783
+ break;
784
+ case "percentNum":
785
+ case "percent":
786
+ formatSettingsObj.format =
787
+ this.dashboardPorletsService.pivotTableformatPercent(field.format[0].selectedFormat);
788
+ break;
789
+ case "multiple":
790
+ formatSettingsObj.format =
791
+ this.dashboardPorletsService.pivotTableformatMultiple(field.format[0].selectedFormat);
792
+ break;
793
+ case "date":
794
+ case "datetime":
795
+ let format = "";
796
+ if (field.format && field.format.length) {
797
+ if (field.format[0].dateType == "Quarter") {
798
+ format =
799
+ field.format[0].selectedFormatDisplay;
800
+ }
801
+ else if (field.format[0].dateType == "Date") {
802
+ let fromIdx = field.format[0].selectedFormatDisplay.indexOf("(");
803
+ let toIdx = field.format[0].selectedFormatDisplay.indexOf(")");
804
+ format =
805
+ field.format[0].selectedFormatDisplay.slice(fromIdx + 1, toIdx);
806
+ }
807
+ }
808
+ if (format) {
809
+ formatSettingsObj = {
810
+ name: field.colName,
811
+ format: "",
812
+ };
813
+ // field.dataType = "string";
814
+ }
815
+ else {
816
+ formatSettingsObj.format = this.datePipeFormat;
817
+ formatSettingsObj["type"] = "date";
818
+ }
819
+ break;
820
+ default:
821
+ break;
822
+ }
823
+ }
824
+ if (field.format[0].dataType !== "string" &&
825
+ formatSettingsObj.format) {
826
+ formatSettings.push(formatSettingsObj);
827
+ }
828
+ }
829
+ });
830
+ this.customCalculatedFields = this.config.customCalculatedFields
831
+ ? this.config.customCalculatedFields
832
+ : [];
833
+ // SMP2-4582 AGIC - Dashboard item sequence
834
+ let isExistSeq = false;
835
+ let sortSettings = this.config.sortSettings || [];
836
+ if (this.Pivot_Data &&
837
+ this.Pivot_Data[0] &&
838
+ this.Pivot_Data[0].Seq !== null) {
839
+ // 取消Name的默认排序,根据Seq来排序
840
+ sortSettings.push({ name: "Name", order: "None" });
841
+ isExistSeq = true;
842
+ }
843
+ let filterSettings = this.dashboardPorletsService.checkFilterSettings(this.config, this.configFields, this.Pivot_Data);
844
+ let nameFilter = filterSettings.find((x) => x.name === "Name");
845
+ // 存在 Name的filter时,会按照默认排序,需要对Name进行Seq排序处理
846
+ if (isExistSeq && nameFilter && rows.some((x) => x.name === "Name")) {
847
+ let items = nameFilter.items; // 拿到当前排序,默认A-Z
848
+ let seqArr = [];
849
+ items.forEach((name) => {
850
+ let obj = this.Pivot_Data.find((x) => x.Name === name);
851
+ let item = {
852
+ name: name,
853
+ seq: obj.Seq,
854
+ };
855
+ seqArr.push(item);
856
+ });
857
+ seqArr.sort((a, b) => a.seq - b.seq);
858
+ nameFilter.items = seqArr.map((x) => x.name);
859
+ }
860
+ let hasItemDataType = false;
861
+ if (this.Pivot_Data) {
862
+ this.Pivot_Data.map((data) => {
863
+ if (data["AccountTypeCode"]) {
864
+ hasItemDataType = true;
865
+ }
866
+ rows.forEach((row) => {
867
+ if (data[row.name] === "") {
868
+ data[row.name] = "null";
869
+ }
870
+ });
871
+ });
872
+ }
873
+ if (hasItemDataType) {
874
+ sortSettings.push({
875
+ name: "AccountTypeCode",
876
+ order: "Ascending",
877
+ membersOrder: [...this.itemDataTypeSortArr],
878
+ });
879
+ }
880
+ this.dataSourceSettings = {
881
+ dataSource: this.Pivot_Data,
882
+ rows: rows,
883
+ columns: columns,
884
+ values: values,
885
+ filters: this.config.filters,
886
+ filterSettings: filterSettings,
887
+ excludeFields: this.excludeFields,
888
+ formatSettings: formatSettings,
889
+ conditionalFormatSettings: conditionalFormatSettings,
890
+ expandAll: true,
891
+ enableSorting: true,
892
+ fieldMapping: fieldMapping,
893
+ calculatedFieldSettings: this.config.calculatedFieldSettings,
894
+ sortSettings: sortSettings,
895
+ valueSortSettings: this.config.valueSortSettings,
896
+ showGrandTotals: this.config.showGrandTotals,
897
+ showRowGrandTotals: this.config.showRowGrandTotals,
898
+ showColumnGrandTotals: this.config.showColumnGrandTotals,
899
+ showSubTotals: this.config.showSubTotals,
900
+ showRowSubTotals: this.config.showRowSubTotals,
901
+ showColumnSubTotals: this.config.showColumnSubTotals,
902
+ };
903
+ if (this.pivotObj)
904
+ this.pivotObj.refreshData();
905
+ this.ref.markForCheck();
906
+ }
907
+ afterPopulate(args) {
908
+ this.tempSubtotals = [];
909
+ this.grandTotals = {};
910
+ this.subTotals = {};
911
+ let tempshowArray = [];
912
+ this.config.yaxis.series.forEach((item) => {
913
+ if (item.hasOwnProperty("showSubTotals") &&
914
+ item.hasOwnProperty("showGrandTotals")) {
915
+ tempshowArray.push({
916
+ name: item.colName,
917
+ calMethod: item.calMethod,
918
+ showSubTotals: item.showSubTotals,
919
+ showGrandTotals: item.showGrandTotals,
920
+ });
921
+ }
922
+ else {
923
+ if (item.hasOwnProperty("showGrandTotals")) {
924
+ tempshowArray.push({
925
+ name: item.colName,
926
+ calMethod: item.calMethod,
927
+ showGrandTotals: item.showGrandTotals,
928
+ });
929
+ }
930
+ if (item.hasOwnProperty("showSubTotals")) {
931
+ tempshowArray.push({
932
+ name: item.colName,
933
+ calMethod: item.calMethod,
934
+ showSubTotals: item.showSubTotals,
935
+ });
936
+ }
937
+ }
938
+ });
939
+ if (this.fieldlistObj && this.pivotObj) {
940
+ this.config.columnGroup = [];
941
+ this.config.xaxis.groups = [];
942
+ this.config.yaxis.series = [];
943
+ this.config.filters = [];
944
+ this.config.filterSettings = [];
945
+ this.config.calculatedFieldSettings = [];
946
+ let groupSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "groupSettings");
947
+ let columns = this.getDataSourceSettingsProp(this.fieldlistObj, "columns");
948
+ let rows = this.getDataSourceSettingsProp(this.fieldlistObj, "rows");
949
+ let filters = this.getDataSourceSettingsProp(this.fieldlistObj, "filters");
950
+ let filterSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "filterSettings");
951
+ let values = this.getDataSourceSettingsProp(this.fieldlistObj, "values");
952
+ let sortSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "sortSettings");
953
+ let calculatedFieldSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "calculatedFieldSettings");
954
+ if (groupSettings.length === 0) {
955
+ for (let column of columns) {
956
+ this.config.columnGroup.push({
957
+ name: column.name,
958
+ caption: column.caption,
959
+ });
960
+ }
961
+ }
962
+ else {
963
+ //If there is a group, first filter the columns of the group field, and then only save the last one
964
+ for (let column of columns) {
965
+ if (!startsWith(column.name, groupSettings[0].name + "_")) {
966
+ this.config.columnGroup.push({
967
+ name: column.name,
968
+ caption: column.name === groupSettings[0].name
969
+ ? ""
970
+ : column.caption,
971
+ });
972
+ }
973
+ }
974
+ }
975
+ for (let row of rows) {
976
+ this.config.xaxis.groups.push({
977
+ name: row.name,
978
+ caption: row.caption,
979
+ });
980
+ }
981
+ for (let filter of filters) {
982
+ this.config.filters.push({
983
+ name: filter.name,
984
+ caption: filter.caption,
985
+ });
986
+ }
987
+ if (this.filterSettings && this.filterSettings.length > 0) {
988
+ args.dataSourceSettings.filterSettings = this.filterSettings;
989
+ this.config.filterSettings = this.filterSettings;
990
+ delete this.filterSettings;
991
+ }
992
+ else {
993
+ this.config.filterSettings = filterSettings;
994
+ }
995
+ for (let value of values) {
996
+ let seriesData;
997
+ let tempShowObj;
998
+ let filterTempshowArray = [];
999
+ if (tempshowArray.length) {
1000
+ filterTempshowArray = tempshowArray.filter((item) => item.name === value.name &&
1001
+ item.calMethod === value.type);
1002
+ if (filterTempshowArray.length) {
1003
+ tempShowObj = filterTempshowArray[0];
1004
+ if (tempShowObj.hasOwnProperty("showSubTotals") &&
1005
+ tempShowObj.hasOwnProperty("showGrandTotals")) {
1006
+ seriesData = {
1007
+ colName: value.name,
1008
+ calMethod: value.type,
1009
+ title: value.caption,
1010
+ showSubTotals: tempShowObj.showSubTotals,
1011
+ showGrandTotals: tempShowObj.showGrandTotals,
1012
+ };
1013
+ }
1014
+ else {
1015
+ if (tempShowObj.hasOwnProperty("showGrandTotals")) {
1016
+ seriesData = {
1017
+ colName: value.name,
1018
+ calMethod: value.type,
1019
+ title: value.caption,
1020
+ showGrandTotals: tempShowObj.showGrandTotals,
1021
+ };
1022
+ }
1023
+ if (tempShowObj.hasOwnProperty("showSubTotals")) {
1024
+ seriesData = {
1025
+ colName: value.name,
1026
+ calMethod: value.type,
1027
+ title: value.caption,
1028
+ showSubTotals: tempShowObj.showSubTotals,
1029
+ };
1030
+ }
1031
+ }
1032
+ }
1033
+ }
1034
+ if (!seriesData) {
1035
+ seriesData = {
1036
+ colName: value.name,
1037
+ title: value.caption,
1038
+ calMethod: value.type,
1039
+ };
1040
+ }
1041
+ this.config.yaxis.series.push(seriesData);
1042
+ }
1043
+ for (let calculate of calculatedFieldSettings) {
1044
+ const calculateData = {
1045
+ name: calculate.name,
1046
+ formula: calculate.formula,
1047
+ formatString: calculate.formatString === ""
1048
+ ? "N2"
1049
+ : calculate.formatString,
1050
+ };
1051
+ this.config.calculatedFieldSettings.push(calculateData);
1052
+ }
1053
+ this.config.customCalculatedFields = this.customCalculatedFields;
1054
+ this.config.sortSettings = sortSettings;
1055
+ this.config.groupSettings = groupSettings;
1056
+ this.fieldlistObj.updateView(this.pivotObj);
1057
+ }
1058
+ this.portlet.config = JSON.stringify(this.config);
1059
+ //remove the sort
1060
+ if (this.pivotObj.dataSourceSettings.sortSettings.length > 0) {
1061
+ this.previousSort = this.fieldlistObj.lastSortInfo;
1062
+ this.fieldlistObj.lastSortInfo = [];
1063
+ }
1064
+ }
1065
+ afterEnginePopulate(args) {
1066
+ if (!Browser.isDevice && this.fieldlistObj && this.pivotObj) {
1067
+ this.config.groupSettings = this.getDataSourceSettingsProp(this.pivotObj, "groupSettings");
1068
+ // this.portlet.config = JSON.stringify(this.config);
1069
+ if (this.fieldlistObj)
1070
+ this.fieldlistObj.update(this.pivotObj);
1071
+ }
1072
+ if (this.Pivot_Data && this.Pivot_Data.length) {
1073
+ setTimeout(() => {
1074
+ this.enginePopulated(args);
1075
+ }, 1500);
1076
+ }
1077
+ }
1078
+ getDataSourceSettingsProp(obj, key) {
1079
+ let prop = null;
1080
+ if (obj && obj.dataSourceSettings) {
1081
+ prop = obj.dataSourceSettings[key];
1082
+ if (Object.prototype.toString.call(prop) === "[object Array]" &&
1083
+ prop.length > 0) {
1084
+ prop = prop.map((item) => item.properties || item);
1085
+ }
1086
+ }
1087
+ return prop;
1088
+ }
1089
+ enginePopulating(args) {
1090
+ this.grandTotals = {};
1091
+ this.subTotals = {};
1092
+ this.allDataValue = [];
1093
+ if (args.dataSourceSettings.sortSettings.length) {
1094
+ for (let i = 0; i < args.dataSourceSettings.sortSettings.length; i++) {
1095
+ if (this.fieldlistObj.lastSortInfo &&
1096
+ this.fieldlistObj.lastSortInfo.name ===
1097
+ args.dataSourceSettings.sortSettings[i].name &&
1098
+ this.fieldlistObj.lastSortInfo.order === "Ascending" &&
1099
+ !(this.fieldlistObj.lastSortInfo.name ===
1100
+ this.previousSort.name &&
1101
+ this.previousSort.order === "None")) {
1102
+ args.dataSourceSettings.sortSettings[i].order = "None";
1103
+ }
1104
+ else if (this.previousSort &&
1105
+ this.fieldlistObj.lastSortInfo &&
1106
+ this.fieldlistObj.lastSortInfo.name ===
1107
+ this.previousSort.name &&
1108
+ this.previousSort.order === "Ascending") {
1109
+ args.dataSourceSettings.sortSettings[i].order = "Ascending";
1110
+ }
1111
+ }
1112
+ }
1113
+ }
1114
+ cellClick(args) {
1115
+ // 清除排序
1116
+ if (this.pivotObj.dataSourceSettings.valueSortSettings.sortOrder &&
1117
+ this.pivotObj.dataSourceSettings.valueSortSettings.headerText &&
1118
+ this.pivotObj.dataSourceSettings.valueSortSettings.sortOrder ===
1119
+ "Descending" &&
1120
+ args.data.valueSort &&
1121
+ this.pivotObj.dataSourceSettings.valueSortSettings.headerText ===
1122
+ args.data.valueSort.levelName) {
1123
+ this.pivotObj.setProperties({
1124
+ dataSourceSettings: {
1125
+ valueSortSettings: {
1126
+ sortOrder: "Descending",
1127
+ headerText: "",
1128
+ },
1129
+ },
1130
+ }, true);
1131
+ if (this.pivotObj)
1132
+ this.pivotObj.refreshData();
1133
+ this.config.valueSortSettings = {};
1134
+ this.portlet.config = JSON.stringify(this.config);
1135
+ }
1136
+ }
1137
+ dataBound(e) {
1138
+ if (this.isInit) {
1139
+ this.isInit = false;
1140
+ }
1141
+ this.grandTotals = {};
1142
+ this.subTotals = {};
1143
+ if (this.pivotObj.grid) {
1144
+ this.pivotObj.grid.resizeStop = this.resizeStop.bind(this);
1145
+ }
1146
+ if (this.fieldlistObj &&
1147
+ this.fieldlistObj.pivotButtonModule &&
1148
+ this.fieldlistObj.pivotButtonModule.menuOption) {
1149
+ this.fieldlistObj.pivotButtonModule.menuOption.stringAggregateTypes = [
1150
+ "Count",
1151
+ "DistinctCount",
1152
+ "First",
1153
+ "Last",
1154
+ ];
1155
+ }
1156
+ if (this.pivotObj.pivotButtonModule &&
1157
+ this.pivotObj.pivotButtonModule.menuOption) {
1158
+ this.pivotObj.pivotButtonModule.menuOption.stringAggregateTypes = [
1159
+ "Count",
1160
+ "DistinctCount",
1161
+ "First",
1162
+ "Last",
1163
+ ];
1164
+ }
1165
+ let allSummaryType = ALL_AGGREGATE_TYPES;
1166
+ this.pivotObj.getAllSummaryType = () => allSummaryType;
1167
+ if (this.fieldlistObj) {
1168
+ this.fieldlistObj.aggregateTypes = allSummaryType;
1169
+ this.fieldlistObj.getAllSummaryType = () => allSummaryType;
1170
+ }
1171
+ }
1172
+ calculatedCellSets(args, curFields) {
1173
+ let matchFields = curFields["matchFields"];
1174
+ let formula = curFields["formula"];
1175
+ let value = 0;
1176
+ let rows = this.pivotObj.dataSourceSettings.rows;
1177
+ let invalidTypes = ["string", "nvarchar", "date", "datetime"];
1178
+ let isInvalid = matchFields.some((f) => invalidTypes.includes(this.configFields.filter((el) => el.colName === f.matchWord)[0]["dataType"]));
1179
+ let currentrowCellType = args.rowCellType;
1180
+ if (isInvalid)
1181
+ return "-";
1182
+ if (args.rowCellType === "subTotal" ||
1183
+ args.rowCellType === "grandTotal") {
1184
+ let childHeaders = [];
1185
+ let sum = 0;
1186
+ let cloneCellSets = cloneDeep(args.cellSets);
1187
+ let groupNameArrays = [];
1188
+ for (let index = args.row.level; index < rows.length; index++) {
1189
+ groupNameArrays.push(rows[index].name);
1190
+ }
1191
+ for (let i = 0; i < cloneCellSets.length; i++) {
1192
+ let values = [];
1193
+ let header = groupNameArrays
1194
+ .map((name) => {
1195
+ values.push(cloneCellSets[i][name]);
1196
+ return cloneCellSets[i][name];
1197
+ })
1198
+ .join("-");
1199
+ if (!childHeaders.includes(header)) {
1200
+ childHeaders.push(header);
1201
+ let filterObj = {};
1202
+ groupNameArrays.map((name, i) => (filterObj[name] = values[i]));
1203
+ args.cellSets = _filter(cloneCellSets, filterObj);
1204
+ args.rowCellType = "value";
1205
+ sum += this.calculatedValues(args, matchFields, formula);
1206
+ }
1207
+ }
1208
+ args.rowCellType = currentrowCellType;
1209
+ // 暂存当前SubTotal, 用于收缩时读取
1210
+ let prefixHeader = this.getCalcHeader(args, formula);
1211
+ this.updateTempSubtotals(prefixHeader, sum);
1212
+ return sum;
1213
+ }
1214
+ else if (args.rowCellType === "value") {
1215
+ if (args.row.hasChild) {
1216
+ // collapse 读取SubTotal
1217
+ let header = this.getCalcHeader(args, formula);
1218
+ let index = this.tempSubtotals.findIndex((item) => item.rowName === header);
1219
+ if (index > -1) {
1220
+ value = this.tempSubtotals[index].rowValue;
1221
+ }
1222
+ }
1223
+ else {
1224
+ // expand
1225
+ value = this.calculatedValues(args, matchFields, formula);
1226
+ }
1227
+ }
1228
+ return value;
1229
+ }
1230
+ actionFailure(args) {
1231
+ if (args.actionName == "Drill down" || args.actionName == "Drill up") {
1232
+ // Triggers when the current UI action fails to achieve the desired result.
1233
+ }
1234
+ }
1235
+ getCalcHeader(args, formula) {
1236
+ let header = "";
1237
+ let rows = this.pivotObj.dataSourceSettings.rows;
1238
+ let groupNameArrays = [];
1239
+ for (let index = 0; index < args.row.level; index++) {
1240
+ groupNameArrays.push(rows[index].name);
1241
+ }
1242
+ header = groupNameArrays.length
1243
+ ? groupNameArrays
1244
+ .map((name) => {
1245
+ return args.cellSets[0][name];
1246
+ })
1247
+ .join("-") +
1248
+ "-" +
1249
+ args.row.actualText
1250
+ : args.row.actualText;
1251
+ if (formula)
1252
+ header += "___" + formula;
1253
+ return header;
1254
+ }
1255
+ updateTempSubtotals(rowName, rowValue) {
1256
+ let index = this.tempSubtotals.findIndex((item) => item.rowName === rowName);
1257
+ let temp = {};
1258
+ temp.rowName = rowName;
1259
+ temp.rowValue = rowValue;
1260
+ if (index > -1) {
1261
+ this.tempSubtotals.splice(index, 1, temp);
1262
+ }
1263
+ else {
1264
+ this.tempSubtotals.push(temp);
1265
+ }
1266
+ }
1267
+ calculatedValues(args, matchFields, formula) {
1268
+ if (matchFields.length) {
1269
+ let calculedMatchFields = matchFields.map((f) => {
1270
+ switch (f.matchMethod) {
1271
+ case "First":
1272
+ case "Last":
1273
+ f.replaceValue = this.calculatedFistLast(args, f.matchMethod, f.matchWord);
1274
+ break;
1275
+ case "Max":
1276
+ f.replaceValue = maxBy(args.cellSets, (o) => Number(o[f.matchWord]))[f.matchWord];
1277
+ break;
1278
+ case "Min":
1279
+ f.replaceValue = minBy(args.cellSets, (o) => Number(o[f.matchWord]))[f.matchWord];
1280
+ break;
1281
+ case "Sum":
1282
+ f.replaceValue = sumBy(args.cellSets, (o) => Number(o[f.matchWord]));
1283
+ // SMP2-4094 Unicorn - L3 Adjusted NAV value issues
1284
+ f.replaceValue =
1285
+ f.replaceValue && f.replaceValue.toFixed(10);
1286
+ break;
1287
+ case "Avg":
1288
+ f.replaceValue = meanBy(args.cellSets, (o) => Number(o[f.matchWord]));
1289
+ break;
1290
+ default:
1291
+ break;
1292
+ }
1293
+ return f;
1294
+ });
1295
+ let resultFormula = formula;
1296
+ if (calculedMatchFields.length) {
1297
+ for (let i = 0; i < calculedMatchFields.length; i++) {
1298
+ resultFormula = resultFormula.replace(calculedMatchFields[i].matchStr, "(" + calculedMatchFields[i].replaceValue + ")");
1299
+ }
1300
+ }
1301
+ try {
1302
+ let result = new Function("return " + resultFormula.replace(/[^-<>?:()\d/*+.]/g, ""))();
1303
+ if (isNaN(result) || !isFinite(result)) {
1304
+ return 0;
1305
+ }
1306
+ else {
1307
+ return result;
1308
+ }
1309
+ }
1310
+ catch (error) {
1311
+ return NaN;
1312
+ }
1313
+ }
1314
+ return 0;
1315
+ }
1316
+ getIrrHeader(level, ele, type) {
1317
+ if (type === "row") {
1318
+ let curRows = this.getDataSourceSettingsProp(this.fieldlistObj, "rows");
1319
+ let rowsArr = curRows.map((item) => item.name);
1320
+ let headerArr = [];
1321
+ let rowLevel = level;
1322
+ for (let index = 0; index <= rowLevel; index++) {
1323
+ headerArr.push(ele.Row[rowsArr[index]]);
1324
+ }
1325
+ return headerArr.join(".");
1326
+ }
1327
+ else if (type === "col") {
1328
+ let curCloumns = this.getDataSourceSettingsProp(this.fieldlistObj, "columns");
1329
+ let colsArr = curCloumns.map((item) => item.name);
1330
+ let headerArr = [];
1331
+ let colLevel = level;
1332
+ for (let index = 0; index <= colLevel; index++) {
1333
+ headerArr.push(ele.Col[colsArr[index]]);
1334
+ }
1335
+ return headerArr.join(".");
1336
+ }
1337
+ }
1338
+ totalFormatted = {};
1339
+ aggregateCellInfo(args) {
1340
+ let asOfDate = this.pbf.time(this.dashboard.asOfDate);
1341
+ // if calculated field
1342
+ if (args.aggregateType == "CalculatedField") {
1343
+ for (let i = 0; i < this.customCalculatedFields.length; i++) {
1344
+ if (args.fieldName == this.customCalculatedFields[i].name) {
1345
+ args.value = this.calculatedCellSets(args, this.customCalculatedFields[i]);
1346
+ }
1347
+ }
1348
+ }
1349
+ if ([
1350
+ "CalculateIRR",
1351
+ "CalculateIRRBeforeCarried",
1352
+ "CalculateIRRIRRDate",
1353
+ "CalculateIRRMTD",
1354
+ "CalculateIRRQTD",
1355
+ "CalculateIRRYTD",
1356
+ ].includes(args.aggregateType)) {
1357
+ let valueField;
1358
+ let dateField;
1359
+ let startDate;
1360
+ let endDate;
1361
+ switch (args.aggregateType) {
1362
+ case "CalculateIRR":
1363
+ valueField = "IRRAdjValue";
1364
+ dateField = "IRRDate";
1365
+ break;
1366
+ case "CalculateIRRMTD":
1367
+ startDate = moment(asOfDate)
1368
+ .startOf("month")
1369
+ .format("YYYY-MM-DD");
1370
+ endDate = moment(asOfDate).format("YYYY-MM-DD");
1371
+ valueField = "IRRAdjValue";
1372
+ dateField = "IRRDate";
1373
+ break;
1374
+ case "CalculateIRRQTD":
1375
+ startDate = moment(asOfDate)
1376
+ .startOf("quarter")
1377
+ .format("YYYY-MM-DD");
1378
+ endDate = moment(asOfDate).format("YYYY-MM-DD");
1379
+ valueField = "IRRAdjValue";
1380
+ dateField = "IRRDate";
1381
+ break;
1382
+ case "CalculateIRRYTD":
1383
+ startDate = moment(asOfDate)
1384
+ .startOf("year")
1385
+ .format("YYYY-MM-DD");
1386
+ endDate = moment(asOfDate).format("YYYY-MM-DD");
1387
+ valueField = "IRRAdjValue";
1388
+ dateField = "IRRDate";
1389
+ break;
1390
+ case "CalculateIRRIRRDate":
1391
+ valueField = "IRRAdjValue";
1392
+ dateField = "CalculateIRRDate";
1393
+ break;
1394
+ case "CalculateIRRBeforeCarried":
1395
+ valueField = "IRRAdjValueBeforeCarry";
1396
+ dateField = "IRRDate";
1397
+ break;
1398
+ default:
1399
+ break;
1400
+ }
1401
+ let NAVAdj = 0;
1402
+ let values = [];
1403
+ let beforeStartNAVAdj = 0; // 存储上一个阶段的NAVAdj总和
1404
+ let beforeStartValues = []; // 存储上一个阶段的累计集合 (只是为了打印,没有实际用途)
1405
+ let field = this.configFields.filter((el) => el.colName ===
1406
+ this.dashboardPorletsService.getAggregateType(args.aggregateType));
1407
+ for (let i = 0; i < args.cellSets.length; i++) {
1408
+ const data = {
1409
+ amount: args.cellSets[i]["IRRAmount"],
1410
+ date: this.pbf.time(args.cellSets[i][dateField]) ===
1411
+ "Invalid date"
1412
+ ? asOfDate
1413
+ : this.pbf.time(args.cellSets[i][dateField]),
1414
+ };
1415
+ // SMP2-16920
1416
+ // If IRR Date > Dashboard report date = Takes as of dashboard report date
1417
+ if (args.aggregateType === "CalculateIRRIRRDate" &&
1418
+ asOfDate < this.pbf.time(args.cellSets[i][dateField])) {
1419
+ data.date = asOfDate;
1420
+ }
1421
+ NAVAdj += args.cellSets[i][valueField];
1422
+ // SMP2-17219 MTD QTD YTD IRR
1423
+ if (startDate && endDate) {
1424
+ if (moment(data.date).isBefore(startDate)) {
1425
+ data[valueField] = args.cellSets[i][valueField];
1426
+ beforeStartValues.push(data);
1427
+ beforeStartNAVAdj += data[valueField];
1428
+ }
1429
+ if (!moment(data.date).isBetween(startDate, endDate, null, "[]")) {
1430
+ continue;
1431
+ }
1432
+ }
1433
+ if (data.amount != 0) {
1434
+ values.push(data);
1435
+ }
1436
+ }
1437
+ if (NAVAdj > 0.0001 || NAVAdj < -0.0001) {
1438
+ values.push({
1439
+ amount: NAVAdj,
1440
+ date: asOfDate,
1441
+ });
1442
+ }
1443
+ values = sortBy(values, "date");
1444
+ // 如果是MTD,QTD,YTD 则需要把当前阶段以前的所有数据进行汇总,加入计算
1445
+ if (startDate && endDate) {
1446
+ values.unshift({
1447
+ amount: -beforeStartNAVAdj,
1448
+ date: this.pbf.time(startDate),
1449
+ });
1450
+ }
1451
+ // console.log("beforeStartValues:", beforeStartValues);
1452
+ // console.log("values:", values);
1453
+ if (values.length > 0) {
1454
+ let guess = 0.1;
1455
+ const sumAmount = values
1456
+ .map((item) => item.amount)
1457
+ .reduce((prev, curr) => prev + curr, 0);
1458
+ if (sumAmount < 0) {
1459
+ guess = -0.1;
1460
+ }
1461
+ //SMP2-2249 fixed the big irr issue
1462
+ if (sumAmount === 0) {
1463
+ args.value = 0;
1464
+ }
1465
+ else {
1466
+ const valueItems = values.slice(0, values.length - 1);
1467
+ const valueList = valueItems.map((item) => item.amount);
1468
+ const dateList = valueItems.map((item) => item.date);
1469
+ const lastItem = values[values.length - 1];
1470
+ const navAdjust = lastItem.amount;
1471
+ const latestDate = lastItem.date;
1472
+ let irr = this.dashboardPorletsService.ExcelFormulas._CalculateXirr(valueList, dateList, navAdjust, latestDate);
1473
+ args.value = irr === null ? "" : irr;
1474
+ }
1475
+ }
1476
+ else {
1477
+ args.value = "";
1478
+ }
1479
+ if (this.pivotObj.engineModule &&
1480
+ this.pivotObj.engineModule.formatFields[args.fieldName]) {
1481
+ delete this.pivotObj.engineModule.formatFields[args.fieldName];
1482
+ this.pivotObj.engineModule.formatFields[args.fieldName] = {
1483
+ name: args.fieldName,
1484
+ format: field.length > 0
1485
+ ? field[0].format &&
1486
+ field[0].format.length &&
1487
+ field[0].format[0].formatChecked
1488
+ ? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
1489
+ : this.dashboardPorletsService.formatPercent(field[0].dp)
1490
+ : "P2",
1491
+ };
1492
+ }
1493
+ }
1494
+ // SMP2-16520 TWR 月/季/年 && SMP2-16683 VAR
1495
+ if ([
1496
+ "CalculateTWRMTD",
1497
+ "CalculateTWRQTD",
1498
+ "CalculateTWRYTD",
1499
+ "CalculateVARMTD_99",
1500
+ "CalculateVARQTD_99",
1501
+ "CalculateVARYTD_99",
1502
+ "CalculateVARMTD_95",
1503
+ "CalculateVARQTD_95",
1504
+ "CalculateVARYTD_95",
1505
+ ].includes(args.aggregateType)) {
1506
+ // console.log("==========================");
1507
+ // console.log("args:", args);
1508
+ let valueField = "IRRAdjValue";
1509
+ let dateField = "IRRDate";
1510
+ let timeRange;
1511
+ switch (args.aggregateType) {
1512
+ case "CalculateTWRMTD":
1513
+ case "CalculateVARMTD_99":
1514
+ case "CalculateVARMTD_95":
1515
+ timeRange = "month";
1516
+ break;
1517
+ case "CalculateTWRQTD":
1518
+ case "CalculateVARQTD_99":
1519
+ case "CalculateVARQTD_95":
1520
+ timeRange = "quarter";
1521
+ break;
1522
+ case "CalculateTWRYTD":
1523
+ case "CalculateVARYTD_99":
1524
+ case "CalculateVARYTD_95":
1525
+ timeRange = "year";
1526
+ break;
1527
+ default:
1528
+ break;
1529
+ }
1530
+ let values = []; // 这个阶段的累计集合
1531
+ let field = this.configFields.filter((el) => el.colName ===
1532
+ this.dashboardPorletsService.getAggregateType(args.aggregateType));
1533
+ for (let i = 0; i < args.cellSets.length; i++) {
1534
+ const data = {
1535
+ [valueField]: args.cellSets[i][valueField],
1536
+ date: this.pbf.time(args.cellSets[i][dateField]) ===
1537
+ "Invalid date"
1538
+ ? asOfDate
1539
+ : this.pbf.time(args.cellSets[i][dateField]),
1540
+ };
1541
+ values.push(data);
1542
+ }
1543
+ // 如果asOfDate不是 本月/季度/年 的最后一天,都是截至 上个月/季度/年 的最后一天的数据去计算
1544
+ let _asOfDate = moment(asOfDate);
1545
+ // console.log("_asOfDate:", _asOfDate);
1546
+ let isEndOfPeriod = (unit) => {
1547
+ return (_asOfDate.format("YYYY-MM-DD") ===
1548
+ _asOfDate.endOf(unit).format("YYYY-MM-DD"));
1549
+ };
1550
+ let endDate = isEndOfPeriod(timeRange)
1551
+ ? moment(asOfDate).format("YYYY-MM-DD")
1552
+ : moment(asOfDate)
1553
+ .subtract(1, timeRange)
1554
+ .endOf(timeRange)
1555
+ .format("YYYY-MM-DD");
1556
+ // console.log("endDate:", endDate);
1557
+ values = values.filter((item) => moment(item.date).isSameOrBefore(endDate));
1558
+ values = sortBy(values, "date");
1559
+ // console.log("values:", values);
1560
+ if (values.length > 0) {
1561
+ let result = this.getTimeRanges(values, endDate, timeRange, "date"); // 各个阶段的数据
1562
+ let resultTotal = {}; // 各个阶段总和
1563
+ for (const prop in result) {
1564
+ resultTotal[prop] = result[prop].reduce((acc, cur) => {
1565
+ return acc + (cur[valueField] || 0);
1566
+ }, 0);
1567
+ }
1568
+ // console.log("result:", result);
1569
+ // console.log("resultTotal:", resultTotal);
1570
+ const cumulativeSum = {}; // 各个阶段累计和
1571
+ let sum = 0;
1572
+ for (const key of Object.keys(resultTotal)) {
1573
+ sum += resultTotal[key];
1574
+ cumulativeSum[`${key}`] = sum;
1575
+ }
1576
+ // console.log("cumulativeSum:", cumulativeSum);
1577
+ const keys = Object.keys(cumulativeSum);
1578
+ let twrList = [];
1579
+ // 遍历每两个阶段 计算TWR
1580
+ for (let i = 0; i < keys.length - 1; i++) {
1581
+ const key1 = keys[i];
1582
+ const key2 = keys[i + 1];
1583
+ // 计算两个阶段之间的递增量, 出数不能为0
1584
+ if (cumulativeSum[key1] != 0) {
1585
+ const increment = cumulativeSum[key2] - cumulativeSum[key1];
1586
+ let twr = increment / cumulativeSum[key1];
1587
+ twrList.push({
1588
+ date: key2,
1589
+ twr: twr,
1590
+ });
1591
+ }
1592
+ }
1593
+ // 计算Average TWR
1594
+ // console.log("twrList:", twrList);
1595
+ let averageTWR = this.calculateGrowthRate(twrList.map((x) => x.twr));
1596
+ // console.log("计算Average TWR:", averageTWR);
1597
+ if ([
1598
+ "CalculateTWRMTD",
1599
+ "CalculateTWRQTD",
1600
+ "CalculateTWRYTD",
1601
+ ].includes(args.aggregateType)) {
1602
+ // SMP2-16520 TWR 月/季/年
1603
+ args.value =
1604
+ isNaN(averageTWR) || averageTWR == null
1605
+ ? ""
1606
+ : averageTWR.toFixed(4);
1607
+ }
1608
+ else {
1609
+ if (isNaN(averageTWR) || averageTWR == null) {
1610
+ args.value = "";
1611
+ }
1612
+ else {
1613
+ // SMP2-16683 VAR 区分99%和95%
1614
+ let ZScore = [
1615
+ "CalculateVARMTD_99",
1616
+ "CalculateVARQTD_99",
1617
+ "CalculateVARYTD_99",
1618
+ ].includes(args.aggregateType)
1619
+ ? 2.33
1620
+ : 1.65;
1621
+ if (twrList.length < 2) {
1622
+ args.value = "";
1623
+ }
1624
+ else {
1625
+ let SD = this.calculateStandardDeviation(twrList.map((x) => x.twr));
1626
+ // console.log("calculateStandardDeviation:", SD);
1627
+ let VAR = averageTWR - SD * ZScore;
1628
+ args.value = VAR.toFixed(4);
1629
+ }
1630
+ }
1631
+ }
1632
+ // console.log("args.value:", args.value);
1633
+ }
1634
+ if (this.pivotObj.engineModule &&
1635
+ this.pivotObj.engineModule.formatFields[args.fieldName]) {
1636
+ delete this.pivotObj.engineModule.formatFields[args.fieldName];
1637
+ this.pivotObj.engineModule.formatFields[args.fieldName] = {
1638
+ name: args.fieldName,
1639
+ format: field.length > 0
1640
+ ? field[0].format &&
1641
+ field[0].format.length &&
1642
+ field[0].format[0].formatChecked
1643
+ ? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
1644
+ : this.dashboardPorletsService.formatPercent(field[0].dp)
1645
+ : "P2",
1646
+ };
1647
+ }
1648
+ }
1649
+ //SMP2-2701
1650
+ if (args.aggregateType === "CalculateIRRActualAudited") {
1651
+ let NAVAdj = 0;
1652
+ let values = [];
1653
+ let field = this.configFields.filter((el) => el.colName ===
1654
+ this.dashboardPorletsService.getAggregateType(args.aggregateType));
1655
+ //SMP2-2713 only judge for this dataMart(GrossNet)
1656
+ if (this.portlet.figureCode === "GrossNet" ||
1657
+ this.portlet.figureCode ===
1658
+ "CombinedInvestmentFundNCompanyCashflow") {
1659
+ for (let i = 0; i < args.cellSets.length; i++) {
1660
+ const data = {
1661
+ amount: args.cellSets[i]["IRRAmount"],
1662
+ date: this.pbf.time(args.cellSets[i]["IRRDate"]) ===
1663
+ "Invalid date"
1664
+ ? asOfDate
1665
+ : this.pbf.time(args.cellSets[i]["IRRDate"]),
1666
+ };
1667
+ NAVAdj += args.cellSets[i]["ActualAuditedNAV"];
1668
+ if (data.amount != 0) {
1669
+ values.push(data);
1670
+ }
1671
+ }
1672
+ }
1673
+ //filter the data by the DataType(Actual Reported Audited)
1674
+ else {
1675
+ let argsdata = args.cellSets.filter((el) => el.DataType === "ACTUAL_AUDITED" ||
1676
+ el.DataType === "REPORTED");
1677
+ for (let i = 0; i < argsdata.length; i++) {
1678
+ const data = {
1679
+ amount: argsdata[i]["IRRAmount"],
1680
+ date: this.pbf.time(argsdata[i]["IRRDate"]) ===
1681
+ "Invalid date"
1682
+ ? asOfDate
1683
+ : this.pbf.time(argsdata[i]["IRRDate"]),
1684
+ };
1685
+ NAVAdj += argsdata[i]["IRRAdjValue"];
1686
+ if (data.amount != 0) {
1687
+ values.push(data);
1688
+ }
1689
+ }
1690
+ }
1691
+ if (NAVAdj > 0.0001 || NAVAdj < -0.0001) {
1692
+ values.push({
1693
+ amount: NAVAdj,
1694
+ date: asOfDate,
1695
+ });
1696
+ }
1697
+ values = sortBy(values, "date");
1698
+ if (values.length > 0) {
1699
+ let guess = 0.1;
1700
+ const sumAmount = values
1701
+ .map((item) => item.amount)
1702
+ .reduce((prev, curr) => prev + curr, 0);
1703
+ if (sumAmount < 0) {
1704
+ guess = -0.1;
1705
+ }
1706
+ //SMP2-2249 fixed the big irr issue
1707
+ if (sumAmount === 0) {
1708
+ args.value = 0;
1709
+ }
1710
+ else {
1711
+ const valueItems = values.slice(0, values.length - 1);
1712
+ const valueList = valueItems.map((item) => item.amount);
1713
+ const dateList = valueItems.map((item) => item.date);
1714
+ const lastItem = values[values.length - 1];
1715
+ const navAdjust = lastItem.amount;
1716
+ const latestDate = lastItem.date;
1717
+ let irr = this.dashboardPorletsService.ExcelFormulas._CalculateXirr(valueList, dateList, navAdjust, latestDate);
1718
+ args.value = irr === null ? 0 : irr;
1719
+ }
1720
+ }
1721
+ else {
1722
+ args.value = 0;
1723
+ }
1724
+ if (this.pivotObj.engineModule &&
1725
+ this.pivotObj.engineModule.formatFields[args.fieldName]) {
1726
+ delete this.pivotObj.engineModule.formatFields[args.fieldName];
1727
+ this.pivotObj.engineModule.formatFields[args.fieldName] = {
1728
+ name: args.fieldName,
1729
+ format: field.length > 0
1730
+ ? field[0].format &&
1731
+ field[0].format.length &&
1732
+ field[0].format[0].formatChecked
1733
+ ? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
1734
+ : this.dashboardPorletsService.formatPercent(field[0].dp)
1735
+ : "P2",
1736
+ };
1737
+ }
1738
+ }
1739
+ //SMP2-3411
1740
+ if (args.aggregateType === "CalculateIRRReported") {
1741
+ let NAVAdj = 0;
1742
+ let values = [];
1743
+ let field = this.configFields.filter((el) => el.colName ===
1744
+ this.dashboardPorletsService.getAggregateType(args.aggregateType));
1745
+ if (this.portlet.figureCode === "GrossNet" ||
1746
+ this.portlet.figureCode ===
1747
+ "CombinedInvestmentFundNCompanyCashflow") {
1748
+ for (let i = 0; i < args.cellSets.length; i++) {
1749
+ const data = {
1750
+ amount: args.cellSets[i]["IRRAmount"],
1751
+ date: this.pbf.time(args.cellSets[i]["IRRDate"]) ===
1752
+ "Invalid date"
1753
+ ? asOfDate
1754
+ : this.pbf.time(args.cellSets[i]["IRRDate"]),
1755
+ };
1756
+ NAVAdj += args.cellSets[i]["ReportedNAV"];
1757
+ if (data.amount != 0) {
1758
+ values.push(data);
1759
+ }
1760
+ }
1761
+ }
1762
+ else {
1763
+ for (let i = 0; i < args.cellSets.length; i++) {
1764
+ const data = {
1765
+ amount: args.cellSets[i]["IRRAmount"],
1766
+ date: this.pbf.time(args.cellSets[i]["IRRDate"]) ===
1767
+ "Invalid date"
1768
+ ? asOfDate
1769
+ : this.pbf.time(args.cellSets[i]["IRRDate"]),
1770
+ };
1771
+ NAVAdj += args.cellSets[i]["IRRAdjValue"];
1772
+ if (data.amount != 0) {
1773
+ values.push(data);
1774
+ }
1775
+ }
1776
+ }
1777
+ if (NAVAdj > 0.0001 || NAVAdj < -0.0001) {
1778
+ values.push({
1779
+ amount: NAVAdj,
1780
+ date: asOfDate,
1781
+ });
1782
+ }
1783
+ values = sortBy(values, "date");
1784
+ if (values.length > 0) {
1785
+ let guess = 0.1;
1786
+ const sumAmount = values
1787
+ .map((item) => item.amount)
1788
+ .reduce((prev, curr) => prev + curr, 0);
1789
+ if (sumAmount < 0) {
1790
+ guess = -0.1;
1791
+ }
1792
+ //SMP2-2249 fixed the big irr issue
1793
+ if (sumAmount === 0) {
1794
+ args.value = 0;
1795
+ }
1796
+ else {
1797
+ const valueItems = values.slice(0, values.length - 1);
1798
+ const valueList = valueItems.map((item) => item.amount);
1799
+ const dateList = valueItems.map((item) => item.date);
1800
+ const lastItem = values[values.length - 1];
1801
+ const navAdjust = lastItem.amount;
1802
+ const latestDate = lastItem.date;
1803
+ let irr = this.dashboardPorletsService.ExcelFormulas._CalculateXirr(valueList, dateList, navAdjust, latestDate);
1804
+ args.value = irr === null ? 0 : irr;
1805
+ }
1806
+ }
1807
+ else {
1808
+ args.value = 0;
1809
+ }
1810
+ if (this.pivotObj.engineModule &&
1811
+ this.pivotObj.engineModule.formatFields[args.fieldName]) {
1812
+ delete this.pivotObj.engineModule.formatFields[args.fieldName];
1813
+ this.pivotObj.engineModule.formatFields[args.fieldName] = {
1814
+ name: args.fieldName,
1815
+ format: field.length > 0
1816
+ ? field[0].format &&
1817
+ field[0].format.length &&
1818
+ field[0].format[0].formatChecked
1819
+ ? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
1820
+ : this.dashboardPorletsService.formatPercent(field[0].dp)
1821
+ : "P2",
1822
+ };
1823
+ }
1824
+ }
1825
+ if (args.aggregateType === "CalculateMultiple" ||
1826
+ args.aggregateType === "CalculatePIC" ||
1827
+ args.aggregateType === "CalculateDPI" ||
1828
+ args.aggregateType === "CalculateTVPI" ||
1829
+ args.aggregateType === "CalculateRVPI" ||
1830
+ args.aggregateType === "CalculateMActualAudited" ||
1831
+ args.aggregateType === "CalculateMReported") {
1832
+ let totalNumerator = 0;
1833
+ let totalDenominator = 0;
1834
+ let numeratorName;
1835
+ let denominatorName;
1836
+ let field = this.configFields.filter((el) => el.colName ===
1837
+ this.dashboardPorletsService.getAggregateType(args.aggregateType));
1838
+ if (field.length > 0) {
1839
+ const formulaArray = field[0].formula.split("/");
1840
+ numeratorName = formulaArray[0];
1841
+ denominatorName = formulaArray[1];
1842
+ }
1843
+ for (let j = 0; j < args.cellSets.length; j++) {
1844
+ totalNumerator += args.cellSets[j][numeratorName];
1845
+ totalDenominator += args.cellSets[j][denominatorName];
1846
+ }
1847
+ if (totalDenominator !== 0) {
1848
+ args.value = totalNumerator / totalDenominator;
1849
+ if (this.pivotObj.engineModule &&
1850
+ this.pivotObj.engineModule.formatFields[args.fieldName]) {
1851
+ delete this.pivotObj.engineModule.formatFields[args.fieldName];
1852
+ this.pivotObj.engineModule.formatFields[args.fieldName] = {
1853
+ name: args.fieldName,
1854
+ format: field.length > 0
1855
+ ? field[0].format &&
1856
+ field[0].format.length &&
1857
+ field[0].format[0].formatChecked
1858
+ ? this.dashboardPorletsService.pivotTableformatMultiple(field[0].format[0].selectedFormat)
1859
+ : this.dashboardPorletsService.formatMultiple(field[0].dp)
1860
+ : "###0.00'x'",
1861
+ };
1862
+ }
1863
+ }
1864
+ else {
1865
+ args.value = "";
1866
+ }
1867
+ }
1868
+ if (args.aggregateType === "First" || args.aggregateType === "Last") {
1869
+ args.value = this.calculatedFistLast(args, args.aggregateType, args.fieldName);
1870
+ }
1871
+ if (args.aggregateType === "Count" ||
1872
+ args.aggregateType === "DistinctCount") {
1873
+ if (args.value) {
1874
+ args.value = args.value.toFixed(2);
1875
+ }
1876
+ }
1877
+ if (!args.value &&
1878
+ args.value !== 0 &&
1879
+ args.value !== false &&
1880
+ args.value !== "false") {
1881
+ args.skipFormatting = true;
1882
+ args.value = "";
1883
+ }
1884
+ // 新建pivot table, 还没有设置row, 选了column之后grandtotal会有值
1885
+ if (args.rowCellType === "grandTotal" &&
1886
+ !this.pivotObj.dataSourceSettings.rows.length) {
1887
+ args.value = "";
1888
+ }
1889
+ //SMP2-2889
1890
+ if (args.rowCellType === "subTotal") {
1891
+ const valueField_data = this.config.yaxis.series.filter((el) => el.colName === args.fieldName);
1892
+ if (valueField_data.length > 0) {
1893
+ if (valueField_data[0].showSubTotals === false) {
1894
+ args.value = "";
1895
+ args.skipFormatting = true;
1896
+ }
1897
+ }
1898
+ }
1899
+ if (args.rowCellType === "grandTotal") {
1900
+ const valueField_data = this.config.yaxis.series.filter((el) => el.colName === args.fieldName);
1901
+ if (valueField_data.length > 0) {
1902
+ if (valueField_data[0].showGrandTotals === false) {
1903
+ args.value = "";
1904
+ args.skipFormatting = true;
1905
+ }
1906
+ }
1907
+ }
1908
+ // SMP2-3416 start
1909
+ if (this.zeroFormatData.hgList.includes(args.fieldName) &&
1910
+ args.value === 0) {
1911
+ args.value = "-";
1912
+ args.skipFormatting = true;
1913
+ }
1914
+ if (this.zeroFormatData.emptyList.includes(args.fieldName) &&
1915
+ args.value === 0) {
1916
+ args.value = "";
1917
+ args.skipFormatting = true;
1918
+ }
1919
+ if (this.millionFields.includes(args.fieldName) &&
1920
+ !isNaN(Number(args.value)) &&
1921
+ args.value !== 0 &&
1922
+ args.value !== "" &&
1923
+ args.value !== null) {
1924
+ if (args.columnCellType == "grandTotal" &&
1925
+ args.rowCellType == "grandTotal") {
1926
+ if (!this.totalFormatted[args.fieldName]) {
1927
+ this.totalFormatted[args.fieldName] = true;
1928
+ args.value = args.value / 1000000;
1929
+ }
1930
+ }
1931
+ else {
1932
+ args.value = args.value / 1000000;
1933
+ }
1934
+ }
1935
+ // SMP2-2486 & percentNum的format问题
1936
+ if (this.percentNumFields.length &&
1937
+ this.percentNumFields.includes(args.fieldName) &&
1938
+ !isNaN(Number(args.value)) &&
1939
+ args.value !== 0 &&
1940
+ args.value !== "" &&
1941
+ args.value !== null) {
1942
+ if (args.columnCellType == "grandTotal" &&
1943
+ args.rowCellType == "grandTotal") {
1944
+ if (!this.totalFormatted[args.fieldName]) {
1945
+ this.totalFormatted[args.fieldName] = true;
1946
+ args.value = args.value / 100;
1947
+ }
1948
+ }
1949
+ else {
1950
+ args.value = args.value / 100;
1951
+ }
1952
+ }
1953
+ if (args.aggregateType == "CalculatedField" &&
1954
+ !Number.isNaN(args.value)) {
1955
+ args.value = Number(args.value).toFixed(2);
1956
+ }
1957
+ // SMP2-3416 end
1958
+ this.ref.markForCheck();
1959
+ this.ref.detectChanges();
1960
+ }
1961
+ calculatedFistLast(args, aggregateType, fieldName) {
1962
+ if (!args.row.actualText)
1963
+ args.row.actualText = args.row.formattedText;
1964
+ if (!args.column.actualText)
1965
+ args.column.actualText = args.column.formattedText;
1966
+ let field = this.configFields.filter((el) => el.colName === fieldName)[0];
1967
+ if (args.rowCellType === "value" && !args.row.hasChild) {
1968
+ if (args.cellSets[0]) {
1969
+ if (aggregateType === "First") {
1970
+ for (let firstIndex = 0; firstIndex < args.cellSets.length; firstIndex++) {
1971
+ if (this.pivotObj.dataSourceSettings.columns.length ==
1972
+ 1 &&
1973
+ args.columnCellType == "grandTotal") {
1974
+ if (field.dataType == "string" ||
1975
+ field.dataType == "nvarchar" ||
1976
+ field.dataType == "date" ||
1977
+ field.dataType == "datetime") {
1978
+ args.value = "";
1979
+ }
1980
+ else {
1981
+ if (this.allDataValue &&
1982
+ this.allDataValue.length) {
1983
+ let rowObjs = this.allDataValue[args.row.rowIndex];
1984
+ if (rowObjs) {
1985
+ let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
1986
+ let obj = rowObjsArr.filter((el) => el.actualText == fieldName &&
1987
+ el.isGrandSum)[0];
1988
+ if (obj)
1989
+ args.value = obj.value;
1990
+ }
1991
+ }
1992
+ else {
1993
+ args.value = isNaN(Number(this.grandTotals["row" +
1994
+ args.row.actualText +
1995
+ fieldName]))
1996
+ ? null
1997
+ : Number(this.grandTotals["row" +
1998
+ args.row.actualText +
1999
+ fieldName]);
2000
+ }
2001
+ }
2002
+ }
2003
+ else {
2004
+ args.value = args.cellSets[firstIndex][fieldName];
2005
+ }
2006
+ if (field.dataType == "number" ||
2007
+ field.dataType == "multiple" ||
2008
+ field.dataType == "percent" ||
2009
+ field.dataType == "percentNum") {
2010
+ if (args.value != null)
2011
+ break;
2012
+ }
2013
+ else if (field.dataType == "date" ||
2014
+ field.dataType == "datetime") {
2015
+ if (this.pbf.time(args.value) > "1900-01-01")
2016
+ break;
2017
+ }
2018
+ else if (args.value)
2019
+ break;
2020
+ }
2021
+ }
2022
+ if (aggregateType === "Last") {
2023
+ for (let lastIndex = args.cellSets.length - 1; lastIndex >= 0; lastIndex--) {
2024
+ if (this.pivotObj.dataSourceSettings.columns.length ==
2025
+ 1 &&
2026
+ args.columnCellType == "grandTotal") {
2027
+ if (field.dataType == "string" ||
2028
+ field.dataType == "nvarchar" ||
2029
+ field.dataType == "date" ||
2030
+ field.dataType == "datetime") {
2031
+ args.value = "";
2032
+ }
2033
+ else {
2034
+ if (this.allDataValue &&
2035
+ this.allDataValue.length) {
2036
+ let rowObjs = this.allDataValue[args.row.rowIndex];
2037
+ if (rowObjs) {
2038
+ let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
2039
+ let obj = rowObjsArr.filter((el) => el.actualText == fieldName &&
2040
+ el.isGrandSum)[0];
2041
+ if (obj)
2042
+ args.value = obj.value;
2043
+ }
2044
+ }
2045
+ else {
2046
+ args.value = isNaN(Number(this.grandTotals["row" +
2047
+ args.row.actualText +
2048
+ fieldName]))
2049
+ ? null
2050
+ : Number(this.grandTotals["row" +
2051
+ args.row.actualText +
2052
+ fieldName]);
2053
+ }
2054
+ }
2055
+ }
2056
+ else {
2057
+ args.value = args.cellSets[lastIndex][fieldName];
2058
+ }
2059
+ if (field.dataType == "number" ||
2060
+ field.dataType == "multiple" ||
2061
+ field.dataType == "percent" ||
2062
+ field.dataType == "percentNum") {
2063
+ if (args.value != null)
2064
+ break;
2065
+ }
2066
+ else if (field.dataType == "date" ||
2067
+ field.dataType == "datetime") {
2068
+ if (this.pbf.time(args.value) > "1900-01-01")
2069
+ break;
2070
+ }
2071
+ else if (args.value)
2072
+ break;
2073
+ }
2074
+ }
2075
+ if (field.dataType == "number" ||
2076
+ field.dataType == "multiple" ||
2077
+ field.dataType == "percent" ||
2078
+ field.dataType == "percentNum") {
2079
+ if (this.pivotObj.dataSourceSettings.rows.length) {
2080
+ if (!this.pivotObj.dataSourceSettings.columns.length) {
2081
+ if (!Number(this.grandTotals[fieldName]) ||
2082
+ isNaN(Number(this.grandTotals[fieldName]))) {
2083
+ this.grandTotals[fieldName] = 0;
2084
+ }
2085
+ if (args.aggregateType !== "CalculatedField") {
2086
+ this.grandTotals[fieldName] += Number(args.value);
2087
+ }
2088
+ }
2089
+ else if (this.pivotObj.dataSourceSettings.columns.length == 1) {
2090
+ // "row" + args.row.actualText + fieldName 表示(cell: args.rowCellType === "value" && args.columnCellType === "grandTotal")
2091
+ if (!Number(this.grandTotals["row" + args.row.actualText + fieldName]) ||
2092
+ isNaN(Number(this.grandTotals["row" +
2093
+ args.row.actualText +
2094
+ fieldName]))) {
2095
+ this.grandTotals["row" + args.row.actualText + fieldName] = 0;
2096
+ }
2097
+ this.grandTotals["row" + args.row.actualText + fieldName] += Number(args.value);
2098
+ // "col" + args.column.actualText + fieldName 表示(cell: args.rowCellType === "grandTotal" && args.columnCellType === "value")
2099
+ if (!Number(this.grandTotals["col" +
2100
+ args.column.actualText +
2101
+ fieldName]) ||
2102
+ isNaN(Number(this.grandTotals["col" +
2103
+ args.column.actualText +
2104
+ fieldName]))) {
2105
+ this.grandTotals["col" + args.column.actualText + fieldName] = 0;
2106
+ }
2107
+ this.grandTotals["col" + args.column.actualText + fieldName] += Number(args.value);
2108
+ }
2109
+ }
2110
+ }
2111
+ }
2112
+ }
2113
+ else if (args.rowCellType === "subTotal" || args.row.hasChild) {
2114
+ const dataType = field.dataType;
2115
+ if (dataType === "string" ||
2116
+ dataType === "nvarchar" ||
2117
+ dataType == "date" ||
2118
+ dataType == "datetime") {
2119
+ args.value = "";
2120
+ }
2121
+ else {
2122
+ let value = 0;
2123
+ let childHeaders = [];
2124
+ if (aggregateType === "First") {
2125
+ let groupNameArrays = [];
2126
+ let rows = this.pivotObj.dataSourceSettings.rows;
2127
+ for (let index = args.row.level; index < rows.length; index++) {
2128
+ groupNameArrays.push(rows[index].name);
2129
+ }
2130
+ for (let i = 0; i < args.cellSets.length; i++) {
2131
+ let values = [];
2132
+ let header = groupNameArrays
2133
+ .map((name) => {
2134
+ values.push(args.cellSets[i][name]);
2135
+ return args.cellSets[i][name];
2136
+ })
2137
+ .join("-");
2138
+ if (!childHeaders.includes(header)) {
2139
+ let filterObj = {};
2140
+ groupNameArrays.map((name, x) => (filterObj[name] = values[x]));
2141
+ let _CellSets = _filter(args.cellSets, filterObj);
2142
+ childHeaders.push(header);
2143
+ value += Number(_CellSets[0][fieldName]) || 0;
2144
+ }
2145
+ }
2146
+ }
2147
+ if (aggregateType === "Last") {
2148
+ let groupNameArrays = [];
2149
+ let rows = this.pivotObj.dataSourceSettings.rows;
2150
+ for (let index = args.row.level; index < rows.length; index++) {
2151
+ groupNameArrays.push(rows[index].name);
2152
+ }
2153
+ for (let i = args.cellSets.length - 1; i >= 0; i--) {
2154
+ let values = [];
2155
+ let header = groupNameArrays
2156
+ .map((name) => {
2157
+ values.push(args.cellSets[i][name]);
2158
+ return args.cellSets[i][name];
2159
+ })
2160
+ .join("-");
2161
+ if (!childHeaders.includes(header)) {
2162
+ let filterObj = {};
2163
+ groupNameArrays.map((name, x) => (filterObj[name] = values[x]));
2164
+ let _CellSets = _filter(args.cellSets, filterObj);
2165
+ childHeaders.push(header);
2166
+ value +=
2167
+ Number(_CellSets[_CellSets.length - 1][fieldName]) || 0;
2168
+ }
2169
+ }
2170
+ }
2171
+ if (args.column.actualText !== "Grand Total")
2172
+ this.columnTexts.push(args.column.actualText);
2173
+ if (!this.pivotObj.dataSourceSettings.columns.length) {
2174
+ if (!Number(this.subTotals[fieldName]) ||
2175
+ isNaN(Number(this.subTotals[fieldName]))) {
2176
+ this.subTotals[fieldName] = 0;
2177
+ }
2178
+ this.subTotals[fieldName] += Number(value);
2179
+ }
2180
+ else if (this.pivotObj.dataSourceSettings.columns.length == 1) {
2181
+ // "row" + args.row.actualText + fieldName 表示(cell: args.rowCellType === "value" && args.columnCellType === "grandTotal")
2182
+ if (!Number(this.subTotals[args.row.actualText +
2183
+ args.column.actualText +
2184
+ fieldName]) ||
2185
+ isNaN(Number(this.subTotals[args.row.actualText +
2186
+ args.column.actualText +
2187
+ fieldName]))) {
2188
+ this.subTotals[args.row.actualText +
2189
+ args.column.actualText +
2190
+ fieldName] = 0;
2191
+ }
2192
+ this.subTotals[args.row.actualText + args.column.actualText + fieldName] += Number(value);
2193
+ }
2194
+ // ---> allDataValue中这个单元格的值不正确
2195
+ if (args.columnCellType === "grandTotal" &&
2196
+ this.pivotObj.dataSourceSettings.columns.length == 1) {
2197
+ if (this.allDataValue && this.allDataValue.length) {
2198
+ args.value =
2199
+ this.subTotals[args.row.actualText + "Grand Total" + fieldName];
2200
+ }
2201
+ else {
2202
+ // 把前边这个field的几列subtotal加起来
2203
+ this.columnTexts = uniqBy(this.columnTexts, (el) => el);
2204
+ let val = 0;
2205
+ for (let i = 0; i < this.columnTexts.length; i++) {
2206
+ const element = this.columnTexts[i];
2207
+ val +=
2208
+ this.subTotals[args.row.actualText + element + fieldName];
2209
+ }
2210
+ args.value = val;
2211
+ }
2212
+ }
2213
+ else {
2214
+ args.value = value;
2215
+ }
2216
+ }
2217
+ }
2218
+ else if (args.rowCellType === "grandTotal") {
2219
+ const dataType = field.dataType;
2220
+ if (dataType == "string" ||
2221
+ dataType == "nvarchar" ||
2222
+ dataType == "date" ||
2223
+ dataType == "datetime") {
2224
+ args.value = "";
2225
+ }
2226
+ else {
2227
+ if (!this.pivotObj.dataSourceSettings.columns.length) {
2228
+ if (this.allDataValue && this.allDataValue.length) {
2229
+ let rowObjs = this.allDataValue[this.allDataValue.length - 1];
2230
+ if (rowObjs) {
2231
+ let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
2232
+ let objArr = rowObjsArr.filter((el) => el.actualText == fieldName && el.isGrandSum);
2233
+ if (objArr && objArr.length) {
2234
+ args.value = objArr[objArr.length - 1].value;
2235
+ }
2236
+ else if (Object.keys(this.grandTotals).includes(fieldName)) {
2237
+ args.value = this.grandTotals[fieldName];
2238
+ }
2239
+ }
2240
+ }
2241
+ else {
2242
+ args.value = this.grandTotals[fieldName];
2243
+ }
2244
+ }
2245
+ else {
2246
+ if (args.columnCellType === "grandTotal") {
2247
+ if (this.allDataValue && this.allDataValue.length) {
2248
+ let rowObjs = this.allDataValue[this.allDataValue.length - 1];
2249
+ if (rowObjs) {
2250
+ let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
2251
+ let objArr = rowObjsArr.filter((el) => el.actualText == fieldName &&
2252
+ el.isGrandSum);
2253
+ if (objArr && objArr.length) {
2254
+ args.value =
2255
+ objArr[objArr.length - 1].value;
2256
+ }
2257
+ else if (Object.keys(this.grandTotals).includes("col" +
2258
+ args.column.actualText +
2259
+ fieldName)) {
2260
+ args.value =
2261
+ this.grandTotals["col" +
2262
+ args.column.actualText +
2263
+ fieldName];
2264
+ }
2265
+ }
2266
+ }
2267
+ else {
2268
+ args.value =
2269
+ this.grandTotals["col" + args.column.actualText + fieldName];
2270
+ }
2271
+ }
2272
+ else {
2273
+ // if (
2274
+ // this.pivotObj.dataSourceSettings.columns.length == 1
2275
+ // ) {
2276
+ // args.value = this.grandTotals[
2277
+ // "col" + args.column.actualText + fieldName
2278
+ // ];
2279
+ // }
2280
+ if (this.allDataValue && this.allDataValue.length) {
2281
+ let rowObjs = this.allDataValue[this.allDataValue.length - 1];
2282
+ let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
2283
+ let objArr = rowObjsArr.filter((el) => el.actualText == fieldName &&
2284
+ el.isGrandSum &&
2285
+ el.columnHeaders == args.column.actualText);
2286
+ if (objArr && objArr.length) {
2287
+ args.value = objArr[objArr.length - 1].value;
2288
+ }
2289
+ else if (Object.keys(this.grandTotals).includes("col" + args.column.actualText + fieldName)) {
2290
+ args.value =
2291
+ this.grandTotals["col" +
2292
+ args.column.actualText +
2293
+ fieldName];
2294
+ }
2295
+ }
2296
+ else {
2297
+ args.value =
2298
+ this.grandTotals["col" + args.column.actualText + fieldName];
2299
+ }
2300
+ }
2301
+ }
2302
+ }
2303
+ }
2304
+ this.formatVal(args, fieldName);
2305
+ return args.value;
2306
+ }
2307
+ formatVal(args, fieldName) {
2308
+ this.configFields.forEach((field) => {
2309
+ if (field.colName == fieldName) {
2310
+ switch (field.dataType) {
2311
+ case "date":
2312
+ case "datetime":
2313
+ if (args.value)
2314
+ args.value = new Date(args.value);
2315
+ break;
2316
+ default:
2317
+ break;
2318
+ }
2319
+ }
2320
+ });
2321
+ }
2322
+ getexcludeFields(fields, data) {
2323
+ let namearray = [];
2324
+ let array = [];
2325
+ for (let prop in data) {
2326
+ array.push(prop);
2327
+ }
2328
+ for (let item of fields) {
2329
+ namearray.push(item.colName);
2330
+ }
2331
+ this.excludeFields = differenceWith(array, namearray);
2332
+ if (this.excludeFields.length &&
2333
+ this.config.groupSettings &&
2334
+ this.config.groupSettings.length) {
2335
+ for (let i = 0; i < this.excludeFields.length; i++) {
2336
+ const el = this.excludeFields[i];
2337
+ if (startsWith(el, this.config.groupSettings[0].name + "_")) {
2338
+ this.excludeFields.splice(i, 1);
2339
+ i--;
2340
+ }
2341
+ }
2342
+ }
2343
+ }
2344
+ getInfo() {
2345
+ this.datePipeFormat = localStorage.getItem("datePipe");
2346
+ this.translation = JSON.parse(localStorage.getItem("translation"));
2347
+ L10n.load({
2348
+ "en-US": {
2349
+ pivotview: AGGREGATE_TYPES_TEXT,
2350
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
2351
+ },
2352
+ zh: {
2353
+ pivotview: AGGREGATE_TYPES_TEXT,
2354
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
2355
+ },
2356
+ "zh-Hant-HK": {
2357
+ pivotview: AGGREGATE_TYPES_TEXT,
2358
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
2359
+ },
2360
+ ja: {
2361
+ pivotview: AGGREGATE_TYPES_TEXT,
2362
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
2363
+ },
2364
+ ko: {
2365
+ pivotview: AGGREGATE_TYPES_TEXT,
2366
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
2367
+ },
2368
+ fr: {
2369
+ pivotview: AGGREGATE_TYPES_TEXT,
2370
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
2371
+ },
2372
+ });
2373
+ }
2374
+ onFieldDrop(args) {
2375
+ //change the calcualteField method use the corresponding calculate
2376
+ const calcualteField = this.configFields.filter((el) => el.colName === args.fieldName && el.isCalculatedField);
2377
+ if (calcualteField.length > 0) {
2378
+ args.dropField.type =
2379
+ this.dashboardPorletsService.getCalculateMethod(calcualteField[0].colName);
2380
+ args.dropField.caption = args.dropField.caption
2381
+ .replace("Calculate", "")
2382
+ .trim();
2383
+ }
2384
+ for (let i = 0; i < args.dataSourceSettings.filterSettings.length; i++) {
2385
+ if (args.dataSourceSettings.filterSettings[i].name ===
2386
+ args.fieldName &&
2387
+ args.dropAxis === "") {
2388
+ args.dataSourceSettings.filterSettings.splice(i, 1);
2389
+ this.filterSettings = args.dataSourceSettings.filterSettings;
2390
+ break;
2391
+ }
2392
+ }
2393
+ }
2394
+ createButtonText(field, i, axis, valuePos) {
2395
+ let buttonText;
2396
+ let aggregation;
2397
+ let filterMem;
2398
+ if (axis === "filters") {
2399
+ filterMem = this.fieldlistObj.pivotButtonModule.updateButtontext(field[i].name);
2400
+ }
2401
+ let engineModule = this.pivotObj.engineModule;
2402
+ if (engineModule.fieldList[field[i].name] !== undefined) {
2403
+ aggregation = engineModule.fieldList[field[i].name].aggregateType;
2404
+ aggregation =
2405
+ aggregation === "Sum"
2406
+ ? engineModule.fieldList[field[i].name].type !== "number"
2407
+ ? "Count"
2408
+ : "Sum"
2409
+ : aggregation;
2410
+ }
2411
+ let text = field[i].caption ? field[i].caption : field[i].name;
2412
+ buttonText = createElement("span", {
2413
+ attrs: {
2414
+ title: axis === "filters"
2415
+ ? text + " (" + filterMem + ")"
2416
+ : !this.pivotObj.dataSourceSettings
2417
+ .showAggregationOnValueField ||
2418
+ axis !== "values" ||
2419
+ aggregation === "CalculatedField"
2420
+ ? text
2421
+ : this.pivotObj.localeObj.getConstant(aggregation) +
2422
+ " " +
2423
+ this.pivotObj.localeObj.getConstant("of") +
2424
+ " " +
2425
+ text,
2426
+ tabindex: "-1",
2427
+ "aria-disabled": "false",
2428
+ oncontextmenu: "return false;",
2429
+ "data-type": valuePos === i ? "" : aggregation,
2430
+ },
2431
+ className: "e-content" +
2432
+ " " +
2433
+ (this.pivotObj.getModuleName() === "pivotview"
2434
+ ? this.pivotObj.groupingBarSettings.allowDragAndDrop &&
2435
+ field[i].allowDragAndDrop
2436
+ ? ""
2437
+ : "e-disable-drag"
2438
+ : ""),
2439
+ innerHTML: axis === "filters"
2440
+ ? text + " (" + filterMem + ")"
2441
+ : !this.pivotObj.dataSourceSettings
2442
+ .showAggregationOnValueField ||
2443
+ axis !== "values" ||
2444
+ aggregation === "CalculatedField"
2445
+ ? text
2446
+ : this.pivotObj.localeObj.getConstant(aggregation) +
2447
+ " " +
2448
+ this.pivotObj.localeObj.getConstant("of") +
2449
+ " " +
2450
+ text,
2451
+ });
2452
+ return buttonText;
2453
+ }
2454
+ // Calculated field事件:创建
2455
+ calculatedFieldCreate(args) {
2456
+ if (args.calculatedField.name !== "" &&
2457
+ args.calculatedField.name.trim() !== "") {
2458
+ let index = this.fieldlistObj.dataSourceSettings.calculatedFieldSettings.findIndex((el) => el.name === args.calculatedField.name);
2459
+ if (index !== -1) {
2460
+ if (args.calculatedField.formatString === "") {
2461
+ this.fieldlistObj.dataSourceSettings.calculatedFieldSettings[index].formatString = "N2";
2462
+ }
2463
+ else {
2464
+ this.fieldlistObj.dataSourceSettings.calculatedFieldSettings[index].formatString = args.calculatedField.formatString;
2465
+ }
2466
+ }
2467
+ else {
2468
+ if (args.calculatedField.formatString === "") {
2469
+ args.calculatedField.formatString = "N2";
2470
+ }
2471
+ }
2472
+ // 移除重复
2473
+ let fIndex = this.customCalculatedFields.findIndex((f) => f.name === args.calculatedField.name);
2474
+ if (fIndex > -1) {
2475
+ this.customCalculatedFields.splice(fIndex, 1);
2476
+ }
2477
+ // 匹配运算符 First || Last
2478
+ let formulaStr = args.calculatedField.formula;
2479
+ let reg1 = /"First\((.+?)\)"/g;
2480
+ let reg2 = /"Last\((.+?)\)"/g;
2481
+ if (reg1.test(formulaStr) || reg2.test(formulaStr)) {
2482
+ // 判断是否存在First || Last 表达式
2483
+ let matchFirstFields = Array.from(formulaStr["matchAll"](/"First\((.+?)\)"/g), (m) => {
2484
+ return {
2485
+ matchStr: m[0],
2486
+ matchWord: m[1],
2487
+ replaceValue: "",
2488
+ matchMethod: "First",
2489
+ };
2490
+ });
2491
+ let matchLastFields = Array.from(formulaStr["matchAll"](/"Last\((.+?)\)"/g), (m) => {
2492
+ return {
2493
+ matchStr: m[0],
2494
+ matchWord: m[1],
2495
+ replaceValue: "",
2496
+ matchMethod: "Last",
2497
+ };
2498
+ });
2499
+ let matchMaxFields = Array.from(formulaStr["matchAll"](/"Max\((.+?)\)"/g), (m) => {
2500
+ return {
2501
+ matchStr: m[0],
2502
+ matchWord: m[1],
2503
+ replaceValue: "",
2504
+ matchMethod: "Max",
2505
+ };
2506
+ });
2507
+ let matchMinFields = Array.from(formulaStr["matchAll"](/"Min\((.+?)\)"/g), (m) => {
2508
+ return {
2509
+ matchStr: m[0],
2510
+ matchWord: m[1],
2511
+ replaceValue: "",
2512
+ matchMethod: "Min",
2513
+ };
2514
+ });
2515
+ let matchSumFields = Array.from(formulaStr["matchAll"](/"Sum\((.+?)\)"/g), (m) => {
2516
+ return {
2517
+ matchStr: m[0],
2518
+ matchWord: m[1],
2519
+ replaceValue: "",
2520
+ matchMethod: "Sum",
2521
+ };
2522
+ });
2523
+ let matchAvgFields = Array.from(formulaStr["matchAll"](/"Avg\((.+?)\)"/g), (m) => {
2524
+ return {
2525
+ matchStr: m[0],
2526
+ matchWord: m[1],
2527
+ replaceValue: "",
2528
+ matchMethod: "Avg",
2529
+ };
2530
+ });
2531
+ if (matchFirstFields.every((x) => this.allowedCalculatedFields.includes(x.matchWord)) &&
2532
+ matchLastFields.every((x) => this.allowedCalculatedFields.includes(x.matchWord))) {
2533
+ // 判断First和Last表达式内的字段是否合法
2534
+ this.customCalculatedFields.push({
2535
+ name: args.calculatedField.name,
2536
+ formula: args.calculatedField.formula,
2537
+ matchFields: [
2538
+ // @ts-ignore
2539
+ ...matchFirstFields,
2540
+ ...matchLastFields,
2541
+ ...matchMaxFields,
2542
+ ...matchMinFields,
2543
+ ...matchSumFields,
2544
+ ...matchAvgFields,
2545
+ ],
2546
+ grandTotal: 0,
2547
+ });
2548
+ let fieldName = (formulaStr.split("First(")[1] ||
2549
+ formulaStr.split("Last(")[1]).split(")")[0];
2550
+ args.calculatedField.formula =
2551
+ "'\"" + "Sum(" + fieldName + ')"=' + formulaStr + "'";
2552
+ }
2553
+ }
2554
+ }
2555
+ }
2556
+ // Calculated field事件:完成
2557
+ actionComplete(args) {
2558
+ if (args.actionName == "Field removed") {
2559
+ if (args.fieldInfo &&
2560
+ args.fieldInfo.fieldItem &&
2561
+ args.fieldInfo.fieldItem.type == "CalculatedField") {
2562
+ let field = args.fieldInfo.fieldName;
2563
+ // Remove the deleted calculated field from an stored array.
2564
+ this.customCalculatedFields =
2565
+ this.customCalculatedFields.filter(function (obj) {
2566
+ return obj.name !== field;
2567
+ });
2568
+ }
2569
+ }
2570
+ }
2571
+ // Calculated field事件:开始
2572
+ actionBegin(args) {
2573
+ if (args.actionName === "Edit calculated field") {
2574
+ for (let i = 0; i < this.customCalculatedFields.length; i++) {
2575
+ if (this.customCalculatedFields[i].name &&
2576
+ this.pivotObj.engineModule.fieldList[this.customCalculatedFields[i].name]) {
2577
+ this.pivotObj.engineModule.fieldList[this.customCalculatedFields[i].name].formula = this.customCalculatedFields[i].formula;
2578
+ }
2579
+ }
2580
+ }
2581
+ }
2582
+ resizeStop(args) {
2583
+ if (this.config.columnsWidth) {
2584
+ const header_field = this.config.columnsWidth.filter((el) => el.headerText === args.column.headerText);
2585
+ if (header_field.length > 0) {
2586
+ header_field[0].width = parseInt(args.column.width);
2587
+ }
2588
+ else {
2589
+ this.config.columnsWidth.push({
2590
+ headerText: args.column.headerText,
2591
+ width: parseInt(args.column.width),
2592
+ });
2593
+ }
2594
+ }
2595
+ else {
2596
+ this.config.columnsWidth = [];
2597
+ this.config.columnsWidth.push({
2598
+ headerText: args.column.headerText,
2599
+ width: parseInt(args.column.width),
2600
+ });
2601
+ }
2602
+ const portlet = this.portlet;
2603
+ portlet.config = JSON.stringify(this.config);
2604
+ const index = this.portlets.findIndex((x) => x.newId === portlet.newId);
2605
+ if (index > -1)
2606
+ this.portlets[index] = portlet;
2607
+ }
2608
+ onLoad() { }
2609
+ enginePopulated(args) {
2610
+ let clonedValues;
2611
+ let currentPivotValues = this.getClonedPivotValues(this.pivotObj.engineModule.pivotValues);
2612
+ let pageSettings = this.pivotObj.engineModule.pageSettings;
2613
+ // this.pivotObj.engineModule.pageSettings = null;
2614
+ if (this.pivotObj.engineModule.generateGridData) {
2615
+ this.pivotObj.engineModule.generateGridData(this.pivotObj.dataSourceSettings, true);
2616
+ clonedValues = this.getClonedPivotValues(this.pivotObj.engineModule.pivotValues);
2617
+ this.pivotObj.engineModule.pivotValues = currentPivotValues;
2618
+ this.pivotObj.engineModule.pageSettings = pageSettings;
2619
+ // Here "clonedValues" contains the whole pivot values.
2620
+ this.allDataValue = clonedValues;
2621
+ }
2622
+ }
2623
+ getClonedPivotValues(pivotValues) {
2624
+ let clonedSets = [];
2625
+ if (pivotValues && pivotValues.length) {
2626
+ for (let i = 0; i < pivotValues.length; i++) {
2627
+ if (pivotValues[i]) {
2628
+ clonedSets[i] = [];
2629
+ for (let j = 0; j < pivotValues[i].length; j++) {
2630
+ if (pivotValues[i][j]) {
2631
+ /* eslint-disable */
2632
+ clonedSets[i][j] = this.getClonedPivotValueObj(pivotValues[i][j]);
2633
+ /* eslint-enable */
2634
+ }
2635
+ }
2636
+ }
2637
+ }
2638
+ }
2639
+ return clonedSets;
2640
+ }
2641
+ getClonedPivotValueObj(data) {
2642
+ let keyPos = 0;
2643
+ let framedSet = {};
2644
+ if (!(data === null || data === undefined)) {
2645
+ let fields = Object.keys(data);
2646
+ while (keyPos < fields.length) {
2647
+ framedSet[fields[keyPos]] = data[fields[keyPos]];
2648
+ keyPos++;
2649
+ }
2650
+ }
2651
+ else {
2652
+ framedSet = data;
2653
+ }
2654
+ return framedSet;
2655
+ }
2656
+ //#region Filtering the TreeNodes
2657
+ searchNodes(args) {
2658
+ let _text = args.maskedValue;
2659
+ let predicats = [], _array = [], _filter = [];
2660
+ if (_text == "") {
2661
+ this.changeDataSource(this.fieldlistObj.treeViewModule.getTreeData());
2662
+ }
2663
+ else {
2664
+ let predicate = new Predicate("caption", "contains", _text, true);
2665
+ let filteredList = new DataManager(this.fieldlistObj.treeViewModule.getTreeData()).executeLocal(new Query().where(predicate));
2666
+ for (let j = 0; j < filteredList.length; j++) {
2667
+ _filter.push(filteredList[j]["id"]);
2668
+ let filters = this.getFilterItems(filteredList[j], this.fieldlistObj.treeViewModule.getTreeData());
2669
+ for (let i = 0; i < filters.length; i++) {
2670
+ if (_array.indexOf(filters[i]) == -1 &&
2671
+ filters[i] != null) {
2672
+ _array.push(filters[i]);
2673
+ predicats.push(new Predicate("id", "equal", filters[i], false));
2674
+ }
2675
+ }
2676
+ }
2677
+ if (predicats.length == 0) {
2678
+ this.changeDataSource([]);
2679
+ }
2680
+ else {
2681
+ let query = new Query().where(Predicate.or(predicats));
2682
+ let newList = new DataManager(this.fieldlistObj.treeViewModule.getTreeData()).executeLocal(query);
2683
+ this.changeDataSource(newList);
2684
+ }
2685
+ }
2686
+ }
2687
+ //Find the Parent Nodes for corresponding childs
2688
+ getFilterItems(fList, list) {
2689
+ let nodes = [];
2690
+ nodes.push(fList["id"]);
2691
+ let query2 = new Query().where("id", "equal", fList["pid"], false);
2692
+ let fList1 = new DataManager(list).executeLocal(query2);
2693
+ if (fList1.length != 0) {
2694
+ let pNode = this.getFilterItems(fList1[0], list);
2695
+ for (let i = 0; i < pNode.length; i++) {
2696
+ if (nodes.indexOf(pNode[i]) == -1 && pNode[i] != null)
2697
+ nodes.push(pNode[i]);
2698
+ }
2699
+ return nodes;
2700
+ }
2701
+ return nodes;
2702
+ }
2703
+ created(args) {
2704
+ if (this.fieldlistObj && !this.fieldlistObj.engineModule.fields) {
2705
+ this.fieldlistObj.engineModule.fields = [];
2706
+ }
2707
+ let search = document.createElement("input");
2708
+ search.id = "pivotSearchBox" + this.fieldlistObj.element.id;
2709
+ let el = document.querySelector("#" + this.fieldlistObj.element.id + "_Container .e-field-table");
2710
+ if (el)
2711
+ el.prepend(search);
2712
+ this.pivotSearchBox = new MaskedTextBox({
2713
+ placeholder: this.translation.SEARCH || ".SEARCH",
2714
+ cssClass: "pivot-search",
2715
+ change: this.searchNodes.bind(this),
2716
+ });
2717
+ this.pivotSearchBox.appendTo("#pivotSearchBox" + this.fieldlistObj.element.id);
2718
+ // NEW Dashboard 点击"apply"时,请求新数据
2719
+ let applyBtn = document.getElementById(this.fieldlistObj.element.id + "_DeferUpdateButton1");
2720
+ applyBtn &&
2721
+ applyBtn.addEventListener("click", () => {
2722
+ this.pbf.pageLoading = true;
2723
+ this.dashboardPorletsService.getDataByPortletsNew([this.portlet], () => {
2724
+ this.getData();
2725
+ setTimeout(() => {
2726
+ this.pbf.pageLoading = false;
2727
+ });
2728
+ }, null, false, this.dashboard, false);
2729
+ });
2730
+ }
2731
+ fieldListRefreshed(args) {
2732
+ if (this.pivotSearchBox) {
2733
+ this.pivotSearchBox.value = "";
2734
+ this.changeDataSource(this.fieldlistObj.treeViewModule.getTreeData());
2735
+ }
2736
+ }
2737
+ changeDataSource(data) {
2738
+ let fieldTable = this.fieldlistObj.treeViewModule.fieldTable;
2739
+ if (fieldTable) {
2740
+ fieldTable.fields = {
2741
+ dataSource: data,
2742
+ id: "id",
2743
+ text: "caption",
2744
+ isChecked: "isSelected",
2745
+ parentID: "pid",
2746
+ iconCss: "spriteCssClass",
2747
+ };
2748
+ }
2749
+ }
2750
+ //SMP2-2957 fix the date issue on the raw data
2751
+ drillThrough(args) {
2752
+ for (let i = 0; i < args.gridColumns.length; i++) {
2753
+ const data = this.configFields.filter((el) => el.colName === args.gridColumns[i].field);
2754
+ if (data && data.length > 0) {
2755
+ if (data[0].dataType === "date" ||
2756
+ data[0].dataType === "datetime") {
2757
+ args.gridColumns[i].type = "date";
2758
+ }
2759
+ }
2760
+ }
2761
+ }
2762
+ //#endregion
2763
+ setFontSettingConditional(obj, data, code) {
2764
+ if (code === -1) {
2765
+ obj.style.color = data.negaFontColor;
2766
+ obj.style.fontFamily = data.negaFontFamilyValue;
2767
+ obj.style.fontSize = data.negaFontSizeValue;
2768
+ obj.style.backgroundColor = data.negaBackgroundColor;
2769
+ }
2770
+ else {
2771
+ obj.style.color = data.fontColor;
2772
+ obj.style.fontFamily = data.fontFamilyValue;
2773
+ obj.style.fontSize = data.fontSizeValue;
2774
+ obj.style.backgroundColor = data.backgroundColor;
2775
+ }
2776
+ }
2777
+ setCompareConditional(negaConditionalFormatObj, conditionalFormatObj, data) {
2778
+ if (Math.sign(data.compareValue1) == 0) {
2779
+ switch (data.compareSelect) {
2780
+ case "LessThan": // 小于
2781
+ case "LessThanOrEqualTo": // 小于等于
2782
+ negaConditionalFormatObj.value1 = 0;
2783
+ negaConditionalFormatObj.conditions = "LessThan";
2784
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2785
+ break;
2786
+ case "GreaterThan": // 大于
2787
+ case "GreaterThanOrEqualTo": // 大于等于
2788
+ conditionalFormatObj.value1 = 0;
2789
+ conditionalFormatObj.conditions = "GreaterThan";
2790
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2791
+ break;
2792
+ case "NotEquals": // 不等于
2793
+ negaConditionalFormatObj.value1 = 0;
2794
+ negaConditionalFormatObj.conditions = "LessThan";
2795
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2796
+ conditionalFormatObj.value1 = 0;
2797
+ conditionalFormatObj.conditions = "GreaterThan";
2798
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2799
+ break;
2800
+ case "Between": // value1<= val <=value2
2801
+ if (Math.sign(data.compareValue2) === 1) {
2802
+ conditionalFormatObj.value1 = 0;
2803
+ conditionalFormatObj.value2 = Number(data.compareValue2);
2804
+ conditionalFormatObj.conditions = "Between";
2805
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2806
+ }
2807
+ break;
2808
+ case "NotBetween": // val >= value2, val <= value1
2809
+ if (Math.sign(data.compareValue2) === 1) {
2810
+ conditionalFormatObj.value1 = Number(data.compareValue2);
2811
+ conditionalFormatObj.conditions = "GreaterThan";
2812
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2813
+ negaConditionalFormatObj.value1 = 0;
2814
+ negaConditionalFormatObj.conditions = "LessThan";
2815
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2816
+ }
2817
+ break;
2818
+ default:
2819
+ break;
2820
+ }
2821
+ }
2822
+ else if (Math.sign(data.compareValue1) === 1) {
2823
+ switch (data.compareSelect) {
2824
+ case "LessThan": // 小于
2825
+ case "LessThanOrEqualTo": // 小于等于
2826
+ conditionalFormatObj.value1 = 0;
2827
+ conditionalFormatObj.value2 = Number(data.compareValue1);
2828
+ conditionalFormatObj.conditions = "Between";
2829
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2830
+ negaConditionalFormatObj.value1 = 0;
2831
+ negaConditionalFormatObj.conditions = "LessThan";
2832
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2833
+ break;
2834
+ case "GreaterThan": // 大于
2835
+ case "GreaterThanOrEqualTo": // 大于等于
2836
+ conditionalFormatObj.value1 = Number(data.compareValue1);
2837
+ conditionalFormatObj.conditions = "GreaterThan";
2838
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2839
+ break;
2840
+ case "Equals": // 等于
2841
+ conditionalFormatObj.value1 = Number(data.compareValue1);
2842
+ conditionalFormatObj.conditions = "Equals";
2843
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2844
+ break;
2845
+ case "NotEquals": // 不等于
2846
+ conditionalFormatObj.value1 = 0;
2847
+ conditionalFormatObj.value2 = Number(data.compareValue1);
2848
+ conditionalFormatObj.conditions = "Between";
2849
+ // push进数组
2850
+ conditionalFormatObj.value1 = Number(data.compareValue1);
2851
+ conditionalFormatObj.conditions = "GreaterThan";
2852
+ // push进数组
2853
+ negaConditionalFormatObj.value1 = 0;
2854
+ negaConditionalFormatObj.conditions = "LessThanOrEqualTo";
2855
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2856
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2857
+ break;
2858
+ case "Between": // value1<= val <=value2
2859
+ if (Math.sign(data.compareValue2) === 1) {
2860
+ conditionalFormatObj.value1 = Number(data.compareValue1);
2861
+ conditionalFormatObj.value2 = Number(data.compareValue2);
2862
+ conditionalFormatObj.conditions = "Between";
2863
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2864
+ }
2865
+ break;
2866
+ case "NotBetween": // val >= value2, val <= value1
2867
+ if (Math.sign(data.compareValue2) === 1) {
2868
+ conditionalFormatObj.value1 = 0;
2869
+ conditionalFormatObj.value2 = Number(data.compareValue1);
2870
+ conditionalFormatObj.conditions = "Between";
2871
+ // push进数组
2872
+ conditionalFormatObj.value1 = Number(data.compareValue2);
2873
+ conditionalFormatObj.conditions = "GreaterThan";
2874
+ // push进数组
2875
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2876
+ }
2877
+ break;
2878
+ default:
2879
+ break;
2880
+ }
2881
+ }
2882
+ else if (Math.sign(data.compareValue1) === -1) {
2883
+ switch (data.compareSelect) {
2884
+ case "LessThan": // 小于
2885
+ case "LessThanOrEqualTo": // 小于等于
2886
+ negaConditionalFormatObj.value1 = data.compareValue1;
2887
+ negaConditionalFormatObj.conditions = data.compareSelect;
2888
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2889
+ break;
2890
+ case "GreaterThan": // 大于
2891
+ case "GreaterThanOrEqualTo": // 大于等于
2892
+ conditionalFormatObj.value1 = 0;
2893
+ conditionalFormatObj.conditions = "GreaterThanOrEqualTo";
2894
+ negaConditionalFormatObj.value1 = 0;
2895
+ negaConditionalFormatObj.value2 = data.compareValue1;
2896
+ negaConditionalFormatObj.conditions = "Between";
2897
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2898
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2899
+ break;
2900
+ case "Equals": // 等于
2901
+ negaConditionalFormatObj.value1 = data.compareValue1;
2902
+ negaConditionalFormatObj.conditions = "Equals";
2903
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2904
+ case "NotEquals": // 不等于
2905
+ negaConditionalFormatObj.value1 = data.compareValue1;
2906
+ negaConditionalFormatObj.conditions = "NotEquals";
2907
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2908
+ conditionalFormatObj.value1 = 0;
2909
+ conditionalFormatObj.conditions = "GreaterThan";
2910
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2911
+ break;
2912
+ case "Between": // value1<= val <=value2
2913
+ if (Math.sign(data.compareValue2)) {
2914
+ negaConditionalFormatObj.value1 = 0;
2915
+ negaConditionalFormatObj.value2 = data.compareValue1;
2916
+ negaConditionalFormatObj.conditions = "Between";
2917
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2918
+ conditionalFormatObj.value1 = 0;
2919
+ conditionalFormatObj.value2 = data.compareValue2;
2920
+ conditionalFormatObj.conditions = "Between";
2921
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2922
+ }
2923
+ else {
2924
+ negaConditionalFormatObj.value1 = data.compareValue1;
2925
+ negaConditionalFormatObj.value2 = data.compareValue2;
2926
+ negaConditionalFormatObj.conditions = "Between";
2927
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2928
+ }
2929
+ break;
2930
+ case "NotBetween": // val >= value2, val <= value1
2931
+ if (Math.sign(data.compareValue2)) {
2932
+ negaConditionalFormatObj.value1 = data.compareValue1;
2933
+ negaConditionalFormatObj.conditions = "LessThan";
2934
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2935
+ conditionalFormatObj.value1 = data.compareValue2;
2936
+ conditionalFormatObj.conditions = "GreaterThan";
2937
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2938
+ }
2939
+ else {
2940
+ negaConditionalFormatObj.value1 = data.compareValue1;
2941
+ negaConditionalFormatObj.value2 = data.compareValue2;
2942
+ negaConditionalFormatObj.conditions = "NotBetween";
2943
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2944
+ conditionalFormatObj.value1 = 0;
2945
+ conditionalFormatObj.conditions = "GreaterThan";
2946
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2947
+ }
2948
+ break;
2949
+ default:
2950
+ break;
2951
+ }
2952
+ }
2953
+ }
2954
+ /**
2955
+ * @param timeArray 数组对象 [{"date":"2021-01-01"},{"date":"2021-02-01"}]
2956
+ * @param endDate 截至时间
2957
+ * @param interval 时间间隔 year / quarter / month
2958
+ * @param timeKey 时间字段名 date
2959
+ * @returns 划分后的时间分组对象
2960
+ */
2961
+ getTimeRanges(timeArray, endDate, interval, timeKey) {
2962
+ // 将时间字符串转换为 moment 对象
2963
+ const dates = timeArray.map((item) => moment(item[timeKey || "date"]));
2964
+ // 分隔符
2965
+ const delimiter = "-";
2966
+ // 找到最小时间和最大时间
2967
+ const minDate = moment.min(dates);
2968
+ const maxDate = moment(endDate);
2969
+ // 初始化结果对象
2970
+ const result = {};
2971
+ // 根据入参进行划分
2972
+ if (interval === "year") {
2973
+ const startYear = minDate.year();
2974
+ const endYear = maxDate.year();
2975
+ for (let year = startYear; year <= endYear; year++) {
2976
+ result[year] = [];
2977
+ }
2978
+ dates.forEach((date, index) => {
2979
+ const year = date.year();
2980
+ result[year].push(timeArray[index]);
2981
+ });
2982
+ }
2983
+ else if (interval === "quarter") {
2984
+ // 存储季度字符串
2985
+ const quarters = [];
2986
+ // 逐一遍历每个季度
2987
+ for (let currentDate = minDate.clone(); currentDate.isSameOrBefore(maxDate); currentDate.add(3, "months")) {
2988
+ const year = currentDate.year();
2989
+ const quarter = Math.ceil((currentDate.month() + 1) / 3); // 计算季度
2990
+ quarters.push(`${year}${delimiter}Q${quarter}`); // 格式化并添加到数组
2991
+ }
2992
+ // 输出所有季度
2993
+ quarters.forEach((quarter, index) => {
2994
+ result[quarter] = [];
2995
+ });
2996
+ dates.forEach((date, index) => {
2997
+ const year = date.year();
2998
+ const quarter = date.quarter(); // 获取季度
2999
+ if (quarter === 1)
3000
+ result[year + delimiter + "Q1"].push(timeArray[index]);
3001
+ else if (quarter === 2)
3002
+ result[year + delimiter + "Q2"].push(timeArray[index]);
3003
+ else if (quarter === 3)
3004
+ result[year + delimiter + "Q3"].push(timeArray[index]);
3005
+ else if (quarter === 4)
3006
+ result[year + delimiter + "Q4"].push(timeArray[index]);
3007
+ });
3008
+ }
3009
+ else if (interval === "month") {
3010
+ // 存储月份字符串
3011
+ const months = [];
3012
+ // 逐一遍历每个月
3013
+ for (let currentDate = minDate.clone(); currentDate.isSameOrBefore(maxDate); currentDate.add(1, "months")) {
3014
+ months.push(currentDate.format(`YYYY${delimiter}MM`)); // 格式化并添加到数组
3015
+ }
3016
+ // 输出所有月份
3017
+ months.forEach((month, index) => {
3018
+ result[month] = [];
3019
+ });
3020
+ dates.forEach((date, index) => {
3021
+ const year = date.year();
3022
+ const month = (date.month() + 1).toString().padStart(2, "0"); // 0-11
3023
+ result[year + delimiter + month].push(timeArray[index]);
3024
+ });
3025
+ }
3026
+ return result;
3027
+ }
3028
+ /**
3029
+ * 计算几何算数平方更
3030
+ * @param values 数组 [0, 0, 0.2575]
3031
+ * @returns
3032
+ */
3033
+ calculateGrowthRate(values) {
3034
+ const product = values.reduce((acc, val) => acc * (1 + val), 1);
3035
+ if (product >= 0) {
3036
+ return Math.pow(product, 1 / values.length) - 1;
3037
+ }
3038
+ else if (product < 0) {
3039
+ if (values.length % 2 == 0) {
3040
+ return null;
3041
+ }
3042
+ else {
3043
+ return this.nthroot(product, values.length) - 1;
3044
+ }
3045
+ }
3046
+ }
3047
+ nthroot(x, n) {
3048
+ let ng = n % 2;
3049
+ if (ng == 1 || x < 0)
3050
+ x = -x;
3051
+ var r = Math.pow(x, 1 / n);
3052
+ n = Math.pow(r, n);
3053
+ if (Math.abs(x - n) < 1 && x > 0 === n > 0)
3054
+ return ng ? -r : r;
3055
+ }
3056
+ /**
3057
+ * 标准偏差
3058
+ * @param values 数组 [0, 0, -0.4775]
3059
+ * @returns 0.2756847535380463
3060
+ */
3061
+ calculateStandardDeviation(values) {
3062
+ const n = values.length;
3063
+ // 检查数据点数量
3064
+ if (n < 2) {
3065
+ throw new Error("至少需要两个数据点来计算样本标准偏差");
3066
+ }
3067
+ // 计算均值
3068
+ const mean = values.reduce((acc, val) => acc + val, 0) / n;
3069
+ // 计算方差
3070
+ const variance = values.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) /
3071
+ (n - 1);
3072
+ // 返回标准偏差
3073
+ return Math.sqrt(variance);
3074
+ }
3075
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GadgetPivotChartComponent, deps: [{ token: i1.DashboardPorletsService }, { token: i2.DashboardService }, { token: i0.ChangeDetectorRef }, { token: PBF_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component });
3076
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GadgetPivotChartComponent, selector: "rs-gadget-pivot-chart", inputs: { portlet: "portlet", dashboard: "dashboard", portlets: "portlets" }, outputs: { updatePorletConfig: "updatePorletConfig" }, providers: [
3077
+ ToolbarService,
3078
+ FieldListService,
3079
+ NumberFormattingService,
3080
+ CalculatedFieldService,
3081
+ GroupingBarService,
3082
+ VirtualScrollService,
3083
+ DrillThroughService,
3084
+ ], viewQueries: [{ propertyName: "pivotObj", first: true, predicate: ["pivotview"], descendants: true }, { propertyName: "fieldlistObj", first: true, predicate: ["pivotfieldlist"], descendants: true }], ngImport: i0, template: "<div class=\"control-section\" style=\"overflow: hidden; height: 100%\">\r\n\t<ejs-pivotview\r\n\t\twidth=\"100%\"\r\n\t\theight=\"100%\"\r\n\t\tstyle=\"display: block\"\r\n\t\t[dataSourceSettings]=\"dataSourceSettings\"\r\n\t\t#pivotview\r\n\t\t(dataBound)=\"dataBound($event)\"\r\n\t\tenableValueSorting=\"true\"\r\n\t\tallowConditionalFormatting=\"true\"\r\n\t\tallowExcelExport=\"true\"\r\n\t\tallowGrouping=\"true\"\r\n\t\t[zoomSettings]=\"zoomSettings\"\r\n\t\tenableVirtualization=\"true\"\r\n\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t(cellClick)=\"cellClick($event)\"\r\n\t\tallowDrillThrough=\"true\"\r\n\t\t(actionFailure)=\"actionFailure($event)\"\r\n\t\t(fieldListRefreshed)=\"fieldListRefreshed($event)\"\r\n\t\t(drillThrough)=\"drillThrough($event)\"\r\n\t\t[chartSettings]=\"chartSettings\"\r\n\t\t(chartSeriesCreated)=\"chartSeriesCreated($event)\"\r\n\t\t[displayOption]=\"displayOption\"\r\n\t\t[showTooltip]=\"false\"\r\n\t\t(enginePopulated)=\"afterEnginePopulate($event)\"\r\n\t\t(beforeExport)=\"beforeExport($event)\"\r\n\t>\r\n\t</ejs-pivotview>\r\n\r\n\t<div class=\"pivotfieldlist-control\">\r\n\t\t<ejs-pivotfieldlist\r\n\t\t\t[id]=\"portlet.newId\"\r\n\t\t\t#pivotfieldlist\r\n\t\t\thidden=\"true\"\r\n\t\t\tenableValueSorting=\"true\"\r\n\t\t\tshowFieldList=\"true\"\r\n\t\t\tallowCalculatedField=\"true\"\r\n\t\t\tallowDeferLayoutUpdate=\"true\"\r\n\t\t\trenderMode=\"Popup\"\r\n\t\t\t(enginePopulated)=\"afterPopulate($event)\"\r\n\t\t\t(memberEditorOpen)=\"onMemberEditorOpen($event)\"\r\n\t\t\t(enginePopulating)=\"enginePopulating($event)\"\r\n\t\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t\t(fieldDrop)=\"onFieldDrop($event)\"\r\n\t\t\t(actionComplete)=\"actionComplete($event)\"\r\n\t\t\t(actionBegin)=\"actionBegin($event)\"\r\n\t\t\t(calculatedFieldCreate)=\"calculatedFieldCreate($event)\"\r\n\t\t\t(load)=\"onLoad()\"\r\n\t\t\t(created)=\"created($event)\"\r\n\t\t>\r\n\t\t</ejs-pivotfieldlist>\r\n\t</div>\r\n\t<div class=\"full-box-mask\" *ngIf=\"pageLoading\">\r\n\t\t<mat-spinner\r\n\t\t\tstyle=\"z-index: 999\"\r\n\t\t\tmode=\"indeterminate\"\r\n\t\t\t[diameter]=\"24\"\r\n\t\t></mat-spinner>\r\n\t</div>\r\n</div>\r\n", styles: [".pivotview{width:100%;height:100%}.gadgetBar ul{margin:0;padding:0;list-style:none;display:inline-block;background:#fff;border-radius:5px}.gadgetBar ul li{display:inline-block;width:45px;height:39px;line-height:39px;text-align:center;cursor:pointer}:host::ng-deep .e-cellvalue{color:unset!important}:host ::ng-deep .e-pivotview .e-gtot{font-weight:400!important}:host ::ng-deep .e-pivotview .odd-class{background-color:#f8fafb!important}:host ::ng-deep .e-pivotview .odd-class .e-cellvalue{font-size:13px;font-weight:400!important}:host ::ng-deep .e-pivotview .even-class{background-color:#fff!important}:host ::ng-deep .e-pivotview .even-class .e-cellvalue{font-size:13px;font-weight:400!important}:host ::ng-deep .e-pivotview .grand-class{background-color:#eaedf0!important}:host ::ng-deep .e-pivotview .grand-class .e-cellvalue{font-size:13px;font-weight:700!important}:host ::ng-deep .e-headercell{background-color:#eaedf0!important}:host ::ng-deep .e-headercell .e-headertext{font-size:12px!important}:host ::ng-deep .e-columnsheader{background-color:#f8fafb!important}.logoImg{position:absolute!important;left:10px!important}:host ::ng-deep .image-{height:55px;width:55px;border-radius:50px;overflow:hidden;margin:5px 5px 5px 0;display:inline-flex;justify-content:center;align-items:center}:host ::ng-deep .image- img{width:55px}:host::ng-deep .e-pivotview .e-customclass .e-cellvalue{font-weight:700!important}:host::ng-deep .e-gridcontent .e-rowcell .e-cellvalue{background-color:transparent!important}:host ::ng-deep .control-section .e-spin-show,:host ::ng-deep .control-section .e-spinner-pane{display:none!important}:host ::ng-deep .control-section .e-control.e-grid,:host ::ng-deep .control-section .e-control.e-pivotchart{height:100%!important}:host ::ng-deep .control-section .e-pivotview{border:none!important}:host ::ng-deep .control-section .e-pivotview tr{height:32px!important}:host ::ng-deep .control-section .e-pivotview tr th{height:40px!important;background:#eaedf0!important}:host ::ng-deep .control-section .e-pivotview .e-grid.e-default.e-bothlines .e-headercell{border-right:none!important;border-left:none!important}:host ::ng-deep .control-section .e-pivotview .e-table{border-right:none!important}:host ::ng-deep .control-section .e-pivotview svg{outline:none!important}:host ::ng-deep .control-section .e-pivotview svg>g>rect{stroke-width:0!important}:host ::ng-deep .control-section .e-pivotview .e-gridcontent .e-rowcell{border-right:none!important;border-left:none!important}::ng-deep .e-pivotfieldlist-container #AccountTypeCode .e-sort{opacity:0;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.PivotViewComponent, selector: "ejs-pivotview", inputs: ["aggregateTypes", "allowCalculatedField", "allowConditionalFormatting", "allowDataCompression", "allowDeferLayoutUpdate", "allowDrillThrough", "allowExcelExport", "allowGrouping", "allowNumberFormatting", "allowPdfExport", "cellTemplate", "chartSettings", "chartTypes", "cssClass", "dataSourceSettings", "displayOption", "editSettings", "enableFieldSearching", "enableHtmlSanitizer", "enablePaging", "enablePersistence", "enableRtl", "enableValueSorting", "enableVirtualization", "exportAllPages", "gridSettings", "groupingBarSettings", "height", "hyperlinkSettings", "loadOnDemandInMemberEditor", "locale", "maxNodeLimitInMemberEditor", "maxRowsInDrillThrough", "pageSettings", "pagerSettings", "pivotValues", "showFieldList", "showGroupingBar", "showToolbar", "showTooltip", "showValuesButton", "spinnerTemplate", "toolbar", "toolbarTemplate", "tooltipTemplate", "virtualScrollSettings", "width"], outputs: ["actionBegin", "actionComplete", "actionFailure", "afterServiceInvoke", "aggregateCellInfo", "aggregateMenuOpen", "beforeExport", "beforeServiceInvoke", "beginDrillThrough", "calculatedFieldCreate", "cellClick", "cellSelected", "cellSelecting", "chartSeriesCreated", "conditionalFormatting", "created", "dataBound", "destroyed", "drill", "drillThrough", "editCompleted", "enginePopulated", "enginePopulating", "exportComplete", "fetchReport", "fieldDragStart", "fieldDrop", "fieldListRefreshed", "fieldRemove", "hyperlinkCellClick", "load", "loadReport", "memberEditorOpen", "memberFiltering", "newReport", "numberFormatting", "onFieldDropped", "onHeadersSort", "onPdfCellRender", "removeReport", "renameReport", "saveReport", "toolbarClick", "toolbarRender"] }, { kind: "component", type: i4.PivotFieldListComponent, selector: "ejs-pivotfieldlist", inputs: ["aggregateTypes", "allowCalculatedField", "allowDeferLayoutUpdate", "cssClass", "currencyCode", "dataSourceSettings", "enableFieldSearching", "enableHtmlSanitizer", "enablePersistence", "enableRtl", "loadOnDemandInMemberEditor", "locale", "maxNodeLimitInMemberEditor", "renderMode", "showValuesButton", "spinnerTemplate", "target"], outputs: ["actionBegin", "actionComplete", "actionFailure", "afterServiceInvoke", "aggregateCellInfo", "aggregateMenuOpen", "beforeServiceInvoke", "calculatedFieldCreate", "created", "dataBound", "destroyed", "enginePopulated", "enginePopulating", "fieldDragStart", "fieldDrop", "fieldRemove", "load", "memberEditorOpen", "memberFiltering", "onFieldDropped", "onHeadersSort"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3085
+ }
3086
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GadgetPivotChartComponent, decorators: [{
3087
+ type: Component,
3088
+ args: [{ selector: "rs-gadget-pivot-chart", providers: [
3089
+ ToolbarService,
3090
+ FieldListService,
3091
+ NumberFormattingService,
3092
+ CalculatedFieldService,
3093
+ GroupingBarService,
3094
+ VirtualScrollService,
3095
+ DrillThroughService,
3096
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"control-section\" style=\"overflow: hidden; height: 100%\">\r\n\t<ejs-pivotview\r\n\t\twidth=\"100%\"\r\n\t\theight=\"100%\"\r\n\t\tstyle=\"display: block\"\r\n\t\t[dataSourceSettings]=\"dataSourceSettings\"\r\n\t\t#pivotview\r\n\t\t(dataBound)=\"dataBound($event)\"\r\n\t\tenableValueSorting=\"true\"\r\n\t\tallowConditionalFormatting=\"true\"\r\n\t\tallowExcelExport=\"true\"\r\n\t\tallowGrouping=\"true\"\r\n\t\t[zoomSettings]=\"zoomSettings\"\r\n\t\tenableVirtualization=\"true\"\r\n\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t(cellClick)=\"cellClick($event)\"\r\n\t\tallowDrillThrough=\"true\"\r\n\t\t(actionFailure)=\"actionFailure($event)\"\r\n\t\t(fieldListRefreshed)=\"fieldListRefreshed($event)\"\r\n\t\t(drillThrough)=\"drillThrough($event)\"\r\n\t\t[chartSettings]=\"chartSettings\"\r\n\t\t(chartSeriesCreated)=\"chartSeriesCreated($event)\"\r\n\t\t[displayOption]=\"displayOption\"\r\n\t\t[showTooltip]=\"false\"\r\n\t\t(enginePopulated)=\"afterEnginePopulate($event)\"\r\n\t\t(beforeExport)=\"beforeExport($event)\"\r\n\t>\r\n\t</ejs-pivotview>\r\n\r\n\t<div class=\"pivotfieldlist-control\">\r\n\t\t<ejs-pivotfieldlist\r\n\t\t\t[id]=\"portlet.newId\"\r\n\t\t\t#pivotfieldlist\r\n\t\t\thidden=\"true\"\r\n\t\t\tenableValueSorting=\"true\"\r\n\t\t\tshowFieldList=\"true\"\r\n\t\t\tallowCalculatedField=\"true\"\r\n\t\t\tallowDeferLayoutUpdate=\"true\"\r\n\t\t\trenderMode=\"Popup\"\r\n\t\t\t(enginePopulated)=\"afterPopulate($event)\"\r\n\t\t\t(memberEditorOpen)=\"onMemberEditorOpen($event)\"\r\n\t\t\t(enginePopulating)=\"enginePopulating($event)\"\r\n\t\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t\t(fieldDrop)=\"onFieldDrop($event)\"\r\n\t\t\t(actionComplete)=\"actionComplete($event)\"\r\n\t\t\t(actionBegin)=\"actionBegin($event)\"\r\n\t\t\t(calculatedFieldCreate)=\"calculatedFieldCreate($event)\"\r\n\t\t\t(load)=\"onLoad()\"\r\n\t\t\t(created)=\"created($event)\"\r\n\t\t>\r\n\t\t</ejs-pivotfieldlist>\r\n\t</div>\r\n\t<div class=\"full-box-mask\" *ngIf=\"pageLoading\">\r\n\t\t<mat-spinner\r\n\t\t\tstyle=\"z-index: 999\"\r\n\t\t\tmode=\"indeterminate\"\r\n\t\t\t[diameter]=\"24\"\r\n\t\t></mat-spinner>\r\n\t</div>\r\n</div>\r\n", styles: [".pivotview{width:100%;height:100%}.gadgetBar ul{margin:0;padding:0;list-style:none;display:inline-block;background:#fff;border-radius:5px}.gadgetBar ul li{display:inline-block;width:45px;height:39px;line-height:39px;text-align:center;cursor:pointer}:host::ng-deep .e-cellvalue{color:unset!important}:host ::ng-deep .e-pivotview .e-gtot{font-weight:400!important}:host ::ng-deep .e-pivotview .odd-class{background-color:#f8fafb!important}:host ::ng-deep .e-pivotview .odd-class .e-cellvalue{font-size:13px;font-weight:400!important}:host ::ng-deep .e-pivotview .even-class{background-color:#fff!important}:host ::ng-deep .e-pivotview .even-class .e-cellvalue{font-size:13px;font-weight:400!important}:host ::ng-deep .e-pivotview .grand-class{background-color:#eaedf0!important}:host ::ng-deep .e-pivotview .grand-class .e-cellvalue{font-size:13px;font-weight:700!important}:host ::ng-deep .e-headercell{background-color:#eaedf0!important}:host ::ng-deep .e-headercell .e-headertext{font-size:12px!important}:host ::ng-deep .e-columnsheader{background-color:#f8fafb!important}.logoImg{position:absolute!important;left:10px!important}:host ::ng-deep .image-{height:55px;width:55px;border-radius:50px;overflow:hidden;margin:5px 5px 5px 0;display:inline-flex;justify-content:center;align-items:center}:host ::ng-deep .image- img{width:55px}:host::ng-deep .e-pivotview .e-customclass .e-cellvalue{font-weight:700!important}:host::ng-deep .e-gridcontent .e-rowcell .e-cellvalue{background-color:transparent!important}:host ::ng-deep .control-section .e-spin-show,:host ::ng-deep .control-section .e-spinner-pane{display:none!important}:host ::ng-deep .control-section .e-control.e-grid,:host ::ng-deep .control-section .e-control.e-pivotchart{height:100%!important}:host ::ng-deep .control-section .e-pivotview{border:none!important}:host ::ng-deep .control-section .e-pivotview tr{height:32px!important}:host ::ng-deep .control-section .e-pivotview tr th{height:40px!important;background:#eaedf0!important}:host ::ng-deep .control-section .e-pivotview .e-grid.e-default.e-bothlines .e-headercell{border-right:none!important;border-left:none!important}:host ::ng-deep .control-section .e-pivotview .e-table{border-right:none!important}:host ::ng-deep .control-section .e-pivotview svg{outline:none!important}:host ::ng-deep .control-section .e-pivotview svg>g>rect{stroke-width:0!important}:host ::ng-deep .control-section .e-pivotview .e-gridcontent .e-rowcell{border-right:none!important;border-left:none!important}::ng-deep .e-pivotfieldlist-container #AccountTypeCode .e-sort{opacity:0;pointer-events:none}\n"] }]
3097
+ }], ctorParameters: function () { return [{ type: i1.DashboardPorletsService }, { type: i2.DashboardService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
3098
+ type: Optional
3099
+ }, {
3100
+ type: Inject,
3101
+ args: [PBF_TOKEN]
3102
+ }] }]; }, propDecorators: { portlet: [{
3103
+ type: Input
3104
+ }], dashboard: [{
3105
+ type: Input
3106
+ }], portlets: [{
3107
+ type: Input
3108
+ }], updatePorletConfig: [{
3109
+ type: Output
3110
+ }], pivotObj: [{
3111
+ type: ViewChild,
3112
+ args: ["pivotview", { static: false }]
3113
+ }], fieldlistObj: [{
3114
+ type: ViewChild,
3115
+ args: ["pivotfieldlist", { static: false }]
3116
+ }] } });
3117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FkZ2V0LXBpdm90LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JhaXNlLWNvbW1vbi1saWIvc3JjL2xpYi9kYXNoYm9hcmQvZ2FkZ2V0LWdyb3VwL2dhZGdldC1waXZvdC1jaGFydC9nYWRnZXQtcGl2b3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmFpc2UtY29tbW9uLWxpYi9zcmMvbGliL2Rhc2hib2FyZC9nYWRnZXQtZ3JvdXAvZ2FkZ2V0LXBpdm90LWNoYXJ0L2dhZGdldC1waXZvdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sR0FDTixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBTU4sY0FBYyxFQUNkLGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBRXRCLGtCQUFrQixFQUdsQixvQkFBb0IsRUFJcEIsbUJBQW1CLEdBRW5CLE1BQU0sbUNBQW1DLENBQUM7QUFFM0MsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTVELE9BQU8sRUFDTixNQUFNLEVBQ04sY0FBYyxFQUNkLFVBQVUsRUFDVixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sSUFBSSxPQUFPLEVBQ2pCLEtBQUssRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixJQUFJLEdBQ0osTUFBTSxRQUFRLENBQUM7QUFFaEIsT0FBTyxFQUNOLG9CQUFvQixFQUNwQixtQkFBbUIsR0FFbkIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7OztBQUM1QixZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7QUFpQnBCLE1BQU0sT0FBTyx5QkFBeUI7SUF3RTVCO0lBQ0E7SUFDQTtJQUMrQjtJQTFFL0IsT0FBTyxDQUFDO0lBQ1IsU0FBUyxDQUFDO0lBQ1YsUUFBUSxDQUFDO0lBQ1Isa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMxQyxVQUFVLENBQWE7SUFDdkIsTUFBTSxDQUFDO0lBQ1Isa0JBQWtCLENBQWU7SUFDaEMsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUNuQixjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLGNBQWMsQ0FBQztJQUNoQixXQUFXLENBQUM7SUFFWCxRQUFRLENBQXFCO0lBRTlCLFlBQVksQ0FBMEI7SUFDckMsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNqQixTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ2YsWUFBWSxDQUFRO0lBQ3BCLGFBQWEsR0FBbUIsRUFBRSxDQUFDO0lBQ25DLFlBQVksQ0FBQztJQUNyQixtQ0FBbUM7SUFDM0IsTUFBTSxHQUFZLElBQUksQ0FBQztJQUN2QixjQUFjLENBQWdCO0lBQy9CLGFBQWEsR0FBRztRQUN0QixJQUFJLEVBQUUsTUFBTTtRQUNaLE9BQU8sRUFBRSxPQUFPO0tBQ2hCLENBQUM7SUFDSyxhQUFhLENBQUM7SUFDZCxlQUFlLEdBQUc7UUFDeEIsTUFBTSxFQUFFLEtBQUs7S0FDYixDQUFDO0lBQ00sV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNqQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLGFBQWEsR0FBRztRQUN2QixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtRQUN2QyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtRQUNuQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtRQUNyQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRTtRQUNqQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtRQUM1QyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtRQUMzQyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRTtRQUM5QyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRTtLQUNqQyxDQUFDO0lBQ0YsWUFBWSxHQUFHO1FBQ2QsTUFBTSxFQUFFLEtBQUs7S0FDYixDQUFDO0lBQ0YsbUJBQW1CLEdBQUc7UUFDckIsUUFBUTtRQUNSLGFBQWE7UUFDYixRQUFRO1FBQ1IsS0FBSztRQUNMLFVBQVU7S0FDVixDQUFDO0lBQ00sV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNqQixzQkFBc0IsR0FBVSxFQUFFLENBQUMsQ0FBQyxTQUFTO0lBQzdDLHVCQUF1QixHQUFVLEVBQUUsQ0FBQyxDQUFDLGFBQWE7SUFDbEQsY0FBYyxHQUFHO1FBQ3hCLFNBQVMsRUFBRSxFQUFFO1FBQ2IsTUFBTSxFQUFFLEVBQUU7S0FDVixDQUFDO0lBQ00sYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUNuQixhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLGNBQWMsQ0FBQyxDQUFDLDBCQUEwQjtJQUMxQyxVQUFVLEdBQVksS0FBSyxDQUFDO0lBQzVCLFdBQVcsQ0FBTTtJQUNoQixnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDdkIsV0FBVyxDQUFDO0lBQ25CLFVBQVUsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ3ZCLFFBQVEsQ0FBVSxDQUFDLFdBQVc7SUFFckMsWUFDUyx1QkFBZ0QsRUFDaEQsZ0JBQWtDLEVBQ2xDLEdBQXNCLEVBQ1MsR0FBUTtRQUh2Qyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDUyxRQUFHLEdBQUgsR0FBRyxDQUFLO0lBQzdDLENBQUM7SUFFSixRQUFRO1FBQ1AsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNwQixjQUFjLEVBQUU7Z0JBQ2YsT0FBTyxFQUFFLEtBQUs7YUFDZDtZQUNELGtCQUFrQixFQUFFLEtBQUs7WUFDekIsb0JBQW9CLEVBQUUsS0FBSztZQUMzQixXQUFXLEVBQUU7Z0JBQ1osSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsYUFBYSxFQUFFLEdBQUc7Z0JBQ2xCLFdBQVcsRUFBRSxHQUFHO2FBQ2hCO1lBQ0QsZ0JBQWdCLEVBQUUsU0FBUztZQUMzQixZQUFZLEVBQUU7Z0JBQ2IsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7Z0JBQzVCLGNBQWMsRUFBRTtvQkFDZixLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsYUFBYTtvQkFDcEIsT0FBTyxFQUFFLEtBQUs7aUJBQ2Q7Z0JBQ0QsY0FBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtnQkFDbEMsU0FBUyxFQUFFO29CQUNWLEtBQUssRUFBRSxDQUFDO2lCQUNSO2FBQ0Q7WUFDRCxTQUFTLEVBQUU7Z0JBQ1YsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFO29CQUNQLEtBQUssRUFBRSxDQUFDO2lCQUNSO2FBQ0Q7WUFDRCxRQUFRLEVBQUU7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7YUFDVDtZQUNELFlBQVksRUFBRTtnQkFDYixXQUFXO2dCQUNYLEtBQUssRUFBRSxHQUFHO2dCQUNWLFdBQVcsRUFBRSxJQUFJO2FBQ2pCO1lBQ0QsWUFBWSxFQUFFO2dCQUNiLHVCQUF1QixFQUFFLEtBQUs7Z0JBQzlCLGtCQUFrQixFQUFFLEtBQUs7Z0JBQ3pCLHNCQUFzQixFQUFFLEtBQUs7Z0JBQzdCLHFCQUFxQixFQUFFLEtBQUs7Z0JBQzVCLFlBQVksRUFBRSxFQUFFO2dCQUNoQixlQUFlLEVBQUUsS0FBSztnQkFDdEIsYUFBYSxFQUFFLEtBQUs7YUFDcEI7WUFDRCxLQUFLLEVBQUUsR0FBRztTQUNWLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELGVBQWU7UUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ2pFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssV0FBVyxFQUFFO2dCQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUN4QjtRQUNGLENBQUMsQ0FBQyxDQUNGLENBQUM7UUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDeEQsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDUCxPQUFPO2FBQ1A7WUFDRCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNCLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRTtnQkFDeEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDckI7UUFDRixDQUFDLENBQUMsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM1RCxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtnQkFDbkMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2Y7UUFDRixDQUFDLENBQUMsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0RCxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7Z0JBQzlELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDZixJQUFJLElBQUksQ0FBQyxRQUFRO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDL0M7UUFDRixDQUFDLENBQUMsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM1RCxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtnQkFDbkMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNmLElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUMvQztRQUNGLENBQUMsQ0FBQyxDQUNGLENBQUM7UUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDdEIsSUFBSSxDQUFDLGdCQUFnQjthQUNuQix3QkFBd0IsRUFBRTthQUMxQixTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN0QixJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtnQkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUNqRCxJQUFJLElBQUksQ0FBQyxRQUFRO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDekI7UUFDRixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3RCLElBQUksQ0FBQyxnQkFBZ0I7YUFDbkIsa0NBQWtDLEVBQUU7YUFDcEMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbkIsSUFDQyxDQUFDLElBQUk7Z0JBQ0wsQ0FBQyxJQUFJLENBQUMsT0FBTztnQkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxFQUNoQztnQkFDRCxPQUFPO2FBQ1A7WUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDN0M7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3RCLElBQUksQ0FBQyxnQkFBZ0I7YUFDbkIsMkJBQTJCLEVBQUU7YUFDN0IsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbkIsSUFDQyxDQUFDLElBQUk7Z0JBQ0wsQ0FBQyxJQUFJLENBQUMsT0FBTztnQkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxFQUNoQztnQkFDRCxPQUFPO2FBQ1A7WUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDN0M7WUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQjtnQkFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBRXpCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBRTVELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxHQUFHO2dCQUNuQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87YUFDckIsQ0FBQztZQUNGLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzNELElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQ2hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM3RCxJQUNDLENBQUMsSUFBSTtnQkFDTCxDQUFDLElBQUksQ0FBQyxPQUFPO2dCQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQ2hDO2dCQUNELE9BQU87YUFDUDtZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUk7Z0JBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxnQkFBZ0I7b0JBQ3ZELENBQUMsQ0FBQyxnQkFBZ0I7b0JBQ2xCLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDM0QsSUFBSSxJQUFJLENBQUMsUUFBUTtnQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUNGLENBQUM7UUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ25ELElBQ0MsQ0FBQyxJQUFJO2dCQUNMLENBQUMsSUFBSSxDQUFDLE9BQU87Z0JBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssRUFDaEM7Z0JBQ0QsT0FBTzthQUNQO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMzRCxJQUFJLElBQUksQ0FBQyxRQUFRO2dCQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQ0YsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxpQkFBaUI7SUFDakIsZ0JBQWdCLENBQUMsR0FBRztRQUNuQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTNCLFlBQVk7UUFDWixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFcEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ25CLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekMsV0FBVztZQUNYLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsRUFBRTtnQkFDN0IsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekIsZUFBZSxHQUFHLEdBQUcsQ0FBQzthQUN0QjtRQUNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxlQUFlLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJO1FBQ1YsV0FBVztRQUNYLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDekMsU0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1dBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUscUJBQXFCLENBQ3JELENBQUM7UUFDRixJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM1QixVQUFVO1lBQ1YsSUFDQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUM1QjtnQkFDRCxlQUFlLEdBQUcsSUFBSSxDQUFDO2FBQ3ZCO1lBQ0QsZUFBZTtZQUNmLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkQsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV6QixJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN0QyxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JELE9BQU8sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakQsT0FBTyxDQUFDLFlBQVksQ0FDbkIsR0FBRyxFQUNILFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUN4QyxDQUFDLENBQUMsT0FBTzthQUNWO1FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLGVBQWUsRUFBRTtZQUNwQixrQkFBa0I7WUFDbEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDNUIsU0FBUztnQkFDVCxPQUFPLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEtBQUssT0FBTyxFQUFFO29CQUNsQyxPQUFPLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3pDO2dCQUNELFdBQVc7Z0JBQ1gsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekMsQ0FBQyxDQUFDLENBQUM7U0FDSDtJQUNGLENBQUM7SUFFTyxpQkFBaUI7UUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWixPQUFPO1NBQ1A7UUFDRCxNQUFNLENBQUMsbUJBQW1CLEdBQUc7WUFDNUIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUNqQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztZQUM1QixLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLO1lBQ3pCLE1BQU07U0FDTixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsa0JBQWtCLENBQUMsQ0FBQyxJQUFHLENBQUM7SUFFaEIsZ0JBQWdCLENBQUMsSUFBYTtRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDYixPQUFPO1NBQ1A7UUFFRCxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUc7WUFDN0MsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRLEVBQUUsU0FBUztZQUNuQiw2Q0FBNkM7WUFDN0MsUUFBUSxFQUNQLGdFQUFnRTtTQUNqRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNwQixHQUFHLE9BQU8sQ0FBQyxhQUFhO1lBQ3hCLFlBQVksRUFBRTtnQkFDYixLQUFLLEVBQUUsR0FBRztnQkFDVixXQUFXLEVBQUUsSUFBSTtnQkFDakIsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtnQkFDNUIsY0FBYyxFQUFFO29CQUNmLEtBQUssRUFBRSxDQUFDO29CQUNSLEtBQUssRUFBRSxhQUFhO29CQUNwQixPQUFPLEVBQUUsS0FBSztpQkFDZDtnQkFDRCxjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO2dCQUNsQyxTQUFTLEVBQUU7b0JBQ1YsS0FBSyxFQUFFLENBQUM7aUJBQ1I7YUFDRDtZQUNELFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNwRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ25EO1lBQ0YsQ0FBQyxDQUFRO1lBQ1QsU0FBUyxFQUFFO2dCQUNWLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRTtvQkFDUCxLQUFLLEVBQUUsQ0FBQztpQkFDUjthQUNEO1lBQ0QsWUFBWSxFQUFFO2dCQUNiLFdBQVc7Z0JBQ1gsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsV0FBVyxFQUFFLElBQUk7YUFDakI7WUFDRCxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3BCLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBUztZQUM3RCxZQUFZLEVBQUU7Z0JBQ2IsdUJBQXVCLEVBQUUsS0FBSztnQkFDOUIsa0JBQWtCLEVBQUUsS0FBSztnQkFDekIsc0JBQXNCLEVBQUUsS0FBSztnQkFDN0IscUJBQXFCLEVBQUUsS0FBSztnQkFDNUIsWUFBWSxFQUFFLEVBQUU7Z0JBQ2hCLGVBQWUsRUFBRSxLQUFLO2dCQUN0QixhQUFhLEVBQUUsS0FBSzthQUNwQjtTQUNELENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixhQUFhO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHO2dCQUM3QixTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUzthQUNULENBQUM7U0FDRjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7UUFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUNqRCxJQUFJLElBQUksRUFBRTtZQUNULElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHO2dCQUNoQyxJQUFJO2dCQUNKLGFBQWEsRUFBRSxHQUFHO2dCQUNsQixXQUFXLEVBQUUsR0FBRzthQUNoQixDQUFDO1NBQ0Y7SUFDRixDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBUztRQUMzQiw4QkFBOEI7UUFDOUIsNkJBQTZCO1FBQzdCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxpQkFBaUIsRUFBRTtZQUN6QyxJQUFJLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUU1QyxLQUFLLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7b0JBQ3hELElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUU7d0JBQ3hDLEtBQUssR0FBRyxHQUFHLENBQUM7cUJBQ1o7b0JBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDVixTQUFTO2lCQUNUO2dCQUNELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pCO1lBQ0QsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUM5QyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNmLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxHQUFHLEVBQUU7b0JBQ1IsR0FBRyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFlBQVksQ0FDL0MsT0FBTyxFQUNQLGVBQWUsQ0FDZixDQUFDO2lCQUNGO1lBQ0YsQ0FBQyxDQUFDLENBQUM7U0FDSDtJQUNGLENBQUM7SUFFRCxZQUFZLENBQUMsVUFBVTtRQUN0QixJQUFJLFVBQVUsRUFBRTtZQUNmLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUN2RCxJQUNDLElBQUksQ0FBQyxNQUFNLEtBQUssdUJBQXVCO29CQUN2QyxJQUFJLENBQUMsTUFBTSxLQUFLLG1CQUFtQjtvQkFDbkMsSUFBSSxDQUFDLE1BQU0sS0FBSyx5QkFBeUIsRUFDeEM7b0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7aUJBQ3pCO1lBQ0YsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUNDLFVBQVUsQ0FBQyxlQUFlO2dCQUMxQixVQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFDaEM7Z0JBQ0QsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDN0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO3dCQUNwQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7NEJBQzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQzt5QkFDOUI7b0JBQ0YsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7YUFDSDtTQUNEO0lBQ0YsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBWTtRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdEIsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTTtZQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDcEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuQyxJQUFJLElBQUksR0FDUCxJQUFJLENBQUMsTUFBTTtZQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CO1lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsYUFBYTtZQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUk7WUFDaEUsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxnQkFBZ0IsRUFBRTtZQUN0QyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7U0FDeEI7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDbkU7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxvQkFBb0IsQ0FDbEUsSUFBSSxDQUFDLE9BQU8sRUFDWixLQUFLLEVBQ0wsS0FBSyxFQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUNqQixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQ3RFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUN2QixJQUFJLENBQUMsU0FBUyxDQUNkLENBQUM7UUFFRixJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1RCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2xELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRTtnQkFDekMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNuQyxZQUFZLENBQUMsSUFBSSxDQUFDO29CQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVzt3QkFDeEIsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO3dCQUN6QyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVM7b0JBQ2pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDdkIsQ0FBQyxDQUFDO2FBQ0g7U0FDRDtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDNUIsa0NBQWtDO2dCQUNsQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLElBQUksWUFBWSxFQUFFO29CQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDdkM7Z0JBQ0QsSUFDQyxFQUFFLENBQUMsTUFBTTtvQkFDVCxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU07b0JBQ2hCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYTtvQkFDMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztvQkFFM0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0MsSUFDQyxFQUFFLENBQUMsTUFBTTtvQkFDVCxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU07b0JBQ2hCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYTtvQkFDMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztvQkFFM0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDaEQsSUFDQyxFQUFFLENBQUMsTUFBTTtvQkFDVCxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU07b0JBQ2hCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYTtvQkFDMUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FDNUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQzNCO29CQUVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDckMsSUFDQyxFQUFFLENBQUMsUUFBUSxLQUFLLFFBQVE7b0JBQ3hCLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTTt3QkFDVixDQUFDLEVBQUUsQ0FBQyxNQUFNOzRCQUNULEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTTs0QkFDaEIsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQzlCO29CQUNELE1BQU0sVUFBVSxHQUFHO3dCQUNsQixJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU87d0JBQ2hCLHlCQUF5Qjt3QkFDekIsTUFBTSxFQUNMLEVBQUUsQ0FBQyxPQUFPLEtBQUssWUFBWTs0QkFDM0IsRUFBRSxDQUFDLE9BQU8sS0FBSyxjQUFjOzRCQUM1QixDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FDekMsRUFBRSxDQUFDLEVBQUUsQ0FDSjs0QkFDSCxDQUFDLENBQUMsY0FBYzt3QkFDbEIsV0FBVyxFQUFFLElBQUk7cUJBQ2pCLENBQUM7b0JBQ0YsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDaEM7Z0JBQ0QsSUFDQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUztvQkFDekIsRUFBRSxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQUM7b0JBQzlCLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTTt3QkFDVixDQUFDLEVBQUUsQ0FBQyxNQUFNOzRCQUNULEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTTs0QkFDaEIsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQzlCO29CQUNELE1BQU0sVUFBVSxHQUFHO3dCQUNsQixJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU87d0JBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUNqRCxFQUFFLENBQUMsRUFBRSxDQUNMO3FCQUNELENBQUM7b0JBQ0YsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDaEM7Z0JBQ0QsSUFDQyxFQUFFLENBQUMsUUFBUSxLQUFLLFVBQVU7b0JBQzFCLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTTt3QkFDVixDQUFDLEVBQUUsQ0FBQyxNQUFNOzRCQUNULEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTTs0QkFDaEIsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQzlCO29CQUNELE1BQU0sVUFBVSxHQUFHO3dCQUNsQixJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU87d0JBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUNsRCxFQUFFLENBQUMsRUFBRSxDQUNMO3FCQUNELENBQUM7b0JBQ0YsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDaEM7Z0JBQ0QsSUFBSSxFQUFFLENBQUMsUUFBUSxLQUFLLFVBQVUsSUFBSSxFQUFFLENBQUMsUUFBUSxLQUFLLE1BQU0sRUFBRTtvQkFDekQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO29CQUNoQixJQUNDLEVBQUUsQ0FBQyxNQUFNO3dCQUNULEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTTt3QkFDaEIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQ3pCO3dCQUNELElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksU0FBUyxFQUFFOzRCQUN2QyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDOzRCQUNqRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FDekMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksT0FBTyxDQUM3QixDQUFDOzRCQUNGLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRTtnQ0FDdEIsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7NkJBQzlCO2lDQUFNO2dDQUNOLE1BQU0sVUFBVSxHQUFHO29DQUNsQixJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU87b0NBQ2hCLE1BQU0sRUFBRSxPQUFPO29DQUNmLElBQUksRUFBRSxNQUFNO2lDQUNaLENBQUM7Z0NBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7NkJBQ2xDO3lCQUNEOzZCQUFNLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFOzRCQUMzQyxJQUFJLE9BQU8sR0FDVixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDakQsSUFBSSxLQUFLLEdBQ1IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ2pELElBQUksT0FBTyxHQUNWLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUN2QyxPQUFPLEdBQUcsQ0FBQyxFQUNYLEtBQUssQ0FDTCxDQUFDOzRCQUNILFFBQVEsT0FBTyxFQUFFO2dDQUNoQixLQUFLLFlBQVk7b0NBQ2hCLE1BQU0sR0FBRyxZQUFZLENBQUM7b0NBQ3RCLE1BQU07Z0NBQ1AsS0FBSyxVQUFVO29DQUNkLE1BQU0sR0FBRyxVQUFVLENBQUM7b0NBQ3BCLE1BQU07Z0NBQ1AsS0FBSyxZQUFZO29DQUNoQixNQUFNLEdBQUcsWUFBWSxDQUFDO29DQUN0QixNQUFNO2dDQUNQLEtBQUssVUFBVTtvQ0FDZCxNQUFNLEdBQUcsVUFBVSxDQUFDO29DQUNwQixNQUFNO2dDQUNQLEtBQUssWUFBWTtvQ0FDaEIsTUFBTSxHQUFHLFlBQVksQ0FBQztvQ0FDdEIsTUFBTTtnQ0FDUCxLQUFLLFVBQVU7b0NBQ2QsTUFBTSxHQUFHLFVBQVUsQ0FBQztvQ0FDcEIsTUFBTTtnQ0FDUCxLQUFLLFlBQVk7b0NBQ2hCLE1BQU0sR0FBRyxZQUFZLENBQUM7b0NBQ3RCLE1BQU07Z0NBQ1AsS0FBSyxVQUFVO29DQUNkLE1BQU0sR0FBRyxVQUFVLENBQUM7b0NBQ3BCLE1BQU07Z0NBQ1AsS0FBSyxZQUFZO29DQUNoQixNQUFNLEdBQUcsWUFBWSxDQUFDO29DQUN0QixNQUFNO2dDQUNQLEtBQUssVUFBVTtvQ0FDZCxNQUFNLEdBQUcsVUFBVSxDQUFDO29DQUNwQixNQUFNO2dDQUNQLEtBQUssY0FBYztvQ0FDbEIsTUFBTSxHQUFHLGNBQWMsQ0FBQztvQ0FDeEIsTUFBTTtnQ0FDUCxLQUFLLGFBQWE7b0NBQ2pCLE1BQU0sR0FBRyxhQUFhLENBQUM7b0NBQ3ZCLE1BQU07Z0NBQ1A7b0NBQ0MsTUFBTTs2QkFDUDt5QkFDRDtxQkFDRDtvQkFDRCxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNaLE1BQU0sVUFBVSxHQUFHOzRCQUNsQixJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU87NEJBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsY0FBYzs0QkFDM0IsSUFBSSxFQUFFLE1BQU07eUJBQ1osQ0FBQzt3QkFDRixjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUNoQzt5QkFBTTt3QkFDTixNQUFNLFVBQVUsR0FBRzs0QkFDbEIsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPOzRCQUNoQixNQUFNLEVBQUUsTUFBTTs0QkFDZCxJQUFJLEVBQUUsTUFBTTt5QkFDWixDQUFDO3dCQUNGLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ2hDO2lCQUNEO1lBQ0YsQ0FBQyxDQUFDLENBQUM7U0FDSDtRQUNELHVEQUF1RDtRQUN2RCxJQUNDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCO1lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDN0M7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUM5QyxJQUFJLEVBQUUsQ0FBQyxZQUFZLEtBQUssRUFBRSxFQUFFO29CQUMzQixjQUFjLENBQUMsSUFBSSxDQUFDO3dCQUNuQixJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUk7d0JBQ2IsTUFBTSxFQUFFLEVBQUUsQ0FBQyxZQUFZO3FCQUN2QixDQUFDLENBQUM7aUJBQ0g7WUFDRixDQUFDLENBQUMsQ0FBQztTQUNIO1FBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3RDLElBQUksTUFBTSxFQUFFO1lBQ1gsS0FBSyxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUU7Z0JBQ3hCLE1BQU0sS0FBSyxHQUFHO29CQUNiLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLO29CQUNuQixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVM7aUJBQ3BCLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQjtTQUNEO1FBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3RDLElBQUksTUFBTSxFQUFFO1lBQ1gsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUU7Z0JBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsSUFBSSxDQUNqQyxDQUFDO2dCQUNGLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3JCLEtBQUssQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztpQkFDN0M7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNqQjtTQUNEO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDOUQsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtnQkFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3JDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQ2hDLENBQUM7Z0JBQ0YsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO2lCQUM1QztnQkFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25CO1NBQ0Q7UUFDRCxJQUFJLHlCQUF5QixHQUFHLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25DLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDeEMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFO29CQUN2QyxJQUFJLG9CQUFvQixHQUFHO3dCQUMxQixnQkFBZ0IsRUFBRSxJQUFJO3dCQUN0QixPQUFPLEVBQUUsRUFBRTt3QkFDWCxNQUFNLEVBQUUsSUFBSTt3QkFDWixNQUFNLEVBQUUsSUFBSTt3QkFDWixVQUFVLEVBQUUsRUFBRTt3QkFDZCxLQUFLLEVBQUU7NEJBQ04sZUFBZSxFQUFFLEVBQUU7NEJBQ25CLEtBQUssRUFBRSxFQUFFOzRCQUNULFVBQVUsRUFBRSxFQUFFOzRCQUNkLFFBQVEsRUFBRSxFQUFFO3lCQUNaO3FCQUNELENBQUM7b0JBQ0YsSUFBSSx3QkFBd0IsR0FBRzt3QkFDOUIsZ0JBQWdCLEVBQUUsSUFBSTt3QkFDdEIsT0FBTyxFQUFFLEVBQUU7d0JBQ1gsTUFBTSxFQUFFLElBQUk7d0JBQ1osTUFBTSxFQUFFLElBQUk7d0JBQ1osVUFBVSxFQUFFLEVBQUU7d0JBQ2QsS0FBSyxFQUFFOzRCQUNOLGVBQWUsRUFBRSxFQUFFOzRCQUNuQixLQUFLLEVBQUUsRUFBRTs0QkFDVCxVQUFVLEVBQUUsRUFBRTs0QkFDZCxRQUFRLEVBQUUsRUFBRTt5QkFDWjtxQkFDRCxDQUFDO29CQUNGLHFCQUFxQjtvQkFDckIsd0JBQXdCLENBQUMsT0FBTzt3QkFDL0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7b0JBQy9CLG9CQUFvQixDQUFDLE9BQU87d0JBQzNCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO29CQUUvQixJQUNDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYTt3QkFDN0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQzVCO3dCQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FDekIsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7cUJBQ0Y7eUJBQU07d0JBQ04sT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7d0JBQ25DLE9BQU8sd0JBQXdCLENBQUMsTUFBTSxDQUFDO3dCQUN2Qyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dCQUNwQyx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO3dCQUNqRCxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dCQUNoQyxvQkFBb0IsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO3dCQUNoRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLHdCQUF3QixFQUN4QixLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUNmLENBQUMsQ0FBQyxDQUNGLENBQUM7d0JBQ0YsSUFBSSxDQUFDLHlCQUF5QixDQUM3QixvQkFBb0IsRUFDcEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFDZixDQUFDLENBQ0QsQ0FBQztxQkFDRjtvQkFDRCx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztvQkFDekQseUJBQXlCLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7b0JBQ3hELG1CQUFtQjtpQkFDbkI7Z0JBQ0QsSUFBSSxpQkFBaUIsR0FBRztvQkFDdkIsSUFBSSxFQUFFLEVBQUU7b0JBQ1IsTUFBTSxFQUFFLEVBQUU7aUJBQ1YsQ0FBQztnQkFDRixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFO29CQUNsQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7b0JBQ3ZELGlCQUFpQixDQUFDLE1BQU07d0JBQ3ZCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxzQkFBc0IsQ0FDbEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQzlCLENBQUM7b0JBQ0gsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTt3QkFDakMsS0FBSyxRQUFROzRCQUNaLGlCQUFpQixDQUFDLE1BQU07Z0NBQ3ZCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxzQkFBc0IsQ0FDbEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQzlCLENBQUM7NEJBQ0gsTUFBTTt3QkFDUCxLQUFLLFNBQVM7NEJBQ2IsaUJBQWlCLENBQUMsTUFBTTtnQ0FDdkIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHVCQUF1QixDQUNuRCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FDOUIsQ0FBQzs0QkFDSCxNQUFNO3dCQUNQLEtBQUssWUFBWSxDQUFDO3dCQUNsQixLQUFLLFNBQVM7NEJBQ2IsaUJBQWlCLENBQUMsTUFBTTtnQ0FDdkIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHVCQUF1QixDQUNuRCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FDOUIsQ0FBQzs0QkFDSCxNQUFNO3dCQUNQLEtBQUssVUFBVTs0QkFDZCxpQkFBaUIsQ0FBQyxNQUFNO2dDQUN2QixJQUFJLENBQUMsdUJBQXVCLENBQUMsd0JBQXdCLENBQ3BELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUM5QixDQUFDOzRCQUNILE1BQU07d0JBQ1AsS0FBSyxNQUFNLENBQUM7d0JBQ1osS0FBSyxVQUFVOzRCQUNkLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQzs0QkFDaEIsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO2dDQUN4QyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLFNBQVMsRUFBRTtvQ0FDMUMsTUFBTTt3Q0FDTCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO2lDQUN2QztxQ0FBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLE1BQU0sRUFBRTtvQ0FDOUMsSUFBSSxPQUFPLEdBQ1YsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQzVDLEdBQUcsQ0FDSCxDQUFDO29DQUNILElBQUksS0FBSyxHQUNSLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUM1QyxHQUFHLENBQ0gsQ0FBQztvQ0FDSCxNQUFNO3dDQUNMLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUMxQyxPQUFPLEdBQUcsQ0FBQyxFQUNYLEtBQUssQ0FDTCxDQUFDO2lDQUNIOzZCQUNEOzRCQUNELElBQUksTUFBTSxFQUFFO2dDQUNYLGlCQUFpQixHQUFHO29DQUNuQixJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU87b0NBQ25CLE1BQU0sRUFBRSxFQUFFO2lDQUNWLENBQUM7Z0NBQ0YsNkJBQTZCOzZCQUM3QjtpQ0FBTTtnQ0FDTixpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQ0FDL0MsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDOzZCQUNuQzs0QkFDRCxNQUFNO3dCQUNQOzRCQUNDLE1BQU07cUJBQ1A7aUJBQ0Q7Z0JBQ0QsSUFDQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRO29CQUNyQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQ3ZCO29CQUNELGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztpQkFDdkM7YUFDRDtRQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCO1lBQy9ELENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtZQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRU4sMkNBQTJDO1FBQzNDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDbEQsSUFDQyxJQUFJLENBQUMsVUFBVTtZQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksRUFDOUI7WUFDRCx1QkFBdUI7WUFDdkIsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbkQsVUFBVSxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUNELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FDcEUsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsVUFBVSxDQUNmLENBQUM7UUFDRixJQUFJLFVBQVUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELDJDQUEyQztRQUMzQyxJQUFJLFVBQVUsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsRUFBRTtZQUNwRSxJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZTtZQUM3QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUN0QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxJQUFJLEdBQVE7b0JBQ2YsSUFBSSxFQUFFLElBQUk7b0JBQ1YsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO2lCQUNaLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxVQUFVLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM3QztRQUNELElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDNUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRTtvQkFDNUIsZUFBZSxHQUFHLElBQUksQ0FBQztpQkFDdkI7Z0JBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNwQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFO3dCQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztxQkFDeEI7Z0JBQ0YsQ0FBQyxDQUFDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztTQUNIO1FBQ0QsSUFBSSxlQUFlLEVBQUU7WUFDcEIsWUFBWSxDQUFDLElBQUksQ0FBQztnQkFDakIsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLFlBQVksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO2FBQzNDLENBQUMsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHO1lBQ3pCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztZQUM1QixjQUFjLEVBQUUsY0FBYztZQUM5QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsY0FBYyxFQUFFLGNBQWM7WUFDOUIseUJBQXlCLEVBQUUseUJBQXlCO1lBQ3BELFNBQVMsRUFBRSxJQUFJO1lBQ2YsYUFBYSxFQUFFLElBQUk7WUFDbkIsWUFBWSxFQUFFLFlBQVk7WUFDMUIsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUI7WUFDNUQsWUFBWSxFQUFFLFlBQVk7WUFDMUIsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUI7WUFDaEQsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZTtZQUM1QyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtZQUNsRCxxQkFBcUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQjtZQUN4RCxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhO1lBQ3hDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO1lBQzlDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CO1NBQ3BELENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxhQUFhLENBQUMsSUFBOEI7UUFDbEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN6QyxJQUNDLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEVBQ3JDO2dCQUNELGFBQWEsQ0FBQyxJQUFJLENBQUM7b0JBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDbEIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUN6QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7b0JBQ2pDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtpQkFDckMsQ0FBQyxDQUFDO2FBQ0g7aUJBQU07Z0JBQ04sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7b0JBQzNDLGFBQWEsQ0FBQyxJQUFJLENBQUM7d0JBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTzt3QkFDbEIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO3dCQUN6QixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7cUJBQ3JDLENBQUMsQ0FBQztpQkFDSDtnQkFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEVBQUU7b0JBQ3pDLGFBQWEsQ0FBQyxJQUFJLENBQUM7d0JBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTzt3QkFDbEIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO3dCQUN6QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7cUJBQ2pDLENBQUMsQ0FBQztpQkFDSDthQUNEO1FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7WUFDekMsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUNqRCxJQUFJLENBQUMsWUFBWSxFQUNqQixlQUFlLENBQ2YsQ0FBQztZQUNGLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDM0MsSUFBSSxDQUFDLFlBQVksRUFDakIsU0FBUyxDQUNULENBQUM7WUFDRixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQ3hDLElBQUksQ0FBQyxZQUFZLEVBQ2pCLE1BQU0sQ0FDTixDQUFDO1lBQ0YsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUMzQyxJQUFJLENBQUMsWUFBWSxFQUNqQixTQUFTLENBQ1QsQ0FBQztZQUNGLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDbEQsSUFBSSxDQUFDLFlBQVksRUFDakIsZ0JBQWdCLENBQ2hCLENBQUM7WUFDRixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQzFDLElBQUksQ0FBQyxZQUFZLEVBQ2pCLFFBQVEsQ0FDUixDQUFDO1lBQ0YsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUNoRCxJQUFJLENBQUMsWUFBWSxFQUNqQixjQUFjLENBQ2QsQ0FBQztZQUNGLElBQUksdUJBQXVCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUMzRCxJQUFJLENBQUMsWUFBWSxFQUNqQix5QkFBeUIsQ0FDekIsQ0FBQztZQUNGLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQy9CLEtBQUssSUFBSSxNQUFNLElBQUksT0FBTyxFQUFFO29CQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7d0JBQzVCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTt3QkFDakIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO3FCQUN2QixDQUFDLENBQUM7aUJBQ0g7YUFDRDtpQkFBTTtnQkFDTixtR0FBbUc7Z0JBQ25HLEtBQUssSUFBSSxNQUFNLElBQUksT0FBTyxFQUFFO29CQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTt3QkFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDOzRCQUM1QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7NEJBQ2pCLE9BQU8sRUFDTixNQUFNLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dDQUNwQyxDQUFDLENBQUMsRUFBRTtnQ0FDSixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU87eUJBQ2xCLENBQUMsQ0FBQztxQkFDSDtpQkFDRDthQUNEO1lBQ0QsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQzdCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtvQkFDZCxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87aUJBQ3BCLENBQUMsQ0FBQzthQUNIO1lBQ0QsS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDeEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUNqQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87aUJBQ3ZCLENBQUMsQ0FBQzthQUNIO1lBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDMUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO2dCQUNqRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7YUFDM0I7aUJBQU07Z0JBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO2FBQzVDO1lBQ0QsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUU7Z0JBQ3pCLElBQUksVUFBVSxDQUFDO2dCQUNmLElBQUksV0FBVyxDQUFDO2dCQUNoQixJQUFJLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO29CQUN6QixtQkFBbUIsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUN6QyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1IsSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSTt3QkFDeEIsSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsSUFBSSxDQUM5QixDQUFDO29CQUNGLElBQUksbUJBQW1CLENBQUMsTUFBTSxFQUFFO3dCQUMvQixXQUFXLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3JDLElBQ0MsV0FBVyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUM7NEJBQzNDLFdBQVcsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsRUFDNUM7NEJBQ0QsVUFBVSxHQUFHO2dDQUNaLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSTtnQ0FDbkIsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJO2dDQUNyQixLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0NBQ3BCLGFBQWEsRUFBRSxXQUFXLENBQUMsYUFBYTtnQ0FDeEMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxlQUFlOzZCQUM1QyxDQUFDO3lCQUNGOzZCQUFNOzRCQUNOLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dDQUNsRCxVQUFVLEdBQUc7b0NBQ1osT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJO29DQUNuQixTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUk7b0NBQ3JCLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTztvQ0FDcEIsZUFBZSxFQUNkLFdBQVcsQ0FBQyxlQUFlO2lDQUM1QixDQUFDOzZCQUNGOzRCQUNELElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRTtnQ0FDaEQsVUFBVSxHQUFHO29DQUNaLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSTtvQ0FDbkIsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJO29DQUNyQixLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU87b0NBQ3BCLGFBQWEsRUFBRSxXQUFXLENBQUMsYUFBYTtpQ0FDeEMsQ0FBQzs2QkFDRjt5QkFDRDtxQkFDRDtpQkFDRDtnQkFDRCxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNoQixVQUFVLEdBQUc7d0JBQ1osT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJO3dCQUNuQixLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU87d0JBQ3BCLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTtxQkFDckIsQ0FBQztpQkFDRjtnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzFDO1lBQ0QsS0FBSyxJQUFJLFNBQVMsSUFBSSx1QkFBdUIsRUFBRTtnQkFDOUMsTUFBTSxhQUFhLEdBQUc7b0JBQ3JCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtvQkFDcEIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO29CQUMxQixZQUFZLEVBQ1gsU0FBUyxDQUFDLFlBQVksS0FBSyxFQUFFO3dCQUM1QixDQUFDLENBQUMsSUFBSTt3QkFDTixDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVk7aUJBQzFCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDeEQ7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztZQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7WUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM1QztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELGlCQUFpQjtRQUNqQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztZQUNsRCxJQUFJLENBQUMsWUFBb0IsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1NBQzdDO0lBQ0YsQ0FBQztJQUVNLG1CQUFtQixDQUFDLElBQVM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDekQsSUFBSSxDQUFDLFFBQVEsRUFDYixlQUFlLENBQ2YsQ0FBQztZQUNGLHFEQUFxRDtZQUNyRCxJQUFJLElBQUksQ0FBQyxZQUFZO2dCQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvRDtRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUM5QyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ1Q7SUFDRixDQUFDO0lBRU8seUJBQXlCLENBQUMsR0FBRyxFQUFFLEdBQUc7UUFDekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRTtZQUNsQyxJQUFJLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLElBQ0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLGdCQUFnQjtnQkFDekQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2Q7Z0JBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUM7YUFDbkQ7U0FDRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVNLGdCQUFnQixDQUFDLElBQUk7UUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNoRCxLQUNDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFDVCxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQy9DLENBQUMsRUFBRSxFQUNGO2dCQUNELElBQ0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZO29CQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJO3dCQUNsQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxXQUFXO29CQUNwRCxDQUFDLENBQ0EsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSTt3QkFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJO3dCQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQ2xDLEVBQ0E7b0JBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO2lCQUN2RDtxQkFBTSxJQUNOLElBQUksQ0FBQyxZQUFZO29CQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVk7b0JBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUk7d0JBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSTtvQkFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUN0QztvQkFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7aUJBQzVEO2FBQ0Q7U0FDRDtJQUNGLENBQUM7SUFFTSxTQUFTLENBQUMsSUFBSTtRQUNwQixPQUFPO1FBQ1AsSUFDQyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLFNBQVM7WUFDNUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVO1lBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsU0FBUztnQkFDM0QsWUFBWTtZQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLFVBQVU7Z0JBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFDN0I7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FDMUI7Z0JBQ0Msa0JBQWtCLEVBQUU7b0JBQ25CLGlCQUFpQixFQUFFO3dCQUNsQixTQUFTLEVBQUUsWUFBWTt3QkFDdkIsVUFBVSxFQUFFLEVBQUU7cUJBQ2Q7aUJBQ0Q7YUFDRCxFQUNELElBQUksQ0FDSixDQUFDO1lBQ0YsSUFBSSxJQUFJLENBQUMsUUFBUTtnQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2xEO0lBQ0YsQ0FBQztJQUVNLFNBQVMsQ0FBQyxDQUFDO1FBQ2pCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztTQUNwQjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsSUFDQyxJQUFJLENBQUMsWUFBWTtZQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQjtZQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFDN0M7WUFFQSxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLFVBQ3BDLENBQUMsb0JBQW9CLEdBQUc7Z0JBQ3hCLE9BQU87Z0JBQ1AsZUFBZTtnQkFDZixPQUFPO2dCQUNQLE1BQU07YUFDTixDQUFDO1NBQ0Y7UUFDRCxJQUNDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCO1lBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUN6QztZQUVBLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsVUFDaEMsQ0FBQyxvQkFBb0IsR0FBRztnQkFDeEIsT0FBTztnQkFDUCxlQUFlO2dCQUNmLE9BQU87Z0JBQ1AsTUFBTTthQUNOLENBQUM7U0FDRjtRQUNELElBQUksY0FBYyxHQUFHLG1CQUEwQixDQUFDO1FBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDO1FBQ3ZELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7WUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUM7U0FDM0Q7SUFDRixDQUFDO0lBRU8sa0JBQWtCLENBQUMsSUFBSSxFQUFFLFNBQVM7UUFDekMsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNDLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUNqRCxJQUFJLFlBQVksR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlELElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUN0QyxZQUFZLENBQUMsUUFBUSxDQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzlELFVBQVUsQ0FDVixDQUNELENBQ0QsQ0FBQztRQUNGLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxJQUFJLFNBQVM7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUMxQixJQUNDLElBQUksQ0FBQyxXQUFXLEtBQUssVUFBVTtZQUMvQixJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksRUFDaEM7WUFDRCxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ1osSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7WUFDekIsS0FBSyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDOUQsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdkM7WUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDOUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLE1BQU0sR0FBRyxlQUFlO3FCQUMxQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUNwQyxPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0IsQ0FBQyxDQUFDO3FCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDWixJQUFJLENBQUUsWUFBb0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQzVDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzFCLElBQUksU0FBUyxHQUFRLEVBQUUsQ0FBQztvQkFDeEIsZUFBZSxDQUFDLEdBQUcsQ0FDbEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDMUMsQ0FBQztvQkFDRixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQ2xELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO29CQUMzQixHQUFHLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ3pEO2FBQ0Q7WUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDO1lBRXRDLHdCQUF3QjtZQUN4QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sR0FBRyxDQUFDO1NBQ1g7YUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssT0FBTyxFQUFFO1lBQ3hDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3RCLHNCQUFzQjtnQkFDdEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQy9DLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUN2QyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQ2pDLENBQUM7Z0JBQ0YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ2YsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDO2lCQUMzQzthQUNEO2lCQUFNO2dCQUNOLFNBQVM7Z0JBQ1QsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzFEO1NBQ0Q7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBaUM7UUFDOUMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVUsRUFBRTtZQUNyRSwyRUFBMkU7U0FDM0U7SUFDRixDQUFDO0lBRU8sYUFBYSxDQUFDLElBQUksRUFBRSxPQUFRO1FBQ25DLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUNqRCxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDekIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3BELGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZDO1FBQ0QsTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNO1lBQzlCLENBQUMsQ0FBQyxlQUFlO2lCQUNkLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUM7aUJBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDVixHQUFHO2dCQUNILElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVTtZQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDdkIsSUFBSSxPQUFPO1lBQUUsTUFBTSxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUM7UUFDdkMsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBRU8sbUJBQW1CLENBQUMsT0FBTyxFQUFFLFFBQVE7UUFDNUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQ3ZDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FDbEMsQ0FBQztRQUNGLElBQUksSUFBSSxHQUFRLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDMUM7YUFBTTtZQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCO0lBQ0YsQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTztRQUNsRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDdkIsSUFBSSxtQkFBbUIsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQy9DLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRTtvQkFDdEIsS0FBSyxPQUFPLENBQUM7b0JBQ2IsS0FBSyxNQUFNO3dCQUNWLENBQUMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUN2QyxJQUFJLEVBQ0osQ0FBQyxDQUFDLFdBQVcsRUFDYixDQUFDLENBQUMsU0FBUyxDQUNYLENBQUM7d0JBQ0YsTUFBTTtvQkFDUCxLQUFLLEtBQUs7d0JBQ1QsQ0FBQyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQ3RCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNmLE1BQU07b0JBQ1AsS0FBSyxLQUFLO3dCQUNULENBQUMsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUN0QixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDZixNQUFNO29CQUNQLEtBQUssS0FBSzt3QkFDVCxDQUFDLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FDdEIsQ0FBQzt3QkFDRixtREFBbUQ7d0JBQ25ELENBQUMsQ0FBQyxZQUFZOzRCQUNiLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQzlDLE1BQU07b0JBQ1AsS0FBSyxLQUFLO3dCQUNULENBQUMsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM1QyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUN0QixDQUFDO3dCQUNGLE1BQU07b0JBQ1A7d0JBQ0MsTUFBTTtpQkFDUDtnQkFDRCxPQUFPLENBQUMsQ0FBQztZQUNWLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDO1lBQzVCLElBQUksbUJBQW1CLENBQUMsTUFBTSxFQUFFO2dCQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNwRCxhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FDcEMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUMvQixHQUFHLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FDL0MsQ0FBQztpQkFDRjthQUNEO1lBQ0QsSUFBSTtnQkFDSCxJQUFJLE1BQU0sR0FBRyxJQUFJLFFBQVEsQ0FDeEIsU0FBUyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQzFELEVBQUUsQ0FBQztnQkFDSixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDdkMsT0FBTyxDQUFDLENBQUM7aUJBQ1Q7cUJBQU07b0JBQ04sT0FBTyxNQUFNLENBQUM7aUJBQ2Q7YUFDRDtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNmLE9BQU8sR0FBRyxDQUFDO2FBQ1g7U0FDRDtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUk7UUFDcEMsSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO1lBQ25CLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDM0MsSUFBSSxDQUFDLFlBQVksRUFDakIsTUFBTSxDQUNOLENBQUM7WUFDRixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFL0MsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNyQixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLElBQUksUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMvQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4QztZQUNELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMzQjthQUFNLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtZQUMxQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQzlDLElBQUksQ0FBQyxZQUFZLEVBQ2pCLFNBQVMsQ0FDVCxDQUFDO1lBQ0YsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWxELElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNuQixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDckIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxJQUFJLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0MsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEM7WUFDRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0I7SUFDRixDQUFDO0lBRUQsY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUNiLGlCQUFpQixDQUFDLElBQUk7UUFDNUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RCxzQkFBc0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLGlCQUFpQixFQUFFO1lBQzVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM1RCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtvQkFDMUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQ25DLElBQUksRUFDSixJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQzlCLENBQUM7aUJBQ0Y7YUFDRDtTQUNEO1FBRUQsSUFDQztZQUNDLGNBQWM7WUFDZCwyQkFBMkI7WUFDM0IscUJBQXFCO1lBQ3JCLGlCQUFpQjtZQUNqQixpQkFBaUI7WUFDakIsaUJBQWlCO1NBQ2pCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFDN0I7WUFDRCxJQUFJLFVBQVUsQ0FBQztZQUNmLElBQUksU0FBUyxDQUFDO1lBQ2QsSUFBSSxTQUFTLENBQUM7WUFDZCxJQUFJLE9BQU8sQ0FBQztZQUNaLFFBQVEsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDM0IsS0FBSyxjQUFjO29CQUNsQixVQUFVLEdBQUcsYUFBYSxDQUFDO29CQUMzQixTQUFTLEdBQUcsU0FBUyxDQUFDO29CQUN0QixNQUFNO2dCQUNQLEtBQUssaUJBQWlCO29CQUNyQixTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzt5QkFDMUIsT0FBTyxDQUFDLE9BQU8sQ0FBQzt5QkFDaEIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUN2QixPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDaEQsVUFBVSxHQUFHLGFBQWEsQ0FBQztvQkFDM0IsU0FBUyxHQUFHLFNBQVMsQ0FBQztvQkFDdEIsTUFBTTtnQkFDUCxLQUFLLGlCQUFpQjtvQkFDckIsU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7eUJBQzFCLE9BQU8sQ0FBQyxTQUFTLENBQUM7eUJBQ2xCLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDdkIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ2hELFVBQVUsR0FBRyxhQUFhLENBQUM7b0JBQzNCLFNBQVMsR0FBRyxTQUFTLENBQUM7b0JBQ3RCLE1BQU07Z0JBQ1AsS0FBSyxpQkFBaUI7b0JBQ3JCLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO3lCQUMxQixPQUFPLENBQUMsTUFBTSxDQUFDO3lCQUNmLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDdkIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ2hELFVBQVUsR0FBRyxhQUFhLENBQUM7b0JBQzNCLFNBQVMsR0FBRyxTQUFTLENBQUM7b0JBQ3RCLE1BQU07Z0JBQ1AsS0FBSyxxQkFBcUI7b0JBQ3pCLFVBQVUsR0FBRyxhQUFhLENBQUM7b0JBQzNCLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztvQkFDL0IsTUFBTTtnQkFDUCxLQUFLLDJCQUEyQjtvQkFDL0IsVUFBVSxHQUFHLHdCQUF3QixDQUFDO29CQUN0QyxTQUFTLEdBQUcsU0FBUyxDQUFDO29CQUN0QixNQUFNO2dCQUNQO29CQUNDLE1BQU07YUFDUDtZQUNELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNmLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtZQUM5QyxJQUFJLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxDQUFDLCtCQUErQjtZQUMzRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDbkMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUNOLEVBQUUsQ0FBQyxPQUFPO2dCQUNWLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FDNUMsSUFBSSxDQUFDLGFBQWEsQ0FDbEIsQ0FDRixDQUFDO1lBQ0YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM5QyxNQUFNLElBQUksR0FBRztvQkFDWixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7b0JBQ3JDLElBQUksRUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUMxQyxjQUFjO3dCQUNiLENBQUMsQ0FBQyxRQUFRO3dCQUNWLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUM5QyxDQUFDO2dCQUNGLGFBQWE7Z0JBQ2IsMEVBQTBFO2dCQUMxRSxJQUNDLElBQUksQ0FBQyxhQUFhLEtBQUsscUJBQXFCO29CQUM1QyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUNwRDtvQkFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztpQkFDckI7Z0JBQ0QsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3ZDLDZCQUE2QjtnQkFDN0IsSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFO29CQUN6QixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO3dCQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDaEQsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM3QixpQkFBaUIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ3RDO29CQUNELElBQ0MsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FDM0IsU0FBUyxFQUNULE9BQU8sRUFDUCxJQUFJLEVBQ0osSUFBSSxDQUNKLEVBQ0E7d0JBQ0QsU0FBUztxQkFDVDtpQkFDRDtnQkFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO29CQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNsQjthQUNEO1lBQ0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDWCxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsUUFBUTtpQkFDZCxDQUFDLENBQUM7YUFDSDtZQUNELE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLDBDQUEwQztZQUMxQyxJQUFJLFNBQVMsSUFBSSxPQUFPLEVBQUU7Z0JBQ3pCLE1BQU0sQ0FBQyxPQUFPLENBQUM7b0JBQ2QsTUFBTSxFQUFFLENBQUMsaUJBQWlCO29CQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2lCQUM5QixDQUFDLENBQUM7YUFDSDtZQUNELHdEQUF3RDtZQUN4RCxrQ0FBa0M7WUFDbEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdEIsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDO2dCQUNoQixNQUFNLFNBQVMsR0FBRyxNQUFNO3FCQUN0QixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7cUJBQzFCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtvQkFDbEIsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDO2lCQUNiO2dCQUNELG1DQUFtQztnQkFDbkMsSUFBSSxTQUFTLEtBQUssQ0FBQyxFQUFFO29CQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztpQkFDZjtxQkFBTTtvQkFDTixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUN0RCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3hELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzNDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7b0JBQ2xDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ2pDLElBQUksR0FBRyxHQUNOLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUN4RCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFNBQVMsRUFDVCxVQUFVLENBQ1YsQ0FBQztvQkFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2lCQUNyQzthQUNEO2lCQUFNO2dCQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2FBQ2hCO1lBQ0QsSUFDQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVk7Z0JBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQ3REO2dCQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRztvQkFDekQsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUNwQixNQUFNLEVBQ0wsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO3dCQUNmLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTs0QkFDZixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU07NEJBQ3RCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYTs0QkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FDcEQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQ2hDOzRCQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUMxQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNWO3dCQUNKLENBQUMsQ0FBQyxJQUFJO2lCQUNSLENBQUM7YUFDRjtTQUNEO1FBRUQsMENBQTBDO1FBQzFDLElBQ0M7WUFDQyxpQkFBaUI7WUFDakIsaUJBQWlCO1lBQ2pCLGlCQUFpQjtZQUNqQixvQkFBb0I7WUFDcEIsb0JBQW9CO1lBQ3BCLG9CQUFvQjtZQUNwQixvQkFBb0I7WUFDcEIsb0JBQW9CO1lBQ3BCLG9CQUFvQjtTQUNwQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQzdCO1lBQ0QsNkNBQTZDO1lBQzdDLDhCQUE4QjtZQUM5QixJQUFJLFVBQVUsR0FBRyxhQUFhLENBQUM7WUFDL0IsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzFCLElBQUksU0FBUyxDQUFDO1lBQ2QsUUFBUSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUMzQixLQUFLLGlCQUFpQixDQUFDO2dCQUN2QixLQUFLLG9CQUFvQixDQUFDO2dCQUMxQixLQUFLLG9CQUFvQjtvQkFDeEIsU0FBUyxHQUFHLE9BQU8sQ0FBQztvQkFDcEIsTUFBTTtnQkFDUCxLQUFLLGlCQUFpQixDQUFDO2dCQUN2QixLQUFLLG9CQUFvQixDQUFDO2dCQUMxQixLQUFLLG9CQUFvQjtvQkFDeEIsU0FBUyxHQUFHLFNBQVMsQ0FBQztvQkFDdEIsTUFBTTtnQkFDUCxLQUFLLGlCQUFpQixDQUFDO2dCQUN2QixLQUFLLG9CQUFvQixDQUFDO2dCQUMxQixLQUFLLG9CQUFvQjtvQkFDeEIsU0FBUyxHQUFHLE1BQU0sQ0FBQztvQkFDbkIsTUFBTTtnQkFDUDtvQkFDQyxNQUFNO2FBQ1A7WUFDRCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxZQUFZO1lBQzdCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNuQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQ04sRUFBRSxDQUFDLE9BQU87Z0JBQ1YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUM1QyxJQUFJLENBQUMsYUFBYSxDQUNsQixDQUNGLENBQUM7WUFDRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlDLE1BQU0sSUFBSSxHQUFHO29CQUNaLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7b0JBQzFDLElBQUksRUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUMxQyxjQUFjO3dCQUNiLENBQUMsQ0FBQyxRQUFRO3dCQUNWLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUM5QyxDQUFDO2dCQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbEI7WUFFRCx1REFBdUQ7WUFDdkQsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLHdDQUF3QztZQUN4QyxJQUFJLGFBQWEsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUM1QixPQUFPLENBQ04sU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7b0JBQzlCLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUMxQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBQ0YsSUFBSSxPQUFPLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztnQkFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUN2QyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztxQkFDZixRQUFRLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztxQkFDdEIsS0FBSyxDQUFDLFNBQVMsQ0FBQztxQkFDaEIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRXpCLG9DQUFvQztZQUNwQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUN6QyxDQUFDO1lBQ0YsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDaEMsa0NBQWtDO1lBRWxDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQzlCLE1BQU0sRUFDTixPQUFPLEVBQ1AsU0FBUyxFQUNULE1BQU0sQ0FDTixDQUFDLENBQUMsVUFBVTtnQkFDYixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTO2dCQUMvQixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sRUFBRTtvQkFDMUIsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0JBQ3BELE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUNyQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ047Z0JBQ0Qsa0NBQWtDO2dCQUNsQyw0Q0FBNEM7Z0JBRTVDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxDQUFDLFVBQVU7Z0JBQ3BDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDWixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQzNDLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3hCLGFBQWEsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO2lCQUM5QjtnQkFDRCxnREFBZ0Q7Z0JBRWhELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3hDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDakIsZ0JBQWdCO2dCQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFFekIsdUJBQXVCO29CQUN2QixJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQzdCLE1BQU0sU0FBUyxHQUNkLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzNDLElBQUksR0FBRyxHQUFHLFNBQVMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7NEJBQ1osSUFBSSxFQUFFLElBQUk7NEJBQ1YsR0FBRyxFQUFFLEdBQUc7eUJBQ1IsQ0FBQyxDQUFDO3FCQUNIO2lCQUNEO2dCQUNELGdCQUFnQjtnQkFDaEIsb0NBQW9DO2dCQUNwQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FDekIsQ0FBQztnQkFDRiw2Q0FBNkM7Z0JBQzdDLElBQ0M7b0JBQ0MsaUJBQWlCO29CQUNqQixpQkFBaUI7b0JBQ2pCLGlCQUFpQjtpQkFDakIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUM3QjtvQkFDRCx1QkFBdUI7b0JBQ3ZCLElBQUksQ0FBQyxLQUFLO3dCQUNULEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLElBQUksSUFBSTs0QkFDdEMsQ0FBQyxDQUFDLEVBQUU7NEJBQ0osQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzFCO3FCQUFNO29CQUNOLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7d0JBQzVDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO3FCQUNoQjt5QkFBTTt3QkFDTiwyQkFBMkI7d0JBQzNCLElBQUksTUFBTSxHQUFHOzRCQUNaLG9CQUFvQjs0QkFDcEIsb0JBQW9COzRCQUNwQixvQkFBb0I7eUJBQ3BCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7NEJBQzdCLENBQUMsQ0FBQyxJQUFJOzRCQUNOLENBQUMsQ0FBQyxJQUFJLENBQUM7d0JBQ1IsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7eUJBQ2hCOzZCQUFNOzRCQUNOLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUN6QixDQUFDOzRCQUNGLGtEQUFrRDs0QkFDbEQsSUFBSSxHQUFHLEdBQUcsVUFBVSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUM7NEJBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDNUI7cUJBQ0Q7aUJBQ0Q7Z0JBQ0QsMENBQTBDO2FBQzFDO1lBRUQsSUFDQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVk7Z0JBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQ3REO2dCQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRztvQkFDekQsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUNwQixNQUFNLEVBQ0wsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO3dCQUNmLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTs0QkFDZixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU07NEJBQ3RCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYTs0QkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FDcEQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQ2hDOzRCQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUMxQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNWO3dCQUNKLENBQUMsQ0FBQyxJQUFJO2lCQUNSLENBQUM7YUFDRjtTQUNEO1FBRUQsV0FBVztRQUNYLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSywyQkFBMkIsRUFBRTtZQUN2RCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ25DLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDTixFQUFFLENBQUMsT0FBTztnQkFDVixJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQzVDLElBQUksQ0FBQyxhQUFhLENBQ2xCLENBQ0YsQ0FBQztZQUNGLGtEQUFrRDtZQUNsRCxJQUNDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLFVBQVU7Z0JBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtvQkFDdEIsd0NBQXdDLEVBQ3hDO2dCQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDOUMsTUFBTSxJQUFJLEdBQUc7d0JBQ1osTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO3dCQUNyQyxJQUFJLEVBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzs0QkFDMUMsY0FBYzs0QkFDYixDQUFDLENBQUMsUUFBUTs0QkFDVixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDOUMsQ0FBQztvQkFDRixNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUMvQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO3dCQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNsQjtpQkFDRDthQUNEO1lBQ0QsMERBQTBEO2lCQUNyRDtnQkFDSixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUNOLEVBQUUsQ0FBQyxRQUFRLEtBQUssZ0JBQWdCO29CQUNoQyxFQUFFLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FDM0IsQ0FBQztnQkFDRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDekMsTUFBTSxJQUFJLEdBQUc7d0JBQ1osTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7d0JBQ2hDLElBQUksRUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQ3JDLGNBQWM7NEJBQ2IsQ0FBQyxDQUFDLFFBQVE7NEJBQ1YsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDekMsQ0FBQztvQkFDRixNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO3dCQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNsQjtpQkFDRDthQUNEO1lBQ0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDWCxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsUUFBUTtpQkFDZCxDQUFDLENBQUM7YUFDSDtZQUNELE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQztnQkFDaEIsTUFBTSxTQUFTLEdBQUcsTUFBTTtxQkFDdEIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3FCQUMxQixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUU7b0JBQ2xCLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQztpQkFDYjtnQkFDRCxtQ0FBbUM7Z0JBQ25DLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRTtvQkFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7aUJBQ2Y7cUJBQU07b0JBQ04sTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdEQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN4RCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3JELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUMzQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO29CQUNsQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO29CQUNqQyxJQUFJLEdBQUcsR0FDTixJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FDeEQsU0FBUyxFQUNULFFBQVEsRUFDUixTQUFTLEVBQ1QsVUFBVSxDQUNWLENBQUM7b0JBRUgsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztpQkFDcEM7YUFDRDtpQkFBTTtnQkFDTixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUNmO1lBQ0QsSUFDQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVk7Z0JBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQ3REO2dCQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRztvQkFDekQsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUNwQixNQUFNLEVBQ0wsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO3dCQUNmLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTs0QkFDZixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU07NEJBQ3RCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYTs0QkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FDcEQsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQ2hDOzRCQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUMxQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNWO3dCQUNKLENBQUMsQ0FBQyxJQUFJO2lCQUNSLENBQUM7YUFDRjtTQUNEO1FBQ0QsV0FBVztRQUNYLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxzQkFBc0IsRUFBRTtZQUNsRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ25DLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDTixFQUFFLENBQUMsT0FBTztnQkFDVixJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQzVDLElBQUksQ0FBQyxhQUFhLENBQ2xCLENBQ0YsQ0FBQztZQUNGLElBQ0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVTtnQkFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO29CQUN0Qix3Q0FBd0MsRUFDeEM7Z0JBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM5QyxNQUFNLElBQUksR0FBRzt3QkFDWixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7d0JBQ3JDLElBQUksRUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzRCQUMxQyxjQUFjOzRCQUNiLENBQUMsQ0FBQyxRQUFROzRCQUNWLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3FCQUM5QyxDQUFDO29CQUNGLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUMxQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO3dCQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNsQjtpQkFDRDthQUNEO2lCQUFNO2dCQUNOLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDOUMsTUFBTSxJQUFJLEdBQUc7d0JBQ1osTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO3dCQUNyQyxJQUFJLEVBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzs0QkFDMUMsY0FBYzs0QkFDYixDQUFDLENBQUMsUUFBUTs0QkFDVixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDOUMsQ0FBQztvQkFDRixNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDMUMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTt3QkFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDbEI7aUJBQ0Q7YUFDRDtZQUNELElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1gsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLFFBQVE7aUJBQ2QsQ0FBQyxDQUFDO2FBQ0g7WUFDRCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNoQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN0QixJQUFJLEtBQUssR0FBRyxHQUFHLENBQUM7Z0JBQ2hCLE1BQU0sU0FBUyxHQUFHLE1BQU07cUJBQ3RCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztxQkFDMUIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDekMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO29CQUNsQixLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUM7aUJBQ2I7Z0JBQ0QsbUNBQW1DO2dCQUNuQyxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2lCQUNmO3FCQUFNO29CQUNOLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3RELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDeEQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNyRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDM0MsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztvQkFDbEMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDakMsSUFBSSxHQUFHLEdBQ04sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQ3hELFNBQVMsRUFDVCxRQUFRLEVBQ1IsU0FBUyxFQUNULFVBQVUsQ0FDVixDQUFDO29CQUVILElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7aUJBQ3BDO2FBQ0Q7aUJBQU07Z0JBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7YUFDZjtZQUNELElBQ0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZO2dCQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUN0RDtnQkFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUc7b0JBQ3pELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDcEIsTUFBTSxFQUNMLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDZixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07NEJBQ2YsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNOzRCQUN0QixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWE7NEJBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsdUJBQXVCLENBQ3BELEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUNoQzs0QkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FDMUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDVjt3QkFDSixDQUFDLENBQUMsSUFBSTtpQkFDUixDQUFDO2FBQ0Y7U0FDRDtRQUNELElBQ0MsSUFBSSxDQUFDLGFBQWEsS0FBSyxtQkFBbUI7WUFDMUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxjQUFjO1lBQ3JDLElBQUksQ0FBQyxhQUFhLEtBQUssY0FBYztZQUNyQyxJQUFJLENBQUMsYUFBYSxLQUFLLGVBQWU7WUFDdEMsSUFBSSxDQUFDLGFBQWEsS0FBSyxlQUFlO1lBQ3RDLElBQUksQ0FBQyxhQUFhLEtBQUsseUJBQXlCO1lBQ2hELElBQUksQ0FBQyxhQUFhLEtBQUssb0JBQW9CLEVBQzFDO1lBQ0QsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksYUFBYSxDQUFDO1lBQ2xCLElBQUksZUFBZSxDQUFDO1lBQ3BCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNuQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQ04sRUFBRSxDQUFDLE9BQU87Z0JBQ1YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUM1QyxJQUFJLENBQUMsYUFBYSxDQUNsQixDQUNGLENBQUM7WUFDRixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakQsYUFBYSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsZUFBZSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsQztZQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDOUMsY0FBYyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2xELGdCQUFnQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDdEQ7WUFDRCxJQUFJLGdCQUFnQixLQUFLLENBQUMsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQy9DLElBQ0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZO29CQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUN0RDtvQkFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FDN0MsSUFBSSxDQUFDLFNBQVMsQ0FDZCxDQUFDO29CQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUc7d0JBQ3pELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUzt3QkFDcEIsTUFBTSxFQUNMLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQzs0QkFDZixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07Z0NBQ2YsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNO2dDQUN0QixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWE7Z0NBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsd0JBQXdCLENBQ3JELEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUNoQztnQ0FDSCxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FDM0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDVjs0QkFDSixDQUFDLENBQUMsWUFBWTtxQkFDaEIsQ0FBQztpQkFDRjthQUNEO2lCQUFNO2dCQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2FBQ2hCO1NBQ0Q7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssTUFBTSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUNuQyxJQUFJLEVBQ0osSUFBSSxDQUFDLGFBQWEsRUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FDZCxDQUFDO1NBQ0Y7UUFFRCxJQUNDLElBQUksQ0FBQyxhQUFhLEtBQUssT0FBTztZQUM5QixJQUFJLENBQUMsYUFBYSxLQUFLLGVBQWUsRUFDckM7WUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQztTQUNEO1FBRUQsSUFDQyxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ1gsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSztZQUNwQixJQUFJLENBQUMsS0FBSyxLQUFLLE9BQU8sRUFDckI7WUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztTQUNoQjtRQUNELG1EQUFtRDtRQUNuRCxJQUNDLElBQUksQ0FBQyxXQUFXLEtBQUssWUFBWTtZQUNqQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDNUM7WUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztTQUNoQjtRQUNELFdBQVc7UUFDWCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssVUFBVSxFQUFFO1lBQ3BDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQ3RELENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQ3JDLENBQUM7WUFDRixJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUssS0FBSyxFQUFFO29CQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7aUJBQzNCO2FBQ0Q7U0FDRDtRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLEVBQUU7WUFDdEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FDdEQsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FDckMsQ0FBQztZQUNGLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQy9CLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsS0FBSyxLQUFLLEVBQUU7b0JBQ2pELElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNoQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztpQkFDM0I7YUFDRDtTQUNEO1FBQ0Qsa0JBQWtCO1FBQ2xCLElBQ0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkQsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQ2Y7WUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUNqQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUMzQjtRQUNELElBQ0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQ2Y7WUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUMzQjtRQUNELElBQ0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUMzQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUU7WUFDakIsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQ2xCO1lBQ0QsSUFDQyxJQUFJLENBQUMsY0FBYyxJQUFJLFlBQVk7Z0JBQ25DLElBQUksQ0FBQyxXQUFXLElBQUksWUFBWSxFQUMvQjtnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ3pDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDM0MsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztpQkFDbEM7YUFDRDtpQkFBTTtnQkFDTixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO2FBQ2xDO1NBQ0Q7UUFFRCxrQ0FBa0M7UUFDbEMsSUFDQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtZQUM1QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDOUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxLQUFLLENBQUM7WUFDaEIsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUNsQjtZQUNELElBQ0MsSUFBSSxDQUFDLGNBQWMsSUFBSSxZQUFZO2dCQUNuQyxJQUFJLENBQUMsV0FBVyxJQUFJLFlBQVksRUFDL0I7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQzNDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7aUJBQzlCO2FBQ0Q7aUJBQU07Z0JBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQzthQUM5QjtTQUNEO1FBQ0QsSUFDQyxJQUFJLENBQUMsYUFBYSxJQUFJLGlCQUFpQjtZQUN2QyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUN4QjtZQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0M7UUFDRCxnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFNBQVM7UUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVTtZQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7WUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDcEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ25DLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUN2RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JCLElBQUksYUFBYSxLQUFLLE9BQU8sRUFBRTtvQkFDOUIsS0FDQyxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQ2xCLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFDakMsVUFBVSxFQUFFLEVBQ1g7d0JBQ0QsSUFDQyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNOzRCQUM5QyxDQUFDOzRCQUNGLElBQUksQ0FBQyxjQUFjLElBQUksWUFBWSxFQUNsQzs0QkFDRCxJQUNDLEtBQUssQ0FBQyxRQUFRLElBQUksUUFBUTtnQ0FDMUIsS0FBSyxDQUFDLFFBQVEsSUFBSSxVQUFVO2dDQUM1QixLQUFLLENBQUMsUUFBUSxJQUFJLE1BQU07Z0NBQ3hCLEtBQUssQ0FBQyxRQUFRLElBQUksVUFBVSxFQUMzQjtnQ0FDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQzs2QkFDaEI7aUNBQU07Z0NBQ04sSUFDQyxJQUFJLENBQUMsWUFBWTtvQ0FDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQ3ZCO29DQUNELElBQUksT0FBTyxHQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQ0FDdEMsSUFBSSxPQUFPLEVBQUU7d0NBQ1osSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FDdkIsQ0FBQzt3Q0FDRixJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUMxQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQ04sRUFBRSxDQUFDLFVBQVUsSUFBSSxTQUFTOzRDQUMxQixFQUFFLENBQUMsVUFBVSxDQUNkLENBQUMsQ0FBQyxDQUFDLENBQUM7d0NBQ0wsSUFBSSxHQUFHOzRDQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztxQ0FDaEM7aUNBQ0Q7cUNBQU07b0NBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQ2pCLE1BQU0sQ0FDTCxJQUFJLENBQUMsV0FBVyxDQUNmLEtBQUs7d0NBQ0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVO3dDQUNuQixTQUFTLENBQ1YsQ0FDRCxDQUNEO3dDQUNBLENBQUMsQ0FBQyxJQUFJO3dDQUNOLENBQUMsQ0FBQyxNQUFNLENBQ04sSUFBSSxDQUFDLFdBQVcsQ0FDZixLQUFLOzRDQUNKLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVTs0Q0FDbkIsU0FBUyxDQUNWLENBQ0EsQ0FBQztpQ0FDTDs2QkFDRDt5QkFDRDs2QkFBTTs0QkFDTixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7eUJBQ2xEO3dCQUNELElBQ0MsS0FBSyxDQUFDLFFBQVEsSUFBSSxRQUFROzRCQUMxQixLQUFLLENBQUMsUUFBUSxJQUFJLFVBQVU7NEJBQzVCLEtBQUssQ0FBQyxRQUFRLElBQUksU0FBUzs0QkFDM0IsS0FBSyxDQUFDLFFBQVEsSUFBSSxZQUFZLEVBQzdCOzRCQUNELElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJO2dDQUFFLE1BQU07eUJBQzlCOzZCQUFNLElBQ04sS0FBSyxDQUFDLFFBQVEsSUFBSSxNQUFNOzRCQUN4QixLQUFLLENBQUMsUUFBUSxJQUFJLFVBQVUsRUFDM0I7NEJBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsWUFBWTtnQ0FBRSxNQUFNO3lCQUNwRDs2QkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLOzRCQUFFLE1BQU07cUJBQzdCO2lCQUNEO2dCQUNELElBQUksYUFBYSxLQUFLLE1BQU0sRUFBRTtvQkFDN0IsS0FDQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3hDLFNBQVMsSUFBSSxDQUFDLEVBQ2QsU0FBUyxFQUFFLEVBQ1Y7d0JBQ0QsSUFDQyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNOzRCQUM5QyxDQUFDOzRCQUNGLElBQUksQ0FBQyxjQUFjLElBQUksWUFBWSxFQUNsQzs0QkFDRCxJQUNDLEtBQUssQ0FBQyxRQUFRLElBQUksUUFBUTtnQ0FDMUIsS0FBSyxDQUFDLFFBQVEsSUFBSSxVQUFVO2dDQUM1QixLQUFLLENBQUMsUUFBUSxJQUFJLE1BQU07Z0NBQ3hCLEtBQUssQ0FBQyxRQUFRLElBQUksVUFBVSxFQUMzQjtnQ0FDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQzs2QkFDaEI7aUNBQU07Z0NBQ04sSUFDQyxJQUFJLENBQUMsWUFBWTtvQ0FDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQ3ZCO29DQUNELElBQUksT0FBTyxHQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQ0FDdEMsSUFBSSxPQUFPLEVBQUU7d0NBQ1osSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FDdkIsQ0FBQzt3Q0FDRixJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUMxQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQ04sRUFBRSxDQUFDLFVBQVUsSUFBSSxTQUFTOzRDQUMxQixFQUFFLENBQUMsVUFBVSxDQUNkLENBQUMsQ0FBQyxDQUFDLENBQUM7d0NBQ0wsSUFBSSxHQUFHOzRDQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztxQ0FDaEM7aUNBQ0Q7cUNBQU07b0NBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQ2pCLE1BQU0sQ0FDTCxJQUFJLENBQUMsV0FBVyxDQUNmLEtBQUs7d0NBQ0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVO3dDQUNuQixTQUFTLENBQ1YsQ0FDRCxDQUNEO3dDQUNBLENBQUMsQ0FBQyxJQUFJO3dDQUNOLENBQUMsQ0FBQyxNQUFNLENBQ04sSUFBSSxDQUFDLFdBQVcsQ0FDZixLQUFLOzRDQUNKLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVTs0Q0FDbkIsU0FBUyxDQUNWLENBQ0EsQ0FBQztpQ0FDTDs2QkFDRDt5QkFDRDs2QkFBTTs0QkFDTixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7eUJBQ2pEO3dCQUVELElBQ0MsS0FBSyxDQUFDLFFBQVEsSUFBSSxRQUFROzRCQUMxQixLQUFLLENBQUMsUUFBUSxJQUFJLFVBQVU7NEJBQzVCLEtBQUssQ0FBQyxRQUFRLElBQUksU0FBUzs0QkFDM0IsS0FBSyxDQUFDLFFBQVEsSUFBSSxZQUFZLEVBQzdCOzRCQUNELElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJO2dDQUFFLE1BQU07eUJBQzlCOzZCQUFNLElBQ04sS0FBSyxDQUFDLFFBQVEsSUFBSSxNQUFNOzRCQUN4QixLQUFLLENBQUMsUUFBUSxJQUFJLFVBQVUsRUFDM0I7NEJBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsWUFBWTtnQ0FBRSxNQUFNO3lCQUNwRDs2QkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLOzRCQUFFLE1BQU07cUJBQzdCO2lCQUNEO2dCQUVELElBQ0MsS0FBSyxDQUFDLFFBQVEsSUFBSSxRQUFRO29CQUMxQixLQUFLLENBQUMsUUFBUSxJQUFJLFVBQVU7b0JBQzVCLEtBQUssQ0FBQyxRQUFRLElBQUksU0FBUztvQkFDM0IsS0FBSyxDQUFDLFFBQVEsSUFBSSxZQUFZLEVBQzdCO29CQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFOzRCQUNyRCxJQUNDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7Z0NBQ3BDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQ3pDO2dDQUNELElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzZCQUNoQzs0QkFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssaUJBQWlCLEVBQUU7Z0NBQzdDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUNwQyxJQUFJLENBQUMsS0FBSyxDQUNWLENBQUM7NkJBQ0Y7eUJBQ0Q7NkJBQU0sSUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUNuRDs0QkFDRCx5SEFBeUg7NEJBQ3pILElBQ0MsQ0FBQyxNQUFNLENBQ04sSUFBSSxDQUFDLFdBQVcsQ0FDZixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUN2QyxDQUNEO2dDQUNELEtBQUssQ0FDSixNQUFNLENBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FDZixLQUFLO29DQUNKLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVTtvQ0FDbkIsU0FBUyxDQUNWLENBQ0QsQ0FDRCxFQUNBO2dDQUNELElBQUksQ0FBQyxXQUFXLENBQ2YsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FDdkMsR0FBRyxDQUFDLENBQUM7NkJBQ047NEJBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FDZixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUN2QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBRXhCLDRIQUE0SDs0QkFDNUgsSUFDQyxDQUFDLE1BQU0sQ0FDTixJQUFJLENBQUMsV0FBVyxDQUNmLEtBQUs7Z0NBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO2dDQUN0QixTQUFTLENBQ1YsQ0FDRDtnQ0FDRCxLQUFLLENBQ0osTUFBTSxDQUNMLElBQUksQ0FBQyxXQUFXLENBQ2YsS0FBSztvQ0FDSixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7b0NBQ3RCLFNBQVMsQ0FDVixDQUNELENBQ0QsRUFDQTtnQ0FDRCxJQUFJLENBQUMsV0FBVyxDQUNmLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQzFDLEdBQUcsQ0FBQyxDQUFDOzZCQUNOOzRCQUNELElBQUksQ0FBQyxXQUFXLENBQ2YsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FDMUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUN4QjtxQkFDRDtpQkFDRDthQUNEO1NBQ0Q7YUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDaEMsSUFDQyxRQUFRLEtBQUssUUFBUTtnQkFDckIsUUFBUSxLQUFLLFVBQVU7Z0JBQ3ZCLFFBQVEsSUFBSSxNQUFNO2dCQUNsQixRQUFRLElBQUksVUFBVSxFQUNyQjtnQkFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQzthQUNoQjtpQkFBTTtnQkFDTixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO2dCQUN0QixJQUFJLGFBQWEsS0FBSyxPQUFPLEVBQUU7b0JBQzlCLElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7b0JBQ2pELEtBQ0MsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQzFCLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUNuQixLQUFLLEVBQUUsRUFDTjt3QkFDRCxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDdkM7b0JBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUM5QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7d0JBQ2hCLElBQUksTUFBTSxHQUFHLGVBQWU7NkJBQzFCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFOzRCQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOzRCQUNwQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQy9CLENBQUMsQ0FBQzs2QkFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ1osSUFBSSxDQUFFLFlBQW9CLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUM1QyxJQUFJLFNBQVMsR0FBUSxFQUFFLENBQUM7NEJBQ3hCLGVBQWUsQ0FBQyxHQUFHLENBQ2xCLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzFDLENBQUM7NEJBQ0YsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7NEJBQ2xELFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQzFCLEtBQUssSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUM5QztxQkFDRDtpQkFDRDtnQkFDRCxJQUFJLGFBQWEsS0FBSyxNQUFNLEVBQUU7b0JBQzdCLElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7b0JBQ2pELEtBQ0MsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQzFCLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUNuQixLQUFLLEVBQUUsRUFDTjt3QkFDRCxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDdkM7b0JBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDbkQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixJQUFJLE1BQU0sR0FBRyxlQUFlOzZCQUMxQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTs0QkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDcEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUMvQixDQUFDLENBQUM7NkJBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNaLElBQUksQ0FBRSxZQUFvQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTs0QkFDNUMsSUFBSSxTQUFTLEdBQVEsRUFBRSxDQUFDOzRCQUN4QixlQUFlLENBQUMsR0FBRyxDQUNsQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMxQyxDQUFDOzRCQUNGLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDOzRCQUNsRCxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDOzRCQUMxQixLQUFLO2dDQUNKLE1BQU0sQ0FDTCxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FDMUMsSUFBSSxDQUFDLENBQUM7eUJBQ1I7cUJBQ0Q7aUJBQ0Q7Z0JBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxhQUFhO29CQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUUvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO29CQUNyRCxJQUNDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQ2xDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQ3ZDO3dCQUNELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUM5QjtvQkFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDM0M7cUJBQU0sSUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUNuRDtvQkFDRCx5SEFBeUg7b0JBQ3pILElBQ0MsQ0FBQyxNQUFNLENBQ04sSUFBSSxDQUFDLFNBQVMsQ0FDYixJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7d0JBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTt3QkFDdEIsU0FBUyxDQUNWLENBQ0Q7d0JBQ0QsS0FBSyxDQUNKLE1BQU0sQ0FDTCxJQUFJLENBQUMsU0FBUyxDQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVTs0QkFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVOzRCQUN0QixTQUFTLENBQ1YsQ0FDRCxDQUNELEVBQ0E7d0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FDYixJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7NEJBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTs0QkFDdEIsU0FBUyxDQUNWLEdBQUcsQ0FBQyxDQUFDO3FCQUNOO29CQUNELElBQUksQ0FBQyxTQUFTLENBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUN4RCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbkI7Z0JBQ0QsK0JBQStCO2dCQUMvQixJQUNDLElBQUksQ0FBQyxjQUFjLEtBQUssWUFBWTtvQkFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsRUFDbkQ7b0JBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO3dCQUNsRCxJQUFJLENBQUMsS0FBSzs0QkFDVCxJQUFJLENBQUMsU0FBUyxDQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLGFBQWEsR0FBRyxTQUFTLENBQy9DLENBQUM7cUJBQ0g7eUJBQU07d0JBQ04sMkJBQTJCO3dCQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDeEQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO3dCQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs0QkFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDcEMsR0FBRztnQ0FDRixJQUFJLENBQUMsU0FBUyxDQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLE9BQU8sR0FBRyxTQUFTLENBQ3pDLENBQUM7eUJBQ0g7d0JBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7cUJBQ2pCO2lCQUNEO3FCQUFNO29CQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2lCQUNuQjthQUNEO1NBQ0Q7YUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssWUFBWSxFQUFFO1lBQzdDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDaEMsSUFDQyxRQUFRLElBQUksUUFBUTtnQkFDcEIsUUFBUSxJQUFJLFVBQVU7Z0JBQ3RCLFFBQVEsSUFBSSxNQUFNO2dCQUNsQixRQUFRLElBQUksVUFBVSxFQUNyQjtnQkFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQzthQUNoQjtpQkFBTTtnQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO29CQUNyRCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7d0JBQ2xELElBQUksT0FBTyxHQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ2pELElBQUksT0FBTyxFQUFFOzRCQUNaLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQ3ZCLENBQUM7NEJBQ0YsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FDN0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUNOLEVBQUUsQ0FBQyxVQUFVLElBQUksU0FBUyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQzVDLENBQUM7NEJBQ0YsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtnQ0FDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7NkJBQzdDO2lDQUFNLElBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUNyQyxTQUFTLENBQ1QsRUFDQTtnQ0FDRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7NkJBQ3pDO3lCQUNEO3FCQUNEO3lCQUFNO3dCQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDekM7aUJBQ0Q7cUJBQU07b0JBQ04sSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLFlBQVksRUFBRTt3QkFDekMsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFOzRCQUNsRCxJQUFJLE9BQU8sR0FDVixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUNqRCxJQUFJLE9BQU8sRUFBRTtnQ0FDWixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUN2QixDQUFDO2dDQUNGLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQzdCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDTixFQUFFLENBQUMsVUFBVSxJQUFJLFNBQVM7b0NBQzFCLEVBQUUsQ0FBQyxVQUFVLENBQ2QsQ0FBQztnQ0FDRixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO29DQUM1QixJQUFJLENBQUMsS0FBSzt3Q0FDVCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7aUNBQ2pDO3FDQUFNLElBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUNyQyxLQUFLO29DQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtvQ0FDdEIsU0FBUyxDQUNWLEVBQ0E7b0NBQ0QsSUFBSSxDQUFDLEtBQUs7d0NBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FDZixLQUFLOzRDQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTs0Q0FDdEIsU0FBUyxDQUNWLENBQUM7aUNBQ0g7NkJBQ0Q7eUJBQ0Q7NkJBQU07NEJBQ04sSUFBSSxDQUFDLEtBQUs7Z0NBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FDZixLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUMxQyxDQUFDO3lCQUNIO3FCQUNEO3lCQUFNO3dCQUNOLE9BQU87d0JBQ1Asd0RBQXdEO3dCQUN4RCxNQUFNO3dCQUNOLGtDQUFrQzt3QkFDbEMsK0NBQStDO3dCQUMvQyxNQUFNO3dCQUNOLElBQUk7d0JBQ0osSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFOzRCQUNsRCxJQUFJLE9BQU8sR0FDVixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUNqRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUN2QixDQUFDOzRCQUNGLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQzdCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDTixFQUFFLENBQUMsVUFBVSxJQUFJLFNBQVM7Z0NBQzFCLEVBQUUsQ0FBQyxVQUFVO2dDQUNiLEVBQUUsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQzNDLENBQUM7NEJBQ0YsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtnQ0FDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7NkJBQzdDO2lDQUFNLElBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUNyQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUMxQyxFQUNBO2dDQUNELElBQUksQ0FBQyxLQUFLO29DQUNULElBQUksQ0FBQyxXQUFXLENBQ2YsS0FBSzt3Q0FDSixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7d0NBQ3RCLFNBQVMsQ0FDVixDQUFDOzZCQUNIO3lCQUNEOzZCQUFNOzRCQUNOLElBQUksQ0FBQyxLQUFLO2dDQUNULElBQUksQ0FBQyxXQUFXLENBQ2YsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FDMUMsQ0FBQzt5QkFDSDtxQkFDRDtpQkFDRDthQUNEO1NBQ0Q7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDbkIsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUztRQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25DLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQUU7Z0JBQy9CLFFBQVEsS0FBSyxDQUFDLFFBQVEsRUFBRTtvQkFDdkIsS0FBSyxNQUFNLENBQUM7b0JBQ1osS0FBSyxVQUFVO3dCQUNkLElBQUksSUFBSSxDQUFDLEtBQUs7NEJBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ2xELE1BQU07b0JBQ1A7d0JBQ0MsTUFBTTtpQkFDUDthQUNEO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUk7UUFDcEMsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNmLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakI7UUFDRCxLQUFLLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRTtZQUN4QixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3QjtRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RCxJQUNDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTTtZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWE7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUMvQjtZQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakMsSUFBSSxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtvQkFDNUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxDQUFDLEVBQUUsQ0FBQztpQkFDSjthQUNEO1NBQ0Q7SUFDRixDQUFDO0lBRU8sT0FBTztRQUNkLElBQUksQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDVCxPQUFPLEVBQUU7Z0JBQ1IsU0FBUyxFQUFFLG9CQUFvQjtnQkFDL0IsY0FBYyxFQUFFLG9CQUFvQjthQUNwQztZQUNELEVBQUUsRUFBRTtnQkFDSCxTQUFTLEVBQUUsb0JBQW9CO2dCQUMvQixjQUFjLEVBQUUsb0JBQW9CO2FBQ3BDO1lBQ0QsWUFBWSxFQUFFO2dCQUNiLFNBQVMsRUFBRSxvQkFBb0I7Z0JBQy9CLGNBQWMsRUFBRSxvQkFBb0I7YUFDcEM7WUFDRCxFQUFFLEVBQUU7Z0JBQ0gsU0FBUyxFQUFFLG9CQUFvQjtnQkFDL0IsY0FBYyxFQUFFLG9CQUFvQjthQUNwQztZQUNELEVBQUUsRUFBRTtnQkFDSCxTQUFTLEVBQUUsb0JBQW9CO2dCQUMvQixjQUFjLEVBQUUsb0JBQW9CO2FBQ3BDO1lBQ0QsRUFBRSxFQUFFO2dCQUNILFNBQVMsRUFBRSxvQkFBb0I7Z0JBQy9CLGNBQWMsRUFBRSxvQkFBb0I7YUFDcEM7U0FDRCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU0sV0FBVyxDQUFDLElBQXdCO1FBQzFDLGtFQUFrRTtRQUNsRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDOUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsaUJBQWlCLENBQzdELENBQUM7UUFDRixJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSTtnQkFDbEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixDQUM5QyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUNsQixDQUFDO1lBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2lCQUM3QyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztpQkFDeEIsSUFBSSxFQUFFLENBQUM7U0FDVDtRQUNELEtBQ0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUNULENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFDakQsQ0FBQyxFQUFFLEVBQ0Y7WUFDRCxJQUNDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtnQkFDN0MsSUFBSSxDQUFDLFNBQVM7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLEVBQ25CO2dCQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDO2dCQUM3RCxNQUFNO2FBQ047U0FDRDtJQUNGLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRO1FBQ2hELElBQUksVUFBdUIsQ0FBQztRQUM1QixJQUFJLFdBQW1CLENBQUM7UUFDeEIsSUFBSSxTQUFpQixDQUFDO1FBQ3RCLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN2QixTQUFTLEdBQ1IsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFDbEIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEM7UUFDRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUM5QyxJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN4RCxXQUFXLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDO1lBQ2xFLFdBQVc7Z0JBQ1YsV0FBVyxLQUFLLEtBQUs7b0JBQ3BCLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUTt3QkFDeEQsQ0FBQyxDQUFDLE9BQU87d0JBQ1QsQ0FBQyxDQUFDLEtBQUs7b0JBQ1IsQ0FBQyxDQUFDLFdBQVcsQ0FBQztTQUNoQjtRQUNELElBQUksSUFBSSxHQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkUsVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUU7WUFDbEMsS0FBSyxFQUFFO2dCQUNOLEtBQUssRUFDSixJQUFJLEtBQUssU0FBUztvQkFDakIsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsU0FBUyxHQUFHLEdBQUc7b0JBQy9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCO3lCQUNoQywyQkFBMkI7d0JBQzVCLElBQUksS0FBSyxRQUFRO3dCQUNqQixXQUFXLEtBQUssaUJBQWlCO3dCQUNuQyxDQUFDLENBQUMsSUFBSTt3QkFDTixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQzs0QkFDaEQsR0FBRzs0QkFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDOzRCQUN6QyxHQUFHOzRCQUNILElBQUk7Z0JBQ1IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsZUFBZSxFQUFFLE9BQU87Z0JBQ3hCLGFBQWEsRUFBRSxlQUFlO2dCQUM5QixXQUFXLEVBQUUsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXO2FBQzlDO1lBQ0QsU0FBUyxFQUNSLFdBQVc7Z0JBQ1gsR0FBRztnQkFDSCxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLEtBQUssV0FBVztvQkFDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCO3dCQUNsRCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO3dCQUMxQixDQUFDLENBQUMsRUFBRTt3QkFDSixDQUFDLENBQUMsZ0JBQWdCO29CQUNuQixDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsU0FBUyxFQUNSLElBQUksS0FBSyxTQUFTO2dCQUNqQixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsR0FBRztnQkFDL0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0I7cUJBQ2hDLDJCQUEyQjtvQkFDNUIsSUFBSSxLQUFLLFFBQVE7b0JBQ2pCLFdBQVcsS0FBSyxpQkFBaUI7b0JBQ25DLENBQUMsQ0FBQyxJQUFJO29CQUNOLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO3dCQUNoRCxHQUFHO3dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7d0JBQ3pDLEdBQUc7d0JBQ0gsSUFBSTtTQUNSLENBQUMsQ0FBQztRQUNILE9BQU8sVUFBVSxDQUFDO0lBQ25CLENBQUM7SUFFRCx3QkFBd0I7SUFDakIscUJBQXFCLENBQUMsSUFBb0M7UUFDaEUsSUFDQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFDdEM7WUFDRCxJQUFJLEtBQUssR0FDUixJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FDckUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQzdDLENBQUM7WUFDSCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDakIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksS0FBSyxFQUFFLEVBQUU7b0JBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLENBQzNELEtBQUssQ0FDTCxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7aUJBQ3RCO3FCQUFNO29CQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLENBQzNELEtBQUssQ0FDTCxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQztpQkFDbkQ7YUFDRDtpQkFBTTtnQkFDTixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxLQUFLLEVBQUUsRUFBRTtvQkFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2lCQUN6QzthQUNEO1lBQ0QsT0FBTztZQUNQLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQ2pELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUMzQyxDQUFDO1lBQ0YsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzlDO1lBQ0Qsc0JBQXNCO1lBQ3RCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQzlDLElBQUksSUFBSSxHQUFHLG1CQUFtQixDQUFDO1lBQy9CLElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDO1lBQzlCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNuRCwwQkFBMEI7Z0JBQzFCLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDaEMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEVBQzNDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ0wsT0FBTzt3QkFDTixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZCxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZixZQUFZLEVBQUUsRUFBRTt3QkFDaEIsV0FBVyxFQUFFLE9BQU87cUJBQ3BCLENBQUM7Z0JBQ0gsQ0FBQyxDQUNELENBQUM7Z0JBQ0YsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDL0IsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQzFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ0wsT0FBTzt3QkFDTixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZCxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZixZQUFZLEVBQUUsRUFBRTt3QkFDaEIsV0FBVyxFQUFFLE1BQU07cUJBQ25CLENBQUM7Z0JBQ0gsQ0FBQyxDQUNELENBQUM7Z0JBQ0YsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDOUIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQ3pDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ0wsT0FBTzt3QkFDTixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZCxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZixZQUFZLEVBQUUsRUFBRTt3QkFDaEIsV0FBVyxFQUFFLEtBQUs7cUJBQ2xCLENBQUM7Z0JBQ0gsQ0FBQyxDQUNELENBQUM7Z0JBQ0YsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDOUIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQ3pDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ0wsT0FBTzt3QkFDTixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZCxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZixZQUFZLEVBQUUsRUFBRTt3QkFDaEIsV0FBVyxFQUFFLEtBQUs7cUJBQ2xCLENBQUM7Z0JBQ0gsQ0FBQyxDQUNELENBQUM7Z0JBQ0YsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDOUIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQ3pDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ0wsT0FBTzt3QkFDTixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZCxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZixZQUFZLEVBQUUsRUFBRTt3QkFDaEIsV0FBVyxFQUFFLEtBQUs7cUJBQ2xCLENBQUM7Z0JBQ0gsQ0FBQyxDQUNELENBQUM7Z0JBQ0YsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDOUIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQ3pDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ0wsT0FBTzt3QkFDTixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZCxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDZixZQUFZLEVBQUUsRUFBRTt3QkFDaEIsV0FBVyxFQUFFLEtBQUs7cUJBQ2xCLENBQUM7Z0JBQ0gsQ0FBQyxDQUNELENBQUM7Z0JBQ0YsSUFDQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM1QixJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FDbEQ7b0JBQ0QsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzNCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUNsRCxFQUNBO29CQUNELDBCQUEwQjtvQkFDMUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQzt3QkFDaEMsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSTt3QkFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTzt3QkFDckMsV0FBVyxFQUFFOzRCQUNaLGFBQWE7NEJBQ2IsR0FBRyxnQkFBZ0I7NEJBQ25CLEdBQUcsZUFBZTs0QkFDbEIsR0FBRyxjQUFjOzRCQUNqQixHQUFHLGNBQWM7NEJBQ2pCLEdBQUcsY0FBYzs0QkFDakIsR0FBRyxjQUFjO3lCQUNqQjt3QkFDRCxVQUFVLEVBQUUsQ0FBQztxQkFDYixDQUFDLENBQUM7b0JBQ0gsSUFBSSxTQUFTLEdBQUcsQ0FDZixVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDN0IsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDNUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTzt3QkFDM0IsS0FBSyxHQUFHLE1BQU0sR0FBRyxTQUFTLEdBQUcsS0FBSyxHQUFHLFVBQVUsR0FBRyxHQUFHLENBQUM7aUJBQ3ZEO2FBQ0Q7U0FDRDtJQUNGLENBQUM7SUFFRCx3QkFBd0I7SUFDakIsY0FBYyxDQUFDLElBQUk7UUFDekIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLGVBQWUsRUFBRTtZQUN2QyxJQUNDLElBQUksQ0FBQyxTQUFTO2dCQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztnQkFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLGlCQUFpQixFQUNqRDtnQkFDRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztnQkFDckMsNERBQTREO2dCQUM1RCxJQUFJLENBQUMsc0JBQXNCO29CQUMxQixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRzt3QkFDL0MsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztvQkFDM0IsQ0FBQyxDQUFDLENBQUM7YUFDSjtTQUNEO0lBQ0YsQ0FBQztJQUVELHdCQUF3QjtJQUNqQixXQUFXLENBQUMsSUFBSTtRQUN0QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssdUJBQXVCLEVBQUU7WUFDaEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVELElBQ0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FDbkMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDbkMsRUFDQTtvQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQ25DLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ25DLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7aUJBQ25EO2FBQ0Q7U0FDRDtJQUNGLENBQUM7SUFFTyxVQUFVLENBQUMsSUFBSTtRQUN0QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQzdCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDbkQsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQ2hELENBQUM7WUFDRixJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM1QixZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BEO2lCQUFNO2dCQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtvQkFDbEMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztpQkFDbEMsQ0FBQyxDQUFDO2FBQ0g7U0FDRDthQUFNO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztnQkFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDbEMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNsQyxDQUFDLENBQUM7U0FDSDtRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0IsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDaEQsQ0FBQztJQUVNLE1BQU0sS0FBVSxDQUFDO0lBRWhCLGVBQWUsQ0FBQyxJQUFJO1FBQzNCLElBQUksWUFBMEIsQ0FBQztRQUMvQixJQUFJLGtCQUFrQixHQUFRLElBQUksQ0FBQyxvQkFBb0IsQ0FDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUN0QyxDQUFDO1FBQ0YsSUFBSSxZQUFZLEdBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO1FBRXpDLGtEQUFrRDtRQUNsRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFO1lBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUNoQyxJQUFJLENBQ0osQ0FBQztZQUNGLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FDdEMsQ0FBQztZQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztZQUU1RCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1lBRXZELHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztTQUNqQztJQUNGLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxXQUF5QjtRQUNyRCxJQUFJLFVBQVUsR0FBaUIsRUFBRSxDQUFDO1FBQ2xDLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BELElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNuQixVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUNuQixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDdkQsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7NEJBQ3RCLG9CQUFvQjs0QkFDcEIsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FDN0MsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBOEIsQ0FDOUMsQ0FBQzs0QkFDRixtQkFBbUI7eUJBQ25CO3FCQUNEO2lCQUNEO2FBQ0Q7U0FDRDtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ25CLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxJQUErQjtRQUc3RCxJQUFJLE1BQU0sR0FBVyxDQUFDLENBQUM7UUFDdkIsSUFBSSxTQUFTLEdBQVEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQyxFQUFFO1lBQzNDLElBQUksTUFBTSxHQUFhLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekMsT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDOUIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDakQsTUFBTSxFQUFFLENBQUM7YUFDVDtTQUNEO2FBQU07WUFDTixTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ2pCO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztJQUVELGlDQUFpQztJQUN6QixXQUFXLENBQUMsSUFBSTtRQUN2QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzdCLElBQUksU0FBUyxHQUFHLEVBQUUsRUFDakIsTUFBTSxHQUFHLEVBQUUsRUFDWCxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxLQUFLLElBQUksRUFBRSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbEIsSUFBWSxDQUFDLFlBQVksQ0FBQyxjQUFzQixDQUFDLFdBQVcsRUFBRSxDQUNoRSxDQUFDO1NBQ0Y7YUFBTTtZQUNOLElBQUksU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xFLElBQUksWUFBWSxHQUFHLElBQUksV0FBVyxDQUMvQixJQUFZLENBQUMsWUFBWSxDQUFDLGNBQXNCLENBQUMsV0FBVyxFQUFFLENBQ2hFLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQ2hDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFFYixJQUFZLENBQUMsWUFBWSxDQUFDLGNBQzNCLENBQUMsV0FBVyxFQUFFLENBQ2YsQ0FBQztnQkFDRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDeEMsSUFDQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDaEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFDakI7d0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDeEIsU0FBUyxDQUFDLElBQUksQ0FDYixJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FDL0MsQ0FBQztxQkFDRjtpQkFDRDthQUNEO1lBQ0QsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzFCO2lCQUFNO2dCQUNOLElBQUksS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBRTFCLElBQVksQ0FBQyxZQUFZLENBQUMsY0FDM0IsQ0FBQyxXQUFXLEVBQUUsQ0FDZixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQy9CO1NBQ0Q7SUFDRixDQUFDO0lBRUQsZ0RBQWdEO0lBQ3pDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSTtRQUNoQyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25FLElBQUksTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN0QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUk7b0JBQ3BELEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEI7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO0lBRU0sT0FBTyxDQUFDLElBQVM7UUFDdkIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ2hFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7U0FDM0M7UUFDRCxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzVELElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQzlCLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsMkJBQTJCLENBQ2hFLENBQUM7UUFDRixJQUFJLEVBQUU7WUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxhQUFhLENBQUM7WUFDdkMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLFNBQVM7WUFDakQsUUFBUSxFQUFFLGNBQWM7WUFDeEIsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNuQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FDM0IsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUNoRCxDQUFDO1FBRUYsaUNBQWlDO1FBQ2pDLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxxQkFBcUIsQ0FDcEQsQ0FBQztRQUNGLFFBQVE7WUFDUCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUM1QixJQUFJLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQ2hELENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUNkLEdBQUcsRUFBRTtvQkFDSixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2YsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDZixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7b0JBQzlCLENBQUMsQ0FBQyxDQUFDO2dCQUNKLENBQUMsRUFDRCxJQUFJLEVBQ0osS0FBSyxFQUNMLElBQUksQ0FBQyxTQUFTLEVBQ2QsS0FBSyxDQUNMLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxJQUFJO1FBQzdCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQXNCLENBQUMsV0FBVyxFQUFFLENBQ3ZELENBQUM7U0FDRjtJQUNGLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFJO1FBQzVCLElBQUksVUFBVSxHQUFJLElBQVksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQztRQUN0RSxJQUFJLFVBQVUsRUFBRTtZQUNmLFVBQVUsQ0FBQyxNQUFNLEdBQUc7Z0JBQ25CLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixFQUFFLEVBQUUsSUFBSTtnQkFDUixJQUFJLEVBQUUsU0FBUztnQkFDZixTQUFTLEVBQUUsWUFBWTtnQkFDdkIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsT0FBTyxFQUFFLGdCQUFnQjthQUN6QixDQUFDO1NBQ0Y7SUFDRixDQUFDO0lBRUQsOENBQThDO0lBQ3ZDLFlBQVksQ0FBQyxJQUEyQjtRQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3BDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUNoRCxDQUFDO1lBQ0YsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLElBQ0MsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxNQUFNO29CQUMzQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFDOUI7b0JBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO2lCQUNsQzthQUNEO1NBQ0Q7SUFDRixDQUFDO0lBQ0QsWUFBWTtJQUVKLHlCQUF5QixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSTtRQUNoRCxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNoQixHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUNoRCxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDNUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1NBQ3JEO2FBQU07WUFDTixHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2pDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDNUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN4QyxHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1NBQ2pEO0lBQ0YsQ0FBQztJQUVPLHFCQUFxQixDQUM1Qix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLElBQUk7UUFFSixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QyxRQUFRLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQzNCLEtBQUssVUFBVSxDQUFDLENBQUMsS0FBSztnQkFDdEIsS0FBSyxtQkFBbUIsRUFBRSxPQUFPO29CQUNoQyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNwQyx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO29CQUNqRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLHdCQUF3QixFQUN4QixJQUFJLEVBQ0osQ0FBQyxDQUFDLENBQ0YsQ0FBQztvQkFDRixNQUFNO2dCQUNQLEtBQUssYUFBYSxDQUFDLENBQUMsS0FBSztnQkFDekIsS0FBSyxzQkFBc0IsRUFBRSxPQUFPO29CQUNuQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNoQyxvQkFBb0IsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO29CQUNoRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLG9CQUFvQixFQUNwQixJQUFJLEVBQ0osQ0FBQyxDQUNELENBQUM7b0JBQ0YsTUFBTTtnQkFDUCxLQUFLLFdBQVcsRUFBRSxNQUFNO29CQUN2Qix3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNwQyx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO29CQUNqRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLHdCQUF3QixFQUN4QixJQUFJLEVBQ0osQ0FBQyxDQUFDLENBQ0YsQ0FBQztvQkFDRixvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNoQyxvQkFBb0IsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO29CQUNoRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLG9CQUFvQixFQUNwQixJQUFJLEVBQ0osQ0FBQyxDQUNELENBQUM7b0JBQ0YsTUFBTTtnQkFDUCxLQUFLLFNBQVMsRUFBRSx3QkFBd0I7b0JBQ3ZDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUN4QyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dCQUNoQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUNuQyxJQUFJLENBQUMsYUFBYSxDQUNsQixDQUFDO3dCQUNGLG9CQUFvQixDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7d0JBQzVDLElBQUksQ0FBQyx5QkFBeUIsQ0FDN0Isb0JBQW9CLEVBQ3BCLElBQUksRUFDSixDQUFDLENBQ0QsQ0FBQztxQkFDRjtvQkFDRCxNQUFNO2dCQUNQLEtBQUssWUFBWSxFQUFFLCtCQUErQjtvQkFDakQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ3hDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxNQUFNLENBQ25DLElBQUksQ0FBQyxhQUFhLENBQ2xCLENBQUM7d0JBQ0Ysb0JBQW9CLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQzt3QkFDaEQsSUFBSSxDQUFDLHlCQUF5QixDQUM3QixvQkFBb0IsRUFDcEIsSUFBSSxFQUNKLENBQUMsQ0FDRCxDQUFDO3dCQUNGLHdCQUF3QixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7d0JBQ3BDLHdCQUF3QixDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7d0JBQ2pELElBQUksQ0FBQyx5QkFBeUIsQ0FDN0Isd0JBQXdCLEVBQ3hCLElBQUksRUFDSixDQUFDLENBQUMsQ0FDRixDQUFDO3FCQUNGO29CQUNELE1BQU07Z0JBQ1A7b0JBQ0MsTUFBTTthQUNQO1NBQ0Q7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMvQyxRQUFRLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQzNCLEtBQUssVUFBVSxDQUFDLENBQUMsS0FBSztnQkFDdEIsS0FBSyxtQkFBbUIsRUFBRSxPQUFPO29CQUNoQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNoQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDekQsb0JBQW9CLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLHlCQUF5QixDQUM3QixvQkFBb0IsRUFDcEIsSUFBSSxFQUNKLENBQUMsQ0FDRCxDQUFDO29CQUNGLHdCQUF3QixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ3BDLHdCQUF3QixDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7b0JBQ2pELElBQUksQ0FBQyx5QkFBeUIsQ0FDN0Isd0JBQXdCLEVBQ3hCLElBQUksRUFDSixDQUFDLENBQUMsQ0FDRixDQUFDO29CQUNGLE1BQU07Z0JBQ1AsS0FBSyxhQUFhLENBQUMsQ0FBQyxLQUFLO2dCQUN6QixLQUFLLHNCQUFzQixFQUFFLE9BQU87b0JBQ25DLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUN6RCxvQkFBb0IsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO29CQUNoRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLG9CQUFvQixFQUNwQixJQUFJLEVBQ0osQ0FBQyxDQUNELENBQUM7b0JBQ0YsTUFBTTtnQkFDUCxLQUFLLFFBQVEsRUFBRSxLQUFLO29CQUNuQixvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDekQsb0JBQW9CLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLHlCQUF5QixDQUM3QixvQkFBb0IsRUFDcEIsSUFBSSxFQUNKLENBQUMsQ0FDRCxDQUFDO29CQUNGLE1BQU07Z0JBQ1AsS0FBSyxXQUFXLEVBQUUsTUFBTTtvQkFDdkIsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDaEMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3pELG9CQUFvQixDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7b0JBQzVDLFVBQVU7b0JBQ1Ysb0JBQW9CLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3pELG9CQUFvQixDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7b0JBQ2hELFVBQVU7b0JBRVYsd0JBQXdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDcEMsd0JBQXdCLENBQUMsVUFBVSxHQUFHLG1CQUFtQixDQUFDO29CQUMxRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLHdCQUF3QixFQUN4QixJQUFJLEVBQ0osQ0FBQyxDQUFDLENBQ0YsQ0FBQztvQkFDRixJQUFJLENBQUMseUJBQXlCLENBQzdCLG9CQUFvQixFQUNwQixJQUFJLEVBQ0osQ0FBQyxDQUNELENBQUM7b0JBQ0YsTUFBTTtnQkFDUCxLQUFLLFNBQVMsRUFBRSx3QkFBd0I7b0JBQ3ZDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUN4QyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUNuQyxJQUFJLENBQUMsYUFBYSxDQUNsQixDQUFDO3dCQUNGLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxNQUFNLENBQ25DLElBQUksQ0FBQyxhQUFhLENBQ2xCLENBQUM7d0JBQ0Ysb0JBQW9CLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQzt3QkFDNUMsSUFBSSxDQUFDLHlCQUF5QixDQUM3QixvQkFBb0IsRUFDcEIsSUFBSSxFQUNKLENBQUMsQ0FDRCxDQUFDO3FCQUNGO29CQUNELE1BQU07Z0JBQ1AsS0FBSyxZQUFZLEVBQUUsK0JBQStCO29CQUNqRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDeEMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzt3QkFDaEMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FDbkMsSUFBSSxDQUFDLGFBQWEsQ0FDbEIsQ0FBQzt3QkFDRixvQkFBb0IsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO3dCQUM1QyxVQUFVO3dCQUNWLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxNQUFNLENBQ25DLElBQUksQ0FBQyxhQUFhLENBQ2xCLENBQUM7d0JBQ0Ysb0JBQW9CLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQzt3QkFDaEQsVUFBVTt3QkFDVixJQUFJLENBQUMseUJBQXlCLENBQzdCLG9CQUFvQixFQUNwQixJQUFJLEVBQ0osQ0FBQyxDQUNELENBQUM7cUJBQ0Y7b0JBQ0QsTUFBTTtnQkFDUDtvQkFDQyxNQUFNO2FBQ1A7U0FDRDthQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDaEQsUUFBUSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUMzQixLQUFLLFVBQVUsQ0FBQyxDQUFDLEtBQUs7Z0JBQ3RCLEtBQUssbUJBQW1CLEVBQUUsT0FBTztvQkFDaEMsd0JBQXdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7b0JBQ3JELHdCQUF3QixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO29CQUN6RCxJQUFJLENBQUMseUJBQXlCLENBQzdCLHdCQUF3QixFQUN4QixJQUFJLEVBQ0osQ0FBQyxDQUFDLENBQ0YsQ0FBQztvQkFDRixNQUFNO2dCQUNQLEtBQUssYUFBYSxDQUFDLENBQUMsS0FBSztnQkFDekIsS0FBSyxzQkFBc0IsRUFBRSxPQUFPO29CQUNuQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNoQyxvQkFBb0IsQ0FBQyxVQUFVLEdBQUcsc0JBQXNCLENBQUM7b0JBQ3pELHdCQUF3QixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ3BDLHdCQUF3QixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO29CQUNyRCx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO29CQUNoRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLG9CQUFvQixFQUNwQixJQUFJLEVBQ0osQ0FBQyxDQUNELENBQUM7b0JBQ0YsSUFBSSxDQUFDLHlCQUF5QixDQUM3Qix3QkFBd0IsRUFDeEIsSUFBSSxFQUNKLENBQUMsQ0FBQyxDQUNGLENBQUM7b0JBQ0YsTUFBTTtnQkFDUCxLQUFLLFFBQVEsRUFBRSxLQUFLO29CQUNuQix3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztvQkFDckQsd0JBQXdCLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztvQkFDL0MsSUFBSSxDQUFDLHlCQUF5QixDQUM3Qix3QkFBd0IsRUFDeEIsSUFBSSxFQUNKLENBQUMsQ0FBQyxDQUNGLENBQUM7Z0JBQ0gsS0FBSyxXQUFXLEVBQUUsTUFBTTtvQkFDdkIsd0JBQXdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7b0JBQ3JELHdCQUF3QixDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7b0JBQ2xELElBQUksQ0FBQyx5QkFBeUIsQ0FDN0Isd0JBQXdCLEVBQ3hCLElBQUksRUFDSixDQUFDLENBQUMsQ0FDRixDQUFDO29CQUNGLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ2hDLG9CQUFvQixDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7b0JBQ2hELElBQUksQ0FBQyx5QkFBeUIsQ0FDN0Isb0JBQW9CLEVBQ3BCLElBQUksRUFDSixDQUFDLENBQ0QsQ0FBQztvQkFDRixNQUFNO2dCQUNQLEtBQUssU0FBUyxFQUFFLHdCQUF3QjtvQkFDdkMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTt3QkFDbEMsd0JBQXdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzt3QkFDcEMsd0JBQXdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7d0JBQ3JELHdCQUF3QixDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7d0JBQ2hELElBQUksQ0FBQyx5QkFBeUIsQ0FDN0Isd0JBQXdCLEVBQ3hCLElBQUksRUFDSixDQUFDLENBQUMsQ0FDRixDQUFDO3dCQUNGLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7d0JBQ2hDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO3dCQUNqRCxvQkFBb0IsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO3dCQUM1QyxJQUFJLENBQUMseUJBQXlCLENBQzdCLG9CQUFvQixFQUNwQixJQUFJLEVBQ0osQ0FBQyxDQUNELENBQUM7cUJBQ0Y7eUJBQU07d0JBQ04sd0JBQXdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7d0JBQ3JELHdCQUF3QixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO3dCQUNyRCx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO3dCQUNoRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLHdCQUF3QixFQUN4QixJQUFJLEVBQ0osQ0FBQyxDQUFDLENBQ0YsQ0FBQztxQkFDRjtvQkFDRCxNQUFNO2dCQUNQLEtBQUssWUFBWSxFQUFFLCtCQUErQjtvQkFDakQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTt3QkFDbEMsd0JBQXdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7d0JBQ3JELHdCQUF3QixDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7d0JBQ2pELElBQUksQ0FBQyx5QkFBeUIsQ0FDN0Isd0JBQXdCLEVBQ3hCLElBQUksRUFDSixDQUFDLENBQUMsQ0FDRixDQUFDO3dCQUVGLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO3dCQUNqRCxvQkFBb0IsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO3dCQUNoRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLG9CQUFvQixFQUNwQixJQUFJLEVBQ0osQ0FBQyxDQUNELENBQUM7cUJBQ0Y7eUJBQU07d0JBQ04sd0JBQXdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7d0JBQ3JELHdCQUF3QixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO3dCQUNyRCx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDO3dCQUNuRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLHdCQUF3QixFQUN4QixJQUFJLEVBQ0osQ0FBQyxDQUFDLENBQ0YsQ0FBQzt3QkFFRixvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dCQUNoQyxvQkFBb0IsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO3dCQUNoRCxJQUFJLENBQUMseUJBQXlCLENBQzdCLG9CQUFvQixFQUNwQixJQUFJLEVBQ0osQ0FBQyxDQUNELENBQUM7cUJBQ0Y7b0JBQ0QsTUFBTTtnQkFDUDtvQkFDQyxNQUFNO2FBQ1A7U0FDRDtJQUNGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTztRQUNsRCxzQkFBc0I7UUFDdEIsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZFLE1BQU07UUFDTixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFFdEIsY0FBYztRQUNkLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWhDLFVBQVU7UUFDVixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFbEIsV0FBVztRQUNYLElBQUksUUFBUSxLQUFLLE1BQU0sRUFBRTtZQUN4QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRS9CLEtBQUssSUFBSSxJQUFJLEdBQUcsU0FBUyxFQUFFLElBQUksSUFBSSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDbEI7WUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQyxDQUFDLENBQUM7U0FDSDthQUFNLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUNsQyxVQUFVO1lBQ1YsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBRXBCLFdBQVc7WUFDWCxLQUNDLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFDakMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFDbkMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQzNCO2dCQUNELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87Z0JBQ2pFLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsU0FBUyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZO2FBQzdEO1lBRUQsU0FBUztZQUNULFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ25DLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFFSCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87Z0JBQ3ZDLElBQUksT0FBTyxLQUFLLENBQUM7b0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztxQkFDbkQsSUFBSSxPQUFPLEtBQUssQ0FBQztvQkFDckIsTUFBTSxDQUFDLElBQUksR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3FCQUNuRCxJQUFJLE9BQU8sS0FBSyxDQUFDO29CQUNyQixNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7cUJBQ25ELElBQUksT0FBTyxLQUFLLENBQUM7b0JBQ3JCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUMsQ0FBQztTQUNIO2FBQU0sSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFO1lBQ2hDLFVBQVU7WUFDVixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFFbEIsVUFBVTtZQUNWLEtBQ0MsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUNqQyxXQUFXLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUNuQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFDM0I7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWTthQUNuRTtZQUVELFNBQVM7WUFDVCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1lBRUgsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN6QixNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTztnQkFDckUsTUFBTSxDQUFDLElBQUksR0FBRyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pELENBQUMsQ0FBQyxDQUFDO1NBQ0g7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQUMsTUFBTTtRQUN6QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hEO2FBQU0sSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMzQixPQUFPLElBQUksQ0FBQzthQUNaO2lCQUFNO2dCQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNoRDtTQUNEO0lBQ0YsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNYLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVuQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCwwQkFBMEIsQ0FBQyxNQUFNO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFeEIsVUFBVTtRQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUN0QztRQUVELE9BQU87UUFDUCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0QsT0FBTztRQUNQLE1BQU0sUUFBUSxHQUNiLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3RCxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVULFNBQVM7UUFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUIsQ0FBQzt3R0E3ekhXLHlCQUF5QiwwSEEyRWhCLFNBQVM7NEZBM0VsQix5QkFBeUIscUxBWDFCO1lBQ1YsY0FBYztZQUNkLGdCQUFnQjtZQUNoQix1QkFBdUI7WUFDdkIsc0JBQXNCO1lBQ3RCLGtCQUFrQjtZQUNsQixvQkFBb0I7WUFDcEIsbUJBQW1CO1NBQ25CLGtPQzlFRix5cEVBNERBOzs0RkRxQmEseUJBQXlCO2tCQWZyQyxTQUFTOytCQUNDLHVCQUF1QixhQUd0Qjt3QkFDVixjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsdUJBQXVCO3dCQUN2QixzQkFBc0I7d0JBQ3RCLGtCQUFrQjt3QkFDbEIsb0JBQW9CO3dCQUNwQixtQkFBbUI7cUJBQ25CLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNOzswQkE2RTdDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsU0FBUzs0Q0ExRXJCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksa0JBQWtCO3NCQUEzQixNQUFNO2dCQVNDLFFBQVE7c0JBRGYsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUdsQyxZQUFZO3NCQURsQixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcblx0Q2hhbmdlRGV0ZWN0b3JSZWYsXHJcblx0Q29tcG9uZW50LFxyXG5cdElucHV0LFxyXG5cdE9uSW5pdCxcclxuXHRWaWV3Q2hpbGQsXHJcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcblx0RXZlbnRFbWl0dGVyLFxyXG5cdE91dHB1dCxcclxuXHRPcHRpb25hbCxcclxuXHRJbmplY3QsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbmltcG9ydCB7XHJcblx0SURhdGFPcHRpb25zLFxyXG5cdFBpdm90RmllbGRMaXN0Q29tcG9uZW50LFxyXG5cdFBpdm90Vmlld0NvbXBvbmVudCxcclxuXHRFbmdpbmVQb3B1bGF0ZWRFdmVudEFyZ3MsXHJcblx0SURhdGFTZXQsXHJcblx0VG9vbGJhclNlcnZpY2UsXHJcblx0RmllbGRMaXN0U2VydmljZSxcclxuXHROdW1iZXJGb3JtYXR0aW5nU2VydmljZSxcclxuXHRDYWxjdWxhdGVkRmllbGRTZXJ2aWNlLFxyXG5cdENhbGN1bGF0ZWRGaWVsZENyZWF0ZUV2ZW50QXJncyxcclxuXHRHcm91cGluZ0JhclNlcnZpY2UsXHJcblx0RmllbGREcm9wRXZlbnRBcmdzLFxyXG5cdElTb3J0LFxyXG5cdFZpcnR1YWxTY3JvbGxTZXJ2aWNlLFxyXG5cdElQaXZvdFZhbHVlcyxcclxuXHRJUGFnZVNldHRpbmdzLFxyXG5cdERyaWxsVGhyb3VnaEV2ZW50QXJncyxcclxuXHREcmlsbFRocm91Z2hTZXJ2aWNlLFxyXG5cdFBpdm90QWN0aW9uRmFpbHVyZUV2ZW50QXJncyxcclxufSBmcm9tIFwiQHN5bmNmdXNpb24vZWoyLWFuZ3VsYXItcGl2b3R2aWV3XCI7XHJcblxyXG5pbXBvcnQgeyBMMTBuLCBjcmVhdGVFbGVtZW50LCBlbmFibGVSaXBwbGUgfSBmcm9tIFwiQHN5bmNmdXNpb24vZWoyLWJhc2VcIjtcclxuaW1wb3J0IHsgUEJGX1RPS0VOIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2UvSW5qZWN0aW9uVG9rZW5cIjtcclxuXHJcbmltcG9ydCB7XHJcblx0c29ydEJ5LFxyXG5cdGRpZmZlcmVuY2VXaXRoLFxyXG5cdHN0YXJ0c1dpdGgsXHJcblx0Y2xvbmVEZWVwLFxyXG5cdHVuaXFCeSxcclxuXHRmaWx0ZXIgYXMgX2ZpbHRlcixcclxuXHRtYXhCeSxcclxuXHRtaW5CeSxcclxuXHRzdW1CeSxcclxuXHRtZWFuQnksXHJcblx0bWVhbixcclxufSBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IERhc2hib2FyZFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vZGFzaGJvYXJkLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtcclxuXHRBR0dSRUdBVEVfVFlQRVNfVEVYVCxcclxuXHRBTExfQUdHUkVHQVRFX1RZUEVTLFxyXG5cdERhc2hib2FyZFBvcmxldHNTZXJ2aWNlLFxyXG59IGZyb20gXCIuLi8uLi9kYXNoYm9hcmRQb3JsZXRzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQnJvd3NlciB9IGZyb20gXCJAc3luY2Z1c2lvbi9lajItYmFzZVwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBNYXNrZWRUZXh0Qm94IH0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1pbnB1dHMvc3JjL21hc2tlZHRleHRib3gvbWFza2VkdGV4dGJveFwiO1xyXG5pbXBvcnQgeyBEYXRhTWFuYWdlciB9IGZyb20gXCJAc3luY2Z1c2lvbi9lajItZGF0YS9zcmMvbWFuYWdlclwiO1xyXG5pbXBvcnQgeyBQcmVkaWNhdGUsIFF1ZXJ5IH0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1kYXRhL3NyYy9xdWVyeVwiO1xyXG5pbXBvcnQgeyBEYXRhVXRpbCB9IGZyb20gXCJAc3luY2Z1c2lvbi9lajItZGF0YVwiO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuZW5hYmxlUmlwcGxlKGZhbHNlKTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiBcInJzLWdhZGdldC1waXZvdC1jaGFydFwiLFxyXG5cdHRlbXBsYXRlVXJsOiBcIi4vZ2FkZ2V0LXBpdm90LmNvbXBvbmVudC5odG1sXCIsXHJcblx0c3R5bGVVcmxzOiBbXCIuL2dhZGdldC1waXZvdC5jb21wb25lbnQuc2Nzc1wiXSxcclxuXHRwcm92aWRlcnM6IFtcclxuXHRcdFRvb2xiYXJTZXJ2aWNlLFxyXG5cdFx0RmllbGRMaXN0U2VydmljZSxcclxuXHRcdE51bWJlckZvcm1hdHRpbmdTZXJ2aWNlLFxyXG5cdFx0Q2FsY3VsYXRlZEZpZWxkU2VydmljZSxcclxuXHRcdEdyb3VwaW5nQmFyU2VydmljZSxcclxuXHRcdFZpcnR1YWxTY3JvbGxTZXJ2aWNlLFxyXG5cdFx0RHJpbGxUaHJvdWdoU2VydmljZSxcclxuXHRdLFxyXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR2FkZ2V0UGl2b3RDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblx0QElucHV0KCkgcG9ydGxldDtcclxuXHRASW5wdXQoKSBkYXNoYm9hcmQ7XHJcblx0QElucHV0KCkgcG9ydGxldHM7XHJcblx0QE91dHB1dCgpIHVwZGF0ZVBvcmxldENvbmZpZyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHRwcml2YXRlIFBpdm90X0RhdGE6IElEYXRhU2V0W107XHJcblx0cHJpdmF0ZSBjb25maWc7XHJcblx0cHVibGljIGRhdGFTb3VyY2VTZXR0aW5nczogSURhdGFPcHRpb25zO1xyXG5cdHByaXZhdGUgZXhjbHVkZUZpZWxkcyA9IFtdO1xyXG5cdHByaXZhdGUgZmlsdGVyU2V0dGluZ3MgPSBbXTtcclxuXHRwcml2YXRlIGRhdGVQaXBlRm9ybWF0O1xyXG5cdHB1YmxpYyB0cmFuc2xhdGlvbjtcclxuXHRAVmlld0NoaWxkKFwicGl2b3R2aWV3XCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG5cdHByaXZhdGUgcGl2b3RPYmo6IFBpdm90Vmlld0NvbXBvbmVudDtcclxuXHRAVmlld0NoaWxkKFwicGl2b3RmaWVsZGxpc3RcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcblx0cHVibGljIGZpZWxkbGlzdE9iajogUGl2b3RGaWVsZExpc3RDb21wb25lbnQ7XHJcblx0cHJpdmF0ZSBncmFuZFRvdGFscyA9IHt9O1xyXG5cdHByaXZhdGUgc3ViVG90YWxzID0ge307XHJcblx0cHJpdmF0ZSBwcmV2aW91c1NvcnQ6IElTb3J0O1xyXG5cdHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHRwcml2YXRlIGFsbERhdGFWYWx1ZTtcclxuXHQvLyBwcml2YXRlIGNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzO1xyXG5cdHByaXZhdGUgaXNJbml0OiBib29sZWFuID0gdHJ1ZTtcclxuXHRwcml2YXRlIHBpdm90U2VhcmNoQm94OiBNYXNrZWRUZXh0Qm94O1xyXG5cdHB1YmxpYyBkaXNwbGF5T3B0aW9uID0ge1xyXG5cdFx0dmlldzogXCJCb3RoXCIsXHJcblx0XHRwcmltYXJ5OiBcIkNoYXJ0XCIsXHJcblx0fTtcclxuXHRwdWJsaWMgY2hhcnRTZXR0aW5ncztcclxuXHRwdWJsaWMgdG9vbHRpcFNldHRpbmdzID0ge1xyXG5cdFx0ZW5hYmxlOiBmYWxzZSxcclxuXHR9O1xyXG5cdHByaXZhdGUgY29sdW1uVGV4dHMgPSBbXTtcclxuXHRwcml2YXRlIGNvbmZpZ0ZpZWxkcyA9IFtdO1xyXG5cdHByaXZhdGUgcXVhcnRlckZvcm1hdCA9IFtcclxuXHRcdHsgdmFsdWU6IFwiMDMvMjAyMVwiLCBmb3JtYXQ6IFwiTU0veXl5eVwiIH0sXHJcblx0XHR7IHZhbHVlOiBcIjAzLzIxXCIsIGZvcm1hdDogXCJNTS9kZFwiIH0sXHJcblx0XHR7IHZhbHVlOiBcIjMvMjAyMVwiLCBmb3JtYXQ6IFwiTS95eXl5XCIgfSxcclxuXHRcdHsgdmFsdWU6IFwiMy8yMVwiLCBmb3JtYXQ6IFwiTS95eVwiIH0sXHJcblx0XHR7IHZhbHVlOiBcIk1hcmNoIDIwMjFcIiwgZm9ybWF0OiBcIk1NTU0geXl5eVwiIH0sXHJcblx0XHR7IHZhbHVlOiBcIk1hciwgMjAyMVwiLCBmb3JtYXQ6IFwiTU1NLCB5eXl5XCIgfSxcclxuXHRcdHsgdmFsdWU6IFwiTWFyY2gsIDIwMjFcIiwgZm9ybWF0OiBcIk1NTU0sIHl5eXlcIiB9LFxyXG5cdFx0eyB2YWx1ZTogXCIyMDIxXCIsIGZvcm1hdDogXCJ5eXl5XCIgfSxcclxuXHRdO1xyXG5cdHpvb21TZXR0aW5ncyA9IHtcclxuXHRcdGVuYWJsZTogZmFsc2UsXHJcblx0fTtcclxuXHRpdGVtRGF0YVR5cGVTb3J0QXJyID0gW1xyXG5cdFx0XCJBc3NldHNcIixcclxuXHRcdFwiTGlhYmlsaXRpZXNcIixcclxuXHRcdFwiRXF1aXR5XCIsXHJcblx0XHRcIlAmTFwiLFxyXG5cdFx0XCJDYXNoZmxvd1wiLFxyXG5cdF07XHJcblx0cHJpdmF0ZSBmb3JtYXREYXRlcyA9IFtdO1xyXG5cdHByaXZhdGUgY3VzdG9tQ2FsY3VsYXRlZEZpZWxkczogYW55W10gPSBbXTsgLy8g6Ieq5a6a5LmJ6K6h566X5YiXXHJcblx0cHJpdmF0ZSBhbGxvd2VkQ2FsY3VsYXRlZEZpZWxkczogYW55W10gPSBbXTsgLy8g5YWB6K646Ieq5a6a5LmJ566X5rOV55qE5a2X5q61XHJcblx0cHJpdmF0ZSB6ZXJvRm9ybWF0RGF0YSA9IHtcclxuXHRcdGVtcHR5TGlzdDogW10sXHJcblx0XHRoZ0xpc3Q6IFtdLFxyXG5cdH07XHJcblx0cHJpdmF0ZSBtaWxsaW9uRmllbGRzID0gW107XHJcblx0cHJpdmF0ZSB0ZW1wU3VidG90YWxzID0gW107XHJcblx0cHVibGljIG9yZGVyQnlDb2x1bW5zOyAvLyBFZzogXCJEdWVEYXRlLCBTZXF1ZW5jZVwiXHJcblx0cHVibGljIGlzQXBwbHlJUlI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRwdWJsaWMgY2FsY0lSUkRhdGE6IGFueTtcclxuXHRwcml2YXRlIHBlcmNlbnROdW1GaWVsZHMgPSBbXTtcclxuXHRwdWJsaWMgcGFnZUxvYWRpbmc7XHJcblx0b2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKCk7XHJcblx0cHVibGljIGlzbG9hZGVkOiBib29sZWFuOyAvLyDmmK/lkKblt7Lnu4/liJ3lp4vljJbov4dcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcml2YXRlIGRhc2hib2FyZFBvcmxldHNTZXJ2aWNlOiBEYXNoYm9hcmRQb3JsZXRzU2VydmljZSxcclxuXHRcdHByaXZhdGUgZGFzaGJvYXJkU2VydmljZTogRGFzaGJvYXJkU2VydmljZSxcclxuXHRcdHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuXHRcdEBPcHRpb25hbCgpIEBJbmplY3QoUEJGX1RPS0VOKSBwcml2YXRlIHBiZjogYW55LFxyXG5cdCkge31cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLmNoYXJ0U2V0dGluZ3MgPSB7XHJcblx0XHRcdGxlZ2VuZFNldHRpbmdzOiB7XHJcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXHJcblx0XHRcdH0sXHJcblx0XHRcdGVuYWJsZU11bHRpcGxlQXhpczogZmFsc2UsXHJcblx0XHRcdHNob3dNdWx0aUxldmVsTGFiZWxzOiBmYWxzZSxcclxuXHRcdFx0Y2hhcnRTZXJpZXM6IHtcclxuXHRcdFx0XHR0eXBlOiBcIkNvbHVtblwiLFxyXG5cdFx0XHRcdGNvbHVtblNwYWNpbmc6IDAuMSxcclxuXHRcdFx0XHRjb2x1bW5XaWR0aDogMC45LFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRtdWx0aXBsZUF4aXNNb2RlOiBcIlN0YWNrZWRcIixcclxuXHRcdFx0cHJpbWFyeVhBeGlzOiB7XHJcblx0XHRcdFx0dGl0bGU6IFwiIFwiLFxyXG5cdFx0XHRcdGxhYmVsRm9ybWF0OiBcIk4yXCIsXHJcblx0XHRcdFx0bWFqb3JHcmlkTGluZXM6IHsgd2lkdGg6IDAgfSxcclxuXHRcdFx0XHRtaW5vckdyaWRMaW5lczoge1xyXG5cdFx0XHRcdFx0d2lkdGg6IDAsXHJcblx0XHRcdFx0XHRjb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxyXG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRtaW5vclRpY2tMaW5lczogeyB2aXNpYmxlOiBmYWxzZSB9LFxyXG5cdFx0XHRcdGxpbmVTdHlsZToge1xyXG5cdFx0XHRcdFx0d2lkdGg6IDAsXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0fSxcclxuXHRcdFx0Y2hhcnRBcmVhOiB7XHJcblx0XHRcdFx0b3BhY2l0eTogMCxcclxuXHRcdFx0XHRib3JkZXI6IHtcclxuXHRcdFx0XHRcdHdpZHRoOiAwLFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdH0sXHJcblx0XHRcdHBhbGV0dGVzOiBbXHJcblx0XHRcdFx0XCIjNTk0YmI5XCIsXHJcblx0XHRcdFx0XCIjZjFhZjMyXCIsXHJcblx0XHRcdFx0XCIjNDY4OGVkXCIsXHJcblx0XHRcdFx0XCIjZTA1NjNlXCIsXHJcblx0XHRcdFx0XCIjODAzYTYzXCIsXHJcblx0XHRcdFx0XCIjNmRkOGI1XCIsXHJcblx0XHRcdFx0XCIjZTg3MjI1XCIsXHJcblx0XHRcdFx0XCIjYzVkZjQyXCIsXHJcblx0XHRcdFx0XCIjYzY0MzdkXCIsXHJcblx0XHRcdF0sXHJcblx0XHRcdHByaW1hcnlZQXhpczoge1xyXG5cdFx0XHRcdC8vIFnovbTmoIfpopjorr7nva7kuLrnqbpcclxuXHRcdFx0XHR0aXRsZTogXCIgXCIsXHJcblx0XHRcdFx0bGFiZWxGb3JtYXQ6IFwiTjJcIixcclxuXHRcdFx0fSxcclxuXHRcdFx0em9vbVNldHRpbmdzOiB7XHJcblx0XHRcdFx0ZW5hYmxlTW91c2VXaGVlbFpvb21pbmc6IGZhbHNlLCAvLyDnpoHnlKjpvKDmoIfmu5rova7nvKnmlL5cclxuXHRcdFx0XHRlbmFibGVQaW5jaFpvb21pbmc6IGZhbHNlLCAvLyDnpoHnlKjop6bmkbjnvKnmlL5cclxuXHRcdFx0XHRlbmFibGVTZWxlY3Rpb25ab29taW5nOiBmYWxzZSwgLy8g56aB55So6YCJ5oup5Yy65Z+f57yp5pS+XHJcblx0XHRcdFx0ZW5hYmxlRGVmZXJyZWRab29taW5nOiBmYWxzZSwgLy8g56aB55So5bu26L+f57yp5pS+XHJcblx0XHRcdFx0dG9vbGJhckl0ZW1zOiBbXSxcclxuXHRcdFx0XHRlbmFibGVTY3JvbGxiYXI6IGZhbHNlLFxyXG5cdFx0XHRcdGVuYWJsZVpvb21pbmc6IGZhbHNlLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHR0aXRsZTogXCIgXCIsXHJcblx0XHR9O1xyXG5cdFx0dGhpcy5nZXRJbmZvKCk7XHJcblx0XHR0aGlzLmdldERhdGEoKTtcclxuXHR9XHJcblxyXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0U3RhcnRSZWZyZXNoKCkuc3Vic2NyaWJlKChkYXNoYm9hcmRJZCkgPT4ge1xyXG5cdFx0XHRcdGlmICh0aGlzLmRhc2hib2FyZC5pZCA9PT0gZGFzaGJvYXJkSWQpIHtcclxuXHRcdFx0XHRcdHRoaXMucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHRcdFx0dGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuXHRcdFx0dGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmdldFJlZnJlc2hHYWRnZXQoKS5zdWJzY3JpYmUoKGUpID0+IHtcclxuXHRcdFx0XHRpZiAoIWUpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgaWQgPSBlW1wibmV3SWRcIl07XHJcblx0XHRcdFx0Y29uc3QgY29uZmlnID0gZVtcImNvbmZpZ1wiXTtcclxuXHRcdFx0XHRpZiAoaWQgPT09IHRoaXMucG9ydGxldC5uZXdJZCB8fCBpZCA9PT0gdGhpcy5wb3J0bGV0LmlkKSB7XHJcblx0XHRcdFx0XHR0aGlzLnBhZ2VMb2FkaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0XHR0aGlzLmdldERhdGEoY29uZmlnKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0Y2hhbmdlUGl2b3QoKS5zdWJzY3JpYmUoKHVwZGF0ZWQpID0+IHtcclxuXHRcdFx0XHRpZiAodXBkYXRlZCA9PT0gdGhpcy5wb3J0bGV0Lm5ld0lkKSB7XHJcblx0XHRcdFx0XHR0aGlzLmdldERhdGEoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0VXBkYXRlZCgpLnN1YnNjcmliZSgobmV3SWQpID0+IHtcclxuXHRcdFx0XHRpZiAobmV3SWQgPT09IHRoaXMucG9ydGxldC5uZXdJZCB8fCBuZXdJZCA9PT0gdGhpcy5wb3J0bGV0LmlkKSB7XHJcblx0XHRcdFx0XHR0aGlzLmdldERhdGEoKTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnBpdm90T2JqKSB0aGlzLnBpdm90T2JqLnJlZnJlc2hEYXRhKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuXHRcdFx0dGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmdldFRhYmxlRm9ybWF0KCkuc3Vic2NyaWJlKCh1cGRhdGVkKSA9PiB7XHJcblx0XHRcdFx0aWYgKHVwZGF0ZWQgPT09IHRoaXMucG9ydGxldC5uZXdJZCkge1xyXG5cdFx0XHRcdFx0dGhpcy5nZXREYXRhKCk7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5waXZvdE9iaikgdGhpcy5waXZvdE9iai5yZWZyZXNoRGF0YSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcblx0XHRcdHRoaXMuZGFzaGJvYXJkU2VydmljZVxyXG5cdFx0XHRcdC5jbGVhckZpZWxkTGlzdE9ic2VydmFibGUoKVxyXG5cdFx0XHRcdC5zdWJzY3JpYmUoKHVwZGF0ZWQpID0+IHtcclxuXHRcdFx0XHRcdGlmICh1cGRhdGVkID09PSB0aGlzLnBvcnRsZXQubmV3SWQpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuZGF0YVNvdXJjZSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5waXZvdE9iaikgdGhpcy5waXZvdE9iai5yZWZyZXNoRGF0YSgpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2VcclxuXHRcdFx0XHQuZ2V0UHZ0YWJsZURpc3BsYXlPcHRpb25DaGFydENoYW5nZSgpXHJcblx0XHRcdFx0LnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQhZGF0YSB8fFxyXG5cdFx0XHRcdFx0XHQhdGhpcy5wb3J0bGV0IHx8XHJcblx0XHRcdFx0XHRcdHRoaXMucG9ydGxldC5uZXdJZCAhPT0gZGF0YS5uZXdJZFxyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmICh0aGlzLmNoYXJ0U2V0dGluZ3NbXCJwb2ludFJlbmRlclwiXSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmNoYXJ0U2V0dGluZ3NbXCJwb2ludFJlbmRlclwiXS5jb21wbGV0ZSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dGhpcy5pbml0Q2hhcnRTZXR0aW5nKGRhdGEuY2hhcnRUeXBlKTtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Q29uZmlnVG9Qb3JsZXQoKTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnBpdm90T2JqKSB0aGlzLnBpdm90T2JqLnJlZnJlc2hEYXRhKCk7XHJcblx0XHRcdFx0fSlcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcblx0XHRcdHRoaXMuZGFzaGJvYXJkU2VydmljZVxyXG5cdFx0XHRcdC5nZXRFbmFibGVNdWx0aXBsZUF4aXNDaGFuZ2UoKVxyXG5cdFx0XHRcdC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IWRhdGEgfHxcclxuXHRcdFx0XHRcdFx0IXRoaXMucG9ydGxldCB8fFxyXG5cdFx0XHRcdFx0XHR0aGlzLnBvcnRsZXQubmV3SWQgIT09IGRhdGEubmV3SWRcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAodGhpcy5jaGFydFNldHRpbmdzW1wicG9pbnRSZW5kZXJcIl0pIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5jaGFydFNldHRpbmdzW1wicG9pbnRSZW5kZXJcIl0uY29tcGxldGUoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHRoaXMuY2hhcnRTZXR0aW5ncy5lbmFibGVNdWx0aXBsZUF4aXMgPVxyXG5cdFx0XHRcdFx0XHRkYXRhLmVuYWJsZU11bHRpcGxlQXhpcztcclxuXHJcblx0XHRcdFx0XHR0aGlzLmNoYXJ0U2V0dGluZ3MubXVsdGlwbGVBeGlzTW9kZSA9IGRhdGEubXVsdGlwbGVBeGlzTW9kZTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLmNoYXJ0U2V0dGluZ3MubGVnZW5kU2V0dGluZ3MgPSB7XHJcblx0XHRcdFx0XHRcdHZpc2libGU6IGRhdGEudmlzaWJsZSxcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR0aGlzLmNoYXJ0U2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNoYXJ0U2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMucGl2b3RPYmopXHJcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy5waXZvdE9iai5yZWZyZXNoRGF0YSgpKTtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Q29uZmlnVG9Qb3JsZXQoKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuXHRcdFx0dGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmdldENoYXJ0VHlwZUNoYW5nZSgpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdCFkYXRhIHx8XHJcblx0XHRcdFx0XHQhdGhpcy5wb3J0bGV0IHx8XHJcblx0XHRcdFx0XHR0aGlzLnBvcnRsZXQubmV3SWQgIT09IGRhdGEubmV3SWRcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5jaGFydFNldHRpbmdzLmNoYXJ0U2VyaWVzLnR5cGUgPVxyXG5cdFx0XHRcdFx0ZGF0YS5jaGFydFNldHRpbmdzLmNoYXJ0U2VyaWVzLnR5cGUgPT09IFwiU3RhY2tlZCBDb2x1bW5cIlxyXG5cdFx0XHRcdFx0XHQ/IFwiU3RhY2tpbmdDb2x1bW5cIlxyXG5cdFx0XHRcdFx0XHQ6IGRhdGEuY2hhcnRTZXR0aW5ncy5jaGFydFNlcmllcy50eXBlO1xyXG5cdFx0XHRcdHRoaXMuY2hhcnRTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2hhcnRTZXR0aW5ncyk7XHJcblx0XHRcdFx0aWYgKHRoaXMucGl2b3RPYmopIHRoaXMucGl2b3RPYmoucmVmcmVzaERhdGEoKTtcclxuXHRcdFx0XHR0aGlzLnNldENvbmZpZ1RvUG9ybGV0KCk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0VGhlbWUoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHQhZGF0YSB8fFxyXG5cdFx0XHRcdFx0IXRoaXMucG9ydGxldCB8fFxyXG5cdFx0XHRcdFx0dGhpcy5wb3J0bGV0Lm5ld0lkICE9PSBkYXRhLm5ld0lkXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuY2hhcnRTZXR0aW5ncy5wYWxldHRlcyA9IFsuLi5kYXRhLnRoZW1lXTtcclxuXHRcdFx0XHR0aGlzLmNoYXJ0U2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNoYXJ0U2V0dGluZ3MpO1xyXG5cdFx0XHRcdGlmICh0aGlzLnBpdm90T2JqKSB0aGlzLnBpdm90T2JqLmxheW91dFJlZnJlc2goKTtcclxuXHRcdFx0XHR0aGlzLnNldENvbmZpZ1RvUG9ybGV0KCk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XHJcblx0fVxyXG5cclxuXHQvLyDmib7liLDmlbDnu4TkuK3lh7rnjrDmnIDlpJrpopHmrKHnmoTlhYPntKBcclxuXHRmaW5kTW9zdEZyZXF1ZW50KGFycikge1xyXG5cdFx0bGV0IG1heENvdW50ID0gMDtcclxuXHRcdGxldCBtb3N0RnJlcXVlbnROdW0gPSBudWxsO1xyXG5cclxuXHRcdC8vIOS9v+eUqOS4gOS4quWvueixoeadpeiuoeaVsFxyXG5cdFx0Y29uc3QgY291bnRNYXAgPSB7fTtcclxuXHJcblx0XHRhcnIuZm9yRWFjaCgobnVtKSA9PiB7XHJcblx0XHRcdGNvdW50TWFwW251bV0gPSAoY291bnRNYXBbbnVtXSB8fCAwKSArIDE7XHJcblxyXG5cdFx0XHQvLyDmo4Dmn6XmmK/lkKbmmK/mnIDlpJrnmoRcclxuXHRcdFx0aWYgKGNvdW50TWFwW251bV0gPiBtYXhDb3VudCkge1xyXG5cdFx0XHRcdG1heENvdW50ID0gY291bnRNYXBbbnVtXTtcclxuXHRcdFx0XHRtb3N0RnJlcXVlbnROdW0gPSBudW07XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdHJldHVybiBtb3N0RnJlcXVlbnROdW07XHJcblx0fVxyXG5cclxuXHRsb2FkZWQoYXJncykge1xyXG5cdFx0Ly8g5om+5Yiw5omA5pyJeei9tOagh+etvlxyXG5cdFx0Y29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxyXG5cdFx0XHRgW2lkXj1cIiR7dGhpcy5waXZvdE9iai5lbGVtZW50LmlkfV9jaGFydDJfQXhpc0xhYmVsXCJdLFxyXG5cdFx0XHRbaWRePVwiJHt0aGlzLnBpdm90T2JqLmVsZW1lbnQuaWR9X2NoYXJ0M19BeGlzTGFiZWxcIl1gXHJcblx0XHQpO1xyXG5cdFx0bGV0IGlzRXJyb3JBY2N1cmFjeSA9IGZhbHNlO1xyXG5cdFx0bGV0IHhQb3NpdGlvbiA9IFtdO1xyXG5cdFx0ZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG5cdFx0XHQvLyDmmK/lkKbmnInnsr7luqbpl67pophcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdEJvb2xlYW4oTnVtYmVyKGVsZW1lbnQuaW5uZXJIVE1MKSkgJiZcclxuXHRcdFx0XHRlbGVtZW50LmlubmVySFRNTC5sZW5ndGggPiAxNVxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRpc0Vycm9yQWNjdXJhY3kgPSB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIOiusOW9leS4gOS4i3novbTmoIfnrb7nmoR45Z2Q5qCHXHJcblx0XHRcdGNvbnN0IGN1cnJlbnRYID0gcGFyc2VGbG9hdChlbGVtZW50LmdldEF0dHJpYnV0ZShcInhcIikpO1xyXG5cdFx0XHR4UG9zaXRpb24ucHVzaChjdXJyZW50WCk7XHJcblxyXG5cdFx0XHRpZiAoZWxlbWVudC5pbm5lckhUTUwuZW5kc1dpdGgoXCIuLi5cIikpIHtcclxuXHRcdFx0XHRsZXQgaW5uZXJIVE1MID0gZWxlbWVudC5pbm5lckhUTUwucmVwbGFjZShcIi4uLlwiLCBcIlwiKTtcclxuXHRcdFx0XHRlbGVtZW50LmlubmVySFRNTCA9IE51bWJlcihpbm5lckhUTUwpLnRvRml4ZWQoMik7XHJcblx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoXHJcblx0XHRcdFx0XHRcInhcIixcclxuXHRcdFx0XHRcdGN1cnJlbnRYICsgaW5uZXJIVE1MLmxlbmd0aCAqIDMgLSAzICsgXCJcIlxyXG5cdFx0XHRcdCk7IC8vIOefq+ato+mVv+W6plxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdGlmIChpc0Vycm9yQWNjdXJhY3kpIHtcclxuXHRcdFx0Ly8g5om+5Yiw5omA5pyJeei9tOagh+etvuS4reeahOW5s+Wdh3jlnZDmoIdcclxuXHRcdFx0bGV0IHggPSBtZWFuKHhQb3NpdGlvbik7XHJcblx0XHRcdGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuXHRcdFx0XHQvLyDmiYvliqjnsr7luqbkv67mraNcclxuXHRcdFx0XHRlbGVtZW50LmlubmVySFRNTCA9IE51bWJlcihlbGVtZW50LmlubmVySFRNTCkudG9GaXhlZCgyKTtcclxuXHRcdFx0XHRpZiAoZWxlbWVudC5pbm5lckhUTUwgPT09IFwiLTAuMDBcIikge1xyXG5cdFx0XHRcdFx0ZWxlbWVudC5pbm5lckhUTUwgPSBOdW1iZXIoMCkudG9GaXhlZCgyKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8g5omL5Yqo6K6+572uIHjlnZDmoIdcclxuXHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShcInhcIiwgeC50b1N0cmluZygpKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHNldENvbmZpZ1RvUG9ybGV0KCkge1xyXG5cdFx0Y29uc3QgY29uZmlnID0gSlNPTi5wYXJzZSh0aGlzLnBvcnRsZXQuY29uZmlnKTtcclxuXHRcdGlmICghY29uZmlnKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbmZpZy5wdnRhYmxlQ2hhcnRTZXR0aW5nID0ge1xyXG5cdFx0XHRkaXNwbGF5T3B0aW9uOiB0aGlzLmRpc3BsYXlPcHRpb24sXHJcblx0XHRcdGNoYXJ0U2V0dGluZ3M6IHRoaXMuY2hhcnRTZXR0aW5ncyxcclxuXHRcdH07XHJcblx0XHR0aGlzLmNoYXJ0U2V0dGluZ3NbXCJwb2ludFJlbmRlclwiXSA9IG51bGw7XHJcblx0XHR0aGlzLmNvbmZpZyA9IHsgLi4uY29uZmlnIH07XHJcblx0XHR0aGlzLnVwZGF0ZVBvcmxldENvbmZpZy5lbWl0KHtcclxuXHRcdFx0bmV3SWQ6IHRoaXMucG9ydGxldC5uZXdJZCxcclxuXHRcdFx0Y29uZmlnLFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRjaGFydFNlcmllc0NyZWF0ZWQoZSkge31cclxuXHJcblx0cHJpdmF0ZSBpbml0Q2hhcnRTZXR0aW5nKHR5cGU/OiBzdHJpbmcpIHtcclxuXHRcdGNvbnN0IHNldHRpbmcgPSB0aGlzLmNvbmZpZy5wdnRhYmxlQ2hhcnRTZXR0aW5nO1xyXG5cdFx0aWYgKCFzZXR0aW5nKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRzZXR0aW5nLmNoYXJ0U2V0dGluZ3MuY2hhcnRTZXJpZXMuZGF0YUxhYmVsID0ge1xyXG5cdFx0XHR2aXNpYmxlOiB0cnVlLCAvLyBNYWtlIHRoZSBkYXRhIGxhYmVsIHZpc2libGVcclxuXHRcdFx0cG9zaXRpb246IFwiT3V0c2lkZVwiLCAvLyBQb3NpdGlvbiB0aGUgZGF0YSBsYWJlbCBvdXRzaWRlIHRoZSBjaGFydFxyXG5cdFx0XHQvLyBEZWZpbmUgdGhlIHRlbXBsYXRlIGZvciBkYXRhIGxhYmVsIGNvbnRlbnRcclxuXHRcdFx0dGVtcGxhdGU6XHJcblx0XHRcdFx0JzxkaXYgc3R5bGU9XCJjb2xvcjogQmxhY2tcIj4gJHsocG9pbnQueSkudG9Mb2NhbGVTdHJpbmcoKX08L2Rpdj4nLFxyXG5cdFx0fTtcclxuXHRcdHRoaXMuY2hhcnRTZXR0aW5ncyA9IHtcclxuXHRcdFx0Li4uc2V0dGluZy5jaGFydFNldHRpbmdzLFxyXG5cdFx0XHRwcmltYXJ5WEF4aXM6IHtcclxuXHRcdFx0XHR0aXRsZTogXCIgXCIsXHJcblx0XHRcdFx0bGFiZWxGb3JtYXQ6IFwiTjJcIixcclxuXHRcdFx0XHRtYWpvckdyaWRMaW5lczogeyB3aWR0aDogMCB9LFxyXG5cdFx0XHRcdG1pbm9yR3JpZExpbmVzOiB7XHJcblx0XHRcdFx0XHR3aWR0aDogMCxcclxuXHRcdFx0XHRcdGNvbG9yOiBcInRyYW5zcGFyZW50XCIsXHJcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG1pbm9yVGlja0xpbmVzOiB7IHZpc2libGU6IGZhbHNlIH0sXHJcblx0XHRcdFx0bGluZVN0eWxlOiB7XHJcblx0XHRcdFx0XHR3aWR0aDogMCxcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRwb2ludFJlbmRlcjogdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZSgoYXJnczogYW55KSA9PiB7XHJcblx0XHRcdFx0aWYgKGFyZ3MgJiYgYXJncy5wb2ludCAmJiBhcmdzLnBvaW50LnkpIHtcclxuXHRcdFx0XHRcdGFyZ3MucG9pbnQueSA9IHBhcnNlRmxvYXQoYXJncy5wb2ludC55LnRvRml4ZWQoMikpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkgYXMgYW55LFxyXG5cdFx0XHRjaGFydEFyZWE6IHtcclxuXHRcdFx0XHRvcGFjaXR5OiAwLFxyXG5cdFx0XHRcdGJvcmRlcjoge1xyXG5cdFx0XHRcdFx0d2lkdGg6IDAsXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0fSxcclxuXHRcdFx0cHJpbWFyeVlBeGlzOiB7XHJcblx0XHRcdFx0Ly8gWei9tOagh+mimOiuvue9ruS4uuepulxyXG5cdFx0XHRcdHRpdGxlOiBcIiBcIixcclxuXHRcdFx0XHRsYWJlbEZvcm1hdDogXCJOMlwiLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRsb2FkZWQ6IHRoaXMuaXNsb2FkZWRcclxuXHRcdFx0XHQ/IG51bGxcclxuXHRcdFx0XHQ6ICh0aGlzLm9ic2VydmFibGUuc3Vic2NyaWJlKHRoaXMubG9hZGVkLmJpbmQodGhpcykpIGFzIGFueSksXHJcblx0XHRcdHpvb21TZXR0aW5nczoge1xyXG5cdFx0XHRcdGVuYWJsZU1vdXNlV2hlZWxab29taW5nOiBmYWxzZSwgLy8g56aB55So6byg5qCH5rua6L2u57yp5pS+XHJcblx0XHRcdFx0ZW5hYmxlUGluY2hab29taW5nOiBmYWxzZSwgLy8g56aB55So6Kem5pG457yp5pS+XHJcblx0XHRcdFx0ZW5hYmxlU2VsZWN0aW9uWm9vbWluZzogZmFsc2UsIC8vIOemgeeUqOmAieaLqeWMuuWfn+e8qeaUvlxyXG5cdFx0XHRcdGVuYWJsZURlZmVycmVkWm9vbWluZzogZmFsc2UsIC8vIOemgeeUqOW7tui/n+e8qeaUvlxyXG5cdFx0XHRcdHRvb2xiYXJJdGVtczogW10sXHJcblx0XHRcdFx0ZW5hYmxlU2Nyb2xsYmFyOiBmYWxzZSxcclxuXHRcdFx0XHRlbmFibGVab29taW5nOiBmYWxzZSxcclxuXHRcdFx0fSxcclxuXHRcdH07XHJcblx0XHR0aGlzLmlzbG9hZGVkID0gdHJ1ZTtcclxuXHRcdC8vIEB0cy1pZ25vcmVcclxuXHRcdGlmICghdGhpcy5jaGFydFNldHRpbmdzLnBhbGV0dGVzKSB7XHJcblx0XHRcdHRoaXMuY2hhcnRTZXR0aW5ncy5wYWxldHRlcyA9IFtcclxuXHRcdFx0XHRcIiM1OTRiYjlcIixcclxuXHRcdFx0XHRcIiNmMWFmMzJcIixcclxuXHRcdFx0XHRcIiM0Njg4ZWRcIixcclxuXHRcdFx0XHRcIiNlMDU2M2VcIixcclxuXHRcdFx0XHRcIiM4MDNhNjNcIixcclxuXHRcdFx0XHRcIiM2ZGQ4YjVcIixcclxuXHRcdFx0XHRcIiNlODcyMjVcIixcclxuXHRcdFx0XHRcIiNjNWRmNDJcIixcclxuXHRcdFx0XHRcIiNjNjQzN2RcIixcclxuXHRcdFx0XTtcclxuXHRcdH1cclxuXHRcdHRoaXMuY2hhcnRTZXR0aW5ncy5jaGFydFNlcmllcy5jb2x1bW5TcGFjaW5nID0gMC4xO1xyXG5cdFx0dGhpcy5jaGFydFNldHRpbmdzLmNoYXJ0U2VyaWVzLmNvbHVtbldpZHRoID0gMC45O1xyXG5cdFx0aWYgKHR5cGUpIHtcclxuXHRcdFx0dGhpcy5jaGFydFNldHRpbmdzLmNoYXJ0U2VyaWVzID0ge1xyXG5cdFx0XHRcdHR5cGUsXHJcblx0XHRcdFx0Y29sdW1uU3BhY2luZzogMC4xLFxyXG5cdFx0XHRcdGNvbHVtbldpZHRoOiAwLjksXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRvbk1lbWJlckVkaXRvck9wZW4oYXJnczogYW55KTogdm9pZCB7XHJcblx0XHQvLyDkvaDlj6/ku6XlnKjov5nph4zmoLnmja7pnIDopoHkv67mlLlhcmdz5p2l6Ieq5a6a5LmJ6L+H5ruk56qX5Y+j55qE6KGM5Li6XHJcblx0XHQvLyAxMTI0NyDkuJPpl6jkuLppdGVtIGRhdGEgdHlwZeiAjOiuvue9rlxyXG5cdFx0aWYgKGFyZ3MuZmllbGROYW1lID09PSBcIkFjY291bnRUeXBlQ29kZVwiKSB7XHJcblx0XHRcdGxldCByZXMgPSBuZXcgQXJyYXkoNSkuZmlsbChudWxsKTtcclxuXHRcdFx0Y29uc3QgZmllbGRNZW1iZXJzID0gWy4uLmFyZ3MuZmllbGRNZW1iZXJzXTtcclxuXHJcblx0XHRcdGZvciAobGV0IGkgPSBmaWVsZE1lbWJlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdFx0XHRsZXQgaW5kZXggPSAtMTtcclxuXHRcdFx0XHRjb25zdCBpdGVtID0gdGhpcy5pdGVtRGF0YVR5cGVTb3J0QXJyLmZpbmQoKG5hbWUsIGluZCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKGZpZWxkTWVtYmVyc1tpXS5hY3R1YWxUZXh0ID09PSBuYW1lKSB7XHJcblx0XHRcdFx0XHRcdGluZGV4ID0gaW5kO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIGZpZWxkTWVtYmVyc1tpXS5hY3R1YWxUZXh0ID09PSBuYW1lO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdGlmICghaXRlbSkge1xyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGZpbGxJdGVtID0gZmllbGRNZW1iZXJzLnNwbGljZShpLCAxKTtcclxuXHRcdFx0XHRyZXNbaW5kZXhdID0gZmlsbEl0ZW1bMF07XHJcblx0XHRcdH1cclxuXHRcdFx0cmVzID0gcmVzLmZpbHRlcigoaXRlbSkgPT4gaXRlbSkgfHwgW107XHJcblx0XHRcdGFyZ3MuZmllbGRNZW1iZXJzID0gWy4uLnJlcywgLi4uZmllbGRNZW1iZXJzXTtcclxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5lLW1lbWJlci1lZGl0b3ItZGlhbG9nXCIpO1xyXG5cdFx0XHRcdGlmIChlbGUpIHtcclxuXHRcdFx0XHRcdGVsZS5xdWVyeVNlbGVjdG9yKFwiLmUtZmlsdGVyLXNvcnRcIikuc2V0QXR0cmlidXRlKFxyXG5cdFx0XHRcdFx0XHRcInN0eWxlXCIsXHJcblx0XHRcdFx0XHRcdFwiZGlzcGxheTogbm9uZVwiXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRiZWZvcmVFeHBvcnQoZXhwb3J0RGF0YSkge1xyXG5cdFx0aWYgKGV4cG9ydERhdGEpIHtcclxuXHRcdFx0Y29uc3Qga2V5TWFwID0ge307XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZVNldHRpbmdzLmZvcm1hdFNldHRpbmdzLmZvckVhY2goKGRhdGEpID0+IHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRkYXRhLmZvcm1hdCA9PT0gXCIjLCMjIywsLjA7KCMsIyMjLCwuMClcIiB8fFxyXG5cdFx0XHRcdFx0ZGF0YS5mb3JtYXQgPT09IFwiIywjIyMsLDsoIywjIyMsLClcIiB8fFxyXG5cdFx0XHRcdFx0ZGF0YS5mb3JtYXQgPT09IFwiIywjIyMsLC4wMDsoIywjIyMsLC4wMClcIlxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0a2V5TWFwW2RhdGEubmFtZV0gPSB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRleHBvcnREYXRhLmRhdGFDb2xsZWN0aW9ucyAmJlxyXG5cdFx0XHRcdGV4cG9ydERhdGEuZGF0YUNvbGxlY3Rpb25zLmxlbmd0aFxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRleHBvcnREYXRhLmRhdGFDb2xsZWN0aW9uc1swXS5mb3JFYWNoKChyb3cpID0+IHtcclxuXHRcdFx0XHRcdHJvdy5mb3JFYWNoKChjZWxsKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChrZXlNYXBbY2VsbC5hY3R1YWxUZXh0XSkge1xyXG5cdFx0XHRcdFx0XHRcdGNlbGwudmFsdWUgPSBjZWxsLmFjdHVhbFZhbHVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhc3luYyBnZXREYXRhKGNvbmZpZz86IGFueSkge1xyXG5cdFx0dGhpcy5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG5cdFx0bGV0IGNvbHVtbnMgPSBbXTtcclxuXHRcdGxldCB2YWx1ZXMgPSBbXTtcclxuXHRcdGxldCBmb3JtYXRTZXR0aW5ncyA9IFtdO1xyXG5cdFx0bGV0IHJvd3MgPSBbXTtcclxuXHRcdGxldCBmaWVsZE1hcHBpbmcgPSBbXTtcclxuXHRcdC8vIOa4heepumdyYW5kVG90YWxz5ZKMc3ViVG90YWxzXHJcblx0XHR0aGlzLmdyYW5kVG90YWxzID0ge307XHJcblx0XHR0aGlzLnN1YlRvdGFscyA9IHt9O1xyXG5cdFx0dGhpcy5jb25maWcgPSBjb25maWdcclxuXHRcdFx0PyBKU09OLnBhcnNlKGNvbmZpZylcclxuXHRcdFx0OiBKU09OLnBhcnNlKHRoaXMucG9ydGxldC5jb25maWcpO1xyXG5cclxuXHRcdGxldCB0eXBlID1cclxuXHRcdFx0dGhpcy5jb25maWcgJiZcclxuXHRcdFx0dGhpcy5jb25maWcucHZ0YWJsZUNoYXJ0U2V0dGluZyAmJlxyXG5cdFx0XHR0aGlzLmNvbmZpZy5wdnRhYmxlQ2hhcnRTZXR0aW5nLmNoYXJ0U2V0dGluZ3NcclxuXHRcdFx0XHQ/IHRoaXMuY29uZmlnLnB2dGFibGVDaGFydFNldHRpbmcuY2hhcnRTZXR0aW5ncy5jaGFydFNlcmllcy50eXBlXHJcblx0XHRcdFx0OiBudWxsO1xyXG5cdFx0aWYgKHR5cGUgJiYgdHlwZSA9PT0gXCJTdGFja2VkIENvbHVtblwiKSB7XHJcblx0XHRcdHR5cGUgPSBcIlN0YWNraW5nQ29sdW1uXCI7XHJcblx0XHR9XHJcblx0XHR0aGlzLmluaXRDaGFydFNldHRpbmcodHlwZSk7XHJcblxyXG5cdFx0aWYgKHRoaXMuY29uZmlnLmZpZWxkcykge1xyXG5cdFx0XHR0aGlzLmNvbmZpZ0ZpZWxkcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcuZmllbGRzKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5QaXZvdF9EYXRhID0gdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5nZXRSZXN1bHRCeURhdGFUYWJsZShcclxuXHRcdFx0dGhpcy5wb3J0bGV0LFxyXG5cdFx0XHRmYWxzZSxcclxuXHRcdFx0ZmFsc2UsXHJcblx0XHRcdHRoaXMuZGFzaGJvYXJkLmlkXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMub3JkZXJCeUNvbHVtbnMgPSB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmdldE9yZGVyQnlDb2x1bW5zTmV3KFxyXG5cdFx0XHR0aGlzLnBvcnRsZXQuZmlndXJlQ29kZSxcclxuXHRcdFx0dGhpcy5kYXNoYm9hcmRcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5QaXZvdF9EYXRhID0gRGF0YVV0aWwucGFyc2UucGFyc2VKc29uKHRoaXMuUGl2b3RfRGF0YSk7XHJcblx0XHRpZiAodGhpcy5QaXZvdF9EYXRhICYmIHRoaXMuUGl2b3RfRGF0YS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHRoaXMuZ2V0ZXhjbHVkZUZpZWxkcyh0aGlzLmNvbmZpZ0ZpZWxkcywgdGhpcy5QaXZvdF9EYXRhWzBdKTtcclxuXHRcdFx0aWYgKCF0aGlzLmFsbG93ZWRDYWxjdWxhdGVkRmllbGRzLmxlbmd0aCkge1xyXG5cdFx0XHRcdHRoaXMuYWxsb3dlZENhbGN1bGF0ZWRGaWVsZHMgPSBPYmplY3Qua2V5cyh0aGlzLlBpdm90X0RhdGFbMF0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IGl0ZW0gb2YgdGhpcy5jb25maWdGaWVsZHMpIHtcclxuXHRcdFx0XHRmaWVsZE1hcHBpbmcucHVzaCh7XHJcblx0XHRcdFx0XHRuYW1lOiBpdGVtLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRjYXB0aW9uOiBpdGVtLmFkZHRpb25OYW1lXHJcblx0XHRcdFx0XHRcdD8gYCR7aXRlbS5sYW5nVmFsdWV9ICR7aXRlbS5hZGR0aW9uTmFtZX1gXHJcblx0XHRcdFx0XHRcdDogaXRlbS5sYW5nVmFsdWUsXHJcblx0XHRcdFx0XHRkYXRhVHlwZTogaXRlbS5kYXRhVHlwZSxcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuY29uZmlnRmllbGRzKSB7XHJcblx0XHRcdHRoaXMucGVyY2VudE51bUZpZWxkcyA9IFtdO1xyXG5cdFx0XHR0aGlzLmZvcm1hdERhdGVzID0gW107XHJcblx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuaGdMaXN0ID0gW107XHJcblx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuZW1wdHlMaXN0ID0gW107XHJcblx0XHRcdHRoaXMubWlsbGlvbkZpZWxkcyA9IFtdO1xyXG5cdFx0XHR0aGlzLmNvbmZpZ0ZpZWxkcy5tYXAoKGVsKSA9PiB7XHJcblx0XHRcdFx0Ly8gU01QMi0yNDg2ICYgcGVyY2VudE51beeahGZvcm1hdOmXrumimFxyXG5cdFx0XHRcdGlmIChlbC5kYXRhVHlwZSA9PSBcInBlcmNlbnROdW1cIikge1xyXG5cdFx0XHRcdFx0dGhpcy5wZXJjZW50TnVtRmllbGRzLnB1c2goZWwuY29sTmFtZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGVsLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0ZWwuZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0ZWwuZm9ybWF0WzBdLmZvcm1hdENoZWNrZWQgJiZcclxuXHRcdFx0XHRcdFsyLCA1LCA4LCAxMSwgMTQsIDE3XS5pbmNsdWRlcyhlbC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXQpXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0dGhpcy56ZXJvRm9ybWF0RGF0YS5oZ0xpc3QucHVzaChlbC5jb2xOYW1lKTtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRlbC5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdGVsLmZvcm1hdC5sZW5ndGggJiZcclxuXHRcdFx0XHRcdGVsLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkICYmXHJcblx0XHRcdFx0XHRbMywgNiwgOSwgMTIsIDE1LCAxOF0uaW5jbHVkZXMoZWwuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuZW1wdHlMaXN0LnB1c2goZWwuY29sTmFtZSk7XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0ZWwuZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRlbC5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRlbC5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZCAmJlxyXG5cdFx0XHRcdFx0WzEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMThdLmluY2x1ZGVzKFxyXG5cdFx0XHRcdFx0XHRlbC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXRcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpXHJcblx0XHRcdFx0XHR0aGlzLm1pbGxpb25GaWVsZHMucHVzaChlbC5jb2xOYW1lKTtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRlbC5kYXRhVHlwZSA9PT0gXCJudW1iZXJcIiAmJlxyXG5cdFx0XHRcdFx0KCFlbC5mb3JtYXQgfHxcclxuXHRcdFx0XHRcdFx0KGVsLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0XHRcdGVsLmZvcm1hdC5sZW5ndGggJiZcclxuXHRcdFx0XHRcdFx0XHQhZWwuZm9ybWF0WzBdLmZvcm1hdENoZWNrZWQpKVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgZm9ybWF0RGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0bmFtZTogZWwuY29sTmFtZSxcclxuXHRcdFx0XHRcdFx0Ly9TTVAyLTMwMjYgYW5kIFNNUDItMzA1OVxyXG5cdFx0XHRcdFx0XHRmb3JtYXQ6XHJcblx0XHRcdFx0XHRcdFx0ZWwuY29sTmFtZSAhPT0gXCJQb3J0SW52U3RrXCIgJiZcclxuXHRcdFx0XHRcdFx0XHRlbC5jb2xOYW1lICE9PSBcIlBvcnRGZEludlN0a1wiXHJcblx0XHRcdFx0XHRcdFx0XHQ/IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0TnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVsLmRwXHJcblx0XHRcdFx0XHRcdFx0XHQgIClcclxuXHRcdFx0XHRcdFx0XHRcdDogXCIjIzAuIyMjIyMjIzBcIixcclxuXHRcdFx0XHRcdFx0dXNlR3JvdXBpbmc6IHRydWUsXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3MucHVzaChmb3JtYXREYXRhKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0KGVsLmRhdGFUeXBlID09PSBcInBlcmNlbnRcIiB8fFxyXG5cdFx0XHRcdFx0XHRlbC5kYXRhVHlwZSA9PT0gXCJwZXJjZW50TnVtXCIpICYmXHJcblx0XHRcdFx0XHQoIWVsLmZvcm1hdCB8fFxyXG5cdFx0XHRcdFx0XHQoZWwuZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRcdFx0ZWwuZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0XHRcdCFlbC5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZCkpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRjb25zdCBmb3JtYXREYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBlbC5jb2xOYW1lLFxyXG5cdFx0XHRcdFx0XHRmb3JtYXQ6IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRlbC5kcFxyXG5cdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goZm9ybWF0RGF0YSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGVsLmRhdGFUeXBlID09PSBcIm11bHRpcGxlXCIgJiZcclxuXHRcdFx0XHRcdCghZWwuZm9ybWF0IHx8XHJcblx0XHRcdFx0XHRcdChlbC5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdFx0XHRlbC5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdFx0IWVsLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkKSlcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGZvcm1hdERhdGEgPSB7XHJcblx0XHRcdFx0XHRcdG5hbWU6IGVsLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRcdGZvcm1hdDogdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5mb3JtYXRNdWx0aXBsZShcclxuXHRcdFx0XHRcdFx0XHRlbC5kcFxyXG5cdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goZm9ybWF0RGF0YSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChlbC5kYXRhVHlwZSA9PT0gXCJkYXRldGltZVwiIHx8IGVsLmRhdGFUeXBlID09PSBcImRhdGVcIikge1xyXG5cdFx0XHRcdFx0bGV0IGZvcm1hdCA9IFwiXCI7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdGVsLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0XHRlbC5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdGVsLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGVsLmZvcm1hdFswXS5kYXRlVHlwZSA9PSBcIlF1YXJ0ZXJcIikge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBmb3JtYXRfID0gZWwuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0RGlzcGxheTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgZm9ybWF0SW5mbyA9IHRoaXMucXVhcnRlckZvcm1hdC5maWx0ZXIoXHJcblx0XHRcdFx0XHRcdFx0XHQocXVyKSA9PiBxdXIudmFsdWUgPT0gZm9ybWF0X1xyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGZvcm1hdEluZm8ubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBmb3JtYXRJbmZvWzBdLmZvcm1hdDtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZm9ybWF0RGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogZWwuY29sTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0OiBmb3JtYXRfLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGVcIixcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmZvcm1hdERhdGVzLnB1c2goZm9ybWF0RGF0YSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGVsLmZvcm1hdFswXS5kYXRlVHlwZSA9PSBcIkRhdGVcIikge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBmcm9tSWR4ID1cclxuXHRcdFx0XHRcdFx0XHRcdGVsLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdERpc3BsYXkuaW5kZXhPZihcIihcIik7XHJcblx0XHRcdFx0XHRcdFx0bGV0IHRvSWR4ID1cclxuXHRcdFx0XHRcdFx0XHRcdGVsLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdERpc3BsYXkuaW5kZXhPZihcIilcIik7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGZvcm1hdF8gPVxyXG5cdFx0XHRcdFx0XHRcdFx0ZWwuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0RGlzcGxheS5zbGljZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZnJvbUlkeCArIDEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRvSWR4XHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdHN3aXRjaCAoZm9ybWF0Xykge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkREL01NL1lZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJkZC9NTS95eXl5XCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkREL01NL1lZXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9IFwiZGQvTU0veXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0vREQvWVlZWVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBcIk1NL2RkL3l5eXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0vREQvWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJNTS9kZC95eVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJZWVlZLU1NLUREXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9IFwieXl5eS1NTS1kZFwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJZWS1NTS1ERFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBcInl5LU1NLWRkXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkRELU1NLVlZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJkZC1NTS15eXl5XCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkRELU1NLVlZXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9IFwiZGQtTU0teXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0tREQtWVlZWVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBcIk1NLWRkLXl5eXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0tREQtWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJNTS1kZC15eVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJNTU0gREQsIFlZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJNTU0gZGQsIHl5eXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiREQtTU1NLVlZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJkZC1NTU0teXl5eVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCFmb3JtYXQpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZm9ybWF0RGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiBlbC5jb2xOYW1lLFxyXG5cdFx0XHRcdFx0XHRcdGZvcm1hdDogdGhpcy5kYXRlUGlwZUZvcm1hdCxcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGVcIixcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3MucHVzaChmb3JtYXREYXRhKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGZvcm1hdERhdGEgPSB7XHJcblx0XHRcdFx0XHRcdFx0bmFtZTogZWwuY29sTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXQ6IGZvcm1hdCxcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGVcIixcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3MucHVzaChmb3JtYXREYXRhKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdFx0Ly9jYWxjdWxhdGVkRmllbGRTZXR0aW5ncyBmb3JtYXQgcHVzaCB0byBmb3JtYXRTZXR0aW5nc1xyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLmNvbmZpZy5jYWxjdWxhdGVkRmllbGRTZXR0aW5ncyAmJlxyXG5cdFx0XHR0aGlzLmNvbmZpZy5jYWxjdWxhdGVkRmllbGRTZXR0aW5ncy5sZW5ndGggPiAwXHJcblx0XHQpIHtcclxuXHRcdFx0dGhpcy5jb25maWcuY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MubWFwKChlbCkgPT4ge1xyXG5cdFx0XHRcdGlmIChlbC5mb3JtYXRTdHJpbmcgIT09IFwiXCIpIHtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBlbC5uYW1lLFxyXG5cdFx0XHRcdFx0XHRmb3JtYXQ6IGVsLmZvcm1hdFN0cmluZyxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRsZXQgc2VyaWVzID0gdGhpcy5jb25maWcueWF4aXMuc2VyaWVzO1xyXG5cdFx0aWYgKHNlcmllcykge1xyXG5cdFx0XHRmb3IgKGxldCBpdGVtIG9mIHNlcmllcykge1xyXG5cdFx0XHRcdGNvbnN0IHZhbHVlID0ge1xyXG5cdFx0XHRcdFx0bmFtZTogaXRlbS5jb2xOYW1lLFxyXG5cdFx0XHRcdFx0Y2FwdGlvbjogaXRlbS50aXRsZSxcclxuXHRcdFx0XHRcdHR5cGU6IGl0ZW0uY2FsTWV0aG9kLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0dmFsdWVzLnB1c2godmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRsZXQgZ3JvdXBzID0gdGhpcy5jb25maWcueGF4aXMuZ3JvdXBzO1xyXG5cdFx0aWYgKGdyb3Vwcykge1xyXG5cdFx0XHRmb3IgKGxldCBnaXRlbSBvZiBncm91cHMpIHtcclxuXHRcdFx0XHRjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHRcdChlbCkgPT4gZWwuY29sTmFtZSA9PT0gZ2l0ZW0ubmFtZVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0aWYgKGZpZWxkLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdGdpdGVtLnNob3dTdWJUb3RhbHMgPSBmaWVsZFswXS5zaG93U3ViVG90YWxzO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyb3dzLnB1c2goZ2l0ZW0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5jb25maWcuY29sdW1uR3JvdXAgJiYgdGhpcy5jb25maWcuY29sdW1uR3JvdXAubGVuZ3RoKSB7XHJcblx0XHRcdGZvciAobGV0IGl0ZW0gb2YgdGhpcy5jb25maWcuY29sdW1uR3JvdXApIHtcclxuXHRcdFx0XHRjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHRcdChlbCkgPT4gZWwuY29sTmFtZSA9PT0gaXRlbS5uYW1lXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRpZiAoZmllbGQubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0aXRlbS5zaG93U3ViVG90YWxzID0gZmllbGRbMF0uc2hvd1N1YlRvdGFscztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29sdW1ucy5wdXNoKGl0ZW0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRsZXQgY29uZGl0aW9uYWxGb3JtYXRTZXR0aW5ncyA9IFtdO1xyXG5cdFx0dGhpcy5jb25maWdGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuXHRcdFx0aWYgKGZpZWxkLmZvcm1hdCAmJiBmaWVsZC5mb3JtYXQubGVuZ3RoKSB7XHJcblx0XHRcdFx0aWYgKGZpZWxkLmZvcm1hdFswXS5mb250U2V0dGluZ0NoZWNrZWQpIHtcclxuXHRcdFx0XHRcdGxldCBjb25kaXRpb25hbEZvcm1hdE9iaiA9IHtcclxuXHRcdFx0XHRcdFx0YXBwbHlHcmFuZFRvdGFsczogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0bWVhc3VyZTogXCJcIixcclxuXHRcdFx0XHRcdFx0dmFsdWUxOiBudWxsLFxyXG5cdFx0XHRcdFx0XHR2YWx1ZTI6IG51bGwsXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbnM6IFwiXCIsXHJcblx0XHRcdFx0XHRcdHN0eWxlOiB7XHJcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdGNvbG9yOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdGZvbnRGYW1pbHk6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0Zm9udFNpemU6IFwiXCIsXHJcblx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0bGV0IG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaiA9IHtcclxuXHRcdFx0XHRcdFx0YXBwbHlHcmFuZFRvdGFsczogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0bWVhc3VyZTogXCJcIixcclxuXHRcdFx0XHRcdFx0dmFsdWUxOiBudWxsLFxyXG5cdFx0XHRcdFx0XHR2YWx1ZTI6IG51bGwsXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbnM6IFwiXCIsXHJcblx0XHRcdFx0XHRcdHN0eWxlOiB7XHJcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdGNvbG9yOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdGZvbnRGYW1pbHk6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0Zm9udFNpemU6IFwiXCIsXHJcblx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0Ly8gZm9udCBzZXR0aW5nIHN0YXJ0XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoubWVhc3VyZSA9XHJcblx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZpZWxkO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoubWVhc3VyZSA9XHJcblx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZpZWxkO1xyXG5cclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLmZvcm1hdENoZWNrZWQgJiZcclxuXHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLmNvbXBhcmVTZWxlY3RcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldENvbXBhcmVDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRkZWxldGUgY29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUyO1xyXG5cdFx0XHRcdFx0XHRkZWxldGUgbmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMjtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJMZXNzVGhhblwiO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJHcmVhdGVyVGhhblwiO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXSxcclxuXHRcdFx0XHRcdFx0XHQtMVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLFxyXG5cdFx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0U2V0dGluZ3MucHVzaChuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmopO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRTZXR0aW5ncy51bnNoaWZ0KGNvbmRpdGlvbmFsRm9ybWF0T2JqKTtcclxuXHRcdFx0XHRcdC8vIGZvbnQgc2V0dGluZyBlbmRcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0bGV0IGZvcm1hdFNldHRpbmdzT2JqID0ge1xyXG5cdFx0XHRcdFx0bmFtZTogXCJcIixcclxuXHRcdFx0XHRcdGZvcm1hdDogXCJcIixcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGlmIChmaWVsZC5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZCkge1xyXG5cdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3NPYmoubmFtZSA9IGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZpZWxkO1xyXG5cdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3NPYmouZm9ybWF0ID1cclxuXHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0TnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0c3dpdGNoIChmaWVsZC5mb3JtYXRbMF0uZGF0YVR5cGUpIHtcclxuXHRcdFx0XHRcdFx0Y2FzZSBcIm51bWJlclwiOlxyXG5cdFx0XHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzT2JqLmZvcm1hdCA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLnBpdm90VGFibGVmb3JtYXROdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0Y2FzZSBcImludGVnZXJcIjpcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5nc09iai5mb3JtYXQgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0SW50ZWdlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0XHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRjYXNlIFwicGVyY2VudE51bVwiOlxyXG5cdFx0XHRcdFx0XHRjYXNlIFwicGVyY2VudFwiOlxyXG5cdFx0XHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzT2JqLmZvcm1hdCA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLnBpdm90VGFibGVmb3JtYXRQZXJjZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXRcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGNhc2UgXCJtdWx0aXBsZVwiOlxyXG5cdFx0XHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzT2JqLmZvcm1hdCA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLnBpdm90VGFibGVmb3JtYXRNdWx0aXBsZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0XHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRjYXNlIFwiZGF0ZVwiOlxyXG5cdFx0XHRcdFx0XHRjYXNlIFwiZGF0ZXRpbWVcIjpcclxuXHRcdFx0XHRcdFx0XHRsZXQgZm9ybWF0ID0gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRpZiAoZmllbGQuZm9ybWF0ICYmIGZpZWxkLmZvcm1hdC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChmaWVsZC5mb3JtYXRbMF0uZGF0ZVR5cGUgPT0gXCJRdWFydGVyXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXREaXNwbGF5O1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChmaWVsZC5mb3JtYXRbMF0uZGF0ZVR5cGUgPT0gXCJEYXRlXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGZyb21JZHggPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdERpc3BsYXkuaW5kZXhPZihcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiKFwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHRvSWR4ID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXREaXNwbGF5LmluZGV4T2YoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIilcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0RGlzcGxheS5zbGljZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZyb21JZHggKyAxLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dG9JZHhcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRpZiAoZm9ybWF0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5nc09iaiA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogZmllbGQuY29sTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0OiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGZpZWxkLmRhdGFUeXBlID0gXCJzdHJpbmdcIjtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3NPYmouZm9ybWF0ID0gdGhpcy5kYXRlUGlwZUZvcm1hdDtcclxuXHRcdFx0XHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzT2JqW1widHlwZVwiXSA9IFwiZGF0ZVwiO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLmRhdGFUeXBlICE9PSBcInN0cmluZ1wiICYmXHJcblx0XHRcdFx0XHRmb3JtYXRTZXR0aW5nc09iai5mb3JtYXRcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goZm9ybWF0U2V0dGluZ3NPYmopO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHMgPSB0aGlzLmNvbmZpZy5jdXN0b21DYWxjdWxhdGVkRmllbGRzXHJcblx0XHRcdD8gdGhpcy5jb25maWcuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkc1xyXG5cdFx0XHQ6IFtdO1xyXG5cclxuXHRcdC8vIFNNUDItNDU4MiBBR0lDIC0gRGFzaGJvYXJkIGl0ZW0gc2VxdWVuY2VcclxuXHRcdGxldCBpc0V4aXN0U2VxID0gZmFsc2U7XHJcblx0XHRsZXQgc29ydFNldHRpbmdzID0gdGhpcy5jb25maWcuc29ydFNldHRpbmdzIHx8IFtdO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLlBpdm90X0RhdGEgJiZcclxuXHRcdFx0dGhpcy5QaXZvdF9EYXRhWzBdICYmXHJcblx0XHRcdHRoaXMuUGl2b3RfRGF0YVswXS5TZXEgIT09IG51bGxcclxuXHRcdCkge1xyXG5cdFx0XHQvLyDlj5bmtohOYW1l55qE6buY6K6k5o6S5bqP77yM5qC55o2uU2Vx5p2l5o6S5bqPXHJcblx0XHRcdHNvcnRTZXR0aW5ncy5wdXNoKHsgbmFtZTogXCJOYW1lXCIsIG9yZGVyOiBcIk5vbmVcIiB9KTtcclxuXHRcdFx0aXNFeGlzdFNlcSA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRsZXQgZmlsdGVyU2V0dGluZ3MgPSB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmNoZWNrRmlsdGVyU2V0dGluZ3MoXHJcblx0XHRcdHRoaXMuY29uZmlnLFxyXG5cdFx0XHR0aGlzLmNvbmZpZ0ZpZWxkcyxcclxuXHRcdFx0dGhpcy5QaXZvdF9EYXRhXHJcblx0XHQpO1xyXG5cdFx0bGV0IG5hbWVGaWx0ZXIgPSBmaWx0ZXJTZXR0aW5ncy5maW5kKCh4KSA9PiB4Lm5hbWUgPT09IFwiTmFtZVwiKTtcclxuXHRcdC8vIOWtmOWcqCBOYW1l55qEZmlsdGVy5pe277yM5Lya5oyJ54Wn6buY6K6k5o6S5bqP77yM6ZyA6KaB5a+5TmFtZei/m+ihjFNlceaOkuW6j+WkhOeQhlxyXG5cdFx0aWYgKGlzRXhpc3RTZXEgJiYgbmFtZUZpbHRlciAmJiByb3dzLnNvbWUoKHgpID0+IHgubmFtZSA9PT0gXCJOYW1lXCIpKSB7XHJcblx0XHRcdGxldCBpdGVtcyA9IG5hbWVGaWx0ZXIuaXRlbXM7IC8vIOaLv+WIsOW9k+WJjeaOkuW6j++8jOm7mOiupEEtWlxyXG5cdFx0XHRsZXQgc2VxQXJyID0gW107XHJcblx0XHRcdGl0ZW1zLmZvckVhY2goKG5hbWUpID0+IHtcclxuXHRcdFx0XHRsZXQgb2JqID0gdGhpcy5QaXZvdF9EYXRhLmZpbmQoKHgpID0+IHguTmFtZSA9PT0gbmFtZSk7XHJcblx0XHRcdFx0bGV0IGl0ZW06IGFueSA9IHtcclxuXHRcdFx0XHRcdG5hbWU6IG5hbWUsXHJcblx0XHRcdFx0XHRzZXE6IG9iai5TZXEsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRzZXFBcnIucHVzaChpdGVtKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHNlcUFyci5zb3J0KChhLCBiKSA9PiBhLnNlcSAtIGIuc2VxKTtcclxuXHRcdFx0bmFtZUZpbHRlci5pdGVtcyA9IHNlcUFyci5tYXAoKHgpID0+IHgubmFtZSk7XHJcblx0XHR9XHJcblx0XHRsZXQgaGFzSXRlbURhdGFUeXBlID0gZmFsc2U7XHJcblx0XHRpZiAodGhpcy5QaXZvdF9EYXRhKSB7XHJcblx0XHRcdHRoaXMuUGl2b3RfRGF0YS5tYXAoKGRhdGEpID0+IHtcclxuXHRcdFx0XHRpZiAoZGF0YVtcIkFjY291bnRUeXBlQ29kZVwiXSkge1xyXG5cdFx0XHRcdFx0aGFzSXRlbURhdGFUeXBlID0gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cm93cy5mb3JFYWNoKChyb3cpID0+IHtcclxuXHRcdFx0XHRcdGlmIChkYXRhW3Jvdy5uYW1lXSA9PT0gXCJcIikge1xyXG5cdFx0XHRcdFx0XHRkYXRhW3Jvdy5uYW1lXSA9IFwibnVsbFwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdGlmIChoYXNJdGVtRGF0YVR5cGUpIHtcclxuXHRcdFx0c29ydFNldHRpbmdzLnB1c2goe1xyXG5cdFx0XHRcdG5hbWU6IFwiQWNjb3VudFR5cGVDb2RlXCIsXHJcblx0XHRcdFx0b3JkZXI6IFwiQXNjZW5kaW5nXCIsXHJcblx0XHRcdFx0bWVtYmVyc09yZGVyOiBbLi4udGhpcy5pdGVtRGF0YVR5cGVTb3J0QXJyXSxcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHR0aGlzLmRhdGFTb3VyY2VTZXR0aW5ncyA9IHtcclxuXHRcdFx0ZGF0YVNvdXJjZTogdGhpcy5QaXZvdF9EYXRhLFxyXG5cdFx0XHRyb3dzOiByb3dzLFxyXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxyXG5cdFx0XHR2YWx1ZXM6IHZhbHVlcyxcclxuXHRcdFx0ZmlsdGVyczogdGhpcy5jb25maWcuZmlsdGVycyxcclxuXHRcdFx0ZmlsdGVyU2V0dGluZ3M6IGZpbHRlclNldHRpbmdzLFxyXG5cdFx0XHRleGNsdWRlRmllbGRzOiB0aGlzLmV4Y2x1ZGVGaWVsZHMsXHJcblx0XHRcdGZvcm1hdFNldHRpbmdzOiBmb3JtYXRTZXR0aW5ncyxcclxuXHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRTZXR0aW5nczogY29uZGl0aW9uYWxGb3JtYXRTZXR0aW5ncyxcclxuXHRcdFx0ZXhwYW5kQWxsOiB0cnVlLFxyXG5cdFx0XHRlbmFibGVTb3J0aW5nOiB0cnVlLFxyXG5cdFx0XHRmaWVsZE1hcHBpbmc6IGZpZWxkTWFwcGluZyxcclxuXHRcdFx0Y2FsY3VsYXRlZEZpZWxkU2V0dGluZ3M6IHRoaXMuY29uZmlnLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzLFxyXG5cdFx0XHRzb3J0U2V0dGluZ3M6IHNvcnRTZXR0aW5ncyxcclxuXHRcdFx0dmFsdWVTb3J0U2V0dGluZ3M6IHRoaXMuY29uZmlnLnZhbHVlU29ydFNldHRpbmdzLFxyXG5cdFx0XHRzaG93R3JhbmRUb3RhbHM6IHRoaXMuY29uZmlnLnNob3dHcmFuZFRvdGFscyxcclxuXHRcdFx0c2hvd1Jvd0dyYW5kVG90YWxzOiB0aGlzLmNvbmZpZy5zaG93Um93R3JhbmRUb3RhbHMsXHJcblx0XHRcdHNob3dDb2x1bW5HcmFuZFRvdGFsczogdGhpcy5jb25maWcuc2hvd0NvbHVtbkdyYW5kVG90YWxzLFxyXG5cdFx0XHRzaG93U3ViVG90YWxzOiB0aGlzLmNvbmZpZy5zaG93U3ViVG90YWxzLFxyXG5cdFx0XHRzaG93Um93U3ViVG90YWxzOiB0aGlzLmNvbmZpZy5zaG93Um93U3ViVG90YWxzLFxyXG5cdFx0XHRzaG93Q29sdW1uU3ViVG90YWxzOiB0aGlzLmNvbmZpZy5zaG93Q29sdW1uU3ViVG90YWxzLFxyXG5cdFx0fTtcclxuXHRcdGlmICh0aGlzLnBpdm90T2JqKSB0aGlzLnBpdm90T2JqLnJlZnJlc2hEYXRhKCk7XHJcblx0XHR0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhZnRlclBvcHVsYXRlKGFyZ3M6IEVuZ2luZVBvcHVsYXRlZEV2ZW50QXJncyk6IHZvaWQge1xyXG5cdFx0dGhpcy50ZW1wU3VidG90YWxzID0gW107XHJcblx0XHR0aGlzLmdyYW5kVG90YWxzID0ge307XHJcblx0XHR0aGlzLnN1YlRvdGFscyA9IHt9O1xyXG5cdFx0bGV0IHRlbXBzaG93QXJyYXkgPSBbXTtcclxuXHRcdHRoaXMuY29uZmlnLnlheGlzLnNlcmllcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRpdGVtLmhhc093blByb3BlcnR5KFwic2hvd1N1YlRvdGFsc1wiKSAmJlxyXG5cdFx0XHRcdGl0ZW0uaGFzT3duUHJvcGVydHkoXCJzaG93R3JhbmRUb3RhbHNcIilcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0dGVtcHNob3dBcnJheS5wdXNoKHtcclxuXHRcdFx0XHRcdG5hbWU6IGl0ZW0uY29sTmFtZSxcclxuXHRcdFx0XHRcdGNhbE1ldGhvZDogaXRlbS5jYWxNZXRob2QsXHJcblx0XHRcdFx0XHRzaG93U3ViVG90YWxzOiBpdGVtLnNob3dTdWJUb3RhbHMsXHJcblx0XHRcdFx0XHRzaG93R3JhbmRUb3RhbHM6IGl0ZW0uc2hvd0dyYW5kVG90YWxzLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmIChpdGVtLmhhc093blByb3BlcnR5KFwic2hvd0dyYW5kVG90YWxzXCIpKSB7XHJcblx0XHRcdFx0XHR0ZW1wc2hvd0FycmF5LnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBpdGVtLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRcdGNhbE1ldGhvZDogaXRlbS5jYWxNZXRob2QsXHJcblx0XHRcdFx0XHRcdHNob3dHcmFuZFRvdGFsczogaXRlbS5zaG93R3JhbmRUb3RhbHMsXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGl0ZW0uaGFzT3duUHJvcGVydHkoXCJzaG93U3ViVG90YWxzXCIpKSB7XHJcblx0XHRcdFx0XHR0ZW1wc2hvd0FycmF5LnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBpdGVtLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRcdGNhbE1ldGhvZDogaXRlbS5jYWxNZXRob2QsXHJcblx0XHRcdFx0XHRcdHNob3dTdWJUb3RhbHM6IGl0ZW0uc2hvd1N1YlRvdGFscyxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqICYmIHRoaXMucGl2b3RPYmopIHtcclxuXHRcdFx0dGhpcy5jb25maWcuY29sdW1uR3JvdXAgPSBbXTtcclxuXHRcdFx0dGhpcy5jb25maWcueGF4aXMuZ3JvdXBzID0gW107XHJcblx0XHRcdHRoaXMuY29uZmlnLnlheGlzLnNlcmllcyA9IFtdO1xyXG5cdFx0XHR0aGlzLmNvbmZpZy5maWx0ZXJzID0gW107XHJcblx0XHRcdHRoaXMuY29uZmlnLmZpbHRlclNldHRpbmdzID0gW107XHJcblx0XHRcdHRoaXMuY29uZmlnLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzID0gW107XHJcblx0XHRcdGxldCBncm91cFNldHRpbmdzID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwiZ3JvdXBTZXR0aW5nc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBjb2x1bW5zID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwiY29sdW1uc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCByb3dzID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwicm93c1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBmaWx0ZXJzID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwiZmlsdGVyc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBmaWx0ZXJTZXR0aW5ncyA9IHRoaXMuZ2V0RGF0YVNvdXJjZVNldHRpbmdzUHJvcChcclxuXHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iaixcclxuXHRcdFx0XHRcImZpbHRlclNldHRpbmdzXCJcclxuXHRcdFx0KTtcclxuXHRcdFx0bGV0IHZhbHVlcyA9IHRoaXMuZ2V0RGF0YVNvdXJjZVNldHRpbmdzUHJvcChcclxuXHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iaixcclxuXHRcdFx0XHRcInZhbHVlc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBzb3J0U2V0dGluZ3MgPSB0aGlzLmdldERhdGFTb3VyY2VTZXR0aW5nc1Byb3AoXHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmosXHJcblx0XHRcdFx0XCJzb3J0U2V0dGluZ3NcIlxyXG5cdFx0XHQpO1xyXG5cdFx0XHRsZXQgY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MgPSB0aGlzLmdldERhdGFTb3VyY2VTZXR0aW5nc1Byb3AoXHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmosXHJcblx0XHRcdFx0XCJjYWxjdWxhdGVkRmllbGRTZXR0aW5nc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChncm91cFNldHRpbmdzLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdGZvciAobGV0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XHJcblx0XHRcdFx0XHR0aGlzLmNvbmZpZy5jb2x1bW5Hcm91cC5wdXNoKHtcclxuXHRcdFx0XHRcdFx0bmFtZTogY29sdW1uLm5hbWUsXHJcblx0XHRcdFx0XHRcdGNhcHRpb246IGNvbHVtbi5jYXB0aW9uLFxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vSWYgdGhlcmUgaXMgYSBncm91cCwgZmlyc3QgZmlsdGVyIHRoZSBjb2x1bW5zIG9mIHRoZSBncm91cCBmaWVsZCwgYW5kIHRoZW4gb25seSBzYXZlIHRoZSBsYXN0IG9uZVxyXG5cdFx0XHRcdGZvciAobGV0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRpZiAoIXN0YXJ0c1dpdGgoY29sdW1uLm5hbWUsIGdyb3VwU2V0dGluZ3NbMF0ubmFtZSArIFwiX1wiKSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmNvbmZpZy5jb2x1bW5Hcm91cC5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiBjb2x1bW4ubmFtZSxcclxuXHRcdFx0XHRcdFx0XHRjYXB0aW9uOlxyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLm5hbWUgPT09IGdyb3VwU2V0dGluZ3NbMF0ubmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IFwiXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0OiBjb2x1bW4uY2FwdGlvbixcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IHJvdyBvZiByb3dzKSB7XHJcblx0XHRcdFx0dGhpcy5jb25maWcueGF4aXMuZ3JvdXBzLnB1c2goe1xyXG5cdFx0XHRcdFx0bmFtZTogcm93Lm5hbWUsXHJcblx0XHRcdFx0XHRjYXB0aW9uOiByb3cuY2FwdGlvbixcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGxldCBmaWx0ZXIgb2YgZmlsdGVycykge1xyXG5cdFx0XHRcdHRoaXMuY29uZmlnLmZpbHRlcnMucHVzaCh7XHJcblx0XHRcdFx0XHRuYW1lOiBmaWx0ZXIubmFtZSxcclxuXHRcdFx0XHRcdGNhcHRpb246IGZpbHRlci5jYXB0aW9uLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmZpbHRlclNldHRpbmdzICYmIHRoaXMuZmlsdGVyU2V0dGluZ3MubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLmZpbHRlclNldHRpbmdzID0gdGhpcy5maWx0ZXJTZXR0aW5ncztcclxuXHRcdFx0XHR0aGlzLmNvbmZpZy5maWx0ZXJTZXR0aW5ncyA9IHRoaXMuZmlsdGVyU2V0dGluZ3M7XHJcblx0XHRcdFx0ZGVsZXRlIHRoaXMuZmlsdGVyU2V0dGluZ3M7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5jb25maWcuZmlsdGVyU2V0dGluZ3MgPSBmaWx0ZXJTZXR0aW5ncztcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcclxuXHRcdFx0XHRsZXQgc2VyaWVzRGF0YTtcclxuXHRcdFx0XHRsZXQgdGVtcFNob3dPYmo7XHJcblx0XHRcdFx0bGV0IGZpbHRlclRlbXBzaG93QXJyYXkgPSBbXTtcclxuXHRcdFx0XHRpZiAodGVtcHNob3dBcnJheS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGZpbHRlclRlbXBzaG93QXJyYXkgPSB0ZW1wc2hvd0FycmF5LmZpbHRlcihcclxuXHRcdFx0XHRcdFx0KGl0ZW0pID0+XHJcblx0XHRcdFx0XHRcdFx0aXRlbS5uYW1lID09PSB2YWx1ZS5uYW1lICYmXHJcblx0XHRcdFx0XHRcdFx0aXRlbS5jYWxNZXRob2QgPT09IHZhbHVlLnR5cGVcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRpZiAoZmlsdGVyVGVtcHNob3dBcnJheS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0dGVtcFNob3dPYmogPSBmaWx0ZXJUZW1wc2hvd0FycmF5WzBdO1xyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0dGVtcFNob3dPYmouaGFzT3duUHJvcGVydHkoXCJzaG93U3ViVG90YWxzXCIpICYmXHJcblx0XHRcdFx0XHRcdFx0dGVtcFNob3dPYmouaGFzT3duUHJvcGVydHkoXCJzaG93R3JhbmRUb3RhbHNcIilcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0c2VyaWVzRGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbE5hbWU6IHZhbHVlLm5hbWUsXHJcblx0XHRcdFx0XHRcdFx0XHRjYWxNZXRob2Q6IHZhbHVlLnR5cGUsXHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdmFsdWUuY2FwdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdHNob3dTdWJUb3RhbHM6IHRlbXBTaG93T2JqLnNob3dTdWJUb3RhbHMsXHJcblx0XHRcdFx0XHRcdFx0XHRzaG93R3JhbmRUb3RhbHM6IHRlbXBTaG93T2JqLnNob3dHcmFuZFRvdGFscyxcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGlmICh0ZW1wU2hvd09iai5oYXNPd25Qcm9wZXJ0eShcInNob3dHcmFuZFRvdGFsc1wiKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0c2VyaWVzRGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29sTmFtZTogdmFsdWUubmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FsTWV0aG9kOiB2YWx1ZS50eXBlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdmFsdWUuY2FwdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd0dyYW5kVG90YWxzOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRlbXBTaG93T2JqLnNob3dHcmFuZFRvdGFscyxcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGlmICh0ZW1wU2hvd09iai5oYXNPd25Qcm9wZXJ0eShcInNob3dTdWJUb3RhbHNcIikpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHNlcmllc0RhdGEgPSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbE5hbWU6IHZhbHVlLm5hbWUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhbE1ldGhvZDogdmFsdWUudHlwZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHZhbHVlLmNhcHRpb24sXHJcblx0XHRcdFx0XHRcdFx0XHRcdHNob3dTdWJUb3RhbHM6IHRlbXBTaG93T2JqLnNob3dTdWJUb3RhbHMsXHJcblx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIXNlcmllc0RhdGEpIHtcclxuXHRcdFx0XHRcdHNlcmllc0RhdGEgPSB7XHJcblx0XHRcdFx0XHRcdGNvbE5hbWU6IHZhbHVlLm5hbWUsXHJcblx0XHRcdFx0XHRcdHRpdGxlOiB2YWx1ZS5jYXB0aW9uLFxyXG5cdFx0XHRcdFx0XHRjYWxNZXRob2Q6IHZhbHVlLnR5cGUsXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLmNvbmZpZy55YXhpcy5zZXJpZXMucHVzaChzZXJpZXNEYXRhKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGxldCBjYWxjdWxhdGUgb2YgY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MpIHtcclxuXHRcdFx0XHRjb25zdCBjYWxjdWxhdGVEYXRhID0ge1xyXG5cdFx0XHRcdFx0bmFtZTogY2FsY3VsYXRlLm5hbWUsXHJcblx0XHRcdFx0XHRmb3JtdWxhOiBjYWxjdWxhdGUuZm9ybXVsYSxcclxuXHRcdFx0XHRcdGZvcm1hdFN0cmluZzpcclxuXHRcdFx0XHRcdFx0Y2FsY3VsYXRlLmZvcm1hdFN0cmluZyA9PT0gXCJcIlxyXG5cdFx0XHRcdFx0XHRcdD8gXCJOMlwiXHJcblx0XHRcdFx0XHRcdFx0OiBjYWxjdWxhdGUuZm9ybWF0U3RyaW5nLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0dGhpcy5jb25maWcuY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MucHVzaChjYWxjdWxhdGVEYXRhKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmNvbmZpZy5jdXN0b21DYWxjdWxhdGVkRmllbGRzID0gdGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzO1xyXG5cdFx0XHR0aGlzLmNvbmZpZy5zb3J0U2V0dGluZ3MgPSBzb3J0U2V0dGluZ3M7XHJcblx0XHRcdHRoaXMuY29uZmlnLmdyb3VwU2V0dGluZ3MgPSBncm91cFNldHRpbmdzO1xyXG5cdFx0XHR0aGlzLmZpZWxkbGlzdE9iai51cGRhdGVWaWV3KHRoaXMucGl2b3RPYmopO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5wb3J0bGV0LmNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnKTtcclxuXHRcdC8vcmVtb3ZlIHRoZSBzb3J0XHJcblx0XHRpZiAodGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Muc29ydFNldHRpbmdzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0dGhpcy5wcmV2aW91c1NvcnQgPSB0aGlzLmZpZWxkbGlzdE9iai5sYXN0U29ydEluZm87XHJcblx0XHRcdCh0aGlzLmZpZWxkbGlzdE9iaiBhcyBhbnkpLmxhc3RTb3J0SW5mbyA9IFtdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGFmdGVyRW5naW5lUG9wdWxhdGUoYXJnczogYW55KSB7XHJcblx0XHRpZiAoIUJyb3dzZXIuaXNEZXZpY2UgJiYgdGhpcy5maWVsZGxpc3RPYmogJiYgdGhpcy5waXZvdE9iaikge1xyXG5cdFx0XHR0aGlzLmNvbmZpZy5ncm91cFNldHRpbmdzID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmosXHJcblx0XHRcdFx0XCJncm91cFNldHRpbmdzXCJcclxuXHRcdFx0KTtcclxuXHRcdFx0Ly8gdGhpcy5wb3J0bGV0LmNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnKTtcclxuXHRcdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqKSB0aGlzLmZpZWxkbGlzdE9iai51cGRhdGUodGhpcy5waXZvdE9iaik7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5QaXZvdF9EYXRhICYmIHRoaXMuUGl2b3RfRGF0YS5sZW5ndGgpIHtcclxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5lbmdpbmVQb3B1bGF0ZWQoYXJncyk7XHJcblx0XHRcdH0sIDE1MDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKG9iaiwga2V5KSB7XHJcblx0XHRsZXQgcHJvcCA9IG51bGw7XHJcblx0XHRpZiAob2JqICYmIG9iai5kYXRhU291cmNlU2V0dGluZ3MpIHtcclxuXHRcdFx0cHJvcCA9IG9iai5kYXRhU291cmNlU2V0dGluZ3Nba2V5XTtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9wKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiICYmXHJcblx0XHRcdFx0cHJvcC5sZW5ndGggPiAwXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdHByb3AgPSBwcm9wLm1hcCgoaXRlbSkgPT4gaXRlbS5wcm9wZXJ0aWVzIHx8IGl0ZW0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcHJvcDtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBlbmdpbmVQb3B1bGF0aW5nKGFyZ3MpIHtcclxuXHRcdHRoaXMuZ3JhbmRUb3RhbHMgPSB7fTtcclxuXHRcdHRoaXMuc3ViVG90YWxzID0ge307XHJcblx0XHR0aGlzLmFsbERhdGFWYWx1ZSA9IFtdO1xyXG5cdFx0aWYgKGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLnNvcnRTZXR0aW5ncy5sZW5ndGgpIHtcclxuXHRcdFx0Zm9yIChcclxuXHRcdFx0XHRsZXQgaSA9IDA7XHJcblx0XHRcdFx0aSA8IGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLnNvcnRTZXR0aW5ncy5sZW5ndGg7XHJcblx0XHRcdFx0aSsrXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmxhc3RTb3J0SW5mbyAmJlxyXG5cdFx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmoubGFzdFNvcnRJbmZvLm5hbWUgPT09XHJcblx0XHRcdFx0XHRcdGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLnNvcnRTZXR0aW5nc1tpXS5uYW1lICYmXHJcblx0XHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iai5sYXN0U29ydEluZm8ub3JkZXIgPT09IFwiQXNjZW5kaW5nXCIgJiZcclxuXHRcdFx0XHRcdCEoXHJcblx0XHRcdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmxhc3RTb3J0SW5mby5uYW1lID09PVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMucHJldmlvdXNTb3J0Lm5hbWUgJiZcclxuXHRcdFx0XHRcdFx0dGhpcy5wcmV2aW91c1NvcnQub3JkZXIgPT09IFwiTm9uZVwiXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRhcmdzLmRhdGFTb3VyY2VTZXR0aW5ncy5zb3J0U2V0dGluZ3NbaV0ub3JkZXIgPSBcIk5vbmVcIjtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRcdFx0dGhpcy5wcmV2aW91c1NvcnQgJiZcclxuXHRcdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmxhc3RTb3J0SW5mbyAmJlxyXG5cdFx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmoubGFzdFNvcnRJbmZvLm5hbWUgPT09XHJcblx0XHRcdFx0XHRcdHRoaXMucHJldmlvdXNTb3J0Lm5hbWUgJiZcclxuXHRcdFx0XHRcdHRoaXMucHJldmlvdXNTb3J0Lm9yZGVyID09PSBcIkFzY2VuZGluZ1wiXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRhcmdzLmRhdGFTb3VyY2VTZXR0aW5ncy5zb3J0U2V0dGluZ3NbaV0ub3JkZXIgPSBcIkFzY2VuZGluZ1wiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGNlbGxDbGljayhhcmdzKSB7XHJcblx0XHQvLyDmuIXpmaTmjpLluo9cclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MudmFsdWVTb3J0U2V0dGluZ3Muc29ydE9yZGVyICYmXHJcblx0XHRcdHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnZhbHVlU29ydFNldHRpbmdzLmhlYWRlclRleHQgJiZcclxuXHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MudmFsdWVTb3J0U2V0dGluZ3Muc29ydE9yZGVyID09PVxyXG5cdFx0XHRcdFwiRGVzY2VuZGluZ1wiICYmXHJcblx0XHRcdGFyZ3MuZGF0YS52YWx1ZVNvcnQgJiZcclxuXHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MudmFsdWVTb3J0U2V0dGluZ3MuaGVhZGVyVGV4dCA9PT1cclxuXHRcdFx0XHRhcmdzLmRhdGEudmFsdWVTb3J0LmxldmVsTmFtZVxyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMucGl2b3RPYmouc2V0UHJvcGVydGllcyhcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRkYXRhU291cmNlU2V0dGluZ3M6IHtcclxuXHRcdFx0XHRcdFx0dmFsdWVTb3J0U2V0dGluZ3M6IHtcclxuXHRcdFx0XHRcdFx0XHRzb3J0T3JkZXI6IFwiRGVzY2VuZGluZ1wiLFxyXG5cdFx0XHRcdFx0XHRcdGhlYWRlclRleHQ6IFwiXCIsXHJcblx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0dHJ1ZVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRpZiAodGhpcy5waXZvdE9iaikgdGhpcy5waXZvdE9iai5yZWZyZXNoRGF0YSgpO1xyXG5cdFx0XHR0aGlzLmNvbmZpZy52YWx1ZVNvcnRTZXR0aW5ncyA9IHt9O1xyXG5cdFx0XHR0aGlzLnBvcnRsZXQuY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGRhdGFCb3VuZChlKSB7XHJcblx0XHRpZiAodGhpcy5pc0luaXQpIHtcclxuXHRcdFx0dGhpcy5pc0luaXQgPSBmYWxzZTtcclxuXHRcdH1cclxuXHRcdHRoaXMuZ3JhbmRUb3RhbHMgPSB7fTtcclxuXHRcdHRoaXMuc3ViVG90YWxzID0ge307XHJcblx0XHRpZiAodGhpcy5waXZvdE9iai5ncmlkKSB7XHJcblx0XHRcdHRoaXMucGl2b3RPYmouZ3JpZC5yZXNpemVTdG9wID0gdGhpcy5yZXNpemVTdG9wLmJpbmQodGhpcyk7XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqICYmXHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLnBpdm90QnV0dG9uTW9kdWxlICYmXHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLnBpdm90QnV0dG9uTW9kdWxlLm1lbnVPcHRpb25cclxuXHRcdCkge1xyXG5cdFx0XHQoXHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmoucGl2b3RCdXR0b25Nb2R1bGUubWVudU9wdGlvbiBhcyBhbnlcclxuXHRcdFx0KS5zdHJpbmdBZ2dyZWdhdGVUeXBlcyA9IFtcclxuXHRcdFx0XHRcIkNvdW50XCIsXHJcblx0XHRcdFx0XCJEaXN0aW5jdENvdW50XCIsXHJcblx0XHRcdFx0XCJGaXJzdFwiLFxyXG5cdFx0XHRcdFwiTGFzdFwiLFxyXG5cdFx0XHRdO1xyXG5cdFx0fVxyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLnBpdm90QnV0dG9uTW9kdWxlICYmXHJcblx0XHRcdHRoaXMucGl2b3RPYmoucGl2b3RCdXR0b25Nb2R1bGUubWVudU9wdGlvblxyXG5cdFx0KSB7XHJcblx0XHRcdChcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLnBpdm90QnV0dG9uTW9kdWxlLm1lbnVPcHRpb24gYXMgYW55XHJcblx0XHRcdCkuc3RyaW5nQWdncmVnYXRlVHlwZXMgPSBbXHJcblx0XHRcdFx0XCJDb3VudFwiLFxyXG5cdFx0XHRcdFwiRGlzdGluY3RDb3VudFwiLFxyXG5cdFx0XHRcdFwiRmlyc3RcIixcclxuXHRcdFx0XHRcIkxhc3RcIixcclxuXHRcdFx0XTtcclxuXHRcdH1cclxuXHRcdGxldCBhbGxTdW1tYXJ5VHlwZSA9IEFMTF9BR0dSRUdBVEVfVFlQRVMgYXMgYW55O1xyXG5cdFx0dGhpcy5waXZvdE9iai5nZXRBbGxTdW1tYXJ5VHlwZSA9ICgpID0+IGFsbFN1bW1hcnlUeXBlO1xyXG5cdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqKSB7XHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmFnZ3JlZ2F0ZVR5cGVzID0gYWxsU3VtbWFyeVR5cGU7XHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmdldEFsbFN1bW1hcnlUeXBlID0gKCkgPT4gYWxsU3VtbWFyeVR5cGU7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNhbGN1bGF0ZWRDZWxsU2V0cyhhcmdzLCBjdXJGaWVsZHMpIHtcclxuXHRcdGxldCBtYXRjaEZpZWxkcyA9IGN1ckZpZWxkc1tcIm1hdGNoRmllbGRzXCJdO1xyXG5cdFx0bGV0IGZvcm11bGEgPSBjdXJGaWVsZHNbXCJmb3JtdWxhXCJdO1xyXG5cdFx0bGV0IHZhbHVlID0gMDtcclxuXHRcdGxldCByb3dzID0gdGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Mucm93cztcclxuXHRcdGxldCBpbnZhbGlkVHlwZXMgPSBbXCJzdHJpbmdcIiwgXCJudmFyY2hhclwiLCBcImRhdGVcIiwgXCJkYXRldGltZVwiXTtcclxuXHRcdGxldCBpc0ludmFsaWQgPSBtYXRjaEZpZWxkcy5zb21lKChmKSA9PlxyXG5cdFx0XHRpbnZhbGlkVHlwZXMuaW5jbHVkZXMoXHJcblx0XHRcdFx0dGhpcy5jb25maWdGaWVsZHMuZmlsdGVyKChlbCkgPT4gZWwuY29sTmFtZSA9PT0gZi5tYXRjaFdvcmQpWzBdW1xyXG5cdFx0XHRcdFx0XCJkYXRhVHlwZVwiXHJcblx0XHRcdFx0XVxyXG5cdFx0XHQpXHJcblx0XHQpO1xyXG5cdFx0bGV0IGN1cnJlbnRyb3dDZWxsVHlwZSA9IGFyZ3Mucm93Q2VsbFR5cGU7XHJcblx0XHRpZiAoaXNJbnZhbGlkKSByZXR1cm4gXCItXCI7XHJcblx0XHRpZiAoXHJcblx0XHRcdGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwic3ViVG90YWxcIiB8fFxyXG5cdFx0XHRhcmdzLnJvd0NlbGxUeXBlID09PSBcImdyYW5kVG90YWxcIlxyXG5cdFx0KSB7XHJcblx0XHRcdGxldCBjaGlsZEhlYWRlcnMgPSBbXTtcclxuXHRcdFx0bGV0IHN1bSA9IDA7XHJcblx0XHRcdGxldCBjbG9uZUNlbGxTZXRzID0gY2xvbmVEZWVwKGFyZ3MuY2VsbFNldHMpO1xyXG5cdFx0XHRsZXQgZ3JvdXBOYW1lQXJyYXlzID0gW107XHJcblx0XHRcdGZvciAobGV0IGluZGV4ID0gYXJncy5yb3cubGV2ZWw7IGluZGV4IDwgcm93cy5sZW5ndGg7IGluZGV4KyspIHtcclxuXHRcdFx0XHRncm91cE5hbWVBcnJheXMucHVzaChyb3dzW2luZGV4XS5uYW1lKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNsb25lQ2VsbFNldHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRsZXQgdmFsdWVzID0gW107XHJcblx0XHRcdFx0bGV0IGhlYWRlciA9IGdyb3VwTmFtZUFycmF5c1xyXG5cdFx0XHRcdFx0Lm1hcCgobmFtZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaChjbG9uZUNlbGxTZXRzW2ldW25hbWVdKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGNsb25lQ2VsbFNldHNbaV1bbmFtZV07XHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0LmpvaW4oXCItXCIpO1xyXG5cdFx0XHRcdGlmICghKGNoaWxkSGVhZGVycyBhcyBhbnkpLmluY2x1ZGVzKGhlYWRlcikpIHtcclxuXHRcdFx0XHRcdGNoaWxkSGVhZGVycy5wdXNoKGhlYWRlcik7XHJcblx0XHRcdFx0XHRsZXQgZmlsdGVyT2JqOiBhbnkgPSB7fTtcclxuXHRcdFx0XHRcdGdyb3VwTmFtZUFycmF5cy5tYXAoXHJcblx0XHRcdFx0XHRcdChuYW1lLCBpKSA9PiAoZmlsdGVyT2JqW25hbWVdID0gdmFsdWVzW2ldKVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGFyZ3MuY2VsbFNldHMgPSBfZmlsdGVyKGNsb25lQ2VsbFNldHMsIGZpbHRlck9iaik7XHJcblx0XHRcdFx0XHRhcmdzLnJvd0NlbGxUeXBlID0gXCJ2YWx1ZVwiO1xyXG5cdFx0XHRcdFx0c3VtICs9IHRoaXMuY2FsY3VsYXRlZFZhbHVlcyhhcmdzLCBtYXRjaEZpZWxkcywgZm9ybXVsYSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGFyZ3Mucm93Q2VsbFR5cGUgPSBjdXJyZW50cm93Q2VsbFR5cGU7XHJcblxyXG5cdFx0XHQvLyDmmoLlrZjlvZPliY1TdWJUb3RhbO+8jCDnlKjkuo7mlLbnvKnml7bor7vlj5ZcclxuXHRcdFx0bGV0IHByZWZpeEhlYWRlciA9IHRoaXMuZ2V0Q2FsY0hlYWRlcihhcmdzLCBmb3JtdWxhKTtcclxuXHRcdFx0dGhpcy51cGRhdGVUZW1wU3VidG90YWxzKHByZWZpeEhlYWRlciwgc3VtKTtcclxuXHRcdFx0cmV0dXJuIHN1bTtcclxuXHRcdH0gZWxzZSBpZiAoYXJncy5yb3dDZWxsVHlwZSA9PT0gXCJ2YWx1ZVwiKSB7XHJcblx0XHRcdGlmIChhcmdzLnJvdy5oYXNDaGlsZCkge1xyXG5cdFx0XHRcdC8vIGNvbGxhcHNlIOivu+WPllN1YlRvdGFsXHJcblx0XHRcdFx0bGV0IGhlYWRlciA9IHRoaXMuZ2V0Q2FsY0hlYWRlcihhcmdzLCBmb3JtdWxhKTtcclxuXHRcdFx0XHRsZXQgaW5kZXggPSB0aGlzLnRlbXBTdWJ0b3RhbHMuZmluZEluZGV4KFxyXG5cdFx0XHRcdFx0KGl0ZW0pID0+IGl0ZW0ucm93TmFtZSA9PT0gaGVhZGVyXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRpZiAoaW5kZXggPiAtMSkge1xyXG5cdFx0XHRcdFx0dmFsdWUgPSB0aGlzLnRlbXBTdWJ0b3RhbHNbaW5kZXhdLnJvd1ZhbHVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBleHBhbmRcclxuXHRcdFx0XHR2YWx1ZSA9IHRoaXMuY2FsY3VsYXRlZFZhbHVlcyhhcmdzLCBtYXRjaEZpZWxkcywgZm9ybXVsYSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiB2YWx1ZTtcclxuXHR9XHJcblxyXG5cdGFjdGlvbkZhaWx1cmUoYXJnczogUGl2b3RBY3Rpb25GYWlsdXJlRXZlbnRBcmdzKTogdm9pZCB7XHJcblx0XHRpZiAoYXJncy5hY3Rpb25OYW1lID09IFwiRHJpbGwgZG93blwiIHx8IGFyZ3MuYWN0aW9uTmFtZSA9PSBcIkRyaWxsIHVwXCIpIHtcclxuXHRcdFx0Ly8gVHJpZ2dlcnMgd2hlbiB0aGUgY3VycmVudCBVSSBhY3Rpb24gZmFpbHMgdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCByZXN1bHQuXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldENhbGNIZWFkZXIoYXJncywgZm9ybXVsYT8pIHtcclxuXHRcdGxldCBoZWFkZXIgPSBcIlwiO1xyXG5cdFx0bGV0IHJvd3MgPSB0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5yb3dzO1xyXG5cdFx0bGV0IGdyb3VwTmFtZUFycmF5cyA9IFtdO1xyXG5cdFx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFyZ3Mucm93LmxldmVsOyBpbmRleCsrKSB7XHJcblx0XHRcdGdyb3VwTmFtZUFycmF5cy5wdXNoKHJvd3NbaW5kZXhdLm5hbWUpO1xyXG5cdFx0fVxyXG5cdFx0aGVhZGVyID0gZ3JvdXBOYW1lQXJyYXlzLmxlbmd0aFxyXG5cdFx0XHQ/IGdyb3VwTmFtZUFycmF5c1xyXG5cdFx0XHRcdFx0Lm1hcCgobmFtZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gYXJncy5jZWxsU2V0c1swXVtuYW1lXTtcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQuam9pbihcIi1cIikgK1xyXG5cdFx0XHQgIFwiLVwiICtcclxuXHRcdFx0ICBhcmdzLnJvdy5hY3R1YWxUZXh0XHJcblx0XHRcdDogYXJncy5yb3cuYWN0dWFsVGV4dDtcclxuXHRcdGlmIChmb3JtdWxhKSBoZWFkZXIgKz0gXCJfX19cIiArIGZvcm11bGE7XHJcblx0XHRyZXR1cm4gaGVhZGVyO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSB1cGRhdGVUZW1wU3VidG90YWxzKHJvd05hbWUsIHJvd1ZhbHVlKSB7XHJcblx0XHRsZXQgaW5kZXggPSB0aGlzLnRlbXBTdWJ0b3RhbHMuZmluZEluZGV4KFxyXG5cdFx0XHQoaXRlbSkgPT4gaXRlbS5yb3dOYW1lID09PSByb3dOYW1lXHJcblx0XHQpO1xyXG5cdFx0bGV0IHRlbXA6IGFueSA9IHt9O1xyXG5cdFx0dGVtcC5yb3dOYW1lID0gcm93TmFtZTtcclxuXHRcdHRlbXAucm93VmFsdWUgPSByb3dWYWx1ZTtcclxuXHRcdGlmIChpbmRleCA+IC0xKSB7XHJcblx0XHRcdHRoaXMudGVtcFN1YnRvdGFscy5zcGxpY2UoaW5kZXgsIDEsIHRlbXApO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy50ZW1wU3VidG90YWxzLnB1c2godGVtcCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNhbGN1bGF0ZWRWYWx1ZXMoYXJncywgbWF0Y2hGaWVsZHMsIGZvcm11bGEpIHtcclxuXHRcdGlmIChtYXRjaEZpZWxkcy5sZW5ndGgpIHtcclxuXHRcdFx0bGV0IGNhbGN1bGVkTWF0Y2hGaWVsZHMgPSBtYXRjaEZpZWxkcy5tYXAoKGYpID0+IHtcclxuXHRcdFx0XHRzd2l0Y2ggKGYubWF0Y2hNZXRob2QpIHtcclxuXHRcdFx0XHRcdGNhc2UgXCJGaXJzdFwiOlxyXG5cdFx0XHRcdFx0Y2FzZSBcIkxhc3RcIjpcclxuXHRcdFx0XHRcdFx0Zi5yZXBsYWNlVmFsdWUgPSB0aGlzLmNhbGN1bGF0ZWRGaXN0TGFzdChcclxuXHRcdFx0XHRcdFx0XHRhcmdzLFxyXG5cdFx0XHRcdFx0XHRcdGYubWF0Y2hNZXRob2QsXHJcblx0XHRcdFx0XHRcdFx0Zi5tYXRjaFdvcmRcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRjYXNlIFwiTWF4XCI6XHJcblx0XHRcdFx0XHRcdGYucmVwbGFjZVZhbHVlID0gbWF4QnkoYXJncy5jZWxsU2V0cywgKG8pID0+XHJcblx0XHRcdFx0XHRcdFx0TnVtYmVyKG9bZi5tYXRjaFdvcmRdKVxyXG5cdFx0XHRcdFx0XHQpW2YubWF0Y2hXb3JkXTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRjYXNlIFwiTWluXCI6XHJcblx0XHRcdFx0XHRcdGYucmVwbGFjZVZhbHVlID0gbWluQnkoYXJncy5jZWxsU2V0cywgKG8pID0+XHJcblx0XHRcdFx0XHRcdFx0TnVtYmVyKG9bZi5tYXRjaFdvcmRdKVxyXG5cdFx0XHRcdFx0XHQpW2YubWF0Y2hXb3JkXTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRjYXNlIFwiU3VtXCI6XHJcblx0XHRcdFx0XHRcdGYucmVwbGFjZVZhbHVlID0gc3VtQnkoYXJncy5jZWxsU2V0cywgKG8pID0+XHJcblx0XHRcdFx0XHRcdFx0TnVtYmVyKG9bZi5tYXRjaFdvcmRdKVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHQvLyBTTVAyLTQwOTQgVW5pY29ybiAtIEwzIEFkanVzdGVkIE5BViB2YWx1ZSBpc3N1ZXNcclxuXHRcdFx0XHRcdFx0Zi5yZXBsYWNlVmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdGYucmVwbGFjZVZhbHVlICYmIGYucmVwbGFjZVZhbHVlLnRvRml4ZWQoMTApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgXCJBdmdcIjpcclxuXHRcdFx0XHRcdFx0Zi5yZXBsYWNlVmFsdWUgPSBtZWFuQnkoYXJncy5jZWxsU2V0cywgKG8pID0+XHJcblx0XHRcdFx0XHRcdFx0TnVtYmVyKG9bZi5tYXRjaFdvcmRdKVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gZjtcclxuXHRcdFx0fSk7XHJcblx0XHRcdGxldCByZXN1bHRGb3JtdWxhID0gZm9ybXVsYTtcclxuXHRcdFx0aWYgKGNhbGN1bGVkTWF0Y2hGaWVsZHMubGVuZ3RoKSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjYWxjdWxlZE1hdGNoRmllbGRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRyZXN1bHRGb3JtdWxhID0gcmVzdWx0Rm9ybXVsYS5yZXBsYWNlKFxyXG5cdFx0XHRcdFx0XHRjYWxjdWxlZE1hdGNoRmllbGRzW2ldLm1hdGNoU3RyLFxyXG5cdFx0XHRcdFx0XHRcIihcIiArIGNhbGN1bGVkTWF0Y2hGaWVsZHNbaV0ucmVwbGFjZVZhbHVlICsgXCIpXCJcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0bGV0IHJlc3VsdCA9IG5ldyBGdW5jdGlvbihcclxuXHRcdFx0XHRcdFwicmV0dXJuIFwiICsgcmVzdWx0Rm9ybXVsYS5yZXBsYWNlKC9bXi08Pj86KClcXGQvKisuXS9nLCBcIlwiKVxyXG5cdFx0XHRcdCkoKTtcclxuXHRcdFx0XHRpZiAoaXNOYU4ocmVzdWx0KSB8fCAhaXNGaW5pdGUocmVzdWx0KSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIDA7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdHJldHVybiBOYU47XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiAwO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRJcnJIZWFkZXIobGV2ZWwsIGVsZSwgdHlwZSkge1xyXG5cdFx0aWYgKHR5cGUgPT09IFwicm93XCIpIHtcclxuXHRcdFx0bGV0IGN1clJvd3MgPSB0aGlzLmdldERhdGFTb3VyY2VTZXR0aW5nc1Byb3AoXHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmosXHJcblx0XHRcdFx0XCJyb3dzXCJcclxuXHRcdFx0KTtcclxuXHRcdFx0bGV0IHJvd3NBcnIgPSBjdXJSb3dzLm1hcCgoaXRlbSkgPT4gaXRlbS5uYW1lKTtcclxuXHJcblx0XHRcdGxldCBoZWFkZXJBcnIgPSBbXTtcclxuXHRcdFx0bGV0IHJvd0xldmVsID0gbGV2ZWw7XHJcblx0XHRcdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPD0gcm93TGV2ZWw7IGluZGV4KyspIHtcclxuXHRcdFx0XHRoZWFkZXJBcnIucHVzaChlbGUuUm93W3Jvd3NBcnJbaW5kZXhdXSk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGhlYWRlckFyci5qb2luKFwiLlwiKTtcclxuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjb2xcIikge1xyXG5cdFx0XHRsZXQgY3VyQ2xvdW1ucyA9IHRoaXMuZ2V0RGF0YVNvdXJjZVNldHRpbmdzUHJvcChcclxuXHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iaixcclxuXHRcdFx0XHRcImNvbHVtbnNcIlxyXG5cdFx0XHQpO1xyXG5cdFx0XHRsZXQgY29sc0FyciA9IGN1ckNsb3VtbnMubWFwKChpdGVtKSA9PiBpdGVtLm5hbWUpO1xyXG5cclxuXHRcdFx0bGV0IGhlYWRlckFyciA9IFtdO1xyXG5cdFx0XHRsZXQgY29sTGV2ZWwgPSBsZXZlbDtcclxuXHRcdFx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8PSBjb2xMZXZlbDsgaW5kZXgrKykge1xyXG5cdFx0XHRcdGhlYWRlckFyci5wdXNoKGVsZS5Db2xbY29sc0FycltpbmRleF1dKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gaGVhZGVyQXJyLmpvaW4oXCIuXCIpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dG90YWxGb3JtYXR0ZWQgPSB7fTtcclxuXHRwdWJsaWMgYWdncmVnYXRlQ2VsbEluZm8oYXJncykge1xyXG5cdFx0bGV0IGFzT2ZEYXRlID0gdGhpcy5wYmYudGltZSh0aGlzLmRhc2hib2FyZC5hc09mRGF0ZSk7XHJcblx0XHQvLyBpZiBjYWxjdWxhdGVkIGZpZWxkXHJcblx0XHRpZiAoYXJncy5hZ2dyZWdhdGVUeXBlID09IFwiQ2FsY3VsYXRlZEZpZWxkXCIpIHtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRpZiAoYXJncy5maWVsZE5hbWUgPT0gdGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzW2ldLm5hbWUpIHtcclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSB0aGlzLmNhbGN1bGF0ZWRDZWxsU2V0cyhcclxuXHRcdFx0XHRcdFx0YXJncyxcclxuXHRcdFx0XHRcdFx0dGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzW2ldXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChcclxuXHRcdFx0W1xyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlSVJSXCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVJUlJCZWZvcmVDYXJyaWVkXCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVJUlJJUlJEYXRlXCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVJUlJNVERcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZUlSUlFURFwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlSVJSWVREXCIsXHJcblx0XHRcdF0uaW5jbHVkZXMoYXJncy5hZ2dyZWdhdGVUeXBlKVxyXG5cdFx0KSB7XHJcblx0XHRcdGxldCB2YWx1ZUZpZWxkO1xyXG5cdFx0XHRsZXQgZGF0ZUZpZWxkO1xyXG5cdFx0XHRsZXQgc3RhcnREYXRlO1xyXG5cdFx0XHRsZXQgZW5kRGF0ZTtcclxuXHRcdFx0c3dpdGNoIChhcmdzLmFnZ3JlZ2F0ZVR5cGUpIHtcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlSVJSXCI6XHJcblx0XHRcdFx0XHR2YWx1ZUZpZWxkID0gXCJJUlJBZGpWYWx1ZVwiO1xyXG5cdFx0XHRcdFx0ZGF0ZUZpZWxkID0gXCJJUlJEYXRlXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlSVJSTVREXCI6XHJcblx0XHRcdFx0XHRzdGFydERhdGUgPSBtb21lbnQoYXNPZkRhdGUpXHJcblx0XHRcdFx0XHRcdC5zdGFydE9mKFwibW9udGhcIilcclxuXHRcdFx0XHRcdFx0LmZvcm1hdChcIllZWVktTU0tRERcIik7XHJcblx0XHRcdFx0XHRlbmREYXRlID0gbW9tZW50KGFzT2ZEYXRlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xyXG5cdFx0XHRcdFx0dmFsdWVGaWVsZCA9IFwiSVJSQWRqVmFsdWVcIjtcclxuXHRcdFx0XHRcdGRhdGVGaWVsZCA9IFwiSVJSRGF0ZVwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZUlSUlFURFwiOlxyXG5cdFx0XHRcdFx0c3RhcnREYXRlID0gbW9tZW50KGFzT2ZEYXRlKVxyXG5cdFx0XHRcdFx0XHQuc3RhcnRPZihcInF1YXJ0ZXJcIilcclxuXHRcdFx0XHRcdFx0LmZvcm1hdChcIllZWVktTU0tRERcIik7XHJcblx0XHRcdFx0XHRlbmREYXRlID0gbW9tZW50KGFzT2ZEYXRlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xyXG5cdFx0XHRcdFx0dmFsdWVGaWVsZCA9IFwiSVJSQWRqVmFsdWVcIjtcclxuXHRcdFx0XHRcdGRhdGVGaWVsZCA9IFwiSVJSRGF0ZVwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZUlSUllURFwiOlxyXG5cdFx0XHRcdFx0c3RhcnREYXRlID0gbW9tZW50KGFzT2ZEYXRlKVxyXG5cdFx0XHRcdFx0XHQuc3RhcnRPZihcInllYXJcIilcclxuXHRcdFx0XHRcdFx0LmZvcm1hdChcIllZWVktTU0tRERcIik7XHJcblx0XHRcdFx0XHRlbmREYXRlID0gbW9tZW50KGFzT2ZEYXRlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xyXG5cdFx0XHRcdFx0dmFsdWVGaWVsZCA9IFwiSVJSQWRqVmFsdWVcIjtcclxuXHRcdFx0XHRcdGRhdGVGaWVsZCA9IFwiSVJSRGF0ZVwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZUlSUklSUkRhdGVcIjpcclxuXHRcdFx0XHRcdHZhbHVlRmllbGQgPSBcIklSUkFkalZhbHVlXCI7XHJcblx0XHRcdFx0XHRkYXRlRmllbGQgPSBcIkNhbGN1bGF0ZUlSUkRhdGVcIjtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVJUlJCZWZvcmVDYXJyaWVkXCI6XHJcblx0XHRcdFx0XHR2YWx1ZUZpZWxkID0gXCJJUlJBZGpWYWx1ZUJlZm9yZUNhcnJ5XCI7XHJcblx0XHRcdFx0XHRkYXRlRmllbGQgPSBcIklSUkRhdGVcIjtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRsZXQgTkFWQWRqID0gMDtcclxuXHRcdFx0bGV0IHZhbHVlcyA9IFtdO1xyXG5cdFx0XHRsZXQgYmVmb3JlU3RhcnROQVZBZGogPSAwOyAvLyDlrZjlgqjkuIrkuIDkuKrpmLbmrrXnmoROQVZBZGrmgLvlkoxcclxuXHRcdFx0bGV0IGJlZm9yZVN0YXJ0VmFsdWVzID0gW107IC8vIOWtmOWCqOS4iuS4gOS4qumYtuauteeahOe0r+iuoembhuWQiCAo5Y+q5piv5Li65LqG5omT5Y2w77yM5rKh5pyJ5a6e6ZmF55So6YCUKVxyXG5cdFx0XHRsZXQgZmllbGQgPSB0aGlzLmNvbmZpZ0ZpZWxkcy5maWx0ZXIoXHJcblx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0ZWwuY29sTmFtZSA9PT1cclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0QWdncmVnYXRlVHlwZShcclxuXHRcdFx0XHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdCk7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5jZWxsU2V0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSB7XHJcblx0XHRcdFx0XHRhbW91bnQ6IGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJBbW91bnRcIl0sXHJcblx0XHRcdFx0XHRkYXRlOlxyXG5cdFx0XHRcdFx0XHR0aGlzLnBiZi50aW1lKGFyZ3MuY2VsbFNldHNbaV1bZGF0ZUZpZWxkXSkgPT09XHJcblx0XHRcdFx0XHRcdFwiSW52YWxpZCBkYXRlXCJcclxuXHRcdFx0XHRcdFx0XHQ/IGFzT2ZEYXRlXHJcblx0XHRcdFx0XHRcdFx0OiB0aGlzLnBiZi50aW1lKGFyZ3MuY2VsbFNldHNbaV1bZGF0ZUZpZWxkXSksXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHQvLyBTTVAyLTE2OTIwXHJcblx0XHRcdFx0Ly8gSWYgSVJSIERhdGUgPiBEYXNoYm9hcmQgcmVwb3J0IGRhdGUgPSBUYWtlcyBhcyBvZiBkYXNoYm9hcmQgcmVwb3J0IGRhdGVcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiQ2FsY3VsYXRlSVJSSVJSRGF0ZVwiICYmXHJcblx0XHRcdFx0XHRhc09mRGF0ZSA8IHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtkYXRlRmllbGRdKVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0ZGF0YS5kYXRlID0gYXNPZkRhdGU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdE5BVkFkaiArPSBhcmdzLmNlbGxTZXRzW2ldW3ZhbHVlRmllbGRdO1xyXG5cdFx0XHRcdC8vIFNNUDItMTcyMTkgTVREIFFURCBZVEQgSVJSXHJcblx0XHRcdFx0aWYgKHN0YXJ0RGF0ZSAmJiBlbmREYXRlKSB7XHJcblx0XHRcdFx0XHRpZiAobW9tZW50KGRhdGEuZGF0ZSkuaXNCZWZvcmUoc3RhcnREYXRlKSkge1xyXG5cdFx0XHRcdFx0XHRkYXRhW3ZhbHVlRmllbGRdID0gYXJncy5jZWxsU2V0c1tpXVt2YWx1ZUZpZWxkXTtcclxuXHRcdFx0XHRcdFx0YmVmb3JlU3RhcnRWYWx1ZXMucHVzaChkYXRhKTtcclxuXHRcdFx0XHRcdFx0YmVmb3JlU3RhcnROQVZBZGogKz0gZGF0YVt2YWx1ZUZpZWxkXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IW1vbWVudChkYXRhLmRhdGUpLmlzQmV0d2VlbihcclxuXHRcdFx0XHRcdFx0XHRzdGFydERhdGUsXHJcblx0XHRcdFx0XHRcdFx0ZW5kRGF0ZSxcclxuXHRcdFx0XHRcdFx0XHRudWxsLFxyXG5cdFx0XHRcdFx0XHRcdFwiW11cIlxyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChkYXRhLmFtb3VudCAhPSAwKSB7XHJcblx0XHRcdFx0XHR2YWx1ZXMucHVzaChkYXRhKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKE5BVkFkaiA+IDAuMDAwMSB8fCBOQVZBZGogPCAtMC4wMDAxKSB7XHJcblx0XHRcdFx0dmFsdWVzLnB1c2goe1xyXG5cdFx0XHRcdFx0YW1vdW50OiBOQVZBZGosXHJcblx0XHRcdFx0XHRkYXRlOiBhc09mRGF0ZSxcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHR2YWx1ZXMgPSBzb3J0QnkodmFsdWVzLCBcImRhdGVcIik7XHJcblx0XHRcdC8vIOWmguaenOaYr01URCxRVEQsWVREIOWImemcgOimgeaKiuW9k+WJjemYtuauteS7peWJjeeahOaJgOacieaVsOaNrui/m+ihjOaxh+aAu++8jOWKoOWFpeiuoeeul1xyXG5cdFx0XHRpZiAoc3RhcnREYXRlICYmIGVuZERhdGUpIHtcclxuXHRcdFx0XHR2YWx1ZXMudW5zaGlmdCh7XHJcblx0XHRcdFx0XHRhbW91bnQ6IC1iZWZvcmVTdGFydE5BVkFkaiwgLy8g5byA5aeL55qE5pWw5o2u6ZyA6KaB5Y+W5Y+NXHJcblx0XHRcdFx0XHRkYXRlOiB0aGlzLnBiZi50aW1lKHN0YXJ0RGF0ZSksXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJiZWZvcmVTdGFydFZhbHVlczpcIiwgYmVmb3JlU3RhcnRWYWx1ZXMpO1xyXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcInZhbHVlczpcIiwgdmFsdWVzKTtcclxuXHRcdFx0aWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0bGV0IGd1ZXNzID0gMC4xO1xyXG5cdFx0XHRcdGNvbnN0IHN1bUFtb3VudCA9IHZhbHVlc1xyXG5cdFx0XHRcdFx0Lm1hcCgoaXRlbSkgPT4gaXRlbS5hbW91bnQpXHJcblx0XHRcdFx0XHQucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgY3VyciwgMCk7XHJcblx0XHRcdFx0aWYgKHN1bUFtb3VudCA8IDApIHtcclxuXHRcdFx0XHRcdGd1ZXNzID0gLTAuMTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly9TTVAyLTIyNDkgZml4ZWQgdGhlIGJpZyBpcnIgaXNzdWVcclxuXHRcdFx0XHRpZiAoc3VtQW1vdW50ID09PSAwKSB7XHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID0gMDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVJdGVtcyA9IHZhbHVlcy5zbGljZSgwLCB2YWx1ZXMubGVuZ3RoIC0gMSk7XHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUxpc3QgPSB2YWx1ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5hbW91bnQpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZGF0ZUxpc3QgPSB2YWx1ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5kYXRlKTtcclxuXHRcdFx0XHRcdGNvbnN0IGxhc3RJdGVtID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTtcclxuXHRcdFx0XHRcdGNvbnN0IG5hdkFkanVzdCA9IGxhc3RJdGVtLmFtb3VudDtcclxuXHRcdFx0XHRcdGNvbnN0IGxhdGVzdERhdGUgPSBsYXN0SXRlbS5kYXRlO1xyXG5cdFx0XHRcdFx0bGV0IGlyciA9XHJcblx0XHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuRXhjZWxGb3JtdWxhcy5fQ2FsY3VsYXRlWGlycihcclxuXHRcdFx0XHRcdFx0XHR2YWx1ZUxpc3QsXHJcblx0XHRcdFx0XHRcdFx0ZGF0ZUxpc3QsXHJcblx0XHRcdFx0XHRcdFx0bmF2QWRqdXN0LFxyXG5cdFx0XHRcdFx0XHRcdGxhdGVzdERhdGVcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBpcnIgPT09IG51bGwgPyBcIlwiIDogaXJyO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gXCJcIjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUgJiZcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdO1xyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV0gPSB7XHJcblx0XHRcdFx0XHRuYW1lOiBhcmdzLmZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdGZvcm1hdDpcclxuXHRcdFx0XHRcdFx0ZmllbGQubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdD8gZmllbGRbMF0uZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZFxyXG5cdFx0XHRcdFx0XHRcdFx0PyB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLnBpdm90VGFibGVmb3JtYXRQZXJjZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0XHQ6IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5kcFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0OiBcIlAyXCIsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vICBTTVAyLTE2NTIwIFRXUiDmnIgv5a2jL+W5tCAmJiBTTVAyLTE2NjgzIFZBUlxyXG5cdFx0aWYgKFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVUV1JNVERcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZVRXUlFURFwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlVFdSWVREXCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVWQVJNVERfOTlcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZVZBUlFURF85OVwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlVkFSWVREXzk5XCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVWQVJNVERfOTVcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZVZBUlFURF85NVwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlVkFSWVREXzk1XCIsXHJcblx0XHRcdF0uaW5jbHVkZXMoYXJncy5hZ2dyZWdhdGVUeXBlKVxyXG5cdFx0KSB7XHJcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiPT09PT09PT09PT09PT09PT09PT09PT09PT1cIik7XHJcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiYXJnczpcIiwgYXJncyk7XHJcblx0XHRcdGxldCB2YWx1ZUZpZWxkID0gXCJJUlJBZGpWYWx1ZVwiO1xyXG5cdFx0XHRsZXQgZGF0ZUZpZWxkID0gXCJJUlJEYXRlXCI7XHJcblx0XHRcdGxldCB0aW1lUmFuZ2U7XHJcblx0XHRcdHN3aXRjaCAoYXJncy5hZ2dyZWdhdGVUeXBlKSB7XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZVRXUk1URFwiOlxyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVWQVJNVERfOTlcIjpcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlVkFSTVREXzk1XCI6XHJcblx0XHRcdFx0XHR0aW1lUmFuZ2UgPSBcIm1vbnRoXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlVFdSUVREXCI6XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZVZBUlFURF85OVwiOlxyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVWQVJRVERfOTVcIjpcclxuXHRcdFx0XHRcdHRpbWVSYW5nZSA9IFwicXVhcnRlclwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZVRXUllURFwiOlxyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVWQVJZVERfOTlcIjpcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlVkFSWVREXzk1XCI6XHJcblx0XHRcdFx0XHR0aW1lUmFuZ2UgPSBcInllYXJcIjtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRsZXQgdmFsdWVzID0gW107IC8vIOi/meS4qumYtuauteeahOe0r+iuoembhuWQiFxyXG5cdFx0XHRsZXQgZmllbGQgPSB0aGlzLmNvbmZpZ0ZpZWxkcy5maWx0ZXIoXHJcblx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0ZWwuY29sTmFtZSA9PT1cclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0QWdncmVnYXRlVHlwZShcclxuXHRcdFx0XHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdCk7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5jZWxsU2V0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSB7XHJcblx0XHRcdFx0XHRbdmFsdWVGaWVsZF06IGFyZ3MuY2VsbFNldHNbaV1bdmFsdWVGaWVsZF0sXHJcblx0XHRcdFx0XHRkYXRlOlxyXG5cdFx0XHRcdFx0XHR0aGlzLnBiZi50aW1lKGFyZ3MuY2VsbFNldHNbaV1bZGF0ZUZpZWxkXSkgPT09XHJcblx0XHRcdFx0XHRcdFwiSW52YWxpZCBkYXRlXCJcclxuXHRcdFx0XHRcdFx0XHQ/IGFzT2ZEYXRlXHJcblx0XHRcdFx0XHRcdFx0OiB0aGlzLnBiZi50aW1lKGFyZ3MuY2VsbFNldHNbaV1bZGF0ZUZpZWxkXSksXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaChkYXRhKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8g5aaC5p6cYXNPZkRhdGXkuI3mmK8g5pys5pyIL+Wto+W6pi/lubQg55qE5pyA5ZCO5LiA5aSp77yM6YO95piv5oiq6IezIOS4iuS4quaciC/lraPluqYv5bm0IOeahOacgOWQjuS4gOWkqeeahOaVsOaNruWOu+iuoeeul1xyXG5cdFx0XHRsZXQgX2FzT2ZEYXRlID0gbW9tZW50KGFzT2ZEYXRlKTtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJfYXNPZkRhdGU6XCIsIF9hc09mRGF0ZSk7XHJcblx0XHRcdGxldCBpc0VuZE9mUGVyaW9kID0gKHVuaXQpID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gKFxyXG5cdFx0XHRcdFx0X2FzT2ZEYXRlLmZvcm1hdChcIllZWVktTU0tRERcIikgPT09XHJcblx0XHRcdFx0XHRfYXNPZkRhdGUuZW5kT2YodW5pdCkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH07XHJcblx0XHRcdGxldCBlbmREYXRlID0gaXNFbmRPZlBlcmlvZCh0aW1lUmFuZ2UpXHJcblx0XHRcdFx0PyBtb21lbnQoYXNPZkRhdGUpLmZvcm1hdChcIllZWVktTU0tRERcIilcclxuXHRcdFx0XHQ6IG1vbWVudChhc09mRGF0ZSlcclxuXHRcdFx0XHRcdFx0LnN1YnRyYWN0KDEsIHRpbWVSYW5nZSlcclxuXHRcdFx0XHRcdFx0LmVuZE9mKHRpbWVSYW5nZSlcclxuXHRcdFx0XHRcdFx0LmZvcm1hdChcIllZWVktTU0tRERcIik7XHJcblxyXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcImVuZERhdGU6XCIsIGVuZERhdGUpO1xyXG5cdFx0XHR2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKChpdGVtKSA9PlxyXG5cdFx0XHRcdG1vbWVudChpdGVtLmRhdGUpLmlzU2FtZU9yQmVmb3JlKGVuZERhdGUpXHJcblx0XHRcdCk7XHJcblx0XHRcdHZhbHVlcyA9IHNvcnRCeSh2YWx1ZXMsIFwiZGF0ZVwiKTtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJ2YWx1ZXM6XCIsIHZhbHVlcyk7XHJcblxyXG5cdFx0XHRpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRsZXQgcmVzdWx0ID0gdGhpcy5nZXRUaW1lUmFuZ2VzKFxyXG5cdFx0XHRcdFx0dmFsdWVzLFxyXG5cdFx0XHRcdFx0ZW5kRGF0ZSxcclxuXHRcdFx0XHRcdHRpbWVSYW5nZSxcclxuXHRcdFx0XHRcdFwiZGF0ZVwiXHJcblx0XHRcdFx0KTsgLy8g5ZCE5Liq6Zi25q6155qE5pWw5o2uXHJcblx0XHRcdFx0bGV0IHJlc3VsdFRvdGFsID0ge307IC8vIOWQhOS4qumYtuauteaAu+WSjFxyXG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcCBpbiByZXN1bHQpIHtcclxuXHRcdFx0XHRcdHJlc3VsdFRvdGFsW3Byb3BdID0gcmVzdWx0W3Byb3BdLnJlZHVjZSgoYWNjLCBjdXIpID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGFjYyArIChjdXJbdmFsdWVGaWVsZF0gfHwgMCk7XHJcblx0XHRcdFx0XHR9LCAwKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJyZXN1bHQ6XCIsIHJlc3VsdCk7XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJyZXN1bHRUb3RhbDpcIiwgcmVzdWx0VG90YWwpO1xyXG5cclxuXHRcdFx0XHRjb25zdCBjdW11bGF0aXZlU3VtID0ge307IC8vIOWQhOS4qumYtuautee0r+iuoeWSjFxyXG5cdFx0XHRcdGxldCBzdW0gPSAwO1xyXG5cdFx0XHRcdGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdFRvdGFsKSkge1xyXG5cdFx0XHRcdFx0c3VtICs9IHJlc3VsdFRvdGFsW2tleV07XHJcblx0XHRcdFx0XHRjdW11bGF0aXZlU3VtW2Ake2tleX1gXSA9IHN1bTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJjdW11bGF0aXZlU3VtOlwiLCBjdW11bGF0aXZlU3VtKTtcclxuXHJcblx0XHRcdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGN1bXVsYXRpdmVTdW0pO1xyXG5cdFx0XHRcdGxldCB0d3JMaXN0ID0gW107XHJcblx0XHRcdFx0Ly8g6YGN5Y6G5q+P5Lik5Liq6Zi25q61IOiuoeeul1RXUlxyXG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHtcclxuXHRcdFx0XHRcdGNvbnN0IGtleTEgPSBrZXlzW2ldO1xyXG5cdFx0XHRcdFx0Y29uc3Qga2V5MiA9IGtleXNbaSArIDFdO1xyXG5cclxuXHRcdFx0XHRcdC8vIOiuoeeul+S4pOS4qumYtuauteS5i+mXtOeahOmAkuWinumHjywg5Ye65pWw5LiN6IO95Li6MFxyXG5cdFx0XHRcdFx0aWYgKGN1bXVsYXRpdmVTdW1ba2V5MV0gIT0gMCkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBpbmNyZW1lbnQgPVxyXG5cdFx0XHRcdFx0XHRcdGN1bXVsYXRpdmVTdW1ba2V5Ml0gLSBjdW11bGF0aXZlU3VtW2tleTFdO1xyXG5cdFx0XHRcdFx0XHRsZXQgdHdyID0gaW5jcmVtZW50IC8gY3VtdWxhdGl2ZVN1bVtrZXkxXTtcclxuXHRcdFx0XHRcdFx0dHdyTGlzdC5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRkYXRlOiBrZXkyLFxyXG5cdFx0XHRcdFx0XHRcdHR3cjogdHdyLFxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8g6K6h566XQXZlcmFnZSBUV1JcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInR3ckxpc3Q6XCIsIHR3ckxpc3QpO1xyXG5cdFx0XHRcdGxldCBhdmVyYWdlVFdSID0gdGhpcy5jYWxjdWxhdGVHcm93dGhSYXRlKFxyXG5cdFx0XHRcdFx0dHdyTGlzdC5tYXAoKHgpID0+IHgudHdyKVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCLorqHnrpdBdmVyYWdlIFRXUjpcIiwgYXZlcmFnZVRXUik7XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0W1xyXG5cdFx0XHRcdFx0XHRcIkNhbGN1bGF0ZVRXUk1URFwiLFxyXG5cdFx0XHRcdFx0XHRcIkNhbGN1bGF0ZVRXUlFURFwiLFxyXG5cdFx0XHRcdFx0XHRcIkNhbGN1bGF0ZVRXUllURFwiLFxyXG5cdFx0XHRcdFx0XS5pbmNsdWRlcyhhcmdzLmFnZ3JlZ2F0ZVR5cGUpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHQvLyBTTVAyLTE2NTIwIFRXUiDmnIgv5a2jL+W5tFxyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdGlzTmFOKGF2ZXJhZ2VUV1IpIHx8IGF2ZXJhZ2VUV1IgPT0gbnVsbFxyXG5cdFx0XHRcdFx0XHRcdD8gXCJcIlxyXG5cdFx0XHRcdFx0XHRcdDogYXZlcmFnZVRXUi50b0ZpeGVkKDQpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRpZiAoaXNOYU4oYXZlcmFnZVRXUikgfHwgYXZlcmFnZVRXUiA9PSBudWxsKSB7XHJcblx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8gU01QMi0xNjY4MyBWQVIg5Yy65YiGOTkl5ZKMOTUlXHJcblx0XHRcdFx0XHRcdGxldCBaU2NvcmUgPSBbXHJcblx0XHRcdFx0XHRcdFx0XCJDYWxjdWxhdGVWQVJNVERfOTlcIixcclxuXHRcdFx0XHRcdFx0XHRcIkNhbGN1bGF0ZVZBUlFURF85OVwiLFxyXG5cdFx0XHRcdFx0XHRcdFwiQ2FsY3VsYXRlVkFSWVREXzk5XCIsXHJcblx0XHRcdFx0XHRcdF0uaW5jbHVkZXMoYXJncy5hZ2dyZWdhdGVUeXBlKVxyXG5cdFx0XHRcdFx0XHRcdD8gMi4zM1xyXG5cdFx0XHRcdFx0XHRcdDogMS42NTtcclxuXHRcdFx0XHRcdFx0aWYgKHR3ckxpc3QubGVuZ3RoIDwgMikge1xyXG5cdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBTRCA9IHRoaXMuY2FsY3VsYXRlU3RhbmRhcmREZXZpYXRpb24oXHJcblx0XHRcdFx0XHRcdFx0XHR0d3JMaXN0Lm1hcCgoeCkgPT4geC50d3IpXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcImNhbGN1bGF0ZVN0YW5kYXJkRGV2aWF0aW9uOlwiLCBTRCk7XHJcblx0XHRcdFx0XHRcdFx0bGV0IFZBUiA9IGF2ZXJhZ2VUV1IgLSBTRCAqIFpTY29yZTtcclxuXHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gVkFSLnRvRml4ZWQoNCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJhcmdzLnZhbHVlOlwiLCBhcmdzLnZhbHVlKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlICYmXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW2FyZ3MuZmllbGROYW1lXVxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRkZWxldGUgdGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW2FyZ3MuZmllbGROYW1lXTtcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdID0ge1xyXG5cdFx0XHRcdFx0bmFtZTogYXJncy5maWVsZE5hbWUsXHJcblx0XHRcdFx0XHRmb3JtYXQ6XHJcblx0XHRcdFx0XHRcdGZpZWxkLmxlbmd0aCA+IDBcclxuXHRcdFx0XHRcdFx0XHQ/IGZpZWxkWzBdLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0XHRcdCAgZmllbGRbMF0uZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0XHRcdCAgZmllbGRbMF0uZm9ybWF0WzBdLmZvcm1hdENoZWNrZWRcclxuXHRcdFx0XHRcdFx0XHRcdD8gdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXRcclxuXHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdFx0OiB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmZvcm1hdFBlcmNlbnQoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRbMF0uZHBcclxuXHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdDogXCJQMlwiLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvL1NNUDItMjcwMVxyXG5cdFx0aWYgKGFyZ3MuYWdncmVnYXRlVHlwZSA9PT0gXCJDYWxjdWxhdGVJUlJBY3R1YWxBdWRpdGVkXCIpIHtcclxuXHRcdFx0bGV0IE5BVkFkaiA9IDA7XHJcblx0XHRcdGxldCB2YWx1ZXMgPSBbXTtcclxuXHRcdFx0bGV0IGZpZWxkID0gdGhpcy5jb25maWdGaWVsZHMuZmlsdGVyKFxyXG5cdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdGVsLmNvbE5hbWUgPT09XHJcblx0XHRcdFx0XHR0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmdldEFnZ3JlZ2F0ZVR5cGUoXHJcblx0XHRcdFx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHQpO1xyXG5cdFx0XHQvL1NNUDItMjcxMyBvbmx5IGp1ZGdlIGZvciB0aGlzIGRhdGFNYXJ0KEdyb3NzTmV0KVxyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0dGhpcy5wb3J0bGV0LmZpZ3VyZUNvZGUgPT09IFwiR3Jvc3NOZXRcIiB8fFxyXG5cdFx0XHRcdHRoaXMucG9ydGxldC5maWd1cmVDb2RlID09PVxyXG5cdFx0XHRcdFx0XCJDb21iaW5lZEludmVzdG1lbnRGdW5kTkNvbXBhbnlDYXNoZmxvd1wiXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5jZWxsU2V0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0YW1vdW50OiBhcmdzLmNlbGxTZXRzW2ldW1wiSVJSQW1vdW50XCJdLFxyXG5cdFx0XHRcdFx0XHRkYXRlOlxyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtcIklSUkRhdGVcIl0pID09PVxyXG5cdFx0XHRcdFx0XHRcdFwiSW52YWxpZCBkYXRlXCJcclxuXHRcdFx0XHRcdFx0XHRcdD8gYXNPZkRhdGVcclxuXHRcdFx0XHRcdFx0XHRcdDogdGhpcy5wYmYudGltZShhcmdzLmNlbGxTZXRzW2ldW1wiSVJSRGF0ZVwiXSksXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0TkFWQWRqICs9IGFyZ3MuY2VsbFNldHNbaV1bXCJBY3R1YWxBdWRpdGVkTkFWXCJdO1xyXG5cdFx0XHRcdFx0aWYgKGRhdGEuYW1vdW50ICE9IDApIHtcclxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goZGF0YSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdC8vZmlsdGVyIHRoZSBkYXRhIGJ5IHRoZSBEYXRhVHlwZShBY3R1YWwgUmVwb3J0ZWQgQXVkaXRlZClcclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0bGV0IGFyZ3NkYXRhID0gYXJncy5jZWxsU2V0cy5maWx0ZXIoXHJcblx0XHRcdFx0XHQoZWwpID0+XHJcblx0XHRcdFx0XHRcdGVsLkRhdGFUeXBlID09PSBcIkFDVFVBTF9BVURJVEVEXCIgfHxcclxuXHRcdFx0XHRcdFx0ZWwuRGF0YVR5cGUgPT09IFwiUkVQT1JURURcIlxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzZGF0YS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0YW1vdW50OiBhcmdzZGF0YVtpXVtcIklSUkFtb3VudFwiXSxcclxuXHRcdFx0XHRcdFx0ZGF0ZTpcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBiZi50aW1lKGFyZ3NkYXRhW2ldW1wiSVJSRGF0ZVwiXSkgPT09XHJcblx0XHRcdFx0XHRcdFx0XCJJbnZhbGlkIGRhdGVcIlxyXG5cdFx0XHRcdFx0XHRcdFx0PyBhc09mRGF0ZVxyXG5cdFx0XHRcdFx0XHRcdFx0OiB0aGlzLnBiZi50aW1lKGFyZ3NkYXRhW2ldW1wiSVJSRGF0ZVwiXSksXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0TkFWQWRqICs9IGFyZ3NkYXRhW2ldW1wiSVJSQWRqVmFsdWVcIl07XHJcblx0XHRcdFx0XHRpZiAoZGF0YS5hbW91bnQgIT0gMCkge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaChkYXRhKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKE5BVkFkaiA+IDAuMDAwMSB8fCBOQVZBZGogPCAtMC4wMDAxKSB7XHJcblx0XHRcdFx0dmFsdWVzLnB1c2goe1xyXG5cdFx0XHRcdFx0YW1vdW50OiBOQVZBZGosXHJcblx0XHRcdFx0XHRkYXRlOiBhc09mRGF0ZSxcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHR2YWx1ZXMgPSBzb3J0QnkodmFsdWVzLCBcImRhdGVcIik7XHJcblx0XHRcdGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGxldCBndWVzcyA9IDAuMTtcclxuXHRcdFx0XHRjb25zdCBzdW1BbW91bnQgPSB2YWx1ZXNcclxuXHRcdFx0XHRcdC5tYXAoKGl0ZW0pID0+IGl0ZW0uYW1vdW50KVxyXG5cdFx0XHRcdFx0LnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiArIGN1cnIsIDApO1xyXG5cdFx0XHRcdGlmIChzdW1BbW91bnQgPCAwKSB7XHJcblx0XHRcdFx0XHRndWVzcyA9IC0wLjE7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vU01QMi0yMjQ5IGZpeGVkIHRoZSBiaWcgaXJyIGlzc3VlXHJcblx0XHRcdFx0aWYgKHN1bUFtb3VudCA9PT0gMCkge1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IDA7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGNvbnN0IHZhbHVlSXRlbXMgPSB2YWx1ZXMuc2xpY2UoMCwgdmFsdWVzLmxlbmd0aCAtIDEpO1xyXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVMaXN0ID0gdmFsdWVJdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0uYW1vdW50KTtcclxuXHRcdFx0XHRcdGNvbnN0IGRhdGVMaXN0ID0gdmFsdWVJdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0uZGF0ZSk7XHJcblx0XHRcdFx0XHRjb25zdCBsYXN0SXRlbSA9IHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV07XHJcblx0XHRcdFx0XHRjb25zdCBuYXZBZGp1c3QgPSBsYXN0SXRlbS5hbW91bnQ7XHJcblx0XHRcdFx0XHRjb25zdCBsYXRlc3REYXRlID0gbGFzdEl0ZW0uZGF0ZTtcclxuXHRcdFx0XHRcdGxldCBpcnIgPVxyXG5cdFx0XHRcdFx0XHR0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLkV4Y2VsRm9ybXVsYXMuX0NhbGN1bGF0ZVhpcnIoXHJcblx0XHRcdFx0XHRcdFx0dmFsdWVMaXN0LFxyXG5cdFx0XHRcdFx0XHRcdGRhdGVMaXN0LFxyXG5cdFx0XHRcdFx0XHRcdG5hdkFkanVzdCxcclxuXHRcdFx0XHRcdFx0XHRsYXRlc3REYXRlXHJcblx0XHRcdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IGlyciA9PT0gbnVsbCA/IDAgOiBpcnI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFyZ3MudmFsdWUgPSAwO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZSAmJlxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV1cclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0ZGVsZXRlIHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV07XHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW2FyZ3MuZmllbGROYW1lXSA9IHtcclxuXHRcdFx0XHRcdG5hbWU6IGFyZ3MuZmllbGROYW1lLFxyXG5cdFx0XHRcdFx0Zm9ybWF0OlxyXG5cdFx0XHRcdFx0XHRmaWVsZC5sZW5ndGggPiAwXHJcblx0XHRcdFx0XHRcdFx0PyBmaWVsZFswXS5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdFx0XHQgIGZpZWxkWzBdLmZvcm1hdC5sZW5ndGggJiZcclxuXHRcdFx0XHRcdFx0XHQgIGZpZWxkWzBdLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkXHJcblx0XHRcdFx0XHRcdFx0XHQ/IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UucGl2b3RUYWJsZWZvcm1hdFBlcmNlbnQoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRbMF0uZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0XHJcblx0XHRcdFx0XHRcdFx0XHQgIClcclxuXHRcdFx0XHRcdFx0XHRcdDogdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5mb3JtYXRQZXJjZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmRwXHJcblx0XHRcdFx0XHRcdFx0XHQgIClcclxuXHRcdFx0XHRcdFx0XHQ6IFwiUDJcIixcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHQvL1NNUDItMzQxMVxyXG5cdFx0aWYgKGFyZ3MuYWdncmVnYXRlVHlwZSA9PT0gXCJDYWxjdWxhdGVJUlJSZXBvcnRlZFwiKSB7XHJcblx0XHRcdGxldCBOQVZBZGogPSAwO1xyXG5cdFx0XHRsZXQgdmFsdWVzID0gW107XHJcblx0XHRcdGxldCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHQoZWwpID0+XHJcblx0XHRcdFx0XHRlbC5jb2xOYW1lID09PVxyXG5cdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5nZXRBZ2dyZWdhdGVUeXBlKFxyXG5cdFx0XHRcdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGVcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0KTtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdHRoaXMucG9ydGxldC5maWd1cmVDb2RlID09PSBcIkdyb3NzTmV0XCIgfHxcclxuXHRcdFx0XHR0aGlzLnBvcnRsZXQuZmlndXJlQ29kZSA9PT1cclxuXHRcdFx0XHRcdFwiQ29tYmluZWRJbnZlc3RtZW50RnVuZE5Db21wYW55Q2FzaGZsb3dcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MuY2VsbFNldHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGNvbnN0IGRhdGEgPSB7XHJcblx0XHRcdFx0XHRcdGFtb3VudDogYXJncy5jZWxsU2V0c1tpXVtcIklSUkFtb3VudFwiXSxcclxuXHRcdFx0XHRcdFx0ZGF0ZTpcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBiZi50aW1lKGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJEYXRlXCJdKSA9PT1cclxuXHRcdFx0XHRcdFx0XHRcIkludmFsaWQgZGF0ZVwiXHJcblx0XHRcdFx0XHRcdFx0XHQ/IGFzT2ZEYXRlXHJcblx0XHRcdFx0XHRcdFx0XHQ6IHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtcIklSUkRhdGVcIl0pLFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdE5BVkFkaiArPSBhcmdzLmNlbGxTZXRzW2ldW1wiUmVwb3J0ZWROQVZcIl07XHJcblx0XHRcdFx0XHRpZiAoZGF0YS5hbW91bnQgIT0gMCkge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaChkYXRhKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRhbW91bnQ6IGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJBbW91bnRcIl0sXHJcblx0XHRcdFx0XHRcdGRhdGU6XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5wYmYudGltZShhcmdzLmNlbGxTZXRzW2ldW1wiSVJSRGF0ZVwiXSkgPT09XHJcblx0XHRcdFx0XHRcdFx0XCJJbnZhbGlkIGRhdGVcIlxyXG5cdFx0XHRcdFx0XHRcdFx0PyBhc09mRGF0ZVxyXG5cdFx0XHRcdFx0XHRcdFx0OiB0aGlzLnBiZi50aW1lKGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJEYXRlXCJdKSxcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHROQVZBZGogKz0gYXJncy5jZWxsU2V0c1tpXVtcIklSUkFkalZhbHVlXCJdO1xyXG5cdFx0XHRcdFx0aWYgKGRhdGEuYW1vdW50ICE9IDApIHtcclxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goZGF0YSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChOQVZBZGogPiAwLjAwMDEgfHwgTkFWQWRqIDwgLTAuMDAwMSkge1xyXG5cdFx0XHRcdHZhbHVlcy5wdXNoKHtcclxuXHRcdFx0XHRcdGFtb3VudDogTkFWQWRqLFxyXG5cdFx0XHRcdFx0ZGF0ZTogYXNPZkRhdGUsXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdFx0dmFsdWVzID0gc29ydEJ5KHZhbHVlcywgXCJkYXRlXCIpO1xyXG5cdFx0XHRpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRsZXQgZ3Vlc3MgPSAwLjE7XHJcblx0XHRcdFx0Y29uc3Qgc3VtQW1vdW50ID0gdmFsdWVzXHJcblx0XHRcdFx0XHQubWFwKChpdGVtKSA9PiBpdGVtLmFtb3VudClcclxuXHRcdFx0XHRcdC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLCAwKTtcclxuXHRcdFx0XHRpZiAoc3VtQW1vdW50IDwgMCkge1xyXG5cdFx0XHRcdFx0Z3Vlc3MgPSAtMC4xO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvL1NNUDItMjI0OSBmaXhlZCB0aGUgYmlnIGlyciBpc3N1ZVxyXG5cdFx0XHRcdGlmIChzdW1BbW91bnQgPT09IDApIHtcclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSAwO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUl0ZW1zID0gdmFsdWVzLnNsaWNlKDAsIHZhbHVlcy5sZW5ndGggLSAxKTtcclxuXHRcdFx0XHRcdGNvbnN0IHZhbHVlTGlzdCA9IHZhbHVlSXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLmFtb3VudCk7XHJcblx0XHRcdFx0XHRjb25zdCBkYXRlTGlzdCA9IHZhbHVlSXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLmRhdGUpO1xyXG5cdFx0XHRcdFx0Y29uc3QgbGFzdEl0ZW0gPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdO1xyXG5cdFx0XHRcdFx0Y29uc3QgbmF2QWRqdXN0ID0gbGFzdEl0ZW0uYW1vdW50O1xyXG5cdFx0XHRcdFx0Y29uc3QgbGF0ZXN0RGF0ZSA9IGxhc3RJdGVtLmRhdGU7XHJcblx0XHRcdFx0XHRsZXQgaXJyID1cclxuXHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5FeGNlbEZvcm11bGFzLl9DYWxjdWxhdGVYaXJyKFxyXG5cdFx0XHRcdFx0XHRcdHZhbHVlTGlzdCxcclxuXHRcdFx0XHRcdFx0XHRkYXRlTGlzdCxcclxuXHRcdFx0XHRcdFx0XHRuYXZBZGp1c3QsXHJcblx0XHRcdFx0XHRcdFx0bGF0ZXN0RGF0ZVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBpcnIgPT09IG51bGwgPyAwIDogaXJyO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gMDtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUgJiZcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdO1xyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV0gPSB7XHJcblx0XHRcdFx0XHRuYW1lOiBhcmdzLmZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdGZvcm1hdDpcclxuXHRcdFx0XHRcdFx0ZmllbGQubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdD8gZmllbGRbMF0uZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZFxyXG5cdFx0XHRcdFx0XHRcdFx0PyB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLnBpdm90VGFibGVmb3JtYXRQZXJjZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0XHQ6IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5kcFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0OiBcIlAyXCIsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKFxyXG5cdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiQ2FsY3VsYXRlTXVsdGlwbGVcIiB8fFxyXG5cdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiQ2FsY3VsYXRlUElDXCIgfHxcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZURQSVwiIHx8XHJcblx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZSA9PT0gXCJDYWxjdWxhdGVUVlBJXCIgfHxcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZVJWUElcIiB8fFxyXG5cdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiQ2FsY3VsYXRlTUFjdHVhbEF1ZGl0ZWRcIiB8fFxyXG5cdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiQ2FsY3VsYXRlTVJlcG9ydGVkXCJcclxuXHRcdCkge1xyXG5cdFx0XHRsZXQgdG90YWxOdW1lcmF0b3IgPSAwO1xyXG5cdFx0XHRsZXQgdG90YWxEZW5vbWluYXRvciA9IDA7XHJcblx0XHRcdGxldCBudW1lcmF0b3JOYW1lO1xyXG5cdFx0XHRsZXQgZGVub21pbmF0b3JOYW1lO1xyXG5cdFx0XHRsZXQgZmllbGQgPSB0aGlzLmNvbmZpZ0ZpZWxkcy5maWx0ZXIoXHJcblx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0ZWwuY29sTmFtZSA9PT1cclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0QWdncmVnYXRlVHlwZShcclxuXHRcdFx0XHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChmaWVsZC5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0Y29uc3QgZm9ybXVsYUFycmF5ID0gZmllbGRbMF0uZm9ybXVsYS5zcGxpdChcIi9cIik7XHJcblx0XHRcdFx0bnVtZXJhdG9yTmFtZSA9IGZvcm11bGFBcnJheVswXTtcclxuXHRcdFx0XHRkZW5vbWluYXRvck5hbWUgPSBmb3JtdWxhQXJyYXlbMV07XHJcblx0XHRcdH1cclxuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0dG90YWxOdW1lcmF0b3IgKz0gYXJncy5jZWxsU2V0c1tqXVtudW1lcmF0b3JOYW1lXTtcclxuXHRcdFx0XHR0b3RhbERlbm9taW5hdG9yICs9IGFyZ3MuY2VsbFNldHNbal1bZGVub21pbmF0b3JOYW1lXTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodG90YWxEZW5vbWluYXRvciAhPT0gMCkge1xyXG5cdFx0XHRcdGFyZ3MudmFsdWUgPSB0b3RhbE51bWVyYXRvciAvIHRvdGFsRGVub21pbmF0b3I7XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUgJiZcclxuXHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV1cclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbXHJcblx0XHRcdFx0XHRcdGFyZ3MuZmllbGROYW1lXHJcblx0XHRcdFx0XHRdO1xyXG5cdFx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW2FyZ3MuZmllbGROYW1lXSA9IHtcclxuXHRcdFx0XHRcdFx0bmFtZTogYXJncy5maWVsZE5hbWUsXHJcblx0XHRcdFx0XHRcdGZvcm1hdDpcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5sZW5ndGggPiAwXHJcblx0XHRcdFx0XHRcdFx0XHQ/IGZpZWxkWzBdLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdFx0XHQgIGZpZWxkWzBdLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkXHJcblx0XHRcdFx0XHRcdFx0XHRcdD8gdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0TXVsdGlwbGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXRcclxuXHRcdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0XHRcdDogdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5mb3JtYXRNdWx0aXBsZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmRwXHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdFx0OiBcIiMjIzAuMDAneCdcIixcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGFyZ3MuYWdncmVnYXRlVHlwZSA9PT0gXCJGaXJzdFwiIHx8IGFyZ3MuYWdncmVnYXRlVHlwZSA9PT0gXCJMYXN0XCIpIHtcclxuXHRcdFx0YXJncy52YWx1ZSA9IHRoaXMuY2FsY3VsYXRlZEZpc3RMYXN0KFxyXG5cdFx0XHRcdGFyZ3MsXHJcblx0XHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlLFxyXG5cdFx0XHRcdGFyZ3MuZmllbGROYW1lXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKFxyXG5cdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiQ291bnRcIiB8fFxyXG5cdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiRGlzdGluY3RDb3VudFwiXHJcblx0XHQpIHtcclxuXHRcdFx0aWYgKGFyZ3MudmFsdWUpIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gYXJncy52YWx1ZS50b0ZpeGVkKDIpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKFxyXG5cdFx0XHQhYXJncy52YWx1ZSAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlICE9PSAwICYmXHJcblx0XHRcdGFyZ3MudmFsdWUgIT09IGZhbHNlICYmXHJcblx0XHRcdGFyZ3MudmFsdWUgIT09IFwiZmFsc2VcIlxyXG5cdFx0KSB7XHJcblx0XHRcdGFyZ3Muc2tpcEZvcm1hdHRpbmcgPSB0cnVlO1xyXG5cdFx0XHRhcmdzLnZhbHVlID0gXCJcIjtcclxuXHRcdH1cclxuXHRcdC8vIOaWsOW7unBpdm90IHRhYmxlLCDov5jmsqHmnInorr7nva5yb3csIOmAieS6hmNvbHVtbuS5i+WQjmdyYW5kdG90YWzkvJrmnInlgLxcclxuXHRcdGlmIChcclxuXHRcdFx0YXJncy5yb3dDZWxsVHlwZSA9PT0gXCJncmFuZFRvdGFsXCIgJiZcclxuXHRcdFx0IXRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnJvd3MubGVuZ3RoXHJcblx0XHQpIHtcclxuXHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHR9XHJcblx0XHQvL1NNUDItMjg4OVxyXG5cdFx0aWYgKGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwic3ViVG90YWxcIikge1xyXG5cdFx0XHRjb25zdCB2YWx1ZUZpZWxkX2RhdGEgPSB0aGlzLmNvbmZpZy55YXhpcy5zZXJpZXMuZmlsdGVyKFxyXG5cdFx0XHRcdChlbCkgPT4gZWwuY29sTmFtZSA9PT0gYXJncy5maWVsZE5hbWVcclxuXHRcdFx0KTtcclxuXHRcdFx0aWYgKHZhbHVlRmllbGRfZGF0YS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0aWYgKHZhbHVlRmllbGRfZGF0YVswXS5zaG93U3ViVG90YWxzID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0XHRhcmdzLnNraXBGb3JtYXR0aW5nID0gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChhcmdzLnJvd0NlbGxUeXBlID09PSBcImdyYW5kVG90YWxcIikge1xyXG5cdFx0XHRjb25zdCB2YWx1ZUZpZWxkX2RhdGEgPSB0aGlzLmNvbmZpZy55YXhpcy5zZXJpZXMuZmlsdGVyKFxyXG5cdFx0XHRcdChlbCkgPT4gZWwuY29sTmFtZSA9PT0gYXJncy5maWVsZE5hbWVcclxuXHRcdFx0KTtcclxuXHRcdFx0aWYgKHZhbHVlRmllbGRfZGF0YS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0aWYgKHZhbHVlRmllbGRfZGF0YVswXS5zaG93R3JhbmRUb3RhbHMgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID0gXCJcIjtcclxuXHRcdFx0XHRcdGFyZ3Muc2tpcEZvcm1hdHRpbmcgPSB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Ly8gU01QMi0zNDE2IHN0YXJ0XHJcblx0XHRpZiAoXHJcblx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuaGdMaXN0LmluY2x1ZGVzKGFyZ3MuZmllbGROYW1lKSAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlID09PSAwXHJcblx0XHQpIHtcclxuXHRcdFx0YXJncy52YWx1ZSA9IFwiLVwiO1xyXG5cdFx0XHRhcmdzLnNraXBGb3JtYXR0aW5nID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy56ZXJvRm9ybWF0RGF0YS5lbXB0eUxpc3QuaW5jbHVkZXMoYXJncy5maWVsZE5hbWUpICYmXHJcblx0XHRcdGFyZ3MudmFsdWUgPT09IDBcclxuXHRcdCkge1xyXG5cdFx0XHRhcmdzLnZhbHVlID0gXCJcIjtcclxuXHRcdFx0YXJncy5za2lwRm9ybWF0dGluZyA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdHRoaXMubWlsbGlvbkZpZWxkcy5pbmNsdWRlcyhhcmdzLmZpZWxkTmFtZSkgJiZcclxuXHRcdFx0IWlzTmFOKE51bWJlcihhcmdzLnZhbHVlKSkgJiZcclxuXHRcdFx0YXJncy52YWx1ZSAhPT0gMCAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlICE9PSBcIlwiICYmXHJcblx0XHRcdGFyZ3MudmFsdWUgIT09IG51bGxcclxuXHRcdCkge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0YXJncy5jb2x1bW5DZWxsVHlwZSA9PSBcImdyYW5kVG90YWxcIiAmJlxyXG5cdFx0XHRcdGFyZ3Mucm93Q2VsbFR5cGUgPT0gXCJncmFuZFRvdGFsXCJcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLnRvdGFsRm9ybWF0dGVkW2FyZ3MuZmllbGROYW1lXSkge1xyXG5cdFx0XHRcdFx0dGhpcy50b3RhbEZvcm1hdHRlZFthcmdzLmZpZWxkTmFtZV0gPSB0cnVlO1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IGFyZ3MudmFsdWUgLyAxMDAwMDAwO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gYXJncy52YWx1ZSAvIDEwMDAwMDA7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTTVAyLTI0ODYgJiBwZXJjZW50TnVt55qEZm9ybWF06Zeu6aKYXHJcblx0XHRpZiAoXHJcblx0XHRcdHRoaXMucGVyY2VudE51bUZpZWxkcy5sZW5ndGggJiZcclxuXHRcdFx0dGhpcy5wZXJjZW50TnVtRmllbGRzLmluY2x1ZGVzKGFyZ3MuZmllbGROYW1lKSAmJlxyXG5cdFx0XHQhaXNOYU4oTnVtYmVyKGFyZ3MudmFsdWUpKSAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlICE9PSAwICYmXHJcblx0XHRcdGFyZ3MudmFsdWUgIT09IFwiXCIgJiZcclxuXHRcdFx0YXJncy52YWx1ZSAhPT0gbnVsbFxyXG5cdFx0KSB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRhcmdzLmNvbHVtbkNlbGxUeXBlID09IFwiZ3JhbmRUb3RhbFwiICYmXHJcblx0XHRcdFx0YXJncy5yb3dDZWxsVHlwZSA9PSBcImdyYW5kVG90YWxcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRpZiAoIXRoaXMudG90YWxGb3JtYXR0ZWRbYXJncy5maWVsZE5hbWVdKSB7XHJcblx0XHRcdFx0XHR0aGlzLnRvdGFsRm9ybWF0dGVkW2FyZ3MuZmllbGROYW1lXSA9IHRydWU7XHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID0gYXJncy52YWx1ZSAvIDEwMDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0YXJncy52YWx1ZSA9IGFyZ3MudmFsdWUgLyAxMDA7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09IFwiQ2FsY3VsYXRlZEZpZWxkXCIgJiZcclxuXHRcdFx0IU51bWJlci5pc05hTihhcmdzLnZhbHVlKVxyXG5cdFx0KSB7XHJcblx0XHRcdGFyZ3MudmFsdWUgPSBOdW1iZXIoYXJncy52YWx1ZSkudG9GaXhlZCgyKTtcclxuXHRcdH1cclxuXHRcdC8vIFNNUDItMzQxNiBlbmRcclxuXHRcdHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG5cdFx0dGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjYWxjdWxhdGVkRmlzdExhc3QoYXJncywgYWdncmVnYXRlVHlwZSwgZmllbGROYW1lKSB7XHJcblx0XHRpZiAoIWFyZ3Mucm93LmFjdHVhbFRleHQpIGFyZ3Mucm93LmFjdHVhbFRleHQgPSBhcmdzLnJvdy5mb3JtYXR0ZWRUZXh0O1xyXG5cdFx0aWYgKCFhcmdzLmNvbHVtbi5hY3R1YWxUZXh0KVxyXG5cdFx0XHRhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ID0gYXJncy5jb2x1bW4uZm9ybWF0dGVkVGV4dDtcclxuXHRcdGxldCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0KGVsKSA9PiBlbC5jb2xOYW1lID09PSBmaWVsZE5hbWVcclxuXHRcdClbMF07XHJcblxyXG5cdFx0aWYgKGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwidmFsdWVcIiAmJiAhYXJncy5yb3cuaGFzQ2hpbGQpIHtcclxuXHRcdFx0aWYgKGFyZ3MuY2VsbFNldHNbMF0pIHtcclxuXHRcdFx0XHRpZiAoYWdncmVnYXRlVHlwZSA9PT0gXCJGaXJzdFwiKSB7XHJcblx0XHRcdFx0XHRmb3IgKFxyXG5cdFx0XHRcdFx0XHRsZXQgZmlyc3RJbmRleCA9IDA7XHJcblx0XHRcdFx0XHRcdGZpcnN0SW5kZXggPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDtcclxuXHRcdFx0XHRcdFx0Zmlyc3RJbmRleCsrXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNvbHVtbnMubGVuZ3RoID09XHJcblx0XHRcdFx0XHRcdFx0XHQxICYmXHJcblx0XHRcdFx0XHRcdFx0YXJncy5jb2x1bW5DZWxsVHlwZSA9PSBcImdyYW5kVG90YWxcIlxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcInN0cmluZ1wiIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcIm52YXJjaGFyXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwiZGF0ZVwiIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcImRhdGV0aW1lXCJcclxuXHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYWxsRGF0YVZhbHVlICYmXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYWxsRGF0YVZhbHVlLmxlbmd0aFxyXG5cdFx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCByb3dPYmpzID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmFsbERhdGFWYWx1ZVthcmdzLnJvdy5yb3dJbmRleF07XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChyb3dPYmpzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianNBcnIgPSBKU09OLnBhcnNlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0SlNPTi5zdHJpbmdpZnkocm93T2JqcylcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBvYmogPSByb3dPYmpzQXJyLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwuYWN0dWFsVGV4dCA9PSBmaWVsZE5hbWUgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwuaXNHcmFuZFN1bVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdClbMF07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9iaikgYXJncy52YWx1ZSA9IG9iai52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IGlzTmFOKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwicm93XCIgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3Mucm93LmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gbnVsbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogTnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwicm93XCIgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5yb3cuYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCAgKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IGFyZ3MuY2VsbFNldHNbZmlyc3RJbmRleF1bZmllbGROYW1lXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJudW1iZXJcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwibXVsdGlwbGVcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwicGVyY2VudFwiIHx8XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJwZXJjZW50TnVtXCJcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGFyZ3MudmFsdWUgIT0gbnVsbCkgYnJlYWs7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJkYXRlXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcImRhdGV0aW1lXCJcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMucGJmLnRpbWUoYXJncy52YWx1ZSkgPiBcIjE5MDAtMDEtMDFcIikgYnJlYWs7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYXJncy52YWx1ZSkgYnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChhZ2dyZWdhdGVUeXBlID09PSBcIkxhc3RcIikge1xyXG5cdFx0XHRcdFx0Zm9yIChcclxuXHRcdFx0XHRcdFx0bGV0IGxhc3RJbmRleCA9IGFyZ3MuY2VsbFNldHMubGVuZ3RoIC0gMTtcclxuXHRcdFx0XHRcdFx0bGFzdEluZGV4ID49IDA7XHJcblx0XHRcdFx0XHRcdGxhc3RJbmRleC0tXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNvbHVtbnMubGVuZ3RoID09XHJcblx0XHRcdFx0XHRcdFx0XHQxICYmXHJcblx0XHRcdFx0XHRcdFx0YXJncy5jb2x1bW5DZWxsVHlwZSA9PSBcImdyYW5kVG90YWxcIlxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcInN0cmluZ1wiIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcIm52YXJjaGFyXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwiZGF0ZVwiIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcImRhdGV0aW1lXCJcclxuXHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYWxsRGF0YVZhbHVlICYmXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYWxsRGF0YVZhbHVlLmxlbmd0aFxyXG5cdFx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCByb3dPYmpzID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmFsbERhdGFWYWx1ZVthcmdzLnJvdy5yb3dJbmRleF07XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChyb3dPYmpzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianNBcnIgPSBKU09OLnBhcnNlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0SlNPTi5zdHJpbmdpZnkocm93T2JqcylcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBvYmogPSByb3dPYmpzQXJyLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwuYWN0dWFsVGV4dCA9PSBmaWVsZE5hbWUgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwuaXNHcmFuZFN1bVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdClbMF07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9iaikgYXJncy52YWx1ZSA9IG9iai52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IGlzTmFOKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwicm93XCIgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3Mucm93LmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gbnVsbFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogTnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwicm93XCIgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5yb3cuYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCAgKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IGFyZ3MuY2VsbFNldHNbbGFzdEluZGV4XVtmaWVsZE5hbWVdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJudW1iZXJcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwibXVsdGlwbGVcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwicGVyY2VudFwiIHx8XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJwZXJjZW50TnVtXCJcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGFyZ3MudmFsdWUgIT0gbnVsbCkgYnJlYWs7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJkYXRlXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcImRhdGV0aW1lXCJcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMucGJmLnRpbWUoYXJncy52YWx1ZSkgPiBcIjE5MDAtMDEtMDFcIikgYnJlYWs7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYXJncy52YWx1ZSkgYnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcIm51bWJlclwiIHx8XHJcblx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcIm11bHRpcGxlXCIgfHxcclxuXHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwicGVyY2VudFwiIHx8XHJcblx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcInBlcmNlbnROdW1cIlxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnJvd3MubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdGlmICghdGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHQhTnVtYmVyKHRoaXMuZ3JhbmRUb3RhbHNbZmllbGROYW1lXSkgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGlzTmFOKE51bWJlcih0aGlzLmdyYW5kVG90YWxzW2ZpZWxkTmFtZV0pKVxyXG5cdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tmaWVsZE5hbWVdID0gMDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYgKGFyZ3MuYWdncmVnYXRlVHlwZSAhPT0gXCJDYWxjdWxhdGVkRmllbGRcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tmaWVsZE5hbWVdICs9IE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGggPT0gMVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBcInJvd1wiICsgYXJncy5yb3cuYWN0dWFsVGV4dCArIGZpZWxkTmFtZSDooajnpLooY2VsbDogYXJncy5yb3dDZWxsVHlwZSA9PT0gXCJ2YWx1ZVwiICYmIGFyZ3MuY29sdW1uQ2VsbFR5cGUgPT09IFwiZ3JhbmRUb3RhbFwiKVxyXG5cdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdCFOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArIGFyZ3Mucm93LmFjdHVhbFRleHQgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHRcdFx0KSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0aXNOYU4oXHJcblx0XHRcdFx0XHRcdFx0XHRcdE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3Mucm93LmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFwicm93XCIgKyBhcmdzLnJvdy5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRdID0gMDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFwicm93XCIgKyBhcmdzLnJvdy5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XSArPSBOdW1iZXIoYXJncy52YWx1ZSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIFwiY29sXCIgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lIOihqOekuihjZWxsOiBhcmdzLnJvd0NlbGxUeXBlID09PSBcImdyYW5kVG90YWxcIiAmJiBhcmdzLmNvbHVtbkNlbGxUeXBlID09PSBcInZhbHVlXCIpXHJcblx0XHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0IU51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImNvbFwiICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdF1cclxuXHRcdFx0XHRcdFx0XHRcdCkgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGlzTmFOKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHROdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcImNvbFwiICsgYXJncy5jb2x1bW4uYWN0dWFsVGV4dCArIGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XSA9IDA7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcImNvbFwiICsgYXJncy5jb2x1bW4uYWN0dWFsVGV4dCArIGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdF0gKz0gTnVtYmVyKGFyZ3MudmFsdWUpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwic3ViVG90YWxcIiB8fCBhcmdzLnJvdy5oYXNDaGlsZCkge1xyXG5cdFx0XHRjb25zdCBkYXRhVHlwZSA9IGZpZWxkLmRhdGFUeXBlO1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0ZGF0YVR5cGUgPT09IFwic3RyaW5nXCIgfHxcclxuXHRcdFx0XHRkYXRhVHlwZSA9PT0gXCJudmFyY2hhclwiIHx8XHJcblx0XHRcdFx0ZGF0YVR5cGUgPT0gXCJkYXRlXCIgfHxcclxuXHRcdFx0XHRkYXRhVHlwZSA9PSBcImRhdGV0aW1lXCJcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0bGV0IHZhbHVlID0gMDtcclxuXHRcdFx0XHRsZXQgY2hpbGRIZWFkZXJzID0gW107XHJcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0ZVR5cGUgPT09IFwiRmlyc3RcIikge1xyXG5cdFx0XHRcdFx0bGV0IGdyb3VwTmFtZUFycmF5cyA9IFtdO1xyXG5cdFx0XHRcdFx0bGV0IHJvd3MgPSB0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5yb3dzO1xyXG5cdFx0XHRcdFx0Zm9yIChcclxuXHRcdFx0XHRcdFx0bGV0IGluZGV4ID0gYXJncy5yb3cubGV2ZWw7XHJcblx0XHRcdFx0XHRcdGluZGV4IDwgcm93cy5sZW5ndGg7XHJcblx0XHRcdFx0XHRcdGluZGV4KytcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRncm91cE5hbWVBcnJheXMucHVzaChyb3dzW2luZGV4XS5uYW1lKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5jZWxsU2V0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRsZXQgdmFsdWVzID0gW107XHJcblx0XHRcdFx0XHRcdGxldCBoZWFkZXIgPSBncm91cE5hbWVBcnJheXNcclxuXHRcdFx0XHRcdFx0XHQubWFwKChuYW1lKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZXMucHVzaChhcmdzLmNlbGxTZXRzW2ldW25hbWVdKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcmdzLmNlbGxTZXRzW2ldW25hbWVdO1xyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFx0LmpvaW4oXCItXCIpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIShjaGlsZEhlYWRlcnMgYXMgYW55KS5pbmNsdWRlcyhoZWFkZXIpKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGZpbHRlck9iajogYW55ID0ge307XHJcblx0XHRcdFx0XHRcdFx0Z3JvdXBOYW1lQXJyYXlzLm1hcChcclxuXHRcdFx0XHRcdFx0XHRcdChuYW1lLCB4KSA9PiAoZmlsdGVyT2JqW25hbWVdID0gdmFsdWVzW3hdKVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0bGV0IF9DZWxsU2V0cyA9IF9maWx0ZXIoYXJncy5jZWxsU2V0cywgZmlsdGVyT2JqKTtcclxuXHRcdFx0XHRcdFx0XHRjaGlsZEhlYWRlcnMucHVzaChoZWFkZXIpO1xyXG5cdFx0XHRcdFx0XHRcdHZhbHVlICs9IE51bWJlcihfQ2VsbFNldHNbMF1bZmllbGROYW1lXSkgfHwgMDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoYWdncmVnYXRlVHlwZSA9PT0gXCJMYXN0XCIpIHtcclxuXHRcdFx0XHRcdGxldCBncm91cE5hbWVBcnJheXMgPSBbXTtcclxuXHRcdFx0XHRcdGxldCByb3dzID0gdGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Mucm93cztcclxuXHRcdFx0XHRcdGZvciAoXHJcblx0XHRcdFx0XHRcdGxldCBpbmRleCA9IGFyZ3Mucm93LmxldmVsO1xyXG5cdFx0XHRcdFx0XHRpbmRleCA8IHJvd3MubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRpbmRleCsrXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Z3JvdXBOYW1lQXJyYXlzLnB1c2gocm93c1tpbmRleF0ubmFtZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gYXJncy5jZWxsU2V0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG5cdFx0XHRcdFx0XHRsZXQgdmFsdWVzID0gW107XHJcblx0XHRcdFx0XHRcdGxldCBoZWFkZXIgPSBncm91cE5hbWVBcnJheXNcclxuXHRcdFx0XHRcdFx0XHQubWFwKChuYW1lKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZXMucHVzaChhcmdzLmNlbGxTZXRzW2ldW25hbWVdKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcmdzLmNlbGxTZXRzW2ldW25hbWVdO1xyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFx0LmpvaW4oXCItXCIpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIShjaGlsZEhlYWRlcnMgYXMgYW55KS5pbmNsdWRlcyhoZWFkZXIpKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGZpbHRlck9iajogYW55ID0ge307XHJcblx0XHRcdFx0XHRcdFx0Z3JvdXBOYW1lQXJyYXlzLm1hcChcclxuXHRcdFx0XHRcdFx0XHRcdChuYW1lLCB4KSA9PiAoZmlsdGVyT2JqW25hbWVdID0gdmFsdWVzW3hdKVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0bGV0IF9DZWxsU2V0cyA9IF9maWx0ZXIoYXJncy5jZWxsU2V0cywgZmlsdGVyT2JqKTtcclxuXHRcdFx0XHRcdFx0XHRjaGlsZEhlYWRlcnMucHVzaChoZWFkZXIpO1xyXG5cdFx0XHRcdFx0XHRcdHZhbHVlICs9XHJcblx0XHRcdFx0XHRcdFx0XHROdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdF9DZWxsU2V0c1tfQ2VsbFNldHMubGVuZ3RoIC0gMV1bZmllbGROYW1lXVxyXG5cdFx0XHRcdFx0XHRcdFx0KSB8fCAwO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoYXJncy5jb2x1bW4uYWN0dWFsVGV4dCAhPT0gXCJHcmFuZCBUb3RhbFwiKVxyXG5cdFx0XHRcdFx0dGhpcy5jb2x1bW5UZXh0cy5wdXNoKGFyZ3MuY29sdW1uLmFjdHVhbFRleHQpO1xyXG5cclxuXHRcdFx0XHRpZiAoIXRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNvbHVtbnMubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdCFOdW1iZXIodGhpcy5zdWJUb3RhbHNbZmllbGROYW1lXSkgfHxcclxuXHRcdFx0XHRcdFx0aXNOYU4oTnVtYmVyKHRoaXMuc3ViVG90YWxzW2ZpZWxkTmFtZV0pKVxyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc3ViVG90YWxzW2ZpZWxkTmFtZV0gPSAwO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dGhpcy5zdWJUb3RhbHNbZmllbGROYW1lXSArPSBOdW1iZXIodmFsdWUpO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5jb2x1bW5zLmxlbmd0aCA9PSAxXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHQvLyBcInJvd1wiICsgYXJncy5yb3cuYWN0dWFsVGV4dCArIGZpZWxkTmFtZSDooajnpLooY2VsbDogYXJncy5yb3dDZWxsVHlwZSA9PT0gXCJ2YWx1ZVwiICYmIGFyZ3MuY29sdW1uQ2VsbFR5cGUgPT09IFwiZ3JhbmRUb3RhbFwiKVxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQhTnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc3ViVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0YXJncy5yb3cuYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdCkgfHxcclxuXHRcdFx0XHRcdFx0aXNOYU4oXHJcblx0XHRcdFx0XHRcdFx0TnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zdWJUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3Mucm93LmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc3ViVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdGFyZ3Mucm93LmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0YXJncy5jb2x1bW4uYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XSA9IDA7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0aGlzLnN1YlRvdGFsc1tcclxuXHRcdFx0XHRcdFx0YXJncy5yb3cuYWN0dWFsVGV4dCArIGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdF0gKz0gTnVtYmVyKHZhbHVlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gLS0tPiBhbGxEYXRhVmFsdWXkuK3ov5nkuKrljZXlhYPmoLznmoTlgLzkuI3mraPnoa5cclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRhcmdzLmNvbHVtbkNlbGxUeXBlID09PSBcImdyYW5kVG90YWxcIiAmJlxyXG5cdFx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGggPT0gMVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuYWxsRGF0YVZhbHVlICYmIHRoaXMuYWxsRGF0YVZhbHVlLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRhcmdzLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0XHR0aGlzLnN1YlRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdGFyZ3Mucm93LmFjdHVhbFRleHQgKyBcIkdyYW5kIFRvdGFsXCIgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRdO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8g5oqK5YmN6L656L+Z5LiqZmllbGTnmoTlh6DliJdzdWJ0b3RhbOWKoOi1t+adpVxyXG5cdFx0XHRcdFx0XHR0aGlzLmNvbHVtblRleHRzID0gdW5pcUJ5KHRoaXMuY29sdW1uVGV4dHMsIChlbCkgPT4gZWwpO1xyXG5cdFx0XHRcdFx0XHRsZXQgdmFsID0gMDtcclxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtblRleHRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgZWxlbWVudCA9IHRoaXMuY29sdW1uVGV4dHNbaV07XHJcblx0XHRcdFx0XHRcdFx0dmFsICs9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnN1YlRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0YXJncy5yb3cuYWN0dWFsVGV4dCArIGVsZW1lbnQgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdF07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IHZhbDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IHZhbHVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChhcmdzLnJvd0NlbGxUeXBlID09PSBcImdyYW5kVG90YWxcIikge1xyXG5cdFx0XHRjb25zdCBkYXRhVHlwZSA9IGZpZWxkLmRhdGFUeXBlO1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0ZGF0YVR5cGUgPT0gXCJzdHJpbmdcIiB8fFxyXG5cdFx0XHRcdGRhdGFUeXBlID09IFwibnZhcmNoYXJcIiB8fFxyXG5cdFx0XHRcdGRhdGFUeXBlID09IFwiZGF0ZVwiIHx8XHJcblx0XHRcdFx0ZGF0YVR5cGUgPT0gXCJkYXRldGltZVwiXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmICghdGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmFsbERhdGFWYWx1ZSAmJiB0aGlzLmFsbERhdGFWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0bGV0IHJvd09ianMgPVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuYWxsRGF0YVZhbHVlW3RoaXMuYWxsRGF0YVZhbHVlLmxlbmd0aCAtIDFdO1xyXG5cdFx0XHRcdFx0XHRpZiAocm93T2Jqcykge1xyXG5cdFx0XHRcdFx0XHRcdGxldCByb3dPYmpzQXJyID0gSlNPTi5wYXJzZShcclxuXHRcdFx0XHRcdFx0XHRcdEpTT04uc3RyaW5naWZ5KHJvd09ianMpXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgb2JqQXJyID0gcm93T2Jqc0Fyci5maWx0ZXIoXHJcblx0XHRcdFx0XHRcdFx0XHQoZWwpID0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVsLmFjdHVhbFRleHQgPT0gZmllbGROYW1lICYmIGVsLmlzR3JhbmRTdW1cclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChvYmpBcnIgJiYgb2JqQXJyLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IG9iakFycltvYmpBcnIubGVuZ3RoIC0gMV0udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKHRoaXMuZ3JhbmRUb3RhbHMpLmluY2x1ZGVzKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPSB0aGlzLmdyYW5kVG90YWxzW2ZpZWxkTmFtZV07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gdGhpcy5ncmFuZFRvdGFsc1tmaWVsZE5hbWVdO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRpZiAoYXJncy5jb2x1bW5DZWxsVHlwZSA9PT0gXCJncmFuZFRvdGFsXCIpIHtcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuYWxsRGF0YVZhbHVlICYmIHRoaXMuYWxsRGF0YVZhbHVlLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdGxldCByb3dPYmpzID1cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYWxsRGF0YVZhbHVlW3RoaXMuYWxsRGF0YVZhbHVlLmxlbmd0aCAtIDFdO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChyb3dPYmpzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRsZXQgcm93T2Jqc0FyciA9IEpTT04ucGFyc2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdEpTT04uc3RyaW5naWZ5KHJvd09ianMpXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0bGV0IG9iakFyciA9IHJvd09ianNBcnIuZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQoZWwpID0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwuYWN0dWFsVGV4dCA9PSBmaWVsZE5hbWUgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5pc0dyYW5kU3VtXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9iakFyciAmJiBvYmpBcnIubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9iakFycltvYmpBcnIubGVuZ3RoIC0gMV0udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRPYmplY3Qua2V5cyh0aGlzLmdyYW5kVG90YWxzKS5pbmNsdWRlcyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImNvbFwiICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJjb2xcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRdO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBpZiAoXHJcblx0XHRcdFx0XHRcdC8vIFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGggPT0gMVxyXG5cdFx0XHRcdFx0XHQvLyApIHtcclxuXHRcdFx0XHRcdFx0Ly8gXHRhcmdzLnZhbHVlID0gdGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0Ly8gXHRcdFwiY29sXCIgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdC8vIFx0XTtcclxuXHRcdFx0XHRcdFx0Ly8gfVxyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5hbGxEYXRhVmFsdWUgJiYgdGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWVbdGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoIC0gMV07XHJcblx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianNBcnIgPSBKU09OLnBhcnNlKFxyXG5cdFx0XHRcdFx0XHRcdFx0SlNPTi5zdHJpbmdpZnkocm93T2JqcylcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdGxldCBvYmpBcnIgPSByb3dPYmpzQXJyLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWwuYWN0dWFsVGV4dCA9PSBmaWVsZE5hbWUgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWwuaXNHcmFuZFN1bSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbC5jb2x1bW5IZWFkZXJzID09IGFyZ3MuY29sdW1uLmFjdHVhbFRleHRcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChvYmpBcnIgJiYgb2JqQXJyLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IG9iakFycltvYmpBcnIubGVuZ3RoIC0gMV0udmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKHRoaXMuZ3JhbmRUb3RhbHMpLmluY2x1ZGVzKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcImNvbFwiICsgYXJncy5jb2x1bW4uYWN0dWFsVGV4dCArIGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJjb2xcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRdO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHR0aGlzLmZvcm1hdFZhbChhcmdzLCBmaWVsZE5hbWUpO1xyXG5cdFx0cmV0dXJuIGFyZ3MudmFsdWU7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGZvcm1hdFZhbChhcmdzLCBmaWVsZE5hbWUpIHtcclxuXHRcdHRoaXMuY29uZmlnRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcblx0XHRcdGlmIChmaWVsZC5jb2xOYW1lID09IGZpZWxkTmFtZSkge1xyXG5cdFx0XHRcdHN3aXRjaCAoZmllbGQuZGF0YVR5cGUpIHtcclxuXHRcdFx0XHRcdGNhc2UgXCJkYXRlXCI6XHJcblx0XHRcdFx0XHRjYXNlIFwiZGF0ZXRpbWVcIjpcclxuXHRcdFx0XHRcdFx0aWYgKGFyZ3MudmFsdWUpIGFyZ3MudmFsdWUgPSBuZXcgRGF0ZShhcmdzLnZhbHVlKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRleGNsdWRlRmllbGRzKGZpZWxkcywgZGF0YSkge1xyXG5cdFx0bGV0IG5hbWVhcnJheSA9IFtdO1xyXG5cdFx0bGV0IGFycmF5ID0gW107XHJcblx0XHRmb3IgKGxldCBwcm9wIGluIGRhdGEpIHtcclxuXHRcdFx0YXJyYXkucHVzaChwcm9wKTtcclxuXHRcdH1cclxuXHRcdGZvciAobGV0IGl0ZW0gb2YgZmllbGRzKSB7XHJcblx0XHRcdG5hbWVhcnJheS5wdXNoKGl0ZW0uY29sTmFtZSk7XHJcblx0XHR9XHJcblx0XHR0aGlzLmV4Y2x1ZGVGaWVsZHMgPSBkaWZmZXJlbmNlV2l0aChhcnJheSwgbmFtZWFycmF5KTtcclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5leGNsdWRlRmllbGRzLmxlbmd0aCAmJlxyXG5cdFx0XHR0aGlzLmNvbmZpZy5ncm91cFNldHRpbmdzICYmXHJcblx0XHRcdHRoaXMuY29uZmlnLmdyb3VwU2V0dGluZ3MubGVuZ3RoXHJcblx0XHQpIHtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmV4Y2x1ZGVGaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRjb25zdCBlbCA9IHRoaXMuZXhjbHVkZUZpZWxkc1tpXTtcclxuXHRcdFx0XHRpZiAoc3RhcnRzV2l0aChlbCwgdGhpcy5jb25maWcuZ3JvdXBTZXR0aW5nc1swXS5uYW1lICsgXCJfXCIpKSB7XHJcblx0XHRcdFx0XHR0aGlzLmV4Y2x1ZGVGaWVsZHMuc3BsaWNlKGksIDEpO1xyXG5cdFx0XHRcdFx0aS0tO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRJbmZvKCkge1xyXG5cdFx0dGhpcy5kYXRlUGlwZUZvcm1hdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZGF0ZVBpcGVcIik7XHJcblx0XHR0aGlzLnRyYW5zbGF0aW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInRyYW5zbGF0aW9uXCIpKTtcclxuXHRcdEwxMG4ubG9hZCh7XHJcblx0XHRcdFwiZW4tVVNcIjoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHR6aDoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcInpoLUhhbnQtSEtcIjoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRqYToge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRrbzoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRmcjoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgb25GaWVsZERyb3AoYXJnczogRmllbGREcm9wRXZlbnRBcmdzKSB7XHJcblx0XHQvL2NoYW5nZSB0aGUgY2FsY3VhbHRlRmllbGQgbWV0aG9kIHVzZSB0aGUgY29ycmVzcG9uZGluZyBjYWxjdWxhdGVcclxuXHRcdGNvbnN0IGNhbGN1YWx0ZUZpZWxkID0gdGhpcy5jb25maWdGaWVsZHMuZmlsdGVyKFxyXG5cdFx0XHQoZWwpID0+IGVsLmNvbE5hbWUgPT09IGFyZ3MuZmllbGROYW1lICYmIGVsLmlzQ2FsY3VsYXRlZEZpZWxkXHJcblx0XHQpO1xyXG5cdFx0aWYgKGNhbGN1YWx0ZUZpZWxkLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0YXJncy5kcm9wRmllbGQudHlwZSA9XHJcblx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5nZXRDYWxjdWxhdGVNZXRob2QoXHJcblx0XHRcdFx0XHRjYWxjdWFsdGVGaWVsZFswXS5jb2xOYW1lXHJcblx0XHRcdFx0KSBhcyBhbnk7XHJcblx0XHRcdGFyZ3MuZHJvcEZpZWxkLmNhcHRpb24gPSBhcmdzLmRyb3BGaWVsZC5jYXB0aW9uXHJcblx0XHRcdFx0LnJlcGxhY2UoXCJDYWxjdWxhdGVcIiwgXCJcIilcclxuXHRcdFx0XHQudHJpbSgpO1xyXG5cdFx0fVxyXG5cdFx0Zm9yIChcclxuXHRcdFx0bGV0IGkgPSAwO1xyXG5cdFx0XHRpIDwgYXJncy5kYXRhU291cmNlU2V0dGluZ3MuZmlsdGVyU2V0dGluZ3MubGVuZ3RoO1xyXG5cdFx0XHRpKytcclxuXHRcdCkge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0YXJncy5kYXRhU291cmNlU2V0dGluZ3MuZmlsdGVyU2V0dGluZ3NbaV0ubmFtZSA9PT1cclxuXHRcdFx0XHRcdGFyZ3MuZmllbGROYW1lICYmXHJcblx0XHRcdFx0YXJncy5kcm9wQXhpcyA9PT0gXCJcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRhcmdzLmRhdGFTb3VyY2VTZXR0aW5ncy5maWx0ZXJTZXR0aW5ncy5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0dGhpcy5maWx0ZXJTZXR0aW5ncyA9IGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLmZpbHRlclNldHRpbmdzO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNyZWF0ZUJ1dHRvblRleHQoZmllbGQsIGksIGF4aXMsIHZhbHVlUG9zKSB7XHJcblx0XHRsZXQgYnV0dG9uVGV4dDogSFRNTEVsZW1lbnQ7XHJcblx0XHRsZXQgYWdncmVnYXRpb246IHN0cmluZztcclxuXHRcdGxldCBmaWx0ZXJNZW06IHN0cmluZztcclxuXHRcdGlmIChheGlzID09PSBcImZpbHRlcnNcIikge1xyXG5cdFx0XHRmaWx0ZXJNZW0gPSAoXHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmoucGl2b3RCdXR0b25Nb2R1bGUgYXMgYW55XHJcblx0XHRcdCkudXBkYXRlQnV0dG9udGV4dChmaWVsZFtpXS5uYW1lKTtcclxuXHRcdH1cclxuXHRcdGxldCBlbmdpbmVNb2R1bGUgPSB0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZTtcclxuXHRcdGlmIChlbmdpbmVNb2R1bGUuZmllbGRMaXN0W2ZpZWxkW2ldLm5hbWVdICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0YWdncmVnYXRpb24gPSBlbmdpbmVNb2R1bGUuZmllbGRMaXN0W2ZpZWxkW2ldLm5hbWVdLmFnZ3JlZ2F0ZVR5cGU7XHJcblx0XHRcdGFnZ3JlZ2F0aW9uID1cclxuXHRcdFx0XHRhZ2dyZWdhdGlvbiA9PT0gXCJTdW1cIlxyXG5cdFx0XHRcdFx0PyBlbmdpbmVNb2R1bGUuZmllbGRMaXN0W2ZpZWxkW2ldLm5hbWVdLnR5cGUgIT09IFwibnVtYmVyXCJcclxuXHRcdFx0XHRcdFx0PyBcIkNvdW50XCJcclxuXHRcdFx0XHRcdFx0OiBcIlN1bVwiXHJcblx0XHRcdFx0XHQ6IGFnZ3JlZ2F0aW9uO1xyXG5cdFx0fVxyXG5cdFx0bGV0IHRleHQ6IHN0cmluZyA9IGZpZWxkW2ldLmNhcHRpb24gPyBmaWVsZFtpXS5jYXB0aW9uIDogZmllbGRbaV0ubmFtZTtcclxuXHRcdGJ1dHRvblRleHQgPSBjcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XHJcblx0XHRcdGF0dHJzOiB7XHJcblx0XHRcdFx0dGl0bGU6XHJcblx0XHRcdFx0XHRheGlzID09PSBcImZpbHRlcnNcIlxyXG5cdFx0XHRcdFx0XHQ/IHRleHQgKyBcIiAoXCIgKyBmaWx0ZXJNZW0gKyBcIilcIlxyXG5cdFx0XHRcdFx0XHQ6ICF0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5nc1xyXG5cdFx0XHRcdFx0XHRcdFx0LnNob3dBZ2dyZWdhdGlvbk9uVmFsdWVGaWVsZCB8fFxyXG5cdFx0XHRcdFx0XHQgIGF4aXMgIT09IFwidmFsdWVzXCIgfHxcclxuXHRcdFx0XHRcdFx0ICBhZ2dyZWdhdGlvbiA9PT0gXCJDYWxjdWxhdGVkRmllbGRcIlxyXG5cdFx0XHRcdFx0XHQ/IHRleHRcclxuXHRcdFx0XHRcdFx0OiB0aGlzLnBpdm90T2JqLmxvY2FsZU9iai5nZXRDb25zdGFudChhZ2dyZWdhdGlvbikgK1xyXG5cdFx0XHRcdFx0XHQgIFwiIFwiICtcclxuXHRcdFx0XHRcdFx0ICB0aGlzLnBpdm90T2JqLmxvY2FsZU9iai5nZXRDb25zdGFudChcIm9mXCIpICtcclxuXHRcdFx0XHRcdFx0ICBcIiBcIiArXHJcblx0XHRcdFx0XHRcdCAgdGV4dCxcclxuXHRcdFx0XHR0YWJpbmRleDogXCItMVwiLFxyXG5cdFx0XHRcdFwiYXJpYS1kaXNhYmxlZFwiOiBcImZhbHNlXCIsXHJcblx0XHRcdFx0b25jb250ZXh0bWVudTogXCJyZXR1cm4gZmFsc2U7XCIsXHJcblx0XHRcdFx0XCJkYXRhLXR5cGVcIjogdmFsdWVQb3MgPT09IGkgPyBcIlwiIDogYWdncmVnYXRpb24sXHJcblx0XHRcdH0sXHJcblx0XHRcdGNsYXNzTmFtZTpcclxuXHRcdFx0XHRcImUtY29udGVudFwiICtcclxuXHRcdFx0XHRcIiBcIiArXHJcblx0XHRcdFx0KHRoaXMucGl2b3RPYmouZ2V0TW9kdWxlTmFtZSgpID09PSBcInBpdm90dmlld1wiXHJcblx0XHRcdFx0XHQ/IHRoaXMucGl2b3RPYmouZ3JvdXBpbmdCYXJTZXR0aW5ncy5hbGxvd0RyYWdBbmREcm9wICYmXHJcblx0XHRcdFx0XHQgIGZpZWxkW2ldLmFsbG93RHJhZ0FuZERyb3BcclxuXHRcdFx0XHRcdFx0PyBcIlwiXHJcblx0XHRcdFx0XHRcdDogXCJlLWRpc2FibGUtZHJhZ1wiXHJcblx0XHRcdFx0XHQ6IFwiXCIpLFxyXG5cdFx0XHRpbm5lckhUTUw6XHJcblx0XHRcdFx0YXhpcyA9PT0gXCJmaWx0ZXJzXCJcclxuXHRcdFx0XHRcdD8gdGV4dCArIFwiIChcIiArIGZpbHRlck1lbSArIFwiKVwiXHJcblx0XHRcdFx0XHQ6ICF0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5nc1xyXG5cdFx0XHRcdFx0XHRcdC5zaG93QWdncmVnYXRpb25PblZhbHVlRmllbGQgfHxcclxuXHRcdFx0XHRcdCAgYXhpcyAhPT0gXCJ2YWx1ZXNcIiB8fFxyXG5cdFx0XHRcdFx0ICBhZ2dyZWdhdGlvbiA9PT0gXCJDYWxjdWxhdGVkRmllbGRcIlxyXG5cdFx0XHRcdFx0PyB0ZXh0XHJcblx0XHRcdFx0XHQ6IHRoaXMucGl2b3RPYmoubG9jYWxlT2JqLmdldENvbnN0YW50KGFnZ3JlZ2F0aW9uKSArXHJcblx0XHRcdFx0XHQgIFwiIFwiICtcclxuXHRcdFx0XHRcdCAgdGhpcy5waXZvdE9iai5sb2NhbGVPYmouZ2V0Q29uc3RhbnQoXCJvZlwiKSArXHJcblx0XHRcdFx0XHQgIFwiIFwiICtcclxuXHRcdFx0XHRcdCAgdGV4dCxcclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIGJ1dHRvblRleHQ7XHJcblx0fVxyXG5cclxuXHQvLyBDYWxjdWxhdGVkIGZpZWxk5LqL5Lu277ya5Yib5bu6XHJcblx0cHVibGljIGNhbGN1bGF0ZWRGaWVsZENyZWF0ZShhcmdzOiBDYWxjdWxhdGVkRmllbGRDcmVhdGVFdmVudEFyZ3MpIHtcclxuXHRcdGlmIChcclxuXHRcdFx0YXJncy5jYWxjdWxhdGVkRmllbGQubmFtZSAhPT0gXCJcIiAmJlxyXG5cdFx0XHRhcmdzLmNhbGN1bGF0ZWRGaWVsZC5uYW1lLnRyaW0oKSAhPT0gXCJcIlxyXG5cdFx0KSB7XHJcblx0XHRcdGxldCBpbmRleCA9XHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzLmZpbmRJbmRleChcclxuXHRcdFx0XHRcdChlbCkgPT4gZWwubmFtZSA9PT0gYXJncy5jYWxjdWxhdGVkRmllbGQubmFtZVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdGlmIChpbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHRpZiAoYXJncy5jYWxjdWxhdGVkRmllbGQuZm9ybWF0U3RyaW5nID09PSBcIlwiKSB7XHJcblx0XHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3NbXHJcblx0XHRcdFx0XHRcdGluZGV4XHJcblx0XHRcdFx0XHRdLmZvcm1hdFN0cmluZyA9IFwiTjJcIjtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzW1xyXG5cdFx0XHRcdFx0XHRpbmRleFxyXG5cdFx0XHRcdFx0XS5mb3JtYXRTdHJpbmcgPSBhcmdzLmNhbGN1bGF0ZWRGaWVsZC5mb3JtYXRTdHJpbmc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmIChhcmdzLmNhbGN1bGF0ZWRGaWVsZC5mb3JtYXRTdHJpbmcgPT09IFwiXCIpIHtcclxuXHRcdFx0XHRcdGFyZ3MuY2FsY3VsYXRlZEZpZWxkLmZvcm1hdFN0cmluZyA9IFwiTjJcIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8g56e76Zmk6YeN5aSNXHJcblx0XHRcdGxldCBmSW5kZXggPSB0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHMuZmluZEluZGV4KFxyXG5cdFx0XHRcdChmKSA9PiBmLm5hbWUgPT09IGFyZ3MuY2FsY3VsYXRlZEZpZWxkLm5hbWVcclxuXHRcdFx0KTtcclxuXHRcdFx0aWYgKGZJbmRleCA+IC0xKSB7XHJcblx0XHRcdFx0dGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzLnNwbGljZShmSW5kZXgsIDEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIOWMuemFjei/kOeul+espiBGaXJzdCB8fCBMYXN0XHJcblx0XHRcdGxldCBmb3JtdWxhU3RyID0gYXJncy5jYWxjdWxhdGVkRmllbGQuZm9ybXVsYTtcclxuXHRcdFx0bGV0IHJlZzEgPSAvXCJGaXJzdFxcKCguKz8pXFwpXCIvZztcclxuXHRcdFx0bGV0IHJlZzIgPSAvXCJMYXN0XFwoKC4rPylcXClcIi9nO1xyXG5cdFx0XHRpZiAocmVnMS50ZXN0KGZvcm11bGFTdHIpIHx8IHJlZzIudGVzdChmb3JtdWxhU3RyKSkge1xyXG5cdFx0XHRcdC8vIOWIpOaWreaYr+WQpuWtmOWcqEZpcnN0IHx8IExhc3Qg6KGo6L6+5byPXHJcblx0XHRcdFx0bGV0IG1hdGNoRmlyc3RGaWVsZHMgPSBBcnJheS5mcm9tKFxyXG5cdFx0XHRcdFx0Zm9ybXVsYVN0cltcIm1hdGNoQWxsXCJdKC9cIkZpcnN0XFwoKC4rPylcXClcIi9nKSxcclxuXHRcdFx0XHRcdChtKSA9PiB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hTdHI6IG1bMF0sXHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hXb3JkOiBtWzFdLFxyXG5cdFx0XHRcdFx0XHRcdHJlcGxhY2VWYWx1ZTogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRtYXRjaE1ldGhvZDogXCJGaXJzdFwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoTGFzdEZpZWxkcyA9IEFycmF5LmZyb20oXHJcblx0XHRcdFx0XHRmb3JtdWxhU3RyW1wibWF0Y2hBbGxcIl0oL1wiTGFzdFxcKCguKz8pXFwpXCIvZyksXHJcblx0XHRcdFx0XHQobSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRcdG1hdGNoU3RyOiBtWzBdLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoV29yZDogbVsxXSxcclxuXHRcdFx0XHRcdFx0XHRyZXBsYWNlVmFsdWU6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hNZXRob2Q6IFwiTGFzdFwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoTWF4RmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJNYXhcXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIk1heFwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoTWluRmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJNaW5cXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIk1pblwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoU3VtRmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJTdW1cXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIlN1bVwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoQXZnRmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJBdmdcXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIkF2Z1wiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0bWF0Y2hGaXJzdEZpZWxkcy5ldmVyeSgoeCkgPT5cclxuXHRcdFx0XHRcdFx0dGhpcy5hbGxvd2VkQ2FsY3VsYXRlZEZpZWxkcy5pbmNsdWRlcyh4Lm1hdGNoV29yZClcclxuXHRcdFx0XHRcdCkgJiZcclxuXHRcdFx0XHRcdG1hdGNoTGFzdEZpZWxkcy5ldmVyeSgoeCkgPT5cclxuXHRcdFx0XHRcdFx0dGhpcy5hbGxvd2VkQ2FsY3VsYXRlZEZpZWxkcy5pbmNsdWRlcyh4Lm1hdGNoV29yZClcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdC8vIOWIpOaWrUZpcnN05ZKMTGFzdOihqOi+vuW8j+WGheeahOWtl+auteaYr+WQpuWQiOazlVxyXG5cdFx0XHRcdFx0dGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBhcmdzLmNhbGN1bGF0ZWRGaWVsZC5uYW1lLFxyXG5cdFx0XHRcdFx0XHRmb3JtdWxhOiBhcmdzLmNhbGN1bGF0ZWRGaWVsZC5mb3JtdWxhLFxyXG5cdFx0XHRcdFx0XHRtYXRjaEZpZWxkczogW1xyXG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaEZpcnN0RmllbGRzLFxyXG5cdFx0XHRcdFx0XHRcdC4uLm1hdGNoTGFzdEZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaE1heEZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaE1pbkZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaFN1bUZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaEF2Z0ZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XSxcclxuXHRcdFx0XHRcdFx0Z3JhbmRUb3RhbDogMCxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0bGV0IGZpZWxkTmFtZSA9IChcclxuXHRcdFx0XHRcdFx0Zm9ybXVsYVN0ci5zcGxpdChcIkZpcnN0KFwiKVsxXSB8fFxyXG5cdFx0XHRcdFx0XHRmb3JtdWxhU3RyLnNwbGl0KFwiTGFzdChcIilbMV1cclxuXHRcdFx0XHRcdCkuc3BsaXQoXCIpXCIpWzBdO1xyXG5cdFx0XHRcdFx0YXJncy5jYWxjdWxhdGVkRmllbGQuZm9ybXVsYSA9XHJcblx0XHRcdFx0XHRcdFwiJ1xcXCJcIiArIFwiU3VtKFwiICsgZmllbGROYW1lICsgJylcIj0nICsgZm9ybXVsYVN0ciArIFwiJ1wiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gQ2FsY3VsYXRlZCBmaWVsZOS6i+S7tu+8muWujOaIkFxyXG5cdHB1YmxpYyBhY3Rpb25Db21wbGV0ZShhcmdzKSB7XHJcblx0XHRpZiAoYXJncy5hY3Rpb25OYW1lID09IFwiRmllbGQgcmVtb3ZlZFwiKSB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRhcmdzLmZpZWxkSW5mbyAmJlxyXG5cdFx0XHRcdGFyZ3MuZmllbGRJbmZvLmZpZWxkSXRlbSAmJlxyXG5cdFx0XHRcdGFyZ3MuZmllbGRJbmZvLmZpZWxkSXRlbS50eXBlID09IFwiQ2FsY3VsYXRlZEZpZWxkXCJcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0bGV0IGZpZWxkID0gYXJncy5maWVsZEluZm8uZmllbGROYW1lO1xyXG5cdFx0XHRcdC8vIFJlbW92ZSB0aGUgZGVsZXRlZCBjYWxjdWxhdGVkIGZpZWxkIGZyb20gYW4gc3RvcmVkIGFycmF5LlxyXG5cdFx0XHRcdHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkcyA9XHJcblx0XHRcdFx0XHR0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHMuZmlsdGVyKGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai5uYW1lICE9PSBmaWVsZDtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBDYWxjdWxhdGVkIGZpZWxk5LqL5Lu277ya5byA5aeLXHJcblx0cHVibGljIGFjdGlvbkJlZ2luKGFyZ3MpIHtcclxuXHRcdGlmIChhcmdzLmFjdGlvbk5hbWUgPT09IFwiRWRpdCBjYWxjdWxhdGVkIGZpZWxkXCIpIHtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHR0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHNbaV0ubmFtZSAmJlxyXG5cdFx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZmllbGRMaXN0W1xyXG5cdFx0XHRcdFx0XHR0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHNbaV0ubmFtZVxyXG5cdFx0XHRcdFx0XVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZmllbGRMaXN0W1xyXG5cdFx0XHRcdFx0XHR0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHNbaV0ubmFtZVxyXG5cdFx0XHRcdFx0XS5mb3JtdWxhID0gdGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzW2ldLmZvcm11bGE7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHJlc2l6ZVN0b3AoYXJncykge1xyXG5cdFx0aWYgKHRoaXMuY29uZmlnLmNvbHVtbnNXaWR0aCkge1xyXG5cdFx0XHRjb25zdCBoZWFkZXJfZmllbGQgPSB0aGlzLmNvbmZpZy5jb2x1bW5zV2lkdGguZmlsdGVyKFxyXG5cdFx0XHRcdChlbCkgPT4gZWwuaGVhZGVyVGV4dCA9PT0gYXJncy5jb2x1bW4uaGVhZGVyVGV4dFxyXG5cdFx0XHQpO1xyXG5cdFx0XHRpZiAoaGVhZGVyX2ZpZWxkLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRoZWFkZXJfZmllbGRbMF0ud2lkdGggPSBwYXJzZUludChhcmdzLmNvbHVtbi53aWR0aCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5jb25maWcuY29sdW1uc1dpZHRoLnB1c2goe1xyXG5cdFx0XHRcdFx0aGVhZGVyVGV4dDogYXJncy5jb2x1bW4uaGVhZGVyVGV4dCxcclxuXHRcdFx0XHRcdHdpZHRoOiBwYXJzZUludChhcmdzLmNvbHVtbi53aWR0aCksXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuY29uZmlnLmNvbHVtbnNXaWR0aCA9IFtdO1xyXG5cdFx0XHR0aGlzLmNvbmZpZy5jb2x1bW5zV2lkdGgucHVzaCh7XHJcblx0XHRcdFx0aGVhZGVyVGV4dDogYXJncy5jb2x1bW4uaGVhZGVyVGV4dCxcclxuXHRcdFx0XHR3aWR0aDogcGFyc2VJbnQoYXJncy5jb2x1bW4ud2lkdGgpLFxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHBvcnRsZXQgPSB0aGlzLnBvcnRsZXQ7XHJcblx0XHRwb3J0bGV0LmNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnKTtcclxuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5wb3J0bGV0cy5maW5kSW5kZXgoKHgpID0+IHgubmV3SWQgPT09IHBvcnRsZXQubmV3SWQpO1xyXG5cdFx0aWYgKGluZGV4ID4gLTEpIHRoaXMucG9ydGxldHNbaW5kZXhdID0gcG9ydGxldDtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBvbkxvYWQoKTogdm9pZCB7fVxyXG5cclxuXHRwcml2YXRlIGVuZ2luZVBvcHVsYXRlZChhcmdzKSB7XHJcblx0XHRsZXQgY2xvbmVkVmFsdWVzOiBJUGl2b3RWYWx1ZXM7XHJcblx0XHRsZXQgY3VycmVudFBpdm90VmFsdWVzOiBhbnkgPSB0aGlzLmdldENsb25lZFBpdm90VmFsdWVzKFxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5waXZvdFZhbHVlc1xyXG5cdFx0KTtcclxuXHRcdGxldCBwYWdlU2V0dGluZ3M6IElQYWdlU2V0dGluZ3MgPVxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5wYWdlU2V0dGluZ3M7XHJcblxyXG5cdFx0Ly8gdGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUucGFnZVNldHRpbmdzID0gbnVsbDtcclxuXHRcdGlmICh0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5nZW5lcmF0ZUdyaWREYXRhKSB7XHJcblx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmdlbmVyYXRlR3JpZERhdGEoXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MsXHJcblx0XHRcdFx0dHJ1ZVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRjbG9uZWRWYWx1ZXMgPSB0aGlzLmdldENsb25lZFBpdm90VmFsdWVzKFxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLnBpdm90VmFsdWVzXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5waXZvdFZhbHVlcyA9IGN1cnJlbnRQaXZvdFZhbHVlcztcclxuXHJcblx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLnBhZ2VTZXR0aW5ncyA9IHBhZ2VTZXR0aW5ncztcclxuXHJcblx0XHRcdC8vIEhlcmUgXCJjbG9uZWRWYWx1ZXNcIiBjb250YWlucyB0aGUgd2hvbGUgcGl2b3QgdmFsdWVzLlxyXG5cdFx0XHR0aGlzLmFsbERhdGFWYWx1ZSA9IGNsb25lZFZhbHVlcztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0Q2xvbmVkUGl2b3RWYWx1ZXMocGl2b3RWYWx1ZXM6IElQaXZvdFZhbHVlcyk6IElQaXZvdFZhbHVlcyB7XHJcblx0XHRsZXQgY2xvbmVkU2V0czogSVBpdm90VmFsdWVzID0gW107XHJcblx0XHRpZiAocGl2b3RWYWx1ZXMgJiYgcGl2b3RWYWx1ZXMubGVuZ3RoKSB7XHJcblx0XHRcdGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwaXZvdFZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGlmIChwaXZvdFZhbHVlc1tpXSkge1xyXG5cdFx0XHRcdFx0Y2xvbmVkU2V0c1tpXSA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHBpdm90VmFsdWVzW2ldLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRcdGlmIChwaXZvdFZhbHVlc1tpXVtqXSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlICovXHJcblx0XHRcdFx0XHRcdFx0Y2xvbmVkU2V0c1tpXVtqXSA9IHRoaXMuZ2V0Q2xvbmVkUGl2b3RWYWx1ZU9iaihcclxuXHRcdFx0XHRcdFx0XHRcdHBpdm90VmFsdWVzW2ldW2pdIGFzIHsgW2tleTogc3RyaW5nXTogT2JqZWN0IH1cclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdC8qIGVzbGludC1lbmFibGUgKi9cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNsb25lZFNldHM7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldENsb25lZFBpdm90VmFsdWVPYmooZGF0YTogeyBba2V5OiBzdHJpbmddOiBPYmplY3QgfSk6IHtcclxuXHRcdFtrZXk6IHN0cmluZ106IE9iamVjdDtcclxuXHR9IHtcclxuXHRcdGxldCBrZXlQb3M6IG51bWJlciA9IDA7XHJcblx0XHRsZXQgZnJhbWVkU2V0OiBhbnkgPSB7fTtcclxuXHRcdGlmICghKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSkge1xyXG5cdFx0XHRsZXQgZmllbGRzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGRhdGEpO1xyXG5cdFx0XHR3aGlsZSAoa2V5UG9zIDwgZmllbGRzLmxlbmd0aCkge1xyXG5cdFx0XHRcdGZyYW1lZFNldFtmaWVsZHNba2V5UG9zXV0gPSBkYXRhW2ZpZWxkc1trZXlQb3NdXTtcclxuXHRcdFx0XHRrZXlQb3MrKztcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZnJhbWVkU2V0ID0gZGF0YTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBmcmFtZWRTZXQ7XHJcblx0fVxyXG5cclxuXHQvLyNyZWdpb24gRmlsdGVyaW5nIHRoZSBUcmVlTm9kZXNcclxuXHRwcml2YXRlIHNlYXJjaE5vZGVzKGFyZ3MpIHtcclxuXHRcdGxldCBfdGV4dCA9IGFyZ3MubWFza2VkVmFsdWU7XHJcblx0XHRsZXQgcHJlZGljYXRzID0gW10sXHJcblx0XHRcdF9hcnJheSA9IFtdLFxyXG5cdFx0XHRfZmlsdGVyID0gW107XHJcblx0XHRpZiAoX3RleHQgPT0gXCJcIikge1xyXG5cdFx0XHR0aGlzLmNoYW5nZURhdGFTb3VyY2UoXHJcblx0XHRcdFx0KCh0aGlzIGFzIGFueSkuZmllbGRsaXN0T2JqLnRyZWVWaWV3TW9kdWxlIGFzIGFueSkuZ2V0VHJlZURhdGEoKVxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bGV0IHByZWRpY2F0ZSA9IG5ldyBQcmVkaWNhdGUoXCJjYXB0aW9uXCIsIFwiY29udGFpbnNcIiwgX3RleHQsIHRydWUpO1xyXG5cdFx0XHRsZXQgZmlsdGVyZWRMaXN0ID0gbmV3IERhdGFNYW5hZ2VyKFxyXG5cdFx0XHRcdCgodGhpcyBhcyBhbnkpLmZpZWxkbGlzdE9iai50cmVlVmlld01vZHVsZSBhcyBhbnkpLmdldFRyZWVEYXRhKClcclxuXHRcdFx0KS5leGVjdXRlTG9jYWwobmV3IFF1ZXJ5KCkud2hlcmUocHJlZGljYXRlKSk7XHJcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgZmlsdGVyZWRMaXN0Lmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0X2ZpbHRlci5wdXNoKGZpbHRlcmVkTGlzdFtqXVtcImlkXCJdKTtcclxuXHRcdFx0XHRsZXQgZmlsdGVycyA9IHRoaXMuZ2V0RmlsdGVySXRlbXMoXHJcblx0XHRcdFx0XHRmaWx0ZXJlZExpc3Rbal0sXHJcblx0XHRcdFx0XHQoXHJcblx0XHRcdFx0XHRcdCh0aGlzIGFzIGFueSkuZmllbGRsaXN0T2JqLnRyZWVWaWV3TW9kdWxlIGFzIGFueVxyXG5cdFx0XHRcdFx0KS5nZXRUcmVlRGF0YSgpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0X2FycmF5LmluZGV4T2YoZmlsdGVyc1tpXSkgPT0gLTEgJiZcclxuXHRcdFx0XHRcdFx0ZmlsdGVyc1tpXSAhPSBudWxsXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0X2FycmF5LnB1c2goZmlsdGVyc1tpXSk7XHJcblx0XHRcdFx0XHRcdHByZWRpY2F0cy5wdXNoKFxyXG5cdFx0XHRcdFx0XHRcdG5ldyBQcmVkaWNhdGUoXCJpZFwiLCBcImVxdWFsXCIsIGZpbHRlcnNbaV0sIGZhbHNlKVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAocHJlZGljYXRzLmxlbmd0aCA9PSAwKSB7XHJcblx0XHRcdFx0dGhpcy5jaGFuZ2VEYXRhU291cmNlKFtdKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRsZXQgcXVlcnkgPSBuZXcgUXVlcnkoKS53aGVyZShQcmVkaWNhdGUub3IocHJlZGljYXRzKSk7XHJcblx0XHRcdFx0bGV0IG5ld0xpc3QgPSBuZXcgRGF0YU1hbmFnZXIoXHJcblx0XHRcdFx0XHQoXHJcblx0XHRcdFx0XHRcdCh0aGlzIGFzIGFueSkuZmllbGRsaXN0T2JqLnRyZWVWaWV3TW9kdWxlIGFzIGFueVxyXG5cdFx0XHRcdFx0KS5nZXRUcmVlRGF0YSgpXHJcblx0XHRcdFx0KS5leGVjdXRlTG9jYWwocXVlcnkpO1xyXG5cdFx0XHRcdHRoaXMuY2hhbmdlRGF0YVNvdXJjZShuZXdMaXN0KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly9GaW5kIHRoZSBQYXJlbnQgTm9kZXMgZm9yIGNvcnJlc3BvbmRpbmcgY2hpbGRzXHJcblx0cHVibGljIGdldEZpbHRlckl0ZW1zKGZMaXN0LCBsaXN0KSB7XHJcblx0XHRsZXQgbm9kZXMgPSBbXTtcclxuXHRcdG5vZGVzLnB1c2goZkxpc3RbXCJpZFwiXSk7XHJcblx0XHRsZXQgcXVlcnkyID0gbmV3IFF1ZXJ5KCkud2hlcmUoXCJpZFwiLCBcImVxdWFsXCIsIGZMaXN0W1wicGlkXCJdLCBmYWxzZSk7XHJcblx0XHRsZXQgZkxpc3QxID0gbmV3IERhdGFNYW5hZ2VyKGxpc3QpLmV4ZWN1dGVMb2NhbChxdWVyeTIpO1xyXG5cdFx0aWYgKGZMaXN0MS5sZW5ndGggIT0gMCkge1xyXG5cdFx0XHRsZXQgcE5vZGUgPSB0aGlzLmdldEZpbHRlckl0ZW1zKGZMaXN0MVswXSwgbGlzdCk7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcE5vZGUubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRpZiAobm9kZXMuaW5kZXhPZihwTm9kZVtpXSkgPT0gLTEgJiYgcE5vZGVbaV0gIT0gbnVsbClcclxuXHRcdFx0XHRcdG5vZGVzLnB1c2gocE5vZGVbaV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBub2RlcztcclxuXHRcdH1cclxuXHRcdHJldHVybiBub2RlcztcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBjcmVhdGVkKGFyZ3M6IGFueSkge1xyXG5cdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqICYmICF0aGlzLmZpZWxkbGlzdE9iai5lbmdpbmVNb2R1bGUuZmllbGRzKSB7XHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmVuZ2luZU1vZHVsZS5maWVsZHMgPSBbXTtcclxuXHRcdH1cclxuXHRcdGxldCBzZWFyY2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcblx0XHRzZWFyY2guaWQgPSBcInBpdm90U2VhcmNoQm94XCIgKyB0aGlzLmZpZWxkbGlzdE9iai5lbGVtZW50LmlkO1xyXG5cdFx0bGV0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuXHRcdFx0XCIjXCIgKyB0aGlzLmZpZWxkbGlzdE9iai5lbGVtZW50LmlkICsgXCJfQ29udGFpbmVyIC5lLWZpZWxkLXRhYmxlXCJcclxuXHRcdCk7XHJcblx0XHRpZiAoZWwpIGVsLnByZXBlbmQoc2VhcmNoKTtcclxuXHRcdHRoaXMucGl2b3RTZWFyY2hCb3ggPSBuZXcgTWFza2VkVGV4dEJveCh7XHJcblx0XHRcdHBsYWNlaG9sZGVyOiB0aGlzLnRyYW5zbGF0aW9uLlNFQVJDSCB8fCBcIi5TRUFSQ0hcIixcclxuXHRcdFx0Y3NzQ2xhc3M6IFwicGl2b3Qtc2VhcmNoXCIsXHJcblx0XHRcdGNoYW5nZTogdGhpcy5zZWFyY2hOb2Rlcy5iaW5kKHRoaXMpLFxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLnBpdm90U2VhcmNoQm94LmFwcGVuZFRvKFxyXG5cdFx0XHRcIiNwaXZvdFNlYXJjaEJveFwiICsgdGhpcy5maWVsZGxpc3RPYmouZWxlbWVudC5pZFxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBORVcgRGFzaGJvYXJkIOeCueWHu1wiYXBwbHlcIuaXtu+8jOivt+axguaWsOaVsOaNrlxyXG5cdFx0bGV0IGFwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmVsZW1lbnQuaWQgKyBcIl9EZWZlclVwZGF0ZUJ1dHRvbjFcIlxyXG5cdFx0KTtcclxuXHRcdGFwcGx5QnRuICYmXHJcblx0XHRcdGFwcGx5QnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5wYmYucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0RGF0YUJ5UG9ydGxldHNOZXcoXHJcblx0XHRcdFx0XHRbdGhpcy5wb3J0bGV0XSxcclxuXHRcdFx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5nZXREYXRhKCk7XHJcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGJmLnBhZ2VMb2FkaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdG51bGwsXHJcblx0XHRcdFx0XHRmYWxzZSxcclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkLFxyXG5cdFx0XHRcdFx0ZmFsc2VcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBmaWVsZExpc3RSZWZyZXNoZWQoYXJncykge1xyXG5cdFx0aWYgKHRoaXMucGl2b3RTZWFyY2hCb3gpIHtcclxuXHRcdFx0dGhpcy5waXZvdFNlYXJjaEJveC52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdHRoaXMuY2hhbmdlRGF0YVNvdXJjZShcclxuXHRcdFx0XHQodGhpcy5maWVsZGxpc3RPYmoudHJlZVZpZXdNb2R1bGUgYXMgYW55KS5nZXRUcmVlRGF0YSgpXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNoYW5nZURhdGFTb3VyY2UoZGF0YSkge1xyXG5cdFx0bGV0IGZpZWxkVGFibGUgPSAodGhpcyBhcyBhbnkpLmZpZWxkbGlzdE9iai50cmVlVmlld01vZHVsZS5maWVsZFRhYmxlO1xyXG5cdFx0aWYgKGZpZWxkVGFibGUpIHtcclxuXHRcdFx0ZmllbGRUYWJsZS5maWVsZHMgPSB7XHJcblx0XHRcdFx0ZGF0YVNvdXJjZTogZGF0YSxcclxuXHRcdFx0XHRpZDogXCJpZFwiLFxyXG5cdFx0XHRcdHRleHQ6IFwiY2FwdGlvblwiLFxyXG5cdFx0XHRcdGlzQ2hlY2tlZDogXCJpc1NlbGVjdGVkXCIsXHJcblx0XHRcdFx0cGFyZW50SUQ6IFwicGlkXCIsXHJcblx0XHRcdFx0aWNvbkNzczogXCJzcHJpdGVDc3NDbGFzc1wiLFxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly9TTVAyLTI5NTcgZml4IHRoZSBkYXRlIGlzc3VlIG9uIHRoZSByYXcgZGF0YVxyXG5cdHB1YmxpYyBkcmlsbFRocm91Z2goYXJnczogRHJpbGxUaHJvdWdoRXZlbnRBcmdzKSB7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MuZ3JpZENvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgZGF0YSA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHQoZWwpID0+IGVsLmNvbE5hbWUgPT09IGFyZ3MuZ3JpZENvbHVtbnNbaV0uZmllbGRcclxuXHRcdFx0KTtcclxuXHRcdFx0aWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0ZGF0YVswXS5kYXRhVHlwZSA9PT0gXCJkYXRlXCIgfHxcclxuXHRcdFx0XHRcdGRhdGFbMF0uZGF0YVR5cGUgPT09IFwiZGF0ZXRpbWVcIlxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0YXJncy5ncmlkQ29sdW1uc1tpXS50eXBlID0gXCJkYXRlXCI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdC8vI2VuZHJlZ2lvblxyXG5cclxuXHRwcml2YXRlIHNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwob2JqLCBkYXRhLCBjb2RlKSB7XHJcblx0XHRpZiAoY29kZSA9PT0gLTEpIHtcclxuXHRcdFx0b2JqLnN0eWxlLmNvbG9yID0gZGF0YS5uZWdhRm9udENvbG9yO1xyXG5cdFx0XHRvYmouc3R5bGUuZm9udEZhbWlseSA9IGRhdGEubmVnYUZvbnRGYW1pbHlWYWx1ZTtcclxuXHRcdFx0b2JqLnN0eWxlLmZvbnRTaXplID0gZGF0YS5uZWdhRm9udFNpemVWYWx1ZTtcclxuXHRcdFx0b2JqLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGRhdGEubmVnYUJhY2tncm91bmRDb2xvcjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdG9iai5zdHlsZS5jb2xvciA9IGRhdGEuZm9udENvbG9yO1xyXG5cdFx0XHRvYmouc3R5bGUuZm9udEZhbWlseSA9IGRhdGEuZm9udEZhbWlseVZhbHVlO1xyXG5cdFx0XHRvYmouc3R5bGUuZm9udFNpemUgPSBkYXRhLmZvbnRTaXplVmFsdWU7XHJcblx0XHRcdG9iai5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBkYXRhLmJhY2tncm91bmRDb2xvcjtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc2V0Q29tcGFyZUNvbmRpdGlvbmFsKFxyXG5cdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRkYXRhXHJcblx0KSB7XHJcblx0XHRpZiAoTWF0aC5zaWduKGRhdGEuY29tcGFyZVZhbHVlMSkgPT0gMCkge1xyXG5cdFx0XHRzd2l0Y2ggKGRhdGEuY29tcGFyZVNlbGVjdCkge1xyXG5cdFx0XHRcdGNhc2UgXCJMZXNzVGhhblwiOiAvLyDlsI/kuo5cclxuXHRcdFx0XHRjYXNlIFwiTGVzc1RoYW5PckVxdWFsVG9cIjogLy8g5bCP5LqO562J5LqOXHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJMZXNzVGhhblwiO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkdyZWF0ZXJUaGFuXCI6IC8vIOWkp+S6jlxyXG5cdFx0XHRcdGNhc2UgXCJHcmVhdGVyVGhhbk9yRXF1YWxUb1wiOiAvLyDlpKfkuo7nrYnkuo5cclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJHcmVhdGVyVGhhblwiO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJOb3RFcXVhbHNcIjogLy8g5LiN562J5LqOXHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJMZXNzVGhhblwiO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkdyZWF0ZXJUaGFuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkJldHdlZW5cIjogLy8gdmFsdWUxPD0gdmFsIDw9dmFsdWUyXHJcblx0XHRcdFx0XHRpZiAoTWF0aC5zaWduKGRhdGEuY29tcGFyZVZhbHVlMikgPT09IDEpIHtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUyID0gTnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEuY29tcGFyZVZhbHVlMlxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJCZXR3ZWVuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJOb3RCZXR3ZWVuXCI6IC8vIHZhbCA+PSB2YWx1ZTIsIHZhbCA8PSB2YWx1ZTFcclxuXHRcdFx0XHRcdGlmIChNYXRoLnNpZ24oZGF0YS5jb21wYXJlVmFsdWUyKSA9PT0gMSkge1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0ZGF0YS5jb21wYXJlVmFsdWUyXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkdyZWF0ZXJUaGFuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJMZXNzVGhhblwiO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChNYXRoLnNpZ24oZGF0YS5jb21wYXJlVmFsdWUxKSA9PT0gMSkge1xyXG5cdFx0XHRzd2l0Y2ggKGRhdGEuY29tcGFyZVNlbGVjdCkge1xyXG5cdFx0XHRcdGNhc2UgXCJMZXNzVGhhblwiOiAvLyDlsI/kuo5cclxuXHRcdFx0XHRjYXNlIFwiTGVzc1RoYW5PckVxdWFsVG9cIjogLy8g5bCP5LqO562J5LqOXHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUyID0gTnVtYmVyKGRhdGEuY29tcGFyZVZhbHVlMSk7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJCZXR3ZWVuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiTGVzc1RoYW5cIjtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQtMVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJHcmVhdGVyVGhhblwiOiAvLyDlpKfkuo5cclxuXHRcdFx0XHRjYXNlIFwiR3JlYXRlclRoYW5PckVxdWFsVG9cIjogLy8g5aSn5LqO562J5LqOXHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBOdW1iZXIoZGF0YS5jb21wYXJlVmFsdWUxKTtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkdyZWF0ZXJUaGFuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkVxdWFsc1wiOiAvLyDnrYnkuo5cclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IE51bWJlcihkYXRhLmNvbXBhcmVWYWx1ZTEpO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiRXF1YWxzXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIk5vdEVxdWFsc1wiOiAvLyDkuI3nrYnkuo5cclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBOdW1iZXIoZGF0YS5jb21wYXJlVmFsdWUxKTtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdC8vIHB1c2jov5vmlbDnu4RcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IE51bWJlcihkYXRhLmNvbXBhcmVWYWx1ZTEpO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdC8vIHB1c2jov5vmlbDnu4RcclxuXHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJMZXNzVGhhbk9yRXF1YWxUb1wiO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJCZXR3ZWVuXCI6IC8vIHZhbHVlMTw9IHZhbCA8PXZhbHVlMlxyXG5cdFx0XHRcdFx0aWYgKE1hdGguc2lnbihkYXRhLmNvbXBhcmVWYWx1ZTIpID09PSAxKSB7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRkYXRhLmNvbXBhcmVWYWx1ZTFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUyID0gTnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEuY29tcGFyZVZhbHVlMlxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJCZXR3ZWVuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJOb3RCZXR3ZWVuXCI6IC8vIHZhbCA+PSB2YWx1ZTIsIHZhbCA8PSB2YWx1ZTFcclxuXHRcdFx0XHRcdGlmIChNYXRoLnNpZ24oZGF0YS5jb21wYXJlVmFsdWUyKSA9PT0gMSkge1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0ZGF0YS5jb21wYXJlVmFsdWUxXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdFx0Ly8gcHVzaOi/m+aVsOe7hFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0ZGF0YS5jb21wYXJlVmFsdWUyXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkdyZWF0ZXJUaGFuXCI7XHJcblx0XHRcdFx0XHRcdC8vIHB1c2jov5vmlbDnu4RcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKE1hdGguc2lnbihkYXRhLmNvbXBhcmVWYWx1ZTEpID09PSAtMSkge1xyXG5cdFx0XHRzd2l0Y2ggKGRhdGEuY29tcGFyZVNlbGVjdCkge1xyXG5cdFx0XHRcdGNhc2UgXCJMZXNzVGhhblwiOiAvLyDlsI/kuo5cclxuXHRcdFx0XHRjYXNlIFwiTGVzc1RoYW5PckVxdWFsVG9cIjogLy8g5bCP5LqO562J5LqOXHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gZGF0YS5jb21wYXJlVmFsdWUxO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBkYXRhLmNvbXBhcmVTZWxlY3Q7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiR3JlYXRlclRoYW5cIjogLy8g5aSn5LqOXHJcblx0XHRcdFx0Y2FzZSBcIkdyZWF0ZXJUaGFuT3JFcXVhbFRvXCI6IC8vIOWkp+S6juetieS6jlxyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkdyZWF0ZXJUaGFuT3JFcXVhbFRvXCI7XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBkYXRhLmNvbXBhcmVWYWx1ZTE7XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiQmV0d2VlblwiO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQtMVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJFcXVhbHNcIjogLy8g562J5LqOXHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gZGF0YS5jb21wYXJlVmFsdWUxO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkVxdWFsc1wiO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdGNhc2UgXCJOb3RFcXVhbHNcIjogLy8g5LiN562J5LqOXHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gZGF0YS5jb21wYXJlVmFsdWUxO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIk5vdEVxdWFsc1wiO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkdyZWF0ZXJUaGFuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkJldHdlZW5cIjogLy8gdmFsdWUxPD0gdmFsIDw9dmFsdWUyXHJcblx0XHRcdFx0XHRpZiAoTWF0aC5zaWduKGRhdGEuY29tcGFyZVZhbHVlMikpIHtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBkYXRhLmNvbXBhcmVWYWx1ZTE7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJCZXR3ZWVuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHQtMVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBkYXRhLmNvbXBhcmVWYWx1ZTI7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IGRhdGEuY29tcGFyZVZhbHVlMTtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMiA9IGRhdGEuY29tcGFyZVZhbHVlMjtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiTm90QmV0d2VlblwiOiAvLyB2YWwgPj0gdmFsdWUyLCB2YWwgPD0gdmFsdWUxXHJcblx0XHRcdFx0XHRpZiAoTWF0aC5zaWduKGRhdGEuY29tcGFyZVZhbHVlMikpIHtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IGRhdGEuY29tcGFyZVZhbHVlMTtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkxlc3NUaGFuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHQtMVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gZGF0YS5jb21wYXJlVmFsdWUyO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJHcmVhdGVyVGhhblwiO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gZGF0YS5jb21wYXJlVmFsdWUxO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUyID0gZGF0YS5jb21wYXJlVmFsdWUyO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiTm90QmV0d2VlblwiO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkdyZWF0ZXJUaGFuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHBhcmFtIHRpbWVBcnJheSDmlbDnu4Tlr7nosaEgW3tcImRhdGVcIjpcIjIwMjEtMDEtMDFcIn0se1wiZGF0ZVwiOlwiMjAyMS0wMi0wMVwifV1cclxuXHQgKiBAcGFyYW0gZW5kRGF0ZSDmiKroh7Pml7bpl7RcclxuXHQgKiBAcGFyYW0gaW50ZXJ2YWwg5pe26Ze06Ze06ZqUIHllYXIgLyBxdWFydGVyIC8gbW9udGhcclxuXHQgKiBAcGFyYW0gdGltZUtleSDml7bpl7TlrZfmrrXlkI0gZGF0ZVxyXG5cdCAqIEByZXR1cm5zIOWIkuWIhuWQjueahOaXtumXtOWIhue7hOWvueixoVxyXG5cdCAqL1xyXG5cdGdldFRpbWVSYW5nZXModGltZUFycmF5LCBlbmREYXRlLCBpbnRlcnZhbCwgdGltZUtleSkge1xyXG5cdFx0Ly8g5bCG5pe26Ze05a2X56ym5Liy6L2s5o2i5Li6IG1vbWVudCDlr7nosaFcclxuXHRcdGNvbnN0IGRhdGVzID0gdGltZUFycmF5Lm1hcCgoaXRlbSkgPT4gbW9tZW50KGl0ZW1bdGltZUtleSB8fCBcImRhdGVcIl0pKTtcclxuXHJcblx0XHQvLyDliIbpmpTnrKZcclxuXHRcdGNvbnN0IGRlbGltaXRlciA9IFwiLVwiO1xyXG5cclxuXHRcdC8vIOaJvuWIsOacgOWwj+aXtumXtOWSjOacgOWkp+aXtumXtFxyXG5cdFx0Y29uc3QgbWluRGF0ZSA9IG1vbWVudC5taW4oZGF0ZXMpO1xyXG5cdFx0Y29uc3QgbWF4RGF0ZSA9IG1vbWVudChlbmREYXRlKTtcclxuXHJcblx0XHQvLyDliJ3lp4vljJbnu5Pmnpzlr7nosaFcclxuXHRcdGNvbnN0IHJlc3VsdCA9IHt9O1xyXG5cclxuXHRcdC8vIOagueaNruWFpeWPgui/m+ihjOWIkuWIhlxyXG5cdFx0aWYgKGludGVydmFsID09PSBcInllYXJcIikge1xyXG5cdFx0XHRjb25zdCBzdGFydFllYXIgPSBtaW5EYXRlLnllYXIoKTtcclxuXHRcdFx0Y29uc3QgZW5kWWVhciA9IG1heERhdGUueWVhcigpO1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgeWVhciA9IHN0YXJ0WWVhcjsgeWVhciA8PSBlbmRZZWFyOyB5ZWFyKyspIHtcclxuXHRcdFx0XHRyZXN1bHRbeWVhcl0gPSBbXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGF0ZXMuZm9yRWFjaCgoZGF0ZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB5ZWFyID0gZGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0cmVzdWx0W3llYXJdLnB1c2godGltZUFycmF5W2luZGV4XSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIGlmIChpbnRlcnZhbCA9PT0gXCJxdWFydGVyXCIpIHtcclxuXHRcdFx0Ly8g5a2Y5YKo5a2j5bqm5a2X56ym5LiyXHJcblx0XHRcdGNvbnN0IHF1YXJ0ZXJzID0gW107XHJcblxyXG5cdFx0XHQvLyDpgJDkuIDpgY3ljobmr4/kuKrlraPluqZcclxuXHRcdFx0Zm9yIChcclxuXHRcdFx0XHRsZXQgY3VycmVudERhdGUgPSBtaW5EYXRlLmNsb25lKCk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuaXNTYW1lT3JCZWZvcmUobWF4RGF0ZSk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuYWRkKDMsIFwibW9udGhzXCIpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGNvbnN0IHllYXIgPSBjdXJyZW50RGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0Y29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoY3VycmVudERhdGUubW9udGgoKSArIDEpIC8gMyk7IC8vIOiuoeeul+Wto+W6plxyXG5cdFx0XHRcdHF1YXJ0ZXJzLnB1c2goYCR7eWVhcn0ke2RlbGltaXRlcn1RJHtxdWFydGVyfWApOyAvLyDmoLzlvI/ljJblubbmt7vliqDliLDmlbDnu4RcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8g6L6T5Ye65omA5pyJ5a2j5bqmXHJcblx0XHRcdHF1YXJ0ZXJzLmZvckVhY2goKHF1YXJ0ZXIsIGluZGV4KSA9PiB7XHJcblx0XHRcdFx0cmVzdWx0W3F1YXJ0ZXJdID0gW107XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0ZGF0ZXMuZm9yRWFjaCgoZGF0ZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB5ZWFyID0gZGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0Y29uc3QgcXVhcnRlciA9IGRhdGUucXVhcnRlcigpOyAvLyDojrflj5blraPluqZcclxuXHRcdFx0XHRpZiAocXVhcnRlciA9PT0gMSlcclxuXHRcdFx0XHRcdHJlc3VsdFt5ZWFyICsgZGVsaW1pdGVyICsgXCJRMVwiXS5wdXNoKHRpbWVBcnJheVtpbmRleF0pO1xyXG5cdFx0XHRcdGVsc2UgaWYgKHF1YXJ0ZXIgPT09IDIpXHJcblx0XHRcdFx0XHRyZXN1bHRbeWVhciArIGRlbGltaXRlciArIFwiUTJcIl0ucHVzaCh0aW1lQXJyYXlbaW5kZXhdKTtcclxuXHRcdFx0XHRlbHNlIGlmIChxdWFydGVyID09PSAzKVxyXG5cdFx0XHRcdFx0cmVzdWx0W3llYXIgKyBkZWxpbWl0ZXIgKyBcIlEzXCJdLnB1c2godGltZUFycmF5W2luZGV4XSk7XHJcblx0XHRcdFx0ZWxzZSBpZiAocXVhcnRlciA9PT0gNClcclxuXHRcdFx0XHRcdHJlc3VsdFt5ZWFyICsgZGVsaW1pdGVyICsgXCJRNFwiXS5wdXNoKHRpbWVBcnJheVtpbmRleF0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSBpZiAoaW50ZXJ2YWwgPT09IFwibW9udGhcIikge1xyXG5cdFx0XHQvLyDlrZjlgqjmnIjku73lrZfnrKbkuLJcclxuXHRcdFx0Y29uc3QgbW9udGhzID0gW107XHJcblxyXG5cdFx0XHQvLyDpgJDkuIDpgY3ljobmr4/kuKrmnIhcclxuXHRcdFx0Zm9yIChcclxuXHRcdFx0XHRsZXQgY3VycmVudERhdGUgPSBtaW5EYXRlLmNsb25lKCk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuaXNTYW1lT3JCZWZvcmUobWF4RGF0ZSk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuYWRkKDEsIFwibW9udGhzXCIpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdG1vbnRocy5wdXNoKGN1cnJlbnREYXRlLmZvcm1hdChgWVlZWSR7ZGVsaW1pdGVyfU1NYCkpOyAvLyDmoLzlvI/ljJblubbmt7vliqDliLDmlbDnu4RcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8g6L6T5Ye65omA5pyJ5pyI5Lu9XHJcblx0XHRcdG1vbnRocy5mb3JFYWNoKChtb250aCwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRyZXN1bHRbbW9udGhdID0gW107XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0ZGF0ZXMuZm9yRWFjaCgoZGF0ZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB5ZWFyID0gZGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0Y29uc3QgbW9udGggPSAoZGF0ZS5tb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIik7IC8vIDAtMTFcclxuXHRcdFx0XHRyZXN1bHRbeWVhciArIGRlbGltaXRlciArIG1vbnRoXS5wdXNoKHRpbWVBcnJheVtpbmRleF0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICog6K6h566X5Yeg5L2V566X5pWw5bmz5pa55pu0XHJcblx0ICogQHBhcmFtIHZhbHVlcyDmlbDnu4QgWzAsIDAsIDAuMjU3NV1cclxuXHQgKiBAcmV0dXJuc1xyXG5cdCAqL1xyXG5cdGNhbGN1bGF0ZUdyb3d0aFJhdGUodmFsdWVzKSB7XHJcblx0XHRjb25zdCBwcm9kdWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyAqICgxICsgdmFsKSwgMSk7XHJcblx0XHRpZiAocHJvZHVjdCA+PSAwKSB7XHJcblx0XHRcdHJldHVybiBNYXRoLnBvdyhwcm9kdWN0LCAxIC8gdmFsdWVzLmxlbmd0aCkgLSAxO1xyXG5cdFx0fSBlbHNlIGlmIChwcm9kdWN0IDwgMCkge1xyXG5cdFx0XHRpZiAodmFsdWVzLmxlbmd0aCAlIDIgPT0gMCkge1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLm50aHJvb3QocHJvZHVjdCwgdmFsdWVzLmxlbmd0aCkgLSAxO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdG50aHJvb3QoeCwgbikge1xyXG5cdFx0bGV0IG5nID0gbiAlIDI7XHJcblx0XHRpZiAobmcgPT0gMSB8fCB4IDwgMCkgeCA9IC14O1xyXG5cdFx0dmFyIHIgPSBNYXRoLnBvdyh4LCAxIC8gbik7XHJcblx0XHRuID0gTWF0aC5wb3cociwgbik7XHJcblxyXG5cdFx0aWYgKE1hdGguYWJzKHggLSBuKSA8IDEgJiYgeCA+IDAgPT09IG4gPiAwKSByZXR1cm4gbmcgPyAtciA6IHI7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiDmoIflh4blgY/lt65cclxuXHQgKiBAcGFyYW0gdmFsdWVzIOaVsOe7hCBbMCwgMCwgLTAuNDc3NV1cclxuXHQgKiBAcmV0dXJucyAwLjI3NTY4NDc1MzUzODA0NjNcclxuXHQgKi9cclxuXHRjYWxjdWxhdGVTdGFuZGFyZERldmlhdGlvbih2YWx1ZXMpIHtcclxuXHRcdGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xyXG5cclxuXHRcdC8vIOajgOafpeaVsOaNrueCueaVsOmHj1xyXG5cdFx0aWYgKG4gPCAyKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIuiHs+WwkemcgOimgeS4pOS4quaVsOaNrueCueadpeiuoeeul+agt+acrOagh+WHhuWBj+W3rlwiKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDorqHnrpflnYflgLxcclxuXHRcdGNvbnN0IG1lYW4gPSB2YWx1ZXMucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLCAwKSAvIG47XHJcblxyXG5cdFx0Ly8g6K6h566X5pa55beuXHJcblx0XHRjb25zdCB2YXJpYW5jZSA9XHJcblx0XHRcdHZhbHVlcy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyBNYXRoLnBvdyh2YWwgLSBtZWFuLCAyKSwgMCkgL1xyXG5cdFx0XHQobiAtIDEpO1xyXG5cclxuXHRcdC8vIOi/lOWbnuagh+WHhuWBj+W3rlxyXG5cdFx0cmV0dXJuIE1hdGguc3FydCh2YXJpYW5jZSk7XHJcblx0fVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250cm9sLXNlY3Rpb25cIiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47IGhlaWdodDogMTAwJVwiPlxyXG5cdDxlanMtcGl2b3R2aWV3XHJcblx0XHR3aWR0aD1cIjEwMCVcIlxyXG5cdFx0aGVpZ2h0PVwiMTAwJVwiXHJcblx0XHRzdHlsZT1cImRpc3BsYXk6IGJsb2NrXCJcclxuXHRcdFtkYXRhU291cmNlU2V0dGluZ3NdPVwiZGF0YVNvdXJjZVNldHRpbmdzXCJcclxuXHRcdCNwaXZvdHZpZXdcclxuXHRcdChkYXRhQm91bmQpPVwiZGF0YUJvdW5kKCRldmVudClcIlxyXG5cdFx0ZW5hYmxlVmFsdWVTb3J0aW5nPVwidHJ1ZVwiXHJcblx0XHRhbGxvd0NvbmRpdGlvbmFsRm9ybWF0dGluZz1cInRydWVcIlxyXG5cdFx0YWxsb3dFeGNlbEV4cG9ydD1cInRydWVcIlxyXG5cdFx0YWxsb3dHcm91cGluZz1cInRydWVcIlxyXG5cdFx0W3pvb21TZXR0aW5nc109XCJ6b29tU2V0dGluZ3NcIlxyXG5cdFx0ZW5hYmxlVmlydHVhbGl6YXRpb249XCJ0cnVlXCJcclxuXHRcdChhZ2dyZWdhdGVDZWxsSW5mbyk9XCJhZ2dyZWdhdGVDZWxsSW5mbygkZXZlbnQpXCJcclxuXHRcdChjZWxsQ2xpY2spPVwiY2VsbENsaWNrKCRldmVudClcIlxyXG5cdFx0YWxsb3dEcmlsbFRocm91Z2g9XCJ0cnVlXCJcclxuXHRcdChhY3Rpb25GYWlsdXJlKT1cImFjdGlvbkZhaWx1cmUoJGV2ZW50KVwiXHJcblx0XHQoZmllbGRMaXN0UmVmcmVzaGVkKT1cImZpZWxkTGlzdFJlZnJlc2hlZCgkZXZlbnQpXCJcclxuXHRcdChkcmlsbFRocm91Z2gpPVwiZHJpbGxUaHJvdWdoKCRldmVudClcIlxyXG5cdFx0W2NoYXJ0U2V0dGluZ3NdPVwiY2hhcnRTZXR0aW5nc1wiXHJcblx0XHQoY2hhcnRTZXJpZXNDcmVhdGVkKT1cImNoYXJ0U2VyaWVzQ3JlYXRlZCgkZXZlbnQpXCJcclxuXHRcdFtkaXNwbGF5T3B0aW9uXT1cImRpc3BsYXlPcHRpb25cIlxyXG5cdFx0W3Nob3dUb29sdGlwXT1cImZhbHNlXCJcclxuXHRcdChlbmdpbmVQb3B1bGF0ZWQpPVwiYWZ0ZXJFbmdpbmVQb3B1bGF0ZSgkZXZlbnQpXCJcclxuXHRcdChiZWZvcmVFeHBvcnQpPVwiYmVmb3JlRXhwb3J0KCRldmVudClcIlxyXG5cdD5cclxuXHQ8L2Vqcy1waXZvdHZpZXc+XHJcblxyXG5cdDxkaXYgY2xhc3M9XCJwaXZvdGZpZWxkbGlzdC1jb250cm9sXCI+XHJcblx0XHQ8ZWpzLXBpdm90ZmllbGRsaXN0XHJcblx0XHRcdFtpZF09XCJwb3J0bGV0Lm5ld0lkXCJcclxuXHRcdFx0I3Bpdm90ZmllbGRsaXN0XHJcblx0XHRcdGhpZGRlbj1cInRydWVcIlxyXG5cdFx0XHRlbmFibGVWYWx1ZVNvcnRpbmc9XCJ0cnVlXCJcclxuXHRcdFx0c2hvd0ZpZWxkTGlzdD1cInRydWVcIlxyXG5cdFx0XHRhbGxvd0NhbGN1bGF0ZWRGaWVsZD1cInRydWVcIlxyXG5cdFx0XHRhbGxvd0RlZmVyTGF5b3V0VXBkYXRlPVwidHJ1ZVwiXHJcblx0XHRcdHJlbmRlck1vZGU9XCJQb3B1cFwiXHJcblx0XHRcdChlbmdpbmVQb3B1bGF0ZWQpPVwiYWZ0ZXJQb3B1bGF0ZSgkZXZlbnQpXCJcclxuXHRcdFx0KG1lbWJlckVkaXRvck9wZW4pPVwib25NZW1iZXJFZGl0b3JPcGVuKCRldmVudClcIlxyXG5cdFx0XHQoZW5naW5lUG9wdWxhdGluZyk9XCJlbmdpbmVQb3B1bGF0aW5nKCRldmVudClcIlxyXG5cdFx0XHQoYWdncmVnYXRlQ2VsbEluZm8pPVwiYWdncmVnYXRlQ2VsbEluZm8oJGV2ZW50KVwiXHJcblx0XHRcdChmaWVsZERyb3ApPVwib25GaWVsZERyb3AoJGV2ZW50KVwiXHJcblx0XHRcdChhY3Rpb25Db21wbGV0ZSk9XCJhY3Rpb25Db21wbGV0ZSgkZXZlbnQpXCJcclxuXHRcdFx0KGFjdGlvbkJlZ2luKT1cImFjdGlvbkJlZ2luKCRldmVudClcIlxyXG5cdFx0XHQoY2FsY3VsYXRlZEZpZWxkQ3JlYXRlKT1cImNhbGN1bGF0ZWRGaWVsZENyZWF0ZSgkZXZlbnQpXCJcclxuXHRcdFx0KGxvYWQpPVwib25Mb2FkKClcIlxyXG5cdFx0XHQoY3JlYXRlZCk9XCJjcmVhdGVkKCRldmVudClcIlxyXG5cdFx0PlxyXG5cdFx0PC9lanMtcGl2b3RmaWVsZGxpc3Q+XHJcblx0PC9kaXY+XHJcblx0PGRpdiBjbGFzcz1cImZ1bGwtYm94LW1hc2tcIiAqbmdJZj1cInBhZ2VMb2FkaW5nXCI+XHJcblx0XHQ8bWF0LXNwaW5uZXJcclxuXHRcdFx0c3R5bGU9XCJ6LWluZGV4OiA5OTlcIlxyXG5cdFx0XHRtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXHJcblx0XHRcdFtkaWFtZXRlcl09XCIyNFwiXHJcblx0XHQ+PC9tYXQtc3Bpbm5lcj5cclxuXHQ8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==