ezlibrary_v2 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +24 -0
  2. package/esm2020/ezlibrary_v2.mjs +5 -0
  3. package/esm2020/lib/admin-service/admin-service.service.mjs +34 -0
  4. package/esm2020/lib/analysis-search/analysis-search.component.mjs +1077 -0
  5. package/esm2020/lib/assort-service/assort-service.service.mjs +28 -0
  6. package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +225 -0
  7. package/esm2020/lib/auth/auth.guard.mjs +37 -0
  8. package/esm2020/lib/bi-service/bi.service.mjs +57 -0
  9. package/esm2020/lib/call-info/callinfo.component.mjs +125 -0
  10. package/esm2020/lib/comman-service/comman-service.service.mjs +678 -0
  11. package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
  12. package/esm2020/lib/contact-search/contact-search.component.mjs +690 -0
  13. package/esm2020/lib/contact-service/contact-service.service.mjs +45 -0
  14. package/esm2020/lib/ez-lib.component.mjs +26 -0
  15. package/esm2020/lib/ez-lib.module.mjs +232 -0
  16. package/esm2020/lib/ez-lib.service.mjs +14 -0
  17. package/esm2020/lib/ezheader/header.component.mjs +400 -0
  18. package/esm2020/lib/file-upload/fileupload.component.mjs +918 -0
  19. package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +169 -0
  20. package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
  21. package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
  22. package/esm2020/lib/fileupload-module/fileupload.module.mjs +80 -0
  23. package/esm2020/lib/footer/footer.component.mjs +18 -0
  24. package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
  25. package/esm2020/lib/globle/globle-env.service.mjs +45 -0
  26. package/esm2020/lib/globle/memo-report.service.mjs +2798 -0
  27. package/esm2020/lib/globle/shared-services.service.mjs +25 -0
  28. package/esm2020/lib/globle/upload-service.service.mjs +63 -0
  29. package/esm2020/lib/header/header.component.mjs +172 -0
  30. package/esm2020/lib/invalid/invalid.component.mjs +70 -0
  31. package/esm2020/lib/logout/logout.component.mjs +104 -0
  32. package/esm2020/lib/menu-right/menu-right.component.mjs +258 -0
  33. package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
  34. package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
  35. package/esm2020/lib/pipes/selectedCount.mjs +19 -0
  36. package/esm2020/lib/pipes/sum.pipe.mjs +17 -0
  37. package/esm2020/lib/pkt-data/pkt-data.component.mjs +1109 -0
  38. package/esm2020/lib/pricing-service/pricing.service.mjs +64 -0
  39. package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1028 -0
  40. package/esm2020/lib/report-format/report-format.component.mjs +403 -0
  41. package/esm2020/lib/sessionend/session-end.guard.mjs +27 -0
  42. package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
  43. package/esm2020/lib/stock-service/stock-service.service.mjs +58 -0
  44. package/esm2020/lib/system-module/subform/subform.component.mjs +2817 -0
  45. package/esm2020/lib/system-module/system/system.component.mjs +970 -0
  46. package/esm2020/lib/system-module/system-service/system-service.service.mjs +83 -0
  47. package/esm2020/lib/system-module/system-service/upload-file.service.mjs +83 -0
  48. package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +24 -0
  49. package/esm2020/lib/utility/constants.mjs +5 -0
  50. package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
  51. package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
  52. package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
  53. package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
  54. package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
  55. package/esm2020/lib/utility/tranform.directive.mjs +27 -0
  56. package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
  57. package/esm2020/public-api.mjs +59 -0
  58. package/ezlibrary_v2.d.ts +5 -0
  59. package/fesm2015/ezlibrary_v2.mjs +15300 -0
  60. package/fesm2015/ezlibrary_v2.mjs.map +1 -0
  61. package/fesm2020/ezlibrary_v2.mjs +15291 -0
  62. package/fesm2020/ezlibrary_v2.mjs.map +1 -0
  63. package/lib/admin-service/admin-service.service.d.ts +13 -0
  64. package/lib/analysis-search/analysis-search.component.d.ts +118 -0
  65. package/lib/assort-service/assort-service.service.d.ts +12 -0
  66. package/lib/attribute-definition/attribute-definition.component.d.ts +43 -0
  67. package/lib/auth/auth.guard.d.ts +14 -0
  68. package/lib/bi-service/bi.service.d.ts +16 -0
  69. package/lib/call-info/callinfo.component.d.ts +26 -0
  70. package/lib/comman-service/comman-service.service.d.ts +106 -0
  71. package/lib/comman-service/share-data-service.service.d.ts +10 -0
  72. package/lib/contact-search/contact-search.component.d.ts +111 -0
  73. package/lib/contact-service/contact-service.service.d.ts +15 -0
  74. package/lib/ez-lib.component.d.ts +8 -0
  75. package/lib/ez-lib.module.d.ts +43 -0
  76. package/lib/ez-lib.service.d.ts +6 -0
  77. package/lib/ezheader/header.component.d.ts +57 -0
  78. package/lib/file-upload/fileupload.component.d.ts +127 -0
  79. package/lib/file-upload-log/file-upload-log.component.d.ts +49 -0
  80. package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
  81. package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
  82. package/lib/fileupload-module/fileupload.module.d.ts +15 -0
  83. package/lib/footer/footer.component.d.ts +9 -0
  84. package/lib/globle/common-pdf.service.d.ts +9 -0
  85. package/lib/globle/globle-env.service.d.ts +16 -0
  86. package/lib/globle/memo-report.service.d.ts +107 -0
  87. package/lib/globle/shared-services.service.d.ts +12 -0
  88. package/lib/globle/upload-service.service.d.ts +16 -0
  89. package/lib/header/header.component.d.ts +41 -0
  90. package/lib/invalid/invalid.component.d.ts +12 -0
  91. package/lib/logout/logout.component.d.ts +19 -0
  92. package/lib/menu-right/menu-right.component.d.ts +43 -0
  93. package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
  94. package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
  95. package/lib/pipes/selectedCount.d.ts +7 -0
  96. package/lib/pipes/sum.pipe.d.ts +7 -0
  97. package/lib/pkt-data/pkt-data.component.d.ts +184 -0
  98. package/lib/pricing-service/pricing.service.d.ts +16 -0
  99. package/lib/qa-analysis/qa-analysis.component.d.ts +95 -0
  100. package/lib/report-format/report-format.component.d.ts +74 -0
  101. package/lib/sessionend/session-end.guard.d.ts +10 -0
  102. package/lib/stock-service/lazyload.service.d.ts +7 -0
  103. package/lib/stock-service/stock-service.service.d.ts +15 -0
  104. package/lib/system-module/subform/subform.component.d.ts +222 -0
  105. package/lib/system-module/system/system.component.d.ts +109 -0
  106. package/lib/system-module/system-service/system-service.service.d.ts +23 -0
  107. package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
  108. package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
  109. package/lib/utility/constants.d.ts +4 -0
  110. package/lib/utility/contact-table-search.pipe.d.ts +7 -0
  111. package/lib/utility/formate-num-field.pipe.d.ts +7 -0
  112. package/lib/utility/search-pipe.pipe.d.ts +7 -0
  113. package/lib/utility/selective-preloading-strategy.d.ts +9 -0
  114. package/lib/utility/table-search.pipe.d.ts +7 -0
  115. package/lib/utility/tranform.directive.d.ts +10 -0
  116. package/lib/websearch-history/websearch-history.component.d.ts +56 -0
  117. package/package.json +31 -0
  118. package/public-api.d.ts +54 -0
