@adins/ucsearch 4.0.0-research.2 → 4.0.0-research.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +1296 -1011
  2. package/adins-ucsearch.d.ts.map +1 -0
  3. package/esm2022/lib/constants/month.mjs +1 -1
  4. package/esm2022/lib/model/adins-constant.mjs +1 -1
  5. package/esm2022/lib/model/criteria-obj.model.mjs +1 -1
  6. package/esm2022/lib/model/input-search-obj.model.mjs +1 -1
  7. package/esm2022/lib/model/integration-obj.model.mjs +1 -1
  8. package/esm2022/lib/model/key-value-report.model.mjs +1 -1
  9. package/esm2022/lib/model/key-value-uc-search.model.mjs +1 -1
  10. package/esm2022/lib/model/request-criteria-obj.model.mjs +1 -1
  11. package/esm2022/lib/pipe/text-search.pipe.mjs +3 -3
  12. package/esm2022/lib/services/export-file.service.mjs +3 -3
  13. package/esm2022/lib/services/ucsearch-datetime.service.mjs +3 -3
  14. package/esm2022/lib/services/ucsearch-form.service.mjs +3 -3
  15. package/esm2022/lib/ucsearch.component.mjs +444 -268
  16. package/esm2022/lib/ucsearch.module.mjs +73 -52
  17. package/esm2022/lib/ucsearch.service.mjs +3 -3
  18. package/esm2022/public-api.mjs +2 -1
  19. package/fesm2022/adins-ucsearch.mjs +490 -296
  20. package/fesm2022/adins-ucsearch.mjs.map +1 -1
  21. package/index.d.ts +1 -0
  22. package/lib/constants/month.d.ts +1 -0
  23. package/lib/constants/month.d.ts.map +1 -0
  24. package/lib/model/adins-constant.d.ts +1 -0
  25. package/lib/model/adins-constant.d.ts.map +1 -0
  26. package/lib/model/criteria-obj.model.d.ts +1 -0
  27. package/lib/model/criteria-obj.model.d.ts.map +1 -0
  28. package/lib/model/input-search-obj.model.d.ts +1 -0
  29. package/lib/model/input-search-obj.model.d.ts.map +1 -0
  30. package/lib/model/integration-obj.model.d.ts +1 -0
  31. package/lib/model/integration-obj.model.d.ts.map +1 -0
  32. package/lib/model/key-value-report.model.d.ts +1 -0
  33. package/lib/model/key-value-report.model.d.ts.map +1 -0
  34. package/lib/model/key-value-uc-search.model.d.ts +1 -0
  35. package/lib/model/key-value-uc-search.model.d.ts.map +1 -0
  36. package/lib/model/request-criteria-obj.model.d.ts +1 -0
  37. package/lib/model/request-criteria-obj.model.d.ts.map +1 -0
  38. package/lib/pipe/text-search.pipe.d.ts +1 -0
  39. package/lib/pipe/text-search.pipe.d.ts.map +1 -0
  40. package/lib/services/export-file.service.d.ts +1 -0
  41. package/lib/services/export-file.service.d.ts.map +1 -0
  42. package/lib/services/ucsearch-datetime.service.d.ts +1 -0
  43. package/lib/services/ucsearch-datetime.service.d.ts.map +1 -0
  44. package/lib/services/ucsearch-form.service.d.ts +1 -0
  45. package/lib/services/ucsearch-form.service.d.ts.map +1 -0
  46. package/lib/ucsearch.component.d.ts +20 -20
  47. package/lib/ucsearch.component.d.ts.map +1 -0
  48. package/lib/ucsearch.module.d.ts +16 -13
  49. package/lib/ucsearch.module.d.ts.map +1 -0
  50. package/lib/ucsearch.service.d.ts +1 -0
  51. package/lib/ucsearch.service.d.ts.map +1 -0
  52. package/package.json +2 -12
  53. package/public-api.d.ts +1 -0
  54. package/public-api.d.ts.map +1 -0
@@ -1,24 +1,23 @@
1
- import { Component, Input, ViewChild, ElementRef, Inject, Renderer2, EventEmitter, Output } from '@angular/core';
2
- import { HttpClient } from '@angular/common/http';
3
- import { FormBuilder, NgForm, Validators } from '@angular/forms';
4
- import { DatePipe, formatDate } from '@angular/common';
5
- import { InputSearchObj } from './model/input-search-obj.model';
6
- import { CriteriaObj } from './model/criteria-obj.model';
7
- import { RequestCriteriaObj } from './model/request-criteria-obj.model';
8
- import { AdInsConstant, EXPORT_DATA_TYPES } from './model/adins-constant';
9
- import { DOCUMENT } from '@angular/common';
10
- import { trigger, transition, style, animate, state } from '@angular/animations';
11
- import { ToastrService } from 'ngx-toastr';
12
- import { ExportTypeConstant, ReportExecTypeConstant } from './model/key-value-report.model';
13
- import { CookieService } from 'ngx-cookie';
14
- import * as CryptoJS from 'crypto-js';
15
- import { ListKeyValueMonth } from './model/key-value-uc-search.model';
16
- import { ExportFileService } from './services/export-file.service';
17
- import { ActivatedRoute } from '@angular/router';
18
- import { NgxRouterService } from '@adins/fe-core';
19
- import { UcsearchDatetimeService } from './services/ucsearch-datetime.service';
20
- import { monthsKeyValue } from './constants/month';
21
- import { UcsearchFormService } from './services/ucsearch-form.service';
1
+ import { Component, Input, ViewChild, ElementRef, EventEmitter, Output, } from "@angular/core";
2
+ import { HttpClient } from "@angular/common/http";
3
+ import { FormBuilder, NgForm, Validators, } from "@angular/forms";
4
+ import { DatePipe, formatDate } from "@angular/common";
5
+ import { InputSearchObj } from "./model/input-search-obj.model";
6
+ import { CriteriaObj } from "./model/criteria-obj.model";
7
+ import { RequestCriteriaObj } from "./model/request-criteria-obj.model";
8
+ import { AdInsConstant, EXPORT_DATA_TYPES } from "./model/adins-constant";
9
+ import { trigger, transition, style, animate, state, } from "@angular/animations";
10
+ import { ToastrService } from "ngx-toastr";
11
+ import { ExportTypeConstant, ReportExecTypeConstant, } from "./model/key-value-report.model";
12
+ import { CookieService } from "ngx-cookie";
13
+ import * as CryptoJS from "crypto-js";
14
+ import { ListKeyValueMonth, } from "./model/key-value-uc-search.model";
15
+ import { ExportFileService } from "./services/export-file.service";
16
+ import { ActivatedRoute } from "@angular/router";
17
+ import { NgxRouterService } from "@adins/fe-core";
18
+ import { UcsearchDatetimeService } from "./services/ucsearch-datetime.service";
19
+ import { monthsKeyValue } from "./constants/month";
20
+ import { UcsearchFormService } from "./services/ucsearch-form.service";
22
21
  import * as i0 from "@angular/core";
23
22
  import * as i1 from "@angular/common/http";
24
23
  import * as i2 from "ngx-toastr";
@@ -34,12 +33,12 @@ import * as i11 from "@ng-bootstrap/ng-bootstrap";
34
33
  import * as i12 from "@adins/uc-show-errors";
35
34
  import * as i13 from "@adins/uc-directive-upper-case";
36
35
  import * as i14 from "@adins/uc-directive-validate-date";
37
- import * as i15 from "@adins/ucdatepicker";
38
- import * as i16 from "./pipe/text-search.pipe";
36
+ import * as i15 from "@adins/uc-subsection";
37
+ import * as i16 from "@adins/ucdatepicker";
38
+ import * as i17 from "@ngx-translate/core";
39
+ import * as i18 from "./pipe/text-search.pipe";
39
40
  export class UCSearchComponent {
40
41
  http;
41
- _renderer2;
42
- _document;
43
42
  toastr;
44
43
  cookieService;
45
44
  datePipe;
@@ -59,7 +58,8 @@ export class UCSearchComponent {
59
58
  // }
60
59
  // }
61
60
  set content(content) {
62
- if (content) { // initially setter gets called with undefined
61
+ if (content) {
62
+ // initially setter gets called with undefined
63
63
  this.searchForm = content;
64
64
  }
65
65
  }
@@ -74,30 +74,30 @@ export class UCSearchComponent {
74
74
  ExportTypeList = [
75
75
  {
76
76
  key: ExportTypeConstant.EXP_TYPE_PDF,
77
- value: "PDF"
77
+ value: "PDF",
78
78
  },
79
79
  {
80
80
  key: ExportTypeConstant.EXP_TYPE_XLSX,
81
- value: "Excel 2007"
81
+ value: "Excel 2007",
82
82
  },
83
83
  {
84
84
  key: ExportTypeConstant.EXP_TYPE_DOCX,
85
- value: "Document XML"
85
+ value: "Document XML",
86
86
  },
87
87
  {
88
88
  key: ExportTypeConstant.EXP_TYPE_JPDF,
89
- value: "Justify PDF"
90
- }
89
+ value: "Justify PDF",
90
+ },
91
91
  ];
92
92
  ReportExecTypeList = [
93
93
  {
94
94
  key: ReportExecTypeConstant.EXE_TYPE_SYNC,
95
- value: "Sync"
95
+ value: "Sync",
96
96
  },
97
97
  {
98
98
  key: ReportExecTypeConstant.EXE_TYPE_ASYNC,
99
- value: "Async"
100
- }
99
+ value: "Async",
100
+ },
101
101
  ];
102
102
  exportAsFileList = [
103
103
  {
@@ -111,18 +111,18 @@ export class UCSearchComponent {
111
111
  {
112
112
  key: "json",
113
113
  value: "as JSON",
114
- }
114
+ },
115
115
  ];
116
116
  ListOfMonth = new ListKeyValueMonth();
117
117
  ListOfYear = new Array();
118
118
  ClaimList = [
119
119
  {
120
120
  Key: AdInsConstant.RestrictionIsNotNull,
121
- Value: "CLAIMED"
121
+ Value: "CLAIMED",
122
122
  },
123
123
  {
124
124
  Key: AdInsConstant.RestrictionIsNull,
125
- Value: "UNCLAIMED"
125
+ Value: "UNCLAIMED",
126
126
  },
127
127
  ];
128
128
  ExportType = 0;
@@ -139,10 +139,10 @@ export class UCSearchComponent {
139
139
  isSearch = false;
140
140
  valueDict = {}; // hold temporary value from selected dropdown, used as a payload for another search component
141
141
  lookupDict = {}; // hold temporary value from selected lookup, used as a payload for another search component
142
- currentState = 'initial';
142
+ currentState = "initial";
143
143
  form;
144
144
  countForm = 0;
145
- formattedAmount = '';
145
+ formattedAmount = "";
146
146
  amount = 0;
147
147
  apiUrl;
148
148
  arrCrit;
@@ -159,10 +159,8 @@ export class UCSearchComponent {
159
159
  minMaxYear = 200;
160
160
  useNewDatepicker = false;
161
161
  searchBtnReady = false;
162
- constructor(http, _renderer2, _document, toastr, cookieService, datePipe, elemRef, exportFileService, route, ngxRouter, fb, datetimeService, ucSearchFormService) {
162
+ constructor(http, toastr, cookieService, datePipe, elemRef, exportFileService, route, ngxRouter, fb, datetimeService, ucSearchFormService) {
163
163
  this.http = http;
164
- this._renderer2 = _renderer2;
165
- this._document = _document;
166
164
  this.toastr = toastr;
167
165
  this.cookieService = cookieService;
168
166
  this.datePipe = datePipe;
@@ -174,7 +172,7 @@ export class UCSearchComponent {
174
172
  this.datetimeService = datetimeService;
175
173
  this.ucSearchFormService = ucSearchFormService;
176
174
  this.form = this.fb.group({});
177
- this.route.queryParams.subscribe(params => {
175
+ this.route.queryParams.subscribe((params) => {
178
176
  this.queryParam = this.ngxRouter.getQueryParams(params);
179
177
  });
180
178
  if (this.years.length === 0) {
@@ -184,25 +182,20 @@ export class UCSearchComponent {
184
182
  }
185
183
  }
186
184
  changeState() {
187
- this.currentState = this.currentState == 'initial' ? 'final' : 'initial';
185
+ this.currentState = this.currentState == "initial" ? "final" : "initial";
188
186
  this.isHidden = !this.isHidden ? true : false;
189
187
  }
190
188
  async ngOnInit() {
191
189
  if (this.searchInput?.environment?.experimental?.useNewDatepicker) {
192
- this.useNewDatepicker = this.searchInput.environment.experimental.useNewDatepicker;
190
+ this.useNewDatepicker =
191
+ this.searchInput.environment.experimental.useNewDatepicker;
193
192
  }
194
- this.apiUrl = this.searchInput.enviromentUrl + this.searchInput.apiQryPaging;
193
+ this.apiUrl =
194
+ this.searchInput.enviromentUrl + this.searchInput.apiQryPaging;
195
195
  this.arrCrit = this.searchInput.arrCritObj;
196
- let js = this._renderer2.createElement('script');
197
- js.text = `
198
- $(document).ready(function(){
199
- $("#flip").click(function(){
200
- $("#panel").slideToggle("slow");
201
- });
202
- });
203
- `;
204
- this._renderer2.appendChild(this._document.body, js);
205
- let value = this.cookieService.get('BusinessDateRaw');
196
+ // Toggle functionality handled by Angular's built-in mechanisms
197
+ // All interactive features use Angular reactive forms and native DOM manipulation
198
+ let value = this.cookieService.get("BusinessDateRaw");
206
199
  this.BisDt = this.DecryptString(value, "AdInsFOU12345678");
207
200
  this.BusinessDt = new Date(this.BisDt);
208
201
  if (this.isValidDate(this.BusinessDt)) {
@@ -211,11 +204,15 @@ export class UCSearchComponent {
211
204
  await this.initiateForm(true);
212
205
  }
213
206
  async initiateForm(isInit) {
214
- if (this.searchInput.dataInput !== undefined && Object.keys(this.searchInput.dataInput).length !== 0) {
207
+ if (this.searchInput.dataInput !== undefined &&
208
+ Object.keys(this.searchInput.dataInput).length !== 0) {
215
209
  this.setConfigurationData(JSON.parse(JSON.stringify(this.searchInput.dataInput)), isInit);
216
210
  return;
217
211
  }
218
- await this.http.get(this.searchInput._url).toPromise().then(data => {
212
+ await this.http
213
+ .get(this.searchInput._url)
214
+ .toPromise()
215
+ .then((data) => {
219
216
  this.setConfigurationData(data, isInit);
220
217
  });
221
218
  }
@@ -230,12 +227,13 @@ export class UCSearchComponent {
230
227
  this.ExportType = this.ExportTypeList[0].key;
231
228
  }
232
229
  if (isInit) {
233
- this.form.addControl('ExportType', this.fb.control(''));
234
- this.form.addControl('RptExecType', this.fb.control(''));
230
+ this.form.addControl("ExportType", this.fb.control(""));
231
+ this.form.addControl("RptExecType", this.fb.control(""));
235
232
  }
236
- this.form.controls['ExportType'].setValue(this.ExportType);
237
- this.form.controls['RptExecType'].setValue(this.RptExecType);
238
- if (data.exportAsFileList != undefined && data.exportAsFileList.length != 0) {
233
+ this.form.controls["ExportType"].setValue(this.ExportType);
234
+ this.form.controls["RptExecType"].setValue(this.RptExecType);
235
+ if (data.exportAsFileList != undefined &&
236
+ data.exportAsFileList.length != 0) {
239
237
  this.exportAsFileList = data.exportAsFileList;
240
238
  }
241
239
  this.countForm = data.component.length;
@@ -253,23 +251,34 @@ export class UCSearchComponent {
253
251
  let criteriaObject = new CriteriaObj();
254
252
  criteriaObject.DataType = "text";
255
253
  criteriaObject.propName = data.component[i].criteriaPropName;
256
- criteriaObject.value = this.queryParam[data.component[i].criteriaPropValue] || data.component[i].criteriaPropValue;
254
+ criteriaObject.value =
255
+ this.queryParam[data.component[i].criteriaPropValue] ||
256
+ data.component[i].criteriaPropValue;
257
257
  criteriaObject.restriction = "eq";
258
258
  arrayCrit.push(criteriaObject);
259
259
  request.criteria = arrayCrit;
260
- if (data.component[i].criteriaPropName !== null && data.component[i].criteriaPropName !== undefined) {
260
+ if (data.component[i].criteriaPropName !== null &&
261
+ data.component[i].criteriaPropName !== undefined) {
261
262
  const _critPropNameArr = data.component[i].criteriaPropName.split(";");
262
263
  const _critPropValueArr = data.component[i].criteriaPropValue.split(";");
263
264
  for (let i = 0; i < _critPropNameArr.length; i++) {
264
- request[_critPropNameArr[i]] = this.queryParam[_critPropValueArr[i]] || userAccess[_critPropValueArr[i]] || _critPropValueArr[i];
265
+ request[_critPropNameArr[i]] =
266
+ this.queryParam[_critPropValueArr[i]] ||
267
+ userAccess[_critPropValueArr[i]] ||
268
+ _critPropValueArr[i];
265
269
  }
266
270
  }
267
271
  // Pengecekan penggunaan url atau path
268
- if (data.component[i].path != undefined && data.component[i].path != "") {
269
- if (this.searchInput.listEnvironments != undefined && this.searchInput.listEnvironments.length != 0) {
272
+ if (data.component[i].path != undefined &&
273
+ data.component[i].path != "") {
274
+ if (this.searchInput.listEnvironments != undefined &&
275
+ this.searchInput.listEnvironments.length != 0) {
270
276
  for (let y = 0; y < this.searchInput.listEnvironments.length; y++) {
271
- if (data.component[i].environment == this.searchInput.listEnvironments[y].environment) {
272
- data.component[i].fullpath = this.searchInput.listEnvironments[y].url + data.component[i].path;
277
+ if (data.component[i].environment ==
278
+ this.searchInput.listEnvironments[y].environment) {
279
+ data.component[i].fullpath =
280
+ this.searchInput.listEnvironments[y].url +
281
+ data.component[i].path;
273
282
  break;
274
283
  }
275
284
  }
@@ -285,30 +294,36 @@ export class UCSearchComponent {
285
294
  //biar tiap function ada state2nya sendiri
286
295
  this.resolveObject(data.component[i], data.component[i].fullpath, request);
287
296
  }
288
- else if (!data.component[i].isFromUrl && data.component[i].type === "dropdown") {
289
- if (data.component[i]?.items?.length === 1 && !data.component[i]?.keepDdl) {
290
- this.lookupKeyValDict[data.component[i].name] = data.component[i].items[0].key;
297
+ else if (!data.component[i].isFromUrl &&
298
+ data.component[i].type === "dropdown") {
299
+ if (data.component[i]?.items?.length === 1 &&
300
+ !data.component[i]?.keepDdl) {
301
+ this.lookupKeyValDict[data.component[i].name] =
302
+ data.component[i].items[0].key;
291
303
  }
292
- if (data.component[i]?.items?.length > 1 && data.component[i]?.useFirstValue) {
304
+ if (data.component[i]?.items?.length > 1 &&
305
+ data.component[i]?.useFirstValue) {
293
306
  data.component[i].value = data.component[i].items[0].key;
294
307
  }
295
308
  }
296
309
  if (data.component[i].type == "numeric") {
297
310
  if (data.component[i].value && !isNaN(data.component[i].value)) {
298
- data.component[i].value = parseFloat(data.component[i].value).toLocaleString('en');
311
+ data.component[i].value = parseFloat(data.component[i].value).toLocaleString("en");
299
312
  }
300
313
  }
301
314
  //pengecekan ddl
302
315
  if (data.component[i].type == "dropdown") {
303
316
  if (data.component[i].dtmType != undefined) {
304
317
  if (data.component[i].dtmType.includes("month")) {
305
- if (data.component[i].value != undefined && data.component[i].value.includes("BD")) {
318
+ if (data.component[i].value != undefined &&
319
+ data.component[i].value.includes("BD")) {
306
320
  data.component[i].value = this.setDefaultValueMonth(data.component[i].value);
307
321
  }
308
322
  data.component[i].items = this.setMonthDDL(data.component[i].dtmType);
309
323
  }
310
324
  if (data.component[i].dtmType.includes("year")) {
311
- if (data.component[i].value != undefined && data.component[i].value.includes("BD")) {
325
+ if (data.component[i].value != undefined &&
326
+ data.component[i].value.includes("BD")) {
312
327
  data.component[i].value = this.setDefaultValueYear(data.component[i].value);
313
328
  }
314
329
  data.component[i].items = this.setYearDDL(data.component[i].dtmType);
@@ -324,22 +339,29 @@ export class UCSearchComponent {
324
339
  // data.component[i].descr = "Select One";
325
340
  // }
326
341
  // }
327
- if (data.component[i].type == "dropdownSearch" && !data.component[i].isFromURL && data.component[i].items.length == 1) {
342
+ if (data.component[i].type == "dropdownSearch" &&
343
+ !data.component[i].isFromURL &&
344
+ data.component[i].items.length == 1) {
328
345
  data.component[i].value = data.component[i].items[0].Key;
329
346
  data.component[i].descr = data.component[i].items[0].Value;
330
347
  }
331
- if (data.component[i].type != "dropdownSearch" && !data.component[i].value) {
348
+ if (data.component[i].type != "dropdownSearch" &&
349
+ !data.component[i].value) {
332
350
  data.component[i].value = "";
333
- if (data.component[i].ddlType == 'all')
351
+ if (data.component[i].ddlType == "all")
334
352
  data.component[i].value = "all";
335
- if (data.component[i].ddlType == 'one')
353
+ if (data.component[i].ddlType == "one")
336
354
  data.component[i].value = "one";
337
355
  }
338
356
  //pengecekan tanggal
339
357
  if (data.component[i].type == "datepicker") {
340
358
  this.readonly = data.component[i].readonly;
341
359
  // Handle dynamic date values: BD, firstDayOfMonth, lastDayOfMonth with +/- operators
342
- if (data.component[i].value === "firstDayOfMonth" || data.component[i].value === "lastDayOfMonth" || data.component[i].value.includes("BD") || data.component[i].value.includes("firstDayOfMonth") || data.component[i].value.includes("lastDayOfMonth")) {
360
+ if (data.component[i].value === "firstDayOfMonth" ||
361
+ data.component[i].value === "lastDayOfMonth" ||
362
+ data.component[i].value.includes("BD") ||
363
+ data.component[i].value.includes("firstDayOfMonth") ||
364
+ data.component[i].value.includes("lastDayOfMonth")) {
343
365
  let baseDate = this.getBusinessDate(this.BisDt);
344
366
  // Set base date based on type
345
367
  if (data.component[i].value.includes("firstDayOfMonth")) {
@@ -349,7 +371,11 @@ export class UCSearchComponent {
349
371
  baseDate = this.getLastDayOfMonth(baseDate);
350
372
  }
351
373
  // Find operator position based on date type
352
- let operator = data.component[i].value.charAt(data.component[i].value.includes("BD") ? 2 : data.component[i].value.includes("firstDayOfMonth") ? 15 : 14);
374
+ let operator = data.component[i].value.charAt(data.component[i].value.includes("BD")
375
+ ? 2
376
+ : data.component[i].value.includes("firstDayOfMonth")
377
+ ? 15
378
+ : 14);
353
379
  // Apply date arithmetic
354
380
  if (operator == "-") {
355
381
  let numDay = parseInt(data.component[i].value.split("-", 2)[1]);
@@ -359,7 +385,7 @@ export class UCSearchComponent {
359
385
  let numDay = parseInt(data.component[i].value.split("+", 2)[1]);
360
386
  baseDate.setDate(baseDate.getDate() + numDay);
361
387
  }
362
- data.component[i].value = formatDate(baseDate, 'yyyy-MM-dd', 'en-US');
388
+ data.component[i].value = formatDate(baseDate, "yyyy-MM-dd", "en-US");
363
389
  inputEffect.push({ key: "datepicker", value: data.component[i] });
364
390
  }
365
391
  if (!this.readonly) {
@@ -368,7 +394,9 @@ export class UCSearchComponent {
368
394
  let _minDate = data.component[i].minDate?.toLowerCase();
369
395
  if (_minDate != undefined && _minDate != null && _minDate != "") {
370
396
  data.component[i].confMinDate = data.component[i].minDate;
371
- if (_minDate == "bd" || _minDate == "businessdate" || _minDate == "businessdt") {
397
+ if (_minDate == "bd" ||
398
+ _minDate == "businessdate" ||
399
+ _minDate == "businessdt") {
372
400
  _minDate = this.BusinessDt;
373
401
  }
374
402
  if (this.isValidDate(_minDate)) {
@@ -386,7 +414,9 @@ export class UCSearchComponent {
386
414
  let _maxDate = data.component[i].maxDate?.toLowerCase();
387
415
  if (_maxDate != undefined && _maxDate != null && _maxDate != "") {
388
416
  data.component[i].confMaxDate = data.component[i].maxDate;
389
- if (_maxDate == "bd" || _maxDate == "businessdate" || _maxDate == "businessdt") {
417
+ if (_maxDate == "bd" ||
418
+ _maxDate == "businessdate" ||
419
+ _maxDate == "businessdt") {
390
420
  _maxDate = this.BusinessDt;
391
421
  }
392
422
  if (this.isValidDate(_maxDate)) {
@@ -404,9 +434,13 @@ export class UCSearchComponent {
404
434
  }
405
435
  }
406
436
  if (data.component[i].type == "textbox") {
407
- const isUppercase = data.component[i].isUppercase === undefined ? true : data.component[i].isUppercase;
437
+ const isUppercase = data.component[i].isUppercase === undefined
438
+ ? true
439
+ : data.component[i].isUppercase;
408
440
  const _value = this.autofill(data.component[i]);
409
- this.configuration.component[i].value = isUppercase ? _value.toUpperCase() : _value;
441
+ this.configuration.component[i].value = isUppercase
442
+ ? _value.toUpperCase()
443
+ : _value;
410
444
  }
411
445
  if (data.component[i].type == "dropdown") {
412
446
  const _value = this.autofill(data.component[i], false);
@@ -415,30 +449,34 @@ export class UCSearchComponent {
415
449
  if (data.component[i].type === "lookup") {
416
450
  if (!isInit) {
417
451
  this.form.controls[data.component[i].name].get("value").setValue("");
418
- this.searchInput.dictLookupObj[data.component[i].name].nameSelect = "";
452
+ this.searchInput.dictLookupObj[data.component[i].name].nameSelect =
453
+ "";
419
454
  this.searchInput.dictLookupObj[data.component[i].name].idSelect = "";
420
455
  this.form.controls["lookup_id_" + data.component[i].name].setValue("");
421
456
  }
422
457
  else {
423
- this.form.addControl("lookup_id_" + data.component[i].name, this.fb.control(''));
458
+ this.form.addControl("lookup_id_" + data.component[i].name, this.fb.control(""));
424
459
  }
425
460
  continue;
426
461
  }
427
462
  let controlName = data.component[i].name;
428
463
  let _value = data.component[i]?.value ?? "";
429
- if (data.component[i].type === 'datepicker' || data.component[i].type === 'numeric' || data.component[i].type === 'currency')
464
+ if (data.component[i].type === "datepicker" ||
465
+ data.component[i].type === "numeric" ||
466
+ data.component[i].type === "currency")
430
467
  controlName += i;
431
- if (data.component[i].type === 'dropdown' && _value === "") {
432
- if (data.component[i].ddlType === 'one')
433
- _value = 'one';
434
- else if (data.component[i].ddlType === 'all' || data.component[i].ddlType === undefined)
435
- _value = 'all';
436
- }
437
- if (data.component[i].type === 'year') {
468
+ if (data.component[i].type === "dropdown" && _value === "") {
469
+ if (data.component[i].ddlType === "one")
470
+ _value = "one";
471
+ else if (data.component[i].ddlType === "all" ||
472
+ data.component[i].ddlType === undefined)
473
+ _value = "all";
474
+ }
475
+ if (data.component[i].type === "year") {
438
476
  _value = this.yearNow;
439
477
  }
440
478
  if (isInit) {
441
- this.form.addControl(controlName, this.fb.control(''));
479
+ this.form.addControl(controlName, this.fb.control(""));
442
480
  }
443
481
  this.form.controls[controlName].setValue(_value);
444
482
  if (data.component[i].isRequired) {
@@ -447,11 +485,16 @@ export class UCSearchComponent {
447
485
  formControl.setValidators(listValidators);
448
486
  formControl.updateValueAndValidity();
449
487
  }
450
- if (data.component[i].type === "numeric" || data.component[i].type === "currency") {
451
- if (data.component[i].min !== null && data.component[i].min !== undefined && data.component[i].min !== "") {
488
+ if (data.component[i].type === "numeric" ||
489
+ data.component[i].type === "currency") {
490
+ if (data.component[i].min !== null &&
491
+ data.component[i].min !== undefined &&
492
+ data.component[i].min !== "") {
452
493
  this.setValidatorNumber("MIN", data.component[i].min, this.form.controls[controlName]);
453
494
  }
454
- if (data.component[i].max !== null && data.component[i].max !== undefined && data.component[i].max !== "") {
495
+ if (data.component[i].max !== null &&
496
+ data.component[i].max !== undefined &&
497
+ data.component[i].max !== "") {
455
498
  this.setValidatorNumber("MAX", data.component[i].max, this.form.controls[controlName]);
456
499
  }
457
500
  }
@@ -460,10 +503,12 @@ export class UCSearchComponent {
460
503
  // enable search button to click and interact
461
504
  this.searchBtnReady = true;
462
505
  for (let j = 0; j < this.countForm; j++) {
463
- if (data.component[j].isEvent && this.configuration.component[j].itemsUrl.length == 1) {
506
+ if (data.component[j].isEvent &&
507
+ this.configuration.component[j].itemsUrl.length == 1) {
464
508
  this.onChangeEvent(data.component[j].itemsUrl[0].Key, data.component[j]);
465
509
  }
466
- if (data.component[j].type == "officeRoleCodes" && this.configuration.component[j].itemsUrl.length > 0) {
510
+ if (data.component[j].type == "officeRoleCodes" &&
511
+ this.configuration.component[j].itemsUrl.length > 0) {
467
512
  this.SetRoleOfficeCodes(j);
468
513
  }
469
514
  }
@@ -533,7 +578,8 @@ export class UCSearchComponent {
533
578
  let component = this.myForm.nativeElement[i];
534
579
  let ddl = component.options;
535
580
  let text = ddl[ddl.selectedIndex].value.trim();
536
- if (this.configuration.component[i].itemsUrl.length == 1 || (this.configuration.component[i].ddlType == 'all' && text == 'all')) {
581
+ if (this.configuration.component[i].itemsUrl.length == 1 ||
582
+ (this.configuration.component[i].ddlType == "all" && text == "all")) {
537
583
  for (let index = 0; index < this.configuration.component[i].itemsUrl.length; index++) {
538
584
  const element = this.configuration.component[i].itemsUrl[index];
539
585
  listOfficeRoleCodes.push(element.Key);
@@ -544,7 +590,8 @@ export class UCSearchComponent {
544
590
  listOfficeRoleCodes.push(text);
545
591
  listOfficeRoleCodes.push(roleCode + "-" + text);
546
592
  }
547
- this.searchInput.integrationObj.requestObj["OfficeRoleCodes"] = listOfficeRoleCodes;
593
+ this.searchInput.integrationObj.requestObj["OfficeRoleCodes"] =
594
+ listOfficeRoleCodes;
548
595
  this.updateKeyValDict({
549
596
  key: this.configuration.component[i].name,
550
597
  value: text,
@@ -619,7 +666,10 @@ export class UCSearchComponent {
619
666
  let toMin = this.BusinessDt.getFullYear();
620
667
  let toMax = this.BusinessDt.getFullYear();
621
668
  let minMax = parseInt(year.substring(equation.index + equation[0].length));
622
- this.ListOfYear.push({ key: this.BusinessDt.getFullYear(), value: this.BusinessDt.getFullYear().toString() });
669
+ this.ListOfYear.push({
670
+ key: this.BusinessDt.getFullYear(),
671
+ value: this.BusinessDt.getFullYear().toString(),
672
+ });
623
673
  for (let q = 0; q < minMax; q++) {
624
674
  if (equation[0] == "-+" || equation[0] == "+-") {
625
675
  toMin--;
@@ -655,7 +705,7 @@ export class UCSearchComponent {
655
705
  this.GenerateReport(this.searchForm);
656
706
  return;
657
707
  }
658
- let filtered = this.configuration.component.filter((item, i, arr) => arr.findIndex((x) => (x.name === item.name)) === i);
708
+ let filtered = this.configuration.component.filter((item, i, arr) => arr.findIndex((x) => x.name === item.name) === i);
659
709
  for (let i = 0; i < filtered.length; i++) {
660
710
  if (filtered[i].type == "numeric") {
661
711
  if (!this.checkValueGteLte(filtered[i]))
@@ -664,10 +714,11 @@ export class UCSearchComponent {
664
714
  }
665
715
  let order = null;
666
716
  if (this.configuration.orderby != null) {
667
- if (this.configuration.orderby.key !== "" && this.configuration.orderby.value !== "") {
717
+ if (this.configuration.orderby.key !== "" &&
718
+ this.configuration.orderby.value !== "") {
668
719
  order = {
669
720
  key: this.configuration.orderby.key,
670
- value: this.configuration.orderby.value
721
+ value: this.configuration.orderby.value,
671
722
  };
672
723
  }
673
724
  }
@@ -684,12 +735,25 @@ export class UCSearchComponent {
684
735
  }
685
736
  checkSubmitDate(component) {
686
737
  const _comp = this.configuration.component;
687
- const MinComponentIdx = this.configuration.component.findIndex(x => x.datepickerPair == component.datepickerPair && (x.restriction.toUpperCase() == "GTE")) === -1 ? this.configuration.component.findIndex(x => x.datepickerPair == component.datepickerPair && (x.restriction.toUpperCase() == "GT")) : this.configuration.component.findIndex(x => x.datepickerPair == component.datepickerPair && (x.restriction.toUpperCase() == "GTE"));
688
- const MaxComponentIdx = this.configuration.component.findIndex(x => x.datepickerPair == component.datepickerPair && (x.restriction.toUpperCase() == "LTE")) === -1 ? this.configuration.component.findIndex(x => x.datepickerPair == component.datepickerPair && (x.restriction.toUpperCase() == "LT")) : this.configuration.component.findIndex(x => x.datepickerPair == component.datepickerPair && (x.restriction.toUpperCase() == "LTE"));
738
+ const MinComponentIdx = this.configuration.component.findIndex((x) => x.datepickerPair == component.datepickerPair &&
739
+ x.restriction.toUpperCase() == "GTE") === -1
740
+ ? this.configuration.component.findIndex((x) => x.datepickerPair == component.datepickerPair &&
741
+ x.restriction.toUpperCase() == "GT")
742
+ : this.configuration.component.findIndex((x) => x.datepickerPair == component.datepickerPair &&
743
+ x.restriction.toUpperCase() == "GTE");
744
+ const MaxComponentIdx = this.configuration.component.findIndex((x) => x.datepickerPair == component.datepickerPair &&
745
+ x.restriction.toUpperCase() == "LTE") === -1
746
+ ? this.configuration.component.findIndex((x) => x.datepickerPair == component.datepickerPair &&
747
+ x.restriction.toUpperCase() == "LT")
748
+ : this.configuration.component.findIndex((x) => x.datepickerPair == component.datepickerPair &&
749
+ x.restriction.toUpperCase() == "LTE");
689
750
  if (MinComponentIdx === -1 || MaxComponentIdx === -1)
690
751
  return true;
691
- if (this.form.controls[_comp[MinComponentIdx].name + MinComponentIdx].value > this.form.controls[_comp[MaxComponentIdx].name + MaxComponentIdx].value) {
692
- this.toastr.warning(_comp[MinComponentIdx].label + " must be less than " + _comp[MaxComponentIdx].label);
752
+ if (this.form.controls[_comp[MinComponentIdx].name + MinComponentIdx].value >
753
+ this.form.controls[_comp[MaxComponentIdx].name + MaxComponentIdx].value) {
754
+ this.toastr.warning(_comp[MinComponentIdx].label +
755
+ " must be less than " +
756
+ _comp[MaxComponentIdx].label);
693
757
  return false;
694
758
  }
695
759
  return true;
@@ -704,10 +768,20 @@ export class UCSearchComponent {
704
768
  // this.toastr.warning(_comp[MinComponentIdx].label + " must be less than " + _comp[MaxComponentIdx].label);
705
769
  // return false;
706
770
  // }
707
- let MinComponent = this.configuration.component.find(x => x.numericPair == component.numericPair && (x.restriction.toUpperCase() == "GTE")) == undefined ? this.configuration.component.find(x => x.numericPair == component.numericPair && (x.restriction.toUpperCase() == "GT")) : this.configuration.component.find(x => x.numericPair == component.numericPair && (x.restriction.toUpperCase() == "GTE"));
708
- let MaxComponent = this.configuration.component.find(x => x.numericPair == component.numericPair && (x.restriction.toUpperCase() == "LTE")) == undefined ? this.configuration.component.find(x => x.numericPair == component.numericPair && (x.restriction.toUpperCase() == "LT")) : this.configuration.component.find(x => x.numericPair == component.numericPair && (x.restriction.toUpperCase() == "LTE"));
709
- const _min = parseFloat(myform.nativeElement[MinComponent.id].value.replace(/,/g, ''));
710
- const _max = parseFloat(myform.nativeElement[MaxComponent.id].value.replace(/,/g, ''));
771
+ let MinComponent = this.configuration.component.find((x) => x.numericPair == component.numericPair &&
772
+ x.restriction.toUpperCase() == "GTE") == undefined
773
+ ? this.configuration.component.find((x) => x.numericPair == component.numericPair &&
774
+ x.restriction.toUpperCase() == "GT")
775
+ : this.configuration.component.find((x) => x.numericPair == component.numericPair &&
776
+ x.restriction.toUpperCase() == "GTE");
777
+ let MaxComponent = this.configuration.component.find((x) => x.numericPair == component.numericPair &&
778
+ x.restriction.toUpperCase() == "LTE") == undefined
779
+ ? this.configuration.component.find((x) => x.numericPair == component.numericPair &&
780
+ x.restriction.toUpperCase() == "LT")
781
+ : this.configuration.component.find((x) => x.numericPair == component.numericPair &&
782
+ x.restriction.toUpperCase() == "LTE");
783
+ const _min = parseFloat(myform.nativeElement[MinComponent.id].value.replace(/,/g, ""));
784
+ const _max = parseFloat(myform.nativeElement[MaxComponent.id].value.replace(/,/g, ""));
711
785
  if (_min > _max) {
712
786
  this.toastr.warning(MinComponent.label + " must be less than " + MaxComponent.label);
713
787
  return false;
@@ -729,27 +803,35 @@ export class UCSearchComponent {
729
803
  const mappedConfNameValue = {};
730
804
  for (let [index, val] of this.configuration.component.entries()) {
731
805
  let _name = val.name;
732
- if (val.type === "datepicker" || val.type === "numeric" || val.type === "currency")
806
+ if (val.type === "datepicker" ||
807
+ val.type === "numeric" ||
808
+ val.type === "currency")
733
809
  _name += index;
734
810
  mappedConfNameValue[_name] = {
735
- value: this.form.controls[_name].value
811
+ value: this.form.controls[_name].value,
736
812
  };
737
813
  }
738
814
  // Inject whereQuery for where criteria
739
- if (this.searchInput.whereValue != undefined && this.searchInput.whereValue.length != 0) {
815
+ if (this.searchInput.whereValue != undefined &&
816
+ this.searchInput.whereValue.length != 0) {
740
817
  this.configuration.querystring.whereQuery = new Array();
741
818
  for (let x = 0; x < this.searchInput.whereValue.length; x++) {
742
819
  // read value based on search component value - if not found, will hardcoded
743
- const _val = mappedConfNameValue[this.searchInput.whereValue[x].value] ? mappedConfNameValue[this.searchInput.whereValue[x].value].value : this.searchInput.whereValue[x].value;
820
+ const _val = mappedConfNameValue[this.searchInput.whereValue[x].value]
821
+ ? mappedConfNameValue[this.searchInput.whereValue[x].value].value
822
+ : this.searchInput.whereValue[x].value;
744
823
  // this.configuration.querystring.whereQuery.push(this.searchInput.whereValue[x].value);
745
824
  this.configuration.querystring.whereQuery.push(_val);
746
825
  }
747
826
  }
748
- if (this.searchInput.fromValue != undefined && this.searchInput.fromValue.length != 0) {
827
+ if (this.searchInput.fromValue != undefined &&
828
+ this.searchInput.fromValue.length != 0) {
749
829
  this.configuration.querystring.fromQuery = new Array();
750
830
  for (let x = 0; x < this.searchInput.fromValue.length; x++) {
751
831
  // read value based on search component value - if not found, will hardcoded
752
- const _val = mappedConfNameValue[this.searchInput.fromValue[x].value] ? mappedConfNameValue[this.searchInput.fromValue[x].value].value : this.searchInput.fromValue[x].value;
832
+ const _val = mappedConfNameValue[this.searchInput.fromValue[x].value]
833
+ ? mappedConfNameValue[this.searchInput.fromValue[x].value].value
834
+ : this.searchInput.fromValue[x].value;
753
835
  // this.configuration.querystring.fromQuery.push(this.searchInput.fromValue[x].value);
754
836
  this.configuration.querystring.fromQuery.push(_val);
755
837
  }
@@ -759,9 +841,9 @@ export class UCSearchComponent {
759
841
  request.orderBy = orderBy;
760
842
  request.queryString = this.configuration.querystring;
761
843
  let filtered = this.configuration.component.filter((item, i, arr) => {
762
- if (item.datepickerPair === undefined || item.datepickerPair === '')
844
+ if (item.datepickerPair === undefined || item.datepickerPair === "")
763
845
  return;
764
- return arr.findIndex((x) => (x.datepickerPair === item.datepickerPair)) === i;
846
+ return (arr.findIndex((x) => x.datepickerPair === item.datepickerPair) === i);
765
847
  });
766
848
  for (let i = 0; i < filtered.length; i++) {
767
849
  if (filtered[i].type == "datepicker") {
@@ -770,13 +852,14 @@ export class UCSearchComponent {
770
852
  }
771
853
  }
772
854
  let filteredNumeric = this.configuration.component.filter((item, i, arr) => {
773
- if (item.numericPair === undefined || item.numericPair === '')
855
+ if (item.numericPair === undefined || item.numericPair === "")
774
856
  return;
775
- return arr.findIndex((x) => (x.numericPair === item.numericPair)) === i;
857
+ return arr.findIndex((x) => x.numericPair === item.numericPair) === i;
776
858
  });
777
859
  for (let i = 0; i < filteredNumeric.length; i++) {
778
860
  0;
779
- if (filteredNumeric[i].type == "numeric" || filteredNumeric[i].type == "currency") {
861
+ if (filteredNumeric[i].type == "numeric" ||
862
+ filteredNumeric[i].type == "currency") {
780
863
  if (!this.checkNumericPair(filteredNumeric[i], this.myForm))
781
864
  return;
782
865
  }
@@ -799,27 +882,33 @@ export class UCSearchComponent {
799
882
  if (this.configuration.component[i].type === "lookup") {
800
883
  _componentValue = `${this.form.controls["lookup_id_" + this.configuration.component[i].name].value ?? ""}`;
801
884
  }
802
- else if (this.configuration.component[i].type === "datepicker" || this.configuration.component[i].type === "numeric" || this.configuration.component[i].type === "currency") {
803
- _componentValue = `${this.form.controls[this.configuration.component[i].name + i].value ?? ""}`;
885
+ else if (this.configuration.component[i].type === "datepicker" ||
886
+ this.configuration.component[i].type === "numeric" ||
887
+ this.configuration.component[i].type === "currency") {
888
+ _componentValue = `${this.form.controls[this.configuration.component[i].name + i].value ??
889
+ ""}`;
804
890
  }
805
- critObj.DataType = component.getAttribute('data-type');
891
+ critObj.DataType = component.getAttribute("data-type");
806
892
  if (!critObj.DataType)
807
893
  critObj.DataType = "";
808
894
  //Ini khusus kalau dari Drop Down
809
- if (component.getAttribute('query-in') != null && component.getAttribute('query-in') == "true") {
895
+ if (component.getAttribute("query-in") != null &&
896
+ component.getAttribute("query-in") == "true") {
810
897
  IsQueryIn = true;
811
898
  }
812
899
  else {
813
900
  IsQueryIn = false;
814
901
  }
815
- if (component.nodeName == 'SELECT') {
902
+ if (component.nodeName == "SELECT") {
816
903
  let ddl = component.options;
817
- if (ddl.selectedIndex === -1 && ddl.length === 1 && _componentValue == "") {
904
+ if (ddl.selectedIndex === -1 &&
905
+ ddl.length === 1 &&
906
+ _componentValue == "") {
818
907
  _componentValue = "SELECT_TEMP";
819
908
  }
820
909
  }
821
910
  if (_componentValue != "") {
822
- if (component.nodeName == 'SELECT') {
911
+ if (component.nodeName == "SELECT") {
823
912
  let ddl = component.options;
824
913
  if (ddl.selectedIndex === -1 && ddl.length === 1) {
825
914
  ddl.selectedIndex = 0;
@@ -827,12 +916,13 @@ export class UCSearchComponent {
827
916
  let text = ddl[ddl.selectedIndex].value.trim();
828
917
  if (text == "one") {
829
918
  IsBreak = true;
830
- let label = component.getAttribute('label');
919
+ let label = component.getAttribute("label");
831
920
  this.toastr.warning("Please select " + label);
832
921
  break;
833
922
  }
834
- if (component.getAttribute('data-crit-datatable') != "" && component.getAttribute('data-crit-datatable') != null) {
835
- critObj.isCriteriaDataTable = component.getAttribute('data-crit-datatable');
923
+ if (component.getAttribute("data-crit-datatable") != "" &&
924
+ component.getAttribute("data-crit-datatable") != null) {
925
+ critObj.isCriteriaDataTable = component.getAttribute("data-crit-datatable");
836
926
  }
837
927
  if (this.configuration.component[i].type == "taskDefinitionKey" ||
838
928
  this.configuration.component[i].type == "processKey") {
@@ -842,7 +932,7 @@ export class UCSearchComponent {
842
932
  continue;
843
933
  }
844
934
  if (this.configuration.component[i].type == "claim") {
845
- critObj.propName = component.getAttribute('data-name');
935
+ critObj.propName = component.getAttribute("data-name");
846
936
  critObj.restriction = text;
847
937
  critObj.value = null;
848
938
  if (!isAddToTemp) {
@@ -857,10 +947,10 @@ export class UCSearchComponent {
857
947
  critObj.propName = component.name;
858
948
  }
859
949
  else {
860
- critObj.propName = component.getAttribute('data-name');
950
+ critObj.propName = component.getAttribute("data-name");
861
951
  }
862
952
  critObj.value = text;
863
- const restriction = component.getAttribute('data-restriction');
953
+ const restriction = component.getAttribute("data-restriction");
864
954
  if (restriction != "" && restriction != null) {
865
955
  // override restriction
866
956
  critObj.restriction = restriction;
@@ -872,7 +962,9 @@ export class UCSearchComponent {
872
962
  arrCrit.push(critObj);
873
963
  }
874
964
  }
875
- else if (text == "all" && IsQueryIn && component.options.length != 0) {
965
+ else if (text == "all" &&
966
+ IsQueryIn &&
967
+ component.options.length != 0) {
876
968
  let ddlList = new Array();
877
969
  for (let x = 0; x < component.options.length; x++) {
878
970
  if (x != 0) {
@@ -885,7 +977,7 @@ export class UCSearchComponent {
885
977
  critObj.propName = component.name;
886
978
  }
887
979
  else {
888
- critObj.propName = component.getAttribute('data-name');
980
+ critObj.propName = component.getAttribute("data-name");
889
981
  }
890
982
  critObj.listValue = ddlList;
891
983
  if (!isAddToTemp) {
@@ -906,7 +998,7 @@ export class UCSearchComponent {
906
998
  critObj.propName = component.name;
907
999
  }
908
1000
  else {
909
- critObj.propName = component.getAttribute('data-name');
1001
+ critObj.propName = component.getAttribute("data-name");
910
1002
  }
911
1003
  critObj.listValue = ddlList;
912
1004
  if (!isAddToTemp) {
@@ -917,8 +1009,9 @@ export class UCSearchComponent {
917
1009
  }
918
1010
  }
919
1011
  else {
920
- const compDataType = component.getAttribute('data-type');
921
- if (compDataType === 'lookup' || (compDataType === "date" && this.useNewDatepicker)) {
1012
+ const compDataType = component.getAttribute("data-type");
1013
+ if (compDataType === "lookup" ||
1014
+ (compDataType === "date" && this.useNewDatepicker)) {
922
1015
  formSeq++;
923
1016
  }
924
1017
  //Kalau ada Percent maka yang dipake nnti adalah Restrictions Like
@@ -926,12 +1019,12 @@ export class UCSearchComponent {
926
1019
  critObj.propName = component.name;
927
1020
  }
928
1021
  else {
929
- critObj.propName = component.getAttribute('data-name');
1022
+ critObj.propName = component.getAttribute("data-name");
930
1023
  }
931
1024
  if (this.configuration.component[i].type === "datepicker" ||
932
1025
  this.configuration.component[i].type === "numeric" ||
933
1026
  this.configuration.component[i].type === "currency") {
934
- critObj.propName = component.getAttribute('data-name');
1027
+ critObj.propName = component.getAttribute("data-name");
935
1028
  }
936
1029
  critObj.value = _componentValue;
937
1030
  // normalize data type from lookup to text;
@@ -939,14 +1032,16 @@ export class UCSearchComponent {
939
1032
  critObj.DataType = "text";
940
1033
  if (_componentValue.includes("%")) {
941
1034
  critObj.restriction = AdInsConstant.RestrictionLike;
942
- _componentValue = this.removeTrailingBackslashesAfterPercent(_componentValue);
1035
+ _componentValue =
1036
+ this.removeTrailingBackslashesAfterPercent(_componentValue);
943
1037
  critObj.value = _componentValue;
944
1038
  }
945
1039
  //kalau componentnya Date, restrictionsnya lgsg ambil dari property JSONnya
946
- else if (component.getAttribute('data-restriction') != "" && component.getAttribute('data-restriction') != null) {
947
- critObj.restriction = component.getAttribute('data-restriction');
948
- if (component.getAttribute('data-type') == 'numeric') {
949
- critObj.value = parseFloat(_componentValue.replace(/,/g, '')).toString();
1040
+ else if (component.getAttribute("data-restriction") != "" &&
1041
+ component.getAttribute("data-restriction") != null) {
1042
+ critObj.restriction = component.getAttribute("data-restriction");
1043
+ if (component.getAttribute("data-type") == "numeric") {
1044
+ critObj.value = parseFloat(_componentValue.replace(/,/g, "")).toString();
950
1045
  }
951
1046
  if (critObj.restriction.toUpperCase() == "LIKE") {
952
1047
  critObj.value = "%" + _componentValue.trim() + "%";
@@ -956,16 +1051,18 @@ export class UCSearchComponent {
956
1051
  else {
957
1052
  critObj.restriction = AdInsConstant.RestrictionEq;
958
1053
  }
959
- if (component.getAttribute('data-crit-datatable') != "" && component.getAttribute('data-crit-datatable') != null) {
960
- critObj.isCriteriaDataTable = component.getAttribute('data-crit-datatable');
1054
+ if (component.getAttribute("data-crit-datatable") != "" &&
1055
+ component.getAttribute("data-crit-datatable") != null) {
1056
+ critObj.isCriteriaDataTable = component.getAttribute("data-crit-datatable");
961
1057
  }
962
1058
  let skipPushToCrit = false;
963
- if (this.configuration.component[i].type === 'time') {
1059
+ if (this.configuration.component[i].type === "time") {
964
1060
  // check is standalone or not
965
1061
  const useTimePair = this.configuration.component[i].useTimePair;
966
1062
  if (useTimePair) {
967
1063
  skipPushToCrit = true;
968
- const indexPair = arrCrit.findIndex(x => x.propName === this.configuration.component[i].timePair && x.restriction === this.configuration.component[i].restriction);
1064
+ const indexPair = arrCrit.findIndex((x) => x.propName === this.configuration.component[i].timePair &&
1065
+ x.restriction === this.configuration.component[i].restriction);
969
1066
  if (indexPair > -1) {
970
1067
  const _value = new Date(arrCrit[indexPair].value);
971
1068
  // Extract the date components
@@ -974,7 +1071,10 @@ export class UCSearchComponent {
974
1071
  const day = _value.getUTCDate();
975
1072
  // Extract time components
976
1073
  const [hours, minutes] = _componentValue.split(":").map(Number);
977
- const result = new Date(Date.UTC(year, month, day, hours, minutes, 0)).toISOString().replace("T", " ").replace("Z", "");
1074
+ const result = new Date(Date.UTC(year, month, day, hours, minutes, 0))
1075
+ .toISOString()
1076
+ .replace("T", " ")
1077
+ .replace("Z", "");
978
1078
  arrCrit[indexPair].value = result;
979
1079
  }
980
1080
  }
@@ -985,8 +1085,9 @@ export class UCSearchComponent {
985
1085
  }
986
1086
  }
987
1087
  else {
988
- const compDataType = component.getAttribute('data-type');
989
- if (compDataType === 'lookup' || (compDataType === "date" && this.useNewDatepicker)) {
1088
+ const compDataType = component.getAttribute("data-type");
1089
+ if (compDataType === "lookup" ||
1090
+ (compDataType === "date" && this.useNewDatepicker)) {
990
1091
  formSeq++;
991
1092
  }
992
1093
  }
@@ -1000,13 +1101,15 @@ export class UCSearchComponent {
1000
1101
  arrCrit.push(addCrit[i]);
1001
1102
  }
1002
1103
  }
1003
- else if (this.searchInput.addCritInput != null || this.searchInput.addCritInput != undefined) {
1104
+ else if (this.searchInput.addCritInput != null ||
1105
+ this.searchInput.addCritInput != undefined) {
1004
1106
  for (let i = 0; i < this.searchInput.addCritInput.length; i++) {
1005
1107
  arrCrit.push(this.searchInput.addCritInput[i]);
1006
1108
  }
1007
1109
  }
1008
1110
  }
1009
- else if (this.searchInput.addCritInput != null || this.searchInput.addCritInput != undefined) {
1111
+ else if (this.searchInput.addCritInput != null ||
1112
+ this.searchInput.addCritInput != undefined) {
1010
1113
  for (let i = 0; i < this.searchInput.addCritInput.length; i++) {
1011
1114
  arrCrit.push(this.searchInput.addCritInput[i]);
1012
1115
  }
@@ -1025,12 +1128,15 @@ export class UCSearchComponent {
1025
1128
  request.criteria = this.filterDuplicateData(request.criteria);
1026
1129
  // filter empty value in listValue
1027
1130
  request.criteria = this.filterListValueEmpty(request.criteria);
1131
+ // filter empty propName
1132
+ request.criteria = this.filterEmptyPropName(request.criteria);
1028
1133
  request.integrationObj = null;
1029
1134
  if (this.searchInput.isJoinExAPI) {
1030
1135
  request.integrationObj = this.searchInput.integrationObj;
1031
1136
  }
1032
1137
  this.isSearch = true;
1033
- if (this.searchInput.dataInput !== undefined && Object.keys(this.searchInput.dataInput).length !== 0) {
1138
+ if (this.searchInput.dataInput !== undefined &&
1139
+ Object.keys(this.searchInput.dataInput).length !== 0) {
1034
1140
  bodyList = this.searchInput.dataInput.bodyList;
1035
1141
  fileName = this.searchInput.dataInput.title;
1036
1142
  headerList = this.searchInput.dataInput.headerList;
@@ -1038,7 +1144,10 @@ export class UCSearchComponent {
1038
1144
  excludeExportList = this.searchInput.dataInput.excludeExportList;
1039
1145
  }
1040
1146
  else {
1041
- await this.http.get(this.searchInput._url).toPromise().then((data) => {
1147
+ await this.http
1148
+ .get(this.searchInput._url)
1149
+ .toPromise()
1150
+ .then((data) => {
1042
1151
  bodyList = data.bodyList;
1043
1152
  fileName = data.title;
1044
1153
  headerList = data.headerList;
@@ -1061,7 +1170,7 @@ export class UCSearchComponent {
1061
1170
  if (extFile === EXPORT_DATA_TYPES.csv) {
1062
1171
  this.exportFileService.exportFileAsCsv(dataFile, fileName);
1063
1172
  }
1064
- const $sequence = Math.round(response['Count'] / rowPerPage);
1173
+ const $sequence = Math.round(response["Count"] / rowPerPage);
1065
1174
  if ($sequence > 1 && $sequence > pageNo) {
1066
1175
  pageNo = pageNo + 1;
1067
1176
  setTimeout(() => this.search(apiUrl, pageNo, rowPerPage, orderBy, true, addCrit, IsExportExcel, extFile), 50);
@@ -1074,7 +1183,7 @@ export class UCSearchComponent {
1074
1183
  }
1075
1184
  let qryPaging = {
1076
1185
  response: response,
1077
- pageNow: pageNo
1186
+ pageNow: pageNo,
1078
1187
  };
1079
1188
  console.log(qryPaging);
1080
1189
  this.result.emit(qryPaging);
@@ -1085,9 +1194,10 @@ export class UCSearchComponent {
1085
1194
  filterDuplicateData(data) {
1086
1195
  return data.filter((value, index) => {
1087
1196
  const _value = JSON.stringify(value);
1088
- return index === data.findIndex(obj => {
1089
- return JSON.stringify(obj) === _value;
1090
- });
1197
+ return (index ===
1198
+ data.findIndex((obj) => {
1199
+ return JSON.stringify(obj) === _value;
1200
+ }));
1091
1201
  });
1092
1202
  }
1093
1203
  filterListValueEmpty(data) {
@@ -1099,21 +1209,29 @@ export class UCSearchComponent {
1099
1209
  return value;
1100
1210
  });
1101
1211
  }
1212
+ filterEmptyPropName(data) {
1213
+ return data.filter((value) => {
1214
+ // Filter out criteria with empty propName
1215
+ if (!value.propName || value.propName.trim() === '')
1216
+ return false;
1217
+ return true;
1218
+ });
1219
+ }
1102
1220
  removeTrailingBackslashesAfterPercent(str) {
1103
- if (typeof str !== 'string' || str?.length === 0) {
1221
+ if (typeof str !== "string" || str?.length === 0) {
1104
1222
  return str;
1105
1223
  }
1106
- return str.replace(/%(\\+)$/, '%');
1224
+ return str.replace(/%(\\+)$/, "%");
1107
1225
  }
1108
1226
  checkValueGteLte(component) {
1109
1227
  //cek yg pakai restriction gte/lte/gt/lt
1110
- let MinComponent = this.configuration.component.find(x => x.name == component.name && (x.restriction.toUpperCase() == "GTE"));
1228
+ let MinComponent = this.configuration.component.find((x) => x.name == component.name && x.restriction.toUpperCase() == "GTE");
1111
1229
  if (!MinComponent) {
1112
- MinComponent = this.configuration.component.find(x => x.name == component.name && (x.restriction.toUpperCase() == "GT"));
1230
+ MinComponent = this.configuration.component.find((x) => x.name == component.name && x.restriction.toUpperCase() == "GT");
1113
1231
  }
1114
- let MaxComponent = this.configuration.component.find(x => x.name == component.name && (x.restriction.toUpperCase() == "LTE"));
1232
+ let MaxComponent = this.configuration.component.find((x) => x.name == component.name && x.restriction.toUpperCase() == "LTE");
1115
1233
  if (!MaxComponent) {
1116
- MaxComponent = this.configuration.component.find(x => x.name == component.name && (x.restriction.toUpperCase() == "LT"));
1234
+ MaxComponent = this.configuration.component.find((x) => x.name == component.name && x.restriction.toUpperCase() == "LT");
1117
1235
  }
1118
1236
  if (MinComponent && MaxComponent) {
1119
1237
  let minValue = this.myForm.nativeElement[MinComponent.id].valueAsNumber;
@@ -1184,20 +1302,21 @@ export class UCSearchComponent {
1184
1302
  }
1185
1303
  checkNeedDataToExport(bodyListData, headerListData, idx) {
1186
1304
  // add json checker for data to export here
1187
- if (bodyListData[idx]['type'] != 'action') {
1305
+ if (bodyListData[idx]["type"] != "action") {
1188
1306
  return [
1189
1307
  true,
1190
- bodyListData[idx]['property'],
1191
- headerListData[idx]['label']
1308
+ bodyListData[idx]["property"],
1309
+ headerListData[idx]["label"],
1192
1310
  ];
1193
1311
  }
1194
- const actions = bodyListData[idx]['action'];
1195
- if (bodyListData[idx]['type'] == 'action' && actions[0]['type'] == 'switch'
1196
- && Boolean(actions[0]['case'][0]['result']['property'])) {
1312
+ const actions = bodyListData[idx]["action"];
1313
+ if (bodyListData[idx]["type"] == "action" &&
1314
+ actions[0]["type"] == "switch" &&
1315
+ Boolean(actions[0]["case"][0]["result"]["property"])) {
1197
1316
  return [
1198
1317
  true,
1199
- bodyListData[idx]['action'][0]['case'][0]['result']['property'],
1200
- headerListData[idx]['label']
1318
+ bodyListData[idx]["action"][0]["case"][0]["result"]["property"],
1319
+ headerListData[idx]["label"],
1201
1320
  ];
1202
1321
  }
1203
1322
  return [false, [], []];
@@ -1208,7 +1327,12 @@ export class UCSearchComponent {
1208
1327
  return;
1209
1328
  const _exportType = this.form.get("ExportType").value;
1210
1329
  const _rptExecType = this.form.get("RptExecType").value;
1211
- this.genRpt.emit({ ExportType: _exportType, RptExecType: _rptExecType, ElRef: this.myForm, formRaw: this.form.getRawValue() });
1330
+ this.genRpt.emit({
1331
+ ExportType: _exportType,
1332
+ RptExecType: _rptExecType,
1333
+ ElRef: this.myForm,
1334
+ formRaw: this.form.getRawValue(),
1335
+ });
1212
1336
  }
1213
1337
  lessThanFour() {
1214
1338
  if (this.countForm > 3) {
@@ -1220,27 +1344,38 @@ export class UCSearchComponent {
1220
1344
  }
1221
1345
  resolveObject(obj, url, crit = null) {
1222
1346
  const val = this.postJSON(url, crit);
1223
- val.subscribe(tempData => {
1224
- if (obj.customObjName == null || obj.customObjName == undefined || obj.customObjName == "") {
1347
+ val.subscribe((tempData) => {
1348
+ if (obj.customObjName == null ||
1349
+ obj.customObjName == undefined ||
1350
+ obj.customObjName == "") {
1225
1351
  obj.customObjName = "ReturnObject";
1226
1352
  }
1227
- if (obj.customKeyName == null || obj.customKeyName == undefined || obj.customKeyName == "") {
1353
+ if (obj.customKeyName == null ||
1354
+ obj.customKeyName == undefined ||
1355
+ obj.customKeyName == "") {
1228
1356
  obj.customKeyName = "Key";
1229
1357
  }
1230
- if (obj.customValueName == null || obj.customValueName == undefined || obj.customValueName == "") {
1358
+ if (obj.customValueName == null ||
1359
+ obj.customValueName == undefined ||
1360
+ obj.customValueName == "") {
1231
1361
  obj.customValueName = "Value";
1232
1362
  }
1233
1363
  const _data = [];
1234
1364
  for (let i = 0; i < tempData[obj.customObjName].length; i++) {
1235
1365
  _data.push({
1236
1366
  Key: tempData[obj.customObjName][i][obj.customKeyName],
1237
- Value: tempData[obj.customObjName][i][obj.customValueName]
1367
+ Value: tempData[obj.customObjName][i][obj.customValueName],
1238
1368
  });
1239
1369
  }
1240
1370
  obj.itemsUrl = new Array();
1241
1371
  const userAccess = this.getUserAccess();
1242
- if (obj.type == "officeRoleCodes" && obj.isLockHo && userAccess["MrOfficeTypeCode"] == "HO") {
1243
- let keyValueObj = { Key: userAccess["OfficeCode"], Value: userAccess["OfficeName"] };
1372
+ if (obj.type == "officeRoleCodes" &&
1373
+ obj.isLockHo &&
1374
+ userAccess["MrOfficeTypeCode"] == "HO") {
1375
+ let keyValueObj = {
1376
+ Key: userAccess["OfficeCode"],
1377
+ Value: userAccess["OfficeName"],
1378
+ };
1244
1379
  obj.itemsUrl.push(keyValueObj);
1245
1380
  }
1246
1381
  else {
@@ -1269,7 +1404,7 @@ export class UCSearchComponent {
1269
1404
  });
1270
1405
  }
1271
1406
  transformToDecimal(element) {
1272
- element.target.value = parseFloat(element.target.value.toString().replace(/,/g, ''));
1407
+ element.target.value = parseFloat(element.target.value.toString().replace(/,/g, ""));
1273
1408
  }
1274
1409
  exportAsFile(extFile) {
1275
1410
  this.searchClick(true, extFile);
@@ -1316,7 +1451,8 @@ export class UCSearchComponent {
1316
1451
  else {
1317
1452
  const critObj = new CriteriaObj();
1318
1453
  critObj.DataType = afFilter.datatype;
1319
- if (afFilter.filterPropName != undefined || afFilter.filterPropName != "") {
1454
+ if (afFilter.filterPropName != undefined ||
1455
+ afFilter.filterPropName != "") {
1320
1456
  request[afFilter.filterPropName] = optValue;
1321
1457
  critObj.propName = afFilter.filterPropName;
1322
1458
  this.valueDict[afFilter.filterPropName] = optValue;
@@ -1337,10 +1473,13 @@ export class UCSearchComponent {
1337
1473
  }
1338
1474
  request.criteria = arrayCrit;
1339
1475
  if (jsonComp[j].path != undefined && jsonComp[j].path != "") {
1340
- if (this.searchInput.listEnvironments != undefined && this.searchInput.listEnvironments.length != 0) {
1476
+ if (this.searchInput.listEnvironments != undefined &&
1477
+ this.searchInput.listEnvironments.length != 0) {
1341
1478
  for (let y = 0; y < this.searchInput.listEnvironments.length; y++) {
1342
- if (jsonComp[j].environment == this.searchInput.listEnvironments[y].environment) {
1343
- jsonComp[j].fullpath = this.searchInput.listEnvironments[y].url + jsonComp[j].path;
1479
+ if (jsonComp[j].environment ==
1480
+ this.searchInput.listEnvironments[y].environment) {
1481
+ jsonComp[j].fullpath =
1482
+ this.searchInput.listEnvironments[y].url + jsonComp[j].path;
1344
1483
  break;
1345
1484
  }
1346
1485
  }
@@ -1381,8 +1520,8 @@ export class UCSearchComponent {
1381
1520
  let component = this.myForm.nativeElement[idx];
1382
1521
  let ddl = component.options;
1383
1522
  let text = ddl[ddl.selectedIndex].value.trim();
1384
- let listValue = text.split(';');
1385
- let listWfKey = wfKeyFilter.split(';');
1523
+ let listValue = text.split(";");
1524
+ let listWfKey = wfKeyFilter.split(";");
1386
1525
  for (let i = 0; i < listValue.length; i++) {
1387
1526
  this.searchInput.integrationObj.requestObj[listWfKey[i]] = listValue[i];
1388
1527
  }
@@ -1390,10 +1529,11 @@ export class UCSearchComponent {
1390
1529
  switchCase(condList) {
1391
1530
  let condition = false;
1392
1531
  for (let i = 0; i < condList.conditions.length; i++) {
1393
- let idx = this.searchInput.switchValue.findIndex(x => x.property == condList.conditions[i].property);
1532
+ let idx = this.searchInput.switchValue.findIndex((x) => x.property == condList.conditions[i].property);
1394
1533
  if (condList.conditions[i].restriction == "EQ") {
1395
1534
  if (!condList.conditions[i].isUser) {
1396
- if (this.searchInput.switchValue[idx].value == condList.conditions[i].value) {
1535
+ if (this.searchInput.switchValue[idx].value ==
1536
+ condList.conditions[i].value) {
1397
1537
  condition = true;
1398
1538
  }
1399
1539
  else {
@@ -1414,7 +1554,8 @@ export class UCSearchComponent {
1414
1554
  }
1415
1555
  else if (condList.conditions[i].restriction == "NEQ") {
1416
1556
  if (condList.conditions[i].isUser != true) {
1417
- if (this.searchInput.switchValue[idx].value != condList.conditions[i].value) {
1557
+ if (this.searchInput.switchValue[idx].value !=
1558
+ condList.conditions[i].value) {
1418
1559
  condition = true;
1419
1560
  }
1420
1561
  else {
@@ -1435,7 +1576,8 @@ export class UCSearchComponent {
1435
1576
  }
1436
1577
  else if (condList.conditions[i].restriction == "GT") {
1437
1578
  if (!condList.conditions[i].isUser) {
1438
- if (this.searchInput.switchValue[idx].value > condList.conditions[i].value) {
1579
+ if (this.searchInput.switchValue[idx].value >
1580
+ condList.conditions[i].value) {
1439
1581
  condition = true;
1440
1582
  }
1441
1583
  else {
@@ -1456,7 +1598,8 @@ export class UCSearchComponent {
1456
1598
  }
1457
1599
  else if (condList.conditions[i].restriction == "GTE") {
1458
1600
  if (!condList.conditions[i].isUser) {
1459
- if (this.searchInput.switchValue[idx].value >= condList.conditions[i].value) {
1601
+ if (this.searchInput.switchValue[idx].value >=
1602
+ condList.conditions[i].value) {
1460
1603
  condition = true;
1461
1604
  }
1462
1605
  else {
@@ -1477,7 +1620,8 @@ export class UCSearchComponent {
1477
1620
  }
1478
1621
  else if (condList.conditions[i].restriction == "LT") {
1479
1622
  if (!condList.conditions[i].isUser) {
1480
- if (this.searchInput.switchValue[idx].value < condList.conditions[i].value) {
1623
+ if (this.searchInput.switchValue[idx].value <
1624
+ condList.conditions[i].value) {
1481
1625
  condition = true;
1482
1626
  }
1483
1627
  else {
@@ -1498,7 +1642,8 @@ export class UCSearchComponent {
1498
1642
  }
1499
1643
  else if (condList.conditions[i].restriction == "LTE") {
1500
1644
  if (!condList.conditions[i].isUser) {
1501
- if (this.searchInput.switchValue[idx].value <= condList.conditions[i].value) {
1645
+ if (this.searchInput.switchValue[idx].value <=
1646
+ condList.conditions[i].value) {
1502
1647
  condition = true;
1503
1648
  }
1504
1649
  else {
@@ -1521,12 +1666,16 @@ export class UCSearchComponent {
1521
1666
  return condition;
1522
1667
  }
1523
1668
  DecryptString(chipperText, chipperKey) {
1524
- if (chipperKey == undefined || chipperKey.trim() == '' ||
1525
- chipperText == undefined || chipperText.trim() == '')
1669
+ if (chipperKey == undefined ||
1670
+ chipperKey.trim() == "" ||
1671
+ chipperText == undefined ||
1672
+ chipperText.trim() == "")
1526
1673
  return chipperText;
1527
1674
  let chipperKeyArr = CryptoJS.enc.Utf8.parse(chipperKey);
1528
1675
  let iv = CryptoJS.lib.WordArray.create([0x00, 0x00, 0x00, 0x00]);
1529
- let decrypted = CryptoJS.AES.decrypt(chipperText, chipperKeyArr, { iv: iv });
1676
+ let decrypted = CryptoJS.AES.decrypt(chipperText, chipperKeyArr, {
1677
+ iv: iv,
1678
+ });
1530
1679
  let plainText = decrypted.toString(CryptoJS.enc.Utf8);
1531
1680
  return plainText;
1532
1681
  }
@@ -1536,7 +1685,7 @@ export class UCSearchComponent {
1536
1685
  dateWrong = this.checkMinMaxValidation(component);
1537
1686
  let udpatedValue = null;
1538
1687
  if (this.isValidDate(_componentValue)) {
1539
- udpatedValue = formatDate(new Date(_componentValue), "yyyy-MM-dd", 'en-US');
1688
+ udpatedValue = formatDate(new Date(_componentValue), "yyyy-MM-dd", "en-US");
1540
1689
  }
1541
1690
  this.updateKeyValDict({
1542
1691
  key: component.name,
@@ -1558,10 +1707,14 @@ export class UCSearchComponent {
1558
1707
  let dateWrong = false;
1559
1708
  const nativeEl = this.myForm.nativeElement.elements;
1560
1709
  const _comp = this.configuration.component;
1561
- let minComponentIdx = _comp.findIndex(x => x.name == component.name && (x.restriction.toUpperCase() == "GTE")) === -1 ? _comp.findIndex(x => x.name == component.name && (x.restriction.toUpperCase() == "GT")) : _comp.findIndex(x => x.name == component.name && (x.restriction.toUpperCase() == "GTE"));
1710
+ let minComponentIdx = _comp.findIndex((x) => x.name == component.name && x.restriction.toUpperCase() == "GTE") === -1
1711
+ ? _comp.findIndex((x) => x.name == component.name && x.restriction.toUpperCase() == "GT")
1712
+ : _comp.findIndex((x) => x.name == component.name && x.restriction.toUpperCase() == "GTE");
1562
1713
  if (minComponentIdx !== -1) {
1563
1714
  const _minComponentName = _comp[minComponentIdx].name + minComponentIdx;
1564
- minDateVal = this.isValidDate(nativeEl[_minComponentName].min) ? new Date(nativeEl[_minComponentName].min) : null;
1715
+ minDateVal = this.isValidDate(nativeEl[_minComponentName].min)
1716
+ ? new Date(nativeEl[_minComponentName].min)
1717
+ : null;
1565
1718
  label = _comp[minComponentIdx].label.split(">", 2);
1566
1719
  if (minDateVal != null) {
1567
1720
  if (_comp[minComponentIdx].restriction.toUpperCase() == "GT") {
@@ -1573,10 +1726,14 @@ export class UCSearchComponent {
1573
1726
  }
1574
1727
  }
1575
1728
  }
1576
- let maxComponentIdx = _comp.findIndex(x => x.name == component.name && (x.restriction.toUpperCase() == "LTE")) === -1 ? _comp.findIndex(x => x.name == component.name && (x.restriction.toUpperCase() == "LT")) : _comp.findIndex(x => x.name == component.name && (x.restriction.toUpperCase() == "LTE"));
1729
+ let maxComponentIdx = _comp.findIndex((x) => x.name == component.name && x.restriction.toUpperCase() == "LTE") === -1
1730
+ ? _comp.findIndex((x) => x.name == component.name && x.restriction.toUpperCase() == "LT")
1731
+ : _comp.findIndex((x) => x.name == component.name && x.restriction.toUpperCase() == "LTE");
1577
1732
  if (maxComponentIdx !== -1) {
1578
1733
  const _maxComponentName = _comp[maxComponentIdx].name + maxComponentIdx;
1579
- maxDateVal = this.isValidDate(nativeEl[_maxComponentName].max) ? new Date(nativeEl[_maxComponentName].max) : null;
1734
+ maxDateVal = this.isValidDate(nativeEl[_maxComponentName].max)
1735
+ ? new Date(nativeEl[_maxComponentName].max)
1736
+ : null;
1580
1737
  label = _comp[maxComponentIdx].label.split("<", 2);
1581
1738
  if (maxDateVal != null) {
1582
1739
  if (_comp[maxComponentIdx].restriction.toUpperCase() == "LT") {
@@ -1588,17 +1745,34 @@ export class UCSearchComponent {
1588
1745
  }
1589
1746
  }
1590
1747
  }
1591
- if (minDateVal != null && maxDateVal == null && new Date(this.form.controls[_comp[minComponentIdx].name + minComponentIdx].value) < minDateVal) {
1592
- this.toastr.warning(label[0] + errorMessage[0] + formatDate(minDateVal, 'dd MMMM yyyy', 'en-US') + ".");
1748
+ if (minDateVal != null &&
1749
+ maxDateVal == null &&
1750
+ new Date(this.form.controls[_comp[minComponentIdx].name + minComponentIdx].value) < minDateVal) {
1751
+ this.toastr.warning(label[0] +
1752
+ errorMessage[0] +
1753
+ formatDate(minDateVal, "dd MMMM yyyy", "en-US") +
1754
+ ".");
1593
1755
  dateWrong = true;
1594
1756
  }
1595
- else if (maxDateVal != null && minDateVal == null && new Date(this.form.controls[_comp[maxComponentIdx].name + maxComponentIdx].value) > maxDateVal) {
1596
- this.toastr.warning(label[0] + errorMessage[0] + formatDate(maxDateVal, 'dd MMMM yyyy', 'en-US') + ".");
1757
+ else if (maxDateVal != null &&
1758
+ minDateVal == null &&
1759
+ new Date(this.form.controls[_comp[maxComponentIdx].name + maxComponentIdx].value) > maxDateVal) {
1760
+ this.toastr.warning(label[0] +
1761
+ errorMessage[0] +
1762
+ formatDate(maxDateVal, "dd MMMM yyyy", "en-US") +
1763
+ ".");
1597
1764
  dateWrong = true;
1598
1765
  }
1599
1766
  else if (minDateVal != null && maxDateVal != null) {
1600
- if (new Date(this.form.controls[_comp[maxComponentIdx].name + maxComponentIdx].value) > maxDateVal || new Date(this.form.controls[_comp[minComponentIdx].name + minComponentIdx].value) < minDateVal) {
1601
- this.toastr.warning(label[0] + errorMessage[0] + formatDate(minDateVal, 'dd MMMM yyyy', 'en-US') + " and" + errorMessage[1] + formatDate(maxDateVal, 'dd MMMM yyyy', 'en-US') + ".");
1767
+ if (new Date(this.form.controls[_comp[maxComponentIdx].name + maxComponentIdx].value) > maxDateVal ||
1768
+ new Date(this.form.controls[_comp[minComponentIdx].name + minComponentIdx].value) < minDateVal) {
1769
+ this.toastr.warning(label[0] +
1770
+ errorMessage[0] +
1771
+ formatDate(minDateVal, "dd MMMM yyyy", "en-US") +
1772
+ " and" +
1773
+ errorMessage[1] +
1774
+ formatDate(maxDateVal, "dd MMMM yyyy", "en-US") +
1775
+ ".");
1602
1776
  dateWrong = true;
1603
1777
  }
1604
1778
  else {
@@ -1618,13 +1792,13 @@ export class UCSearchComponent {
1618
1792
  if (item.confMinDate === datepickerPair) {
1619
1793
  _minComps.push({
1620
1794
  comp: item,
1621
- index
1795
+ index,
1622
1796
  });
1623
1797
  }
1624
1798
  if (item.confMaxDate === datepickerPair) {
1625
1799
  _maxComps.push({
1626
1800
  comp: item,
1627
- index
1801
+ index,
1628
1802
  });
1629
1803
  }
1630
1804
  }
@@ -1634,9 +1808,10 @@ export class UCSearchComponent {
1634
1808
  const _value = value;
1635
1809
  const _restriction = minComponent.comp.datepickerPair === datepickerPair ? restriction : "";
1636
1810
  if (_value !== null && _value !== undefined) {
1637
- this.updateComponentDate(minComponent, 'confMaxDate', _value, 'maxDate', datepickerPair);
1638
- if (_restriction.toLowerCase() !== 'gte' && _restriction.toLowerCase() !== "gt") {
1639
- this.updateComponentDate(minComponent, 'confMinDate', _value, 'minDate', datepickerPair);
1811
+ this.updateComponentDate(minComponent, "confMaxDate", _value, "maxDate", datepickerPair);
1812
+ if (_restriction.toLowerCase() !== "gte" &&
1813
+ _restriction.toLowerCase() !== "gt") {
1814
+ this.updateComponentDate(minComponent, "confMinDate", _value, "minDate", datepickerPair);
1640
1815
  }
1641
1816
  }
1642
1817
  }
@@ -1644,9 +1819,10 @@ export class UCSearchComponent {
1644
1819
  const _value = value;
1645
1820
  const _restriction = maxComponent.comp.datepickerPair === datepickerPair ? restriction : "";
1646
1821
  if (_value !== null && _value !== undefined) {
1647
- this.updateComponentDate(maxComponent, 'confMinDate', _value, 'minDate', datepickerPair);
1648
- if (_restriction.toLowerCase() !== "lte" && _restriction.toLowerCase() !== "lt") {
1649
- this.updateComponentDate(maxComponent, 'confMaxDate', _value, 'maxDate', datepickerPair);
1822
+ this.updateComponentDate(maxComponent, "confMinDate", _value, "minDate", datepickerPair);
1823
+ if (_restriction.toLowerCase() !== "lte" &&
1824
+ _restriction.toLowerCase() !== "lt") {
1825
+ this.updateComponentDate(maxComponent, "confMaxDate", _value, "maxDate", datepickerPair);
1650
1826
  }
1651
1827
  }
1652
1828
  }
@@ -1662,14 +1838,13 @@ export class UCSearchComponent {
1662
1838
  const _componentValue = this.form.controls[component.name + index].value;
1663
1839
  const _flag = this.datetimeService.CheckDateType(component[`addition${flagKey[0].toUpperCase()}${flagKey.slice(1)}Conf`] ?? "bd");
1664
1840
  component[flagKey] = this.datetimeService.GetNewDate(_flag, component[`addition${flagKey[0].toUpperCase()}${flagKey.slice(1)}Conf`], value);
1665
- if ((flagKey === 'minDate' && _componentValue < component.minDate) ||
1666
- (flagKey === 'maxDate' && _componentValue > component.maxDate)) {
1841
+ if ((flagKey === "minDate" && _componentValue < component.minDate) ||
1842
+ (flagKey === "maxDate" && _componentValue > component.maxDate)) {
1667
1843
  this.form.controls[component.name].setValue("");
1668
1844
  }
1669
1845
  }
1670
1846
  }
1671
1847
  }
1672
- ;
1673
1848
  selectedOption(item, crit) {
1674
1849
  crit.descr = item.Value;
1675
1850
  crit.isListHide = true;
@@ -1691,7 +1866,7 @@ export class UCSearchComponent {
1691
1866
  }
1692
1867
  getLookup(event, component) {
1693
1868
  const _eventObj = {
1694
- lookup: { ...event }
1869
+ lookup: { ...event },
1695
1870
  };
1696
1871
  this.lookupDict = { ...event };
1697
1872
  const _lookupObj = this.searchInput.dictLookupObj[component.name];
@@ -1720,17 +1895,21 @@ export class UCSearchComponent {
1720
1895
  DataType: "text",
1721
1896
  high: 0,
1722
1897
  isCriteriaDataTable: false,
1723
- low: 0
1898
+ low: 0,
1724
1899
  };
1725
1900
  _updateLookupObj.addedAddCrit.push(_addedCrit);
1726
- _updateLookupObj.addCritInput = [..._updateLookupObj.originalAddCrit, ..._updateLookupObj.addedAddCrit];
1901
+ _updateLookupObj.addCritInput = [
1902
+ ..._updateLookupObj.originalAddCrit,
1903
+ ..._updateLookupObj.addedAddCrit,
1904
+ ];
1727
1905
  this.searchInput.dictLookupObj[item.key] = JSON.parse(JSON.stringify(_updateLookupObj));
1728
- setTimeout(() => this.searchInput.dictLookupObj[item.key].isReady = true, 10);
1906
+ setTimeout(() => (this.searchInput.dictLookupObj[item.key].isReady = true), 10);
1729
1907
  }
1730
1908
  const affectedFilter = _lookupObj?.affectedFilter ?? [];
1731
1909
  if (affectedFilter.length > 0) {
1732
1910
  let _value = _lookupObj.idSelect;
1733
- if (_lookupObj.filterPropValue != null && _lookupObj.filterPropValue != "") {
1911
+ if (_lookupObj.filterPropValue != null &&
1912
+ _lookupObj.filterPropValue != "") {
1734
1913
  if (_lookupObj.filterPropValue.includes("lookup.")) {
1735
1914
  const _tempValue = _lookupObj.filterPropValue.split(".")[1];
1736
1915
  _value = _eventObj.lookup[_tempValue] ?? _value;
@@ -1744,7 +1923,7 @@ export class UCSearchComponent {
1744
1923
  }
1745
1924
  isCollapsed = false;
1746
1925
  onCollapse(ev) {
1747
- console.log('collapse', ev);
1926
+ console.log("collapse", ev);
1748
1927
  this.isCollapsed = !!ev?.isCollapsed;
1749
1928
  }
1750
1929
  updateKeyValDict(ev) {
@@ -1770,49 +1949,46 @@ export class UCSearchComponent {
1770
1949
  else if (typeValidator === "MAX")
1771
1950
  control.addValidators(Validators.max(value));
1772
1951
  }
1773
- /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UCSearchComponent, deps: [{ token: i1.HttpClient }, { token: i0.Renderer2 }, { token: DOCUMENT }, { token: i2.ToastrService }, { token: i3.CookieService }, { token: i4.DatePipe }, { token: i0.ElementRef }, { token: i5.ExportFileService }, { token: i6.ActivatedRoute }, { token: i7.NgxRouterService }, { token: i8.FormBuilder }, { token: i9.UcsearchDatetimeService }, { token: i10.UcsearchFormService }], target: i0.ɵɵFactoryTarget.Component });
1774
- /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UCSearchComponent, selector: "lib-UCSearch", inputs: { searchInput: "searchInput", pageSize: "pageSize", isReport: "isReport", showRptExecType: "showRptExecType" }, outputs: { result: "result", genRpt: "genRpt", reqGetAllData: "reqGetAllData" }, providers: [DatePipe, ExportFileService], viewQueries: [{ propertyName: "content", first: true, predicate: ["enjiForm"], descendants: true }, { propertyName: "myForm", first: true, predicate: ["formIdSearch"], descendants: true }], ngImport: i0, template: "<span hidden attr.version=\"3.8.18-canary.0\"></span>\n<div>\n <!-- Basic form layout section start -->\n <lib-ucSubsection [hidden]=\"!searchInput.IsSubsection\" [id]=\"searchInput.searchId+'id'\"\n [title]=\"configuration?.sectionTitle || 'Paging'\" [panel]=\"searchInput.searchId\" [legacy]=\"false\"\n (collapse)=\"onCollapse($event)\">\n </lib-ucSubsection>\n\n <!-- <div [id]=\"searchInput.searchId\"> -->\n <!-- <div class=\"row text-left\">\n <div class=\"col-md-12\">\n <div class=\"\"> -->\n <!-- <div class=\"pl-3 mb-2 mt-2\" *ngIf=\"configuration?.title != undefined && configuration?.title != ''\">\n <h4 class=\"card-title ucSearch-title\" translate>{{configuration.title}}</h4>\n </div> -->\n <div class=\"card-body\" [id]=\"searchInput.searchId\" [(ngbCollapse)]=\"isCollapsed\">\n <div class=\"px-3\">\n <form class=\"form form-horizontal\" id=\"formSearch\" #formIdSearch [formGroup]=\"form\" #enjiForm=\"ngForm\"\n (ngSubmit)=\"enjiForm.valid && searchClick()\">\n <div class=\"form-body\">\n <!-- <h4 class=\"form-section font-weight-bold\">\n <div (click)=\"changeState()\" class=\"btn no-padding cursor-pointer flip\">\n <i class=\"fa\" style=\"font-size: 15px; margin: 0px 0px 5px -15px;\"\n [ngClass]=\"isHidden ? 'fa-chevron-right' : 'fa-chevron-down'\"></i>\n </div>\n <span\n *ngIf=\"configuration?.sectionTitle != undefined && configuration?.sectionTitle != ''; then inputSectionTitle else defaultSectionTitle\"></span>\n <ng-template #inputSectionTitle>\n {{configuration?.sectionTitle}}\n </ng-template>\n <ng-template #defaultSectionTitle>\n Paging\n </ng-template>\n </h4> -->\n <!-- Ini Digunakan untuk Generate Dynamic Component -->\n <!-- [hidden]=\"isHidden\" -->\n <!-- <div class=\"panel-active\" [@changeDivSize]=currentState> -->\n <div class=\"row\">\n <div class=\"col-md-3 form-group\" *ngFor=\"let question of configuration?.component; let i = index\">\n <div class=\"col-md-12\">\n <div class=\"row\">\n <label class=\"col-md-12 no-padding search-label\" for=\"{{question.id}}\"\n [ngClass]=\"{'adins-required-label': (question.isRequired || (question?.ddlType != undefined && question.ddlType == 'one'))}\"\n translate>{{question.label}}</label>\n <div class=\"col-md-12 no-padding\">\n <div *ngIf=\"question.type=='textbox'\">\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\n [IsUpperCase]=\"question.isUppercase === undefined ? true : question.isUppercase\"\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n [placeholder]=\"question.placeholder != undefined ? question.placeholder : ''\"\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\n [readonly]=\"question.isReadonly\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n </div>\n <div *ngIf=\"question.type=='textarea'\">\n <textarea type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\n attr.data-required=\"{{question.isRequired}}\" attr.data-type=\"{{question.datatype}}\"\n attr.data-name=\"{{question.name}}\" value=\"{{question.value}}\" attr.label=\"{{question.label}}\"\n [readonly]=\"question.isReadonly\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"></textarea>\n </div>\n <div *ngIf=\"question.type=='numeric'\">\n <input type=\"number\" id=\"{{question.id}}\" (focus)=\"transformToDecimal($event)\"\n (blur)=\"transformToDecimal($event)\" class=\"form-control search-input\" [placeholder]=\"'0'\"\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\"\n [formControlName]=\"question.name+[i]\" attr.data-required=\"{{question.isRequired}}\"\n value=\"{{question.value}}\" attr.data-restriction=\"{{question.restriction}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.data-numericpair=\"{{question.numericPair}}\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\" attr.label=\"{{question.label}}\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [readonly]=\"question.isReadonly\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\n </div>\n <div *ngIf=\"question.type=='currency'\">\n <div *ngIf=\"question?.isCustom != undefined && question?.isCustom\">\n <input type=\"\" id=\"{{question.id}}\" class=\"form-control search-input\"\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\" autocomplete=\"off\"\n attr.data-restriction=\"{{question.restriction}}\" attr.data-type=\"{{question.datatype}}\"\n attr.data-name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\" currencyMask\n [formControlName]=\"question.name+[i]\" attr.label=\"{{question.label}}\"\n [readonly]=\"question.isReadonly\" (focus)=\"OnFocusCurr($event, question.value)\"\n (blur)=\"ValidateDefaultValue(question)\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [options]=\"{ thousands: question.thousands, decimal: question.decimal, align: question.align, allowNegative: question.allowNegative, allowZero: question.allowZero, precision: question.precision, nullable: question.nullable }\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n </div>\n <div *ngIf=\"question?.isCustom == undefined || !question?.isCustom\">\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\" autocomplete=\"off\"\n attr.data-restriction=\"{{question.restriction}}\" attr.data-type=\"{{question.datatype}}\"\n attr.data-name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\" currencyMask\n [formControlName]=\"question.name+[i]\" attr.label=\"{{question.label}}\"\n (focus)=\"OnFocusCurr($event, question.value)\" (blur)=\"ValidateDefaultValue(question)\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [options]=\"{ thousands: ',', decimal: '.', align: 'right', allowNegative: false, allowZero:true, precision: 2, nullable: false }\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n </div>\n </div>\n\n <!-- End Hardcode Lookup didalem-->\n <span *ngIf=\"!useNewDatepicker\">\n <div *ngIf=\"question.type=='datepicker' && !question.isTime\">\n <input type=\"date\" id=\"{{question.id}}\" class=\"form-control search-input btn-lookup\"\n name=\"{{question.name+[i]}}\" [formControlName]=\"question.name+[i]\"\n [required]=\"question.isRequired\" attr.data-required=\"{{question.isRequired}}\"\n value=\"{{question.value}}\" [readonly]=\"question.readonly\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\n [min]=\"question.minDate | date:'yyyy-MM-dd'\" [max]=\"question.maxDate | date:'yyyy-MM-dd'\"\n (focusout)=\"question.restriction != undefined && checkInputDate(question,i)\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\n </div>\n <div *ngIf=\"question.type=='datepicker' && question.isTime\">\n <input type=\"datetime-local\" id=\"{{question.id}}\" class=\"form-control search-input btn-lookup\"\n name=\"{{question.name+[i]}}\" [required]=\"question.isRequired\"\n [formControlName]=\"question.name\" attr.data-required=\"{{question.isRequired}}\"\n value=\"{{question.value}}\" [readonly]=\"question.readonly\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\n min=\"{{question.minDate | date:'yyyy-MM-dd'}}\" max=\"{{question.maxDate | date:'yyyy-MM-dd'}}\"\n (focusout)=\"question.restriction != undefined && checkInputDate(question,i)\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\n </div>\n </span>\n <span *ngIf=\"useNewDatepicker\">\n <div *ngIf=\"question.type=='datepicker'\">\n <lib-ucdatepicker [parentForm]=\"form\" [enjiForm]=\"enjiForm\" [identifier]=\"question.name+i\"\n [min]=\"question.minDate | date: 'yyyy-MM-dd'\" [max]=\"question.maxDate | date: 'yyyy-MM-dd'\"\n [defaultStartDate]=\"BisDt\" [attr]=\"question\"\n (change)=\"question.restriction != undefined && checkInputDate(question,i)\">\n </lib-ucdatepicker>\n </div>\n </span>\n\n <div\n *ngIf=\"question.type == 'taskDefinitionKey' || question.type == 'processKey' || question.type == 'officeRoleCodes'\">\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\n [required]=\"question.isRequired\" class=\"form-control search-input\"\n attr.query-in=\"{{question.isQueryIn}}\" attr.data-type=\"{{question.datatype}}\"\n attr.label=\"{{question.label}}\" [hidden]=\"question?.itemsUrl?.length == 1\"\n (change)=\"(question.type == 'taskDefinitionKey' || question.type == 'processKey') ? SetProcessKey(i,question.wfKeyFilter) : SetRoleOfficeCodes(i)\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl?.length != 1\" value=\"one\">Select\n One</option>\n <option\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl?.length != 1\"\n value=\"all\">All</option>\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\n {{item.Value}}\n </option>\n </select>\n <label *ngIf=\"question?.itemsUrl?.length == 1\">{{question.itemsUrl[0].Value}}</label>\n </div>\n <div *ngIf=\"question.type=='dropdown'\">\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\n [required]=\"question.isRequired\" class=\"form-control search-input\"\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n attr.data-restriction=\"{{ question?.restriction ?? ''}}\"\n [hidden]=\"!question.isFromURL ? (question?.items?.length == 1 && !question?.keepDdl) : (question?.itemsUrl?.length == 1 && !question?.keepDdl)\"\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : updateKeyValDict({key: question.name, value: $event.target.value})\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n <option\n *ngIf=\"question.ddlType == 'one' && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl))\"\n value=\"one\">\n Select One</option>\n <option\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl))\"\n value=\"all\">All</option>\n <option *ngFor=\"let item of !question.isFromURL ? question?.items : question?.itemsUrl\"\n value=\"{{!question.isFromURL ? item.key : item.Key}}\">\n {{!question.isFromURL ? item.value : item.Value}}\n </option>\n <option\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl)) && question.useOthersSelection\"\n value=\"others\">Others</option>\n </select>\n <label\n *ngIf=\"!question.isFromURL ? (question?.items?.length == 1 && !question?.keepDdl) : (question?.itemsUrl?.length == 1 && !question?.keepDdl)\">{{!question.isFromURL\n ? question.items[0].value :\n question.itemsUrl[0].Value}}\n </label>\n </div>\n <div *ngIf=\"question.type=='dropdownSearch'\">\n <div class=\"dds-display-item\"\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">\n <input type=\"text\" class=\"form-control dds-input\" name=\"{{'ddsValue'+question.name}}\"\n [(ngModel)]=\"question.descr\" readonly\n (click)=\"question.isListHide = !question.isListHide; question.searchText=''\">\n </div>\n <label\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{question.descr}}</label>\n <div class=\"dds-list-container\" [hidden]=\"question.isListHide\">\n <input type=\"text\" class=\"form-control search-input\" name=\"{{'searchText'+question.name}}\"\n [(ngModel)]=\"question.searchText\" [placeholder]=\"question.placeholder\">\n <div class=\"dds-items-container\">\n <select class=\"full-width\" name=\"{{question.name}}\"\n attr.data-required=\"{{question.isRequired}}\" [(ngModel)]=\"question.value\"\n [required]=\"question.isRequired\" attr.query-in=\"{{question.isQueryIn}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"\n size=\"{{question?.size == undefined ? question?.size : 10}}\">\n <option (click)=\"selectedOption({Key:'one',Value:'Select One'},question)\"\n *ngIf=\"question.ddsType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\n value=\"one\">\n Select One</option>\n <option (click)=\"selectedOption({Key:'all',Value:'All'},question)\"\n *ngIf=\"(question?.ddsType == undefined || question.ddsType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\n value=\"all\">All</option>\n <!-- <option *ngFor=\"let item of question?.items | textSearch : question.searchText; let i=index\" [value]=\"item?.key\" (click)=\"selectedOption(item,question)\">\n {{item?.value}}\n </option> -->\n <option\n *ngFor=\"let item of !question.isFromURL ? (question?.items | textSearch : question.searchText) : question?.itemsUrl | textSearch : question.searchText\"\n (click)=\"selectedOption(item,question)\" value=\"{{item.Key}}\">\n {{item.Value}}\n </option>\n </select>\n </div>\n </div>\n </div>\n <div *ngIf=\"question.type=='claim'\">\n <select name=\"{{'claim'+[i]}}\" class=\"form-control search-input\" attr.data-type=\"{{'text'}}\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\" attr.data-name=\"{{'Assignee'}}\"\n [hidden]=\"ClaimList?.length == 1\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls['claim'+[i]]?.touched || enjiForm.form.controls['claim'+[i]]?.dirty) && enjiForm.form.controls['claim'+[i]]?.invalid }\">\n <option *ngIf=\"question.ddlType == 'one' && ClaimList?.length != 1\" value=\"one\">Select\n One</option>\n <option\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && ClaimList?.length != 1\"\n value=\"all\">All</option>\n <option *ngFor=\"let item of ClaimList\" value=\"{{item.Key}}\">\n {{item.Value}}\n </option>\n </select>\n </div>\n <div *ngIf=\"question.type=='lookup'\">\n <lib-cl-uclookupgeneric *ngIf=\"searchInput.dictLookupObj[question.name].isReady\"\n [lookupInput]=\"searchInput.dictLookupObj[question.name]\" [parentForm]='form'\n [enjiForm]='enjiForm' [identifier]=\"question.name\"\n [notifyUpdateKeyValDict]=\"notifyUpdateKeyValDict\" [lookupKeyValDict]=\"lookupKeyValDict\"\n (lookup)=\"getLookup($event, question)\"\n (inputtedValue)=\"getInputtedValue($event, question)\"></lib-cl-uclookupgeneric>\n </div>\n\n <div *ngIf=\"question.type === 'time'\">\n <input type=\"time\" id=\"{{question.id}}\" class=\"form-control search-input\"\n [IsUpperCase]=\"question.isUppercase === undefined ? true : question.isUppercase\"\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n [placeholder]=\"question.placeholder != undefined ? question.placeholder : ''\"\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\n [readonly]=\"question.isReadonly\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n </div>\n\n <div *ngIf=\"question.type === 'month'\">\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\n [required]=\"question.isRequired\" class=\"form-control search-input\"\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n <option *ngIf=\"question.ddlType == 'one'\" value=\"one\">\n Select One</option>\n <option *ngIf=\"question?.ddlType == undefined || question.ddlType == 'all'\" value=\"all\">All\n </option>\n <option *ngFor=\"let m of months\" [value]=\"m.key\">\n {{m.value}}\n </option>\n </select>\n </div>\n\n <div *ngIf=\"question.type === 'year'\">\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\n [required]=\"question.isRequired\" class=\"form-control search-input\"\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n <option *ngIf=\"question.ddlType == 'one'\" value=\"one\">\n Select One</option>\n <option *ngIf=\"question?.ddlType == undefined || question.ddlType == 'all'\" value=\"all\">All\n </option>\n <option *ngFor=\"let y of years\" [value]=\"y\">\n {{y}}\n </option>\n </select>\n </div>\n\n <lib-uc-show-errors *ngIf=\"question.type !== 'datepicker'\" [control]=\"form.controls[question.name]\"\n [submit]=\"enjiForm.submitted\">\n </lib-uc-show-errors>\n <lib-uc-show-errors *ngIf=\"question.type === 'datepicker' || question.type === 'numeric'\"\n [control]=\"form.controls[question.name+[i]]\" [submit]=\"enjiForm.submitted\">\n </lib-uc-show-errors>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-3 form-group\" *ngIf=\"(isReport != undefined && isReport)\">\n <div class=\"col-md-12\">\n <div class=\"row\">\n <label class=\"col-md-12 no-padding search-label\" translate>Report Type</label>\n <div class=\"col-md-12 no-padding\">\n <select name=\"ExportType\" class=\"form-control search-input\" attr.data-type=\"text\"\n [formControlName]=\"'ExportType'\">\n <option *ngFor=\"let item of ExportTypeList\" [value]=\"item.key\">{{item.value}}</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-3 form-group\"\n *ngIf=\"(isReport != undefined && isReport) && (showRptExecType != undefined && showRptExecType)\">\n <div class=\"col-md-12\">\n <div class=\"row\">\n <label class=\"col-md-12 no-padding search-label\" translate>Execution Type</label>\n <div class=\"col-md-12 no-padding\">\n <select name=\"RptExecType\" class=\"form-control search-input\" attr.data-type=\"text\"\n [formControlName]=\"'RptExecType'\">\n <option *ngFor=\"let item of ReportExecTypeList\" [value]=\"item.key\">{{item.value}}</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-12 no-padding\">\n <div class=\"form-actions right\">\n <ng-container class=\"btn-group\" *ngIf=\"exportData == true && isSearch\">\n <div ngbDropdown class=\"d-inline-block\">\n <button type=\"button\" class=\"btn btn-raised btn-outline-2 mr-1 dropdown-toggle\" ngbDropdownToggle\n id=\"exportList\" translate>\n <i class=\"fa ft-download button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\n translate>Export File</span>\n </button>\n <div class=\"dropdown-menu\" ngbDropdownMenu aria-labelledby=\"exportList\">\n <ng-container *ngFor=\"let item of exportAsFileList\">\n <a class=\"dropdown-item\" ngbDropdownItem (click)=\"exportAsFile(item.key)\">{{item.value}}</a>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <button type=\"button\" (click)=\"reset()\" class=\"btn btn-raised mr-1 btn-link-2\" translate>\n <!-- <i class=\"fa fa-times\"></i>&nbsp; -->\n <span translate>Reset</span>\n </button>\n <button *ngIf=\"(isReport == undefined || !isReport)\" type=\"submit\" class=\"btn btn-raised btn-outline-2\"\n #UCSearchClick [disabled]=\"!searchBtnReady\">\n <i class=\"fa fa-search button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\n translate>Search</span>\n </button>\n <button *ngIf=\"(isReport != undefined && isReport)\" type=\"submit\" class=\"btn btn-raised btn-outline-2\">\n <i class=\"fa ft-download button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\n translate>Generate\n Report</span>\n </button>\n </div>\n </div>\n <!-- </div> -->\n </div>\n </form>\n </div>\n </div>\n <!-- </div>\n </div>\n </div> -->\n <!-- </div> -->\n</div>\n<!-- // Basic form layout section end -->", styles: [".ucSearch-title{margin:3px}.card-body{margin-top:24px}.form-group{margin-bottom:15px!important}.search-label{color:var(--Black_1, #3A4060);font-size:14px!important}.dds-input{border-radius:7px!important;border:1px solid var(--gray-line, #DFE6E9)!important;background:var(--white-1, #FDFEFF)!important;padding:1.135rem!important;height:calc(1.5rem + 2px)!important;font-size:12px!important}.dds-display-item:after{content:\"\\e929\";font-family:feather;font-size:1rem;display:inline-block;position:absolute;right:5px;top:5px;transform:rotate(90deg)}.dds-list-container{position:absolute;width:100%;z-index:9}.search-input{border-radius:7px!important;border:1px solid var(--gray-line, #DFE6E9)!important;background:var(--white-1, #FDFEFF)!important;width:100%}select.search-input{appearance:none;background-image:url(\"data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23246CFE' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e\")!important;background-repeat:no-repeat!important;background-position:right 1rem center!important;background-size:1.4em!important}.btn{border-radius:7px;font-size:14px;padding:.275rem 1rem}.btn-link-2{background:none;border:none;color:var(--blue-primary, #246CFE)!important}.btn-link-2:hover{background:var(--light-grey, #F4F8FB)!important;color:var(--blue-primary-darker, #0010F7)!important}.btn-outline-2{border:1px solid var(--blue-primary, #246CFE)!important;background:var(--white, #FDFEFF)!important;color:var(--blue-primary, #246CFE)!important}.btn-outline-2:hover{color:var(--blue-primary-darker, #0010F7)!important;background:var(--light-grey, #F4F8FB)!important;border:1px solid var(--blue-primary-darker, #0010F7)!important}.button-icon-search{font-size:11px;vertical-align:middle;padding-right:8px}.button-text-search{vertical-align:middle}.dropdown-toggle:after{display:inline-block;margin-left:.5em;vertical-align:middle;content:\"\";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgbCollapse, selector: "[ngbCollapse]", inputs: ["animation", "ngbCollapse", "horizontal"], outputs: ["ngbCollapseChange", "shown", "hidden"], exportAs: ["ngbCollapse"] }, { kind: "directive", type: i11.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i11.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i11.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i11.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { kind: "directive", type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.UcShowErrorsComponent, selector: "lib-uc-show-errors", inputs: ["control", "submit", "fieldName", "customPattern"] }, { kind: "directive", type: i13.UpperCaseDirective, selector: "input[type=text], input", inputs: ["IsUpperCase"] }, { kind: "directive", type: i14.ValidateDateDirective, selector: "input[type=date], input[type=datetime-local]", inputs: ["warningMsg"] }, { kind: "component", type: i15.UcdatepickerComponent, selector: "lib-ucdatepicker", inputs: ["parentForm", "enjiForm", "identifier", "min", "max", "defaultStartDate", "attr", "colorLevelSetting", "confidenceLevel"], outputs: ["change"] }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i16.TextSearchPipe, name: "textSearch" }], animations: [
1775
- trigger('changeDivSize', [
1776
- state('initial', style({
1777
- height: '*',
1778
- opacity: '1',
1952
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UCSearchComponent, deps: [{ token: i1.HttpClient }, { token: i2.ToastrService }, { token: i3.CookieService }, { token: i4.DatePipe }, { token: i0.ElementRef }, { token: i5.ExportFileService }, { token: i6.ActivatedRoute }, { token: i7.NgxRouterService }, { token: i8.FormBuilder }, { token: i9.UcsearchDatetimeService }, { token: i10.UcsearchFormService }], target: i0.ɵɵFactoryTarget.Component });
1953
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UCSearchComponent, selector: "lib-UCSearch", inputs: { searchInput: "searchInput", pageSize: "pageSize", isReport: "isReport", showRptExecType: "showRptExecType" }, outputs: { result: "result", genRpt: "genRpt", reqGetAllData: "reqGetAllData" }, providers: [DatePipe, ExportFileService], viewQueries: [{ propertyName: "content", first: true, predicate: ["enjiForm"], descendants: true }, { propertyName: "myForm", first: true, predicate: ["formIdSearch"], descendants: true }], ngImport: i0, template: "<span hidden attr.version=\"3.8.18-canary.0\"></span>\r\n<div>\r\n <!-- Basic form layout section start -->\r\n <lib-ucSubsection [hidden]=\"!searchInput.IsSubsection\" [id]=\"searchInput.searchId+'id'\"\r\n [title]=\"configuration?.sectionTitle || 'Paging'\" [card]=\"searchInput.searchId\" [legacy]=\"false\"\r\n (collapse)=\"onCollapse($event)\">\r\n </lib-ucSubsection>\r\n\r\n <!-- <div [id]=\"searchInput.searchId\"> -->\r\n <!-- <div class=\"row text-start\">\r\n <div class=\"col-md-12\">\r\n <div > -->\r\n <!-- <div class=\"ps-3 mb-2 mt-2\" *ngIf=\"configuration?.title != undefined && configuration?.title != ''\">\r\n <h4 class=\"card-title ucSearch-title\" translate>{{configuration.title}}</h4>\r\n </div> -->\r\n <div class=\"card-body\" [id]=\"searchInput.searchId\" [(ngbCollapse)]=\"isCollapsed\">\r\n <div class=\"px-3\">\r\n <form class=\"form \" id=\"formSearch\" #formIdSearch [formGroup]=\"form\" #enjiForm=\"ngForm\"\r\n (ngSubmit)=\"enjiForm.valid && searchClick()\">\r\n <div class=\"form-body\">\r\n <!-- <h4 class=\"form-section fw-bold\">\r\n <div (click)=\"changeState()\" class=\"btn no-padding cursor-pointer flip\">\r\n <i class=\"fa\" style=\"font-size: 15px; margin: 0px 0px 5px -15px;\"\r\n [ngClass]=\"isHidden ? 'fa-chevron-right' : 'fa-chevron-down'\"></i>\r\n </div>\r\n <span\r\n *ngIf=\"configuration?.sectionTitle != undefined && configuration?.sectionTitle != ''; then inputSectionTitle else defaultSectionTitle\"></span>\r\n <ng-template #inputSectionTitle>\r\n {{configuration?.sectionTitle}}\r\n </ng-template>\r\n <ng-template #defaultSectionTitle>\r\n Paging\r\n </ng-template>\r\n </h4> -->\r\n <!-- Ini Digunakan untuk Generate Dynamic Component -->\r\n <!-- [hidden]=\"isHidden\" -->\r\n <!-- <div class=\"card-active\" [@changeDivSize]=currentState> -->\r\n <div class=\"row\">\r\n <div class=\"col-md-3 form-group\" *ngFor=\"let question of configuration?.component; let i = index\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-12 no-padding search-label\" for=\"{{question.id}}\"\r\n [ngClass]=\"{'adins-required-label': (question.isRequired || (question?.ddlType != undefined && question.ddlType == 'one'))}\"\r\n translate>{{question.label}}</label>\r\n <div class=\"col-md-12 no-padding\">\r\n <div *ngIf=\"question.type=='textbox'\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\r\n [IsUpperCase]=\"question.isUppercase === undefined ? true : question.isUppercase\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n [placeholder]=\"question.placeholder != undefined ? question.placeholder : ''\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\r\n [readonly]=\"question.isReadonly\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='textarea'\">\r\n <textarea type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\r\n attr.data-required=\"{{question.isRequired}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" value=\"{{question.value}}\" attr.label=\"{{question.label}}\"\r\n [readonly]=\"question.isReadonly\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"></textarea>\r\n </div>\r\n <div *ngIf=\"question.type=='numeric'\">\r\n <input type=\"number\" id=\"{{question.id}}\" (focus)=\"transformToDecimal($event)\"\r\n (blur)=\"transformToDecimal($event)\" class=\"form-control search-input\" [placeholder]=\"'0'\"\r\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\"\r\n [formControlName]=\"question.name+[i]\" attr.data-required=\"{{question.isRequired}}\"\r\n value=\"{{question.value}}\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-numericpair=\"{{question.numericPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\" attr.label=\"{{question.label}}\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [readonly]=\"question.isReadonly\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='currency'\">\r\n <div *ngIf=\"question?.isCustom != undefined && question?.isCustom\">\r\n <input type=\"\" id=\"{{question.id}}\" class=\"form-control search-input\"\r\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\" autocomplete=\"off\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\" currencyMask\r\n [formControlName]=\"question.name+[i]\" attr.label=\"{{question.label}}\"\r\n [readonly]=\"question.isReadonly\" (focus)=\"OnFocusCurr($event, question.value)\"\r\n (blur)=\"ValidateDefaultValue(question)\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [options]=\"{ thousands: question.thousands, decimal: question.decimal, align: question.align, allowNegative: question.allowNegative, allowZero: question.allowZero, precision: question.precision, nullable: question.nullable }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question?.isCustom == undefined || !question?.isCustom\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\r\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\" autocomplete=\"off\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\" currencyMask\r\n [formControlName]=\"question.name+[i]\" attr.label=\"{{question.label}}\"\r\n (focus)=\"OnFocusCurr($event, question.value)\" (blur)=\"ValidateDefaultValue(question)\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [options]=\"{ thousands: ',', decimal: '.', align: 'right', allowNegative: false, allowZero:true, precision: 2, nullable: false }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n </div>\r\n\r\n <!-- End Hardcode Lookup didalem-->\r\n <span *ngIf=\"!useNewDatepicker\">\r\n <div *ngIf=\"question.type=='datepicker' && !question.isTime\">\r\n <input type=\"date\" id=\"{{question.id}}\" class=\"form-control search-input btn-lookup\"\r\n name=\"{{question.name+[i]}}\" [formControlName]=\"question.name+[i]\"\r\n [required]=\"question.isRequired\" attr.data-required=\"{{question.isRequired}}\"\r\n value=\"{{question.value}}\" [readonly]=\"question.readonly\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\r\n [min]=\"question.minDate | date:'yyyy-MM-dd'\" [max]=\"question.maxDate | date:'yyyy-MM-dd'\"\r\n (focusout)=\"question.restriction != undefined && checkInputDate(question,i)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='datepicker' && question.isTime\">\r\n <input type=\"datetime-local\" id=\"{{question.id}}\" class=\"form-control search-input btn-lookup\"\r\n name=\"{{question.name+[i]}}\" [required]=\"question.isRequired\"\r\n [formControlName]=\"question.name\" attr.data-required=\"{{question.isRequired}}\"\r\n value=\"{{question.value}}\" [readonly]=\"question.readonly\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\r\n min=\"{{question.minDate | date:'yyyy-MM-dd'}}\" max=\"{{question.maxDate | date:'yyyy-MM-dd'}}\"\r\n (focusout)=\"question.restriction != undefined && checkInputDate(question,i)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n </span>\r\n <span *ngIf=\"useNewDatepicker\">\r\n <div *ngIf=\"question.type=='datepicker'\">\r\n <lib-ucdatepicker [parentForm]=\"form\" [enjiForm]=\"enjiForm\" [identifier]=\"question.name+i\"\r\n [min]=\"question.minDate | date: 'yyyy-MM-dd'\" [max]=\"question.maxDate | date: 'yyyy-MM-dd'\"\r\n [defaultStartDate]=\"BisDt\" [attr]=\"question\"\r\n (change)=\"question.restriction != undefined && checkInputDate(question,i)\">\r\n </lib-ucdatepicker>\r\n </div>\r\n </span>\r\n\r\n <div\r\n *ngIf=\"question.type == 'taskDefinitionKey' || question.type == 'processKey' || question.type == 'officeRoleCodes'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-input\"\r\n attr.query-in=\"{{question.isQueryIn}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.label=\"{{question.label}}\" [hidden]=\"question?.itemsUrl?.length == 1\"\r\n (change)=\"(question.type == 'taskDefinitionKey' || question.type == 'processKey') ? SetProcessKey(i,question.wfKeyFilter) : SetRoleOfficeCodes(i)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl?.length != 1\" value=\"one\">Select\r\n One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.itemsUrl?.length == 1\">{{question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdown'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-input\"\r\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-restriction=\"{{ question?.restriction ?? ''}}\"\r\n [hidden]=\"!question.isFromURL ? (question?.items?.length == 1 && !question?.keepDdl) : (question?.itemsUrl?.length == 1 && !question?.keepDdl)\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : updateKeyValDict({key: question.name, value: $event.target.value})\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option\r\n *ngIf=\"question.ddlType == 'one' && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl))\"\r\n value=\"one\">\r\n Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl))\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of !question.isFromURL ? question?.items : question?.itemsUrl\"\r\n value=\"{{!question.isFromURL ? item.key : item.Key}}\">\r\n {{!question.isFromURL ? item.value : item.Value}}\r\n </option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl)) && question.useOthersSelection\"\r\n value=\"others\">Others</option>\r\n </select>\r\n <label\r\n *ngIf=\"!question.isFromURL ? (question?.items?.length == 1 && !question?.keepDdl) : (question?.itemsUrl?.length == 1 && !question?.keepDdl)\">{{!question.isFromURL\r\n ? question.items[0].value :\r\n question.itemsUrl[0].Value}}\r\n </label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdownSearch'\">\r\n <div class=\"dds-display-item\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">\r\n <input type=\"text\" class=\"form-control dds-input\" name=\"{{'ddsValue'+question.name}}\"\r\n [(ngModel)]=\"question.descr\" readonly\r\n (click)=\"question.isListHide = !question.isListHide; question.searchText=''\">\r\n </div>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{question.descr}}</label>\r\n <div class=\"dds-list-container\" [hidden]=\"question.isListHide\">\r\n <input type=\"text\" class=\"form-control search-input\" name=\"{{'searchText'+question.name}}\"\r\n [(ngModel)]=\"question.searchText\" [placeholder]=\"question.placeholder\">\r\n <div class=\"dds-items-container\">\r\n <select class=\"full-width\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" [(ngModel)]=\"question.value\"\r\n [required]=\"question.isRequired\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"\r\n size=\"{{question?.size == undefined ? question?.size : 10}}\">\r\n <option (click)=\"selectedOption({Key:'one',Value:'Select One'},question)\"\r\n *ngIf=\"question.ddsType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option (click)=\"selectedOption({Key:'all',Value:'All'},question)\"\r\n *ngIf=\"(question?.ddsType == undefined || question.ddsType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <!-- <option *ngFor=\"let item of question?.items | textSearch : question.searchText; let i=index\" [value]=\"item?.key\" (click)=\"selectedOption(item,question)\">\r\n {{item?.value}}\r\n </option> -->\r\n <option\r\n *ngFor=\"let item of !question.isFromURL ? (question?.items | textSearch : question.searchText) : question?.itemsUrl | textSearch : question.searchText\"\r\n (click)=\"selectedOption(item,question)\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"question.type=='claim'\">\r\n <select name=\"{{'claim'+[i]}}\" class=\"form-control search-input\" attr.data-type=\"{{'text'}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\" attr.data-name=\"{{'Assignee'}}\"\r\n [hidden]=\"ClaimList?.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls['claim'+[i]]?.touched || enjiForm.form.controls['claim'+[i]]?.dirty) && enjiForm.form.controls['claim'+[i]]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && ClaimList?.length != 1\" value=\"one\">Select\r\n One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && ClaimList?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of ClaimList\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"question.type=='lookup'\">\r\n <lib-cl-uclookupgeneric *ngIf=\"searchInput.dictLookupObj[question.name].isReady\"\r\n [lookupInput]=\"searchInput.dictLookupObj[question.name]\" [parentForm]='form'\r\n [enjiForm]='enjiForm' [identifier]=\"question.name\"\r\n [notifyUpdateKeyValDict]=\"notifyUpdateKeyValDict\" [lookupKeyValDict]=\"lookupKeyValDict\"\r\n (lookup)=\"getLookup($event, question)\"\r\n (inputtedValue)=\"getInputtedValue($event, question)\"></lib-cl-uclookupgeneric>\r\n </div>\r\n\r\n <div *ngIf=\"question.type === 'time'\">\r\n <input type=\"time\" id=\"{{question.id}}\" class=\"form-control search-input\"\r\n [IsUpperCase]=\"question.isUppercase === undefined ? true : question.isUppercase\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n [placeholder]=\"question.placeholder != undefined ? question.placeholder : ''\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\r\n [readonly]=\"question.isReadonly\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n\r\n <div *ngIf=\"question.type === 'month'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-input\"\r\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one'\" value=\"one\">\r\n Select One</option>\r\n <option *ngIf=\"question?.ddlType == undefined || question.ddlType == 'all'\" value=\"all\">All\r\n </option>\r\n <option *ngFor=\"let m of months\" [value]=\"m.key\">\r\n {{m.value}}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div *ngIf=\"question.type === 'year'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-input\"\r\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one'\" value=\"one\">\r\n Select One</option>\r\n <option *ngIf=\"question?.ddlType == undefined || question.ddlType == 'all'\" value=\"all\">All\r\n </option>\r\n <option *ngFor=\"let y of years\" [value]=\"y\">\r\n {{y}}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <lib-uc-show-errors *ngIf=\"question.type !== 'datepicker'\" [control]=\"form.controls[question.name]\"\r\n [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n <lib-uc-show-errors *ngIf=\"question.type === 'datepicker' || question.type === 'numeric'\"\r\n [control]=\"form.controls[question.name+[i]]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-3 form-group\" *ngIf=\"(isReport != undefined && isReport)\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-12 no-padding search-label\" translate>Report Type</label>\r\n <div class=\"col-md-12 no-padding\">\r\n <select name=\"ExportType\" class=\"form-control search-input\" attr.data-type=\"text\"\r\n [formControlName]=\"'ExportType'\">\r\n <option *ngFor=\"let item of ExportTypeList\" [value]=\"item.key\">{{item.value}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-3 form-group\"\r\n *ngIf=\"(isReport != undefined && isReport) && (showRptExecType != undefined && showRptExecType)\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-12 no-padding search-label\" translate>Execution Type</label>\r\n <div class=\"col-md-12 no-padding\">\r\n <select name=\"RptExecType\" class=\"form-control search-input\" attr.data-type=\"text\"\r\n [formControlName]=\"'RptExecType'\">\r\n <option *ngFor=\"let item of ReportExecTypeList\" [value]=\"item.key\">{{item.value}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 no-padding\">\r\n <div class=\"form-actions right\">\r\n <ng-container class=\"btn-group\" *ngIf=\"exportData == true && isSearch\">\r\n <div ngbDropdown class=\"d-inline-block\">\r\n <button type=\"button\" class=\"btn btn-raised btn-outline-2 me-1 dropdown-toggle\" ngbDropdownToggle\r\n id=\"exportList\" translate>\r\n <i class=\"fa ft-download button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\r\n translate>Export File</span>\r\n </button>\r\n <div class=\"dropdown-menu\" ngbDropdownMenu aria-labelledby=\"exportList\">\r\n <ng-container *ngFor=\"let item of exportAsFileList\">\r\n <a class=\"dropdown-item\" ngbDropdownItem (click)=\"exportAsFile(item.key)\">{{item.value}}</a>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <button type=\"button\" (click)=\"reset()\" class=\"btn btn-raised me-1 btn-link-2\" translate>\r\n <!-- <i class=\"fa fa-times\"></i>&nbsp; -->\r\n <span translate>Reset</span>\r\n </button>\r\n <button *ngIf=\"(isReport == undefined || !isReport)\" type=\"submit\" class=\"btn btn-raised btn-outline-2\"\r\n #UCSearchClick [disabled]=\"!searchBtnReady\">\r\n <i class=\"fa fa-search button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\r\n translate>Search</span>\r\n </button>\r\n <button *ngIf=\"(isReport != undefined && isReport)\" type=\"submit\" class=\"btn btn-raised btn-outline-2\">\r\n <i class=\"fa ft-download button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\r\n translate>Generate\r\n Report</span>\r\n </button>\r\n </div>\r\n </div>\r\n <!-- </div> -->\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n <!-- </div>\r\n </div>\r\n </div> -->\r\n <!-- </div> -->\r\n</div>\r\n<!-- // Basic form layout section end -->", styles: [".ucSearch-title{margin:3px}.card-body{margin-top:24px}.form-group{margin-bottom:15px!important}.search-label{color:var(--Black_1, #3A4060);font-size:14px!important}.dds-input{border-radius:7px!important;border:1px solid var(--gray-line, #DFE6E9)!important;background:var(--white-1, #FDFEFF)!important;padding:1.135rem!important;height:calc(1.5rem + 2px)!important;font-size:12px!important}.dds-display-item:after{content:\"\\e929\";font-family:feather;font-size:1rem;display:inline-block;position:absolute;right:5px;top:5px;transform:rotate(90deg)}.dds-list-container{position:absolute;width:100%;z-index:9}.search-input{border-radius:7px!important;border:1px solid var(--gray-line, #DFE6E9)!important;background:var(--white-1, #FDFEFF)!important;width:100%}select.search-input{appearance:none;background-image:url(\"data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23246CFE' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e\")!important;background-repeat:no-repeat!important;background-position:right 1rem center!important;background-size:1.4em!important}.btn{border-radius:7px;font-size:14px;padding:.275rem 1rem}.btn-link-2{background:none;border:none;color:var(--blue-primary, #246CFE)!important}.btn-link-2:hover{background:var(--light-grey, #F4F8FB)!important;color:var(--blue-primary-darker, #0010F7)!important}.btn-outline-2{border:1px solid var(--blue-primary, #246CFE)!important;background:var(--white, #FDFEFF)!important;color:var(--blue-primary, #246CFE)!important}.btn-outline-2:hover{color:var(--blue-primary-darker, #0010F7)!important;background:var(--light-grey, #F4F8FB)!important;border:1px solid var(--blue-primary-darker, #0010F7)!important}.button-icon-search{font-size:11px;vertical-align:middle;padding-right:8px}.button-text-search{vertical-align:middle}.dropdown-toggle:after{display:inline-block;margin-left:.5em;vertical-align:middle;content:\"\";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgbCollapse, selector: "[ngbCollapse]", inputs: ["animation", "ngbCollapse", "horizontal"], outputs: ["ngbCollapseChange", "shown", "hidden"], exportAs: ["ngbCollapse"] }, { kind: "directive", type: i11.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i11.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i11.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i11.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { kind: "directive", type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.UcShowErrorsComponent, selector: "lib-uc-show-errors", inputs: ["control", "submit", "fieldName", "customPattern", "fieldId"] }, { kind: "directive", type: i13.UpperCaseDirective, selector: "input[type=text], input", inputs: ["IsUpperCase"] }, { kind: "directive", type: i14.ValidateDateDirective, selector: "input[type=date], input[type=datetime-local]", inputs: ["warningMsg"] }, { kind: "component", type: i15.UcSubsectionComponent, selector: "lib-ucSubsection", inputs: ["title", "card", "id", "legacy", "isHidden"], outputs: ["collapse"] }, { kind: "component", type: i16.UcdatepickerComponent, selector: "lib-ucdatepicker", inputs: ["parentForm", "enjiForm", "identifier", "min", "max", "defaultStartDate", "attr", "colorLevelSetting", "confidenceLevel"], outputs: ["change"] }, { kind: "directive", type: i17.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: i18.TextSearchPipe, name: "textSearch" }], animations: [
1954
+ trigger("changeDivSize", [
1955
+ state("initial", style({
1956
+ height: "*",
1957
+ opacity: "1",
1779
1958
  })),
1780
- state('final', style({
1781
- height: '0px',
1782
- opacity: '0',
1783
- overflow: 'hidden',
1959
+ state("final", style({
1960
+ height: "0px",
1961
+ opacity: "0",
1962
+ overflow: "hidden",
1784
1963
  })),
1785
- transition('initial=>final', animate('300ms')),
1786
- transition('final=>initial', animate('300ms'))
1964
+ transition("initial=>final", animate("300ms")),
1965
+ transition("final=>initial", animate("300ms")),
1787
1966
  ]),
1788
1967
  ] });
1789
1968
  }
1790
1969
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UCSearchComponent, decorators: [{
1791
1970
  type: Component,
1792
- args: [{ selector: 'lib-UCSearch', providers: [DatePipe, ExportFileService], animations: [
1793
- trigger('changeDivSize', [
1794
- state('initial', style({
1795
- height: '*',
1796
- opacity: '1',
1971
+ args: [{ selector: "lib-UCSearch", providers: [DatePipe, ExportFileService], animations: [
1972
+ trigger("changeDivSize", [
1973
+ state("initial", style({
1974
+ height: "*",
1975
+ opacity: "1",
1797
1976
  })),
1798
- state('final', style({
1799
- height: '0px',
1800
- opacity: '0',
1801
- overflow: 'hidden',
1977
+ state("final", style({
1978
+ height: "0px",
1979
+ opacity: "0",
1980
+ overflow: "hidden",
1802
1981
  })),
1803
- transition('initial=>final', animate('300ms')),
1804
- transition('final=>initial', animate('300ms'))
1982
+ transition("initial=>final", animate("300ms")),
1983
+ transition("final=>initial", animate("300ms")),
1805
1984
  ]),
1806
- ], template: "<span hidden attr.version=\"3.8.18-canary.0\"></span>\n<div>\n <!-- Basic form layout section start -->\n <lib-ucSubsection [hidden]=\"!searchInput.IsSubsection\" [id]=\"searchInput.searchId+'id'\"\n [title]=\"configuration?.sectionTitle || 'Paging'\" [panel]=\"searchInput.searchId\" [legacy]=\"false\"\n (collapse)=\"onCollapse($event)\">\n </lib-ucSubsection>\n\n <!-- <div [id]=\"searchInput.searchId\"> -->\n <!-- <div class=\"row text-left\">\n <div class=\"col-md-12\">\n <div class=\"\"> -->\n <!-- <div class=\"pl-3 mb-2 mt-2\" *ngIf=\"configuration?.title != undefined && configuration?.title != ''\">\n <h4 class=\"card-title ucSearch-title\" translate>{{configuration.title}}</h4>\n </div> -->\n <div class=\"card-body\" [id]=\"searchInput.searchId\" [(ngbCollapse)]=\"isCollapsed\">\n <div class=\"px-3\">\n <form class=\"form form-horizontal\" id=\"formSearch\" #formIdSearch [formGroup]=\"form\" #enjiForm=\"ngForm\"\n (ngSubmit)=\"enjiForm.valid && searchClick()\">\n <div class=\"form-body\">\n <!-- <h4 class=\"form-section font-weight-bold\">\n <div (click)=\"changeState()\" class=\"btn no-padding cursor-pointer flip\">\n <i class=\"fa\" style=\"font-size: 15px; margin: 0px 0px 5px -15px;\"\n [ngClass]=\"isHidden ? 'fa-chevron-right' : 'fa-chevron-down'\"></i>\n </div>\n <span\n *ngIf=\"configuration?.sectionTitle != undefined && configuration?.sectionTitle != ''; then inputSectionTitle else defaultSectionTitle\"></span>\n <ng-template #inputSectionTitle>\n {{configuration?.sectionTitle}}\n </ng-template>\n <ng-template #defaultSectionTitle>\n Paging\n </ng-template>\n </h4> -->\n <!-- Ini Digunakan untuk Generate Dynamic Component -->\n <!-- [hidden]=\"isHidden\" -->\n <!-- <div class=\"panel-active\" [@changeDivSize]=currentState> -->\n <div class=\"row\">\n <div class=\"col-md-3 form-group\" *ngFor=\"let question of configuration?.component; let i = index\">\n <div class=\"col-md-12\">\n <div class=\"row\">\n <label class=\"col-md-12 no-padding search-label\" for=\"{{question.id}}\"\n [ngClass]=\"{'adins-required-label': (question.isRequired || (question?.ddlType != undefined && question.ddlType == 'one'))}\"\n translate>{{question.label}}</label>\n <div class=\"col-md-12 no-padding\">\n <div *ngIf=\"question.type=='textbox'\">\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\n [IsUpperCase]=\"question.isUppercase === undefined ? true : question.isUppercase\"\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n [placeholder]=\"question.placeholder != undefined ? question.placeholder : ''\"\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\n [readonly]=\"question.isReadonly\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n </div>\n <div *ngIf=\"question.type=='textarea'\">\n <textarea type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\n attr.data-required=\"{{question.isRequired}}\" attr.data-type=\"{{question.datatype}}\"\n attr.data-name=\"{{question.name}}\" value=\"{{question.value}}\" attr.label=\"{{question.label}}\"\n [readonly]=\"question.isReadonly\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"></textarea>\n </div>\n <div *ngIf=\"question.type=='numeric'\">\n <input type=\"number\" id=\"{{question.id}}\" (focus)=\"transformToDecimal($event)\"\n (blur)=\"transformToDecimal($event)\" class=\"form-control search-input\" [placeholder]=\"'0'\"\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\"\n [formControlName]=\"question.name+[i]\" attr.data-required=\"{{question.isRequired}}\"\n value=\"{{question.value}}\" attr.data-restriction=\"{{question.restriction}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.data-numericpair=\"{{question.numericPair}}\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\" attr.label=\"{{question.label}}\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [readonly]=\"question.isReadonly\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\n </div>\n <div *ngIf=\"question.type=='currency'\">\n <div *ngIf=\"question?.isCustom != undefined && question?.isCustom\">\n <input type=\"\" id=\"{{question.id}}\" class=\"form-control search-input\"\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\" autocomplete=\"off\"\n attr.data-restriction=\"{{question.restriction}}\" attr.data-type=\"{{question.datatype}}\"\n attr.data-name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\" currencyMask\n [formControlName]=\"question.name+[i]\" attr.label=\"{{question.label}}\"\n [readonly]=\"question.isReadonly\" (focus)=\"OnFocusCurr($event, question.value)\"\n (blur)=\"ValidateDefaultValue(question)\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [options]=\"{ thousands: question.thousands, decimal: question.decimal, align: question.align, allowNegative: question.allowNegative, allowZero: question.allowZero, precision: question.precision, nullable: question.nullable }\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n </div>\n <div *ngIf=\"question?.isCustom == undefined || !question?.isCustom\">\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\" autocomplete=\"off\"\n attr.data-restriction=\"{{question.restriction}}\" attr.data-type=\"{{question.datatype}}\"\n attr.data-name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\" currencyMask\n [formControlName]=\"question.name+[i]\" attr.label=\"{{question.label}}\"\n (focus)=\"OnFocusCurr($event, question.value)\" (blur)=\"ValidateDefaultValue(question)\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [options]=\"{ thousands: ',', decimal: '.', align: 'right', allowNegative: false, allowZero:true, precision: 2, nullable: false }\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n </div>\n </div>\n\n <!-- End Hardcode Lookup didalem-->\n <span *ngIf=\"!useNewDatepicker\">\n <div *ngIf=\"question.type=='datepicker' && !question.isTime\">\n <input type=\"date\" id=\"{{question.id}}\" class=\"form-control search-input btn-lookup\"\n name=\"{{question.name+[i]}}\" [formControlName]=\"question.name+[i]\"\n [required]=\"question.isRequired\" attr.data-required=\"{{question.isRequired}}\"\n value=\"{{question.value}}\" [readonly]=\"question.readonly\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\n [min]=\"question.minDate | date:'yyyy-MM-dd'\" [max]=\"question.maxDate | date:'yyyy-MM-dd'\"\n (focusout)=\"question.restriction != undefined && checkInputDate(question,i)\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\n </div>\n <div *ngIf=\"question.type=='datepicker' && question.isTime\">\n <input type=\"datetime-local\" id=\"{{question.id}}\" class=\"form-control search-input btn-lookup\"\n name=\"{{question.name+[i]}}\" [required]=\"question.isRequired\"\n [formControlName]=\"question.name\" attr.data-required=\"{{question.isRequired}}\"\n value=\"{{question.value}}\" [readonly]=\"question.readonly\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\n min=\"{{question.minDate | date:'yyyy-MM-dd'}}\" max=\"{{question.maxDate | date:'yyyy-MM-dd'}}\"\n (focusout)=\"question.restriction != undefined && checkInputDate(question,i)\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\n </div>\n </span>\n <span *ngIf=\"useNewDatepicker\">\n <div *ngIf=\"question.type=='datepicker'\">\n <lib-ucdatepicker [parentForm]=\"form\" [enjiForm]=\"enjiForm\" [identifier]=\"question.name+i\"\n [min]=\"question.minDate | date: 'yyyy-MM-dd'\" [max]=\"question.maxDate | date: 'yyyy-MM-dd'\"\n [defaultStartDate]=\"BisDt\" [attr]=\"question\"\n (change)=\"question.restriction != undefined && checkInputDate(question,i)\">\n </lib-ucdatepicker>\n </div>\n </span>\n\n <div\n *ngIf=\"question.type == 'taskDefinitionKey' || question.type == 'processKey' || question.type == 'officeRoleCodes'\">\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\n [required]=\"question.isRequired\" class=\"form-control search-input\"\n attr.query-in=\"{{question.isQueryIn}}\" attr.data-type=\"{{question.datatype}}\"\n attr.label=\"{{question.label}}\" [hidden]=\"question?.itemsUrl?.length == 1\"\n (change)=\"(question.type == 'taskDefinitionKey' || question.type == 'processKey') ? SetProcessKey(i,question.wfKeyFilter) : SetRoleOfficeCodes(i)\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl?.length != 1\" value=\"one\">Select\n One</option>\n <option\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl?.length != 1\"\n value=\"all\">All</option>\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\n {{item.Value}}\n </option>\n </select>\n <label *ngIf=\"question?.itemsUrl?.length == 1\">{{question.itemsUrl[0].Value}}</label>\n </div>\n <div *ngIf=\"question.type=='dropdown'\">\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\n [required]=\"question.isRequired\" class=\"form-control search-input\"\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n attr.data-restriction=\"{{ question?.restriction ?? ''}}\"\n [hidden]=\"!question.isFromURL ? (question?.items?.length == 1 && !question?.keepDdl) : (question?.itemsUrl?.length == 1 && !question?.keepDdl)\"\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : updateKeyValDict({key: question.name, value: $event.target.value})\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n <option\n *ngIf=\"question.ddlType == 'one' && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl))\"\n value=\"one\">\n Select One</option>\n <option\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl))\"\n value=\"all\">All</option>\n <option *ngFor=\"let item of !question.isFromURL ? question?.items : question?.itemsUrl\"\n value=\"{{!question.isFromURL ? item.key : item.Key}}\">\n {{!question.isFromURL ? item.value : item.Value}}\n </option>\n <option\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl)) && question.useOthersSelection\"\n value=\"others\">Others</option>\n </select>\n <label\n *ngIf=\"!question.isFromURL ? (question?.items?.length == 1 && !question?.keepDdl) : (question?.itemsUrl?.length == 1 && !question?.keepDdl)\">{{!question.isFromURL\n ? question.items[0].value :\n question.itemsUrl[0].Value}}\n </label>\n </div>\n <div *ngIf=\"question.type=='dropdownSearch'\">\n <div class=\"dds-display-item\"\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">\n <input type=\"text\" class=\"form-control dds-input\" name=\"{{'ddsValue'+question.name}}\"\n [(ngModel)]=\"question.descr\" readonly\n (click)=\"question.isListHide = !question.isListHide; question.searchText=''\">\n </div>\n <label\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{question.descr}}</label>\n <div class=\"dds-list-container\" [hidden]=\"question.isListHide\">\n <input type=\"text\" class=\"form-control search-input\" name=\"{{'searchText'+question.name}}\"\n [(ngModel)]=\"question.searchText\" [placeholder]=\"question.placeholder\">\n <div class=\"dds-items-container\">\n <select class=\"full-width\" name=\"{{question.name}}\"\n attr.data-required=\"{{question.isRequired}}\" [(ngModel)]=\"question.value\"\n [required]=\"question.isRequired\" attr.query-in=\"{{question.isQueryIn}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"\n size=\"{{question?.size == undefined ? question?.size : 10}}\">\n <option (click)=\"selectedOption({Key:'one',Value:'Select One'},question)\"\n *ngIf=\"question.ddsType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\n value=\"one\">\n Select One</option>\n <option (click)=\"selectedOption({Key:'all',Value:'All'},question)\"\n *ngIf=\"(question?.ddsType == undefined || question.ddsType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\n value=\"all\">All</option>\n <!-- <option *ngFor=\"let item of question?.items | textSearch : question.searchText; let i=index\" [value]=\"item?.key\" (click)=\"selectedOption(item,question)\">\n {{item?.value}}\n </option> -->\n <option\n *ngFor=\"let item of !question.isFromURL ? (question?.items | textSearch : question.searchText) : question?.itemsUrl | textSearch : question.searchText\"\n (click)=\"selectedOption(item,question)\" value=\"{{item.Key}}\">\n {{item.Value}}\n </option>\n </select>\n </div>\n </div>\n </div>\n <div *ngIf=\"question.type=='claim'\">\n <select name=\"{{'claim'+[i]}}\" class=\"form-control search-input\" attr.data-type=\"{{'text'}}\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\" attr.data-name=\"{{'Assignee'}}\"\n [hidden]=\"ClaimList?.length == 1\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls['claim'+[i]]?.touched || enjiForm.form.controls['claim'+[i]]?.dirty) && enjiForm.form.controls['claim'+[i]]?.invalid }\">\n <option *ngIf=\"question.ddlType == 'one' && ClaimList?.length != 1\" value=\"one\">Select\n One</option>\n <option\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && ClaimList?.length != 1\"\n value=\"all\">All</option>\n <option *ngFor=\"let item of ClaimList\" value=\"{{item.Key}}\">\n {{item.Value}}\n </option>\n </select>\n </div>\n <div *ngIf=\"question.type=='lookup'\">\n <lib-cl-uclookupgeneric *ngIf=\"searchInput.dictLookupObj[question.name].isReady\"\n [lookupInput]=\"searchInput.dictLookupObj[question.name]\" [parentForm]='form'\n [enjiForm]='enjiForm' [identifier]=\"question.name\"\n [notifyUpdateKeyValDict]=\"notifyUpdateKeyValDict\" [lookupKeyValDict]=\"lookupKeyValDict\"\n (lookup)=\"getLookup($event, question)\"\n (inputtedValue)=\"getInputtedValue($event, question)\"></lib-cl-uclookupgeneric>\n </div>\n\n <div *ngIf=\"question.type === 'time'\">\n <input type=\"time\" id=\"{{question.id}}\" class=\"form-control search-input\"\n [IsUpperCase]=\"question.isUppercase === undefined ? true : question.isUppercase\"\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n [placeholder]=\"question.placeholder != undefined ? question.placeholder : ''\"\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\n [readonly]=\"question.isReadonly\"\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n </div>\n\n <div *ngIf=\"question.type === 'month'\">\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\n [required]=\"question.isRequired\" class=\"form-control search-input\"\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n <option *ngIf=\"question.ddlType == 'one'\" value=\"one\">\n Select One</option>\n <option *ngIf=\"question?.ddlType == undefined || question.ddlType == 'all'\" value=\"all\">All\n </option>\n <option *ngFor=\"let m of months\" [value]=\"m.key\">\n {{m.value}}\n </option>\n </select>\n </div>\n\n <div *ngIf=\"question.type === 'year'\">\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\n [required]=\"question.isRequired\" class=\"form-control search-input\"\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\n <option *ngIf=\"question.ddlType == 'one'\" value=\"one\">\n Select One</option>\n <option *ngIf=\"question?.ddlType == undefined || question.ddlType == 'all'\" value=\"all\">All\n </option>\n <option *ngFor=\"let y of years\" [value]=\"y\">\n {{y}}\n </option>\n </select>\n </div>\n\n <lib-uc-show-errors *ngIf=\"question.type !== 'datepicker'\" [control]=\"form.controls[question.name]\"\n [submit]=\"enjiForm.submitted\">\n </lib-uc-show-errors>\n <lib-uc-show-errors *ngIf=\"question.type === 'datepicker' || question.type === 'numeric'\"\n [control]=\"form.controls[question.name+[i]]\" [submit]=\"enjiForm.submitted\">\n </lib-uc-show-errors>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-3 form-group\" *ngIf=\"(isReport != undefined && isReport)\">\n <div class=\"col-md-12\">\n <div class=\"row\">\n <label class=\"col-md-12 no-padding search-label\" translate>Report Type</label>\n <div class=\"col-md-12 no-padding\">\n <select name=\"ExportType\" class=\"form-control search-input\" attr.data-type=\"text\"\n [formControlName]=\"'ExportType'\">\n <option *ngFor=\"let item of ExportTypeList\" [value]=\"item.key\">{{item.value}}</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-3 form-group\"\n *ngIf=\"(isReport != undefined && isReport) && (showRptExecType != undefined && showRptExecType)\">\n <div class=\"col-md-12\">\n <div class=\"row\">\n <label class=\"col-md-12 no-padding search-label\" translate>Execution Type</label>\n <div class=\"col-md-12 no-padding\">\n <select name=\"RptExecType\" class=\"form-control search-input\" attr.data-type=\"text\"\n [formControlName]=\"'RptExecType'\">\n <option *ngFor=\"let item of ReportExecTypeList\" [value]=\"item.key\">{{item.value}}</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-12 no-padding\">\n <div class=\"form-actions right\">\n <ng-container class=\"btn-group\" *ngIf=\"exportData == true && isSearch\">\n <div ngbDropdown class=\"d-inline-block\">\n <button type=\"button\" class=\"btn btn-raised btn-outline-2 mr-1 dropdown-toggle\" ngbDropdownToggle\n id=\"exportList\" translate>\n <i class=\"fa ft-download button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\n translate>Export File</span>\n </button>\n <div class=\"dropdown-menu\" ngbDropdownMenu aria-labelledby=\"exportList\">\n <ng-container *ngFor=\"let item of exportAsFileList\">\n <a class=\"dropdown-item\" ngbDropdownItem (click)=\"exportAsFile(item.key)\">{{item.value}}</a>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <button type=\"button\" (click)=\"reset()\" class=\"btn btn-raised mr-1 btn-link-2\" translate>\n <!-- <i class=\"fa fa-times\"></i>&nbsp; -->\n <span translate>Reset</span>\n </button>\n <button *ngIf=\"(isReport == undefined || !isReport)\" type=\"submit\" class=\"btn btn-raised btn-outline-2\"\n #UCSearchClick [disabled]=\"!searchBtnReady\">\n <i class=\"fa fa-search button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\n translate>Search</span>\n </button>\n <button *ngIf=\"(isReport != undefined && isReport)\" type=\"submit\" class=\"btn btn-raised btn-outline-2\">\n <i class=\"fa ft-download button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\n translate>Generate\n Report</span>\n </button>\n </div>\n </div>\n <!-- </div> -->\n </div>\n </form>\n </div>\n </div>\n <!-- </div>\n </div>\n </div> -->\n <!-- </div> -->\n</div>\n<!-- // Basic form layout section end -->", styles: [".ucSearch-title{margin:3px}.card-body{margin-top:24px}.form-group{margin-bottom:15px!important}.search-label{color:var(--Black_1, #3A4060);font-size:14px!important}.dds-input{border-radius:7px!important;border:1px solid var(--gray-line, #DFE6E9)!important;background:var(--white-1, #FDFEFF)!important;padding:1.135rem!important;height:calc(1.5rem + 2px)!important;font-size:12px!important}.dds-display-item:after{content:\"\\e929\";font-family:feather;font-size:1rem;display:inline-block;position:absolute;right:5px;top:5px;transform:rotate(90deg)}.dds-list-container{position:absolute;width:100%;z-index:9}.search-input{border-radius:7px!important;border:1px solid var(--gray-line, #DFE6E9)!important;background:var(--white-1, #FDFEFF)!important;width:100%}select.search-input{appearance:none;background-image:url(\"data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23246CFE' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e\")!important;background-repeat:no-repeat!important;background-position:right 1rem center!important;background-size:1.4em!important}.btn{border-radius:7px;font-size:14px;padding:.275rem 1rem}.btn-link-2{background:none;border:none;color:var(--blue-primary, #246CFE)!important}.btn-link-2:hover{background:var(--light-grey, #F4F8FB)!important;color:var(--blue-primary-darker, #0010F7)!important}.btn-outline-2{border:1px solid var(--blue-primary, #246CFE)!important;background:var(--white, #FDFEFF)!important;color:var(--blue-primary, #246CFE)!important}.btn-outline-2:hover{color:var(--blue-primary-darker, #0010F7)!important;background:var(--light-grey, #F4F8FB)!important;border:1px solid var(--blue-primary-darker, #0010F7)!important}.button-icon-search{font-size:11px;vertical-align:middle;padding-right:8px}.button-text-search{vertical-align:middle}.dropdown-toggle:after{display:inline-block;margin-left:.5em;vertical-align:middle;content:\"\";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}\n"] }]
1807
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
1808
- type: Inject,
1809
- args: [DOCUMENT]
1810
- }] }, { type: i2.ToastrService }, { type: i3.CookieService }, { type: i4.DatePipe }, { type: i0.ElementRef }, { type: i5.ExportFileService }, { type: i6.ActivatedRoute }, { type: i7.NgxRouterService }, { type: i8.FormBuilder }, { type: i9.UcsearchDatetimeService }, { type: i10.UcsearchFormService }]; }, propDecorators: { content: [{
1985
+ ], template: "<span hidden attr.version=\"3.8.18-canary.0\"></span>\r\n<div>\r\n <!-- Basic form layout section start -->\r\n <lib-ucSubsection [hidden]=\"!searchInput.IsSubsection\" [id]=\"searchInput.searchId+'id'\"\r\n [title]=\"configuration?.sectionTitle || 'Paging'\" [card]=\"searchInput.searchId\" [legacy]=\"false\"\r\n (collapse)=\"onCollapse($event)\">\r\n </lib-ucSubsection>\r\n\r\n <!-- <div [id]=\"searchInput.searchId\"> -->\r\n <!-- <div class=\"row text-start\">\r\n <div class=\"col-md-12\">\r\n <div > -->\r\n <!-- <div class=\"ps-3 mb-2 mt-2\" *ngIf=\"configuration?.title != undefined && configuration?.title != ''\">\r\n <h4 class=\"card-title ucSearch-title\" translate>{{configuration.title}}</h4>\r\n </div> -->\r\n <div class=\"card-body\" [id]=\"searchInput.searchId\" [(ngbCollapse)]=\"isCollapsed\">\r\n <div class=\"px-3\">\r\n <form class=\"form \" id=\"formSearch\" #formIdSearch [formGroup]=\"form\" #enjiForm=\"ngForm\"\r\n (ngSubmit)=\"enjiForm.valid && searchClick()\">\r\n <div class=\"form-body\">\r\n <!-- <h4 class=\"form-section fw-bold\">\r\n <div (click)=\"changeState()\" class=\"btn no-padding cursor-pointer flip\">\r\n <i class=\"fa\" style=\"font-size: 15px; margin: 0px 0px 5px -15px;\"\r\n [ngClass]=\"isHidden ? 'fa-chevron-right' : 'fa-chevron-down'\"></i>\r\n </div>\r\n <span\r\n *ngIf=\"configuration?.sectionTitle != undefined && configuration?.sectionTitle != ''; then inputSectionTitle else defaultSectionTitle\"></span>\r\n <ng-template #inputSectionTitle>\r\n {{configuration?.sectionTitle}}\r\n </ng-template>\r\n <ng-template #defaultSectionTitle>\r\n Paging\r\n </ng-template>\r\n </h4> -->\r\n <!-- Ini Digunakan untuk Generate Dynamic Component -->\r\n <!-- [hidden]=\"isHidden\" -->\r\n <!-- <div class=\"card-active\" [@changeDivSize]=currentState> -->\r\n <div class=\"row\">\r\n <div class=\"col-md-3 form-group\" *ngFor=\"let question of configuration?.component; let i = index\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-12 no-padding search-label\" for=\"{{question.id}}\"\r\n [ngClass]=\"{'adins-required-label': (question.isRequired || (question?.ddlType != undefined && question.ddlType == 'one'))}\"\r\n translate>{{question.label}}</label>\r\n <div class=\"col-md-12 no-padding\">\r\n <div *ngIf=\"question.type=='textbox'\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\r\n [IsUpperCase]=\"question.isUppercase === undefined ? true : question.isUppercase\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n [placeholder]=\"question.placeholder != undefined ? question.placeholder : ''\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\r\n [readonly]=\"question.isReadonly\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='textarea'\">\r\n <textarea type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\r\n attr.data-required=\"{{question.isRequired}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" value=\"{{question.value}}\" attr.label=\"{{question.label}}\"\r\n [readonly]=\"question.isReadonly\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"></textarea>\r\n </div>\r\n <div *ngIf=\"question.type=='numeric'\">\r\n <input type=\"number\" id=\"{{question.id}}\" (focus)=\"transformToDecimal($event)\"\r\n (blur)=\"transformToDecimal($event)\" class=\"form-control search-input\" [placeholder]=\"'0'\"\r\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\"\r\n [formControlName]=\"question.name+[i]\" attr.data-required=\"{{question.isRequired}}\"\r\n value=\"{{question.value}}\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-numericpair=\"{{question.numericPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\" attr.label=\"{{question.label}}\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [readonly]=\"question.isReadonly\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='currency'\">\r\n <div *ngIf=\"question?.isCustom != undefined && question?.isCustom\">\r\n <input type=\"\" id=\"{{question.id}}\" class=\"form-control search-input\"\r\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\" autocomplete=\"off\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\" currencyMask\r\n [formControlName]=\"question.name+[i]\" attr.label=\"{{question.label}}\"\r\n [readonly]=\"question.isReadonly\" (focus)=\"OnFocusCurr($event, question.value)\"\r\n (blur)=\"ValidateDefaultValue(question)\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [options]=\"{ thousands: question.thousands, decimal: question.decimal, align: question.align, allowNegative: question.allowNegative, allowZero: question.allowZero, precision: question.precision, nullable: question.nullable }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question?.isCustom == undefined || !question?.isCustom\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-input\"\r\n [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\" autocomplete=\"off\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\" currencyMask\r\n [formControlName]=\"question.name+[i]\" attr.label=\"{{question.label}}\"\r\n (focus)=\"OnFocusCurr($event, question.value)\" (blur)=\"ValidateDefaultValue(question)\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [options]=\"{ thousands: ',', decimal: '.', align: 'right', allowNegative: false, allowZero:true, precision: 2, nullable: false }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n </div>\r\n\r\n <!-- End Hardcode Lookup didalem-->\r\n <span *ngIf=\"!useNewDatepicker\">\r\n <div *ngIf=\"question.type=='datepicker' && !question.isTime\">\r\n <input type=\"date\" id=\"{{question.id}}\" class=\"form-control search-input btn-lookup\"\r\n name=\"{{question.name+[i]}}\" [formControlName]=\"question.name+[i]\"\r\n [required]=\"question.isRequired\" attr.data-required=\"{{question.isRequired}}\"\r\n value=\"{{question.value}}\" [readonly]=\"question.readonly\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\r\n [min]=\"question.minDate | date:'yyyy-MM-dd'\" [max]=\"question.maxDate | date:'yyyy-MM-dd'\"\r\n (focusout)=\"question.restriction != undefined && checkInputDate(question,i)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='datepicker' && question.isTime\">\r\n <input type=\"datetime-local\" id=\"{{question.id}}\" class=\"form-control search-input btn-lookup\"\r\n name=\"{{question.name+[i]}}\" [required]=\"question.isRequired\"\r\n [formControlName]=\"question.name\" attr.data-required=\"{{question.isRequired}}\"\r\n value=\"{{question.value}}\" [readonly]=\"question.readonly\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\r\n min=\"{{question.minDate | date:'yyyy-MM-dd'}}\" max=\"{{question.maxDate | date:'yyyy-MM-dd'}}\"\r\n (focusout)=\"question.restriction != undefined && checkInputDate(question,i)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n </span>\r\n <span *ngIf=\"useNewDatepicker\">\r\n <div *ngIf=\"question.type=='datepicker'\">\r\n <lib-ucdatepicker [parentForm]=\"form\" [enjiForm]=\"enjiForm\" [identifier]=\"question.name+i\"\r\n [min]=\"question.minDate | date: 'yyyy-MM-dd'\" [max]=\"question.maxDate | date: 'yyyy-MM-dd'\"\r\n [defaultStartDate]=\"BisDt\" [attr]=\"question\"\r\n (change)=\"question.restriction != undefined && checkInputDate(question,i)\">\r\n </lib-ucdatepicker>\r\n </div>\r\n </span>\r\n\r\n <div\r\n *ngIf=\"question.type == 'taskDefinitionKey' || question.type == 'processKey' || question.type == 'officeRoleCodes'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-input\"\r\n attr.query-in=\"{{question.isQueryIn}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.label=\"{{question.label}}\" [hidden]=\"question?.itemsUrl?.length == 1\"\r\n (change)=\"(question.type == 'taskDefinitionKey' || question.type == 'processKey') ? SetProcessKey(i,question.wfKeyFilter) : SetRoleOfficeCodes(i)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl?.length != 1\" value=\"one\">Select\r\n One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.itemsUrl?.length == 1\">{{question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdown'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-input\"\r\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-restriction=\"{{ question?.restriction ?? ''}}\"\r\n [hidden]=\"!question.isFromURL ? (question?.items?.length == 1 && !question?.keepDdl) : (question?.itemsUrl?.length == 1 && !question?.keepDdl)\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : updateKeyValDict({key: question.name, value: $event.target.value})\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option\r\n *ngIf=\"question.ddlType == 'one' && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl))\"\r\n value=\"one\">\r\n Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl))\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of !question.isFromURL ? question?.items : question?.itemsUrl\"\r\n value=\"{{!question.isFromURL ? item.key : item.Key}}\">\r\n {{!question.isFromURL ? item.value : item.Value}}\r\n </option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? (question?.items?.length != 1 || question?.keepDdl) : (question?.itemsUrl?.length != 1 || question?.keepDdl)) && question.useOthersSelection\"\r\n value=\"others\">Others</option>\r\n </select>\r\n <label\r\n *ngIf=\"!question.isFromURL ? (question?.items?.length == 1 && !question?.keepDdl) : (question?.itemsUrl?.length == 1 && !question?.keepDdl)\">{{!question.isFromURL\r\n ? question.items[0].value :\r\n question.itemsUrl[0].Value}}\r\n </label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdownSearch'\">\r\n <div class=\"dds-display-item\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">\r\n <input type=\"text\" class=\"form-control dds-input\" name=\"{{'ddsValue'+question.name}}\"\r\n [(ngModel)]=\"question.descr\" readonly\r\n (click)=\"question.isListHide = !question.isListHide; question.searchText=''\">\r\n </div>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{question.descr}}</label>\r\n <div class=\"dds-list-container\" [hidden]=\"question.isListHide\">\r\n <input type=\"text\" class=\"form-control search-input\" name=\"{{'searchText'+question.name}}\"\r\n [(ngModel)]=\"question.searchText\" [placeholder]=\"question.placeholder\">\r\n <div class=\"dds-items-container\">\r\n <select class=\"full-width\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" [(ngModel)]=\"question.value\"\r\n [required]=\"question.isRequired\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"\r\n size=\"{{question?.size == undefined ? question?.size : 10}}\">\r\n <option (click)=\"selectedOption({Key:'one',Value:'Select One'},question)\"\r\n *ngIf=\"question.ddsType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option (click)=\"selectedOption({Key:'all',Value:'All'},question)\"\r\n *ngIf=\"(question?.ddsType == undefined || question.ddsType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <!-- <option *ngFor=\"let item of question?.items | textSearch : question.searchText; let i=index\" [value]=\"item?.key\" (click)=\"selectedOption(item,question)\">\r\n {{item?.value}}\r\n </option> -->\r\n <option\r\n *ngFor=\"let item of !question.isFromURL ? (question?.items | textSearch : question.searchText) : question?.itemsUrl | textSearch : question.searchText\"\r\n (click)=\"selectedOption(item,question)\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"question.type=='claim'\">\r\n <select name=\"{{'claim'+[i]}}\" class=\"form-control search-input\" attr.data-type=\"{{'text'}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\" attr.data-name=\"{{'Assignee'}}\"\r\n [hidden]=\"ClaimList?.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls['claim'+[i]]?.touched || enjiForm.form.controls['claim'+[i]]?.dirty) && enjiForm.form.controls['claim'+[i]]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && ClaimList?.length != 1\" value=\"one\">Select\r\n One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && ClaimList?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of ClaimList\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"question.type=='lookup'\">\r\n <lib-cl-uclookupgeneric *ngIf=\"searchInput.dictLookupObj[question.name].isReady\"\r\n [lookupInput]=\"searchInput.dictLookupObj[question.name]\" [parentForm]='form'\r\n [enjiForm]='enjiForm' [identifier]=\"question.name\"\r\n [notifyUpdateKeyValDict]=\"notifyUpdateKeyValDict\" [lookupKeyValDict]=\"lookupKeyValDict\"\r\n (lookup)=\"getLookup($event, question)\"\r\n (inputtedValue)=\"getInputtedValue($event, question)\"></lib-cl-uclookupgeneric>\r\n </div>\r\n\r\n <div *ngIf=\"question.type === 'time'\">\r\n <input type=\"time\" id=\"{{question.id}}\" class=\"form-control search-input\"\r\n [IsUpperCase]=\"question.isUppercase === undefined ? true : question.isUppercase\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\" [formControlName]=\"question.name\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n [placeholder]=\"question.placeholder != undefined ? question.placeholder : ''\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-restriction=\"{{question.restriction}}\" attr.label=\"{{question.label}}\"\r\n [readonly]=\"question.isReadonly\"\r\n (focusout)=\"updateKeyValDict({key: question.name, value: question.value})\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n\r\n <div *ngIf=\"question.type === 'month'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-input\"\r\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one'\" value=\"one\">\r\n Select One</option>\r\n <option *ngIf=\"question?.ddlType == undefined || question.ddlType == 'all'\" value=\"all\">All\r\n </option>\r\n <option *ngFor=\"let m of months\" [value]=\"m.key\">\r\n {{m.value}}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div *ngIf=\"question.type === 'year'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-input\"\r\n [formControlName]=\"question.name\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one'\" value=\"one\">\r\n Select One</option>\r\n <option *ngIf=\"question?.ddlType == undefined || question.ddlType == 'all'\" value=\"all\">All\r\n </option>\r\n <option *ngFor=\"let y of years\" [value]=\"y\">\r\n {{y}}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <lib-uc-show-errors *ngIf=\"question.type !== 'datepicker'\" [control]=\"form.controls[question.name]\"\r\n [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n <lib-uc-show-errors *ngIf=\"question.type === 'datepicker' || question.type === 'numeric'\"\r\n [control]=\"form.controls[question.name+[i]]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-3 form-group\" *ngIf=\"(isReport != undefined && isReport)\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-12 no-padding search-label\" translate>Report Type</label>\r\n <div class=\"col-md-12 no-padding\">\r\n <select name=\"ExportType\" class=\"form-control search-input\" attr.data-type=\"text\"\r\n [formControlName]=\"'ExportType'\">\r\n <option *ngFor=\"let item of ExportTypeList\" [value]=\"item.key\">{{item.value}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-3 form-group\"\r\n *ngIf=\"(isReport != undefined && isReport) && (showRptExecType != undefined && showRptExecType)\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-12 no-padding search-label\" translate>Execution Type</label>\r\n <div class=\"col-md-12 no-padding\">\r\n <select name=\"RptExecType\" class=\"form-control search-input\" attr.data-type=\"text\"\r\n [formControlName]=\"'RptExecType'\">\r\n <option *ngFor=\"let item of ReportExecTypeList\" [value]=\"item.key\">{{item.value}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 no-padding\">\r\n <div class=\"form-actions right\">\r\n <ng-container class=\"btn-group\" *ngIf=\"exportData == true && isSearch\">\r\n <div ngbDropdown class=\"d-inline-block\">\r\n <button type=\"button\" class=\"btn btn-raised btn-outline-2 me-1 dropdown-toggle\" ngbDropdownToggle\r\n id=\"exportList\" translate>\r\n <i class=\"fa ft-download button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\r\n translate>Export File</span>\r\n </button>\r\n <div class=\"dropdown-menu\" ngbDropdownMenu aria-labelledby=\"exportList\">\r\n <ng-container *ngFor=\"let item of exportAsFileList\">\r\n <a class=\"dropdown-item\" ngbDropdownItem (click)=\"exportAsFile(item.key)\">{{item.value}}</a>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <button type=\"button\" (click)=\"reset()\" class=\"btn btn-raised me-1 btn-link-2\" translate>\r\n <!-- <i class=\"fa fa-times\"></i>&nbsp; -->\r\n <span translate>Reset</span>\r\n </button>\r\n <button *ngIf=\"(isReport == undefined || !isReport)\" type=\"submit\" class=\"btn btn-raised btn-outline-2\"\r\n #UCSearchClick [disabled]=\"!searchBtnReady\">\r\n <i class=\"fa fa-search button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\r\n translate>Search</span>\r\n </button>\r\n <button *ngIf=\"(isReport != undefined && isReport)\" type=\"submit\" class=\"btn btn-raised btn-outline-2\">\r\n <i class=\"fa ft-download button-icon-search\"></i>&nbsp;<span class=\"button-text-search\"\r\n translate>Generate\r\n Report</span>\r\n </button>\r\n </div>\r\n </div>\r\n <!-- </div> -->\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n <!-- </div>\r\n </div>\r\n </div> -->\r\n <!-- </div> -->\r\n</div>\r\n<!-- // Basic form layout section end -->", styles: [".ucSearch-title{margin:3px}.card-body{margin-top:24px}.form-group{margin-bottom:15px!important}.search-label{color:var(--Black_1, #3A4060);font-size:14px!important}.dds-input{border-radius:7px!important;border:1px solid var(--gray-line, #DFE6E9)!important;background:var(--white-1, #FDFEFF)!important;padding:1.135rem!important;height:calc(1.5rem + 2px)!important;font-size:12px!important}.dds-display-item:after{content:\"\\e929\";font-family:feather;font-size:1rem;display:inline-block;position:absolute;right:5px;top:5px;transform:rotate(90deg)}.dds-list-container{position:absolute;width:100%;z-index:9}.search-input{border-radius:7px!important;border:1px solid var(--gray-line, #DFE6E9)!important;background:var(--white-1, #FDFEFF)!important;width:100%}select.search-input{appearance:none;background-image:url(\"data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23246CFE' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e\")!important;background-repeat:no-repeat!important;background-position:right 1rem center!important;background-size:1.4em!important}.btn{border-radius:7px;font-size:14px;padding:.275rem 1rem}.btn-link-2{background:none;border:none;color:var(--blue-primary, #246CFE)!important}.btn-link-2:hover{background:var(--light-grey, #F4F8FB)!important;color:var(--blue-primary-darker, #0010F7)!important}.btn-outline-2{border:1px solid var(--blue-primary, #246CFE)!important;background:var(--white, #FDFEFF)!important;color:var(--blue-primary, #246CFE)!important}.btn-outline-2:hover{color:var(--blue-primary-darker, #0010F7)!important;background:var(--light-grey, #F4F8FB)!important;border:1px solid var(--blue-primary-darker, #0010F7)!important}.button-icon-search{font-size:11px;vertical-align:middle;padding-right:8px}.button-text-search{vertical-align:middle}.dropdown-toggle:after{display:inline-block;margin-left:.5em;vertical-align:middle;content:\"\";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}\n"] }]
1986
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ToastrService }, { type: i3.CookieService }, { type: i4.DatePipe }, { type: i0.ElementRef }, { type: i5.ExportFileService }, { type: i6.ActivatedRoute }, { type: i7.NgxRouterService }, { type: i8.FormBuilder }, { type: i9.UcsearchDatetimeService }, { type: i10.UcsearchFormService }]; }, propDecorators: { content: [{
1811
1987
  type: ViewChild,
1812
- args: ['enjiForm']
1988
+ args: ["enjiForm"]
1813
1989
  }], myForm: [{
1814
1990
  type: ViewChild,
1815
- args: ['formIdSearch']
1991
+ args: ["formIdSearch"]
1816
1992
  }], searchInput: [{
1817
1993
  type: Input
1818
1994
  }], pageSize: [{
@@ -1828,4 +2004,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1828
2004
  }], reqGetAllData: [{
1829
2005
  type: Output
1830
2006
  }] } });
1831
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWNzZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWNzZWFyY2gvc3JjL2xpYi91Y3NlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy91Y3NlYXJjaC9zcmMvbGliL3Vjc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUV2SSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFxQyxXQUFXLEVBQThDLE1BQU0sRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3SixPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFxQixzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxD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LFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUMvQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQ2xGLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUM5RTt3QkFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ3ZFO29CQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUM5QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQ2xGLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUM3RTt3QkFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FB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LENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLFNBQVMsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksU0FBUyxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxTQUFTLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzlhLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksU0FBUyxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxTQUFTLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLFNBQVMsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFOWEsSUFBSSxlQUFlLEtBQUssQ0FBQyxDQUFDLElBQUksZUFBZSxLQUFLLENBQUMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRWxFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDckosSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEtBQUssR0FBRyxxQkFBcUIsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekcsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGdCQUFnQixDQUFDLFNBQVMsRUFBRSxNQUFNO1FBQ2hDLDhDQUE4QztRQUM5Qyx5WkFBeVo7UUFDeloseVpBQXlaO1FBQ3paLG9HQUFvRztRQUNwRyxvR0FBb0c7UUFFcEcscUJBQXFCO1FBQ3JCLDhHQUE4RztRQUM5RyxrQkFBa0I7UUFDbEIsSUFBSTtRQUVKLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzlZLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzlZLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FB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dXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5qZWN0LCBSZW5kZXJlcjIsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIENvbnRyb2xDb250YWluZXIsIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5nRm9ybSwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRlUGlwZSwgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbnB1dFNlYXJjaE9iaiB9IGZyb20gJy4vbW9kZWwvaW5wdXQtc2VhcmNoLW9iai5tb2RlbCc7XG5pbXBvcnQgeyBDcml0ZXJpYU9iaiB9IGZyb20gJy4vbW9kZWwvY3JpdGVyaWEtb2JqLm1vZGVsJztcbmltcG9ydCB7IFJlcXVlc3RDcml0ZXJpYU9iaiB9IGZyb20gJy4vbW9kZWwvcmVxdWVzdC1jcml0ZXJpYS1vYmoubW9kZWwnO1xuaW1wb3J0IHsgQWRJbnNDb25zdGFudCwgRVhQT1JUX0RBVEFfVFlQRVMgfSBmcm9tICcuL21vZGVsL2FkaW5zLWNvbnN0YW50JztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHRyaWdnZXIsIHRyYW5zaXRpb24sIHN0eWxlLCBhbmltYXRlLCBzdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgRXhwb3J0VHlwZUNvbnN0YW50LCBLZXlWYWx1ZVJlcG9ydE9iaiwgUmVwb3J0RXhlY1R5cGVDb25zdGFudCB9IGZyb20gJy4vbW9kZWwva2V5LXZhbHVlLXJlcG9ydC5tb2RlbCc7XG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSAnbmd4LWNvb2tpZSc7XG5pbXBvcnQgKiBhcyBDcnlwdG9KUyBmcm9tICdjcnlwdG8tanMnO1xuaW1wb3J0IHsgS2V5VmFsdWVVQ1NlYXJjaE9iaiwgTGlzdEtleVZhbHVlTW9udGggfSBmcm9tICcuL21vZGVsL2tleS12YWx1ZS11Yy1zZWFyY2gubW9kZWwnO1xuaW1wb3J0IHsgRXhwb3J0RmlsZVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2V4cG9ydC1maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTmd4Um91dGVyU2VydmljZSB9IGZyb20gJ0BhZGlucy9mZS1jb3JlJztcbmltcG9ydCB7IFVjc2VhcmNoRGF0ZXRpbWVTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy91Y3NlYXJjaC1kYXRldGltZS5zZXJ2aWNlJztcbmltcG9ydCB7IG1vbnRoc0tleVZhbHVlIH0gZnJvbSAnLi9jb25zdGFudHMvbW9udGgnO1xuaW1wb3J0IHsgVWNUZW1wbGF0ZVNlcnZpY2UgfSBmcm9tICdAYWRpbnMvdWN0ZW1wbGF0ZSc7XG5pbXBvcnQgeyBVY3NlYXJjaEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy91Y3NlYXJjaC1mb3JtLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItVUNTZWFyY2gnLFxuICB0ZW1wbGF0ZVVybDogJy4vdWNzZWFyY2guY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91Y3NlYXJjaC5jb21wb25lbnQuY3NzJ10sXG4gIHByb3ZpZGVyczogW0RhdGVQaXBlLCBFeHBvcnRGaWxlU2VydmljZV0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdjaGFuZ2VEaXZTaXplJywgW1xuICAgICAgc3RhdGUoJ2luaXRpYWwnLCBzdHlsZSh7XG4gICAgICAgIGhlaWdodDogJyonLFxuICAgICAgICBvcGFjaXR5OiAnMScsXG4gICAgICB9KSksXG4gICAgICBzdGF0ZSgnZmluYWwnLCBzdHlsZSh7XG4gICAgICAgIGhlaWdodDogJzBweCcsXG4gICAgICAgIG9wYWNpdHk6ICcwJyxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgfSkpLFxuICAgICAgdHJhbnNpdGlvbignaW5pdGlhbD0+ZmluYWwnLCBhbmltYXRlKCczMDBtcycpKSxcbiAgICAgIHRyYW5zaXRpb24oJ2ZpbmFsPT5pbml0aWFsJywgYW5pbWF0ZSgnMzAwbXMnKSlcbiAgICBdKSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBVQ1NlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLy8gaXNMaXN0SGlkZTogYm9vbGVhbiA9IHRydWU7XG4gIC8vIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgLy8gb25DbGljayhldjogTW91c2VFdmVudCkge1xuICAvLyAgIGNvbnN0IGNsaWNrSW5zaWRlID0gdGhpcy5lbGVtUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXYudGFyZ2V0KTtcbiAgLy8gICBpZiAoIWNsaWNrSW5zaWRlKSB7XG4gIC8vICAgICB0aGlzLmlzTGlzdEhpZGUgPSB0cnVlO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIEBWaWV3Q2hpbGQoJ2VuamlGb3JtJykgc2V0IGNvbnRlbnQoY29udGVudDogTmdGb3JtKSB7XG4gICAgaWYgKGNvbnRlbnQpIHsgLy8gaW5pdGlhbGx5IHNldHRlciBnZXRzIGNhbGxlZCB3aXRoIHVuZGVmaW5lZFxuICAgICAgdGhpcy5zZWFyY2hGb3JtID0gY29udGVudDtcbiAgICB9XG4gIH1cblxuICBAVmlld0NoaWxkKCdmb3JtSWRTZWFyY2gnKSBteUZvcm06IEVsZW1lbnRSZWY7XG4gIEBJbnB1dCgpIHNlYXJjaElucHV0OiBJbnB1dFNlYXJjaE9iaiA9IG5ldyBJbnB1dFNlYXJjaE9iaigpO1xuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIEBJbnB1dCgpIGlzUmVwb3J0OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dScHRFeGVjVHlwZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcmVzdWx0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGdlblJwdDogRXZlbnRFbWl0dGVyPHsgRXhwb3J0VHlwZTogbnVtYmVyLCBScHRFeGVjVHlwZTogbnVtYmVyLCBFbFJlZjogRWxlbWVudFJlZiwgZm9ybVJhdzogYW55IH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IEV4cG9ydFR5cGU6IG51bWJlciwgUnB0RXhlY1R5cGU6IG51bWJlciwgRWxSZWY6IEVsZW1lbnRSZWYsIGZvcm1SYXc6IGFueSB9PigpO1xuICBAT3V0cHV0KCkgcmVxR2V0QWxsRGF0YTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEV4cG9ydFR5cGVMaXN0OiBBcnJheTxLZXlWYWx1ZVJlcG9ydE9iaj4gPSBbXG4gICAge1xuICAgICAga2V5OiBFeHBvcnRUeXBlQ29uc3RhbnQuRVhQX1RZUEVfUERGLFxuICAgICAgdmFsdWU6IFwiUERGXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogRXhwb3J0VHlwZUNvbnN0YW50LkVYUF9UWVBFX1hMU1gsXG4gICAgICB2YWx1ZTogXCJFeGNlbCAyMDA3XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogRXhwb3J0VHlwZUNvbnN0YW50LkVYUF9UWVBFX0RPQ1gsXG4gICAgICB2YWx1ZTogXCJEb2N1bWVudCBYTUxcIlxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiBFeHBvcnRUeXBlQ29uc3RhbnQuRVhQX1RZUEVfSlBERixcbiAgICAgIHZhbHVlOiBcIkp1c3RpZnkgUERGXCJcbiAgICB9XG4gIF07XG5cbiAgUmVwb3J0RXhlY1R5cGVMaXN0OiBBcnJheTxLZXlWYWx1ZVJlcG9ydE9iaj4gPSBbXG4gICAge1xuICAgICAga2V5OiBSZXBvcnRFeGVjVHlwZUNvbnN0YW50LkVYRV9UWVBFX1NZTkMsXG4gICAgICB2YWx1ZTogXCJTeW5jXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogUmVwb3J0RXhlY1R5cGVDb25zdGFudC5FWEVfVFlQRV9BU1lOQyxcbiAgICAgIHZhbHVlOiBcIkFzeW5jXCJcbiAgICB9XG4gIF07XG5cbiAgZXhwb3J0QXNGaWxlTGlzdCA9IFtcbiAgICB7XG4gICAgICBrZXk6IFwiY3N2XCIsXG4gICAgICB2YWx1ZTogXCJhcyBDU1ZcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogXCJleGNlbFwiLFxuICAgICAgdmFsdWU6IFwiYXMgRVhDRUxcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogXCJqc29uXCIsXG4gICAgICB2YWx1ZTogXCJhcyBKU09OXCIsXG4gICAgfVxuICBdO1xuXG4gIExpc3RPZk1vbnRoOiBMaXN0S2V5VmFsdWVNb250aCA9IG5ldyBMaXN0S2V5VmFsdWVNb250aCgpO1xuICBMaXN0T2ZZZWFyOiBBcnJheTxLZXlWYWx1ZVVDU2VhcmNoT2JqPiA9IG5ldyBBcnJheTxLZXlWYWx1ZVVDU2VhcmNoT2JqPigpO1xuICBDbGFpbUxpc3Q6IEFycmF5PGFueT4gPSBbXG4gICAge1xuICAgICAgS2V5OiBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uSXNOb3ROdWxsLFxuICAgICAgVmFsdWU6IFwiQ0xBSU1FRFwiXG4gICAgfSxcbiAgICB7XG4gICAgICBLZXk6IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25Jc051bGwsXG4gICAgICBWYWx1ZTogXCJVTkNMQUlNRURcIlxuICAgIH0sXG4gIF07XG5cbiAgRXhwb3J0VHlwZTogbnVtYmVyID0gMDtcbiAgUnB0RXhlY1R5cGU6IG51bWJlciA9IDA7XG5cbiAgcGFnZU5vdzogYW55ID0gMTtcbiAgY29uZmlndXJhdGlvbjogYW55O1xuICBleHBvcnREYXRhOiBhbnk7XG4gIEV4Y2VsRGF0YTogYW55O1xuICBpc0RhdGFMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNIaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQmlzRHQ6IHN0cmluZztcbiAgQnVzaW5lc3NEdDogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIGlzU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XG4gIHZhbHVlRGljdCA9IHt9OyAvLyBob2xkIHRlbXBvcmFyeSB2YWx1ZSBmcm9tIHNlbGVjdGVkIGRyb3Bkb3duLCB1c2VkIGFzIGEgcGF5bG9hZCBmb3IgYW5vdGhlciBzZWFyY2ggY29tcG9uZW50XG4gIGxvb2t1cERpY3QgPSB7fTsgIC8vIGhvbGQgdGVtcG9yYXJ5IHZhbHVlIGZyb20gc2VsZWN0ZWQgbG9va3VwLCB1c2VkIGFzIGEgcGF5bG9hZCBmb3IgYW5vdGhlciBzZWFyY2ggY29tcG9uZW50XG5cbiAgY3VycmVudFN0YXRlID0gJ2luaXRpYWwnO1xuXG4gIGZvcm06IEZvcm1Hcm91cDtcbiAgY291bnRGb3JtID0gMDtcbiAgZm9ybWF0dGVkQW1vdW50ID0gJyc7XG4gIGFtb3VudCA9IDA7XG4gIGFwaVVybDogc3RyaW5nO1xuICBhcnJDcml0OiBhbnk7XG4gIHNlYXJjaEZvcm06IE5nRm9ybTtcbiAgcXVlcnlQYXJhbTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwZXJzaXN0Q3JpdDogQ3JpdGVyaWFPYmpbXSA9IFtdO1xuICBwZXJzaXN0QWRkVG9UZW1wQ3JpdDogQ3JpdGVyaWFPYmpbXTtcbiAgbG9va3VwS2V5VmFsRGljdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBub3RpZnlVcGRhdGVLZXlWYWxEaWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIG1vbnRocyA9IG1vbnRoc0tleVZhbHVlO1xuICB5ZWFycyA9IFtdO1xuICB5ZWFyTm93ID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICBwcml2YXRlIGJhc2VZZWFyID0gMTkwMDtcbiAgcHJpdmF0ZSBtaW5NYXhZZWFyID0gMjAwO1xuICB1c2VOZXdEYXRlcGlja2VyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2VhcmNoQnRuUmVhZHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBfcmVuZGVyZXIyOiBSZW5kZXJlcjIsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQsXG4gICAgcHVibGljIHRvYXN0cjogVG9hc3RyU2VydmljZSxcbiAgICBwcml2YXRlIGNvb2tpZVNlcnZpY2U6IENvb2tpZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgcHJpdmF0ZSBlbGVtUmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgZXhwb3J0RmlsZVNlcnZpY2U6IEV4cG9ydEZpbGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgbmd4Um91dGVyOiBOZ3hSb3V0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgZGF0ZXRpbWVTZXJ2aWNlOiBVY3NlYXJjaERhdGV0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIHVjU2VhcmNoRm9ybVNlcnZpY2U6IFVjc2VhcmNoRm9ybVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIHRoaXMucXVlcnlQYXJhbSA9IHRoaXMubmd4Um91dGVyLmdldFF1ZXJ5UGFyYW1zKHBhcmFtcykgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9KTtcbiAgICBpZiAodGhpcy55ZWFycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLmJhc2VZZWFyOyBpIDwgdGhpcy5iYXNlWWVhciArIHRoaXMubWluTWF4WWVhcjsgaSsrKSB7XG4gICAgICAgIHRoaXMueWVhcnMucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGFuZ2VTdGF0ZSgpIHtcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMuY3VycmVudFN0YXRlID09ICdpbml0aWFsJyA/ICdmaW5hbCcgOiAnaW5pdGlhbCc7XG4gICAgdGhpcy5pc0hpZGRlbiA9ICF0aGlzLmlzSGlkZGVuID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLnNlYXJjaElucHV0Py5lbnZpcm9ubWVudD8uZXhwZXJpbWVudGFsPy51c2VOZXdEYXRlcGlja2VyKSB7XG4gICAgICB0aGlzLnVzZU5ld0RhdGVwaWNrZXIgPSB0aGlzLnNlYXJjaElucHV0LmVudmlyb25tZW50LmV4cGVyaW1lbnRhbC51c2VOZXdEYXRlcGlja2VyXG4gICAgfVxuXG4gICAgdGhpcy5hcGlVcmwgPSB0aGlzLnNlYXJjaElucHV0LmVudmlyb21lbnRVcmwgKyB0aGlzLnNlYXJjaElucHV0LmFwaVFyeVBhZ2luZztcbiAgICB0aGlzLmFyckNyaXQgPSB0aGlzLnNlYXJjaElucHV0LmFyckNyaXRPYmo7XG4gICAgbGV0IGpzID0gdGhpcy5fcmVuZGVyZXIyLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIGpzLnRleHQgPSBgXG4gICAgICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICQoXCIjZmxpcFwiKS5jbGljayhmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAkKFwiI3BhbmVsXCIpLnNsaWRlVG9nZ2xlKFwic2xvd1wiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICBgO1xuICAgIHRoaXMuX3JlbmRlcmVyMi5hcHBlbmRDaGlsZCh0aGlzLl9kb2N1bWVudC5ib2R5LCBqcyk7XG5cbiAgICBsZXQgdmFsdWUgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCdCdXNpbmVzc0RhdGVSYXcnKTtcbiAgICB0aGlzLkJpc0R0ID0gdGhpcy5EZWNyeXB0U3RyaW5nKHZhbHVlLCBcIkFkSW5zRk9VMTIzNDU2NzhcIik7XG4gICAgdGhpcy5CdXNpbmVzc0R0ID0gbmV3IERhdGUodGhpcy5CaXNEdCk7XG5cbiAgICBpZiAodGhpcy5pc1ZhbGlkRGF0ZSh0aGlzLkJ1c2luZXNzRHQpKSB7XG4gICAgICB0aGlzLnllYXJOb3cgPSB0aGlzLkJ1c2luZXNzRHQuZ2V0RnVsbFllYXIoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5pbml0aWF0ZUZvcm0odHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0aWF0ZUZvcm0oaXNJbml0OiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuZGF0YUlucHV0ICE9PSB1bmRlZmluZWQgJiYgT2JqZWN0LmtleXModGhpcy5zZWFyY2hJbnB1dC5kYXRhSW5wdXQpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5zZXRDb25maWd1cmF0aW9uRGF0YShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc2VhcmNoSW5wdXQuZGF0YUlucHV0KSksIGlzSW5pdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuaHR0cC5nZXQodGhpcy5zZWFyY2hJbnB1dC5fdXJsKS50b1Byb21pc2UoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgdGhpcy5zZXRDb25maWd1cmF0aW9uRGF0YShkYXRhLCBpc0luaXQpO1xuICAgIH0pXG4gIH1cblxuICBzZXRDb25maWd1cmF0aW9uRGF0YShkYXRhOiBhbnksIGlzSW5pdDogYm9vbGVhbikge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGRhdGE7XG4gICAgdGhpcy5leHBvcnREYXRhID0gZGF0YS5leHBvcnRFeGNlbDtcbiAgICBpZiAoZGF0YS5leHBvcnRUeXBlTGlzdCAhPSB1bmRlZmluZWQgJiYgZGF0YS5leHBvcnRUeXBlTGlzdC5sZW5ndGggIT0gMCkge1xuICAgICAgdGhpcy5FeHBvcnRUeXBlTGlzdCA9IGRhdGEuZXhwb3J0VHlwZUxpc3Q7XG4gICAgICB0aGlzLkV4cG9ydFR5cGUgPSB0aGlzLkV4cG9ydFR5cGVMaXN0WzBdLmtleTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5FeHBvcnRUeXBlID0gdGhpcy5FeHBvcnRUeXBlTGlzdFswXS5rZXk7XG4gICAgfVxuXG4gICAgaWYgKGlzSW5pdCkge1xuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woJ0V4cG9ydFR5cGUnLCB0aGlzLmZiLmNvbnRyb2woJycpKTtcbiAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKCdScHRFeGVjVHlwZScsIHRoaXMuZmIuY29udHJvbCgnJykpO1xuICAgIH1cbiAgICB0aGlzLmZvcm0uY29udHJvbHNbJ0V4cG9ydFR5cGUnXS5zZXRWYWx1ZSh0aGlzLkV4cG9ydFR5cGUpO1xuICAgIHRoaXMuZm9ybS5jb250cm9sc1snUnB0RXhlY1R5cGUnXS5zZXRWYWx1ZSh0aGlzLlJwdEV4ZWNUeXBlKTtcblxuICAgIGlmIChkYXRhLmV4cG9ydEFzRmlsZUxpc3QgIT0gdW5kZWZpbmVkICYmIGRhdGEuZXhwb3J0QXNGaWxlTGlzdC5sZW5ndGggIT0gMCkge1xuICAgICAgdGhpcy5leHBvcnRBc0ZpbGVMaXN0ID0gZGF0YS5leHBvcnRBc0ZpbGVMaXN0O1xuICAgIH1cblxuICAgIHRoaXMuY291bnRGb3JtID0gZGF0YS5jb21wb25lbnQubGVuZ3RoO1xuICAgIHRoaXMuaXNEYXRhTG9hZGVkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnRpdGxlICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlYXJjaElucHV0LnRpdGxlICE9IFwiXCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi50aXRsZSA9IHRoaXMuc2VhcmNoSW5wdXQudGl0bGU7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlckFjY2VzcyA9IHRoaXMuZ2V0VXNlckFjY2VzcygpO1xuICAgIGNvbnN0IGlucHV0RWZmZWN0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50Rm9ybTsgaSsrKSB7XG4gICAgICAvL2luaSBrYWxhdSBkYXRhbnlhIGRpIGxvYWQgZGFyaSBVUkxcbiAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5pc0Zyb21VUkwpIHtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XG4gICAgICAgIGxldCBhcnJheUNyaXQgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGNyaXRlcmlhT2JqZWN0ID0gbmV3IENyaXRlcmlhT2JqKCk7XG4gICAgICAgIGNyaXRlcmlhT2JqZWN0LkRhdGFUeXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGNyaXRlcmlhT2JqZWN0LnByb3BOYW1lID0gZGF0YS5jb21wb25lbnRbaV0uY3JpdGVyaWFQcm9wTmFtZTtcbiAgICAgICAgY3JpdGVyaWFPYmplY3QudmFsdWUgPSB0aGlzLnF1ZXJ5UGFyYW1bZGF0YS5jb21wb25lbnRbaV0uY3JpdGVyaWFQcm9wVmFsdWVdIHx8IGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcFZhbHVlO1xuICAgICAgICBjcml0ZXJpYU9iamVjdC5yZXN0cmljdGlvbiA9IFwiZXFcIjtcbiAgICAgICAgYXJyYXlDcml0LnB1c2goY3JpdGVyaWFPYmplY3QpO1xuICAgICAgICByZXF1ZXN0LmNyaXRlcmlhID0gYXJyYXlDcml0O1xuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uY3JpdGVyaWFQcm9wTmFtZSAhPT0gbnVsbCAmJiBkYXRhLmNvbXBvbmVudFtpXS5jcml0ZXJpYVByb3BOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBfY3JpdFByb3BOYW1lQXJyID0gKGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcE5hbWUgYXMgc3RyaW5nKS5zcGxpdChcIjtcIik7XG4gICAgICAgICAgY29uc3QgX2NyaXRQcm9wVmFsdWVBcnIgPSAoZGF0YS5jb21wb25lbnRbaV0uY3JpdGVyaWFQcm9wVmFsdWUgYXMgc3RyaW5nKS5zcGxpdChcIjtcIik7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF9jcml0UHJvcE5hbWVBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlcXVlc3RbX2NyaXRQcm9wTmFtZUFycltpXV0gPSB0aGlzLnF1ZXJ5UGFyYW1bX2NyaXRQcm9wVmFsdWVBcnJbaV1dIHx8IHVzZXJBY2Nlc3NbX2NyaXRQcm9wVmFsdWVBcnJbaV1dIHx8IF9jcml0UHJvcFZhbHVlQXJyW2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBlbmdlY2VrYW4gcGVuZ2d1bmFhbiB1cmwgYXRhdSBwYXRoXG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5wYXRoICE9IHVuZGVmaW5lZCAmJiBkYXRhLmNvbXBvbmVudFtpXS5wYXRoICE9IFwiXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5lbnZpcm9ubWVudCA9PSB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHNbeV0uZW52aXJvbm1lbnQpIHtcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCA9IHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50c1t5XS51cmwgKyBkYXRhLmNvbXBvbmVudFtpXS5wYXRoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoID0gZGF0YS5jb21wb25lbnRbaV0udXJsO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoID0gZGF0YS5jb21wb25lbnRbaV0udXJsO1xuICAgICAgICB9XG4gICAgICAgIC8vbGVtcGFyIG9iamVjdG55YSBzZWthbGlhbiBzYW1hIHVybG55YSwgbm50aSBkaSBiaW5kIGRpIGRhbGVtIGthcmVuYSBtYXNhbGFoIGRpIGFzeW5jbnlhXG4gICAgICAgIC8vYmlhciB0aWFwIGZ1bmN0aW9uIGFkYSBzdGF0ZTJueWEgc2VuZGlyaVxuICAgICAgICB0aGlzLnJlc29sdmVPYmplY3QoZGF0YS5jb21wb25lbnRbaV0sIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoLCByZXF1ZXN0KTtcbiAgICAgIH0gZWxzZSBpZiAoIWRhdGEuY29tcG9uZW50W2ldLmlzRnJvbVVybCAmJiBkYXRhLmNvbXBvbmVudFtpXS50eXBlID09PSBcImRyb3Bkb3duXCIpIHtcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldPy5pdGVtcz8ubGVuZ3RoID09PSAxICYmICFkYXRhLmNvbXBvbmVudFtpXT8ua2VlcERkbCkge1xuICAgICAgICAgIHRoaXMubG9va3VwS2V5VmFsRGljdFtkYXRhLmNvbXBvbmVudFtpXS5uYW1lXSA9IGRhdGEuY29tcG9uZW50W2ldLml0ZW1zWzBdLmtleTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXT8uaXRlbXM/Lmxlbmd0aCA+IDEgJiYgZGF0YS5jb21wb25lbnRbaV0/LnVzZUZpcnN0VmFsdWUpIHtcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IGRhdGEuY29tcG9uZW50W2ldLml0ZW1zWzBdLmtleTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PSBcIm51bWVyaWNcIikge1xuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udmFsdWUgJiYgIWlzTmFOKGRhdGEuY29tcG9uZW50W2ldLnZhbHVlKSkge1xuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gcGFyc2VGbG9hdChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSkudG9Mb2NhbGVTdHJpbmcoJ2VuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy9wZW5nZWNla2FuIGRkbFxuICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkcm9wZG93blwiKSB7XG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kdG1UeXBlICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kdG1UeXBlLmluY2x1ZGVzKFwibW9udGhcIikpIHtcbiAgICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSAhPSB1bmRlZmluZWQgJiYgZGF0YS5jb21wb25lbnRbaV0udmFsdWUuaW5jbHVkZXMoXCJCRFwiKSkge1xuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IHRoaXMuc2V0RGVmYXVsdFZhbHVlTW9udGgoZGF0YS5jb21wb25lbnRbaV0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uaXRlbXMgPSB0aGlzLnNldE1vbnRoRERMKGRhdGEuY29tcG9uZW50W2ldLmR0bVR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZHRtVHlwZS5pbmNsdWRlcyhcInllYXJcIikpIHtcbiAgICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSAhPSB1bmRlZmluZWQgJiYgZGF0YS5jb21wb25lbnRbaV0udmFsdWUuaW5jbHVkZXMoXCJCRFwiKSkge1xuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IHRoaXMuc2V0RGVmYXVsdFZhbHVlWWVhcihkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5pdGVtcyA9IHRoaXMuc2V0WWVhckRETChkYXRhLmNvbXBvbmVudFtpXS5kdG1UeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09IFwiZHJvcGRvd25TZWFyY2hcIiAmJiAhZGF0YS5jb21wb25lbnRbaV0uaXNGcm9tVVJMICYmIGRhdGEuY29tcG9uZW50W2ldLml0ZW1zPy5sZW5ndGggIT0gMSkge1xuICAgICAgLy8gICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZGRzVHlwZSA9PSB1bmRlZmluZWQgfHwgZGF0YS5jb21wb25lbnRbaV0uZGRzVHlwZSA9PSBcImFsbFwiKSB7XG4gICAgICAvLyAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBcImFsbFwiO1xuICAgICAgLy8gICAgIGRhdGEuY29tcG9uZW50W2ldLmRlc2NyID0gXCJBbGxcIjtcbiAgICAgIC8vICAgfSBlbHNlIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kZHNUeXBlID09IFwib25lXCIpIHtcbiAgICAgIC8vICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IFwib25lXCI7XG4gICAgICAvLyAgICAgZGF0YS5jb21wb25lbnRbaV0uZGVzY3IgPSBcIlNlbGVjdCBPbmVcIjtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkcm9wZG93blNlYXJjaFwiICYmICFkYXRhLmNvbXBvbmVudFtpXS5pc0Zyb21VUkwgJiYgZGF0YS5jb21wb25lbnRbaV0uaXRlbXMubGVuZ3RoID09IDEpIHtcbiAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBkYXRhLmNvbXBvbmVudFtpXS5pdGVtc1swXS5LZXk7XG4gICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmRlc2NyID0gZGF0YS5jb21wb25lbnRbaV0uaXRlbXNbMF0uVmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSAhPSBcImRyb3Bkb3duU2VhcmNoXCIgJiYgIWRhdGEuY29tcG9uZW50W2ldLnZhbHVlKSB7XG4gICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gXCJcIjtcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmRkbFR5cGUgPT0gJ2FsbCcpIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gXCJhbGxcIjtcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmRkbFR5cGUgPT0gJ29uZScpIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gXCJvbmVcIjtcbiAgICAgIH1cbiAgICAgIC8vcGVuZ2VjZWthbiB0YW5nZ2FsXG4gICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PSBcImRhdGVwaWNrZXJcIikge1xuICAgICAgICB0aGlzLnJlYWRvbmx5ID0gZGF0YS5jb21wb25lbnRbaV0ucmVhZG9ubHlcblxuICAgICAgICAvLyBIYW5kbGUgZHluYW1pYyBkYXRlIHZhbHVlczogQkQsIGZpcnN0RGF5T2ZNb250aCwgbGFzdERheU9mTW9udGggd2l0aCArLy0gb3BlcmF0b3JzXG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9PT0gXCJmaXJzdERheU9mTW9udGhcIiB8fCBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9PT0gXCJsYXN0RGF5T2ZNb250aFwiIHx8IGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLmluY2x1ZGVzKFwiQkRcIikgfHwgZGF0YS5jb21wb25lbnRbaV0udmFsdWUuaW5jbHVkZXMoXCJmaXJzdERheU9mTW9udGhcIikgfHwgZGF0YS5jb21wb25lbnRbaV0udmFsdWUuaW5jbHVkZXMoXCJsYXN0RGF5T2ZNb250aFwiKSkge1xuICAgICAgICAgIGxldCBiYXNlRGF0ZSA9IHRoaXMuZ2V0QnVzaW5lc3NEYXRlKHRoaXMuQmlzRHQpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFNldCBiYXNlIGRhdGUgYmFzZWQgb24gdHlwZVxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcImZpcnN0RGF5T2ZNb250aFwiKSkge1xuICAgICAgICAgICAgYmFzZURhdGUgPSB0aGlzLmdldEZpcnN0RGF5T2ZNb250aChiYXNlRGF0ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcImxhc3REYXlPZk1vbnRoXCIpKSB7XG4gICAgICAgICAgICBiYXNlRGF0ZSA9IHRoaXMuZ2V0TGFzdERheU9mTW9udGgoYmFzZURhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGaW5kIG9wZXJhdG9yIHBvc2l0aW9uIGJhc2VkIG9uIGRhdGUgdHlwZVxuICAgICAgICAgIGxldCBvcGVyYXRvciA9IGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLmNoYXJBdChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcIkJEXCIpID8gMiA6IGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLmluY2x1ZGVzKFwiZmlyc3REYXlPZk1vbnRoXCIpID8gMTUgOiAxNCk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQXBwbHkgZGF0ZSBhcml0aG1ldGljXG4gICAgICAgICAgaWYgKG9wZXJhdG9yID09IFwiLVwiKSB7XG4gICAgICAgICAgICBsZXQgbnVtRGF5ID0gcGFyc2VJbnQoZGF0YS5jb21wb25lbnRbaV0udmFsdWUuc3BsaXQoXCItXCIsIDIpWzFdKTtcbiAgICAgICAgICAgIGJhc2VEYXRlLnNldERhdGUoYmFzZURhdGUuZ2V0RGF0ZSgpIC0gbnVtRGF5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09IFwiK1wiKSB7XG4gICAgICAgICAgICBsZXQgbnVtRGF5ID0gcGFyc2VJbnQoZGF0YS5jb21wb25lbnRbaV0udmFsdWUuc3BsaXQoXCIrXCIsIDIpWzFdKTtcbiAgICAgICAgICAgIGJhc2VEYXRlLnNldERhdGUoYmFzZURhdGUuZ2V0RGF0ZSgpICsgbnVtRGF5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBmb3JtYXREYXRlKGJhc2VEYXRlLCAneXl5eS1NTS1kZCcsICdlbi1VUycpO1xuICAgICAgICAgIGlucHV0RWZmZWN0LnB1c2goe2tleTogXCJkYXRlcGlja2VyXCIsIHZhbHVlOiBkYXRhLmNvbXBvbmVudFtpXX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgLy8gc2V0IG1pbiBkYXRlIGFuZCBtYXggZGF0ZVxuICAgICAgICAgIGNvbnN0IF9yZXN0cmljdGlvbiA9IGRhdGEuY29tcG9uZW50W2ldLnJlc3RyaWN0aW9uPy50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIGxldCBfbWluRGF0ZSA9IGRhdGEuY29tcG9uZW50W2ldLm1pbkRhdGU/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKF9taW5EYXRlICE9IHVuZGVmaW5lZCAmJiBfbWluRGF0ZSAhPSBudWxsICYmIF9taW5EYXRlICE9IFwiXCIpIHtcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmNvbmZNaW5EYXRlID0gZGF0YS5jb21wb25lbnRbaV0ubWluRGF0ZTtcbiAgICAgICAgICAgIGlmIChfbWluRGF0ZSA9PSBcImJkXCIgfHwgX21pbkRhdGUgPT0gXCJidXNpbmVzc2RhdGVcIiB8fCBfbWluRGF0ZSA9PSBcImJ1c2luZXNzZHRcIikge1xuICAgICAgICAgICAgICBfbWluRGF0ZSA9IHRoaXMuQnVzaW5lc3NEdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWREYXRlKF9taW5EYXRlKSkge1xuICAgICAgICAgICAgICBjb25zdCBfZmxhZyA9IHRoaXMuZGF0ZXRpbWVTZXJ2aWNlLkNoZWNrRGF0ZVR5cGUoZGF0YS5jb21wb25lbnRbaV0/LmFkZGl0aW9uTWluRGF0ZUNvbmYgPz8gXCJiZFwiKTtcbiAgICAgICAgICAgICAgbGV0IG1pbkRhdGUgPSB0aGlzLmRhdGV0aW1lU2VydmljZS5HZXROZXdEYXRlKF9mbGFnLCBkYXRhLmNvbXBvbmVudFtpXT8uYWRkaXRpb25NaW5EYXRlQ29uZiwgX21pbkRhdGUpO1xuICAgICAgICAgICAgICBpZiAoX3Jlc3RyaWN0aW9uID09IFwiR1RcIiB8fCBfcmVzdHJpY3Rpb24gPT0gXCJMVFwiKSB7XG4gICAgICAgICAgICAgICAgbWluRGF0ZS5zZXREYXRlKG1pbkRhdGUuZ2V0RGF0ZSgpICsgMSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWluRGF0ZS5zZXREYXRlKG1pbkRhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5taW5EYXRlID0gbWluRGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IF9tYXhEYXRlID0gZGF0YS5jb21wb25lbnRbaV0ubWF4RGF0ZT8udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBpZiAoX21heERhdGUgIT0gdW5kZWZpbmVkICYmIF9tYXhEYXRlICE9IG51bGwgJiYgX21heERhdGUgIT0gXCJcIikge1xuICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uY29uZk1heERhdGUgPSBkYXRhLmNvbXBvbmVudFtpXS5tYXhEYXRlO1xuICAgICAgICAgICAgaWYgKF9tYXhEYXRlID09IFwiYmRcIiB8fCBfbWF4RGF0ZSA9PSBcImJ1c2luZXNzZGF0ZVwiIHx8IF9tYXhEYXRlID09IFwiYnVzaW5lc3NkdFwiKSB7XG4gICAgICAgICAgICAgIF9tYXhEYXRlID0gdGhpcy5CdXNpbmVzc0R0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZERhdGUoX21heERhdGUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IF9mbGFnID0gdGhpcy5kYXRldGltZVNlcnZpY2UuQ2hlY2tEYXRlVHlwZShkYXRhLmNvbXBvbmVudFtpXT8uYWRkaXRpb25NYXhEYXRlQ29uZiA/PyBcImJkXCIpO1xuICAgICAgICAgICAgICBsZXQgbWF4RGF0ZSA9IHRoaXMuZGF0ZXRpbWVTZXJ2aWNlLkdldE5ld0RhdGUoX2ZsYWcsIGRhdGEuY29tcG9uZW50W2ldPy5hZGRpdGlvbk1heERhdGVDb25mLCBfbWF4RGF0ZSk7XG4gICAgICAgICAgICAgIGlmIChfcmVzdHJpY3Rpb24gPT0gXCJMVFwiIHx8IF9yZXN0cmljdGlvbiA9PSBcIkdUXCIpIHtcbiAgICAgICAgICAgICAgICBtYXhEYXRlLnNldERhdGUobWF4RGF0ZS5nZXREYXRlKCkgLSAxKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXhEYXRlLnNldERhdGUobWF4RGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLm1heERhdGUgPSBtYXhEYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PSBcInRleHRib3hcIikge1xuICAgICAgICBjb25zdCBpc1VwcGVyY2FzZSA9IGRhdGEuY29tcG9uZW50W2ldLmlzVXBwZXJjYXNlID09PSB1bmRlZmluZWQgPyB0cnVlIDogZGF0YS5jb21wb25lbnRbaV0uaXNVcHBlcmNhc2U7XG4gICAgICAgIGNvbnN0IF92YWx1ZSA9IHRoaXMuYXV0b2ZpbGwoZGF0YS5jb21wb25lbnRbaV0pO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnZhbHVlID0gaXNVcHBlcmNhc2UgPyBfdmFsdWUudG9VcHBlckNhc2UoKSA6IF92YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkcm9wZG93blwiKSB7XG4gICAgICAgIGNvbnN0IF92YWx1ZSA9IHRoaXMuYXV0b2ZpbGwoZGF0YS5jb21wb25lbnRbaV0sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS52YWx1ZSA9IF92YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT09IFwibG9va3VwXCIpIHtcbiAgICAgICAgaWYgKCFpc0luaXQpIHtcbiAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbZGF0YS5jb21wb25lbnRbaV0ubmFtZV0uZ2V0KFwidmFsdWVcIikuc2V0VmFsdWUoXCJcIik7XG4gICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5kaWN0TG9va3VwT2JqW2RhdGEuY29tcG9uZW50W2ldLm5hbWVdLm5hbWVTZWxlY3QgPSBcIlwiO1xuICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQuZGljdExvb2t1cE9ialtkYXRhLmNvbXBvbmVudFtpXS5uYW1lXS5pZFNlbGVjdCA9IFwiXCI7XG4gICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW1wibG9va3VwX2lkX1wiICsgZGF0YS5jb21wb25lbnRbaV0ubmFtZV0uc2V0VmFsdWUoXCJcIik7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKFwibG9va3VwX2lkX1wiICsgZGF0YS5jb21wb25lbnRbaV0ubmFtZSwgdGhpcy5mYi5jb250cm9sKCcnKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgY29udHJvbE5hbWUgPSBkYXRhLmNvbXBvbmVudFtpXS5uYW1lO1xuICAgICAgbGV0IF92YWx1ZSA9IGRhdGEuY29tcG9uZW50W2ldPy52YWx1ZSA/PyBcIlwiO1xuICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT09ICdkYXRlcGlja2VyJyB8fCBkYXRhLmNvbXBvbmVudFtpXS50eXBlID09PSAnbnVtZXJpYycgfHwgZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PT0gJ2N1cnJlbmN5JykgY29udHJvbE5hbWUgKz0gaTtcbiAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09PSAnZHJvcGRvd24nICYmIF92YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZGRsVHlwZSA9PT0gJ29uZScpIF92YWx1ZSA9ICdvbmUnO1xuICAgICAgICBlbHNlIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kZGxUeXBlID09PSAnYWxsJyB8fCBkYXRhLmNvbXBvbmVudFtpXS5kZGxUeXBlID09PSB1bmRlZmluZWQpIF92YWx1ZSA9ICdhbGwnO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT09ICd5ZWFyJykge1xuICAgICAgICBfdmFsdWUgPSB0aGlzLnllYXJOb3c7XG4gICAgICB9XG4gICAgICBpZiAoaXNJbml0KSB7XG4gICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGNvbnRyb2xOYW1lLCB0aGlzLmZiLmNvbnRyb2woJycpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tjb250cm9sTmFtZV0uc2V0VmFsdWUoX3ZhbHVlKTtcbiAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5pc1JlcXVpcmVkKSB7XG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW2NvbnRyb2xOYW1lXTtcbiAgICAgICAgY29uc3QgbGlzdFZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbVmFsaWRhdG9ycy5yZXF1aXJlZF07XG4gICAgICAgIGZvcm1Db250cm9sLnNldFZhbGlkYXRvcnMobGlzdFZhbGlkYXRvcnMpO1xuICAgICAgICBmb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09PSBcIm51bWVyaWNcIiB8fCBkYXRhLmNvbXBvbmVudFtpXS50eXBlID09PSBcImN1cnJlbmN5XCIpIHtcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLm1pbiAhPT0gbnVsbCAmJiBkYXRhLmNvbXBvbmVudFtpXS5taW4gIT09IHVuZGVmaW5lZCAmJiBkYXRhLmNvbXBvbmVudFtpXS5taW4gIT09IFwiXCIpIHtcbiAgICAgICAgICB0aGlzLnNldFZhbGlkYXRvck51bWJlcihcIk1JTlwiLCBkYXRhLmNvbXBvbmVudFtpXS5taW4sIHRoaXMuZm9ybS5jb250cm9sc1tjb250cm9sTmFtZV0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0ubWF4ICE9PSBudWxsICYmIGRhdGEuY29tcG9uZW50W2ldLm1heCAhPT0gdW5kZWZpbmVkICYmIGRhdGEuY29tcG9uZW50W2ldLm1heCAhPT0gXCJcIikge1xuICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdG9yTnVtYmVyKFwiTUFYXCIsIGRhdGEuY29tcG9uZW50W2ldLm1heCwgdGhpcy5mb3JtLmNvbnRyb2xzW2NvbnRyb2xOYW1lXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gZW5hYmxlIHNlYXJjaCBidXR0b24gdG8gY2xpY2sgYW5kIGludGVyYWN0XG4gICAgICB0aGlzLnNlYXJjaEJ0blJlYWR5ID0gdHJ1ZTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvdW50Rm9ybTsgaisrKSB7XG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtqXS5pc0V2ZW50ICYmIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbal0uaXRlbXNVcmwubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlRXZlbnQoZGF0YS5jb21wb25lbnRbal0uaXRlbXNVcmxbMF0uS2V5LCBkYXRhLmNvbXBvbmVudFtqXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2pdLnR5cGUgPT0gXCJvZmZpY2VSb2xlQ29kZXNcIiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2pdLml0ZW1zVXJsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLlNldFJvbGVPZmZpY2VDb2RlcyhqKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIGlucHV0RWZmZWN0LmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoaXRlbS5rZXkgPT09IFwiZGF0ZXBpY2tlclwiKSB7XG4gICAgICAgICAgdGhpcy5jaGVja0lucHV0RGF0ZShpdGVtLnZhbHVlLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgICBcbiAgICB0aGlzLnNldEluaXRpYWxMb29rdXBLZXlWYWxEaWN0KCk7XG4gICAgdGhpcy51Y1NlYXJjaEZvcm1TZXJ2aWNlLnNldEZvcm0odGhpcy5mb3JtKTtcbiAgfVxuXG4gIGdldEJ1c2luZXNzRGF0ZShiaXNEdDogYW55KTogRGF0ZSB7XG4gICAgcmV0dXJuIGJpc0R0ICE9IG51bGwgPyBuZXcgRGF0ZShiaXNEdCkgOiBuZXcgRGF0ZSgpO1xuICB9XG5cbiAgZ2V0Rmlyc3REYXlPZk1vbnRoKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIDEpO1xuICB9XG5cbiAgZ2V0TGFzdERheU9mTW9udGgoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSArIDEsIDApO1xuICB9XG5cbiAgc2V0SW5pdGlhbExvb2t1cEtleVZhbERpY3QoKSB7XG4gICAgY29uc3QgYXJyRGF0YTogYW55W10gPSB0aGlzLmNvbmZpZ3VyYXRpb24/LmNvbXBvbmVudCA/PyBbXTtcbiAgICBmb3IgKGxldCBpdGVtIG9mIGFyckRhdGEpIHtcbiAgICAgIGlmICghdGhpcy5sb29rdXBLZXlWYWxEaWN0W2l0ZW0ubmFtZV0pIHtcbiAgICAgICAgdGhpcy5sb29rdXBLZXlWYWxEaWN0W2l0ZW0ubmFtZV0gPSBpdGVtLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXNlckFjY2VzcygpIHtcbiAgICBjb25zdCBfdXNlckFjY2Vzczogc3RyaW5nID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChcIlVzZXJBY2Nlc3NcIik7XG4gICAgY29uc3QgdXNlckFjY2VzcyA9IEpTT04ucGFyc2UodGhpcy5EZWNyeXB0U3RyaW5nKF91c2VyQWNjZXNzLCBcIkFkSW5zRk9VMTIzNDU2NzhcIikpO1xuICAgIHJldHVybiB1c2VyQWNjZXNzO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvZmlsbChkYXRhOiBhbnksIGNoZWNrVmFsdWU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgaWYgKGNoZWNrVmFsdWUpIHtcbiAgICAgIGlmIChkYXRhLnZhbHVlICE9IFwiXCIpIHJldHVybiBkYXRhLnZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBhdXRvZmlsbDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IGRhdGEuYXV0b2ZpbGw7XG4gICAgaWYgKGF1dG9maWxsID09IHVuZGVmaW5lZCkgcmV0dXJuIGRhdGEudmFsdWU7XG4gICAgaWYgKGF1dG9maWxsLnNvdXJjZSA9PSBcInBhcmFtXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UGFyYW1bYXV0b2ZpbGwua2V5XTtcbiAgICB9XG4gICAgaWYgKGF1dG9maWxsLnNvdXJjZSA9PSBcInVzZXJhY2Nlc3NcIikge1xuICAgICAgY29uc3QgdXNlckFjY2VzcyA9IHRoaXMuZ2V0VXNlckFjY2VzcygpO1xuICAgICAgcmV0dXJuIHVzZXJBY2Nlc3NbYXV0b2ZpbGwua2V5XTtcbiAgICB9XG4gICAgaWYgKGF1dG9maWxsLnNvdXJjZSA9PSBcImRpY3RzXCIpIHtcbiAgICAgIGlmICghdGhpcy5zZWFyY2hJbnB1dC5kaWN0cykge1xuICAgICAgICBjb25zb2xlLmxvZyhcImRpY3RzIHVuZGVmaW5lZC4uLlwiKTtcbiAgICAgICAgcmV0dXJuIGF1dG9maWxsLmtleTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnNlYXJjaElucHV0Py5kaWN0c1thdXRvZmlsbC5rZXldID8/IGF1dG9maWxsLmtleTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEudmFsdWU7XG4gIH1cblxuICBpc1ZhbGlkRGF0ZShkOiBhbnkpIHtcbiAgICByZXR1cm4gIWlzTmFOKG5ldyBEYXRlKGQpIGFzIGFueSk7XG4gIH1cblxuICBTZXRSb2xlT2ZmaWNlQ29kZXMoaTogbnVtYmVyKSB7XG4gICAgbGV0IHVzZXJBY2Nlc3M6IHN0cmluZyA9IHRoaXMuZ2V0VXNlckFjY2VzcygpO1xuICAgIGxldCByb2xlQ29kZTogc3RyaW5nID0gdXNlckFjY2Vzc1tcIlJvbGVDb2RlXCJdO1xuICAgIGxldCBsaXN0T2ZmaWNlUm9sZUNvZGVzOiBBcnJheTxzdHJpbmc+ID0gbmV3IEFycmF5KCk7XG4gICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKHJvbGVDb2RlKTtcbiAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtpXTtcbiAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XG4gICAgbGV0IHRleHQgPSBkZGxbZGRsLnNlbGVjdGVkSW5kZXhdLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5pdGVtc1VybC5sZW5ndGggPT0gMSB8fCAodGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5kZGxUeXBlID09ICdhbGwnICYmIHRleHQgPT0gJ2FsbCcpKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5pdGVtc1VybC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0uaXRlbXNVcmxbaW5kZXhdO1xuICAgICAgICBsaXN0T2ZmaWNlUm9sZUNvZGVzLnB1c2goZWxlbWVudC5LZXkpO1xuICAgICAgICBsaXN0T2ZmaWNlUm9sZUNvZGVzLnB1c2gocm9sZUNvZGUgKyBcIi1cIiArIGVsZW1lbnQuS2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKHRleHQpO1xuICAgICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKHJvbGVDb2RlICsgXCItXCIgKyB0ZXh0KTtcbiAgICB9XG5cbiAgICB0aGlzLnNlYXJjaElucHV0LmludGVncmF0aW9uT2JqLnJlcXVlc3RPYmpbXCJPZmZpY2VSb2xlQ29kZXNcIl0gPSBsaXN0T2ZmaWNlUm9sZUNvZGVzO1xuICAgIHRoaXMudXBkYXRlS2V5VmFsRGljdCh7XG4gICAgICBrZXk6IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0ubmFtZSxcbiAgICAgIHZhbHVlOiB0ZXh0LFxuICAgIH0pO1xuICB9XG5cbiAgc2V0RGVmYXVsdFZhbHVlTW9udGgodmFsdWUpIHtcbiAgICBsZXQgYnVzaW5lc3NEYXRlID0gbmV3IERhdGUodGhpcy5CdXNpbmVzc0R0KTtcbiAgICBsZXQgb3BlcmF0b3IgPSB2YWx1ZS5jaGFyQXQoMik7XG4gICAgbGV0IHRlbXBWYWx1ZSA9IHZhbHVlLnNwbGl0KG9wZXJhdG9yLCAyKTtcbiAgICBsZXQgbnVtTW9udGggPSBwYXJzZUludCh0ZW1wVmFsdWVbMV0pO1xuICAgIGlmICghbnVtTW9udGgpIG51bU1vbnRoID0gMTtcbiAgICBpZiAob3BlcmF0b3IgPT0gXCItXCIpIHtcbiAgICAgIGJ1c2luZXNzRGF0ZS5zZXRNb250aChidXNpbmVzc0RhdGUuZ2V0TW9udGgoKSAtIG51bU1vbnRoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAob3BlcmF0b3IgPT0gXCIrXCIpIHtcbiAgICAgIGJ1c2luZXNzRGF0ZS5zZXRNb250aChidXNpbmVzc0RhdGUuZ2V0TW9udGgoKSArIG51bU1vbnRoKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1c2luZXNzRGF0ZS5nZXRNb250aCgpO1xuICB9XG4gIHNldE1vbnRoRERMKG1vbnRoKSB7XG4gICAgaWYgKG1vbnRoID09IFwibW9udGhcIikgcmV0dXJuIHRoaXMuTGlzdE9mTW9udGguTGlzdE9mTW9udGg7XG4gICAgbGV0IExpc3RPZk1vbnRoOiBBcnJheTxLZXlWYWx1ZVVDU2VhcmNoT2JqPiA9IG5ldyBBcnJheSgpO1xuICAgIGxldCBlcXVhdGlvbiA9IG1vbnRoLm1hdGNoKFwiW1xcXFwrXVstXXxbLV1bXFxcXCtdfFxcXFwrfC1cIik7XG4gICAgbGV0IHRvTWluOiBudW1iZXIgPSB0aGlzLkJ1c2luZXNzRHQuZ2V0TW9udGgoKTtcbiAgICBsZXQgdG9NYXg6IG51bWJlciA9IHRoaXMuQnVzaW5lc3NEdC5nZXRNb250aCgpO1xuICAgIGxldCBtaW5NYXg6IG51bWJlciA9IHBhcnNlSW50KG1vbnRoLnN1YnN0cmluZyhlcXVhdGlvbi5pbmRleCArIGVxdWF0aW9uWzBdLmxlbmd0aCkpO1xuICAgIGlmIChtaW5NYXggPj0gMTIpIHJldHVybiB0aGlzLkxpc3RPZk1vbnRoLkxpc3RPZk1vbnRoO1xuICAgIGlmICgoZXF1YXRpb25bMF0gPT0gXCIrLVwiIHx8IGVxdWF0aW9uWzBdID09IFwiLStcIikgJiYgbWluTWF4ID49IDYpIHJldHVybiB0aGlzLkxpc3RPZk1vbnRoLkxpc3RPZk1vbnRoO1xuICAgIGxldCBkaWN0T2ZNb250aDogeyBbbW9udGg6IG51bWJlcl06IHN0cmluZyB9ID0gdGhpcy5MaXN0T2ZNb250aC5EaWN0T2ZNb250aDtcbiAgICBMaXN0T2ZNb250aC5wdXNoKHsga2V5OiB0b01pbiwgdmFsdWU6IGRpY3RPZk1vbnRoW3RvTWluXSB9KTtcblxuICAgIGZvciAobGV0IHEgPSAwOyBxIDwgbWluTWF4OyBxKyspIHtcbiAgICAgIGlmIChlcXVhdGlvblswXS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgdG9NaW4tLTtcbiAgICAgICAgaWYgKHRvTWluID09IDApIHRvTWluID0gMTI7XG4gICAgICAgIExpc3RPZk1vbnRoLnB1c2goeyBrZXk6IHRvTWluLCB2YWx1ZTogZGljdE9mTW9udGhbdG9NaW5dIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGVxdWF0aW9uWzBdLmluY2x1ZGVzKFwiK1wiKSkge1xuICAgICAgICB0b01heCsrO1xuICAgICAgICBpZiAodG9NYXggPT0gMTMpIHRvTWF4ID0gMTtcbiAgICAgICAgTGlzdE9mTW9udGgucHVzaCh7IGtleTogdG9NYXgsIHZhbHVlOiBkaWN0T2ZNb250aFt0b01heF0gfSk7XG4gICAgICB9XG4gICAgfVxuICAgIExpc3RPZk1vbnRoLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIHJldHVybiBhLmtleSAtIGIua2V5O1xuICAgIH0pO1xuICAgIHJldHVybiBMaXN0T2ZNb250aDtcbiAgfVxuXG4gIHNldERlZmF1bHRWYWx1ZVllYXIodmFsdWUpIHtcbiAgICBsZXQgYnVzaW5lc3NEYXRlID0gbmV3IERhdGUodGhpcy5CdXNpbmVzc0R0KTtcbiAgICBsZXQgb3BlcmF0b3IgPSB2YWx1ZS5jaGFyQXQoMik7XG4gICAgbGV0IHRlbXBWYWx1ZSA9IHZhbHVlLnNwbGl0KG9wZXJhdG9yLCAyKTtcbiAgICBsZXQgbnVtWWVhciA9IHBhcnNlSW50KHRlbXBWYWx1ZVsxXSk7XG4gICAgaWYgKCFudW1ZZWFyKSBudW1ZZWFyID0gMTtcbiAgICBpZiAob3BlcmF0b3IgPT0gXCItXCIpIHtcbiAgICAgIGJ1c2luZXNzRGF0ZS5zZXRGdWxsWWVhcihidXNpbmVzc0RhdGUuZ2V0RnVsbFllYXIoKSAtIG51bVllYXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcGVyYXRvciA9PSBcIitcIikge1xuICAgICAgYnVzaW5lc3NEYXRlLnNldEZ1bGxZZWFyKGJ1c2luZXNzRGF0ZS5nZXRGdWxsWWVhcigpICsgbnVtWWVhcik7XG4gICAgfVxuICAgIHJldHVybiBidXNpbmVzc0RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgfVxuICBzZXRZZWFyRERMKHllYXIpIHtcbiAgICB0aGlzLkxpc3RPZlllYXIgPSBuZXcgQXJyYXk8S2V5VmFsdWVVQ1NlYXJjaE9iaj4oKTtcbiAgICBsZXQgZXF1YXRpb24gPSB5ZWFyLm1hdGNoKFwiW1xcXFwrXVstXXxbLV1bXFxcXCtdfFxcXFwrfC1cIik7XG4gICAgbGV0IHRvTWluOiBudW1iZXIgPSB0aGlzLkJ1c2luZXNzRHQuZ2V0RnVsbFllYXIoKTtcbiAgICBsZXQgdG9NYXg6IG51bWJlciA9IHRoaXMuQnVzaW5lc3NEdC5nZXRGdWxsWWVhcigpO1xuICAgIGxldCBtaW5NYXg6IG51bWJlciA9IHBhcnNlSW50KHllYXIuc3Vic3RyaW5nKGVxdWF0aW9uLmluZGV4ICsgZXF1YXRpb25bMF0ubGVuZ3RoKSk7XG4gICAgdGhpcy5MaXN0T2ZZZWFyLnB1c2goeyBrZXk6IHRoaXMuQnVzaW5lc3NEdC5nZXRGdWxsWWVhcigpLCB2YWx1ZTogdGhpcy5CdXNpbmVzc0R0LmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSB9KTtcblxuICAgIGZvciAobGV0IHEgPSAwOyBxIDwgbWluTWF4OyBxKyspIHtcbiAgICAgIGlmIChlcXVhdGlvblswXSA9PSBcIi0rXCIgfHwgZXF1YXRpb25bMF0gPT0gXCIrLVwiKSB7XG4gICAgICAgIHRvTWluLS07XG4gICAgICAgIHRvTWF4Kys7XG4gICAgICAgIHRoaXMuTGlzdE9mWWVhci5wdXNoKHsga2V5OiB0b01pbiwgdmFsdWU6IHRvTWluLnRvU3RyaW5nKCkgfSwgeyBrZXk6IHRvTWF4LCB2YWx1ZTogdG9NYXgudG9TdHJpbmcoKSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZXF1YXRpb25bMF0gPT0gXCItXCIpIHtcbiAgICAgICAgdG9NaW4tLTtcbiAgICAgICAgdGhpcy5MaXN0T2ZZZWFyLnB1c2goeyBrZXk6IHRvTWluLCB2YWx1ZTogdG9NaW4udG9TdHJpbmcoKSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZXF1YXRpb25bMF0gPT0gXCIrXCIpIHtcbiAgICAgICAgdG9NYXgrKztcbiAgICAgICAgdGhpcy5MaXN0T2ZZZWFyLnB1c2goeyBrZXk6IHRvTWF4LCB2YWx1ZTogdG9NYXgudG9TdHJpbmcoKSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5MaXN0T2ZZZWFyLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIHJldHVybiBhLmtleSAtIGIua2V5O1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLkxpc3RPZlllYXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0SlNPTih1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKTtcbiAgfVxuXG4gIHB1YmxpYyBwb3N0SlNPTih1cmw6IHN0cmluZywgY3JpdGVyaWE6IGFueSA9IG51bGwpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIGNyaXRlcmlhKTtcbiAgfVxuXG4gIHNlYXJjaENsaWNrKElzRXhwb3J0RXhjZWw6IGJvb2xlYW4gPSBmYWxzZSwgRXh0RmlsZTogc3RyaW5nID0gXCJcIikge1xuXG4gICAgLy8gY2hlY2sgaWYgY3JpdGVyaWEgdG8gc2VuZCBpcyByZWFkeVxuICAgIGlmICghdGhpcy5zZWFyY2hCdG5SZWFkeSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKFwic2VhcmNoIGNsaWNrIGVudGVyLi4uLi4uLi4uXCIpXG4gICAgaWYgKHRoaXMuaXNSZXBvcnQgIT0gdW5kZWZpbmVkICYmIHRoaXMuaXNSZXBvcnQpIHtcbiAgICAgIHRoaXMuR2VuZXJhdGVSZXBvcnQodGhpcy5zZWFyY2hGb3JtKVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZmlsdGVyZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbHRlcigoaXRlbSwgaSwgYXJyKSA9PlxuICAgICAgYXJyLmZpbmRJbmRleCgoeCkgPT4gKHgubmFtZSA9PT0gaXRlbS5uYW1lKSkgPT09IGkpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGZpbHRlcmVkW2ldLnR5cGUgPT0gXCJudW1lcmljXCIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrVmFsdWVHdGVMdGUoZmlsdGVyZWRbaV0pKSByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG9yZGVyID0gbnVsbDtcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm9yZGVyYnkgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5vcmRlcmJ5LmtleSAhPT0gXCJcIiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ub3JkZXJieS52YWx1ZSAhPT0gXCJcIikge1xuICAgICAgICBvcmRlciA9IHtcbiAgICAgICAgICBrZXk6IHRoaXMuY29uZmlndXJhdGlvbi5vcmRlcmJ5LmtleSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5jb25maWd1cmF0aW9uLm9yZGVyYnkudmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBhZ2VOb3cgPSAxO1xuICAgIGxldCByb3dQZXJQYWdlID0gdGhpcy5wYWdlU2l6ZTtcbiAgICBpZiAoSXNFeHBvcnRFeGNlbCkgcm93UGVyUGFnZSA9IDk5OTk7XG4gICAgdGhpcy5zZWFyY2godGhpcy5hcGlVcmwsIHRoaXMucGFnZU5vdywgcm93UGVyUGFnZSwgb3JkZXIsIHRydWUsIHRoaXMuYXJyQ3JpdCwgSXNFeHBvcnRFeGNlbCwgRXh0RmlsZSk7XG4gIH1cblxuICBhc3luYyByZXNldCgpIHtcbiAgICAvLyBkaXNhYmxlIGJ1dHRvbiBzZWFyY2ggdG8gbWFrZSBzdXJlIHRoYXQgYWxsIGNyaXRlcmlhIHJlYWR5IGZpcnN0LlxuICAgIHRoaXMuc2VhcmNoQnRuUmVhZHkgPSBmYWxzZTtcbiAgICBhd2FpdCB0aGlzLmluaXRpYXRlRm9ybShmYWxzZSk7XG4gIH1cblxuICBjaGVja1N1Ym1pdERhdGUoY29tcG9uZW50KSB7XG4gICAgY29uc3QgX2NvbXAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50O1xuICAgIGNvbnN0IE1pbkNvbXBvbmVudElkeCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZEluZGV4KHggPT4geC5kYXRlcGlja2VyUGFpciA9PSBjb21wb25lbnQuZGF0ZXBpY2tlclBhaXIgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiKSkgPT09IC0xID8gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kSW5kZXgoeCA9PiB4LmRhdGVwaWNrZXJQYWlyID09IGNvbXBvbmVudC5kYXRlcGlja2VyUGFpciAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RcIikpIDogdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kSW5kZXgoeCA9PiB4LmRhdGVwaWNrZXJQYWlyID09IGNvbXBvbmVudC5kYXRlcGlja2VyUGFpciAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCIpKTtcbiAgICBjb25zdCBNYXhDb21wb25lbnRJZHggPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmRJbmRleCh4ID0+IHguZGF0ZXBpY2tlclBhaXIgPT0gY29tcG9uZW50LmRhdGVwaWNrZXJQYWlyICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVEVcIikpID09PSAtMSA/IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZEluZGV4KHggPT4geC5kYXRlcGlja2VyUGFpciA9PSBjb21wb25lbnQuZGF0ZXBpY2tlclBhaXIgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxUXCIpKSA6IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZEluZGV4KHggPT4geC5kYXRlcGlja2VyUGFpciA9PSBjb21wb25lbnQuZGF0ZXBpY2tlclBhaXIgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiKSk7XG5cbiAgICBpZiAoTWluQ29tcG9uZW50SWR4ID09PSAtMSB8fCBNYXhDb21wb25lbnRJZHggPT09IC0xKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmICh0aGlzLmZvcm0uY29udHJvbHNbX2NvbXBbTWluQ29tcG9uZW50SWR4XS5uYW1lICsgTWluQ29tcG9uZW50SWR4XS52YWx1ZSA+IHRoaXMuZm9ybS5jb250cm9sc1tfY29tcFtNYXhDb21wb25lbnRJZHhdLm5hbWUgKyBNYXhDb21wb25lbnRJZHhdLnZhbHVlKSB7XG4gICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKF9jb21wW01pbkNvbXBvbmVudElkeF0ubGFiZWwgKyBcIiBtdXN0IGJlIGxlc3MgdGhhbiBcIiArIF9jb21wW01heENvbXBvbmVudElkeF0ubGFiZWwpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2hlY2tOdW1lcmljUGFpcihjb21wb25lbnQsIG15Zm9ybSkge1xuICAgIC8vIGNvbnN0IF9jb21wID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudDtcbiAgICAvLyBsZXQgTWluQ29tcG9uZW50SWR4ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kSW5kZXgoeCA9PiB4Lm51bWVyaWNQYWlyID09IGNvbXBvbmVudC5udW1lcmljUGFpciAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCIpKSA9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm51bWVyaWNQYWlyID09IGNvbXBvbmVudC5udW1lcmljUGFpciAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RcIikpIDogdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5udW1lcmljUGFpciA9PSBjb21wb25lbnQubnVtZXJpY1BhaXIgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiKSk7XG4gICAgLy8gbGV0IE1heENvbXBvbmVudElkeCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZEluZGV4KHggPT4geC5udW1lcmljUGFpciA9PSBjb21wb25lbnQubnVtZXJpY1BhaXIgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiKSkgPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5udW1lcmljUGFpciA9PSBjb21wb25lbnQubnVtZXJpY1BhaXIgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxUXCIpKSA6IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubnVtZXJpY1BhaXIgPT0gY29tcG9uZW50Lm51bWVyaWNQYWlyICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVEVcIikpO1xuICAgIC8vIGNvbnN0IF9taW4gPSBwYXJzZUZsb2F0KHRoaXMuZm9ybS5jb250cm9sc1tfY29tcFtNaW5Db21wb25lbnRJZHhdLm5hbWVdLnZhbHVlLnJlcGxhY2UoLywvZywgJycpKTtcbiAgICAvLyBjb25zdCBfbWF4ID0gcGFyc2VGbG9hdCh0aGlzLmZvcm0uY29udHJvbHNbX2NvbXBbTWF4Q29tcG9uZW50SWR4XS5uYW1lXS52YWx1ZS5yZXBsYWNlKC8sL2csICcnKSk7XG5cbiAgICAvLyBpZiAoX21pbiA+IF9tYXgpIHtcbiAgICAvLyAgIHRoaXMudG9hc3RyLndhcm5pbmcoX2NvbXBbTWluQ29tcG9uZW50SWR4XS5sYWJlbCArIFwiIG11c3QgYmUgbGVzcyB0aGFuIFwiICsgX2NvbXBbTWF4Q29tcG9uZW50SWR4XS5sYWJlbCk7XG4gICAgLy8gICByZXR1cm4gZmFsc2U7XG4gICAgLy8gfVxuXG4gICAgbGV0IE1pbkNvbXBvbmVudCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubnVtZXJpY1BhaXIgPT0gY29tcG9uZW50Lm51bWVyaWNQYWlyICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVEVcIikpID09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubnVtZXJpY1BhaXIgPT0gY29tcG9uZW50Lm51bWVyaWNQYWlyICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiKSkgOiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm51bWVyaWNQYWlyID09IGNvbXBvbmVudC5udW1lcmljUGFpciAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCIpKTtcbiAgICBsZXQgTWF4Q29tcG9uZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5udW1lcmljUGFpciA9PSBjb21wb25lbnQubnVtZXJpY1BhaXIgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiKSkgPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5udW1lcmljUGFpciA9PSBjb21wb25lbnQubnVtZXJpY1BhaXIgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxUXCIpKSA6IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubnVtZXJpY1BhaXIgPT0gY29tcG9uZW50Lm51bWVyaWNQYWlyICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVEVcIikpO1xuICAgIGNvbnN0IF9taW4gPSBwYXJzZUZsb2F0KG15Zm9ybS5uYXRpdmVFbGVtZW50W01pbkNvbXBvbmVudC5pZF0udmFsdWUucmVwbGFjZSgvLC9nLCAnJykpO1xuICAgIGNvbnN0IF9tYXggPSBwYXJzZUZsb2F0KG15Zm9ybS5uYXRpdmVFbGVtZW50W01heENvbXBvbmVudC5pZF0udmFsdWUucmVwbGFjZSgvLC9nLCAnJykpO1xuXG4gICAgaWYgKF9taW4gPiBfbWF4KSB7XG4gICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKE1pbkNvbXBvbmVudC5sYWJlbCArIFwiIG11c3QgYmUgbGVzcyB0aGFuIFwiICsgTWF4Q29tcG9uZW50LmxhYmVsKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIHNlYXJjaChhcGlVcmw6IHN0cmluZywgcGFnZU5vOiBudW1iZXIsIHJvd1BlclBhZ2U6IG51bWJlciwgb3JkZXJCeTogYW55LCBpc0NsaWNrU2VhcmNoOiBib29sZWFuLCBhZGRDcml0OiBDcml0ZXJpYU9ialtdID0gbmV3IEFycmF5KCksIElzRXhwb3J0RXhjZWw6IGJvb2xlYW4gPSBmYWxzZSwgZXh0RmlsZTogc3RyaW5nID0gXCJcIiwgaXNBZGRUb1RlbXA6IGJvb2xlYW4gPSBmYWxzZSwgYWRkVG9UZW1wQ3JpdDogQ3JpdGVyaWFPYmpbXSA9IG5ldyBBcnJheSgpKSB7XG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XG4gICAgbGV0IGFyckNyaXQgPSBuZXcgQXJyYXkoKTtcbiAgICBsZXQgSXNRdWVyeUluID0gZmFsc2U7XG4gICAgbGV0IElzQnJlYWsgPSBmYWxzZTtcbiAgICBsZXQgYm9keUxpc3QgPSBuZXcgQXJyYXkoKTtcbiAgICBsZXQgaGVhZGVyTGlzdCA9IG5ldyBBcnJheSgpO1xuICAgIGxldCBmaWxlTmFtZTogc3RyaW5nO1xuICAgIGxldCBib2R5RGF0YSA9IG5ldyBBcnJheSgpO1xuICAgIGxldCBkYXRhRmlsZSA9IG5ldyBBcnJheSgpO1xuICAgIGxldCBhZGRpdGlvbmFsRXhwb3J0TGlzdCA9IG5ldyBBcnJheSgpO1xuICAgIGxldCBleGNsdWRlRXhwb3J0TGlzdCA9IG5ldyBBcnJheSgpO1xuXG4gICAgY29uc3QgbWFwcGVkQ29uZk5hbWVWYWx1ZSA9IHt9O1xuICAgIGZvciAobGV0IFtpbmRleCwgdmFsXSBvZiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmVudHJpZXMoKSkge1xuICAgICAgbGV0IF9uYW1lID0gdmFsLm5hbWU7XG4gICAgICBpZiAodmFsLnR5cGUgPT09IFwiZGF0ZXBpY2tlclwiIHx8IHZhbC50eXBlID09PSBcIm51bWVyaWNcIiB8fCB2YWwudHlwZSA9PT0gXCJjdXJyZW5jeVwiKSBfbmFtZSArPSBpbmRleDtcbiAgICAgIG1hcHBlZENvbmZOYW1lVmFsdWVbX25hbWVdID0ge1xuICAgICAgICB2YWx1ZTogdGhpcy5mb3JtLmNvbnRyb2xzW19uYW1lXS52YWx1ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgd2hlcmVRdWVyeSBmb3Igd2hlcmUgY3JpdGVyaWFcbiAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlYXJjaElucHV0LndoZXJlVmFsdWUubGVuZ3RoICE9IDApIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZy53aGVyZVF1ZXJ5ID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgIC8vIHJlYWQgdmFsdWUgYmFzZWQgb24gc2VhcmNoIGNvbXBvbmVudCB2YWx1ZSAtIGlmIG5vdCBmb3VuZCwgd2lsbCBoYXJkY29kZWRcbiAgICAgICAgY29uc3QgX3ZhbCA9IG1hcHBlZENvbmZOYW1lVmFsdWVbdGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlW3hdLnZhbHVlXSA/IG1hcHBlZENvbmZOYW1lVmFsdWVbdGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlW3hdLnZhbHVlXS52YWx1ZSA6IHRoaXMuc2VhcmNoSW5wdXQud2hlcmVWYWx1ZVt4XS52YWx1ZTtcbiAgICAgICAgLy8gdGhpcy5jb25maWd1cmF0aW9uLnF1ZXJ5c3RyaW5nLndoZXJlUXVlcnkucHVzaCh0aGlzLnNlYXJjaElucHV0LndoZXJlVmFsdWVbeF0udmFsdWUpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcud2hlcmVRdWVyeS5wdXNoKF92YWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5mcm9tVmFsdWUgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoSW5wdXQuZnJvbVZhbHVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcuZnJvbVF1ZXJ5ID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5zZWFyY2hJbnB1dC5mcm9tVmFsdWUubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgLy8gcmVhZCB2YWx1ZSBiYXNlZCBvbiBzZWFyY2ggY29tcG9uZW50IHZhbHVlIC0gaWYgbm90IGZvdW5kLCB3aWxsIGhhcmRjb2RlZFxuICAgICAgICBjb25zdCBfdmFsID0gbWFwcGVkQ29uZk5hbWVWYWx1ZVt0aGlzLnNlYXJjaElucHV0LmZyb21WYWx1ZVt4XS52YWx1ZV0gPyBtYXBwZWRDb25mTmFtZVZhbHVlW3RoaXMuc2VhcmNoSW5wdXQuZnJvbVZhbHVlW3hdLnZhbHVlXS52YWx1ZSA6IHRoaXMuc2VhcmNoSW5wdXQuZnJvbVZhbHVlW3hdLnZhbHVlO1xuICAgICAgICAvLyB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcuZnJvbVF1ZXJ5LnB1c2godGhpcy5zZWFyY2hJbnB1dC5mcm9tVmFsdWVbeF0udmFsdWUpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcuZnJvbVF1ZXJ5LnB1c2goX3ZhbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3QucGFnZU5vID0gcGFnZU5vO1xuICAgIHJlcXVlc3Qucm93UGVyUGFnZSA9IHJvd1BlclBhZ2U7XG4gICAgcmVxdWVzdC5vcmRlckJ5ID0gb3JkZXJCeTtcbiAgICByZXF1ZXN0LnF1ZXJ5U3RyaW5nID0gdGhpcy5jb25maWd1cmF0aW9uLnF1ZXJ5c3RyaW5nO1xuXG4gICAgbGV0IGZpbHRlcmVkID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maWx0ZXIoKGl0ZW0sIGksIGFycikgPT4ge1xuICAgICAgaWYgKGl0ZW0uZGF0ZXBpY2tlclBhaXIgPT09IHVuZGVmaW5lZCB8fCBpdGVtLmRhdGVwaWNrZXJQYWlyID09PSAnJykgcmV0dXJuO1xuICAgICAgcmV0dXJuIGFyci5maW5kSW5kZXgoKHgpID0+ICh4LmRhdGVwaWNrZXJQYWlyID09PSBpdGVtLmRhdGVwaWNrZXJQYWlyKSkgPT09IGlcbiAgICB9KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZmlsdGVyZWRbaV0udHlwZSA9PSBcImRhdGVwaWNrZXJcIikge1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tTdWJtaXREYXRlKGZpbHRlcmVkW2ldKSkgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBmaWx0ZXJlZE51bWVyaWMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbHRlcigoaXRlbSwgaSwgYXJyKSA9PiB7XG4gICAgICBpZiAoaXRlbS5udW1lcmljUGFpciA9PT0gdW5kZWZpbmVkIHx8IGl0ZW0ubnVtZXJpY1BhaXIgPT09ICcnKSByZXR1cm47XG4gICAgICByZXR1cm4gYXJyLmZpbmRJbmRleCgoeCkgPT4gKHgubnVtZXJpY1BhaXIgPT09IGl0ZW0ubnVtZXJpY1BhaXIpKSA9PT0gaVxuICAgIH0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyZWROdW1lcmljLmxlbmd0aDsgaSsrKSB7XG4gICAgICAwXG4gICAgICBpZiAoZmlsdGVyZWROdW1lcmljW2ldLnR5cGUgPT0gXCJudW1lcmljXCIgfHwgZmlsdGVyZWROdW1lcmljW2ldLnR5cGUgPT0gXCJjdXJyZW5jeVwiKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGVja051bWVyaWNQYWlyKGZpbHRlcmVkTnVtZXJpY1tpXSwgdGhpcy5teUZvcm0pKSByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGZvcm1TZXE6IG51bWJlciA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudEZvcm07IGkrKykge1xuICAgICAgbGV0IGNyaXRPYmogPSBuZXcgQ3JpdGVyaWFPYmooKTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT0gXCJibGFua1wiKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkcm9wZG93blNlYXJjaFwiKSB7XG4gICAgICAgIGZvcm1TZXEgKz0gMztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1TZXErKztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLmV4Y2x1ZGVGcm9tQ3JpdCkgY29udGludWU7XG4gICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtmb3JtU2VxXTtcbiAgICAgIGxldCBfY29tcG9uZW50VmFsdWUgPSBgJHt0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5uYW1lXT8udmFsdWUgPz8gXCJcIn1gO1xuICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PT0gXCJsb29rdXBcIikge1xuICAgICAgICBfY29tcG9uZW50VmFsdWUgPSBgJHt0aGlzLmZvcm0uY29udHJvbHNbXCJsb29rdXBfaWRfXCIgKyB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLm5hbWVdLnZhbHVlID8/IFwiXCJ9YDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50eXBlID09PSBcImRhdGVwaWNrZXJcIiB8fCB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT09IFwibnVtZXJpY1wiIHx8IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PT0gXCJjdXJyZW5jeVwiKSB7XG4gICAgICAgIF9jb21wb25lbnRWYWx1ZSA9IGAke3RoaXMuZm9ybS5jb250cm9sc1t0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLm5hbWUraV0udmFsdWUgPz8gXCJcIn1gO1xuICAgICAgfVxuXG4gICAgICBjcml0T2JqLkRhdGFUeXBlID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJyk7XG4gICAgICBpZiAoIWNyaXRPYmouRGF0YVR5cGUpIGNyaXRPYmouRGF0YVR5cGUgPSBcIlwiO1xuICAgICAgLy9Jbmkga2h1c3VzIGthbGF1IGRhcmkgRHJvcCBEb3duXG4gICAgICBpZiAoY29tcG9uZW50LmdldEF0dHJpYnV0ZSgncXVlcnktaW4nKSAhPSBudWxsICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ3F1ZXJ5LWluJykgPT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgSXNRdWVyeUluID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBJc1F1ZXJ5SW4gPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbXBvbmVudC5ub2RlTmFtZSA9PSAnU0VMRUNUJykge1xuICAgICAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XG4gICAgICAgIGlmIChkZGwuc2VsZWN0ZWRJbmRleCA9PT0gLTEgJiYgZGRsLmxlbmd0aCA9PT0gMSAmJiBfY29tcG9uZW50VmFsdWUgPT0gXCJcIikge1xuICAgICAgICAgIF9jb21wb25lbnRWYWx1ZSA9IFwiU0VMRUNUX1RFTVBcIlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfY29tcG9uZW50VmFsdWUgIT0gXCJcIikge1xuICAgICAgICBpZiAoY29tcG9uZW50Lm5vZGVOYW1lID09ICdTRUxFQ1QnKSB7XG4gICAgICAgICAgbGV0IGRkbCA9IGNvbXBvbmVudC5vcHRpb25zO1xuICAgICAgICAgIGlmIChkZGwuc2VsZWN0ZWRJbmRleCA9PT0gLTEgJiYgZGRsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgZGRsLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgdGV4dCA9IGRkbFtkZGwuc2VsZWN0ZWRJbmRleF0udmFsdWUudHJpbSgpO1xuICAgICAgICAgIGlmICh0ZXh0ID09IFwib25lXCIpIHtcbiAgICAgICAgICAgIElzQnJlYWsgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnbGFiZWwnKTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyLndhcm5pbmcoXCJQbGVhc2Ugc2VsZWN0IFwiICsgbGFiZWwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKSAhPSBcIlwiICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjcml0T2JqLmlzQ3JpdGVyaWFEYXRhVGFibGUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNyaXQtZGF0YXRhYmxlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PSBcInRhc2tEZWZpbml0aW9uS2V5XCIgfHxcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PSBcInByb2Nlc3NLZXlcIikge1xuICAgICAgICAgICAgICBpZiAoZGRsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuU2V0UHJvY2Vzc0tleShpLCB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLndmS2V5RmlsdGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50eXBlID09IFwiY2xhaW1cIikge1xuICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmFtZScpO1xuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IHRleHQ7XG4gICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghaXNBZGRUb1RlbXApIHtcbiAgICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGV4dCAhPSBcImFsbFwiICYmIHRleHQgIT0gXCJvbmVcIiAmJiB0ZXh0ICE9IFwib3RoZXJzXCIpIHtcbiAgICAgICAgICAgICAgLy9LYWxhdSBEYXJpIERyb3Bkb3duIHVkYWggcGFzdGkgcGFrZSBFcVxuICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkVxO1xuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQubmFtZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IHRleHQ7XG5cbiAgICAgICAgICAgICAgY29uc3QgcmVzdHJpY3Rpb24gPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlc3RyaWN0aW9uJyk7XG4gICAgICAgICAgICAgIGlmIChyZXN0cmljdGlvbiAhPSBcIlwiICYmIHJlc3RyaWN0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBvdmVycmlkZSByZXN0cmljdGlvblxuICAgICAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSByZXN0cmljdGlvbjtcblxuICAgICAgICAgICAgICAgIGlmIChyZXN0cmljdGlvbiA9PSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uTGlrZSkge1xuICAgICAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IGAlJHt0ZXh0fSVgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghaXNBZGRUb1RlbXApIHtcbiAgICAgICAgICAgICAgICBhcnJDcml0LnB1c2goY3JpdE9iaik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSBcImFsbFwiICYmIElzUXVlcnlJbiAmJiBjb21wb25lbnQub3B0aW9ucy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICBsZXQgZGRsTGlzdCA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNvbXBvbmVudC5vcHRpb25zLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHggIT0gMCkge1xuICAgICAgICAgICAgICAgICAgZGRsTGlzdC5wdXNoKGNvbXBvbmVudC5vcHRpb25zW3hdLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRkbExpc3QubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkluO1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQubmFtZSAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50Lm5hbWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW5hbWUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3JpdE9iai5saXN0VmFsdWUgPSBkZGxMaXN0O1xuICAgICAgICAgICAgICAgIGlmICghaXNBZGRUb1RlbXApIHtcbiAgICAgICAgICAgICAgICAgIGFyckNyaXQucHVzaChjcml0T2JqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSBcIm90aGVyc1wiICYmIGNvbXBvbmVudC5vcHRpb25zLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgIGxldCBkZGxMaXN0ID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY29tcG9uZW50Lm9wdGlvbnMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAoeCAhPSAwICYmIHggIT0gY29tcG9uZW50Lm9wdGlvbnMubGVuZ3RoLTEpIHtcbiAgICAgICAgICAgICAgICAgIGRkbExpc3QucHVzaChjb21wb25lbnQub3B0aW9uc1t4XS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChkZGxMaXN0Lmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25Ob3RJbjtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5uYW1lO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNyaXRPYmoubGlzdFZhbHVlID0gZGRsTGlzdDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQWRkVG9UZW1wKSB7XG4gICAgICAgICAgICAgICAgICBhcnJDcml0LnB1c2goY3JpdE9iaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNvbXBEYXRhVHlwZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpO1xuICAgICAgICAgIGlmIChjb21wRGF0YVR5cGUgPT09ICdsb29rdXAnIHx8IChjb21wRGF0YVR5cGUgPT09IFwiZGF0ZVwiICYmIHRoaXMudXNlTmV3RGF0ZXBpY2tlcikpIHtcbiAgICAgICAgICAgIGZvcm1TZXErKztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9LYWxhdSBhZGEgUGVyY2VudCBtYWthIHlhbmcgZGlwYWtlIG5udGkgYWRhbGFoIFJlc3RyaWN0aW9ucyBMaWtlXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lICE9IFwiXCIpIHtcbiAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQubmFtZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmFtZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PT0gXCJkYXRlcGlja2VyXCIgfHxcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PT0gXCJudW1lcmljXCIgfHxcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PT0gXCJjdXJyZW5jeVwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3JpdE9iai52YWx1ZSA9IF9jb21wb25lbnRWYWx1ZTtcblxuICAgICAgICAgIC8vIG5vcm1hbGl6ZSBkYXRhIHR5cGUgZnJvbSBsb29rdXAgdG8gdGV4dDtcbiAgICAgICAgICBpZiAoY29tcERhdGFUeXBlID09PSBcImxvb2t1cFwiKSBjcml0T2JqLkRhdGFUeXBlID0gXCJ0ZXh0XCI7XG5cbiAgICAgICAgICBpZiAoX2NvbXBvbmVudFZhbHVlLmluY2x1ZGVzKFwiJVwiKSkge1xuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25MaWtlO1xuICAgICAgICAgICAgX2NvbXBvbmVudFZhbHVlID0gdGhpcy5yZW1vdmVUcmFpbGluZ0JhY2tzbGFzaGVzQWZ0ZXJQZXJjZW50KF9jb21wb25lbnRWYWx1ZSk7XG4gICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gX2NvbXBvbmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL2thbGF1IGNvbXBvbmVudG55YSBEYXRlLCByZXN0cmljdGlvbnNueWEgbGdzZyBhbWJpbCBkYXJpIHByb3BlcnR5IEpTT05ueWFcbiAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlc3RyaWN0aW9uJykgIT0gXCJcIiAmJiBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlc3RyaWN0aW9uJykgIT0gbnVsbCkge1xuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVzdHJpY3Rpb24nKTtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKSA9PSAnbnVtZXJpYycpIHtcbiAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IHBhcnNlRmxvYXQoX2NvbXBvbmVudFZhbHVlLnJlcGxhY2UoLywvZywgJycpKS50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNyaXRPYmoucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxJS0VcIikge1xuICAgICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gXCIlXCIgKyBfY29tcG9uZW50VmFsdWUudHJpbSgpICsgXCIlXCI7XG4gICAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uTGlrZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uRXFcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKSAhPSBcIlwiICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjcml0T2JqLmlzQ3JpdGVyaWFEYXRhVGFibGUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNyaXQtZGF0YXRhYmxlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHNraXBQdXNoVG9Dcml0ID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgIC8vIGNoZWNrIGlzIHN0YW5kYWxvbmUgb3Igbm90XG4gICAgICAgICAgICAgIGNvbnN0IHVzZVRpbWVQYWlyID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS51c2VUaW1lUGFpcjtcbiAgICAgICAgICAgIGlmICh1c2VUaW1lUGFpcikge1xuICAgICAgICAgICAgICBza2lwUHVzaFRvQ3JpdCA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4UGFpciA9IGFyckNyaXQuZmluZEluZGV4KHggPT4geC5wcm9wTmFtZSA9PT0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50aW1lUGFpciAmJiB4LnJlc3RyaWN0aW9uID09PSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnJlc3RyaWN0aW9uKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4UGFpciA+IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX3ZhbHVlID0gbmV3IERhdGUoYXJyQ3JpdFtpbmRleFBhaXJdLnZhbHVlKTtcblxuICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIGRhdGUgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGNvbnN0IHllYXIgPSBfdmFsdWUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb250aCA9IF92YWx1ZS5nZXRVVENNb250aCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRheSA9IF92YWx1ZS5nZXRVVENEYXRlKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHRpbWUgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGNvbnN0IFtob3VycywgbWludXRlc10gPSBfY29tcG9uZW50VmFsdWUuc3BsaXQoXCI6XCIpLm1hcChOdW1iZXIpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91cnMsIG1pbnV0ZXMsIDApKS50b0lTT1N0cmluZygpLnJlcGxhY2UoXCJUXCIsIFwiIFwiKS5yZXBsYWNlKFwiWlwiLFwiXCIpO1xuICAgICAgICAgICAgICAgIGFyckNyaXRbaW5kZXhQYWlyXS52YWx1ZSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWlzQWRkVG9UZW1wICYmICFza2lwUHVzaFRvQ3JpdCkge1xuICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29tcERhdGFUeXBlID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJyk7XG4gICAgICAgIGlmIChjb21wRGF0YVR5cGUgPT09ICdsb29rdXAnIHx8IChjb21wRGF0YVR5cGUgPT09IFwiZGF0ZVwiICYmIHRoaXMudXNlTmV3RGF0ZXBpY2tlcikpIHtcbiAgICAgICAgICBmb3JtU2VxKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoSXNCcmVhaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhZGRDcml0ICE9IG51bGwgJiYgYWRkQ3JpdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChhZGRDcml0Lmxlbmd0aCAhPSAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkQ3JpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFyckNyaXQucHVzaChhZGRDcml0W2ldKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dCAhPSBudWxsIHx8IHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYXJyQ3JpdC5wdXNoKHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0W2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dCAhPSBudWxsIHx8IHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJDcml0LnB1c2godGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXRbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0NsaWNrU2VhcmNoKSB7XG4gICAgICB0aGlzLnBlcnNpc3RDcml0ID0gYXJyQ3JpdDtcbiAgICB9XG4gICAgcmVxdWVzdC5jcml0ZXJpYSA9IHRoaXMucGVyc2lzdENyaXQ7XG5cbiAgICBpZiAoaXNBZGRUb1RlbXApIHtcbiAgICAgIHRoaXMucGVyc2lzdEFkZFRvVGVtcENyaXQgPSBhZGRUb1RlbXBDcml0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlcnNpc3RBZGRUb1RlbXBDcml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3QuY3JpdGVyaWEgPSByZXF1ZXN0LmNyaXRlcmlhLmNvbmNhdCh0aGlzLnBlcnNpc3RBZGRUb1RlbXBDcml0KTtcbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgZHVwbGljYXRlIGRhdGEgaW4gYXJyYXlcbiAgICByZXF1ZXN0LmNyaXRlcmlhID0gdGhpcy5maWx0ZXJEdXBsaWNhdGVEYXRhKHJlcXVlc3QuY3JpdGVyaWEpXG5cbiAgICAvLyBmaWx0ZXIgZW1wdHkgdmFsdWUgaW4gbGlzdFZhbHVlXG4gICAgcmVxdWVzdC5jcml0ZXJpYSA9IHRoaXMuZmlsdGVyTGlzdFZhbHVlRW1wdHkocmVxdWVzdC5jcml0ZXJpYSk7XG5cbiAgICByZXF1ZXN0LmludGVncmF0aW9uT2JqID0gbnVsbDtcbiAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5pc0pvaW5FeEFQSSkge1xuICAgICAgcmVxdWVzdC5pbnRlZ3JhdGlvbk9iaiA9IHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmo7XG4gICAgfVxuXG4gICAgdGhpcy5pc1NlYXJjaCA9IHRydWU7XG5cblxuICAgIGlmICh0aGlzLnNlYXJjaElucHV0LmRhdGFJbnB1dCAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5rZXlzKHRoaXMuc2VhcmNoSW5wdXQuZGF0YUlucHV0KS5sZW5ndGggIT09IDApIHtcbiAgICAgIGJvZHlMaXN0ID0gdGhpcy5zZWFyY2hJbnB1dC5kYXRhSW5wdXQuYm9keUxpc3Q7XG4gICAgICBmaWxlTmFtZSA9IHRoaXMuc2VhcmNoSW5wdXQuZGF0YUlucHV0LnRpdGxlO1xuICAgICAgaGVhZGVyTGlzdCA9IHRoaXMuc2VhcmNoSW5wdXQuZGF0YUlucHV0LmhlYWRlckxpc3Q7XG4gICAgICBhZGRpdGlvbmFsRXhwb3J0TGlzdCA9IHRoaXMuc2VhcmNoSW5wdXQuZGF0YUlucHV0LmFkZGl0aW9uYWxFeHBvcnRMaXN0O1xuICAgICAgZXhjbHVkZUV4cG9ydExpc3QgPSB0aGlzLnNlYXJjaElucHV0LmRhdGFJbnB1dC5leGNsdWRlRXhwb3J0TGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5odHRwLmdldCh0aGlzLnNlYXJjaElucHV0Ll91cmwpLnRvUHJvbWlzZSgpLnRoZW4oKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBib2R5TGlzdCA9IGRhdGEuYm9keUxpc3RcbiAgICAgICAgZmlsZU5hbWUgPSBkYXRhLnRpdGxlXG4gICAgICAgIGhlYWRlckxpc3QgPSBkYXRhLmhlYWRlckxpc3RcbiAgICAgICAgYWRkaXRpb25hbEV4cG9ydExpc3QgPSBkYXRhLmFkZGl0aW9uYWxFeHBvcnRMaXN0O1xuICAgICAgICBleGNsdWRlRXhwb3J0TGlzdCA9IGRhdGEuZXhjbHVkZUV4cG9ydExpc3Q7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmh0dHAucG9zdChhcGlVcmwsIHJlcXVlc3QpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChJc0V4cG9ydEV4Y2VsKSB7XG4gICAgICAgIGJvZHlEYXRhID0gcmVzcG9uc2VbXCJEYXRhXCJdO1xuICAgICAgICBbaGVhZGVyTGlzdCwgYm9keUxpc3RdID0gdGhpcy5jaGVja0FkZGl0aW9uYWxFeHBvcnRMaXN0KGhlYWRlckxpc3QsIGJvZHlMaXN0LCBhZGRpdGlvbmFsRXhwb3J0TGlzdCk7XG4gICAgICAgIFtoZWFkZXJMaXN0LCBib2R5TGlzdF0gPSB0aGlzLmNoZWNrRXhjbHVkZUV4cG9ydExpc3QoaGVhZGVyTGlzdCwgYm9keUxpc3QsIGV4Y2x1ZGVFeHBvcnRMaXN0KTtcbiAgICAgICAgZGF0YUZpbGUgPSB0aGlzLm1hcERhdGFGaWxlKGJvZHlMaXN0LCBib2R5RGF0YSwgaGVhZGVyTGlzdCk7XG4gICAgICAgIGlmIChleHRGaWxlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNlbCkge1xuICAgICAgICAgIHRoaXMuZXhwb3J0RmlsZVNlcnZpY2UuZXhwb3J0RmlsZUFzRXhjZWwoZGF0YUZpbGUsIGZpbGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0RmlsZSA9PT0gRVhQT1JUX0RBVEFfVFlQRVMuanNvbikge1xuICAgICAgICAgIHRoaXMuZXhwb3J0RmlsZVNlcnZpY2UuZXhwb3J0RmlsZUFzSnNvbihkYXRhRmlsZSwgZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHRGaWxlID09PSBFWFBPUlRfREFUQV9UWVBFUy5jc3YpIHtcbiAgICAgICAgICB0aGlzLmV4cG9ydEZpbGVTZXJ2aWNlLmV4cG9ydEZpbGVBc0NzdihkYXRhRmlsZSwgZmlsZU5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgJHNlcXVlbmNlID0gTWF0aC5yb3VuZChyZXNwb25zZVsnQ291bnQnXSAvIHJvd1BlclBhZ2UpO1xuICAgICAgICBpZiAoJHNlcXVlbmNlID4gMSAmJiAkc2VxdWVuY2UgPiBwYWdlTm8pIHtcbiAgICAgICAgICBwYWdlTm8gPSBwYWdlTm8gKyAxO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZWFyY2goYXBpVXJsLCBwYWdlTm8sIHJvd1BlclBhZ2UsIG9yZGVyQnksIHRydWUsIGFkZENyaXQsIElzRXhwb3J0RXhjZWwsIGV4dEZpbGUpLCA1MCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvL2hhbmRsZSBpZiByZXNwb25zZSBkYXRhIGlzIG51bGxcbiAgICAgIGlmIChyZXNwb25zZVtcIkRhdGFcIl0gPT09IG51bGwpIHtcbiAgICAgICAgcmVzcG9uc2VbXCJEYXRhXCJdID0gW107XG4gICAgICB9XG4gICAgICBsZXQgcXJ5UGFnaW5nID0ge1xuICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsXG4gICAgICAgIHBhZ2VOb3c6IHBhZ2VOb1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2cocXJ5UGFnaW5nKTtcbiAgICAgIHRoaXMucmVzdWx0LmVtaXQocXJ5UGFnaW5nKTtcbiAgICAgIHRoaXMucmVxR2V0QWxsRGF0YS5lbWl0KHJlcXVlc3QpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJEdXBsaWNhdGVEYXRhKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgX3ZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgcmV0dXJuIGluZGV4ID09PSBkYXRhLmZpbmRJbmRleChvYmogPT4ge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKSA9PT0gX3ZhbHVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckxpc3RWYWx1ZUVtcHR5KGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUubGlzdFZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZS5saXN0VmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVUcmFpbGluZ0JhY2tzbGFzaGVzQWZ0ZXJQZXJjZW50KHN0cikge1xuICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBzdHI/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lKFxcXFwrKSQvLCAnJScpO1xuICB9XG5cbiAgY2hlY2tWYWx1ZUd0ZUx0ZShjb21wb25lbnQpIHtcbiAgICAvL2NlayB5ZyBwYWthaSByZXN0cmljdGlvbiBndGUvbHRlL2d0L2x0XG4gICAgbGV0IE1pbkNvbXBvbmVudCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCIpKTtcbiAgICBpZiAoIU1pbkNvbXBvbmVudCkge1xuICAgICAgTWluQ29tcG9uZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiKSlcbiAgICB9XG5cbiAgICBsZXQgTWF4Q29tcG9uZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVEVcIikpO1xuICAgIGlmICghTWF4Q29tcG9uZW50KSB7XG4gICAgICBNYXhDb21wb25lbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxUXCIpKVxuICAgIH1cblxuICAgIGlmIChNaW5Db21wb25lbnQgJiYgTWF4Q29tcG9uZW50KSB7XG4gICAgICBsZXQgbWluVmFsdWUgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01pbkNvbXBvbmVudC5pZF0udmFsdWVBc051bWJlcjtcbiAgICAgIGxldCBtYXhWYWx1ZSA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbTWF4Q29tcG9uZW50LmlkXS52YWx1ZUFzTnVtYmVyO1xuICAgICAgaWYgKG1pblZhbHVlID4gbWF4VmFsdWUpIHtcbiAgICAgICAgdGhpcy50b2FzdHIud2FybmluZyhNaW5Db21wb25lbnQubGFiZWwgKyBcIiBtdXN0IGJlIGxlc3MgdGhhbiBcIiArIE1heENvbXBvbmVudC5sYWJlbCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG1hcERhdGFGaWxlKGJvZHlMaXN0RGF0YSwgYm9keURhdGFBcnIsIGhlYWRlckxpc3REYXRhKSB7XG4gICAgbGV0IGRhdGFFeGNlbCA9IG5ldyBBcnJheSgpO1xuICAgIGxldCBib2R5RGF0YVRlbXAgPSBuZXcgQXJyYXkoKTtcbiAgICBsZXQgaGVhZGVyRGF0YVRlbXAgPSBuZXcgQXJyYXkoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9keUxpc3REYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBbaXNOZWVkVG9QdXNoLCBib2R5RGF0YSwgaGVhZGVyRGF0YV0gPSB0aGlzLmNoZWNrTmVlZERhdGFUb0V4cG9ydChib2R5TGlzdERhdGEsIGhlYWRlckxpc3REYXRhLCBpKTtcbiAgICAgIGlmIChpc05lZWRUb1B1c2gpIHtcbiAgICAgICAgYm9keURhdGFUZW1wLnB1c2goYm9keURhdGEpO1xuICAgICAgICBoZWFkZXJEYXRhVGVtcC5wdXNoKGhlYWRlckRhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9keURhdGFBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBmaW5hbERhdGEgPSB7fTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYm9keURhdGFUZW1wLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYm9keURhdGFBcnJbaV1bYm9keURhdGFUZW1wW2pdXTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgZmluYWxEYXRhW2hlYWRlckRhdGFUZW1wW2pdXSA9IHZhbHVlID8gXCJZRVNcIiA6IFwiTk9cIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWxEYXRhW2hlYWRlckRhdGFUZW1wW2pdXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGF0YUV4Y2VsLnB1c2goZmluYWxEYXRhKVxuICAgIH1cbiAgICByZXR1cm4gZGF0YUV4Y2VsO1xuICB9XG5cbiAgY2hlY2tBZGRpdGlvbmFsRXhwb3J0TGlzdChoZWFkZXJMaXN0RGF0YSwgYm9keUxpc3REYXRhLCBhZGRpdGlvbmFsRXhwb3J0TGlzdCkge1xuICAgIGlmIChhZGRpdGlvbmFsRXhwb3J0TGlzdCA9PSB1bmRlZmluZWQpIHJldHVybiBbaGVhZGVyTGlzdERhdGEsIGJvZHlMaXN0RGF0YV07XG4gICAgaWYgKGFkZGl0aW9uYWxFeHBvcnRMaXN0Lmxlbmd0aCA9PSAwKSByZXR1cm4gW2hlYWRlckxpc3REYXRhLCBib2R5TGlzdERhdGFdO1xuXG4gICAgY29uc3QgX2hlYWRlckxpc3QgPSBbLi4uaGVhZGVyTGlzdERhdGFdO1xuICAgIGNvbnN0IF9ib2R5TGlzdCA9IFsuLi5ib2R5TGlzdERhdGFdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsRXhwb3J0TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgX2hlYWRlckxpc3QucHVzaCh7IGxhYmVsOiBhZGRpdGlvbmFsRXhwb3J0TGlzdFtpXS5sYWJlbCB9KTtcbiAgICAgIF9ib2R5TGlzdC5wdXNoKHsgcHJvcGVydHk6IGFkZGl0aW9uYWxFeHBvcnRMaXN0W2ldLnByb3BlcnR5IH0pO1xuICAgIH1cblxuICAgIHJldHVybiBbX2hlYWRlckxpc3QsIF9ib2R5TGlzdF07XG4gIH1cblxuICBjaGVja0V4Y2x1ZGVFeHBvcnRMaXN0KGhlYWRlckxpc3REYXRhLCBib2R5TGlzdERhdGEsIGV4Y2x1ZGVFeHBvcnRMaXN0KSB7XG4gICAgaWYgKGV4Y2x1ZGVFeHBvcnRMaXN0ID09IHVuZGVmaW5lZCkgcmV0dXJuIFtoZWFkZXJMaXN0RGF0YSwgYm9keUxpc3REYXRhXTtcbiAgICBpZiAoZXhjbHVkZUV4cG9ydExpc3QubGVuZ3RoID09IDApIHJldHVybiBbaGVhZGVyTGlzdERhdGEsIGJvZHlMaXN0RGF0YV07XG5cbiAgICBjb25zdCBfaGVhZGVyTGlzdCA9IFsuLi5oZWFkZXJMaXN0RGF0YV07XG4gICAgY29uc3QgX2JvZHlMaXN0ID0gWy4uLmJvZHlMaXN0RGF0YV07XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4Y2x1ZGVFeHBvcnRMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgaW5kZXggPSBfYm9keUxpc3QuZmluZEluZGV4KChlbGVtZW50KSA9PiBlbGVtZW50LnByb3BlcnR5ID09IGV4Y2x1ZGVFeHBvcnRMaXN0W2ldLnByb3BlcnR5KTtcbiAgICAgIGlmIChpbmRleCAhPSAtMSkge1xuICAgICAgICBfaGVhZGVyTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBfYm9keUxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW19oZWFkZXJMaXN0LCBfYm9keUxpc3RdO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja05lZWREYXRhVG9FeHBvcnQoYm9keUxpc3REYXRhOiBBcnJheTxhbnk+LCBoZWFkZXJMaXN0RGF0YTogQXJyYXk8YW55PiwgaWR4OiBudW1iZXIpIHtcbiAgICAvLyBhZGQganNvbiBjaGVja2VyIGZvciBkYXRhIHRvIGV4cG9ydCBoZXJlXG4gICAgaWYgKGJvZHlMaXN0RGF0YVtpZHhdWyd0eXBlJ10gIT0gJ2FjdGlvbicpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHRydWUsXG4gICAgICAgIGJvZHlMaXN0RGF0YVtpZHhdWydwcm9wZXJ0eSddLFxuICAgICAgICBoZWFkZXJMaXN0RGF0YVtpZHhdWydsYWJlbCddXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbnM6IGFueVtdID0gYm9keUxpc3REYXRhW2lkeF1bJ2FjdGlvbiddO1xuICAgIGlmIChib2R5TGlzdERhdGFbaWR4XVsndHlwZSddID09ICdhY3Rpb24nICYmIGFjdGlvbnNbMF1bJ3R5cGUnXSA9PSAnc3dpdGNoJ1xuICAgICAgJiYgQm9vbGVhbihhY3Rpb25zWzBdWydjYXNlJ11bMF1bJ3Jlc3VsdCddWydwcm9wZXJ0eSddKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgYm9keUxpc3REYXRhW2lkeF1bJ2FjdGlvbiddWzBdWydjYXNlJ11bMF1bJ3Jlc3VsdCddWydwcm9wZXJ0eSddLFxuICAgICAgICBoZWFkZXJMaXN0RGF0YVtpZHhdWydsYWJlbCddXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gW2ZhbHNlLCBbXSwgW11dO1xuICB9XG5cbiAgR2VuZXJhdGVSZXBvcnQoZW5qaUZvcm06IGFueSkge1xuICAgIHRoaXMuZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHJldHVybjtcbiAgICBjb25zdCBfZXhwb3J0VHlwZSA9IHRoaXMuZm9ybS5nZXQoXCJFeHBvcnRUeXBlXCIpLnZhbHVlO1xuICAgIGNvbnN0IF9ycHRFeGVjVHlwZSA9IHRoaXMuZm9ybS5nZXQoXCJScHRFeGVjVHlwZVwiKS52YWx1ZTtcbiAgICB0aGlzLmdlblJwdC5lbWl0KHsgRXhwb3J0VHlwZTogX2V4cG9ydFR5cGUsIFJwdEV4ZWNUeXBlOiBfcnB0RXhlY1R5cGUsICBFbFJlZjogdGhpcy5teUZvcm0sIGZvcm1SYXc6IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpIH0pO1xuICB9XG5cbiAgbGVzc1RoYW5Gb3VyKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNvdW50Rm9ybSA+IDMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXNvbHZlT2JqZWN0KG9iajogYW55LCB1cmw6IHN0cmluZywgY3JpdDogUmVxdWVzdENyaXRlcmlhT2JqID0gbnVsbCkge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMucG9zdEpTT04odXJsLCBjcml0KTtcbiAgICB2YWwuc3Vic2NyaWJlKHRlbXBEYXRhID0+IHtcbiAgICAgIGlmIChvYmouY3VzdG9tT2JqTmFtZSA9PSBudWxsIHx8IG9iai5jdXN0b21PYmpOYW1lID09IHVuZGVmaW5lZCB8fCBvYmouY3VzdG9tT2JqTmFtZSA9PSBcIlwiKSB7XG4gICAgICAgIG9iai5jdXN0b21PYmpOYW1lID0gXCJSZXR1cm5PYmplY3RcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9iai5jdXN0b21LZXlOYW1lID09IG51bGwgfHwgb2JqLmN1c3RvbUtleU5hbWUgPT0gdW5kZWZpbmVkIHx8IG9iai5jdXN0b21LZXlOYW1lID09IFwiXCIpIHtcbiAgICAgICAgb2JqLmN1c3RvbUtleU5hbWUgPSBcIktleVwiO1xuICAgICAgfVxuXG4gICAgICBpZiAob2JqLmN1c3RvbVZhbHVlTmFtZSA9PSBudWxsIHx8IG9iai5jdXN0b21WYWx1ZU5hbWUgPT0gdW5kZWZpbmVkIHx8IG9iai5jdXN0b21WYWx1ZU5hbWUgPT0gXCJcIikge1xuICAgICAgICBvYmouY3VzdG9tVmFsdWVOYW1lID0gXCJWYWx1ZVwiO1xuICAgICAgfVxuICAgICAgY29uc3QgX2RhdGEgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVtcERhdGFbb2JqLmN1c3RvbU9iak5hbWVdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIF9kYXRhLnB1c2goe1xuICAgICAgICAgIEtleTogdGVtcERhdGFbb2JqLmN1c3RvbU9iak5hbWVdW2ldW29iai5jdXN0b21LZXlOYW1lXSxcbiAgICAgICAgICBWYWx1ZTogdGVtcERhdGFbb2JqLmN1c3RvbU9iak5hbWVdW2ldW29iai5jdXN0b21WYWx1ZU5hbWVdXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBvYmouaXRlbXNVcmwgPSBuZXcgQXJyYXkoKTtcbiAgICAgIGNvbnN0IHVzZXJBY2Nlc3MgPSB0aGlzLmdldFVzZXJBY2Nlc3MoKTtcbiAgICAgIFxuICAgICAgaWYob2JqLnR5cGUgPT0gXCJvZmZpY2VSb2xlQ29kZXNcIiAmJiBvYmouaXNMb2NrSG8gJiYgdXNlckFjY2Vzc1tcIk1yT2ZmaWNlVHlwZUNvZGVcIl0gPT0gXCJIT1wiKXtcbiAgICAgICAgbGV0IGtleVZhbHVlT2JqID0ge0tleTogdXNlckFjY2Vzc1tcIk9mZmljZUNvZGVcIl0sIFZhbHVlOiB1c2VyQWNjZXNzW1wiT2ZmaWNlTmFtZVwiXX07XG4gICAgICAgIG9iai5pdGVtc1VybC5wdXNoKGtleVZhbHVlT2JqKTtcbiAgICAgIH1lbHNle1xuICAgICAgICBvYmouaXRlbXNVcmwgPSBfZGF0YTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9iai5leGNsdWRlICE9IHVuZGVmaW5lZCAmJiBvYmouZXhjbHVkZSAhPSBcIlwiKSB7XG4gICAgICAgIG9iai5pdGVtc1VybCA9IG9iai5pdGVtc1VybC5maWx0ZXIoKHZhbHVlKSA9PiAhb2JqLmV4Y2x1ZGUuaW5jbHVkZXModmFsdWUuS2V5KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvYmouaXRlbXNVcmwubGVuZ3RoID09IDEpIHtcbiAgICAgICAgb2JqLnZhbHVlID0gb2JqLml0ZW1zVXJsWzBdLktleTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9iai50eXBlID09IFwiZHJvcGRvd25TZWFyY2hcIiAmJiBvYmouaXRlbXNVcmwubGVuZ3RoID09IDEpIHtcbiAgICAgICAgb2JqLnZhbHVlID0gb2JqLml0ZW1zVXJsWzBdLktleTtcbiAgICAgICAgb2JqLmRlc2NyID0gb2JqLml0ZW1zVXJsWzBdLlZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5hZmZlY3RlZEZpbHRlciAmJiBvYmouaXRlbXNVcmwubGVuZ3RoID09IDEpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUV2ZW50KG9iai5pdGVtc1VybFswXS5LZXksIG9iaik7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUtleVZhbERpY3Qoe1xuICAgICAgICBrZXk6IG9iai5uYW1lLFxuICAgICAgICB2YWx1ZTogb2JqLnZhbHVlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvYmoudXNlRmlyc3RWYWx1ZSAmJiBvYmouaXRlbXNVcmwubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbb2JqLm5hbWVdLnNldFZhbHVlKG9iai5pdGVtc1VybFswXS5LZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJhbnNmb3JtVG9EZWNpbWFsKGVsZW1lbnQ6IGFueSkge1xuICAgIGVsZW1lbnQudGFyZ2V0LnZhbHVlID0gcGFyc2VGbG9hdChlbGVtZW50LnRhcmdldC52YWx1ZS50b1N0cmluZygpLnJlcGxhY2UoLywvZywgJycpKTtcbiAgfVxuXG4gIGV4cG9ydEFzRmlsZShleHRGaWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaENsaWNrKHRydWUsIGV4dEZpbGUpO1xuICB9XG5cbiAgb25DaGFuZ2VFdmVudChvcHRWYWx1ZSwgYWZGaWx0ZXIpIHtcbiAgICBsZXQganNvbkNvbXAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50O1xuICAgIHRoaXMudXBkYXRlS2V5VmFsRGljdCh7IGtleTogYWZGaWx0ZXIubmFtZSwgdmFsdWU6IGFmRmlsdGVyLnZhbHVlIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZkZpbHRlci5hZmZlY3RlZEZpbHRlci5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBqc29uQ29tcC5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoanNvbkNvbXBbal0ubmFtZSA9PSBhZkZpbHRlci5hZmZlY3RlZEZpbHRlcltpXSkge1xuICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3RDcml0ZXJpYU9iaigpO1xuICAgICAgICAgIGxldCBhcnJheUNyaXQgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAgIGlmIChvcHRWYWx1ZSAhPSBcImFsbFwiICYmIG9wdFZhbHVlICE9IFwib25lXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IF9jcml0UHJvcE5hbWVBcnIgPSBqc29uQ29tcFtqXS5jcml0ZXJpYVByb3BOYW1lLnNwbGl0KFwiO1wiKTtcbiAgICAgICAgICAgIGlmIChfY3JpdFByb3BOYW1lQXJyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgY29uc3QgX2NyaXRQcm9wVmFsdWVBcnIgPSBqc29uQ29tcFtqXS5jcml0ZXJpYVByb3BWYWx1ZS5zcGxpdChcIjtcIik7XG4gICAgICAgICAgICAgIGZvciAobGV0IFtpbmRleCwgaXRlbV0gb2YgX2NyaXRQcm9wTmFtZUFyci5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcml0T2JqID0gbmV3IENyaXRlcmlhT2JqKCk7XG4gICAgICAgICAgICAgICAgY3JpdE9iai5EYXRhVHlwZSA9IGFmRmlsdGVyLmRhdGF0eXBlO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSBhZkZpbHRlci5maWx0ZXJQcm9wTmFtZSkge1xuICAgICAgICAgICAgICAgICAgcmVxdWVzdFtpdGVtXSA9IG9wdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IG9wdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZURpY3RbaXRlbV0gPSBvcHRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uaW5jbHVkZXMoXCJkaWN0cy5cIikpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0T2JqRGF0YShcImRpY3RzXCIsIGl0ZW0sIGFmRmlsdGVyLCByZXF1ZXN0LCBvcHRWYWx1ZSwgY3JpdE9iaiwgX2NyaXRQcm9wVmFsdWVBcnIsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uaW5jbHVkZXMoXCJsb29rdXAuXCIpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmdldE9iakRhdGEoXCJsb29rdXBcIiwgaXRlbSwgYWZGaWx0ZXIsIHJlcXVlc3QsIG9wdFZhbHVlLCBjcml0T2JqLCBfY3JpdFByb3BWYWx1ZUFyciwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZURpY3RbaXRlbV0pIHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RbaXRlbV0gPSB0aGlzLnZhbHVlRGljdFtpdGVtXTtcbiAgICAgICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSB0aGlzLnZhbHVlRGljdFtpdGVtXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmVxdWVzdFtpdGVtXSA9IF9jcml0UHJvcFZhbHVlQXJyW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBfY3JpdFByb3BWYWx1ZUFycltpbmRleF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBpdGVtO1xuICAgICAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uRXE7XG4gICAgICAgICAgICAgICAgYXJyYXlDcml0LnB1c2goY3JpdE9iaik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNyaXRPYmogPSBuZXcgQ3JpdGVyaWFPYmooKTtcbiAgICAgICAgICAgICAgY3JpdE9iai5EYXRhVHlwZSA9IGFmRmlsdGVyLmRhdGF0eXBlO1xuICAgICAgICAgICAgICBpZiAoYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWUgIT0gdW5kZWZpbmVkIHx8IGFmRmlsdGVyLmZpbHRlclByb3BOYW1lICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0W2FmRmlsdGVyLmZpbHRlclByb3BOYW1lXSA9IG9wdFZhbHVlO1xuICAgICAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBhZkZpbHRlci5maWx0ZXJQcm9wTmFtZTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlRGljdFthZkZpbHRlci5maWx0ZXJQcm9wTmFtZV0gPSBvcHRWYWx1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gYWZGaWx0ZXIubmFtZTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0W2FmRmlsdGVyLm5hbWVdID0gb3B0VmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IG9wdFZhbHVlO1xuICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkVxO1xuICAgICAgICAgICAgICBhcnJheUNyaXQucHVzaChjcml0T2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wdFZhbHVlID09IFwiYWxsXCIgfHwgb3B0VmFsdWUgPT0gXCJvdGhlcnNcIikge1xuICAgICAgICAgICAgbGV0IGNyaXRPYmogPSBuZXcgQ3JpdGVyaWFPYmooKTtcbiAgICAgICAgICAgIGFycmF5Q3JpdC5wdXNoKGNyaXRPYmopO1xuICAgICAgICAgICAganNvbkNvbXBbal0udmFsdWUgPSBvcHRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVxdWVzdC5jcml0ZXJpYSA9IGFycmF5Q3JpdDtcbiAgICAgICAgICBpZiAoanNvbkNvbXBbal0ucGF0aCAhPSB1bmRlZmluZWQgJiYganNvbkNvbXBbal0ucGF0aCAhPSBcIlwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgICAgICAgICBpZiAoanNvbkNvbXBbal0uZW52aXJvbm1lbnQgPT0gdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzW3ldLmVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAgICAgICBqc29uQ29tcFtqXS5mdWxscGF0aCA9IHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50c1t5XS51cmwgKyBqc29uQ29tcFtqXS5wYXRoO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBqc29uQ29tcFtqXS5mdWxscGF0aCA9IGpzb25Db21wW2pdLnVybDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqc29uQ29tcFtqXS5mdWxscGF0aCA9IGpzb25Db21wW2pdLnVybDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5yZXNvbHZlT2JqZWN0KGpzb25Db21wW2pdLCBqc29uQ29tcFtqXS5mdWxscGF0aCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE9iakRhdGEodHlwZTogXCJsb29rdXBcIiB8IFwiZGljdHNcIiwgaXRlbTogYW55LCBhZkZpbHRlcjogYW55LCByZXF1ZXN0OiBSZXF1ZXN0Q3JpdGVyaWFPYmosIG9wdFZhbHVlOiBhbnksIGNyaXRPYmo6IENyaXRlcmlhT2JqLCBfY3JpdFByb3BWYWx1ZUFycjogYW55LCBpbmRleDogYW55KSB7XG4gICAgbGV0IF9vYmpEaWN0cyA9IHRoaXMudmFsdWVEaWN0O1xuICAgIGlmICh0eXBlID09PSBcImxvb2t1cFwiKSB7XG4gICAgICBfb2JqRGljdHMgPSB0aGlzLmxvb2t1cERpY3RcbiAgICB9XG4gICAgY29uc3QgX2l0ZW0gPSBpdGVtLnNwbGl0KFwiLlwiKTtcbiAgICBpZiAoX2l0ZW1bMV0gPT09IGFmRmlsdGVyLmZpbHRlclByb3BOYW1lKSB7XG4gICAgICByZXF1ZXN0W19pdGVtWzFdXSA9IG9wdFZhbHVlO1xuICAgICAgY3JpdE9iai52YWx1ZSA9IG9wdFZhbHVlO1xuICAgICAgX29iakRpY3RzW19pdGVtWzFdXSA9IG9wdFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoX29iakRpY3RzW19pdGVtWzFdXSkge1xuICAgICAgcmVxdWVzdFtfaXRlbVsxXV0gPSBfb2JqRGljdHNbX2l0ZW1bMV1dO1xuICAgICAgY3JpdE9iai52YWx1ZSA9IF9vYmpEaWN0c1tfaXRlbVsxXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3RbX2l0ZW1bMV1dID0gX2NyaXRQcm9wVmFsdWVBcnJbaW5kZXhdO1xuICAgICAgY3JpdE9iai52YWx1ZSA9IF9jcml0UHJvcFZhbHVlQXJyW2luZGV4XTtcbiAgICB9XG4gIH1cblxuICBTZXRQcm9jZXNzS2V5KGlkeDogbnVtYmVyLCB3ZktleUZpbHRlcjogc3RyaW5nKSB7XG4gICAgbGV0IGNvbXBvbmVudCA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbaWR4XTtcbiAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XG4gICAgbGV0IHRleHQ6IHN0cmluZyA9IGRkbFtkZGwuc2VsZWN0ZWRJbmRleF0udmFsdWUudHJpbSgpO1xuICAgIGxldCBsaXN0VmFsdWUgPSB0ZXh0LnNwbGl0KCc7Jyk7XG4gICAgbGV0IGxpc3RXZktleSA9IHdmS2V5RmlsdGVyLnNwbGl0KCc7Jyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zZWFyY2hJbnB1dC5pbnRlZ3JhdGlvbk9iai5yZXF1ZXN0T2JqW2xpc3RXZktleVtpXV0gPSBsaXN0VmFsdWVbaV07XG4gICAgfVxuXG4gIH1cblxuICBzd2l0Y2hDYXNlKGNvbmRMaXN0KSB7XG4gICAgbGV0IGNvbmRpdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kTGlzdC5jb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgaWR4ID0gdGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZS5maW5kSW5kZXgoeCA9PiB4LnByb3BlcnR5ID09IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucHJvcGVydHkpO1xuICAgICAgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJFUVwiKSB7XG4gICAgICAgIGlmICghY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID09IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCB1c2VybmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiVXNlcm5hbWVcIik7XG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA9PSB1c2VybmFtZSkge1xuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5yZXN0cmljdGlvbiA9PSBcIk5FUVwiKSB7XG4gICAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlciAhPSB0cnVlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSAhPSBjb25kTGlzdC5jb25kaXRpb25zW2ldLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgIT0gdXNlcm5hbWUpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJHVFwiKSB7XG4gICAgICAgIGlmICghY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID4gY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID4gdXNlcm5hbWUpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJHVEVcIikge1xuICAgICAgICBpZiAoIWNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA+PSBjb25kTGlzdC5jb25kaXRpb25zW2ldLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPj0gdXNlcm5hbWUpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJMVFwiKSB7XG4gICAgICAgIGlmICghY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlIDwgY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlIDwgdXNlcm5hbWUpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJMVEVcIikge1xuICAgICAgICBpZiAoIWNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8PSBjb25kTGlzdC5jb25kaXRpb25zW2ldLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPD0gdXNlcm5hbWUpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25kaXRpb247XG5cbiAgfVxuXG4gIHByaXZhdGUgRGVjcnlwdFN0cmluZyhjaGlwcGVyVGV4dDogc3RyaW5nLCBjaGlwcGVyS2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICBjaGlwcGVyS2V5ID09IHVuZGVmaW5lZCB8fCBjaGlwcGVyS2V5LnRyaW0oKSA9PSAnJyB8fFxuICAgICAgY2hpcHBlclRleHQgPT0gdW5kZWZpbmVkIHx8IGNoaXBwZXJUZXh0LnRyaW0oKSA9PSAnJ1xuICAgICkgcmV0dXJuIGNoaXBwZXJUZXh0O1xuICAgIGxldCBjaGlwcGVyS2V5QXJyID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoY2hpcHBlcktleSk7XG4gICAgbGV0IGl2ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKTtcbiAgICBsZXQgZGVjcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoY2hpcHBlclRleHQsIGNoaXBwZXJLZXlBcnIsIHsgaXY6IGl2IH0pO1xuICAgIGxldCBwbGFpblRleHQgPSBkZWNyeXB0ZWQudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xuICAgIHJldHVybiBwbGFpblRleHQ7XG4gIH1cblxuICBjaGVja0lucHV0RGF0ZShjb21wb25lbnQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIGxldCBkYXRlV3JvbmcgPSBmYWxzZTtcbiAgICBjb25zdCBfY29tcG9uZW50VmFsdWUgPSB0aGlzLmZvcm0uY29udHJvbHNbY29tcG9uZW50Lm5hbWUraW5kZXhdLnZhbHVlO1xuICAgIGRhdGVXcm9uZyA9IHRoaXMuY2hlY2tNaW5NYXhWYWxpZGF0aW9uKGNvbXBvbmVudCk7XG4gICAgbGV0IHVkcGF0ZWRWYWx1ZSA9IG51bGw7XG4gICAgaWYgKHRoaXMuaXNWYWxpZERhdGUoX2NvbXBvbmVudFZhbHVlKSkge1xuICAgICAgdWRwYXRlZFZhbHVlID0gZm9ybWF0RGF0ZShuZXcgRGF0ZShfY29tcG9uZW50VmFsdWUpLCBcInl5eXktTU0tZGRcIiwgJ2VuLVVTJylcbiAgICB9XG4gICAgdGhpcy51cGRhdGVLZXlWYWxEaWN0KHtcbiAgICAgIGtleTogY29tcG9uZW50Lm5hbWUsXG4gICAgICB2YWx1ZTogdWRwYXRlZFZhbHVlLFxuICAgIH0pO1xuXG4gICAgaWYgKCFkYXRlV3JvbmcpIHtcbiAgICAgIHRoaXMudXBkYXRlTWluTWF4RGF0ZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IF9jb21wb25lbnRWYWx1ZSxcbiAgICAgICAgZGF0ZXBpY2tlclBhaXI6IGNvbXBvbmVudC5kYXRlcGlja2VyUGFpcixcbiAgICAgICAgcmVzdHJpY3Rpb246IGNvbXBvbmVudC5yZXN0cmljdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNaW5NYXhWYWxpZGF0aW9uKGNvbXBvbmVudDogYW55KSB7XG4gICAgbGV0IG1pbkRhdGVWYWw7XG4gICAgbGV0IG1heERhdGVWYWw7XG4gICAgbGV0IGxhYmVsO1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGxldCBkYXRlV3JvbmcgPSBmYWxzZTtcbiAgICBjb25zdCBuYXRpdmVFbCA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnQuZWxlbWVudHM7XG4gICAgY29uc3QgX2NvbXAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50O1xuXG4gICAgbGV0IG1pbkNvbXBvbmVudElkeCA9IF9jb21wLmZpbmRJbmRleCh4ID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCIpKSA9PT0gLTEgPyBfY29tcC5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdUXCIpKSA6IF9jb21wLmZpbmRJbmRleCh4ID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCIpKTtcbiAgICBpZiAobWluQ29tcG9uZW50SWR4ICE9PSAtMSkge1xuICAgICAgY29uc3QgX21pbkNvbXBvbmVudE5hbWUgPSBfY29tcFttaW5Db21wb25lbnRJZHhdLm5hbWUgKyBtaW5Db21wb25lbnRJZHg7XG4gICAgICBtaW5EYXRlVmFsID0gdGhpcy5pc1ZhbGlkRGF0ZShuYXRpdmVFbFtfbWluQ29tcG9uZW50TmFtZV0ubWluKSA/IG5ldyBEYXRlKG5hdGl2ZUVsW19taW5Db21wb25lbnROYW1lXS5taW4pIDogbnVsbDtcbiAgICAgIGxhYmVsID0gX2NvbXBbbWluQ29tcG9uZW50SWR4XS5sYWJlbC5zcGxpdChcIj5cIiwgMik7XG4gICAgICBpZiAobWluRGF0ZVZhbCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChfY29tcFttaW5Db21wb25lbnRJZHhdLnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiKSB7XG4gICAgICAgICAgbWluRGF0ZVZhbC5zZXREYXRlKG1pbkRhdGVWYWwuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlLnB1c2goXCIgbXVzdCBiZSBncmVhdGVyIHRoYW4gXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKF9jb21wW21pbkNvbXBvbmVudElkeF0ucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiKSB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlLnB1c2goXCIgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWxzIHRvIFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBtYXhDb21wb25lbnRJZHggPSBfY29tcC5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiKSkgPT09IC0xID8gX2NvbXAuZmluZEluZGV4KHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVFwiKSkgOiBfY29tcC5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiKSk7XG4gICAgaWYgKG1heENvbXBvbmVudElkeCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IF9tYXhDb21wb25lbnROYW1lID0gX2NvbXBbbWF4Q29tcG9uZW50SWR4XS5uYW1lICsgbWF4Q29tcG9uZW50SWR4O1xuICAgICAgbWF4RGF0ZVZhbCA9IHRoaXMuaXNWYWxpZERhdGUobmF0aXZlRWxbX21heENvbXBvbmVudE5hbWVdLm1heCkgPyBuZXcgRGF0ZShuYXRpdmVFbFtfbWF4Q29tcG9uZW50TmFtZV0ubWF4KSA6IG51bGw7XG4gICAgICBsYWJlbCA9IF9jb21wW21heENvbXBvbmVudElkeF0ubGFiZWwuc3BsaXQoXCI8XCIsIDIpO1xuICAgICAgaWYgKG1heERhdGVWYWwgIT0gbnVsbCkge1xuICAgICAgICBpZiAoX2NvbXBbbWF4Q29tcG9uZW50SWR4XS5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRcIikge1xuICAgICAgICAgIG1heERhdGVWYWwuc2V0RGF0ZShtYXhEYXRlVmFsLmdldERhdGUoKSArIDEpO1xuICAgICAgICAgIGVycm9yTWVzc2FnZS5wdXNoKFwiIG11c3QgYmUgbGVzcyB0aGFuIFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChfY29tcFttYXhDb21wb25lbnRJZHhdLnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVEVcIikge1xuICAgICAgICAgIGVycm9yTWVzc2FnZS5wdXNoKFwiIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFscyB0byBcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWluRGF0ZVZhbCAhPSBudWxsICYmIG1heERhdGVWYWwgPT0gbnVsbCAmJiBuZXcgRGF0ZSh0aGlzLmZvcm0uY29udHJvbHNbX2NvbXBbbWluQ29tcG9uZW50SWR4XS5uYW1lICsgbWluQ29tcG9uZW50SWR4XS52YWx1ZSkgPCBtaW5EYXRlVmFsKSB7XG4gICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKGxhYmVsWzBdICsgZXJyb3JNZXNzYWdlWzBdICsgZm9ybWF0RGF0ZShtaW5EYXRlVmFsLCAnZGQgTU1NTSB5eXl5JywgJ2VuLVVTJykgKyBcIi5cIik7XG4gICAgICBkYXRlV3JvbmcgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWF4RGF0ZVZhbCAhPSBudWxsICYmIG1pbkRhdGVWYWwgPT0gbnVsbCAmJiBuZXcgRGF0ZSh0aGlzLmZvcm0uY29udHJvbHNbX2NvbXBbbWF4Q29tcG9uZW50SWR4XS5uYW1lICsgbWF4Q29tcG9uZW50SWR4XS52YWx1ZSkgPiBtYXhEYXRlVmFsKSB7XG4gICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKGxhYmVsWzBdICsgZXJyb3JNZXNzYWdlWzBdICsgZm9ybWF0RGF0ZShtYXhEYXRlVmFsLCAnZGQgTU1NTSB5eXl5JywgJ2VuLVVTJykgKyBcIi5cIik7XG4gICAgICBkYXRlV3JvbmcgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWluRGF0ZVZhbCAhPSBudWxsICYmIG1heERhdGVWYWwgIT0gbnVsbCkge1xuICAgICAgaWYgKG5ldyBEYXRlKHRoaXMuZm9ybS5jb250cm9sc1tfY29tcFttYXhDb21wb25lbnRJZHhdLm5hbWUgKyBtYXhDb21wb25lbnRJZHhdLnZhbHVlKSA+IG1heERhdGVWYWwgfHwgbmV3IERhdGUodGhpcy5mb3JtLmNvbnRyb2xzW19jb21wW21pbkNvbXBvbmVudElkeF0ubmFtZSArIG1pbkNvbXBvbmVudElkeF0udmFsdWUpIDwgbWluRGF0ZVZhbCkge1xuICAgICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKGxhYmVsWzBdICsgZXJyb3JNZXNzYWdlWzBdICsgZm9ybWF0RGF0ZShtaW5EYXRlVmFsLCAnZGQgTU1NTSB5eXl5JywgJ2VuLVVTJykgKyBcIiBhbmRcIiArIGVycm9yTWVzc2FnZVsxXSArIGZvcm1hdERhdGUobWF4RGF0ZVZhbCwgJ2RkIE1NTU0geXl5eScsICdlbi1VUycpICsgXCIuXCIpO1xuICAgICAgICBkYXRlV3JvbmcgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0ZVdyb25nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGVXcm9uZyA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZVdyb25nO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNaW5NYXhEYXRlVmFsdWUob3B0czogYW55KSB7XG4gICAgY29uc3Qge3ZhbHVlLCBkYXRlcGlja2VyUGFpciwgcmVzdHJpY3Rpb259ID0gb3B0cztcblxuICAgIGNvbnN0IF9taW5Db21wcyA9IFtdO1xuICAgIGNvbnN0IF9tYXhDb21wcyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmVudHJpZXMoKSkge1xuICAgICAgaWYgKGl0ZW0uY29uZk1pbkRhdGUgPT09IGRhdGVwaWNrZXJQYWlyKSB7XG4gICAgICAgIF9taW5Db21wcy5wdXNoKHtcbiAgICAgICAgICBjb21wOiBpdGVtLFxuICAgICAgICAgIGluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS5jb25mTWF4RGF0ZSA9PT0gZGF0ZXBpY2tlclBhaXIpIHtcbiAgICAgICAgX21heENvbXBzLnB1c2goe1xuICAgICAgICAgIGNvbXA6IGl0ZW0sXG4gICAgICAgICAgaW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgICAgXG4gICAgaWYgKCFkYXRlcGlja2VyUGFpcikgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgbWluQ29tcG9uZW50IG9mIF9taW5Db21wcykge1xuICAgICBjb25zdCBfdmFsdWUgPSB2YWx1ZTtcbiAgICAgY29uc3QgX3Jlc3RyaWN0aW9uID0gbWluQ29tcG9uZW50LmNvbXAuZGF0ZXBpY2tlclBhaXIgPT09IGRhdGVwaWNrZXJQYWlyID8gcmVzdHJpY3Rpb24gOiBcIlwiO1xuICAgICAgaWYgKF92YWx1ZSAhPT0gbnVsbCAmJiBfdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGUobWluQ29tcG9uZW50LCAnY29uZk1heERhdGUnLCBfdmFsdWUsICdtYXhEYXRlJywgZGF0ZXBpY2tlclBhaXIpO1xuICAgICAgICBpZiAoX3Jlc3RyaWN0aW9uLnRvTG93ZXJDYXNlKCkgIT09ICdndGUnICYmIF9yZXN0cmljdGlvbi50b0xvd2VyQ2FzZSgpICE9PSBcImd0XCIpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGUobWluQ29tcG9uZW50LCAnY29uZk1pbkRhdGUnLCBfdmFsdWUsICdtaW5EYXRlJywgZGF0ZXBpY2tlclBhaXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICBcbiAgICBmb3IgKGNvbnN0IG1heENvbXBvbmVudCBvZiBfbWF4Q29tcHMpIHtcbiAgICAgIGNvbnN0IF92YWx1ZSA9IHZhbHVlO1xuICAgICAgY29uc3QgX3Jlc3RyaWN0aW9uID0gbWF4Q29tcG9uZW50LmNvbXAuZGF0ZXBpY2tlclBhaXIgPT09IGRhdGVwaWNrZXJQYWlyID8gcmVzdHJpY3Rpb24gOiBcIlwiO1xuICAgICAgaWYgKF92YWx1ZSAhPT0gbnVsbCAmJiBfdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGUobWF4Q29tcG9uZW50LCAnY29uZk1pbkRhdGUnLCBfdmFsdWUsICdtaW5EYXRlJywgZGF0ZXBpY2tlclBhaXIpO1xuICAgICAgICBpZiAoX3Jlc3RyaWN0aW9uLnRvTG93ZXJDYXNlKCkgIT09IFwibHRlXCIgJiYgX3Jlc3RyaWN0aW9uLnRvTG93ZXJDYXNlKCkgIT09IFwibHRcIikge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50RGF0ZShtYXhDb21wb25lbnQsICdjb25mTWF4RGF0ZScsIF92YWx1ZSwgJ21heERhdGUnLCBkYXRlcGlja2VyUGFpcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBtaW4vbWF4IGRhdGUgYW5kIGNvbXBvbmVudCB2YWx1ZVxuICB1cGRhdGVDb21wb25lbnREYXRlKGNvbXBPYmo6IGFueSwgY29uZkRhdGVLZXk6IHN0cmluZywgdmFsdWU6IGFueSwgZmxhZ0tleTogc3RyaW5nLCBkYXRlcGlja2VyUGFpcjogc3RyaW5nKSB7XG4gICAgY29uc3Qge2NvbXA6IGNvbXBvbmVudCwgaW5kZXh9ID0gY29tcE9iajtcbiAgICBpZiAoY29tcG9uZW50W2NvbmZEYXRlS2V5XSA9PT0gZGF0ZXBpY2tlclBhaXIpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgICAgICBjb21wb25lbnRbZmxhZ0tleV0gPSBcIlwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgX2NvbXBvbmVudFZhbHVlID0gdGhpcy5mb3JtLmNvbnRyb2xzW2NvbXBvbmVudC5uYW1lK2luZGV4XS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IF9mbGFnID0gdGhpcy5kYXRldGltZVNlcnZpY2UuQ2hlY2tEYXRlVHlwZShjb21wb25lbnRbYGFkZGl0aW9uJHtmbGFnS2V5WzBdLnRvVXBwZXJDYXNlKCl9JHtmbGFnS2V5LnNsaWNlKDEpfUNvbmZgXSA/PyBcImJkXCIpO1xuICAgICAgICAgICAgY29tcG9uZW50W2ZsYWdLZXldID0gdGhpcy5kYXRldGltZVNlcnZpY2UuR2V0TmV3RGF0ZShfZmxhZywgY29tcG9uZW50W2BhZGRpdGlvbiR7ZmxhZ0tleVswXS50b1VwcGVyQ2FzZSgpfSR7ZmxhZ0tleS5zbGljZSgxKX1Db25mYF0sIHZhbHVlKTtcbiAgICAgICAgICAgIGlmICgoZmxhZ0tleSA9PT0gJ21pbkRhdGUnICYmIF9jb21wb25lbnRWYWx1ZSA8IGNvbXBvbmVudC5taW5EYXRlKSB8fFxuICAgICAgICAgICAgICAgIChmbGFnS2V5ID09PSAnbWF4RGF0ZScgJiYgX2NvbXBvbmVudFZhbHVlID4gY29tcG9uZW50Lm1heERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2NvbXBvbmVudC5uYW1lXS5zZXRWYWx1ZShcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzZWxlY3RlZE9wdGlvbihpdGVtOiB7IEtleTogc3RyaW5nLCBWYWx1ZTogc3RyaW5nIH0sIGNyaXQ6IGFueSkge1xuICAgIGNyaXQuZGVzY3IgPSBpdGVtLlZhbHVlO1xuICAgIGNyaXQuaXNMaXN0SGlkZSA9IHRydWU7XG4gIH1cblxuICBPbkZvY3VzQ3VycihldjogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9PSBcIlwiICYmIHZhbHVlICE9PSAwICYmIHZhbHVlICE9PSBcIjBcIikgcmV0dXJuO1xuICAgIGV2LnRhcmdldC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBWYWxpZGF0ZURlZmF1bHRWYWx1ZShpdGVtOiBhbnkpIHtcbiAgICBjb25zdCBpdGVtVmFsdWUgPSBpdGVtLnZhbHVlO1xuICAgIGlmIChpdGVtVmFsdWUgIT09IFwiXCIgJiYgaXRlbVZhbHVlICE9PSAwICYmIGl0ZW1WYWx1ZSAhPT0gXCIwXCIpIHJldHVybjtcbiAgICBjb25zdCBfZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBpbnB1dFtuZy1yZWZsZWN0LW5hbWU9XCIke2l0ZW0ubmFtZX1cIl1gKTtcbiAgICBpZiAoX2VsID09PSBudWxsKSByZXR1cm47XG5cbiAgICBsZXQgdmFsID0gdGhpcy5nZW5lcmF0ZUN1cnJGb2NFbFZhbHVlKGl0ZW0pO1xuICAgIF9lbFtcInZhbHVlXCJdID0gdmFsO1xuICB9XG5cbiAgZ2V0TG9va3VwKGV2ZW50LCBjb21wb25lbnQpIHtcbiAgICBjb25zdCBfZXZlbnRPYmogPSB7XG4gICAgICBsb29rdXA6IHsuLi5ldmVudH1cbiAgICB9XG4gICAgdGhpcy5sb29rdXBEaWN0ID0gey4uLmV2ZW50fVxuICAgIGNvbnN0IF9sb29rdXBPYmogPSB0aGlzLnNlYXJjaElucHV0LmRpY3RMb29rdXBPYmpbY29tcG9uZW50Lm5hbWVdO1xuICAgIHRoaXMuZm9ybS5jb250cm9sc1tcImxvb2t1cF9pZF9cIiArIGNvbXBvbmVudC5uYW1lXS5zZXRWYWx1ZShfbG9va3VwT2JqLmlkU2VsZWN0KTtcbiAgICBpZiAoIV9sb29rdXBPYmouaXNFdmVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYWZmZWN0ZWRDcml0ZXJpYSA9IF9sb29rdXBPYmouYWZmZWN0ZWRDcml0ZXJpYTtcbiAgICBmb3IgKGxldCBpdGVtIG9mIGFmZmVjdGVkQ3JpdGVyaWEpIHtcbiAgICAgIGNvbnN0IF91cGRhdGVMb29rdXBPYmogPSB0aGlzLnNlYXJjaElucHV0LmRpY3RMb29rdXBPYmpbaXRlbS5rZXldO1xuICAgICAgX3VwZGF0ZUxvb2t1cE9iai5pc1JlYWR5ID0gZmFsc2U7XG5cbiAgICAgIGxldCBfdmFsdWUgPSBfbG9va3VwT2JqLmlkU2VsZWN0O1xuICAgICAgaWYgKGl0ZW0udmFsdWUgIT0gbnVsbCAmJiBpdGVtLnZhbHVlICE9IFwiXCIpIHtcbiAgICAgICAgaWYgKGl0ZW0udmFsdWUuaW5jbHVkZXMoXCJsb29rdXAuXCIpKSB7XG4gICAgICAgICAgY29uc3QgX3RlbXBWYWx1ZSA9IGl0ZW0udmFsdWUuc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgIF92YWx1ZSA9IF9ldmVudE9iai5sb29rdXBbX3RlbXBWYWx1ZV0gPz8gX3ZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghX3VwZGF0ZUxvb2t1cE9iai5vcmlnaW5hbEFkZENyaXQpIHtcbiAgICAgICAgX3VwZGF0ZUxvb2t1cE9iai5vcmlnaW5hbEFkZENyaXQgPSBbLi4uX3VwZGF0ZUxvb2t1cE9iai5hZGRDcml0SW5wdXRdXG4gICAgICB9IFxuICAgICAgX3VwZGF0ZUxvb2t1cE9iai5hZGRlZEFkZENyaXQgPSBbXTtcbiAgICAgIGNvbnN0IF9hZGRlZENyaXQgPSB7XG4gICAgICAgIHByb3BOYW1lOiBpdGVtLnByb3BOYW1lLFxuICAgICAgICByZXN0cmljdGlvbjogaXRlbS5yZXN0cmljdGlvbixcbiAgICAgICAgdmFsdWU6IF92YWx1ZSxcbiAgICAgICAgRGF0YVR5cGU6IFwidGV4dFwiLFxuICAgICAgICBoaWdoOiAwLFxuICAgICAgICBpc0NyaXRlcmlhRGF0YVRhYmxlOiBmYWxzZSxcbiAgICAgICAgbG93OiAwXG4gICAgICB9XG4gICAgICBfdXBkYXRlTG9va3VwT2JqLmFkZGVkQWRkQ3JpdC5wdXNoKF9hZGRlZENyaXQpO1xuICAgICAgX3VwZGF0ZUxvb2t1cE9iai5hZGRDcml0SW5wdXQgPSBbLi4uX3VwZGF0ZUxvb2t1cE9iai5vcmlnaW5hbEFkZENyaXQsIC4uLl91cGRhdGVMb29rdXBPYmouYWRkZWRBZGRDcml0XVxuICAgICAgdGhpcy5zZWFyY2hJbnB1dC5kaWN0TG9va3VwT2JqW2l0ZW0ua2V5XSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoX3VwZGF0ZUxvb2t1cE9iaikpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlYXJjaElucHV0LmRpY3RMb29rdXBPYmpbaXRlbS5rZXldLmlzUmVhZHkgPSB0cnVlLCAxMCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWZmZWN0ZWRGaWx0ZXIgPSBfbG9va3VwT2JqPy5hZmZlY3RlZEZpbHRlciA/PyBbXTtcbiAgICBpZiAoYWZmZWN0ZWRGaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IF92YWx1ZSA9IF9sb29rdXBPYmouaWRTZWxlY3Q7XG4gICAgICBpZiAoX2xvb2t1cE9iai5maWx0ZXJQcm9wVmFsdWUgIT0gbnVsbCAmJiBfbG9va3VwT2JqLmZpbHRlclByb3BWYWx1ZSAhPSBcIlwiKSB7XG4gICAgICAgIGlmIChfbG9va3VwT2JqLmZpbHRlclByb3BWYWx1ZS5pbmNsdWRlcyhcImxvb2t1cC5cIikpIHtcbiAgICAgICAgICBjb25zdCBfdGVtcFZhbHVlID0gX2xvb2t1cE9iai5maWx0ZXJQcm9wVmFsdWUuc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgIF92YWx1ZSA9IF9ldmVudE9iai5sb29rdXBbX3RlbXBWYWx1ZV0gPz8gX3ZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm9uQ2hhbmdlRXZlbnQoX3ZhbHVlLCBfbG9va3VwT2JqKTtcbiAgICB9XG4gICAgXG4gIH1cblxuICBnZXRJbnB1dHRlZFZhbHVlKGV2LCBjb21wb25lbnQpIHtcbiAgICB0aGlzLmZvcm0uY29udHJvbHNbXCJsb29rdXBfaWRfXCIgKyBjb21wb25lbnQubmFtZV0uc2V0VmFsdWUoZXYpO1xuICB9XG5cbiAgaXNDb2xsYXBzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgb25Db2xsYXBzZShldikge1xuICAgIGNvbnNvbGUubG9nKCdjb2xsYXBzZScsIGV2KTtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gISFldj8uaXNDb2xsYXBzZWQ7XG4gIH1cblxuICB1cGRhdGVLZXlWYWxEaWN0KGV2KSB7XG4gICAgdGhpcy5sb29rdXBLZXlWYWxEaWN0W2V2LmtleV0gPSBldi52YWx1ZTtcbiAgICB0aGlzLm5vdGlmeVVwZGF0ZUtleVZhbERpY3QuZW1pdCh0aGlzLmxvb2t1cEtleVZhbERpY3QpO1xuICAgIHRoaXMudWNTZWFyY2hGb3JtU2VydmljZS5zZXRGb3JtKHRoaXMuZm9ybSk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlQ3VyckZvY0VsVmFsdWUoaXRlbTogYW55KSB7XG4gICAgbGV0IHZhbCA9IFwiMFwiO1xuICAgIGNvbnN0IHByZWNpc2lvbiA9IGl0ZW0/LnByZWNpc2lvbiB8fCAyO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJlY2lzaW9uOyBpKyspIHtcbiAgICAgIGlmIChpID09PSAwKSB2YWwgKz0gXCIuXCI7XG4gICAgICB2YWwgKz0gXCIwXCI7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBwcml2YXRlIHNldFZhbGlkYXRvck51bWJlcih0eXBlVmFsaWRhdG9yOiBcIk1JTlwiIHwgXCJNQVhcIiwgdmFsdWU6IG51bWJlciB8IHN0cmluZywgY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybjtcbiAgICBpZiAodHlwZVZhbGlkYXRvciA9PT0gIFwiTUlOXCIpIGNvbnRyb2wuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLm1pbih2YWx1ZSBhcyBudW1iZXIpKTtcbiAgICBlbHNlIGlmICh0eXBlVmFsaWRhdG9yID09PSBcIk1BWFwiKSBjb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5tYXgodmFsdWUgYXMgbnVtYmVyKSk7XG4gIH1cbn1cbiIsIjxzcGFuIGhpZGRlbiBhdHRyLnZlcnNpb249XCIzLjguMTgtY2FuYXJ5LjBcIj48L3NwYW4+XG48ZGl2PlxuICA8IS0tIEJhc2ljIGZvcm0gbGF5b3V0IHNlY3Rpb24gc3RhcnQgLS0+XG4gIDxsaWItdWNTdWJzZWN0aW9uIFtoaWRkZW5dPVwiIXNlYXJjaElucHV0LklzU3Vic2VjdGlvblwiIFtpZF09XCJzZWFyY2hJbnB1dC5zZWFyY2hJZCsnaWQnXCJcbiAgICBbdGl0bGVdPVwiY29uZmlndXJhdGlvbj8uc2VjdGlvblRpdGxlIHx8ICdQYWdpbmcnXCIgW3BhbmVsXT1cInNlYXJjaElucHV0LnNlYXJjaElkXCIgW2xlZ2FjeV09XCJmYWxzZVwiXG4gICAgKGNvbGxhcHNlKT1cIm9uQ29sbGFwc2UoJGV2ZW50KVwiPlxuICA8L2xpYi11Y1N1YnNlY3Rpb24+XG5cbiAgPCEtLSA8ZGl2IFtpZF09XCJzZWFyY2hJbnB1dC5zZWFyY2hJZFwiPiAtLT5cbiAgPCEtLSA8ZGl2IGNsYXNzPVwicm93IHRleHQtbGVmdFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJcIj4gLS0+XG4gIDwhLS0gPGRpdiBjbGFzcz1cInBsLTMgbWItMiBtdC0yXCIgKm5nSWY9XCJjb25maWd1cmF0aW9uPy50aXRsZSAhPSB1bmRlZmluZWQgJiYgY29uZmlndXJhdGlvbj8udGl0bGUgIT0gJydcIj5cbiAgICAgICAgICA8aDQgY2xhc3M9XCJjYXJkLXRpdGxlIHVjU2VhcmNoLXRpdGxlXCIgdHJhbnNsYXRlPnt7Y29uZmlndXJhdGlvbi50aXRsZX19PC9oND5cbiAgICAgICAgPC9kaXY+IC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCIgW2lkXT1cInNlYXJjaElucHV0LnNlYXJjaElkXCIgWyhuZ2JDb2xsYXBzZSldPVwiaXNDb2xsYXBzZWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHgtM1wiPlxuICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtIGZvcm0taG9yaXpvbnRhbFwiIGlkPVwiZm9ybVNlYXJjaFwiICNmb3JtSWRTZWFyY2ggW2Zvcm1Hcm91cF09XCJmb3JtXCIgI2VuamlGb3JtPVwibmdGb3JtXCJcbiAgICAgICAgKG5nU3VibWl0KT1cImVuamlGb3JtLnZhbGlkICYmIHNlYXJjaENsaWNrKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tYm9keVwiPlxuICAgICAgICAgIDwhLS0gPGg0IGNsYXNzPVwiZm9ybS1zZWN0aW9uIGZvbnQtd2VpZ2h0LWJvbGRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImNoYW5nZVN0YXRlKClcIiBjbGFzcz1cImJ0biBuby1wYWRkaW5nIGN1cnNvci1wb2ludGVyIGZsaXBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYVwiIHN0eWxlPVwiZm9udC1zaXplOiAxNXB4OyBtYXJnaW46IDBweCAwcHggNXB4IC0xNXB4O1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXNIaWRkZW4gPyAnZmEtY2hldnJvbi1yaWdodCcgOiAnZmEtY2hldnJvbi1kb3duJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb25maWd1cmF0aW9uPy5zZWN0aW9uVGl0bGUgIT0gdW5kZWZpbmVkICYmIGNvbmZpZ3VyYXRpb24/LnNlY3Rpb25UaXRsZSAhPSAnJzsgdGhlbiBpbnB1dFNlY3Rpb25UaXRsZSBlbHNlIGRlZmF1bHRTZWN0aW9uVGl0bGVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2lucHV0U2VjdGlvblRpdGxlPlxuICAgICAgICAgICAgICAgICAgICB7e2NvbmZpZ3VyYXRpb24/LnNlY3Rpb25UaXRsZX19XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U2VjdGlvblRpdGxlPlxuICAgICAgICAgICAgICAgICAgICBQYWdpbmdcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9oND4gLS0+XG4gICAgICAgICAgPCEtLSBJbmkgRGlndW5ha2FuIHVudHVrIEdlbmVyYXRlIER5bmFtaWMgQ29tcG9uZW50IC0tPlxuICAgICAgICAgIDwhLS0gW2hpZGRlbl09XCJpc0hpZGRlblwiIC0tPlxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInBhbmVsLWFjdGl2ZVwiIFtAY2hhbmdlRGl2U2l6ZV09Y3VycmVudFN0YXRlPiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cFwiICpuZ0Zvcj1cImxldCBxdWVzdGlvbiBvZiBjb25maWd1cmF0aW9uPy5jb21wb25lbnQ7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0xMiBuby1wYWRkaW5nIHNlYXJjaC1sYWJlbFwiIGZvcj1cInt7cXVlc3Rpb24uaWR9fVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWRpbnMtcmVxdWlyZWQtbGFiZWwnOiAocXVlc3Rpb24uaXNSZXF1aXJlZCB8fCAocXVlc3Rpb24/LmRkbFR5cGUgIT0gdW5kZWZpbmVkICYmIHF1ZXN0aW9uLmRkbFR5cGUgPT0gJ29uZScpKX1cIlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+e3txdWVzdGlvbi5sYWJlbH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J3RleHRib3gnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ7e3F1ZXN0aW9uLmlkfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW0lzVXBwZXJDYXNlXT1cInF1ZXN0aW9uLmlzVXBwZXJjYXNlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcXVlc3Rpb24uaXNVcHBlcmNhc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzUmVxdWlyZWRcIiBuYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInF1ZXN0aW9uLnBsYWNlaG9sZGVyICE9IHVuZGVmaW5lZCA/IHF1ZXN0aW9uLnBsYWNlaG9sZGVyIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiB2YWx1ZT1cInt7cXVlc3Rpb24udmFsdWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3txdWVzdGlvbi5yZXN0cmljdGlvbn19XCIgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicXVlc3Rpb24uaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwidXBkYXRlS2V5VmFsRGljdCh7a2V5OiBxdWVzdGlvbi5uYW1lLCB2YWx1ZTogcXVlc3Rpb24udmFsdWV9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGU9PSd0ZXh0YXJlYSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgdHlwZT1cInRleHRcIiBpZD1cInt7cXVlc3Rpb24uaWR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiB2YWx1ZT1cInt7cXVlc3Rpb24udmFsdWV9fVwiIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInF1ZXN0aW9uLmlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cInVwZGF0ZUtleVZhbERpY3Qoe2tleTogcXVlc3Rpb24ubmFtZSwgdmFsdWU6IHF1ZXN0aW9uLnZhbHVlfSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5pbnZhbGlkIH1cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGU9PSdudW1lcmljJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJ7e3F1ZXN0aW9uLmlkfX1cIiAoZm9jdXMpPVwidHJhbnNmb3JtVG9EZWNpbWFsKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwidHJhbnNmb3JtVG9EZWNpbWFsKCRldmVudClcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtaW5wdXRcIiBbcGxhY2Vob2xkZXJdPVwiJzAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZStbaV19fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLm5hbWUrW2ldXCIgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7e3F1ZXN0aW9uLnZhbHVlfX1cIiBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIiBhdHRyLmRhdGEtbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1udW1lcmljcGFpcj1cInt7cXVlc3Rpb24ubnVtZXJpY1BhaXJ9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtY3JpdC1kYXRhdGFibGU9XCJ7e3F1ZXN0aW9uLmlzQ3JpdGVyaWFEYXRhVGFibGV9fVwiIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cInVwZGF0ZUtleVZhbERpY3Qoe2tleTogcXVlc3Rpb24ubmFtZSwgdmFsdWU6IHF1ZXN0aW9uLnZhbHVlfSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInF1ZXN0aW9uLmlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZStbaV1dPy5pbnZhbGlkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0nY3VycmVuY3knXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uPy5pc0N1c3RvbSAhPSB1bmRlZmluZWQgJiYgcXVlc3Rpb24/LmlzQ3VzdG9tXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIlwiIGlkPVwie3txdWVzdGlvbi5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzUmVxdWlyZWRcIiBuYW1lPVwie3txdWVzdGlvbi5uYW1lK1tpXX19XCIgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3txdWVzdGlvbi5yZXN0cmljdGlvbn19XCIgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCIgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiBjdXJyZW5jeU1hc2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJxdWVzdGlvbi5uYW1lK1tpXVwiIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicXVlc3Rpb24uaXNSZWFkb25seVwiIChmb2N1cyk9XCJPbkZvY3VzQ3VycigkZXZlbnQsIHF1ZXN0aW9uLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIlZhbGlkYXRlRGVmYXVsdFZhbHVlKHF1ZXN0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJ1cGRhdGVLZXlWYWxEaWN0KHtrZXk6IHF1ZXN0aW9uLm5hbWUsIHZhbHVlOiBxdWVzdGlvbi52YWx1ZX0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwieyB0aG91c2FuZHM6IHF1ZXN0aW9uLnRob3VzYW5kcywgZGVjaW1hbDogcXVlc3Rpb24uZGVjaW1hbCwgYWxpZ246IHF1ZXN0aW9uLmFsaWduLCBhbGxvd05lZ2F0aXZlOiBxdWVzdGlvbi5hbGxvd05lZ2F0aXZlLCBhbGxvd1plcm86IHF1ZXN0aW9uLmFsbG93WmVybywgcHJlY2lzaW9uOiBxdWVzdGlvbi5wcmVjaXNpb24sIG51bGxhYmxlOiBxdWVzdGlvbi5udWxsYWJsZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uPy5pc0N1c3RvbSA9PSB1bmRlZmluZWQgfHwgIXF1ZXN0aW9uPy5pc0N1c3RvbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ7e3F1ZXN0aW9uLmlkfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWUrW2ldfX1cIiBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIiBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiIGN1cnJlbmN5TWFza1xuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLm5hbWUrW2ldXCIgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJPbkZvY3VzQ3VycigkZXZlbnQsIHF1ZXN0aW9uLnZhbHVlKVwiIChibHVyKT1cIlZhbGlkYXRlRGVmYXVsdFZhbHVlKHF1ZXN0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJ1cGRhdGVLZXlWYWxEaWN0KHtrZXk6IHF1ZXN0aW9uLm5hbWUsIHZhbHVlOiBxdWVzdGlvbi52YWx1ZX0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwieyB0aG91c2FuZHM6ICcsJywgZGVjaW1hbDogJy4nLCBhbGlnbjogJ3JpZ2h0JywgYWxsb3dOZWdhdGl2ZTogZmFsc2UsIGFsbG93WmVybzp0cnVlLCBwcmVjaXNpb246IDIsIG51bGxhYmxlOiBmYWxzZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRW5kIEhhcmRjb2RlIExvb2t1cCBkaWRhbGVtLS0+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXVzZU5ld0RhdGVwaWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2RhdGVwaWNrZXInICYmICFxdWVzdGlvbi5pc1RpbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGlkPVwie3txdWVzdGlvbi5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0IGJ0bi1sb29rdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3txdWVzdGlvbi5uYW1lK1tpXX19XCIgW2Zvcm1Db250cm9sTmFtZV09XCJxdWVzdGlvbi5uYW1lK1tpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInt7cXVlc3Rpb24udmFsdWV9fVwiIFtyZWFkb25seV09XCJxdWVzdGlvbi5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCIgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1kYXRlcGlja2VycGFpcj1cInt7cXVlc3Rpb24uZGF0ZXBpY2tlclBhaXJ9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1jcml0LWRhdGF0YWJsZT1cInt7cXVlc3Rpb24uaXNDcml0ZXJpYURhdGFUYWJsZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3txdWVzdGlvbi5yZXN0cmljdGlvbn19XCIgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwicXVlc3Rpb24ubWluRGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQnXCIgW21heF09XCJxdWVzdGlvbi5tYXhEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwicXVlc3Rpb24ucmVzdHJpY3Rpb24gIT0gdW5kZWZpbmVkICYmIGNoZWNrSW5wdXREYXRlKHF1ZXN0aW9uLGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZStbaV1dPy5pbnZhbGlkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2RhdGVwaWNrZXInICYmIHF1ZXN0aW9uLmlzVGltZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGlkPVwie3txdWVzdGlvbi5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0IGJ0bi1sb29rdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3txdWVzdGlvbi5uYW1lK1tpXX19XCIgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzUmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLm5hbWVcIiBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3txdWVzdGlvbi52YWx1ZX19XCIgW3JlYWRvbmx5XT1cInF1ZXN0aW9uLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIiBhdHRyLmRhdGEtbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLWRhdGVwaWNrZXJwYWlyPVwie3txdWVzdGlvbi5kYXRlcGlja2VyUGFpcn19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIiBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwie3txdWVzdGlvbi5taW5EYXRlIHwgZGF0ZToneXl5eS1NTS1kZCd9fVwiIG1heD1cInt7cXVlc3Rpb24ubWF4RGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQnfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwicXVlc3Rpb24ucmVzdHJpY3Rpb24gIT0gdW5kZWZpbmVkICYmIGNoZWNrSW5wdXREYXRlKHF1ZXN0aW9uLGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZStbaV1dPy5pbnZhbGlkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInVzZU5ld0RhdGVwaWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2RhdGVwaWNrZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXVjZGF0ZXBpY2tlciBbcGFyZW50Rm9ybV09XCJmb3JtXCIgW2VuamlGb3JtXT1cImVuamlGb3JtXCIgW2lkZW50aWZpZXJdPVwicXVlc3Rpb24ubmFtZStpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJxdWVzdGlvbi5taW5EYXRlIHwgZGF0ZTogJ3l5eXktTU0tZGQnXCIgW21heF09XCJxdWVzdGlvbi5tYXhEYXRlIHwgZGF0ZTogJ3l5eXktTU0tZGQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRTdGFydERhdGVdPVwiQmlzRHRcIiBbYXR0cl09XCJxdWVzdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicXVlc3Rpb24ucmVzdHJpY3Rpb24gIT0gdW5kZWZpbmVkICYmIGNoZWNrSW5wdXREYXRlKHF1ZXN0aW9uLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi11Y2RhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi50eXBlID09ICd0YXNrRGVmaW5pdGlvbktleScgfHwgcXVlc3Rpb24udHlwZSA9PSAncHJvY2Vzc0tleScgfHwgcXVlc3Rpb24udHlwZSA9PSAnb2ZmaWNlUm9sZUNvZGVzJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCIgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzUmVxdWlyZWRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5xdWVyeS1pbj1cInt7cXVlc3Rpb24uaXNRdWVyeUlufX1cIiBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCIgW2hpZGRlbl09XCJxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCA9PSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiKHF1ZXN0aW9uLnR5cGUgPT0gJ3Rhc2tEZWZpbml0aW9uS2V5JyB8fCBxdWVzdGlvbi50eXBlID09ICdwcm9jZXNzS2V5JykgPyBTZXRQcm9jZXNzS2V5KGkscXVlc3Rpb24ud2ZLZXlGaWx0ZXIpIDogU2V0Um9sZU9mZmljZUNvZGVzKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwicXVlc3Rpb24uZGRsVHlwZSA9PSAnb25lJyAmJiBxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCAhPSAxXCIgdmFsdWU9XCJvbmVcIj5TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgT25lPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHF1ZXN0aW9uPy5kZGxUeXBlID09IHVuZGVmaW5lZCB8fCBxdWVzdGlvbi5kZGxUeXBlID09ICdhbGwnKSAmJiBxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCAhPSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgcXVlc3Rpb24/Lml0ZW1zVXJsXCIgdmFsdWU9XCJ7e2l0ZW0uS2V5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLlZhbHVlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cInF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoID09IDFcIj57e3F1ZXN0aW9uLml0ZW1zVXJsWzBdLlZhbHVlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGU9PSdkcm9wZG93bidcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiIGF0dHIuZGF0YS1yZXF1aXJlZD1cInt7cXVlc3Rpb24uaXNSZXF1aXJlZH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24ubmFtZVwiIGF0dHIucXVlcnktaW49XCJ7e3F1ZXN0aW9uLmlzUXVlcnlJbn19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCIgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCIgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3sgcXVlc3Rpb24/LnJlc3RyaWN0aW9uID8/ICcnfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhcXVlc3Rpb24uaXNGcm9tVVJMID8gKHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoID09IDEgJiYgIXF1ZXN0aW9uPy5rZWVwRGRsKSA6IChxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCA9PSAxICYmICFxdWVzdGlvbj8ua2VlcERkbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJxdWVzdGlvbi5pc0V2ZW50ID8gb25DaGFuZ2VFdmVudCgkZXZlbnQudGFyZ2V0LnZhbHVlLCBxdWVzdGlvbikgOiB1cGRhdGVLZXlWYWxEaWN0KHtrZXk6IHF1ZXN0aW9uLm5hbWUsIHZhbHVlOiAkZXZlbnQudGFyZ2V0LnZhbHVlfSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5pbnZhbGlkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnICYmICghcXVlc3Rpb24uaXNGcm9tVVJMID8gKHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoICE9IDEgfHwgcXVlc3Rpb24/LmtlZXBEZGwpIDogKHF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoICE9IDEgfHwgcXVlc3Rpb24/LmtlZXBEZGwpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwib25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBPbmU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIocXVlc3Rpb24/LmRkbFR5cGUgPT0gdW5kZWZpbmVkIHx8IHF1ZXN0aW9uLmRkbFR5cGUgPT0gJ2FsbCcpICYmICghcXVlc3Rpb24uaXNGcm9tVVJMID8gKHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoICE9IDEgfHwgcXVlc3Rpb24/LmtlZXBEZGwpIDogKHF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoICE9IDEgfHwgcXVlc3Rpb24/LmtlZXBEZGwpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiYWxsXCI+QWxsPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mICFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXMgOiBxdWVzdGlvbj8uaXRlbXNVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInt7IXF1ZXN0aW9uLmlzRnJvbVVSTCA/IGl0ZW0ua2V5IDogaXRlbS5LZXl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyFxdWVzdGlvbi5pc0Zyb21VUkwgPyBpdGVtLnZhbHVlIDogaXRlbS5WYWx1ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIocXVlc3Rpb24/LmRkbFR5cGUgPT0gdW5kZWZpbmVkIHx8IHF1ZXN0aW9uLmRkbFR5cGUgPT0gJ2FsbCcpICYmICghcXVlc3Rpb24uaXNGcm9tVVJMID8gKHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoICE9IDEgfHwgcXVlc3Rpb24/LmtlZXBEZGwpIDogKHF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoICE9IDEgfHwgcXVlc3Rpb24/LmtlZXBEZGwpKSAmJiBxdWVzdGlvbi51c2VPdGhlcnNTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIm90aGVyc1wiPk90aGVyczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcXVlc3Rpb24uaXNGcm9tVVJMID8gKHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoID09IDEgJiYgIXF1ZXN0aW9uPy5rZWVwRGRsKSA6IChxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCA9PSAxICYmICFxdWVzdGlvbj8ua2VlcERkbClcIj57eyFxdWVzdGlvbi5pc0Zyb21VUkxcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcXVlc3Rpb24uaXRlbXNbMF0udmFsdWUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24uaXRlbXNVcmxbMF0uVmFsdWV9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2Ryb3Bkb3duU2VhcmNoJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZHMtZGlzcGxheS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoID09IDEgOiBxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCA9PSAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBkZHMtaW5wdXRcIiBuYW1lPVwie3snZGRzVmFsdWUnK3F1ZXN0aW9uLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicXVlc3Rpb24uZGVzY3JcIiByZWFkb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicXVlc3Rpb24uaXNMaXN0SGlkZSA9ICFxdWVzdGlvbi5pc0xpc3RIaWRlOyBxdWVzdGlvbi5zZWFyY2hUZXh0PScnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCA9PSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggPT0gMVwiPnt7cXVlc3Rpb24uZGVzY3J9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRkcy1saXN0LWNvbnRhaW5lclwiIFtoaWRkZW5dPVwicXVlc3Rpb24uaXNMaXN0SGlkZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCIgbmFtZT1cInt7J3NlYXJjaFRleHQnK3F1ZXN0aW9uLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicXVlc3Rpb24uc2VhcmNoVGV4dFwiIFtwbGFjZWhvbGRlcl09XCJxdWVzdGlvbi5wbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRkcy1pdGVtcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZ1bGwtd2lkdGhcIiBuYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1yZXF1aXJlZD1cInt7cXVlc3Rpb24uaXNSZXF1aXJlZH19XCIgWyhuZ01vZGVsKV09XCJxdWVzdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzUmVxdWlyZWRcIiBhdHRyLnF1ZXJ5LWluPVwie3txdWVzdGlvbi5pc1F1ZXJ5SW59fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIiBhdHRyLmRhdGEtbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCIgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicXVlc3Rpb24uaXNFdmVudCA/IG9uQ2hhbmdlRXZlbnQoJGV2ZW50LnRhcmdldC52YWx1ZSwgcXVlc3Rpb24pIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwie3txdWVzdGlvbj8uc2l6ZSA9PSB1bmRlZmluZWQgPyBxdWVzdGlvbj8uc2l6ZSA6IDEwfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIChjbGljayk9XCJzZWxlY3RlZE9wdGlvbih7S2V5OidvbmUnLFZhbHVlOidTZWxlY3QgT25lJ30scXVlc3Rpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicXVlc3Rpb24uZGRzVHlwZSA9PSAnb25lJyAmJiAoIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoICE9IDEgOiBxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCAhPSAxKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IE9uZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKGNsaWNrKT1cInNlbGVjdGVkT3B0aW9uKHtLZXk6J2FsbCcsVmFsdWU6J0FsbCd9LHF1ZXN0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihxdWVzdGlvbj8uZGRzVHlwZSA9PSB1bmRlZmluZWQgfHwgcXVlc3Rpb24uZGRzVHlwZSA9PSAnYWxsJykgJiYgKCFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCAhPSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggIT0gMSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxvcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgcXVlc3Rpb24/Lml0ZW1zIHwgdGV4dFNlYXJjaCA6IHF1ZXN0aW9uLnNlYXJjaFRleHQ7IGxldCBpPWluZGV4XCIgW3ZhbHVlXT1cIml0ZW0/LmtleVwiIChjbGljayk9XCJzZWxlY3RlZE9wdGlvbihpdGVtLHF1ZXN0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbT8udmFsdWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IChxdWVzdGlvbj8uaXRlbXMgfCB0ZXh0U2VhcmNoIDogcXVlc3Rpb24uc2VhcmNoVGV4dCkgOiBxdWVzdGlvbj8uaXRlbXNVcmwgfCB0ZXh0U2VhcmNoIDogcXVlc3Rpb24uc2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRPcHRpb24oaXRlbSxxdWVzdGlvbilcIiB2YWx1ZT1cInt7aXRlbS5LZXl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLlZhbHVlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0nY2xhaW0nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwie3snY2xhaW0nK1tpXX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCIgYXR0ci5kYXRhLXR5cGU9XCJ7eyd0ZXh0J319XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1jcml0LWRhdGF0YWJsZT1cInt7cXVlc3Rpb24uaXNDcml0ZXJpYURhdGFUYWJsZX19XCIgYXR0ci5kYXRhLW5hbWU9XCJ7eydBc3NpZ25lZSd9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIkNsYWltTGlzdD8ubGVuZ3RoID09IDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzWydjbGFpbScrW2ldXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzWydjbGFpbScrW2ldXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbJ2NsYWltJytbaV1dPy5pbnZhbGlkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnICYmIENsYWltTGlzdD8ubGVuZ3RoICE9IDFcIiB2YWx1ZT1cIm9uZVwiPlNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICBPbmU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIocXVlc3Rpb24/LmRkbFR5cGUgPT0gdW5kZWZpbmVkIHx8IHF1ZXN0aW9uLmRkbFR5cGUgPT0gJ2FsbCcpICYmIENsYWltTGlzdD8ubGVuZ3RoICE9IDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImFsbFwiPkFsbDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBDbGFpbUxpc3RcIiB2YWx1ZT1cInt7aXRlbS5LZXl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uVmFsdWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2xvb2t1cCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGliLWNsLXVjbG9va3VwZ2VuZXJpYyAqbmdJZj1cInNlYXJjaElucHV0LmRpY3RMb29rdXBPYmpbcXVlc3Rpb24ubmFtZV0uaXNSZWFkeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbG9va3VwSW5wdXRdPVwic2VhcmNoSW5wdXQuZGljdExvb2t1cE9ialtxdWVzdGlvbi5uYW1lXVwiIFtwYXJlbnRGb3JtXT0nZm9ybSdcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbmppRm9ybV09J2VuamlGb3JtJyBbaWRlbnRpZmllcl09XCJxdWVzdGlvbi5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtub3RpZnlVcGRhdGVLZXlWYWxEaWN0XT1cIm5vdGlmeVVwZGF0ZUtleVZhbERpY3RcIiBbbG9va3VwS2V5VmFsRGljdF09XCJsb29rdXBLZXlWYWxEaWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChsb29rdXApPVwiZ2V0TG9va3VwKCRldmVudCwgcXVlc3Rpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dHRlZFZhbHVlKT1cImdldElucHV0dGVkVmFsdWUoJGV2ZW50LCBxdWVzdGlvbilcIj48L2xpYi1jbC11Y2xvb2t1cGdlbmVyaWM+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlID09PSAndGltZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRpbWVcIiBpZD1cInt7cXVlc3Rpb24uaWR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbSXNVcHBlckNhc2VdPVwicXVlc3Rpb24uaXNVcHBlcmNhc2UgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBxdWVzdGlvbi5pc1VwcGVyY2FzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtY3JpdC1kYXRhdGFibGU9XCJ7e3F1ZXN0aW9uLmlzQ3JpdGVyaWFEYXRhVGFibGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicXVlc3Rpb24ucGxhY2Vob2xkZXIgIT0gdW5kZWZpbmVkID8gcXVlc3Rpb24ucGxhY2Vob2xkZXIgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiIHZhbHVlPVwie3txdWVzdGlvbi52YWx1ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCIgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIiBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJxdWVzdGlvbi5pc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJ1cGRhdGVLZXlWYWxEaWN0KHtrZXk6IHF1ZXN0aW9uLm5hbWUsIHZhbHVlOiBxdWVzdGlvbi52YWx1ZX0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlID09PSAnbW9udGgnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLm5hbWVcIiBhdHRyLnF1ZXJ5LWluPVwie3txdWVzdGlvbi5pc1F1ZXJ5SW59fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiIGF0dHIuZGF0YS1jcml0LWRhdGF0YWJsZT1cInt7cXVlc3Rpb24uaXNDcml0ZXJpYURhdGFUYWJsZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicXVlc3Rpb24uaXNFdmVudCA/IG9uQ2hhbmdlRXZlbnQoJGV2ZW50LnRhcmdldC52YWx1ZSwgcXVlc3Rpb24pIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5pbnZhbGlkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnXCIgdmFsdWU9XCJvbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IE9uZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cInF1ZXN0aW9uPy5kZGxUeXBlID09IHVuZGVmaW5lZCB8fCBxdWVzdGlvbi5kZGxUeXBlID09ICdhbGwnXCIgdmFsdWU9XCJhbGxcIj5BbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbSBvZiBtb250aHNcIiBbdmFsdWVdPVwibS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3ttLnZhbHVlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZSA9PT0gJ3llYXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLm5hbWVcIiBhdHRyLnF1ZXJ5LWluPVwie3txdWVzdGlvbi5pc1F1ZXJ5SW59fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiIGF0dHIuZGF0YS1jcml0LWRhdGF0YWJsZT1cInt7cXVlc3Rpb24uaXNDcml0ZXJpYURhdGFUYWJsZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicXVlc3Rpb24uaXNFdmVudCA/IG9uQ2hhbmdlRXZlbnQoJGV2ZW50LnRhcmdldC52YWx1ZSwgcXVlc3Rpb24pIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5pbnZhbGlkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnXCIgdmFsdWU9XCJvbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IE9uZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cInF1ZXN0aW9uPy5kZGxUeXBlID09IHVuZGVmaW5lZCB8fCBxdWVzdGlvbi5kZGxUeXBlID09ICdhbGwnXCIgdmFsdWU9XCJhbGxcIj5BbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgeSBvZiB5ZWFyc1wiIFt2YWx1ZV09XCJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7eX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi11Yy1zaG93LWVycm9ycyAqbmdJZj1cInF1ZXN0aW9uLnR5cGUgIT09ICdkYXRlcGlja2VyJ1wiIFtjb250cm9sXT1cImZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdWJtaXRdPVwiZW5qaUZvcm0uc3VibWl0dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbGliLXVjLXNob3ctZXJyb3JzPlxuICAgICAgICAgICAgICAgICAgICA8bGliLXVjLXNob3ctZXJyb3JzICpuZ0lmPVwicXVlc3Rpb24udHlwZSA9PT0gJ2RhdGVwaWNrZXInIHx8IHF1ZXN0aW9uLnR5cGUgPT09ICdudW1lcmljJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV1cIiBbc3VibWl0XT1cImVuamlGb3JtLnN1Ym1pdHRlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2xpYi11Yy1zaG93LWVycm9ycz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGZvcm0tZ3JvdXBcIiAqbmdJZj1cIihpc1JlcG9ydCAhPSB1bmRlZmluZWQgJiYgaXNSZXBvcnQpXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMTIgbm8tcGFkZGluZyBzZWFyY2gtbGFiZWxcIiB0cmFuc2xhdGU+UmVwb3J0IFR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBuby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cIkV4cG9ydFR5cGVcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtaW5wdXRcIiBhdHRyLmRhdGEtdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ0V4cG9ydFR5cGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBFeHBvcnRUeXBlTGlzdFwiIFt2YWx1ZV09XCJpdGVtLmtleVwiPnt7aXRlbS52YWx1ZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgZm9ybS1ncm91cFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiKGlzUmVwb3J0ICE9IHVuZGVmaW5lZCAmJiBpc1JlcG9ydCkgJiYgKHNob3dScHRFeGVjVHlwZSAhPSB1bmRlZmluZWQgJiYgc2hvd1JwdEV4ZWNUeXBlKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTEyIG5vLXBhZGRpbmcgc2VhcmNoLWxhYmVsXCIgdHJhbnNsYXRlPkV4ZWN1dGlvbiBUeXBlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJScHRFeGVjVHlwZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1pbnB1dFwiIGF0dHIuZGF0YS10eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInUnB0RXhlY1R5cGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBSZXBvcnRFeGVjVHlwZUxpc3RcIiBbdmFsdWVdPVwiaXRlbS5rZXlcIj57e2l0ZW0udmFsdWV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tYWN0aW9ucyByaWdodFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGNsYXNzPVwiYnRuLWdyb3VwXCIgKm5nSWY9XCJleHBvcnREYXRhID09IHRydWUgJiYgaXNTZWFyY2hcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1yYWlzZWQgYnRuLW91dGxpbmUtMiBtci0xIGRyb3Bkb3duLXRvZ2dsZVwiIG5nYkRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZXhwb3J0TGlzdFwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmdC1kb3dubG9hZCBidXR0b24taWNvbi1zZWFyY2hcIj48L2k+Jm5ic3A7PHNwYW4gY2xhc3M9XCJidXR0b24tdGV4dC1zZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT5FeHBvcnQgRmlsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBuZ2JEcm9wZG93bk1lbnUgYXJpYS1sYWJlbGxlZGJ5PVwiZXhwb3J0TGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGV4cG9ydEFzRmlsZUxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrKT1cImV4cG9ydEFzRmlsZShpdGVtLmtleSlcIj57e2l0ZW0udmFsdWV9fTwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJyZXNldCgpXCIgY2xhc3M9XCJidG4gYnRuLXJhaXNlZCBtci0xIGJ0bi1saW5rLTJcIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICAgICAgPCEtLSA8aSBjbGFzcz1cImZhIGZhLXRpbWVzXCI+PC9pPiZuYnNwOyAtLT5cbiAgICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+UmVzZXQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiKGlzUmVwb3J0ID09IHVuZGVmaW5lZCB8fCAhaXNSZXBvcnQpXCIgdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1yYWlzZWQgYnRuLW91dGxpbmUtMlwiXG4gICAgICAgICAgICAgICAgI1VDU2VhcmNoQ2xpY2sgW2Rpc2FibGVkXT1cIiFzZWFyY2hCdG5SZWFkeVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoIGJ1dHRvbi1pY29uLXNlYXJjaFwiPjwvaT4mbmJzcDs8c3BhbiBjbGFzcz1cImJ1dHRvbi10ZXh0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+U2VhcmNoPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIihpc1JlcG9ydCAhPSB1bmRlZmluZWQgJiYgaXNSZXBvcnQpXCIgdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1yYWlzZWQgYnRuLW91dGxpbmUtMlwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZnQtZG93bmxvYWQgYnV0dG9uLWljb24tc2VhcmNoXCI+PC9pPiZuYnNwOzxzcGFuIGNsYXNzPVwiYnV0dG9uLXRleHQtc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT5HZW5lcmF0ZVxuICAgICAgICAgICAgICAgICAgUmVwb3J0PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDwhLS0gPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PiAtLT5cbiAgPCEtLSA8L2Rpdj4gLS0+XG48L2Rpdj5cbjwhLS0gLy8gQmFzaWMgZm9ybSBsYXlvdXQgc2VjdGlvbiBlbmQgLS0+Il19
2007
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWNzZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWNzZWFyY2gvc3JjL2xpYi91Y3NlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy91Y3NlYXJjaC9zcmMvbGliL3Vjc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUdMLFdBQVcsRUFJWCxNQUFNLEVBRU4sVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixLQUFLLEVBQ0wsT0FBTyxFQUNQLEtBQUssR0FDTixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUNMLGtCQUFrQixFQUVsQixzQkFBc0IsR0FDdkIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxRQUFR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dUJBQUMsVUFBVTtnQkFPTSxNQUFNO3NCQUFoQyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ2hCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFXRyxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPdXRwdXQsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7XHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIENvbnRyb2xDb250YWluZXIsXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEZvcm1Hcm91cERpcmVjdGl2ZSxcclxuICBOZ0Zvcm0sXHJcbiAgVmFsaWRhdG9yRm4sXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgRGF0ZVBpcGUsIGZvcm1hdERhdGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IElucHV0U2VhcmNoT2JqIH0gZnJvbSBcIi4vbW9kZWwvaW5wdXQtc2VhcmNoLW9iai5tb2RlbFwiO1xyXG5pbXBvcnQgeyBDcml0ZXJpYU9iaiB9IGZyb20gXCIuL21vZGVsL2NyaXRlcmlhLW9iai5tb2RlbFwiO1xyXG5pbXBvcnQgeyBSZXF1ZXN0Q3JpdGVyaWFPYmogfSBmcm9tIFwiLi9tb2RlbC9yZXF1ZXN0LWNyaXRlcmlhLW9iai5tb2RlbFwiO1xyXG5pbXBvcnQgeyBBZEluc0NvbnN0YW50LCBFWFBPUlRfREFUQV9UWVBFUyB9IGZyb20gXCIuL21vZGVsL2FkaW5zLWNvbnN0YW50XCI7XHJcbmltcG9ydCB7XHJcbiAgdHJpZ2dlcixcclxuICB0cmFuc2l0aW9uLFxyXG4gIHN0eWxlLFxyXG4gIGFuaW1hdGUsXHJcbiAgc3RhdGUsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2FuaW1hdGlvbnNcIjtcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gXCJuZ3gtdG9hc3RyXCI7XHJcbmltcG9ydCB7XHJcbiAgRXhwb3J0VHlwZUNvbnN0YW50LFxyXG4gIEtleVZhbHVlUmVwb3J0T2JqLFxyXG4gIFJlcG9ydEV4ZWNUeXBlQ29uc3RhbnQsXHJcbn0gZnJvbSBcIi4vbW9kZWwva2V5LXZhbHVlLXJlcG9ydC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSBcIm5neC1jb29raWVcIjtcclxuaW1wb3J0ICogYXMgQ3J5cHRvSlMgZnJvbSBcImNyeXB0by1qc1wiO1xyXG5pbXBvcnQge1xyXG4gIEtleVZhbHVlVUNTZWFyY2hPYmosXHJcbiAgTGlzdEtleVZhbHVlTW9udGgsXHJcbn0gZnJvbSBcIi4vbW9kZWwva2V5LXZhbHVlLXVjLXNlYXJjaC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBFeHBvcnRGaWxlU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL2V4cG9ydC1maWxlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IE5neFJvdXRlclNlcnZpY2UgfSBmcm9tIFwiQGFkaW5zL2ZlLWNvcmVcIjtcclxuaW1wb3J0IHsgVWNzZWFyY2hEYXRldGltZVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy91Y3NlYXJjaC1kYXRldGltZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IG1vbnRoc0tleVZhbHVlIH0gZnJvbSBcIi4vY29uc3RhbnRzL21vbnRoXCI7XHJcbmltcG9ydCB7IFVjc2VhcmNoRm9ybVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy91Y3NlYXJjaC1mb3JtLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi1VQ1NlYXJjaFwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vdWNzZWFyY2guY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vdWNzZWFyY2guY29tcG9uZW50LmNzc1wiXSxcclxuICBwcm92aWRlcnM6IFtEYXRlUGlwZSwgRXhwb3J0RmlsZVNlcnZpY2VdLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoXCJjaGFuZ2VEaXZTaXplXCIsIFtcclxuICAgICAgc3RhdGUoXHJcbiAgICAgICAgXCJpbml0aWFsXCIsXHJcbiAgICAgICAgc3R5bGUoe1xyXG4gICAgICAgICAgaGVpZ2h0OiBcIipcIixcclxuICAgICAgICAgIG9wYWNpdHk6IFwiMVwiLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIHN0YXRlKFxyXG4gICAgICAgIFwiZmluYWxcIixcclxuICAgICAgICBzdHlsZSh7XHJcbiAgICAgICAgICBoZWlnaHQ6IFwiMHB4XCIsXHJcbiAgICAgICAgICBvcGFjaXR5OiBcIjBcIixcclxuICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIHRyYW5zaXRpb24oXCJpbml0aWFsPT5maW5hbFwiLCBhbmltYXRlKFwiMzAwbXNcIikpLFxyXG4gICAgICB0cmFuc2l0aW9uKFwiZmluYWw9PmluaXRpYWxcIiwgYW5pbWF0ZShcIjMwMG1zXCIpKSxcclxuICAgIF0pLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVQ1NlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgLy8gaXNMaXN0SGlkZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgLy8gQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIC8vIG9uQ2xpY2soZXY6IE1vdXNlRXZlbnQpIHtcclxuICAvLyAgIGNvbnN0IGNsaWNrSW5zaWRlID0gdGhpcy5lbGVtUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXYudGFyZ2V0KTtcclxuICAvLyAgIGlmICghY2xpY2tJbnNpZGUpIHtcclxuICAvLyAgICAgdGhpcy5pc0xpc3RIaWRlID0gdHJ1ZTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJlbmppRm9ybVwiKSBzZXQgY29udGVudChjb250ZW50OiBOZ0Zvcm0pIHtcclxuICAgIGlmIChjb250ZW50KSB7XHJcbiAgICAgIC8vIGluaXRpYWxseSBzZXR0ZXIgZ2V0cyBjYWxsZWQgd2l0aCB1bmRlZmluZWRcclxuICAgICAgdGhpcy5zZWFyY2hGb3JtID0gY29udGVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJmb3JtSWRTZWFyY2hcIikgbXlGb3JtOiBFbGVtZW50UmVmO1xyXG4gIEBJbnB1dCgpIHNlYXJjaElucHV0OiBJbnB1dFNlYXJjaE9iaiA9IG5ldyBJbnB1dFNlYXJjaE9iaigpO1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcclxuICBASW5wdXQoKSBpc1JlcG9ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dScHRFeGVjVHlwZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSByZXN1bHQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBnZW5ScHQ6IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBFeHBvcnRUeXBlOiBudW1iZXI7XHJcbiAgICBScHRFeGVjVHlwZTogbnVtYmVyO1xyXG4gICAgRWxSZWY6IEVsZW1lbnRSZWY7XHJcbiAgICBmb3JtUmF3OiBhbnk7XHJcbiAgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHtcclxuICAgIEV4cG9ydFR5cGU6IG51bWJlcjtcclxuICAgIFJwdEV4ZWNUeXBlOiBudW1iZXI7XHJcbiAgICBFbFJlZjogRWxlbWVudFJlZjtcclxuICAgIGZvcm1SYXc6IGFueTtcclxuICB9PigpO1xyXG4gIEBPdXRwdXQoKSByZXFHZXRBbGxEYXRhOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBFeHBvcnRUeXBlTGlzdDogQXJyYXk8S2V5VmFsdWVSZXBvcnRPYmo+ID0gW1xyXG4gICAge1xyXG4gICAgICBrZXk6IEV4cG9ydFR5cGVDb25zdGFudC5FWFBfVFlQRV9QREYsXHJcbiAgICAgIHZhbHVlOiBcIlBERlwiLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAga2V5OiBFeHBvcnRUeXBlQ29uc3RhbnQuRVhQX1RZUEVfWExTWCxcclxuICAgICAgdmFsdWU6IFwiRXhjZWwgMjAwN1wiLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAga2V5OiBFeHBvcnRUeXBlQ29uc3RhbnQuRVhQX1RZUEVfRE9DWCxcclxuICAgICAgdmFsdWU6IFwiRG9jdW1lbnQgWE1MXCIsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBrZXk6IEV4cG9ydFR5cGVDb25zdGFudC5FWFBfVFlQRV9KUERGLFxyXG4gICAgICB2YWx1ZTogXCJKdXN0aWZ5IFBERlwiLFxyXG4gICAgfSxcclxuICBdO1xyXG5cclxuICBSZXBvcnRFeGVjVHlwZUxpc3Q6IEFycmF5PEtleVZhbHVlUmVwb3J0T2JqPiA9IFtcclxuICAgIHtcclxuICAgICAga2V5OiBSZXBvcnRFeGVjVHlwZUNvbnN0YW50LkVYRV9UWVBFX1NZTkMsXHJcbiAgICAgIHZhbHVlOiBcIlN5bmNcIixcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGtleTogUmVwb3J0RXhlY1R5cGVDb25zdGFudC5FWEVfVFlQRV9BU1lOQyxcclxuICAgICAgdmFsdWU6IFwiQXN5bmNcIixcclxuICAgIH0sXHJcbiAgXTtcclxuXHJcbiAgZXhwb3J0QXNGaWxlTGlzdCA9IFtcclxuICAgIHtcclxuICAgICAga2V5OiBcImNzdlwiLFxyXG4gICAgICB2YWx1ZTogXCJhcyBDU1ZcIixcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGtleTogXCJleGNlbFwiLFxyXG4gICAgICB2YWx1ZTogXCJhcyBFWENFTFwiLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAga2V5OiBcImpzb25cIixcclxuICAgICAgdmFsdWU6IFwiYXMgSlNPTlwiLFxyXG4gICAgfSxcclxuICBdO1xyXG5cclxuICBMaXN0T2ZNb250aDogTGlzdEtleVZhbHVlTW9udGggPSBuZXcgTGlzdEtleVZhbHVlTW9udGgoKTtcclxuICBMaXN0T2ZZZWFyOiBBcnJheTxLZXlWYWx1ZVVDU2VhcmNoT2JqPiA9IG5ldyBBcnJheTxLZXlWYWx1ZVVDU2VhcmNoT2JqPigpO1xyXG4gIENsYWltTGlzdDogQXJyYXk8YW55PiA9IFtcclxuICAgIHtcclxuICAgICAgS2V5OiBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uSXNOb3ROdWxsLFxyXG4gICAgICBWYWx1ZTogXCJDTEFJTUVEXCIsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBLZXk6IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25Jc051bGwsXHJcbiAgICAgIFZhbHVlOiBcIlVOQ0xBSU1FRFwiLFxyXG4gICAgfSxcclxuICBdO1xyXG5cclxuICBFeHBvcnRUeXBlOiBudW1iZXIgPSAwO1xyXG4gIFJwdEV4ZWNUeXBlOiBudW1iZXIgPSAwO1xyXG5cclxuICBwYWdlTm93OiBhbnkgPSAxO1xyXG4gIGNvbmZpZ3VyYXRpb246IGFueTtcclxuICBleHBvcnREYXRhOiBhbnk7XHJcbiAgRXhjZWxEYXRhOiBhbnk7XHJcbiAgaXNEYXRhTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNIaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBCaXNEdDogc3RyaW5nO1xyXG4gIEJ1c2luZXNzRHQ6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB2YWx1ZURpY3QgPSB7fTsgLy8gaG9sZCB0ZW1wb3JhcnkgdmFsdWUgZnJvbSBzZWxlY3RlZCBkcm9wZG93biwgdXNlZCBhcyBhIHBheWxvYWQgZm9yIGFub3RoZXIgc2VhcmNoIGNvbXBvbmVudFxyXG4gIGxvb2t1cERpY3QgPSB7fTsgLy8gaG9sZCB0ZW1wb3JhcnkgdmFsdWUgZnJvbSBzZWxlY3RlZCBsb29rdXAsIHVzZWQgYXMgYSBwYXlsb2FkIGZvciBhbm90aGVyIHNlYXJjaCBjb21wb25lbnRcclxuXHJcbiAgY3VycmVudFN0YXRlID0gXCJpbml0aWFsXCI7XHJcblxyXG4gIGZvcm06IEZvcm1Hcm91cDtcclxuICBjb3VudEZvcm0gPSAwO1xyXG4gIGZvcm1hdHRlZEFtb3VudCA9IFwiXCI7XHJcbiAgYW1vdW50ID0gMDtcclxuICBhcGlVcmw6IHN0cmluZztcclxuICBhcnJDcml0OiBhbnk7XHJcbiAgc2VhcmNoRm9ybTogTmdGb3JtO1xyXG4gIHF1ZXJ5UGFyYW06IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuICBwZXJzaXN0Q3JpdDogQ3JpdGVyaWFPYmpbXSA9IFtdO1xyXG4gIHBlcnNpc3RBZGRUb1RlbXBDcml0OiBDcml0ZXJpYU9ialtdO1xyXG4gIGxvb2t1cEtleVZhbERpY3Q6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuICBub3RpZnlVcGRhdGVLZXlWYWxEaWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBtb250aHMgPSBtb250aHNLZXlWYWx1ZTtcclxuICB5ZWFycyA9IFtdO1xyXG4gIHllYXJOb3cgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XHJcbiAgcHJpdmF0ZSBiYXNlWWVhciA9IDE5MDA7XHJcbiAgcHJpdmF0ZSBtaW5NYXhZZWFyID0gMjAwO1xyXG4gIHVzZU5ld0RhdGVwaWNrZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc2VhcmNoQnRuUmVhZHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwdWJsaWMgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb29raWVTZXJ2aWNlOiBDb29raWVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICBwcml2YXRlIGVsZW1SZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIGV4cG9ydEZpbGVTZXJ2aWNlOiBFeHBvcnRGaWxlU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBuZ3hSb3V0ZXI6IE5neFJvdXRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgZGF0ZXRpbWVTZXJ2aWNlOiBVY3NlYXJjaERhdGV0aW1lU2VydmljZSxcclxuICAgIHByaXZhdGUgdWNTZWFyY2hGb3JtU2VydmljZTogVWNzZWFyY2hGb3JtU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XHJcbiAgICAgIHRoaXMucXVlcnlQYXJhbSA9IHRoaXMubmd4Um91dGVyLmdldFF1ZXJ5UGFyYW1zKHBhcmFtcykgYXMgUmVjb3JkPFxyXG4gICAgICAgIHN0cmluZyxcclxuICAgICAgICBhbnlcclxuICAgICAgPjtcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMueWVhcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLmJhc2VZZWFyOyBpIDwgdGhpcy5iYXNlWWVhciArIHRoaXMubWluTWF4WWVhcjsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy55ZWFycy5wdXNoKGkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VTdGF0ZSgpIHtcclxuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5jdXJyZW50U3RhdGUgPT0gXCJpbml0aWFsXCIgPyBcImZpbmFsXCIgOiBcImluaXRpYWxcIjtcclxuICAgIHRoaXMuaXNIaWRkZW4gPSAhdGhpcy5pc0hpZGRlbiA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQ/LmVudmlyb25tZW50Py5leHBlcmltZW50YWw/LnVzZU5ld0RhdGVwaWNrZXIpIHtcclxuICAgICAgdGhpcy51c2VOZXdEYXRlcGlja2VyID1cclxuICAgICAgICB0aGlzLnNlYXJjaElucHV0LmVudmlyb25tZW50LmV4cGVyaW1lbnRhbC51c2VOZXdEYXRlcGlja2VyO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXBpVXJsID1cclxuICAgICAgdGhpcy5zZWFyY2hJbnB1dC5lbnZpcm9tZW50VXJsICsgdGhpcy5zZWFyY2hJbnB1dC5hcGlRcnlQYWdpbmc7XHJcbiAgICB0aGlzLmFyckNyaXQgPSB0aGlzLnNlYXJjaElucHV0LmFyckNyaXRPYmo7XHJcblxyXG4gICAgLy8gVG9nZ2xlIGZ1bmN0aW9uYWxpdHkgaGFuZGxlZCBieSBBbmd1bGFyJ3MgYnVpbHQtaW4gbWVjaGFuaXNtc1xyXG4gICAgLy8gQWxsIGludGVyYWN0aXZlIGZlYXR1cmVzIHVzZSBBbmd1bGFyIHJlYWN0aXZlIGZvcm1zIGFuZCBuYXRpdmUgRE9NIG1hbmlwdWxhdGlvblxyXG5cclxuICAgIGxldCB2YWx1ZSA9IHRoaXMuY29va2llU2VydmljZS5nZXQoXCJCdXNpbmVzc0RhdGVSYXdcIik7XHJcbiAgICB0aGlzLkJpc0R0ID0gdGhpcy5EZWNyeXB0U3RyaW5nKHZhbHVlLCBcIkFkSW5zRk9VMTIzNDU2NzhcIik7XHJcbiAgICB0aGlzLkJ1c2luZXNzRHQgPSBuZXcgRGF0ZSh0aGlzLkJpc0R0KTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkRGF0ZSh0aGlzLkJ1c2luZXNzRHQpKSB7XHJcbiAgICAgIHRoaXMueWVhck5vdyA9IHRoaXMuQnVzaW5lc3NEdC5nZXRGdWxsWWVhcigpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5pbml0aWF0ZUZvcm0odHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0aWF0ZUZvcm0oaXNJbml0OiBib29sZWFuKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQuZGF0YUlucHV0ICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5zZWFyY2hJbnB1dC5kYXRhSW5wdXQpLmxlbmd0aCAhPT0gMFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuc2V0Q29uZmlndXJhdGlvbkRhdGEoXHJcbiAgICAgICAgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlYXJjaElucHV0LmRhdGFJbnB1dCkpLFxyXG4gICAgICAgIGlzSW5pdFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLmh0dHBcclxuICAgICAgLmdldCh0aGlzLnNlYXJjaElucHV0Ll91cmwpXHJcbiAgICAgIC50b1Byb21pc2UoKVxyXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0Q29uZmlndXJhdGlvbkRhdGEoZGF0YSwgaXNJbml0KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRDb25maWd1cmF0aW9uRGF0YShkYXRhOiBhbnksIGlzSW5pdDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gZGF0YTtcclxuICAgIHRoaXMuZXhwb3J0RGF0YSA9IGRhdGEuZXhwb3J0RXhjZWw7XHJcbiAgICBpZiAoZGF0YS5leHBvcnRUeXBlTGlzdCAhPSB1bmRlZmluZWQgJiYgZGF0YS5leHBvcnRUeXBlTGlzdC5sZW5ndGggIT0gMCkge1xyXG4gICAgICB0aGlzLkV4cG9ydFR5cGVMaXN0ID0gZGF0YS5leHBvcnRUeXBlTGlzdDtcclxuICAgICAgdGhpcy5FeHBvcnRUeXBlID0gdGhpcy5FeHBvcnRUeXBlTGlzdFswXS5rZXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLkV4cG9ydFR5cGUgPSB0aGlzLkV4cG9ydFR5cGVMaXN0WzBdLmtleTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNJbml0KSB7XHJcbiAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKFwiRXhwb3J0VHlwZVwiLCB0aGlzLmZiLmNvbnRyb2woXCJcIikpO1xyXG4gICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChcIlJwdEV4ZWNUeXBlXCIsIHRoaXMuZmIuY29udHJvbChcIlwiKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm0uY29udHJvbHNbXCJFeHBvcnRUeXBlXCJdLnNldFZhbHVlKHRoaXMuRXhwb3J0VHlwZSk7XHJcbiAgICB0aGlzLmZvcm0uY29udHJvbHNbXCJScHRFeGVjVHlwZVwiXS5zZXRWYWx1ZSh0aGlzLlJwdEV4ZWNUeXBlKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIGRhdGEuZXhwb3J0QXNGaWxlTGlzdCAhPSB1bmRlZmluZWQgJiZcclxuICAgICAgZGF0YS5leHBvcnRBc0ZpbGVMaXN0Lmxlbmd0aCAhPSAwXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5leHBvcnRBc0ZpbGVMaXN0ID0gZGF0YS5leHBvcnRBc0ZpbGVMaXN0O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY291bnRGb3JtID0gZGF0YS5jb21wb25lbnQubGVuZ3RoO1xyXG4gICAgdGhpcy5pc0RhdGFMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnRpdGxlICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlYXJjaElucHV0LnRpdGxlICE9IFwiXCIpIHtcclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnRpdGxlID0gdGhpcy5zZWFyY2hJbnB1dC50aXRsZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1c2VyQWNjZXNzID0gdGhpcy5nZXRVc2VyQWNjZXNzKCk7XHJcbiAgICBjb25zdCBpbnB1dEVmZmVjdCA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50Rm9ybTsgaSsrKSB7XHJcbiAgICAgIC8vaW5pIGthbGF1IGRhdGFueWEgZGkgbG9hZCBkYXJpIFVSTFxyXG4gICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uaXNGcm9tVVJMKSB7XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XHJcbiAgICAgICAgbGV0IGFycmF5Q3JpdCA9IG5ldyBBcnJheSgpO1xyXG4gICAgICAgIGxldCBjcml0ZXJpYU9iamVjdCA9IG5ldyBDcml0ZXJpYU9iaigpO1xyXG4gICAgICAgIGNyaXRlcmlhT2JqZWN0LkRhdGFUeXBlID0gXCJ0ZXh0XCI7XHJcbiAgICAgICAgY3JpdGVyaWFPYmplY3QucHJvcE5hbWUgPSBkYXRhLmNvbXBvbmVudFtpXS5jcml0ZXJpYVByb3BOYW1lO1xyXG4gICAgICAgIGNyaXRlcmlhT2JqZWN0LnZhbHVlID1cclxuICAgICAgICAgIHRoaXMucXVlcnlQYXJhbVtkYXRhLmNvbXBvbmVudFtpXS5jcml0ZXJpYVByb3BWYWx1ZV0gfHxcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcFZhbHVlO1xyXG4gICAgICAgIGNyaXRlcmlhT2JqZWN0LnJlc3RyaWN0aW9uID0gXCJlcVwiO1xyXG4gICAgICAgIGFycmF5Q3JpdC5wdXNoKGNyaXRlcmlhT2JqZWN0KTtcclxuICAgICAgICByZXF1ZXN0LmNyaXRlcmlhID0gYXJyYXlDcml0O1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcE5hbWUgIT09IG51bGwgJiZcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcE5hbWUgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgY29uc3QgX2NyaXRQcm9wTmFtZUFyciA9IChcclxuICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uY3JpdGVyaWFQcm9wTmFtZSBhcyBzdHJpbmdcclxuICAgICAgICAgICkuc3BsaXQoXCI7XCIpO1xyXG4gICAgICAgICAgY29uc3QgX2NyaXRQcm9wVmFsdWVBcnIgPSAoXHJcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcFZhbHVlIGFzIHN0cmluZ1xyXG4gICAgICAgICAgKS5zcGxpdChcIjtcIik7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBfY3JpdFByb3BOYW1lQXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RbX2NyaXRQcm9wTmFtZUFycltpXV0gPVxyXG4gICAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbVtfY3JpdFByb3BWYWx1ZUFycltpXV0gfHxcclxuICAgICAgICAgICAgICB1c2VyQWNjZXNzW19jcml0UHJvcFZhbHVlQXJyW2ldXSB8fFxyXG4gICAgICAgICAgICAgIF9jcml0UHJvcFZhbHVlQXJyW2ldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUGVuZ2VjZWthbiBwZW5nZ3VuYWFuIHVybCBhdGF1IHBhdGhcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5wYXRoICE9IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0ucGF0aCAhPSBcIlwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cyAhPSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzLmxlbmd0aCAhPSAwXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoOyB5KyspIHtcclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5lbnZpcm9ubWVudCA9PVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzW3ldLmVudmlyb25tZW50XHJcbiAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCA9XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50c1t5XS51cmwgK1xyXG4gICAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5wYXRoO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCA9IGRhdGEuY29tcG9uZW50W2ldLnVybDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uZnVsbHBhdGggPSBkYXRhLmNvbXBvbmVudFtpXS51cmw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vbGVtcGFyIG9iamVjdG55YSBzZWthbGlhbiBzYW1hIHVybG55YSwgbm50aSBkaSBiaW5kIGRpIGRhbGVtIGthcmVuYSBtYXNhbGFoIGRpIGFzeW5jbnlhXHJcbiAgICAgICAgLy9iaWFyIHRpYXAgZnVuY3Rpb24gYWRhIHN0YXRlMm55YSBzZW5kaXJpXHJcbiAgICAgICAgdGhpcy5yZXNvbHZlT2JqZWN0KFxyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0sXHJcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCxcclxuICAgICAgICAgIHJlcXVlc3RcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICFkYXRhLmNvbXBvbmVudFtpXS5pc0Zyb21VcmwgJiZcclxuICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS50eXBlID09PSBcImRyb3Bkb3duXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0/Lml0ZW1zPy5sZW5ndGggPT09IDEgJiZcclxuICAgICAgICAgICFkYXRhLmNvbXBvbmVudFtpXT8ua2VlcERkbFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5sb29rdXBLZXlWYWxEaWN0W2RhdGEuY29tcG9uZW50W2ldLm5hbWVdID1cclxuICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uaXRlbXNbMF0ua2V5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0/Lml0ZW1zPy5sZW5ndGggPiAxICYmXHJcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXT8udXNlRmlyc3RWYWx1ZVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBkYXRhLmNvbXBvbmVudFtpXS5pdGVtc1swXS5rZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PSBcIm51bWVyaWNcIikge1xyXG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSAmJiAhaXNOYU4oZGF0YS5jb21wb25lbnRbaV0udmFsdWUpKSB7XHJcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IHBhcnNlRmxvYXQoXHJcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlXHJcbiAgICAgICAgICApLnRvTG9jYWxlU3RyaW5nKFwiZW5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL3BlbmdlY2VrYW4gZGRsXHJcbiAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09IFwiZHJvcGRvd25cIikge1xyXG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kdG1UeXBlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmR0bVR5cGUuaW5jbHVkZXMoXCJtb250aFwiKSkge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgIT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUuaW5jbHVkZXMoXCJCRFwiKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IHRoaXMuc2V0RGVmYXVsdFZhbHVlTW9udGgoXHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uaXRlbXMgPSB0aGlzLnNldE1vbnRoRERMKFxyXG4gICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmR0bVR5cGVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kdG1UeXBlLmluY2x1ZGVzKFwieWVhclwiKSkge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgIT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUuaW5jbHVkZXMoXCJCRFwiKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IHRoaXMuc2V0RGVmYXVsdFZhbHVlWWVhcihcclxuICAgICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5pdGVtcyA9IHRoaXMuc2V0WWVhckRETChcclxuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5kdG1UeXBlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09IFwiZHJvcGRvd25TZWFyY2hcIiAmJiAhZGF0YS5jb21wb25lbnRbaV0uaXNGcm9tVVJMICYmIGRhdGEuY29tcG9uZW50W2ldLml0ZW1zPy5sZW5ndGggIT0gMSkge1xyXG4gICAgICAvLyAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kZHNUeXBlID09IHVuZGVmaW5lZCB8fCBkYXRhLmNvbXBvbmVudFtpXS5kZHNUeXBlID09IFwiYWxsXCIpIHtcclxuICAgICAgLy8gICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gXCJhbGxcIjtcclxuICAgICAgLy8gICAgIGRhdGEuY29tcG9uZW50W2ldLmRlc2NyID0gXCJBbGxcIjtcclxuICAgICAgLy8gICB9IGVsc2UgaWYgKGRhdGEuY29tcG9uZW50W2ldLmRkc1R5cGUgPT0gXCJvbmVcIikge1xyXG4gICAgICAvLyAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBcIm9uZVwiO1xyXG4gICAgICAvLyAgICAgZGF0YS5jb21wb25lbnRbaV0uZGVzY3IgPSBcIlNlbGVjdCBPbmVcIjtcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH1cclxuICAgICAgaWYgKFxyXG4gICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkcm9wZG93blNlYXJjaFwiICYmXHJcbiAgICAgICAgIWRhdGEuY29tcG9uZW50W2ldLmlzRnJvbVVSTCAmJlxyXG4gICAgICAgIGRhdGEuY29tcG9uZW50W2ldLml0ZW1zLmxlbmd0aCA9PSAxXHJcbiAgICAgICkge1xyXG4gICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gZGF0YS5jb21wb25lbnRbaV0uaXRlbXNbMF0uS2V5O1xyXG4gICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmRlc2NyID0gZGF0YS5jb21wb25lbnRbaV0uaXRlbXNbMF0uVmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKFxyXG4gICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnR5cGUgIT0gXCJkcm9wZG93blNlYXJjaFwiICYmXHJcbiAgICAgICAgIWRhdGEuY29tcG9uZW50W2ldLnZhbHVlXHJcbiAgICAgICkge1xyXG4gICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gXCJcIjtcclxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZGRsVHlwZSA9PSBcImFsbFwiKSBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IFwiYWxsXCI7XHJcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmRkbFR5cGUgPT0gXCJvbmVcIikgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBcIm9uZVwiO1xyXG4gICAgICB9XHJcbiAgICAgIC8vcGVuZ2VjZWthbiB0YW5nZ2FsXHJcbiAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09IFwiZGF0ZXBpY2tlclwiKSB7XHJcbiAgICAgICAgdGhpcy5yZWFkb25seSA9IGRhdGEuY29tcG9uZW50W2ldLnJlYWRvbmx5O1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgZHluYW1pYyBkYXRlIHZhbHVlczogQkQsIGZpcnN0RGF5T2ZNb250aCwgbGFzdERheU9mTW9udGggd2l0aCArLy0gb3BlcmF0b3JzXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPT09IFwiZmlyc3REYXlPZk1vbnRoXCIgfHxcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID09PSBcImxhc3REYXlPZk1vbnRoXCIgfHxcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLmluY2x1ZGVzKFwiQkRcIikgfHxcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLmluY2x1ZGVzKFwiZmlyc3REYXlPZk1vbnRoXCIpIHx8XHJcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcImxhc3REYXlPZk1vbnRoXCIpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBsZXQgYmFzZURhdGUgPSB0aGlzLmdldEJ1c2luZXNzRGF0ZSh0aGlzLkJpc0R0KTtcclxuXHJcbiAgICAgICAgICAvLyBTZXQgYmFzZSBkYXRlIGJhc2VkIG9uIHR5cGVcclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcImZpcnN0RGF5T2ZNb250aFwiKSkge1xyXG4gICAgICAgICAgICBiYXNlRGF0ZSA9IHRoaXMuZ2V0Rmlyc3REYXlPZk1vbnRoKGJhc2VEYXRlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jb21wb25lbnRbaV0udmFsdWUuaW5jbHVkZXMoXCJsYXN0RGF5T2ZNb250aFwiKSkge1xyXG4gICAgICAgICAgICBiYXNlRGF0ZSA9IHRoaXMuZ2V0TGFzdERheU9mTW9udGgoYmFzZURhdGUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIEZpbmQgb3BlcmF0b3IgcG9zaXRpb24gYmFzZWQgb24gZGF0ZSB0eXBlXHJcbiAgICAgICAgICBsZXQgb3BlcmF0b3IgPSBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5jaGFyQXQoXHJcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLmluY2x1ZGVzKFwiQkRcIilcclxuICAgICAgICAgICAgICA/IDJcclxuICAgICAgICAgICAgICA6IGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLmluY2x1ZGVzKFwiZmlyc3REYXlPZk1vbnRoXCIpXHJcbiAgICAgICAgICAgICAgPyAxNVxyXG4gICAgICAgICAgICAgIDogMTRcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgLy8gQXBwbHkgZGF0ZSBhcml0aG1ldGljXHJcbiAgICAgICAgICBpZiAob3BlcmF0b3IgPT0gXCItXCIpIHtcclxuICAgICAgICAgICAgbGV0IG51bURheSA9IHBhcnNlSW50KGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLnNwbGl0KFwiLVwiLCAyKVsxXSk7XHJcbiAgICAgICAgICAgIGJhc2VEYXRlLnNldERhdGUoYmFzZURhdGUuZ2V0RGF0ZSgpIC0gbnVtRGF5KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT0gXCIrXCIpIHtcclxuICAgICAgICAgICAgbGV0IG51bURheSA9IHBhcnNlSW50KGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLnNwbGl0KFwiK1wiLCAyKVsxXSk7XHJcbiAgICAgICAgICAgIGJhc2VEYXRlLnNldERhdGUoYmFzZURhdGUuZ2V0RGF0ZSgpICsgbnVtRGF5KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IGZvcm1hdERhdGUoYmFzZURhdGUsIFwieXl5eS1NTS1kZFwiLCBcImVuLVVTXCIpO1xyXG4gICAgICAgICAgaW5wdXRFZmZlY3QucHVzaCh7IGtleTogXCJkYXRlcGlja2VyXCIsIHZhbHVlOiBkYXRhLmNvbXBvbmVudFtpXSB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5yZWFkb25seSkge1xyXG4gICAgICAgICAgLy8gc2V0IG1pbiBkYXRlIGFuZCBtYXggZGF0ZVxyXG4gICAgICAgICAgY29uc3QgX3Jlc3RyaWN0aW9uID0gZGF0YS5jb21wb25lbnRbaV0ucmVzdHJpY3Rpb24/LnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICBsZXQgX21pbkRhdGUgPSBkYXRhLmNvbXBvbmVudFtpXS5taW5EYXRlPy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgaWYgKF9taW5EYXRlICE9IHVuZGVmaW5lZCAmJiBfbWluRGF0ZSAhPSBudWxsICYmIF9taW5EYXRlICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uY29uZk1pbkRhdGUgPSBkYXRhLmNvbXBvbmVudFtpXS5taW5EYXRlO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgX21pbkRhdGUgPT0gXCJiZFwiIHx8XHJcbiAgICAgICAgICAgICAgX21pbkRhdGUgPT0gXCJidXNpbmVzc2RhdGVcIiB8fFxyXG4gICAgICAgICAgICAgIF9taW5EYXRlID09IFwiYnVzaW5lc3NkdFwiXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIF9taW5EYXRlID0gdGhpcy5CdXNpbmVzc0R0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWREYXRlKF9taW5EYXRlKSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IF9mbGFnID0gdGhpcy5kYXRldGltZVNlcnZpY2UuQ2hlY2tEYXRlVHlwZShcclxuICAgICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldPy5hZGRpdGlvbk1pbkRhdGVDb25mID8/IFwiYmRcIlxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgbGV0IG1pbkRhdGUgPSB0aGlzLmRhdGV0aW1lU2VydmljZS5HZXROZXdEYXRlKFxyXG4gICAgICAgICAgICAgICAgX2ZsYWcsXHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXT8uYWRkaXRpb25NaW5EYXRlQ29uZixcclxuICAgICAgICAgICAgICAgIF9taW5EYXRlXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBpZiAoX3Jlc3RyaWN0aW9uID09IFwiR1RcIiB8fCBfcmVzdHJpY3Rpb24gPT0gXCJMVFwiKSB7XHJcbiAgICAgICAgICAgICAgICBtaW5EYXRlLnNldERhdGUobWluRGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbWluRGF0ZS5zZXREYXRlKG1pbkRhdGUuZ2V0RGF0ZSgpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0ubWluRGF0ZSA9IG1pbkRhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBfbWF4RGF0ZSA9IGRhdGEuY29tcG9uZW50W2ldLm1heERhdGU/LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICBpZiAoX21heERhdGUgIT0gdW5kZWZpbmVkICYmIF9tYXhEYXRlICE9IG51bGwgJiYgX21heERhdGUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5jb25mTWF4RGF0ZSA9IGRhdGEuY29tcG9uZW50W2ldLm1heERhdGU7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBfbWF4RGF0ZSA9PSBcImJkXCIgfHxcclxuICAgICAgICAgICAgICBfbWF4RGF0ZSA9PSBcImJ1c2luZXNzZGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgX21heERhdGUgPT0gXCJidXNpbmVzc2R0XCJcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgX21heERhdGUgPSB0aGlzLkJ1c2luZXNzRHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZERhdGUoX21heERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgX2ZsYWcgPSB0aGlzLmRhdGV0aW1lU2VydmljZS5DaGVja0RhdGVUeXBlKFxyXG4gICAgICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0/LmFkZGl0aW9uTWF4RGF0ZUNvbmYgPz8gXCJiZFwiXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBsZXQgbWF4RGF0ZSA9IHRoaXMuZGF0ZXRpbWVTZXJ2aWNlLkdldE5ld0RhdGUoXHJcbiAgICAgICAgICAgICAgICBfZmxhZyxcclxuICAgICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldPy5hZGRpdGlvbk1heERhdGVDb25mLFxyXG4gICAgICAgICAgICAgICAgX21heERhdGVcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGlmIChfcmVzdHJpY3Rpb24gPT0gXCJMVFwiIHx8IF9yZXN0cmljdGlvbiA9PSBcIkdUXCIpIHtcclxuICAgICAgICAgICAgICAgIG1heERhdGUuc2V0RGF0ZShtYXhEYXRlLmdldERhdGUoKSAtIDEpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBtYXhEYXRlLnNldERhdGUobWF4RGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5tYXhEYXRlID0gbWF4RGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJ0ZXh0Ym94XCIpIHtcclxuICAgICAgICBjb25zdCBpc1VwcGVyY2FzZSA9XHJcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5pc1VwcGVyY2FzZSA9PT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgID8gdHJ1ZVxyXG4gICAgICAgICAgICA6IGRhdGEuY29tcG9uZW50W2ldLmlzVXBwZXJjYXNlO1xyXG4gICAgICAgIGNvbnN0IF92YWx1ZSA9IHRoaXMuYXV0b2ZpbGwoZGF0YS5jb21wb25lbnRbaV0pO1xyXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udmFsdWUgPSBpc1VwcGVyY2FzZVxyXG4gICAgICAgICAgPyBfdmFsdWUudG9VcHBlckNhc2UoKVxyXG4gICAgICAgICAgOiBfdmFsdWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09IFwiZHJvcGRvd25cIikge1xyXG4gICAgICAgIGNvbnN0IF92YWx1ZSA9IHRoaXMuYXV0b2ZpbGwoZGF0YS5jb21wb25lbnRbaV0sIGZhbHNlKTtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnZhbHVlID0gX3ZhbHVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PT0gXCJsb29rdXBcIikge1xyXG4gICAgICAgIGlmICghaXNJbml0KSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbZGF0YS5jb21wb25lbnRbaV0ubmFtZV0uZ2V0KFwidmFsdWVcIikuc2V0VmFsdWUoXCJcIik7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaElucHV0LmRpY3RMb29rdXBPYmpbZGF0YS5jb21wb25lbnRbaV0ubmFtZV0ubmFtZVNlbGVjdCA9XHJcbiAgICAgICAgICAgIFwiXCI7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaElucHV0LmRpY3RMb29rdXBPYmpbZGF0YS5jb21wb25lbnRbaV0ubmFtZV0uaWRTZWxlY3QgPSBcIlwiO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW1wibG9va3VwX2lkX1wiICsgZGF0YS5jb21wb25lbnRbaV0ubmFtZV0uc2V0VmFsdWUoXHJcbiAgICAgICAgICAgIFwiXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKFxyXG4gICAgICAgICAgICBcImxvb2t1cF9pZF9cIiArIGRhdGEuY29tcG9uZW50W2ldLm5hbWUsXHJcbiAgICAgICAgICAgIHRoaXMuZmIuY29udHJvbChcIlwiKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGNvbnRyb2xOYW1lID0gZGF0YS5jb21wb25lbnRbaV0ubmFtZTtcclxuICAgICAgbGV0IF92YWx1ZSA9IGRhdGEuY29tcG9uZW50W2ldPy52YWx1ZSA/PyBcIlwiO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PT0gXCJkYXRlcGlja2VyXCIgfHxcclxuICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS50eXBlID09PSBcIm51bWVyaWNcIiB8fFxyXG4gICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT09IFwiY3VycmVuY3lcIlxyXG4gICAgICApXHJcbiAgICAgICAgY29udHJvbE5hbWUgKz0gaTtcclxuICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT09IFwiZHJvcGRvd25cIiAmJiBfdmFsdWUgPT09IFwiXCIpIHtcclxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZGRsVHlwZSA9PT0gXCJvbmVcIikgX3ZhbHVlID0gXCJvbmVcIjtcclxuICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmRkbFR5cGUgPT09IFwiYWxsXCIgfHxcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmRkbFR5cGUgPT09IHVuZGVmaW5lZFxyXG4gICAgICAgIClcclxuICAgICAgICAgIF92YWx1ZSA9IFwiYWxsXCI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT09IFwieWVhclwiKSB7XHJcbiAgICAgICAgX3ZhbHVlID0gdGhpcy55ZWFyTm93O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc0luaXQpIHtcclxuICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChjb250cm9sTmFtZSwgdGhpcy5mYi5jb250cm9sKFwiXCIpKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm0uY29udHJvbHNbY29udHJvbE5hbWVdLnNldFZhbHVlKF92YWx1ZSk7XHJcbiAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5pc1JlcXVpcmVkKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uY29udHJvbHNbY29udHJvbE5hbWVdO1xyXG4gICAgICAgIGNvbnN0IGxpc3RWYWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW1ZhbGlkYXRvcnMucmVxdWlyZWRdO1xyXG4gICAgICAgIGZvcm1Db250cm9sLnNldFZhbGlkYXRvcnMobGlzdFZhbGlkYXRvcnMpO1xyXG4gICAgICAgIGZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT09IFwibnVtZXJpY1wiIHx8XHJcbiAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PT0gXCJjdXJyZW5jeVwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLm1pbiAhPT0gbnVsbCAmJlxyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0ubWluICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLm1pbiAhPT0gXCJcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5zZXRWYWxpZGF0b3JOdW1iZXIoXHJcbiAgICAgICAgICAgIFwiTUlOXCIsXHJcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLm1pbixcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2NvbnRyb2xOYW1lXVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLm1heCAhPT0gbnVsbCAmJlxyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0ubWF4ICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLm1heCAhPT0gXCJcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5zZXRWYWxpZGF0b3JOdW1iZXIoXHJcbiAgICAgICAgICAgIFwiTUFYXCIsXHJcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLm1heCxcclxuICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2NvbnRyb2xOYW1lXVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gZW5hYmxlIHNlYXJjaCBidXR0b24gdG8gY2xpY2sgYW5kIGludGVyYWN0XHJcbiAgICAgIHRoaXMuc2VhcmNoQnRuUmVhZHkgPSB0cnVlO1xyXG5cclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvdW50Rm9ybTsgaisrKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbal0uaXNFdmVudCAmJlxyXG4gICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtqXS5pdGVtc1VybC5sZW5ndGggPT0gMVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZUV2ZW50KFxyXG4gICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtqXS5pdGVtc1VybFswXS5LZXksXHJcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2pdXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtqXS50eXBlID09IFwib2ZmaWNlUm9sZUNvZGVzXCIgJiZcclxuICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbal0uaXRlbXNVcmwubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5TZXRSb2xlT2ZmaWNlQ29kZXMoaik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBpbnB1dEVmZmVjdC5lbnRyaWVzKCkpIHtcclxuICAgICAgICBpZiAoaXRlbS5rZXkgPT09IFwiZGF0ZXBpY2tlclwiKSB7XHJcbiAgICAgICAgICB0aGlzLmNoZWNrSW5wdXREYXRlKGl0ZW0udmFsdWUsIGluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIDEwMDApO1xyXG5cclxuICAgIHRoaXMuc2V0SW5pdGlhbExvb2t1cEtleVZhbERpY3QoKTtcclxuICAgIHRoaXMudWNTZWFyY2hGb3JtU2VydmljZS5zZXRGb3JtKHRoaXMuZm9ybSk7XHJcbiAgfVxyXG5cclxuICBnZXRCdXNpbmVzc0RhdGUoYmlzRHQ6IGFueSk6IERhdGUge1xyXG4gICAgcmV0dXJuIGJpc0R0ICE9IG51bGwgPyBuZXcgRGF0ZShiaXNEdCkgOiBuZXcgRGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rmlyc3REYXlPZk1vbnRoKGRhdGU6IERhdGUpOiBEYXRlIHtcclxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSk7XHJcbiAgfVxyXG5cclxuICBnZXRMYXN0RGF5T2ZNb250aChkYXRlOiBEYXRlKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCAwKTtcclxuICB9XHJcblxyXG4gIHNldEluaXRpYWxMb29rdXBLZXlWYWxEaWN0KCkge1xyXG4gICAgY29uc3QgYXJyRGF0YTogYW55W10gPSB0aGlzLmNvbmZpZ3VyYXRpb24/LmNvbXBvbmVudCA/PyBbXTtcclxuICAgIGZvciAobGV0IGl0ZW0gb2YgYXJyRGF0YSkge1xyXG4gICAgICBpZiAoIXRoaXMubG9va3VwS2V5VmFsRGljdFtpdGVtLm5hbWVdKSB7XHJcbiAgICAgICAgdGhpcy5sb29rdXBLZXlWYWxEaWN0W2l0ZW0ubmFtZV0gPSBpdGVtLnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFVzZXJBY2Nlc3MoKSB7XHJcbiAgICBjb25zdCBfdXNlckFjY2Vzczogc3RyaW5nID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChcIlVzZXJBY2Nlc3NcIik7XHJcbiAgICBjb25zdCB1c2VyQWNjZXNzID0gSlNPTi5wYXJzZShcclxuICAgICAgdGhpcy5EZWNyeXB0U3RyaW5nKF91c2VyQWNjZXNzLCBcIkFkSW5zRk9VMTIzNDU2NzhcIilcclxuICAgICk7XHJcbiAgICByZXR1cm4gdXNlckFjY2VzcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXV0b2ZpbGwoZGF0YTogYW55LCBjaGVja1ZhbHVlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgaWYgKGNoZWNrVmFsdWUpIHtcclxuICAgICAgaWYgKGRhdGEudmFsdWUgIT0gXCJcIikgcmV0dXJuIGRhdGEudmFsdWU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhdXRvZmlsbDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IGRhdGEuYXV0b2ZpbGw7XHJcbiAgICBpZiAoYXV0b2ZpbGwgPT0gdW5kZWZpbmVkKSByZXR1cm4gZGF0YS52YWx1ZTtcclxuICAgIGlmIChhdXRvZmlsbC5zb3VyY2UgPT0gXCJwYXJhbVwiKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UGFyYW1bYXV0b2ZpbGwua2V5XTtcclxuICAgIH1cclxuICAgIGlmIChhdXRvZmlsbC5zb3VyY2UgPT0gXCJ1c2VyYWNjZXNzXCIpIHtcclxuICAgICAgY29uc3QgdXNlckFjY2VzcyA9IHRoaXMuZ2V0VXNlckFjY2VzcygpO1xyXG4gICAgICByZXR1cm4gdXNlckFjY2Vzc1thdXRvZmlsbC5rZXldO1xyXG4gICAgfVxyXG4gICAgaWYgKGF1dG9maWxsLnNvdXJjZSA9PSBcImRpY3RzXCIpIHtcclxuICAgICAgaWYgKCF0aGlzLnNlYXJjaElucHV0LmRpY3RzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJkaWN0cyB1bmRlZmluZWQuLi5cIik7XHJcbiAgICAgICAgcmV0dXJuIGF1dG9maWxsLmtleTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hJbnB1dD8uZGljdHNbYXV0b2ZpbGwua2V5XSA/PyBhdXRvZmlsbC5rZXk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YS52YWx1ZTtcclxuICB9XHJcblxyXG4gIGlzVmFsaWREYXRlKGQ6IGFueSkge1xyXG4gICAgcmV0dXJuICFpc05hTihuZXcgRGF0ZShkKSBhcyBhbnkpO1xyXG4gIH1cclxuXHJcbiAgU2V0Um9sZU9mZmljZUNvZGVzKGk6IG51bWJlcikge1xyXG4gICAgbGV0IHVzZXJBY2Nlc3M6IHN0cmluZyA9IHRoaXMuZ2V0VXNlckFjY2VzcygpO1xyXG4gICAgbGV0IHJvbGVDb2RlOiBzdHJpbmcgPSB1c2VyQWNjZXNzW1wiUm9sZUNvZGVcIl07XHJcbiAgICBsZXQgbGlzdE9mZmljZVJvbGVDb2RlczogQXJyYXk8c3RyaW5nPiA9IG5ldyBBcnJheSgpO1xyXG4gICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKHJvbGVDb2RlKTtcclxuICAgIGxldCBjb21wb25lbnQgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W2ldO1xyXG4gICAgbGV0IGRkbCA9IGNvbXBvbmVudC5vcHRpb25zO1xyXG4gICAgbGV0IHRleHQgPSBkZGxbZGRsLnNlbGVjdGVkSW5kZXhdLnZhbHVlLnRyaW0oKTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5pdGVtc1VybC5sZW5ndGggPT0gMSB8fFxyXG4gICAgICAodGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5kZGxUeXBlID09IFwiYWxsXCIgJiYgdGV4dCA9PSBcImFsbFwiKVxyXG4gICAgKSB7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBpbmRleCA8IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0uaXRlbXNVcmwubGVuZ3RoO1xyXG4gICAgICAgIGluZGV4KytcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0uaXRlbXNVcmxbaW5kZXhdO1xyXG4gICAgICAgIGxpc3RPZmZpY2VSb2xlQ29kZXMucHVzaChlbGVtZW50LktleSk7XHJcbiAgICAgICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKHJvbGVDb2RlICsgXCItXCIgKyBlbGVtZW50LktleSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxpc3RPZmZpY2VSb2xlQ29kZXMucHVzaCh0ZXh0KTtcclxuICAgICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKHJvbGVDb2RlICsgXCItXCIgKyB0ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaElucHV0LmludGVncmF0aW9uT2JqLnJlcXVlc3RPYmpbXCJPZmZpY2VSb2xlQ29kZXNcIl0gPVxyXG4gICAgICBsaXN0T2ZmaWNlUm9sZUNvZGVzO1xyXG4gICAgdGhpcy51cGRhdGVLZXlWYWxEaWN0KHtcclxuICAgICAga2V5OiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLm5hbWUsXHJcbiAgICAgIHZhbHVlOiB0ZXh0LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXREZWZhdWx0VmFsdWVNb250aCh2YWx1ZSkge1xyXG4gICAgbGV0IGJ1c2luZXNzRGF0ZSA9IG5ldyBEYXRlKHRoaXMuQnVzaW5lc3NEdCk7XHJcbiAgICBsZXQgb3BlcmF0b3IgPSB2YWx1ZS5jaGFyQXQoMik7XHJcbiAgICBsZXQgdGVtcFZhbHVlID0gdmFsdWUuc3BsaXQob3BlcmF0b3IsIDIpO1xyXG4gICAgbGV0IG51bU1vbnRoID0gcGFyc2VJbnQodGVtcFZhbHVlWzFdKTtcclxuICAgIGlmICghbnVtTW9udGgpIG51bU1vbnRoID0gMTtcclxuICAgIGlmIChvcGVyYXRvciA9PSBcIi1cIikge1xyXG4gICAgICBidXNpbmVzc0RhdGUuc2V0TW9udGgoYnVzaW5lc3NEYXRlLmdldE1vbnRoKCkgLSBudW1Nb250aCk7XHJcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09IFwiK1wiKSB7XHJcbiAgICAgIGJ1c2luZXNzRGF0ZS5zZXRNb250aChidXNpbmVzc0RhdGUuZ2V0TW9udGgoKSArIG51bU1vbnRoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBidXNpbmVzc0RhdGUuZ2V0TW9udGgoKTtcclxuICB9XHJcbiAgc2V0TW9udGhEREwobW9udGgpIHtcclxuICAgIGlmIChtb250aCA9PSBcIm1vbnRoXCIpIHJldHVybiB0aGlzLkxpc3RPZk1vbnRoLkxpc3RPZk1vbnRoO1xyXG4gICAgbGV0IExpc3RPZk1vbnRoOiBBcnJheTxLZXlWYWx1ZVVDU2VhcmNoT2JqPiA9IG5ldyBBcnJheSgpO1xyXG4gICAgbGV0IGVxdWF0aW9uID0gbW9udGgubWF0Y2goXCJbXFxcXCtdWy1dfFstXVtcXFxcK118XFxcXCt8LVwiKTtcclxuICAgIGxldCB0b01pbjogbnVtYmVyID0gdGhpcy5CdXNpbmVzc0R0LmdldE1vbnRoKCk7XHJcbiAgICBsZXQgdG9NYXg6IG51bWJlciA9IHRoaXMuQnVzaW5lc3NEdC5nZXRNb250aCgpO1xyXG4gICAgbGV0IG1pbk1heDogbnVtYmVyID0gcGFyc2VJbnQoXHJcbiAgICAgIG1vbnRoLnN1YnN0cmluZyhlcXVhdGlvbi5pbmRleCArIGVxdWF0aW9uWzBdLmxlbmd0aClcclxuICAgICk7XHJcbiAgICBpZiAobWluTWF4ID49IDEyKSByZXR1cm4gdGhpcy5MaXN0T2ZNb250aC5MaXN0T2ZNb250aDtcclxuICAgIGlmICgoZXF1YXRpb25bMF0gPT0gXCIrLVwiIHx8IGVxdWF0aW9uWzBdID09IFwiLStcIikgJiYgbWluTWF4ID49IDYpXHJcbiAgICAgIHJldHVybiB0aGlzLkxpc3RPZk1vbnRoLkxpc3RPZk1vbnRoO1xyXG4gICAgbGV0IGRpY3RPZk1vbnRoOiB7IFttb250aDogbnVtYmVyXTogc3RyaW5nIH0gPSB0aGlzLkxpc3RPZk1vbnRoLkRpY3RPZk1vbnRoO1xyXG4gICAgTGlzdE9mTW9udGgucHVzaCh7IGtleTogdG9NaW4sIHZhbHVlOiBkaWN0T2ZNb250aFt0b01pbl0gfSk7XHJcblxyXG4gICAgZm9yIChsZXQgcSA9IDA7IHEgPCBtaW5NYXg7IHErKykge1xyXG4gICAgICBpZiAoZXF1YXRpb25bMF0uaW5jbHVkZXMoXCItXCIpKSB7XHJcbiAgICAgICAgdG9NaW4tLTtcclxuICAgICAgICBpZiAodG9NaW4gPT0gMCkgdG9NaW4gPSAxMjtcclxuICAgICAgICBMaXN0T2ZNb250aC5wdXNoKHsga2V5OiB0b01pbiwgdmFsdWU6IGRpY3RPZk1vbnRoW3RvTWluXSB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXF1YXRpb25bMF0uaW5jbHVkZXMoXCIrXCIpKSB7XHJcbiAgICAgICAgdG9NYXgrKztcclxuICAgICAgICBpZiAodG9NYXggPT0gMTMpIHRvTWF4ID0gMTtcclxuICAgICAgICBMaXN0T2ZNb250aC5wdXNoKHsga2V5OiB0b01heCwgdmFsdWU6IGRpY3RPZk1vbnRoW3RvTWF4XSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgTGlzdE9mTW9udGguc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICByZXR1cm4gYS5rZXkgLSBiLmtleTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIExpc3RPZk1vbnRoO1xyXG4gIH1cclxuXHJcbiAgc2V0RGVmYXVsdFZhbHVlWWVhcih2YWx1ZSkge1xyXG4gICAgbGV0IGJ1c2luZXNzRGF0ZSA9IG5ldyBEYXRlKHRoaXMuQnVzaW5lc3NEdCk7XHJcbiAgICBsZXQgb3BlcmF0b3IgPSB2YWx1ZS5jaGFyQXQoMik7XHJcbiAgICBsZXQgdGVtcFZhbHVlID0gdmFsdWUuc3BsaXQob3BlcmF0b3IsIDIpO1xyXG4gICAgbGV0IG51bVllYXIgPSBwYXJzZUludCh0ZW1wVmFsdWVbMV0pO1xyXG4gICAgaWYgKCFudW1ZZWFyKSBudW1ZZWFyID0gMTtcclxuICAgIGlmIChvcGVyYXRvciA9PSBcIi1cIikge1xyXG4gICAgICBidXNpbmVzc0RhdGUuc2V0RnVsbFllYXIoYnVzaW5lc3NEYXRlLmdldEZ1bGxZZWFyKCkgLSBudW1ZZWFyKTtcclxuICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT0gXCIrXCIpIHtcclxuICAgICAgYnVzaW5lc3NEYXRlLnNldEZ1bGxZZWFyKGJ1c2luZXNzRGF0ZS5nZXRGdWxsWWVhcigpICsgbnVtWWVhcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVzaW5lc3NEYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgfVxyXG4gIHNldFllYXJEREwoeWVhcikge1xyXG4gICAgdGhpcy5MaXN0T2ZZZWFyID0gbmV3IEFycmF5PEtleVZhbHVlVUNTZWFyY2hPYmo+KCk7XHJcbiAgICBsZXQgZXF1YXRpb24gPSB5ZWFyLm1hdGNoKFwiW1xcXFwrXVstXXxbLV1bXFxcXCtdfFxcXFwrfC1cIik7XHJcbiAgICBsZXQgdG9NaW46IG51bWJlciA9IHRoaXMuQnVzaW5lc3NEdC5nZXRGdWxsWWVhcigpO1xyXG4gICAgbGV0IHRvTWF4OiBudW1iZXIgPSB0aGlzLkJ1c2luZXNzRHQuZ2V0RnVsbFllYXIoKTtcclxuICAgIGxldCBtaW5NYXg6IG51bWJlciA9IHBhcnNlSW50KFxyXG4gICAgICB5ZWFyLnN1YnN0cmluZyhlcXVhdGlvbi5pbmRleCArIGVxdWF0aW9uWzBdLmxlbmd0aClcclxuICAgICk7XHJcbiAgICB0aGlzLkxpc3RPZlllYXIucHVzaCh7XHJcbiAgICAgIGtleTogdGhpcy5CdXNpbmVzc0R0LmdldEZ1bGxZZWFyKCksXHJcbiAgICAgIHZhbHVlOiB0aGlzLkJ1c2luZXNzRHQuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yIChsZXQgcSA9IDA7IHEgPCBtaW5NYXg7IHErKykge1xyXG4gICAgICBpZiAoZXF1YXRpb25bMF0gPT0gXCItK1wiIHx8IGVxdWF0aW9uWzBdID09IFwiKy1cIikge1xyXG4gICAgICAgIHRvTWluLS07XHJcbiAgICAgICAgdG9NYXgrKztcclxuICAgICAgICB0aGlzLkxpc3RPZlllYXIucHVzaChcclxuICAgICAgICAgIHsga2V5OiB0b01pbiwgdmFsdWU6IHRvTWluLnRvU3RyaW5nKCkgfSxcclxuICAgICAgICAgIHsga2V5OiB0b01heCwgdmFsdWU6IHRvTWF4LnRvU3RyaW5nKCkgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXF1YXRpb25bMF0gPT0gXCItXCIpIHtcclxuICAgICAgICB0b01pbi0tO1xyXG4gICAgICAgIHRoaXMuTGlzdE9mWWVhci5wdXNoKHsga2V5OiB0b01pbiwgdmFsdWU6IHRvTWluLnRvU3RyaW5nKCkgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXF1YXRpb25bMF0gPT0gXCIrXCIpIHtcclxuICAgICAgICB0b01heCsrO1xyXG4gICAgICAgIHRoaXMuTGlzdE9mWWVhci5wdXNoKHsga2V5OiB0b01heCwgdmFsdWU6IHRvTWF4LnRvU3RyaW5nKCkgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuTGlzdE9mWWVhci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIHJldHVybiBhLmtleSAtIGIua2V5O1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5MaXN0T2ZZZWFyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEpTT04odXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwb3N0SlNPTih1cmw6IHN0cmluZywgY3JpdGVyaWE6IGFueSA9IG51bGwpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwgY3JpdGVyaWEpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoQ2xpY2soSXNFeHBvcnRFeGNlbDogYm9vbGVhbiA9IGZhbHNlLCBFeHRGaWxlOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICAvLyBjaGVjayBpZiBjcml0ZXJpYSB0byBzZW5kIGlzIHJlYWR5XHJcbiAgICBpZiAoIXRoaXMuc2VhcmNoQnRuUmVhZHkpIHJldHVybjtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcInNlYXJjaCBjbGljayBlbnRlci4uLi4uLi4uLlwiKTtcclxuICAgIGlmICh0aGlzLmlzUmVwb3J0ICE9IHVuZGVmaW5lZCAmJiB0aGlzLmlzUmVwb3J0KSB7XHJcbiAgICAgIHRoaXMuR2VuZXJhdGVSZXBvcnQodGhpcy5zZWFyY2hGb3JtKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGZpbHRlcmVkID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maWx0ZXIoXHJcbiAgICAgIChpdGVtLCBpLCBhcnIpID0+IGFyci5maW5kSW5kZXgoKHgpID0+IHgubmFtZSA9PT0gaXRlbS5uYW1lKSA9PT0gaVxyXG4gICAgKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcmVkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChmaWx0ZXJlZFtpXS50eXBlID09IFwibnVtZXJpY1wiKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrVmFsdWVHdGVMdGUoZmlsdGVyZWRbaV0pKSByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3JkZXIgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5vcmRlcmJ5ICE9IG51bGwpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5vcmRlcmJ5LmtleSAhPT0gXCJcIiAmJlxyXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5vcmRlcmJ5LnZhbHVlICE9PSBcIlwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIG9yZGVyID0ge1xyXG4gICAgICAgICAga2V5OiB0aGlzLmNvbmZpZ3VyYXRpb24ub3JkZXJieS5rZXksXHJcbiAgICAgICAgICB2YWx1ZTogdGhpcy5jb25maWd1cmF0aW9uLm9yZGVyYnkudmFsdWUsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5wYWdlTm93ID0gMTtcclxuICAgIGxldCByb3dQZXJQYWdlID0gdGhpcy5wYWdlU2l6ZTtcclxuICAgIGlmIChJc0V4cG9ydEV4Y2VsKSByb3dQZXJQYWdlID0gOTk5OTtcclxuICAgIHRoaXMuc2VhcmNoKFxyXG4gICAgICB0aGlzLmFwaVVybCxcclxuICAgICAgdGhpcy5wYWdlTm93LFxyXG4gICAgICByb3dQZXJQYWdlLFxyXG4gICAgICBvcmRlcixcclxuICAgICAgdHJ1ZSxcclxuICAgICAgdGhpcy5hcnJDcml0LFxyXG4gICAgICBJc0V4cG9ydEV4Y2VsLFxyXG4gICAgICBFeHRGaWxlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVzZXQoKSB7XHJcbiAgICAvLyBkaXNhYmxlIGJ1dHRvbiBzZWFyY2ggdG8gbWFrZSBzdXJlIHRoYXQgYWxsIGNyaXRlcmlhIHJlYWR5IGZpcnN0LlxyXG4gICAgdGhpcy5zZWFyY2hCdG5SZWFkeSA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5pbml0aWF0ZUZvcm0oZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tTdWJtaXREYXRlKGNvbXBvbmVudCkge1xyXG4gICAgY29uc3QgX2NvbXAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50O1xyXG4gICAgY29uc3QgTWluQ29tcG9uZW50SWR4ID1cclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kSW5kZXgoXHJcbiAgICAgICAgKHgpID0+XHJcbiAgICAgICAgICB4LmRhdGVwaWNrZXJQYWlyID09IGNvbXBvbmVudC5kYXRlcGlja2VyUGFpciAmJlxyXG4gICAgICAgICAgeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCJcclxuICAgICAgKSA9PT0gLTFcclxuICAgICAgICA/IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAoeCkgPT5cclxuICAgICAgICAgICAgICB4LmRhdGVwaWNrZXJQYWlyID09IGNvbXBvbmVudC5kYXRlcGlja2VyUGFpciAmJlxyXG4gICAgICAgICAgICAgIHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdUXCJcclxuICAgICAgICAgIClcclxuICAgICAgICA6IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAoeCkgPT5cclxuICAgICAgICAgICAgICB4LmRhdGVwaWNrZXJQYWlyID09IGNvbXBvbmVudC5kYXRlcGlja2VyUGFpciAmJlxyXG4gICAgICAgICAgICAgIHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiXHJcbiAgICAgICAgICApO1xyXG4gICAgY29uc3QgTWF4Q29tcG9uZW50SWR4ID1cclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kSW5kZXgoXHJcbiAgICAgICAgKHgpID0+XHJcbiAgICAgICAgICB4LmRhdGVwaWNrZXJQYWlyID09IGNvbXBvbmVudC5kYXRlcGlja2VyUGFpciAmJlxyXG4gICAgICAgICAgeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRFXCJcclxuICAgICAgKSA9PT0gLTFcclxuICAgICAgICA/IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAoeCkgPT5cclxuICAgICAgICAgICAgICB4LmRhdGVwaWNrZXJQYWlyID09IGNvbXBvbmVudC5kYXRlcGlja2VyUGFpciAmJlxyXG4gICAgICAgICAgICAgIHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxUXCJcclxuICAgICAgICAgIClcclxuICAgICAgICA6IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAoeCkgPT5cclxuICAgICAgICAgICAgICB4LmRhdGVwaWNrZXJQYWlyID09IGNvbXBvbmVudC5kYXRlcGlja2VyUGFpciAmJlxyXG4gICAgICAgICAgICAgIHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgIGlmIChNaW5Db21wb25lbnRJZHggPT09IC0xIHx8IE1heENvbXBvbmVudElkeCA9PT0gLTEpIHJldHVybiB0cnVlO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW19jb21wW01pbkNvbXBvbmVudElkeF0ubmFtZSArIE1pbkNvbXBvbmVudElkeF0udmFsdWUgPlxyXG4gICAgICB0aGlzLmZvcm0uY29udHJvbHNbX2NvbXBbTWF4Q29tcG9uZW50SWR4XS5uYW1lICsgTWF4Q29tcG9uZW50SWR4XS52YWx1ZVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudG9hc3RyLndhcm5pbmcoXHJcbiAgICAgICAgX2NvbXBbTWluQ29tcG9uZW50SWR4XS5sYWJlbCArXHJcbiAgICAgICAgICBcIiBtdXN0IGJlIGxlc3MgdGhhbiBcIiArXHJcbiAgICAgICAgICBfY29tcFtNYXhDb21wb25lbnRJZHhdLmxhYmVsXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGNoZWNrTnVtZXJpY1BhaXIoY29tcG9uZW50LCBteWZvcm0pIHtcclxuICAgIC8vIGNvbnN0IF9jb21wID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudDtcclxuICAgIC8vIGxldCBNaW5Db21wb25lbnRJZHggPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmRJbmRleCh4ID0+IHgubnVtZXJpY1BhaXIgPT0gY29tcG9uZW50Lm51bWVyaWNQYWlyICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVEVcIikpID09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubnVtZXJpY1BhaXIgPT0gY29tcG9uZW50Lm51bWVyaWNQYWlyICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiKSkgOiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm51bWVyaWNQYWlyID09IGNvbXBvbmVudC5udW1lcmljUGFpciAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCIpKTtcclxuICAgIC8vIGxldCBNYXhDb21wb25lbnRJZHggPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmRJbmRleCh4ID0+IHgubnVtZXJpY1BhaXIgPT0gY29tcG9uZW50Lm51bWVyaWNQYWlyICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVEVcIikpID09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubnVtZXJpY1BhaXIgPT0gY29tcG9uZW50Lm51bWVyaWNQYWlyICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVFwiKSkgOiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm51bWVyaWNQYWlyID09IGNvbXBvbmVudC5udW1lcmljUGFpciAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRFXCIpKTtcclxuICAgIC8vIGNvbnN0IF9taW4gPSBwYXJzZUZsb2F0KHRoaXMuZm9ybS5jb250cm9sc1tfY29tcFtNaW5Db21wb25lbnRJZHhdLm5hbWVdLnZhbHVlLnJlcGxhY2UoLywvZywgJycpKTtcclxuICAgIC8vIGNvbnN0IF9tYXggPSBwYXJzZUZsb2F0KHRoaXMuZm9ybS5jb250cm9sc1tfY29tcFtNYXhDb21wb25lbnRJZHhdLm5hbWVdLnZhbHVlLnJlcGxhY2UoLywvZywgJycpKTtcclxuXHJcbiAgICAvLyBpZiAoX21pbiA+IF9tYXgpIHtcclxuICAgIC8vICAgdGhpcy50b2FzdHIud2FybmluZyhfY29tcFtNaW5Db21wb25lbnRJZHhdLmxhYmVsICsgXCIgbXVzdCBiZSBsZXNzIHRoYW4gXCIgKyBfY29tcFtNYXhDb21wb25lbnRJZHhdLmxhYmVsKTtcclxuICAgIC8vICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGxldCBNaW5Db21wb25lbnQgPVxyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoXHJcbiAgICAgICAgKHgpID0+XHJcbiAgICAgICAgICB4Lm51bWVyaWNQYWlyID09IGNvbXBvbmVudC5udW1lcmljUGFpciAmJlxyXG4gICAgICAgICAgeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCJcclxuICAgICAgKSA9PSB1bmRlZmluZWRcclxuICAgICAgICA/IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZChcclxuICAgICAgICAgICAgKHgpID0+XHJcbiAgICAgICAgICAgICAgeC5udW1lcmljUGFpciA9PSBjb21wb25lbnQubnVtZXJpY1BhaXIgJiZcclxuICAgICAgICAgICAgICB4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgOiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoXHJcbiAgICAgICAgICAgICh4KSA9PlxyXG4gICAgICAgICAgICAgIHgubnVtZXJpY1BhaXIgPT0gY29tcG9uZW50Lm51bWVyaWNQYWlyICYmXHJcbiAgICAgICAgICAgICAgeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCJcclxuICAgICAgICAgICk7XHJcbiAgICBsZXQgTWF4Q29tcG9uZW50ID1cclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKFxyXG4gICAgICAgICh4KSA9PlxyXG4gICAgICAgICAgeC5udW1lcmljUGFpciA9PSBjb21wb25lbnQubnVtZXJpY1BhaXIgJiZcclxuICAgICAgICAgIHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiXHJcbiAgICAgICkgPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgPyB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoXHJcbiAgICAgICAgICAgICh4KSA9PlxyXG4gICAgICAgICAgICAgIHgubnVtZXJpY1BhaXIgPT0gY29tcG9uZW50Lm51bWVyaWNQYWlyICYmXHJcbiAgICAgICAgICAgICAgeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRcIlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIDogdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKFxyXG4gICAgICAgICAgICAoeCkgPT5cclxuICAgICAgICAgICAgICB4Lm51bWVyaWNQYWlyID09IGNvbXBvbmVudC5udW1lcmljUGFpciAmJlxyXG4gICAgICAgICAgICAgIHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiXHJcbiAgICAgICAgICApO1xyXG4gICAgY29uc3QgX21pbiA9IHBhcnNlRmxvYXQoXHJcbiAgICAgIG15Zm9ybS5uYXRpdmVFbGVtZW50W01pbkNvbXBvbmVudC5pZF0udmFsdWUucmVwbGFjZSgvLC9nLCBcIlwiKVxyXG4gICAgKTtcclxuICAgIGNvbnN0IF9tYXggPSBwYXJzZUZsb2F0KFxyXG4gICAgICBteWZvcm0ubmF0aXZlRWxlbWVudFtNYXhDb21wb25lbnQuaWRdLnZhbHVlLnJlcGxhY2UoLywvZywgXCJcIilcclxuICAgICk7XHJcblxyXG4gICAgaWYgKF9taW4gPiBfbWF4KSB7XHJcbiAgICAgIHRoaXMudG9hc3RyLndhcm5pbmcoXHJcbiAgICAgICAgTWluQ29tcG9uZW50LmxhYmVsICsgXCIgbXVzdCBiZSBsZXNzIHRoYW4gXCIgKyBNYXhDb21wb25lbnQubGFiZWxcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2VhcmNoKFxyXG4gICAgYXBpVXJsOiBzdHJpbmcsXHJcbiAgICBwYWdlTm86IG51bWJlcixcclxuICAgIHJvd1BlclBhZ2U6IG51bWJlcixcclxuICAgIG9yZGVyQnk6IGFueSxcclxuICAgIGlzQ2xpY2tTZWFyY2g6IGJvb2xlYW4sXHJcbiAgICBhZGRDcml0OiBDcml0ZXJpYU9ialtdID0gbmV3IEFycmF5KCksXHJcbiAgICBJc0V4cG9ydEV4Y2VsOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBleHRGaWxlOiBzdHJpbmcgPSBcIlwiLFxyXG4gICAgaXNBZGRUb1RlbXA6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIGFkZFRvVGVtcENyaXQ6IENyaXRlcmlhT2JqW10gPSBuZXcgQXJyYXkoKVxyXG4gICkge1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XHJcbiAgICBsZXQgYXJyQ3JpdCA9IG5ldyBBcnJheSgpO1xyXG4gICAgbGV0IElzUXVlcnlJbiA9IGZhbHNlO1xyXG4gICAgbGV0IElzQnJlYWsgPSBmYWxzZTtcclxuICAgIGxldCBib2R5TGlzdCA9IG5ldyBBcnJheSgpO1xyXG4gICAgbGV0IGhlYWRlckxpc3QgPSBuZXcgQXJyYXkoKTtcclxuICAgIGxldCBmaWxlTmFtZTogc3RyaW5nO1xyXG4gICAgbGV0IGJvZHlEYXRhID0gbmV3IEFycmF5KCk7XHJcbiAgICBsZXQgZGF0YUZpbGUgPSBuZXcgQXJyYXkoKTtcclxuICAgIGxldCBhZGRpdGlvbmFsRXhwb3J0TGlzdCA9IG5ldyBBcnJheSgpO1xyXG4gICAgbGV0IGV4Y2x1ZGVFeHBvcnRMaXN0ID0gbmV3IEFycmF5KCk7XHJcblxyXG4gICAgY29uc3QgbWFwcGVkQ29uZk5hbWVWYWx1ZSA9IHt9O1xyXG4gICAgZm9yIChsZXQgW2luZGV4LCB2YWxdIG9mIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZW50cmllcygpKSB7XHJcbiAgICAgIGxldCBfbmFtZSA9IHZhbC5uYW1lO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdmFsLnR5cGUgPT09IFwiZGF0ZXBpY2tlclwiIHx8XHJcbiAgICAgICAgdmFsLnR5cGUgPT09IFwibnVtZXJpY1wiIHx8XHJcbiAgICAgICAgdmFsLnR5cGUgPT09IFwiY3VycmVuY3lcIlxyXG4gICAgICApXHJcbiAgICAgICAgX25hbWUgKz0gaW5kZXg7XHJcbiAgICAgIG1hcHBlZENvbmZOYW1lVmFsdWVbX25hbWVdID0ge1xyXG4gICAgICAgIHZhbHVlOiB0aGlzLmZvcm0uY29udHJvbHNbX25hbWVdLnZhbHVlLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluamVjdCB3aGVyZVF1ZXJ5IGZvciB3aGVyZSBjcml0ZXJpYVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNlYXJjaElucHV0LndoZXJlVmFsdWUgIT0gdW5kZWZpbmVkICYmXHJcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQud2hlcmVWYWx1ZS5sZW5ndGggIT0gMFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZy53aGVyZVF1ZXJ5ID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLnNlYXJjaElucHV0LndoZXJlVmFsdWUubGVuZ3RoOyB4KyspIHtcclxuICAgICAgICAvLyByZWFkIHZhbHVlIGJhc2VkIG9uIHNlYXJjaCBjb21wb25lbnQgdmFsdWUgLSBpZiBub3QgZm91bmQsIHdpbGwgaGFyZGNvZGVkXHJcbiAgICAgICAgY29uc3QgX3ZhbCA9IG1hcHBlZENvbmZOYW1lVmFsdWVbdGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlW3hdLnZhbHVlXVxyXG4gICAgICAgICAgPyBtYXBwZWRDb25mTmFtZVZhbHVlW3RoaXMuc2VhcmNoSW5wdXQud2hlcmVWYWx1ZVt4XS52YWx1ZV0udmFsdWVcclxuICAgICAgICAgIDogdGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlW3hdLnZhbHVlO1xyXG4gICAgICAgIC8vIHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZy53aGVyZVF1ZXJ5LnB1c2godGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlW3hdLnZhbHVlKTtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcud2hlcmVRdWVyeS5wdXNoKF92YWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQuZnJvbVZhbHVlICE9IHVuZGVmaW5lZCAmJlxyXG4gICAgICB0aGlzLnNlYXJjaElucHV0LmZyb21WYWx1ZS5sZW5ndGggIT0gMFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZy5mcm9tUXVlcnkgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMuc2VhcmNoSW5wdXQuZnJvbVZhbHVlLmxlbmd0aDsgeCsrKSB7XHJcbiAgICAgICAgLy8gcmVhZCB2YWx1ZSBiYXNlZCBvbiBzZWFyY2ggY29tcG9uZW50IHZhbHVlIC0gaWYgbm90IGZvdW5kLCB3aWxsIGhhcmRjb2RlZFxyXG4gICAgICAgIGNvbnN0IF92YWwgPSBtYXBwZWRDb25mTmFtZVZhbHVlW3RoaXMuc2VhcmNoSW5wdXQuZnJvbVZhbHVlW3hdLnZhbHVlXVxyXG4gICAgICAgICAgPyBtYXBwZWRDb25mTmFtZVZhbHVlW3RoaXMuc2VhcmNoSW5wdXQuZnJvbVZhbHVlW3hdLnZhbHVlXS52YWx1ZVxyXG4gICAgICAgICAgOiB0aGlzLnNlYXJjaElucHV0LmZyb21WYWx1ZVt4XS52YWx1ZTtcclxuICAgICAgICAvLyB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcuZnJvbVF1ZXJ5LnB1c2godGhpcy5zZWFyY2hJbnB1dC5mcm9tVmFsdWVbeF0udmFsdWUpO1xyXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZy5mcm9tUXVlcnkucHVzaChfdmFsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVxdWVzdC5wYWdlTm8gPSBwYWdlTm87XHJcbiAgICByZXF1ZXN0LnJvd1BlclBhZ2UgPSByb3dQZXJQYWdlO1xyXG4gICAgcmVxdWVzdC5vcmRlckJ5ID0gb3JkZXJCeTtcclxuICAgIHJlcXVlc3QucXVlcnlTdHJpbmcgPSB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmc7XHJcblxyXG4gICAgbGV0IGZpbHRlcmVkID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maWx0ZXIoKGl0ZW0sIGksIGFycikgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5kYXRlcGlja2VyUGFpciA9PT0gdW5kZWZpbmVkIHx8IGl0ZW0uZGF0ZXBpY2tlclBhaXIgPT09IFwiXCIpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIGFyci5maW5kSW5kZXgoKHgpID0+IHguZGF0ZXBpY2tlclBhaXIgPT09IGl0ZW0uZGF0ZXBpY2tlclBhaXIpID09PSBpXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGZpbHRlcmVkW2ldLnR5cGUgPT0gXCJkYXRlcGlja2VyXCIpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tTdWJtaXREYXRlKGZpbHRlcmVkW2ldKSkgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZpbHRlcmVkTnVtZXJpYyA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmlsdGVyKFxyXG4gICAgICAoaXRlbSwgaSwgYXJyKSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0ubnVtZXJpY1BhaXIgPT09IHVuZGVmaW5lZCB8fCBpdGVtLm51bWVyaWNQYWlyID09PSBcIlwiKSByZXR1cm47XHJcbiAgICAgICAgcmV0dXJuIGFyci5maW5kSW5kZXgoKHgpID0+IHgubnVtZXJpY1BhaXIgPT09IGl0ZW0ubnVtZXJpY1BhaXIpID09PSBpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJlZE51bWVyaWMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgMDtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGZpbHRlcmVkTnVtZXJpY1tpXS50eXBlID09IFwibnVtZXJpY1wiIHx8XHJcbiAgICAgICAgZmlsdGVyZWROdW1lcmljW2ldLnR5cGUgPT0gXCJjdXJyZW5jeVwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja051bWVyaWNQYWlyKGZpbHRlcmVkTnVtZXJpY1tpXSwgdGhpcy5teUZvcm0pKSByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgZm9ybVNlcTogbnVtYmVyID0gLTE7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY291bnRGb3JtOyBpKyspIHtcclxuICAgICAgbGV0IGNyaXRPYmogPSBuZXcgQ3JpdGVyaWFPYmooKTtcclxuICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PSBcImJsYW5rXCIpIGNvbnRpbnVlO1xyXG4gICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50eXBlID09IFwiZHJvcGRvd25TZWFyY2hcIikge1xyXG4gICAgICAgIGZvcm1TZXEgKz0gMztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3JtU2VxKys7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0uZXhjbHVkZUZyb21Dcml0KSBjb250aW51ZTtcclxuICAgICAgbGV0IGNvbXBvbmVudCA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbZm9ybVNlcV07XHJcbiAgICAgIGxldCBfY29tcG9uZW50VmFsdWUgPSBgJHtcclxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5uYW1lXT8udmFsdWUgPz8gXCJcIlxyXG4gICAgICB9YDtcclxuICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PT0gXCJsb29rdXBcIikge1xyXG4gICAgICAgIF9jb21wb25lbnRWYWx1ZSA9IGAke1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW1xyXG4gICAgICAgICAgICBcImxvb2t1cF9pZF9cIiArIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0ubmFtZVxyXG4gICAgICAgICAgXS52YWx1ZSA/PyBcIlwiXHJcbiAgICAgICAgfWA7XHJcbiAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50eXBlID09PSBcImRhdGVwaWNrZXJcIiB8fFxyXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PT0gXCJudW1lcmljXCIgfHxcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT09IFwiY3VycmVuY3lcIlxyXG4gICAgICApIHtcclxuICAgICAgICBfY29tcG9uZW50VmFsdWUgPSBgJHtcclxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLm5hbWUgKyBpXS52YWx1ZSA/P1xyXG4gICAgICAgICAgXCJcIlxyXG4gICAgICAgIH1gO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjcml0T2JqLkRhdGFUeXBlID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdHlwZVwiKTtcclxuICAgICAgaWYgKCFjcml0T2JqLkRhdGFUeXBlKSBjcml0T2JqLkRhdGFUeXBlID0gXCJcIjtcclxuICAgICAgLy9Jbmkga2h1c3VzIGthbGF1IGRhcmkgRHJvcCBEb3duXHJcbiAgICAgIGlmIChcclxuICAgICAgICBjb21wb25lbnQuZ2V0QXR0cmlidXRlKFwicXVlcnktaW5cIikgIT0gbnVsbCAmJlxyXG4gICAgICAgIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoXCJxdWVyeS1pblwiKSA9PSBcInRydWVcIlxyXG4gICAgICApIHtcclxuICAgICAgICBJc1F1ZXJ5SW4gPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIElzUXVlcnlJbiA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29tcG9uZW50Lm5vZGVOYW1lID09IFwiU0VMRUNUXCIpIHtcclxuICAgICAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZGRsLnNlbGVjdGVkSW5kZXggPT09IC0xICYmXHJcbiAgICAgICAgICBkZGwubGVuZ3RoID09PSAxICYmXHJcbiAgICAgICAgICBfY29tcG9uZW50VmFsdWUgPT0gXCJcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgX2NvbXBvbmVudFZhbHVlID0gXCJTRUxFQ1RfVEVNUFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKF9jb21wb25lbnRWYWx1ZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudC5ub2RlTmFtZSA9PSBcIlNFTEVDVFwiKSB7XHJcbiAgICAgICAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XHJcbiAgICAgICAgICBpZiAoZGRsLnNlbGVjdGVkSW5kZXggPT09IC0xICYmIGRkbC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgZGRsLnNlbGVjdGVkSW5kZXggPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHRleHQgPSBkZGxbZGRsLnNlbGVjdGVkSW5kZXhdLnZhbHVlLnRyaW0oKTtcclxuICAgICAgICAgIGlmICh0ZXh0ID09IFwib25lXCIpIHtcclxuICAgICAgICAgICAgSXNCcmVhayA9IHRydWU7XHJcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoXCJsYWJlbFwiKTtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHIud2FybmluZyhcIlBsZWFzZSBzZWxlY3QgXCIgKyBsYWJlbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgY29tcG9uZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3JpdC1kYXRhdGFibGVcIikgIT0gXCJcIiAmJlxyXG4gICAgICAgICAgICBjb21wb25lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1jcml0LWRhdGF0YWJsZVwiKSAhPSBudWxsXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY3JpdE9iai5pc0NyaXRlcmlhRGF0YVRhYmxlID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgICBcImRhdGEtY3JpdC1kYXRhdGFibGVcIlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50eXBlID09IFwidGFza0RlZmluaXRpb25LZXlcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT0gXCJwcm9jZXNzS2V5XCJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBpZiAoZGRsLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuU2V0UHJvY2Vzc0tleShcclxuICAgICAgICAgICAgICAgIGksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLndmS2V5RmlsdGVyXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50eXBlID09IFwiY2xhaW1cIikge1xyXG4gICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbmFtZVwiKTtcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IHRleHQ7XHJcbiAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAoIWlzQWRkVG9UZW1wKSB7XHJcbiAgICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGV4dCAhPSBcImFsbFwiICYmIHRleHQgIT0gXCJvbmVcIiAmJiB0ZXh0ICE9IFwib3RoZXJzXCIpIHtcclxuICAgICAgICAgICAgICAvL0thbGF1IERhcmkgRHJvcGRvd24gdWRhaCBwYXN0aSBwYWtlIEVxXHJcbiAgICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25FcTtcclxuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5uYW1lO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbmFtZVwiKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IHRleHQ7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IHJlc3RyaWN0aW9uID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZShcImRhdGEtcmVzdHJpY3Rpb25cIik7XHJcbiAgICAgICAgICAgICAgaWYgKHJlc3RyaWN0aW9uICE9IFwiXCIgJiYgcmVzdHJpY3Rpb24gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgcmVzdHJpY3Rpb25cclxuICAgICAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSByZXN0cmljdGlvbjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3Rpb24gPT0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkxpa2UpIHtcclxuICAgICAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IGAlJHt0ZXh0fSVgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFpc0FkZFRvVGVtcCkge1xyXG4gICAgICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICB0ZXh0ID09IFwiYWxsXCIgJiZcclxuICAgICAgICAgICAgICBJc1F1ZXJ5SW4gJiZcclxuICAgICAgICAgICAgICBjb21wb25lbnQub3B0aW9ucy5sZW5ndGggIT0gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBsZXQgZGRsTGlzdCA9IG5ldyBBcnJheSgpO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY29tcG9uZW50Lm9wdGlvbnMubGVuZ3RoOyB4KyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh4ICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgZGRsTGlzdC5wdXNoKGNvbXBvbmVudC5vcHRpb25zW3hdLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGRkbExpc3QubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uSW47XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbmFtZVwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNyaXRPYmoubGlzdFZhbHVlID0gZGRsTGlzdDtcclxuICAgICAgICAgICAgICAgIGlmICghaXNBZGRUb1RlbXApIHtcclxuICAgICAgICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09IFwib3RoZXJzXCIgJiYgY29tcG9uZW50Lm9wdGlvbnMubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgICBsZXQgZGRsTGlzdCA9IG5ldyBBcnJheSgpO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY29tcG9uZW50Lm9wdGlvbnMubGVuZ3RoOyB4KyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh4ICE9IDAgJiYgeCAhPSBjb21wb25lbnQub3B0aW9ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRkbExpc3QucHVzaChjb21wb25lbnQub3B0aW9uc1t4XS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChkZGxMaXN0Lmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbk5vdEluO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW5hbWVcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLmxpc3RWYWx1ZSA9IGRkbExpc3Q7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzQWRkVG9UZW1wKSB7XHJcbiAgICAgICAgICAgICAgICAgIGFyckNyaXQucHVzaChjcml0T2JqKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgY29tcERhdGFUeXBlID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdHlwZVwiKTtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgY29tcERhdGFUeXBlID09PSBcImxvb2t1cFwiIHx8XHJcbiAgICAgICAgICAgIChjb21wRGF0YVR5cGUgPT09IFwiZGF0ZVwiICYmIHRoaXMudXNlTmV3RGF0ZXBpY2tlcilcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBmb3JtU2VxKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL0thbGF1IGFkYSBQZXJjZW50IG1ha2EgeWFuZyBkaXBha2Ugbm50aSBhZGFsYWggUmVzdHJpY3Rpb25zIExpa2VcclxuICAgICAgICAgIGlmIChjb21wb25lbnQubmFtZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQubmFtZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1uYW1lXCIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50eXBlID09PSBcImRhdGVwaWNrZXJcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT09IFwibnVtZXJpY1wiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PT0gXCJjdXJyZW5jeVwiXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW5hbWVcIik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY3JpdE9iai52YWx1ZSA9IF9jb21wb25lbnRWYWx1ZTtcclxuXHJcbiAgICAgICAgICAvLyBub3JtYWxpemUgZGF0YSB0eXBlIGZyb20gbG9va3VwIHRvIHRleHQ7XHJcbiAgICAgICAgICBpZiAoY29tcERhdGFUeXBlID09PSBcImxvb2t1cFwiKSBjcml0T2JqLkRhdGFUeXBlID0gXCJ0ZXh0XCI7XHJcblxyXG4gICAgICAgICAgaWYgKF9jb21wb25lbnRWYWx1ZS5pbmNsdWRlcyhcIiVcIikpIHtcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25MaWtlO1xyXG4gICAgICAgICAgICBfY29tcG9uZW50VmFsdWUgPVxyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlVHJhaWxpbmdCYWNrc2xhc2hlc0FmdGVyUGVyY2VudChfY29tcG9uZW50VmFsdWUpO1xyXG4gICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gX2NvbXBvbmVudFZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy9rYWxhdSBjb21wb25lbnRueWEgRGF0ZSwgcmVzdHJpY3Rpb25zbnlhIGxnc2cgYW1iaWwgZGFyaSBwcm9wZXJ0eSBKU09ObnlhXHJcbiAgICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgICAgY29tcG9uZW50LmdldEF0dHJpYnV0ZShcImRhdGEtcmVzdHJpY3Rpb25cIikgIT0gXCJcIiAmJlxyXG4gICAgICAgICAgICBjb21wb25lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1yZXN0cmljdGlvblwiKSAhPSBudWxsXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXJlc3RyaWN0aW9uXCIpO1xyXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdHlwZVwiKSA9PSBcIm51bWVyaWNcIikge1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBwYXJzZUZsb2F0KFxyXG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudFZhbHVlLnJlcGxhY2UoLywvZywgXCJcIilcclxuICAgICAgICAgICAgICApLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNyaXRPYmoucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxJS0VcIikge1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBcIiVcIiArIF9jb21wb25lbnRWYWx1ZS50cmltKCkgKyBcIiVcIjtcclxuICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkxpa2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uRXE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNyaXQtZGF0YXRhYmxlXCIpICE9IFwiXCIgJiZcclxuICAgICAgICAgICAgY29tcG9uZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3JpdC1kYXRhdGFibGVcIikgIT0gbnVsbFxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmouaXNDcml0ZXJpYURhdGFUYWJsZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICAgICAgXCJkYXRhLWNyaXQtZGF0YXRhYmxlXCJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgc2tpcFB1c2hUb0NyaXQgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT09IFwidGltZVwiKSB7XHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGlzIHN0YW5kYWxvbmUgb3Igbm90XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZVRpbWVQYWlyID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS51c2VUaW1lUGFpcjtcclxuICAgICAgICAgICAgaWYgKHVzZVRpbWVQYWlyKSB7XHJcbiAgICAgICAgICAgICAgc2tpcFB1c2hUb0NyaXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4UGFpciA9IGFyckNyaXQuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgKHgpID0+XHJcbiAgICAgICAgICAgICAgICAgIHgucHJvcE5hbWUgPT09IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udGltZVBhaXIgJiZcclxuICAgICAgICAgICAgICAgICAgeC5yZXN0cmljdGlvbiA9PT0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5yZXN0cmljdGlvblxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgaWYgKGluZGV4UGFpciA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBfdmFsdWUgPSBuZXcgRGF0ZShhcnJDcml0W2luZGV4UGFpcl0udmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIGRhdGUgY29tcG9uZW50c1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeWVhciA9IF92YWx1ZS5nZXRVVENGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9udGggPSBfdmFsdWUuZ2V0VVRDTW9udGgoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRheSA9IF92YWx1ZS5nZXRVVENEYXRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aW1lIGNvbXBvbmVudHNcclxuICAgICAgICAgICAgICAgIGNvbnN0IFtob3VycywgbWludXRlc10gPSBfY29tcG9uZW50VmFsdWUuc3BsaXQoXCI6XCIpLm1hcChOdW1iZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBEYXRlKFxyXG4gICAgICAgICAgICAgICAgICBEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgMClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgLnRvSVNPU3RyaW5nKClcclxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCJUXCIsIFwiIFwiKVxyXG4gICAgICAgICAgICAgICAgICAucmVwbGFjZShcIlpcIiwgXCJcIik7XHJcbiAgICAgICAgICAgICAgICBhcnJDcml0W2luZGV4UGFpcl0udmFsdWUgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKCFpc0FkZFRvVGVtcCAmJiAhc2tpcFB1c2hUb0NyaXQpIHtcclxuICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBjb21wRGF0YVR5cGUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS10eXBlXCIpO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNvbXBEYXRhVHlwZSA9PT0gXCJsb29rdXBcIiB8fFxyXG4gICAgICAgICAgKGNvbXBEYXRhVHlwZSA9PT0gXCJkYXRlXCIgJiYgdGhpcy51c2VOZXdEYXRlcGlja2VyKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgZm9ybVNlcSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChJc0JyZWFrKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWRkQ3JpdCAhPSBudWxsICYmIGFkZENyaXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmIChhZGRDcml0Lmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRDcml0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBhcnJDcml0LnB1c2goYWRkQ3JpdFtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0ICE9IG51bGwgfHxcclxuICAgICAgICB0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dCAhPSB1bmRlZmluZWRcclxuICAgICAgKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgYXJyQ3JpdC5wdXNoKHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0W2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0ICE9IG51bGwgfHxcclxuICAgICAgdGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXQgIT0gdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGFyckNyaXQucHVzaCh0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dFtpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNDbGlja1NlYXJjaCkge1xyXG4gICAgICB0aGlzLnBlcnNpc3RDcml0ID0gYXJyQ3JpdDtcclxuICAgIH1cclxuICAgIHJlcXVlc3QuY3JpdGVyaWEgPSB0aGlzLnBlcnNpc3RDcml0O1xyXG5cclxuICAgIGlmIChpc0FkZFRvVGVtcCkge1xyXG4gICAgICB0aGlzLnBlcnNpc3RBZGRUb1RlbXBDcml0ID0gYWRkVG9UZW1wQ3JpdDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wZXJzaXN0QWRkVG9UZW1wQ3JpdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJlcXVlc3QuY3JpdGVyaWEgPSByZXF1ZXN0LmNyaXRlcmlhLmNvbmNhdCh0aGlzLnBlcnNpc3RBZGRUb1RlbXBDcml0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmaWx0ZXIgZHVwbGljYXRlIGRhdGEgaW4gYXJyYXlcclxuICAgIHJlcXVlc3QuY3JpdGVyaWEgPSB0aGlzLmZpbHRlckR1cGxpY2F0ZURhdGEocmVxdWVzdC5jcml0ZXJpYSk7XHJcblxyXG4gICAgLy8gZmlsdGVyIGVtcHR5IHZhbHVlIGluIGxpc3RWYWx1ZVxyXG4gICAgcmVxdWVzdC5jcml0ZXJpYSA9IHRoaXMuZmlsdGVyTGlzdFZhbHVlRW1wdHkocmVxdWVzdC5jcml0ZXJpYSk7XHJcblxyXG4gICAgLy8gZmlsdGVyIGVtcHR5IHByb3BOYW1lXHJcbiAgICByZXF1ZXN0LmNyaXRlcmlhID0gdGhpcy5maWx0ZXJFbXB0eVByb3BOYW1lKHJlcXVlc3QuY3JpdGVyaWEpO1xyXG5cclxuICAgIHJlcXVlc3QuaW50ZWdyYXRpb25PYmogPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuaXNKb2luRXhBUEkpIHtcclxuICAgICAgcmVxdWVzdC5pbnRlZ3JhdGlvbk9iaiA9IHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmo7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc1NlYXJjaCA9IHRydWU7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNlYXJjaElucHV0LmRhdGFJbnB1dCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc2VhcmNoSW5wdXQuZGF0YUlucHV0KS5sZW5ndGggIT09IDBcclxuICAgICkge1xyXG4gICAgICBib2R5TGlzdCA9IHRoaXMuc2VhcmNoSW5wdXQuZGF0YUlucHV0LmJvZHlMaXN0O1xyXG4gICAgICBmaWxlTmFtZSA9IHRoaXMuc2VhcmNoSW5wdXQuZGF0YUlucHV0LnRpdGxlO1xyXG4gICAgICBoZWFkZXJMaXN0ID0gdGhpcy5zZWFyY2hJbnB1dC5kYXRhSW5wdXQuaGVhZGVyTGlzdDtcclxuICAgICAgYWRkaXRpb25hbEV4cG9ydExpc3QgPSB0aGlzLnNlYXJjaElucHV0LmRhdGFJbnB1dC5hZGRpdGlvbmFsRXhwb3J0TGlzdDtcclxuICAgICAgZXhjbHVkZUV4cG9ydExpc3QgPSB0aGlzLnNlYXJjaElucHV0LmRhdGFJbnB1dC5leGNsdWRlRXhwb3J0TGlzdDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaHR0cFxyXG4gICAgICAgIC5nZXQodGhpcy5zZWFyY2hJbnB1dC5fdXJsKVxyXG4gICAgICAgIC50b1Byb21pc2UoKVxyXG4gICAgICAgIC50aGVuKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIGJvZHlMaXN0ID0gZGF0YS5ib2R5TGlzdDtcclxuICAgICAgICAgIGZpbGVOYW1lID0gZGF0YS50aXRsZTtcclxuICAgICAgICAgIGhlYWRlckxpc3QgPSBkYXRhLmhlYWRlckxpc3Q7XHJcbiAgICAgICAgICBhZGRpdGlvbmFsRXhwb3J0TGlzdCA9IGRhdGEuYWRkaXRpb25hbEV4cG9ydExpc3Q7XHJcbiAgICAgICAgICBleGNsdWRlRXhwb3J0TGlzdCA9IGRhdGEuZXhjbHVkZUV4cG9ydExpc3Q7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QoYXBpVXJsLCByZXF1ZXN0KS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIGlmIChJc0V4cG9ydEV4Y2VsKSB7XHJcbiAgICAgICAgYm9keURhdGEgPSByZXNwb25zZVtcIkRhdGFcIl07XHJcbiAgICAgICAgW2hlYWRlckxpc3QsIGJvZHlMaXN0XSA9IHRoaXMuY2hlY2tBZGRpdGlvbmFsRXhwb3J0TGlzdChcclxuICAgICAgICAgIGhlYWRlckxpc3QsXHJcbiAgICAgICAgICBib2R5TGlzdCxcclxuICAgICAgICAgIGFkZGl0aW9uYWxFeHBvcnRMaXN0XHJcbiAgICAgICAgKTtcclxuICAgICAgICBbaGVhZGVyTGlzdCwgYm9keUxpc3RdID0gdGhpcy5jaGVja0V4Y2x1ZGVFeHBvcnRMaXN0KFxyXG4gICAgICAgICAgaGVhZGVyTGlzdCxcclxuICAgICAgICAgIGJvZHlMaXN0LFxyXG4gICAgICAgICAgZXhjbHVkZUV4cG9ydExpc3RcclxuICAgICAgICApO1xyXG4gICAgICAgIGRhdGFGaWxlID0gdGhpcy5tYXBEYXRhRmlsZShib2R5TGlzdCwgYm9keURhdGEsIGhlYWRlckxpc3QpO1xyXG4gICAgICAgIGlmIChleHRGaWxlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNlbCkge1xyXG4gICAgICAgICAgdGhpcy5leHBvcnRGaWxlU2VydmljZS5leHBvcnRGaWxlQXNFeGNlbChkYXRhRmlsZSwgZmlsZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXh0RmlsZSA9PT0gRVhQT1JUX0RBVEFfVFlQRVMuanNvbikge1xyXG4gICAgICAgICAgdGhpcy5leHBvcnRGaWxlU2VydmljZS5leHBvcnRGaWxlQXNKc29uKGRhdGFGaWxlLCBmaWxlTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChleHRGaWxlID09PSBFWFBPUlRfREFUQV9UWVBFUy5jc3YpIHtcclxuICAgICAgICAgIHRoaXMuZXhwb3J0RmlsZVNlcnZpY2UuZXhwb3J0RmlsZUFzQ3N2KGRhdGFGaWxlLCBmaWxlTmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCAkc2VxdWVuY2UgPSBNYXRoLnJvdW5kKHJlc3BvbnNlW1wiQ291bnRcIl0gLyByb3dQZXJQYWdlKTtcclxuICAgICAgICBpZiAoJHNlcXVlbmNlID4gMSAmJiAkc2VxdWVuY2UgPiBwYWdlTm8pIHtcclxuICAgICAgICAgIHBhZ2VObyA9IHBhZ2VObyArIDE7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgICAgIHRoaXMuc2VhcmNoKFxyXG4gICAgICAgICAgICAgICAgYXBpVXJsLFxyXG4gICAgICAgICAgICAgICAgcGFnZU5vLFxyXG4gICAgICAgICAgICAgICAgcm93UGVyUGFnZSxcclxuICAgICAgICAgICAgICAgIG9yZGVyQnksXHJcbiAgICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgICAgYWRkQ3JpdCxcclxuICAgICAgICAgICAgICAgIElzRXhwb3J0RXhjZWwsXHJcbiAgICAgICAgICAgICAgICBleHRGaWxlXHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgNTBcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9oYW5kbGUgaWYgcmVzcG9uc2UgZGF0YSBpcyBudWxsXHJcbiAgICAgIGlmIChyZXNwb25zZVtcIkRhdGFcIl0gPT09IG51bGwpIHtcclxuICAgICAgICByZXNwb25zZVtcIkRhdGFcIl0gPSBbXTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgcXJ5UGFnaW5nID0ge1xyXG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcclxuICAgICAgICBwYWdlTm93OiBwYWdlTm8sXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnNvbGUubG9nKHFyeVBhZ2luZyk7XHJcbiAgICAgIHRoaXMucmVzdWx0LmVtaXQocXJ5UGFnaW5nKTtcclxuICAgICAgdGhpcy5yZXFHZXRBbGxEYXRhLmVtaXQocmVxdWVzdCk7XHJcbiAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJEdXBsaWNhdGVEYXRhKGRhdGEpIHtcclxuICAgIHJldHVybiBkYXRhLmZpbHRlcigodmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IF92YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBpbmRleCA9PT1cclxuICAgICAgICBkYXRhLmZpbmRJbmRleCgob2JqKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKSA9PT0gX3ZhbHVlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyTGlzdFZhbHVlRW1wdHkoZGF0YSkge1xyXG4gICAgcmV0dXJuIGRhdGEuZmlsdGVyKCh2YWx1ZSkgPT4ge1xyXG4gICAgICBpZiAodmFsdWUubGlzdFZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB2YWx1ZTtcclxuICAgICAgaWYgKHZhbHVlLmxpc3RWYWx1ZS5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbHRlckVtcHR5UHJvcE5hbWUoZGF0YSkge1xyXG4gICAgcmV0dXJuIGRhdGEuZmlsdGVyKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAvLyBGaWx0ZXIgb3V0IGNyaXRlcmlhIHdpdGggZW1wdHkgcHJvcE5hbWVcclxuICAgICAgaWYgKCF2YWx1ZS5wcm9wTmFtZSB8fCB2YWx1ZS5wcm9wTmFtZS50cmltKCkgPT09ICcnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVUcmFpbGluZ0JhY2tzbGFzaGVzQWZ0ZXJQZXJjZW50KHN0cikge1xyXG4gICAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIgfHwgc3RyPy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJShcXFxcKykkLywgXCIlXCIpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tWYWx1ZUd0ZUx0ZShjb21wb25lbnQpIHtcclxuICAgIC8vY2VrIHlnIHBha2FpIHJlc3RyaWN0aW9uIGd0ZS9sdGUvZ3QvbHRcclxuICAgIGxldCBNaW5Db21wb25lbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoXHJcbiAgICAgICh4KSA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RFXCJcclxuICAgICk7XHJcbiAgICBpZiAoIU1pbkNvbXBvbmVudCkge1xyXG4gICAgICBNaW5Db21wb25lbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoXHJcbiAgICAgICAgKHgpID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiB4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IE1heENvbXBvbmVudCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZChcclxuICAgICAgKHgpID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiB4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVEVcIlxyXG4gICAgKTtcclxuICAgIGlmICghTWF4Q29tcG9uZW50KSB7XHJcbiAgICAgIE1heENvbXBvbmVudCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZChcclxuICAgICAgICAoeCkgPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmIHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxUXCJcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoTWluQ29tcG9uZW50ICYmIE1heENvbXBvbmVudCkge1xyXG4gICAgICBsZXQgbWluVmFsdWUgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01pbkNvbXBvbmVudC5pZF0udmFsdWVBc051bWJlcjtcclxuICAgICAgbGV0IG1heFZhbHVlID0gdGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtNYXhDb21wb25lbnQuaWRdLnZhbHVlQXNOdW1iZXI7XHJcbiAgICAgIGlmIChtaW5WYWx1ZSA+IG1heFZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIud2FybmluZyhcclxuICAgICAgICAgIE1pbkNvbXBvbmVudC5sYWJlbCArIFwiIG11c3QgYmUgbGVzcyB0aGFuIFwiICsgTWF4Q29tcG9uZW50LmxhYmVsXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG1hcERhdGFGaWxlKGJvZHlMaXN0RGF0YSwgYm9keURhdGFBcnIsIGhlYWRlckxpc3REYXRhKSB7XHJcbiAgICBsZXQgZGF0YUV4Y2VsID0gbmV3IEFycmF5KCk7XHJcbiAgICBsZXQgYm9keURhdGFUZW1wID0gbmV3IEFycmF5KCk7XHJcbiAgICBsZXQgaGVhZGVyRGF0YVRlbXAgPSBuZXcgQXJyYXkoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJvZHlMaXN0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBbaXNOZWVkVG9QdXNoLCBib2R5RGF0YSwgaGVhZGVyRGF0YV0gPSB0aGlzLmNoZWNrTmVlZERhdGFUb0V4cG9ydChcclxuICAgICAgICBib2R5TGlzdERhdGEsXHJcbiAgICAgICAgaGVhZGVyTGlzdERhdGEsXHJcbiAgICAgICAgaVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoaXNOZWVkVG9QdXNoKSB7XHJcbiAgICAgICAgYm9keURhdGFUZW1wLnB1c2goYm9keURhdGEpO1xyXG4gICAgICAgIGhlYWRlckRhdGFUZW1wLnB1c2goaGVhZGVyRGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJvZHlEYXRhQXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBmaW5hbERhdGEgPSB7fTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBib2R5RGF0YVRlbXAubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGJvZHlEYXRhQXJyW2ldW2JvZHlEYXRhVGVtcFtqXV07XHJcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgICAgICAgIGZpbmFsRGF0YVtoZWFkZXJEYXRhVGVtcFtqXV0gPSB2YWx1ZSA/IFwiWUVTXCIgOiBcIk5PXCI7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaW5hbERhdGFbaGVhZGVyRGF0YVRlbXBbal1dID0gdmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGRhdGFFeGNlbC5wdXNoKGZpbmFsRGF0YSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YUV4Y2VsO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tBZGRpdGlvbmFsRXhwb3J0TGlzdChcclxuICAgIGhlYWRlckxpc3REYXRhLFxyXG4gICAgYm9keUxpc3REYXRhLFxyXG4gICAgYWRkaXRpb25hbEV4cG9ydExpc3RcclxuICApIHtcclxuICAgIGlmIChhZGRpdGlvbmFsRXhwb3J0TGlzdCA9PSB1bmRlZmluZWQpXHJcbiAgICAgIHJldHVybiBbaGVhZGVyTGlzdERhdGEsIGJvZHlMaXN0RGF0YV07XHJcbiAgICBpZiAoYWRkaXRpb25hbEV4cG9ydExpc3QubGVuZ3RoID09IDApIHJldHVybiBbaGVhZGVyTGlzdERhdGEsIGJvZHlMaXN0RGF0YV07XHJcblxyXG4gICAgY29uc3QgX2hlYWRlckxpc3QgPSBbLi4uaGVhZGVyTGlzdERhdGFdO1xyXG4gICAgY29uc3QgX2JvZHlMaXN0ID0gWy4uLmJvZHlMaXN0RGF0YV07XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsRXhwb3J0TGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBfaGVhZGVyTGlzdC5wdXNoKHsgbGFiZWw6IGFkZGl0aW9uYWxFeHBvcnRMaXN0W2ldLmxhYmVsIH0pO1xyXG4gICAgICBfYm9keUxpc3QucHVzaCh7IHByb3BlcnR5OiBhZGRpdGlvbmFsRXhwb3J0TGlzdFtpXS5wcm9wZXJ0eSB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW19oZWFkZXJMaXN0LCBfYm9keUxpc3RdO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tFeGNsdWRlRXhwb3J0TGlzdChoZWFkZXJMaXN0RGF0YSwgYm9keUxpc3REYXRhLCBleGNsdWRlRXhwb3J0TGlzdCkge1xyXG4gICAgaWYgKGV4Y2x1ZGVFeHBvcnRMaXN0ID09IHVuZGVmaW5lZCkgcmV0dXJuIFtoZWFkZXJMaXN0RGF0YSwgYm9keUxpc3REYXRhXTtcclxuICAgIGlmIChleGNsdWRlRXhwb3J0TGlzdC5sZW5ndGggPT0gMCkgcmV0dXJuIFtoZWFkZXJMaXN0RGF0YSwgYm9keUxpc3REYXRhXTtcclxuXHJcbiAgICBjb25zdCBfaGVhZGVyTGlzdCA9IFsuLi5oZWFkZXJMaXN0RGF0YV07XHJcbiAgICBjb25zdCBfYm9keUxpc3QgPSBbLi4uYm9keUxpc3REYXRhXTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4Y2x1ZGVFeHBvcnRMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBpbmRleCA9IF9ib2R5TGlzdC5maW5kSW5kZXgoXHJcbiAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQucHJvcGVydHkgPT0gZXhjbHVkZUV4cG9ydExpc3RbaV0ucHJvcGVydHlcclxuICAgICAgKTtcclxuICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgX2hlYWRlckxpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICBfYm9keUxpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbX2hlYWRlckxpc3QsIF9ib2R5TGlzdF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrTmVlZERhdGFUb0V4cG9ydChcclxuICAgIGJvZHlMaXN0RGF0YTogQXJyYXk8YW55PixcclxuICAgIGhlYWRlckxpc3REYXRhOiBBcnJheTxhbnk+LFxyXG4gICAgaWR4OiBudW1iZXJcclxuICApIHtcclxuICAgIC8vIGFkZCBqc29uIGNoZWNrZXIgZm9yIGRhdGEgdG8gZXhwb3J0IGhlcmVcclxuICAgIGlmIChib2R5TGlzdERhdGFbaWR4XVtcInR5cGVcIl0gIT0gXCJhY3Rpb25cIikge1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIHRydWUsXHJcbiAgICAgICAgYm9keUxpc3REYXRhW2lkeF1bXCJwcm9wZXJ0eVwiXSxcclxuICAgICAgICBoZWFkZXJMaXN0RGF0YVtpZHhdW1wibGFiZWxcIl0sXHJcbiAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWN0aW9uczogYW55W10gPSBib2R5TGlzdERhdGFbaWR4XVtcImFjdGlvblwiXTtcclxuICAgIGlmIChcclxuICAgICAgYm9keUxpc3REYXRhW2lkeF1bXCJ0eXBlXCJdID09IFwiYWN0aW9uXCIgJiZcclxuICAgICAgYWN0aW9uc1swXVtcInR5cGVcIl0gPT0gXCJzd2l0Y2hcIiAmJlxyXG4gICAgICBCb29sZWFuKGFjdGlvbnNbMF1bXCJjYXNlXCJdWzBdW1wicmVzdWx0XCJdW1wicHJvcGVydHlcIl0pXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIFtcclxuICAgICAgICB0cnVlLFxyXG4gICAgICAgIGJvZHlMaXN0RGF0YVtpZHhdW1wiYWN0aW9uXCJdWzBdW1wiY2FzZVwiXVswXVtcInJlc3VsdFwiXVtcInByb3BlcnR5XCJdLFxyXG4gICAgICAgIGhlYWRlckxpc3REYXRhW2lkeF1bXCJsYWJlbFwiXSxcclxuICAgICAgXTtcclxuICAgIH1cclxuICAgIHJldHVybiBbZmFsc2UsIFtdLCBbXV07XHJcbiAgfVxyXG5cclxuICBHZW5lcmF0ZVJlcG9ydChlbmppRm9ybTogYW55KSB7XHJcbiAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHJldHVybjtcclxuICAgIGNvbnN0IF9leHBvcnRUeXBlID0gdGhpcy5mb3JtLmdldChcIkV4cG9ydFR5cGVcIikudmFsdWU7XHJcbiAgICBjb25zdCBfcnB0RXhlY1R5cGUgPSB0aGlzLmZvcm0uZ2V0KFwiUnB0RXhlY1R5cGVcIikudmFsdWU7XHJcbiAgICB0aGlzLmdlblJwdC5lbWl0KHtcclxuICAgICAgRXhwb3J0VHlwZTogX2V4cG9ydFR5cGUsXHJcbiAgICAgIFJwdEV4ZWNUeXBlOiBfcnB0RXhlY1R5cGUsXHJcbiAgICAgIEVsUmVmOiB0aGlzLm15Rm9ybSxcclxuICAgICAgZm9ybVJhdzogdGhpcy5mb3JtLmdldFJhd1ZhbHVlKCksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxlc3NUaGFuRm91cigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmNvdW50Rm9ybSA+IDMpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNvbHZlT2JqZWN0KG9iajogYW55LCB1cmw6IHN0cmluZywgY3JpdDogUmVxdWVzdENyaXRlcmlhT2JqID0gbnVsbCkge1xyXG4gICAgY29uc3QgdmFsID0gdGhpcy5wb3N0SlNPTih1cmwsIGNyaXQpO1xyXG4gICAgdmFsLnN1YnNjcmliZSgodGVtcERhdGEpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIG9iai5jdXN0b21PYmpOYW1lID09IG51bGwgfHxcclxuICAgICAgICBvYmouY3VzdG9tT2JqTmFtZSA9PSB1bmRlZmluZWQgfHxcclxuICAgICAgICBvYmouY3VzdG9tT2JqTmFtZSA9PSBcIlwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIG9iai5jdXN0b21PYmpOYW1lID0gXCJSZXR1cm5PYmplY3RcIjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIG9iai5jdXN0b21LZXlOYW1lID09IG51bGwgfHxcclxuICAgICAgICBvYmouY3VzdG9tS2V5TmFtZSA9PSB1bmRlZmluZWQgfHxcclxuICAgICAgICBvYmouY3VzdG9tS2V5TmFtZSA9PSBcIlwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIG9iai5jdXN0b21LZXlOYW1lID0gXCJLZXlcIjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIG9iai5jdXN0b21WYWx1ZU5hbWUgPT0gbnVsbCB8fFxyXG4gICAgICAgIG9iai5jdXN0b21WYWx1ZU5hbWUgPT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgb2JqLmN1c3RvbVZhbHVlTmFtZSA9PSBcIlwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIG9iai5jdXN0b21WYWx1ZU5hbWUgPSBcIlZhbHVlXCI7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgX2RhdGEgPSBbXTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wRGF0YVtvYmouY3VzdG9tT2JqTmFtZV0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBfZGF0YS5wdXNoKHtcclxuICAgICAgICAgIEtleTogdGVtcERhdGFbb2JqLmN1c3RvbU9iak5hbWVdW2ldW29iai5jdXN0b21LZXlOYW1lXSxcclxuICAgICAgICAgIFZhbHVlOiB0ZW1wRGF0YVtvYmouY3VzdG9tT2JqTmFtZV1baV1bb2JqLmN1c3RvbVZhbHVlTmFtZV0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG9iai5pdGVtc1VybCA9IG5ldyBBcnJheSgpO1xyXG4gICAgICBjb25zdCB1c2VyQWNjZXNzID0gdGhpcy5nZXRVc2VyQWNjZXNzKCk7XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgb2JqLnR5cGUgPT0gXCJvZmZpY2VSb2xlQ29kZXNcIiAmJlxyXG4gICAgICAgIG9iai5pc0xvY2tIbyAmJlxyXG4gICAgICAgIHVzZXJBY2Nlc3NbXCJNck9mZmljZVR5cGVDb2RlXCJdID09IFwiSE9cIlxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQga2V5VmFsdWVPYmogPSB7XHJcbiAgICAgICAgICBLZXk6IHVzZXJBY2Nlc3NbXCJPZmZpY2VDb2RlXCJdLFxyXG4gICAgICAgICAgVmFsdWU6IHVzZXJBY2Nlc3NbXCJPZmZpY2VOYW1lXCJdLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgb2JqLml0ZW1zVXJsLnB1c2goa2V5VmFsdWVPYmopO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG9iai5pdGVtc1VybCA9IF9kYXRhO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAob2JqLmV4Y2x1ZGUgIT0gdW5kZWZpbmVkICYmIG9iai5leGNsdWRlICE9IFwiXCIpIHtcclxuICAgICAgICBvYmouaXRlbXNVcmwgPSBvYmouaXRlbXNVcmwuZmlsdGVyKFxyXG4gICAgICAgICAgKHZhbHVlKSA9PiAhb2JqLmV4Y2x1ZGUuaW5jbHVkZXModmFsdWUuS2V5KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChvYmouaXRlbXNVcmwubGVuZ3RoID09IDEpIHtcclxuICAgICAgICBvYmoudmFsdWUgPSBvYmouaXRlbXNVcmxbMF0uS2V5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAob2JqLnR5cGUgPT0gXCJkcm9wZG93blNlYXJjaFwiICYmIG9iai5pdGVtc1VybC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgIG9iai52YWx1ZSA9IG9iai5pdGVtc1VybFswXS5LZXk7XHJcbiAgICAgICAgb2JqLmRlc2NyID0gb2JqLml0ZW1zVXJsWzBdLlZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvYmouYWZmZWN0ZWRGaWx0ZXIgJiYgb2JqLml0ZW1zVXJsLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZUV2ZW50KG9iai5pdGVtc1VybFswXS5LZXksIG9iaik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51cGRhdGVLZXlWYWxEaWN0KHtcclxuICAgICAgICBrZXk6IG9iai5uYW1lLFxyXG4gICAgICAgIHZhbHVlOiBvYmoudmFsdWUsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKG9iai51c2VGaXJzdFZhbHVlICYmIG9iai5pdGVtc1VybC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW29iai5uYW1lXS5zZXRWYWx1ZShvYmouaXRlbXNVcmxbMF0uS2V5KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0cmFuc2Zvcm1Ub0RlY2ltYWwoZWxlbWVudDogYW55KSB7XHJcbiAgICBlbGVtZW50LnRhcmdldC52YWx1ZSA9IHBhcnNlRmxvYXQoXHJcbiAgICAgIGVsZW1lbnQudGFyZ2V0LnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvLC9nLCBcIlwiKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydEFzRmlsZShleHRGaWxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoQ2xpY2sodHJ1ZSwgZXh0RmlsZSk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZUV2ZW50KG9wdFZhbHVlLCBhZkZpbHRlcikge1xyXG4gICAgbGV0IGpzb25Db21wID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudDtcclxuICAgIHRoaXMudXBkYXRlS2V5VmFsRGljdCh7IGtleTogYWZGaWx0ZXIubmFtZSwgdmFsdWU6IGFmRmlsdGVyLnZhbHVlIH0pO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWZGaWx0ZXIuYWZmZWN0ZWRGaWx0ZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBqc29uQ29tcC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmIChqc29uQ29tcFtqXS5uYW1lID09IGFmRmlsdGVyLmFmZmVjdGVkRmlsdGVyW2ldKSB7XHJcbiAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q3JpdGVyaWFPYmooKTtcclxuICAgICAgICAgIGxldCBhcnJheUNyaXQgPSBuZXcgQXJyYXkoKTtcclxuXHJcbiAgICAgICAgICBpZiAob3B0VmFsdWUgIT0gXCJhbGxcIiAmJiBvcHRWYWx1ZSAhPSBcIm9uZVwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IF9jcml0UHJvcE5hbWVBcnIgPSBqc29uQ29tcFtqXS5jcml0ZXJpYVByb3BOYW1lLnNwbGl0KFwiO1wiKTtcclxuICAgICAgICAgICAgaWYgKF9jcml0UHJvcE5hbWVBcnIubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IF9jcml0UHJvcFZhbHVlQXJyID1cclxuICAgICAgICAgICAgICAgIGpzb25Db21wW2pdLmNyaXRlcmlhUHJvcFZhbHVlLnNwbGl0KFwiO1wiKTtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBbaW5kZXgsIGl0ZW1dIG9mIF9jcml0UHJvcE5hbWVBcnIuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjcml0T2JqID0gbmV3IENyaXRlcmlhT2JqKCk7XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLkRhdGFUeXBlID0gYWZGaWx0ZXIuZGF0YXR5cGU7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgcmVxdWVzdFtpdGVtXSA9IG9wdFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVEaWN0W2l0ZW1dID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uaW5jbHVkZXMoXCJkaWN0cy5cIikpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRPYmpEYXRhKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGljdHNcIixcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgIGFmRmlsdGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsXHJcbiAgICAgICAgICAgICAgICAgICAgb3B0VmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgY3JpdE9iaixcclxuICAgICAgICAgICAgICAgICAgICBfY3JpdFByb3BWYWx1ZUFycixcclxuICAgICAgICAgICAgICAgICAgICBpbmRleFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmluY2x1ZGVzKFwibG9va3VwLlwiKSkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldE9iakRhdGEoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJsb29rdXBcIixcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgIGFmRmlsdGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsXHJcbiAgICAgICAgICAgICAgICAgICAgb3B0VmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgY3JpdE9iaixcclxuICAgICAgICAgICAgICAgICAgICBfY3JpdFByb3BWYWx1ZUFycixcclxuICAgICAgICAgICAgICAgICAgICBpbmRleFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlRGljdFtpdGVtXSkge1xyXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0W2l0ZW1dID0gdGhpcy52YWx1ZURpY3RbaXRlbV07XHJcbiAgICAgICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSB0aGlzLnZhbHVlRGljdFtpdGVtXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RbaXRlbV0gPSBfY3JpdFByb3BWYWx1ZUFycltpbmRleF07XHJcbiAgICAgICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBfY3JpdFByb3BWYWx1ZUFycltpbmRleF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gaXRlbTtcclxuICAgICAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uRXE7XHJcbiAgICAgICAgICAgICAgICBhcnJheUNyaXQucHVzaChjcml0T2JqKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3JpdE9iaiA9IG5ldyBDcml0ZXJpYU9iaigpO1xyXG4gICAgICAgICAgICAgIGNyaXRPYmouRGF0YVR5cGUgPSBhZkZpbHRlci5kYXRhdHlwZTtcclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBhZkZpbHRlci5maWx0ZXJQcm9wTmFtZSAhPSB1bmRlZmluZWQgfHxcclxuICAgICAgICAgICAgICAgIGFmRmlsdGVyLmZpbHRlclByb3BOYW1lICE9IFwiXCJcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RbYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWVdID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlRGljdFthZkZpbHRlci5maWx0ZXJQcm9wTmFtZV0gPSBvcHRWYWx1ZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGFmRmlsdGVyLm5hbWU7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0W2FmRmlsdGVyLm5hbWVdID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBvcHRWYWx1ZTtcclxuICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkVxO1xyXG4gICAgICAgICAgICAgIGFycmF5Q3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAob3B0VmFsdWUgPT0gXCJhbGxcIiB8fCBvcHRWYWx1ZSA9PSBcIm90aGVyc1wiKSB7XHJcbiAgICAgICAgICAgIGxldCBjcml0T2JqID0gbmV3IENyaXRlcmlhT2JqKCk7XHJcbiAgICAgICAgICAgIGFycmF5Q3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgICBqc29uQ29tcFtqXS52YWx1ZSA9IG9wdFZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVxdWVzdC5jcml0ZXJpYSA9IGFycmF5Q3JpdDtcclxuICAgICAgICAgIGlmIChqc29uQ29tcFtqXS5wYXRoICE9IHVuZGVmaW5lZCAmJiBqc29uQ29tcFtqXS5wYXRoICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cyAhPSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoICE9IDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgZm9yIChcclxuICAgICAgICAgICAgICAgIGxldCB5ID0gMDtcclxuICAgICAgICAgICAgICAgIHkgPCB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgeSsrXHJcbiAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgIGpzb25Db21wW2pdLmVudmlyb25tZW50ID09XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50c1t5XS5lbnZpcm9ubWVudFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgIGpzb25Db21wW2pdLmZ1bGxwYXRoID1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHNbeV0udXJsICsganNvbkNvbXBbal0ucGF0aDtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGpzb25Db21wW2pdLmZ1bGxwYXRoID0ganNvbkNvbXBbal0udXJsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBqc29uQ29tcFtqXS5mdWxscGF0aCA9IGpzb25Db21wW2pdLnVybDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucmVzb2x2ZU9iamVjdChqc29uQ29tcFtqXSwganNvbkNvbXBbal0uZnVsbHBhdGgsIHJlcXVlc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPYmpEYXRhKFxyXG4gICAgdHlwZTogXCJsb29rdXBcIiB8IFwiZGljdHNcIixcclxuICAgIGl0ZW06IGFueSxcclxuICAgIGFmRmlsdGVyOiBhbnksXHJcbiAgICByZXF1ZXN0OiBSZXF1ZXN0Q3JpdGVyaWFPYmosXHJcbiAgICBvcHRWYWx1ZTogYW55LFxyXG4gICAgY3JpdE9iajogQ3JpdGVyaWFPYmosXHJcbiAgICBfY3JpdFByb3BWYWx1ZUFycjogYW55LFxyXG4gICAgaW5kZXg6IGFueVxyXG4gICkge1xyXG4gICAgbGV0IF9vYmpEaWN0cyA9IHRoaXMudmFsdWVEaWN0O1xyXG4gICAgaWYgKHR5cGUgPT09IFwibG9va3VwXCIpIHtcclxuICAgICAgX29iakRpY3RzID0gdGhpcy5sb29rdXBEaWN0O1xyXG4gICAgfVxyXG4gICAgY29uc3QgX2l0ZW0gPSBpdGVtLnNwbGl0KFwiLlwiKTtcclxuICAgIGlmIChfaXRlbVsxXSA9PT0gYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWUpIHtcclxuICAgICAgcmVxdWVzdFtfaXRlbVsxXV0gPSBvcHRWYWx1ZTtcclxuICAgICAgY3JpdE9iai52YWx1ZSA9IG9wdFZhbHVlO1xyXG4gICAgICBfb2JqRGljdHNbX2l0ZW1bMV1dID0gb3B0VmFsdWU7XHJcbiAgICB9IGVsc2UgaWYgKF9vYmpEaWN0c1tfaXRlbVsxXV0pIHtcclxuICAgICAgcmVxdWVzdFtfaXRlbVsxXV0gPSBfb2JqRGljdHNbX2l0ZW1bMV1dO1xyXG4gICAgICBjcml0T2JqLnZhbHVlID0gX29iakRpY3RzW19pdGVtWzFdXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlcXVlc3RbX2l0ZW1bMV1dID0gX2NyaXRQcm9wVmFsdWVBcnJbaW5kZXhdO1xyXG4gICAgICBjcml0T2JqLnZhbHVlID0gX2NyaXRQcm9wVmFsdWVBcnJbaW5kZXhdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgU2V0UHJvY2Vzc0tleShpZHg6IG51bWJlciwgd2ZLZXlGaWx0ZXI6IHN0cmluZykge1xyXG4gICAgbGV0IGNvbXBvbmVudCA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbaWR4XTtcclxuICAgIGxldCBkZGwgPSBjb21wb25lbnQub3B0aW9ucztcclxuICAgIGxldCB0ZXh0OiBzdHJpbmcgPSBkZGxbZGRsLnNlbGVjdGVkSW5kZXhdLnZhbHVlLnRyaW0oKTtcclxuICAgIGxldCBsaXN0VmFsdWUgPSB0ZXh0LnNwbGl0KFwiO1wiKTtcclxuICAgIGxldCBsaXN0V2ZLZXkgPSB3ZktleUZpbHRlci5zcGxpdChcIjtcIik7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0VmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5zZWFyY2hJbnB1dC5pbnRlZ3JhdGlvbk9iai5yZXF1ZXN0T2JqW2xpc3RXZktleVtpXV0gPSBsaXN0VmFsdWVbaV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzd2l0Y2hDYXNlKGNvbmRMaXN0KSB7XHJcbiAgICBsZXQgY29uZGl0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kTGlzdC5jb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBpZHggPSB0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlLmZpbmRJbmRleChcclxuICAgICAgICAoeCkgPT4geC5wcm9wZXJ0eSA9PSBjb25kTGlzdC5jb25kaXRpb25zW2ldLnByb3BlcnR5XHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiRVFcIikge1xyXG4gICAgICAgIGlmICghY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID09XHJcbiAgICAgICAgICAgIGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWVcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA9PSB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiTkVRXCIpIHtcclxuICAgICAgICBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgIT1cclxuICAgICAgICAgICAgY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCB1c2VybmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiVXNlcm5hbWVcIik7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlICE9IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJHVFwiKSB7XHJcbiAgICAgICAgaWYgKCFjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlcikge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPlxyXG4gICAgICAgICAgICBjb25kTGlzdC5jb25kaXRpb25zW2ldLnZhbHVlXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPiB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiR1RFXCIpIHtcclxuICAgICAgICBpZiAoIWNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA+PVxyXG4gICAgICAgICAgICBjb25kTGlzdC5jb25kaXRpb25zW2ldLnZhbHVlXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPj0gdXNlcm5hbWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5yZXN0cmljdGlvbiA9PSBcIkxUXCIpIHtcclxuICAgICAgICBpZiAoIWNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8XHJcbiAgICAgICAgICAgIGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWVcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJMVEVcIikge1xyXG4gICAgICAgIGlmICghY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlIDw9XHJcbiAgICAgICAgICAgIGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWVcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8PSB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbmRpdGlvbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgRGVjcnlwdFN0cmluZyhjaGlwcGVyVGV4dDogc3RyaW5nLCBjaGlwcGVyS2V5OiBzdHJpbmcpIHtcclxuICAgIGlmIChcclxuICAgICAgY2hpcHBlcktleSA9PSB1bmRlZmluZWQgfHxcclxuICAgICAgY2hpcHBlcktleS50cmltKCkgPT0gXCJcIiB8fFxyXG4gICAgICBjaGlwcGVyVGV4dCA9PSB1bmRlZmluZWQgfHxcclxuICAgICAgY2hpcHBlclRleHQudHJpbSgpID09IFwiXCJcclxuICAgIClcclxuICAgICAgcmV0dXJuIGNoaXBwZXJUZXh0O1xyXG4gICAgbGV0IGNoaXBwZXJLZXlBcnIgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShjaGlwcGVyS2V5KTtcclxuICAgIGxldCBpdiA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwLCAweDAwLCAweDAwLCAweDAwXSk7XHJcbiAgICBsZXQgZGVjcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoY2hpcHBlclRleHQsIGNoaXBwZXJLZXlBcnIsIHtcclxuICAgICAgaXY6IGl2LFxyXG4gICAgfSk7XHJcbiAgICBsZXQgcGxhaW5UZXh0ID0gZGVjcnlwdGVkLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcclxuICAgIHJldHVybiBwbGFpblRleHQ7XHJcbiAgfVxyXG5cclxuICBjaGVja0lucHV0RGF0ZShjb21wb25lbnQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgbGV0IGRhdGVXcm9uZyA9IGZhbHNlO1xyXG4gICAgY29uc3QgX2NvbXBvbmVudFZhbHVlID0gdGhpcy5mb3JtLmNvbnRyb2xzW2NvbXBvbmVudC5uYW1lICsgaW5kZXhdLnZhbHVlO1xyXG4gICAgZGF0ZVdyb25nID0gdGhpcy5jaGVja01pbk1heFZhbGlkYXRpb24oY29tcG9uZW50KTtcclxuICAgIGxldCB1ZHBhdGVkVmFsdWUgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZERhdGUoX2NvbXBvbmVudFZhbHVlKSkge1xyXG4gICAgICB1ZHBhdGVkVmFsdWUgPSBmb3JtYXREYXRlKFxyXG4gICAgICAgIG5ldyBEYXRlKF9jb21wb25lbnRWYWx1ZSksXHJcbiAgICAgICAgXCJ5eXl5LU1NLWRkXCIsXHJcbiAgICAgICAgXCJlbi1VU1wiXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUtleVZhbERpY3Qoe1xyXG4gICAgICBrZXk6IGNvbXBvbmVudC5uYW1lLFxyXG4gICAgICB2YWx1ZTogdWRwYXRlZFZhbHVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFkYXRlV3JvbmcpIHtcclxuICAgICAgdGhpcy51cGRhdGVNaW5NYXhEYXRlVmFsdWUoe1xyXG4gICAgICAgIHZhbHVlOiBfY29tcG9uZW50VmFsdWUsXHJcbiAgICAgICAgZGF0ZXBpY2tlclBhaXI6IGNvbXBvbmVudC5kYXRlcGlja2VyUGFpcixcclxuICAgICAgICByZXN0cmljdGlvbjogY29tcG9uZW50LnJlc3RyaWN0aW9uLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tNaW5NYXhWYWxpZGF0aW9uKGNvbXBvbmVudDogYW55KSB7XHJcbiAgICBsZXQgbWluRGF0ZVZhbDtcclxuICAgIGxldCBtYXhEYXRlVmFsO1xyXG4gICAgbGV0IGxhYmVsO1xyXG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICBsZXQgZGF0ZVdyb25nID0gZmFsc2U7XHJcbiAgICBjb25zdCBuYXRpdmVFbCA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnQuZWxlbWVudHM7XHJcbiAgICBjb25zdCBfY29tcCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQ7XHJcblxyXG4gICAgbGV0IG1pbkNvbXBvbmVudElkeCA9XHJcbiAgICAgIF9jb21wLmZpbmRJbmRleChcclxuICAgICAgICAoeCkgPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmIHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiXHJcbiAgICAgICkgPT09IC0xXHJcbiAgICAgICAgPyBfY29tcC5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICh4KSA9PlxyXG4gICAgICAgICAgICAgIHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiB4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgOiBfY29tcC5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICh4KSA9PlxyXG4gICAgICAgICAgICAgIHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiB4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVEVcIlxyXG4gICAgICAgICAgKTtcclxuICAgIGlmIChtaW5Db21wb25lbnRJZHggIT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IF9taW5Db21wb25lbnROYW1lID0gX2NvbXBbbWluQ29tcG9uZW50SWR4XS5uYW1lICsgbWluQ29tcG9uZW50SWR4O1xyXG4gICAgICBtaW5EYXRlVmFsID0gdGhpcy5pc1ZhbGlkRGF0ZShuYXRpdmVFbFtfbWluQ29tcG9uZW50TmFtZV0ubWluKVxyXG4gICAgICAgID8gbmV3IERhdGUobmF0aXZlRWxbX21pbkNvbXBvbmVudE5hbWVdLm1pbilcclxuICAgICAgICA6IG51bGw7XHJcbiAgICAgIGxhYmVsID0gX2NvbXBbbWluQ29tcG9uZW50SWR4XS5sYWJlbC5zcGxpdChcIj5cIiwgMik7XHJcbiAgICAgIGlmIChtaW5EYXRlVmFsICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoX2NvbXBbbWluQ29tcG9uZW50SWR4XS5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RcIikge1xyXG4gICAgICAgICAgbWluRGF0ZVZhbC5zZXREYXRlKG1pbkRhdGVWYWwuZ2V0RGF0ZSgpIC0gMSk7XHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2UucHVzaChcIiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChfY29tcFttaW5Db21wb25lbnRJZHhdLnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVEVcIikge1xyXG4gICAgICAgICAgZXJyb3JNZXNzYWdlLnB1c2goXCIgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWxzIHRvIFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWF4Q29tcG9uZW50SWR4ID1cclxuICAgICAgX2NvbXAuZmluZEluZGV4KFxyXG4gICAgICAgICh4KSA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRFXCJcclxuICAgICAgKSA9PT0gLTFcclxuICAgICAgICA/IF9jb21wLmZpbmRJbmRleChcclxuICAgICAgICAgICAgKHgpID0+XHJcbiAgICAgICAgICAgICAgeC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmIHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxUXCJcclxuICAgICAgICAgIClcclxuICAgICAgICA6IF9jb21wLmZpbmRJbmRleChcclxuICAgICAgICAgICAgKHgpID0+XHJcbiAgICAgICAgICAgICAgeC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmIHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiXHJcbiAgICAgICAgICApO1xyXG4gICAgaWYgKG1heENvbXBvbmVudElkeCAhPT0gLTEpIHtcclxuICAgICAgY29uc3QgX21heENvbXBvbmVudE5hbWUgPSBfY29tcFttYXhDb21wb25lbnRJZHhdLm5hbWUgKyBtYXhDb21wb25lbnRJZHg7XHJcbiAgICAgIG1heERhdGVWYWwgPSB0aGlzLmlzVmFsaWREYXRlKG5hdGl2ZUVsW19tYXhDb21wb25lbnROYW1lXS5tYXgpXHJcbiAgICAgICAgPyBuZXcgRGF0ZShuYXRpdmVFbFtfbWF4Q29tcG9uZW50TmFtZV0ubWF4KVxyXG4gICAgICAgIDogbnVsbDtcclxuICAgICAgbGFiZWwgPSBfY29tcFttYXhDb21wb25lbnRJZHhdLmxhYmVsLnNwbGl0KFwiPFwiLCAyKTtcclxuICAgICAgaWYgKG1heERhdGVWYWwgIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChfY29tcFttYXhDb21wb25lbnRJZHhdLnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVFwiKSB7XHJcbiAgICAgICAgICBtYXhEYXRlVmFsLnNldERhdGUobWF4RGF0ZVZhbC5nZXREYXRlKCkgKyAxKTtcclxuICAgICAgICAgIGVycm9yTWVzc2FnZS5wdXNoKFwiIG11c3QgYmUgbGVzcyB0aGFuIFwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKF9jb21wW21heENvbXBvbmVudElkeF0ucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiKSB7XHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2UucHVzaChcIiBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbHMgdG8gXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgbWluRGF0ZVZhbCAhPSBudWxsICYmXHJcbiAgICAgIG1heERhdGVWYWwgPT0gbnVsbCAmJlxyXG4gICAgICBuZXcgRGF0ZShcclxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbX2NvbXBbbWluQ29tcG9uZW50SWR4XS5uYW1lICsgbWluQ29tcG9uZW50SWR4XS52YWx1ZVxyXG4gICAgICApIDwgbWluRGF0ZVZhbFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudG9hc3RyLndhcm5pbmcoXHJcbiAgICAgICAgbGFiZWxbMF0gK1xyXG4gICAgICAgICAgZXJyb3JNZXNzYWdlWzBdICtcclxuICAgICAgICAgIGZvcm1hdERhdGUobWluRGF0ZVZhbCwgXCJkZCBNTU1NIHl5eXlcIiwgXCJlbi1VU1wiKSArXHJcbiAgICAgICAgICBcIi5cIlxyXG4gICAgICApO1xyXG4gICAgICBkYXRlV3JvbmcgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgbWF4RGF0ZVZhbCAhPSBudWxsICYmXHJcbiAgICAgIG1pbkRhdGVWYWwgPT0gbnVsbCAmJlxyXG4gICAgICBuZXcgRGF0ZShcclxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbX2NvbXBbbWF4Q29tcG9uZW50SWR4XS5uYW1lICsgbWF4Q29tcG9uZW50SWR4XS52YWx1ZVxyXG4gICAgICApID4gbWF4RGF0ZVZhbFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudG9hc3RyLndhcm5pbmcoXHJcbiAgICAgICAgbGFiZWxbMF0gK1xyXG4gICAgICAgICAgZXJyb3JNZXNzYWdlWzBdICtcclxuICAgICAgICAgIGZvcm1hdERhdGUobWF4RGF0ZVZhbCwgXCJkZCBNTU1NIHl5eXlcIiwgXCJlbi1VU1wiKSArXHJcbiAgICAgICAgICBcIi5cIlxyXG4gICAgICApO1xyXG4gICAgICBkYXRlV3JvbmcgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChtaW5EYXRlVmFsICE9IG51bGwgJiYgbWF4RGF0ZVZhbCAhPSBudWxsKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBuZXcgRGF0ZShcclxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tcclxuICAgICAgICAgICAgX2NvbXBbbWF4Q29tcG9uZW50SWR4XS5uYW1lICsgbWF4Q29tcG9uZW50SWR4XHJcbiAgICAgICAgICBdLnZhbHVlXHJcbiAgICAgICAgKSA+IG1heERhdGVWYWwgfHxcclxuICAgICAgICBuZXcgRGF0ZShcclxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tcclxuICAgICAgICAgICAgX2NvbXBbbWluQ29tcG9uZW50SWR4XS5uYW1lICsgbWluQ29tcG9uZW50SWR4XHJcbiAgICAgICAgICBdLnZhbHVlXHJcbiAgICAgICAgKSA8IG1pbkRhdGVWYWxcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIud2FybmluZyhcclxuICAgICAgICAgIGxhYmVsWzBdICtcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlWzBdICtcclxuICAgICAgICAgICAgZm9ybWF0RGF0ZShtaW5EYXRlVmFsLCBcImRkIE1NTU0geXl5eVwiLCBcImVuLVVTXCIpICtcclxuICAgICAgICAgICAgXCIgYW5kXCIgK1xyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VbMV0gK1xyXG4gICAgICAgICAgICBmb3JtYXREYXRlKG1heERhdGVWYWwsIFwiZGQgTU1NTSB5eXl5XCIsIFwiZW4tVVNcIikgK1xyXG4gICAgICAgICAgICBcIi5cIlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZGF0ZVdyb25nID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkYXRlV3JvbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGF0ZVdyb25nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZVdyb25nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVNaW5NYXhEYXRlVmFsdWUob3B0czogYW55KSB7XHJcbiAgICBjb25zdCB7IHZhbHVlLCBkYXRlcGlja2VyUGFpciwgcmVzdHJpY3Rpb24gfSA9IG9wdHM7XHJcblxyXG4gICAgY29uc3QgX21pbkNvbXBzID0gW107XHJcbiAgICBjb25zdCBfbWF4Q29tcHMgPSBbXTtcclxuICAgIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmVudHJpZXMoKSkge1xyXG4gICAgICBpZiAoaXRlbS5jb25mTWluRGF0ZSA9PT0gZGF0ZXBpY2tlclBhaXIpIHtcclxuICAgICAgICBfbWluQ29tcHMucHVzaCh7XHJcbiAgICAgICAgICBjb21wOiBpdGVtLFxyXG4gICAgICAgICAgaW5kZXgsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpdGVtLmNvbmZNYXhEYXRlID09PSBkYXRlcGlja2VyUGFpcikge1xyXG4gICAgICAgIF9tYXhDb21wcy5wdXNoKHtcclxuICAgICAgICAgIGNvbXA6IGl0ZW0sXHJcbiAgICAgICAgICBpbmRleCxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghZGF0ZXBpY2tlclBhaXIpIHJldHVybjtcclxuICAgIGZvciAoY29uc3QgbWluQ29tcG9uZW50IG9mIF9taW5Db21wcykge1xyXG4gICAgICBjb25zdCBfdmFsdWUgPSB2YWx1ZTtcclxuICAgICAgY29uc3QgX3Jlc3RyaWN0aW9uID1cclxuICAgICAgICBtaW5Db21wb25lbnQuY29tcC5kYXRlcGlja2VyUGFpciA9PT0gZGF0ZXBpY2tlclBhaXIgPyByZXN0cmljdGlvbiA6IFwiXCI7XHJcbiAgICAgIGlmIChfdmFsdWUgIT09IG51bGwgJiYgX3ZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGUoXHJcbiAgICAgICAgICBtaW5Db21wb25lbnQsXHJcbiAgICAgICAgICBcImNvbmZNYXhEYXRlXCIsXHJcbiAgICAgICAgICBfdmFsdWUsXHJcbiAgICAgICAgICBcIm1heERhdGVcIixcclxuICAgICAgICAgIGRhdGVwaWNrZXJQYWlyXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBfcmVzdHJpY3Rpb24udG9Mb3dlckNhc2UoKSAhPT0gXCJndGVcIiAmJlxyXG4gICAgICAgICAgX3Jlc3RyaWN0aW9uLnRvTG93ZXJDYXNlKCkgIT09IFwiZ3RcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnREYXRlKFxyXG4gICAgICAgICAgICBtaW5Db21wb25lbnQsXHJcbiAgICAgICAgICAgIFwiY29uZk1pbkRhdGVcIixcclxuICAgICAgICAgICAgX3ZhbHVlLFxyXG4gICAgICAgICAgICBcIm1pbkRhdGVcIixcclxuICAgICAgICAgICAgZGF0ZXBpY2tlclBhaXJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBtYXhDb21wb25lbnQgb2YgX21heENvbXBzKSB7XHJcbiAgICAgIGNvbnN0IF92YWx1ZSA9IHZhbHVlO1xyXG4gICAgICBjb25zdCBfcmVzdHJpY3Rpb24gPVxyXG4gICAgICAgIG1heENvbXBvbmVudC5jb21wLmRhdGVwaWNrZXJQYWlyID09PSBkYXRlcGlja2VyUGFpciA/IHJlc3RyaWN0aW9uIDogXCJcIjtcclxuICAgICAgaWYgKF92YWx1ZSAhPT0gbnVsbCAmJiBfdmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50RGF0ZShcclxuICAgICAgICAgIG1heENvbXBvbmVudCxcclxuICAgICAgICAgIFwiY29uZk1pbkRhdGVcIixcclxuICAgICAgICAgIF92YWx1ZSxcclxuICAgICAgICAgIFwibWluRGF0ZVwiLFxyXG4gICAgICAgICAgZGF0ZXBpY2tlclBhaXJcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIF9yZXN0cmljdGlvbi50b0xvd2VyQ2FzZSgpICE9PSBcImx0ZVwiICYmXHJcbiAgICAgICAgICBfcmVzdHJpY3Rpb24udG9Mb3dlckNhc2UoKSAhPT0gXCJsdFwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGUoXHJcbiAgICAgICAgICAgIG1heENvbXBvbmVudCxcclxuICAgICAgICAgICAgXCJjb25mTWF4RGF0ZVwiLFxyXG4gICAgICAgICAgICBfdmFsdWUsXHJcbiAgICAgICAgICAgIFwibWF4RGF0ZVwiLFxyXG4gICAgICAgICAgICBkYXRlcGlja2VyUGFpclxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgdGhlIG1pbi9tYXggZGF0ZSBhbmQgY29tcG9uZW50IHZhbHVlXHJcbiAgdXBkYXRlQ29tcG9uZW50RGF0ZShcclxuICAgIGNvbXBPYmo6IGFueSxcclxuICAgIGNvbmZEYXRlS2V5OiBzdHJpbmcsXHJcbiAgICB2YWx1ZTogYW55LFxyXG4gICAgZmxhZ0tleTogc3RyaW5nLFxyXG4gICAgZGF0ZXBpY2tlclBhaXI6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgY29uc3QgeyBjb21wOiBjb21wb25lbnQsIGluZGV4IH0gPSBjb21wT2JqO1xyXG4gICAgaWYgKGNvbXBvbmVudFtjb25mRGF0ZUtleV0gPT09IGRhdGVwaWNrZXJQYWlyKSB7XHJcbiAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICAgIGNvbXBvbmVudFtmbGFnS2V5XSA9IFwiXCI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgX2NvbXBvbmVudFZhbHVlID1cclxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tjb21wb25lbnQubmFtZSArIGluZGV4XS52YWx1ZTtcclxuICAgICAgICBjb25zdCBfZmxhZyA9IHRoaXMuZGF0ZXRpbWVTZXJ2aWNlLkNoZWNrRGF0ZVR5cGUoXHJcbiAgICAgICAgICBjb21wb25lbnRbXHJcbiAgICAgICAgICAgIGBhZGRpdGlvbiR7ZmxhZ0tleVswXS50b1VwcGVyQ2FzZSgpfSR7ZmxhZ0tleS5zbGljZSgxKX1Db25mYFxyXG4gICAgICAgICAgXSA/PyBcImJkXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbXBvbmVudFtmbGFnS2V5XSA9IHRoaXMuZGF0ZXRpbWVTZXJ2aWNlLkdldE5ld0RhdGUoXHJcbiAgICAgICAgICBfZmxhZyxcclxuICAgICAgICAgIGNvbXBvbmVudFtcclxuICAgICAgICAgICAgYGFkZGl0aW9uJHtmbGFnS2V5WzBdLnRvVXBwZXJDYXNlKCl9JHtmbGFnS2V5LnNsaWNlKDEpfUNvbmZgXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgdmFsdWVcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIChmbGFnS2V5ID09PSBcIm1pbkRhdGVcIiAmJiBfY29tcG9uZW50VmFsdWUgPCBjb21wb25lbnQubWluRGF0ZSkgfHxcclxuICAgICAgICAgIChmbGFnS2V5ID09PSBcIm1heERhdGVcIiAmJiBfY29tcG9uZW50VmFsdWUgPiBjb21wb25lbnQubWF4RGF0ZSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tjb21wb25lbnQubmFtZV0uc2V0VmFsdWUoXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZE9wdGlvbihpdGVtOiB7IEtleTogc3RyaW5nOyBWYWx1ZTogc3RyaW5nIH0sIGNyaXQ6IGFueSkge1xyXG4gICAgY3JpdC5kZXNjciA9IGl0ZW0uVmFsdWU7XHJcbiAgICBjcml0LmlzTGlzdEhpZGUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgT25Gb2N1c0N1cnIoZXY6IGFueSwgdmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHZhbHVlICE9PSBcIlwiICYmIHZhbHVlICE9PSAwICYmIHZhbHVlICE9PSBcIjBcIikgcmV0dXJuO1xyXG4gICAgZXYudGFyZ2V0LnZhbHVlID0gXCJcIjtcclxuICB9XHJcblxyXG4gIFZhbGlkYXRlRGVmYXVsdFZhbHVlKGl0ZW06IGFueSkge1xyXG4gICAgY29uc3QgaXRlbVZhbHVlID0gaXRlbS52YWx1ZTtcclxuICAgIGlmIChpdGVtVmFsdWUgIT09IFwiXCIgJiYgaXRlbVZhbHVlICE9PSAwICYmIGl0ZW1WYWx1ZSAhPT0gXCIwXCIpIHJldHVybjtcclxuICAgIGNvbnN0IF9lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGlucHV0W25nLXJlZmxlY3QtbmFtZT1cIiR7aXRlbS5uYW1lfVwiXWApO1xyXG4gICAgaWYgKF9lbCA9PT0gbnVsbCkgcmV0dXJuO1xyXG5cclxuICAgIGxldCB2YWwgPSB0aGlzLmdlbmVyYXRlQ3VyckZvY0VsVmFsdWUoaXRlbSk7XHJcbiAgICBfZWxbXCJ2YWx1ZVwiXSA9IHZhbDtcclxuICB9XHJcblxyXG4gIGdldExvb2t1cChldmVudCwgY29tcG9uZW50KSB7XHJcbiAgICBjb25zdCBfZXZlbnRPYmogPSB7XHJcbiAgICAgIGxvb2t1cDogeyAuLi5ldmVudCB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMubG9va3VwRGljdCA9IHsgLi4uZXZlbnQgfTtcclxuICAgIGNvbnN0IF9sb29rdXBPYmogPSB0aGlzLnNlYXJjaElucHV0LmRpY3RMb29rdXBPYmpbY29tcG9uZW50Lm5hbWVdO1xyXG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzW1wibG9va3VwX2lkX1wiICsgY29tcG9uZW50Lm5hbWVdLnNldFZhbHVlKFxyXG4gICAgICBfbG9va3VwT2JqLmlkU2VsZWN0XHJcbiAgICApO1xyXG4gICAgaWYgKCFfbG9va3VwT2JqLmlzRXZlbnQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBhZmZlY3RlZENyaXRlcmlhID0gX2xvb2t1cE9iai5hZmZlY3RlZENyaXRlcmlhO1xyXG4gICAgZm9yIChsZXQgaXRlbSBvZiBhZmZlY3RlZENyaXRlcmlhKSB7XHJcbiAgICAgIGNvbnN0IF91cGRhdGVMb29rdXBPYmogPSB0aGlzLnNlYXJjaElucHV0LmRpY3RMb29rdXBPYmpbaXRlbS5rZXldO1xyXG4gICAgICBfdXBkYXRlTG9va3VwT2JqLmlzUmVhZHkgPSBmYWxzZTtcclxuXHJcbiAgICAgIGxldCBfdmFsdWUgPSBfbG9va3VwT2JqLmlkU2VsZWN0O1xyXG4gICAgICBpZiAoaXRlbS52YWx1ZSAhPSBudWxsICYmIGl0ZW0udmFsdWUgIT0gXCJcIikge1xyXG4gICAgICAgIGlmIChpdGVtLnZhbHVlLmluY2x1ZGVzKFwibG9va3VwLlwiKSkge1xyXG4gICAgICAgICAgY29uc3QgX3RlbXBWYWx1ZSA9IGl0ZW0udmFsdWUuc3BsaXQoXCIuXCIpWzFdO1xyXG4gICAgICAgICAgX3ZhbHVlID0gX2V2ZW50T2JqLmxvb2t1cFtfdGVtcFZhbHVlXSA/PyBfdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIV91cGRhdGVMb29rdXBPYmoub3JpZ2luYWxBZGRDcml0KSB7XHJcbiAgICAgICAgX3VwZGF0ZUxvb2t1cE9iai5vcmlnaW5hbEFkZENyaXQgPSBbLi4uX3VwZGF0ZUxvb2t1cE9iai5hZGRDcml0SW5wdXRdO1xyXG4gICAgICB9XHJcbiAgICAgIF91cGRhdGVMb29rdXBPYmouYWRkZWRBZGRDcml0ID0gW107XHJcbiAgICAgIGNvbnN0IF9hZGRlZENyaXQgPSB7XHJcbiAgICAgICAgcHJvcE5hbWU6IGl0ZW0ucHJvcE5hbWUsXHJcbiAgICAgICAgcmVzdHJpY3Rpb246IGl0ZW0ucmVzdHJpY3Rpb24sXHJcbiAgICAgICAgdmFsdWU6IF92YWx1ZSxcclxuICAgICAgICBEYXRhVHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgaGlnaDogMCxcclxuICAgICAgICBpc0NyaXRlcmlhRGF0YVRhYmxlOiBmYWxzZSxcclxuICAgICAgICBsb3c6IDAsXHJcbiAgICAgIH07XHJcbiAgICAgIF91cGRhdGVMb29rdXBPYmouYWRkZWRBZGRDcml0LnB1c2goX2FkZGVkQ3JpdCk7XHJcbiAgICAgIF91cGRhdGVMb29rdXBPYmouYWRkQ3JpdElucHV0ID0gW1xyXG4gICAgICAgIC4uLl91cGRhdGVMb29rdXBPYmoub3JpZ2luYWxBZGRDcml0LFxyXG4gICAgICAgIC4uLl91cGRhdGVMb29rdXBPYmouYWRkZWRBZGRDcml0LFxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLnNlYXJjaElucHV0LmRpY3RMb29rdXBPYmpbaXRlbS5rZXldID0gSlNPTi5wYXJzZShcclxuICAgICAgICBKU09OLnN0cmluZ2lmeShfdXBkYXRlTG9va3VwT2JqKVxyXG4gICAgICApO1xyXG4gICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICgpID0+ICh0aGlzLnNlYXJjaElucHV0LmRpY3RMb29rdXBPYmpbaXRlbS5rZXldLmlzUmVhZHkgPSB0cnVlKSxcclxuICAgICAgICAxMFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFmZmVjdGVkRmlsdGVyID0gX2xvb2t1cE9iaj8uYWZmZWN0ZWRGaWx0ZXIgPz8gW107XHJcbiAgICBpZiAoYWZmZWN0ZWRGaWx0ZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgX3ZhbHVlID0gX2xvb2t1cE9iai5pZFNlbGVjdDtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIF9sb29rdXBPYmouZmlsdGVyUHJvcFZhbHVlICE9IG51bGwgJiZcclxuICAgICAgICBfbG9va3VwT2JqLmZpbHRlclByb3BWYWx1ZSAhPSBcIlwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChfbG9va3VwT2JqLmZpbHRlclByb3BWYWx1ZS5pbmNsdWRlcyhcImxvb2t1cC5cIikpIHtcclxuICAgICAgICAgIGNvbnN0IF90ZW1wVmFsdWUgPSBfbG9va3VwT2JqLmZpbHRlclByb3BWYWx1ZS5zcGxpdChcIi5cIilbMV07XHJcbiAgICAgICAgICBfdmFsdWUgPSBfZXZlbnRPYmoubG9va3VwW190ZW1wVmFsdWVdID8/IF92YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vbkNoYW5nZUV2ZW50KF92YWx1ZSwgX2xvb2t1cE9iaik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRJbnB1dHRlZFZhbHVlKGV2LCBjb21wb25lbnQpIHtcclxuICAgIHRoaXMuZm9ybS5jb250cm9sc1tcImxvb2t1cF9pZF9cIiArIGNvbXBvbmVudC5uYW1lXS5zZXRWYWx1ZShldik7XHJcbiAgfVxyXG5cclxuICBpc0NvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9uQ29sbGFwc2UoZXYpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiY29sbGFwc2VcIiwgZXYpO1xyXG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9ICEhZXY/LmlzQ29sbGFwc2VkO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlS2V5VmFsRGljdChldikge1xyXG4gICAgdGhpcy5sb29rdXBLZXlWYWxEaWN0W2V2LmtleV0gPSBldi52YWx1ZTtcclxuICAgIHRoaXMubm90aWZ5VXBkYXRlS2V5VmFsRGljdC5lbWl0KHRoaXMubG9va3VwS2V5VmFsRGljdCk7XHJcbiAgICB0aGlzLnVjU2VhcmNoRm9ybVNlcnZpY2Uuc2V0Rm9ybSh0aGlzLmZvcm0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUN1cnJGb2NFbFZhbHVlKGl0ZW06IGFueSkge1xyXG4gICAgbGV0IHZhbCA9IFwiMFwiO1xyXG4gICAgY29uc3QgcHJlY2lzaW9uID0gaXRlbT8ucHJlY2lzaW9uIHx8IDI7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWNpc2lvbjsgaSsrKSB7XHJcbiAgICAgIGlmIChpID09PSAwKSB2YWwgKz0gXCIuXCI7XHJcbiAgICAgIHZhbCArPSBcIjBcIjtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFZhbGlkYXRvck51bWJlcihcclxuICAgIHR5cGVWYWxpZGF0b3I6IFwiTUlOXCIgfCBcIk1BWFwiLFxyXG4gICAgdmFsdWU6IG51bWJlciB8IHN0cmluZyxcclxuICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxyXG4gICkge1xyXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybjtcclxuICAgIGlmICh0eXBlVmFsaWRhdG9yID09PSBcIk1JTlwiKVxyXG4gICAgICBjb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5taW4odmFsdWUgYXMgbnVtYmVyKSk7XHJcbiAgICBlbHNlIGlmICh0eXBlVmFsaWRhdG9yID09PSBcIk1BWFwiKVxyXG4gICAgICBjb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5tYXgodmFsdWUgYXMgbnVtYmVyKSk7XHJcbiAgfVxyXG59XHJcbiIsIjxzcGFuIGhpZGRlbiBhdHRyLnZlcnNpb249XCIzLjguMTgtY2FuYXJ5LjBcIj48L3NwYW4+XHJcbjxkaXY+XHJcbiAgPCEtLSBCYXNpYyBmb3JtIGxheW91dCBzZWN0aW9uIHN0YXJ0IC0tPlxyXG4gIDxsaWItdWNTdWJzZWN0aW9uIFtoaWRkZW5dPVwiIXNlYXJjaElucHV0LklzU3Vic2VjdGlvblwiIFtpZF09XCJzZWFyY2hJbnB1dC5zZWFyY2hJZCsnaWQnXCJcclxuICAgIFt0aXRsZV09XCJjb25maWd1cmF0aW9uPy5zZWN0aW9uVGl0bGUgfHwgJ1BhZ2luZydcIiBbY2FyZF09XCJzZWFyY2hJbnB1dC5zZWFyY2hJZFwiIFtsZWdhY3ldPVwiZmFsc2VcIlxyXG4gICAgKGNvbGxhcHNlKT1cIm9uQ29sbGFwc2UoJGV2ZW50KVwiPlxyXG4gIDwvbGliLXVjU3Vic2VjdGlvbj5cclxuXHJcbiAgPCEtLSA8ZGl2IFtpZF09XCJzZWFyY2hJbnB1dC5zZWFyY2hJZFwiPiAtLT5cclxuICA8IS0tIDxkaXYgY2xhc3M9XCJyb3cgdGV4dC1zdGFydFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICA8ZGl2ID4gLS0+XHJcbiAgPCEtLSA8ZGl2IGNsYXNzPVwicHMtMyBtYi0yIG10LTJcIiAqbmdJZj1cImNvbmZpZ3VyYXRpb24/LnRpdGxlICE9IHVuZGVmaW5lZCAmJiBjb25maWd1cmF0aW9uPy50aXRsZSAhPSAnJ1wiPlxyXG4gICAgICAgICAgPGg0IGNsYXNzPVwiY2FyZC10aXRsZSB1Y1NlYXJjaC10aXRsZVwiIHRyYW5zbGF0ZT57e2NvbmZpZ3VyYXRpb24udGl0bGV9fTwvaDQ+XHJcbiAgICAgICAgPC9kaXY+IC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIiBbaWRdPVwic2VhcmNoSW5wdXQuc2VhcmNoSWRcIiBbKG5nYkNvbGxhcHNlKV09XCJpc0NvbGxhcHNlZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInB4LTNcIj5cclxuICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtIFwiIGlkPVwiZm9ybVNlYXJjaFwiICNmb3JtSWRTZWFyY2ggW2Zvcm1Hcm91cF09XCJmb3JtXCIgI2VuamlGb3JtPVwibmdGb3JtXCJcclxuICAgICAgICAobmdTdWJtaXQpPVwiZW5qaUZvcm0udmFsaWQgJiYgc2VhcmNoQ2xpY2soKVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWJvZHlcIj5cclxuICAgICAgICAgIDwhLS0gPGg0IGNsYXNzPVwiZm9ybS1zZWN0aW9uIGZ3LWJvbGRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiY2hhbmdlU3RhdGUoKVwiIGNsYXNzPVwiYnRuIG5vLXBhZGRpbmcgY3Vyc29yLXBvaW50ZXIgZmxpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTVweDsgbWFyZ2luOiAwcHggMHB4IDVweCAtMTVweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXNIaWRkZW4gPyAnZmEtY2hldnJvbi1yaWdodCcgOiAnZmEtY2hldnJvbi1kb3duJ1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb25maWd1cmF0aW9uPy5zZWN0aW9uVGl0bGUgIT0gdW5kZWZpbmVkICYmIGNvbmZpZ3VyYXRpb24/LnNlY3Rpb25UaXRsZSAhPSAnJzsgdGhlbiBpbnB1dFNlY3Rpb25UaXRsZSBlbHNlIGRlZmF1bHRTZWN0aW9uVGl0bGVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW5wdXRTZWN0aW9uVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAge3tjb25maWd1cmF0aW9uPy5zZWN0aW9uVGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTZWN0aW9uVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgUGFnaW5nXHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2g0PiAtLT5cclxuICAgICAgICAgIDwhLS0gSW5pIERpZ3VuYWthbiB1bnR1ayBHZW5lcmF0ZSBEeW5hbWljIENvbXBvbmVudCAtLT5cclxuICAgICAgICAgIDwhLS0gW2hpZGRlbl09XCJpc0hpZGRlblwiIC0tPlxyXG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY2FyZC1hY3RpdmVcIiBbQGNoYW5nZURpdlNpemVdPWN1cnJlbnRTdGF0ZT4gLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwXCIgKm5nRm9yPVwibGV0IHF1ZXN0aW9uIG9mIGNvbmZpZ3VyYXRpb24/LmNvbXBvbmVudDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTEyIG5vLXBhZGRpbmcgc2VhcmNoLWxhYmVsXCIgZm9yPVwie3txdWVzdGlvbi5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FkaW5zLXJlcXVpcmVkLWxhYmVsJzogKHF1ZXN0aW9uLmlzUmVxdWlyZWQgfHwgKHF1ZXN0aW9uPy5kZGxUeXBlICE9IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnKSl9XCJcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+e3txdWVzdGlvbi5sYWJlbH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBuby1wYWRkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGU9PSd0ZXh0Ym94J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ7e3F1ZXN0aW9uLmlkfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbSXNVcHBlckNhc2VdPVwicXVlc3Rpb24uaXNVcHBlcmNhc2UgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBxdWVzdGlvbi5pc1VwcGVyY2FzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCIgW2Zvcm1Db250cm9sTmFtZV09XCJxdWVzdGlvbi5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicXVlc3Rpb24ucGxhY2Vob2xkZXIgIT0gdW5kZWZpbmVkID8gcXVlc3Rpb24ucGxhY2Vob2xkZXIgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1yZXF1aXJlZD1cInt7cXVlc3Rpb24uaXNSZXF1aXJlZH19XCIgdmFsdWU9XCJ7e3F1ZXN0aW9uLnZhbHVlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIiBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInF1ZXN0aW9uLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwidXBkYXRlS2V5VmFsRGljdCh7a2V5OiBxdWVzdGlvbi5uYW1lLCB2YWx1ZTogcXVlc3Rpb24udmFsdWV9KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGU9PSd0ZXh0YXJlYSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSB0eXBlPVwidGV4dFwiIGlkPVwie3txdWVzdGlvbi5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzUmVxdWlyZWRcIiBuYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiIHZhbHVlPVwie3txdWVzdGlvbi52YWx1ZX19XCIgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJxdWVzdGlvbi5pc1JlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cInVwZGF0ZUtleVZhbERpY3Qoe2tleTogcXVlc3Rpb24ubmFtZSwgdmFsdWU6IHF1ZXN0aW9uLnZhbHVlfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGU9PSdudW1lcmljJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInt7cXVlc3Rpb24uaWR9fVwiIChmb2N1cyk9XCJ0cmFuc2Zvcm1Ub0RlY2ltYWwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cInRyYW5zZm9ybVRvRGVjaW1hbCgkZXZlbnQpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCIgW3BsYWNlaG9sZGVyXT1cIicwJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZStbaV19fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24ubmFtZStbaV1cIiBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3txdWVzdGlvbi52YWx1ZX19XCIgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3txdWVzdGlvbi5yZXN0cmljdGlvbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIiBhdHRyLmRhdGEtbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLW51bWVyaWNwYWlyPVwie3txdWVzdGlvbi5udW1lcmljUGFpcn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIiBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cInVwZGF0ZUtleVZhbERpY3Qoe2tleTogcXVlc3Rpb24ubmFtZSwgdmFsdWU6IHF1ZXN0aW9uLnZhbHVlfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicXVlc3Rpb24uaXNSZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8uaW52YWxpZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGU9PSdjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbj8uaXNDdXN0b20gIT0gdW5kZWZpbmVkICYmIHF1ZXN0aW9uPy5pc0N1c3RvbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIlwiIGlkPVwie3txdWVzdGlvbi5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWUrW2ldfX1cIiBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1yZXN0cmljdGlvbj1cInt7cXVlc3Rpb24ucmVzdHJpY3Rpb259fVwiIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCIgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiBjdXJyZW5jeU1hc2tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLm5hbWUrW2ldXCIgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInF1ZXN0aW9uLmlzUmVhZG9ubHlcIiAoZm9jdXMpPVwiT25Gb2N1c0N1cnIoJGV2ZW50LCBxdWVzdGlvbi52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIlZhbGlkYXRlRGVmYXVsdFZhbHVlKHF1ZXN0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cInVwZGF0ZUtleVZhbERpY3Qoe2tleTogcXVlc3Rpb24ubmFtZSwgdmFsdWU6IHF1ZXN0aW9uLnZhbHVlfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInsgdGhvdXNhbmRzOiBxdWVzdGlvbi50aG91c2FuZHMsIGRlY2ltYWw6IHF1ZXN0aW9uLmRlY2ltYWwsIGFsaWduOiBxdWVzdGlvbi5hbGlnbiwgYWxsb3dOZWdhdGl2ZTogcXVlc3Rpb24uYWxsb3dOZWdhdGl2ZSwgYWxsb3daZXJvOiBxdWVzdGlvbi5hbGxvd1plcm8sIHByZWNpc2lvbjogcXVlc3Rpb24ucHJlY2lzaW9uLCBudWxsYWJsZTogcXVlc3Rpb24ubnVsbGFibGUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbj8uaXNDdXN0b20gPT0gdW5kZWZpbmVkIHx8ICFxdWVzdGlvbj8uaXNDdXN0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ7e3F1ZXN0aW9uLmlkfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZStbaV19fVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3txdWVzdGlvbi5yZXN0cmljdGlvbn19XCIgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiIGN1cnJlbmN5TWFza1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24ubmFtZStbaV1cIiBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwiT25Gb2N1c0N1cnIoJGV2ZW50LCBxdWVzdGlvbi52YWx1ZSlcIiAoYmx1cik9XCJWYWxpZGF0ZURlZmF1bHRWYWx1ZShxdWVzdGlvbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJ1cGRhdGVLZXlWYWxEaWN0KHtrZXk6IHF1ZXN0aW9uLm5hbWUsIHZhbHVlOiBxdWVzdGlvbi52YWx1ZX0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ7IHRob3VzYW5kczogJywnLCBkZWNpbWFsOiAnLicsIGFsaWduOiAncmlnaHQnLCBhbGxvd05lZ2F0aXZlOiBmYWxzZSwgYWxsb3daZXJvOnRydWUsIHByZWNpc2lvbjogMiwgbnVsbGFibGU6IGZhbHNlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRW5kIEhhcmRjb2RlIExvb2t1cCBkaWRhbGVtLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhdXNlTmV3RGF0ZXBpY2tlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGU9PSdkYXRlcGlja2VyJyAmJiAhcXVlc3Rpb24uaXNUaW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGlkPVwie3txdWVzdGlvbi5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0IGJ0bi1sb29rdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWUrW2ldfX1cIiBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLm5hbWUrW2ldXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIGF0dHIuZGF0YS1yZXF1aXJlZD1cInt7cXVlc3Rpb24uaXNSZXF1aXJlZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInt7cXVlc3Rpb24udmFsdWV9fVwiIFtyZWFkb25seV09XCJxdWVzdGlvbi5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIiBhdHRyLmRhdGEtbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtZGF0ZXBpY2tlcnBhaXI9XCJ7e3F1ZXN0aW9uLmRhdGVwaWNrZXJQYWlyfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1jcml0LWRhdGF0YWJsZT1cInt7cXVlc3Rpb24uaXNDcml0ZXJpYURhdGFUYWJsZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIiBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cInF1ZXN0aW9uLm1pbkRhdGUgfCBkYXRlOid5eXl5LU1NLWRkJ1wiIFttYXhdPVwicXVlc3Rpb24ubWF4RGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwicXVlc3Rpb24ucmVzdHJpY3Rpb24gIT0gdW5kZWZpbmVkICYmIGNoZWNrSW5wdXREYXRlKHF1ZXN0aW9uLGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZStbaV1dPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZStbaV1dPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV0/LmludmFsaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2RhdGVwaWNrZXInICYmIHF1ZXN0aW9uLmlzVGltZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgaWQ9XCJ7e3F1ZXN0aW9uLmlkfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtaW5wdXQgYnRuLWxvb2t1cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInt7cXVlc3Rpb24ubmFtZStbaV19fVwiIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInF1ZXN0aW9uLm5hbWVcIiBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7e3F1ZXN0aW9uLnZhbHVlfX1cIiBbcmVhZG9ubHldPVwicXVlc3Rpb24ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCIgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLWRhdGVwaWNrZXJwYWlyPVwie3txdWVzdGlvbi5kYXRlcGlja2VyUGFpcn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtY3JpdC1kYXRhdGFibGU9XCJ7e3F1ZXN0aW9uLmlzQ3JpdGVyaWFEYXRhVGFibGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3txdWVzdGlvbi5yZXN0cmljdGlvbn19XCIgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwie3txdWVzdGlvbi5taW5EYXRlIHwgZGF0ZToneXl5eS1NTS1kZCd9fVwiIG1heD1cInt7cXVlc3Rpb24ubWF4RGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJxdWVzdGlvbi5yZXN0cmljdGlvbiAhPSB1bmRlZmluZWQgJiYgY2hlY2tJbnB1dERhdGUocXVlc3Rpb24saSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8uaW52YWxpZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ1c2VOZXdEYXRlcGlja2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2RhdGVwaWNrZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItdWNkYXRlcGlja2VyIFtwYXJlbnRGb3JtXT1cImZvcm1cIiBbZW5qaUZvcm1dPVwiZW5qaUZvcm1cIiBbaWRlbnRpZmllcl09XCJxdWVzdGlvbi5uYW1lK2lcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwicXVlc3Rpb24ubWluRGF0ZSB8IGRhdGU6ICd5eXl5LU1NLWRkJ1wiIFttYXhdPVwicXVlc3Rpb24ubWF4RGF0ZSB8IGRhdGU6ICd5eXl5LU1NLWRkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRTdGFydERhdGVdPVwiQmlzRHRcIiBbYXR0cl09XCJxdWVzdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJxdWVzdGlvbi5yZXN0cmljdGlvbiAhPSB1bmRlZmluZWQgJiYgY2hlY2tJbnB1dERhdGUocXVlc3Rpb24saSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItdWNkYXRlcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uLnR5cGUgPT0gJ3Rhc2tEZWZpbml0aW9uS2V5JyB8fCBxdWVzdGlvbi50eXBlID09ICdwcm9jZXNzS2V5JyB8fCBxdWVzdGlvbi50eXBlID09ICdvZmZpY2VSb2xlQ29kZXMnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiIGF0dHIuZGF0YS1yZXF1aXJlZD1cInt7cXVlc3Rpb24uaXNSZXF1aXJlZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzUmVxdWlyZWRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLnF1ZXJ5LWluPVwie3txdWVzdGlvbi5pc1F1ZXJ5SW59fVwiIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiIFtoaWRkZW5dPVwicXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggPT0gMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiKHF1ZXN0aW9uLnR5cGUgPT0gJ3Rhc2tEZWZpbml0aW9uS2V5JyB8fCBxdWVzdGlvbi50eXBlID09ICdwcm9jZXNzS2V5JykgPyBTZXRQcm9jZXNzS2V5KGkscXVlc3Rpb24ud2ZLZXlGaWx0ZXIpIDogU2V0Um9sZU9mZmljZUNvZGVzKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5pbnZhbGlkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cInF1ZXN0aW9uLmRkbFR5cGUgPT0gJ29uZScgJiYgcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggIT0gMVwiIHZhbHVlPVwib25lXCI+U2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgT25lPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihxdWVzdGlvbj8uZGRsVHlwZSA9PSB1bmRlZmluZWQgfHwgcXVlc3Rpb24uZGRsVHlwZSA9PSAnYWxsJykgJiYgcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggIT0gMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBxdWVzdGlvbj8uaXRlbXNVcmxcIiB2YWx1ZT1cInt7aXRlbS5LZXl9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5WYWx1ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCJxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCA9PSAxXCI+e3txdWVzdGlvbi5pdGVtc1VybFswXS5WYWx1ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2Ryb3Bkb3duJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJxdWVzdGlvbi5uYW1lXCIgYXR0ci5xdWVyeS1pbj1cInt7cXVlc3Rpb24uaXNRdWVyeUlufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCIgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7eyBxdWVzdGlvbj8ucmVzdHJpY3Rpb24gPz8gJyd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IChxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCA9PSAxICYmICFxdWVzdGlvbj8ua2VlcERkbCkgOiAocXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggPT0gMSAmJiAhcXVlc3Rpb24/LmtlZXBEZGwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJxdWVzdGlvbi5pc0V2ZW50ID8gb25DaGFuZ2VFdmVudCgkZXZlbnQudGFyZ2V0LnZhbHVlLCBxdWVzdGlvbikgOiB1cGRhdGVLZXlWYWxEaWN0KHtrZXk6IHF1ZXN0aW9uLm5hbWUsIHZhbHVlOiAkZXZlbnQudGFyZ2V0LnZhbHVlfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnICYmICghcXVlc3Rpb24uaXNGcm9tVVJMID8gKHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoICE9IDEgfHwgcXVlc3Rpb24/LmtlZXBEZGwpIDogKHF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoICE9IDEgfHwgcXVlc3Rpb24/LmtlZXBEZGwpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QgT25lPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihxdWVzdGlvbj8uZGRsVHlwZSA9PSB1bmRlZmluZWQgfHwgcXVlc3Rpb24uZGRsVHlwZSA9PSAnYWxsJykgJiYgKCFxdWVzdGlvbi5pc0Zyb21VUkwgPyAocXVlc3Rpb24/Lml0ZW1zPy5sZW5ndGggIT0gMSB8fCBxdWVzdGlvbj8ua2VlcERkbCkgOiAocXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggIT0gMSB8fCBxdWVzdGlvbj8ua2VlcERkbCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImFsbFwiPkFsbDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mICFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXMgOiBxdWVzdGlvbj8uaXRlbXNVcmxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3shcXVlc3Rpb24uaXNGcm9tVVJMID8gaXRlbS5rZXkgOiBpdGVtLktleX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3shcXVlc3Rpb24uaXNGcm9tVVJMID8gaXRlbS52YWx1ZSA6IGl0ZW0uVmFsdWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHF1ZXN0aW9uPy5kZGxUeXBlID09IHVuZGVmaW5lZCB8fCBxdWVzdGlvbi5kZGxUeXBlID09ICdhbGwnKSAmJiAoIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IChxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCAhPSAxIHx8IHF1ZXN0aW9uPy5rZWVwRGRsKSA6IChxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCAhPSAxIHx8IHF1ZXN0aW9uPy5rZWVwRGRsKSkgJiYgcXVlc3Rpb24udXNlT3RoZXJzU2VsZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIm90aGVyc1wiPk90aGVyczwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcXVlc3Rpb24uaXNGcm9tVVJMID8gKHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoID09IDEgJiYgIXF1ZXN0aW9uPy5rZWVwRGRsKSA6IChxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCA9PSAxICYmICFxdWVzdGlvbj8ua2VlcERkbClcIj57eyFxdWVzdGlvbi5pc0Zyb21VUkxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBxdWVzdGlvbi5pdGVtc1swXS52YWx1ZSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLml0ZW1zVXJsWzBdLlZhbHVlfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGU9PSdkcm9wZG93blNlYXJjaCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZHMtZGlzcGxheS1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhcXVlc3Rpb24uaXNGcm9tVVJMID8gcXVlc3Rpb24/Lml0ZW1zPy5sZW5ndGggPT0gMSA6IHF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoID09IDFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZGRzLWlucHV0XCIgbmFtZT1cInt7J2Rkc1ZhbHVlJytxdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicXVlc3Rpb24uZGVzY3JcIiByZWFkb25seVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJxdWVzdGlvbi5pc0xpc3RIaWRlID0gIXF1ZXN0aW9uLmlzTGlzdEhpZGU7IHF1ZXN0aW9uLnNlYXJjaFRleHQ9JydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoID09IDEgOiBxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCA9PSAxXCI+e3txdWVzdGlvbi5kZXNjcn19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZHMtbGlzdC1jb250YWluZXJcIiBbaGlkZGVuXT1cInF1ZXN0aW9uLmlzTGlzdEhpZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCIgbmFtZT1cInt7J3NlYXJjaFRleHQnK3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJxdWVzdGlvbi5zZWFyY2hUZXh0XCIgW3BsYWNlaG9sZGVyXT1cInF1ZXN0aW9uLnBsYWNlaG9sZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZHMtaXRlbXMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZ1bGwtd2lkdGhcIiBuYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiBbKG5nTW9kZWwpXT1cInF1ZXN0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgYXR0ci5xdWVyeS1pbj1cInt7cXVlc3Rpb24uaXNRdWVyeUlufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIiBhdHRyLmRhdGEtbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIiBhdHRyLmRhdGEtY3JpdC1kYXRhdGFibGU9XCJ7e3F1ZXN0aW9uLmlzQ3JpdGVyaWFEYXRhVGFibGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInF1ZXN0aW9uLmlzRXZlbnQgPyBvbkNoYW5nZUV2ZW50KCRldmVudC50YXJnZXQudmFsdWUsIHF1ZXN0aW9uKSA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJ7e3F1ZXN0aW9uPy5zaXplID09IHVuZGVmaW5lZCA/IHF1ZXN0aW9uPy5zaXplIDogMTB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAoY2xpY2spPVwic2VsZWN0ZWRPcHRpb24oe0tleTonb25lJyxWYWx1ZTonU2VsZWN0IE9uZSd9LHF1ZXN0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicXVlc3Rpb24uZGRzVHlwZSA9PSAnb25lJyAmJiAoIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoICE9IDEgOiBxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCAhPSAxKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwib25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBPbmU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKGNsaWNrKT1cInNlbGVjdGVkT3B0aW9uKHtLZXk6J2FsbCcsVmFsdWU6J0FsbCd9LHF1ZXN0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHF1ZXN0aW9uPy5kZHNUeXBlID09IHVuZGVmaW5lZCB8fCBxdWVzdGlvbi5kZHNUeXBlID09ICdhbGwnKSAmJiAoIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoICE9IDEgOiBxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCAhPSAxKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiYWxsXCI+QWxsPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxvcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgcXVlc3Rpb24/Lml0ZW1zIHwgdGV4dFNlYXJjaCA6IHF1ZXN0aW9uLnNlYXJjaFRleHQ7IGxldCBpPWluZGV4XCIgW3ZhbHVlXT1cIml0ZW0/LmtleVwiIChjbGljayk9XCJzZWxlY3RlZE9wdGlvbihpdGVtLHF1ZXN0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtPy52YWx1ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiAhcXVlc3Rpb24uaXNGcm9tVVJMID8gKHF1ZXN0aW9uPy5pdGVtcyB8IHRleHRTZWFyY2ggOiBxdWVzdGlvbi5zZWFyY2hUZXh0KSA6IHF1ZXN0aW9uPy5pdGVtc1VybCB8IHRleHRTZWFyY2ggOiBxdWVzdGlvbi5zZWFyY2hUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkT3B0aW9uKGl0ZW0scXVlc3Rpb24pXCIgdmFsdWU9XCJ7e2l0ZW0uS2V5fX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLlZhbHVlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0nY2xhaW0nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJ7eydjbGFpbScrW2ldfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtaW5wdXRcIiBhdHRyLmRhdGEtdHlwZT1cInt7J3RleHQnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtY3JpdC1kYXRhdGFibGU9XCJ7e3F1ZXN0aW9uLmlzQ3JpdGVyaWFEYXRhVGFibGV9fVwiIGF0dHIuZGF0YS1uYW1lPVwie3snQXNzaWduZWUnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIkNsYWltTGlzdD8ubGVuZ3RoID09IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbJ2NsYWltJytbaV1dPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbJ2NsYWltJytbaV1dPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1snY2xhaW0nK1tpXV0/LmludmFsaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwicXVlc3Rpb24uZGRsVHlwZSA9PSAnb25lJyAmJiBDbGFpbUxpc3Q/Lmxlbmd0aCAhPSAxXCIgdmFsdWU9XCJvbmVcIj5TZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBPbmU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHF1ZXN0aW9uPy5kZGxUeXBlID09IHVuZGVmaW5lZCB8fCBxdWVzdGlvbi5kZGxUeXBlID09ICdhbGwnKSAmJiBDbGFpbUxpc3Q/Lmxlbmd0aCAhPSAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImFsbFwiPkFsbDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIENsYWltTGlzdFwiIHZhbHVlPVwie3tpdGVtLktleX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLlZhbHVlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2xvb2t1cCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsaWItY2wtdWNsb29rdXBnZW5lcmljICpuZ0lmPVwic2VhcmNoSW5wdXQuZGljdExvb2t1cE9ialtxdWVzdGlvbi5uYW1lXS5pc1JlYWR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2xvb2t1cElucHV0XT1cInNlYXJjaElucHV0LmRpY3RMb29rdXBPYmpbcXVlc3Rpb24ubmFtZV1cIiBbcGFyZW50Rm9ybV09J2Zvcm0nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbmppRm9ybV09J2VuamlGb3JtJyBbaWRlbnRpZmllcl09XCJxdWVzdGlvbi5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25vdGlmeVVwZGF0ZUtleVZhbERpY3RdPVwibm90aWZ5VXBkYXRlS2V5VmFsRGljdFwiIFtsb29rdXBLZXlWYWxEaWN0XT1cImxvb2t1cEtleVZhbERpY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobG9va3VwKT1cImdldExvb2t1cCgkZXZlbnQsIHF1ZXN0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dHRlZFZhbHVlKT1cImdldElucHV0dGVkVmFsdWUoJGV2ZW50LCBxdWVzdGlvbilcIj48L2xpYi1jbC11Y2xvb2t1cGdlbmVyaWM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlID09PSAndGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGltZVwiIGlkPVwie3txdWVzdGlvbi5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW0lzVXBwZXJDYXNlXT1cInF1ZXN0aW9uLmlzVXBwZXJjYXNlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcXVlc3Rpb24uaXNVcHBlcmNhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiIFtmb3JtQ29udHJvbE5hbWVdPVwicXVlc3Rpb24ubmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1jcml0LWRhdGF0YWJsZT1cInt7cXVlc3Rpb24uaXNDcml0ZXJpYURhdGFUYWJsZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInF1ZXN0aW9uLnBsYWNlaG9sZGVyICE9IHVuZGVmaW5lZCA/IHF1ZXN0aW9uLnBsYWNlaG9sZGVyIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiIHZhbHVlPVwie3txdWVzdGlvbi52YWx1ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIiBhdHRyLmRhdGEtbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3txdWVzdGlvbi5yZXN0cmljdGlvbn19XCIgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJxdWVzdGlvbi5pc1JlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cInVwZGF0ZUtleVZhbERpY3Qoe2tleTogcXVlc3Rpb24ubmFtZSwgdmFsdWU6IHF1ZXN0aW9uLnZhbHVlfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZSA9PT0gJ21vbnRoJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJxdWVzdGlvbi5uYW1lXCIgYXR0ci5xdWVyeS1pbj1cInt7cXVlc3Rpb24uaXNRdWVyeUlufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCIgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInF1ZXN0aW9uLmlzRXZlbnQgPyBvbkNoYW5nZUV2ZW50KCRldmVudC50YXJnZXQudmFsdWUsIHF1ZXN0aW9uKSA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5pbnZhbGlkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cInF1ZXN0aW9uLmRkbFR5cGUgPT0gJ29uZSdcIiB2YWx1ZT1cIm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBPbmU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cInF1ZXN0aW9uPy5kZGxUeXBlID09IHVuZGVmaW5lZCB8fCBxdWVzdGlvbi5kZGxUeXBlID09ICdhbGwnXCIgdmFsdWU9XCJhbGxcIj5BbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG0gb2YgbW9udGhzXCIgW3ZhbHVlXT1cIm0ua2V5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3ttLnZhbHVlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGUgPT09ICd5ZWFyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJxdWVzdGlvbi5uYW1lXCIgYXR0ci5xdWVyeS1pbj1cInt7cXVlc3Rpb24uaXNRdWVyeUlufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCIgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInF1ZXN0aW9uLmlzRXZlbnQgPyBvbkNoYW5nZUV2ZW50KCRldmVudC50YXJnZXQudmFsdWUsIHF1ZXN0aW9uKSA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5pbnZhbGlkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cInF1ZXN0aW9uLmRkbFR5cGUgPT0gJ29uZSdcIiB2YWx1ZT1cIm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBPbmU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cInF1ZXN0aW9uPy5kZGxUeXBlID09IHVuZGVmaW5lZCB8fCBxdWVzdGlvbi5kZGxUeXBlID09ICdhbGwnXCIgdmFsdWU9XCJhbGxcIj5BbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHkgb2YgeWVhcnNcIiBbdmFsdWVdPVwieVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7eX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItdWMtc2hvdy1lcnJvcnMgKm5nSWY9XCJxdWVzdGlvbi50eXBlICE9PSAnZGF0ZXBpY2tlcidcIiBbY29udHJvbF09XCJmb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdWJtaXRdPVwiZW5qaUZvcm0uc3VibWl0dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saWItdWMtc2hvdy1lcnJvcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi11Yy1zaG93LWVycm9ycyAqbmdJZj1cInF1ZXN0aW9uLnR5cGUgPT09ICdkYXRlcGlja2VyJyB8fCBxdWVzdGlvbi50eXBlID09PSAnbnVtZXJpYydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV1cIiBbc3VibWl0XT1cImVuamlGb3JtLnN1Ym1pdHRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGliLXVjLXNob3ctZXJyb3JzPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGZvcm0tZ3JvdXBcIiAqbmdJZj1cIihpc1JlcG9ydCAhPSB1bmRlZmluZWQgJiYgaXNSZXBvcnQpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMTIgbm8tcGFkZGluZyBzZWFyY2gtbGFiZWxcIiB0cmFuc2xhdGU+UmVwb3J0IFR5cGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIG5vLXBhZGRpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJFeHBvcnRUeXBlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCIgYXR0ci5kYXRhLXR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ0V4cG9ydFR5cGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIEV4cG9ydFR5cGVMaXN0XCIgW3ZhbHVlXT1cIml0ZW0ua2V5XCI+e3tpdGVtLnZhbHVlfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBmb3JtLWdyb3VwXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cIihpc1JlcG9ydCAhPSB1bmRlZmluZWQgJiYgaXNSZXBvcnQpICYmIChzaG93UnB0RXhlY1R5cGUgIT0gdW5kZWZpbmVkICYmIHNob3dScHRFeGVjVHlwZSlcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0xMiBuby1wYWRkaW5nIHNlYXJjaC1sYWJlbFwiIHRyYW5zbGF0ZT5FeGVjdXRpb24gVHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbm8tcGFkZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cIlJwdEV4ZWNUeXBlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWlucHV0XCIgYXR0ci5kYXRhLXR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ1JwdEV4ZWNUeXBlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBSZXBvcnRFeGVjVHlwZUxpc3RcIiBbdmFsdWVdPVwiaXRlbS5rZXlcIj57e2l0ZW0udmFsdWV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBuby1wYWRkaW5nXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbnMgcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGNsYXNzPVwiYnRuLWdyb3VwXCIgKm5nSWY9XCJleHBvcnREYXRhID09IHRydWUgJiYgaXNTZWFyY2hcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWlubGluZS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcmFpc2VkIGJ0bi1vdXRsaW5lLTIgbWUtMSBkcm9wZG93bi10b2dnbGVcIiBuZ2JEcm9wZG93blRvZ2dsZVxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZXhwb3J0TGlzdFwiIHRyYW5zbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZ0LWRvd25sb2FkIGJ1dHRvbi1pY29uLXNlYXJjaFwiPjwvaT4mbmJzcDs8c3BhbiBjbGFzcz1cImJ1dHRvbi10ZXh0LXNlYXJjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+RXhwb3J0IEZpbGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJleHBvcnRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBleHBvcnRBc0ZpbGVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrKT1cImV4cG9ydEFzRmlsZShpdGVtLmtleSlcIj57e2l0ZW0udmFsdWV9fTwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVzZXQoKVwiIGNsYXNzPVwiYnRuIGJ0bi1yYWlzZWQgbWUtMSBidG4tbGluay0yXCIgdHJhbnNsYXRlPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8aSBjbGFzcz1cImZhIGZhLXRpbWVzXCI+PC9pPiZuYnNwOyAtLT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5SZXNldDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiKGlzUmVwb3J0ID09IHVuZGVmaW5lZCB8fCAhaXNSZXBvcnQpXCIgdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1yYWlzZWQgYnRuLW91dGxpbmUtMlwiXHJcbiAgICAgICAgICAgICAgICAjVUNTZWFyY2hDbGljayBbZGlzYWJsZWRdPVwiIXNlYXJjaEJ0blJlYWR5XCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaCBidXR0b24taWNvbi1zZWFyY2hcIj48L2k+Jm5ic3A7PHNwYW4gY2xhc3M9XCJidXR0b24tdGV4dC1zZWFyY2hcIlxyXG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+U2VhcmNoPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIoaXNSZXBvcnQgIT0gdW5kZWZpbmVkICYmIGlzUmVwb3J0KVwiIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcmFpc2VkIGJ0bi1vdXRsaW5lLTJcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZnQtZG93bmxvYWQgYnV0dG9uLWljb24tc2VhcmNoXCI+PC9pPiZuYnNwOzxzcGFuIGNsYXNzPVwiYnV0dG9uLXRleHQtc2VhcmNoXCJcclxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPkdlbmVyYXRlXHJcbiAgICAgICAgICAgICAgICAgIFJlcG9ydDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gPC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Zvcm0+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8IS0tIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+IC0tPlxyXG4gIDwhLS0gPC9kaXY+IC0tPlxyXG48L2Rpdj5cclxuPCEtLSAvLyBCYXNpYyBmb3JtIGxheW91dCBzZWN0aW9uIGVuZCAtLT4iXX0=