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