@@ -0,0 +1,1109 @@
1
+ import { Component, ViewChild } from '@angular/core';
2
+ import { Cookie } from 'ng2-cookies/ng2-cookies';
3
+ import * as _ from 'lodash';
4
+ import { BaseChartDirective } from 'ng2-charts';
5
+ import { HttpHeaders } from '@angular/common/http';
6
+ import * as Rx from 'rxjs-compat';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../comman-service/comman-service.service";
9
+ import * as i2 from "./../bi-service/bi.service";
10
+ import * as i3 from "@angular/router";
11
+ import * as i4 from "@ng-select/ng-select";
12
+ import * as i5 from "@angular/common";
13
+ import * as i6 from "@angular/forms";
14
+ import * as i7 from "../utility/app-no-dbl-click.directive";
15
+ import * as i8 from "../utility/table-search.pipe";
16
+ // import * as Rx from 'rxjs-compat';
17
+ // import { from } from 'rxjs';
18
+ // import { groupBy, mergeMap, reduce, toArray } from 'rxjs/operators';
19
+ export class PktDataComponent {
20
+ constructor(cs, bis,
21
+ // private _spinnerService: Ng4LoadingSpinnerService,
22
+ // private _flashMessagesService: FlashMessagesService,
23
+ router, route) {
24
+ this.cs = cs;
25
+ this.bis = bis;
26
+ this.router = router;
27
+ this.route = route;
28
+ this.pkts = [];
29
+ this.headerKey = [];
30
+ this.header = [];
31
+ this.totalWeight = 0;
32
+ this.scrollDistance = 1;
33
+ this.scrollUpDistance = 2;
34
+ this.startIndex = 0;
35
+ this.endIndex = 30;
36
+ this.groupstartIndex = 0;
37
+ this.groupendIndex = 30;
38
+ this.loadResult = [];
39
+ this.resultlength = 0;
40
+ this.totAvg = 0;
41
+ this.totDis = 0;
42
+ this.selectedItm = [];
43
+ this.selectwt = 0;
44
+ this.selectAvg = 0;
45
+ this.selectDis = 0;
46
+ this.selectAmt = 0;
47
+ this.sttWiseSummary = new Map();
48
+ // anaAllGrpStt = ['asrt', 'lab', 'mkt', 'sold'];
49
+ this.anaAllGrpStt = [];
50
+ this.legendList = [];
51
+ this.newwindow = "YES";
52
+ this.staticLov = [];
53
+ this.defaultGrpList = [];
54
+ this.stObj = {};
55
+ this.totAmt = 0;
56
+ this.nodata = true;
57
+ this.viewdisType = "group";
58
+ this.summaryList = [];
59
+ this.coPuattributeStr = [];
60
+ this.groupBypktList = [];
61
+ this.loadgroupBypktList = [];
62
+ this.sttwise = false;
63
+ this.grp = [];
64
+ this.GrpVals = [];
65
+ this.finalGrpVal = {};
66
+ this.finalSummaryDtl = {};
67
+ this.data = [];
68
+ this.summaryDtl = {};
69
+ this.headList = [];
70
+ this.GrpValsPie = [];
71
+ this.grpPie = [];
72
+ this.finalGrpValPie = {};
73
+ this.summaryDtlPie = {};
74
+ this.byrvalGrp = []; //{};
75
+ this.isBuyerwise = false;
76
+ this.isGrpwise = false;
77
+ this.grpWiseQty = [];
78
+ this.dataType = "";
79
+ this.dynamicColors = [];
80
+ this.byrValArr = [];
81
+ // public pieChartPlugins = [pluginDataLabels];
82
+ this.doughnutChartType = 'pie';
83
+ this.doughnutChartLabels = [];
84
+ this.doughnutChartData = [];
85
+ this.pieChartColors = [];
86
+ this.pieChartLegend = true;
87
+ this.chartColors = [
88
+ {
89
+ backgroundColor: this.generate(),
90
+ fillColor: this.generate(),
91
+ strokeColor: this.generate()
92
+ //["#000080", "#0020C2", "#1569C7", "#357EC7", "#368BC1","659EC7"]
93
+ }
94
+ ];
95
+ this.labels = {
96
+ labels: {
97
+ render: 'percentage',
98
+ //     fontColor: ['green', 'white', 'red'],
99
+ precision: 2
100
+ }
101
+ };
102
+ this.chartOptions = {
103
+ plugins: {
104
+ labels: {
105
+ render: 'percentage',
106
+ }
107
+ },
108
+ legend: {
109
+ position: 'right',
110
+ labels: {
111
+ fontColor: 'black',
112
+ boxWidth: 10,
113
+ padding: 10,
114
+ fontSize: 10,
115
+ render: 'percentage',
116
+ }
117
+ },
118
+ };
119
+ this.pieChartOptions = {
120
+ //legend: {position: 'left',fontColor:'white'},
121
+ //plugins: {labels: { render: 'percentage',position: 'border', textMargin: 4}}
122
+ legend: {
123
+ position: 'right',
124
+ labels: {
125
+ fontColor: 'black',
126
+ boxWidth: 10,
127
+ padding: 10,
128
+ fontSize: 10,
129
+ render: 'percentage'
130
+ }
131
+ },
132
+ plugins: {
133
+ datalabels: {
134
+ formatter: (value, ctx) => {
135
+ const label = ctx.chart.data.labels[ctx.dataIndex];
136
+ return label;
137
+ },
138
+ },
139
+ }
140
+ };
141
+ this.pie = {
142
+ legend: { position: 'left', fontColor: 'white' },
143
+ plugins: {
144
+ labels: {
145
+ // render 'label', 'value', 'percentage', 'image' or custom function, default is 'percentage'
146
+ render: 'percentage',
147
+ precision: 0,
148
+ arc: true,
149
+ showActualPercentages: true,
150
+ position: 'outside'
151
+ }
152
+ },
153
+ tooltips: {
154
+ mode: 'label',
155
+ callbacks: {
156
+ label: function (tooltipItem, data) {
157
+ // let label = data.datasets[tooltipItem.datasetIndex].label;
158
+ // let value = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
159
+ return [data.labels[tooltipItem.index]
160
+ ];
161
+ }
162
+ }
163
+ }
164
+ };
165
+ this.TotAvgObj = {};
166
+ this.anaSttLbl = [];
167
+ }
168
+ lpad(lStr, ln) {
169
+ let str = lStr;
170
+ while (str.length < ln) {
171
+ str = '0' + str;
172
+ }
173
+ return str;
174
+ }
175
+ getSearchResult() {
176
+ this.cObj = {};
177
+ this.groupBypktList = [];
178
+ // this._spinnerService.show();
179
+ this.pkts = [];
180
+ this.grp = [];
181
+ this.headerKey = [];
182
+ this.legendList = [];
183
+ this.viewdisType = "group";
184
+ let reqObj = {};
185
+ this.formname = this.route.snapshot.params['frmnme'];
186
+ reqObj['searchIdnList'] = localStorage.getItem('srcIdns').split(',');
187
+ reqObj['formNme'] = this.route.snapshot.params['frmnme'];
188
+ console.log(JSON.stringify(reqObj));
189
+ this.startIndex = 0;
190
+ this.endIndex = 30;
191
+ this.loadResult = [];
192
+ this.bis.data(reqObj, 'search', 'marketing/search')
193
+ .subscribe(data => {
194
+ if (data.status == 'SUCCESS') {
195
+ let res = data.result;
196
+ console.log("res", res);
197
+ this.pageDefination = res.pageDefination || {};
198
+ this.links = this.pageDefination.link || [];
199
+ this.pkts = res.searchResultDtl || [];
200
+ this.anaAllGrpStt = Array.from(new Set(this.pkts.map(element => element.dsp_stt)));
201
+ this.resultlength = this.pkts.length;
202
+ this.coPuattributeStr = res.copuStructureDtl || [];
203
+ this.headerKey = res.resultView;
204
+ this.header = res.resultViewDtl;
205
+ this.legendList = res.legendList;
206
+ this.totalWeight = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
207
+ let rapVal = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.rap_vlu), 0));
208
+ let totAmt = 0;
209
+ this.pkts.forEach(element => {
210
+ if (element.grp_stt == 'sold') {
211
+ totAmt += parseFloat(element['sal_rte']) * parseFloat(element['crtwt']);
212
+ }
213
+ else {
214
+ totAmt += parseFloat(element['rte']) * parseFloat(element['crtwt']);
215
+ }
216
+ });
217
+ this.totAmt = this.cs.splitToTwoDecimal(totAmt);
218
+ this.totAvg = this.cs.splitToTwoDecimal(this.totAmt / this.totalWeight);
219
+ this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(rapVal)) - 100);
220
+ if (this.endIndex > this.resultlength)
221
+ this.endIndex = this.resultlength;
222
+ this.addItems();
223
+ debugger;
224
+ // this.totAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
225
+ // this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(totrapVal)) - 100);
226
+ this.getSummary(this.pkts);
227
+ // this.createGrp(this.pkts, this.defaultGrpList);
228
+ // localStorage.setItem('BI-PKT_GROUP_BY',JSON.stringify(res.pageDefination.form_field[0].lov_qry))
229
+ // let GRPby = JSON.parse(localStorage.getItem('BI-PKT_GROUP_BY'));
230
+ this.getStaticKV(res.pageDefination.form_field[0].lov_qry);
231
+ let avgFields = res.pageDefination.tabs[0].lov_qry.split(',');
232
+ this.getTotals(avgFields, this.pkts);
233
+ let ttlFields = res.pageDefination.others[0].lov_qry.split(',');
234
+ this.getTotalsTtl(ttlFields, this.pkts);
235
+ // this._spinnerService.hide();
236
+ }
237
+ else {
238
+ // this._spinnerService.hide();
239
+ // this._flashMessagesService.show(data.message, { cssClass: 'alert-danger', timeout: 3000 });
240
+ }
241
+ }, error => {
242
+ // this._spinnerService.hide();
243
+ // this._flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
244
+ });
245
+ }
246
+ selectRow(pktId) {
247
+ var checkboxId = "cb_" + pktId;
248
+ document.getElementById(checkboxId).click();
249
+ }
250
+ checkedRow(obj, stockidn, status) {
251
+ let cbId = 'cb_' + obj.stock_idn;
252
+ if (status == false) {
253
+ var element = document.getElementById(cbId); //pktId
254
+ element.parentElement.parentElement.classList.remove("selectedRow");
255
+ element.parentElement.parentElement.classList.add("notselectedRow");
256
+ this.selectedItm.forEach((e, index) => {
257
+ if (e.stock_idn == stockidn) {
258
+ this.selectedItm.splice(index, 1);
259
+ }
260
+ });
261
+ }
262
+ else {
263
+ var element = document.getElementById(cbId); //pktId
264
+ element.parentElement.parentElement.classList.remove("notselectedRow");
265
+ element.parentElement.parentElement.classList.add("selectedRow");
266
+ this.selectedItm.push(obj);
267
+ }
268
+ this.selectwt = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
269
+ // let totAmt = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +b.sal_amount, 0));
270
+ let totweight = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
271
+ let totrapVal = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +b.rap_vlu, 0));
272
+ let totAmt = 0;
273
+ this.selectedItm.forEach(element => {
274
+ if (element.grp_stt == 'sold') {
275
+ totAmt += parseFloat(element['sal_rte'] || 0) * parseFloat(element['crtwt']);
276
+ }
277
+ else {
278
+ totAmt += parseFloat(element['rte'] || 0) * parseFloat(element['crtwt']);
279
+ }
280
+ });
281
+ this.selectAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
282
+ this.selectDis = this.cs.splitToTwoDecimal((totAmt / parseFloat(totrapVal) * 100) - 100);
283
+ this.selectAmt = this.cs.splitToTwoDecimal(totAmt);
284
+ }
285
+ statusWiseDisplay(e, m) {
286
+ debugger;
287
+ this.sttwise = true;
288
+ let gArr = [];
289
+ for (let key in m) {
290
+ if (m[key] == true) {
291
+ debugger;
292
+ let pk = this.pkts.filter(e => e.grp_stt == key);
293
+ gArr = gArr.concat(pk);
294
+ }
295
+ else {
296
+ let pk = gArr.filter(e => e.grp_stt != key);
297
+ }
298
+ }
299
+ debugger;
300
+ this.finalGrpVal[""] = gArr;
301
+ this.loadResult = gArr;
302
+ if (this.finalGrpVal[""].length > 0) {
303
+ this.totalWeight = this.cs.splitToTwoDecimal(this.finalGrpVal[""].reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
304
+ let totweight = this.cs.splitToTwoDecimal(this.finalGrpVal[""].reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
305
+ let totrapVal = this.cs.splitToTwoDecimal(this.finalGrpVal[""].reduce((a, b) => +a + +b.rap_vlu, 0));
306
+ let totAmt = 0;
307
+ this.finalGrpVal[""].forEach(element => {
308
+ if (element.grp_stt == 'sold') {
309
+ totAmt += parseFloat(element['sal_rte']) * parseFloat(element['crtwt']);
310
+ }
311
+ else {
312
+ totAmt += parseFloat(element['rte']) * parseFloat(element['crtwt']);
313
+ }
314
+ });
315
+ this.totAmt = this.cs.splitToTwoDecimal(totAmt);
316
+ this.totAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
317
+ this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(totrapVal)) - 100);
318
+ }
319
+ // let grpBy = e.target.value;
320
+ // if (e.target.checked) {
321
+ // let pk = this.pkts.filter(e => e.grp_stt == grpBy);
322
+ // this.finalGrpVal[""] = pk;
323
+ // }
324
+ // else {
325
+ // let pk = this.pkts.filter(e => e.grp_stt !== grpBy);
326
+ // this.finalGrpVal[""] = pk;
327
+ // }
328
+ console.log(this.finalGrpVal);
329
+ }
330
+ OnLinkClick(lnk, pktdtl) {
331
+ if (lnk.form_field == 'priceupdate') {
332
+ this.cObj = pktdtl;
333
+ document.getElementById("bidMdBBtn").click();
334
+ }
335
+ }
336
+ calculatRteDis(objdtl, typ) {
337
+ debugger;
338
+ if (typ == 'rte') {
339
+ let dis = this.cs.splitToTwoDecimal(((parseFloat(objdtl.new_rte) * 100) / parseFloat(objdtl.rap_rte)) - 100);
340
+ objdtl["new_rap_dis"] = dis;
341
+ }
342
+ if (typ == 'dis') {
343
+ let rte = this.cs.splitToTwoDecimal((parseFloat(objdtl.rap_rte) * (100 + parseFloat(objdtl.new_rap_dis)) / 100));
344
+ objdtl["new_rte"] = rte;
345
+ }
346
+ }
347
+ ChangesPrice() {
348
+ let nmeIdn = JSON.parse(localStorage.getItem('nmeIdn'));
349
+ let pktDataList = [];
350
+ let updateObj = {};
351
+ updateObj["id"] = this.cObj.pkt_code;
352
+ updateObj["issue"] = { "rte": "" };
353
+ updateObj["rtn"] = { "rte": this.cObj.new_rte };
354
+ updateObj["emp"] = {};
355
+ pktDataList.push(updateObj);
356
+ let reqObj = {};
357
+ reqObj['formNme'] = this.route.snapshot.params['frmnme']; //'bulkUpdateForm';
358
+ reqObj['attr'] = "rte";
359
+ reqObj['reissue'] = 'Y';
360
+ reqObj['empIdn'] = nmeIdn;
361
+ reqObj['grp'] = "bulkupdate";
362
+ reqObj['processName'] = "bulkMemPriceUpdate"; //'bulkPrepertiesUpdate';
363
+ reqObj['pktDataList'] = pktDataList;
364
+ console.log(JSON.stringify(reqObj));
365
+ this.reqheader['method'] = 'returnIssue';
366
+ // let options = new RequestOptions({ headers: this.reqheader });
367
+ let options = new HttpHeaders({ headers: this.reqheader });
368
+ this.cs.load(reqObj, options, 'preMarketing/issueReturn').then((response) => {
369
+ if (response.status == 'SUCCESS') {
370
+ this.cObj.rte = this.cObj.new_rte;
371
+ this.cObj.rap_dis = this.cObj.new_rap_dis;
372
+ this.getSummary(this.pkts);
373
+ // this._flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
374
+ // this._spinnerService.hide();
375
+ }
376
+ else {
377
+ // this._spinnerService.hide();
378
+ // this._flashMessagesService.show(response.message, { cssClass: 'alert-danger', timeout: 3000 });
379
+ }
380
+ }).catch((err) => {
381
+ // this._spinnerService.hide();
382
+ // this._flashMessagesService.show(err.message, { cssClass: 'alert-danger', timeout: 3000 });
383
+ });
384
+ }
385
+ addItems() {
386
+ for (let i = this.startIndex; i < this.endIndex; i++) {
387
+ this.loadResult[i] = this.pkts[i];
388
+ }
389
+ this.startIndex = this.endIndex;
390
+ this.endIndex = this.endIndex + 30;
391
+ if (this.endIndex > this.resultlength) {
392
+ this.endIndex = this.resultlength;
393
+ }
394
+ }
395
+ onScrollDown() {
396
+ if (this.endIndex <= this.resultlength)
397
+ this.addItems();
398
+ document.getElementById("wrap").addEventListener("scroll", function () {
399
+ var translate = "translate(0," + this.scrollTop + "px)";
400
+ this.querySelector("thead").style.transform = translate;
401
+ });
402
+ }
403
+ createGrp(datas, selected) {
404
+ // this._spinnerService.show();
405
+ this.data = [...datas];
406
+ // let grpvalues = "pu";
407
+ // let grpvaluesArr = grpvalues.split(',');
408
+ // let resutArr = [];
409
+ let grpvaluesArr = selected;
410
+ var final = [];
411
+ var output = _.groupBy(this.data, function (entry) {
412
+ var strs = '';
413
+ for (let i = 0; i < grpvaluesArr.length; i++) {
414
+ strs += entry[grpvaluesArr[i]] + '#';
415
+ }
416
+ return strs;
417
+ // return entry[grpvaluesArr[0]] + '#' + entry[grpvaluesArr[1]];// + '#' + entry.pu;
418
+ });
419
+ // console.log(output);
420
+ final.push(output);
421
+ console.log(final);
422
+ var Keys = Object.keys(final[0]);
423
+ console.log(Keys);
424
+ var Vals = Object.values(final[0]);
425
+ console.log(Vals);
426
+ let grpNamearr = [];
427
+ Keys.map(ele => {
428
+ grpNamearr.push(ele.split('#').filter(e => e != undefined).join(' / '));
429
+ });
430
+ this.grp = grpNamearr;
431
+ this.GrpVals = Vals;
432
+ for (let i = 0; i < grpNamearr.length; i++) {
433
+ var grpNme = grpNamearr[i];
434
+ this.finalGrpVal[grpNme] = Vals[i];
435
+ console.log(this.finalGrpVal[grpNme]);
436
+ }
437
+ this.getTotal();
438
+ this.grp.sort();
439
+ // this._spinnerService.hide();
440
+ }
441
+ onGrpSelect(selected) {
442
+ if (this.viewdisType == 'group')
443
+ this.groupPktsList(this.pkts, selected);
444
+ else
445
+ this.summaryDetails(selected);
446
+ }
447
+ groupPktsList(pkts, selected) {
448
+ if (selected.length == 1) {
449
+ let attr = selected[0];
450
+ // this.finalGrpVal = _.groupBy(pkts, attr);
451
+ //this.grp = Object.keys(this.finalGrpVal);
452
+ Rx.Observable.from(pkts)
453
+ .groupBy(x => x[attr])
454
+ .flatMap(group => group.toArray())
455
+ .map(g => {
456
+ return {
457
+ value: g[0][attr],
458
+ pktList: g,
459
+ count: _.sumBy(g, 'qty_on_handint'),
460
+ rapvlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'rap_vlu')),
461
+ crtwt: this.cs.splitToTwoDecimal(_.sumBy(g, 'crtwtint')),
462
+ vlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'amountint')),
463
+ salvlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'sal_amountint')),
464
+ avg: this.cs.splitToTwoDecimal(_.sumBy(g, 'amountint') / _.sumBy(g, 'crtwtint')),
465
+ salavg: this.cs.splitToTwoDecimal(_.sumBy(g, 'sal_amountint') / _.sumBy(g, 'crtwtint')),
466
+ dis: this.cs.splitToTwoDecimal(((_.sumBy(g, 'amountint') * 100) / (_.sumBy(g, 'rap_vlu'))) - 100),
467
+ saldis: this.cs.splitToTwoDecimal(((_.sumBy(g, 'sal_amountint') * 100) / (_.sumBy(g, 'rap_vlu'))) - 100)
468
+ };
469
+ })
470
+ .toArray()
471
+ .subscribe(d => {
472
+ this.groupBypktList = d;
473
+ this.groupstartIndex = 0;
474
+ this.groupendIndex = this.groupBypktList.length;
475
+ this.groupaddItems();
476
+ });
477
+ }
478
+ else {
479
+ this.startIndex = 0;
480
+ this.endIndex = 30;
481
+ this.loadResult = [];
482
+ this.groupBypktList = [];
483
+ if (this.endIndex > this.resultlength)
484
+ this.endIndex = this.resultlength;
485
+ this.addItems();
486
+ }
487
+ }
488
+ groupaddItems() {
489
+ let pktcnt = 0;
490
+ for (let i = this.groupstartIndex; i < this.groupendIndex; i++) {
491
+ debugger;
492
+ this.loadgroupBypktList[i] = this.groupBypktList[i];
493
+ let pktlist = this.groupBypktList[i]['pktList'] || [];
494
+ pktcnt = pktcnt + pktlist.length;
495
+ if (pktcnt > 30) {
496
+ this.groupstartIndex = i + 1;
497
+ break;
498
+ }
499
+ }
500
+ }
501
+ grouponScrollDown() {
502
+ if (this.groupstartIndex < this.groupendIndex)
503
+ this.groupaddItems();
504
+ document.getElementById("wrap").addEventListener("scroll", function () {
505
+ var translate = "translate(0," + this.scrollTop + "px)";
506
+ this.querySelector("thead").style.transform = translate;
507
+ });
508
+ }
509
+ summaryDetails(selected) {
510
+ if (selected.length == 1) {
511
+ this.headList = [];
512
+ let summaryData = [];
513
+ let attribue = selected[0];
514
+ // const pktsData = from(this.pkts).
515
+ Rx.Observable.from(this.pkts)
516
+ .groupBy(x => x[attribue] + "#" + x['dsp_stt'])
517
+ .flatMap(group => group.toArray())
518
+ .map(g => {
519
+ return {
520
+ key: g[0][attribue] + "#" + g[0]['dsp_stt'],
521
+ value: g[0][attribue],
522
+ sort: g[0][attribue + "_srt"] || 10000,
523
+ dspstt: g[0]['dsp_stt'],
524
+ count: _.sumBy(g, 'qty_on_handint'),
525
+ rapvlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'rap_vlu')),
526
+ crtwt: this.cs.splitToTwoDecimal(_.sumBy(g, 'crtwtint')),
527
+ vlurte: this.cs.splitToTwoDecimal(_.sumBy(g, 'amountint')),
528
+ vlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'sal_amountint')),
529
+ };
530
+ })
531
+ .toArray()
532
+ .subscribe(d => {
533
+ summaryData = d;
534
+ });
535
+ let summaryMap = {};
536
+ let sideList = [];
537
+ let headList = [];
538
+ summaryData.forEach(element => {
539
+ summaryMap[element.key] = element;
540
+ let value = element.value || '';
541
+ let dspstt = element.dspstt;
542
+ if ((selected == 'sal_byr' || selected == 'sal_emp') && dspstt != 'sold')
543
+ value = '';
544
+ if (value != '') {
545
+ if (headList.indexOf(dspstt) == -1)
546
+ headList.push(dspstt);
547
+ if (sideList.indexOf(value) == -1)
548
+ sideList.push(value);
549
+ }
550
+ });
551
+ this.summaryList = [];
552
+ sideList.forEach(side => {
553
+ let summry = {};
554
+ headList.forEach(head => {
555
+ let summryData = summaryMap[side + "#" + head] || '';
556
+ if (summryData != '') {
557
+ let stt = summryData['dspstt'];
558
+ let vlu = parseFloat(summryData.vlurte || 0);
559
+ let rapvlu = parseFloat(summryData.rapvlu || 0);
560
+ let crtwt = parseFloat(summryData.crtwt || 0);
561
+ summry['value'] = side;
562
+ summry['valueSort'] = summryData.sort;
563
+ summry['count_' + stt] = summryData.count;
564
+ summry['crtwt_' + stt] = summryData.crtwt;
565
+ summry['vlu_' + stt] = summryData.vlurte;
566
+ summry['avg_' + stt] = this.cs.splitToTwoDecimal(vlu / crtwt);
567
+ summry['dis_' + stt] = this.cs.splitToTwoDecimal(((vlu * 100) / rapvlu) - 100);
568
+ if (stt == 'sold') {
569
+ vlu = parseFloat(summryData.vlu || 0);
570
+ summry['vlu_' + stt] = vlu;
571
+ summry['avg_' + stt] = this.cs.splitToTwoDecimal(vlu / crtwt);
572
+ summry['dis_' + stt] = this.cs.splitToTwoDecimal(((vlu * 100) / rapvlu) - 100);
573
+ }
574
+ }
575
+ });
576
+ this.summaryList.push(summry);
577
+ });
578
+ if (selected == 'sal_byr' || selected == 'sal_emp') {
579
+ this.summaryList.sort((val1, val2) => {
580
+ return (val2['vlu_sold']) - (val1['vlu_sold']);
581
+ });
582
+ }
583
+ else {
584
+ console.log("this.summaryList", this.summaryList);
585
+ this.summaryList.sort((val1, val2) => {
586
+ return (val1['valueSort']) - (val2['valueSort']);
587
+ });
588
+ console.log("this.summaryList", this.summaryList);
589
+ }
590
+ this.headList = headList;
591
+ }
592
+ else {
593
+ if (selected.length > 1) {
594
+ // this._flashMessagesService.show("Summary need only one attribute", { cssClass: 'alert-danger', timeout: 3000 });
595
+ }
596
+ }
597
+ }
598
+ exportToCSVSummary() {
599
+ let modifiedObjArr = [];
600
+ this.summaryList.forEach((data, index) => {
601
+ let obj = {};
602
+ obj["Sr. No"] = index + 1;
603
+ obj["Attribute"] = data.value || '';
604
+ this.headList.forEach(hdr => {
605
+ obj["Qty(" + hdr + ")"] = data["count_" + hdr] || '';
606
+ obj["Carat(" + hdr + ")"] = data["crtwt_" + hdr] || '';
607
+ obj["Avg(" + hdr + ")"] = data["avg_" + hdr] || '';
608
+ obj["Dis(" + hdr + ")"] = data["dis_" + hdr] || '';
609
+ obj["Value(" + hdr + ")"] = data["vlu_" + hdr] || '';
610
+ });
611
+ modifiedObjArr.push(obj);
612
+ });
613
+ this.cs.CSVConvertor(modifiedObjArr, "Summary_details", true);
614
+ }
615
+ getTotal() {
616
+ let indexVal = 0;
617
+ let qs = 0;
618
+ this.GrpVals.forEach(element => {
619
+ let totAmt = 0;
620
+ let totweight = this.cs.splitToTwoDecimal(element.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
621
+ let rapVal = _.sumBy(element, 'rap_vlu');
622
+ element.forEach(pkt => {
623
+ if (pkt.grp_stt == 'sold') {
624
+ totAmt += parseFloat(pkt['sal_rte'] || 0) * parseFloat(pkt['crtwt']);
625
+ }
626
+ else {
627
+ totAmt += parseFloat(pkt['rte'] || 0) * parseFloat(pkt['crtwt']);
628
+ }
629
+ });
630
+ totAmt = this.cs.splitToTwoDecimal(totAmt);
631
+ var key = this.grp[indexVal];
632
+ this.summaryDtl[key + "_CTS"] = this.cs.splitToTwoDecimal(totweight);
633
+ this.summaryDtl[key + "_AMT"] = this.cs.splitToTwoDecimal(totAmt);
634
+ this.summaryDtl[key + "_RTE"] = this.cs.splitToTwoDecimal(totAmt / totweight);
635
+ this.summaryDtl[key + "_DIS"] = this.cs.splitToTwoDecimal(((totAmt * 100) / rapVal) - 100);
636
+ indexVal++;
637
+ });
638
+ }
639
+ generatePie(Datatype, ChartType) {
640
+ if (ChartType == 'qty') {
641
+ document.getElementById('btnQty').classList.remove('btn-default');
642
+ document.getElementById('btnQty').classList.add('active');
643
+ document.getElementById('btnVal').classList.remove('active');
644
+ document.getElementById('btnVal').classList.add('btn-default');
645
+ }
646
+ else {
647
+ document.getElementById('btnVal').classList.remove('btn-default');
648
+ document.getElementById('btnVal').classList.add('active');
649
+ document.getElementById('btnQty').classList.remove('active');
650
+ document.getElementById('btnQty').classList.add('btn-default');
651
+ }
652
+ this.grpWiseQty = [];
653
+ this.byrvalGrp = [];
654
+ this.dataType = Datatype;
655
+ // this._spinnerService.show();
656
+ this.finalGrpValPie = {};
657
+ this.byrvalGrp = [];
658
+ this.data = [...this.pkts];
659
+ this.data = this.data.filter(x => x.grp_stt == 'sold');
660
+ let grpvalues;
661
+ let grpvaluesArr;
662
+ let resutArr = [];
663
+ // type = 'qty';
664
+ if (Datatype == 'buyer') {
665
+ this.type = "Buyer";
666
+ this.isBuyerwise = true;
667
+ this.isGrpwise = false;
668
+ grpvalues = "sal_byr";
669
+ grpvaluesArr = grpvalues.split(',');
670
+ resutArr = [];
671
+ }
672
+ else {
673
+ this.type = this.defaultGrpList;
674
+ this.isBuyerwise = false;
675
+ this.isGrpwise = true;
676
+ grpvaluesArr = this.defaultGrpList; //selected;
677
+ }
678
+ //let grpvaluesArr = selected;
679
+ var final = [];
680
+ var output = _.groupBy(this.data, function (entry) {
681
+ var strs = '';
682
+ for (let i = 0; i < grpvaluesArr.length; i++) {
683
+ strs += entry[grpvaluesArr[i]] + '#';
684
+ }
685
+ return strs;
686
+ // return entry[grpvaluesArr[0]] + '#' + entry[grpvaluesArr[1]];// + '#' + entry.pu;
687
+ });
688
+ // console.log(output);
689
+ final.push(output);
690
+ var Keys = Object.keys(final[0]);
691
+ var Vals = Object.values(final[0]);
692
+ let grpNamearr = [];
693
+ Keys.map(ele => {
694
+ grpNamearr.push(ele.split('#').filter(e => e != undefined).join(' / '));
695
+ });
696
+ this.grpPie = grpNamearr;
697
+ this.GrpValsPie = Vals;
698
+ for (let i = 0; i < grpNamearr.length; i++) {
699
+ var grpNme = grpNamearr[i];
700
+ this.finalGrpValPie[grpNme] = Vals[i];
701
+ let totAmt = this.cs.splitToTwoDecimal(this.finalGrpValPie[grpNme].reduce((a, b) => +a + +parseFloat(b.sal_amountint), 0));
702
+ let byrObj = {};
703
+ byrObj['k'] = grpNme;
704
+ byrObj['v'] = parseFloat(totAmt); //this.byrvalGrp[grpNme].length;
705
+ this.byrvalGrp.push(byrObj);
706
+ byrObj = {};
707
+ // this.byrvalGrp[grpNme] = totAmt;
708
+ let qtyObj = {};
709
+ qtyObj['k'] = grpNme;
710
+ qtyObj['v'] = this.finalGrpValPie[grpNme].length;
711
+ this.grpWiseQty.push(qtyObj);
712
+ qtyObj = {};
713
+ // this.grpWiseQty[grpNme] = this.finalGrpValPie[grpNme].length;
714
+ }
715
+ console.log(this.grpWiseQty);
716
+ if (ChartType == 'qty') {
717
+ this.drawPie(this.grpWiseQty, ChartType, Datatype);
718
+ }
719
+ else {
720
+ this.drawPie(this.byrvalGrp, ChartType, Datatype);
721
+ }
722
+ // this.getTotalPie();
723
+ // this.grpPie.sort();
724
+ }
725
+ generate() {
726
+ this.dynamicColors = [];
727
+ for (var i = 1; i < 7; i++) {
728
+ // this.LightenDarkenColor("7cb5ec", i * 10);
729
+ let col = 'c6e896';
730
+ let amt = (i * 20) * -1;
731
+ var usePound = false;
732
+ if (col[0] == "#") {
733
+ col = col.slice(1);
734
+ usePound = true;
735
+ }
736
+ var num = parseInt(col, 16);
737
+ var r = (num >> 16) + amt;
738
+ if (r > 255)
739
+ r = 255;
740
+ else if (r < 0)
741
+ r = 0;
742
+ var b = ((num >> 8) & 0x00FF) + amt;
743
+ if (b > 255)
744
+ b = 255;
745
+ else if (b < 0)
746
+ b = 0;
747
+ var g = (num & 0x0000FF) + amt;
748
+ if (g > 255)
749
+ g = 255;
750
+ else if (g < 0)
751
+ g = 0;
752
+ // return (usePound ? "#" : "") + (g | (b << 8) | (r << 16)).toString(16);
753
+ this.dynamicColors.push((usePound ? "#" : "#") + (g | (b << 8) | (r << 16)).toString(16));
754
+ }
755
+ console.log(this.dynamicColors);
756
+ return this.dynamicColors;
757
+ }
758
+ getTotalPie() {
759
+ let indexVal = 0;
760
+ let AmtArr = [];
761
+ this.GrpValsPie.forEach(element => {
762
+ let byrwiseVal = {};
763
+ let totAmt = 0;
764
+ let totweight = 0;
765
+ totweight = this.cs.splitToTwoDecimal(element.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
766
+ totAmt = this.cs.splitToTwoDecimal(element.reduce((a, b) => +a + +parseFloat(b.sal_amountint), 0));
767
+ AmtArr.push(totAmt);
768
+ var key = this.grp[indexVal];
769
+ // this.summaryDtl[key + "_QTY"] = this.cs.splitToTwoDecimal(qty);
770
+ this.summaryDtlPie[key + "_CTS"] = this.cs.splitToTwoDecimal(totweight);
771
+ this.summaryDtlPie[key + "_AMT"] = this.cs.splitToTwoDecimal(totAmt);
772
+ indexVal++;
773
+ if (indexVal == 1) {
774
+ byrwiseVal[this.grp[indexVal]] = totAmt;
775
+ this.byrValArr.push(byrwiseVal);
776
+ byrwiseVal = {};
777
+ }
778
+ // console.log(qs);
779
+ // console.log(amount);
780
+ });
781
+ console.log(this.byrValArr);
782
+ AmtArr = AmtArr.map(function (x) {
783
+ return parseFloat(x);
784
+ });
785
+ AmtArr.sort(function (a, b) { return a - b; });
786
+ console.log(AmtArr);
787
+ AmtArr.reverse();
788
+ // this.drawPie(AmtArr);
789
+ }
790
+ drawPie(salesData, type, ChartType) {
791
+ this.doughnutChartData = [];
792
+ this.doughnutChartLabels = [];
793
+ let AmtArr = salesData.sort((a, b) => (a.v > b.v) ? 1 : -1).reverse();
794
+ if (ChartType == "buyer") {
795
+ this.doughnutChartData = AmtArr.slice(0, 5).map(a => a.v);
796
+ this.doughnutChartLabels = AmtArr.slice(0, 5).map(a => a.k);
797
+ let sums = 0;
798
+ let otherSum = this.cs.splitToTwoDecimal(this.sttWiseSummary.get('sold').get('rate'));
799
+ if (type == 'qty')
800
+ otherSum = this.cs.splitToTwoDecimal(this.sttWiseSummary.get('sold').get('count'));
801
+ let tArr = [];
802
+ tArr = AmtArr.slice(0, 5).map(function (x) {
803
+ return parseFloat(x.v);
804
+ });
805
+ sums = _.sumBy(tArr);
806
+ let maxinArr = Math.max(Math.max(...this.doughnutChartData));
807
+ debugger;
808
+ let otherval = this.cs.splitToTwoDecimal(otherSum - sums) || 0;
809
+ if (maxinArr > otherval) {
810
+ this.doughnutChartData.push(otherval);
811
+ this.doughnutChartLabels.push('Other');
812
+ }
813
+ else {
814
+ this.doughnutChartData.unshift(otherval);
815
+ this.doughnutChartLabels.unshift('Other');
816
+ }
817
+ }
818
+ else {
819
+ this.doughnutChartData = AmtArr.map(a => a.v);
820
+ this.doughnutChartLabels = AmtArr.map(a => a.k);
821
+ console.log("this.doughnutChartData", this.doughnutChartData);
822
+ let sums = 0;
823
+ let otherSum = this.cs.splitToTwoDecimal(this.sttWiseSummary.get('sold').get('rate'));
824
+ sums = _.sumBy(Object.values(AmtArr), 'v');
825
+ }
826
+ // this.doughnutChartData.sort(function (a, b) { return a - b; });
827
+ // this.doughnutChartData = this.doughnutChartData.reverse();
828
+ for (let i = 0; i < this.doughnutChartLabels.length; i++) {
829
+ this.doughnutChartLabels[i] = this.doughnutChartLabels[i] + " " + this.doughnutChartData[i].toString();
830
+ }
831
+ // console.log(this.doughnutChartLabels);
832
+ this.refreshChart(ChartType);
833
+ this.doughnutChartType = 'pie';
834
+ // document.getElementById('PiechartModelBtn').click();
835
+ // this._spinnerService.hide();
836
+ }
837
+ refreshChart(ChartType) {
838
+ this.isBuyerwise = false;
839
+ this.isGrpwise = false;
840
+ setTimeout(() => {
841
+ if (ChartType == "buyer") {
842
+ this.isBuyerwise = true;
843
+ }
844
+ else {
845
+ this.isGrpwise = true;
846
+ }
847
+ }, 1);
848
+ }
849
+ sortBy(key, g) {
850
+ this.sorted = this.sorted == 'desc' ? 'asc' : 'desc';
851
+ console.log(this.sorted);
852
+ let srted = _.orderBy(this.finalGrpVal[g], key, [this.sorted]);
853
+ this.finalGrpVal[g] = srted;
854
+ this.sortOn = g;
855
+ this.clmn = key;
856
+ }
857
+ exportToCSV(FileName) {
858
+ let d = this.cs.cDate, month = '' + (d.getMonth() + 1), day = '' + d.getDate(), year = d.getFullYear();
859
+ let dt = [day, month, year].join('-');
860
+ let fileNme = FileName + '__' + dt;
861
+ this.headerKey = ["dsp_stt", ...this.headerKey];
862
+ let modifiedObjArr = this.cs.modifyDataByHeader(this.pkts, this.headerKey, this.header);
863
+ this.cs.CSVConvertor(modifiedObjArr, fileNme, true);
864
+ }
865
+ getSummary(p) {
866
+ let summary;
867
+ p.forEach(element => {
868
+ // let stt = '';
869
+ // if (element.grp_stt == 'sold') {
870
+ // stt = 'Sold';
871
+ // }
872
+ // else if (element.grp_stt == 'mkt') {
873
+ // stt = 'Marketing';
874
+ // }
875
+ // else if (element.grp_stt == 'lab') {
876
+ // stt = 'Lab';
877
+ // }
878
+ // else {
879
+ // stt = element.grp_stt;
880
+ // }
881
+ // summary = this.sttWiseSummary.get(element.grp_stt);
882
+ summary = this.sttWiseSummary.get(element.grp_stt); //stt
883
+ let count = 0;
884
+ let gridWt = 0;
885
+ let gridavg = 0;
886
+ let disc = 0;
887
+ let gridRate = 0;
888
+ let totAmt = 0;
889
+ let gridRap = 0;
890
+ // this.totAvg = this.cs.splitToTwoDecimal(parseFloat(totAmt) / parseFloat(totweight));
891
+ // this.totDis = this.cs.splitToTwoDecimal(((parseFloat(totAmt) * 100) / parseFloat(totrapVal)) - 100);
892
+ let wt = parseFloat(element.crtwt);
893
+ let rate = 0;
894
+ let rapval = parseFloat(element.rap_vlu);
895
+ if (element.grp_stt == 'sold') {
896
+ rate = parseFloat((element.sal_rte == undefined || element.sal_rte == "") ? element.rte : element.sal_rte) * parseFloat(element.crtwt);
897
+ }
898
+ else {
899
+ rate = parseFloat(element.rte) * parseFloat(element.crtwt);
900
+ }
901
+ if (summary != null) {
902
+ count = parseInt(summary.get('count'));
903
+ gridWt = parseFloat(summary.get('wt'));
904
+ gridRate = parseFloat(summary.get('rate'));
905
+ gridRap = parseFloat(summary.get('rap'));
906
+ }
907
+ else {
908
+ summary = new Map();
909
+ }
910
+ summary.set('count', count + 1);
911
+ summary.set('wt', gridWt + wt);
912
+ summary.set('rate', gridRate + rate);
913
+ summary.set('rap', gridRap + rapval);
914
+ // this.sttWiseSummary.set(element.grp_stt == 'sold' ? 'Sold' : element.grp_stt, summary);
915
+ this.sttWiseSummary.set(element.grp_stt, summary); //stt
916
+ });
917
+ console.log('@presum:', this.sttWiseSummary);
918
+ this.anaAllGrpStt.forEach(ele => {
919
+ console.log(ele);
920
+ let count = 0;
921
+ let gridWt = 0;
922
+ let gridavg = 0;
923
+ let disc = 0;
924
+ let gridRate = 0;
925
+ let totAmt = 0;
926
+ let rap = 0;
927
+ let gridRap = 0;
928
+ //if (ele == 'Marketing' || ele == 'Sold') {
929
+ // ele = (ele == 'Marketing' || ele == 'Sold') ? ele : ele.toLowerCase();
930
+ let summary = this.sttWiseSummary.get(ele) || new Map();
931
+ count = parseInt(summary.get('count')) || 0;
932
+ gridWt = parseFloat(summary.get('wt')) || 0.00;
933
+ gridRate = parseFloat(summary.get('rate')) || 0;
934
+ gridRap = parseFloat(summary.get('rap')) || 1;
935
+ disc = this.cs.splitToTwoDecimal(((gridRate * 100) / gridRap) - 100);
936
+ gridavg = this.cs.splitToTwoDecimal(gridRate / gridWt);
937
+ summary.set('disc', disc);
938
+ summary.set('avg', gridavg);
939
+ this.sttWiseSummary.set(ele, summary);
940
+ //}
941
+ });
942
+ console.log(this.sttWiseSummary);
943
+ }
944
+ getTotals(fields, pkts) {
945
+ debugger;
946
+ fields.forEach(element => {
947
+ debugger;
948
+ let tavg = 0;
949
+ let total = 0;
950
+ if (element.trim() == 'age') {
951
+ total = this.cs.splitToTwoDecimal(pkts.reduce((a, b) => +a + +b.age, 0));
952
+ }
953
+ else {
954
+ total = _.sumBy(pkts, item => Number(item[element.trim()]));
955
+ }
956
+ let zeroVals = pkts.filter(x => (x[element.trim()] === "0" || 0)).length;
957
+ if (element.trim() != 'age') {
958
+ tavg = total / _.sumBy(pkts, item => Number(item['crtwt']));
959
+ tavg = this.cs.numbertofixed(tavg, 2);
960
+ }
961
+ else {
962
+ tavg = total / pkts.length;
963
+ }
964
+ this.TotAvgObj[element.trim()] = tavg;
965
+ });
966
+ console.log(this.TotAvgObj);
967
+ }
968
+ getTotalsTtl(fields, pkts) {
969
+ debugger;
970
+ fields.forEach(element => {
971
+ debugger;
972
+ let total = 0;
973
+ total = _.sumBy(pkts, item => Number(item[element.trim()]));
974
+ this.TotAvgObj[element.trim()] = this.cs.numbertofixed(total, 2);
975
+ });
976
+ }
977
+ modifySearch() {
978
+ localStorage.setItem('BIcall', 'BImodify');
979
+ this.router.navigate([this.modulename + '/analysis-search/' + this.route.snapshot.params['frmnme']]);
980
+ }
981
+ ngOnInit() {
982
+ // this.LightenDarkenColor("7cb5ec", 10);
983
+ let mdlk = JSON.parse(localStorage.getItem('mdlKey'));
984
+ this.cObj = {};
985
+ this.cUrl = this.router.url;
986
+ this.reqheader = {
987
+ 'clientkey': Cookie.get('_ck'),
988
+ 'Content-Type': 'application/json',
989
+ 'modulekey': mdlk[this.cUrl.split('/')[1]],
990
+ 'loginid': Cookie.get('_logid'),
991
+ 'source': 'qs'
992
+ };
993
+ this.viewdisType = "group";
994
+ this.newwindow = "YES";
995
+ this.grp = [];
996
+ this.loadResult = [];
997
+ this.startIndex = 0;
998
+ this.endIndex = 30;
999
+ this.cUrl = this.router.url;
1000
+ this.modulename = this.cUrl.split('/')[1];
1001
+ this.ck = encodeURIComponent(Cookie.get('_ck'));
1002
+ this.route.params.subscribe(map => {
1003
+ this.loadDefination();
1004
+ let viewType = localStorage.getItem('viewType');
1005
+ let anaArr = JSON.parse(localStorage.getItem('BIanaStt'));
1006
+ let anasttLbl = JSON.parse(localStorage.getItem('BIanaSttLBL'));
1007
+ if (anaArr != null) {
1008
+ this.anaAllGrpStt = JSON.parse(localStorage.getItem('BIanaStt'));
1009
+ this.anaSttLbl = JSON.parse(localStorage.getItem('BIanaSttLBL'));
1010
+ this.anaAllGrpStt.forEach(element => {
1011
+ this.stObj[element] = true;
1012
+ });
1013
+ }
1014
+ if (viewType == 'listView') {
1015
+ this.getSearchResult();
1016
+ }
1017
+ else {
1018
+ let pkts = JSON.parse(localStorage.getItem('pktData'));
1019
+ this.headerKey = JSON.parse(localStorage.getItem('resultView'));
1020
+ this.header = JSON.parse(localStorage.getItem('resultViewDtl'));
1021
+ this.header = JSON.parse(localStorage.getItem('resultViewDtl'));
1022
+ let legends = JSON.parse(localStorage.getItem('BILegends'));
1023
+ if (legends != null && legends != undefined && legends != "") {
1024
+ this.legendList = legends;
1025
+ }
1026
+ this.pkts = [...pkts];
1027
+ this.totalWeight = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
1028
+ this.getSummary(this.pkts);
1029
+ // let totAmt = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +b.sal_rec_rte * parseFloat(b.crtwt), 0));
1030
+ let totweight = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
1031
+ let totrapVal = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +b.rap_vlu, 0));
1032
+ let totAmt = 0;
1033
+ this.pkts.forEach(element => {
1034
+ if (element.grp_stt == 'sold') {
1035
+ totAmt += parseFloat(element['sal_rte']) * parseFloat(element['crtwt']);
1036
+ }
1037
+ else {
1038
+ totAmt += parseFloat(element['rte']) * parseFloat(element['crtwt']);
1039
+ }
1040
+ });
1041
+ this.totAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
1042
+ this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(totrapVal)) - 100);
1043
+ this.resultlength = this.pkts.length;
1044
+ if (this.endIndex > this.resultlength)
1045
+ this.endIndex = this.resultlength;
1046
+ this.addItems();
1047
+ }
1048
+ });
1049
+ let GRPby = JSON.parse(localStorage.getItem('BI-PKT_GROUP_BY')) || '';
1050
+ this.getStaticKV(GRPby);
1051
+ // this.createGrp(this.pkts, this.defaultGrpList);
1052
+ let avgFields = JSON.parse(localStorage.getItem('BI-gridAvg')) || '';
1053
+ if (avgFields != '')
1054
+ this.getTotals(avgFields, this.pkts);
1055
+ }
1056
+ getStaticKV(qry) {
1057
+ this.staticLov = [];
1058
+ let arrkv = qry.split(',');
1059
+ let obj = {}, staticLov = [];
1060
+ for (let i = 0; i < arrkv.length; i += 2) {
1061
+ let key = arrkv[i], value = arrkv[i + 1];
1062
+ obj['k'] = key;
1063
+ obj['v'] = value;
1064
+ // if (i == 0) {
1065
+ // qry.default_value = value;//key
1066
+ // }
1067
+ this.staticLov.push(obj);
1068
+ obj = {};
1069
+ }
1070
+ this.staticLov = this.staticLov.map(option => ({
1071
+ value: option.v,
1072
+ label: option.k
1073
+ }));
1074
+ console.log(this.staticLov);
1075
+ }
1076
+ loadDefination() {
1077
+ // this._spinnerService.show();
1078
+ let reqObj = {};
1079
+ reqObj['formNme'] = this.route.snapshot.params['frmnme']; //'searchDtlDscrForm';
1080
+ this.reqheader['method'] = 'loadDefination';
1081
+ // let options = new RequestOptions({ headers: this.reqheader });
1082
+ let options = new HttpHeaders({ headers: this.reqheader });
1083
+ this.cs.load(reqObj, options, 'marketing/search').then((response) => {
1084
+ if (response.status == 'SUCCESS') {
1085
+ let result = response.result;
1086
+ this.pageDefination = result.pageDefination || {};
1087
+ this.links = this.pageDefination.link || [];
1088
+ // this._spinnerService.hide();
1089
+ }
1090
+ else {
1091
+ // this._spinnerService.hide();
1092
+ // this._flashMessagesService.show(response.message, { cssClass: 'alert-danger', timeout: 3000 });
1093
+ }
1094
+ }).catch((err) => {
1095
+ // this._spinnerService.hide();
1096
+ // this._flashMessagesService.show(err.message, { cssClass: 'alert-danger', timeout: 3000 });
1097
+ });
1098
+ }
1099
+ }
1100
+ PktDataComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: PktDataComponent, deps: [{ token: i1.CommanServiceService }, { token: i2.BiService }, { token: i3.Router }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
1101
+ PktDataComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: PktDataComponent, selector: "app-pkt-data", viewQueries: [{ propertyName: "chart", first: true, predicate: BaseChartDirective, descendants: true }], ngImport: i0, template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">\r\n <span class=\"fa fa-chevron-left cp\" (click)=\"cs.pageBck();\"> Back</span>&nbsp;&nbsp;&nbsp; Packet List\r\n <span class=\"f-12\">({{cs.cDate | date: 'medium'}})</span>\r\n </h3>\r\n </div>\r\n </div>\r\n <div class=\"content-frame\">\r\n <div class=\"innerD\">\r\n <div class=\"content-frame-left\" *ngIf=\"false\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <!-- <div class=\"list-group border-bottom\">\r\n <a href=\"javascript:void(0)\" class=\"list-group-item\" [ngClass]=\"{'active' :i == cLink}\" *ngFor=\"let nav of navigation;let i=index\"\r\n (click)=\"navigationFun(nav,i);\">{{nav.form_field_title}} </a>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content-frame-body\" style=\"margin-left:0\">\r\n <div class=\"panel panel-default custom-panel\">\r\n <div class=\"panel-body\" style=\"padding:0;\">\r\n <div class=\"infoSec\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-left\">\r\n </form>\r\n </div>\r\n <div class=\"col-sm-6\">\r\n <div class=\"dropdown text-right\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <div class=\"\" style=\"margin-bottom: 10px;\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr>\r\n <th>Status</th>\r\n <th>Count</th>\r\n <th>Cts</th>\r\n <th>Avg</th>\r\n <th *ngIf=\"formname!='mixAnalysisReportForm'\">Disc</th>\r\n <th>Amount</th>\r\n\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let st of anaAllGrpStt;let i = index;\">\r\n <tr>\r\n <td>\r\n <!-- <label for=\"{{st}}\" class=\"text-capitalize\">S</label> -->\r\n <!-- *ngIf=\"defaultGrpList.length==0\" -->\r\n <input *ngIf=\"defaultGrpList.length==0\" type=\"checkbox\" id=\"{{st}}\" value=\"{{st}}\"\r\n name=\"{{st}}\" [(ngModel)]=\"stObj[st]\" [checked]=\"true\"\r\n (change)=\"statusWiseDisplay($event,stObj)\" />\r\n {{anaSttLbl[i]||st}}\r\n </td>\r\n <!-- anaSttLbl -->\r\n <td> {{sttWiseSummary?.get(st)?.get('count')}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('wt'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('avg'))}}</td>\r\n <td *ngIf=\"formname!='mixAnalysisReportForm'\"> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('disc'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('rate'))}}</td>\r\n\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n \r\n \r\n <div class=\"col-md-3\">\r\n <div class=\"form-group w-100\">\r\n <div class=\"col-md-5\">\r\n \r\n <select class=\"formcontrol\" name=\"viewdisType\" (change)=\"onGrpSelect(defaultGrpList)\" [(ngModel)]=\"viewdisType\">\r\n <option value=\"group\">Group By</option>\r\n <option value=\"summary\">Summary By</option>\r\n \r\n </select>\r\n </div>\r\n <div class=\"col-md-7\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Group\" [options]=\"staticLov\" [(ngModel)]=\"defaultGrpList\"\r\n name=\"status\" [multiple]=\"true\" [allowClear]=\"true\" (selected)=\"onGrpSelect(defaultGrpList)\"\r\n (deselected)=\"onGrpSelect(defaultGrpList)\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value.toLowerCase()}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n <p>\r\n <b>Buyer Pie chart</b>\r\n <i title=\"Buyer wise pie chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('buyer','value')\"></i>\r\n </p>\r\n </div>\r\n\r\n \r\n <div class=\"col-md-2\">\r\n <p *ngIf=\"defaultGrpList.length>0\">\r\n <i title=\"Group wise chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('group','value')\"></i>\r\n </p>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"col-md-3 pull-right\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search &nbsp;&nbsp;</label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n <button class=\"btn btn-default\" style=\"padding: 4px 15px 4px 20px;margin-left: 10px;float: right;\"\r\n data-toggle=\"tooltip\" data-placement=\"left\" title=\"Download Excel\"\r\n (click)=\"exportToCSV('Packet list');\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button>\r\n\r\n </form>\r\n </div>\r\n\r\n </div>\r\n \r\n \r\n\r\n <!-- <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <button class=\"btn btn-success\" style=\"margin-left: 5px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul> \r\n </div>\r\n </div>\r\n -->\r\n <div class=\"row\">\r\n <ng-container *ngIf=\"viewdisType=='group'\">\r\n <div *ngIf=\"groupBypktList.length >0\" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"grouponScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th (click)=\"sortBy(hrdKey,g)\" style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">\r\n {{header[hrdKey]}}\r\n \r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n \r\n <ng-container *ngFor=\"let groupdtl of loadgroupBypktList let j=index;\">\r\n <tr>\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{groupdtl.value}} &nbsp; &nbsp;\r\n Qty : {{groupdtl['count']}} &nbsp; &nbsp; Carats :\r\n {{groupdtl['crtwt']}}\r\n &nbsp; &nbsp; Avg :{{groupdtl['salavg']}}\r\n &nbsp; &nbsp; Dis% : {{groupdtl['saldis']}}\r\n\r\n &nbsp;&nbsp; Amount : {{groupdtl['salvlu']}} \r\n </td>\r\n </tr> \r\n <!-- <tr *ngIf=\"sttwise\" >\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{g}} &nbsp; &nbsp;\r\n Qty : {{finalGrpVal[g].length}} &nbsp; &nbsp; Carats :\r\n {{totalWeight}}\r\n\r\n &nbsp;&nbsp; Amount :{{totAmt}}\r\n </td>\r\n </tr> -->\r\n\r\n\r\n\r\n <tr *ngFor=\"let pktdtl of groupdtl['pktList'] | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n\r\n \r\n \r\n <div *ngIf=\"pkts.length > 0 && groupBypktList.length==0 \" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th> \r\n Actions\r\n </th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">{{header[hrdKey]}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td></td>\r\n <td></td>\r\n <td><b>Average </b></td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td>\r\n <b>{{cs.splitToTwoDecimal(TotAvgObj[hrdKey])}}</b>\r\n </td>\r\n \r\n </ng-container>\r\n \r\n </tr>\r\n <tr *ngFor=\"let pktdtl of loadResult | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td> \r\n <ng-container *ngFor=\"let lnk of links\">\r\n <i class=\"{{lnk.form_field_icon}}\" *ngIf=\"pktdtl.dsp_stt!='sold'\" (click)=\"OnLinkClick(lnk,pktdtl)\" aria-hidden=\"true\"></i>\r\n &nbsp;\r\n </ng-container>\r\n \r\n </td>\r\n\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"viewdisType=='summary' && summaryList.length>0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\"> <button class=\"btn btn-default\"\r\n style=\"padding: 4px 15px 4px 20px;margin-left: 10px;\" data-toggle=\"tooltip\" data-placement=\"right\"\r\n title=\"Download Excel\" (click)=\"exportToCSVSummary();\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button></div>\r\n </div>\r\n <div class=\"row\">\r\n <table class=\"displayTable\" style=\"text-align: center;padding:10px ;\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th style=\"text-align: center;\">Sr. No</th>\r\n <th style=\"text-align: center;\">Attribute</th>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <th style=\"text-align: center;\" colspan=\"5\">{{hdr}}</th>\r\n </ng-container>\r\n </tr>\r\n <tr class=\"posrel\">\r\n <td style=\"text-align: center;\"></td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">Qty</td>\r\n <td style=\"text-align: center;\">Carat</td>\r\n <td style=\"text-align: center;\">Avg</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">Dis</td>\r\n <td style=\"text-align: center;\">Value</td>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let summaryDtl of summaryList | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"text-align: center;\">{{pkti+1}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['value']}}</td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">{{summaryDtl['count_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['crtwt_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['avg_'+hdr]}}</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">{{summaryDtl['dis_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['vlu_'+hdr]}}</td>\r\n </ng-container>\r\n </tr> \r\n\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"actionFooter\">\r\n <div class=\"row\">\r\n <div class=\"calsec pull-left\" style=\"padding: 5px;\">\r\n <table>\r\n <tr>\r\n <td style=\"text-align: center;\">\r\n <strong> Total: &nbsp; </strong>\r\n </td>\r\n <td style=\"text-align: center;\">\r\n {{finalGrpVal[\"\"]?.length>0 ? finalGrpVal[\"\"]?.length : pkts?.length}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Weight:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{totalWeight}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Avg:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totAvg}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Dis:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totDis}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Amount:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totAmt}}</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> &nbsp;&nbsp;&nbsp;| &nbsp;&nbsp;Selected Pkts : </strong> </td>\r\n <td style=\"text-align: center;\"> {{selectedItm?.length}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Weight:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectwt}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Avg:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAvg}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Disc:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectDis}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Amount:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAmt}}</td>\r\n\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div>\r\n <button class=\"btn btn-success\" style=\"margin-right: 80px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n\r\n\r\n <div class=\"modal fade\" id=\"PiechartModel\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" role=\"document\" >\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Top {{type}} Pie Chart</h4>\r\n </div>\r\n <div class=\"modal-body\" >\r\n <div class=\"row\">\r\n <div class=\"col-md-3 pull-right\">\r\n <div class=\"form-group\">\r\n <button id=\"btnQty\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'qty')\">QTY </button>\r\n <button id=\"btnVal\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'value')\">VALUE </button>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isBuyerwise\" >\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [colors]=\"chartColors\" [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isGrpwise\" >\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n\r\n <!-- <div class=\"card-footer row\" *ngIf=\"isQtyWise\">\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('count'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div> -->\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal fade\" id=\"bidMd\" tabindex=\"-1\" style=\"z-index: 1400\" role=\"dialog\"\r\n aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" role=\"document\">\r\n <form name=\"appForm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title text-uppercase\" id=\"exampleModalLabel\">\r\n Price Change</h5>\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n \r\n <div class=\"row\" style=\"padding:10px\">\r\n <div class=\"col-md-12\">\r\n <span style=\"font-size: 16px;font-weight:bold\">{{cObj?.pkt_code}} {{cObj?.sh}} {{cObj?.crtwt}} {{cObj?.co}} {{cObj?.pu}} {{cObj?.ct}} {{cObj?.po}} {{cObj?.sy}} {{cObj?.fl}}</span>\r\n \r\n\r\n </div>\r\n \r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" > Rap: </label>\r\n </div>\r\n <div class=\"col-md-3\"><span class=\"clbl\">{{cObj?.benchmark_rte}}</span></div>\r\n <div class=\"col-md-7\">&nbsp;</div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n \r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" >Discount:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rap_dis}}</span>\r\n </div>\r\n <div class=\"col-md-5\" style=\"text-align: left;\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'dis')\" style=\"width:100px\" class=\"form-control\" name=\"new_rap_dis\" [(ngModel)]=\"cObj['new_rap_dis']\" />\r\n\r\n </div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" style=\"text-align: right;\">Price:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rte}}</span>\r\n </div>\r\n <div class=\"col-md-5\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'rte')\" style=\"width:100px\" class=\"form-control\" name=\"new_rte\" [(ngModel)]=\"cObj['new_rte']\" />\r\n\r\n </div>\r\n \r\n </div>\r\n \r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" >Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" appAppNoDblClick\r\n (click)=\"ChangesPrice()\">Update Price</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div> \r\n<button id=\"bidMdBBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#bidMd\"></button>\r\n\r\n <button id=\"PiechartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#PiechartModel\"></button>\r\n\r\n\r\n</div>", styles: [".actionFooter{position:fixed;bottom:0;width:100%;text-align:right;padding:10px 10px 10px 0;background:#1b1e24}.calsec table{color:#fff}.selectedRow{background-color:#3c59983b!important}.notselectedRow{background-color:#fff!important}.legendsList{list-style:none;font-size:14px;padding:5px;display:flex;margin:0 0 0 80px}.formcontrol{height:30px;font-size:12px;line-height:18px;box-shadow:none;padding:5px 12px;border:1px solid #D5D5D5;background:#F9F9F9;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px #00000013;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}\n"], components: [{ type: i4.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.AppNoDblClickDirective, selector: "[appAppNoDblClick]" }], pipes: { "date": i5.DatePipe, "tableSearch": i8.TableSearchPipe } });
1102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: PktDataComponent, decorators: [{
1103
+ type: Component,
1104
+ args: [{ selector: 'app-pkt-data', template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">\r\n <span class=\"fa fa-chevron-left cp\" (click)=\"cs.pageBck();\"> Back</span>&nbsp;&nbsp;&nbsp; Packet List\r\n <span class=\"f-12\">({{cs.cDate | date: 'medium'}})</span>\r\n </h3>\r\n </div>\r\n </div>\r\n <div class=\"content-frame\">\r\n <div class=\"innerD\">\r\n <div class=\"content-frame-left\" *ngIf=\"false\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <!-- <div class=\"list-group border-bottom\">\r\n <a href=\"javascript:void(0)\" class=\"list-group-item\" [ngClass]=\"{'active' :i == cLink}\" *ngFor=\"let nav of navigation;let i=index\"\r\n (click)=\"navigationFun(nav,i);\">{{nav.form_field_title}} </a>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content-frame-body\" style=\"margin-left:0\">\r\n <div class=\"panel panel-default custom-panel\">\r\n <div class=\"panel-body\" style=\"padding:0;\">\r\n <div class=\"infoSec\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-left\">\r\n </form>\r\n </div>\r\n <div class=\"col-sm-6\">\r\n <div class=\"dropdown text-right\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <div class=\"\" style=\"margin-bottom: 10px;\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr>\r\n <th>Status</th>\r\n <th>Count</th>\r\n <th>Cts</th>\r\n <th>Avg</th>\r\n <th *ngIf=\"formname!='mixAnalysisReportForm'\">Disc</th>\r\n <th>Amount</th>\r\n\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let st of anaAllGrpStt;let i = index;\">\r\n <tr>\r\n <td>\r\n <!-- <label for=\"{{st}}\" class=\"text-capitalize\">S</label> -->\r\n <!-- *ngIf=\"defaultGrpList.length==0\" -->\r\n <input *ngIf=\"defaultGrpList.length==0\" type=\"checkbox\" id=\"{{st}}\" value=\"{{st}}\"\r\n name=\"{{st}}\" [(ngModel)]=\"stObj[st]\" [checked]=\"true\"\r\n (change)=\"statusWiseDisplay($event,stObj)\" />\r\n {{anaSttLbl[i]||st}}\r\n </td>\r\n <!-- anaSttLbl -->\r\n <td> {{sttWiseSummary?.get(st)?.get('count')}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('wt'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('avg'))}}</td>\r\n <td *ngIf=\"formname!='mixAnalysisReportForm'\"> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('disc'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('rate'))}}</td>\r\n\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n \r\n \r\n <div class=\"col-md-3\">\r\n <div class=\"form-group w-100\">\r\n <div class=\"col-md-5\">\r\n \r\n <select class=\"formcontrol\" name=\"viewdisType\" (change)=\"onGrpSelect(defaultGrpList)\" [(ngModel)]=\"viewdisType\">\r\n <option value=\"group\">Group By</option>\r\n <option value=\"summary\">Summary By</option>\r\n \r\n </select>\r\n </div>\r\n <div class=\"col-md-7\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Group\" [options]=\"staticLov\" [(ngModel)]=\"defaultGrpList\"\r\n name=\"status\" [multiple]=\"true\" [allowClear]=\"true\" (selected)=\"onGrpSelect(defaultGrpList)\"\r\n (deselected)=\"onGrpSelect(defaultGrpList)\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value.toLowerCase()}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n <p>\r\n <b>Buyer Pie chart</b>\r\n <i title=\"Buyer wise pie chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('buyer','value')\"></i>\r\n </p>\r\n </div>\r\n\r\n \r\n <div class=\"col-md-2\">\r\n <p *ngIf=\"defaultGrpList.length>0\">\r\n <i title=\"Group wise chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('group','value')\"></i>\r\n </p>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"col-md-3 pull-right\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search &nbsp;&nbsp;</label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n <button class=\"btn btn-default\" style=\"padding: 4px 15px 4px 20px;margin-left: 10px;float: right;\"\r\n data-toggle=\"tooltip\" data-placement=\"left\" title=\"Download Excel\"\r\n (click)=\"exportToCSV('Packet list');\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button>\r\n\r\n </form>\r\n </div>\r\n\r\n </div>\r\n \r\n \r\n\r\n <!-- <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <button class=\"btn btn-success\" style=\"margin-left: 5px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul> \r\n </div>\r\n </div>\r\n -->\r\n <div class=\"row\">\r\n <ng-container *ngIf=\"viewdisType=='group'\">\r\n <div *ngIf=\"groupBypktList.length >0\" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"grouponScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th (click)=\"sortBy(hrdKey,g)\" style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">\r\n {{header[hrdKey]}}\r\n \r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n \r\n <ng-container *ngFor=\"let groupdtl of loadgroupBypktList let j=index;\">\r\n <tr>\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{groupdtl.value}} &nbsp; &nbsp;\r\n Qty : {{groupdtl['count']}} &nbsp; &nbsp; Carats :\r\n {{groupdtl['crtwt']}}\r\n &nbsp; &nbsp; Avg :{{groupdtl['salavg']}}\r\n &nbsp; &nbsp; Dis% : {{groupdtl['saldis']}}\r\n\r\n &nbsp;&nbsp; Amount : {{groupdtl['salvlu']}} \r\n </td>\r\n </tr> \r\n <!-- <tr *ngIf=\"sttwise\" >\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{g}} &nbsp; &nbsp;\r\n Qty : {{finalGrpVal[g].length}} &nbsp; &nbsp; Carats :\r\n {{totalWeight}}\r\n\r\n &nbsp;&nbsp; Amount :{{totAmt}}\r\n </td>\r\n </tr> -->\r\n\r\n\r\n\r\n <tr *ngFor=\"let pktdtl of groupdtl['pktList'] | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n\r\n \r\n \r\n <div *ngIf=\"pkts.length > 0 && groupBypktList.length==0 \" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th> \r\n Actions\r\n </th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">{{header[hrdKey]}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td></td>\r\n <td></td>\r\n <td><b>Average </b></td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td>\r\n <b>{{cs.splitToTwoDecimal(TotAvgObj[hrdKey])}}</b>\r\n </td>\r\n \r\n </ng-container>\r\n \r\n </tr>\r\n <tr *ngFor=\"let pktdtl of loadResult | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td> \r\n <ng-container *ngFor=\"let lnk of links\">\r\n <i class=\"{{lnk.form_field_icon}}\" *ngIf=\"pktdtl.dsp_stt!='sold'\" (click)=\"OnLinkClick(lnk,pktdtl)\" aria-hidden=\"true\"></i>\r\n &nbsp;\r\n </ng-container>\r\n \r\n </td>\r\n\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"viewdisType=='summary' && summaryList.length>0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\"> <button class=\"btn btn-default\"\r\n style=\"padding: 4px 15px 4px 20px;margin-left: 10px;\" data-toggle=\"tooltip\" data-placement=\"right\"\r\n title=\"Download Excel\" (click)=\"exportToCSVSummary();\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button></div>\r\n </div>\r\n <div class=\"row\">\r\n <table class=\"displayTable\" style=\"text-align: center;padding:10px ;\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th style=\"text-align: center;\">Sr. No</th>\r\n <th style=\"text-align: center;\">Attribute</th>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <th style=\"text-align: center;\" colspan=\"5\">{{hdr}}</th>\r\n </ng-container>\r\n </tr>\r\n <tr class=\"posrel\">\r\n <td style=\"text-align: center;\"></td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">Qty</td>\r\n <td style=\"text-align: center;\">Carat</td>\r\n <td style=\"text-align: center;\">Avg</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">Dis</td>\r\n <td style=\"text-align: center;\">Value</td>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let summaryDtl of summaryList | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"text-align: center;\">{{pkti+1}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['value']}}</td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">{{summaryDtl['count_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['crtwt_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['avg_'+hdr]}}</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">{{summaryDtl['dis_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['vlu_'+hdr]}}</td>\r\n </ng-container>\r\n </tr> \r\n\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"actionFooter\">\r\n <div class=\"row\">\r\n <div class=\"calsec pull-left\" style=\"padding: 5px;\">\r\n <table>\r\n <tr>\r\n <td style=\"text-align: center;\">\r\n <strong> Total: &nbsp; </strong>\r\n </td>\r\n <td style=\"text-align: center;\">\r\n {{finalGrpVal[\"\"]?.length>0 ? finalGrpVal[\"\"]?.length : pkts?.length}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Weight:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{totalWeight}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Avg:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totAvg}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Dis:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totDis}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Amount:&nbsp;</strong> </td>\r\n <td style=\"text-align: center;\"> {{totAmt}}</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> &nbsp;&nbsp;&nbsp;| &nbsp;&nbsp;Selected Pkts : </strong> </td>\r\n <td style=\"text-align: center;\"> {{selectedItm?.length}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Weight:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectwt}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Avg:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAvg}}&nbsp;&nbsp;&nbsp;</td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Disc:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectDis}}&nbsp;&nbsp;&nbsp;</td>\r\n <td style=\"text-align: center;\">\r\n <strong> Amount:&nbsp;</strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAmt}}</td>\r\n\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div>\r\n <button class=\"btn btn-success\" style=\"margin-right: 80px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n\r\n\r\n <div class=\"modal fade\" id=\"PiechartModel\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" role=\"document\" >\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Top {{type}} Pie Chart</h4>\r\n </div>\r\n <div class=\"modal-body\" >\r\n <div class=\"row\">\r\n <div class=\"col-md-3 pull-right\">\r\n <div class=\"form-group\">\r\n <button id=\"btnQty\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'qty')\">QTY </button>\r\n <button id=\"btnVal\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'value')\">VALUE </button>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isBuyerwise\" >\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [colors]=\"chartColors\" [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isGrpwise\" >\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n\r\n <!-- <div class=\"card-footer row\" *ngIf=\"isQtyWise\">\r\n <label class=\"control-label\"><b>&nbsp;&nbsp; &nbsp;Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('count'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div> -->\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal fade\" id=\"bidMd\" tabindex=\"-1\" style=\"z-index: 1400\" role=\"dialog\"\r\n aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" role=\"document\">\r\n <form name=\"appForm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title text-uppercase\" id=\"exampleModalLabel\">\r\n Price Change</h5>\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n \r\n <div class=\"row\" style=\"padding:10px\">\r\n <div class=\"col-md-12\">\r\n <span style=\"font-size: 16px;font-weight:bold\">{{cObj?.pkt_code}} {{cObj?.sh}} {{cObj?.crtwt}} {{cObj?.co}} {{cObj?.pu}} {{cObj?.ct}} {{cObj?.po}} {{cObj?.sy}} {{cObj?.fl}}</span>\r\n \r\n\r\n </div>\r\n \r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" > Rap: </label>\r\n </div>\r\n <div class=\"col-md-3\"><span class=\"clbl\">{{cObj?.benchmark_rte}}</span></div>\r\n <div class=\"col-md-7\">&nbsp;</div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n \r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" >Discount:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rap_dis}}</span>\r\n </div>\r\n <div class=\"col-md-5\" style=\"text-align: left;\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'dis')\" style=\"width:100px\" class=\"form-control\" name=\"new_rap_dis\" [(ngModel)]=\"cObj['new_rap_dis']\" />\r\n\r\n </div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" style=\"text-align: right;\">Price:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rte}}</span>\r\n </div>\r\n <div class=\"col-md-5\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'rte')\" style=\"width:100px\" class=\"form-control\" name=\"new_rte\" [(ngModel)]=\"cObj['new_rte']\" />\r\n\r\n </div>\r\n \r\n </div>\r\n \r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" >Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" appAppNoDblClick\r\n (click)=\"ChangesPrice()\">Update Price</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div> \r\n<button id=\"bidMdBBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#bidMd\"></button>\r\n\r\n <button id=\"PiechartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#PiechartModel\"></button>\r\n\r\n\r\n</div>", styles: [".actionFooter{position:fixed;bottom:0;width:100%;text-align:right;padding:10px 10px 10px 0;background:#1b1e24}.calsec table{color:#fff}.selectedRow{background-color:#3c59983b!important}.notselectedRow{background-color:#fff!important}.legendsList{list-style:none;font-size:14px;padding:5px;display:flex;margin:0 0 0 80px}.formcontrol{height:30px;font-size:12px;line-height:18px;box-shadow:none;padding:5px 12px;border:1px solid #D5D5D5;background:#F9F9F9;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px #00000013;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}\n"] }]
1105
+ }], ctorParameters: function () { return [{ type: i1.CommanServiceService }, { type: i2.BiService }, { type: i3.Router }, { type: i3.ActivatedRoute }]; }, propDecorators: { chart: [{
1106
+ type: ViewChild,
1107
+ args: [BaseChartDirective]
1108
+ }] } });
1109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGt0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXotbGliL3NyYy9saWIvcGt0LWRhdGEvcGt0LWRhdGEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXotbGliL3NyYy9saWIvcGt0LWRhdGEvcGt0LWRhdGEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pELE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVoRCxPQUFPLEVBQWUsV0FBVyxFQUFlLE1BQU0sc0JBQXNCLENBQUM7QUFDN0UsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7Ozs7Ozs7QUFDbEMscUNBQXFDO0FBQ3JDLGdDQUFnQztBQUNoQyx1RUFBdUU7QUFPdkUsTUFBTSxPQUFPLGdCQUFnQjtJQXdEM0IsWUFDUyxFQUF3QixFQUN2QixHQUFjO0lBQ3RCLHFEQUFxRDtJQUNyRCx1REFBdUQ7SUFDL0MsTUFBYyxFQUNkLEtBQXFCO1FBTHRCLE9BQUUsR0FBRixFQUFFLENBQXNCO1FBQ3ZCLFFBQUcsR0FBSCxHQUFHLENBQVc7UUFHZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUE1RC9CLFNBQUksR0FBRyxFQUFFLENBQUM7UUFDVixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2YsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUVaLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRWhCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLHFCQUFnQixHQUFHLENBQUMsQ0FBQztRQUNyQixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFDakIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNYLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBR2QsbUJBQWMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzNCLGlEQUFpRDtRQUNqRCxpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUdsQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFLbEIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBTSxHQUFHLElBQUksQ0FBQztRQUNkLGdCQUFXLEdBQUcsT0FBTyxDQUFDO1FBQ3RCLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLHFCQUFnQixHQUFHLEVBQUUsQ0FBQztRQU10QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUE2SXhCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFnSmhCLFFBQUcsR0FBRyxFQUFFLENBQUM7UUFDVCxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsZ0JBQVcsR0FBRyxFQUFFLENBQUE7UUFDaEIsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLGVBQVUsR0FBRyxFQUFFLENBQUM7UUE2RGhCLGFBQVEsR0FBRyxFQUFFLENBQUM7UUF1T2QsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsY0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFBLEtBQUs7UUFDcEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGFBQVEsR0FBRyxFQUFFLENBQUM7UUEwR2Qsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFzQ25CLGNBQVMsR0FBRyxFQUFFLENBQUM7UUF5Q2YsK0NBQStDO1FBQy9DLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQix3QkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDekIsc0JBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBR2YsZ0JBQVcsR0FBVTtZQUMxQjtnQkFDRSxlQUFlLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDaEMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQzFCLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUM1QixtRUFBbUU7YUFDcEU7U0FBQyxDQUFDO1FBQ0wsV0FBTSxHQUFHO1lBQ1AsTUFBTSxFQUFFO2dCQUNOLE1BQU0sRUFBRSxZQUFZO2dCQUNwQiw0Q0FBNEM7Z0JBQzVDLFNBQVMsRUFBRSxDQUFDO2FBQ2I7U0FDRixDQUFBO1FBQ0QsaUJBQVksR0FBRztZQUNiLE9BQU8sRUFBRTtnQkFDUCxNQUFNLEVBQUU7b0JBQ04sTUFBTSxFQUFFLFlBQVk7aUJBQ3JCO2FBQ0Y7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLE1BQU0sRUFBRTtvQkFDTixTQUFTLEVBQUUsT0FBTztvQkFDbEIsUUFBUSxFQUFFLEVBQUU7b0JBQ1osT0FBTyxFQUFFLEVBQUU7b0JBQ1gsUUFBUSxFQUFFLEVBQUU7b0JBQ1osTUFBTSxFQUFFLFlBQVk7aUJBRXJCO2FBQ0Y7U0FJRixDQUFBO1FBQ0Qsb0JBQWUsR0FBRztZQUNoQiwrQ0FBK0M7WUFDL0MsOEVBQThFO1lBRTlFLE1BQU0sRUFBRTtnQkFDTixRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFO29CQUNOLFNBQVMsRUFBRSxPQUFPO29CQUNsQixRQUFRLEVBQUUsRUFBRTtvQkFDWixPQUFPLEVBQUUsRUFBRTtvQkFDWCxRQUFRLEVBQUUsRUFBRTtvQkFDWixNQUFNLEVBQUUsWUFBWTtpQkFDckI7YUFFRjtZQUNELE9BQU8sRUFBRTtnQkFDUCxVQUFVLEVBQUU7b0JBQ1YsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO3dCQUN4QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNuRCxPQUFPLEtBQUssQ0FBQztvQkFDZixDQUFDO2lCQUNGO2FBQ0Y7U0FDRixDQUFDO1FBQ0YsUUFBRyxHQUFHO1lBQ0osTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO1lBQ2hELE9BQU8sRUFBRTtnQkFDUCxNQUFNLEVBQUU7b0JBQ04sNkZBQTZGO29CQUM3RixNQUFNLEVBQUUsWUFBWTtvQkFDcEIsU0FBUyxFQUFFLENBQUM7b0JBQ1osR0FBRyxFQUFFLElBQUk7b0JBQ1QscUJBQXFCLEVBQUUsSUFBSTtvQkFDM0IsUUFBUSxFQUFFLFNBQVM7aUJBQ3BCO2FBQ0Y7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsU0FBUyxFQUFFO29CQUNULEtBQUssRUFBRSxVQUFVLFdBQVcsRUFBRSxJQUFJO3dCQUNoQyw4REFBOEQ7d0JBQzlELGdGQUFnRjt3QkFDaEYsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQzt5QkFDckMsQ0FBQztvQkFDSixDQUFDO2lCQUNGO2FBQ0Y7U0FDRixDQUFBO1FBNkxELGNBQVMsR0FBRyxFQUFFLENBQUM7UUEwQ2YsY0FBUyxHQUFHLEVBQUUsQ0FBQztJQTVqQ1gsQ0FBQztJQUVMLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNYLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztTQUFFO1FBQzVDLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLCtCQUErQjtRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDM0IsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsa0JBQWtCLENBQUM7YUFDaEQsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7Z0JBQzVCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2RyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25HLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDMUIsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLE1BQU0sRUFBRTt3QkFDN0IsTUFBTSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7cUJBQ3pFO3lCQUNJO3dCQUNILE1BQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3FCQUNyRTtnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ3JGLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWTtvQkFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFBO2dCQUNuQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hCLFFBQVEsQ0FBQTtnQkFDUiw2RUFBNkU7Z0JBQzdFLDRGQUE0RjtnQkFDNUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLGtEQUFrRDtnQkFDbEQsbUdBQW1HO2dCQUNuRyxtRUFBbUU7Z0JBQ25FLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckMsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUl4QywrQkFBK0I7YUFFaEM7aUJBQU07Z0JBQ0wsK0JBQStCO2dCQUMvQiw4RkFBOEY7YUFDL0Y7UUFDSCxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDVCwrQkFBK0I7WUFDL0IsdUZBQXVGO1FBQ3pGLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNELFNBQVMsQ0FBQyxLQUFLO1FBQ2IsSUFBSSxVQUFVLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUMvQixRQUFRLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNO1FBQzlCLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ2pDLElBQUksTUFBTSxJQUFJLEtBQUssRUFBRTtZQUNuQixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUEsT0FBTztZQUNuRCxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3BFLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLFFBQVEsRUFBRTtvQkFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNuQztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQSxPQUFPO1lBQ25ELE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN2RSxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0csb0dBQW9HO1FBQ3BHLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFHakcsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDakMsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLE1BQU0sRUFBRTtnQkFDN0IsTUFBTSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQzlFO2lCQUNJO2dCQUNILE1BQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUMxRTtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVyRCxDQUFDO0lBR0QsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEIsUUFBUSxDQUFBO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7WUFDakIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUNsQixRQUFRLENBQUE7Z0JBQ1IsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN4QjtpQkFDSTtnQkFDSCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQzthQUM3QztTQUNGO1FBQ0QsUUFBUSxDQUFBO1FBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFdkIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbEgsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9HLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVyRyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDckMsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLE1BQU0sRUFBRTtvQkFDN0IsTUFBTSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQ3pFO3FCQUNJO29CQUNILE1BQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUNyRTtZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWhELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FFekY7UUFPRCw4QkFBOEI7UUFDOUIsMEJBQTBCO1FBQzFCLHdEQUF3RDtRQUN4RCwrQkFBK0I7UUFDL0IsSUFBSTtRQUNKLFNBQVM7UUFDVCx5REFBeUQ7UUFDekQsK0JBQStCO1FBQy9CLElBQUk7UUFDSixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVoQyxDQUFDO0lBQ0QsV0FBVyxDQUFDLEdBQUcsRUFBRSxNQUFNO1FBRXJCLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxhQUFhLEVBQUU7WUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7WUFDbkIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUM5QztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUc7UUFDeEIsUUFBUSxDQUFBO1FBQ1IsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFO1lBQ2hCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzdHLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLENBQUM7U0FDN0I7UUFFRCxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUU7WUFDaEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakgsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztTQUN6QjtJQUVILENBQUM7SUFFRCxZQUFZO1FBR1YsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDckMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ25DLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2hELFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEIsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU1QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBLG1CQUFtQjtRQUM1RSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsWUFBWSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxvQkFBb0IsQ0FBQSxDQUFBLHlCQUF5QjtRQUNyRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsYUFBYSxDQUFDO1FBQ3pDLGlFQUFpRTtRQUNqRSxJQUFJLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7WUFDL0UsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLFNBQVMsRUFBRTtnQkFFaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0IsbUdBQW1HO2dCQUNuRywrQkFBK0I7YUFDaEM7aUJBQU07Z0JBRUwsK0JBQStCO2dCQUMvQixrR0FBa0c7YUFDbkc7UUFDSCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNwQiwrQkFBK0I7WUFDL0IsNkZBQTZGO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQztJQUVELFFBQVE7UUFDTixLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQ25DO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFFVixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVk7WUFDcEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQ2pCLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFO1lBQ3pELElBQUksU0FBUyxHQUFHLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN4RCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQVFELFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUTtRQUN2QiwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDdkIsd0JBQXdCO1FBQ3hCLDJDQUEyQztRQUMzQyxxQkFBcUI7UUFFckIsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDO1FBRTVCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEtBQUs7WUFDL0MsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVDLElBQUksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2FBQ3RDO1lBRUQsT0FBTyxJQUFJLENBQUM7WUFDWixvRkFBb0Y7UUFDdEYsQ0FBQyxDQUFDLENBQUM7UUFDSCx1QkFBdUI7UUFFdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRW5CLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsQixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEIsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDYixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRW5DLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBRXZDO1FBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFaEIsK0JBQStCO0lBRWpDLENBQUM7SUFHRCxXQUFXLENBQUMsUUFBUTtRQUNsQixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksT0FBTztZQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7O1lBRXhDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUTtRQUMxQixJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3hCLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2Qiw0Q0FBNEM7WUFDNUMsMkNBQTJDO1lBQzNDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDckIsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDUCxPQUFPO29CQUNMLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO29CQUNqQixPQUFPLEVBQUUsQ0FBQztvQkFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUM7b0JBQ25DLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUN4RCxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDeEQsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQ3ZELE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO29CQUM5RCxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDaEYsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQ3ZGLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7b0JBQ2pHLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBRXpHLENBQUE7WUFDSCxDQUFDLENBQUM7aUJBQ0QsT0FBTyxFQUFFO2lCQUNULFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDYixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztTQUVOO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVk7Z0JBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQTtZQUNuQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FFakI7SUFDSCxDQUFDO0lBR0QsYUFBYTtRQUNYLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5RCxRQUFRLENBQUE7WUFDUixJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0RCxNQUFNLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDakMsSUFBSSxNQUFNLEdBQUcsRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0IsTUFBTTthQUNQO1NBQ0Y7SUFFSCxDQUFDO0lBRUQsaUJBQWlCO1FBRWYsSUFBSSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhO1lBQzNDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUN0QixRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtZQUN6RCxJQUFJLFNBQVMsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjLENBQUMsUUFBUTtRQUdyQixJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBRXhCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFM0Isb0NBQW9DO1lBSXBDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7aUJBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDUCxPQUFPO29CQUNMLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQzNDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO29CQUNyQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxLQUFLO29CQUN0QyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDdkIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDO29CQUNuQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDeEQsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQ3hELE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUMxRCxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztpQkFFNUQsQ0FBQTtZQUNILENBQUMsQ0FBQztpQkFDRCxPQUFPLEVBQUU7aUJBQ1QsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNiLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7WUFFTCxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDcEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNsQixXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUM1QixVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQztnQkFDbEMsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxRQUFRLElBQUksU0FBUyxJQUFJLFFBQVEsSUFBSSxTQUFTLENBQUMsSUFBSSxNQUFNLElBQUksTUFBTTtvQkFDdEUsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLEtBQUssSUFBSSxFQUFFLEVBQUU7b0JBR2YsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDeEIsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDL0IsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDeEI7WUFDSCxDQUFDLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDaEIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDdEIsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNyRCxJQUFJLFVBQVUsSUFBSSxFQUFFLEVBQUU7d0JBQ3BCLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFFL0IsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQzdDLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNoRCxJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDOUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQzt3QkFDdkIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7d0JBQ3RDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQzt3QkFDMUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO3dCQUMxQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7d0JBQ3pDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7d0JBQzlELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO3dCQUMvRSxJQUFJLEdBQUcsSUFBSSxNQUFNLEVBQUU7NEJBQ2pCLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDdEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7NEJBQzNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7NEJBQzlELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO3lCQUNoRjtxQkFDRjtnQkFFSCxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksUUFBUSxJQUFJLFNBQVMsSUFBSSxRQUFRLElBQUksU0FBUyxFQUFFO2dCQUNsRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELENBQUMsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO29CQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDbkQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDbkQ7WUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztTQUUxQjthQUFNO1lBQ0wsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkIsbUhBQW1IO2FBQ3BIO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO1FBRWhCLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN2QyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDYixHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUMxQixHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNyRCxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdkQsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25ELEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuRCxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2RCxDQUFDLENBQUMsQ0FBQztZQUVILGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRVgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEcsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDekMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFFcEIsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLE1BQU0sRUFBRTtvQkFDekIsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUN0RTtxQkFDSTtvQkFDSCxNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQ2xFO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUUzQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDM0YsUUFBUSxFQUFFLENBQUM7UUFFYixDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7SUFhRCxXQUFXLENBQUMsUUFBUSxFQUFFLFNBQVM7UUFDN0IsSUFBSSxTQUFTLElBQUksS0FBSyxFQUFFO1lBQ3RCLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNsRSxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUQsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdELFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNoRTthQUNJO1lBQ0gsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2xFLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxRCxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0QsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQztRQUN2RCxJQUFJLFNBQVMsQ0FBQztRQUNkLElBQUksWUFBWSxDQUFDO1FBQ2pCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixnQkFBZ0I7UUFDaEIsSUFBSSxRQUFRLElBQUksT0FBTyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDdEIsWUFBWSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsUUFBUSxHQUFHLEVBQUUsQ0FBQztTQUNmO2FBQU07WUFDTCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQSxXQUFXO1NBRS9DO1FBRUQsOEJBQThCO1FBRTlCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEtBQUs7WUFDL0MsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVDLElBQUksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2FBQ3RDO1lBRUQsT0FBTyxJQUFJLENBQUM7WUFDWixvRkFBb0Y7UUFDdEYsQ0FBQyxDQUFDLENBQUM7UUFDSCx1QkFBdUI7UUFFdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuQixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkMsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDYixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTNCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUzSCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsZ0NBQWdDO1lBQ2pFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVCLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDWixtQ0FBbUM7WUFFbkMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFFWixnRUFBZ0U7U0FFakU7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU3QixJQUFJLFNBQVMsSUFBSSxLQUFLLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNwRDthQUNJO1lBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNuRDtRQUVELHNCQUFzQjtRQUN0QixzQkFBc0I7SUFFeEIsQ0FBQztJQUdELFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFCLDZDQUE2QztZQUM3QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7WUFDbkIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBRXJCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRTtnQkFDakIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLFFBQVEsR0FBRyxJQUFJLENBQUM7YUFDakI7WUFFRCxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRTVCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUUxQixJQUFJLENBQUMsR0FBRyxHQUFHO2dCQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUVwQyxJQUFJLENBQUMsR0FBRyxHQUFHO2dCQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7WUFFL0IsSUFBSSxDQUFDLEdBQUcsR0FBRztnQkFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO2lCQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFdEIsMEVBQTBFO1lBQzFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0Y7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVoQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2hDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNwQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDbEIsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlGLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0Isa0VBQWtFO1lBQ2xFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVyRSxRQUFRLEVBQUUsQ0FBQztZQUVYLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRTtnQkFDakIsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNoQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2FBQ2pCO1lBQ0QsbUJBQW1CO1lBQ25CLHVCQUF1QjtRQUV6QixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTVCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUM3QixPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEIsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWpCLHdCQUF3QjtJQUUxQixDQUFDO0lBNEZELE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVM7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBRTlCLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFHdEUsSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3RGLElBQUksSUFBSSxJQUFJLEtBQUs7Z0JBQ2YsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFFckYsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2QsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0JBQ3ZDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDN0QsUUFBUSxDQUFBO1lBQ1IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9ELElBQUksUUFBUSxHQUFHLFFBQVEsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN4QztpQkFDSTtnQkFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzNDO1NBRUY7YUFDSTtZQUNILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDOUQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN0RixJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsa0VBQWtFO1FBQ2xFLDZEQUE2RDtRQUU3RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDeEc7UUFFRCx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLHVEQUF1RDtRQUN2RCwrQkFBK0I7SUFFakMsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUFTO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLFNBQVMsSUFBSSxPQUFPLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2FBQ3pCO2lCQUNJO2dCQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2FBQ3ZCO1FBRUgsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBQ0QsV0FBVyxDQUFDLFFBQVE7UUFDbEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQ25CLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQy9CLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUN0QixJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsSUFBSSxPQUFPLEdBQUcsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRCxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsVUFBVSxDQUFDLENBQUM7UUFDVixJQUFJLE9BQU8sQ0FBQztRQUNaLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbEIsZ0JBQWdCO1lBQ2hCLG1DQUFtQztZQUNuQyxrQkFBa0I7WUFDbEIsSUFBSTtZQUNKLHVDQUF1QztZQUN2Qyx1QkFBdUI7WUFDdkIsSUFBSTtZQUNKLHVDQUF1QztZQUN2QyxpQkFBaUI7WUFDakIsSUFBSTtZQUVKLFNBQVM7WUFDVCwyQkFBMkI7WUFDM0IsSUFBSTtZQUVKLHNEQUFzRDtZQUN0RCxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUEsS0FBSztZQUV4RCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDaEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNmLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUVoQix1RkFBdUY7WUFDdkYsdUdBQXVHO1lBR3ZHLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksTUFBTSxFQUFFO2dCQUM3QixJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEk7aUJBQ0k7Z0JBQ0gsSUFBSSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1RDtZQUVELElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtnQkFDbkIsS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0MsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDMUM7aUJBQU07Z0JBQ0wsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7YUFDckI7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFFckMsMEZBQTBGO1lBQzFGLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQSxLQUFLO1FBRXpELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTdDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNiLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNqQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDWixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFHaEIsNENBQTRDO1lBQzVDLHlFQUF5RTtZQUN6RSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBRXhELEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7WUFDL0MsUUFBUSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU5QyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBRXJFLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQztZQUV2RCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU1QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEMsR0FBRztRQUVMLENBQUMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFbkMsQ0FBQztJQUdELFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSTtRQUNwQixRQUFRLENBQUE7UUFDUixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZCLFFBQVEsQ0FBQTtZQUNSLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNiLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssRUFBRTtnQkFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFFO2lCQUNJO2dCQUNILEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzdEO1lBRUQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN6RSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUU7Z0JBQzNCLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTthQUN0QztpQkFDSTtnQkFDSCxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDNUI7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUk7UUFDdkIsUUFBUSxDQUFBO1FBQ1IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN2QixRQUFRLENBQUE7WUFDUixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7WUFFZCxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU1RCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxZQUFZO1FBQ1YsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLG1CQUFtQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkcsQ0FBQztJQUVELFFBQVE7UUFDTix5Q0FBeUM7UUFDekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBRTVCLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDOUIsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLFNBQVMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUMvQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsRUFBRSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDaEQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO2dCQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLFFBQVEsSUFBSSxVQUFVLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4QjtpQkFDSTtnQkFDSCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELElBQUksT0FBTyxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksU0FBUyxJQUFJLE9BQU8sSUFBSSxFQUFFLEVBQUU7b0JBQzVELElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO2lCQUMzQjtnQkFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFFdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXZHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUzQixxSEFBcUg7Z0JBQ3JILElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEcsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUUxRixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQzFCLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxNQUFNLEVBQUU7d0JBQzdCLE1BQU0sSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3FCQUN6RTt5QkFDSTt3QkFDSCxNQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztxQkFDckU7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBSUgsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBR3hGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ3JDLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWTtvQkFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFBO2dCQUNuQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7YUFHakI7UUFFSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsbURBQW1EO1FBQ25ELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyRSxJQUFJLFNBQVMsSUFBSSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsV0FBVyxDQUFDLEdBQUc7UUFDYixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDZixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ2pCLGdCQUFnQjtZQUNoQixvQ0FBb0M7WUFDcEMsSUFBSTtZQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLEdBQUcsR0FBRyxFQUFFLENBQUM7U0FDVjtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNmLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNoQixDQUFDLENBQUMsQ0FBQztRQUNKLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxjQUFjO1FBRVosK0JBQStCO1FBQy9CLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUEsc0JBQXNCO1FBQy9FLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7UUFDNUMsaUVBQWlFO1FBQ2pFLElBQUksT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtZQUN2RSxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFO2dCQUNoQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFFNUMsK0JBQStCO2FBQ2hDO2lCQUFNO2dCQUNMLCtCQUErQjtnQkFDL0Isa0dBQWtHO2FBQ25HO1FBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDcEIsK0JBQStCO1lBQy9CLDZGQUE2RjtRQUMvRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OzhHQWh3Q1UsZ0JBQWdCO2tHQUFoQixnQkFBZ0IsMkZBcURoQixrQkFBa0IsZ0RDMUUvQixrMTNCQXNpQk07NEZEamhCTyxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsY0FBYztxTEEwRGpCLEtBQUs7c0JBRFgsU0FBUzt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgeyBGbGFzaE1lc3NhZ2VzU2VydmljZSB9IGZyb20gJ2FuZ3VsYXIyLWZsYXNoLW1lc3NhZ2VzJztcclxuLy8gaW1wb3J0IHsgTmc0TG9hZGluZ1NwaW5uZXJTZXJ2aWNlIH0gZnJvbSAnbmc0LWxvYWRpbmctc3Bpbm5lcic7XHJcbmltcG9ydCB7IEJpU2VydmljZSB9IGZyb20gJy4vLi4vYmktc2VydmljZS9iaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbWFuU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tYW4tc2VydmljZS9jb21tYW4tc2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgQ29va2llIH0gZnJvbSAnbmcyLWNvb2tpZXMvbmcyLWNvb2tpZXMnO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IEJhc2VDaGFydERpcmVjdGl2ZSB9IGZyb20gJ25nMi1jaGFydHMnO1xyXG5pbXBvcnQgKiBhcyBwbHVnaW5EYXRhTGFiZWxzIGZyb20gJ2NoYXJ0anMtcGx1Z2luLWxhYmVscyc7XHJcbmltcG9ydCB7IEh0dHBIYW5kbGVyLCBIdHRwSGVhZGVycywgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCAqIGFzIFJ4IGZyb20gJ3J4anMtY29tcGF0JztcclxuLy8gaW1wb3J0ICogYXMgUnggZnJvbSAncnhqcy1jb21wYXQnO1xyXG4vLyBpbXBvcnQgeyBmcm9tIH0gZnJvbSAncnhqcyc7IFxyXG4vLyBpbXBvcnQgeyBncm91cEJ5LCBtZXJnZU1hcCwgcmVkdWNlLCB0b0FycmF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtcGt0LWRhdGEnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wa3QtZGF0YS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGt0LWRhdGEuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQa3REYXRhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgcGt0cyA9IFtdO1xyXG4gIGhlYWRlcktleSA9IFtdO1xyXG4gIGhlYWRlciA9IFtdO1xyXG4gIGNrO1xyXG4gIHRvdGFsV2VpZ2h0ID0gMDtcclxuICByZXFoZWFkZXI7XHJcbiAgc2Nyb2xsRGlzdGFuY2UgPSAxO1xyXG4gIHNjcm9sbFVwRGlzdGFuY2UgPSAyO1xyXG4gIHN0YXJ0SW5kZXggPSAwO1xyXG4gIGVuZEluZGV4ID0gMzA7XHJcbiAgZ3JvdXBzdGFydEluZGV4ID0gMDtcclxuICBncm91cGVuZEluZGV4ID0gMzA7XHJcbiAgbG9hZFJlc3VsdCA9IFtdO1xyXG4gIHJlc3VsdGxlbmd0aCA9IDA7XHJcbiAgdG90QXZnID0gMDtcclxuICB0b3REaXMgPSAwO1xyXG4gIHNlbGVjdGVkSXRtID0gW107XHJcbiAgc2VsZWN0d3QgPSAwO1xyXG4gIHNlbGVjdEF2ZyA9IDA7XHJcbiAgc2VsZWN0RGlzID0gMDtcclxuICBzZWxlY3RBbXQgPSAwO1xyXG4gIHNlYXJjaEY7XHJcbiAgZHJvcGRvd25TZXR0aW5ncztcclxuICBzdHRXaXNlU3VtbWFyeSA9IG5ldyBNYXAoKTtcclxuICAvLyBhbmFBbGxHcnBTdHQgPSBbJ2FzcnQnLCAnbGFiJywgJ21rdCcsICdzb2xkJ107XHJcbiAgYW5hQWxsR3JwU3R0ID0gW107XHJcbiAgZztcclxuXHJcbiAgbGVnZW5kTGlzdCA9IFtdO1xyXG4gIG5ld3dpbmRvdyA9IFwiWUVTXCI7XHJcbiAgcGFnZURlZmluYXRpb247XHJcbiAgc29ydGVkO1xyXG4gIHNvcnRPbjtcclxuICBjbG1uO1xyXG4gIHN0YXRpY0xvdiA9IFtdO1xyXG4gIGRlZmF1bHRHcnBMaXN0ID0gW107XHJcbiAgc3RPYmogPSB7fTtcclxuICB0b3RBbXQgPSAwO1xyXG4gIG5vZGF0YSA9IHRydWU7XHJcbiAgdmlld2Rpc1R5cGUgPSBcImdyb3VwXCI7XHJcbiAgc3VtbWFyeUxpc3QgPSBbXTtcclxuICBjb1B1YXR0cmlidXRlU3RyID0gW107XHJcbiAgZm9ybW5hbWU7XHJcbiAgbW9kdWxlbmFtZTtcclxuICBjVXJsO1xyXG4gIGxpbmtzO1xyXG4gIGNPYmo7XHJcbiAgZ3JvdXBCeXBrdExpc3QgPSBbXTtcclxuICBsb2FkZ3JvdXBCeXBrdExpc3QgPSBbXTtcclxuXHJcblxyXG4gIEBWaWV3Q2hpbGQoQmFzZUNoYXJ0RGlyZWN0aXZlKVxyXG4gIHB1YmxpYyBjaGFydDogQmFzZUNoYXJ0RGlyZWN0aXZlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBjczogQ29tbWFuU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGJpczogQmlTZXJ2aWNlLFxyXG4gICAgLy8gcHJpdmF0ZSBfc3Bpbm5lclNlcnZpY2U6IE5nNExvYWRpbmdTcGlubmVyU2VydmljZSxcclxuICAgIC8vIHByaXZhdGUgX2ZsYXNoTWVzc2FnZXNTZXJ2aWNlOiBGbGFzaE1lc3NhZ2VzU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxyXG4gICkgeyB9XHJcblxyXG4gIGxwYWQobFN0ciwgbG4pIHtcclxuICAgIGxldCBzdHIgPSBsU3RyO1xyXG4gICAgd2hpbGUgKHN0ci5sZW5ndGggPCBsbikgeyBzdHIgPSAnMCcgKyBzdHI7IH1cclxuICAgIHJldHVybiBzdHI7XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hSZXN1bHQoKSB7XHJcbiAgICB0aGlzLmNPYmogPSB7fTtcclxuICAgIHRoaXMuZ3JvdXBCeXBrdExpc3QgPSBbXTtcclxuICAgIC8vIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIHRoaXMucGt0cyA9IFtdO1xyXG4gICAgdGhpcy5ncnAgPSBbXTtcclxuICAgIHRoaXMuaGVhZGVyS2V5ID0gW107XHJcbiAgICB0aGlzLmxlZ2VuZExpc3QgPSBbXTtcclxuICAgIHRoaXMudmlld2Rpc1R5cGUgPSBcImdyb3VwXCI7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICB0aGlzLmZvcm1uYW1lID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5tZSddO1xyXG4gICAgcmVxT2JqWydzZWFyY2hJZG5MaXN0J10gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3JjSWRucycpLnNwbGl0KCcsJyk7XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm1ubWUnXTtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgdGhpcy5zdGFydEluZGV4ID0gMDtcclxuICAgIHRoaXMuZW5kSW5kZXggPSAzMDtcclxuICAgIHRoaXMubG9hZFJlc3VsdCA9IFtdO1xyXG4gICAgdGhpcy5iaXMuZGF0YShyZXFPYmosICdzZWFyY2gnLCAnbWFya2V0aW5nL3NlYXJjaCcpXHJcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgICAgbGV0IHJlcyA9IGRhdGEucmVzdWx0O1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJyZXNcIiwgcmVzKTtcclxuICAgICAgICAgIHRoaXMucGFnZURlZmluYXRpb24gPSByZXMucGFnZURlZmluYXRpb24gfHwge307XHJcbiAgICAgICAgICB0aGlzLmxpbmtzID0gdGhpcy5wYWdlRGVmaW5hdGlvbi5saW5rIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5wa3RzID0gcmVzLnNlYXJjaFJlc3VsdER0bCB8fCBbXTtcclxuICAgICAgICAgIHRoaXMuYW5hQWxsR3JwU3R0ID0gQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMucGt0cy5tYXAoZWxlbWVudCA9PiBlbGVtZW50LmRzcF9zdHQpKSk7XHJcbiAgICAgICAgICB0aGlzLnJlc3VsdGxlbmd0aCA9IHRoaXMucGt0cy5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLmNvUHVhdHRyaWJ1dGVTdHIgPSByZXMuY29wdVN0cnVjdHVyZUR0bCB8fCBbXTtcclxuICAgICAgICAgIHRoaXMuaGVhZGVyS2V5ID0gcmVzLnJlc3VsdFZpZXc7XHJcbiAgICAgICAgICB0aGlzLmhlYWRlciA9IHJlcy5yZXN1bHRWaWV3RHRsO1xyXG4gICAgICAgICAgdGhpcy5sZWdlbmRMaXN0ID0gcmVzLmxlZ2VuZExpc3Q7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsV2VpZ2h0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnBrdHMucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcbiAgICAgICAgICBsZXQgcmFwVmFsID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnBrdHMucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIucmFwX3ZsdSksIDApKTtcclxuICAgICAgICAgIGxldCB0b3RBbXQgPSAwO1xyXG4gICAgICAgICAgdGhpcy5wa3RzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmdycF9zdHQgPT0gJ3NvbGQnKSB7XHJcbiAgICAgICAgICAgICAgdG90QW10ICs9IHBhcnNlRmxvYXQoZWxlbWVudFsnc2FsX3J0ZSddKSAqIHBhcnNlRmxvYXQoZWxlbWVudFsnY3J0d3QnXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdG90QW10ICs9IHBhcnNlRmxvYXQoZWxlbWVudFsncnRlJ10pICogcGFyc2VGbG9hdChlbGVtZW50WydjcnR3dCddKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgdGhpcy50b3RBbXQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdEFtdCk7XHJcbiAgICAgICAgICB0aGlzLnRvdEF2ZyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy50b3RBbXQgLyB0aGlzLnRvdGFsV2VpZ2h0KTtcclxuICAgICAgICAgIHRoaXMudG90RGlzID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKHRvdEFtdCAqIDEwMCkgLyBwYXJzZUZsb2F0KHJhcFZhbCkpIC0gMTAwKTtcclxuICAgICAgICAgIGlmICh0aGlzLmVuZEluZGV4ID4gdGhpcy5yZXN1bHRsZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuZW5kSW5kZXggPSB0aGlzLnJlc3VsdGxlbmd0aFxyXG4gICAgICAgICAgdGhpcy5hZGRJdGVtcygpO1xyXG4gICAgICAgICAgZGVidWdnZXJcclxuICAgICAgICAgIC8vICAgdGhpcy50b3RBdmcgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdEFtdCAvIHBhcnNlRmxvYXQodG90d2VpZ2h0KSk7XHJcbiAgICAgICAgICAvLyAgdGhpcy50b3REaXMgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKCgodG90QW10ICogMTAwKSAvIHBhcnNlRmxvYXQodG90cmFwVmFsKSkgLSAxMDApO1xyXG4gICAgICAgICAgdGhpcy5nZXRTdW1tYXJ5KHRoaXMucGt0cyk7XHJcbiAgICAgICAgICAvLyB0aGlzLmNyZWF0ZUdycCh0aGlzLnBrdHMsIHRoaXMuZGVmYXVsdEdycExpc3QpO1xyXG4gICAgICAgICAgLy8gbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ0JJLVBLVF9HUk9VUF9CWScsSlNPTi5zdHJpbmdpZnkocmVzLnBhZ2VEZWZpbmF0aW9uLmZvcm1fZmllbGRbMF0ubG92X3FyeSkpXHJcbiAgICAgICAgICAvLyBsZXQgR1JQYnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdCSS1QS1RfR1JPVVBfQlknKSk7XHJcbiAgICAgICAgICB0aGlzLmdldFN0YXRpY0tWKHJlcy5wYWdlRGVmaW5hdGlvbi5mb3JtX2ZpZWxkWzBdLmxvdl9xcnkpO1xyXG4gICAgICAgICAgbGV0IGF2Z0ZpZWxkcyA9IHJlcy5wYWdlRGVmaW5hdGlvbi50YWJzWzBdLmxvdl9xcnkuc3BsaXQoJywnKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VG90YWxzKGF2Z0ZpZWxkcywgdGhpcy5wa3RzKTtcclxuICAgICAgICAgIGxldCB0dGxGaWVsZHMgPSByZXMucGFnZURlZmluYXRpb24ub3RoZXJzWzBdLmxvdl9xcnkuc3BsaXQoJywnKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VG90YWxzVHRsKHR0bEZpZWxkcywgdGhpcy5wa3RzKTtcclxuXHJcblxyXG5cclxuICAgICAgICAgIC8vIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAgIC8vIHRoaXMuX2ZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coZGF0YS5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAvLyB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgLy8gdGhpcy5fZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhlcnJvciwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICBzZWxlY3RSb3cocGt0SWQpIHtcclxuICAgIHZhciBjaGVja2JveElkID0gXCJjYl9cIiArIHBrdElkO1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2hlY2tib3hJZCkuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIGNoZWNrZWRSb3cob2JqLCBzdG9ja2lkbiwgc3RhdHVzKSB7XHJcbiAgICBsZXQgY2JJZCA9ICdjYl8nICsgb2JqLnN0b2NrX2lkbjtcclxuICAgIGlmIChzdGF0dXMgPT0gZmFsc2UpIHtcclxuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjYklkKTsvL3BrdElkXHJcbiAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFJvd1wiKTtcclxuICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcIm5vdHNlbGVjdGVkUm93XCIpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRtLmZvckVhY2goKGUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgaWYgKGUuc3RvY2tfaWRuID09IHN0b2NraWRuKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRtLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2JJZCk7Ly9wa3RJZFxyXG4gICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwibm90c2VsZWN0ZWRSb3dcIik7XHJcbiAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJzZWxlY3RlZFJvd1wiKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0bS5wdXNoKG9iaik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdHd0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnNlbGVjdGVkSXRtLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArcGFyc2VGbG9hdChiLmNydHd0KSwgMCkpO1xyXG5cclxuICAgIC8vIGxldCB0b3RBbXQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMuc2VsZWN0ZWRJdG0ucmVkdWNlKChhLCBiKSA9PiArYSArICtiLnNhbF9hbW91bnQsIDApKTtcclxuICAgIGxldCB0b3R3ZWlnaHQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMuc2VsZWN0ZWRJdG0ucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcbiAgICBsZXQgdG90cmFwVmFsID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnNlbGVjdGVkSXRtLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArYi5yYXBfdmx1LCAwKSk7XHJcblxyXG5cclxuICAgIGxldCB0b3RBbXQgPSAwO1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0bS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC5ncnBfc3R0ID09ICdzb2xkJykge1xyXG4gICAgICAgIHRvdEFtdCArPSBwYXJzZUZsb2F0KGVsZW1lbnRbJ3NhbF9ydGUnXSB8fCAwKSAqIHBhcnNlRmxvYXQoZWxlbWVudFsnY3J0d3QnXSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdG90QW10ICs9IHBhcnNlRmxvYXQoZWxlbWVudFsncnRlJ10gfHwgMCkgKiBwYXJzZUZsb2F0KGVsZW1lbnRbJ2NydHd0J10pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdEF2ZyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10IC8gcGFyc2VGbG9hdCh0b3R3ZWlnaHQpKTtcclxuICAgIHRoaXMuc2VsZWN0RGlzID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgodG90QW10IC8gcGFyc2VGbG9hdCh0b3RyYXBWYWwpICogMTAwKSAtIDEwMCk7XHJcbiAgICB0aGlzLnNlbGVjdEFtdCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10KTtcclxuXHJcbiAgfVxyXG5cclxuICBzdHR3aXNlID0gZmFsc2U7XHJcbiAgc3RhdHVzV2lzZURpc3BsYXkoZSwgbSkge1xyXG4gICAgZGVidWdnZXJcclxuICAgIHRoaXMuc3R0d2lzZSA9IHRydWU7XHJcbiAgICBsZXQgZ0FyciA9IFtdO1xyXG4gICAgZm9yIChsZXQga2V5IGluIG0pIHtcclxuICAgICAgaWYgKG1ba2V5XSA9PSB0cnVlKSB7XHJcbiAgICAgICAgZGVidWdnZXJcclxuICAgICAgICBsZXQgcGsgPSB0aGlzLnBrdHMuZmlsdGVyKGUgPT4gZS5ncnBfc3R0ID09IGtleSk7XHJcbiAgICAgICAgZ0FyciA9IGdBcnIuY29uY2F0KHBrKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgcGsgPSBnQXJyLmZpbHRlcihlID0+IGUuZ3JwX3N0dCAhPSBrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBkZWJ1Z2dlclxyXG4gICAgdGhpcy5maW5hbEdycFZhbFtcIlwiXSA9IGdBcnI7XHJcbiAgICB0aGlzLmxvYWRSZXN1bHQgPSBnQXJyO1xyXG5cclxuICAgIGlmICh0aGlzLmZpbmFsR3JwVmFsW1wiXCJdLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy50b3RhbFdlaWdodCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5maW5hbEdycFZhbFtcIlwiXS5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5jcnR3dCksIDApKTtcclxuXHJcbiAgICAgIGxldCB0b3R3ZWlnaHQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMuZmluYWxHcnBWYWxbXCJcIl0ucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcbiAgICAgIGxldCB0b3RyYXBWYWwgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMuZmluYWxHcnBWYWxbXCJcIl0ucmVkdWNlKChhLCBiKSA9PiArYSArICtiLnJhcF92bHUsIDApKTtcclxuXHJcbiAgICAgIGxldCB0b3RBbXQgPSAwO1xyXG4gICAgICB0aGlzLmZpbmFsR3JwVmFsW1wiXCJdLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnc29sZCcpIHtcclxuICAgICAgICAgIHRvdEFtdCArPSBwYXJzZUZsb2F0KGVsZW1lbnRbJ3NhbF9ydGUnXSkgKiBwYXJzZUZsb2F0KGVsZW1lbnRbJ2NydHd0J10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRvdEFtdCArPSBwYXJzZUZsb2F0KGVsZW1lbnRbJ3J0ZSddKSAqIHBhcnNlRmxvYXQoZWxlbWVudFsnY3J0d3QnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy50b3RBbXQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdEFtdCk7XHJcblxyXG4gICAgICB0aGlzLnRvdEF2ZyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10IC8gcGFyc2VGbG9hdCh0b3R3ZWlnaHQpKTtcclxuICAgICAgdGhpcy50b3REaXMgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKCgodG90QW10ICogMTAwKSAvIHBhcnNlRmxvYXQodG90cmFwVmFsKSkgLSAxMDApO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgIC8vIGxldCBncnBCeSA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgLy8gaWYgKGUudGFyZ2V0LmNoZWNrZWQpIHtcclxuICAgIC8vICAgbGV0IHBrID0gdGhpcy5wa3RzLmZpbHRlcihlID0+IGUuZ3JwX3N0dCA9PSBncnBCeSk7XHJcbiAgICAvLyAgIHRoaXMuZmluYWxHcnBWYWxbXCJcIl0gPSBwaztcclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgLy8gICBsZXQgcGsgPSB0aGlzLnBrdHMuZmlsdGVyKGUgPT4gZS5ncnBfc3R0ICE9PSBncnBCeSk7XHJcbiAgICAvLyAgIHRoaXMuZmluYWxHcnBWYWxbXCJcIl0gPSBwaztcclxuICAgIC8vIH1cclxuICAgIGNvbnNvbGUubG9nKHRoaXMuZmluYWxHcnBWYWwpO1xyXG5cclxuICB9XHJcbiAgT25MaW5rQ2xpY2sobG5rLCBwa3RkdGwpIHtcclxuXHJcbiAgICBpZiAobG5rLmZvcm1fZmllbGQgPT0gJ3ByaWNldXBkYXRlJykge1xyXG4gICAgICB0aGlzLmNPYmogPSBwa3RkdGw7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYmlkTWRCQnRuXCIpLmNsaWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdFJ0ZURpcyhvYmpkdGwsIHR5cCkge1xyXG4gICAgZGVidWdnZXJcclxuICAgIGlmICh0eXAgPT0gJ3J0ZScpIHtcclxuICAgICAgbGV0IGRpcyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKChwYXJzZUZsb2F0KG9iamR0bC5uZXdfcnRlKSAqIDEwMCkgLyBwYXJzZUZsb2F0KG9iamR0bC5yYXBfcnRlKSkgLSAxMDApO1xyXG4gICAgICBvYmpkdGxbXCJuZXdfcmFwX2Rpc1wiXSA9IGRpcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwID09ICdkaXMnKSB7XHJcbiAgICAgIGxldCBydGUgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKChwYXJzZUZsb2F0KG9iamR0bC5yYXBfcnRlKSAqICgxMDAgKyBwYXJzZUZsb2F0KG9iamR0bC5uZXdfcmFwX2RpcykpIC8gMTAwKSk7XHJcbiAgICAgIG9iamR0bFtcIm5ld19ydGVcIl0gPSBydGU7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgQ2hhbmdlc1ByaWNlKCkge1xyXG5cclxuXHJcbiAgICBsZXQgbm1lSWRuID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbm1lSWRuJykpO1xyXG4gICAgbGV0IHBrdERhdGFMaXN0ID0gW107XHJcbiAgICBsZXQgdXBkYXRlT2JqID0ge307XHJcbiAgICB1cGRhdGVPYmpbXCJpZFwiXSA9IHRoaXMuY09iai5wa3RfY29kZTtcclxuICAgIHVwZGF0ZU9ialtcImlzc3VlXCJdID0geyBcInJ0ZVwiOiBcIlwiIH07XHJcbiAgICB1cGRhdGVPYmpbXCJydG5cIl0gPSB7IFwicnRlXCI6IHRoaXMuY09iai5uZXdfcnRlIH07XHJcbiAgICB1cGRhdGVPYmpbXCJlbXBcIl0gPSB7fTtcclxuICAgIHBrdERhdGFMaXN0LnB1c2godXBkYXRlT2JqKTtcclxuXHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm1ubWUnXTsvLydidWxrVXBkYXRlRm9ybSc7XHJcbiAgICByZXFPYmpbJ2F0dHInXSA9IFwicnRlXCI7XHJcbiAgICByZXFPYmpbJ3JlaXNzdWUnXSA9ICdZJztcclxuICAgIHJlcU9ialsnZW1wSWRuJ10gPSBubWVJZG47XHJcbiAgICByZXFPYmpbJ2dycCddID0gXCJidWxrdXBkYXRlXCI7XHJcbiAgICByZXFPYmpbJ3Byb2Nlc3NOYW1lJ10gPSBcImJ1bGtNZW1QcmljZVVwZGF0ZVwiLy8nYnVsa1ByZXBlcnRpZXNVcGRhdGUnO1xyXG4gICAgcmVxT2JqWydwa3REYXRhTGlzdCddID0gcGt0RGF0YUxpc3Q7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIHRoaXMucmVxaGVhZGVyWydtZXRob2QnXSA9ICdyZXR1cm5Jc3N1ZSc7XHJcbiAgICAvLyBsZXQgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7IGhlYWRlcnM6IHRoaXMucmVxaGVhZGVyIH0pO1xyXG4gICAgbGV0IG9wdGlvbnMgPSBuZXcgSHR0cEhlYWRlcnMoeyBoZWFkZXJzOiB0aGlzLnJlcWhlYWRlciB9KTtcclxuICAgIHRoaXMuY3MubG9hZChyZXFPYmosIG9wdGlvbnMsICdwcmVNYXJrZXRpbmcvaXNzdWVSZXR1cm4nKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcblxyXG4gICAgICAgIHRoaXMuY09iai5ydGUgPSB0aGlzLmNPYmoubmV3X3J0ZTtcclxuICAgICAgICB0aGlzLmNPYmoucmFwX2RpcyA9IHRoaXMuY09iai5uZXdfcmFwX2RpcztcclxuICAgICAgICB0aGlzLmdldFN1bW1hcnkodGhpcy5wa3RzKTtcclxuICAgICAgICAvLyB0aGlzLl9mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KHJlc3BvbnNlLm1lc3NhZ2UsIHsgY3NzQ2xhc3M6ICdhbGVydC1zdWNjZXNzJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgICAvLyB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAvLyB0aGlzLl9mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KHJlc3BvbnNlLm1lc3NhZ2UsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgLy8gdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAvLyB0aGlzLl9mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KGVyci5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGFkZEl0ZW1zKCkge1xyXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhcnRJbmRleDsgaSA8IHRoaXMuZW5kSW5kZXg7IGkrKykge1xyXG4gICAgICB0aGlzLmxvYWRSZXN1bHRbaV0gPSB0aGlzLnBrdHNbaV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXJ0SW5kZXggPSB0aGlzLmVuZEluZGV4O1xyXG4gICAgdGhpcy5lbmRJbmRleCA9IHRoaXMuZW5kSW5kZXggKyAzMDtcclxuICAgIGlmICh0aGlzLmVuZEluZGV4ID4gdGhpcy5yZXN1bHRsZW5ndGgpIHtcclxuICAgICAgdGhpcy5lbmRJbmRleCA9IHRoaXMucmVzdWx0bGVuZ3RoO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TY3JvbGxEb3duKCkge1xyXG5cclxuICAgIGlmICh0aGlzLmVuZEluZGV4IDw9IHRoaXMucmVzdWx0bGVuZ3RoKVxyXG4gICAgICB0aGlzLmFkZEl0ZW1zKClcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid3JhcFwiKS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHRyYW5zbGF0ZSA9IFwidHJhbnNsYXRlKDAsXCIgKyB0aGlzLnNjcm9sbFRvcCArIFwicHgpXCI7XHJcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvcihcInRoZWFkXCIpLnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zbGF0ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBncnAgPSBbXTtcclxuICBHcnBWYWxzID0gW107XHJcbiAgZmluYWxHcnBWYWwgPSB7fVxyXG4gIGZpbmFsU3VtbWFyeUR0bCA9IHt9O1xyXG4gIGRhdGEgPSBbXTtcclxuICBzdW1tYXJ5RHRsID0ge307XHJcblxyXG4gIGNyZWF0ZUdycChkYXRhcywgc2VsZWN0ZWQpIHtcclxuICAgIC8vIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIHRoaXMuZGF0YSA9IFsuLi5kYXRhc107XHJcbiAgICAvLyBsZXQgZ3JwdmFsdWVzID0gXCJwdVwiO1xyXG4gICAgLy8gbGV0IGdycHZhbHVlc0FyciA9IGdycHZhbHVlcy5zcGxpdCgnLCcpO1xyXG4gICAgLy8gbGV0IHJlc3V0QXJyID0gW107XHJcblxyXG4gICAgbGV0IGdycHZhbHVlc0FyciA9IHNlbGVjdGVkO1xyXG5cclxuICAgIHZhciBmaW5hbCA9IFtdO1xyXG4gICAgdmFyIG91dHB1dCA9IF8uZ3JvdXBCeSh0aGlzLmRhdGEsIGZ1bmN0aW9uIChlbnRyeSkge1xyXG4gICAgICB2YXIgc3RycyA9ICcnO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdycHZhbHVlc0Fyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHN0cnMgKz0gZW50cnlbZ3JwdmFsdWVzQXJyW2ldXSArICcjJztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHN0cnM7XHJcbiAgICAgIC8vIHJldHVybiBlbnRyeVtncnB2YWx1ZXNBcnJbMF1dICsgJyMnICsgZW50cnlbZ3JwdmFsdWVzQXJyWzFdXTsvLyArICcjJyArIGVudHJ5LnB1O1xyXG4gICAgfSk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhvdXRwdXQpO1xyXG5cclxuICAgIGZpbmFsLnB1c2gob3V0cHV0KTtcclxuICAgIGNvbnNvbGUubG9nKGZpbmFsKTtcclxuXHJcbiAgICB2YXIgS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsWzBdKTtcclxuICAgIGNvbnNvbGUubG9nKEtleXMpO1xyXG5cclxuICAgIHZhciBWYWxzID0gT2JqZWN0LnZhbHVlcyhmaW5hbFswXSk7XHJcbiAgICBjb25zb2xlLmxvZyhWYWxzKTtcclxuXHJcbiAgICBsZXQgZ3JwTmFtZWFyciA9IFtdO1xyXG4gICAgS2V5cy5tYXAoZWxlID0+IHtcclxuICAgICAgZ3JwTmFtZWFyci5wdXNoKGVsZS5zcGxpdCgnIycpLmZpbHRlcihlID0+IGUgIT0gdW5kZWZpbmVkKS5qb2luKCcgIC8gICcpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZ3JwID0gZ3JwTmFtZWFycjtcclxuICAgIHRoaXMuR3JwVmFscyA9IFZhbHM7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdycE5hbWVhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIGdycE5tZSA9IGdycE5hbWVhcnJbaV07XHJcbiAgICAgIHRoaXMuZmluYWxHcnBWYWxbZ3JwTm1lXSA9IFZhbHNbaV07XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmZpbmFsR3JwVmFsW2dycE5tZV0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdldFRvdGFsKCk7XHJcbiAgICB0aGlzLmdycC5zb3J0KCk7XHJcblxyXG4gICAgLy8gdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBvbkdycFNlbGVjdChzZWxlY3RlZCkge1xyXG4gICAgaWYgKHRoaXMudmlld2Rpc1R5cGUgPT0gJ2dyb3VwJylcclxuICAgICAgdGhpcy5ncm91cFBrdHNMaXN0KHRoaXMucGt0cywgc2VsZWN0ZWQpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLnN1bW1hcnlEZXRhaWxzKHNlbGVjdGVkKTtcclxuICB9XHJcbiAgaGVhZExpc3QgPSBbXTtcclxuICBncm91cFBrdHNMaXN0KHBrdHMsIHNlbGVjdGVkKSB7XHJcbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHtcclxuICAgICAgbGV0IGF0dHIgPSBzZWxlY3RlZFswXTtcclxuICAgICAgLy8gdGhpcy5maW5hbEdycFZhbCA9IF8uZ3JvdXBCeShwa3RzLCBhdHRyKTtcclxuICAgICAgLy90aGlzLmdycCA9IE9iamVjdC5rZXlzKHRoaXMuZmluYWxHcnBWYWwpO1xyXG4gICAgICBSeC5PYnNlcnZhYmxlLmZyb20ocGt0cylcclxuICAgICAgICAuZ3JvdXBCeSh4ID0+IHhbYXR0cl0pXHJcbiAgICAgICAgLmZsYXRNYXAoZ3JvdXAgPT4gZ3JvdXAudG9BcnJheSgpKVxyXG4gICAgICAgIC5tYXAoZyA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2YWx1ZTogZ1swXVthdHRyXSxcclxuICAgICAgICAgICAgcGt0TGlzdDogZyxcclxuICAgICAgICAgICAgY291bnQ6IF8uc3VtQnkoZywgJ3F0eV9vbl9oYW5kaW50JyksXHJcbiAgICAgICAgICAgIHJhcHZsdTogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChfLnN1bUJ5KGcsICdyYXBfdmx1JykpLFxyXG4gICAgICAgICAgICBjcnR3dDogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChfLnN1bUJ5KGcsICdjcnR3dGludCcpKSxcclxuICAgICAgICAgICAgdmx1OiB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKF8uc3VtQnkoZywgJ2Ftb3VudGludCcpKSxcclxuICAgICAgICAgICAgc2Fsdmx1OiB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKF8uc3VtQnkoZywgJ3NhbF9hbW91bnRpbnQnKSksXHJcbiAgICAgICAgICAgIGF2ZzogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChfLnN1bUJ5KGcsICdhbW91bnRpbnQnKSAvIF8uc3VtQnkoZywgJ2NydHd0aW50JykpLFxyXG4gICAgICAgICAgICBzYWxhdmc6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAnc2FsX2Ftb3VudGludCcpIC8gXy5zdW1CeShnLCAnY3J0d3RpbnQnKSksXHJcbiAgICAgICAgICAgIGRpczogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKF8uc3VtQnkoZywgJ2Ftb3VudGludCcpICogMTAwKSAvIChfLnN1bUJ5KGcsICdyYXBfdmx1JykpKSAtIDEwMCksXHJcbiAgICAgICAgICAgIHNhbGRpczogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKF8uc3VtQnkoZywgJ3NhbF9hbW91bnRpbnQnKSAqIDEwMCkgLyAoXy5zdW1CeShnLCAncmFwX3ZsdScpKSkgLSAxMDApXHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnRvQXJyYXkoKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoZCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwQnlwa3RMaXN0ID0gZDtcclxuICAgICAgICAgIHRoaXMuZ3JvdXBzdGFydEluZGV4ID0gMDtcclxuICAgICAgICAgIHRoaXMuZ3JvdXBlbmRJbmRleCA9IHRoaXMuZ3JvdXBCeXBrdExpc3QubGVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy5ncm91cGFkZEl0ZW1zKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydEluZGV4ID0gMDtcclxuICAgICAgdGhpcy5lbmRJbmRleCA9IDMwO1xyXG4gICAgICB0aGlzLmxvYWRSZXN1bHQgPSBbXTtcclxuICAgICAgdGhpcy5ncm91cEJ5cGt0TGlzdCA9IFtdO1xyXG4gICAgICBpZiAodGhpcy5lbmRJbmRleCA+IHRoaXMucmVzdWx0bGVuZ3RoKVxyXG4gICAgICAgIHRoaXMuZW5kSW5kZXggPSB0aGlzLnJlc3VsdGxlbmd0aFxyXG4gICAgICB0aGlzLmFkZEl0ZW1zKCk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGdyb3VwYWRkSXRlbXMoKSB7XHJcbiAgICBsZXQgcGt0Y250ID0gMDtcclxuICAgIGZvciAobGV0IGkgPSB0aGlzLmdyb3Vwc3RhcnRJbmRleDsgaSA8IHRoaXMuZ3JvdXBlbmRJbmRleDsgaSsrKSB7XHJcbiAgICAgIGRlYnVnZ2VyXHJcbiAgICAgIHRoaXMubG9hZGdyb3VwQnlwa3RMaXN0W2ldID0gdGhpcy5ncm91cEJ5cGt0TGlzdFtpXTtcclxuICAgICAgbGV0IHBrdGxpc3QgPSB0aGlzLmdyb3VwQnlwa3RMaXN0W2ldWydwa3RMaXN0J10gfHwgW107XHJcbiAgICAgIHBrdGNudCA9IHBrdGNudCArIHBrdGxpc3QubGVuZ3RoO1xyXG4gICAgICBpZiAocGt0Y250ID4gMzApIHtcclxuICAgICAgICB0aGlzLmdyb3Vwc3RhcnRJbmRleCA9IGkgKyAxO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZ3JvdXBvblNjcm9sbERvd24oKSB7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JvdXBzdGFydEluZGV4IDwgdGhpcy5ncm91cGVuZEluZGV4KVxyXG4gICAgICB0aGlzLmdyb3VwYWRkSXRlbXMoKVxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3cmFwXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgdHJhbnNsYXRlID0gXCJ0cmFuc2xhdGUoMCxcIiArIHRoaXMuc2Nyb2xsVG9wICsgXCJweClcIjtcclxuICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yKFwidGhlYWRcIikuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNsYXRlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdW1tYXJ5RGV0YWlscyhzZWxlY3RlZCkge1xyXG5cclxuXHJcbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHtcclxuXHJcbiAgICAgIHRoaXMuaGVhZExpc3QgPSBbXTtcclxuICAgICAgbGV0IHN1bW1hcnlEYXRhID0gW107XHJcbiAgICAgIGxldCBhdHRyaWJ1ZSA9IHNlbGVjdGVkWzBdO1xyXG4gICAgICBcclxuICAgICAgLy8gY29uc3QgcGt0c0RhdGEgPSBmcm9tKHRoaXMucGt0cykuXHJcblxyXG5cclxuXHJcbiAgICAgIFJ4Lk9ic2VydmFibGUuZnJvbSh0aGlzLnBrdHMpXHJcbiAgICAgICAgLmdyb3VwQnkoeCA9PiB4W2F0dHJpYnVlXSArIFwiI1wiICsgeFsnZHNwX3N0dCddKVxyXG4gICAgICAgIC5mbGF0TWFwKGdyb3VwID0+IGdyb3VwLnRvQXJyYXkoKSlcclxuICAgICAgICAubWFwKGcgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAga2V5OiBnWzBdW2F0dHJpYnVlXSArIFwiI1wiICsgZ1swXVsnZHNwX3N0dCddLFxyXG4gICAgICAgICAgICB2YWx1ZTogZ1swXVthdHRyaWJ1ZV0sXHJcbiAgICAgICAgICAgIHNvcnQ6IGdbMF1bYXR0cmlidWUgKyBcIl9zcnRcIl0gfHwgMTAwMDAsXHJcbiAgICAgICAgICAgIGRzcHN0dDogZ1swXVsnZHNwX3N0dCddLFxyXG4gICAgICAgICAgICBjb3VudDogXy5zdW1CeShnLCAncXR5X29uX2hhbmRpbnQnKSxcclxuICAgICAgICAgICAgcmFwdmx1OiB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKF8uc3VtQnkoZywgJ3JhcF92bHUnKSksXHJcbiAgICAgICAgICAgIGNydHd0OiB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKF8uc3VtQnkoZywgJ2NydHd0aW50JykpLFxyXG4gICAgICAgICAgICB2bHVydGU6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAnYW1vdW50aW50JykpLFxyXG4gICAgICAgICAgICB2bHU6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAnc2FsX2Ftb3VudGludCcpKSxcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAudG9BcnJheSgpXHJcbiAgICAgICAgLnN1YnNjcmliZShkID0+IHtcclxuICAgICAgICAgIHN1bW1hcnlEYXRhID0gZDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIGxldCBzdW1tYXJ5TWFwID0ge307XHJcbiAgICAgIGxldCBzaWRlTGlzdCA9IFtdO1xyXG4gICAgICBsZXQgaGVhZExpc3QgPSBbXTtcclxuICAgICAgc3VtbWFyeURhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBzdW1tYXJ5TWFwW2VsZW1lbnQua2V5XSA9IGVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gZWxlbWVudC52YWx1ZSB8fCAnJztcclxuICAgICAgICBsZXQgZHNwc3R0ID0gZWxlbWVudC5kc3BzdHQ7XHJcbiAgICAgICAgaWYgKChzZWxlY3RlZCA9PSAnc2FsX2J5cicgfHwgc2VsZWN0ZWQgPT0gJ3NhbF9lbXAnKSAmJiBkc3BzdHQgIT0gJ3NvbGQnKVxyXG4gICAgICAgICAgdmFsdWUgPSAnJztcclxuICAgICAgICBpZiAodmFsdWUgIT0gJycpIHtcclxuXHJcblxyXG4gICAgICAgICAgaWYgKGhlYWRMaXN0LmluZGV4T2YoZHNwc3R0KSA9PSAtMSlcclxuICAgICAgICAgICAgaGVhZExpc3QucHVzaChkc3BzdHQpO1xyXG4gICAgICAgICAgaWYgKHNpZGVMaXN0LmluZGV4T2YodmFsdWUpID09IC0xKVxyXG4gICAgICAgICAgICBzaWRlTGlzdC5wdXNoKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLnN1bW1hcnlMaXN0ID0gW107XHJcbiAgICAgIHNpZGVMaXN0LmZvckVhY2goc2lkZSA9PiB7XHJcbiAgICAgICAgbGV0IHN1bW1yeSA9IHt9O1xyXG4gICAgICAgIGhlYWRMaXN0LmZvckVhY2goaGVhZCA9PiB7XHJcbiAgICAgICAgICBsZXQgc3VtbXJ5RGF0YSA9IHN1bW1hcnlNYXBbc2lkZSArIFwiI1wiICsgaGVhZF0gfHwgJyc7XHJcbiAgICAgICAgICBpZiAoc3VtbXJ5RGF0YSAhPSAnJykge1xyXG4gICAgICAgICAgICBsZXQgc3R0ID0gc3VtbXJ5RGF0YVsnZHNwc3R0J107XHJcblxyXG4gICAgICAgICAgICBsZXQgdmx1ID0gcGFyc2VGbG9hdChzdW1tcnlEYXRhLnZsdXJ0ZSB8fCAwKTtcclxuICAgICAgICAgICAgbGV0IHJhcHZsdSA9IHBhcnNlRmxvYXQoc3VtbXJ5RGF0YS5yYXB2bHUgfHwgMCk7XHJcbiAgICAgICAgICAgIGxldCBjcnR3dCA9IHBhcnNlRmxvYXQoc3VtbXJ5RGF0YS5jcnR3dCB8fCAwKTtcclxuICAgICAgICAgICAgc3VtbXJ5Wyd2YWx1ZSddID0gc2lkZTtcclxuICAgICAgICAgICAgc3VtbXJ5Wyd2YWx1ZVNvcnQnXSA9IHN1bW1yeURhdGEuc29ydDtcclxuICAgICAgICAgICAgc3VtbXJ5Wydjb3VudF8nICsgc3R0XSA9IHN1bW1yeURhdGEuY291bnQ7XHJcbiAgICAgICAgICAgIHN1bW1yeVsnY3J0d3RfJyArIHN0dF0gPSBzdW1tcnlEYXRhLmNydHd0O1xyXG4gICAgICAgICAgICBzdW1tcnlbJ3ZsdV8nICsgc3R0XSA9IHN1bW1yeURhdGEudmx1cnRlO1xyXG4gICAgICAgICAgICBzdW1tcnlbJ2F2Z18nICsgc3R0XSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodmx1IC8gY3J0d3QpO1xyXG4gICAgICAgICAgICBzdW1tcnlbJ2Rpc18nICsgc3R0XSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKCh2bHUgKiAxMDApIC8gcmFwdmx1KSAtIDEwMCk7XHJcbiAgICAgICAgICAgIGlmIChzdHQgPT0gJ3NvbGQnKSB7XHJcbiAgICAgICAgICAgICAgdmx1ID0gcGFyc2VGbG9hdChzdW1tcnlEYXRhLnZsdSB8fCAwKTtcclxuICAgICAgICAgICAgICBzdW1tcnlbJ3ZsdV8nICsgc3R0XSA9IHZsdTtcclxuICAgICAgICAgICAgICBzdW1tcnlbJ2F2Z18nICsgc3R0XSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodmx1IC8gY3J0d3QpO1xyXG4gICAgICAgICAgICAgIHN1bW1yeVsnZGlzXycgKyBzdHRdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKHZsdSAqIDEwMCkgLyByYXB2bHUpIC0gMTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdW1tYXJ5TGlzdC5wdXNoKHN1bW1yeSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHNlbGVjdGVkID09ICdzYWxfYnlyJyB8fCBzZWxlY3RlZCA9PSAnc2FsX2VtcCcpIHtcclxuICAgICAgICB0aGlzLnN1bW1hcnlMaXN0LnNvcnQoKHZhbDEsIHZhbDIpID0+IHtcclxuICAgICAgICAgIHJldHVybiAodmFsMlsndmx1X3NvbGQnXSkgLSAodmFsMVsndmx1X3NvbGQnXSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzLnN1bW1hcnlMaXN0XCIsIHRoaXMuc3VtbWFyeUxpc3QpO1xyXG4gICAgICAgIHRoaXMuc3VtbWFyeUxpc3Quc29ydCgodmFsMSwgdmFsMikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuICh2YWwxWyd2YWx1ZVNvcnQnXSkgLSAodmFsMlsndmFsdWVTb3J0J10pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidGhpcy5zdW1tYXJ5TGlzdFwiLCB0aGlzLnN1bW1hcnlMaXN0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5oZWFkTGlzdCA9IGhlYWRMaXN0O1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgLy8gdGhpcy5fZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhcIlN1bW1hcnkgbmVlZCBvbmx5IG9uZSBhdHRyaWJ1dGVcIiwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydFRvQ1NWU3VtbWFyeSgpIHtcclxuXHJcbiAgICBsZXQgbW9kaWZpZWRPYmpBcnIgPSBbXTtcclxuXHJcbiAgICB0aGlzLnN1bW1hcnlMaXN0LmZvckVhY2goKGRhdGEsIGluZGV4KSA9PiB7XHJcbiAgICAgIGxldCBvYmogPSB7fTtcclxuICAgICAgb2JqW1wiU3IuIE5vXCJdID0gaW5kZXggKyAxO1xyXG4gICAgICBvYmpbXCJBdHRyaWJ1dGVcIl0gPSBkYXRhLnZhbHVlIHx8ICcnO1xyXG4gICAgICB0aGlzLmhlYWRMaXN0LmZvckVhY2goaGRyID0+IHtcclxuICAgICAgICBvYmpbXCJRdHkoXCIgKyBoZHIgKyBcIilcIl0gPSBkYXRhW1wiY291bnRfXCIgKyBoZHJdIHx8ICcnO1xyXG4gICAgICAgIG9ialtcIkNhcmF0KFwiICsgaGRyICsgXCIpXCJdID0gZGF0YVtcImNydHd0X1wiICsgaGRyXSB8fCAnJztcclxuICAgICAgICBvYmpbXCJBdmcoXCIgKyBoZHIgKyBcIilcIl0gPSBkYXRhW1wiYXZnX1wiICsgaGRyXSB8fCAnJztcclxuICAgICAgICBvYmpbXCJEaXMoXCIgKyBoZHIgKyBcIilcIl0gPSBkYXRhW1wiZGlzX1wiICsgaGRyXSB8fCAnJztcclxuICAgICAgICBvYmpbXCJWYWx1ZShcIiArIGhkciArIFwiKVwiXSA9IGRhdGFbXCJ2bHVfXCIgKyBoZHJdIHx8ICcnO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG1vZGlmaWVkT2JqQXJyLnB1c2gob2JqKTtcclxuXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY3MuQ1NWQ29udmVydG9yKG1vZGlmaWVkT2JqQXJyLCBcIlN1bW1hcnlfZGV0YWlsc1wiLCB0cnVlKVxyXG4gIH1cclxuXHJcbiAgZ2V0VG90YWwoKSB7XHJcbiAgICBsZXQgaW5kZXhWYWwgPSAwO1xyXG4gICAgbGV0IHFzID0gMDtcclxuXHJcbiAgICB0aGlzLkdycFZhbHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgbGV0IHRvdEFtdCA9IDA7XHJcbiAgICAgIGxldCB0b3R3ZWlnaHQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKGVsZW1lbnQucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcbiAgICAgIGxldCByYXBWYWwgPSBfLnN1bUJ5KGVsZW1lbnQsICdyYXBfdmx1Jyk7XHJcbiAgICAgIGVsZW1lbnQuZm9yRWFjaChwa3QgPT4ge1xyXG5cclxuICAgICAgICBpZiAocGt0LmdycF9zdHQgPT0gJ3NvbGQnKSB7XHJcbiAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChwa3RbJ3NhbF9ydGUnXSB8fCAwKSAqIHBhcnNlRmxvYXQocGt0WydjcnR3dCddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChwa3RbJ3J0ZSddIHx8IDApICogcGFyc2VGbG9hdChwa3RbJ2NydHd0J10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0b3RBbXQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdEFtdCk7XHJcblxyXG4gICAgICB2YXIga2V5ID0gdGhpcy5ncnBbaW5kZXhWYWxdO1xyXG4gICAgICB0aGlzLnN1bW1hcnlEdGxba2V5ICsgXCJfQ1RTXCJdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3R3ZWlnaHQpO1xyXG4gICAgICB0aGlzLnN1bW1hcnlEdGxba2V5ICsgXCJfQU1UXCJdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3RBbXQpO1xyXG4gICAgICB0aGlzLnN1bW1hcnlEdGxba2V5ICsgXCJfUlRFXCJdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3RBbXQgLyB0b3R3ZWlnaHQpO1xyXG4gICAgICB0aGlzLnN1bW1hcnlEdGxba2V5ICsgXCJfRElTXCJdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKHRvdEFtdCAqIDEwMCkgLyByYXBWYWwpIC0gMTAwKTtcclxuICAgICAgaW5kZXhWYWwrKztcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgR3JwVmFsc1BpZSA9IFtdO1xyXG4gIGdycFBpZSA9IFtdO1xyXG4gIGZpbmFsR3JwVmFsUGllID0ge307XHJcbiAgc3VtbWFyeUR0bFBpZSA9IHt9O1xyXG4gIGJ5cnZhbEdycCA9IFtdOy8ve307XHJcbiAgaXNCdXllcndpc2UgPSBmYWxzZTtcclxuICBpc0dycHdpc2UgPSBmYWxzZTtcclxuICB0eXBlO1xyXG4gIGdycFdpc2VRdHkgPSBbXTtcclxuICBkYXRhVHlwZSA9IFwiXCI7XHJcbiAgZ2VuZXJhdGVQaWUoRGF0YXR5cGUsIENoYXJ0VHlwZSkge1xyXG4gICAgaWYgKENoYXJ0VHlwZSA9PSAncXR5Jykge1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuUXR5JykuY2xhc3NMaXN0LnJlbW92ZSgnYnRuLWRlZmF1bHQnKTtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blF0eScpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuVmFsJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5WYWwnKS5jbGFzc0xpc3QuYWRkKCdidG4tZGVmYXVsdCcpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5WYWwnKS5jbGFzc0xpc3QucmVtb3ZlKCdidG4tZGVmYXVsdCcpO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuVmFsJykuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5RdHknKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blF0eScpLmNsYXNzTGlzdC5hZGQoJ2J0bi1kZWZhdWx0Jyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdycFdpc2VRdHkgPSBbXTtcclxuICAgIHRoaXMuYnlydmFsR3JwID0gW107XHJcblxyXG4gICAgdGhpcy5kYXRhVHlwZSA9IERhdGF0eXBlO1xyXG4gICAgLy8gdGhpcy5fc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgdGhpcy5maW5hbEdycFZhbFBpZSA9IHt9O1xyXG4gICAgdGhpcy5ieXJ2YWxHcnAgPSBbXTtcclxuICAgIHRoaXMuZGF0YSA9IFsuLi50aGlzLnBrdHNdO1xyXG4gICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLmZpbHRlcih4ID0+IHguZ3JwX3N0dCA9PSAnc29sZCcpO1xyXG4gICAgbGV0IGdycHZhbHVlcztcclxuICAgIGxldCBncnB2YWx1ZXNBcnI7XHJcbiAgICBsZXQgcmVzdXRBcnIgPSBbXTtcclxuICAgIC8vIHR5cGUgPSAncXR5JztcclxuICAgIGlmIChEYXRhdHlwZSA9PSAnYnV5ZXInKSB7XHJcbiAgICAgIHRoaXMudHlwZSA9IFwiQnV5ZXJcIjtcclxuICAgICAgdGhpcy5pc0J1eWVyd2lzZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuaXNHcnB3aXNlID0gZmFsc2U7XHJcbiAgICAgIGdycHZhbHVlcyA9IFwic2FsX2J5clwiO1xyXG4gICAgICBncnB2YWx1ZXNBcnIgPSBncnB2YWx1ZXMuc3BsaXQoJywnKTtcclxuICAgICAgcmVzdXRBcnIgPSBbXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudHlwZSA9IHRoaXMuZGVmYXVsdEdycExpc3Q7XHJcbiAgICAgIHRoaXMuaXNCdXllcndpc2UgPSBmYWxzZTtcclxuICAgICAgdGhpcy5pc0dycHdpc2UgPSB0cnVlO1xyXG4gICAgICBncnB2YWx1ZXNBcnIgPSB0aGlzLmRlZmF1bHRHcnBMaXN0Oy8vc2VsZWN0ZWQ7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vbGV0IGdycHZhbHVlc0FyciA9IHNlbGVjdGVkO1xyXG5cclxuICAgIHZhciBmaW5hbCA9IFtdO1xyXG4gICAgdmFyIG91dHB1dCA9IF8uZ3JvdXBCeSh0aGlzLmRhdGEsIGZ1bmN0aW9uIChlbnRyeSkge1xyXG4gICAgICB2YXIgc3RycyA9ICcnO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdycHZhbHVlc0Fyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHN0cnMgKz0gZW50cnlbZ3JwdmFsdWVzQXJyW2ldXSArICcjJztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHN0cnM7XHJcbiAgICAgIC8vIHJldHVybiBlbnRyeVtncnB2YWx1ZXNBcnJbMF1dICsgJyMnICsgZW50cnlbZ3JwdmFsdWVzQXJyWzFdXTsvLyArICcjJyArIGVudHJ5LnB1O1xyXG4gICAgfSk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhvdXRwdXQpO1xyXG5cclxuICAgIGZpbmFsLnB1c2gob3V0cHV0KTtcclxuXHJcbiAgICB2YXIgS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsWzBdKTtcclxuXHJcbiAgICB2YXIgVmFscyA9IE9iamVjdC52YWx1ZXMoZmluYWxbMF0pO1xyXG5cclxuICAgIGxldCBncnBOYW1lYXJyID0gW107XHJcbiAgICBLZXlzLm1hcChlbGUgPT4ge1xyXG4gICAgICBncnBOYW1lYXJyLnB1c2goZWxlLnNwbGl0KCcjJykuZmlsdGVyKGUgPT4gZSAhPSB1bmRlZmluZWQpLmpvaW4oJyAgLyAgJykpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5ncnBQaWUgPSBncnBOYW1lYXJyO1xyXG4gICAgdGhpcy5HcnBWYWxzUGllID0gVmFscztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JwTmFtZWFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgZ3JwTm1lID0gZ3JwTmFtZWFycltpXTtcclxuXHJcbiAgICAgIHRoaXMuZmluYWxHcnBWYWxQaWVbZ3JwTm1lXSA9IFZhbHNbaV07XHJcblxyXG4gICAgICBsZXQgdG90QW10ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLmZpbmFsR3JwVmFsUGllW2dycE5tZV0ucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuc2FsX2Ftb3VudGludCksIDApKTtcclxuXHJcbiAgICAgIGxldCBieXJPYmogPSB7fTtcclxuICAgICAgYnlyT2JqWydrJ10gPSBncnBObWU7XHJcbiAgICAgIGJ5ck9ialsndiddID0gcGFyc2VGbG9hdCh0b3RBbXQpOy8vdGhpcy5ieXJ2YWxHcnBbZ3JwTm1lXS5sZW5ndGg7XHJcbiAgICAgIHRoaXMuYnlydmFsR3JwLnB1c2goYnlyT2JqKTtcclxuICAgICAgYnlyT2JqID0ge307XHJcbiAgICAgIC8vIHRoaXMuYnlydmFsR3JwW2dycE5tZV0gPSB0b3RBbXQ7XHJcblxyXG4gICAgICBsZXQgcXR5T2JqID0ge307XHJcbiAgICAgIHF0eU9ialsnayddID0gZ3JwTm1lO1xyXG4gICAgICBxdHlPYmpbJ3YnXSA9IHRoaXMuZmluYWxHcnBWYWxQaWVbZ3JwTm1lXS5sZW5ndGg7XHJcbiAgICAgIHRoaXMuZ3JwV2lzZVF0eS5wdXNoKHF0eU9iaik7XHJcbiAgICAgIHF0eU9iaiA9IHt9O1xyXG5cclxuICAgICAgLy8gdGhpcy5ncnBXaXNlUXR5W2dycE5tZV0gPSB0aGlzLmZpbmFsR3JwVmFsUGllW2dycE5tZV0ubGVuZ3RoO1xyXG5cclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKHRoaXMuZ3JwV2lzZVF0eSk7XHJcblxyXG4gICAgaWYgKENoYXJ0VHlwZSA9PSAncXR5Jykge1xyXG4gICAgICB0aGlzLmRyYXdQaWUodGhpcy5ncnBXaXNlUXR5LCBDaGFydFR5cGUsIERhdGF0eXBlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmRyYXdQaWUodGhpcy5ieXJ2YWxHcnAsIENoYXJ0VHlwZSwgRGF0YXR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoaXMuZ2V0VG90YWxQaWUoKTtcclxuICAgIC8vIHRoaXMuZ3JwUGllLnNvcnQoKTtcclxuXHJcbiAgfVxyXG5cclxuICBkeW5hbWljQ29sb3JzID0gW107XHJcbiAgZ2VuZXJhdGUoKSB7XHJcbiAgICB0aGlzLmR5bmFtaWNDb2xvcnMgPSBbXTtcclxuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNzsgaSsrKSB7XHJcbiAgICAgIC8vIHRoaXMuTGlnaHRlbkRhcmtlbkNvbG9yKFwiN2NiNWVjXCIsIGkgKiAxMCk7XHJcbiAgICAgIGxldCBjb2wgPSAnYzZlODk2JztcclxuICAgICAgbGV0IGFtdCA9IChpICogMjApICogLTE7XHJcbiAgICAgIHZhciB1c2VQb3VuZCA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKGNvbFswXSA9PSBcIiNcIikge1xyXG4gICAgICAgIGNvbCA9IGNvbC5zbGljZSgxKTtcclxuICAgICAgICB1c2VQb3VuZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBudW0gPSBwYXJzZUludChjb2wsIDE2KTtcclxuXHJcbiAgICAgIHZhciByID0gKG51bSA+PiAxNikgKyBhbXQ7XHJcblxyXG4gICAgICBpZiAociA+IDI1NSkgciA9IDI1NTtcclxuICAgICAgZWxzZSBpZiAociA8IDApIHIgPSAwO1xyXG5cclxuICAgICAgdmFyIGIgPSAoKG51bSA+PiA4KSAmIDB4MDBGRikgKyBhbXQ7XHJcblxyXG4gICAgICBpZiAoYiA+IDI1NSkgYiA9IDI1NTtcclxuICAgICAgZWxzZSBpZiAoYiA8IDApIGIgPSAwO1xyXG5cclxuICAgICAgdmFyIGcgPSAobnVtICYgMHgwMDAwRkYpICsgYW10O1xyXG5cclxuICAgICAgaWYgKGcgPiAyNTUpIGcgPSAyNTU7XHJcbiAgICAgIGVsc2UgaWYgKGcgPCAwKSBnID0gMDtcclxuXHJcbiAgICAgIC8vIHJldHVybiAodXNlUG91bmQgPyBcIiNcIiA6IFwiXCIpICsgKGcgfCAoYiA8PCA4KSB8IChyIDw8IDE2KSkudG9TdHJpbmcoMTYpO1xyXG4gICAgICB0aGlzLmR5bmFtaWNDb2xvcnMucHVzaCgodXNlUG91bmQgPyBcIiNcIiA6IFwiI1wiKSArIChnIHwgKGIgPDwgOCkgfCAociA8PCAxNikpLnRvU3RyaW5nKDE2KSk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmR5bmFtaWNDb2xvcnMpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmR5bmFtaWNDb2xvcnM7XHJcbiAgfVxyXG4gIGJ5clZhbEFyciA9IFtdO1xyXG4gIGdldFRvdGFsUGllKCkge1xyXG4gICAgbGV0IGluZGV4VmFsID0gMDtcclxuICAgIGxldCBBbXRBcnIgPSBbXTtcclxuICAgIHRoaXMuR3JwVmFsc1BpZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBsZXQgYnlyd2lzZVZhbCA9IHt9O1xyXG4gICAgICBsZXQgdG90QW10ID0gMDtcclxuICAgICAgbGV0IHRvdHdlaWdodCA9IDA7XHJcbiAgICAgIHRvdHdlaWdodCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoZWxlbWVudC5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5jcnR3dCksIDApKTtcclxuICAgICAgdG90QW10ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChlbGVtZW50LnJlZHVjZSgoYSwgYikgPT4gK2EgKyArcGFyc2VGbG9hdChiLnNhbF9hbW91bnRpbnQpLCAwKSk7XHJcbiAgICAgIEFtdEFyci5wdXNoKHRvdEFtdCk7XHJcbiAgICAgIHZhciBrZXkgPSB0aGlzLmdycFtpbmRleFZhbF07XHJcbiAgICAgIC8vIHRoaXMuc3VtbWFyeUR0bFtrZXkgKyBcIl9RVFlcIl0gPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHF0eSk7XHJcbiAgICAgIHRoaXMuc3VtbWFyeUR0bFBpZVtrZXkgKyBcIl9DVFNcIl0gPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdHdlaWdodCk7XHJcbiAgICAgIHRoaXMuc3VtbWFyeUR0bFBpZVtrZXkgKyBcIl9BTVRcIl0gPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdEFtdCk7XHJcblxyXG4gICAgICBpbmRleFZhbCsrO1xyXG5cclxuICAgICAgaWYgKGluZGV4VmFsID09IDEpIHtcclxuICAgICAgICBieXJ3aXNlVmFsW3RoaXMuZ3JwW2luZGV4VmFsXV0gPSB0b3RBbXQ7XHJcbiAgICAgICAgdGhpcy5ieXJWYWxBcnIucHVzaChieXJ3aXNlVmFsKTtcclxuICAgICAgICBieXJ3aXNlVmFsID0ge307XHJcbiAgICAgIH1cclxuICAgICAgLy8gY29uc29sZS5sb2cocXMpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhhbW91bnQpO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKHRoaXMuYnlyVmFsQXJyKTtcclxuXHJcbiAgICBBbXRBcnIgPSBBbXRBcnIubWFwKGZ1bmN0aW9uICh4KSB7XHJcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgQW10QXJyLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgLSBiOyB9KTtcclxuICAgIGNvbnNvbGUubG9nKEFtdEFycik7XHJcbiAgICBBbXRBcnIucmV2ZXJzZSgpO1xyXG5cclxuICAgIC8vIHRoaXMuZHJhd1BpZShBbXRBcnIpO1xyXG5cclxuICB9XHJcbiAgLy8gcHVibGljIHBpZUNoYXJ0UGx1Z2lucyA9IFtwbHVnaW5EYXRhTGFiZWxzXTtcclxuICBkb3VnaG51dENoYXJ0VHlwZSA9ICdwaWUnO1xyXG4gIGRvdWdobnV0Q2hhcnRMYWJlbHMgPSBbXTtcclxuICBkb3VnaG51dENoYXJ0RGF0YSA9IFtdO1xyXG4gIHBpZUNoYXJ0Q29sb3JzID0gW107XHJcbiAgcGllQ2hhcnRMZWdlbmQgPSB0cnVlO1xyXG5cclxuXHJcbiAgcHVibGljIGNoYXJ0Q29sb3JzOiBhbnlbXSA9IFtcclxuICAgIHtcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmdlbmVyYXRlKCksXHJcbiAgICAgIGZpbGxDb2xvcjogdGhpcy5nZW5lcmF0ZSgpLFxyXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5nZW5lcmF0ZSgpXHJcbiAgICAgIC8vW1wiIzAwMDA4MFwiLCBcIiMwMDIwQzJcIiwgXCIjMTU2OUM3XCIsIFwiIzM1N0VDN1wiLCBcIiMzNjhCQzFcIixcIjY1OUVDN1wiXSBcclxuICAgIH1dO1xyXG4gIGxhYmVscyA9IHtcclxuICAgIGxhYmVsczoge1xyXG4gICAgICByZW5kZXI6ICdwZXJjZW50YWdlJyxcclxuICAgICAgLy8gwqDCoMKgwqBmb250Q29sb3I6IFsnZ3JlZW4nLCAnd2hpdGUnLCAncmVkJ10sXHJcbiAgICAgIHByZWNpc2lvbjogMlxyXG4gICAgfVxyXG4gIH1cclxuICBjaGFydE9wdGlvbnMgPSB7XHJcbiAgICBwbHVnaW5zOiB7XHJcbiAgICAgIGxhYmVsczoge1xyXG4gICAgICAgIHJlbmRlcjogJ3BlcmNlbnRhZ2UnLFxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgbGVnZW5kOiB7XHJcbiAgICAgIHBvc2l0aW9uOiAncmlnaHQnLFxyXG4gICAgICBsYWJlbHM6IHtcclxuICAgICAgICBmb250Q29sb3I6ICdibGFjaycsXHJcbiAgICAgICAgYm94V2lkdGg6IDEwLFxyXG4gICAgICAgIHBhZGRpbmc6IDEwLFxyXG4gICAgICAgIGZvbnRTaXplOiAxMCxcclxuICAgICAgICByZW5kZXI6ICdwZXJjZW50YWdlJyxcclxuXHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG5cclxuXHJcbiAgfVxyXG4gIHBpZUNoYXJ0T3B0aW9ucyA9IHtcclxuICAgIC8vbGVnZW5kOiB7cG9zaXRpb246ICdsZWZ0Jyxmb250Q29sb3I6J3doaXRlJ30sXHJcbiAgICAvL3BsdWdpbnM6IHtsYWJlbHM6IHsgcmVuZGVyOiAncGVyY2VudGFnZScscG9zaXRpb246ICdib3JkZXInLCB0ZXh0TWFyZ2luOiA0fX1cclxuXHJcbiAgICBsZWdlbmQ6IHtcclxuICAgICAgcG9zaXRpb246ICdyaWdodCcsXHJcbiAgICAgIGxhYmVsczoge1xyXG4gICAgICAgIGZvbnRDb2xvcjogJ2JsYWNrJyxcclxuICAgICAgICBib3hXaWR0aDogMTAsXHJcbiAgICAgICAgcGFkZGluZzogMTAsXHJcbiAgICAgICAgZm9udFNpemU6IDEwLFxyXG4gICAgICAgIHJlbmRlcjogJ3BlcmNlbnRhZ2UnXHJcbiAgICAgIH1cclxuXHJcbiAgICB9LFxyXG4gICAgcGx1Z2luczoge1xyXG4gICAgICBkYXRhbGFiZWxzOiB7XHJcbiAgICAgICAgZm9ybWF0dGVyOiAodmFsdWUsIGN0eCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbGFiZWwgPSBjdHguY2hhcnQuZGF0YS5sYWJlbHNbY3R4LmRhdGFJbmRleF07XHJcbiAgICAgICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH1cclxuICB9O1xyXG4gIHBpZSA9IHtcclxuICAgIGxlZ2VuZDogeyBwb3NpdGlvbjogJ2xlZnQnLCBmb250Q29sb3I6ICd3aGl0ZScgfSxcclxuICAgIHBsdWdpbnM6IHtcclxuICAgICAgbGFiZWxzOiB7XHJcbiAgICAgICAgLy8gcmVuZGVyICdsYWJlbCcsICd2YWx1ZScsICdwZXJjZW50YWdlJywgJ2ltYWdlJyBvciBjdXN0b20gZnVuY3Rpb24sIGRlZmF1bHQgaXMgJ3BlcmNlbnRhZ2UnXHJcbiAgICAgICAgcmVuZGVyOiAncGVyY2VudGFnZScsXHJcbiAgICAgICAgcHJlY2lzaW9uOiAwLFxyXG4gICAgICAgIGFyYzogdHJ1ZSxcclxuICAgICAgICBzaG93QWN0dWFsUGVyY2VudGFnZXM6IHRydWUsXHJcbiAgICAgICAgcG9zaXRpb246ICdvdXRzaWRlJ1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgdG9vbHRpcHM6IHtcclxuICAgICAgbW9kZTogJ2xhYmVsJyxcclxuICAgICAgY2FsbGJhY2tzOiB7XHJcbiAgICAgICAgbGFiZWw6IGZ1bmN0aW9uICh0b29sdGlwSXRlbSwgZGF0YSkge1xyXG4gICAgICAgICAgLy8gIGxldCBsYWJlbCA9IGRhdGEuZGF0YXNldHNbdG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4XS5sYWJlbDtcclxuICAgICAgICAgIC8vICBsZXQgdmFsdWUgPSBkYXRhLmRhdGFzZXRzW3Rvb2x0aXBJdGVtLmRhdGFzZXRJbmRleF0uZGF0YVt0b29sdGlwSXRlbS5pbmRleF07XHJcbiAgICAgICAgICByZXR1cm4gW2RhdGEubGFiZWxzW3Rvb2x0aXBJdGVtLmluZGV4XVxyXG4gICAgICAgICAgXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgZHJhd1BpZShzYWxlc0RhdGEsIHR5cGUsIENoYXJ0VHlwZSkge1xyXG4gICAgdGhpcy5kb3VnaG51dENoYXJ0RGF0YSA9IFtdO1xyXG4gICAgdGhpcy5kb3VnaG51dENoYXJ0TGFiZWxzID0gW107XHJcblxyXG4gICAgbGV0IEFtdEFyciA9IHNhbGVzRGF0YS5zb3J0KChhLCBiKSA9PiAoYS52ID4gYi52KSA/IDEgOiAtMSkucmV2ZXJzZSgpO1xyXG5cclxuXHJcbiAgICBpZiAoQ2hhcnRUeXBlID09IFwiYnV5ZXJcIikge1xyXG4gICAgICB0aGlzLmRvdWdobnV0Q2hhcnREYXRhID0gQW10QXJyLnNsaWNlKDAsIDUpLm1hcChhID0+IGEudik7XHJcbiAgICAgIHRoaXMuZG91Z2hudXRDaGFydExhYmVscyA9IEFtdEFyci5zbGljZSgwLCA1KS5tYXAoYSA9PiBhLmspO1xyXG4gICAgICBsZXQgc3VtcyA9IDA7XHJcbiAgICAgIGxldCBvdGhlclN1bSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5zdHRXaXNlU3VtbWFyeS5nZXQoJ3NvbGQnKS5nZXQoJ3JhdGUnKSk7XHJcbiAgICAgIGlmICh0eXBlID09ICdxdHknKVxyXG4gICAgICAgIG90aGVyU3VtID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnN0dFdpc2VTdW1tYXJ5LmdldCgnc29sZCcpLmdldCgnY291bnQnKSk7XHJcblxyXG4gICAgICBsZXQgdEFyciA9IFtdO1xyXG4gICAgICB0QXJyID0gQW10QXJyLnNsaWNlKDAsIDUpLm1hcChmdW5jdGlvbiAoeCkge1xyXG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHgudik7XHJcbiAgICAgIH0pO1xyXG4gICAgICBzdW1zID0gXy5zdW1CeSh0QXJyKTtcclxuICAgICAgbGV0IG1heGluQXJyID0gTWF0aC5tYXgoTWF0aC5tYXgoLi4udGhpcy5kb3VnaG51dENoYXJ0RGF0YSkpO1xyXG4gICAgICBkZWJ1Z2dlclxyXG4gICAgICBsZXQgb3RoZXJ2YWwgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKG90aGVyU3VtIC0gc3VtcykgfHwgMDtcclxuICAgICAgaWYgKG1heGluQXJyID4gb3RoZXJ2YWwpIHtcclxuICAgICAgICB0aGlzLmRvdWdobnV0Q2hhcnREYXRhLnB1c2gob3RoZXJ2YWwpO1xyXG4gICAgICAgIHRoaXMuZG91Z2hudXRDaGFydExhYmVscy5wdXNoKCdPdGhlcicpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZG91Z2hudXRDaGFydERhdGEudW5zaGlmdChvdGhlcnZhbCk7XHJcbiAgICAgICAgdGhpcy5kb3VnaG51dENoYXJ0TGFiZWxzLnVuc2hpZnQoJ090aGVyJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5kb3VnaG51dENoYXJ0RGF0YSA9IEFtdEFyci5tYXAoYSA9PiBhLnYpO1xyXG4gICAgICB0aGlzLmRvdWdobnV0Q2hhcnRMYWJlbHMgPSBBbXRBcnIubWFwKGEgPT4gYS5rKTtcclxuICAgICAgY29uc29sZS5sb2coXCJ0aGlzLmRvdWdobnV0Q2hhcnREYXRhXCIsIHRoaXMuZG91Z2hudXRDaGFydERhdGEpO1xyXG4gICAgICBsZXQgc3VtcyA9IDA7XHJcbiAgICAgIGxldCBvdGhlclN1bSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5zdHRXaXNlU3VtbWFyeS5nZXQoJ3NvbGQnKS5nZXQoJ3JhdGUnKSk7XHJcbiAgICAgIHN1bXMgPSBfLnN1bUJ5KE9iamVjdC52YWx1ZXMoQW10QXJyKSwgJ3YnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGlzLmRvdWdobnV0Q2hhcnREYXRhLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgLSBiOyB9KTtcclxuICAgIC8vIHRoaXMuZG91Z2hudXRDaGFydERhdGEgPSB0aGlzLmRvdWdobnV0Q2hhcnREYXRhLnJldmVyc2UoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZG91Z2hudXRDaGFydExhYmVscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLmRvdWdobnV0Q2hhcnRMYWJlbHNbaV0gPSB0aGlzLmRvdWdobnV0Q2hhcnRMYWJlbHNbaV0gKyBcIiBcIiArIHRoaXMuZG91Z2hudXRDaGFydERhdGFbaV0udG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmRvdWdobnV0Q2hhcnRMYWJlbHMpO1xyXG4gICAgdGhpcy5yZWZyZXNoQ2hhcnQoQ2hhcnRUeXBlKTtcclxuICAgIHRoaXMuZG91Z2hudXRDaGFydFR5cGUgPSAncGllJztcclxuICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaWVjaGFydE1vZGVsQnRuJykuY2xpY2soKTtcclxuICAgIC8vIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuXHJcbiAgfVxyXG5cclxuICByZWZyZXNoQ2hhcnQoQ2hhcnRUeXBlKSB7XHJcbiAgICB0aGlzLmlzQnV5ZXJ3aXNlID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzR3Jwd2lzZSA9IGZhbHNlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChDaGFydFR5cGUgPT0gXCJidXllclwiKSB7XHJcbiAgICAgICAgdGhpcy5pc0J1eWVyd2lzZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0dycHdpc2UgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSwgMSk7XHJcbiAgfVxyXG5cclxuICBzb3J0Qnkoa2V5LCBnKSB7XHJcbiAgICB0aGlzLnNvcnRlZCA9IHRoaXMuc29ydGVkID09ICdkZXNjJyA/ICdhc2MnIDogJ2Rlc2MnO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5zb3J0ZWQpO1xyXG4gICAgbGV0IHNydGVkID0gXy5vcmRlckJ5KHRoaXMuZmluYWxHcnBWYWxbZ10sIGtleSwgW3RoaXMuc29ydGVkXSk7XHJcbiAgICB0aGlzLmZpbmFsR3JwVmFsW2ddID0gc3J0ZWQ7XHJcbiAgICB0aGlzLnNvcnRPbiA9IGc7XHJcbiAgICB0aGlzLmNsbW4gPSBrZXk7XHJcbiAgfVxyXG4gIGV4cG9ydFRvQ1NWKEZpbGVOYW1lKSB7XHJcbiAgICBsZXQgZCA9IHRoaXMuY3MuY0RhdGUsXHJcbiAgICAgIG1vbnRoID0gJycgKyAoZC5nZXRNb250aCgpICsgMSksXHJcbiAgICAgIGRheSA9ICcnICsgZC5nZXREYXRlKCksXHJcbiAgICAgIHllYXIgPSBkLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBsZXQgZHQgPSBbZGF5LCBtb250aCwgeWVhcl0uam9pbignLScpO1xyXG4gICAgbGV0IGZpbGVObWUgPSBGaWxlTmFtZSArICdfXycgKyBkdDtcclxuICAgIHRoaXMuaGVhZGVyS2V5ID0gW1wiZHNwX3N0dFwiLCAuLi50aGlzLmhlYWRlcktleV07XHJcbiAgICBsZXQgbW9kaWZpZWRPYmpBcnIgPSB0aGlzLmNzLm1vZGlmeURhdGFCeUhlYWRlcih0aGlzLnBrdHMsIHRoaXMuaGVhZGVyS2V5LCB0aGlzLmhlYWRlcik7XHJcbiAgICB0aGlzLmNzLkNTVkNvbnZlcnRvcihtb2RpZmllZE9iakFyciwgZmlsZU5tZSwgdHJ1ZSk7XHJcbiAgfVxyXG4gIGdldFN1bW1hcnkocCkge1xyXG4gICAgbGV0IHN1bW1hcnk7XHJcbiAgICBwLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIC8vIGxldCBzdHQgPSAnJztcclxuICAgICAgLy8gaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnc29sZCcpIHtcclxuICAgICAgLy8gICBzdHQgPSAnU29sZCc7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gZWxzZSBpZiAoZWxlbWVudC5ncnBfc3R0ID09ICdta3QnKSB7XHJcbiAgICAgIC8vICAgc3R0ID0gJ01hcmtldGluZyc7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gZWxzZSBpZiAoZWxlbWVudC5ncnBfc3R0ID09ICdsYWInKSB7XHJcbiAgICAgIC8vICAgc3R0ID0gJ0xhYic7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAvLyAgIHN0dCA9IGVsZW1lbnQuZ3JwX3N0dDtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgLy8gc3VtbWFyeSA9IHRoaXMuc3R0V2lzZVN1bW1hcnkuZ2V0KGVsZW1lbnQuZ3JwX3N0dCk7XHJcbiAgICAgIHN1bW1hcnkgPSB0aGlzLnN0dFdpc2VTdW1tYXJ5LmdldChlbGVtZW50LmdycF9zdHQpOy8vc3R0XHJcblxyXG4gICAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgICBsZXQgZ3JpZFd0ID0gMDtcclxuICAgICAgbGV0IGdyaWRhdmcgPSAwO1xyXG4gICAgICBsZXQgZGlzYyA9IDA7XHJcbiAgICAgIGxldCBncmlkUmF0ZSA9IDA7XHJcbiAgICAgIGxldCB0b3RBbXQgPSAwO1xyXG4gICAgICBsZXQgZ3JpZFJhcCA9IDA7XHJcblxyXG4gICAgICAvLyB0aGlzLnRvdEF2ZyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwocGFyc2VGbG9hdCh0b3RBbXQpIC8gcGFyc2VGbG9hdCh0b3R3ZWlnaHQpKTtcclxuICAgICAgLy8gdGhpcy50b3REaXMgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKCgocGFyc2VGbG9hdCh0b3RBbXQpICogMTAwKSAvIHBhcnNlRmxvYXQodG90cmFwVmFsKSkgLSAxMDApO1xyXG5cclxuXHJcbiAgICAgIGxldCB3dCA9IHBhcnNlRmxvYXQoZWxlbWVudC5jcnR3dCk7XHJcbiAgICAgIGxldCByYXRlID0gMDtcclxuICAgICAgbGV0IHJhcHZhbCA9IHBhcnNlRmxvYXQoZWxlbWVudC5yYXBfdmx1KTtcclxuICAgICAgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnc29sZCcpIHtcclxuICAgICAgICByYXRlID0gcGFyc2VGbG9hdCgoZWxlbWVudC5zYWxfcnRlID09IHVuZGVmaW5lZCB8fCBlbGVtZW50LnNhbF9ydGUgPT0gXCJcIikgPyBlbGVtZW50LnJ0ZSA6IGVsZW1lbnQuc2FsX3J0ZSkgKiBwYXJzZUZsb2F0KGVsZW1lbnQuY3J0d3QpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJhdGUgPSBwYXJzZUZsb2F0KGVsZW1lbnQucnRlKSAqIHBhcnNlRmxvYXQoZWxlbWVudC5jcnR3dCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdW1tYXJ5ICE9IG51bGwpIHtcclxuICAgICAgICBjb3VudCA9IHBhcnNlSW50KHN1bW1hcnkuZ2V0KCdjb3VudCcpKTtcclxuICAgICAgICBncmlkV3QgPSBwYXJzZUZsb2F0KHN1bW1hcnkuZ2V0KCd3dCcpKTtcclxuICAgICAgICBncmlkUmF0ZSA9IHBhcnNlRmxvYXQoc3VtbWFyeS5nZXQoJ3JhdGUnKSk7XHJcbiAgICAgICAgZ3JpZFJhcCA9IHBhcnNlRmxvYXQoc3VtbWFyeS5nZXQoJ3JhcCcpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzdW1tYXJ5ID0gbmV3IE1hcCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHN1bW1hcnkuc2V0KCdjb3VudCcsIGNvdW50ICsgMSk7XHJcbiAgICAgIHN1bW1hcnkuc2V0KCd3dCcsIGdyaWRXdCArIHd0KTtcclxuICAgICAgc3VtbWFyeS5zZXQoJ3JhdGUnLCBncmlkUmF0ZSArIHJhdGUpO1xyXG4gICAgICBzdW1tYXJ5LnNldCgncmFwJywgZ3JpZFJhcCArIHJhcHZhbCk7XHJcblxyXG4gICAgICAvLyB0aGlzLnN0dFdpc2VTdW1tYXJ5LnNldChlbGVtZW50LmdycF9zdHQgPT0gJ3NvbGQnID8gJ1NvbGQnIDogZWxlbWVudC5ncnBfc3R0LCBzdW1tYXJ5KTtcclxuICAgICAgdGhpcy5zdHRXaXNlU3VtbWFyeS5zZXQoZWxlbWVudC5ncnBfc3R0LCBzdW1tYXJ5KTsvL3N0dFxyXG5cclxuICAgIH0pO1xyXG4gICAgY29uc29sZS5sb2coJ0BwcmVzdW06JywgdGhpcy5zdHRXaXNlU3VtbWFyeSk7XHJcblxyXG4gICAgdGhpcy5hbmFBbGxHcnBTdHQuZm9yRWFjaChlbGUgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhlbGUpO1xyXG4gICAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgICBsZXQgZ3JpZFd0ID0gMDtcclxuICAgICAgbGV0IGdyaWRhdmcgPSAwO1xyXG4gICAgICBsZXQgZGlzYyA9IDA7XHJcbiAgICAgIGxldCBncmlkUmF0ZSA9IDA7XHJcbiAgICAgIGxldCB0b3RBbXQgPSAwO1xyXG4gICAgICBsZXQgcmFwID0gMDtcclxuICAgICAgbGV0IGdyaWRSYXAgPSAwO1xyXG5cclxuXHJcbiAgICAgIC8vaWYgKGVsZSA9PSAnTWFya2V0aW5nJyB8fCBlbGUgPT0gJ1NvbGQnKSB7XHJcbiAgICAgIC8vIGVsZSA9IChlbGUgPT0gJ01hcmtldGluZycgfHwgZWxlID09ICdTb2xkJykgPyBlbGUgOiBlbGUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgbGV0IHN1bW1hcnkgPSB0aGlzLnN0dFdpc2VTdW1tYXJ5LmdldChlbGUpIHx8IG5ldyBNYXAoKTtcclxuXHJcbiAgICAgIGNvdW50ID0gcGFyc2VJbnQoc3VtbWFyeS5nZXQoJ2NvdW50JykpIHx8IDA7XHJcbiAgICAgIGdyaWRXdCA9IHBhcnNlRmxvYXQoc3VtbWFyeS5nZXQoJ3d0JykpIHx8IDAuMDA7XHJcbiAgICAgIGdyaWRSYXRlID0gcGFyc2VGbG9hdChzdW1tYXJ5LmdldCgncmF0ZScpKSB8fCAwO1xyXG4gICAgICBncmlkUmFwID0gcGFyc2VGbG9hdChzdW1tYXJ5LmdldCgncmFwJykpIHx8IDE7XHJcblxyXG4gICAgICBkaXNjID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKGdyaWRSYXRlICogMTAwKSAvIGdyaWRSYXApIC0gMTAwKTtcclxuXHJcbiAgICAgIGdyaWRhdmcgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKGdyaWRSYXRlIC8gZ3JpZFd0KTtcclxuXHJcbiAgICAgIHN1bW1hcnkuc2V0KCdkaXNjJywgZGlzYyk7XHJcbiAgICAgIHN1bW1hcnkuc2V0KCdhdmcnLCBncmlkYXZnKTtcclxuXHJcbiAgICAgIHRoaXMuc3R0V2lzZVN1bW1hcnkuc2V0KGVsZSwgc3VtbWFyeSk7XHJcbiAgICAgIC8vfVxyXG5cclxuICAgIH0pXHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLnN0dFdpc2VTdW1tYXJ5KTtcclxuXHJcbiAgfVxyXG5cclxuICBUb3RBdmdPYmogPSB7fTtcclxuICBnZXRUb3RhbHMoZmllbGRzLCBwa3RzKSB7XHJcbiAgICBkZWJ1Z2dlclxyXG4gICAgZmllbGRzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGRlYnVnZ2VyXHJcbiAgICAgIGxldCB0YXZnID0gMDtcclxuICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgaWYgKGVsZW1lbnQudHJpbSgpID09ICdhZ2UnKSB7XHJcbiAgICAgICAgdG90YWwgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHBrdHMucmVkdWNlKChhLCBiKSA9PiArYSArICtiLmFnZSwgMCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRvdGFsID0gXy5zdW1CeShwa3RzLCBpdGVtID0+IE51bWJlcihpdGVtW2VsZW1lbnQudHJpbSgpXSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgemVyb1ZhbHMgPSBwa3RzLmZpbHRlcih4ID0+ICh4W2VsZW1lbnQudHJpbSgpXSA9PT0gXCIwXCIgfHwgMCkpLmxlbmd0aDtcclxuICAgICAgaWYgKGVsZW1lbnQudHJpbSgpICE9ICdhZ2UnKSB7XHJcbiAgICAgICAgdGF2ZyA9IHRvdGFsIC8gXy5zdW1CeShwa3RzLCBpdGVtID0+IE51bWJlcihpdGVtWydjcnR3dCddKSk7XHJcbiAgICAgICAgdGF2ZyA9IHRoaXMuY3MubnVtYmVydG9maXhlZCh0YXZnLCAyKVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRhdmcgPSB0b3RhbCAvIHBrdHMubGVuZ3RoO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuVG90QXZnT2JqW2VsZW1lbnQudHJpbSgpXSA9IHRhdmc7XHJcbiAgICB9KTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuVG90QXZnT2JqKTtcclxuICB9XHJcblxyXG4gIGdldFRvdGFsc1R0bChmaWVsZHMsIHBrdHMpIHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICBmaWVsZHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgZGVidWdnZXJcclxuICAgICAgbGV0IHRvdGFsID0gMDtcclxuXHJcbiAgICAgIHRvdGFsID0gXy5zdW1CeShwa3RzLCBpdGVtID0+IE51bWJlcihpdGVtW2VsZW1lbnQudHJpbSgpXSkpO1xyXG5cclxuICAgICAgdGhpcy5Ub3RBdmdPYmpbZWxlbWVudC50cmltKCldID0gdGhpcy5jcy5udW1iZXJ0b2ZpeGVkKHRvdGFsLCAyKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBtb2RpZnlTZWFyY2goKSB7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnQkljYWxsJywgJ0JJbW9kaWZ5Jyk7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5tb2R1bGVuYW1lICsgJy9hbmFseXNpcy1zZWFyY2gvJyArIHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm1ubWUnXV0pO1xyXG4gIH1cclxuICBhbmFTdHRMYmwgPSBbXTtcclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vIHRoaXMuTGlnaHRlbkRhcmtlbkNvbG9yKFwiN2NiNWVjXCIsIDEwKTtcclxuICAgIGxldCBtZGxrID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWRsS2V5JykpO1xyXG4gICAgdGhpcy5jT2JqID0ge307XHJcbiAgICB0aGlzLmNVcmwgPSB0aGlzLnJvdXRlci51cmw7XHJcblxyXG4gICAgdGhpcy5yZXFoZWFkZXIgPSB7XHJcbiAgICAgICdjbGllbnRrZXknOiBDb29raWUuZ2V0KCdfY2snKSxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ21vZHVsZWtleSc6IG1kbGtbdGhpcy5jVXJsLnNwbGl0KCcvJylbMV1dLFxyXG4gICAgICAnbG9naW5pZCc6IENvb2tpZS5nZXQoJ19sb2dpZCcpLFxyXG4gICAgICAnc291cmNlJzogJ3FzJ1xyXG4gICAgfTtcclxuICAgIHRoaXMudmlld2Rpc1R5cGUgPSBcImdyb3VwXCI7XHJcbiAgICB0aGlzLm5ld3dpbmRvdyA9IFwiWUVTXCI7XHJcbiAgICB0aGlzLmdycCA9IFtdO1xyXG4gICAgdGhpcy5sb2FkUmVzdWx0ID0gW107XHJcbiAgICB0aGlzLnN0YXJ0SW5kZXggPSAwO1xyXG4gICAgdGhpcy5lbmRJbmRleCA9IDMwO1xyXG4gICAgdGhpcy5jVXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgdGhpcy5tb2R1bGVuYW1lID0gdGhpcy5jVXJsLnNwbGl0KCcvJylbMV07XHJcbiAgICB0aGlzLmNrID0gZW5jb2RlVVJJQ29tcG9uZW50KENvb2tpZS5nZXQoJ19jaycpKTtcclxuICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZShtYXAgPT4ge1xyXG4gICAgICB0aGlzLmxvYWREZWZpbmF0aW9uKCk7XHJcbiAgICAgIGxldCB2aWV3VHlwZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd2aWV3VHlwZScpO1xyXG4gICAgICBsZXQgYW5hQXJyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQklhbmFTdHQnKSk7XHJcbiAgICAgIGxldCBhbmFzdHRMYmwgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdCSWFuYVN0dExCTCcpKTtcclxuICAgICAgaWYgKGFuYUFyciAhPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5hbmFBbGxHcnBTdHQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdCSWFuYVN0dCcpKTtcclxuICAgICAgICB0aGlzLmFuYVN0dExibCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJYW5hU3R0TEJMJykpO1xyXG4gICAgICAgIHRoaXMuYW5hQWxsR3JwU3R0LmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN0T2JqW2VsZW1lbnRdID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmlld1R5cGUgPT0gJ2xpc3RWaWV3Jykge1xyXG4gICAgICAgIHRoaXMuZ2V0U2VhcmNoUmVzdWx0KCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IHBrdHMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwa3REYXRhJykpO1xyXG4gICAgICAgIHRoaXMuaGVhZGVyS2V5ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVzdWx0VmlldycpKTtcclxuICAgICAgICB0aGlzLmhlYWRlciA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Jlc3VsdFZpZXdEdGwnKSk7XHJcbiAgICAgICAgdGhpcy5oZWFkZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZXN1bHRWaWV3RHRsJykpO1xyXG4gICAgICAgIGxldCBsZWdlbmRzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQklMZWdlbmRzJykpO1xyXG4gICAgICAgIGlmIChsZWdlbmRzICE9IG51bGwgJiYgbGVnZW5kcyAhPSB1bmRlZmluZWQgJiYgbGVnZW5kcyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICB0aGlzLmxlZ2VuZExpc3QgPSBsZWdlbmRzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBrdHMgPSBbLi4ucGt0c107XHJcblxyXG4gICAgICAgIHRoaXMudG90YWxXZWlnaHQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMucGt0cy5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5jcnR3dCksIDApKTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXRTdW1tYXJ5KHRoaXMucGt0cyk7XHJcblxyXG4gICAgICAgIC8vICBsZXQgdG90QW10ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnBrdHMucmVkdWNlKChhLCBiKSA9PiArYSArICtiLnNhbF9yZWNfcnRlICogcGFyc2VGbG9hdChiLmNydHd0KSwgMCkpO1xyXG4gICAgICAgIGxldCB0b3R3ZWlnaHQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMucGt0cy5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5jcnR3dCksIDApKTtcclxuICAgICAgICBsZXQgdG90cmFwVmFsID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnBrdHMucmVkdWNlKChhLCBiKSA9PiArYSArICtiLnJhcF92bHUsIDApKTtcclxuXHJcbiAgICAgICAgbGV0IHRvdEFtdCA9IDA7XHJcbiAgICAgICAgdGhpcy5wa3RzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICBpZiAoZWxlbWVudC5ncnBfc3R0ID09ICdzb2xkJykge1xyXG4gICAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydzYWxfcnRlJ10pICogcGFyc2VGbG9hdChlbGVtZW50WydjcnR3dCddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydydGUnXSkgKiBwYXJzZUZsb2F0KGVsZW1lbnRbJ2NydHd0J10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgICAgIHRoaXMudG90QXZnID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3RBbXQgLyBwYXJzZUZsb2F0KHRvdHdlaWdodCkpO1xyXG4gICAgICAgIHRoaXMudG90RGlzID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKHRvdEFtdCAqIDEwMCkgLyBwYXJzZUZsb2F0KHRvdHJhcFZhbCkpIC0gMTAwKTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMucmVzdWx0bGVuZ3RoID0gdGhpcy5wa3RzLmxlbmd0aDtcclxuICAgICAgICBpZiAodGhpcy5lbmRJbmRleCA+IHRoaXMucmVzdWx0bGVuZ3RoKVxyXG4gICAgICAgICAgdGhpcy5lbmRJbmRleCA9IHRoaXMucmVzdWx0bGVuZ3RoXHJcbiAgICAgICAgdGhpcy5hZGRJdGVtcygpO1xyXG5cclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICAgIGxldCBHUlBieSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJLVBLVF9HUk9VUF9CWScpKSB8fCAnJztcclxuICAgIHRoaXMuZ2V0U3RhdGljS1YoR1JQYnkpO1xyXG4gICAgLy8gIHRoaXMuY3JlYXRlR3JwKHRoaXMucGt0cywgdGhpcy5kZWZhdWx0R3JwTGlzdCk7XHJcbiAgICBsZXQgYXZnRmllbGRzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQkktZ3JpZEF2ZycpKSB8fCAnJztcclxuICAgIGlmIChhdmdGaWVsZHMgIT0gJycpXHJcbiAgICAgIHRoaXMuZ2V0VG90YWxzKGF2Z0ZpZWxkcywgdGhpcy5wa3RzKTtcclxuICB9XHJcbiAgZ2V0U3RhdGljS1YocXJ5KSB7XHJcbiAgICB0aGlzLnN0YXRpY0xvdiA9IFtdO1xyXG4gICAgbGV0IGFycmt2ID0gcXJ5LnNwbGl0KCcsJyk7XHJcbiAgICBsZXQgb2JqID0ge30sIHN0YXRpY0xvdiA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJrdi5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgICBsZXQga2V5ID0gYXJya3ZbaV0sIHZhbHVlID0gYXJya3ZbaSArIDFdO1xyXG4gICAgICBvYmpbJ2snXSA9IGtleTtcclxuICAgICAgb2JqWyd2J10gPSB2YWx1ZTtcclxuICAgICAgLy8gaWYgKGkgPT0gMCkge1xyXG4gICAgICAvLyAgIHFyeS5kZWZhdWx0X3ZhbHVlID0gdmFsdWU7Ly9rZXlcclxuICAgICAgLy8gfVxyXG4gICAgICB0aGlzLnN0YXRpY0xvdi5wdXNoKG9iaik7XHJcbiAgICAgIG9iaiA9IHt9O1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGF0aWNMb3YgPSB0aGlzLnN0YXRpY0xvdi5tYXAob3B0aW9uID0+ICh7XHJcbiAgICAgIHZhbHVlOiBvcHRpb24udixcclxuICAgICAgbGFiZWw6IG9wdGlvbi5rXHJcbiAgICB9KSk7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLnN0YXRpY0xvdik7XHJcbiAgfVxyXG5cclxuICBsb2FkRGVmaW5hdGlvbigpIHtcclxuXHJcbiAgICAvLyB0aGlzLl9zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm1ubWUnXTsvLydzZWFyY2hEdGxEc2NyRm9ybSc7XHJcbiAgICB0aGlzLnJlcWhlYWRlclsnbWV0aG9kJ10gPSAnbG9hZERlZmluYXRpb24nO1xyXG4gICAgLy8gbGV0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoeyBoZWFkZXJzOiB0aGlzLnJlcWhlYWRlciB9KTtcclxuICAgIGxldCBvcHRpb25zID0gbmV3IEh0dHBIZWFkZXJzKHsgaGVhZGVyczogdGhpcy5yZXFoZWFkZXIgfSk7XHJcbiAgICB0aGlzLmNzLmxvYWQocmVxT2JqLCBvcHRpb25zLCAnbWFya2V0aW5nL3NlYXJjaCcpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xyXG4gICAgICAgIHRoaXMucGFnZURlZmluYXRpb24gPSByZXN1bHQucGFnZURlZmluYXRpb24gfHwge307XHJcbiAgICAgICAgdGhpcy5saW5rcyA9IHRoaXMucGFnZURlZmluYXRpb24ubGluayB8fCBbXTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAvLyB0aGlzLl9mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KHJlc3BvbnNlLm1lc3NhZ2UsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgLy8gdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAvLyB0aGlzLl9mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KGVyci5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbiIsIjxkaXYgY2xhc3M9XCJtdFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZ1wiPlxyXG4gICAgICA8aDMgY2xhc3M9XCJwYW5lbC10aXRsZVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1sZWZ0IGNwXCIgKGNsaWNrKT1cImNzLnBhZ2VCY2soKTtcIj4gQmFjazwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDsgUGFja2V0IExpc3RcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImYtMTJcIj4oe3tjcy5jRGF0ZSB8IGRhdGU6ICdtZWRpdW0nfX0pPC9zcGFuPlxyXG4gICAgICA8L2gzPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZnJhbWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJpbm5lckRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZnJhbWUtbGVmdFwiICpuZ0lmPVwiZmFsc2VcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwgcGFuZWwtZGVmYXVsdFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cCBib3JkZXItYm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnIDppID09IGNMaW5rfVwiICpuZ0Zvcj1cImxldCBuYXYgb2YgbmF2aWdhdGlvbjtsZXQgaT1pbmRleFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGlvbkZ1bihuYXYsaSk7XCI+e3tuYXYuZm9ybV9maWVsZF90aXRsZX19IDwvYT5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1mcmFtZS1ib2R5XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDowXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHQgY3VzdG9tLXBhbmVsXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYm9keVwiIHN0eWxlPVwicGFkZGluZzowO1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mb1NlY1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxyXG4gICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cImZvcm0taW5saW5lIHB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24gdGV4dC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiZGlzcGxheVRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGg+U3RhdHVzPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aD5Db3VudDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGg+Q3RzPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aD5Bdmc8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiZm9ybW5hbWUhPSdtaXhBbmFseXNpc1JlcG9ydEZvcm0nXCI+RGlzYzwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGg+QW1vdW50PC90aD5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdCBvZiBhbmFBbGxHcnBTdHQ7bGV0IGkgPSBpbmRleDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGxhYmVsIGZvcj1cInt7c3R9fVwiIGNsYXNzPVwidGV4dC1jYXBpdGFsaXplXCI+UzwvbGFiZWw+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJkZWZhdWx0R3JwTGlzdC5sZW5ndGg9PTBcIiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJkZWZhdWx0R3JwTGlzdC5sZW5ndGg9PTBcIiB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInt7c3R9fVwiIHZhbHVlPVwie3tzdH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7e3N0fX1cIiBbKG5nTW9kZWwpXT1cInN0T2JqW3N0XVwiIFtjaGVja2VkXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzdGF0dXNXaXNlRGlzcGxheSgkZXZlbnQsc3RPYmopXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FuYVN0dExibFtpXXx8c3R9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFuYVN0dExibCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiB7e3N0dFdpc2VTdW1tYXJ5Py5nZXQoc3QpPy5nZXQoJ2NvdW50Jyl9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4ge3t0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHN0dFdpc2VTdW1tYXJ5Py5nZXQoc3QpPy5nZXQoJ3d0JykpfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IHt7dGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChzdHRXaXNlU3VtbWFyeT8uZ2V0KHN0KT8uZ2V0KCdhdmcnKSl9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImZvcm1uYW1lIT0nbWl4QW5hbHlzaXNSZXBvcnRGb3JtJ1wiPiB7e3RoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoc3R0V2lzZVN1bW1hcnk/LmdldChzdCk/LmdldCgnZGlzYycpKX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiB7e3RoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoc3R0V2lzZVN1bW1hcnk/LmdldChzdCk/LmdldCgncmF0ZScpKX19PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm1jb250cm9sXCIgbmFtZT1cInZpZXdkaXNUeXBlXCIgKGNoYW5nZSk9XCJvbkdycFNlbGVjdChkZWZhdWx0R3JwTGlzdClcIiBbKG5nTW9kZWwpXT1cInZpZXdkaXNUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImdyb3VwXCI+R3JvdXAgQnk8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic3VtbWFyeVwiPlN1bW1hcnkgQnk8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IHBsYWNlaG9sZGVyPVwiU2VsZWN0IEdyb3VwXCIgW29wdGlvbnNdPVwic3RhdGljTG92XCIgWyhuZ01vZGVsKV09XCJkZWZhdWx0R3JwTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwic3RhdHVzXCIgW211bHRpcGxlXT1cInRydWVcIiBbYWxsb3dDbGVhcl09XCJ0cnVlXCIgKHNlbGVjdGVkKT1cIm9uR3JwU2VsZWN0KGRlZmF1bHRHcnBMaXN0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoZGVzZWxlY3RlZCk9XCJvbkdycFNlbGVjdChkZWZhdWx0R3JwTGlzdClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3B0aW9uVGVtcGxhdGUgbGV0LW9wdGlvbj1cIm9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmFtZmFtZmFtLWZsYWdzIHt7b3B0aW9uPy52YWx1ZS50b0xvd2VyQ2FzZSgpfX1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24/LmxhYmVsfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgIDxiPkJ1eWVyIFBpZSBjaGFydDwvYj5cclxuICAgICAgICAgICAgICAgIDxpIHRpdGxlPVwiQnV5ZXIgd2lzZSBwaWUgY2hhcnRcIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtwYWRkaW5nOiA1cHg7bWFyZ2luLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtmb250LXNpemU6IDIwcHg7Y29sb3I6ICMzYTU4OTg7XCJcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmEgZmEtcGllLWNoYXJ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiXHJcbiAgICAgICAgICAgICAgICAgIGRhdGEtdGFyZ2V0PVwiI1BpZWNoYXJ0TW9kZWxcIiAoY2xpY2spPVwiZ2VuZXJhdGVQaWUoJ2J1eWVyJywndmFsdWUnKVwiPjwvaT5cclxuICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICA8cCAqbmdJZj1cImRlZmF1bHRHcnBMaXN0Lmxlbmd0aD4wXCI+XHJcbiAgICAgICAgICAgICAgICA8aSB0aXRsZT1cIkdyb3VwIHdpc2UgY2hhcnRcIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtwYWRkaW5nOiA1cHg7bWFyZ2luLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtmb250LXNpemU6IDIwcHg7Y29sb3I6ICMzYTU4OTg7XCJcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmEgZmEtcGllLWNoYXJ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiXHJcbiAgICAgICAgICAgICAgICAgIGRhdGEtdGFyZ2V0PVwiI1BpZWNoYXJ0TW9kZWxcIiAoY2xpY2spPVwiZ2VuZXJhdGVQaWUoJ2dyb3VwJywndmFsdWUnKVwiPjwvaT5cclxuICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY3VsXCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGxlZ2VuZCBvZiBsZWdlbmRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogbGVnZW5kLmsgLCdoZWlnaHQnOic5cHgnLCAnd2lkdGgnOic5cHgnLCAnbWFyZ2luJzogJzAnLCAnZGlzcGxheScgOiAnaW5saW5lLWJsb2NrJ31cIj5cclxuICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICB7e2xlZ2VuZC52fX1cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZSBwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXhhbXBsZUlucHV0TmFtZTJcIj5TZWFyY2ggJm5ic3A7Jm5ic3A7PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImV4YW1wbGVJbnB1dE5hbWUyXCIgbmFtZT1cInNjaHR4dFwiIFsobmdNb2RlbCldPVwic2VhcmNoRlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxNXB4IDRweCAyMHB4O21hcmdpbi1sZWZ0OiAxMHB4O2Zsb2F0OiByaWdodDtcIlxyXG4gICAgICAgICAgICAgICAgICBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiBkYXRhLXBsYWNlbWVudD1cImxlZnRcIiB0aXRsZT1cIkRvd25sb2FkIEV4Y2VsXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFRvQ1NWKCdQYWNrZXQgbGlzdCcpO1wiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiIHN0eWxlPVwiY29sb3I6Z3JlZW47XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDVweDtcIiAoY2xpY2spPVwibW9kaWZ5U2VhcmNoKClcIj5Nb2RpZnlcclxuICAgICAgICAgICAgICAgICAgU2VhcmNoPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImN1bFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBsZWdlbmQgb2YgbGVnZW5kTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cFxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6IGxlZ2VuZC5rICwnaGVpZ2h0JzonOXB4JywgJ3dpZHRoJzonOXB4JywgJ21hcmdpbic6ICcwJywgJ2Rpc3BsYXknIDogJ2lubGluZS1ibG9jayd9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAge3tsZWdlbmQudn19XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgIDwvdWw+IFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmlld2Rpc1R5cGU9PSdncm91cCdcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ3JvdXBCeXBrdExpc3QubGVuZ3RoID4wXCIgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCIgaWQ9XCJ3cmFwXCIgc3R5bGU9XCJvdmVyZmxvdzogYXV0bzt3aWR0aDogMTAwJTtoZWlnaHQ6IGNhbGMoMTAwdmggLSAyNTBweCk7XCJcclxuICAgICAgICAgICAgICAgICAgaW5maW5pdGUtc2Nyb2xsIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cInNjcm9sbERpc3RhbmNlXCIgW2luZmluaXRlU2Nyb2xsVXBEaXN0YW5jZV09XCJzY3JvbGxVcERpc3RhbmNlXCJcclxuICAgICAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIiAoc2Nyb2xsZWQpPVwiZ3JvdXBvblNjcm9sbERvd24oKVwiIFtzY3JvbGxXaW5kb3ddPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJkaXNwbGF5VGFibGVcIj5cclxuICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwicG9zcmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY1RoXCIgc3R5bGU9XCJ3aWR0aDo3NXB4O1wiICpuZ0lmPVwiZm9ybW5hbWUhPSdtaXhBbmFseXNpc1JlcG9ydEZvcm0nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBETkE8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5TdGF0dXM8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAoY2xpY2spPVwic29ydEJ5KGhyZEtleSxnKVwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiICpuZ0Zvcj1cImxldCBocmRLZXkgb2YgaGVhZGVyS2V5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e2hlYWRlcltocmRLZXldfX1cclxuICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXBkdGwgb2YgbG9hZGdyb3VwQnlwa3RMaXN0IGxldCBqPWluZGV4O1wiPlxyXG4gICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJoZWFkZXJLZXkubGVuZ3RoKzFcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OmJvbGQ7dGV4dC1hbGlnbjogbGVmdDsgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Z3JvdXBkdGwudmFsdWV9fSAmbmJzcDsgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBRdHkgOiB7e2dyb3VwZHRsWydjb3VudCddfX0gJm5ic3A7ICZuYnNwOyBDYXJhdHMgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2dyb3VwZHRsWydjcnR3dCddfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7ICZuYnNwOyBBdmcgOnt7Z3JvdXBkdGxbJ3NhbGF2ZyddfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7ICZuYnNwOyBEaXMlIDoge3tncm91cGR0bFsnc2FsZGlzJ119fVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7IEFtb3VudCA6IHt7Z3JvdXBkdGxbJ3NhbHZsdSddfX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+IFxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHRyICpuZ0lmPVwic3R0d2lzZVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImhlYWRlcktleS5sZW5ndGgrMVwiIHN0eWxlPVwiZm9udC13ZWlnaHQ6Ym9sZDt0ZXh0LWFsaWduOiBsZWZ0OyBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tnfX0gJm5ic3A7ICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBRdHkgOiB7e2ZpbmFsR3JwVmFsW2ddLmxlbmd0aH19ICZuYnNwOyAmbmJzcDsgQ2FyYXRzIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAge3t0b3RhbFdlaWdodH19XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsgQW1vdW50IDp7e3RvdEFtdH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+IC0tPlxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcGt0ZHRsIG9mIGdyb3VwZHRsWydwa3RMaXN0J10gfCB0YWJsZVNlYXJjaDpzZWFyY2hGOnBrdHM7bGV0IHBrdGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2V2ZW4nOnBrdGklMj09MCwnb2RkJzpwa3RpJTI9PTF9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDo3NXB4O3Bvc2l0aW9uOiByZWxhdGl2ZTtcIiAqbmdJZj1cImZvcm1uYW1lIT0nbWl4QW5hbHlzaXNSZXBvcnRGb3JtJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9rYXB1Z2Vtcy5jb20va3dlYi8jL2RuYS97e3BrdGR0bC5zdG9ja19pZG59fS8/a2V5PXt7Y2t9fVwiIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZGlhbW9uZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgdmFsdWU9XCJ7e3BrdGR0bC5zdG9ja19pZG59fVwiIFtoaWRkZW5dPVwidHJ1ZVwiIGlkPVwiY2Jfe3twa3RkdGwuc3RvY2tfaWRufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGVja2VkUm93KHBrdGR0bCxwa3RkdGwuc3RvY2tfaWRuLCRldmVudC50YXJnZXQuY2hlY2tlZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCIgW25nU3R5bGVdPVwieydjb2xvcic6IHBrdGR0bC5kc3Bfc3R0fVwiPnt7cGt0ZHRsLmRzcF9zdHR9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBocmRLZXkgb2YgaGVhZGVyS2V5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImhyZEtleSE9J2NvJyAmJiBocmRLZXkhPSdwdSdcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlclwiIChjbGljayk9XCJzZWxlY3RSb3cocGt0ZHRsLnN0b2NrX2lkbik7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2NvbG9yJzogcGt0ZHRsLmRzcF9zdHRfY29sb3IgPT0gJyNGRkZGRkYnID8gJ2JsYWNrJzpwa3RkdGwuZHNwX3N0dF9jb2xvcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e3BrdGR0bFtocmRLZXldfX08L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIiAqbmdJZj1cImhyZEtleT09J2NvJ1wiIChjbGljayk9XCJzZWxlY3RSb3cocGt0ZHRsLnN0b2NrX2lkbik7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2NvbG9yJzogcGt0ZHRsLmRzcF9zdHRfY29sb3IgPT0gJyNGRkZGRkYnID8gJ2JsYWNrJzpwa3RkdGwuZHNwX3N0dF9jb2xvcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e3BrdGR0bFtocmRLZXkrXCJfcFwiXX19PC90ZD5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIiAqbmdJZj1cImhyZEtleT09J3B1J1wiIChjbGljayk9XCJzZWxlY3RSb3cocGt0ZHRsLnN0b2NrX2lkbik7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2NvbG9yJzogcGt0ZHRsLmRzcF9zdHRfY29sb3IgPT0gJyNGRkZGRkYnID8gJ2JsYWNrJzpwa3RkdGwuZHNwX3N0dF9jb2xvcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e3BrdGR0bFtocmRLZXkrXCJfcFwiXX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgXHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwa3RzLmxlbmd0aCA+IDAgJiYgZ3JvdXBCeXBrdExpc3QubGVuZ3RoPT0wIFwiIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIGlkPVwid3JhcFwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG87d2lkdGg6IDEwMCU7aGVpZ2h0OiBjYWxjKDEwMHZoIC0gMjUwcHgpO1wiXHJcbiAgICAgICAgICAgICAgaW5maW5pdGUtc2Nyb2xsIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cInNjcm9sbERpc3RhbmNlXCIgW2luZmluaXRlU2Nyb2xsVXBEaXN0YW5jZV09XCJzY3JvbGxVcERpc3RhbmNlXCJcclxuICAgICAgICAgICAgICBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCI1MFwiIChzY3JvbGxlZCk9XCJvblNjcm9sbERvd24oKVwiIFtzY3JvbGxXaW5kb3ddPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJkaXNwbGF5VGFibGVcIj5cclxuICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwicG9zcmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY1RoXCIgc3R5bGU9XCJ3aWR0aDo3NXB4O1wiICpuZ0lmPVwiZm9ybW5hbWUhPSdtaXhBbmFseXNpc1JlcG9ydEZvcm0nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBETkE8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+U3RhdHVzPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCIgKm5nRm9yPVwibGV0IGhyZEtleSBvZiBoZWFkZXJLZXlcIj57e2hlYWRlcltocmRLZXldfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGI+QXZlcmFnZSA8L2I+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaHJkS2V5IG9mIGhlYWRlcktleVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPnt7Y3Muc3BsaXRUb1R3b0RlY2ltYWwoVG90QXZnT2JqW2hyZEtleV0pfX08L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBwa3RkdGwgb2YgbG9hZFJlc3VsdCB8IHRhYmxlU2VhcmNoOnNlYXJjaEY6cGt0cztsZXQgcGt0aSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2V2ZW4nOnBrdGklMj09MCwnb2RkJzpwa3RpJTI9PTF9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6NzVweDtwb3NpdGlvbjogcmVsYXRpdmU7XCIgKm5nSWY9XCJmb3JtbmFtZSE9J21peEFuYWx5c2lzUmVwb3J0Rm9ybSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2thcHVnZW1zLmNvbS9rd2ViLyMvZG5hL3t7cGt0ZHRsLnN0b2NrX2lkbn19Lz9rZXk9e3tja319XCIgdGFyZ2V0PVwiX2JsYW5rXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZGlhbW9uZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiB2YWx1ZT1cInt7cGt0ZHRsLnN0b2NrX2lkbn19XCIgW2hpZGRlbl09XCJ0cnVlXCIgaWQ9XCJjYl97e3BrdGR0bC5zdG9ja19pZG59fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGVja2VkUm93KHBrdGR0bCxwa3RkdGwuc3RvY2tfaWRuLCRldmVudC50YXJnZXQuY2hlY2tlZClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICAqbmdGb3I9XCJsZXQgbG5rIG9mIGxpbmtzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ7e2xuay5mb3JtX2ZpZWxkX2ljb259fVwiICpuZ0lmPVwicGt0ZHRsLmRzcF9zdHQhPSdzb2xkJ1wiIChjbGljayk9XCJPbkxpbmtDbGljayhsbmsscGt0ZHRsKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiIFtuZ1N0eWxlXT1cInsnY29sb3InOiBwa3RkdGwuZHNwX3N0dH1cIj57e3BrdGR0bC5kc3Bfc3R0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhyZEtleSBvZiBoZWFkZXJLZXlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImhyZEtleSE9J2NvJyAmJiBocmRLZXkhPSdwdSdcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlclwiIChjbGljayk9XCJzZWxlY3RSb3cocGt0ZHRsLnN0b2NrX2lkbik7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjb2xvcic6IHBrdGR0bC5kc3Bfc3R0X2NvbG9yID09ICcjRkZGRkZGJyA/ICdibGFjayc6cGt0ZHRsLmRzcF9zdHRfY29sb3J9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7cGt0ZHRsW2hyZEtleV19fTwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIiAqbmdJZj1cImhyZEtleT09J2NvJ1wiIChjbGljayk9XCJzZWxlY3RSb3cocGt0ZHRsLnN0b2NrX2lkbik7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjb2xvcic6IHBrdGR0bC5kc3Bfc3R0X2NvbG9yID09ICcjRkZGRkZGJyA/ICdibGFjayc6cGt0ZHRsLmRzcF9zdHRfY29sb3J9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7cGt0ZHRsW2hyZEtleStcIl9wXCJdfX08L3RkPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlclwiICAqbmdJZj1cImhyZEtleT09J3B1J1wiIChjbGljayk9XCJzZWxlY3RSb3cocGt0ZHRsLnN0b2NrX2lkbik7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjb2xvcic6IHBrdGR0bC5kc3Bfc3R0X2NvbG9yID09ICcjRkZGRkZGJyA/ICdibGFjayc6cGt0ZHRsLmRzcF9zdHRfY29sb3J9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7cGt0ZHRsW2hyZEtleStcIl9wXCJdfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdkaXNUeXBlPT0nc3VtbWFyeScgJiYgc3VtbWFyeUxpc3QubGVuZ3RoPjBcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj4gPGJ1dHRvbiAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogNHB4IDE1cHggNHB4IDIwcHg7bWFyZ2luLWxlZnQ6IDEwcHg7XCIgZGF0YS10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJyaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEb3dubG9hZCBFeGNlbFwiIChjbGljayk9XCJleHBvcnRUb0NTVlN1bW1hcnkoKTtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiIHN0eWxlPVwiY29sb3I6Z3JlZW47XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImRpc3BsYXlUYWJsZVwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO3BhZGRpbmc6MTBweCA7XCI+XHJcbiAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInBvc3JlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5Tci4gTm88L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5BdHRyaWJ1dGU8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhkciBvZiBoZWFkTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCIgY29sc3Bhbj1cIjVcIj57e2hkcn19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwicG9zcmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZHIgb2YgaGVhZExpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlF0eTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5DYXJhdDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5Bdmc8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCIgKm5nSWY9XCJmb3JtbmFtZSE9J21peEFuYWx5c2lzUmVwb3J0Rm9ybSdcIj5EaXM8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+VmFsdWU8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHN1bW1hcnlEdGwgb2Ygc3VtbWFyeUxpc3QgfCB0YWJsZVNlYXJjaDpzZWFyY2hGOnBrdHM7bGV0IHBrdGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydldmVuJzpwa3RpJTI9PTAsJ29kZCc6cGt0aSUyPT0xfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj57e3BrdGkrMX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+e3tzdW1tYXJ5RHRsWyd2YWx1ZSddfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhkciBvZiBoZWFkTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj57e3N1bW1hcnlEdGxbJ2NvdW50XycraGRyXX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+e3tzdW1tYXJ5RHRsWydjcnR3dF8nK2hkcl19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPnt7c3VtbWFyeUR0bFsnYXZnXycraGRyXX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCIgKm5nSWY9XCJmb3JtbmFtZSE9J21peEFuYWx5c2lzUmVwb3J0Rm9ybSdcIj57e3N1bW1hcnlEdGxbJ2Rpc18nK2hkcl19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPnt7c3VtbWFyeUR0bFsndmx1XycraGRyXX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj4gXHJcblxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcblxyXG4gICAgICAgICAgXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uRm9vdGVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Fsc2VjIHB1bGwtbGVmdFwiIHN0eWxlPVwicGFkZGluZzogNXB4O1wiPlxyXG4gICAgICAgICAgPHRhYmxlPlxyXG4gICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz4gVG90YWw6ICZuYnNwOyA8L3N0cm9uZz5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIHt7ZmluYWxHcnBWYWxbXCJcIl0/Lmxlbmd0aD4wID8gZmluYWxHcnBWYWxbXCJcIl0/Lmxlbmd0aCA6IHBrdHM/Lmxlbmd0aH19Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPiBXZWlnaHQ6Jm5ic3A7PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+IHt7dG90YWxXZWlnaHR9fSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz4gQXZnOiZuYnNwOzwvc3Ryb25nPiA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj4ge3t0b3RBdmd9fSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIiAqbmdJZj1cImZvcm1uYW1lIT0nbWl4QW5hbHlzaXNSZXBvcnRGb3JtJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz4gRGlzOiZuYnNwOzwvc3Ryb25nPiA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj4ge3t0b3REaXN9fSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+IEFtb3VudDombmJzcDs8L3N0cm9uZz4gPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+IHt7dG90QW10fX08L3RkPlxyXG5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPiAmbmJzcDsmbmJzcDsmbmJzcDt8ICZuYnNwOyZuYnNwO1NlbGVjdGVkIFBrdHMgOiA8L3N0cm9uZz4gPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+IHt7c2VsZWN0ZWRJdG0/Lmxlbmd0aH19Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz4gV2VpZ2h0OiZuYnNwOzwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPiB7e3NlbGVjdHd0fX0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPlxyXG5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPiBBdmc6Jm5ic3A7PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+IHt7c2VsZWN0QXZnfX0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPlxyXG5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCIgKm5nSWY9XCJmb3JtbmFtZSE9J21peEFuYWx5c2lzUmVwb3J0Rm9ybSdcIj5cclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+IERpc2M6Jm5ic3A7PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+IHt7c2VsZWN0RGlzfX0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+IEFtb3VudDombmJzcDs8L3N0cm9uZz5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj4ge3tzZWxlY3RBbXR9fTwvdGQ+XHJcblxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogODBweDtcIiAoY2xpY2spPVwibW9kaWZ5U2VhcmNoKClcIj5Nb2RpZnlcclxuICAgICAgICAgICAgU2VhcmNoPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG5cclxuXHJcblxyXG5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwgZmFkZVwiIGlkPVwiUGllY2hhcnRNb2RlbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwiZXhhbXBsZU1vZGFsTGFiZWxcIlxyXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCIgcm9sZT1cImRvY3VtZW50XCIgID5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiA+XHJcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwibWFpbE1vZGFsSGVhZFwiPlRvcCB7e3R5cGV9fSBQaWUgQ2hhcnQ8L2g0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuUXR5XCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImdlbmVyYXRlUGllKGRhdGFUeXBlLCdxdHknKVwiPlFUWSA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJidG5WYWxcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZ2VuZXJhdGVQaWUoZGF0YVR5cGUsJ3ZhbHVlJylcIj5WQUxVRSA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgXHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIHJvd1wiICpuZ0lmPVwiaXNCdXllcndpc2VcIiA+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj48Yj4mbmJzcDsmbmJzcDsgJm5ic3A7VG90YWwgc29sZCB2YWx1ZTpcclxuICAgICAgICAgICAgICAgIHt7dGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChzdHRXaXNlU3VtbWFyeT8uZ2V0KCdzb2xkJyk/LmdldCgncmF0ZScpKX19PC9iPjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxjYW52YXMgYmFzZUNoYXJ0IFtkYXRhXT1cImRvdWdobnV0Q2hhcnREYXRhXCIgIFtsYWJlbHNdPVwiZG91Z2hudXRDaGFydExhYmVsc1wiICBbbGVnZW5kXT1cInBpZUNoYXJ0TGVnZW5kXCJcclxuICAgICAgICAgICAgICBbY29sb3JzXT1cImNoYXJ0Q29sb3JzXCIgIFtjaGFydFR5cGVdPVwiZG91Z2hudXRDaGFydFR5cGVcIiBbb3B0aW9uc109XCJwaWVcIj48L2NhbnZhcz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICBcclxuICAgICAgICAgXHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIHJvd1wiICpuZ0lmPVwiaXNHcnB3aXNlXCIgID5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPjxiPiZuYnNwOyZuYnNwOyAmbmJzcDtUb3RhbCBzb2xkIHZhbHVlOlxyXG4gICAgICAgICAgICAgICAge3t0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHN0dFdpc2VTdW1tYXJ5Py5nZXQoJ3NvbGQnKT8uZ2V0KCdyYXRlJykpfX08L2I+PC9sYWJlbD5cclxuICAgICAgICAgICAgPGNhbnZhcyBiYXNlQ2hhcnQgW2RhdGFdPVwiZG91Z2hudXRDaGFydERhdGFcIiBbbGFiZWxzXT1cImRvdWdobnV0Q2hhcnRMYWJlbHNcIiBbbGVnZW5kXT1cInBpZUNoYXJ0TGVnZW5kXCJcclxuICAgICAgICAgICAgICBbY2hhcnRUeXBlXT1cImRvdWdobnV0Q2hhcnRUeXBlXCIgW29wdGlvbnNdPVwicGllXCI+PC9jYW52YXM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgXHJcblxyXG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgcm93XCIgKm5nSWY9XCJpc1F0eVdpc2VcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPjxiPiZuYnNwOyZuYnNwOyAmbmJzcDtUb3RhbCBzb2xkIHZhbHVlOlxyXG4gICAgICAgICAgICAgICAge3t0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHN0dFdpc2VTdW1tYXJ5Py5nZXQoJ3NvbGQnKT8uZ2V0KCdjb3VudCcpKX19PC9iPjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxjYW52YXMgYmFzZUNoYXJ0IFtkYXRhXT1cImRvdWdobnV0Q2hhcnREYXRhXCIgW2xhYmVsc109XCJkb3VnaG51dENoYXJ0TGFiZWxzXCIgW2xlZ2VuZF09XCJwaWVDaGFydExlZ2VuZFwiXHJcbiAgICAgICAgICAgICAgW2NoYXJ0VHlwZV09XCJkb3VnaG51dENoYXJ0VHlwZVwiIFtvcHRpb25zXT1cInBpZVwiPjwvY2FudmFzPlxyXG4gICAgICAgICAgPC9kaXY+IC0tPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+Q2xvc2U8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cImJpZE1kXCIgdGFiaW5kZXg9XCItMVwiIHN0eWxlPVwiei1pbmRleDogMTQwMFwiIHJvbGU9XCJkaWFsb2dcIlxyXG4gIGFyaWEtbGFiZWxsZWRieT1cImV4YW1wbGVNb2RhbExhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiIHJvbGU9XCJkb2N1bWVudFwiPlxyXG4gICAgPGZvcm0gbmFtZT1cImFwcEZvcm1cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZSB0ZXh0LXVwcGVyY2FzZVwiIGlkPVwiZXhhbXBsZU1vZGFsTGFiZWxcIj5cclxuICAgICAgICAgIFByaWNlIENoYW5nZTwvaDU+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiA+XHJcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJwYWRkaW5nOjEwcHhcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICBzdHlsZT1cImZvbnQtc2l6ZTogMTZweDtmb250LXdlaWdodDpib2xkXCI+e3tjT2JqPy5wa3RfY29kZX19IHt7Y09iaj8uc2h9fSB7e2NPYmo/LmNydHd0fX0ge3tjT2JqPy5jb319IHt7Y09iaj8ucHV9fSB7e2NPYmo/LmN0fX0ge3tjT2JqPy5wb319ICB7e2NPYmo/LnN5fX0gIHt7Y09iaj8uZmx9fTwvc3Bhbj5cclxuICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMjBweDtwYWRkaW5nLXRvcDogM3B4XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNsYmxcIiA+IFJhcDogIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj48c3BhbiBjbGFzcz1cImNsYmxcIj57e2NPYmo/LmJlbmNobWFya19ydGV9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+Jm5ic3A7PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMjBweDtwYWRkaW5nLXRvcDogM3B4XCI+XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNsYmxcIiA+RGlzY291bnQ6PC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xibFwiPnt7Y09iaj8ucmFwX2Rpc319PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0O1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0ICB0eXBlPVwidGV4dFwiICAoY2hhbmdlKT1cImNhbGN1bGF0UnRlRGlzKGNPYmosJ2RpcycpXCIgc3R5bGU9XCJ3aWR0aDoxMDBweFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cIm5ld19yYXBfZGlzXCIgWyhuZ01vZGVsKV09XCJjT2JqWyduZXdfcmFwX2RpcyddXCIgLz5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDIwcHg7cGFkZGluZy10b3A6IDNweFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjbGJsXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiByaWdodDtcIj5QcmljZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbGJsXCI+e3tjT2JqPy5ydGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0ICB0eXBlPVwidGV4dFwiICAoY2hhbmdlKT1cImNhbGN1bGF0UnRlRGlzKGNPYmosJ3J0ZScpXCIgc3R5bGU9XCJ3aWR0aDoxMDBweFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cIm5ld19ydGVcIiBbKG5nTW9kZWwpXT1cImNPYmpbJ25ld19ydGUnXVwiIC8+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICBcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICBcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXBwQXBwTm9EYmxDbGlja1xyXG4gICAgICAgICAgICAgIChjbGljayk9XCJDaGFuZ2VzUHJpY2UoKVwiPlVwZGF0ZSBQcmljZTwvYnV0dG9uPlxyXG4gICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiBcclxuPGJ1dHRvbiBpZD1cImJpZE1kQkJ0blwiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLXRhcmdldD1cIiNiaWRNZFwiPjwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uIGlkPVwiUGllY2hhcnRNb2RlbEJ0blwiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLXRhcmdldD1cIiNQaWVjaGFydE1vZGVsXCI+PC9idXR0b24+XHJcblxyXG5cclxuPC9kaXY+Il19