@rangertechnologies/ngnxt 2.1.74 → 2.1.76
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/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +18 -16
- package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +103 -95
- package/esm2022/lib/components/custom-image/custom-image.component.mjs +5 -4
- package/esm2022/lib/components/custom-input/custom-input.component.mjs +6 -5
- package/esm2022/lib/components/custom-label/custom-label.component.mjs +3 -11
- package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +5 -4
- package/esm2022/lib/components/custom-table/custom-table.component.mjs +3 -2
- package/esm2022/lib/components/custom-text-area/custom-text-area.component.mjs +6 -5
- package/esm2022/lib/components/file-upload/file-upload.component.mjs +6 -5
- package/esm2022/lib/components/pick-location/pick-location.component.mjs +5 -3
- package/esm2022/lib/components/search-box/search-box.component.mjs +3 -2
- package/esm2022/lib/components/table-appendix/table-appendix.component.mjs +5 -4
- package/esm2022/lib/pages/booklet/booklet.component.mjs +80 -127
- package/esm2022/lib/pages/questionbook/questionbook.component.mjs +83 -96
- package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +321 -257
- package/esm2022/lib/pages/summary-page/summary-page.component.mjs +11 -10
- package/esm2022/lib/sample.mjs +3157 -328
- package/esm2022/lib/services/storage.service.mjs +7 -5
- package/esm2022/lib/wrapper.mjs +96 -93
- package/fesm2022/rangertechnologies-ngnxt.mjs +3900 -1075
- package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
- package/lib/components/custom-label/custom-label.component.d.ts +1 -3
- package/lib/pages/booklet/booklet.component.d.ts +2 -8
- package/lib/pages/questionbook/questionbook.component.d.ts +1 -2
- package/lib/wrapper.d.ts +93 -91
- package/package.json +1 -1
- package/rangertechnologies-ngnxt-2.1.76.tgz +0 -0
- package/esm2022/lib/services/code-execution.service.mjs +0 -30
- package/lib/services/code-execution.service.d.ts +0 -9
- package/rangertechnologies-ngnxt-2.1.74.tgz +0 -0
|
@@ -6,11 +6,10 @@ import * as i3 from "../../services/storage.service";
|
|
|
6
6
|
import * as i4 from "@angular/router";
|
|
7
7
|
import * as i5 from "@angular/platform-browser";
|
|
8
8
|
import * as i6 from "../../services/change.service";
|
|
9
|
-
import * as i7 from "../../
|
|
10
|
-
import * as i8 from "
|
|
11
|
-
import * as i9 from "
|
|
12
|
-
import * as i10 from "
|
|
13
|
-
import * as i11 from "../questionbook/questionbook.component";
|
|
9
|
+
import * as i7 from "../../i18n.service";
|
|
10
|
+
import * as i8 from "@angular/common";
|
|
11
|
+
import * as i9 from "ngx-spinner";
|
|
12
|
+
import * as i10 from "../questionbook/questionbook.component";
|
|
14
13
|
export class BookletComponent {
|
|
15
14
|
sfService;
|
|
16
15
|
dataService;
|
|
@@ -18,7 +17,6 @@ export class BookletComponent {
|
|
|
18
17
|
route;
|
|
19
18
|
sanitizer;
|
|
20
19
|
changeService;
|
|
21
|
-
codeExecutionService;
|
|
22
20
|
i18nService;
|
|
23
21
|
bookletId;
|
|
24
22
|
serv;
|
|
@@ -45,25 +43,21 @@ export class BookletComponent {
|
|
|
45
43
|
isAnswerFlag = false;
|
|
46
44
|
spinnerName;
|
|
47
45
|
spinnerType;
|
|
48
|
-
validationMap = new Map(); // VD 17-DEC-2024 - Valdiation changes
|
|
49
46
|
// HA 19DEC23 langDirection variable is created to assign the direction as class
|
|
50
47
|
langDirection = 'ltr'; // HA 28DEC23 making ltr as default direction
|
|
51
48
|
answerList = []; // HA 11-JAN-24 Answerlist to store the minimal value
|
|
52
49
|
dataBind; // HA 18-JAN-24 To insert the endpoint value to the question
|
|
53
|
-
errorBind; // VD 17-DEC-2024 - Valdiation changes
|
|
54
50
|
allEvents = []; // VD 06Sep24 calendar changes
|
|
55
|
-
constructor(sfService, dataService, storageService, route, sanitizer, changeService,
|
|
51
|
+
constructor(sfService, dataService, storageService, route, sanitizer, changeService, el, i18nService) {
|
|
56
52
|
this.sfService = sfService;
|
|
57
53
|
this.dataService = dataService;
|
|
58
54
|
this.storageService = storageService;
|
|
59
55
|
this.route = route;
|
|
60
56
|
this.sanitizer = sanitizer;
|
|
61
57
|
this.changeService = changeService;
|
|
62
|
-
this.codeExecutionService = codeExecutionService;
|
|
63
58
|
this.i18nService = i18nService;
|
|
64
59
|
this.spinnerName = "sp1";
|
|
65
60
|
this.spinnerType = "ball-spin-clockwise";
|
|
66
|
-
console.log('dropdownDependentData', this.dropdownDependentData);
|
|
67
61
|
}
|
|
68
62
|
ngOnInit() {
|
|
69
63
|
// VD 12Jan24 fieldRestrictions formate
|
|
@@ -75,11 +69,6 @@ export class BookletComponent {
|
|
|
75
69
|
// "bk2-q2" : "hide"
|
|
76
70
|
// }
|
|
77
71
|
// }
|
|
78
|
-
//VD 18-JAN-24 Dummy Static data for testing
|
|
79
|
-
// this.errorBind = {
|
|
80
|
-
// "warning" : "Converting to sanwitch Holday*",
|
|
81
|
-
// "startDate" : ""
|
|
82
|
-
// };
|
|
83
72
|
// HA 18-JAN-24 Dummy Static data for testing
|
|
84
73
|
// this.dataBind = {
|
|
85
74
|
// "_id": "659ed002ed51bb8061544255",
|
|
@@ -109,13 +98,10 @@ export class BookletComponent {
|
|
|
109
98
|
// VD NOV23 - update the json data when bookletId and bookletJSON changes
|
|
110
99
|
ngOnChanges(simplechanges) {
|
|
111
100
|
// HA 23JAN24 To avoid undefined error
|
|
112
|
-
|
|
113
|
-
if (simplechanges['bookletId'] || (simplechanges['bookletJSON'] && (simplechanges['bookletJSON'].currentValue != null || simplechanges['bookletJSON'].currentValue != undefined)) || (simplechanges['dataBind'] && (simplechanges['dataBind'].currentValue != null || simplechanges['dataBind'].currentValue != undefined)) || (simplechanges['errorBind'] && (simplechanges['errorBind'].currentValue != null || simplechanges['errorBind'].currentValue != undefined))) {
|
|
101
|
+
if (simplechanges['bookletId'] || (simplechanges['bookletJSON'] && (simplechanges['bookletJSON'].currentValue != null || simplechanges['bookletJSON'].currentValue != undefined)) || (simplechanges['dataBind'] && (simplechanges['dataBind'].currentValue != null || simplechanges['dataBind'].currentValue != undefined))) {
|
|
114
102
|
this.allEvents = [];
|
|
115
103
|
this.processBooklet();
|
|
116
104
|
}
|
|
117
|
-
// console.log('inside Questionnaire ngOnChanges');
|
|
118
|
-
// console.log(this.booklet);
|
|
119
105
|
// if(this.booklet == undefined || this.booklet.length == 0) {
|
|
120
106
|
// this.processBooklet();
|
|
121
107
|
// }
|
|
@@ -152,25 +138,28 @@ export class BookletComponent {
|
|
|
152
138
|
else {
|
|
153
139
|
var value = '';
|
|
154
140
|
// HA 09FEB24 Added ternary
|
|
155
|
-
|
|
141
|
+
// RS 09DEC24 Changed keys
|
|
142
|
+
value = this.bookletJSON.records[0]?.id;
|
|
156
143
|
this.bookQuestionsMap.set(value, this.bookletJSON.questionbook);
|
|
157
144
|
}
|
|
158
145
|
// VD 20Jun24 - translation changes
|
|
159
146
|
for (var value in this.bookletJSON?.translationMap) {
|
|
160
147
|
this.translateMap.set(value, this.bookletJSON.translationMap[value]);
|
|
161
148
|
}
|
|
162
|
-
|
|
163
|
-
|
|
149
|
+
// VD 31NOV24 wrapper changes
|
|
150
|
+
if (this.bookletJSON.questionbook?.action != undefined) {
|
|
151
|
+
this.actions = JSON.parse(this.bookletJSON.questionbook.action);
|
|
164
152
|
}
|
|
165
153
|
}
|
|
166
154
|
// HA 19DEC23 langDirection variable value assigning
|
|
167
|
-
//
|
|
168
|
-
if (this.bookletJSON?.questionbook?.
|
|
169
|
-
var style = JSON.parse(JSON.parse(JSON.stringify(this.bookletJSON?.questionbook?.
|
|
155
|
+
// RS 09DEC24 Changed keys
|
|
156
|
+
if (this.bookletJSON?.questionbook?.style) {
|
|
157
|
+
var style = JSON.parse(JSON.parse(JSON.stringify(this.bookletJSON?.questionbook?.style)));
|
|
170
158
|
this.langDirection = style?.direction;
|
|
171
159
|
}
|
|
172
|
-
else if (this.bookletJSON?.records[0]?.
|
|
173
|
-
|
|
160
|
+
else if (this.bookletJSON?.records[0]?.style) {
|
|
161
|
+
// else if(this.bookletJSON?.records[0]?.style){
|
|
162
|
+
var style = JSON.parse(JSON.stringify(this.bookletJSON?.records[0]?.style));
|
|
174
163
|
this.langDirection = style?.direction;
|
|
175
164
|
}
|
|
176
165
|
// HA 18-JAN-24 The condition is used for Bind-In Logic
|
|
@@ -182,15 +171,22 @@ export class BookletComponent {
|
|
|
182
171
|
this.dataService.getAPIData(this.tkn, ["Booklet", "read", uuid, this.languageCode], this.successReadBooklet, this.failureReadBooklet);
|
|
183
172
|
}
|
|
184
173
|
else {
|
|
174
|
+
// VD 31NOV24 param changes with new method
|
|
185
175
|
let paramMap = { createAnswerBookFlag: false };
|
|
186
176
|
paramMap['c__qb_id'] = '';
|
|
187
177
|
paramMap["c__record_id"] = '';
|
|
188
|
-
|
|
178
|
+
let para = {
|
|
179
|
+
dataType: "Booklet",
|
|
180
|
+
operation: "read",
|
|
181
|
+
param1: uuid,
|
|
182
|
+
paramJSON: JSON.stringify(paramMap),
|
|
183
|
+
languageCode: this.languageCode
|
|
184
|
+
};
|
|
185
|
+
this.sfService.remoteAction("NxtController.processData", [JSON.stringify(para)], this.successReadBooklet, this.failureReadBooklet);
|
|
189
186
|
}
|
|
190
187
|
};
|
|
191
188
|
successReadBooklet = (response) => {
|
|
192
189
|
console.log('Inside the successReadBooklet');
|
|
193
|
-
// console.log(response);
|
|
194
190
|
if (response != null || response != undefined) {
|
|
195
191
|
// Storing the API response for future use
|
|
196
192
|
this.storageService.save(response);
|
|
@@ -210,17 +206,18 @@ export class BookletComponent {
|
|
|
210
206
|
for (var value in response.translationMap) {
|
|
211
207
|
this.translateMap.set(value, response.translationMap[value]);
|
|
212
208
|
}
|
|
213
|
-
|
|
214
|
-
|
|
209
|
+
// VD 31NOV24 wrapper changes
|
|
210
|
+
if (response.questionbook?.action != undefined) {
|
|
211
|
+
this.actions = JSON.parse(response.questionbook.action);
|
|
215
212
|
}
|
|
216
213
|
}
|
|
217
214
|
// HA 19DEC23 langDirection variable value assigning
|
|
218
|
-
if (response?.questionbook?.
|
|
219
|
-
var style = JSON.parse(JSON.parse(JSON.stringify(response?.questionbook?.
|
|
215
|
+
if (response?.questionbook?.style) {
|
|
216
|
+
var style = JSON.parse(JSON.parse(JSON.stringify(response?.questionbook?.style)));
|
|
220
217
|
this.langDirection = style?.direction;
|
|
221
218
|
}
|
|
222
|
-
else if (response?.records[0]?.
|
|
223
|
-
var style = JSON.parse(JSON.parse(JSON.stringify(response?.records[0]?.
|
|
219
|
+
else if (response?.records[0]?.style) {
|
|
220
|
+
var style = JSON.parse(JSON.parse(JSON.stringify(response?.records[0]?.style)));
|
|
224
221
|
this.langDirection = style?.direction;
|
|
225
222
|
}
|
|
226
223
|
};
|
|
@@ -228,9 +225,9 @@ export class BookletComponent {
|
|
|
228
225
|
};
|
|
229
226
|
handleBookletActionClick(action) {
|
|
230
227
|
// HA 19JAN24 Action changes
|
|
228
|
+
// RS 09DEC24 Changed keys
|
|
231
229
|
this.answerList = [];
|
|
232
230
|
this.dataBind = []; // HA 12FEB24 Clearing dataBind upon button action so that dataBind value will not override the changed value
|
|
233
|
-
console.log(action);
|
|
234
231
|
let dataToParent = {};
|
|
235
232
|
let validForm = true; // VD 01Aug24 - validation change
|
|
236
233
|
// HA 22JAN24 this change to make close event work
|
|
@@ -248,19 +245,19 @@ export class BookletComponent {
|
|
|
248
245
|
// when clicking the submit button validating the required fields
|
|
249
246
|
for (let key in dataToParent['jsonBook'].bookQuestionsMap) {
|
|
250
247
|
const currentBook = dataToParent['jsonBook'].bookQuestionsMap[key];
|
|
251
|
-
currentBook.
|
|
248
|
+
currentBook.subQuestions.forEach(element => {
|
|
252
249
|
// VD 01Aug24 - validation change
|
|
253
|
-
if (element.
|
|
250
|
+
if (element.isOptional && dataToParent['action'] == 'submit' && (!element.input || (Array.isArray(element.input) && element.input.length === 0)) && !element.isHidden && element.type != 'Label' && element.type != 'Image') { //SKS5NOV25
|
|
254
251
|
element.error = true;
|
|
255
252
|
validForm = false;
|
|
256
|
-
this.changeService.submitChange(element.
|
|
253
|
+
this.changeService.submitChange(element.id);
|
|
257
254
|
}
|
|
258
255
|
// VD 02Aug24 - clear action changes
|
|
259
256
|
if (dataToParent['action'] == 'clear') {
|
|
260
|
-
if (element.
|
|
257
|
+
if (element.type == 'Dropdown' || element.type == 'Location' || element.type == 'Radio') {
|
|
261
258
|
element.selectedValue = undefined;
|
|
262
259
|
}
|
|
263
|
-
else if (element.
|
|
260
|
+
else if (element.type == 'File') {
|
|
264
261
|
element.input = [];
|
|
265
262
|
}
|
|
266
263
|
else {
|
|
@@ -287,38 +284,33 @@ export class BookletComponent {
|
|
|
287
284
|
// HA 18-JAN-24 handleCompleteBooklet is to simplify the logic
|
|
288
285
|
handleCompleteBooklet(completeBooklet) {
|
|
289
286
|
if (Object.keys(completeBooklet?.bookQuestionsMap ?? {}).length === 0) { // HA 11-JAN-24 If condition to load booklet
|
|
290
|
-
this.handleBook(completeBooklet?.questionbook?.
|
|
287
|
+
this.handleBook(completeBooklet?.questionbook?.subQuestions);
|
|
291
288
|
}
|
|
292
289
|
else { // HA 11-JAN-24 To load book questions
|
|
293
290
|
for (const key in completeBooklet.bookQuestionsMap) {
|
|
294
291
|
const val = completeBooklet.bookQuestionsMap[key];
|
|
295
|
-
if (val.
|
|
296
|
-
this.handleBook(val.
|
|
292
|
+
if (val.type === 'Book') {
|
|
293
|
+
this.handleBook(val.subQuestions);
|
|
297
294
|
}
|
|
298
295
|
else {
|
|
299
296
|
this.handleQues(val);
|
|
300
|
-
// VD 17-DEC-2024 - Valdiation changes
|
|
301
|
-
this.handleQuesValidation(val);
|
|
302
297
|
}
|
|
303
298
|
}
|
|
304
299
|
}
|
|
305
300
|
}
|
|
306
301
|
// HA 11-JAN-24 handleBook loads the Book
|
|
302
|
+
// RS 09DEC24 Changed keys
|
|
307
303
|
handleBook(quesList) {
|
|
308
|
-
quesList?.
|
|
309
|
-
if (element.
|
|
304
|
+
quesList?.forEach(element => {
|
|
305
|
+
if (element.type === 'Book') {
|
|
310
306
|
// HA 24JAN24 Fetching from QB reference
|
|
311
|
-
var book = JSON.parse(element.
|
|
312
|
-
book.questionbook.
|
|
307
|
+
var book = JSON.parse(element.qbReferenceQuestions);
|
|
308
|
+
book.questionbook.subQuestions.forEach(ques => {
|
|
313
309
|
this.handleQues(ques);
|
|
314
|
-
// VD 17-DEC-2024 - Valdiation changes
|
|
315
|
-
this.handleQuesValidation(ques);
|
|
316
310
|
});
|
|
317
311
|
}
|
|
318
312
|
else {
|
|
319
313
|
this.handleQues(element);
|
|
320
|
-
// VD 17-DEC-2024 - Valdiation changes
|
|
321
|
-
this.handleQuesValidation(element);
|
|
322
314
|
}
|
|
323
315
|
});
|
|
324
316
|
// VD 13Sep24 - databind changes
|
|
@@ -335,28 +327,27 @@ export class BookletComponent {
|
|
|
335
327
|
if (this.dataBind && Object.keys(this.dataBind).length > 0) {
|
|
336
328
|
for (let [key, val] of Object.entries(this.dataBind)) {
|
|
337
329
|
let value = val;
|
|
338
|
-
if (ques.
|
|
339
|
-
if (ques.
|
|
330
|
+
if (ques.referenceField === key) {
|
|
331
|
+
if (ques.type === 'Dropdown' || ques.type === 'Radio') {
|
|
340
332
|
this.sqOptions.forEach(element => {
|
|
341
|
-
if (element['
|
|
333
|
+
if (element['referenceField'] === key) {
|
|
342
334
|
element['input'] = ques.input = value;
|
|
343
335
|
element['selectedValue'] = ques.selectedValue = value;
|
|
344
336
|
}
|
|
345
337
|
});
|
|
346
338
|
}
|
|
347
339
|
// HA 24JAN24 To bind-in Date and DateTime
|
|
348
|
-
else if (ques.
|
|
340
|
+
else if (ques.type === 'Date' || ques.type == 'DateTime') {
|
|
349
341
|
ques.input = new Date(value?.toString());
|
|
350
342
|
}
|
|
351
343
|
// HA 12FEB24 To bind-in Location Type
|
|
352
|
-
else if (ques.
|
|
353
|
-
console.log('value ', value);
|
|
344
|
+
else if (ques.type === 'Location') {
|
|
354
345
|
ques.input = value;
|
|
355
346
|
ques.selectedValue = value['address'] ? value['address'] : value;
|
|
356
347
|
}
|
|
357
348
|
// VD 06Sep24 calendar changes for data bindIn
|
|
358
|
-
else if (ques.
|
|
359
|
-
let entries = JSON.parse(ques['
|
|
349
|
+
else if (ques.type === 'Calendar') {
|
|
350
|
+
let entries = JSON.parse(ques['fieldsMeta']);
|
|
360
351
|
if (entries) {
|
|
361
352
|
let referenceQuestions = [];
|
|
362
353
|
if (entries.length > 0) {
|
|
@@ -373,11 +364,11 @@ export class BookletComponent {
|
|
|
373
364
|
calendarArray.entries.forEach(inputEntry => {
|
|
374
365
|
for (let [k, v] of Object.entries(inputEntry)) {
|
|
375
366
|
referenceQuestions.forEach(field => {
|
|
376
|
-
if (field.
|
|
377
|
-
if (field.
|
|
367
|
+
if (field.referenceField == k) {
|
|
368
|
+
if (field.type === 'Date' || field.type == 'DateTime' || field.type == 'Time') {
|
|
378
369
|
field.input = new Date(v?.toString());
|
|
379
370
|
}
|
|
380
|
-
if (field.
|
|
371
|
+
if (field.type === 'Dropdown' || field.type === 'Radio') {
|
|
381
372
|
field.selectedValue = v;
|
|
382
373
|
field.input = v;
|
|
383
374
|
}
|
|
@@ -396,7 +387,7 @@ export class BookletComponent {
|
|
|
396
387
|
ques.input = this.allEvents.length > 0 ? this.allEvents : '';
|
|
397
388
|
}
|
|
398
389
|
// VD 23 Oct24 - file type changes
|
|
399
|
-
else if (ques.
|
|
390
|
+
else if (ques.type === 'File') {
|
|
400
391
|
ques.input = [];
|
|
401
392
|
ques.input = value;
|
|
402
393
|
}
|
|
@@ -405,50 +396,35 @@ export class BookletComponent {
|
|
|
405
396
|
}
|
|
406
397
|
this.answerList.push(ques); // HA 12FEB24 To give the value for data
|
|
407
398
|
}
|
|
399
|
+
else {
|
|
400
|
+
console.log("reference field not found");
|
|
401
|
+
}
|
|
408
402
|
}
|
|
409
403
|
}
|
|
410
404
|
else {
|
|
411
405
|
const question = {};
|
|
412
|
-
question['id'] = ques.
|
|
406
|
+
question['id'] = ques.id;
|
|
413
407
|
// question['Question__c'] = ques.Question__c;
|
|
414
408
|
question['input'] = ques.input;
|
|
415
409
|
// HA 12FEB24 To bind-out Location Type
|
|
416
|
-
if (ques.
|
|
410
|
+
if (ques.type === 'Location') {
|
|
417
411
|
question['input'] = ques.input ? ques.input : ques.selectedValue;
|
|
418
412
|
}
|
|
419
|
-
else if (ques.
|
|
413
|
+
else if (ques.type == 'File') {
|
|
420
414
|
// VD 23 Oct24 - file type changes
|
|
421
415
|
question['input'] = ques.input ? ques.input : [];
|
|
422
416
|
}
|
|
423
|
-
question['
|
|
424
|
-
question['
|
|
425
|
-
question['
|
|
417
|
+
question['type'] = ques.type;
|
|
418
|
+
question['questionNumber'] = ques.questionNumber;
|
|
419
|
+
question['referenceField'] = ques?.referenceField;
|
|
426
420
|
this.answerList.push(question);
|
|
427
421
|
}
|
|
428
422
|
}
|
|
429
|
-
// VD 17-DEC-2024 - Valdiation changes(Error Binding)
|
|
430
|
-
handleQuesValidation(ques) {
|
|
431
|
-
if (this.errorBind && Object.keys(this.errorBind).length > 0) {
|
|
432
|
-
for (let [key, val] of Object.entries(this.errorBind)) {
|
|
433
|
-
let value = val;
|
|
434
|
-
if (ques.Reference_Field__c === key) {
|
|
435
|
-
if (value) {
|
|
436
|
-
ques.error = true;
|
|
437
|
-
ques.Error_Message__c = value;
|
|
438
|
-
}
|
|
439
|
-
else {
|
|
440
|
-
ques.error = false;
|
|
441
|
-
ques.Error_Message__c = '';
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
423
|
// VD 06Sep24 calendar changes for data bindIn
|
|
448
424
|
addEvent(day, entryQues) {
|
|
449
425
|
// Transform new entries into the desired format
|
|
450
426
|
const newEntries = entryQues.reduce((acc, q) => {
|
|
451
|
-
acc[q.
|
|
427
|
+
acc[q.id] = { ...q };
|
|
452
428
|
return acc;
|
|
453
429
|
}, {});
|
|
454
430
|
// Find if an event already exists for the given date
|
|
@@ -468,20 +444,16 @@ export class BookletComponent {
|
|
|
468
444
|
};
|
|
469
445
|
this.allEvents.push(newEvent);
|
|
470
446
|
}
|
|
471
|
-
console.log('all events booklet');
|
|
472
|
-
console.log(this.allEvents);
|
|
473
447
|
}
|
|
474
448
|
readQuestions(qbId) {
|
|
475
|
-
// console.log('inside BookletComponent.readQuestions ' + qbId);
|
|
476
|
-
// console.log(this.bookQuestionsMap.size);
|
|
477
449
|
let questions = [];
|
|
478
450
|
// HA 31-JAN-24 Added ternary to avoid undefined
|
|
479
|
-
for (var sq in this.bookQuestionsMap?.get(qbId)?.
|
|
480
|
-
let q = this.bookQuestionsMap?.get(qbId).
|
|
451
|
+
for (var sq in this.bookQuestionsMap?.get(qbId)?.subQuestions) {
|
|
452
|
+
let q = this.bookQuestionsMap?.get(qbId).subQuestions[sq];
|
|
481
453
|
// HA 09FEB24 if question is there process
|
|
482
454
|
if (q) {
|
|
483
|
-
if ((q.
|
|
484
|
-
questions.push(this.sqOptions.get(q.
|
|
455
|
+
if ((q.type == 'Dropdown' || q.type == 'Radio') && this.sqOptions.get(q.id)) {
|
|
456
|
+
questions.push(this.sqOptions.get(q.id));
|
|
485
457
|
}
|
|
486
458
|
else {
|
|
487
459
|
questions.push(q);
|
|
@@ -492,14 +464,13 @@ export class BookletComponent {
|
|
|
492
464
|
if (this.fieldRestrictions) {
|
|
493
465
|
const fieldRestrictions = new Map(Object.entries(this.fieldRestrictions.fields));
|
|
494
466
|
questions.forEach(ques => {
|
|
495
|
-
const restriction = fieldRestrictions.get(ques.
|
|
467
|
+
const restriction = fieldRestrictions.get(ques.uniqueIdentifier);
|
|
496
468
|
if (restriction) {
|
|
497
|
-
ques.
|
|
498
|
-
ques.
|
|
469
|
+
ques.isReadOnly = restriction === 'readOnly';
|
|
470
|
+
ques.isHidden = restriction === 'hide';
|
|
499
471
|
}
|
|
500
472
|
});
|
|
501
473
|
}
|
|
502
|
-
// console.log(questions);
|
|
503
474
|
return questions;
|
|
504
475
|
}
|
|
505
476
|
// VD 11Jun24 - translation changes
|
|
@@ -517,24 +488,8 @@ export class BookletComponent {
|
|
|
517
488
|
}
|
|
518
489
|
getText(value) {
|
|
519
490
|
var doc = new DOMParser().parseFromString(value, "text/html");
|
|
520
|
-
//console.log( doc.documentElement.textContent);
|
|
521
491
|
return this.sanitizer.bypassSecurityTrustHtml(doc.documentElement.textContent);
|
|
522
492
|
}
|
|
523
|
-
// VD 17-DEC-2024 - Custom Valdiation changes
|
|
524
|
-
handleQuestionsVal(questions) {
|
|
525
|
-
if (questions.length > 0) {
|
|
526
|
-
questions.forEach(ques => {
|
|
527
|
-
this.validationMap.set(ques.Reference_Field__c, ques.input);
|
|
528
|
-
const currentBook = this.booklet.find(record => record.Id === ques.Question_Book__c);
|
|
529
|
-
const customValidationCode = currentBook?.Validation_Map__c;
|
|
530
|
-
const context = {
|
|
531
|
-
validationMap: this.validationMap,
|
|
532
|
-
ques: ques,
|
|
533
|
-
};
|
|
534
|
-
this.codeExecutionService.executeCode(customValidationCode, context);
|
|
535
|
-
});
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
493
|
getDropDown(event) {
|
|
539
494
|
this.hadleDropDownDependent.emit(event);
|
|
540
495
|
}
|
|
@@ -546,13 +501,13 @@ export class BookletComponent {
|
|
|
546
501
|
event["nxtId"] = Object.keys(this.bookletJSON?.bookQuestionsMap)[0];
|
|
547
502
|
this.handleCalendarEvent.emit(event);
|
|
548
503
|
}
|
|
549
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BookletComponent, deps: [{ token: i1.SalesforceService }, { token: i2.DataService }, { token: i3.StorageService }, { token: i4.ActivatedRoute }, { token: i5.DomSanitizer }, { token: i6.ChangeService }, { token:
|
|
550
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BookletComponent, selector: "lib-booklet", inputs: { bookletId: "bookletId", serv: "serv", tkn: "tkn", bookletJSON: "bookletJSON", dropdownDependentData: "dropdownDependentData", labelValue: "labelValue", token: "token", languageCode: "languageCode", fieldRestrictions: "fieldRestrictions", dataBind: "dataBind"
|
|
504
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BookletComponent, deps: [{ token: i1.SalesforceService }, { token: i2.DataService }, { token: i3.StorageService }, { token: i4.ActivatedRoute }, { token: i5.DomSanitizer }, { token: i6.ChangeService }, { token: i0.ElementRef }, { token: i7.I18nService }], target: i0.ɵɵFactoryTarget.Component });
|
|
505
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BookletComponent, selector: "lib-booklet", inputs: { bookletId: "bookletId", serv: "serv", tkn: "tkn", bookletJSON: "bookletJSON", dropdownDependentData: "dropdownDependentData", labelValue: "labelValue", token: "token", languageCode: "languageCode", fieldRestrictions: "fieldRestrictions", dataBind: "dataBind" }, outputs: { handleBookletActionEvent: "handleBookletActionEvent", handlePage: "handlePage", hadleDropDownDependent: "hadleDropDownDependent", handleCalendarDate: "handleCalendarDate", handleCalendarEvent: "handleCalendarEvent" }, usesOnChanges: true, ngImport: i0, template: "<ngx-spinner size=\"medium\" [name]=\"spinnerName\" [type]=\"spinnerType\"></ngx-spinner>\n<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [ngClass]=\"langDirection\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys--> \n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing lable when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText\" > \n {{ ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes--> \n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" \n [labelValue]=\"labelValue\" \n [questionItem]=\"ques\" \n [translatedQuestions]=\"readTransQuestions(qb.id)\" \n [questions]=\"readQuestions(qb.id)\" \n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n ></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing lable when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText\" > \n {{ qb?.questionText }}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [translatedQuestions]=\"readTransQuestions(qb.id)\" [questions]=\"readQuestions(qb.id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n</div>\n<!-- RS 09DEC24 Changed keys--> \n<!-- Group Actions -->\n<!-- HA 19DEC23 For Direction -->\n<div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [ngClass]=\"langDirection\">\n <div *ngFor=\"let action of actions; let i = index\">\n <!-- // HA 22JAN24 Commonise the button style in fusion -->\n <button (click)=\"handleBookletActionClick(action)\" ngClass=\"btn btn-primary fc-button nxtButton\">\n {{ action.name }}\n </button>\n </div>\n</div>\n", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.NgxSpinnerComponent, selector: "ngx-spinner", inputs: ["disableAnimation", "bdColor", "zIndex", "color", "type", "size", "fullScreen", "name", "template", "showSpinner"] }, { kind: "component", type: i10.QuestionbookComponent, selector: "lib-questionbook", inputs: ["qbItem", "questionItem", "translatedQuestions", "questions", "errorFieldId", "labelValue", "token", "dropDownData"], outputs: ["handleDropDown", "handleQuestion", "hadleDropDownDependent", "handleCalendarDate", "handleCalendarEvent"] }] });
|
|
551
506
|
}
|
|
552
507
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BookletComponent, decorators: [{
|
|
553
508
|
type: Component,
|
|
554
|
-
args: [{ selector: 'lib-booklet', template: "<ngx-spinner size=\"medium\" [name]=\"spinnerName\" [type]=\"spinnerType\"></ngx-spinner>\n<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [ngClass]=\"langDirection\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.
|
|
555
|
-
}], ctorParameters: function () { return [{ type: i1.SalesforceService }, { type: i2.DataService }, { type: i3.StorageService }, { type: i4.ActivatedRoute }, { type: i5.DomSanitizer }, { type: i6.ChangeService }, { type:
|
|
509
|
+
args: [{ selector: 'lib-booklet', template: "<ngx-spinner size=\"medium\" [name]=\"spinnerName\" [type]=\"spinnerType\"></ngx-spinner>\n<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [ngClass]=\"langDirection\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- RS 09DEC24 Changed keys--> \n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.subQuestions; else elseBlock\">\n <div *ngFor=\"let ques of qb.subQuestions\" class=\"questiondiv1\">\n <div>\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing lable when its available-->\n <div [innerHTML]=\"getText(ques?.questionText)\" *ngIf=\"ques?.questionText\" > \n {{ ques?.questionText }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!--VD 11Jun24 - translation changes-->\n <!--VD 06Sep24 calendar changes--> \n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" \n [labelValue]=\"labelValue\" \n [questionItem]=\"ques\" \n [translatedQuestions]=\"readTransQuestions(qb.id)\" \n [questions]=\"readQuestions(qb.id)\" \n (handleDropDown)=\"getDropDown($event)\"\n (handleCalendarDate)=\"getCalendarDate($event)\"\n (handleCalendarEvent)=\"getCalendarEvent($event)\"\n ></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div class=\"questiondiv1\">\n <div>\n <div *ngIf=\"!qb.isTitle\" [class]=\"qb.isShengel ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing lable when its available-->\n <div [innerHTML]=\"getText(qb?.questionText)\" *ngIf=\"qb?.questionText\" > \n {{ qb?.questionText }}\n {{ qb?.title }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input --> <!-- // VD 11Jun24 - translation changes-->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [translatedQuestions]=\"readTransQuestions(qb.id)\" [questions]=\"readQuestions(qb.id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n</div>\n<!-- RS 09DEC24 Changed keys--> \n<!-- Group Actions -->\n<!-- HA 19DEC23 For Direction -->\n<div class=\"align-submit-row\" *ngIf=\"abItem?.status != 'Completed'\" [ngClass]=\"langDirection\">\n <div *ngFor=\"let action of actions; let i = index\">\n <!-- // HA 22JAN24 Commonise the button style in fusion -->\n <button (click)=\"handleBookletActionClick(action)\" ngClass=\"btn btn-primary fc-button nxtButton\">\n {{ action.name }}\n </button>\n </div>\n</div>\n", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}\n"] }]
|
|
510
|
+
}], ctorParameters: function () { return [{ type: i1.SalesforceService }, { type: i2.DataService }, { type: i3.StorageService }, { type: i4.ActivatedRoute }, { type: i5.DomSanitizer }, { type: i6.ChangeService }, { type: i0.ElementRef }, { type: i7.I18nService }]; }, propDecorators: { bookletId: [{
|
|
556
511
|
type: Input
|
|
557
512
|
}], serv: [{
|
|
558
513
|
type: Input
|
|
@@ -582,7 +537,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
582
537
|
type: Output
|
|
583
538
|
}], dataBind: [{
|
|
584
539
|
type: Input
|
|
585
|
-
}], errorBind: [{
|
|
586
|
-
type: Input
|
|
587
540
|
}] } });
|
|
588
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2xldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYm9va2xldC9ib29rbGV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9ib29rbGV0L2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFJVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FJYixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7OztBQW1CdkIsTUFBTSxPQUFPLGdCQUFnQjtJQXFDakI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFFRDtJQTVDQSxTQUFTLENBQVM7SUFDbEIsSUFBSSxDQUFTO0lBQ2IsR0FBRyxDQUFTO0lBQ1osV0FBVyxDQUFNO0lBQ2pCLHFCQUFxQixDQUFLO0lBQzFCLFVBQVUsQ0FBUTtJQUNsQixLQUFLLENBQVE7SUFDYixZQUFZLENBQVEsQ0FBRSxtQ0FBbUM7SUFDekQsaUJBQWlCLENBQU0sQ0FBQyx1Q0FBdUM7SUFDOUQsd0JBQXdCLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFDakUsVUFBVSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ25ELHNCQUFzQixHQUFxQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ3pFLDhCQUE4QjtJQUNuQixrQkFBa0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMzRCxtQkFBbUIsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUUvRCxVQUFVLENBQWlCO0lBRTNCLE9BQU8sR0FBVSxFQUFFLENBQUM7SUFDcEIsTUFBTSxHQUFRLEVBQUUsQ0FBQztJQUNqQixPQUFPLEdBQWlCLEVBQUUsQ0FBQztJQUMzQixnQkFBZ0IsR0FBUSxJQUFJLEdB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OEI7SUFDN0IsZUFBZSxDQUFDLEtBQVM7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsS0FBUztRQUN4QixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO3VHQXJqQlUsZ0JBQWdCOzJGQUFoQixnQkFBZ0IscWxCQzlCN0IsazNHQTBEQTs7MkZENUJhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxhQUFhO3lVQUtkLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDSSx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBRUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFpQkUsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBFbGVtZW50UmVmLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU2FsZXNmb3JjZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2FsZXNmb3JjZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XG5pbXBvcnQgeyBBY3Rpb25NZXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hY3Rpb25NZXRhJztcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uLy4uL3dyYXBwZXJcIjtcbmltcG9ydCB7IEJvb2tsZXRXcmFwcGVyIH0gZnJvbSBcIi4uLy4uL21vZGVsL2Jvb2tsZXRXcmFwcGVyXCI7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBDaGFuZ2VTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2NoYW5nZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb2RlRXhlY3V0aW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9jb2RlLWV4ZWN1dGlvbi5zZXJ2aWNlXCI7XG4vLyBIQSAxOURFQzIzIGltcG9ydGVkIHRyYW5zbGF0aW9uIHNlcnZpY2VcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2kxOG4uc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYm9va2xldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ib29rbGV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYm9va2xldC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQm9va2xldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGJvb2tsZXRJZDogc3RyaW5nO1xuICBASW5wdXQoKSBzZXJ2OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRrbjogc3RyaW5nO1xuICBASW5wdXQoKSBib29rbGV0SlNPTjogYW55O1xuICBASW5wdXQoKSBkcm9wZG93bkRlcGVuZGVudERhdGE6YW55O1xuICBASW5wdXQoKSBsYWJlbFZhbHVlOnN0cmluZztcbiAgQElucHV0KCkgdG9rZW46c3RyaW5nO1xuICBASW5wdXQoKSBsYW5ndWFnZUNvZGU6c3RyaW5nOyAgLy8gVkQgMTFKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXNcbiAgQElucHV0KCkgZmllbGRSZXN0cmljdGlvbnM6IGFueTsgLy8gVkQgMTJKdW4yNCAtIGZpZWxkIHBlcm1pc3Npb24gY2hhbmdlXG4gIEBPdXRwdXQoKSBoYW5kbGVCb29rbGV0QWN0aW9uRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaGFuZGxlUGFnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBoYWRsZURyb3BEb3duRGVwZW5kZW50OkV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICBAT3V0cHV0KCkgaGFuZGxlQ2FsZW5kYXJEYXRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGhhbmRsZUNhbGVuZGFyRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyBueHRCb29rbGV0OiBCb29rbGV0V3JhcHBlcjtcblxuICBwdWJsaWMgYm9va2xldDogYW55W10gPSBbXTtcbiAgcHVibGljIGFiSXRlbTogYW55ID0ge307XG4gIHB1YmxpYyBhY3Rpb25zOiBBY3Rpb25NZXRhW10gPSBbXTtcbiAgcHVibGljIGJvb2tRdWVzdGlvbnNNYXA6IGFueSA9IG5ldyBNYXAoKTtcbiAgcHVibGljIHRyYW5zbGF0ZU1hcDogYW55ID0gbmV3IE1hcCgpOyAgLy8gVkQgMTFKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXNcbiAgcHJpdmF0ZSBzcU9wdGlvbnM6IGFueSA9IG5ldyBNYXAoKTtcbiAgcHVibGljIGlzQW5zd2VyRmxhZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgc3Bpbm5lck5hbWU6IHN0cmluZztcbiAgcHVibGljIHNwaW5uZXJUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyB2YWxpZGF0aW9uTWFwOiBhbnkgPSBuZXcgTWFwKCk7IC8vIFZEIDE3LURFQy0yMDI0IC0gVmFsZGlhdGlvbiBjaGFuZ2VzXG4gICAgLy8gSEEgMTlERUMyMyBsYW5nRGlyZWN0aW9uIHZhcmlhYmxlIGlzIGNyZWF0ZWQgdG8gYXNzaWduIHRoZSBkaXJlY3Rpb24gYXMgY2xhc3NcbiAgbGFuZ0RpcmVjdGlvbiA9ICdsdHInOyAvLyBIQSAyOERFQzIzIG1ha2luZyBsdHIgYXMgZGVmYXVsdCBkaXJlY3Rpb25cbiAgYW5zd2VyTGlzdCA9IFtdOyAvLyBIQSAxMS1KQU4tMjQgQW5zd2VybGlzdCB0byBzdG9yZSB0aGUgbWluaW1hbCB2YWx1ZVxuICBASW5wdXQoKSBkYXRhQmluZDphbnk7Ly8gSEEgMTgtSkFOLTI0IFRvIGluc2VydCB0aGUgZW5kcG9pbnQgdmFsdWUgdG8gdGhlIHF1ZXN0aW9uXG4gIEBJbnB1dCgpIGVycm9yQmluZDogYW55OyAvLyBWRCAxNy1ERUMtMjAyNCAtIFZhbGRpYXRpb24gY2hhbmdlc1xuICBhbGxFdmVudHM6YW55W109W107ICAvLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXNcbiAgXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2ZTZXJ2aWNlOiBTYWxlc2ZvcmNlU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgY2hhbmdlU2VydmljZTogQ2hhbmdlU2VydmljZSwgXG4gICAgcHJpdmF0ZSBjb2RlRXhlY3V0aW9uU2VydmljZTogQ29kZUV4ZWN1dGlvblNlcnZpY2UsXG4gICAgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHVibGljIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZVxuICApIHsgXG4gICAgdGhpcy5zcGlubmVyTmFtZSA9IFwic3AxXCI7XG4gICAgdGhpcy5zcGlubmVyVHlwZSA9IFwiYmFsbC1zcGluLWNsb2Nrd2lzZVwiO1xuICAgIGNvbnNvbGUubG9nKCdkcm9wZG93bkRlcGVuZGVudERhdGEnLHRoaXMuZHJvcGRvd25EZXBlbmRlbnREYXRhKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIFxuLy8gIFZEIDEySmFuMjQgZmllbGRSZXN0cmljdGlvbnMgZm9ybWF0ZSBcbiAgLy8gICB7XG4gIC8vICAgICBcImZpZWxkc1wiIDoge1xuICAvLyAgICAgICAgIFwidHJhbnNRYi0wMVwiIDogXCJyZWFkT25seVwiLFxuICAvLyAgICAgICAgIFwiVHJhbnNGaXIwMlwiIDogXCJcIixcbiAgLy8gICAgICAgICBcIlRyYW5zTGFzdDAzXCIgOiBcInJlYWRPbmx5XCIsXG4gIC8vICAgICAgICAgXCJiazItcTJcIiA6IFwiaGlkZVwiXG4gIC8vICAgICB9XG4gIC8vICB9XG5cbiAgLy9WRCAxOC1KQU4tMjQgRHVtbXkgU3RhdGljIGRhdGEgZm9yIHRlc3RpbmdcbiAgLy8gdGhpcy5lcnJvckJpbmQgPSB7IFxuICAvLyAgICAgXCJ3YXJuaW5nXCIgOiBcIkNvbnZlcnRpbmcgdG8gc2Fud2l0Y2ggSG9sZGF5KlwiLFxuICAvLyAgICAgXCJzdGFydERhdGVcIiA6IFwiXCJcbiAgLy8gIH07XG4gIFxuICAgIC8vIEhBIDE4LUpBTi0yNCBEdW1teSBTdGF0aWMgZGF0YSBmb3IgdGVzdGluZ1xuICAgIC8vIHRoaXMuZGF0YUJpbmQgPSB7XG4gICAgLy8gICBcIl9pZFwiOiBcIjY1OWVkMDAyZWQ1MWJiODA2MTU0NDI1NVwiLFxuICAgIC8vICAgXCJjb21wYW55SWRcIjogXCI1dWxsaDFCV3BZcW52ektoOUxcIixcbiAgICAvLyAgIFwibmFtZVwiOiBcIkFsIFlhc21pbmVcIixcbiAgICAvLyAgIFwiY29kZVwiOiBcImNoZWNrXCIsXG4gICAgLy8gICBcInN0YXR1c1wiOiBcIkluLVByb2dyZXNzXCIsXG4gICAgLy8gICBcImNyZWF0ZWRBdFwiOiBcIjIwMjQtMDEtMTBUMTc6MTI6MzQuNjg2WlwiLFxuICAgIC8vICAgXCJ1cGRhdGVkQXRcIjogXCIyMDI0LTAxLTEwVDE5OjUzOjA4LjEzNVpcIixcbiAgICAvLyAgIFwiX192XCI6IDAsXG4gICAgLy8gICBcIm93bmVyXCI6IFwiY2hlY2tcIixcbiAgICAvLyAgIFwiY3VzdG9tZXJcIjogXCJjaGVja1wiLFxuICAgIC8vICAgXCJkYXRpXCI6IFwiMjAyNC0wMS0yM1QxODozMDowMC4wMDBaXCIsXG4gICAgLy8gICBcInRpbWlcIjogXCIyMDI0LTAxLTIzVDE4OjMwOjAwLjAwMFpcIixcbiAgICAvLyBcImZOYW1lXCI6IFwiSGFpZGVyXCIsXG4gICAgLy8gXCJsTmFtZVwiOiBcIkFsaVwiLFxuICAgIC8vIFwiZGVmYXVsdEFwcFwiOiBcIk5YVFwiLFxuICAgIC8vIFwiZW1haWxcIjogXCJoYWlkZXJAZ21haWwuY29tXCIsXG4gICAgLy8gXCJsb2NhdGlvblwiOiB7YWRkcmVzczogXCIxMDcsIEFzaG9rIE5hZ2FyLCBLYWR1Z29uZGFuYWhhbGxpLCBCZW5nYWx1cnUsIEthcm5hdGFrYSA1NjAwNDUsIEluZGlhXCIsXG4gICAgLy8gICBsYXRpdHVkZTogMTMuMDIwMDU3NSxcbiAgICAvLyAgIGxvbmdpdHVkZTogNzcuNjEyOTgxNn0sXG4gICAgLy8gXCJsb2NhdGlvblwiOiBcIjEwNywgQXNob2sgTmFnYXIsIEthZHVnb25kYW5haGFsbGksIEJlbmdhbHVydSwgS2FybmF0YWthIDU2MDA0NSwgSW5kaWFcIixcbiAgICAvLyBcInRleHRBcmVhXCI6IFwiTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtXCIsXG4gICAgLy8gfTtcbiAgICAgICAgdGhpcy5wcm9jZXNzQm9va2xldCgpO1xuICB9XG4gLy8gVkQgTk9WMjMgLSB1cGRhdGUgdGhlIGpzb24gZGF0YSB3aGVuIGJvb2tsZXRJZCBhbmQgYm9va2xldEpTT04gY2hhbmdlc1xuICBuZ09uQ2hhbmdlcyhzaW1wbGVjaGFuZ2VzOlNpbXBsZUNoYW5nZXMpIHtcbiAgIC8vIEhBIDIzSkFOMjQgVG8gYXZvaWQgdW5kZWZpbmVkIGVycm9yXG4gICAvLyAvLyBWRCAxNy1ERUMtMjAyNCAtIFZhbGRpYXRpb24gY2hhbmdlc1xuICAgaWYoc2ltcGxlY2hhbmdlc1snYm9va2xldElkJ10gfHwgKHNpbXBsZWNoYW5nZXNbJ2Jvb2tsZXRKU09OJ10gJiYgKHNpbXBsZWNoYW5nZXNbJ2Jvb2tsZXRKU09OJ10uY3VycmVudFZhbHVlICE9IG51bGwgfHwgc2ltcGxlY2hhbmdlc1snYm9va2xldEpTT04nXS5jdXJyZW50VmFsdWUgIT0gdW5kZWZpbmVkKSkgfHwgKHNpbXBsZWNoYW5nZXNbJ2RhdGFCaW5kJ10gJiYgKHNpbXBsZWNoYW5nZXNbJ2RhdGFCaW5kJ10uY3VycmVudFZhbHVlICE9IG51bGwgfHwgc2ltcGxlY2hhbmdlc1snZGF0YUJpbmQnXS5jdXJyZW50VmFsdWUgIT0gdW5kZWZpbmVkKSkgfHwgKHNpbXBsZWNoYW5nZXNbJ2Vycm9yQmluZCddICYmIChzaW1wbGVjaGFuZ2VzWydlcnJvckJpbmQnXS5jdXJyZW50VmFsdWUgIT0gbnVsbCB8fCBzaW1wbGVjaGFuZ2VzWydlcnJvckJpbmQnXS5jdXJyZW50VmFsdWUgIT0gdW5kZWZpbmVkKSkpe1xuICAgICAgdGhpcy5hbGxFdmVudHMgPSBbXTtcbiAgICAgIHRoaXMucHJvY2Vzc0Jvb2tsZXQoKTtcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJ2luc2lkZSBRdWVzdGlvbm5haXJlIG5nT25DaGFuZ2VzJyk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5ib29rbGV0KTtcbiAgICAvLyBpZih0aGlzLmJvb2tsZXQgPT0gdW5kZWZpbmVkIHx8IHRoaXMuYm9va2xldC5sZW5ndGggPT0gMCkge1xuICAgIC8vICAgdGhpcy5wcm9jZXNzQm9va2xldCgpO1xuICAgIC8vIH1cbiAgfVxuXG4gIHByb2Nlc3NCb29rbGV0KCkge1xuICAgIGlmICh0aGlzLmJvb2tsZXRJZCkge1xuICAgICAgaWYgKHRoaXMuYm9va2xldElkLmxlbmd0aCA9PSAxOCkge1xuICAgICAgICB0aGlzLnJlYWRCb29rbGV0KHRoaXMuYm9va2xldElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodGhpcy5ib29rbGV0SlNPTikge1xuICAgICAgLy8gVHJ5IHRvIHBhc3MgYSB2YWx1ZSBmcm9tIEJhY2tlbmQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgUXVlc3Rpb25Cb29rIFJlYWQgYW5kIEFuc3dlckJvb2sgUmVhZFxuICAgICAgdGhpcy5pc0Fuc3dlckZsYWcgPSB0cnVlO1xuXG4gICAgICBpZih0aGlzLmJvb2tsZXRKU09OICE9IG51bGwgfHwgdGhpcy5ib29rbGV0SlNPTiAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTdG9yaW5nIHRoZSBBUEkgcmVzcG9uc2UgZm9yIGZ1dHVyZSB1c2VcbiAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUodGhpcy5ib29rbGV0SlNPTik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYm9va2xldCA9IHRoaXMuYm9va2xldEpTT04ucmVjb3JkcztcbiAgICAgIHRoaXMuYWJJdGVtID0gdGhpcy5ib29rbGV0SlNPTi5hbnN3ZXJib29rO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBTdWIgUXVlc3Rpb24gT3B0aW9ucyAtIFRoaXMgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIGJvb2tRdWVzdGlvbnNNYXAgaW4gZnV0dXJlXG4gICAgICBmb3IgKHZhciBzcSBpbiB0aGlzLmJvb2tsZXRKU09OLnNxT3B0aW9ucykge1xuICAgICAgICB0aGlzLnNxT3B0aW9ucy5zZXQoc3EsIHRoaXMuYm9va2xldEpTT04uc3FPcHRpb25zW3NxXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIFF1ZXN0aW9uc1xuICAgICAgLy8gSEEgMjhERUMyMyB0aGlzIGFwcGxpZXMgZm9yIGJvb2tsZXRcbiAgICAgIC8vIEhBIDE3SkFOMjQgQWRkZWQgdGVybmFyeSBvcGVyYXRvciB0byBhdm9pZCB1bmRlZmluZWQgc2NlbmFyaW9cbiAgICAgIC8vIEhBIDA5RkVCMjQgQWRkaW5nIGNvbmRpdGlvbiB0byBhdm9pZCB1bmRlZmluZWQgZXJyb3JcbiAgICAgIGlmKHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXAgJiYgT2JqZWN0LmtleXModGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcCkubGVuZ3RoID4gMCl7XG4gICAgICAgIGZvciAodmFyIHZhbHVlIGluIHRoaXMuYm9va2xldEpTT04uYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgICAgIHRoaXMuYm9va1F1ZXN0aW9uc01hcC5zZXQodmFsdWUsIHRoaXMuYm9va2xldEpTT04uYm9va1F1ZXN0aW9uc01hcFt2YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBIQSAyOERFQzIzIHRoaXMgYXBwbGllcyBmb3IgYm9vayBvciBxdWVzdGlvbnNcbiAgICAgIGVsc2V7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICAvLyBIQSAwOUZFQjI0IEFkZGVkIHRlcm5hcnlcbiAgICAgICAgdmFsdWUgPSB0aGlzLmJvb2tsZXRKU09OLnJlY29yZHNbMF0/LklkO1xuICAgICAgICB0aGlzLmJvb2tRdWVzdGlvbnNNYXAuc2V0KHZhbHVlLCB0aGlzLmJvb2tsZXRKU09OLnF1ZXN0aW9uYm9vayk7XG4gICAgICB9XG4gICAgICBcbiAgICAgICAvLyBWRCAyMEp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICAgICAgIGZvciAodmFyIHZhbHVlIGluIHRoaXMuYm9va2xldEpTT04/LnRyYW5zbGF0aW9uTWFwKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlTWFwLnNldCh2YWx1ZSwgdGhpcy5ib29rbGV0SlNPTi50cmFuc2xhdGlvbk1hcFt2YWx1ZV0pO1xuICAgICAgfVxuXG4gICAgICBpZih0aGlzLmJvb2tsZXRKU09OLnF1ZXN0aW9uYm9vaz8uQWN0aW9uc19fYyAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25zID0gSlNPTi5wYXJzZSh0aGlzLmJvb2tsZXRKU09OLnF1ZXN0aW9uYm9vay5BY3Rpb25zX19jKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSEEgMTlERUMyMyBsYW5nRGlyZWN0aW9uIHZhcmlhYmxlIHZhbHVlIGFzc2lnbmluZ1xuICAgIC8vIGNvbnNvbGUubG9nKCdTdHlsZV9fYycsIHRoaXMuYm9va2xldEpTT04ucXVlc3Rpb25ib29rLlN0eWxlX19jKTtcbiAgICBpZih0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2s/LlN0eWxlX19jKXtcbiAgICAgIHZhciBzdHlsZSA9IEpTT04ucGFyc2UoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2s/LlN0eWxlX19jKSkpO1xuICAgICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gc3R5bGU/LmRpcmVjdGlvbjtcbiAgICB9XG4gICAgZWxzZSBpZih0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzWzBdPy5TdHlsZV9fYyl7XG4gICAgICB2YXIgc3R5bGUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuYm9va2xldEpTT04/LnJlY29yZHNbMF0/LlN0eWxlX19jKSk7XG4gICAgICB0aGlzLmxhbmdEaXJlY3Rpb24gPSBzdHlsZT8uZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIC8vIEhBIDE4LUpBTi0yNCBUaGUgY29uZGl0aW9uIGlzIHVzZWQgZm9yIEJpbmQtSW4gTG9naWMgXG4gICAgdGhpcy5oYW5kbGVDb21wbGV0ZUJvb2tsZXQodGhpcy5ib29rbGV0SlNPTik7IFxuICB9XG4gLy8gVkQgMTJKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXNcbiAgcHJpdmF0ZSByZWFkQm9va2xldCA9ICh1dWlkOiBzdHJpbmcpID0+IHtcbiAgICBpZih0aGlzLnNlcnYgPT0gXCJhcGlcIikge1xuICAgICAgdGhpcy5kYXRhU2VydmljZS5nZXRBUElEYXRhKFxuICAgICAgICB0aGlzLnRrbixcbiAgICAgICAgW1wiQm9va2xldFwiLCBcInJlYWRcIiwgdXVpZCx0aGlzLmxhbmd1YWdlQ29kZV0sXG4gICAgICAgIHRoaXMuc3VjY2Vzc1JlYWRCb29rbGV0LFxuICAgICAgICB0aGlzLmZhaWx1cmVSZWFkQm9va2xldFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBhcmFtTWFwID0geyBjcmVhdGVBbnN3ZXJCb29rRmxhZzogZmFsc2UgfTtcbiAgICAgIHBhcmFtTWFwWydjX19xYl9pZCddID0gJyc7XG4gICAgICBwYXJhbU1hcFtcImNfX3JlY29yZF9pZFwiXSA9ICcnO1xuICAgICAgdGhpcy5zZlNlcnZpY2UucmVtb3RlQWN0aW9uKFxuICAgICAgICBcIk54dENvbnRyb2xsZXIubmV3UHJvY2Vzc1wiLFxuICAgICAgICBbXCJCb29rbGV0XCIsIFwicmVhZFwiLCB1dWlkLEpTT04uc3RyaW5naWZ5KHBhcmFtTWFwKSx0aGlzLmxhbmd1YWdlQ29kZV0sXG4gICAgICAgIHRoaXMuc3VjY2Vzc1JlYWRCb29rbGV0LFxuICAgICAgICB0aGlzLmZhaWx1cmVSZWFkQm9va2xldFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN1Y2Nlc3NSZWFkQm9va2xldCA9IChyZXNwb25zZSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCdJbnNpZGUgdGhlIHN1Y2Nlc3NSZWFkQm9va2xldCcpO1xuICAgIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICBpZihyZXNwb25zZSAhPSBudWxsIHx8IHJlc3BvbnNlICE9IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU3RvcmluZyB0aGUgQVBJIHJlc3BvbnNlIGZvciBmdXR1cmUgdXNlXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUocmVzcG9uc2UpO1xuXG4gICAgICAvLyBUcnkgdG8gcGFzcyBhIHZhbHVlIGZyb20gQmFja2VuZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBRdWVzdGlvbkJvb2sgUmVhZCBhbmQgQW5zd2VyQm9vayBSZWFkXG4gICAgICAvLyB0aGlzLmlzQW5zd2VyRmxhZyA9IHRydWU7XG4gICAgICBcbiAgICAgIHRoaXMuYm9va2xldCA9IHJlc3BvbnNlLnJlY29yZHM7XG4gICAgICB0aGlzLmFiSXRlbSA9IHJlc3BvbnNlLmFuc3dlcmJvb2s7XG4gICAgICBcbiAgICAgIC8vIFByb2Nlc3MgdGhlIFN1YiBRdWVzdGlvbiBPcHRpb25zIC0gVGhpcyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggYm9va1F1ZXN0aW9uc01hcCBpbiBmdXR1cmVcbiAgICAgIGZvciAodmFyIHNxIGluIHJlc3BvbnNlLnNxT3B0aW9ucykge1xuICAgICAgICB0aGlzLnNxT3B0aW9ucy5zZXQoc3EsIHJlc3BvbnNlLnNxT3B0aW9uc1tzcV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBRdWVzdGlvbnNcbiAgICAgIGZvciAodmFyIHZhbHVlIGluIHJlc3BvbnNlLmJvb2tRdWVzdGlvbnNNYXApIHtcbiAgICAgICAgdGhpcy5ib29rUXVlc3Rpb25zTWFwLnNldCh2YWx1ZSwgcmVzcG9uc2UuYm9va1F1ZXN0aW9uc01hcFt2YWx1ZV0pO1xuICAgICAgfVxuIC8vIFZEIDExSnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzXG4gICAgICBmb3IgKHZhciB2YWx1ZSBpbiByZXNwb25zZS50cmFuc2xhdGlvbk1hcCkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZU1hcC5zZXQodmFsdWUsIHJlc3BvbnNlLnRyYW5zbGF0aW9uTWFwW3ZhbHVlXSk7XG4gICAgICB9XG5cbiAgICAgIGlmKHJlc3BvbnNlLnF1ZXN0aW9uYm9vaz8uQWN0aW9uc19fYyAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25zID0gSlNPTi5wYXJzZShyZXNwb25zZS5xdWVzdGlvbmJvb2suQWN0aW9uc19fYyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEhBIDE5REVDMjMgbGFuZ0RpcmVjdGlvbiB2YXJpYWJsZSB2YWx1ZSBhc3NpZ25pbmdcbiAgICBpZihyZXNwb25zZT8ucXVlc3Rpb25ib29rPy5TdHlsZV9fYyl7XG4gICAgICB2YXIgc3R5bGUgPSBKU09OLnBhcnNlKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2U/LnF1ZXN0aW9uYm9vaz8uU3R5bGVfX2MpKSk7XG4gICAgICB0aGlzLmxhbmdEaXJlY3Rpb24gPSBzdHlsZT8uZGlyZWN0aW9uO1xuICAgIH1cbiAgICBlbHNlIGlmKHJlc3BvbnNlPy5yZWNvcmRzWzBdPy5TdHlsZV9fYyl7XG4gICAgICB2YXIgc3R5bGUgPSBKU09OLnBhcnNlKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2U/LnJlY29yZHNbMF0/LlN0eWxlX19jKSkpO1xuICAgICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gc3R5bGU/LmRpcmVjdGlvbjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZhaWx1cmVSZWFkQm9va2xldCA9IChyZXNwb25zZSkgPT4ge1xuXG4gIH1cblxuICBoYW5kbGVCb29rbGV0QWN0aW9uQ2xpY2soYWN0aW9uOkFjdGlvbk1ldGEpIHtcbiAgICAvLyBIQSAxOUpBTjI0IEFjdGlvbiBjaGFuZ2VzXG4gICAgdGhpcy5hbnN3ZXJMaXN0ID0gW107XG4gICAgdGhpcy5kYXRhQmluZCA9IFtdOyAvLyBIQSAxMkZFQjI0IENsZWFyaW5nIGRhdGFCaW5kIHVwb24gYnV0dG9uIGFjdGlvbiBzbyB0aGF0IGRhdGFCaW5kIHZhbHVlIHdpbGwgbm90IG92ZXJyaWRlIHRoZSBjaGFuZ2VkIHZhbHVlXG4gICAgY29uc29sZS5sb2coYWN0aW9uKTtcbiAgICBsZXQgZGF0YVRvUGFyZW50ID0ge307XG4gICAgbGV0IHZhbGlkRm9ybSA9IHRydWU7IC8vIFZEIDAxQXVnMjQgLSB2YWxpZGF0aW9uIGNoYW5nZVxuICAgIC8vIEhBIDIySkFOMjQgdGhpcyBjaGFuZ2UgdG8gbWFrZSBjbG9zZSBldmVudCB3b3JrXG4gICAgZGF0YVRvUGFyZW50WydhY3Rpb24nXSA9IGFjdGlvbi5ldmVudHRvZW1pdDtcbiAgICBpZighKGFjdGlvbi5ldmVudHRvZW1pdCA9PT0gJ2Nsb3NlJyB8fCBhY3Rpb24uZXZlbnR0b2VtaXQgPT09ICdwcmludCcpKXtcbiAgICAgIC8vIEhBIDE4LUpBTi0yNCBTZW5kaW5nIHRoZSBjb21wbGV0ZSBqc29uIGRhdGEgYWxzbyBcbiAgICAgIGRhdGFUb1BhcmVudFsnanNvbkJvb2snXSA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KCk7XG4gICAgICAvLyBIQSAxN0pBTjI0IG54dElkIHRvIGRhdGFQYXJlbnQgb2JqZWN0XG4gICAgICBpZih0aGlzLmJvb2tsZXRKU09OKXtcbiAgICAgICAgZGF0YVRvUGFyZW50WydueHRJZCddID0gT2JqZWN0LmtleXModGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcClbMF07XG4gICAgICB9XG4gICAgICAvLyBIQSAxMS1KQU4tMjQgTWluaW1pemluZyB0aGUgdmFsdWUgd2hpY2ggaGFzIHRvIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyXG4gICAgICB0aGlzLmhhbmRsZUNvbXBsZXRlQm9va2xldChkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10pO1xuICAgICAgZGF0YVRvUGFyZW50WydkYXRhJ10gPSB0aGlzLmFuc3dlckxpc3QgPyB0aGlzLmFuc3dlckxpc3QgOiBkYXRhVG9QYXJlbnRbJ2RhdGEnXTtcbiAgICAgIC8vIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b24gdmFsaWRhdGluZyB0aGUgcmVxdWlyZWQgZmllbGRzXG4gICAgICBmb3IobGV0IGtleSBpbiBkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10uYm9va1F1ZXN0aW9uc01hcCl7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCb29rICA9IGRhdGFUb1BhcmVudFsnanNvbkJvb2snXS5ib29rUXVlc3Rpb25zTWFwW2tleV07XG4gICAgICAgIGN1cnJlbnRCb29rLlF1ZXN0aW9uc19fci5yZWNvcmRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAvLyBWRCAwMUF1ZzI0IC0gdmFsaWRhdGlvbiBjaGFuZ2VcbiAgICAgICAgICBpZihlbGVtZW50LklzX09wdGlvbmFsX19jICYmIGRhdGFUb1BhcmVudFsnYWN0aW9uJ10gPT0gJ3N1Ym1pdCcgJiYgKCFlbGVtZW50LmlucHV0IHx8IChBcnJheS5pc0FycmF5KGVsZW1lbnQuaW5wdXQpICYmIGVsZW1lbnQuaW5wdXQubGVuZ3RoID09PSAwKSkgJiYgIWVsZW1lbnQuSXNfSGlkZV9fYyAmJiBlbGVtZW50LlR5cGVfX2MgIT0gJ0xhYmVsJyAmJiBlbGVtZW50LlR5cGVfX2MgIT0gJ0ltYWdlJyApeyAvL1NLUzVOT1YyNSBcbiAgICAgICAgICAgIGVsZW1lbnQuZXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgdmFsaWRGb3JtID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZpY2Uuc3VibWl0Q2hhbmdlKGVsZW1lbnQuSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBWRCAwMkF1ZzI0IC0gY2xlYXIgYWN0aW9uIGNoYW5nZXNcbiAgICAgICAgICBpZihkYXRhVG9QYXJlbnRbJ2FjdGlvbiddID09ICdjbGVhcicpe1xuICAgICAgICAgICAgaWYoZWxlbWVudC5UeXBlX19jID09ICdEcm9wZG93bicgfHwgZWxlbWVudC5UeXBlX19jID09ICdMb2NhdGlvbicgfHwgZWxlbWVudC5UeXBlX19jID09ICdSYWRpbycpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zZWxlY3RlZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfWVsc2UgaWYoZWxlbWVudC5UeXBlX19jID09ICdGaWxlJyl7XG4gICAgICAgICAgICAgIGVsZW1lbnQuaW5wdXQgPSBbXTtcbiAgICAgICAgICAgIH1lbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5pbnB1dCA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBWRCAxM01BWTI0IC0gcHJpbnQgUVIgYnV0dG9uIGNoYW5nZXNcbiAgICBpZihhY3Rpb24uZXZlbnR0b2VtaXQgPT09ICdwcmludCcpe1xuICAgICAgZGF0YVRvUGFyZW50WydhY3Rpb25EYXRhJ10gPSBhY3Rpb25bJ2RhdGEnXTtcbiAgICB9XG4gICAgLy8gSEEgMjNKQU4yNCBUbyBjYWxsIHRoZSBhY3Rpb24gb24gYW55IGV2ZW50XG4gICAvLyAgVkQgMDFBdWcyNCAtIHZhbGlkYXRpb24gY2hhbmdlXG4gICAgaWYodmFsaWRGb3JtKXtcbiAgICAgIHRoaXMuaGFuZGxlQm9va2xldEFjdGlvbkV2ZW50LmVtaXQoZGF0YVRvUGFyZW50KTtcbiAgICB9ZWxzZSB7XG4gICAgICBkYXRhVG9QYXJlbnRbJ2FjdGlvbiddID0gJ2Vycm9yJztcbiAgICAgIHRoaXMuaGFuZGxlQm9va2xldEFjdGlvbkV2ZW50LmVtaXQoZGF0YVRvUGFyZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBIQSAxOC1KQU4tMjQgaGFuZGxlQ29tcGxldGVCb29rbGV0IGlzIHRvIHNpbXBsaWZ5IHRoZSBsb2dpY1xuICBoYW5kbGVDb21wbGV0ZUJvb2tsZXQoY29tcGxldGVCb29rbGV0KXtcbiAgICBpZihPYmplY3Qua2V5cyhjb21wbGV0ZUJvb2tsZXQ/LmJvb2tRdWVzdGlvbnNNYXAgPz8ge30pLmxlbmd0aCA9PT0gMCl7IC8vIEhBIDExLUpBTi0yNCBJZiBjb25kaXRpb24gdG8gbG9hZCBib29rbGV0XG4gICAgICB0aGlzLmhhbmRsZUJvb2soY29tcGxldGVCb29rbGV0Py5xdWVzdGlvbmJvb2s/LlF1ZXN0aW9uc19fcik7XG4gICAgfVxuICAgIGVsc2V7IC8vIEhBIDExLUpBTi0yNCBUbyBsb2FkIGJvb2sgcXVlc3Rpb25zXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb21wbGV0ZUJvb2tsZXQuYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgICBjb25zdCB2YWwgPSBjb21wbGV0ZUJvb2tsZXQuYm9va1F1ZXN0aW9uc01hcFtrZXldO1xuICAgICAgICBpZih2YWwuVHlwZV9fYyA9PT0gJ0Jvb2snKXtcbiAgICAgICAgICB0aGlzLmhhbmRsZUJvb2sodmFsLlF1ZXN0aW9uc19fcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXModmFsKTtcbiAgICAgICAgICAvLyBWRCAxNy1ERUMtMjAyNCAtIFZhbGRpYXRpb24gY2hhbmdlc1xuICAgICAgICAgIHRoaXMuaGFuZGxlUXVlc1ZhbGlkYXRpb24odmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhBIDExLUpBTi0yNCBoYW5kbGVCb29rIGxvYWRzIHRoZSBCb29rXG4gIGhhbmRsZUJvb2socXVlc0xpc3Q6IGFueSl7XG4gICAgcXVlc0xpc3Q/LnJlY29yZHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmKGVsZW1lbnQuVHlwZV9fYyA9PT0gJ0Jvb2snKXtcbiAgICAgICAgLy8gSEEgMjRKQU4yNCBGZXRjaGluZyBmcm9tIFFCIHJlZmVyZW5jZVxuICAgICAgICB2YXIgYm9vayA9IEpTT04ucGFyc2UoZWxlbWVudC5RQl9SZWZlcmVuY2VfUXVlc3Rpb25zX19jKTtcbiAgICAgICAgYm9vay5xdWVzdGlvbmJvb2suUXVlc3Rpb25zX19yLnJlY29yZHMuZm9yRWFjaChxdWVzID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXMocXVlcyk7XG4gICAgICAgICAgLy8gVkQgMTctREVDLTIwMjQgLSBWYWxkaWF0aW9uIGNoYW5nZXNcbiAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXNWYWxpZGF0aW9uKHF1ZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2V7XG4gICAgICAgIHRoaXMuaGFuZGxlUXVlcyhlbGVtZW50KTtcbiAgICAgICAgLy8gVkQgMTctREVDLTIwMjQgLSBWYWxkaWF0aW9uIGNoYW5nZXNcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVzVmFsaWRhdGlvbihlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBWRCAxM1NlcDI0IC0gZGF0YWJpbmQgY2hhbmdlc1xuICAgIC8vIFZEIDIzIE9jdDI0IC0gZmlsZSB0eXBlIGNoYW5nZXNcbiAgICBpZih0aGlzLmRhdGFCaW5kICYmIE9iamVjdC5rZXlzKHRoaXMuZGF0YUJpbmQpLmxlbmd0aCA+IDApe1xuICAgICAgdGhpcy5jaGFuZ2VTZXJ2aWNlLmRhdGFDaGFuZ2VzKCdkYXRhQmluZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhBIDExLUpBTi0yNCBoYW5kbGVRdWVzIHRvIGxvYWQgcXVlc3Rpb25cbiAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gIGhhbmRsZVF1ZXMocXVlczogYW55KXtcbiAgICAvLyBIQSAxOS1KQU4tMjQgSWYgY29uZGl0aW9uIGlzIGZvciBiaW5kLWluLCBjb3JyZWN0aW9uXG4gICAgLy8gSEEgMDlGRUIyNCBBZGRpbmcgY29uZGl0aW9uIHRvIGF2b2lkIHVuZGVmaW5lZCBlcnJvclxuICAgIGlmKHRoaXMuZGF0YUJpbmQgJiYgT2JqZWN0LmtleXModGhpcy5kYXRhQmluZCkubGVuZ3RoID4gMCl7XG4gICAgICBmb3IobGV0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5kYXRhQmluZCkpe1xuICAgICAgICBsZXQgdmFsdWU6YW55ID0gdmFsO1xuICAgICAgICBpZihxdWVzLlJlZmVyZW5jZV9GaWVsZF9fYyA9PT0ga2V5KXtcbiAgICAgICAgICBpZihxdWVzLlR5cGVfX2MgPT09ICdEcm9wZG93bicgfHwgcXVlcy5UeXBlX19jID09PSAnUmFkaW8nICl7XG4gICAgICAgICAgICB0aGlzLnNxT3B0aW9ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICBpZihlbGVtZW50WydSZWZlcmVuY2VfRmllbGRfX2MnXSA9PT0ga2V5KXtcbiAgICAgICAgICAgICAgICBlbGVtZW50WydpbnB1dCddID0gcXVlcy5pbnB1dCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ3NlbGVjdGVkVmFsdWUnXSA9IHF1ZXMuc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSEEgMjRKQU4yNCBUbyBiaW5kLWluIERhdGUgYW5kIERhdGVUaW1lXG4gICAgICAgICAgZWxzZSBpZihxdWVzLlR5cGVfX2MgPT09ICdEYXRlJyB8fCBxdWVzLlR5cGVfX2MgPT0gJ0RhdGVUaW1lJyl7XG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gbmV3IERhdGUodmFsdWU/LnRvU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIQSAxMkZFQjI0IFRvIGJpbmQtaW4gTG9jYXRpb24gVHlwZVxuICAgICAgICAgIGVsc2UgaWYocXVlcy5UeXBlX19jID09PSAnTG9jYXRpb24nKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCd2YWx1ZSAnLCB2YWx1ZSk7XG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gdmFsdWU7XG4gICAgICAgICAgICBxdWVzLnNlbGVjdGVkVmFsdWUgPSB2YWx1ZVsnYWRkcmVzcyddID8gdmFsdWVbJ2FkZHJlc3MnXSA6IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzIGZvciBkYXRhIGJpbmRJblxuICAgICAgICAgIGVsc2UgaWYocXVlcy5UeXBlX19jID09PSAnQ2FsZW5kYXInKXtcbiAgICAgICAgICAgIGxldCBlbnRyaWVzID0gSlNPTi5wYXJzZShxdWVzWydGaWVsZHNfTWV0YV9fYyddKTtcbiAgICAgICAgICAgIGlmKGVudHJpZXMpe1xuICAgICAgICAgICAgICBsZXQgcmVmZXJlbmNlUXVlc3Rpb25zID0gW107XG4gICAgICAgICAgICAgIGlmKGVudHJpZXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgIGVudHJpZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQucXVlc3Rpb25SZWZlcmVuY2Upe1xuICAgICAgICAgICAgICAgICAgICAgICBsZXQgcVJlZmVyZW5jZSA9IEpTT04ucGFyc2UoZWxlbWVudC5xdWVzdGlvblJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVF1ZXN0aW9ucy5wdXNoKHFSZWZlcmVuY2U/LnF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYocmVmZXJlbmNlUXVlc3Rpb25zLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgIHZhbHVlPy5mb3JFYWNoKGNhbGVuZGFyQXJyYXkgPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZShjYWxlbmRhckFycmF5LmRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckFycmF5LmVudHJpZXMuZm9yRWFjaChpbnB1dEVudHJ5PT57XG4gICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXRFbnRyeSkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlUXVlc3Rpb25zLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmaWVsZC5SZWZlcmVuY2VfRmllbGRfX2MgPT0gayl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmaWVsZC5UeXBlX19jID09PSAnRGF0ZScgfHwgZmllbGQuVHlwZV9fYyA9PSAnRGF0ZVRpbWUnIHx8IGZpZWxkLlR5cGVfX2MgPT0gJ1RpbWUnKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5pbnB1dCA9IG5ldyBEYXRlKHY/LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1pZihmaWVsZC5UeXBlX19jID09PSAnRHJvcGRvd24nIHx8IGZpZWxkLlR5cGVfX2MgPT09ICdSYWRpbycpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2VsZWN0ZWRWYWx1ZSA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5pbnB1dCA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuaW5wdXQgPSB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGRhdGUscmVmZXJlbmNlUXVlc3Rpb25zKTsvL1NLUyAyN1NFUDI0IGVhY2ggZXZlbnQgYWRkZWQgdG8gYWxsRXZlbnRzIGFycmF5XG4gICAgICAgICAgICAgICAgICAgIH0pICBcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5hZGRFdmVudChkYXRlLHJlZmVyZW5jZVF1ZXN0aW9ucyk7IC8vdGhpcyBpcyBvbmx5IGxhc3QgZXZlbnQgYWRkZWQgdG8gYWxsRXZlbnRzIGFycmF5XG4gICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gdGhpcy5hbGxFdmVudHMubGVuZ3RoID4gMCA/IHRoaXMuYWxsRXZlbnRzIDogJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFZEIDIzIE9jdDI0IC0gZmlsZSB0eXBlIGNoYW5nZXNcbiAgICAgICAgICBlbHNlIGlmKHF1ZXMuVHlwZV9fYyA9PT0gJ0ZpbGUnKXtcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSBbXTtcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hbnN3ZXJMaXN0LnB1c2gocXVlcyk7IC8vIEhBIDEyRkVCMjQgVG8gZ2l2ZSB0aGUgdmFsdWUgZm9yIGRhdGFcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgY29uc3QgcXVlc3Rpb24gPSB7fTtcbiAgICAgIHF1ZXN0aW9uWydpZCddID0gcXVlcy5JZDtcbiAgICAgIC8vIHF1ZXN0aW9uWydRdWVzdGlvbl9fYyddID0gcXVlcy5RdWVzdGlvbl9fYztcbiAgICAgIHF1ZXN0aW9uWydpbnB1dCddID0gcXVlcy5pbnB1dDtcbiAgICAgIC8vIEhBIDEyRkVCMjQgVG8gYmluZC1vdXQgTG9jYXRpb24gVHlwZVxuICAgICAgaWYocXVlcy5UeXBlX19jID09PSAnTG9jYXRpb24nKXtcbiAgICAgICAgcXVlc3Rpb25bJ2lucHV0J10gPSBxdWVzLmlucHV0ID8gcXVlcy5pbnB1dCA6IHF1ZXMuc2VsZWN0ZWRWYWx1ZTtcbiAgICAgIH1lbHNlIGlmKHF1ZXMuVHlwZV9fYyA9PSAnRmlsZScpe1xuICAgICAgICAgLy8gVkQgMjMgT2N0MjQgLSBmaWxlIHR5cGUgY2hhbmdlc1xuICAgICAgICBxdWVzdGlvblsnaW5wdXQnXSA9IHF1ZXMuaW5wdXQgPyBxdWVzLmlucHV0IDogW107XG4gICAgICB9XG4gICAgICBxdWVzdGlvblsnVHlwZV9fYyddID0gcXVlcy5UeXBlX19jO1xuICAgICAgcXVlc3Rpb25bJ1F1ZXN0aW9uX05vX19jJ10gPSBxdWVzLlF1ZXN0aW9uX05vX19jO1xuICAgICAgcXVlc3Rpb25bJ1JlZmVyZW5jZV9GaWVsZF9fYyddID0gcXVlcz8uUmVmZXJlbmNlX0ZpZWxkX19jO1xuICAgICAgdGhpcy5hbnN3ZXJMaXN0LnB1c2gocXVlc3Rpb24pO1xuICAgIH1cbiAgfVxuLy8gVkQgMTctREVDLTIwMjQgLSBWYWxkaWF0aW9uIGNoYW5nZXMoRXJyb3IgQmluZGluZylcbiAgaGFuZGxlUXVlc1ZhbGlkYXRpb24ocXVlczogYW55KXtcbiAgICBpZih0aGlzLmVycm9yQmluZCAmJiBPYmplY3Qua2V5cyh0aGlzLmVycm9yQmluZCkubGVuZ3RoID4gMCl7XG4gICAgICBmb3IobGV0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lcnJvckJpbmQpKXtcbiAgICAgICAgbGV0IHZhbHVlOmFueSA9IHZhbDtcbiAgICAgICAgaWYocXVlcy5SZWZlcmVuY2VfRmllbGRfX2MgPT09IGtleSl7XG4gICAgICAgICAgaWYodmFsdWUpe1xuICAgICAgICAgICAgcXVlcy5lcnJvciA9IHRydWU7XG4gICAgICAgICAgICBxdWVzLkVycm9yX01lc3NhZ2VfX2MgPSB2YWx1ZTtcbiAgICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICBxdWVzLmVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICBxdWVzLkVycm9yX01lc3NhZ2VfX2MgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzIGZvciBkYXRhIGJpbmRJblxuICBhZGRFdmVudChkYXk6IGFueSwgZW50cnlRdWVzKSB7XG4gICAgLy8gVHJhbnNmb3JtIG5ldyBlbnRyaWVzIGludG8gdGhlIGRlc2lyZWQgZm9ybWF0XG4gICAgY29uc3QgbmV3RW50cmllcyA9IGVudHJ5UXVlcy5yZWR1Y2UoKGFjYywgcSkgPT4ge1xuICAgICAgICBhY2NbcS5JZF0gPSB7IC4uLnEgfTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICAvLyBGaW5kIGlmIGFuIGV2ZW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gZGF0ZVxuICAgIGNvbnN0IGV4aXN0aW5nRXZlbnQgPSB0aGlzLmFsbEV2ZW50cy5maW5kKGV2ZW50ID0+IGV2ZW50LmRhdGUudG9EYXRlU3RyaW5nKCkgPT09IGRheS50b0RhdGVTdHJpbmcoKSk7XG5cbiAgICBpZiAoZXhpc3RpbmdFdmVudCkge1xuICAgICAgICAvLyBJZiB0aGUgZXZlbnQgZXhpc3RzLCBwdXNoIHRoZSBuZXcgZW50cmllcyB0byB0aGUgZXhpc3RpbmcgZW50cmllc1xuICAgICAgICBjb25zdCBleGlzdGluZ0VudHJpZXMgPSBleGlzdGluZ0V2ZW50LmVudHJpZXMubWFwKGVudHJ5ID0+ICh7IC4uLmVudHJ5IH0pKTtcbiAgICAgICAgZXhpc3RpbmdFbnRyaWVzLnB1c2gobmV3RW50cmllcyk7XG4gICAgICAgIGV4aXN0aW5nRXZlbnQuZW50cmllcyA9IGV4aXN0aW5nRW50cmllcztcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgZXZlbnQgaWYgaXQgZG9lc24ndCBleGlzdCBmb3IgdGhlIGdpdmVuIGRhdGVcbiAgICAgICAgY29uc3QgbmV3RXZlbnQgPSB7XG4gICAgICAgICAgICBpZDogJ18nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpLFxuICAgICAgICAgICAgZGF0ZTogZGF5LFxuICAgICAgICAgICAgZW50cmllczogW25ld0VudHJpZXNdIC8vIFdyYXAgdGhlIG5ldyBlbnRyaWVzIGluIGFuIGFycmF5XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWxsRXZlbnRzLnB1c2gobmV3RXZlbnQpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdhbGwgZXZlbnRzIGJvb2tsZXQnKTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmFsbEV2ZW50cyk7XG59XG5cblxuICByZWFkUXVlc3Rpb25zKHFiSWQ6IHN0cmluZykge1xuICAgIC8vIGNvbnNvbGUubG9nKCdpbnNpZGUgQm9va2xldENvbXBvbmVudC5yZWFkUXVlc3Rpb25zICcgKyBxYklkKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmJvb2tRdWVzdGlvbnNNYXAuc2l6ZSk7XG4gICAgbGV0IHF1ZXN0aW9ucyA9IFtdO1xuICAgIC8vIEhBIDMxLUpBTi0yNCBBZGRlZCB0ZXJuYXJ5IHRvIGF2b2lkIHVuZGVmaW5lZFxuICAgIGZvcih2YXIgc3EgaW4gdGhpcy5ib29rUXVlc3Rpb25zTWFwPy5nZXQocWJJZCk/LlF1ZXN0aW9uc19fcj8ucmVjb3Jkcykge1xuICAgICAgbGV0IHE6IFF1ZXN0aW9uID0gdGhpcy5ib29rUXVlc3Rpb25zTWFwPy5nZXQocWJJZCkuUXVlc3Rpb25zX19yLnJlY29yZHNbc3FdO1xuICAgICAgLy8gSEEgMDlGRUIyNCBpZiBxdWVzdGlvbiBpcyB0aGVyZSBwcm9jZXNzXG4gICAgICBpZihxKXtcbiAgICAgICAgaWYoKHEuVHlwZV9fYyA9PSAnRHJvcGRvd24nIHx8IHEuVHlwZV9fYyA9PSAnUmFkaW8nKSAmJiB0aGlzLnNxT3B0aW9ucy5nZXQocS5JZCkpIHtcbiAgICAgICAgICBxdWVzdGlvbnMucHVzaCh0aGlzLnNxT3B0aW9ucy5nZXQocS5JZCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXN0aW9ucy5wdXNoKHEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVkQgMTJKdW4yNCBmaWVsZCBwZXJtaXNpc2lvbiBjaGFuZ2VzXG4gICAgaWYgKHRoaXMuZmllbGRSZXN0cmljdGlvbnMpIHtcbiAgICAgIGNvbnN0IGZpZWxkUmVzdHJpY3Rpb25zID0gbmV3IE1hcChPYmplY3QuZW50cmllcyh0aGlzLmZpZWxkUmVzdHJpY3Rpb25zLmZpZWxkcykpO1xuICAgICAgcXVlc3Rpb25zLmZvckVhY2gocXVlcyA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdHJpY3Rpb24gPSBmaWVsZFJlc3RyaWN0aW9ucy5nZXQocXVlcy5VbmlxdWVfSWRlbnRpZmllcl9fYyk7XG4gIFxuICAgICAgICAgIGlmIChyZXN0cmljdGlvbikge1xuICAgICAgICAgICAgICBxdWVzLlJlYWRfT25seV9fYyA9IHJlc3RyaWN0aW9uID09PSAncmVhZE9ubHknO1xuICAgICAgICAgICAgICBxdWVzLklzX0hpZGVfX2MgPSByZXN0cmljdGlvbiA9PT0gJ2hpZGUnO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG4gICAgLy8gY29uc29sZS5sb2cocXVlc3Rpb25zKTtcbiAgICByZXR1cm4gcXVlc3Rpb25zO1xuICB9XG4gLy8gVkQgMTFKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXNcbiAgcmVhZFRyYW5zUXVlc3Rpb25zKHFiSWQ6IHN0cmluZyl7XG4gICAgbGV0IHJlY29yZCA9IFtdO1xuICAgICAgbGV0IHRyYW5zbGF0ZVJlY29yZCA9IHRoaXMudHJhbnNsYXRlTWFwLmdldChxYklkKTtcbiAgICAgaWYodHJhbnNsYXRlUmVjb3JkICYmIHRyYW5zbGF0ZVJlY29yZC5sZW5ndGggPiAwKSB7XG4gICAgICB0cmFuc2xhdGVSZWNvcmQuZm9yRWFjaChsYW5SZWMgPT4ge1xuICAgICAgICBpZihsYW5SZWMubGFuZ3VhZ2VDb2RlID09IHRoaXMubGFuZ3VhZ2VDb2RlKXtcbiAgICAgICAgICAgcmVjb3JkID0gbGFuUmVjLmZpZWxkc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgfVxuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgfVxuXG4gIGdldFRleHQodmFsdWUpIHtcbiAgICB2YXIgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh2YWx1ZSwgXCJ0ZXh0L2h0bWxcIik7XG4gICAgLy9jb25zb2xlLmxvZyggZG9jLmRvY3VtZW50RWxlbWVudC50ZXh0Q29udGVudCk7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKFxuICAgICAgZG9jLmRvY3VtZW50RWxlbWVudC50ZXh0Q29udGVudFxuICAgICk7XG4gIH1cbi8vIFZEIDE3LURFQy0yMDI0IC0gQ3VzdG9tIFZhbGRpYXRpb24gY2hhbmdlc1xuICBoYW5kbGVRdWVzdGlvbnNWYWwocXVlc3Rpb25zOmFueSl7XG4gICAgaWYocXVlc3Rpb25zLmxlbmd0aCA+IDApe1xuICAgICAgcXVlc3Rpb25zLmZvckVhY2gocXVlcyA9PiB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWFwLnNldChxdWVzLlJlZmVyZW5jZV9GaWVsZF9fYyxxdWVzLmlucHV0KTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Qm9vayA9IHRoaXMuYm9va2xldC5maW5kKHJlY29yZCA9PiByZWNvcmQuSWQgPT09IHF1ZXMuUXVlc3Rpb25fQm9va19fYyk7XG4gICAgICAgICAgY29uc3QgY3VzdG9tVmFsaWRhdGlvbkNvZGUgPSBjdXJyZW50Qm9vaz8uVmFsaWRhdGlvbl9NYXBfX2M7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgICAgICB2YWxpZGF0aW9uTWFwOiB0aGlzLnZhbGlkYXRpb25NYXAsXG4gICAgICAgICAgICAgIHF1ZXM6IHF1ZXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuY29kZUV4ZWN1dGlvblNlcnZpY2UuZXhlY3V0ZUNvZGUoY3VzdG9tVmFsaWRhdGlvbkNvZGUsIGNvbnRleHQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGdldERyb3BEb3duKGV2ZW50OmFueSl7XG4gICAgdGhpcy5oYWRsZURyb3BEb3duRGVwZW5kZW50LmVtaXQoZXZlbnQpO1xuICB9XG4gLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gIGdldENhbGVuZGFyRGF0ZShldmVudDphbnkpe1xuICAgIHRoaXMuaGFuZGxlQ2FsZW5kYXJEYXRlLmVtaXQoZXZlbnQpO1xuICB9XG4gIGdldENhbGVuZGFyRXZlbnQoZXZlbnQ6YW55KXtcbiAgICBldmVudFtcIm54dElkXCJdPSBPYmplY3Qua2V5cyh0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwKVswXTtcbiAgICB0aGlzLmhhbmRsZUNhbGVuZGFyRXZlbnQuZW1pdChldmVudCk7XG4gIH1cbn1cbiIsIjxuZ3gtc3Bpbm5lciBzaXplPVwibWVkaXVtXCIgW25hbWVdPVwic3Bpbm5lck5hbWVcIiBbdHlwZV09XCJzcGlubmVyVHlwZVwiPjwvbmd4LXNwaW5uZXI+XG48IS0tIEJvb2tsZXQgSGFuZGxpbmctLT5cbjwhLS0gSEEgMTlERUMyMyBGb3IgRGlyZWN0aW9uIC0tPlxuPGRpdiAqbmdGb3I9XCJsZXQgcWIgb2YgYm9va2xldFwiIFtuZ0NsYXNzXT1cImxhbmdEaXJlY3Rpb25cIj5cbiAgICA8IS0tIE1SIENvbW1lbnRlZCBiZWxvdyBjb2RlIHRvIGVuc3VyZSBzaW5nbGUgSlNPTiBmb3IgVU5DT05ESVRJT05BTCBCb29rbGV0cyAtLT5cbiAgICA8IS0tIDxsaWItcXVlc3Rpb25uYWlyZSBbc2Vydl09XCJzZXJ2XCIgW3FiSWRdPVwicWIuSWRcIiBbdGtuXT1cInRrblwiPjwvbGliLXF1ZXN0aW9ubmFpcmU+IC0tPlxuICAgIDwhLS0gSEEgMjhERUMyMyBCZWxvdyBJZiBsb2dpYyBpcyB0byBsb2FkIGZyb20gYm9va2xldCAgLS0+XG4gICAgPGRpdiAqbmdJZj1cInFiLlF1ZXN0aW9uc19fcj8ucmVjb3JkczsgZWxzZSBlbHNlQmxvY2tcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcXVlcyBvZiBxYi5RdWVzdGlvbnNfX3IucmVjb3Jkc1wiIGNsYXNzPVwicXVlc3Rpb25kaXYxXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gSEEgMTdKQU4yNCAtIElzIHRpdGxlIGlzIGVuYWJsZWQgc28gdGhhdCBiYXNlZCBvbiB0aGUgYm9vbGVhbiBkaXYgd2lsbCBiZSB2aXNpYmxlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLklzX1RpdGxlX19jXCIgW2NsYXNzXT1cInFiLmlzU2hlbmdlbF9fYyA/ICdoZWFkZXItc3R5bGUnIDogJ3F1ZXN0aW9uLWYtc2l6ZSBhZGRpdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIFZEIDA4Tk9WMjMgLSBzaG93aW5nIGxhYmxlIHdoZW4gaXRzIGF2YWlsYWJsZS0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZ2V0VGV4dChxdWVzPy5RdWVzdGlvbl9UZXh0X19jKVwiICpuZ0lmPVwicXVlcz8uUXVlc3Rpb25fVGV4dF9fY1wiID4gXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBxdWVzPy5RdWVzdGlvbl9UZXh0X19jIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PiA8IS0tIFZEIDE5SkFOMjQgLSBnZXR0aW5nIHRva2VuIGFzIGlucHV0IC0tPiA8IS0tVkQgMTFKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXMtLT5cbiAgICAgICAgICAgICAgICA8IS0tVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzLS0+IFxuICAgICAgICAgICAgICAgIDxsaWItcXVlc3Rpb25ib29rIFtxYkl0ZW1dPVwicWJcIiBbdG9rZW5dPVwidG9rZW5cIiBcbiAgICAgICAgICAgICAgICBbbGFiZWxWYWx1ZV09XCJsYWJlbFZhbHVlXCIgXG4gICAgICAgICAgICAgICAgW3F1ZXN0aW9uSXRlbV09XCJxdWVzXCIgXG4gICAgICAgICAgICAgICAgW3RyYW5zbGF0ZWRRdWVzdGlvbnNdPVwicmVhZFRyYW5zUXVlc3Rpb25zKHFiLklkKVwiIFxuICAgICAgICAgICAgICAgIFtxdWVzdGlvbnNdPVwicmVhZFF1ZXN0aW9ucyhxYi5JZClcIiAgXG4gICAgICAgICAgICAgICAgKGhhbmRsZURyb3BEb3duKT1cImdldERyb3BEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChoYW5kbGVDYWxlbmRhckRhdGUpPVwiZ2V0Q2FsZW5kYXJEYXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChoYW5kbGVDYWxlbmRhckV2ZW50KT1cImdldENhbGVuZGFyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGhhbmRsZVZhbGlkYXRpb24pPVwiaGFuZGxlUXVlc3Rpb25zVmFsKCRldmVudClcIlxuICAgICAgICAgICAgICAgID48L2xpYi1xdWVzdGlvbmJvb2s+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBIQSAyOERFQzIzIEJlbG93IGVsc2UgbG9naWMgaXMgdG8gbG9hZCBmcm9tIGJvb2tzIG9yIHF1ZXN0aW9ucyAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jaz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1ZXN0aW9uZGl2MVwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXFiLklzX1RpdGxlX19jXCIgW2NsYXNzXT1cInFiLmlzU2hlbmdlbF9fYyA/ICdoZWFkZXItc3R5bGUnIDogJ3F1ZXN0aW9uLWYtc2l6ZSBhZGRpdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIFZEIDA4Tk9WMjMgLSBzaG93aW5nIGxhYmxlIHdoZW4gaXRzIGF2YWlsYWJsZS0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZ2V0VGV4dChxYj8uUXVlc3Rpb25fVGV4dF9fYylcIiAqbmdJZj1cInFiPy5RdWVzdGlvbl9UZXh0X19jXCIgPiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHFiPy5RdWVzdGlvbl9UZXh0X19jIH19XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBxYj8uVGl0bGVfX2MgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+IDwhLS0gVkQgMTlKQU4yNCAtIGdldHRpbmcgdG9rZW4gYXMgaW5wdXQgLS0+IDwhLS0gIC8vIFZEIDExSnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzLS0+XG4gICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbmJvb2sgW3FiSXRlbV09XCJxYlwiIFt0b2tlbl09XCJ0b2tlblwiIFtsYWJlbFZhbHVlXT1cImxhYmVsVmFsdWVcIiBbcXVlc3Rpb25JdGVtXT1cInFiXCIgW3RyYW5zbGF0ZWRRdWVzdGlvbnNdPVwicmVhZFRyYW5zUXVlc3Rpb25zKHFiLklkKVwiIFtxdWVzdGlvbnNdPVwicmVhZFF1ZXN0aW9ucyhxYi5JZClcIiAgKGhhbmRsZURyb3BEb3duKT1cImdldERyb3BEb3duKCRldmVudClcIj48L2xpYi1xdWVzdGlvbmJvb2s+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuXG48IS0tIEdyb3VwIEFjdGlvbnMgLS0+XG48IS0tIEhBIDE5REVDMjMgRm9yIERpcmVjdGlvbiAtLT5cbjxkaXYgY2xhc3M9XCJhbGlnbi1zdWJtaXQtcm93XCIgKm5nSWY9XCJhYkl0ZW0/LlN0YXR1c19fYyAhPSAnQ29tcGxldGVkJ1wiIFtuZ0NsYXNzXT1cImxhbmdEaXJlY3Rpb25cIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uczsgbGV0IGkgPSBpbmRleFwiPlxuICAgIDwhLS0gLy8gSEEgMjJKQU4yNCBDb21tb25pc2UgdGhlIGJ1dHRvbiBzdHlsZSBpbiBmdXNpb24gLS0+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUJvb2tsZXRBY3Rpb25DbGljayhhY3Rpb24pXCIgbmdDbGFzcz1cImJ0biBidG4tcHJpbWFyeSBmYy1idXR0b24gbnh0QnV0dG9uXCI+XG4gICAgICAgICAgICB7eyBhY3Rpb24ubmFtZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
541
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2xldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYm9va2xldC9ib29rbGV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9ib29rbGV0L2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFJVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FJYixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBa0J2QixNQUFNLE9BQU8sZ0JBQWdCO0lBbUNqQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFFRDtJQXpDQSxTQUFTLENBQVM7SUFDbEIsSUFBSSxDQUFTO0lBQ2IsR0FBRyxDQUFTO0lBQ1osV0FBVyxDQUFNO0lBQ2pCLHFCQUFxQixDQUFLO0lBQzFCLFVBQVUsQ0FBUTtJQUNsQixLQUFLLENBQVE7SUFDYixZQUFZLENBQVEsQ0FBRSxtQ0FBbUM7SUFDekQsaUJBQWlCLENBQU0sQ0FBQyx1Q0FBdUM7SUFDOUQsd0JBQXdCLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFDakUsVUFBVSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ25ELHNCQUFzQixHQUFxQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ3pFLDhCQUE4QjtJQUNuQixrQkFBa0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMzRCxtQkFBbUIsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUUvRCxVQUFVLENBQWlCO0lBRTNCLE9BQU8sR0FBVSxFQUFFLENBQUM7SUFDcEIsTUFBTSxHQUFRLEVBQUUsQ0FBQztJQUNqQixPQUFPLEdBQWlCLEVBQUUsQ0FBQztJQUMzQixnQkFBZ0IsR0FBUSxJQUFJLEdBQUcsRUFB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Q0QsV0FBVyxDQUFDLEtBQVM7UUFDbkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0YsOEJBQThCO0lBQzdCLGVBQWUsQ0FBQyxLQUFTO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELGdCQUFnQixDQUFDLEtBQVM7UUFDeEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQzt1R0F2Z0JVLGdCQUFnQjsyRkFBaEIsZ0JBQWdCLDZqQkM3QjdCLHd6R0EwREE7OzJGRDdCYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsYUFBYTtzU0FLZCxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0ksd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBZ0JFLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEVsZW1lbnRSZWYsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTYWxlc2ZvcmNlU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zYWxlc2ZvcmNlLnNlcnZpY2VcIjtcbmltcG9ydCB7IERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcbmltcG9ydCB7IEFjdGlvbk1ldGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2FjdGlvbk1ldGEnO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vLi4vd3JhcHBlclwiO1xuaW1wb3J0IHsgQm9va2xldFdyYXBwZXIgfSBmcm9tIFwiLi4vLi4vbW9kZWwvYm9va2xldFdyYXBwZXJcIjtcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5nZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvY2hhbmdlLnNlcnZpY2VcIjtcbi8vIEhBIDE5REVDMjMgaW1wb3J0ZWQgdHJhbnNsYXRpb24gc2VydmljZVxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vaTE4bi5zZXJ2aWNlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1ib29rbGV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ib29rbGV0LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCb29rbGV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgYm9va2xldElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNlcnY6IHN0cmluZztcbiAgQElucHV0KCkgdGtuOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJvb2tsZXRKU09OOiBhbnk7XG4gIEBJbnB1dCgpIGRyb3Bkb3duRGVwZW5kZW50RGF0YTphbnk7XG4gIEBJbnB1dCgpIGxhYmVsVmFsdWU6c3RyaW5nO1xuICBASW5wdXQoKSB0b2tlbjpzdHJpbmc7XG4gIEBJbnB1dCgpIGxhbmd1YWdlQ29kZTpzdHJpbmc7ICAvLyBWRCAxMUp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICBASW5wdXQoKSBmaWVsZFJlc3RyaWN0aW9uczogYW55OyAvLyBWRCAxMkp1bjI0IC0gZmllbGQgcGVybWlzc2lvbiBjaGFuZ2VcbiAgQE91dHB1dCgpIGhhbmRsZUJvb2tsZXRBY3Rpb25FdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBoYW5kbGVQYWdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGhhZGxlRHJvcERvd25EZXBlbmRlbnQ6RXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gIEBPdXRwdXQoKSBoYW5kbGVDYWxlbmRhckRhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaGFuZGxlQ2FsZW5kYXJFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljIG54dEJvb2tsZXQ6IEJvb2tsZXRXcmFwcGVyO1xuXG4gIHB1YmxpYyBib29rbGV0OiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgYWJJdGVtOiBhbnkgPSB7fTtcbiAgcHVibGljIGFjdGlvbnM6IEFjdGlvbk1ldGFbXSA9IFtdO1xuICBwdWJsaWMgYm9va1F1ZXN0aW9uc01hcDogYW55ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgdHJhbnNsYXRlTWFwOiBhbnkgPSBuZXcgTWFwKCk7ICAvLyBWRCAxMUp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICBwcml2YXRlIHNxT3B0aW9uczogYW55ID0gbmV3IE1hcCgpO1xuICBwdWJsaWMgaXNBbnN3ZXJGbGFnOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBzcGlubmVyTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgc3Bpbm5lclR5cGU6IHN0cmluZztcbiAgLy8gSEEgMTlERUMyMyBsYW5nRGlyZWN0aW9uIHZhcmlhYmxlIGlzIGNyZWF0ZWQgdG8gYXNzaWduIHRoZSBkaXJlY3Rpb24gYXMgY2xhc3NcbiAgbGFuZ0RpcmVjdGlvbiA9ICdsdHInOyAvLyBIQSAyOERFQzIzIG1ha2luZyBsdHIgYXMgZGVmYXVsdCBkaXJlY3Rpb25cbiAgYW5zd2VyTGlzdCA9IFtdOyAvLyBIQSAxMS1KQU4tMjQgQW5zd2VybGlzdCB0byBzdG9yZSB0aGUgbWluaW1hbCB2YWx1ZVxuICBASW5wdXQoKSBkYXRhQmluZDphbnk7Ly8gSEEgMTgtSkFOLTI0IFRvIGluc2VydCB0aGUgZW5kcG9pbnQgdmFsdWUgdG8gdGhlIHF1ZXN0aW9uXG4gIGFsbEV2ZW50czphbnlbXT1bXTsgIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZlNlcnZpY2U6IFNhbGVzZm9yY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjaGFuZ2VTZXJ2aWNlOiBDaGFuZ2VTZXJ2aWNlLCBcbiAgICBlbDogRWxlbWVudFJlZixcbiAgICBwdWJsaWMgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlXG4gICkgeyBcbiAgICB0aGlzLnNwaW5uZXJOYW1lID0gXCJzcDFcIjtcbiAgICB0aGlzLnNwaW5uZXJUeXBlID0gXCJiYWxsLXNwaW4tY2xvY2t3aXNlXCI7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbi8vICBWRCAxMkphbjI0IGZpZWxkUmVzdHJpY3Rpb25zIGZvcm1hdGUgXG4gIC8vICAge1xuICAvLyAgICAgXCJmaWVsZHNcIiA6IHtcbiAgLy8gICAgICAgICBcInRyYW5zUWItMDFcIiA6IFwicmVhZE9ubHlcIixcbiAgLy8gICAgICAgICBcIlRyYW5zRmlyMDJcIiA6IFwiXCIsXG4gIC8vICAgICAgICAgXCJUcmFuc0xhc3QwM1wiIDogXCJyZWFkT25seVwiLFxuICAvLyAgICAgICAgIFwiYmsyLXEyXCIgOiBcImhpZGVcIlxuICAvLyAgICAgfVxuICAvLyAgfVxuXG4gICAgLy8gSEEgMTgtSkFOLTI0IER1bW15IFN0YXRpYyBkYXRhIGZvciB0ZXN0aW5nXG4gICAgLy8gdGhpcy5kYXRhQmluZCA9IHtcbiAgICAvLyAgIFwiX2lkXCI6IFwiNjU5ZWQwMDJlZDUxYmI4MDYxNTQ0MjU1XCIsXG4gICAgLy8gICBcImNvbXBhbnlJZFwiOiBcIjV1bGxoMUJXcFlxbnZ6S2g5TFwiLFxuICAgIC8vICAgXCJuYW1lXCI6IFwiQWwgWWFzbWluZVwiLFxuICAgIC8vICAgXCJjb2RlXCI6IFwiY2hlY2tcIixcbiAgICAvLyAgIFwic3RhdHVzXCI6IFwiSW4tUHJvZ3Jlc3NcIixcbiAgICAvLyAgIFwiY3JlYXRlZEF0XCI6IFwiMjAyNC0wMS0xMFQxNzoxMjozNC42ODZaXCIsXG4gICAgLy8gICBcInVwZGF0ZWRBdFwiOiBcIjIwMjQtMDEtMTBUMTk6NTM6MDguMTM1WlwiLFxuICAgIC8vICAgXCJfX3ZcIjogMCxcbiAgICAvLyAgIFwib3duZXJcIjogXCJjaGVja1wiLFxuICAgIC8vICAgXCJjdXN0b21lclwiOiBcImNoZWNrXCIsXG4gICAgLy8gICBcImRhdGlcIjogXCIyMDI0LTAxLTIzVDE4OjMwOjAwLjAwMFpcIixcbiAgICAvLyAgIFwidGltaVwiOiBcIjIwMjQtMDEtMjNUMTg6MzA6MDAuMDAwWlwiLFxuICAgIC8vIFwiZk5hbWVcIjogXCJIYWlkZXJcIixcbiAgICAvLyBcImxOYW1lXCI6IFwiQWxpXCIsXG4gICAgLy8gXCJkZWZhdWx0QXBwXCI6IFwiTlhUXCIsXG4gICAgLy8gXCJlbWFpbFwiOiBcImhhaWRlckBnbWFpbC5jb21cIixcbiAgICAvLyBcImxvY2F0aW9uXCI6IHthZGRyZXNzOiBcIjEwNywgQXNob2sgTmFnYXIsIEthZHVnb25kYW5haGFsbGksIEJlbmdhbHVydSwgS2FybmF0YWthIDU2MDA0NSwgSW5kaWFcIixcbiAgICAvLyAgIGxhdGl0dWRlOiAxMy4wMjAwNTc1LFxuICAgIC8vICAgbG9uZ2l0dWRlOiA3Ny42MTI5ODE2fSxcbiAgICAvLyBcImxvY2F0aW9uXCI6IFwiMTA3LCBBc2hvayBOYWdhciwgS2FkdWdvbmRhbmFoYWxsaSwgQmVuZ2FsdXJ1LCBLYXJuYXRha2EgNTYwMDQ1LCBJbmRpYVwiLFxuICAgIC8vIFwidGV4dEFyZWFcIjogXCJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW1cIixcbiAgICAvLyB9O1xuICAgICAgICB0aGlzLnByb2Nlc3NCb29rbGV0KCk7XG4gIH1cbiAvLyBWRCBOT1YyMyAtIHVwZGF0ZSB0aGUganNvbiBkYXRhIHdoZW4gYm9va2xldElkIGFuZCBib29rbGV0SlNPTiBjaGFuZ2VzXG4gIG5nT25DaGFuZ2VzKHNpbXBsZWNoYW5nZXM6U2ltcGxlQ2hhbmdlcykge1xuICAgLy8gSEEgMjNKQU4yNCBUbyBhdm9pZCB1bmRlZmluZWQgZXJyb3JcbiAgIGlmKHNpbXBsZWNoYW5nZXNbJ2Jvb2tsZXRJZCddIHx8IChzaW1wbGVjaGFuZ2VzWydib29rbGV0SlNPTiddICYmIChzaW1wbGVjaGFuZ2VzWydib29rbGV0SlNPTiddLmN1cnJlbnRWYWx1ZSAhPSBudWxsIHx8IHNpbXBsZWNoYW5nZXNbJ2Jvb2tsZXRKU09OJ10uY3VycmVudFZhbHVlICE9IHVuZGVmaW5lZCkpIHx8IChzaW1wbGVjaGFuZ2VzWydkYXRhQmluZCddICYmIChzaW1wbGVjaGFuZ2VzWydkYXRhQmluZCddLmN1cnJlbnRWYWx1ZSAhPSBudWxsIHx8IHNpbXBsZWNoYW5nZXNbJ2RhdGFCaW5kJ10uY3VycmVudFZhbHVlICE9IHVuZGVmaW5lZCkpICl7XG4gICAgICB0aGlzLmFsbEV2ZW50cyA9IFtdO1xuICAgICAgdGhpcy5wcm9jZXNzQm9va2xldCgpO1xuICAgIH1cbiAgICAvLyBpZih0aGlzLmJvb2tsZXQgPT0gdW5kZWZpbmVkIHx8IHRoaXMuYm9va2xldC5sZW5ndGggPT0gMCkge1xuICAgIC8vICAgdGhpcy5wcm9jZXNzQm9va2xldCgpO1xuICAgIC8vIH1cbiAgfVxuXG4gIHByb2Nlc3NCb29rbGV0KCkge1xuICAgIGlmICh0aGlzLmJvb2tsZXRJZCkge1xuICAgICAgaWYgKHRoaXMuYm9va2xldElkLmxlbmd0aCA9PSAxOCkge1xuICAgICAgICB0aGlzLnJlYWRCb29rbGV0KHRoaXMuYm9va2xldElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodGhpcy5ib29rbGV0SlNPTikge1xuICAgICAgLy8gVHJ5IHRvIHBhc3MgYSB2YWx1ZSBmcm9tIEJhY2tlbmQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgUXVlc3Rpb25Cb29rIFJlYWQgYW5kIEFuc3dlckJvb2sgUmVhZFxuICAgICAgdGhpcy5pc0Fuc3dlckZsYWcgPSB0cnVlO1xuXG4gICAgICBpZih0aGlzLmJvb2tsZXRKU09OICE9IG51bGwgfHwgdGhpcy5ib29rbGV0SlNPTiAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTdG9yaW5nIHRoZSBBUEkgcmVzcG9uc2UgZm9yIGZ1dHVyZSB1c2VcbiAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUodGhpcy5ib29rbGV0SlNPTik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYm9va2xldCA9IHRoaXMuYm9va2xldEpTT04ucmVjb3JkcztcbiAgICAgIHRoaXMuYWJJdGVtID0gdGhpcy5ib29rbGV0SlNPTi5hbnN3ZXJib29rO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBTdWIgUXVlc3Rpb24gT3B0aW9ucyAtIFRoaXMgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIGJvb2tRdWVzdGlvbnNNYXAgaW4gZnV0dXJlXG4gICAgICBmb3IgKHZhciBzcSBpbiB0aGlzLmJvb2tsZXRKU09OLnNxT3B0aW9ucykge1xuICAgICAgICB0aGlzLnNxT3B0aW9ucy5zZXQoc3EsIHRoaXMuYm9va2xldEpTT04uc3FPcHRpb25zW3NxXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIFF1ZXN0aW9uc1xuICAgICAgLy8gSEEgMjhERUMyMyB0aGlzIGFwcGxpZXMgZm9yIGJvb2tsZXRcbiAgICAgIC8vIEhBIDE3SkFOMjQgQWRkZWQgdGVybmFyeSBvcGVyYXRvciB0byBhdm9pZCB1bmRlZmluZWQgc2NlbmFyaW9cbiAgICAgIC8vIEhBIDA5RkVCMjQgQWRkaW5nIGNvbmRpdGlvbiB0byBhdm9pZCB1bmRlZmluZWQgZXJyb3JcbiAgICAgIGlmKHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXAgJiYgT2JqZWN0LmtleXModGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcCkubGVuZ3RoID4gMCl7XG4gICAgICAgIGZvciAodmFyIHZhbHVlIGluIHRoaXMuYm9va2xldEpTT04uYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgICAgIHRoaXMuYm9va1F1ZXN0aW9uc01hcC5zZXQodmFsdWUsIHRoaXMuYm9va2xldEpTT04uYm9va1F1ZXN0aW9uc01hcFt2YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBIQSAyOERFQzIzIHRoaXMgYXBwbGllcyBmb3IgYm9vayBvciBxdWVzdGlvbnNcbiAgICAgIGVsc2V7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICAvLyBIQSAwOUZFQjI0IEFkZGVkIHRlcm5hcnlcbiAgICAgICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgICAgICAgdmFsdWUgPSB0aGlzLmJvb2tsZXRKU09OLnJlY29yZHNbMF0/LmlkO1xuICAgICAgICB0aGlzLmJvb2tRdWVzdGlvbnNNYXAuc2V0KHZhbHVlLCB0aGlzLmJvb2tsZXRKU09OLnF1ZXN0aW9uYm9vayk7XG4gICAgICB9XG4gICAgICBcbiAgICAgICAvLyBWRCAyMEp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICAgICAgIGZvciAodmFyIHZhbHVlIGluIHRoaXMuYm9va2xldEpTT04/LnRyYW5zbGF0aW9uTWFwKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlTWFwLnNldCh2YWx1ZSwgdGhpcy5ib29rbGV0SlNPTi50cmFuc2xhdGlvbk1hcFt2YWx1ZV0pO1xuICAgICAgfVxuICAgICAvLyBWRCAzMU5PVjI0IHdyYXBwZXIgY2hhbmdlc1xuICAgICAgaWYodGhpcy5ib29rbGV0SlNPTi5xdWVzdGlvbmJvb2s/LmFjdGlvbiAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25zID0gSlNPTi5wYXJzZSh0aGlzLmJvb2tsZXRKU09OLnF1ZXN0aW9uYm9vay5hY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBIQSAxOURFQzIzIGxhbmdEaXJlY3Rpb24gdmFyaWFibGUgdmFsdWUgYXNzaWduaW5nXG4gICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgICBpZih0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2s/LnN0eWxlKXtcbiAgICAgIHZhciBzdHlsZSA9IEpTT04ucGFyc2UoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2s/LnN0eWxlKSkpO1xuICAgICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gc3R5bGU/LmRpcmVjdGlvbjtcbiAgICB9XG4gICAgZWxzZSBpZih0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzWzBdPy5zdHlsZSl7XG4gICAgLy8gZWxzZSBpZih0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzWzBdPy5zdHlsZSl7XG5cbiAgICAgIHZhciBzdHlsZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5ib29rbGV0SlNPTj8ucmVjb3Jkc1swXT8uc3R5bGUpKTtcbiAgICAgIHRoaXMubGFuZ0RpcmVjdGlvbiA9IHN0eWxlPy5kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgLy8gSEEgMTgtSkFOLTI0IFRoZSBjb25kaXRpb24gaXMgdXNlZCBmb3IgQmluZC1JbiBMb2dpYyBcbiAgICB0aGlzLmhhbmRsZUNvbXBsZXRlQm9va2xldCh0aGlzLmJvb2tsZXRKU09OKTsgXG4gIH1cbiAvLyBWRCAxMkp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICBwcml2YXRlIHJlYWRCb29rbGV0ID0gKHV1aWQ6IHN0cmluZykgPT4ge1xuICAgIGlmKHRoaXMuc2VydiA9PSBcImFwaVwiKSB7XG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlLmdldEFQSURhdGEoXG4gICAgICAgIHRoaXMudGtuLFxuICAgICAgICBbXCJCb29rbGV0XCIsIFwicmVhZFwiLCB1dWlkLHRoaXMubGFuZ3VhZ2VDb2RlXSxcbiAgICAgICAgdGhpcy5zdWNjZXNzUmVhZEJvb2tsZXQsXG4gICAgICAgIHRoaXMuZmFpbHVyZVJlYWRCb29rbGV0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBWRCAzMU5PVjI0IHBhcmFtIGNoYW5nZXMgd2l0aCBuZXcgbWV0aG9kXG4gICAgICBsZXQgcGFyYW1NYXAgPSB7IGNyZWF0ZUFuc3dlckJvb2tGbGFnOiBmYWxzZSB9O1xuICAgICAgcGFyYW1NYXBbJ2NfX3FiX2lkJ10gPSAnJztcbiAgICAgIHBhcmFtTWFwW1wiY19fcmVjb3JkX2lkXCJdID0gJyc7XG4gICAgICBsZXQgcGFyYSA9IHtcbiAgICAgICAgZGF0YVR5cGU6IFwiQm9va2xldFwiLFxuICAgICAgICBvcGVyYXRpb246IFwicmVhZFwiLFxuICAgICAgICBwYXJhbTE6IHV1aWQsXG4gICAgICAgIHBhcmFtSlNPTjogSlNPTi5zdHJpbmdpZnkocGFyYW1NYXApLFxuICAgICAgICBsYW5ndWFnZUNvZGUgOiB0aGlzLmxhbmd1YWdlQ29kZVxuICAgICAgfVxuICAgICAgdGhpcy5zZlNlcnZpY2UucmVtb3RlQWN0aW9uKFxuICAgICAgICBcIk54dENvbnRyb2xsZXIucHJvY2Vzc0RhdGFcIixcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHBhcmEpXSxcbiAgICAgICAgdGhpcy5zdWNjZXNzUmVhZEJvb2tsZXQsXG4gICAgICAgIHRoaXMuZmFpbHVyZVJlYWRCb29rbGV0XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3VjY2Vzc1JlYWRCb29rbGV0ID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ0luc2lkZSB0aGUgc3VjY2Vzc1JlYWRCb29rbGV0Jyk7XG4gICAgaWYocmVzcG9uc2UgIT0gbnVsbCB8fCByZXNwb25zZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFN0b3JpbmcgdGhlIEFQSSByZXNwb25zZSBmb3IgZnV0dXJlIHVzZVxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKHJlc3BvbnNlKTtcblxuICAgICAgLy8gVHJ5IHRvIHBhc3MgYSB2YWx1ZSBmcm9tIEJhY2tlbmQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgUXVlc3Rpb25Cb29rIFJlYWQgYW5kIEFuc3dlckJvb2sgUmVhZFxuICAgICAgLy8gdGhpcy5pc0Fuc3dlckZsYWcgPSB0cnVlO1xuICAgICAgXG4gICAgICB0aGlzLmJvb2tsZXQgPSByZXNwb25zZS5yZWNvcmRzO1xuICAgICAgdGhpcy5hYkl0ZW0gPSByZXNwb25zZS5hbnN3ZXJib29rO1xuICAgICAgXG4gICAgICAvLyBQcm9jZXNzIHRoZSBTdWIgUXVlc3Rpb24gT3B0aW9ucyAtIFRoaXMgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIGJvb2tRdWVzdGlvbnNNYXAgaW4gZnV0dXJlXG4gICAgICBmb3IgKHZhciBzcSBpbiByZXNwb25zZS5zcU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zcU9wdGlvbnMuc2V0KHNxLCByZXNwb25zZS5zcU9wdGlvbnNbc3FdKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VzcyB0aGUgUXVlc3Rpb25zXG4gICAgICBmb3IgKHZhciB2YWx1ZSBpbiByZXNwb25zZS5ib29rUXVlc3Rpb25zTWFwKSB7XG4gICAgICAgIHRoaXMuYm9va1F1ZXN0aW9uc01hcC5zZXQodmFsdWUsIHJlc3BvbnNlLmJvb2tRdWVzdGlvbnNNYXBbdmFsdWVdKTtcbiAgICAgIH1cbiAgICAgIC8vIFZEIDExSnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzXG4gICAgICBmb3IgKHZhciB2YWx1ZSBpbiByZXNwb25zZS50cmFuc2xhdGlvbk1hcCkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZU1hcC5zZXQodmFsdWUsIHJlc3BvbnNlLnRyYW5zbGF0aW9uTWFwW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgICAgLy8gVkQgMzFOT1YyNCB3cmFwcGVyIGNoYW5nZXNcbiAgICAgIGlmKHJlc3BvbnNlLnF1ZXN0aW9uYm9vaz8uYWN0aW9uICE9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSBKU09OLnBhcnNlKHJlc3BvbnNlLnF1ZXN0aW9uYm9vay5hY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBIQSAxOURFQzIzIGxhbmdEaXJlY3Rpb24gdmFyaWFibGUgdmFsdWUgYXNzaWduaW5nXG4gICAgaWYocmVzcG9uc2U/LnF1ZXN0aW9uYm9vaz8uc3R5bGUpe1xuICAgICAgdmFyIHN0eWxlID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlPy5xdWVzdGlvbmJvb2s/LnN0eWxlKSkpO1xuICAgICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gc3R5bGU/LmRpcmVjdGlvbjtcbiAgICB9XG4gICAgZWxzZSBpZihyZXNwb25zZT8ucmVjb3Jkc1swXT8uc3R5bGUpe1xuICAgICAgdmFyIHN0eWxlID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlPy5yZWNvcmRzWzBdPy5zdHlsZSkpKTtcbiAgICAgIHRoaXMubGFuZ0RpcmVjdGlvbiA9IHN0eWxlPy5kaXJlY3Rpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmYWlsdXJlUmVhZEJvb2tsZXQgPSAocmVzcG9uc2UpID0+IHtcblxuICB9XG5cbiAgaGFuZGxlQm9va2xldEFjdGlvbkNsaWNrKGFjdGlvbjpBY3Rpb25NZXRhKSB7XG4gICAgLy8gSEEgMTlKQU4yNCBBY3Rpb24gY2hhbmdlc1xuICAgIC8vIFJTIDA5REVDMjQgQ2hhbmdlZCBrZXlzXG4gICAgdGhpcy5hbnN3ZXJMaXN0ID0gW107XG4gICAgdGhpcy5kYXRhQmluZCA9IFtdOyAvLyBIQSAxMkZFQjI0IENsZWFyaW5nIGRhdGFCaW5kIHVwb24gYnV0dG9uIGFjdGlvbiBzbyB0aGF0IGRhdGFCaW5kIHZhbHVlIHdpbGwgbm90IG92ZXJyaWRlIHRoZSBjaGFuZ2VkIHZhbHVlXG4gICAgbGV0IGRhdGFUb1BhcmVudCA9IHt9O1xuICAgIGxldCB2YWxpZEZvcm0gPSB0cnVlOyAvLyBWRCAwMUF1ZzI0IC0gdmFsaWRhdGlvbiBjaGFuZ2VcbiAgICAvLyBIQSAyMkpBTjI0IHRoaXMgY2hhbmdlIHRvIG1ha2UgY2xvc2UgZXZlbnQgd29ya1xuICAgIGRhdGFUb1BhcmVudFsnYWN0aW9uJ10gPSBhY3Rpb24uZXZlbnR0b2VtaXQ7XG4gICAgaWYoIShhY3Rpb24uZXZlbnR0b2VtaXQgPT09ICdjbG9zZScgfHwgYWN0aW9uLmV2ZW50dG9lbWl0ID09PSAncHJpbnQnKSl7XG4gICAgICAvLyBIQSAxOC1KQU4tMjQgU2VuZGluZyB0aGUgY29tcGxldGUganNvbiBkYXRhIGFsc28gXG4gICAgICBkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10gPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgpO1xuICAgICAgLy8gSEEgMTdKQU4yNCBueHRJZCB0byBkYXRhUGFyZW50IG9iamVjdFxuICAgICAgaWYodGhpcy5ib29rbGV0SlNPTil7XG4gICAgICAgIGRhdGFUb1BhcmVudFsnbnh0SWQnXSA9IE9iamVjdC5rZXlzKHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXApWzBdO1xuICAgICAgfVxuICAgICAgLy8gSEEgMTEtSkFOLTI0IE1pbmltaXppbmcgdGhlIHZhbHVlIHdoaWNoIGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIHNlcnZlclxuICAgICAgdGhpcy5oYW5kbGVDb21wbGV0ZUJvb2tsZXQoZGF0YVRvUGFyZW50Wydqc29uQm9vayddKTtcbiAgICAgIGRhdGFUb1BhcmVudFsnZGF0YSddID0gdGhpcy5hbnN3ZXJMaXN0ID8gdGhpcy5hbnN3ZXJMaXN0IDogZGF0YVRvUGFyZW50WydkYXRhJ107XG4gICAgICAvLyB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uIHZhbGlkYXRpbmcgdGhlIHJlcXVpcmVkIGZpZWxkc1xuICAgICAgZm9yKGxldCBrZXkgaW4gZGF0YVRvUGFyZW50Wydqc29uQm9vayddLmJvb2tRdWVzdGlvbnNNYXApe1xuICAgICAgICBjb25zdCBjdXJyZW50Qm9vayAgPSBkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10uYm9va1F1ZXN0aW9uc01hcFtrZXldO1xuICAgICAgICBjdXJyZW50Qm9vay5zdWJRdWVzdGlvbnMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgIC8vIFZEIDAxQXVnMjQgLSB2YWxpZGF0aW9uIGNoYW5nZVxuICAgICAgICAgIGlmKGVsZW1lbnQuaXNPcHRpb25hbCAmJiBkYXRhVG9QYXJlbnRbJ2FjdGlvbiddID09ICdzdWJtaXQnICYmICghZWxlbWVudC5pbnB1dCB8fCAoQXJyYXkuaXNBcnJheShlbGVtZW50LmlucHV0KSAmJiBlbGVtZW50LmlucHV0Lmxlbmd0aCA9PT0gMCkpICYmICFlbGVtZW50LmlzSGlkZGVuICYmIGVsZW1lbnQudHlwZSAhPSAnTGFiZWwnICYmIGVsZW1lbnQudHlwZSAhPSAnSW1hZ2UnICl7IC8vU0tTNU5PVjI1IFxuICAgICAgICAgICAgZWxlbWVudC5lcnJvciA9IHRydWU7XG4gICAgICAgICAgICB2YWxpZEZvcm0gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VydmljZS5zdWJtaXRDaGFuZ2UoZWxlbWVudC5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFZEIDAyQXVnMjQgLSBjbGVhciBhY3Rpb24gY2hhbmdlc1xuICAgICAgICAgIGlmKGRhdGFUb1BhcmVudFsnYWN0aW9uJ10gPT0gJ2NsZWFyJyl7XG4gICAgICAgICAgICBpZihlbGVtZW50LnR5cGUgPT0gJ0Ryb3Bkb3duJyB8fCBlbGVtZW50LnR5cGUgPT0gJ0xvY2F0aW9uJyB8fCBlbGVtZW50LnR5cGUgPT0gJ1JhZGlvJykge1xuICAgICAgICAgICAgICBlbGVtZW50LnNlbGVjdGVkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9ZWxzZSBpZihlbGVtZW50LnR5cGUgPT0gJ0ZpbGUnKXtcbiAgICAgICAgICAgICAgZWxlbWVudC5pbnB1dCA9IFtdO1xuICAgICAgICAgICAgfWVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50LmlucHV0ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFZEIDEzTUFZMjQgLSBwcmludCBRUiBidXR0b24gY2hhbmdlc1xuICAgIGlmKGFjdGlvbi5ldmVudHRvZW1pdCA9PT0gJ3ByaW50Jyl7XG4gICAgICBkYXRhVG9QYXJlbnRbJ2FjdGlvbkRhdGEnXSA9IGFjdGlvblsnZGF0YSddO1xuICAgIH1cbiAgICAvLyBIQSAyM0pBTjI0IFRvIGNhbGwgdGhlIGFjdGlvbiBvbiBhbnkgZXZlbnRcbiAgIC8vICBWRCAwMUF1ZzI0IC0gdmFsaWRhdGlvbiBjaGFuZ2VcbiAgICBpZih2YWxpZEZvcm0pe1xuICAgICAgdGhpcy5oYW5kbGVCb29rbGV0QWN0aW9uRXZlbnQuZW1pdChkYXRhVG9QYXJlbnQpO1xuICAgIH1lbHNlIHtcbiAgICAgIGRhdGFUb1BhcmVudFsnYWN0aW9uJ10gPSAnZXJyb3InO1xuICAgICAgdGhpcy5oYW5kbGVCb29rbGV0QWN0aW9uRXZlbnQuZW1pdChkYXRhVG9QYXJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhBIDE4LUpBTi0yNCBoYW5kbGVDb21wbGV0ZUJvb2tsZXQgaXMgdG8gc2ltcGxpZnkgdGhlIGxvZ2ljXG4gIGhhbmRsZUNvbXBsZXRlQm9va2xldChjb21wbGV0ZUJvb2tsZXQpe1xuICAgIGlmKE9iamVjdC5rZXlzKGNvbXBsZXRlQm9va2xldD8uYm9va1F1ZXN0aW9uc01hcCA/PyB7fSkubGVuZ3RoID09PSAwKXsgLy8gSEEgMTEtSkFOLTI0IElmIGNvbmRpdGlvbiB0byBsb2FkIGJvb2tsZXRcbiAgICAgIHRoaXMuaGFuZGxlQm9vayhjb21wbGV0ZUJvb2tsZXQ/LnF1ZXN0aW9uYm9vaz8uc3ViUXVlc3Rpb25zKTtcbiAgICB9XG4gICAgZWxzZXsgLy8gSEEgMTEtSkFOLTI0IFRvIGxvYWQgYm9vayBxdWVzdGlvbnNcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNvbXBsZXRlQm9va2xldC5ib29rUXVlc3Rpb25zTWFwKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGNvbXBsZXRlQm9va2xldC5ib29rUXVlc3Rpb25zTWFwW2tleV07XG4gICAgICAgIGlmKHZhbC50eXBlID09PSAnQm9vaycpe1xuICAgICAgICAgIHRoaXMuaGFuZGxlQm9vayh2YWwuc3ViUXVlc3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgIHRoaXMuaGFuZGxlUXVlcyh2YWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSEEgMTEtSkFOLTI0IGhhbmRsZUJvb2sgbG9hZHMgdGhlIEJvb2tcbiAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgaGFuZGxlQm9vayhxdWVzTGlzdDogYW55KXtcbiAgICBxdWVzTGlzdD8uZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmKGVsZW1lbnQudHlwZSA9PT0gJ0Jvb2snKXtcbiAgICAgICAgLy8gSEEgMjRKQU4yNCBGZXRjaGluZyBmcm9tIFFCIHJlZmVyZW5jZVxuICAgICAgICB2YXIgYm9vayA9IEpTT04ucGFyc2UoZWxlbWVudC5xYlJlZmVyZW5jZVF1ZXN0aW9ucyk7XG4gICAgICAgIGJvb2sucXVlc3Rpb25ib29rLnN1YlF1ZXN0aW9ucy5mb3JFYWNoKHF1ZXMgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlUXVlcyhxdWVzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbHNle1xuICAgICAgICB0aGlzLmhhbmRsZVF1ZXMoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gVkQgMTNTZXAyNCAtIGRhdGFiaW5kIGNoYW5nZXNcbiAgICAvLyBWRCAyMyBPY3QyNCAtIGZpbGUgdHlwZSBjaGFuZ2VzXG4gICAgaWYodGhpcy5kYXRhQmluZCAmJiBPYmplY3Qua2V5cyh0aGlzLmRhdGFCaW5kKS5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuY2hhbmdlU2VydmljZS5kYXRhQ2hhbmdlcygnZGF0YUJpbmQnKTtcbiAgICB9XG4gIH1cblxuICAvLyBIQSAxMS1KQU4tMjQgaGFuZGxlUXVlcyB0byBsb2FkIHF1ZXN0aW9uXG4gIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICBoYW5kbGVRdWVzKHF1ZXM6IGFueSl7XG4gICAgLy8gSEEgMTktSkFOLTI0IElmIGNvbmRpdGlvbiBpcyBmb3IgYmluZC1pbiwgY29ycmVjdGlvblxuICAgIC8vIEhBIDA5RkVCMjQgQWRkaW5nIGNvbmRpdGlvbiB0byBhdm9pZCB1bmRlZmluZWQgZXJyb3JcbiAgICBpZih0aGlzLmRhdGFCaW5kICYmIE9iamVjdC5rZXlzKHRoaXMuZGF0YUJpbmQpLmxlbmd0aCA+IDApe1xuICAgICAgZm9yKGxldCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZGF0YUJpbmQpKXtcbiAgICAgICAgbGV0IHZhbHVlOmFueSA9IHZhbDtcbiAgICAgICAgaWYocXVlcy5yZWZlcmVuY2VGaWVsZCA9PT0ga2V5KXtcbiAgICAgICAgICBpZihxdWVzLnR5cGUgPT09ICdEcm9wZG93bicgfHwgcXVlcy50eXBlID09PSAnUmFkaW8nICl7XG4gICAgICAgICAgICB0aGlzLnNxT3B0aW9ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICBpZihlbGVtZW50WydyZWZlcmVuY2VGaWVsZCddID09PSBrZXkpe1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ2lucHV0J10gPSBxdWVzLmlucHV0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgZWxlbWVudFsnc2VsZWN0ZWRWYWx1ZSddID0gcXVlcy5zZWxlY3RlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIQSAyNEpBTjI0IFRvIGJpbmQtaW4gRGF0ZSBhbmQgRGF0ZVRpbWVcbiAgICAgICAgICBlbHNlIGlmKHF1ZXMudHlwZSA9PT0gJ0RhdGUnIHx8IHF1ZXMudHlwZSA9PSAnRGF0ZVRpbWUnKXtcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSBuZXcgRGF0ZSh2YWx1ZT8udG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEhBIDEyRkVCMjQgVG8gYmluZC1pbiBMb2NhdGlvbiBUeXBlXG4gICAgICAgICAgZWxzZSBpZihxdWVzLnR5cGUgPT09ICdMb2NhdGlvbicpe1xuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IHZhbHVlO1xuICAgICAgICAgICAgcXVlcy5zZWxlY3RlZFZhbHVlID0gdmFsdWVbJ2FkZHJlc3MnXSA/IHZhbHVlWydhZGRyZXNzJ10gOiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlcyBmb3IgZGF0YSBiaW5kSW5cbiAgICAgICAgICBlbHNlIGlmKHF1ZXMudHlwZSA9PT0gJ0NhbGVuZGFyJyl7XG4gICAgICAgICAgICBsZXQgZW50cmllcyA9IEpTT04ucGFyc2UocXVlc1snZmllbGRzTWV0YSddKTtcbiAgICAgICAgICAgIGlmKGVudHJpZXMpe1xuICAgICAgICAgICAgICBsZXQgcmVmZXJlbmNlUXVlc3Rpb25zID0gW107XG4gICAgICAgICAgICAgIGlmKGVudHJpZXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgIGVudHJpZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQucXVlc3Rpb25SZWZlcmVuY2Upe1xuICAgICAgICAgICAgICAgICAgICAgICBsZXQgcVJlZmVyZW5jZSA9IEpTT04ucGFyc2UoZWxlbWVudC5xdWVzdGlvblJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVF1ZXN0aW9ucy5wdXNoKHFSZWZlcmVuY2U/LnF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYocmVmZXJlbmNlUXVlc3Rpb25zLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgIHZhbHVlPy5mb3JFYWNoKGNhbGVuZGFyQXJyYXkgPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZShjYWxlbmRhckFycmF5LmRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckFycmF5LmVudHJpZXMuZm9yRWFjaChpbnB1dEVudHJ5PT57XG4gICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXRFbnRyeSkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlUXVlc3Rpb25zLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmaWVsZC5yZWZlcmVuY2VGaWVsZCA9PSBrKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZpZWxkLnR5cGUgPT09ICdEYXRlJyB8fCBmaWVsZC50eXBlID09ICdEYXRlVGltZScgfHwgZmllbGQudHlwZSA9PSAnVGltZScpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmlucHV0ID0gbmV3IERhdGUodj8udG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWlmKGZpZWxkLnR5cGUgPT09ICdEcm9wZG93bicgfHwgZmllbGQudHlwZSA9PT0gJ1JhZGlvJyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZWxlY3RlZFZhbHVlID0gdjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmlucHV0ID0gdjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5pbnB1dCA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoZGF0ZSxyZWZlcmVuY2VRdWVzdGlvbnMpOy8vU0tTIDI3U0VQMjQgZWFjaCBldmVudCBhZGRlZCB0byBhbGxFdmVudHMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgfSkgIFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmFkZEV2ZW50KGRhdGUscmVmZXJlbmNlUXVlc3Rpb25zKTsgLy90aGlzIGlzIG9ubHkgbGFzdCBldmVudCBhZGRlZCB0byBhbGxFdmVudHMgYXJyYXlcbiAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSB0aGlzLmFsbEV2ZW50cy5sZW5ndGggPiAwID8gdGhpcy5hbGxFdmVudHMgOiAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVkQgMjMgT2N0MjQgLSBmaWxlIHR5cGUgY2hhbmdlc1xuICAgICAgICAgIGVsc2UgaWYocXVlcy50eXBlID09PSAnRmlsZScpe1xuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IFtdO1xuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFuc3dlckxpc3QucHVzaChxdWVzKTsgLy8gSEEgMTJGRUIyNCBUbyBnaXZlIHRoZSB2YWx1ZSBmb3IgZGF0YVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJyZWZlcmVuY2UgZmllbGQgbm90IGZvdW5kXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2V7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IHt9O1xuICAgICAgcXVlc3Rpb25bJ2lkJ10gPSBxdWVzLmlkO1xuICAgICAgLy8gcXVlc3Rpb25bJ1F1ZXN0aW9uX19jJ10gPSBxdWVzLlF1ZXN0aW9uX19jO1xuICAgICAgcXVlc3Rpb25bJ2lucHV0J10gPSBxdWVzLmlucHV0O1xuICAgICAgLy8gSEEgMTJGRUIyNCBUbyBiaW5kLW91dCBMb2NhdGlvbiBUeXBlXG4gICAgICBpZihxdWVzLnR5cGUgPT09ICdMb2NhdGlvbicpe1xuICAgICAgICBxdWVzdGlvblsnaW5wdXQnXSA9IHF1ZXMuaW5wdXQgPyBxdWVzLmlucHV0IDogcXVlcy5zZWxlY3RlZFZhbHVlO1xuICAgICAgfWVsc2UgaWYocXVlcy50eXBlID09ICdGaWxlJyl7XG4gICAgICAgICAvLyBWRCAyMyBPY3QyNCAtIGZpbGUgdHlwZSBjaGFuZ2VzXG4gICAgICAgIHF1ZXN0aW9uWydpbnB1dCddID0gcXVlcy5pbnB1dCA/IHF1ZXMuaW5wdXQgOiBbXTtcbiAgICAgIH1cbiAgICAgIHF1ZXN0aW9uWyd0eXBlJ10gPSBxdWVzLnR5cGU7XG4gICAgICBxdWVzdGlvblsncXVlc3Rpb25OdW1iZXInXSA9IHF1ZXMucXVlc3Rpb25OdW1iZXI7XG4gICAgICBxdWVzdGlvblsncmVmZXJlbmNlRmllbGQnXSA9IHF1ZXM/LnJlZmVyZW5jZUZpZWxkO1xuICAgICAgdGhpcy5hbnN3ZXJMaXN0LnB1c2gocXVlc3Rpb24pO1xuICAgIH1cbiAgfVxuXG4vLyBWRCAwNlNlcDI0IGNhbGVuZGFyIGNoYW5nZXMgZm9yIGRhdGEgYmluZEluXG4gIGFkZEV2ZW50KGRheTogYW55LCBlbnRyeVF1ZXMpIHtcbiAgICAvLyBUcmFuc2Zvcm0gbmV3IGVudHJpZXMgaW50byB0aGUgZGVzaXJlZCBmb3JtYXRcbiAgICBjb25zdCBuZXdFbnRyaWVzID0gZW50cnlRdWVzLnJlZHVjZSgoYWNjLCBxKSA9PiB7XG4gICAgICAgIGFjY1txLmlkXSA9IHsgLi4ucSB9O1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIC8vIEZpbmQgaWYgYW4gZXZlbnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBnaXZlbiBkYXRlXG4gICAgY29uc3QgZXhpc3RpbmdFdmVudCA9IHRoaXMuYWxsRXZlbnRzLmZpbmQoZXZlbnQgPT4gZXZlbnQuZGF0ZS50b0RhdGVTdHJpbmcoKSA9PT0gZGF5LnRvRGF0ZVN0cmluZygpKTtcblxuICAgIGlmIChleGlzdGluZ0V2ZW50KSB7XG4gICAgICAgIC8vIElmIHRoZSBldmVudCBleGlzdHMsIHB1c2ggdGhlIG5ldyBlbnRyaWVzIHRvIHRoZSBleGlzdGluZyBlbnRyaWVzXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRW50cmllcyA9IGV4aXN0aW5nRXZlbnQuZW50cmllcy5tYXAoZW50cnkgPT4gKHsgLi4uZW50cnkgfSkpO1xuICAgICAgICBleGlzdGluZ0VudHJpZXMucHVzaChuZXdFbnRyaWVzKTtcbiAgICAgICAgZXhpc3RpbmdFdmVudC5lbnRyaWVzID0gZXhpc3RpbmdFbnRyaWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBldmVudCBpZiBpdCBkb2Vzbid0IGV4aXN0IGZvciB0aGUgZ2l2ZW4gZGF0ZVxuICAgICAgICBjb25zdCBuZXdFdmVudCA9IHtcbiAgICAgICAgICAgIGlkOiAnXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSksXG4gICAgICAgICAgICBkYXRlOiBkYXksXG4gICAgICAgICAgICBlbnRyaWVzOiBbbmV3RW50cmllc10gLy8gV3JhcCB0aGUgbmV3IGVudHJpZXMgaW4gYW4gYXJyYXlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hbGxFdmVudHMucHVzaChuZXdFdmVudCk7XG4gICAgfVxufVxuXG5cbiAgcmVhZFF1ZXN0aW9ucyhxYklkOiBzdHJpbmcpIHtcbiAgICBsZXQgcXVlc3Rpb25zID0gW107XG4gICAgLy8gSEEgMzEtSkFOLTI0IEFkZGVkIHRlcm5hcnkgdG8gYXZvaWQgdW5kZWZpbmVkXG4gICAgZm9yKHZhciBzcSBpbiB0aGlzLmJvb2tRdWVzdGlvbnNNYXA/LmdldChxYklkKT8uc3ViUXVlc3Rpb25zKSB7XG4gICAgICBsZXQgcTogUXVlc3Rpb24gPSB0aGlzLmJvb2tRdWVzdGlvbnNNYXA/LmdldChxYklkKS5zdWJRdWVzdGlvbnNbc3FdO1xuICAgICAgLy8gSEEgMDlGRUIyNCBpZiBxdWVzdGlvbiBpcyB0aGVyZSBwcm9jZXNzXG4gICAgICBpZihxKXtcbiAgICAgICAgaWYoKHEudHlwZSA9PSAnRHJvcGRvd24nIHx8IHEudHlwZSA9PSAnUmFkaW8nKSAmJiB0aGlzLnNxT3B0aW9ucy5nZXQocS5pZCkpIHtcbiAgICAgICAgICBxdWVzdGlvbnMucHVzaCh0aGlzLnNxT3B0aW9ucy5nZXQocS5pZCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXN0aW9ucy5wdXNoKHEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVkQgMTJKdW4yNCBmaWVsZCBwZXJtaXNpc2lvbiBjaGFuZ2VzXG4gICAgaWYgKHRoaXMuZmllbGRSZXN0cmljdGlvbnMpIHtcbiAgICAgIGNvbnN0IGZpZWxkUmVzdHJpY3Rpb25zID0gbmV3IE1hcChPYmplY3QuZW50cmllcyh0aGlzLmZpZWxkUmVzdHJpY3Rpb25zLmZpZWxkcykpO1xuICAgICAgcXVlc3Rpb25zLmZvckVhY2gocXVlcyA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdHJpY3Rpb24gPSBmaWVsZFJlc3RyaWN0aW9ucy5nZXQocXVlcy51bmlxdWVJZGVudGlmaWVyKTtcbiAgXG4gICAgICAgICAgaWYgKHJlc3RyaWN0aW9uKSB7XG4gICAgICAgICAgICAgIHF1ZXMuaXNSZWFkT25seSA9IHJlc3RyaWN0aW9uID09PSAncmVhZE9ubHknO1xuICAgICAgICAgICAgICBxdWVzLmlzSGlkZGVuID0gcmVzdHJpY3Rpb24gPT09ICdoaWRlJztcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuICAgIHJldHVybiBxdWVzdGlvbnM7XG4gIH1cbiAvLyBWRCAxMUp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICByZWFkVHJhbnNRdWVzdGlvbnMocWJJZDogc3RyaW5nKXtcbiAgICBsZXQgcmVjb3JkID0gW107XG4gICAgICBsZXQgdHJhbnNsYXRlUmVjb3JkID0gdGhpcy50cmFuc2xhdGVNYXAuZ2V0KHFiSWQpO1xuICAgICBpZih0cmFuc2xhdGVSZWNvcmQgJiYgdHJhbnNsYXRlUmVjb3JkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyYW5zbGF0ZVJlY29yZC5mb3JFYWNoKGxhblJlYyA9PiB7XG4gICAgICAgIGlmKGxhblJlYy5sYW5ndWFnZUNvZGUgPT0gdGhpcy5sYW5ndWFnZUNvZGUpe1xuICAgICAgICAgICByZWNvcmQgPSBsYW5SZWMuZmllbGRzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICB9XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgZ2V0VGV4dCh2YWx1ZSkge1xuICAgIHZhciBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHZhbHVlLCBcInRleHQvaHRtbFwiKTtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoXG4gICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LnRleHRDb250ZW50XG4gICAgKTtcbiAgfVxuICBnZXREcm9wRG93bihldmVudDphbnkpe1xuICAgIHRoaXMuaGFkbGVEcm9wRG93bkRlcGVuZGVudC5lbWl0KGV2ZW50KTtcbiAgfVxuIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICBnZXRDYWxlbmRhckRhdGUoZXZlbnQ6YW55KXtcbiAgICB0aGlzLmhhbmRsZUNhbGVuZGFyRGF0ZS5lbWl0KGV2ZW50KTtcbiAgfVxuICBnZXRDYWxlbmRhckV2ZW50KGV2ZW50OmFueSl7XG4gICAgZXZlbnRbXCJueHRJZFwiXT0gT2JqZWN0LmtleXModGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcClbMF07XG4gICAgdGhpcy5oYW5kbGVDYWxlbmRhckV2ZW50LmVtaXQoZXZlbnQpO1xuICB9XG59XG4iLCI8bmd4LXNwaW5uZXIgc2l6ZT1cIm1lZGl1bVwiIFtuYW1lXT1cInNwaW5uZXJOYW1lXCIgW3R5cGVdPVwic3Bpbm5lclR5cGVcIj48L25neC1zcGlubmVyPlxuPCEtLSBCb29rbGV0IEhhbmRsaW5nLS0+XG48IS0tIEhBIDE5REVDMjMgRm9yIERpcmVjdGlvbiAtLT5cbjxkaXYgKm5nRm9yPVwibGV0IHFiIG9mIGJvb2tsZXRcIiBbbmdDbGFzc109XCJsYW5nRGlyZWN0aW9uXCI+XG4gICAgPCEtLSBNUiBDb21tZW50ZWQgYmVsb3cgY29kZSB0byBlbnN1cmUgc2luZ2xlIEpTT04gZm9yIFVOQ09ORElUSU9OQUwgQm9va2xldHMgLS0+XG4gICAgPCEtLSBSUyAwOURFQzI0IENoYW5nZWQga2V5cy0tPiBcbiAgICA8IS0tIDxsaWItcXVlc3Rpb25uYWlyZSBbc2Vydl09XCJzZXJ2XCIgW3FiSWRdPVwicWIuaWRcIiBbdGtuXT1cInRrblwiPjwvbGliLXF1ZXN0aW9ubmFpcmU+IC0tPlxuICAgIDwhLS0gSEEgMjhERUMyMyBCZWxvdyBJZiBsb2dpYyBpcyB0byBsb2FkIGZyb20gYm9va2xldCAgLS0+XG4gICAgPGRpdiAqbmdJZj1cInFiLnN1YlF1ZXN0aW9uczsgZWxzZSBlbHNlQmxvY2tcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcXVlcyBvZiBxYi5zdWJRdWVzdGlvbnNcIiBjbGFzcz1cInF1ZXN0aW9uZGl2MVwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8IS0tIEhBIDE3SkFOMjQgLSBJcyB0aXRsZSBpcyBlbmFibGVkIHNvIHRoYXQgYmFzZWQgb24gdGhlIGJvb2xlYW4gZGl2IHdpbGwgYmUgdmlzaWJsZSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy5pc1RpdGxlXCIgW2NsYXNzXT1cInFiLmlzU2hlbmdlbCA/ICdoZWFkZXItc3R5bGUnIDogJ3F1ZXN0aW9uLWYtc2l6ZSBhZGRpdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIFZEIDA4Tk9WMjMgLSBzaG93aW5nIGxhYmxlIHdoZW4gaXRzIGF2YWlsYWJsZS0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZ2V0VGV4dChxdWVzPy5xdWVzdGlvblRleHQpXCIgKm5nSWY9XCJxdWVzPy5xdWVzdGlvblRleHRcIiA+IFxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcXVlcz8ucXVlc3Rpb25UZXh0IH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PiA8IS0tIFZEIDE5SkFOMjQgLSBnZXR0aW5nIHRva2VuIGFzIGlucHV0IC0tPiA8IS0tVkQgMTFKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXMtLT5cbiAgICAgICAgICAgICAgICA8IS0tVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzLS0+IFxuICAgICAgICAgICAgICAgIDxsaWItcXVlc3Rpb25ib29rIFtxYkl0ZW1dPVwicWJcIiBbdG9rZW5dPVwidG9rZW5cIiBcbiAgICAgICAgICAgICAgICBbbGFiZWxWYWx1ZV09XCJsYWJlbFZhbHVlXCIgXG4gICAgICAgICAgICAgICAgW3F1ZXN0aW9uSXRlbV09XCJxdWVzXCIgXG4gICAgICAgICAgICAgICAgW3RyYW5zbGF0ZWRRdWVzdGlvbnNdPVwicmVhZFRyYW5zUXVlc3Rpb25zKHFiLmlkKVwiIFxuICAgICAgICAgICAgICAgIFtxdWVzdGlvbnNdPVwicmVhZFF1ZXN0aW9ucyhxYi5pZClcIiAgXG4gICAgICAgICAgICAgICAgKGhhbmRsZURyb3BEb3duKT1cImdldERyb3BEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChoYW5kbGVDYWxlbmRhckRhdGUpPVwiZ2V0Q2FsZW5kYXJEYXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChoYW5kbGVDYWxlbmRhckV2ZW50KT1cImdldENhbGVuZGFyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPjwvbGliLXF1ZXN0aW9uYm9vaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIEhBIDI4REVDMjMgQmVsb3cgZWxzZSBsb2dpYyBpcyB0byBsb2FkIGZyb20gYm9va3Mgb3IgcXVlc3Rpb25zIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVlc3Rpb25kaXYxXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhcWIuaXNUaXRsZVwiIFtjbGFzc109XCJxYi5pc1NoZW5nZWwgPyAnaGVhZGVyLXN0eWxlJyA6ICdxdWVzdGlvbi1mLXNpemUgYWRkaXRpb25hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBWRCAwOE5PVjIzIC0gc2hvd2luZyBsYWJsZSB3aGVuIGl0cyBhdmFpbGFibGUtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cImdldFRleHQocWI/LnF1ZXN0aW9uVGV4dClcIiAqbmdJZj1cInFiPy5xdWVzdGlvblRleHRcIiA+IFxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcWI/LnF1ZXN0aW9uVGV4dCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcWI/LnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PiA8IS0tIFZEIDE5SkFOMjQgLSBnZXR0aW5nIHRva2VuIGFzIGlucHV0IC0tPiA8IS0tICAvLyBWRCAxMUp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlcy0tPlxuICAgICAgICAgICAgICAgIDxsaWItcXVlc3Rpb25ib29rIFtxYkl0ZW1dPVwicWJcIiBbdG9rZW5dPVwidG9rZW5cIiBbbGFiZWxWYWx1ZV09XCJsYWJlbFZhbHVlXCIgW3F1ZXN0aW9uSXRlbV09XCJxYlwiIFt0cmFuc2xhdGVkUXVlc3Rpb25zXT1cInJlYWRUcmFuc1F1ZXN0aW9ucyhxYi5pZClcIiBbcXVlc3Rpb25zXT1cInJlYWRRdWVzdGlvbnMocWIuaWQpXCIgIChoYW5kbGVEcm9wRG93bik9XCJnZXREcm9wRG93bigkZXZlbnQpXCI+PC9saWItcXVlc3Rpb25ib29rPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbjwhLS0gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXMtLT4gXG48IS0tIEdyb3VwIEFjdGlvbnMgLS0+XG48IS0tIEhBIDE5REVDMjMgRm9yIERpcmVjdGlvbiAtLT5cbjxkaXYgY2xhc3M9XCJhbGlnbi1zdWJtaXQtcm93XCIgKm5nSWY9XCJhYkl0ZW0/LnN0YXR1cyAhPSAnQ29tcGxldGVkJ1wiIFtuZ0NsYXNzXT1cImxhbmdEaXJlY3Rpb25cIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uczsgbGV0IGkgPSBpbmRleFwiPlxuICAgIDwhLS0gLy8gSEEgMjJKQU4yNCBDb21tb25pc2UgdGhlIGJ1dHRvbiBzdHlsZSBpbiBmdXNpb24gLS0+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUJvb2tsZXRBY3Rpb25DbGljayhhY3Rpb24pXCIgbmdDbGFzcz1cImJ0biBidG4tcHJpbWFyeSBmYy1idXR0b24gbnh0QnV0dG9uXCI+XG4gICAgICAgICAgICB7eyBhY3Rpb24ubmFtZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19
|