ezlibrary_v2 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/ezlibrary_v2.mjs +5 -0
- package/esm2020/lib/admin-service/admin-service.service.mjs +36 -0
- package/esm2020/lib/analysis-search/analysis-search.component.mjs +1083 -0
- package/esm2020/lib/assort-service/assort-service.service.mjs +31 -0
- package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +231 -0
- package/esm2020/lib/auth/auth.guard.mjs +40 -0
- package/esm2020/lib/bi-service/bi.service.mjs +58 -0
- package/esm2020/lib/call-info/callinfo.component.mjs +126 -0
- package/esm2020/lib/comman-service/comman-service.service.mjs +679 -0
- package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
- package/esm2020/lib/contact-search/contact-search.component.mjs +679 -0
- package/esm2020/lib/contact-service/contact-service.service.mjs +47 -0
- package/esm2020/lib/ezheader/header.component.mjs +383 -0
- package/esm2020/lib/ezlib.module.mjs +220 -0
- package/esm2020/lib/file-upload/fileupload.component.mjs +920 -0
- package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +175 -0
- package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
- package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
- package/esm2020/lib/footer/footer.component.mjs +18 -0
- package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
- package/esm2020/lib/globle/globle-env.service.mjs +45 -0
- package/esm2020/lib/globle/memo-report.service.mjs +2800 -0
- package/esm2020/lib/globle/pdf-service.service.mjs +18848 -0
- package/esm2020/lib/globle/shared-services.service.mjs +27 -0
- package/esm2020/lib/globle/upload-service.service.mjs +69 -0
- package/esm2020/lib/header/header.component.mjs +179 -0
- package/esm2020/lib/invalid/invalid.component.mjs +71 -0
- package/esm2020/lib/logout/logout.component.mjs +107 -0
- package/esm2020/lib/menu-right/menu-right.component.mjs +252 -0
- package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
- package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
- package/esm2020/lib/pipes/selectedCount.mjs +19 -0
- package/esm2020/lib/pipes/sum.pipe.mjs +16 -0
- package/esm2020/lib/pkt-data/pkt-data.component.mjs +1107 -0
- package/esm2020/lib/pricing-service/pricing.service.mjs +58 -0
- package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1035 -0
- package/esm2020/lib/report-format/report-format.component.mjs +400 -0
- package/esm2020/lib/sessionend/session-end.guard.mjs +28 -0
- package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
- package/esm2020/lib/stock-service/stock-service.service.mjs +62 -0
- package/esm2020/lib/system-module/subform/subform.component.mjs +2481 -0
- package/esm2020/lib/system-module/system/system.component.mjs +959 -0
- package/esm2020/lib/system-module/system-service/system-service.service.mjs +85 -0
- package/esm2020/lib/system-module/system-service/upload-file.service.mjs +86 -0
- package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +23 -0
- package/esm2020/lib/utility/constants.mjs +5 -0
- package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
- package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
- package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
- package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/tranform.directive.mjs +27 -0
- package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
- package/esm2020/public_api.mjs +57 -0
- package/ezlibrary_v2.d.ts +5 -0
- package/fesm2015/ezlibrary_v2.mjs +33543 -0
- package/fesm2015/ezlibrary_v2.mjs.map +1 -0
- package/fesm2020/ezlibrary_v2.mjs +33533 -0
- package/fesm2020/ezlibrary_v2.mjs.map +1 -0
- package/lib/admin-service/admin-service.service.d.ts +13 -0
- package/lib/analysis-search/analysis-search.component.d.ts +122 -0
- package/lib/assort-service/assort-service.service.d.ts +12 -0
- package/lib/attribute-definition/attribute-definition.component.d.ts +47 -0
- package/lib/auth/auth.guard.d.ts +16 -0
- package/lib/bi-service/bi.service.d.ts +20 -0
- package/lib/call-info/callinfo.component.d.ts +30 -0
- package/lib/comman-service/comman-service.service.d.ts +111 -0
- package/lib/comman-service/share-data-service.service.d.ts +10 -0
- package/lib/contact-search/contact-search.component.d.ts +115 -0
- package/lib/contact-service/contact-service.service.d.ts +15 -0
- package/lib/ezheader/header.component.d.ts +61 -0
- package/lib/ezlib.module.d.ts +47 -0
- package/lib/file-upload/fileupload.component.d.ts +131 -0
- package/lib/file-upload-log/file-upload-log.component.d.ts +53 -0
- package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
- package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
- package/lib/footer/footer.component.d.ts +9 -0
- package/lib/globle/common-pdf.service.d.ts +9 -0
- package/lib/globle/globle-env.service.d.ts +16 -0
- package/lib/globle/memo-report.service.d.ts +107 -0
- package/lib/globle/pdf-service.service.d.ts +459 -0
- package/lib/globle/shared-services.service.d.ts +12 -0
- package/lib/globle/upload-service.service.d.ts +20 -0
- package/lib/header/header.component.d.ts +45 -0
- package/lib/invalid/invalid.component.d.ts +12 -0
- package/lib/logout/logout.component.d.ts +21 -0
- package/lib/menu-right/menu-right.component.d.ts +47 -0
- package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
- package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
- package/lib/pipes/selectedCount.d.ts +7 -0
- package/lib/pipes/sum.pipe.d.ts +7 -0
- package/lib/pkt-data/pkt-data.component.d.ts +189 -0
- package/lib/pricing-service/pricing.service.d.ts +20 -0
- package/lib/qa-analysis/qa-analysis.component.d.ts +99 -0
- package/lib/report-format/report-format.component.d.ts +74 -0
- package/lib/sessionend/session-end.guard.d.ts +10 -0
- package/lib/stock-service/lazyload.service.d.ts +7 -0
- package/lib/stock-service/stock-service.service.d.ts +19 -0
- package/lib/system-module/subform/subform.component.d.ts +227 -0
- package/lib/system-module/system/system.component.d.ts +113 -0
- package/lib/system-module/system-service/system-service.service.d.ts +23 -0
- package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
- package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
- package/lib/utility/constants.d.ts +4 -0
- package/lib/utility/contact-table-search.pipe.d.ts +7 -0
- package/lib/utility/formate-num-field.pipe.d.ts +7 -0
- package/lib/utility/search-pipe.pipe.d.ts +7 -0
- package/lib/utility/selective-preloading-strategy.d.ts +9 -0
- package/lib/utility/table-search.pipe.d.ts +7 -0
- package/lib/utility/tranform.directive.d.ts +10 -0
- package/lib/websearch-history/websearch-history.component.d.ts +62 -0
- package/package.json +48 -0
- package/public_api.d.ts +52 -0
|
@@ -0,0 +1,1035 @@
|
|
|
1
|
+
// import { StockComponent } from './../../stock-module/stock/stock.component';
|
|
2
|
+
// import { element } from 'protractor';
|
|
3
|
+
import { Component } from '@angular/core';
|
|
4
|
+
import { CommanServiceService } from '../comman-service/comman-service.service';
|
|
5
|
+
import { Router, ActivatedRoute } from '@angular/router';
|
|
6
|
+
import { ToastrService } from 'ngx-toastr';
|
|
7
|
+
import { NgxSpinnerService } from "ngx-spinner";
|
|
8
|
+
import { BiService } from './../bi-service/bi.service';
|
|
9
|
+
import * as _ from 'lodash';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "../comman-service/comman-service.service";
|
|
12
|
+
import * as i2 from "./../bi-service/bi.service";
|
|
13
|
+
import * as i3 from "ngx-spinner";
|
|
14
|
+
import * as i4 from "ngx-toastr";
|
|
15
|
+
import * as i5 from "@angular/router";
|
|
16
|
+
import * as i6 from "@angular/forms";
|
|
17
|
+
import * as i7 from "@angular/common";
|
|
18
|
+
import * as i8 from "ng2-charts";
|
|
19
|
+
export class QaAnalysisComponent {
|
|
20
|
+
constructor(cs, bis, _spinnerService, toastr, router, route) {
|
|
21
|
+
this.cs = cs;
|
|
22
|
+
this.bis = bis;
|
|
23
|
+
this._spinnerService = _spinnerService;
|
|
24
|
+
this.toastr = toastr;
|
|
25
|
+
this.router = router;
|
|
26
|
+
this.route = route;
|
|
27
|
+
this.cDt = new Date();
|
|
28
|
+
this.htmlArr = [];
|
|
29
|
+
this.head = [];
|
|
30
|
+
this.side = [];
|
|
31
|
+
this.grandTotal = new Map();
|
|
32
|
+
this.matrix = new Map();
|
|
33
|
+
this.rowTotal = new Map();
|
|
34
|
+
this.colTotal = new Map();
|
|
35
|
+
this.pktData = new Map();
|
|
36
|
+
this.sideData = new Map();
|
|
37
|
+
this.headData = new Map();
|
|
38
|
+
this.groups = [];
|
|
39
|
+
this.anaGrpStt = ['mkt', 'asrt', 'lab'];
|
|
40
|
+
this.ChartType = "";
|
|
41
|
+
this.chartOptions = {
|
|
42
|
+
legend: {
|
|
43
|
+
position: 'left',
|
|
44
|
+
labels: {
|
|
45
|
+
fontColor: 'black',
|
|
46
|
+
boxWidth: 10,
|
|
47
|
+
padding: 10,
|
|
48
|
+
fontSize: 10
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
// private anaAllGrpStt = ['asrt', 'lab', 'mkt', 'sold'];
|
|
53
|
+
this.srchHistory = {
|
|
54
|
+
period: '',
|
|
55
|
+
frmdt: '',
|
|
56
|
+
todt: ''
|
|
57
|
+
};
|
|
58
|
+
this.gblGrdDataColor = new Map();
|
|
59
|
+
// gblGridSubMap = new Map();
|
|
60
|
+
this.gblRowTotColorValWise = new Map();
|
|
61
|
+
this.legendList = [];
|
|
62
|
+
this.isApplied = false;
|
|
63
|
+
this.wt = false;
|
|
64
|
+
this.avg = false;
|
|
65
|
+
this.rap = false;
|
|
66
|
+
this.val = false;
|
|
67
|
+
this.svpd = false;
|
|
68
|
+
this.msd = false;
|
|
69
|
+
this.msdvlu = false;
|
|
70
|
+
this.age = false;
|
|
71
|
+
this.va = false;
|
|
72
|
+
this.scroll = () => {
|
|
73
|
+
this.btnVisibilityByPos();
|
|
74
|
+
};
|
|
75
|
+
this.ChatMapDtl = {};
|
|
76
|
+
this.isshowchart = false;
|
|
77
|
+
this.barChartLegend = true;
|
|
78
|
+
this.isbarshowchart = false;
|
|
79
|
+
this.barChartOptions = {
|
|
80
|
+
responsive: true,
|
|
81
|
+
scales: {
|
|
82
|
+
yAxes: [{
|
|
83
|
+
id: "y-axis-1",
|
|
84
|
+
position: 'left',
|
|
85
|
+
ticks: {
|
|
86
|
+
beginAtZero: true
|
|
87
|
+
},
|
|
88
|
+
scaleLabel: {
|
|
89
|
+
display: true,
|
|
90
|
+
labelString: 'Qty'
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: "y-axis-2",
|
|
95
|
+
position: 'right',
|
|
96
|
+
ticks: {
|
|
97
|
+
beginAtZero: true
|
|
98
|
+
},
|
|
99
|
+
scaleLabel: {
|
|
100
|
+
display: true,
|
|
101
|
+
labelString: 'Avg'
|
|
102
|
+
},
|
|
103
|
+
}]
|
|
104
|
+
},
|
|
105
|
+
plugins: {
|
|
106
|
+
labels: {
|
|
107
|
+
// render 'label', 'value', 'percentage', 'image' or custom function, default is 'percentage'
|
|
108
|
+
render: 'value',
|
|
109
|
+
showZero: false,
|
|
110
|
+
overlap: false,
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
this.barchartColors = [
|
|
115
|
+
{
|
|
116
|
+
backgroundColor: 'rgba(59, 89, 152,0.8)',
|
|
117
|
+
borderColor: 'rgba(59, 89, 152,0.8)',
|
|
118
|
+
borderWidth: 2,
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
backgroundColor: 'rgba(59, 89, 152,0.8)',
|
|
122
|
+
borderColor: 'rgba(59, 89, 152,0.8)',
|
|
123
|
+
borderWidth: 2,
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
backgroundColor: 'rgba(255, 102, 179,0.8)',
|
|
127
|
+
borderColor: 'rgba(255, 102, 179,0.8)',
|
|
128
|
+
borderWidth: 2,
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
backgroundColor: 'rgba(255, 102, 179,0.8)',
|
|
132
|
+
borderColor: 'rgba(255, 102, 179,0.8)',
|
|
133
|
+
borderWidth: 2,
|
|
134
|
+
}
|
|
135
|
+
];
|
|
136
|
+
}
|
|
137
|
+
getSearchResult(id, period) {
|
|
138
|
+
this._spinnerService.show();
|
|
139
|
+
let reqObj = {};
|
|
140
|
+
reqObj['searchIdnList'] = id.split(',');
|
|
141
|
+
reqObj['formNme'] = this.route.snapshot.params['frmnme'];
|
|
142
|
+
reqObj['period'] = period;
|
|
143
|
+
this.bis.data(reqObj, 'search', 'marketing/search')
|
|
144
|
+
.subscribe(data => {
|
|
145
|
+
this._spinnerService.hide();
|
|
146
|
+
if (data.status == 'SUCCESS') {
|
|
147
|
+
let res = data.result;
|
|
148
|
+
console.log("res", res);
|
|
149
|
+
localStorage.setItem('BI-PKT_GROUP_BY', JSON.stringify(res.pageDefination.form_field[0].lov_qry));
|
|
150
|
+
localStorage.setItem('BI-gridAvg', JSON.stringify(res.pageDefination.tabs[0].lov_qry.split(',')));
|
|
151
|
+
this.inventoryDays = res.inventoryDays || '60';
|
|
152
|
+
this.gridVariance = res.gridVariance || '10';
|
|
153
|
+
this.arrtDtl = res.attrDtl;
|
|
154
|
+
this.result = res;
|
|
155
|
+
this.legendList = res.legendList;
|
|
156
|
+
localStorage.setItem('BILegends', JSON.stringify(this.legendList));
|
|
157
|
+
this.schDtl = res.searchResultDtl;
|
|
158
|
+
let grpView = localStorage.getItem('anaGrpType');
|
|
159
|
+
this.groups = res.attrGridFormat;
|
|
160
|
+
let defaultGrp;
|
|
161
|
+
if (grpView != undefined) {
|
|
162
|
+
defaultGrp = JSON.parse(localStorage.getItem('anaGrpType'));
|
|
163
|
+
let cindx = this.groups.indexOf(defaultGrp);
|
|
164
|
+
this.gridGrp = this.groups[cindx];
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
this.gridGrp = this.groups[0];
|
|
168
|
+
}
|
|
169
|
+
this.generateGridGrpWise('i', defaultGrp);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
this._spinnerService.hide();
|
|
173
|
+
this.toastr.show(data.message);
|
|
174
|
+
}
|
|
175
|
+
}, error => {
|
|
176
|
+
this._spinnerService.hide();
|
|
177
|
+
this.toastr.show(error);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
createGrid() {
|
|
181
|
+
let newArry = this.schDtl;
|
|
182
|
+
// console.log(newArry);
|
|
183
|
+
debugger;
|
|
184
|
+
let diffday = parseInt(localStorage.getItem('diff'));
|
|
185
|
+
let biperiod = localStorage.getItem('BIPeriod') || '';
|
|
186
|
+
if (biperiod == 'week')
|
|
187
|
+
biperiod = "7";
|
|
188
|
+
if (biperiod == 'month')
|
|
189
|
+
biperiod = "30";
|
|
190
|
+
if (biperiod == 'quarter')
|
|
191
|
+
biperiod = "90";
|
|
192
|
+
let period = parseInt(biperiod);
|
|
193
|
+
if (period == 1) {
|
|
194
|
+
period = diffday;
|
|
195
|
+
}
|
|
196
|
+
let dred = "rgba(255, 0, 0,0.6)";
|
|
197
|
+
let mred = "rgba(255, 0, 0,0.4)";
|
|
198
|
+
let lred = "rgba(255, 0, 0,0.2)";
|
|
199
|
+
let dgreen = "rgba(0 ,128, 0 ,0.6)";
|
|
200
|
+
let mgreen = "rgba(0 ,128, 0 ,0.4)";
|
|
201
|
+
let lgreen = "rgba(0 ,128, 0 ,0.2)";
|
|
202
|
+
let stockdays = this.inventoryDays;
|
|
203
|
+
let minvariation = (100 - parseInt(this.gridVariance));
|
|
204
|
+
let maxvariation = (100 + parseInt(this.gridVariance));
|
|
205
|
+
console.log("period", period);
|
|
206
|
+
this.schDtl.map(element => {
|
|
207
|
+
let header = '';
|
|
208
|
+
let groupKeys = '';
|
|
209
|
+
let sideKeys = '';
|
|
210
|
+
let headKeys = '';
|
|
211
|
+
let lIdx;
|
|
212
|
+
this.grpval.map(ele => {
|
|
213
|
+
header += element[ele] + ',';
|
|
214
|
+
groupKeys += element[ele] + ',';
|
|
215
|
+
});
|
|
216
|
+
lIdx = header.lastIndexOf(',');
|
|
217
|
+
if (lIdx == header.length - 1) {
|
|
218
|
+
header = header.substr(0, header.length - 1) + "#";
|
|
219
|
+
}
|
|
220
|
+
this.sideval.map(ele => {
|
|
221
|
+
header += element[ele] + ',';
|
|
222
|
+
sideKeys += element[ele] + ',';
|
|
223
|
+
});
|
|
224
|
+
lIdx = header.lastIndexOf(',');
|
|
225
|
+
if (lIdx == header.length - 1) {
|
|
226
|
+
header = header.substr(0, header.length - 1) + "#";
|
|
227
|
+
}
|
|
228
|
+
this.headval.map(ele => {
|
|
229
|
+
header += element[ele] + ',';
|
|
230
|
+
headKeys += element[ele] + ',';
|
|
231
|
+
});
|
|
232
|
+
lIdx = header.lastIndexOf(',');
|
|
233
|
+
if (lIdx == header.length - 1) {
|
|
234
|
+
header = header.substr(0, header.length - 1) + "";
|
|
235
|
+
}
|
|
236
|
+
groupKeys = (groupKeys.lastIndexOf(',') == groupKeys.length) ? groupKeys.substr(0, groupKeys.length - 1) : groupKeys;
|
|
237
|
+
sideKeys = (sideKeys.lastIndexOf(',') == sideKeys.length) ? sideKeys.substr(0, sideKeys.length - 1) : sideKeys;
|
|
238
|
+
headKeys = (headKeys.lastIndexOf(',') == headKeys.length) ? headKeys.substr(0, headKeys.length - 1) : headKeys;
|
|
239
|
+
let lHeader = header + '#' + element.dsp_stt;
|
|
240
|
+
let lSideKey = (groupKeys.length == 0) ? sideKeys : groupKeys + "#" + sideKeys + '#' + element.dsp_stt;
|
|
241
|
+
let lHeadKey = (groupKeys.length == 0) ? headKeys : groupKeys + "#" + headKeys + '#' + element.dsp_stt;
|
|
242
|
+
let wt = parseFloat(element.crtwt);
|
|
243
|
+
let rte = parseFloat(element.asking_rte);
|
|
244
|
+
let salrate = parseFloat(element.sal_rte);
|
|
245
|
+
let sal_rte = parseFloat(element.quot);
|
|
246
|
+
let benchmark_rte = parseFloat(element.benchmark_rte);
|
|
247
|
+
let age = parseInt(element.age);
|
|
248
|
+
let rteValue = rte * wt;
|
|
249
|
+
if ((element.grp_stt).toLowerCase() == 'sold') {
|
|
250
|
+
rteValue = salrate * wt;
|
|
251
|
+
}
|
|
252
|
+
let benachmarkValue = benchmark_rte * wt;
|
|
253
|
+
let gridWt = 0;
|
|
254
|
+
let gridRteValue = 0;
|
|
255
|
+
let gridvalue = 0;
|
|
256
|
+
let gridAge = 0;
|
|
257
|
+
let gridValueAge = 0;
|
|
258
|
+
let count = 0;
|
|
259
|
+
let grid = this.matrix.get(lHeader);
|
|
260
|
+
if (grid != null) {
|
|
261
|
+
count = parseInt(grid.get('count'));
|
|
262
|
+
gridWt = parseFloat(grid.get('wt'));
|
|
263
|
+
gridRteValue = parseFloat(grid.get('rap'));
|
|
264
|
+
gridvalue = parseFloat(grid.get('value'));
|
|
265
|
+
gridAge = parseFloat(grid.get('age'));
|
|
266
|
+
gridValueAge = parseFloat(grid.get('valueage'));
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
grid = new Map();
|
|
270
|
+
}
|
|
271
|
+
grid.set('count', count + 1);
|
|
272
|
+
grid.set('wt', gridWt + wt);
|
|
273
|
+
grid.set('rap', gridRteValue + benachmarkValue);
|
|
274
|
+
grid.set('value', gridvalue + rteValue);
|
|
275
|
+
grid.set('age', ((gridAge * count) + age) / (count + 1));
|
|
276
|
+
grid.set('valueage', ((gridvalue * gridAge) + (age * rteValue)) / (gridvalue + rteValue));
|
|
277
|
+
this.matrix.set(lHeader, grid);
|
|
278
|
+
let pkts = new Set();
|
|
279
|
+
let sidePkts = new Set();
|
|
280
|
+
let headPkts = new Set();
|
|
281
|
+
if (this.pktData.get(header) != null)
|
|
282
|
+
pkts = this.pktData.get(header);
|
|
283
|
+
if (this.sideData.get(lSideKey) != null)
|
|
284
|
+
sidePkts = this.sideData.get(lSideKey);
|
|
285
|
+
if (this.headData.get(lHeadKey) != null)
|
|
286
|
+
headPkts = this.headData.get(lHeadKey);
|
|
287
|
+
pkts.add(element);
|
|
288
|
+
this.pktData.set(header, pkts);
|
|
289
|
+
sidePkts.add(element);
|
|
290
|
+
this.sideData.set(lSideKey, sidePkts);
|
|
291
|
+
headPkts.add(element);
|
|
292
|
+
this.headData.set(lHeadKey, headPkts);
|
|
293
|
+
});
|
|
294
|
+
let grps = new Set();
|
|
295
|
+
let rows = new Set();
|
|
296
|
+
let cols = new Set();
|
|
297
|
+
let stt = new Set();
|
|
298
|
+
this.matrix.forEach((value, key) => {
|
|
299
|
+
let lKey = key;
|
|
300
|
+
let count = parseFloat(value.get('count'));
|
|
301
|
+
let wt = parseFloat(value.get('wt'));
|
|
302
|
+
let rap = parseFloat(value.get('rap'));
|
|
303
|
+
let val = parseFloat(value.get('value'));
|
|
304
|
+
let age = parseFloat(value.get('age'));
|
|
305
|
+
let valueAge = parseFloat(value.get('valueage'));
|
|
306
|
+
let grpVal = lKey.split('#')[0];
|
|
307
|
+
let rowVal = lKey.split('#')[1];
|
|
308
|
+
let colVal = lKey.split('#')[2];
|
|
309
|
+
let status = lKey.split('#')[3];
|
|
310
|
+
let valCompArr = [];
|
|
311
|
+
let valCompObj = {};
|
|
312
|
+
valCompObj[status] = val;
|
|
313
|
+
valCompArr.push(valCompObj);
|
|
314
|
+
console.log();
|
|
315
|
+
let isSold = false;
|
|
316
|
+
if (this.anaGrpStt.indexOf(status) == -1)
|
|
317
|
+
isSold = true;
|
|
318
|
+
if (isSold) {
|
|
319
|
+
let compareWith = 'mkt';
|
|
320
|
+
let cmpData = this.matrix.get(grpVal + '#' + rowVal + '#' + colVal + '#' + compareWith);
|
|
321
|
+
let cmpCount = 0;
|
|
322
|
+
if (cmpData != undefined) {
|
|
323
|
+
cmpCount = parseFloat(cmpData.get('count'));
|
|
324
|
+
}
|
|
325
|
+
let msd = Math.round(period * cmpCount / count);
|
|
326
|
+
value.set('msd', msd);
|
|
327
|
+
let cmpValue = 0;
|
|
328
|
+
if (cmpData != undefined) {
|
|
329
|
+
cmpValue = parseFloat(cmpData.get('value'));
|
|
330
|
+
}
|
|
331
|
+
let msdvlu = Math.round(period * cmpValue / val);
|
|
332
|
+
value.set('msdvlu', msdvlu);
|
|
333
|
+
let chkcount = (stockdays * count / period);
|
|
334
|
+
// let mincount = (chkcount * minvariation);
|
|
335
|
+
// let maxcount = (chkcount * maxvariation);
|
|
336
|
+
debugger;
|
|
337
|
+
let netratio = (chkcount * 100) / cmpCount;
|
|
338
|
+
console.log("checkcount", rowVal, colVal, chkcount);
|
|
339
|
+
console.log("netratio", rowVal, colVal, netratio);
|
|
340
|
+
let gridcolor = '#ffff00';
|
|
341
|
+
if (netratio <= 30) {
|
|
342
|
+
gridcolor = dred;
|
|
343
|
+
}
|
|
344
|
+
else if (netratio > 30 && netratio < 60) {
|
|
345
|
+
gridcolor = mred;
|
|
346
|
+
}
|
|
347
|
+
else if (netratio >= 60 && netratio < minvariation) {
|
|
348
|
+
gridcolor = lred;
|
|
349
|
+
}
|
|
350
|
+
else if (netratio >= minvariation && netratio < maxvariation) {
|
|
351
|
+
gridcolor = 'rgba(255, 255, 0, 0.38)';
|
|
352
|
+
}
|
|
353
|
+
else if (netratio >= maxvariation && netratio < 200) {
|
|
354
|
+
gridcolor = lgreen;
|
|
355
|
+
}
|
|
356
|
+
else if (netratio >= 200 && netratio < 300) {
|
|
357
|
+
gridcolor = mgreen;
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
gridcolor = dgreen;
|
|
361
|
+
}
|
|
362
|
+
value.set('grpcolor', gridcolor);
|
|
363
|
+
let svpd = Math.round(val / period);
|
|
364
|
+
value.set('svpd', svpd);
|
|
365
|
+
}
|
|
366
|
+
if (status == 'mkt')
|
|
367
|
+
value.set('grpcolor', '#dddddd');
|
|
368
|
+
let disc = 0;
|
|
369
|
+
if (rap > 1) {
|
|
370
|
+
disc = (((val * 100) / rap) - 100);
|
|
371
|
+
}
|
|
372
|
+
let avg = Math.round(val / wt);
|
|
373
|
+
value.set('disc', disc);
|
|
374
|
+
value.set('avg', avg);
|
|
375
|
+
rows.add(rowVal);
|
|
376
|
+
let strRowTotalKey = grpVal + '#' + rowVal + '#' + status;
|
|
377
|
+
let rTotal = this.rowTotal.get(strRowTotalKey) == null ? new Map() : this.rowTotal.get(strRowTotalKey);
|
|
378
|
+
let lCount = rTotal.get('count') == null ? 0 : rTotal.get('count');
|
|
379
|
+
let lWt = rTotal.get('wt') == null ? 0 : rTotal.get('wt');
|
|
380
|
+
let lRap = rTotal.get('rap') == null ? 0 : rTotal.get('rap');
|
|
381
|
+
let lVal = rTotal.get('value') == null ? 0 : rTotal.get('value');
|
|
382
|
+
let lAge = rTotal.get('age') == null ? 0 : rTotal.get('age');
|
|
383
|
+
let lValueAge = rTotal.get('valueage') == null ? 0 : rTotal.get('valueage');
|
|
384
|
+
rTotal.set('count', lCount + count);
|
|
385
|
+
rTotal.set('wt', lWt + wt);
|
|
386
|
+
rTotal.set('rap', lRap + rap);
|
|
387
|
+
rTotal.set('value', lVal + val);
|
|
388
|
+
rTotal.set('disc', ((((lVal + val) * 100) / (lRap + rap)) - 100));
|
|
389
|
+
rTotal.set('avg', (lVal + val) / (lWt + wt));
|
|
390
|
+
rTotal.set('age', ((lAge * lCount) + age) / (lCount + 1));
|
|
391
|
+
rTotal.set('valueage', ((lValueAge * lAge) + (age * val)) / (lValueAge + val));
|
|
392
|
+
this.rowTotal.set(strRowTotalKey, rTotal);
|
|
393
|
+
cols.add(colVal);
|
|
394
|
+
let strColTotalKey = grpVal + '#' + colVal + '#' + status;
|
|
395
|
+
let cTotal = this.colTotal.get(strColTotalKey) == null ? new Map() : this.colTotal.get(strColTotalKey);
|
|
396
|
+
let cCount = cTotal.get('count') == null ? 0 : cTotal.get('count');
|
|
397
|
+
let cWt = cTotal.get('wt') == null ? 0 : cTotal.get('wt');
|
|
398
|
+
let cRap = cTotal.get('rap') == null ? 0 : cTotal.get('rap');
|
|
399
|
+
let cVal = cTotal.get('value') == null ? 0 : cTotal.get('value');
|
|
400
|
+
let cAge = cTotal.get('age') == null ? 0 : cTotal.get('age');
|
|
401
|
+
let cValueAge = cTotal.get('valueage') == null ? 0 : cTotal.get('valueage');
|
|
402
|
+
cTotal.set('count', cCount + count);
|
|
403
|
+
cTotal.set('wt', cWt + wt);
|
|
404
|
+
cTotal.set('rap', cRap + rap);
|
|
405
|
+
cTotal.set('value', cVal + val);
|
|
406
|
+
cTotal.set('disc', ((((cVal + val) * 100) / (cRap + rap)) - 100));
|
|
407
|
+
cTotal.set('avg', (cVal + val) / (cWt + wt));
|
|
408
|
+
cTotal.set('age', ((cAge * cCount) + age) / (cCount + 1));
|
|
409
|
+
cTotal.set('valueage', ((cValueAge * cAge) + (age * val)) / (cValueAge + val));
|
|
410
|
+
this.colTotal.set(strColTotalKey, cTotal);
|
|
411
|
+
if (!stt.has(status))
|
|
412
|
+
stt.add(status);
|
|
413
|
+
if (!grps.has(grpVal))
|
|
414
|
+
grps.add(grpVal);
|
|
415
|
+
});
|
|
416
|
+
let sortedRows = Array.from(rows).sort();
|
|
417
|
+
let sortedCols = Array.from(cols).sort();
|
|
418
|
+
let sortedStt = Array.from(stt).sort();
|
|
419
|
+
this.sortedGrp = Array.from(grps); //.sort();
|
|
420
|
+
// console.log(sortedRows);
|
|
421
|
+
// console.log(sortedCols);
|
|
422
|
+
// console.log(sortedStt);
|
|
423
|
+
// console.log(this.sortedGrp);
|
|
424
|
+
// let keyValObj = {};
|
|
425
|
+
// let garr = [];
|
|
426
|
+
////for grid data
|
|
427
|
+
sortedRows.forEach(row => {
|
|
428
|
+
sortedCols.forEach(cols => {
|
|
429
|
+
this.sortedGrp.forEach(grp => {
|
|
430
|
+
let currAvgVal = 0;
|
|
431
|
+
let prevAvgVal = 0;
|
|
432
|
+
let currCountVal = 0;
|
|
433
|
+
let prevCountVal = 0;
|
|
434
|
+
let pAVGCOLOR = '';
|
|
435
|
+
let pCOUNTCOLOR = '';
|
|
436
|
+
for (let i = 0; i < sortedStt.length || 0; i++) {
|
|
437
|
+
let gblGridSubMap = new Map();
|
|
438
|
+
if (i == 0) {
|
|
439
|
+
gblGridSubMap.set('AVGCOLOR', "#dddddd");
|
|
440
|
+
gblGridSubMap.set('COUNTCOLOR', "#dddddd");
|
|
441
|
+
this.gblGrdDataColor.set(grp + '#' + row + '#' + cols + '#' + sortedStt[i], gblGridSubMap);
|
|
442
|
+
if (this.matrix.has(grp + '#' + row + '#' + cols + '#' + sortedStt[i])) {
|
|
443
|
+
prevAvgVal = this.matrix.get(grp + '#' + row + '#' + cols + '#' + sortedStt[i]).get('avg') || 0;
|
|
444
|
+
prevCountVal = this.matrix.get(grp + '#' + row + '#' + cols + '#' + sortedStt[i]).get('count') || 0;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
if (this.matrix.has(grp + '#' + row + '#' + cols + '#' + sortedStt[i])) {
|
|
449
|
+
currAvgVal = this.matrix.get(grp + '#' + row + '#' + cols + '#' + sortedStt[i]).get('avg') || 0;
|
|
450
|
+
currCountVal = this.matrix.get(grp + '#' + row + '#' + cols + '#' + sortedStt[i]).get('count') || 0;
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
currCountVal = 0;
|
|
454
|
+
currAvgVal = 0;
|
|
455
|
+
}
|
|
456
|
+
if (currCountVal > 0 && prevCountVal > 0) {
|
|
457
|
+
let AVGCOLOR = '#ff000047';
|
|
458
|
+
let COUNTCOLOR = '#ff000047';
|
|
459
|
+
if (currAvgVal == prevAvgVal) {
|
|
460
|
+
AVGCOLOR = pAVGCOLOR;
|
|
461
|
+
}
|
|
462
|
+
else if (currAvgVal > prevAvgVal) {
|
|
463
|
+
AVGCOLOR = '#00800054';
|
|
464
|
+
}
|
|
465
|
+
if (currCountVal == prevCountVal) {
|
|
466
|
+
COUNTCOLOR = pCOUNTCOLOR;
|
|
467
|
+
}
|
|
468
|
+
else if (currCountVal > prevCountVal) {
|
|
469
|
+
COUNTCOLOR = '#00800054';
|
|
470
|
+
}
|
|
471
|
+
pCOUNTCOLOR = COUNTCOLOR;
|
|
472
|
+
pAVGCOLOR = AVGCOLOR;
|
|
473
|
+
gblGridSubMap.set('AVGCOLOR', AVGCOLOR);
|
|
474
|
+
gblGridSubMap.set('COUNTCOLOR', COUNTCOLOR); //#00800054==green //ff000047 == red
|
|
475
|
+
this.gblGrdDataColor.set(grp + '#' + row + '#' + cols + '#' + sortedStt[i], gblGridSubMap);
|
|
476
|
+
prevCountVal = currCountVal;
|
|
477
|
+
prevAvgVal = currAvgVal;
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
gblGridSubMap.set('AVGCOLOR', 'white');
|
|
481
|
+
gblGridSubMap.set('COUNTCOLOR', 'white'); //#00800054==green //ff000047 == red
|
|
482
|
+
this.gblGrdDataColor.set(grp + '#' + row + '#' + cols + '#' + sortedStt[i], gblGridSubMap);
|
|
483
|
+
if (currCountVal > 0) {
|
|
484
|
+
prevCountVal = currCountVal;
|
|
485
|
+
prevAvgVal = currAvgVal;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
// this.gblGrpArr = {...garr};
|
|
494
|
+
console.log(this.gblGrdDataColor);
|
|
495
|
+
this.arrtDtl[this.sideval[0] + '#p'].map(ele1 => {
|
|
496
|
+
sortedRows.forEach(ele2 => {
|
|
497
|
+
if (ele1 == ele2) {
|
|
498
|
+
this.side.push(ele1);
|
|
499
|
+
}
|
|
500
|
+
});
|
|
501
|
+
});
|
|
502
|
+
this.arrtDtl[this.headval[0] + '#p'].map(ele1 => {
|
|
503
|
+
sortedCols.forEach(ele2 => {
|
|
504
|
+
if (ele1 == ele2) {
|
|
505
|
+
this.head.push(ele1);
|
|
506
|
+
}
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
// console.log("marix", this.matrix);
|
|
510
|
+
this.stt = [...sortedStt];
|
|
511
|
+
this.rowTotal.forEach((value, key) => {
|
|
512
|
+
let lKey = key;
|
|
513
|
+
let count = parseFloat(value.get('count'));
|
|
514
|
+
let val = parseFloat(value.get('value'));
|
|
515
|
+
let grpVal = lKey.split('#')[0];
|
|
516
|
+
let rowVal = lKey.split('#')[1];
|
|
517
|
+
let status = lKey.split('#')[2];
|
|
518
|
+
let wt = parseFloat(value.get('wt'));
|
|
519
|
+
let rap = parseFloat(value.get('rap'));
|
|
520
|
+
let svpd = parseFloat(value.get('svpd')) == undefined ? 0 : parseFloat(value.get('svpd'));
|
|
521
|
+
let msd = parseFloat(value.get('msd')) == undefined ? 0 : parseFloat(value.get('msd'));
|
|
522
|
+
let age = parseFloat(value.get('age'));
|
|
523
|
+
let valueAge = parseFloat(value.get('valueage'));
|
|
524
|
+
let gtKey = "GT#" + grpVal + "#" + status;
|
|
525
|
+
let cTotal = this.grandTotal.get(gtKey) == null ? new Map() : this.grandTotal.get(gtKey);
|
|
526
|
+
let cCount = cTotal.get('count') == null ? 0 : cTotal.get('count');
|
|
527
|
+
let cWt = cTotal.get('wt') == null ? 0 : cTotal.get('wt');
|
|
528
|
+
let cRap = cTotal.get('rap') == null ? 0 : cTotal.get('rap');
|
|
529
|
+
let cVal = cTotal.get('value') == null ? 0 : cTotal.get('value');
|
|
530
|
+
let cAge = cTotal.get('age') == null ? 0 : cTotal.get('age');
|
|
531
|
+
let cValueAge = cTotal.get('valueage') == null ? 0 : cTotal.get('valueage');
|
|
532
|
+
cTotal.set('count', cCount + count);
|
|
533
|
+
cTotal.set('wt', cWt + wt);
|
|
534
|
+
cTotal.set('rap', cRap + rap);
|
|
535
|
+
cTotal.set('value', cVal + val);
|
|
536
|
+
cTotal.set('disc', ((((cVal + val) * 100) / (cRap + rap)) - 100));
|
|
537
|
+
cTotal.set('avg', (cVal + val) / (cWt + wt));
|
|
538
|
+
cTotal.set('age', ((cAge * cCount) + age) / (cCount + 1));
|
|
539
|
+
cTotal.set('valueage', ((cValueAge * cVal) + (valueAge * val)) / (cVal + val));
|
|
540
|
+
this.grandTotal.set(gtKey, cTotal);
|
|
541
|
+
let isSold = false;
|
|
542
|
+
if (this.anaGrpStt.indexOf(status) == -1)
|
|
543
|
+
isSold = true;
|
|
544
|
+
if (isSold) {
|
|
545
|
+
let cmpData = this.rowTotal.get(grpVal + '#' + rowVal + '#mkt');
|
|
546
|
+
debugger;
|
|
547
|
+
if (cmpData != undefined) {
|
|
548
|
+
let cmpCount = parseFloat(cmpData.get('count'));
|
|
549
|
+
let msd = Math.round(period * cmpCount / count);
|
|
550
|
+
value.set('msd', msd);
|
|
551
|
+
let cmpval = parseFloat(cmpData.get('value'));
|
|
552
|
+
let msdvlu = Math.round(period * cmpval / val);
|
|
553
|
+
value.set('msdvlu', msdvlu);
|
|
554
|
+
let chkcount = (stockdays * count / period);
|
|
555
|
+
let netratio = (chkcount * 100) / cmpCount;
|
|
556
|
+
let gridcolor = '#ffff00';
|
|
557
|
+
if (netratio <= 30) {
|
|
558
|
+
gridcolor = dred;
|
|
559
|
+
}
|
|
560
|
+
else if (netratio > 30 && netratio < 60) {
|
|
561
|
+
gridcolor = mred;
|
|
562
|
+
}
|
|
563
|
+
else if (netratio >= 60 && netratio < minvariation) {
|
|
564
|
+
gridcolor = lred;
|
|
565
|
+
}
|
|
566
|
+
else if (netratio >= minvariation && netratio < maxvariation) {
|
|
567
|
+
gridcolor = 'rgba(255, 255, 0, 0.38)';
|
|
568
|
+
}
|
|
569
|
+
else if (netratio >= maxvariation && netratio < 200) {
|
|
570
|
+
gridcolor = lgreen;
|
|
571
|
+
}
|
|
572
|
+
else if (netratio >= 200 && netratio < 300) {
|
|
573
|
+
gridcolor = mgreen;
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
gridcolor = dgreen;
|
|
577
|
+
}
|
|
578
|
+
value.set('grpcolor', gridcolor);
|
|
579
|
+
}
|
|
580
|
+
let svpd = Math.round(val / period);
|
|
581
|
+
value.set('svpd', svpd);
|
|
582
|
+
}
|
|
583
|
+
if (status == 'mkt')
|
|
584
|
+
value.set('grpcolor', '#dddddd');
|
|
585
|
+
});
|
|
586
|
+
////for rowwise total
|
|
587
|
+
// sortedRows.forEach(row => {
|
|
588
|
+
// this.sortedGrp.forEach(grp => {
|
|
589
|
+
// for (let i = 0; i < sortedStt.length || 0; i++) {
|
|
590
|
+
// debugger
|
|
591
|
+
// let currVal;
|
|
592
|
+
// let prevVal;
|
|
593
|
+
// let currCount;
|
|
594
|
+
// let prevCount;
|
|
595
|
+
// if (i == 0) {
|
|
596
|
+
// this.gblRowTotColorValWise.set(grp + '#' + row + '#' + sortedStt[i], "#dddddd");
|
|
597
|
+
// }
|
|
598
|
+
// else {
|
|
599
|
+
// console.log(this.matrix);
|
|
600
|
+
// if (this.rowTotal.has(grp + '#' + row + '#' + sortedStt[i])) {
|
|
601
|
+
// currVal = this.rowTotal.get(grp + '#' + row + '#' + sortedStt[i]).get('value') || 0;
|
|
602
|
+
// currCount = this.rowTotal.get(grp + '#' + row + '#' + sortedStt[i]).get('count') || 0;
|
|
603
|
+
// }
|
|
604
|
+
// if (this.rowTotal.has(grp + '#' + row + '#' + sortedStt[i - 1])) {
|
|
605
|
+
// prevVal = this.rowTotal.get(grp + '#' + row + '#' + sortedStt[i - 1]).get('value') || 0;//pass dynamic value as per user select in ddl
|
|
606
|
+
// prevCount = this.rowTotal.get(grp + '#' + row + '#' + sortedStt[i - 1]).get('count') || 0;
|
|
607
|
+
// }
|
|
608
|
+
// this.gblRowTotColorValWise.set(grp + '#' + row + '#' + sortedStt[i], ((currVal == 0 || currVal == null || currVal == undefined || prevVal == 0 || prevVal == null || prevVal == undefined) ? '' : (currVal > 0 && currVal > prevVal) ? 'green' : 'red'));
|
|
609
|
+
// // this.gblRowTotColorValWise.set(grp + '#' + row + '#' + sortedStt[i], ((currCount == 0 || currCount == null || currCount == undefined || prevCount == 0 || prevCount == null || prevCount == undefined) ? '' : (currCount > 0 && currCount > prevCount) ? 'green' : 'red'));
|
|
610
|
+
// }
|
|
611
|
+
// }
|
|
612
|
+
// });
|
|
613
|
+
// });
|
|
614
|
+
// console.log(this.gblRowTotColorValWise);
|
|
615
|
+
// this.colTotal.forEach((value, key) => {
|
|
616
|
+
// let lKey = key;
|
|
617
|
+
// let count = parseFloat(value.get('count'));
|
|
618
|
+
// let val = parseFloat(value.get('value'));
|
|
619
|
+
// let grpVal = lKey.split('#')[0];
|
|
620
|
+
// let colVal = lKey.split('#')[1];
|
|
621
|
+
// let status = lKey.split('#')[2];
|
|
622
|
+
// let isSold = false;
|
|
623
|
+
// if (this.anaGrpStt.indexOf(status) == -1)
|
|
624
|
+
// isSold = true;
|
|
625
|
+
// if (isSold) {
|
|
626
|
+
// let cmpData = this.colTotal.get(grpVal + '#' + colVal + '#mkt');
|
|
627
|
+
// if (cmpData != undefined) {
|
|
628
|
+
// let cmpCount = parseFloat(cmpData.get('count'));
|
|
629
|
+
// let msd = Math.round(period * cmpCount / count);
|
|
630
|
+
// value.set('msd', msd);
|
|
631
|
+
// let chkcount = (stockdays * count / period);
|
|
632
|
+
// let mincount = (chkcount * minvariation);
|
|
633
|
+
// let maxcount = (chkcount * maxvariation);
|
|
634
|
+
// let gridcolor = '#00800054';
|
|
635
|
+
// if (cmpCount > maxcount) {
|
|
636
|
+
// gridcolor = '#ff000047';
|
|
637
|
+
// } else if (cmpCount >= mincount && cmpCount <= maxcount) {
|
|
638
|
+
// gridcolor = '#ffff0061';
|
|
639
|
+
// }
|
|
640
|
+
// value.set('grpcolor', gridcolor);
|
|
641
|
+
// }
|
|
642
|
+
// let svpd = Math.round(val / period);
|
|
643
|
+
// value.set('svpd', svpd);
|
|
644
|
+
// }
|
|
645
|
+
// if (status == 'mkt')
|
|
646
|
+
// value.set('grpcolor', '#dddddd');
|
|
647
|
+
// });
|
|
648
|
+
this.colTotal.forEach((value, key) => {
|
|
649
|
+
let lKey = key;
|
|
650
|
+
let count = parseFloat(value.get('count'));
|
|
651
|
+
if (this.formname == 'mixAnalysisReportForm')
|
|
652
|
+
count = parseFloat(value.get('wt'));
|
|
653
|
+
let val = parseFloat(value.get('value'));
|
|
654
|
+
let grpVal = lKey.split('#')[0];
|
|
655
|
+
let rowVal = lKey.split('#')[1];
|
|
656
|
+
let status = lKey.split('#')[2];
|
|
657
|
+
let wt = parseFloat(value.get('wt'));
|
|
658
|
+
let rap = parseFloat(value.get('rap'));
|
|
659
|
+
let svpd = parseFloat(value.get('svpd')) == undefined ? 0 : parseFloat(value.get('svpd'));
|
|
660
|
+
let msd = parseFloat(value.get('msd')) == undefined ? 0 : parseFloat(value.get('msd'));
|
|
661
|
+
let age = parseFloat(value.get('age'));
|
|
662
|
+
let valueAge = parseFloat(value.get('valueage'));
|
|
663
|
+
let isSold = false;
|
|
664
|
+
if (this.anaGrpStt.indexOf(status) == -1)
|
|
665
|
+
isSold = true;
|
|
666
|
+
if (isSold) {
|
|
667
|
+
let cmpData = this.colTotal.get(grpVal + '#' + rowVal + '#mkt');
|
|
668
|
+
if (cmpData != undefined) {
|
|
669
|
+
let cmpCount = parseFloat(cmpData.get('count'));
|
|
670
|
+
let msd = Math.round(period * cmpCount / count);
|
|
671
|
+
value.set('msd', msd);
|
|
672
|
+
let cmpval = parseFloat(cmpData.get('value'));
|
|
673
|
+
let msdvlu = Math.round(period * cmpval / val);
|
|
674
|
+
value.set('msdvlu', msdvlu);
|
|
675
|
+
let chkcount = (stockdays * count / period);
|
|
676
|
+
let netratio = (chkcount * 100) / cmpCount;
|
|
677
|
+
let gridcolor = '#ffff00';
|
|
678
|
+
if (netratio <= 30) {
|
|
679
|
+
gridcolor = dred;
|
|
680
|
+
}
|
|
681
|
+
else if (netratio > 30 && netratio < 60) {
|
|
682
|
+
gridcolor = mred;
|
|
683
|
+
}
|
|
684
|
+
else if (netratio >= 60 && netratio < minvariation) {
|
|
685
|
+
gridcolor = lred;
|
|
686
|
+
}
|
|
687
|
+
else if (netratio >= minvariation && netratio < maxvariation) {
|
|
688
|
+
gridcolor = 'rgba(255, 255, 0, 0.38)';
|
|
689
|
+
}
|
|
690
|
+
else if (netratio >= maxvariation && netratio < 200) {
|
|
691
|
+
gridcolor = lgreen;
|
|
692
|
+
}
|
|
693
|
+
else if (netratio >= 200 && netratio < 300) {
|
|
694
|
+
gridcolor = mgreen;
|
|
695
|
+
}
|
|
696
|
+
else {
|
|
697
|
+
gridcolor = dgreen;
|
|
698
|
+
}
|
|
699
|
+
value.set('grpcolor', gridcolor);
|
|
700
|
+
}
|
|
701
|
+
let svpd = Math.round(val / period);
|
|
702
|
+
value.set('svpd', svpd);
|
|
703
|
+
}
|
|
704
|
+
if (status == 'mkt')
|
|
705
|
+
value.set('grpcolor', '#dddddd');
|
|
706
|
+
});
|
|
707
|
+
// Grand Summaries
|
|
708
|
+
this.sortedGrp.map(ele => {
|
|
709
|
+
let mktKey = "GT#" + ele + "#mkt";
|
|
710
|
+
//let soldKey = "GT#" + ele + "#sold";
|
|
711
|
+
let soldKey = "";
|
|
712
|
+
let mkt = this.grandTotal.get(mktKey) == null ? new Map() : this.grandTotal.get(mktKey);
|
|
713
|
+
let mktCount = mkt.get('count') == null ? 0 : mkt.get('count');
|
|
714
|
+
let mktVale = parseFloat(mkt.get('value') == null ? 0 : mkt.get('value'));
|
|
715
|
+
this.stt.forEach(st => {
|
|
716
|
+
let status = st;
|
|
717
|
+
soldKey = "GT#" + ele + '#' + st;
|
|
718
|
+
let sold = this.grandTotal.get(soldKey) == null ? new Map() : this.grandTotal.get(soldKey);
|
|
719
|
+
let soldCount = sold.get('count') == null ? 0 : sold.get('count');
|
|
720
|
+
let msd = Math.round(diffday * mktCount / soldCount);
|
|
721
|
+
let soldvalue = parseFloat(sold.get('value') == null ? 0 : sold.get('value'));
|
|
722
|
+
//let svpd = Math.round(soldvalue / diffday);
|
|
723
|
+
sold.set('msd', msd);
|
|
724
|
+
// sold.set('svpd', svpd);
|
|
725
|
+
//this.grandTotal.set(mktKey, mkt);
|
|
726
|
+
let msdvlu = Math.round(diffday * mktVale / soldvalue);
|
|
727
|
+
sold.set('msdvlu', msdvlu);
|
|
728
|
+
let isSold = false;
|
|
729
|
+
if (this.anaGrpStt.indexOf(status) == -1)
|
|
730
|
+
isSold = true;
|
|
731
|
+
if (isSold) {
|
|
732
|
+
let cmpCount = mktCount;
|
|
733
|
+
let msd = Math.round(period * cmpCount / soldCount);
|
|
734
|
+
sold.set('msd', msd);
|
|
735
|
+
let msdvlu = Math.round(period * mktVale / soldvalue);
|
|
736
|
+
sold.set('msdvlu', msdvlu);
|
|
737
|
+
let chkcount = (stockdays * soldCount / period);
|
|
738
|
+
let mincount = (chkcount * minvariation);
|
|
739
|
+
let maxcount = (chkcount * maxvariation);
|
|
740
|
+
let gridcolor = '#00800054';
|
|
741
|
+
if (cmpCount > maxcount) {
|
|
742
|
+
gridcolor = '#ff000047';
|
|
743
|
+
}
|
|
744
|
+
else if (cmpCount >= mincount && cmpCount <= maxcount) {
|
|
745
|
+
gridcolor = '#ffff0061';
|
|
746
|
+
}
|
|
747
|
+
sold.set('grpcolor', gridcolor);
|
|
748
|
+
}
|
|
749
|
+
let svpd = Math.round(soldvalue / period);
|
|
750
|
+
sold.set('svpd', svpd);
|
|
751
|
+
// }
|
|
752
|
+
if (status == 'mkt')
|
|
753
|
+
sold.set('grpcolor', '#dddddd');
|
|
754
|
+
this.grandTotal.set(soldKey, sold);
|
|
755
|
+
});
|
|
756
|
+
});
|
|
757
|
+
}
|
|
758
|
+
modifySearch() {
|
|
759
|
+
localStorage.setItem('BIcall', 'BImodify');
|
|
760
|
+
this.router.navigate([this.modulename + '/analysis-search/' + this.route.snapshot.params['frmnme']]);
|
|
761
|
+
}
|
|
762
|
+
OnChangeBy(ValType) {
|
|
763
|
+
this.isApplied = true;
|
|
764
|
+
this.key = ValType;
|
|
765
|
+
}
|
|
766
|
+
getData(call, key, st) {
|
|
767
|
+
let pktdata = [];
|
|
768
|
+
let temparr = [];
|
|
769
|
+
if (call == 'cell') {
|
|
770
|
+
pktdata = pktdata.concat([], Array.from(this.pktData.get(key)));
|
|
771
|
+
}
|
|
772
|
+
else if (call == 'row') {
|
|
773
|
+
this.head.forEach(element => {
|
|
774
|
+
if (this.pktData.get(key + '#' + element) != null && this.pktData.get(key + '#' + element) != "" && this.pktData.get(key + '#' + element) != undefined) {
|
|
775
|
+
pktdata = pktdata.concat([], Array.from(this.pktData.get(key + '#' + element)));
|
|
776
|
+
}
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
else if (call == 'col') {
|
|
780
|
+
this.side.forEach(element => {
|
|
781
|
+
let k = key.split('#');
|
|
782
|
+
let kc = k[0] + '#' + element + '#' + k[1];
|
|
783
|
+
if (this.pktData.get(kc) != null && this.pktData.get(kc) != "" && this.pktData.get(kc) != undefined) {
|
|
784
|
+
pktdata = pktdata.concat([], Array.from(this.pktData.get(kc)));
|
|
785
|
+
}
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
else if (call == 'all') {
|
|
789
|
+
localStorage.setItem('pktData', JSON.stringify(this.schDtl));
|
|
790
|
+
localStorage.setItem('resultView', JSON.stringify(this.result.resultView));
|
|
791
|
+
localStorage.setItem('resultViewDtl', JSON.stringify(this.result.resultViewDtl));
|
|
792
|
+
return;
|
|
793
|
+
}
|
|
794
|
+
// pktdata = pktdata.filter(e => e.grp_stt == st);
|
|
795
|
+
let pd = _.sortBy(pktdata, ['co', 'pu']).reverse();
|
|
796
|
+
localStorage.setItem('pktData', JSON.stringify(pktdata));
|
|
797
|
+
localStorage.setItem('resultView', JSON.stringify(this.result.resultView));
|
|
798
|
+
localStorage.setItem('resultViewDtl', JSON.stringify(this.result.resultViewDtl));
|
|
799
|
+
// this.router.navigate(['bi/pkt-list']);
|
|
800
|
+
}
|
|
801
|
+
// "Cushion Mod,0.50,#H"
|
|
802
|
+
getAll(stt, head, side, grp) {
|
|
803
|
+
let key = '';
|
|
804
|
+
let pktdata = [];
|
|
805
|
+
// head.forEach(hd => {
|
|
806
|
+
// stt.forEach(st => {
|
|
807
|
+
// key = grp + ',' + '#' + hd + ',' + '#' + st;
|
|
808
|
+
// if (this.headData.get(key) != null && this.headData.get(key) != "" && this.headData.get(key) != undefined) {
|
|
809
|
+
// pktdata = pktdata.concat([], Array.from(this.headData.get(key)));
|
|
810
|
+
// console.log(key);
|
|
811
|
+
// }
|
|
812
|
+
// });
|
|
813
|
+
// });
|
|
814
|
+
side.forEach(sd => {
|
|
815
|
+
stt.forEach(st => {
|
|
816
|
+
key = grp + ',' + '#' + sd + ',' + '#' + st;
|
|
817
|
+
if (this.sideData.get(key) != null && this.sideData.get(key) != "" && this.sideData.get(key) != undefined) {
|
|
818
|
+
pktdata = pktdata.concat([], Array.from(this.sideData.get(key)));
|
|
819
|
+
}
|
|
820
|
+
});
|
|
821
|
+
});
|
|
822
|
+
localStorage.setItem('pktData', JSON.stringify(pktdata));
|
|
823
|
+
localStorage.setItem('resultView', JSON.stringify(this.result.resultView));
|
|
824
|
+
localStorage.setItem('resultViewDtl', JSON.stringify(this.result.resultViewDtl));
|
|
825
|
+
}
|
|
826
|
+
hideShow(call, status) {
|
|
827
|
+
// var dates = document.querySelectorAll('*[id^="' + index + '"]');
|
|
828
|
+
// let nodes = (document.querySelectorAll('[id^="' + call + '"]') as any);
|
|
829
|
+
// if (status) {
|
|
830
|
+
// nodes.forEach(element => {
|
|
831
|
+
// // console.log();
|
|
832
|
+
// document.getElementById(element.id).style.display = 'block';
|
|
833
|
+
// });
|
|
834
|
+
// } else {
|
|
835
|
+
// nodes.forEach(element => {
|
|
836
|
+
// console.log();
|
|
837
|
+
// document.getElementById(element.id).style.display = 'none';
|
|
838
|
+
// });
|
|
839
|
+
// }
|
|
840
|
+
// document.getElementById(call);
|
|
841
|
+
if (call == 'CTS') {
|
|
842
|
+
this.wt = !this.wt;
|
|
843
|
+
}
|
|
844
|
+
else if (call == 'AVG') {
|
|
845
|
+
this.avg = !this.avg;
|
|
846
|
+
}
|
|
847
|
+
else if (call == 'RAP') {
|
|
848
|
+
this.rap = !this.rap;
|
|
849
|
+
}
|
|
850
|
+
else if (call == 'VLU') {
|
|
851
|
+
this.val = !this.val;
|
|
852
|
+
}
|
|
853
|
+
else if (call == 'SVP') {
|
|
854
|
+
this.svpd = !this.svpd;
|
|
855
|
+
}
|
|
856
|
+
else if (call == 'MSD') {
|
|
857
|
+
this.msd = !this.msd;
|
|
858
|
+
}
|
|
859
|
+
else if (call == 'MSDVLU') {
|
|
860
|
+
this.msdvlu = !this.msdvlu;
|
|
861
|
+
}
|
|
862
|
+
else if (call == 'AGE') {
|
|
863
|
+
this.age = !this.age;
|
|
864
|
+
}
|
|
865
|
+
else if (call == 'VA') {
|
|
866
|
+
this.va = !this.va;
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
changeGrp(gridGrp) {
|
|
870
|
+
this.generateGridGrpWise('c', gridGrp);
|
|
871
|
+
}
|
|
872
|
+
generateGridGrpWise(call, selectedgrp) {
|
|
873
|
+
this.grpval = '';
|
|
874
|
+
this.headval = '';
|
|
875
|
+
this.sideval = '';
|
|
876
|
+
this.matrix.clear();
|
|
877
|
+
this.rowTotal.clear();
|
|
878
|
+
this.colTotal.clear();
|
|
879
|
+
this.grandTotal.clear();
|
|
880
|
+
this.pktData.clear();
|
|
881
|
+
this.head = [];
|
|
882
|
+
this.side = [];
|
|
883
|
+
let grps = selectedgrp.group.split(',');
|
|
884
|
+
let head = selectedgrp.head.split(',');
|
|
885
|
+
let side = selectedgrp.side.split(',');
|
|
886
|
+
this.grpval = [...grps];
|
|
887
|
+
this.headval = [...head];
|
|
888
|
+
this.sideval = [...side];
|
|
889
|
+
this.createGrid();
|
|
890
|
+
}
|
|
891
|
+
btnVisibilityByPos() {
|
|
892
|
+
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 10) {
|
|
893
|
+
// document.getElementById("btnGoTop").style.display = "block";
|
|
894
|
+
document.getElementById("staticHead").style.top = "50px";
|
|
895
|
+
}
|
|
896
|
+
else {
|
|
897
|
+
document.getElementById("staticHead").style.top = "110px";
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
creategrpPie(pieStatusList, grp, attr, piechartDataList, typ) {
|
|
901
|
+
this.isshowchart = false;
|
|
902
|
+
this.ChatMapDtl = {};
|
|
903
|
+
pieStatusList.forEach(status => {
|
|
904
|
+
let pieChartLabels = [];
|
|
905
|
+
let pieChartData = [];
|
|
906
|
+
let pieChartlegend = [];
|
|
907
|
+
piechartDataList.forEach(data => {
|
|
908
|
+
let dtl;
|
|
909
|
+
if (typ == 'head') {
|
|
910
|
+
dtl = this.matrix.get(grp + "#" + data + "#" + attr + "#" + status) || '';
|
|
911
|
+
}
|
|
912
|
+
else {
|
|
913
|
+
dtl = this.matrix.get(grp + "#" + attr + "#" + data + "#" + status) || '';
|
|
914
|
+
}
|
|
915
|
+
if (dtl != '') {
|
|
916
|
+
let cnt = dtl.get('count') || '';
|
|
917
|
+
if (cnt != '' && cnt != '0')
|
|
918
|
+
pieChartData.push(parseInt(cnt));
|
|
919
|
+
pieChartLabels.push(data);
|
|
920
|
+
pieChartlegend.push(data);
|
|
921
|
+
}
|
|
922
|
+
});
|
|
923
|
+
this.ChatMapDtl[status + "_data"] = pieChartData;
|
|
924
|
+
this.ChatMapDtl[status + "_lable"] = pieChartLabels;
|
|
925
|
+
this.ChatMapDtl[status + "_legend"] = pieChartlegend;
|
|
926
|
+
});
|
|
927
|
+
this.ChartType = 'pie';
|
|
928
|
+
this.refreshChart('pie');
|
|
929
|
+
document.getElementById('PiechartModelBtn').click();
|
|
930
|
+
}
|
|
931
|
+
creategrpBar(pieStatusList, grp, attr, piechartDataList, typ) {
|
|
932
|
+
this.isbarshowchart = false;
|
|
933
|
+
this.barChartData = [];
|
|
934
|
+
this.barChartLabels = [];
|
|
935
|
+
pieStatusList.forEach(status => {
|
|
936
|
+
let barcharDtl = {};
|
|
937
|
+
let barchatlist = [];
|
|
938
|
+
let linechartList = [];
|
|
939
|
+
piechartDataList.forEach(data => {
|
|
940
|
+
let dtl;
|
|
941
|
+
if (typ == 'head') {
|
|
942
|
+
dtl = this.matrix.get(grp + "#" + data + "#" + attr + "#" + status) || '';
|
|
943
|
+
}
|
|
944
|
+
else {
|
|
945
|
+
dtl = this.matrix.get(grp + "#" + attr + "#" + data + "#" + status) || '';
|
|
946
|
+
}
|
|
947
|
+
if (this.barChartLabels.indexOf(data) == -1) {
|
|
948
|
+
this.barChartLabels.push(data);
|
|
949
|
+
}
|
|
950
|
+
if (dtl != '') {
|
|
951
|
+
let cnt = dtl.get('count') || '0';
|
|
952
|
+
let avg = dtl.get('avg') || '0';
|
|
953
|
+
barchatlist.push(cnt);
|
|
954
|
+
linechartList.push(avg);
|
|
955
|
+
}
|
|
956
|
+
else {
|
|
957
|
+
barchatlist.push('0');
|
|
958
|
+
linechartList.push('0');
|
|
959
|
+
}
|
|
960
|
+
});
|
|
961
|
+
debugger;
|
|
962
|
+
barcharDtl['label'] = status + " Qty";
|
|
963
|
+
barcharDtl['data'] = barchatlist;
|
|
964
|
+
barcharDtl['type'] = 'bar';
|
|
965
|
+
barcharDtl['yAxisID'] = 'y-axis-1';
|
|
966
|
+
this.barChartData.push(barcharDtl);
|
|
967
|
+
barcharDtl = {};
|
|
968
|
+
barcharDtl['label'] = status + " Avg";
|
|
969
|
+
barcharDtl['data'] = linechartList;
|
|
970
|
+
barcharDtl['type'] = 'line';
|
|
971
|
+
barcharDtl['fill'] = false;
|
|
972
|
+
barcharDtl['yAxisID'] = 'y-axis-2';
|
|
973
|
+
this.barChartData.push(barcharDtl);
|
|
974
|
+
});
|
|
975
|
+
this.barChartType = 'bar';
|
|
976
|
+
this.refreshChart('bar');
|
|
977
|
+
document.getElementById('barchartModelBtn').click();
|
|
978
|
+
}
|
|
979
|
+
refreshChart(type) {
|
|
980
|
+
setTimeout(() => {
|
|
981
|
+
if (type == 'bar')
|
|
982
|
+
this.isbarshowchart = true;
|
|
983
|
+
if (type == 'pie')
|
|
984
|
+
this.isshowchart = true;
|
|
985
|
+
}, 5);
|
|
986
|
+
}
|
|
987
|
+
ngOnInit() {
|
|
988
|
+
window.addEventListener('scroll', this.scroll, true);
|
|
989
|
+
this.route.params.subscribe(map => {
|
|
990
|
+
let schId = localStorage.getItem('srcIdns');
|
|
991
|
+
let period = localStorage.getItem('BIPeriod');
|
|
992
|
+
this.formname = this.route.snapshot.params['frmnme'];
|
|
993
|
+
this.srchHistory['period'] = period;
|
|
994
|
+
let frmdt = localStorage.getItem('BIpTo');
|
|
995
|
+
let todt = localStorage.getItem('BIpFrom');
|
|
996
|
+
this.cUrl = this.router.url;
|
|
997
|
+
this.modulename = this.cUrl.split('/')[1];
|
|
998
|
+
if (frmdt != null && frmdt != undefined) {
|
|
999
|
+
this.srchHistory['frmdt'] = (localStorage.getItem('BIpFrom')).replace(/['"]+/g, '');
|
|
1000
|
+
}
|
|
1001
|
+
if (todt != null && todt != undefined) {
|
|
1002
|
+
this.srchHistory['todt'] = (localStorage.getItem('BIpTo')).replace(/['"]+/g, '');
|
|
1003
|
+
}
|
|
1004
|
+
if (schId != undefined) {
|
|
1005
|
+
this.getSearchResult(schId, period);
|
|
1006
|
+
}
|
|
1007
|
+
});
|
|
1008
|
+
// this.groups = [
|
|
1009
|
+
// {
|
|
1010
|
+
// 'val': 'sh_sz_co_pu',
|
|
1011
|
+
// 'grp': 'sh,sz',
|
|
1012
|
+
// 'head': 'pu',
|
|
1013
|
+
// 'side': 'co',
|
|
1014
|
+
// }, {
|
|
1015
|
+
// 'val': 'sh_co_pu',
|
|
1016
|
+
// 'grp': 'sh',
|
|
1017
|
+
// 'head': 'pu',
|
|
1018
|
+
// 'side': 'co',
|
|
1019
|
+
// }, {
|
|
1020
|
+
// 'val': 'pur_co_pu',
|
|
1021
|
+
// 'grp': 'pur',
|
|
1022
|
+
// 'head': 'pu',
|
|
1023
|
+
// 'side': 'co',
|
|
1024
|
+
// }
|
|
1025
|
+
// ]
|
|
1026
|
+
// this.createGrid();
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
/** @nocollapse */ /** @nocollapse */ QaAnalysisComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: QaAnalysisComponent, deps: [{ token: i1.CommanServiceService }, { token: i2.BiService }, { token: i3.NgxSpinnerService }, { token: i4.ToastrService }, { token: i5.Router }, { token: i5.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
|
|
1030
|
+
/** @nocollapse */ /** @nocollapse */ QaAnalysisComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: QaAnalysisComponent, selector: "app-qa-analysis", 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> Analysis\r\n <span class=\"f-12\">({{cs.cDate | date:'medium'}})</span>\r\n <!-- <button (click)=\"test()\"></button> -->\r\n\r\n </h3>\r\n </div>\r\n </div>\r\n <div class=\"content-frame\">\r\n <div class=\"content-frame-body\" style=\"margin-left:0;\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <div class=\"row\" id=\"staticHead\"\r\n style=\" position: fixed;width: 100%;background: white;z-index: 99;padding-top:5px\">\r\n <div class=\"col-sm-4\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label>Grid Formate </label> \r\n <select class=\"form-control form-control-sm\" name=\"gridGrp\" (change)=\"changeGrp(gridGrp);\"\r\n [(ngModel)]=\"gridGrp\">\r\n <option *ngFor=\"let group of groups\" [ngValue]=\"group\">{{group.name}}</option>\r\n </select>\r\n </div>\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 </form>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"form-group\">\r\n <p style=\"font-weight: 600;\">Sale period {{srchHistory?.frmdt}} To\r\n {{srchHistory?.todt}} |\r\n Period {{srchHistory?.period}}</p>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">change By </label>\r\n <select style=\"width:80px;\" class=\"form-control form-control-sm\" name=\"ChangeBy\"\r\n (change)=\"OnChangeBy(ChangeBy);\" [(ngModel)]=\"ChangeBy\">\r\n <option value=\"COUNTCOLOR\">Qty</option>\r\n <option value=\"AVGCOLOR\">Avg</option>\r\n </select>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <div class=\"stats\">\r\n <input type=\"checkbox\" (click)=\"hideShow('CTS', $event.target.checked);\"> CTS\r\n <input type=\"checkbox\" (click)=\"hideShow('AVG', $event.target.checked);\"> AVG\r\n <input type=\"checkbox\" (click)=\"hideShow('RAP', $event.target.checked);\"> DISC\r\n <!-- <input type=\"checkbox\" (click)=\"hideShow('AGE', $event.target.checked);\"> AGE -->\r\n <input type=\"checkbox\" (click)=\"hideShow('VLU', $event.target.checked);\"> VLU\r\n\r\n <input type=\"checkbox\" (click)=\"hideShow('MSD', $event.target.checked);\"> MSD\r\n <input type=\"checkbox\" (click)=\"hideShow('MSDVLU', $event.target.checked);\"> MSD VLU\r\n <input type=\"checkbox\" (click)=\"hideShow('AGE', $event.target.checked);\"> AGE\r\n <input type=\"checkbox\" (click)=\"hideShow('VA', $event.target.checked);\"> VA\r\n <input type=\"checkbox\" (click)=\"hideShow('SVP', $event.target.checked);\"> SVPD\r\n </div>\r\n </div>\r\n <div class=\"grids\" style=\"margin-top: 75px;\">\r\n <div class=\"row\" *ngFor=\"let grp of sortedGrp;let i = index\">\r\n <div class=\"stats\">\r\n <strong>{{grp}} </strong>\r\n </div>\r\n <div class=\"table-responsive\" style=\"overflow-y: hidden;\r\n height: auto;\">\r\n <table class=\"table table-bordered analysisTable\">\r\n <ng-container>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th *ngFor=\"let hrd of head;\" class=\"text-center\" [attr.colspan]=\"stt?.length\">{{hrd}} <i\r\n class=\"fa fa-pie-chart\" (click)=\"creategrpPie(stt,grp,hrd,side,'head')\"\r\n aria-hidden=\"true\"></i>\r\n \r\n <i class=\"fa fa-bar-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpBar(stt,grp,hrd,side,'head')\" aria-hidden=\"true\"></i>\r\n </th>\r\n <th class=\"text-center\" colspan=\"2\" [attr.colspan]=\"stt?.length\">Total</th>\r\n </tr>\r\n <tr>\r\n <th></th>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <th *ngFor=\"let st of stt;\" class=\"text-center\">{{st}}\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" id=\"{{i}}\" class=\"text-center\">Wt</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">Avg</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">Disc</td>\r\n <td *ngIf=\"val\" class=\"text-center\">Value</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"msd\" class=\"text-center\">MSD</td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">MSD Vlu</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"age\" class=\"text-center\">AGE</td>\r\n <td *ngIf=\"va\" class=\"text-center\">VA</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">SVPD</td>\r\n <td class=\"text-center\"> </td>\r\n </tr>\r\n </table>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <th class=\"text-center\">{{st}}\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">Wt</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">Avg</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">Disc</td>\r\n <td *ngIf=\"val\" class=\"text-center\">Value</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"msd\" class=\"text-center\">MSD</td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">MSD Vlu</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"age\" class=\"text-center\">AGE</td>\r\n <td *ngIf=\"va\" class=\"text-center\">VA</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">SVPD</td>\r\n <td class=\"text-center\"> </td>\r\n </tr>\r\n </table>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let sid of side;\">\r\n <td class=\"text-center\">{{sid}} <i class=\"fa fa-pie-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpPie(stt,grp,sid,head,'side')\" aria-hidden=\"true\"></i> \r\n <i class=\"fa fa-bar-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpBar(stt,grp,sid,head,'side')\" aria-hidden=\"true\"></i>\r\n </td>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <td *ngFor=\"let st of stt;\"\r\n [ngStyle]=\"{'background':isApplied==true?gblGrdDataColor.get(grp+'#'+sid+'#'+hrd+'#'+st).get(key) : matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('grpcolor')}\"\r\n class=\"text-center\">\r\n <!-- <span>{{gblGrpArr[grp+'#'+sid+'#'+hrd+'#'+st] |json}}</span> -->\r\n <span class=\"cp\" data-toggle=\"tooltip\" data-placement=\"right\" title=\"Click here to get data\"\r\n data-placement=\"right\"><a href=\"javascript:void(0)\" target=\"_blank\"\r\n (click)=\"getData('cell', grp+'#'+sid+'#'+hrd,st);\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\">\r\n {{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('count')}}</a>\r\n </span>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" id=\"{{i}}\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt')== null )?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt'))}}</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')== null)?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg'))}}</td>\r\n\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')==\"\" || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')==null )?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg'))}}</td> -->\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc')== null)?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc'))}}</td>\r\n\r\n <td *ngIf=\"val\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value')==null)?'-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value'))}}</td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd')== '' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd') }}\r\n <!-- :{{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('msd') | json}} -->\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')}}</td>\r\n\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">{{cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age')==\"\" || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age')== null )?'-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age'))}}\r\n <!-- :{{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage')== '' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage')==null)? '-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage'))}}</td>\r\n </tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')}}</td>\r\n <td> </td>\r\n <tr>\r\n\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <td class=\"text-center\"\r\n [ngStyle]=\"{'background': rowTotal?.get(grp+'#'+sid+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\" (click)=\"getData('row', grp+'#'+sid,st);\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\">{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('count')}}</a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt'))}}\r\n </td>\r\n\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')}}\r\n </td> -->\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')==\"\" ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg'))}}\r\n </td>\r\n\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value')==null)?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')==null\r\n )?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')}}\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')==null)?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age')==\"\" ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age'))}}\r\n <!-- :{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage')==null)?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')==null)?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')}}\r\n </td>\r\n <td> </td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <td class=\"text-center\">Total</td>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <td *ngFor=\"let st of stt;\" class=\"text-center\"\r\n [ngStyle]=\"{'background': colTotal?.get(grp+'#'+hrd+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\"\r\n (click)=\"getData('col', grp+'#'+hrd,st);\">{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('count')}}</a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt'))}}\r\n </td>\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')}}\r\n </td> -->\r\n\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')==\"\" ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')==null\r\n )?'-':colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')}}\r\n </td>\r\n\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc') == '' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value')==''\r\n ||colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value')==null ) ?\r\n '-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd'))}}\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age'))}}\r\n <!-- :{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage')==null)?'-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd'))}}\r\n </td>\r\n <td> </td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <td class=\"text-center\"\r\n [ngStyle]=\"{'background': grandTotal?.get('GT#'+grp+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\" (click)=\"getAll(stt,head,side,grp)\">\r\n <!-- (click)=\"getData('all', '');\" -->\r\n {{grandTotal?.get('GT#'+grp+'#'+st)?.get('count')}}\r\n </a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('wt')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('wt'))}}\r\n </td>\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('avg')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('avg')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('avg'))}}\r\n\r\n\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('disc')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('disc')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('value')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('value')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd && st=='sold'\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('msd')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('msd')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('msd'))}}\r\n <!-- :{{grandTotal?.get('GT#'+grp+'#'+st)?.get('msd') | json}} -->\r\n </td>\r\n <td *ngIf=\"msdvlu && st=='sold'\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('age')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('age'))}}\r\n <!-- :{{grandTotal?.get('GT#'+grp+'#'+st)?.get('age') |json}} -->\r\n\r\n </td>\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd'))}}\r\n </td>\r\n <td> </td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </ng-container>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\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\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Pie Chart</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <div *ngIf=\"isshowchart\" class=\"col-sm-6\">\r\n <div with=\"100%\">\r\n <span style=\"font-size: 16px;font-weight: bold;\"> {{st}} Chart</span>\r\n </div>\r\n <div with=\"100%\">\r\n <canvas baseChart [data]=\"ChatMapDtl[st+'_data']\" [labels]=\"ChatMapDtl[st+'_lable']\"\r\n [legend]=\"ChatMapDtl[st+'_legend']\" [chartType]=\"ChartType\" [options]=\"chartOptions\"></canvas>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal fade\" id=\"barchartModel\" 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\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Bar Chart</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n\r\n\r\n <div *ngIf=\"isbarshowchart\" class=\"col-sm-12\">\r\n <div with=\"100%\">\r\n <span style=\"font-size: 16px;font-weight: bold;\"> {{st}} Chart</span>\r\n </div>\r\n <div with=\"100%\">\r\n <canvas baseChart [datasets]=\"barChartData\" [labels]=\"barChartLabels\" [options]=\"barChartOptions\"\r\n [legend]=\"barChartLegend\" [colors]=\"barchartColors\" [chartType]=\"barChartType\">\r\n </canvas>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n<button id=\"PiechartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#PiechartModel\"></button>\r\n<button id=\"barchartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#barchartModel\"></button>", styles: [".dispblock{display:block}.dispnone{display:none}.table>tbody>tr>td{font-size:13px;font-weight:700}\n"], directives: [{ 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: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { 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: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i8.BaseChartDirective, selector: "canvas[baseChart]", inputs: ["options", "data", "datasets", "labels", "chartType", "colors", "legend", "plugins"], outputs: ["chartClick", "chartHover"], exportAs: ["base-chart"] }], pipes: { "date": i7.DatePipe } });
|
|
1031
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: QaAnalysisComponent, decorators: [{
|
|
1032
|
+
type: Component,
|
|
1033
|
+
args: [{ selector: 'app-qa-analysis', 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> Analysis\r\n <span class=\"f-12\">({{cs.cDate | date:'medium'}})</span>\r\n <!-- <button (click)=\"test()\"></button> -->\r\n\r\n </h3>\r\n </div>\r\n </div>\r\n <div class=\"content-frame\">\r\n <div class=\"content-frame-body\" style=\"margin-left:0;\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <div class=\"row\" id=\"staticHead\"\r\n style=\" position: fixed;width: 100%;background: white;z-index: 99;padding-top:5px\">\r\n <div class=\"col-sm-4\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label>Grid Formate </label> \r\n <select class=\"form-control form-control-sm\" name=\"gridGrp\" (change)=\"changeGrp(gridGrp);\"\r\n [(ngModel)]=\"gridGrp\">\r\n <option *ngFor=\"let group of groups\" [ngValue]=\"group\">{{group.name}}</option>\r\n </select>\r\n </div>\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 </form>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"form-group\">\r\n <p style=\"font-weight: 600;\">Sale period {{srchHistory?.frmdt}} To\r\n {{srchHistory?.todt}} |\r\n Period {{srchHistory?.period}}</p>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">change By </label>\r\n <select style=\"width:80px;\" class=\"form-control form-control-sm\" name=\"ChangeBy\"\r\n (change)=\"OnChangeBy(ChangeBy);\" [(ngModel)]=\"ChangeBy\">\r\n <option value=\"COUNTCOLOR\">Qty</option>\r\n <option value=\"AVGCOLOR\">Avg</option>\r\n </select>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <div class=\"stats\">\r\n <input type=\"checkbox\" (click)=\"hideShow('CTS', $event.target.checked);\"> CTS\r\n <input type=\"checkbox\" (click)=\"hideShow('AVG', $event.target.checked);\"> AVG\r\n <input type=\"checkbox\" (click)=\"hideShow('RAP', $event.target.checked);\"> DISC\r\n <!-- <input type=\"checkbox\" (click)=\"hideShow('AGE', $event.target.checked);\"> AGE -->\r\n <input type=\"checkbox\" (click)=\"hideShow('VLU', $event.target.checked);\"> VLU\r\n\r\n <input type=\"checkbox\" (click)=\"hideShow('MSD', $event.target.checked);\"> MSD\r\n <input type=\"checkbox\" (click)=\"hideShow('MSDVLU', $event.target.checked);\"> MSD VLU\r\n <input type=\"checkbox\" (click)=\"hideShow('AGE', $event.target.checked);\"> AGE\r\n <input type=\"checkbox\" (click)=\"hideShow('VA', $event.target.checked);\"> VA\r\n <input type=\"checkbox\" (click)=\"hideShow('SVP', $event.target.checked);\"> SVPD\r\n </div>\r\n </div>\r\n <div class=\"grids\" style=\"margin-top: 75px;\">\r\n <div class=\"row\" *ngFor=\"let grp of sortedGrp;let i = index\">\r\n <div class=\"stats\">\r\n <strong>{{grp}} </strong>\r\n </div>\r\n <div class=\"table-responsive\" style=\"overflow-y: hidden;\r\n height: auto;\">\r\n <table class=\"table table-bordered analysisTable\">\r\n <ng-container>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th *ngFor=\"let hrd of head;\" class=\"text-center\" [attr.colspan]=\"stt?.length\">{{hrd}} <i\r\n class=\"fa fa-pie-chart\" (click)=\"creategrpPie(stt,grp,hrd,side,'head')\"\r\n aria-hidden=\"true\"></i>\r\n \r\n <i class=\"fa fa-bar-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpBar(stt,grp,hrd,side,'head')\" aria-hidden=\"true\"></i>\r\n </th>\r\n <th class=\"text-center\" colspan=\"2\" [attr.colspan]=\"stt?.length\">Total</th>\r\n </tr>\r\n <tr>\r\n <th></th>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <th *ngFor=\"let st of stt;\" class=\"text-center\">{{st}}\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" id=\"{{i}}\" class=\"text-center\">Wt</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">Avg</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">Disc</td>\r\n <td *ngIf=\"val\" class=\"text-center\">Value</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"msd\" class=\"text-center\">MSD</td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">MSD Vlu</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"age\" class=\"text-center\">AGE</td>\r\n <td *ngIf=\"va\" class=\"text-center\">VA</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">SVPD</td>\r\n <td class=\"text-center\"> </td>\r\n </tr>\r\n </table>\r\n </th>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <th class=\"text-center\">{{st}}\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">Wt</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">Avg</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">Disc</td>\r\n <td *ngIf=\"val\" class=\"text-center\">Value</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"msd\" class=\"text-center\">MSD</td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">MSD Vlu</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"age\" class=\"text-center\">AGE</td>\r\n <td *ngIf=\"va\" class=\"text-center\">VA</td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">SVPD</td>\r\n <td class=\"text-center\"> </td>\r\n </tr>\r\n </table>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let sid of side;\">\r\n <td class=\"text-center\">{{sid}} <i class=\"fa fa-pie-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpPie(stt,grp,sid,head,'side')\" aria-hidden=\"true\"></i> \r\n <i class=\"fa fa-bar-chart\" style=\"cursor: pointer\"\r\n (click)=\"creategrpBar(stt,grp,sid,head,'side')\" aria-hidden=\"true\"></i>\r\n </td>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <td *ngFor=\"let st of stt;\"\r\n [ngStyle]=\"{'background':isApplied==true?gblGrdDataColor.get(grp+'#'+sid+'#'+hrd+'#'+st).get(key) : matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('grpcolor')}\"\r\n class=\"text-center\">\r\n <!-- <span>{{gblGrpArr[grp+'#'+sid+'#'+hrd+'#'+st] |json}}</span> -->\r\n <span class=\"cp\" data-toggle=\"tooltip\" data-placement=\"right\" title=\"Click here to get data\"\r\n data-placement=\"right\"><a href=\"javascript:void(0)\" target=\"_blank\"\r\n (click)=\"getData('cell', grp+'#'+sid+'#'+hrd,st);\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\">\r\n {{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('count')}}</a>\r\n </span>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" id=\"{{i}}\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt')== null )?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('wt'))}}</td>\r\n <td *ngIf=\"avg\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')== null)?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg'))}}</td>\r\n\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')==\"\" || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg')==null )?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('avg'))}}</td> -->\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc')== null)?'-':cs.splitToTwoDecimal(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('disc'))}}</td>\r\n\r\n <td *ngIf=\"val\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value')==null)?'-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('value'))}}</td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd')== '' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msd') }}\r\n <!-- :{{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('msd') | json}} -->\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('msdvlu')}}</td>\r\n\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">{{cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age')==\"\" || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age')== null )?'-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('age'))}}\r\n <!-- :{{matrix?.get(grp+'#'+sid+'#'+hrd+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage')== '' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage')==null)? '-':cs.roundval(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('valueage'))}}</td>\r\n </tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">{{(matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')=='' || matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')==null)?'-':matrix?.get(grp+'#'+sid+'#'+hrd\r\n +'#'+st)?.get('svpd')}}</td>\r\n <td> </td>\r\n <tr>\r\n\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <td class=\"text-center\"\r\n [ngStyle]=\"{'background': rowTotal?.get(grp+'#'+sid+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\" (click)=\"getData('row', grp+'#'+sid,st);\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\">{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('count')}}</a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('wt'))}}\r\n </td>\r\n\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')}}\r\n </td> -->\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')==\"\" ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('avg'))}}\r\n </td>\r\n\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc')==null)?'-':cs.splitToTwoDecimal(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value')==null)?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')==null\r\n )?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msd')}}\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')==null)?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('msdvlu')}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age')==\"\" ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age'))}}\r\n <!-- :{{rowTotal?.get(grp+'#'+sid+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage')=='' ||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage')==null)?'-':cs.roundval(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')==''||\r\n rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')==null)?'-':rowTotal?.get(grp+'#'+sid+'#'+st)?.get('svpd')}}\r\n </td>\r\n <td> </td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <td class=\"text-center\">Total</td>\r\n <ng-container *ngFor=\"let hrd of head;\">\r\n <td *ngFor=\"let st of stt;\" class=\"text-center\"\r\n [ngStyle]=\"{'background': colTotal?.get(grp+'#'+hrd+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\"\r\n (click)=\"getData('col', grp+'#'+hrd,st);\">{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('count')}}</a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('wt'))}}\r\n </td>\r\n <!-- <td *ngIf=\"avg\" class=\"text-center\">{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')}}\r\n </td> -->\r\n\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')==\"\" ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')==null\r\n )?'-':colTotal?.get(grp+'#'+hrd+'#'+st)?.get('avg')}}\r\n </td>\r\n\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc') == '' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value')==''\r\n ||colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value')==null ) ?\r\n '-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msd'))}}\r\n </td>\r\n <td *ngIf=\"msdvlu\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('msdvlu'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age'))}}\r\n <!-- :{{colTotal?.get(grp+'#'+hrd+'#'+st)?.get('age') | json}} -->\r\n </td>\r\n\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage')=='' ||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage')==null)?'-':cs.roundval(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd')==''||\r\n colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd')==null)?'-':cs.splitToTwoDecimal(colTotal?.get(grp+'#'+hrd+'#'+st)?.get('svpd'))}}\r\n </td>\r\n <td> </td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <td class=\"text-center\"\r\n [ngStyle]=\"{'background': grandTotal?.get('GT#'+grp+'#'+st)?.get('grpcolor')}\">\r\n <a href=\"javascript:void(0)\" target=\"_blank\"\r\n routerLink=\"/{{modulename}}/pkt-list/{{formname}}\" (click)=\"getAll(stt,head,side,grp)\">\r\n <!-- (click)=\"getData('all', '');\" -->\r\n {{grandTotal?.get('GT#'+grp+'#'+st)?.get('count')}}\r\n </a>\r\n <table class=\"innerTbl\">\r\n <tr>\r\n <td *ngIf=\"wt\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('wt')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('wt')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('wt'))}}\r\n </td>\r\n <td *ngIf=\"avg\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('avg')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('avg')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('avg'))}}\r\n\r\n\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"rap\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('disc')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('disc')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('disc'))}}\r\n </td>\r\n <td *ngIf=\"val\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('value')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('value')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('value'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n\r\n <td *ngIf=\"msd && st=='sold'\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('msd')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('msd')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('msd'))}}\r\n <!-- :{{grandTotal?.get('GT#'+grp+'#'+st)?.get('msd') | json}} -->\r\n </td>\r\n <td *ngIf=\"msdvlu && st=='sold'\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('msdvlu'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <!-- <td *ngIf=\"age\" class=\"text-center\">\r\n {{cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('age'))}}</td> -->\r\n\r\n <td *ngIf=\"age\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('age')=='' ||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('age')==null\r\n )?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('age'))}}\r\n <!-- :{{grandTotal?.get('GT#'+grp+'#'+st)?.get('age') |json}} -->\r\n\r\n </td>\r\n\r\n <td *ngIf=\"va\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage')==null)?'-':cs.roundval(grandTotal?.get('GT#'+grp+'#'+st)?.get('valueage'))}}\r\n </td>\r\n </tr>\r\n <tr>\r\n <td *ngIf=\"svpd\" class=\"text-center\">\r\n {{(grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd')==''||\r\n grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd')==null)?'-':cs.splitToTwoDecimal(grandTotal?.get('GT#'+grp+'#'+st)?.get('svpd'))}}\r\n </td>\r\n <td> </td>\r\n </tr>\r\n </table>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </ng-container>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\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\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Pie Chart</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let st of stt;\">\r\n <div *ngIf=\"isshowchart\" class=\"col-sm-6\">\r\n <div with=\"100%\">\r\n <span style=\"font-size: 16px;font-weight: bold;\"> {{st}} Chart</span>\r\n </div>\r\n <div with=\"100%\">\r\n <canvas baseChart [data]=\"ChatMapDtl[st+'_data']\" [labels]=\"ChatMapDtl[st+'_lable']\"\r\n [legend]=\"ChatMapDtl[st+'_legend']\" [chartType]=\"ChartType\" [options]=\"chartOptions\"></canvas>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal fade\" id=\"barchartModel\" 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\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Bar Chart</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n\r\n\r\n <div *ngIf=\"isbarshowchart\" class=\"col-sm-12\">\r\n <div with=\"100%\">\r\n <span style=\"font-size: 16px;font-weight: bold;\"> {{st}} Chart</span>\r\n </div>\r\n <div with=\"100%\">\r\n <canvas baseChart [datasets]=\"barChartData\" [labels]=\"barChartLabels\" [options]=\"barChartOptions\"\r\n [legend]=\"barChartLegend\" [colors]=\"barchartColors\" [chartType]=\"barChartType\">\r\n </canvas>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n<button id=\"PiechartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#PiechartModel\"></button>\r\n<button id=\"barchartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#barchartModel\"></button>", styles: [".dispblock{display:block}.dispnone{display:none}.table>tbody>tr>td{font-size:13px;font-weight:700}\n"] }]
|
|
1034
|
+
}], ctorParameters: function () { return [{ type: i1.CommanServiceService }, { type: i2.BiService }, { type: i3.NgxSpinnerService }, { type: i4.ToastrService }, { type: i5.Router }, { type: i5.ActivatedRoute }]; } });
|
|
1035
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWEtYW5hbHlzaXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXpsaWIvc3JjL2xpYi9xYS1hbmFseXNpcy9xYS1hbmFseXNpcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lemxpYi9zcmMvbGliL3FhLWFuYWx5c2lzL3FhLWFuYWx5c2lzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtFQUErRTtBQUMvRSx3Q0FBd0M7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7OztBQVM1QixNQUFNLE9BQU8sbUJBQW1CO0lBRTlCLFlBQ1MsRUFBd0IsRUFDdkIsR0FBYyxFQUNkLGVBQWtDLEVBQ2xDLE1BQXFCLEVBQ3JCLE1BQWMsRUFDZCxLQUFxQjtRQUx0QixPQUFFLEdBQUYsRUFBRSxDQUFzQjtRQUN2QixRQUFHLEdBQUgsR0FBRyxDQUFXO1FBQ2Qsb0JBQWUsR0FBZixlQUFlLENBQW1CO1FBQ2xDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBRy9CLFFBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2pCLFlBQU8sR0FBRyxFQUFF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QUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUNuRDtZQUNELFNBQVMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDckgsUUFBUSxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUMvRyxRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQy9HLElBQUksT0FBTyxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUM3QyxJQUFJLFFBQVEsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDdkcsSUFBSSxRQUFRLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxH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SSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZHLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFHbkUsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakUsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFL0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRTFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakIsSUFBSSxjQUFjLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUMxRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZHLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFHbkUsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakUsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFL0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRTFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFDbEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckIsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQSxVQUFVO1FBRTVDLDJCQUEyQjtRQUMzQiwyQkFBMkI7UUFDM0IsMEJBQTBCO1FBQzFCLCtCQUErQjtRQUUvQixzQkFBc0I7UUFDdEIsaUJBQWlCO1FBQ2pCLGlCQUFpQjtRQUNqQixVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMzQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7b0JBQ25CLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztvQkFDbkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO29CQUNyQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7b0JBQ3JCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO29CQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQzlDLElBQUksYUFBYSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7d0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDVixhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQzs0QkFDekMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7NEJBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQzs0QkFFM0YsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FDdEUsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQ2hHLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUNyRzt5QkFDRjs2QkFDSTs0QkFDSCxJQUFJLElBQUksQ0FBQyxN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SUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDckMsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkYsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRWpELElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUMxQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pGLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkUsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakUsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFL0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRW5DLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztZQUVuQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUVoQixJQUFJLE1BQU0sRUFBRTtn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QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDMUYsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2RixJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFakQsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBRW5CLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBRWhCLElBQUksTUFBTSxFQUFFO2dCQUNWLElBQUks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QUNOLElBQUk7UUFDSixxQkFBcUI7SUFDdkIsQ0FBQzs7c0pBbnBDVSxtQkFBbUI7MElBQW5CLG1CQUFtQix1RENqQmhDLDQ4Z0NBMGdCd0c7MkZEemYzRixtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHsgU3RvY2tDb21wb25lbnQgfSBmcm9tICcuLy4uLy4uL3N0b2NrLW1vZHVsZS9zdG9jay9zdG9jay5jb21wb25lbnQnO1xyXG4vLyBpbXBvcnQgeyBlbGVtZW50IH0gZnJvbSAncHJvdHJhY3Rvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1hblNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbWFuLXNlcnZpY2UvY29tbWFuLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcclxuaW1wb3J0IHsgTmd4U3Bpbm5lclNlcnZpY2UgfSBmcm9tIFwibmd4LXNwaW5uZXJcIjtcclxuaW1wb3J0IHsgQmlTZXJ2aWNlIH0gZnJvbSAnLi8uLi9iaS1zZXJ2aWNlL2JpLnNlcnZpY2UnO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IENoYXJ0T3B0aW9ucyB9IGZyb20gJ2NoYXJ0LmpzJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1xYS1hbmFseXNpcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3FhLWFuYWx5c2lzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9xYS1hbmFseXNpcy5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFFhQW5hbHlzaXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBjczogQ29tbWFuU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGJpczogQmlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc3Bpbm5lclNlcnZpY2U6IE5neFNwaW5uZXJTZXJ2aWNlICxcclxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlXHJcbiAgKSB7IH1cclxuXHJcbiAgY0R0ID0gbmV3IERhdGUoKTtcclxuICBodG1sQXJyID0gW107XHJcbiAgaGVhZCA9IFtdO1xyXG4gIHNpZGUgPSBbXTtcclxuICBwcml2YXRlIGdycHZhbDtcclxuICBwcml2YXRlIGhlYWR2YWw7XHJcbiAgcHJpdmF0ZSBzaWRldmFsO1xyXG4gIHByaXZhdGUgYXJydER0bDtcclxuICBwcml2YXRlIHF1ZXJ5UGFyYW07XHJcbiAgcWFBbmFseXNpc0FycjtcclxuICBncmFuZFRvdGFsID0gbmV3IE1hcCgpO1xyXG4gIG1hdHJpeCA9IG5ldyBNYXAoKTtcclxuICByb3dUb3RhbCA9IG5ldyBNYXAoKTtcclxuICBjb2xUb3RhbCA9IG5ldyBNYXAoKTtcclxuICBwa3REYXRhID0gbmV3IE1hcCgpO1xyXG4gIHNpZGVEYXRhID0gbmV3IE1hcCgpO1xyXG4gIGhlYWREYXRhID0gbmV3IE1hcCgpO1xyXG4gIHNvcnRlZEdycDtcclxuICBwcml2YXRlIHNjaER0bDtcclxuICBwcml2YXRlIHJlc3VsdDtcclxuICBncmlkR3JwO1xyXG4gIGF0dHJHcmlkRm9ybWF0O1xyXG4gIGdyb3VwcyA9IFtdO1xyXG4gIGludmVudG9yeURheXM7XHJcbiAgZm9ybW5hbWU7XHJcbiAgcHJpdmF0ZSBhbmFHcnBTdHQgPSBbJ21rdCcsICdhc3J0JywgJ2xhYiddO1xyXG4gIHN0O1xyXG5cclxuICBwdWJsaWMgQ2hhcnRUeXBlID0gXCJcIjtcclxuICBwdWJsaWMgY2hhcnRPcHRpb25zOiBhbnkgPSB7XHJcbiAgICBsZWdlbmQ6IHtcclxuICAgICAgcG9zaXRpb246ICdsZWZ0JyxcclxuICAgICAgbGFiZWxzOiB7XHJcbiAgICAgICAgZm9udENvbG9yOiAnYmxhY2snLFxyXG4gICAgICAgIGJveFdpZHRoOiAxMCxcclxuICAgICAgICBwYWRkaW5nOiAxMCxcclxuICAgICAgICBmb250U2l6ZTogMTBcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvLyBwcml2YXRlIGFuYUFsbEdycFN0dCA9IFsnYXNydCcsICdsYWInLCAnbWt0JywgJ3NvbGQnXTtcclxuXHJcbiAgc3JjaEhpc3RvcnkgPSB7XHJcbiAgICBwZXJpb2Q6ICcnLFxyXG4gICAgZnJtZHQ6ICcnLFxyXG4gICAgdG9kdDogJydcclxuICB9O1xyXG4gIHBlcmlvZDtcclxuICBzZWFyY2hGO1xyXG4gIHNhbGVQZXJpb2Q7XHJcbiAgQ2hhbmdlQnk7XHJcbiAgZ3JpZFZhcmlhbmNlO1xyXG4gIGdibEdyZERhdGFDb2xvciA9IG5ldyBNYXAoKTtcclxuICAvLyBnYmxHcmlkU3ViTWFwID0gbmV3IE1hcCgpO1xyXG4gIGdibFJvd1RvdENvbG9yVmFsV2lzZSA9IG5ldyBNYXAoKTtcclxuICBsZWdlbmRMaXN0ID0gW107XHJcbiAgbW9kdWxlbmFtZTtcclxuICBjVXJsO1xyXG4gIGdldFNlYXJjaFJlc3VsdChpZCwgcGVyaW9kKSB7XHJcbiAgICB0aGlzLl9zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ3NlYXJjaElkbkxpc3QnXSA9IGlkLnNwbGl0KCcsJyk7XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm1ubWUnXTtcclxuICAgIHJlcU9ialsncGVyaW9kJ10gPSBwZXJpb2Q7XHJcbiAgICB0aGlzLmJpcy5kYXRhKHJlcU9iaiwgJ3NlYXJjaCcsICdtYXJrZXRpbmcvc2VhcmNoJylcclxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgICAgbGV0IHJlcyA9IGRhdGEucmVzdWx0O1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJyZXNcIiwgcmVzKTtcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdCSS1QS1RfR1JPVVBfQlknLCBKU09OLnN0cmluZ2lmeShyZXMucGFnZURlZmluYXRpb24uZm9ybV9maWVsZFswXS5sb3ZfcXJ5KSk7XHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnQkktZ3JpZEF2ZycsIEpTT04uc3RyaW5naWZ5KHJlcy5wYWdlRGVmaW5hdGlvbi50YWJzWzBdLmxvdl9xcnkuc3BsaXQoJywnKSkpO1xyXG4gICAgICAgICAgdGhpcy5pbnZlbnRvcnlEYXlzID0gcmVzLmludmVudG9yeURheXMgfHwgJzYwJztcclxuICAgICAgICAgIHRoaXMuZ3JpZFZhcmlhbmNlID0gcmVzLmdyaWRWYXJpYW5jZSB8fCAnMTAnO1xyXG4gICAgICAgICAgdGhpcy5hcnJ0RHRsID0gcmVzLmF0dHJEdGw7XHJcbiAgICAgICAgICB0aGlzLnJlc3VsdCA9IHJlcztcclxuICAgICAgICAgIHRoaXMubGVnZW5kTGlzdCA9IHJlcy5sZWdlbmRMaXN0O1xyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ0JJTGVnZW5kcycsIEpTT04uc3RyaW5naWZ5KHRoaXMubGVnZW5kTGlzdCkpO1xyXG4gICAgICAgICAgdGhpcy5zY2hEdGwgPSByZXMuc2VhcmNoUmVzdWx0RHRsO1xyXG4gICAgICAgICAgbGV0IGdycFZpZXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYW5hR3JwVHlwZScpO1xyXG4gICAgICAgICAgdGhpcy5ncm91cHMgPSByZXMuYXR0ckdyaWRGb3JtYXQ7XHJcbiAgICAgICAgICBsZXQgZGVmYXVsdEdycDtcclxuICAgICAgICAgIGlmIChncnBWaWV3ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkZWZhdWx0R3JwID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYW5hR3JwVHlwZScpKTtcclxuICAgICAgICAgICAgbGV0IGNpbmR4ID0gdGhpcy5ncm91cHMuaW5kZXhPZihkZWZhdWx0R3JwKTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkR3JwID0gdGhpcy5ncm91cHNbY2luZHhdO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkR3JwID0gdGhpcy5ncm91cHNbMF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlR3JpZEdycFdpc2UoJ2knLCBkZWZhdWx0R3JwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuc2hvdyhkYXRhLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5zaG93KGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIHN0dDtcclxuICBjcmVhdGVHcmlkKCkge1xyXG4gICAgbGV0IG5ld0FycnkgPSB0aGlzLnNjaER0bDtcclxuICAgIC8vIGNvbnNvbGUubG9nKG5ld0FycnkpO1xyXG4gICAgZGVidWdnZXJcclxuICAgIGxldCBkaWZmZGF5ID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2RpZmYnKSk7XHJcbiAgICBsZXQgYmlwZXJpb2QgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQklQZXJpb2QnKSB8fCAnJztcclxuICAgIGlmIChiaXBlcmlvZCA9PSAnd2VlaycpXHJcbiAgICAgIGJpcGVyaW9kID0gXCI3XCI7XHJcbiAgICBpZiAoYmlwZXJpb2QgPT0gJ21vbnRoJylcclxuICAgICAgYmlwZXJpb2QgPSBcIjMwXCI7XHJcbiAgICBpZiAoYmlwZXJpb2QgPT0gJ3F1YXJ0ZXInKVxyXG4gICAgICBiaXBlcmlvZCA9IFwiOTBcIjtcclxuICAgIGxldCBwZXJpb2QgPSBwYXJzZUludChiaXBlcmlvZCk7XHJcbiAgICBpZiAocGVyaW9kID09IDEpIHtcclxuICAgICAgcGVyaW9kID0gZGlmZmRheTtcclxuICAgIH1cclxuICAgIGxldCBkcmVkID0gXCJyZ2JhKDI1NSwgMCwgMCwwLjYpXCI7XHJcbiAgICBsZXQgbXJlZCA9IFwicmdiYSgyNTUsIDAsIDAsMC40KVwiO1xyXG4gICAgbGV0IGxyZWQgPSBcInJnYmEoMjU1LCAwLCAwLDAuMilcIjtcclxuICAgIGxldCBkZ3JlZW4gPSBcInJnYmEoMCAsMTI4LCAwICwwLjYpXCI7XHJcbiAgICBsZXQgbWdyZWVuID0gXCJyZ2JhKDAgLDEyOCwgMCAsMC40KVwiO1xyXG4gICAgbGV0IGxncmVlbiA9IFwicmdiYSgwICwxMjgsIDAgLDAuMilcIjtcclxuICAgIGxldCBzdG9ja2RheXMgPSB0aGlzLmludmVudG9yeURheXNcclxuICAgIGxldCBtaW52YXJpYXRpb24gPSAoMTAwIC0gcGFyc2VJbnQodGhpcy5ncmlkVmFyaWFuY2UpKTtcclxuICAgIGxldCBtYXh2YXJpYXRpb24gPSAoMTAwICsgcGFyc2VJbnQodGhpcy5ncmlkVmFyaWFuY2UpKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcInBlcmlvZFwiLCBwZXJpb2QpO1xyXG4gICAgdGhpcy5zY2hEdGwubWFwKGVsZW1lbnQgPT4ge1xyXG4gICAgICBsZXQgaGVhZGVyID0gJyc7XHJcbiAgICAgIGxldCBncm91cEtleXMgPSAnJztcclxuICAgICAgbGV0IHNpZGVLZXlzID0gJyc7XHJcbiAgICAgIGxldCBoZWFkS2V5cyA9ICcnO1xyXG4gICAgICBsZXQgbElkeDtcclxuICAgICAgdGhpcy5ncnB2YWwubWFwKGVsZSA9PiB7XHJcbiAgICAgICAgaGVhZGVyICs9IGVsZW1lbnRbZWxlXSArICcsJztcclxuICAgICAgICBncm91cEtleXMgKz0gZWxlbWVudFtlbGVdICsgJywnO1xyXG4gICAgICB9KTtcclxuICAgICAgbElkeCA9IGhlYWRlci5sYXN0SW5kZXhPZignLCcpO1xyXG4gICAgICBpZiAobElkeCA9PSBoZWFkZXIubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGhlYWRlciA9IGhlYWRlci5zdWJzdHIoMCwgaGVhZGVyLmxlbmd0aCAtIDEpICsgXCIjXCI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zaWRldmFsLm1hcChlbGUgPT4ge1xyXG4gICAgICAgIGhlYWRlciArPSBlbGVtZW50W2VsZV0gKyAnLCc7XHJcbiAgICAgICAgc2lkZUtleXMgKz0gZWxlbWVudFtlbGVdICsgJywnO1xyXG4gICAgICB9KTtcclxuICAgICAgbElkeCA9IGhlYWRlci5sYXN0SW5kZXhPZignLCcpO1xyXG4gICAgICBpZiAobElkeCA9PSBoZWFkZXIubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGhlYWRlciA9IGhlYWRlci5zdWJzdHIoMCwgaGVhZGVyLmxlbmd0aCAtIDEpICsgXCIjXCI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oZWFkdmFsLm1hcChlbGUgPT4ge1xyXG4gICAgICAgIGhlYWRlciArPSBlbGVtZW50W2VsZV0gKyAnLCc7XHJcbiAgICAgICAgaGVhZEtleXMgKz0gZWxlbWVudFtlbGVdICsgJywnO1xyXG4gICAgICB9KTtcclxuICAgICAgbElkeCA9IGhlYWRlci5sYXN0SW5kZXhPZignLCcpO1xyXG4gICAgICBpZiAobElkeCA9PSBoZWFkZXIubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGhlYWRlciA9IGhlYWRlci5zdWJzdHIoMCwgaGVhZGVyLmxlbmd0aCAtIDEpICsgXCJcIjtcclxuICAgICAgfVxyXG4gICAgICBncm91cEtleXMgPSAoZ3JvdXBLZXlzLmxhc3RJbmRleE9mKCcsJykgPT0gZ3JvdXBLZXlzLmxlbmd0aCkgPyBncm91cEtleXMuc3Vic3RyKDAsIGdyb3VwS2V5cy5sZW5ndGggLSAxKSA6IGdyb3VwS2V5cztcclxuICAgICAgc2lkZUtleXMgPSAoc2lkZUtleXMubGFzdEluZGV4T2YoJywnKSA9PSBzaWRlS2V5cy5sZW5ndGgpID8gc2lkZUtleXMuc3Vic3RyKDAsIHNpZGVLZXlzLmxlbmd0aCAtIDEpIDogc2lkZUtleXM7XHJcbiAgICAgIGhlYWRLZXlzID0gKGhlYWRLZXlzLmxhc3RJbmRleE9mKCcsJykgPT0gaGVhZEtleXMubGVuZ3RoKSA/IGhlYWRLZXlzLnN1YnN0cigwLCBoZWFkS2V5cy5sZW5ndGggLSAxKSA6IGhlYWRLZXlzO1xyXG4gICAgICBsZXQgbEhlYWRlciA9IGhlYWRlciArICcjJyArIGVsZW1lbnQuZHNwX3N0dDtcclxuICAgICAgbGV0IGxTaWRlS2V5ID0gKGdyb3VwS2V5cy5sZW5ndGggPT0gMCkgPyBzaWRlS2V5cyA6IGdyb3VwS2V5cyArIFwiI1wiICsgc2lkZUtleXMgKyAnIycgKyBlbGVtZW50LmRzcF9zdHQ7XHJcbiAgICAgIGxldCBsSGVhZEtleSA9IChncm91cEtleXMubGVuZ3RoID09IDApID8gaGVhZEtleXMgOiBncm91cEtleXMgKyBcIiNcIiArIGhlYWRLZXlzICsgJyMnICsgZWxlbWVudC5kc3Bfc3R0O1xyXG5cclxuICAgICAgbGV0IHd0ID0gcGFyc2VGbG9hdChlbGVtZW50LmNydHd0KTtcclxuICAgICAgbGV0IHJ0ZSA9IHBhcnNlRmxvYXQoZWxlbWVudC5hc2tpbmdfcnRlKTtcclxuICAgICAgbGV0IHNhbHJhdGUgPSBwYXJzZUZsb2F0KGVsZW1lbnQuc2FsX3J0ZSk7XHJcbiAgICAgIGxldCBzYWxfcnRlID0gcGFyc2VGbG9hdChlbGVtZW50LnF1b3QpO1xyXG4gICAgICBsZXQgYmVuY2htYXJrX3J0ZSA9IHBhcnNlRmxvYXQoZWxlbWVudC5iZW5jaG1hcmtfcnRlKTtcclxuICAgICAgbGV0IGFnZSA9IHBhcnNlSW50KGVsZW1lbnQuYWdlKTtcclxuICAgICAgbGV0IHJ0ZVZhbHVlID0gcnRlICogd3Q7XHJcbiAgICAgIGlmICgoZWxlbWVudC5ncnBfc3R0KS50b0xvd2VyQ2FzZSgpID09ICdzb2xkJykge1xyXG4gICAgICAgIHJ0ZVZhbHVlID0gc2FscmF0ZSAqIHd0O1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBiZW5hY2htYXJrVmFsdWUgPSBiZW5jaG1hcmtfcnRlICogd3Q7XHJcbiAgICAgIGxldCBncmlkV3QgPSAwO1xyXG4gICAgICBsZXQgZ3JpZFJ0ZVZhbHVlID0gMDtcclxuICAgICAgbGV0IGdyaWR2YWx1ZSA9IDA7XHJcbiAgICAgIGxldCBncmlkQWdlID0gMDtcclxuICAgICAgbGV0IGdyaWRWYWx1ZUFnZSA9IDA7XHJcbiAgICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICAgIGxldCBncmlkID0gdGhpcy5tYXRyaXguZ2V0KGxIZWFkZXIpO1xyXG4gICAgICBpZiAoZ3JpZCAhPSBudWxsKSB7XHJcbiAgICAgICAgY291bnQgPSBwYXJzZUludChncmlkLmdldCgnY291bnQnKSk7XHJcblxyXG5cclxuICAgICAgICBncmlkV3QgPSBwYXJzZUZsb2F0KGdyaWQuZ2V0KCd3dCcpKTtcclxuICAgICAgICBncmlkUnRlVmFsdWUgPSBwYXJzZUZsb2F0KGdyaWQuZ2V0KCdyYXAnKSk7XHJcbiAgICAgICAgZ3JpZHZhbHVlID0gcGFyc2VGbG9hdChncmlkLmdldCgndmFsdWUnKSk7XHJcbiAgICAgICAgZ3JpZEFnZSA9IHBhcnNlRmxvYXQoZ3JpZC5nZXQoJ2FnZScpKTtcclxuICAgICAgICBncmlkVmFsdWVBZ2UgPSBwYXJzZUZsb2F0KGdyaWQuZ2V0KCd2YWx1ZWFnZScpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBncmlkID0gbmV3IE1hcCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGdyaWQuc2V0KCdjb3VudCcsIGNvdW50ICsgMSk7XHJcbiAgICAgIGdyaWQuc2V0KCd3dCcsIGdyaWRXdCArIHd0KTtcclxuICAgICAgZ3JpZC5zZXQoJ3JhcCcsIGdyaWRSdGVWYWx1ZSArIGJlbmFjaG1hcmtWYWx1ZSk7XHJcbiAgICAgIGdyaWQuc2V0KCd2YWx1ZScsIGdyaWR2YWx1ZSArIHJ0ZVZhbHVlKTtcclxuICAgICAgZ3JpZC5zZXQoJ2FnZScsICgoZ3JpZEFnZSAqIGNvdW50KSArIGFnZSkgLyAoY291bnQgKyAxKSk7XHJcbiAgICAgIGdyaWQuc2V0KCd2YWx1ZWFnZScsICgoZ3JpZHZhbHVlICogZ3JpZEFnZSkgKyAoYWdlICogcnRlVmFsdWUpKSAvIChncmlkdmFsdWUgKyBydGVWYWx1ZSkpO1xyXG4gICAgICB0aGlzLm1hdHJpeC5zZXQobEhlYWRlciwgZ3JpZCk7XHJcbiAgICAgIGxldCBwa3RzID0gbmV3IFNldCgpO1xyXG4gICAgICBsZXQgc2lkZVBrdHMgPSBuZXcgU2V0KCk7XHJcbiAgICAgIGxldCBoZWFkUGt0cyA9IG5ldyBTZXQoKTtcclxuICAgICAgaWYgKHRoaXMucGt0RGF0YS5nZXQoaGVhZGVyKSAhPSBudWxsKVxyXG4gICAgICAgIHBrdHMgPSB0aGlzLnBrdERhdGEuZ2V0KGhlYWRlcik7XHJcbiAgICAgIGlmICh0aGlzLnNpZGVEYXRhLmdldChsU2lkZUtleSkgIT0gbnVsbClcclxuICAgICAgICBzaWRlUGt0cyA9IHRoaXMuc2lkZURhdGEuZ2V0KGxTaWRlS2V5KTtcclxuICAgICAgaWYgKHRoaXMuaGVhZERhdGEuZ2V0KGxIZWFkS2V5KSAhPSBudWxsKVxyXG4gICAgICAgIGhlYWRQa3RzID0gdGhpcy5oZWFkRGF0YS5nZXQobEhlYWRLZXkpO1xyXG4gICAgICBwa3RzLmFkZChlbGVtZW50KTtcclxuICAgICAgdGhpcy5wa3REYXRhLnNldChoZWFkZXIsIHBrdHMpO1xyXG4gICAgICBzaWRlUGt0cy5hZGQoZWxlbWVudCk7XHJcbiAgICAgIHRoaXMuc2lkZURhdGEuc2V0KGxTaWRlS2V5LCBzaWRlUGt0cyk7XHJcbiAgICAgIGhlYWRQa3RzLmFkZChlbGVtZW50KTtcclxuICAgICAgdGhpcy5oZWFkRGF0YS5zZXQobEhlYWRLZXksIGhlYWRQa3RzKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBncnBzID0gbmV3IFNldCgpO1xyXG4gICAgbGV0IHJvd3MgPSBuZXcgU2V0KCk7XHJcbiAgICBsZXQgY29scyA9IG5ldyBTZXQoKTtcclxuICAgIGxldCBzdHQgPSBuZXcgU2V0KCk7XHJcblxyXG4gICAgdGhpcy5tYXRyaXguZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICBsZXQgbEtleSA9IGtleTtcclxuICAgICAgbGV0IGNvdW50ID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ2NvdW50JykpO1xyXG5cclxuICAgICAgbGV0IHd0ID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ3d0JykpO1xyXG4gICAgICBsZXQgcmFwID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ3JhcCcpKTtcclxuICAgICAgbGV0IHZhbCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCd2YWx1ZScpKTtcclxuICAgICAgbGV0IGFnZSA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdhZ2UnKSk7XHJcbiAgICAgIGxldCB2YWx1ZUFnZSA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCd2YWx1ZWFnZScpKTtcclxuICAgICAgbGV0IGdycFZhbCA9IGxLZXkuc3BsaXQoJyMnKVswXTtcclxuICAgICAgbGV0IHJvd1ZhbCA9IGxLZXkuc3BsaXQoJyMnKVsxXTtcclxuICAgICAgbGV0IGNvbFZhbCA9IGxLZXkuc3BsaXQoJyMnKVsyXTtcclxuICAgICAgbGV0IHN0YXR1cyA9IGxLZXkuc3BsaXQoJyMnKVszXTtcclxuXHJcblxyXG4gICAgICBsZXQgdmFsQ29tcEFyciA9IFtdO1xyXG4gICAgICBsZXQgdmFsQ29tcE9iaiA9IHt9O1xyXG4gICAgICB2YWxDb21wT2JqW3N0YXR1c10gPSB2YWw7XHJcbiAgICAgIHZhbENvbXBBcnIucHVzaCh2YWxDb21wT2JqKTtcclxuICAgICAgY29uc29sZS5sb2coKTtcclxuXHJcblxyXG4gICAgICBsZXQgaXNTb2xkID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5hbmFHcnBTdHQuaW5kZXhPZihzdGF0dXMpID09IC0xKVxyXG4gICAgICAgIGlzU29sZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoaXNTb2xkKSB7XHJcbiAgICAgICAgbGV0IGNvbXBhcmVXaXRoID0gJ21rdCc7XHJcbiAgICAgICAgbGV0IGNtcERhdGEgPSB0aGlzLm1hdHJpeC5nZXQoZ3JwVmFsICsgJyMnICsgcm93VmFsICsgJyMnICsgY29sVmFsICsgJyMnICsgY29tcGFyZVdpdGgpO1xyXG4gICAgICAgIGxldCBjbXBDb3VudCA9IDA7XHJcbiAgICAgICAgaWYgKGNtcERhdGEgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjbXBDb3VudCA9IHBhcnNlRmxvYXQoY21wRGF0YS5nZXQoJ2NvdW50JykpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1zZCA9IE1hdGgucm91bmQocGVyaW9kICogY21wQ291bnQgLyBjb3VudCk7XHJcbiAgICAgICAgdmFsdWUuc2V0KCdtc2QnLCBtc2QpO1xyXG4gICAgICAgIGxldCBjbXBWYWx1ZSA9IDA7XHJcbiAgICAgICAgaWYgKGNtcERhdGEgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjbXBWYWx1ZSA9IHBhcnNlRmxvYXQoY21wRGF0YS5nZXQoJ3ZhbHVlJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbXNkdmx1ID0gTWF0aC5yb3VuZChwZXJpb2QgKiBjbXBWYWx1ZSAvIHZhbCk7XHJcbiAgICAgICAgdmFsdWUuc2V0KCdtc2R2bHUnLCBtc2R2bHUpO1xyXG4gICAgICAgIGxldCBjaGtjb3VudCA9IChzdG9ja2RheXMgKiBjb3VudCAvIHBlcmlvZCk7XHJcbiAgICAgICAgLy8gbGV0IG1pbmNvdW50ID0gKGNoa2NvdW50ICogbWludmFyaWF0aW9uKTtcclxuICAgICAgICAvLyBsZXQgbWF4Y291bnQgPSAoY2hrY291bnQgKiBtYXh2YXJpYXRpb24pO1xyXG4gICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICAgIGxldCBuZXRyYXRpbyA9IChjaGtjb3VudCAqIDEwMCkgLyBjbXBDb3VudDtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImNoZWNrY291bnRcIiwgcm93VmFsLCBjb2xWYWwsIGNoa2NvdW50KTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm5ldHJhdGlvXCIsIHJvd1ZhbCwgY29sVmFsLCBuZXRyYXRpbyk7XHJcbiAgICAgICAgbGV0IGdyaWRjb2xvciA9ICcjZmZmZjAwJztcclxuICAgICAgICBpZiAobmV0cmF0aW8gPD0gMzApIHtcclxuICAgICAgICAgIGdyaWRjb2xvciA9IGRyZWQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+IDMwICYmIG5ldHJhdGlvIDwgNjApIHtcclxuICAgICAgICAgIGdyaWRjb2xvciA9IG1yZWQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+PSA2MCAmJiBuZXRyYXRpbyA8IG1pbnZhcmlhdGlvbikge1xyXG4gICAgICAgICAgZ3JpZGNvbG9yID0gbHJlZDtcclxuICAgICAgICB9IGVsc2UgaWYgKG5ldHJhdGlvID49IG1pbnZhcmlhdGlvbiAmJiBuZXRyYXRpbyA8IG1heHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgZ3JpZGNvbG9yID0gJ3JnYmEoMjU1LCAyNTUsIDAsIDAuMzgpJztcclxuICAgICAgICB9IGVsc2UgaWYgKG5ldHJhdGlvID49IG1heHZhcmlhdGlvbiAmJiBuZXRyYXRpbyA8IDIwMCkge1xyXG4gICAgICAgICAgZ3JpZGNvbG9yID0gbGdyZWVuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmV0cmF0aW8gPj0gMjAwICYmIG5ldHJhdGlvIDwgMzAwKSB7XHJcbiAgICAgICAgICBncmlkY29sb3IgPSBtZ3JlZW47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGdyaWRjb2xvciA9IGRncmVlbjtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB2YWx1ZS5zZXQoJ2dycGNvbG9yJywgZ3JpZGNvbG9yKTtcclxuXHJcblxyXG4gICAgICAgIGxldCBzdnBkID0gTWF0aC5yb3VuZCh2YWwgLyBwZXJpb2QpO1xyXG4gICAgICAgIHZhbHVlLnNldCgnc3ZwZCcsIHN2cGQpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzdGF0dXMgPT0gJ21rdCcpXHJcbiAgICAgICAgdmFsdWUuc2V0KCdncnBjb2xvcicsICcjZGRkZGRkJyk7XHJcblxyXG4gICAgICBsZXQgZGlzYyA9IDA7XHJcbiAgICAgIGlmIChyYXAgPiAxKSB7XHJcbiAgICAgICAgZGlzYyA9ICgoKHZhbCAqIDEwMCkgLyByYXApIC0gMTAwKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgYXZnID0gTWF0aC5yb3VuZCh2YWwgLyB3dCk7XHJcbiAgICAgIHZhbHVlLnNldCgnZGlzYycsIGRpc2MpO1xyXG4gICAgICB2YWx1ZS5zZXQoJ2F2ZycsIGF2Zyk7XHJcbiAgICAgIHJvd3MuYWRkKHJvd1ZhbCk7XHJcbiAgICAgIGxldCBzdHJSb3dUb3RhbEtleSA9IGdycFZhbCArICcjJyArIHJvd1ZhbCArICcjJyArIHN0YXR1cztcclxuICAgICAgbGV0IHJUb3RhbCA9IHRoaXMucm93VG90YWwuZ2V0KHN0clJvd1RvdGFsS2V5KSA9PSBudWxsID8gbmV3IE1hcCgpIDogdGhpcy5yb3dUb3RhbC5nZXQoc3RyUm93VG90YWxLZXkpO1xyXG4gICAgICBsZXQgbENvdW50ID0gclRvdGFsLmdldCgnY291bnQnKSA9PSBudWxsID8gMCA6IHJUb3RhbC5nZXQoJ2NvdW50Jyk7XHJcblxyXG5cclxuICAgICAgbGV0IGxXdCA9IHJUb3RhbC5nZXQoJ3d0JykgPT0gbnVsbCA/IDAgOiByVG90YWwuZ2V0KCd3dCcpO1xyXG4gICAgICBsZXQgbFJhcCA9IHJUb3RhbC5nZXQoJ3JhcCcpID09IG51bGwgPyAwIDogclRvdGFsLmdldCgncmFwJyk7XHJcbiAgICAgIGxldCBsVmFsID0gclRvdGFsLmdldCgndmFsdWUnKSA9PSBudWxsID8gMCA6IHJUb3RhbC5nZXQoJ3ZhbHVlJyk7XHJcbiAgICAgIGxldCBsQWdlID0gclRvdGFsLmdldCgnYWdlJykgPT0gbnVsbCA/IDAgOiByVG90YWwuZ2V0KCdhZ2UnKTtcclxuICAgICAgbGV0IGxWYWx1ZUFnZSA9IHJUb3RhbC5nZXQoJ3ZhbHVlYWdlJykgPT0gbnVsbCA/IDAgOiByVG90YWwuZ2V0KCd2YWx1ZWFnZScpO1xyXG5cclxuICAgICAgclRvdGFsLnNldCgnY291bnQnLCBsQ291bnQgKyBjb3VudCk7XHJcbiAgICAgIHJUb3RhbC5zZXQoJ3d0JywgbFd0ICsgd3QpO1xyXG4gICAgICByVG90YWwuc2V0KCdyYXAnLCBsUmFwICsgcmFwKTtcclxuICAgICAgclRvdGFsLnNldCgndmFsdWUnLCBsVmFsICsgdmFsKTtcclxuICAgICAgclRvdGFsLnNldCgnZGlzYycsICgoKChsVmFsICsgdmFsKSAqIDEwMCkgLyAobFJhcCArIHJhcCkpIC0gMTAwKSk7XHJcbiAgICAgIHJUb3RhbC5zZXQoJ2F2ZycsIChsVmFsICsgdmFsKSAvIChsV3QgKyB3dCkpO1xyXG4gICAgICByVG90YWwuc2V0KCdhZ2UnLCAoKGxBZ2UgKiBsQ291bnQpICsgYWdlKSAvIChsQ291bnQgKyAxKSk7XHJcbiAgICAgIHJUb3RhbC5zZXQoJ3ZhbHVlYWdlJywgKChsVmFsdWVBZ2UgKiBsQWdlKSArIChhZ2UgKiB2YWwpKSAvIChsVmFsdWVBZ2UgKyB2YWwpKTtcclxuXHJcbiAgICAgIHRoaXMucm93VG90YWwuc2V0KHN0clJvd1RvdGFsS2V5LCByVG90YWwpO1xyXG5cclxuICAgICAgY29scy5hZGQoY29sVmFsKTtcclxuICAgICAgbGV0IHN0ckNvbFRvdGFsS2V5ID0gZ3JwVmFsICsgJyMnICsgY29sVmFsICsgJyMnICsgc3RhdHVzO1xyXG4gICAgICBsZXQgY1RvdGFsID0gdGhpcy5jb2xUb3RhbC5nZXQoc3RyQ29sVG90YWxLZXkpID09IG51bGwgPyBuZXcgTWFwKCkgOiB0aGlzLmNvbFRvdGFsLmdldChzdHJDb2xUb3RhbEtleSk7XHJcbiAgICAgIGxldCBjQ291bnQgPSBjVG90YWwuZ2V0KCdjb3VudCcpID09IG51bGwgPyAwIDogY1RvdGFsLmdldCgnY291bnQnKTtcclxuXHJcblxyXG4gICAgICBsZXQgY1d0ID0gY1RvdGFsLmdldCgnd3QnKSA9PSBudWxsID8gMCA6IGNUb3RhbC5nZXQoJ3d0Jyk7XHJcbiAgICAgIGxldCBjUmFwID0gY1RvdGFsLmdldCgncmFwJykgPT0gbnVsbCA/IDAgOiBjVG90YWwuZ2V0KCdyYXAnKTtcclxuICAgICAgbGV0IGNWYWwgPSBjVG90YWwuZ2V0KCd2YWx1ZScpID09IG51bGwgPyAwIDogY1RvdGFsLmdldCgndmFsdWUnKTtcclxuICAgICAgbGV0IGNBZ2UgPSBjVG90YWwuZ2V0KCdhZ2UnKSA9PSBudWxsID8gMCA6IGNUb3RhbC5nZXQoJ2FnZScpO1xyXG4gICAgICBsZXQgY1ZhbHVlQWdlID0gY1RvdGFsLmdldCgndmFsdWVhZ2UnKSA9PSBudWxsID8gMCA6IGNUb3RhbC5nZXQoJ3ZhbHVlYWdlJyk7XHJcblxyXG4gICAgICBjVG90YWwuc2V0KCdjb3VudCcsIGNDb3VudCArIGNvdW50KTtcclxuICAgICAgY1RvdGFsLnNldCgnd3QnLCBjV3QgKyB3dCk7XHJcbiAgICAgIGNUb3RhbC5zZXQoJ3JhcCcsIGNSYXAgKyByYXApO1xyXG4gICAgICBjVG90YWwuc2V0KCd2YWx1ZScsIGNWYWwgKyB2YWwpO1xyXG4gICAgICBjVG90YWwuc2V0KCdkaXNjJywgKCgoKGNWYWwgKyB2YWwpICogMTAwKSAvIChjUmFwICsgcmFwKSkgLSAxMDApKTtcclxuICAgICAgY1RvdGFsLnNldCgnYXZnJywgKGNWYWwgKyB2YWwpIC8gKGNXdCArIHd0KSk7XHJcbiAgICAgIGNUb3RhbC5zZXQoJ2FnZScsICgoY0FnZSAqIGNDb3VudCkgKyBhZ2UpIC8gKGNDb3VudCArIDEpKTtcclxuICAgICAgY1RvdGFsLnNldCgndmFsdWVhZ2UnLCAoKGNWYWx1ZUFnZSAqIGNBZ2UpICsgKGFnZSAqIHZhbCkpIC8gKGNWYWx1ZUFnZSArIHZhbCkpO1xyXG5cclxuICAgICAgdGhpcy5jb2xUb3RhbC5zZXQoc3RyQ29sVG90YWxLZXksIGNUb3RhbCk7XHJcblxyXG4gICAgICBpZiAoIXN0dC5oYXMoc3RhdHVzKSlcclxuICAgICAgICBzdHQuYWRkKHN0YXR1cyk7XHJcbiAgICAgIGlmICghZ3Jwcy5oYXMoZ3JwVmFsKSlcclxuICAgICAgICBncnBzLmFkZChncnBWYWwpO1xyXG5cclxuICAgIH0pXHJcbiAgICBsZXQgc29ydGVkUm93cyA9IEFycmF5LmZyb20ocm93cykuc29ydCgpO1xyXG4gICAgbGV0IHNvcnRlZENvbHMgPSBBcnJheS5mcm9tKGNvbHMpLnNvcnQoKTtcclxuICAgIGxldCBzb3J0ZWRTdHQgPSBBcnJheS5mcm9tKHN0dCkuc29ydCgpO1xyXG4gICAgdGhpcy5zb3J0ZWRHcnAgPSBBcnJheS5mcm9tKGdycHMpOy8vLnNvcnQoKTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZyhzb3J0ZWRSb3dzKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKHNvcnRlZENvbHMpO1xyXG4gICAgLy8gY29uc29sZS5sb2coc29ydGVkU3R0KTtcclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc29ydGVkR3JwKTtcclxuXHJcbiAgICAvLyBsZXQga2V5VmFsT2JqID0ge307XHJcbiAgICAvLyBsZXQgZ2FyciA9IFtdO1xyXG4gICAgLy8vL2ZvciBncmlkIGRhdGFcclxuICAgIHNvcnRlZFJvd3MuZm9yRWFjaChyb3cgPT4ge1xyXG4gICAgICBzb3J0ZWRDb2xzLmZvckVhY2goY29scyA9PiB7XHJcbiAgICAgICAgdGhpcy5zb3J0ZWRHcnAuZm9yRWFjaChncnAgPT4ge1xyXG4gICAgICAgICAgbGV0IGN1cnJBdmdWYWwgPSAwO1xyXG4gICAgICAgICAgbGV0IHByZXZBdmdWYWwgPSAwO1xyXG4gICAgICAgICAgbGV0IGN1cnJDb3VudFZhbCA9IDA7XHJcbiAgICAgICAgICBsZXQgcHJldkNvdW50VmFsID0gMDtcclxuICAgICAgICAgIGxldCBwQVZHQ09MT1IgPSAnJztcclxuICAgICAgICAgIGxldCBwQ09VTlRDT0xPUiA9ICcnO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRTdHQubGVuZ3RoIHx8IDA7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgZ2JsR3JpZFN1Yk1hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgICAgICAgaWYgKGkgPT0gMCkge1xyXG4gICAgICAgICAgICAgIGdibEdyaWRTdWJNYXAuc2V0KCdBVkdDT0xPUicsIFwiI2RkZGRkZFwiKTtcclxuICAgICAgICAgICAgICBnYmxHcmlkU3ViTWFwLnNldCgnQ09VTlRDT0xPUicsIFwiI2RkZGRkZFwiKTtcclxuICAgICAgICAgICAgICB0aGlzLmdibEdyZERhdGFDb2xvci5zZXQoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgY29scyArICcjJyArIHNvcnRlZFN0dFtpXSwgZ2JsR3JpZFN1Yk1hcCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm1hdHJpeC5oYXMoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgY29scyArICcjJyArIHNvcnRlZFN0dFtpXSkpIHtcclxuICAgICAgICAgICAgICAgIHByZXZBdmdWYWwgPSB0aGlzLm1hdHJpeC5nZXQoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgY29scyArICcjJyArIHNvcnRlZFN0dFtpXSkuZ2V0KCdhdmcnKSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgcHJldkNvdW50VmFsID0gdGhpcy5tYXRyaXguZ2V0KGdycCArICcjJyArIHJvdyArICcjJyArIGNvbHMgKyAnIycgKyBzb3J0ZWRTdHRbaV0pLmdldCgnY291bnQnKSB8fCAwO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5tYXRyaXguaGFzKGdycCArICcjJyArIHJvdyArICcjJyArIGNvbHMgKyAnIycgKyBzb3J0ZWRTdHRbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyQXZnVmFsID0gdGhpcy5tYXRyaXguZ2V0KGdycCArICcjJyArIHJvdyArICcjJyArIGNvbHMgKyAnIycgKyBzb3J0ZWRTdHRbaV0pLmdldCgnYXZnJykgfHwgMDtcclxuICAgICAgICAgICAgICAgIGN1cnJDb3VudFZhbCA9IHRoaXMubWF0cml4LmdldChncnAgKyAnIycgKyByb3cgKyAnIycgKyBjb2xzICsgJyMnICsgc29ydGVkU3R0W2ldKS5nZXQoJ2NvdW50JykgfHwgMDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyQ291bnRWYWwgPSAwO1xyXG4gICAgICAgICAgICAgICAgY3VyckF2Z1ZhbCA9IDA7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAoY3VyckNvdW50VmFsID4gMCAmJiBwcmV2Q291bnRWYWwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgQVZHQ09MT1IgPSAnI2ZmMDAwMDQ3JztcclxuICAgICAgICAgICAgICAgIGxldCBDT1VOVENPTE9SID0gJyNmZjAwMDA0Nyc7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VyckF2Z1ZhbCA9PSBwcmV2QXZnVmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgIEFWR0NPTE9SID0gcEFWR0NPTE9SO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyQXZnVmFsID4gcHJldkF2Z1ZhbCkge1xyXG4gICAgICAgICAgICAgICAgICBBVkdDT0xPUiA9ICcjMDA4MDAwNTQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJDb3VudFZhbCA9PSBwcmV2Q291bnRWYWwpIHtcclxuICAgICAgICAgICAgICAgICAgQ09VTlRDT0xPUiA9IHBDT1VOVENPTE9SO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyQ291bnRWYWwgPiBwcmV2Q291bnRWYWwpIHtcclxuICAgICAgICAgICAgICAgICAgQ09VTlRDT0xPUiA9ICcjMDA4MDAwNTQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcENPVU5UQ09MT1IgPSBDT1VOVENPTE9SO1xyXG4gICAgICAgICAgICAgICAgcEFWR0NPTE9SID0gQVZHQ09MT1I7XHJcblxyXG4gICAgICAgICAgICAgICAgZ2JsR3JpZFN1Yk1hcC5zZXQoJ0FWR0NPTE9SJywgQVZHQ09MT1IpO1xyXG4gICAgICAgICAgICAgICAgZ2JsR3JpZFN1Yk1hcC5zZXQoJ0NPVU5UQ09MT1InLCBDT1VOVENPTE9SKTsvLyMwMDgwMDA1ND09Z3JlZW4gIC8vZmYwMDAwNDcgPT0gcmVkXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdibEdyZERhdGFDb2xvci5zZXQoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgY29scyArICcjJyArIHNvcnRlZFN0dFtpXSwgZ2JsR3JpZFN1Yk1hcCk7XHJcbiAgICAgICAgICAgICAgICBwcmV2Q291bnRWYWwgPSBjdXJyQ291bnRWYWw7XHJcbiAgICAgICAgICAgICAgICBwcmV2QXZnVmFsID0gY3VyckF2Z1ZhbDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBnYmxHcmlkU3ViTWFwLnNldCgnQVZHQ09MT1InLCAnd2hpdGUnKTtcclxuICAgICAgICAgICAgICAgIGdibEdyaWRTdWJNYXAuc2V0KCdDT1VOVENPTE9SJywgJ3doaXRlJyk7Ly8jMDA4MDAwNTQ9PWdyZWVuICAvL2ZmMDAwMDQ3ID09IHJlZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5nYmxHcmREYXRhQ29sb3Iuc2V0KGdycCArICcjJyArIHJvdyArICcjJyArIGNvbHMgKyAnIycgKyBzb3J0ZWRTdHRbaV0sIGdibEdyaWRTdWJNYXApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJDb3VudFZhbCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgcHJldkNvdW50VmFsID0gY3VyckNvdW50VmFsO1xyXG4gICAgICAgICAgICAgICAgICBwcmV2QXZnVmFsID0gY3VyckF2Z1ZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIC8vIHRoaXMuZ2JsR3JwQXJyID0gey4uLmdhcnJ9O1xyXG4gICAgY29uc29sZS5sb2codGhpcy5nYmxHcmREYXRhQ29sb3IpO1xyXG5cclxuICAgIHRoaXMuYXJydER0bFt0aGlzLnNpZGV2YWxbMF0gKyAnI3AnXS5tYXAoZWxlMSA9PiB7XHJcbiAgICAgIHNvcnRlZFJvd3MuZm9yRWFjaChlbGUyID0+IHtcclxuICAgICAgICBpZiAoZWxlMSA9PSBlbGUyKSB7XHJcbiAgICAgICAgICB0aGlzLnNpZGUucHVzaChlbGUxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIHRoaXMuYXJydER0bFt0aGlzLmhlYWR2YWxbMF0gKyAnI3AnXS5tYXAoZWxlMSA9PiB7XHJcbiAgICAgIHNvcnRlZENvbHMuZm9yRWFjaChlbGUyID0+IHtcclxuICAgICAgICBpZiAoZWxlMSA9PSBlbGUyKSB7XHJcbiAgICAgICAgICB0aGlzLmhlYWQucHVzaChlbGUxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwibWFyaXhcIiwgdGhpcy5tYXRyaXgpO1xyXG4gICAgdGhpcy5zdHQgPSBbLi4uc29ydGVkU3R0XTtcclxuICAgIHRoaXMucm93VG90YWwuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICBsZXQgbEtleSA9IGtleTtcclxuICAgICAgbGV0IGNvdW50ID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ2NvdW50JykpO1xyXG4gICAgICBsZXQgdmFsID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ3ZhbHVlJykpO1xyXG4gICAgICBsZXQgZ3JwVmFsID0gbEtleS5zcGxpdCgnIycpWzBdO1xyXG4gICAgICBsZXQgcm93VmFsID0gbEtleS5zcGxpdCgnIycpWzFdO1xyXG4gICAgICBsZXQgc3RhdHVzID0gbEtleS5zcGxpdCgnIycpWzJdO1xyXG4gICAgICBsZXQgd3QgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgnd3QnKSk7XHJcbiAgICAgIGxldCByYXAgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgncmFwJykpO1xyXG4gICAgICBsZXQgc3ZwZCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdzdnBkJykpID09IHVuZGVmaW5lZCA/IDAgOiBwYXJzZUZsb2F0KHZhbHVlLmdldCgnc3ZwZCcpKTtcclxuICAgICAgbGV0IG1zZCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdtc2QnKSkgPT0gdW5kZWZpbmVkID8gMCA6IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdtc2QnKSk7XHJcbiAgICAgIGxldCBhZ2UgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgnYWdlJykpO1xyXG4gICAgICBsZXQgdmFsdWVBZ2UgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgndmFsdWVhZ2UnKSk7XHJcblxyXG4gICAgICBsZXQgZ3RLZXkgPSBcIkdUI1wiICsgZ3JwVmFsICsgXCIjXCIgKyBzdGF0dXM7XHJcbiAgICAgIGxldCBjVG90YWwgPSB0aGlzLmdyYW5kVG90YWwuZ2V0KGd0S2V5KSA9PSBudWxsID8gbmV3IE1hcCgpIDogdGhpcy5ncmFuZFRvdGFsLmdldChndEtleSk7XHJcbiAgICAgIGxldCBjQ291bnQgPSBjVG90YWwuZ2V0KCdjb3VudCcpID09IG51bGwgPyAwIDogY1RvdGFsLmdldCgnY291bnQnKTtcclxuICAgICAgbGV0IGNXdCA9IGNUb3RhbC5nZXQoJ3d0JykgPT0gbnVsbCA/IDAgOiBjVG90YWwuZ2V0KCd3dCcpO1xyXG4gICAgICBsZXQgY1JhcCA9IGNUb3RhbC5nZXQoJ3JhcCcpID09IG51bGwgPyAwIDogY1RvdGFsLmdldCgncmFwJyk7XHJcbiAgICAgIGxldCBjVmFsID0gY1RvdGFsLmdldCgndmFsdWUnKSA9PSBudWxsID8gMCA6IGNUb3RhbC5nZXQoJ3ZhbHVlJyk7XHJcbiAgICAgIGxldCBjQWdlID0gY1RvdGFsLmdldCgnYWdlJykgPT0gbnVsbCA/IDAgOiBjVG90YWwuZ2V0KCdhZ2UnKTtcclxuICAgICAgbGV0IGNWYWx1ZUFnZSA9IGNUb3RhbC5nZXQoJ3ZhbHVlYWdlJykgPT0gbnVsbCA/IDAgOiBjVG90YWwuZ2V0KCd2YWx1ZWFnZScpO1xyXG5cclxuICAgICAgY1RvdGFsLnNldCgnY291bnQnLCBjQ291bnQgKyBjb3VudCk7XHJcbiAgICAgIGNUb3RhbC5zZXQoJ3d0JywgY1d0ICsgd3QpO1xyXG4gICAgICBjVG90YWwuc2V0KCdyYXAnLCBjUmFwICsgcmFwKTtcclxuICAgICAgY1RvdGFsLnNldCgndmFsdWUnLCBjVmFsICsgdmFsKTtcclxuICAgICAgY1RvdGFsLnNldCgnZGlzYycsICgoKChjVmFsICsgdmFsKSAqIDEwMCkgLyAoY1JhcCArIHJhcCkpIC0gMTAwKSk7XHJcbiAgICAgIGNUb3RhbC5zZXQoJ2F2ZycsIChjVmFsICsgdmFsKSAvIChjV3QgKyB3dCkpO1xyXG4gICAgICBjVG90YWwuc2V0KCdhZ2UnLCAoKGNBZ2UgKiBjQ291bnQpICsgYWdlKSAvIChjQ291bnQgKyAxKSk7XHJcbiAgICAgIGNUb3RhbC5zZXQoJ3ZhbHVlYWdlJywgKChjVmFsdWVBZ2UgKiBjVmFsKSArICh2YWx1ZUFnZSAqIHZhbCkpIC8gKGNWYWwgKyB2YWwpKTtcclxuXHJcbiAgICAgIHRoaXMuZ3JhbmRUb3RhbC5zZXQoZ3RLZXksIGNUb3RhbCk7XHJcblxyXG4gICAgICBsZXQgaXNTb2xkID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5hbmFHcnBTdHQuaW5kZXhPZihzdGF0dXMpID09IC0xKVxyXG4gICAgICAgIGlzU29sZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoaXNTb2xkKSB7XHJcbiAgICAgICAgbGV0IGNtcERhdGEgPSB0aGlzLnJvd1RvdGFsLmdldChncnBWYWwgKyAnIycgKyByb3dWYWwgKyAnI21rdCcpO1xyXG4gICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICAgIGlmIChjbXBEYXRhICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgbGV0IGNtcENvdW50ID0gcGFyc2VGbG9hdChjbXBEYXRhLmdldCgnY291bnQnKSk7XHJcbiAgICAgICAgICBsZXQgbXNkID0gTWF0aC5yb3VuZChwZXJpb2QgKiBjbXBDb3VudCAvIGNvdW50KTtcclxuICAgICAgICAgIHZhbHVlLnNldCgnbXNkJywgbXNkKTtcclxuICAgICAgICAgIGxldCBjbXB2YWwgPSBwYXJzZUZsb2F0KGNtcERhdGEuZ2V0KCd2YWx1ZScpKTtcclxuICAgICAgICAgIGxldCBtc2R2bHUgPSBNYXRoLnJvdW5kKHBlcmlvZCAqIGNtcHZhbCAvIHZhbCk7XHJcbiAgICAgICAgICB2YWx1ZS5zZXQoJ21zZHZsdScsIG1zZHZsdSk7XHJcblxyXG4gICAgICAgICAgbGV0IGNoa2NvdW50ID0gKHN0b2NrZGF5cyAqIGNvdW50IC8gcGVyaW9kKTtcclxuICAgICAgICAgIGxldCBuZXRyYXRpbyA9IChjaGtjb3VudCAqIDEwMCkgLyBjbXBDb3VudDtcclxuXHJcbiAgICAgICAgICBsZXQgZ3JpZGNvbG9yID0gJyNmZmZmMDAnO1xyXG4gICAgICAgICAgaWYgKG5ldHJhdGlvIDw9IDMwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGRyZWQ7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG5ldHJhdGlvID4gMzAgJiYgbmV0cmF0aW8gPCA2MCkge1xyXG4gICAgICAgICAgICBncmlkY29sb3IgPSBtcmVkO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+PSA2MCAmJiBuZXRyYXRpbyA8IG1pbnZhcmlhdGlvbikge1xyXG4gICAgICAgICAgICBncmlkY29sb3IgPSBscmVkO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+PSBtaW52YXJpYXRpb24gJiYgbmV0cmF0aW8gPCBtYXh2YXJpYXRpb24pIHtcclxuICAgICAgICAgICAgZ3JpZGNvbG9yID0gJ3JnYmEoMjU1LCAyNTUsIDAsIDAuMzgpJztcclxuICAgICAgICAgIH0gZWxzZSBpZiAobmV0cmF0aW8gPj0gbWF4dmFyaWF0aW9uICYmIG5ldHJhdGlvIDwgMjAwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGxncmVlbjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobmV0cmF0aW8gPj0gMjAwICYmIG5ldHJhdGlvIDwgMzAwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IG1ncmVlbjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGRncmVlbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhbHVlLnNldCgnZ3JwY29sb3InLCBncmlkY29sb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN2cGQgPSBNYXRoLnJvdW5kKHZhbCAvIHBlcmlvZCk7XHJcbiAgICAgICAgdmFsdWUuc2V0KCdzdnBkJywgc3ZwZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHN0YXR1cyA9PSAnbWt0JylcclxuICAgICAgICB2YWx1ZS5zZXQoJ2dycGNvbG9yJywgJyNkZGRkZGQnKTtcclxuXHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLy8vL2ZvciByb3d3aXNlIHRvdGFsXHJcbiAgICAvLyBzb3J0ZWRSb3dzLmZvckVhY2gocm93ID0+IHtcclxuICAgIC8vICAgdGhpcy5zb3J0ZWRHcnAuZm9yRWFjaChncnAgPT4ge1xyXG4gICAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkU3R0Lmxlbmd0aCB8fCAwOyBpKyspIHtcclxuICAgIC8vICAgICAgIGRlYnVnZ2VyXHJcbiAgICAvLyAgICAgICBsZXQgY3VyclZhbDtcclxuICAgIC8vICAgICAgIGxldCBwcmV2VmFsO1xyXG4gICAgLy8gICAgICAgbGV0IGN1cnJDb3VudDtcclxuICAgIC8vICAgICAgIGxldCBwcmV2Q291bnQ7XHJcbiAgICAvLyAgICAgICBpZiAoaSA9PSAwKSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZ2JsUm93VG90Q29sb3JWYWxXaXNlLnNldChncnAgKyAnIycgKyByb3cgKyAnIycgKyBzb3J0ZWRTdHRbaV0sIFwiI2RkZGRkZFwiKTtcclxuXHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgICBlbHNlIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5sb2codGhpcy5tYXRyaXgpO1xyXG4gICAgLy8gICAgICAgICBpZiAodGhpcy5yb3dUb3RhbC5oYXMoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgc29ydGVkU3R0W2ldKSkge1xyXG4gICAgLy8gICAgICAgICAgIGN1cnJWYWwgPSB0aGlzLnJvd1RvdGFsLmdldChncnAgKyAnIycgKyByb3cgKyAnIycgKyBzb3J0ZWRTdHRbaV0pLmdldCgndmFsdWUnKSB8fCAwO1xyXG4gICAgLy8gICAgICAgICAgIGN1cnJDb3VudCA9IHRoaXMucm93VG90YWwuZ2V0KGdycCArICcjJyArIHJvdyArICcjJyArIHNvcnRlZFN0dFtpXSkuZ2V0KCdjb3VudCcpIHx8IDA7XHJcblxyXG5cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICBpZiAodGhpcy5yb3dUb3RhbC5oYXMoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgc29ydGVkU3R0W2kgLSAxXSkpIHtcclxuICAgIC8vICAgICAgICAgICBwcmV2VmFsID0gdGhpcy5yb3dUb3RhbC5nZXQoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgc29ydGVkU3R0W2kgLSAxXSkuZ2V0KCd2YWx1ZScpIHx8IDA7Ly9wYXNzIGR5bmFtaWMgdmFsdWUgYXMgcGVyIHVzZXIgc2VsZWN0IGluIGRkbFxyXG4gICAgLy8gICAgICAgICAgIHByZXZDb3VudCA9IHRoaXMucm93VG90YWwuZ2V0KGdycCArICcjJyArIHJvdyArICcjJyArIHNvcnRlZFN0dFtpIC0gMV0pLmdldCgnY291bnQnKSB8fCAwO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZ2JsUm93VG90Q29sb3JWYWxXaXNlLnNldChncnAgKyAnIycgKyByb3cgKyAnIycgKyBzb3J0ZWRTdHRbaV0sICgoY3VyclZhbCA9PSAwIHx8IGN1cnJWYWwgPT0gbnVsbCB8fCBjdXJyVmFsID09IHVuZGVmaW5lZCB8fCBwcmV2VmFsID09IDAgfHwgcHJldlZhbCA9PSBudWxsIHx8IHByZXZWYWwgPT0gdW5kZWZpbmVkKSA/ICcnIDogKGN1cnJWYWwgPiAwICYmIGN1cnJWYWwgPiBwcmV2VmFsKSA/ICdncmVlbicgOiAncmVkJykpO1xyXG4gICAgLy8gICAgICAgICAvLyB0aGlzLmdibFJvd1RvdENvbG9yVmFsV2lzZS5zZXQoZ3JwICsgJyMnICsgcm93ICsgJyMnICsgc29ydGVkU3R0W2ldLCAoKGN1cnJDb3VudCA9PSAwIHx8IGN1cnJDb3VudCA9PSBudWxsIHx8IGN1cnJDb3VudCA9PSB1bmRlZmluZWQgfHwgcHJldkNvdW50ID09IDAgfHwgcHJldkNvdW50ID09IG51bGwgfHwgcHJldkNvdW50ID09IHVuZGVmaW5lZCkgPyAnJyA6IChjdXJyQ291bnQgPiAwICYmIGN1cnJDb3VudCA+IHByZXZDb3VudCkgPyAnZ3JlZW4nIDogJ3JlZCcpKTtcclxuXHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH0pO1xyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZ2JsUm93VG90Q29sb3JWYWxXaXNlKTtcclxuXHJcblxyXG5cclxuXHJcbiAgICAvLyB0aGlzLmNvbFRvdGFsLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgIC8vICAgbGV0IGxLZXkgPSBrZXk7XHJcbiAgICAvLyAgIGxldCBjb3VudCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdjb3VudCcpKTtcclxuICAgIC8vICAgbGV0IHZhbCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCd2YWx1ZScpKTtcclxuICAgIC8vICAgbGV0IGdycFZhbCA9IGxLZXkuc3BsaXQoJyMnKVswXTtcclxuICAgIC8vICAgbGV0IGNvbFZhbCA9IGxLZXkuc3BsaXQoJyMnKVsxXTtcclxuICAgIC8vICAgbGV0IHN0YXR1cyA9IGxLZXkuc3BsaXQoJyMnKVsyXTtcclxuICAgIC8vICAgbGV0IGlzU29sZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vICAgaWYgKHRoaXMuYW5hR3JwU3R0LmluZGV4T2Yoc3RhdHVzKSA9PSAtMSlcclxuICAgIC8vICAgICBpc1NvbGQgPSB0cnVlO1xyXG5cclxuICAgIC8vICAgaWYgKGlzU29sZCkge1xyXG4gICAgLy8gICAgIGxldCBjbXBEYXRhID0gdGhpcy5jb2xUb3RhbC5nZXQoZ3JwVmFsICsgJyMnICsgY29sVmFsICsgJyNta3QnKTtcclxuXHJcbiAgICAvLyAgICAgaWYgKGNtcERhdGEgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAvLyAgICAgICBsZXQgY21wQ291bnQgPSBwYXJzZUZsb2F0KGNtcERhdGEuZ2V0KCdjb3VudCcpKTtcclxuICAgIC8vICAgICAgIGxldCBtc2QgPSBNYXRoLnJvdW5kKHBlcmlvZCAqIGNtcENvdW50IC8gY291bnQpO1xyXG4gICAgLy8gICAgICAgdmFsdWUuc2V0KCdtc2QnLCBtc2QpO1xyXG4gICAgLy8gICAgICAgbGV0IGNoa2NvdW50ID0gKHN0b2NrZGF5cyAqIGNvdW50IC8gcGVyaW9kKTtcclxuICAgIC8vICAgICAgIGxldCBtaW5jb3VudCA9IChjaGtjb3VudCAqIG1pbnZhcmlhdGlvbik7XHJcbiAgICAvLyAgICAgICBsZXQgbWF4Y291bnQgPSAoY2hrY291bnQgKiBtYXh2YXJpYXRpb24pO1xyXG4gICAgLy8gICAgICAgbGV0IGdyaWRjb2xvciA9ICcjMDA4MDAwNTQnO1xyXG4gICAgLy8gICAgICAgaWYgKGNtcENvdW50ID4gbWF4Y291bnQpIHtcclxuICAgIC8vICAgICAgICAgZ3JpZGNvbG9yID0gJyNmZjAwMDA0Nyc7XHJcbiAgICAvLyAgICAgICB9IGVsc2UgaWYgKGNtcENvdW50ID49IG1pbmNvdW50ICYmIGNtcENvdW50IDw9IG1heGNvdW50KSB7XHJcbiAgICAvLyAgICAgICAgIGdyaWRjb2xvciA9ICcjZmZmZjAwNjEnO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgICAgdmFsdWUuc2V0KCdncnBjb2xvcicsIGdyaWRjb2xvcik7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGxldCBzdnBkID0gTWF0aC5yb3VuZCh2YWwgLyBwZXJpb2QpO1xyXG4gICAgLy8gICAgIHZhbHVlLnNldCgnc3ZwZCcsIHN2cGQpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyAgIGlmIChzdGF0dXMgPT0gJ21rdCcpXHJcbiAgICAvLyAgICAgdmFsdWUuc2V0KCdncnBjb2xvcicsICcjZGRkZGRkJyk7XHJcblxyXG4gICAgLy8gfSk7XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICB0aGlzLmNvbFRvdGFsLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgbGV0IGxLZXkgPSBrZXk7XHJcbiAgICAgIGxldCBjb3VudCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdjb3VudCcpKTtcclxuICAgICAgaWYgKHRoaXMuZm9ybW5hbWUgPT0gJ21peEFuYWx5c2lzUmVwb3J0Rm9ybScpXHJcbiAgICAgICAgY291bnQgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgnd3QnKSk7XHJcblxyXG4gICAgICBsZXQgdmFsID0gcGFyc2VGbG9hdCh2YWx1ZS5nZXQoJ3ZhbHVlJykpO1xyXG4gICAgICBsZXQgZ3JwVmFsID0gbEtleS5zcGxpdCgnIycpWzBdO1xyXG4gICAgICBsZXQgcm93VmFsID0gbEtleS5zcGxpdCgnIycpWzFdO1xyXG4gICAgICBsZXQgc3RhdHVzID0gbEtleS5zcGxpdCgnIycpWzJdO1xyXG4gICAgICBsZXQgd3QgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgnd3QnKSk7XHJcbiAgICAgIGxldCByYXAgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgncmFwJykpO1xyXG4gICAgICBsZXQgc3ZwZCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdzdnBkJykpID09IHVuZGVmaW5lZCA/IDAgOiBwYXJzZUZsb2F0KHZhbHVlLmdldCgnc3ZwZCcpKTtcclxuICAgICAgbGV0IG1zZCA9IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdtc2QnKSkgPT0gdW5kZWZpbmVkID8gMCA6IHBhcnNlRmxvYXQodmFsdWUuZ2V0KCdtc2QnKSk7XHJcbiAgICAgIGxldCBhZ2UgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgnYWdlJykpO1xyXG4gICAgICBsZXQgdmFsdWVBZ2UgPSBwYXJzZUZsb2F0KHZhbHVlLmdldCgndmFsdWVhZ2UnKSk7XHJcblxyXG4gICAgICBsZXQgaXNTb2xkID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5hbmFHcnBTdHQuaW5kZXhPZihzdGF0dXMpID09IC0xKVxyXG4gICAgICAgIGlzU29sZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoaXNTb2xkKSB7XHJcbiAgICAgICAgbGV0IGNtcERhdGEgPSB0aGlzLmNvbFRvdGFsLmdldChncnBWYWwgKyAnIycgKyByb3dWYWwgKyAnI21rdCcpO1xyXG4gICAgICAgIGlmIChjbXBEYXRhICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgbGV0IGNtcENvdW50ID0gcGFyc2VGbG9hdChjbXBEYXRhLmdldCgnY291bnQnKSk7XHJcbiAgICAgICAgICBsZXQgbXNkID0gTWF0aC5yb3VuZChwZXJpb2QgKiBjbXBDb3VudCAvIGNvdW50KTtcclxuICAgICAgICAgIHZhbHVlLnNldCgnbXNkJywgbXNkKTtcclxuXHJcbiAgICAgICAgICBsZXQgY21wdmFsID0gcGFyc2VGbG9hdChjbXBEYXRhLmdldCgndmFsdWUnKSk7XHJcbiAgICAgICAgICBsZXQgbXNkdmx1ID0gTWF0aC5yb3VuZChwZXJpb2QgKiBjbXB2YWwgLyB2YWwpO1xyXG4gICAgICAgICAgdmFsdWUuc2V0KCdtc2R2bHUnLCBtc2R2bHUpO1xyXG4gICAgICAgICAgbGV0IGNoa2NvdW50ID0gKHN0b2NrZGF5cyAqIGNvdW50IC8gcGVyaW9kKTtcclxuICAgICAgICAgIGxldCBuZXRyYXRpbyA9IChjaGtjb3VudCAqIDEwMCkgLyBjbXBDb3VudDtcclxuXHJcbiAgICAgICAgICBsZXQgZ3JpZGNvbG9yID0gJyNmZmZmMDAnO1xyXG4gICAgICAgICAgaWYgKG5ldHJhdGlvIDw9IDMwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGRyZWQ7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG5ldHJhdGlvID4gMzAgJiYgbmV0cmF0aW8gPCA2MCkge1xyXG4gICAgICAgICAgICBncmlkY29sb3IgPSBtcmVkO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+PSA2MCAmJiBuZXRyYXRpbyA8IG1pbnZhcmlhdGlvbikge1xyXG4gICAgICAgICAgICBncmlkY29sb3IgPSBscmVkO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChuZXRyYXRpbyA+PSBtaW52YXJpYXRpb24gJiYgbmV0cmF0aW8gPCBtYXh2YXJpYXRpb24pIHtcclxuICAgICAgICAgICAgZ3JpZGNvbG9yID0gJ3JnYmEoMjU1LCAyNTUsIDAsIDAuMzgpJztcclxuICAgICAgICAgIH0gZWxzZSBpZiAobmV0cmF0aW8gPj0gbWF4dmFyaWF0aW9uICYmIG5ldHJhdGlvIDwgMjAwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGxncmVlbjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobmV0cmF0aW8gPj0gMjAwICYmIG5ldHJhdGlvIDwgMzAwKSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IG1ncmVlbjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9IGRncmVlbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhbHVlLnNldCgnZ3JwY29sb3InLCBncmlkY29sb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN2cGQgPSBNYXRoLnJvdW5kKHZhbCAvIHBlcmlvZCk7XHJcbiAgICAgICAgdmFsdWUuc2V0KCdzdnBkJywgc3ZwZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHN0YXR1cyA9PSAnbWt0JylcclxuICAgICAgICB2YWx1ZS5zZXQoJ2dycGNvbG9yJywgJyNkZGRkZGQnKTtcclxuXHJcbiAgICB9KTtcclxuXHJcblxyXG5cclxuXHJcbiAgICAvLyBHcmFuZCBTdW1tYXJpZXNcclxuXHJcbiAgICB0aGlzLnNvcnRlZEdycC5tYXAoZWxlID0+IHtcclxuICAgICAgbGV0IG1rdEtleSA9IFwiR1QjXCIgKyBlbGUgKyBcIiNta3RcIjtcclxuICAgICAgLy9sZXQgc29sZEtleSA9IFwiR1QjXCIgKyBlbGUgKyBcIiNzb2xkXCI7XHJcblxyXG4gICAgICBsZXQgc29sZEtleSA9IFwiXCI7XHJcbiAgICAgIGxldCBta3QgPSB0aGlzLmdyYW5kVG90YWwuZ2V0KG1rdEtleSkgPT0gbnVsbCA/IG5ldyBNYXAoKSA6IHRoaXMuZ3JhbmRUb3RhbC5nZXQobWt0S2V5KTtcclxuICAgICAgbGV0IG1rdENvdW50ID0gbWt0LmdldCgnY291bnQnKSA9PSBudWxsID8gMCA6IG1rdC5nZXQoJ2NvdW50Jyk7XHJcbiAgICAgIGxldCBta3RWYWxlID0gcGFyc2VGbG9hdChta3QuZ2V0KCd2YWx1ZScpID09IG51bGwgPyAwIDogbWt0LmdldCgndmFsdWUnKSk7XHJcblxyXG5cclxuICAgICAgdGhpcy5zdHQuZm9yRWFjaChzdCA9PiB7XHJcbiAgICAgICAgbGV0IHN0YXR1cyA9IHN0O1xyXG5cclxuICAgICAgICBzb2xkS2V5ID0gXCJHVCNcIiArIGVsZSArICcjJyArIHN0O1xyXG4gICAgICAgIGxldCBzb2xkID0gdGhpcy5ncmFuZFRvdGFsLmdldChzb2xkS2V5KSA9PSBudWxsID8gbmV3IE1hcCgpIDogdGhpcy5ncmFuZFRvdGFsLmdldChzb2xkS2V5KTtcclxuICAgICAgICBsZXQgc29sZENvdW50ID0gc29sZC5nZXQoJ2NvdW50JykgPT0gbnVsbCA/IDAgOiBzb2xkLmdldCgnY291bnQnKTtcclxuICAgICAgICBsZXQgbXNkID0gTWF0aC5yb3VuZChkaWZmZGF5ICogbWt0Q291bnQgLyBzb2xkQ291bnQpO1xyXG4gICAgICAgIGxldCBzb2xkdmFsdWUgPSBwYXJzZUZsb2F0KHNvbGQuZ2V0KCd2YWx1ZScpID09IG51bGwgPyAwIDogc29sZC5nZXQoJ3ZhbHVlJykpO1xyXG4gICAgICAgIC8vbGV0IHN2cGQgPSBNYXRoLnJvdW5kKHNvbGR2YWx1ZSAvIGRpZmZkYXkpO1xyXG4gICAgICAgIHNvbGQuc2V0KCdtc2QnLCBtc2QpO1xyXG4gICAgICAgIC8vIHNvbGQuc2V0KCdzdnBkJywgc3ZwZCk7XHJcbiAgICAgICAgLy90aGlzLmdyYW5kVG90YWwuc2V0KG1rdEtleSwgbWt0KTtcclxuXHJcbiAgICAgICAgbGV0IG1zZHZsdSA9IE1hdGgucm91bmQoZGlmZmRheSAqIG1rdFZhbGUgLyBzb2xkdmFsdWUpO1xyXG4gICAgICAgIHNvbGQuc2V0KCdtc2R2bHUnLCBtc2R2bHUpO1xyXG5cclxuXHJcbiAgICAgICAgbGV0IGlzU29sZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hbmFHcnBTdHQuaW5kZXhPZihzdGF0dXMpID09IC0xKVxyXG4gICAgICAgICAgaXNTb2xkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzU29sZCkge1xyXG4gICAgICAgICAgbGV0IGNtcENvdW50ID0gbWt0Q291bnQ7XHJcbiAgICAgICAgICBsZXQgbXNkID0gTWF0aC5yb3VuZChwZXJpb2QgKiBjbXBDb3VudCAvIHNvbGRDb3VudCk7XHJcbiAgICAgICAgICBzb2xkLnNldCgnbXNkJywgbXNkKTtcclxuXHJcbiAgICAgICAgICBsZXQgbXNkdmx1ID0gTWF0aC5yb3VuZChwZXJpb2QgKiBta3RWYWxlIC8gc29sZHZhbHVlKTtcclxuICAgICAgICAgIHNvbGQuc2V0KCdtc2R2bHUnLCBtc2R2bHUpO1xyXG5cclxuXHJcbiAgICAgICAgICBsZXQgY2hrY291bnQgPSAoc3RvY2tkYXlzICogc29sZENvdW50IC8gcGVyaW9kKTtcclxuICAgICAgICAgIGxldCBtaW5jb3VudCA9IChjaGtjb3VudCAqIG1pbnZhcmlhdGlvbik7XHJcbiAgICAgICAgICBsZXQgbWF4Y291bnQgPSAoY2hrY291bnQgKiBtYXh2YXJpYXRpb24pO1xyXG4gICAgICAgICAgbGV0IGdyaWRjb2xvciA9ICcjMDA4MDAwNTQnO1xyXG4gICAgICAgICAgaWYgKGNtcENvdW50ID4gbWF4Y291bnQpIHtcclxuICAgICAgICAgICAgZ3JpZGNvbG9yID0gJyNmZjAwMDA0Nyc7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNtcENvdW50ID49IG1pbmNvdW50ICYmIGNtcENvdW50IDw9IG1heGNvdW50KSB7XHJcbiAgICAgICAgICAgIGdyaWRjb2xvciA9ICcjZmZmZjAwNjEnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc29sZC5zZXQoJ2dycGNvbG9yJywgZ3JpZGNvbG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdnBkID0gTWF0aC5yb3VuZChzb2xkdmFsdWUgLyBwZXJpb2QpO1xyXG4gICAgICAgIHNvbGQuc2V0KCdzdnBkJywgc3ZwZCk7XHJcbiAgICAgICAgLy8gIH1cclxuICAgICAgICBpZiAoc3RhdHVzID09ICdta3QnKVxyXG4gICAgICAgICAgc29sZC5zZXQoJ2dycGNvbG9yJywgJyNkZGRkZGQnKTtcclxuICAgICAgICB0aGlzLmdyYW5kVG90YWwuc2V0KHNvbGRLZXksIHNvbGQpO1xyXG5cclxuXHJcblxyXG5cclxuICAgICAgfSk7XHJcblxyXG5cclxuXHJcbiAgICB9KVxyXG5cclxuICB9XHJcblxyXG4gIG1vZGlmeVNlYXJjaCgpIHtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdCSWNhbGwnLCAnQkltb2RpZnknKTtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLm1vZHVsZW5hbWUgKyAnL2FuYWx5c2lzLXNlYXJjaC8nICsgdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5tZSddXSk7XHJcbiAgfVxyXG4gIGtleTtcclxuICBpc0FwcGxpZWQgPSBmYWxzZTtcclxuICBPbkNoYW5nZUJ5KFZhbFR5cGUpIHtcclxuICAgIHRoaXMuaXNBcHBsaWVkID0gdHJ1ZTtcclxuICAgIHRoaXMua2V5ID0gVmFsVHlwZTtcclxuICB9XHJcblxyXG4gIGdldERhdGEoY2FsbCwga2V5LCBzdCkge1xyXG4gICAgbGV0IHBrdGRhdGEgPSBbXTtcclxuICAgIGxldCB0ZW1wYXJyID0gW107XHJcbiAgICBpZiAoY2FsbCA9PSAnY2VsbCcpIHtcclxuXHJcbiAgICAgIHBrdGRhdGEgPSBwa3RkYXRhLmNvbmNhdChbXSwgQXJyYXkuZnJvbSh0aGlzLnBrdERhdGEuZ2V0KGtleSkpKTtcclxuXHJcblxyXG5cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGNhbGwgPT0gJ3JvdycpIHtcclxuICAgICAgdGhpcy5oZWFkLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMucGt0RGF0YS5nZXQoa2V5ICsgJyMnICsgZWxlbWVudCkgIT0gbnVsbCAmJiB0aGlzLnBrdERhdGEuZ2V0KGtleSArICcjJyArIGVsZW1lbnQpICE9IFwiXCIgJiYgdGhpcy5wa3REYXRhLmdldChrZXkgKyAnIycgKyBlbGVtZW50KSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHBrdGRhdGEgPSBwa3RkYXRhLmNvbmNhdChbXSwgQXJyYXkuZnJvbSh0aGlzLnBrdERhdGEuZ2V0KGtleSArICcjJyArIGVsZW1lbnQpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZWxzZSBpZiAoY2FsbCA9PSAnY29sJykge1xyXG4gICAgICB0aGlzLnNpZGUuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBsZXQgayA9IGtleS5zcGxpdCgnIycpO1xyXG4gICAgICAgIGxldCBrYyA9IGtbMF0gKyAnIycgKyBlbGVtZW50ICsgJyMnICsga1sxXTtcclxuICAgICAgICBpZiAodGhpcy5wa3REYXRhLmdldChrYykgIT0gbnVsbCAmJiB0aGlzLnBrdERhdGEuZ2V0KGtjKSAhPSBcIlwiICYmIHRoaXMucGt0RGF0YS5nZXQoa2MpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcGt0ZGF0YSA9IHBrdGRhdGEuY29uY2F0KFtdLCBBcnJheS5mcm9tKHRoaXMucGt0RGF0YS5nZXQoa2MpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBlbHNlIGlmIChjYWxsID09ICdhbGwnKSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwa3REYXRhJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zY2hEdGwpKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Jlc3VsdFZpZXcnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJlc3VsdC5yZXN1bHRWaWV3KSk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZXN1bHRWaWV3RHRsJywgSlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQucmVzdWx0Vmlld0R0bCkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIHBrdGRhdGEgPSBwa3RkYXRhLmZpbHRlcihlID0+IGUuZ3JwX3N0dCA9PSBzdCk7XHJcblxyXG5cclxuXHJcblxyXG4gICAgbGV0IHBkID0gXy5zb3J0QnkocGt0ZGF0YSwgWydjbycsICdwdSddKS5yZXZlcnNlKCk7XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGt0RGF0YScsIEpTT04uc3RyaW5naWZ5KHBrdGRhdGEpKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZXN1bHRWaWV3JywgSlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQucmVzdWx0VmlldykpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Jlc3VsdFZpZXdEdGwnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJlc3VsdC5yZXN1bHRWaWV3RHRsKSk7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2JpL3BrdC1saXN0J10pO1xyXG4gIH1cclxuICAvLyBcIkN1c2hpb24gTW9kLDAuNTAsI0hcIlxyXG4gIGdldEFsbChzdHQsIGhlYWQsIHNpZGUsIGdycCkge1xyXG4gICAgbGV0IGtleSA9ICcnO1xyXG4gICAgbGV0IHBrdGRhdGEgPSBbXTtcclxuICAgIC8vIGhlYWQuZm9yRWFjaChoZCA9PiB7XHJcbiAgICAvLyAgIHN0dC5mb3JFYWNoKHN0ID0+IHtcclxuICAgIC8vICAgICBrZXkgPSBncnAgKyAnLCcgKyAnIycgKyBoZCArICcsJyArICcjJyArIHN0O1xyXG4gICAgLy8gICAgIGlmICh0aGlzLmhlYWREYXRhLmdldChrZXkpICE9IG51bGwgJiYgdGhpcy5oZWFkRGF0YS5nZXQoa2V5KSAhPSBcIlwiICYmIHRoaXMuaGVhZERhdGEuZ2V0KGtleSkgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAvLyAgICAgcGt0ZGF0YSA9IHBrdGRhdGEuY29uY2F0KFtdLCBBcnJheS5mcm9tKHRoaXMuaGVhZERhdGEuZ2V0KGtleSkpKTtcclxuICAgIC8vICAgICBjb25zb2xlLmxvZyhrZXkpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgc2lkZS5mb3JFYWNoKHNkID0+IHtcclxuICAgICAgc3R0LmZvckVhY2goc3QgPT4ge1xyXG4gICAgICAgIGtleSA9IGdycCArICcsJyArICcjJyArIHNkICsgJywnICsgJyMnICsgc3Q7XHJcbiAgICAgICAgaWYgKHRoaXMuc2lkZURhdGEuZ2V0KGtleSkgIT0gbnVsbCAmJiB0aGlzLnNpZGVEYXRhLmdldChrZXkpICE9IFwiXCIgJiYgdGhpcy5zaWRlRGF0YS5nZXQoa2V5KSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHBrdGRhdGEgPSBwa3RkYXRhLmNvbmNhdChbXSwgQXJyYXkuZnJvbSh0aGlzLnNpZGVEYXRhLmdldChrZXkpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3BrdERhdGEnLCBKU09OLnN0cmluZ2lmeShwa3RkYXRhKSk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncmVzdWx0VmlldycsIEpTT04uc3RyaW5naWZ5KHRoaXMucmVzdWx0LnJlc3VsdFZpZXcpKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZXN1bHRWaWV3RHRsJywgSlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQucmVzdWx0Vmlld0R0bCkpO1xyXG4gIH1cclxuXHJcbiAgd3QgPSBmYWxzZTtcclxuICBhdmcgPSBmYWxzZTtcclxuICByYXAgPSBmYWxzZTtcclxuICB2YWwgPSBmYWxzZTtcclxuICBzdnBkID0gZmFsc2U7XHJcbiAgbXNkID0gZmFsc2U7XHJcbiAgbXNkdmx1ID0gZmFsc2U7XHJcblxyXG4gIGFnZSA9IGZhbHNlO1xyXG4gIHZhID0gZmFsc2U7XHJcbiAgaGlkZVNob3coY2FsbCwgc3RhdHVzKSB7XHJcbiAgICAvLyB2YXIgZGF0ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqW2lkXj1cIicgKyBpbmRleCArICdcIl0nKTtcclxuICAgIC8vIGxldCBub2RlcyA9IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRePVwiJyArIGNhbGwgKyAnXCJdJykgYXMgYW55KTtcclxuICAgIC8vIGlmIChzdGF0dXMpIHtcclxuICAgIC8vICAgbm9kZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgIC8vICAgICAvLyBjb25zb2xlLmxvZygpO1xyXG4gICAgLy8gICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQuaWQpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgIG5vZGVzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2coKTtcclxuICAgIC8vICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50LmlkKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH1cclxuICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNhbGwpO1xyXG4gICAgaWYgKGNhbGwgPT0gJ0NUUycpIHtcclxuICAgICAgdGhpcy53dCA9ICF0aGlzLnd0XHJcbiAgICB9IGVsc2UgaWYgKGNhbGwgPT0gJ0FWRycpIHtcclxuICAgICAgdGhpcy5hdmcgPSAhdGhpcy5hdmdcclxuICAgIH0gZWxzZSBpZiAoY2FsbCA9PSAnUkFQJykge1xyXG4gICAgICB0aGlzLnJhcCA9ICF0aGlzLnJhcFxyXG4gICAgfSBlbHNlIGlmIChjYWxsID09ICdWTFUnKSB7XHJcbiAgICAgIHRoaXMudmFsID0gIXRoaXMudmFsXHJcbiAgICB9IGVsc2UgaWYgKGNhbGwgPT0gJ1NWUCcpIHtcclxuICAgICAgdGhpcy5zdnBkID0gIXRoaXMuc3ZwZFxyXG4gICAgfSBlbHNlIGlmIChjYWxsID09ICdNU0QnKSB7XHJcbiAgICAgIHRoaXMubXNkID0gIXRoaXMubXNkXHJcbiAgICB9IGVsc2UgaWYgKGNhbGwgPT0gJ01TRFZMVScpIHtcclxuICAgICAgdGhpcy5tc2R2bHUgPSAhdGhpcy5tc2R2bHVcclxuICAgIH0gZWxzZSBpZiAoY2FsbCA9PSAnQUdFJykge1xyXG4gICAgICB0aGlzLmFnZSA9ICF0aGlzLmFnZVxyXG4gICAgfSBlbHNlIGlmIChjYWxsID09ICdWQScpIHtcclxuICAgICAgdGhpcy52YSA9ICF0aGlzLnZhXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VHcnAoZ3JpZEdycCkge1xyXG4gICAgdGhpcy5nZW5lcmF0ZUdyaWRHcnBXaXNlKCdjJywgZ3JpZEdycCk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZUdyaWRHcnBXaXNlKGNhbGwsIHNlbGVjdGVkZ3JwKSB7XHJcbiAgICB0aGlzLmdycHZhbCA9ICcnO1xyXG4gICAgdGhpcy5oZWFkdmFsID0gJyc7XHJcbiAgICB0aGlzLnNpZGV2YWwgPSAnJztcclxuICAgIHRoaXMubWF0cml4LmNsZWFyKClcclxuICAgIHRoaXMucm93VG90YWwuY2xlYXIoKVxyXG4gICAgdGhpcy5jb2xUb3RhbC5jbGVhcigpXHJcbiAgICB0aGlzLmdyYW5kVG90YWwuY2xlYXIoKVxyXG4gICAgdGhpcy5wa3REYXRhLmNsZWFyKClcclxuICAgIHRoaXMuaGVhZCA9IFtdO1xyXG4gICAgdGhpcy5zaWRlID0gW107XHJcbiAgICBsZXQgZ3JwcyA9IHNlbGVjdGVkZ3JwLmdyb3VwLnNwbGl0KCcsJyk7XHJcbiAgICBsZXQgaGVhZCA9IHNlbGVjdGVkZ3JwLmhlYWQuc3BsaXQoJywnKTtcclxuICAgIGxldCBzaWRlID0gc2VsZWN0ZWRncnAuc2lkZS5zcGxpdCgnLCcpO1xyXG4gICAgdGhpcy5ncnB2YWwgPSBbLi4uZ3Jwc107XHJcbiAgICB0aGlzLmhlYWR2YWwgPSBbLi4uaGVhZF07XHJcbiAgICB0aGlzLnNpZGV2YWwgPSBbLi4uc2lkZV07XHJcbiAgICB0aGlzLmNyZWF0ZUdyaWQoKTtcclxuICB9XHJcblxyXG4gIHNjcm9sbCA9ICgpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuYnRuVmlzaWJpbGl0eUJ5UG9zKCk7XHJcbiAgfTtcclxuXHJcbiAgYnRuVmlzaWJpbGl0eUJ5UG9zKCkge1xyXG4gICAgaWYgKGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID4gMjAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA+IDEwKSB7XHJcbiAgICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYnRuR29Ub3BcIikuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdGF0aWNIZWFkXCIpLnN0eWxlLnRvcCA9IFwiNTBweFwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdGF0aWNIZWFkXCIpLnN0eWxlLnRvcCA9IFwiMTEwcHhcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBDaGF0TWFwRHRsID0ge307XHJcbiAgaXNzaG93Y2hhcnQgPSBmYWxzZTtcclxuICBjcmVhdGVncnBQaWUocGllU3RhdHVzTGlzdCwgZ3JwLCBhdHRyLCBwaWVjaGFydERhdGFMaXN0LCB0eXApIHtcclxuICAgIHRoaXMuaXNzaG93Y2hhcnQgPSBmYWxzZTtcclxuICAgIHRoaXMuQ2hhdE1hcER0bCA9IHt9O1xyXG4gICAgcGllU3RhdHVzTGlzdC5mb3JFYWNoKHN0YXR1cyA9PiB7XHJcbiAgICAgIGxldCBwaWVDaGFydExhYmVscyA9IFtdO1xyXG4gICAgICBsZXQgcGllQ2hhcnREYXRhID0gW107XHJcbiAgICAgIGxldCBwaWVDaGFydGxlZ2VuZCA9IFtdO1xyXG4gICAgICBwaWVjaGFydERhdGFMaXN0LmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgbGV0IGR0bDtcclxuICAgICAgICBpZiAodHlwID09ICdoZWFkJykge1xyXG4gICAgICAgICAgZHRsID0gdGhpcy5tYXRyaXguZ2V0KGdycCArIFwiI1wiICsgZGF0YSArIFwiI1wiICsgYXR0ciArIFwiI1wiICsgc3RhdHVzKSB8fCAnJztcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGR0bCA9IHRoaXMubWF0cml4LmdldChncnAgKyBcIiNcIiArIGF0dHIgKyBcIiNcIiArIGRhdGEgKyBcIiNcIiArIHN0YXR1cykgfHwgJyc7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGR0bCAhPSAnJykge1xyXG4gICAgICAgICAgbGV0IGNudCA9IGR0bC5nZXQoJ2NvdW50JykgfHwgJyc7XHJcbiAgICAgICAgICBpZiAoY250ICE9ICcnICYmIGNudCAhPSAnMCcpXHJcbiAgICAgICAgICAgIHBpZUNoYXJ0RGF0YS5wdXNoKHBhcnNlSW50KGNudCkpO1xyXG4gICAgICAgICAgcGllQ2hhcnRMYWJlbHMucHVzaChkYXRhKTtcclxuICAgICAgICAgIHBpZUNoYXJ0bGVnZW5kLnB1c2goZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5DaGF0TWFwRHRsW3N0YXR1cyArIFwiX2RhdGFcIl0gPSBwaWVDaGFydERhdGE7XHJcbiAgICAgIHRoaXMuQ2hhdE1hcER0bFtzdGF0dXMgKyBcIl9sYWJsZVwiXSA9IHBpZUNoYXJ0TGFiZWxzO1xyXG4gICAgICB0aGlzLkNoYXRNYXBEdGxbc3RhdHVzICsgXCJfbGVnZW5kXCJdID0gcGllQ2hhcnRsZWdlbmQ7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5DaGFydFR5cGUgPSAncGllJztcclxuICAgIHRoaXMucmVmcmVzaENoYXJ0KCdwaWUnKTtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaWVjaGFydE1vZGVsQnRuJykuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBiYXJDaGFydERhdGE7XHJcbiAgcHVibGljIGJhckNoYXJ0TGFiZWxzO1xyXG4gIHB1YmxpYyBiYXJDaGFydFR5cGU7XHJcbiAgcHVibGljIGJhckNoYXJ0TGVnZW5kID0gdHJ1ZTtcclxuICBpc2JhcnNob3djaGFydCA9IGZhbHNlO1xyXG5cclxuXHJcbiAgcHVibGljIGJhckNoYXJ0T3B0aW9uczogQ2hhcnRPcHRpb25zID0ge1xyXG4gICAgcmVzcG9uc2l2ZTogdHJ1ZSxcclxuXHJcbiAgICBzY2FsZXM6IHtcclxuICAgICAgeUF4ZXM6IFt7XHJcbiAgICAgICAgaWQ6IFwieS1heGlzLTFcIixcclxuICAgICAgICBwb3NpdGlvbjogJ2xlZnQnLFxyXG5cclxuICAgICAgICB0aWNrczoge1xyXG4gICAgICAgICAgYmVnaW5BdFplcm86IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNjYWxlTGFiZWw6IHtcclxuICAgICAgICAgIGRpc3BsYXk6IHRydWUsXHJcbiAgICAgICAgICBsYWJlbFN0cmluZzogJ1F0eSdcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6IFwieS1heGlzLTJcIixcclxuICAgICAgICBwb3NpdGlvbjogJ3JpZ2h0JyxcclxuXHJcbiAgICAgICAgdGlja3M6IHtcclxuICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICAsXHJcbiAgICAgICAgc2NhbGVMYWJlbDoge1xyXG4gICAgICAgICAgZGlzcGxheTogdHJ1ZSxcclxuICAgICAgICAgIGxhYmVsU3RyaW5nOiAnQXZnJ1xyXG4gICAgICAgIH0sXHJcblxyXG5cclxuICAgICAgfV1cclxuICAgIH0sXHJcbiAgICBwbHVnaW5zOiB7XHJcbiAgICAgIGxhYmVsczoge1xyXG4gICAgICAgIC8vIHJlbmRlciAnbGFiZWwnLCAndmFsdWUnLCAncGVyY2VudGFnZScsICdpbWFnZScgb3IgY3VzdG9tIGZ1bmN0aW9uLCBkZWZhdWx0IGlzICdwZXJjZW50YWdlJ1xyXG4gICAgICAgIHJlbmRlcjogJ3ZhbHVlJyxcclxuICAgICAgICBzaG93WmVybzogZmFsc2UsXHJcbiAgICAgICAgb3ZlcmxhcDogZmFsc2UsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuXHJcblxyXG5cclxuICBwdWJsaWMgYmFyY2hhcnRDb2xvcnM6IEFycmF5PGFueT4gPSBbXHJcbiAgICB7XHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoNTksIDg5LCAxNTIsMC44KScsXHJcbiAgICAgIGJvcmRlckNvbG9yOiAncmdiYSg1OSwgODksIDE1MiwwLjgpJyxcclxuICAgICAgYm9yZGVyV2lkdGg6IDIsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDU5LCA4OSwgMTUyLDAuOCknLFxyXG4gICAgICBib3JkZXJDb2xvcjogJ3JnYmEoNTksIDg5LCAxNTIsMC44KScsXHJcbiAgICAgIGJvcmRlcldpZHRoOiAyLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgyNTUsIDEwMiwgMTc5LDAuOCknLFxyXG4gICAgICBib3JkZXJDb2xvcjogJ3JnYmEoMjU1LCAxMDIsIDE3OSwwLjgpJyxcclxuICAgICAgYm9yZGVyV2lkdGg6IDIsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMTAyLCAxNzksMC44KScsXHJcbiAgICAgIGJvcmRlckNvbG9yOiAncmdiYSgyNTUsIDEwMiwgMTc5LDAuOCknLFxyXG4gICAgICBib3JkZXJXaWR0aDogMixcclxuICAgIH1cclxuICBdO1xyXG5cclxuXHJcbiAgY3JlYXRlZ3JwQmFyKHBpZVN0YXR1c0xpc3QsIGdycCwgYXR0ciwgcGllY2hhcnREYXRhTGlzdCwgdHlwKSB7XHJcbiAgICB0aGlzLmlzYmFyc2hvd2NoYXJ0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmJhckNoYXJ0RGF0YSA9IFtdO1xyXG4gICAgdGhpcy5iYXJDaGFydExhYmVscyA9IFtdO1xyXG4gICAgcGllU3RhdHVzTGlzdC5mb3JFYWNoKHN0YXR1cyA9PiB7XHJcbiAgICAgIGxldCBiYXJjaGFyRHRsID0ge307XHJcbiAgICAgIGxldCBiYXJjaGF0bGlzdCA9IFtdO1xyXG4gICAgICBsZXQgbGluZWNoYXJ0TGlzdCA9IFtdO1xyXG4gICAgICBwaWVjaGFydERhdGFMaXN0LmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgbGV0IGR0bDtcclxuICAgICAgICBpZiAodHlwID09ICdoZWFkJykge1xyXG4gICAgICAgICAgZHRsID0gdGhpcy5tYXRyaXguZ2V0KGdycCArIFwiI1wiICsgZGF0YSArIFwiI1wiICsgYXR0ciArIFwiI1wiICsgc3RhdHVzKSB8fCAnJztcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGR0bCA9IHRoaXMubWF0cml4LmdldChncnAgKyBcIiNcIiArIGF0dHIgKyBcIiNcIiArIGRhdGEgKyBcIiNcIiArIHN0YXR1cykgfHwgJyc7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5iYXJDaGFydExhYmVscy5pbmRleE9mKGRhdGEpID09IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLmJhckNoYXJ0TGFiZWxzLnB1c2goZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkdGwgIT0gJycpIHtcclxuICAgICAgICAgIGxldCBjbnQgPSBkdGwuZ2V0KCdjb3VudCcpIHx8ICcwJztcclxuICAgICAgICAgIGxldCBhdmcgPSBkdGwuZ2V0KCdhdmcnKSB8fCAnMCc7XHJcbiAgICAgICAgICBiYXJjaGF0bGlzdC5wdXNoKGNudCk7XHJcbiAgICAgICAgICBsaW5lY2hhcnRMaXN0LnB1c2goYXZnKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJhcmNoYXRsaXN0LnB1c2goJzAnKTtcclxuICAgICAgICAgIGxpbmVjaGFydExpc3QucHVzaCgnMCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICBiYXJjaGFyRHRsWydsYWJlbCddID0gc3RhdHVzICsgXCIgUXR5XCI7XHJcbiAgICAgIGJhcmNoYXJEdGxbJ2RhdGEnXSA9IGJhcmNoYXRsaXN0O1xyXG4gICAgICBiYXJjaGFyRHRsWyd0eXBlJ10gPSAnYmFyJztcclxuICAgICAgYmFyY2hhckR0bFsneUF4aXNJRCddID0gJ3ktYXhpcy0xJztcclxuICAgICAgdGhpcy5iYXJDaGFydERhdGEucHVzaChiYXJjaGFyRHRsKTtcclxuICAgICAgYmFyY2hhckR0bCA9IHt9O1xyXG4gICAgICBiYXJjaGFyRHRsWydsYWJlbCddID0gc3RhdHVzICsgXCIgQXZnXCI7XHJcbiAgICAgIGJhcmNoYXJEdGxbJ2RhdGEnXSA9IGxpbmVjaGFydExpc3Q7XHJcbiAgICAgIGJhcmNoYXJEdGxbJ3R5cGUnXSA9ICdsaW5lJztcclxuICAgICAgYmFyY2hhckR0bFsnZmlsbCddID0gZmFsc2U7XHJcbiAgICAgIGJhcmNoYXJEdGxbJ3lBeGlzSUQnXSA9ICd5LWF4aXMtMic7XHJcbiAgICAgIHRoaXMuYmFyQ2hhcnREYXRhLnB1c2goYmFyY2hhckR0bCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmJhckNoYXJ0VHlwZSA9ICdiYXInO1xyXG4gICAgdGhpcy5yZWZyZXNoQ2hhcnQoJ2JhcicpO1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhcmNoYXJ0TW9kZWxCdG4nKS5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaENoYXJ0KHR5cGUpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodHlwZSA9PSAnYmFyJylcclxuICAgICAgICB0aGlzLmlzYmFyc2hvd2NoYXJ0ID0gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGUgPT0gJ3BpZScpXHJcbiAgICAgICAgdGhpcy5pc3Nob3djaGFydCA9IHRydWU7XHJcblxyXG4gICAgfSwgNSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnNjcm9sbCwgdHJ1ZSk7XHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUobWFwID0+IHtcclxuICAgICAgbGV0IHNjaElkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NyY0lkbnMnKTtcclxuICAgICAgbGV0IHBlcmlvZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdCSVBlcmlvZCcpO1xyXG4gICAgICB0aGlzLmZvcm1uYW1lID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5tZSddO1xyXG4gICAgICB0aGlzLnNyY2hIaXN0b3J5WydwZXJpb2QnXSA9IHBlcmlvZDtcclxuICAgICAgbGV0IGZybWR0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJcFRvJyk7XHJcbiAgICAgIGxldCB0b2R0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJcEZyb20nKTtcclxuICAgICAgdGhpcy5jVXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgICB0aGlzLm1vZHVsZW5hbWUgPSB0aGlzLmNVcmwuc3BsaXQoJy8nKVsxXTtcclxuICAgICAgaWYgKGZybWR0ICE9IG51bGwgJiYgZnJtZHQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5zcmNoSGlzdG9yeVsnZnJtZHQnXSA9IChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQklwRnJvbScpKS5yZXBsYWNlKC9bJ1wiXSsvZywgJycpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodG9kdCAhPSBudWxsICYmIHRvZHQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5zcmNoSGlzdG9yeVsndG9kdCddID0gKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdCSXBUbycpKS5yZXBsYWNlKC9bJ1wiXSsvZywgJycpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgaWYgKHNjaElkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuZ2V0U2VhcmNoUmVzdWx0KHNjaElkLCBwZXJpb2QpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIHRoaXMuZ3JvdXBzID0gW1xyXG4gICAgLy8gICB7XHJcbiAgICAvLyAgICAgJ3ZhbCc6ICdzaF9zel9jb19wdScsXHJcbiAgICAvLyAgICAgJ2dycCc6ICdzaCxzeicsXHJcbiAgICAvLyAgICAgJ2hlYWQnOiAncHUnLFxyXG4gICAgLy8gICAgICdzaWRlJzogJ2NvJyxcclxuICAgIC8vICAgfSwge1xyXG4gICAgLy8gICAgICd2YWwnOiAnc2hfY29fcHUnLFxyXG4gICAgLy8gICAgICdncnAnOiAnc2gnLFxyXG4gICAgLy8gICAgICdoZWFkJzogJ3B1JyxcclxuICAgIC8vICAgICAnc2lkZSc6ICdjbycsXHJcbiAgICAvLyAgIH0sIHtcclxuICAgIC8vICAgICAndmFsJzogJ3B1cl9jb19wdScsXHJcbiAgICAvLyAgICAgJ2dycCc6ICdwdXInLFxyXG4gICAgLy8gICAgICdoZWFkJzogJ3B1JyxcclxuICAgIC8vICAgICAnc2lkZSc6ICdjbycsXHJcbiAgICAvLyAgIH1cclxuICAgIC8vIF1cclxuICAgIC8vIHRoaXMuY3JlYXRlR3JpZCgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibXRcIj5cclxuICA8ZGl2IGNsYXNzPVwicGFuZWwgcGFuZWwtZGVmYXVsdFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIj5cclxuICAgICAgPGgzIGNsYXNzPVwicGFuZWwtdGl0bGVcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdCBjcFwiIChjbGljayk9XCJjcy5wYWdlQmNrKCk7XCI+IEJhY2s8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7QW5hbHlzaXNcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImYtMTJcIj4oe3tjcy5jRGF0ZSB8IGRhdGU6J21lZGl1bSd9fSk8L3NwYW4+XHJcbiAgICAgICAgPCEtLSA8YnV0dG9uIChjbGljayk9XCJ0ZXN0KClcIj48L2J1dHRvbj4gLS0+XHJcblxyXG4gICAgICA8L2gzPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZnJhbWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWZyYW1lLWJvZHlcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjA7XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBpZD1cInN0YXRpY0hlYWRcIlxyXG4gICAgICAgICAgICBzdHlsZT1cIiBwb3NpdGlvbjogZml4ZWQ7d2lkdGg6IDEwMCU7YmFja2dyb3VuZDogd2hpdGU7ei1pbmRleDogOTk7cGFkZGluZy10b3A6NXB4XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1pbmxpbmUgcHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWw+R3JpZCBGb3JtYXRlIDwvbGFiZWw+ICZuYnNwOyZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIG5hbWU9XCJncmlkR3JwXCIgKGNoYW5nZSk9XCJjaGFuZ2VHcnAoZ3JpZEdycCk7XCJcclxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdyaWRHcnBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cHNcIiBbbmdWYWx1ZV09XCJncm91cFwiPnt7Z3JvdXAubmFtZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogNXB4O1wiIChjbGljayk9XCJtb2RpZnlTZWFyY2goKVwiPk1vZGlmeVxyXG4gICAgICAgICAgICAgICAgICAgIFNlYXJjaDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxwIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDtcIj5TYWxlIHBlcmlvZCAmbmJzcDsmbmJzcDsge3tzcmNoSGlzdG9yeT8uZnJtZHR9fSAmbmJzcDsmbmJzcDsgVG9cclxuICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7IHt7c3JjaEhpc3Rvcnk/LnRvZHR9fSAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfFxyXG4gICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsgUGVyaW9kIHt7c3JjaEhpc3Rvcnk/LnBlcmlvZH19PC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XHJcbiAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZSBwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleGFtcGxlSW5wdXROYW1lMlwiPmNoYW5nZSBCeSAmbmJzcDsmbmJzcDs8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8c2VsZWN0IHN0eWxlPVwid2lkdGg6ODBweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBuYW1lPVwiQ2hhbmdlQnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiT25DaGFuZ2VCeShDaGFuZ2VCeSk7XCIgWyhuZ01vZGVsKV09XCJDaGFuZ2VCeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJDT1VOVENPTE9SXCI+UXR5PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkFWR0NPTE9SXCI+QXZnPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0c1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ0NUUycsICRldmVudC50YXJnZXQuY2hlY2tlZCk7XCI+IENUU1xyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ0FWRycsICRldmVudC50YXJnZXQuY2hlY2tlZCk7XCI+IEFWR1xyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ1JBUCcsICRldmVudC50YXJnZXQuY2hlY2tlZCk7XCI+IERJU0NcclxuICAgICAgICAgICAgICA8IS0tIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ0FHRScsICRldmVudC50YXJnZXQuY2hlY2tlZCk7XCI+IEFHRSAtLT5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNsaWNrKT1cImhpZGVTaG93KCdWTFUnLCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1wiPiBWTFVcclxuXHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIChjbGljayk9XCJoaWRlU2hvdygnTVNEJywgJGV2ZW50LnRhcmdldC5jaGVja2VkKTtcIj4gTVNEXHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIChjbGljayk9XCJoaWRlU2hvdygnTVNEVkxVJywgJGV2ZW50LnRhcmdldC5jaGVja2VkKTtcIj4gTVNEIFZMVVxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ0FHRScsICRldmVudC50YXJnZXQuY2hlY2tlZCk7XCI+IEFHRVxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiaGlkZVNob3coJ1ZBJywgJGV2ZW50LnRhcmdldC5jaGVja2VkKTtcIj4gVkFcclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNsaWNrKT1cImhpZGVTaG93KCdTVlAnLCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1wiPiBTVlBEXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZHNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDc1cHg7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgZ3JwIG9mIHNvcnRlZEdycDtsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRzXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPnt7Z3JwfX0gPC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIiBzdHlsZT1cIm92ZXJmbG93LXk6IGhpZGRlbjtcclxuICAgICAgICAgICAgICBoZWlnaHQ6IGF1dG87XCI+XHJcbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCBhbmFseXNpc1RhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBocmQgb2YgaGVhZDtcIiBjbGFzcz1cInRleHQtY2VudGVyXCIgW2F0dHIuY29sc3Bhbl09XCJzdHQ/Lmxlbmd0aFwiPnt7aHJkfX0gPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtcGllLWNoYXJ0XCIgKGNsaWNrKT1cImNyZWF0ZWdycFBpZShzdHQsZ3JwLGhyZCxzaWRlLCdoZWFkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFyLWNoYXJ0XCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNyZWF0ZWdycEJhcihzdHQsZ3JwLGhyZCxzaWRlLCdoZWFkJylcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtY2VudGVyXCIgY29sc3Bhbj1cIjJcIiBbYXR0ci5jb2xzcGFuXT1cInN0dD8ubGVuZ3RoXCI+VG90YWw8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhyZCBvZiBoZWFkO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgc3Qgb2Ygc3R0O1wiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57e3N0fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImlubmVyVGJsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ3dFwiIGlkPVwie3tpfX1cIiBjbGFzcz1cInRleHQtY2VudGVyXCI+V3Q8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImF2Z1wiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5Bdmc8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwicmFwXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPkRpc2M8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInZhbFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5WYWx1ZTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJtc2RcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+TVNEPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJtc2R2bHVcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+TVNEIFZsdTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJhZ2VcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+QUdFPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5WQTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJzdnBkXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlNWUEQ8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyXCI+Jm5ic3A7PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0IG9mIHN0dDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7c3R9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiaW5uZXJUYmxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInd0XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPld0PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJhdmdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+QXZnPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInJhcFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5EaXNjPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YWxcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+VmFsdWU8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPk1TRDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkdmx1XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPk1TRCBWbHU8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiYWdlXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPkFHRTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwidmFcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+VkE8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwic3ZwZFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5TVlBEPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPiZuYnNwOzwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHNpZCBvZiBzaWRlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7c2lkfX0gPGkgY2xhc3M9XCJmYSBmYS1waWUtY2hhcnRcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlZ3JwUGllKHN0dCxncnAsc2lkLGhlYWQsJ3NpZGUnKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4gJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1iYXItY2hhcnRcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlZ3JwQmFyKHN0dCxncnAsc2lkLGhlYWQsJ3NpZGUnKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaHJkIG9mIGhlYWQ7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBzdCBvZiBzdHQ7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZCc6aXNBcHBsaWVkPT10cnVlP2dibEdyZERhdGFDb2xvci5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZCsnIycrc3QpLmdldChrZXkpIDogbWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2dycGNvbG9yJyl9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4+e3tnYmxHcnBBcnJbZ3JwKycjJytzaWQrJyMnK2hyZCsnIycrc3RdIHxqc29ufX08L3NwYW4+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcFwiIGRhdGEtdG9nZ2xlPVwidG9vbHRpcFwiIGRhdGEtcGxhY2VtZW50PVwicmlnaHRcIiB0aXRsZT1cIkNsaWNrIGhlcmUgdG8gZ2V0IGRhdGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXBsYWNlbWVudD1cInJpZ2h0XCI+PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIHRhcmdldD1cIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldERhdGEoJ2NlbGwnLCBncnArJyMnK3NpZCsnIycraHJkLHN0KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbms9XCIve3ttb2R1bGVuYW1lfX0vcGt0LWxpc3Qve3tmb3JtbmFtZX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ttYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkKycjJytzdCk/LmdldCgnY291bnQnKX19PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiaW5uZXJUYmxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInd0XCIgaWQ9XCJ7e2l9fVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyhtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd3dCcpPT0nJyB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd3dCcpPT0gbnVsbCApPyctJzpjcy5zcGxpdFRvVHdvRGVjaW1hbChtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd3dCcpKX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJhdmdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+e3sobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnYXZnJyk9PScnIHx8IG1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ2F2ZycpPT0gbnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKG1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ2F2ZycpKX19PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8dGQgKm5nSWY9XCJhdmdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+e3sobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdhdmcnKT09XCJcIiB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ2F2ZycpPT1udWxsICApPyctJzpjcy5zcGxpdFRvVHdvRGVjaW1hbChtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ2F2ZycpKX19PC90ZD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJyYXBcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+e3sobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnZGlzYycpPT0nJyB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdkaXNjJyk9PSBudWxsKT8nLSc6Y3Muc3BsaXRUb1R3b0RlY2ltYWwobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnZGlzYycpKX19PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwidmFsXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7KG1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ3ZhbHVlJyk9PScnIHx8IG1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ3ZhbHVlJyk9PW51bGwpPyctJzpjcy5yb3VuZHZhbChtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd2YWx1ZScpKX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJtc2RcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+e3sobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnbXNkJyk9PSAnJyB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdtc2QnKT09bnVsbCk/Jy0nOm1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ21zZCcpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDp7e21hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmQrJyMnK3N0KT8uZ2V0KCdtc2QnKSB8IGpzb259fSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIm1zZHZsdVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyhtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKT09JycgfHwgbWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnbXNkdmx1Jyk9PW51bGwpPyctJzptYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKX19PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57e2NzLnJvdW5kdmFsKG1hdHJpeD8uZ2V0KGdycCsnIycrc2lkKycjJytocmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ2FnZScpKX19PC90ZD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyhtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdhZ2UnKT09XCJcIiB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCdhZ2UnKT09IG51bGwgKT8nLSc6Y3Mucm91bmR2YWwobWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnYWdlJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gOnt7bWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2FnZScpIHwganNvbn19IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyhtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpPT0gJycgfHwgbWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgndmFsdWVhZ2UnKT09bnVsbCk/ICctJzpjcy5yb3VuZHZhbChtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpKX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwic3ZwZFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyhtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnc3ZwZCcpPT0nJyB8fCBtYXRyaXg/LmdldChncnArJyMnK3NpZCsnIycraHJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKycjJytzdCk/LmdldCgnc3ZwZCcpPT1udWxsKT8nLSc6bWF0cml4Py5nZXQoZ3JwKycjJytzaWQrJyMnK2hyZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsnIycrc3QpPy5nZXQoJ3N2cGQnKX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdCBvZiBzdHQ7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kJzogcm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2dycGNvbG9yJyl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgdGFyZ2V0PVwiX2JsYW5rXCIgKGNsaWNrKT1cImdldERhdGEoJ3JvdycsIGdycCsnIycrc2lkLHN0KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJMaW5rPVwiL3t7bW9kdWxlbmFtZX19L3BrdC1saXN0L3t7Zm9ybW5hbWV9fVwiPnt7cm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2NvdW50Jyl9fTwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImlubmVyVGJsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ3dFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCd3dCcpPT0nJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ3d0Jyk9PW51bGwpPyctJzpjcy5zcGxpdFRvVHdvRGVjaW1hbChyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnd3QnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHRkICpuZ0lmPVwiYXZnXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7cm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2F2ZycpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJhdmdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnYXZnJyk9PVwiXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCdhdmcnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCdhdmcnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwicmFwXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3socm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2Rpc2MnKT09JycgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCdkaXNjJyk9PW51bGwpPyctJzpjcy5zcGxpdFRvVHdvRGVjaW1hbChyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnZGlzYycpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YWxcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgndmFsdWUnKT09JycgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCd2YWx1ZScpPT1udWxsKT8nLSc6Y3Mucm91bmR2YWwocm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ3ZhbHVlJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIm1zZFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCdtc2QnKT09Jyd8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ21zZCcpPT1udWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApPyctJzpyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnbXNkJyl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkdmx1XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3socm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ21zZHZsdScpPT0nJ3x8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnbXNkdmx1Jyk9PW51bGwpPyctJzpyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnbXNkdmx1Jyl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y3Mucm91bmR2YWwocm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2FnZScpKX19PC90ZD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCdhZ2UnKT09XCJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2FnZScpPT1udWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApPyctJzpjcy5yb3VuZHZhbChyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnYWdlJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gOnt7cm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ2FnZScpIHwganNvbn19IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInZhXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3socm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ3ZhbHVlYWdlJyk9PScnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgndmFsdWVhZ2UnKT09bnVsbCk/Jy0nOmNzLnJvdW5kdmFsKHJvd1RvdGFsPy5nZXQoZ3JwKycjJytzaWQrJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInN2cGRcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhyb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnc3ZwZCcpPT0nJ3x8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dUb3RhbD8uZ2V0KGdycCsnIycrc2lkKycjJytzdCk/LmdldCgnc3ZwZCcpPT1udWxsKT8nLSc6cm93VG90YWw/LmdldChncnArJyMnK3NpZCsnIycrc3QpPy5nZXQoJ3N2cGQnKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlRvdGFsPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaHJkIG9mIGhlYWQ7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBzdCBvZiBzdHQ7XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQnOiBjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnZ3JwY29sb3InKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiB0YXJnZXQ9XCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJMaW5rPVwiL3t7bW9kdWxlbmFtZX19L3BrdC1saXN0L3t7Zm9ybW5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXREYXRhKCdjb2wnLCBncnArJyMnK2hyZCxzdCk7XCI+e3tjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnY291bnQnKX19PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiaW5uZXJUYmxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInd0XCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3soY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ3d0Jyk9PScnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnd3QnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCd3dCcpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ZCAqbmdJZj1cImF2Z1wiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57e2NvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdhdmcnKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImF2Z1wiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdhdmcnKT09XCJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2F2ZycpPT1udWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApPyctJzpjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnYXZnJyl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwicmFwXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3soY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2Rpc2MnKSA9PSAnJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2Rpc2MnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdkaXNjJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInZhbFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCd2YWx1ZScpPT0nJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHxjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgndmFsdWUnKT09bnVsbCApID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctJzpjcy5yb3VuZHZhbChjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgndmFsdWUnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3soY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ21zZCcpPT0nJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ21zZCcpPT1udWxsKT8nLSc6Y3Muc3BsaXRUb1R3b0RlY2ltYWwoY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ21zZCcpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJtc2R2bHVcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnbXNkdmx1Jyk9PScnfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y3Mucm91bmR2YWwoY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2FnZScpKX19PC90ZD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdhZ2UnKT09Jyd8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2FnZScpPT1udWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApPyctJzpjcy5yb3VuZHZhbChjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgnYWdlJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gOnt7Y29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ2FnZScpIHwganNvbn19IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpPT0nJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ3ZhbHVlYWdlJyk9PW51bGwpPyctJzpjcy5yb3VuZHZhbChjb2xUb3RhbD8uZ2V0KGdycCsnIycraHJkKycjJytzdCk/LmdldCgndmFsdWVhZ2UnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJzdnBkXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3soY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ3N2cGQnKT09Jyd8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sVG90YWw/LmdldChncnArJyMnK2hyZCsnIycrc3QpPy5nZXQoJ3N2cGQnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGNvbFRvdGFsPy5nZXQoZ3JwKycjJytocmQrJyMnK3N0KT8uZ2V0KCdzdnBkJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3Qgb2Ygc3R0O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZCc6IGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdncnBjb2xvcicpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIHRhcmdldD1cIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckxpbms9XCIve3ttb2R1bGVuYW1lfX0vcGt0LWxpc3Qve3tmb3JtbmFtZX19XCIgKGNsaWNrKT1cImdldEFsbChzdHQsaGVhZCxzaWRlLGdycClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAoY2xpY2spPVwiZ2V0RGF0YSgnYWxsJywgJycpO1wiIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2dyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdjb3VudCcpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImlubmVyVGJsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ3dFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCd3dCcpPT0nJ3x8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnd3QnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCd3dCcpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJhdmdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnYXZnJyk9PScnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnYXZnJyk9PW51bGwpPyctJzpjcy5yb3VuZHZhbChncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnYXZnJykpfX1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJyYXBcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnZGlzYycpPT0nJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ2Rpc2MnKT09bnVsbCk/Jy0nOmNzLnJvdW5kdmFsKGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdkaXNjJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInZhbFwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCd2YWx1ZScpPT0nJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ3ZhbHVlJyk9PW51bGwpPyctJzpjcy5yb3VuZHZhbChncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgndmFsdWUnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkICYmIHN0PT0nc29sZCdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnbXNkJyk9PScnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnbXNkJyk9PW51bGwpPyctJzpjcy5zcGxpdFRvVHdvRGVjaW1hbChncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnbXNkJykpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gOnt7Z3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ21zZCcpIHwganNvbn19IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibXNkdmx1ICYmIHN0PT0nc29sZCdcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnbXNkdmx1Jyk9PScnfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKT09bnVsbCk/Jy0nOmNzLnNwbGl0VG9Ud29EZWNpbWFsKGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdtc2R2bHUnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y3Mucm91bmR2YWwoZ3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ2FnZScpKX19PC90ZD4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImFnZVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdhZ2UnKT09JycgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdhZ2UnKT09bnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKT8nLSc6Y3Mucm91bmR2YWwoZ3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ2FnZScpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDp7e2dyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCdhZ2UnKSB8anNvbn19IC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJ2YVwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7KGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpPT0nJ3x8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgndmFsdWVhZ2UnKT09bnVsbCk/Jy0nOmNzLnJvdW5kdmFsKGdyYW5kVG90YWw/LmdldCgnR1QjJytncnArJyMnK3N0KT8uZ2V0KCd2YWx1ZWFnZScpKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cInN2cGRcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnc3ZwZCcpPT0nJ3x8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZFRvdGFsPy5nZXQoJ0dUIycrZ3JwKycjJytzdCk/LmdldCgnc3ZwZCcpPT1udWxsKT8nLSc6Y3Muc3BsaXRUb1R3b0RlY2ltYWwoZ3JhbmRUb3RhbD8uZ2V0KCdHVCMnK2dycCsnIycrc3QpPy5nZXQoJ3N2cGQnKSl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlXCIgaWQ9XCJQaWVjaGFydE1vZGVsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJleGFtcGxlTW9kYWxMYWJlbFwiXHJcbiAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiIHJvbGU9XCJkb2N1bWVudFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxyXG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJtYWlsTW9kYWxIZWFkXCI+UGllIENoYXJ0PC9oND5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3Qgb2Ygc3R0O1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNzaG93Y2hhcnRcIiBjbGFzcz1cImNvbC1zbS02XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiB3aXRoPVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDE2cHg7Zm9udC13ZWlnaHQ6IGJvbGQ7XCI+IHt7c3R9fSBDaGFydDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IHdpdGg9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICA8Y2FudmFzIGJhc2VDaGFydCBbZGF0YV09XCJDaGF0TWFwRHRsW3N0KydfZGF0YSddXCIgW2xhYmVsc109XCJDaGF0TWFwRHRsW3N0KydfbGFibGUnXVwiXHJcbiAgICAgICAgICAgICAgICAgIFtsZWdlbmRdPVwiQ2hhdE1hcER0bFtzdCsnX2xlZ2VuZCddXCIgW2NoYXJ0VHlwZV09XCJDaGFydFR5cGVcIiBbb3B0aW9uc109XCJjaGFydE9wdGlvbnNcIj48L2NhbnZhcz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWwgZmFkZVwiIGlkPVwiYmFyY2hhcnRNb2RlbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwiZXhhbXBsZU1vZGFsTGFiZWxcIlxyXG4gIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIiByb2xlPVwiZG9jdW1lbnRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cclxuICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwibWFpbE1vZGFsSGVhZFwiPkJhciBDaGFydDwvaDQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHJcblxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzYmFyc2hvd2NoYXJ0XCIgY2xhc3M9XCJjb2wtc20tMTJcIj5cclxuICAgICAgICAgICAgPGRpdiB3aXRoPVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxNnB4O2ZvbnQtd2VpZ2h0OiBib2xkO1wiPiB7e3N0fX0gQ2hhcnQ8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IHdpdGg9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgPGNhbnZhcyBiYXNlQ2hhcnQgW2RhdGFzZXRzXT1cImJhckNoYXJ0RGF0YVwiIFtsYWJlbHNdPVwiYmFyQ2hhcnRMYWJlbHNcIiBbb3B0aW9uc109XCJiYXJDaGFydE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgW2xlZ2VuZF09XCJiYXJDaGFydExlZ2VuZFwiIFtjb2xvcnNdPVwiYmFyY2hhcnRDb2xvcnNcIiBbY2hhcnRUeXBlXT1cImJhckNoYXJ0VHlwZVwiPlxyXG4gICAgICAgICAgICAgIDwvY2FudmFzPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGJ1dHRvbiBpZD1cIlBpZWNoYXJ0TW9kZWxCdG5cIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjUGllY2hhcnRNb2RlbFwiPjwvYnV0dG9uPlxyXG48YnV0dG9uIGlkPVwiYmFyY2hhcnRNb2RlbEJ0blwiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLXRhcmdldD1cIiNiYXJjaGFydE1vZGVsXCI+PC9idXR0b24+Il19
|