@eqproject/eqp-dynamic-module 2.3.29 → 2.3.31

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 (23) hide show
  1. package/esm2020/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.mjs +7 -10
  2. package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +7 -6
  3. package/esm2020/lib/components/private/add-form-field/add-form-field.component.mjs +7 -6
  4. package/esm2020/lib/components/private/dynamic-module-field/dynamic-module-field.component.mjs +1 -1
  5. package/esm2020/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +1 -1
  6. package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +14 -13
  7. package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +17 -6
  8. package/esm2020/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +37 -36
  9. package/esm2020/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +7 -6
  10. package/esm2020/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +17 -17
  11. package/esm2020/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.mjs +5 -4
  12. package/esm2020/lib/components/private/form-records/view-form-record/view-form-record.component.mjs +8 -7
  13. package/esm2020/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.mjs +16 -15
  14. package/esm2020/lib/services/global.service.mjs +23 -0
  15. package/esm2020/lib/services/utilityHelper.services.mjs +20 -20
  16. package/fesm2015/eqproject-eqp-dynamic-module.mjs +163 -136
  17. package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
  18. package/fesm2020/eqproject-eqp-dynamic-module.mjs +163 -136
  19. package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
  20. package/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.d.ts +0 -1
  21. package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +2 -1
  22. package/lib/services/global.service.d.ts +10 -0
  23. package/package.json +1 -1
@@ -165,7 +165,7 @@ export class UtilityHelperService {
165
165
  */
166
166
  getFieldSyleClass(field) {
167
167
  if (field.ColSpanSizes && field.ColSpanSizes.length > 0) {
168
- this.debugLog('field', field);
168
+ ////GlobalService.debugLog('field', field)
169
169
  return field.ColSpanSizes.map((size) => ColSpanSizesEnum[size].toString()).join(" ");
170
170
  }
171
171
  return this.getDefaultStyleClass(field);
@@ -179,7 +179,7 @@ export class UtilityHelperService {
179
179
  */
180
180
  getFieldAnswerStyleClass(field) {
181
181
  if (field.AnswerStyle && field.AnswerStyle.ColSpanSizes && field.AnswerStyle.ColSpanSizes.length > 0) {
182
- this.debugLog('field', field);
182
+ ////GlobalService.debugLog('field', field)
183
183
  return field.AnswerStyle.ColSpanSizes.map((size) => ColSpanSizesEnum[size].toString()).join(" ");
184
184
  }
185
185
  return this.getDefaultStyleClass(field);
@@ -187,22 +187,22 @@ export class UtilityHelperService {
187
187
  getDefaultStyleClass(field) {
188
188
  switch (field.FieldType) {
189
189
  case FieldTypeEnum["Campo di testo"]:
190
- this.debugLog('Campo di testo');
190
+ //GlobalService.debugLog('Campo di testo')
191
191
  return "col-sm-12 col-md-4 col-lg-4 align-self-end";
192
192
  case FieldTypeEnum["Area di testo"]:
193
- this.debugLog('Area di testo');
193
+ //GlobalService.debugLog('Area di testo')
194
194
  return "col-sm-12 col-md-12 col-lg-12 align-self-end";
195
195
  case FieldTypeEnum["Booleano"]:
196
- this.debugLog('Booleano');
196
+ //GlobalService.debugLog('Booleano')
197
197
  return "col-sm-12 col-md-4 col-lg-4 align-self-center";
198
198
  case FieldTypeEnum["Data e/o ora"]:
199
- this.debugLog('Data e/o ora');
199
+ //GlobalService.debugLog('Data e/o ora')
200
200
  return "col-sm-12 col-md-4 col-lg-4 align-self-end";
201
201
  case FieldTypeEnum["Campo numerico"]:
202
- this.debugLog('Campo numerico');
202
+ //GlobalService.debugLog('Campo numerico')
203
203
  return "col-sm-12 col-md-4 col-lg-4 align-self-end";
204
204
  case FieldTypeEnum["Allegato"]:
205
- this.debugLog('Allegato');
205
+ //GlobalService.debugLog('Allegato')
206
206
  if (field.IsMultiAttach ||
207
207
  (field.MetadataFields &&
208
208
  field.MetadataFields.length > 0)) {
@@ -212,7 +212,7 @@ export class UtilityHelperService {
212
212
  return "col-sm-12 col-md-4 col-lg-4 align-self-end";
213
213
  }
214
214
  case FieldTypeEnum["Immagine"]:
215
- this.debugLog('Immagine');
215
+ //GlobalService.debugLog('Immagine')
216
216
  if (field.AttachDefinition.IsMultiAttach ||
217
217
  (field.AttachDefinition.MetadataFields &&
218
218
  field.AttachDefinition.MetadataFields.length > 0)) {
@@ -222,13 +222,13 @@ export class UtilityHelperService {
222
222
  return "col-sm-12 col-md-4 col-lg-4 align-self-end";
223
223
  }
224
224
  case FieldTypeEnum["Elenco generico"]:
225
- this.debugLog('Elenco generico');
225
+ //GlobalService.debugLog('Elenco generico')
226
226
  return "col-sm-12 col-md-4 col-lg-4 align-self-end";
227
227
  case FieldTypeEnum["Lookup"]:
228
- this.debugLog('Lookup');
228
+ //GlobalService.debugLog('Lookup')
229
229
  return "col-sm-12 col-md-4 col-lg-4 align-self-end";
230
230
  case FieldTypeEnum["Form di dettaglio"]:
231
- this.debugLog('Form di dettaglio');
231
+ //GlobalService.debugLog('Form di dettaglio')
232
232
  return "col-sm-12 col-md-12 col-lg-12 align-self-end";
233
233
  }
234
234
  }
@@ -241,16 +241,16 @@ export class UtilityHelperService {
241
241
  * @returns Restituisce un FormGroup rappresentate la Form a cui appartengono i BaseField ricevuti in input.
242
242
  */
243
243
  CreateFormFormGroup(formFields, record, onlyView = false, includeCurrentFormInField = true) {
244
- // this.debugLog("formFields", formFields);
245
- // this.debugLog("record", record);
246
- // this.debugLog("onlyView", onlyView);
247
- // this.debugLog("includeCurrentFormInField", includeCurrentFormInField);
244
+ // //GlobalService.debugLog("formFields", formFields);
245
+ // //GlobalService.debugLog("record", record);
246
+ // //GlobalService.debugLog("onlyView", onlyView);
247
+ // //GlobalService.debugLog("includeCurrentFormInField", includeCurrentFormInField);
248
248
  const formForm = this.formBuilder.group([]);
249
249
  formFields.forEach((field) => {
250
- // this.debugLog(field);
250
+ // //GlobalService.debugLog(field);
251
251
  formForm.addControl(field.Name, this.createFieldFormControl(field, record));
252
252
  if (includeCurrentFormInField) {
253
- // this.debugLog(field);
253
+ // //GlobalService.debugLog(field);
254
254
  field.FormFormGroup = formForm;
255
255
  }
256
256
  });
@@ -532,7 +532,7 @@ export class UtilityHelperService {
532
532
  }
533
533
  EqpDynamicModuleDialogService.Error(error.message);
534
534
  throw new Error(error.message);
535
- this.debugLog("RunEndPointCall - subscribe - end");
535
+ //GlobalService.debugLog("RunEndPointCall - subscribe - end");
536
536
  });
537
537
  }
538
538
  }
@@ -545,4 +545,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
545
545
  providedIn: "root",
546
546
  }]
547
547
  }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.HttpClient }, { type: i3.SpinnerService }]; } });
548
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0eUhlbHBlci5zZXJ2aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBR0wsa0JBQWtCLEVBR2xCLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsYUFBYSxHQUNkLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xELE9BQU8sRUFDTCxxQkFBcUIsRUFHckIsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLHVDQUF1QyxDQUFDO0FBSy9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEdBQ1QsTUFBTSxrQ0FBa0MsQ0FBQztBQUcxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7O0FBTXBGLE1BQU0sT0FBTyxvQkFBb0I7SUFJL0IsUUFBUSxDQUFDLE9BQWUsRUFBRSxJQUFVO1FBQ2xDLElBQUcsSUFBSSxDQUFDLFNBQVMsRUFBQztZQUNoQixJQUFHLElBQUksRUFBQztnQkFDTixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTthQUMzQjtpQkFBSTtnQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2FBQ3JCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsWUFDVSxXQUErQixFQUMvQixJQUFnQixFQUNoQixjQUE4QjtRQUY5QixnQkFBVyxH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ckQsQ0FBQyxDQUNGLENBQUM7SUFFTixDQUFDOztBQXZuQmEsNEJBQU8sR0FBWSxJQUFJLE9BQU8sRUFBRSxDQUFDO2tIQURwQyxvQkFBb0I7c0hBQXBCLG9CQUFvQixjQUZuQixNQUFNOzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgVW50eXBlZEZvcm1Db250cm9sLFxyXG4gIFVudHlwZWRGb3JtR3JvdXAsXHJcbiAgVmFsaWRhdG9yRm4sXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtcclxuICBCYXNlRmllbGQsXHJcbiAgQ29sU3BhblNpemVzRW51bSxcclxuICBGaWVsZFR5cGVFbnVtLFxyXG59IGZyb20gXCIuLi9tb2RlbHMvYmFzZUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbnRleHQubW9kZWxcIjtcclxuaW1wb3J0IHtcclxuICBFbmRQb2ludENvbmZpZ3VyYXRpb24sXHJcbiAgRW5kUG9pbnREYXRhLFxyXG4gIEVuZFBvaW50RGF0YVBhcmFtcyxcclxuICBQYXJhbVR5cGVFbnVtLFxyXG4gIFJlcXVlc3RNZXRob2RFbnVtLFxyXG59IGZyb20gXCIuLi9tb2RlbHMvZW5kUG9pbnRDb25maWd1cmF0aW9uLm1vZGVsXCI7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWVsZCB9IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL2F0dGFjaG1lbnRGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBJbWFnZUZpZWxkIH0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvaW1hZ2VGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBMaXN0VmFsdWVGaWVsZCB9IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL2xpc3RWYWx1ZUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IFRleHRhcmVhRmllbGQgfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy90ZXh0YXJlYUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7XHJcbiAgVGV4dE1hc2tFbnVtLFxyXG4gIFRleHRGaWVsZCxcclxuICBVcmxSZWdleCxcclxuICBUZWxSZWdleCxcclxufSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy90ZXh0RmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgRm9ybSB9IGZyb20gXCIuLi9tb2RlbHMvZm9ybS5tb2RlbFwiO1xyXG5pbXBvcnQgeyBSZWNvcmQgfSBmcm9tIFwiLi4vbW9kZWxzL3JlY29yZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBBcnJheVZhbGlkYXRvcnMgfSBmcm9tIFwiLi9jdXN0b20tZm9ybS12YWxpZGF0b3JzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRXFwRHluYW1pY01vZHVsZURpYWxvZ1NlcnZpY2UgfSBmcm9tIFwiLi9lcXAtZHluYW1pYy1tb2R1bGUtZGlhbG9nLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU3Bpbm5lclNlcnZpY2UgfSBmcm9tIFwiLi9zcGlubmVyLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFV0aWxpdHlIZWxwZXJTZXJ2aWNlIHtcclxuICBwdWJsaWMgc3RhdGljIGNvbnRleHQ6IENvbnRleHQgPSBuZXcgQ29udGV4dCgpO1xyXG5cclxuICBkZWJ1Z01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkZWJ1Z0xvZyhtZXNzYWdlOiBzdHJpbmcsIGl0ZW0/OiBhbnkpe1xyXG4gICAgaWYodGhpcy5kZWJ1Z01vZGUpe1xyXG4gICAgICBpZihpdGVtKXtcclxuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlLCBpdGVtKVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgc3Bpbm5lclNlcnZpY2U6IFNwaW5uZXJTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBwdWJsaWMgc3RhdGljIEV2YWx1YXRlRmllbGRGb3JtdWxhKFxyXG4gICAgZm9ybXVsYTogc3RyaW5nLFxyXG4gICAgcmVjOiBSZWNvcmQsXHJcbiAgICBjdHg6IGFueVxyXG4gICk6IGFueSB7XHJcbiAgICBjb25zdCBldmFsdWF0ZWRWYWx1ZSA9IGV2YWwoZm9ybXVsYSk7XHJcbiAgICByZXR1cm4gZXZhbHVhdGVkVmFsdWUgPyBldmFsdWF0ZWRWYWx1ZSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIFNldENvbnRleHQoY3R4OiBDb250ZXh0KSB7XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjdHg7XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1lcmljKG4pIHtcclxuICAgIHJldHVybiAhaXNOYU4obik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGluaXRTdHlsZXMoc3R5bGVjc3MpIHtcclxuICAgIHJldHVybiBzdHlsZWNzcy5zcGxpdChcIjtcIikucmVkdWNlKChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IGtleXBhciA9IGIuc3BsaXQoXCI6XCIpO1xyXG4gICAgICBpZiAoa2V5cGFyLmxlbmd0aCA+IDEpIGFba2V5cGFyWzBdLnRyaW0oKV0gPSBrZXlwYXJbMV0udHJpbSgpO1xyXG4gICAgICByZXR1cm4gYTtcclxuICAgIH0sIHt9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgR2V0RmllbGRUeXBlKGZpZWxkOiBCYXNlRmllbGQpIHtcclxuICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKSB7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIGRpIHRlc3RvXCJdOiB7XHJcbiAgICAgICAgY29uc3QgdDogVGV4dEZpZWxkID0gT2JqZWN0LmFzc2lnbihuZXcgVGV4dEZpZWxkKCksIGZpZWxkKTtcclxuICAgICAgICByZXR1cm4gdDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgaW1wb3N0YXJlIGkgdmFsb3JpIGRhIHN1Z2dlcmlyZSBuZWxsJ2F1dG9jb21wbGV0ZSBwZXIgaSBjYW1waSBpbiBjdWkgbCd1dGVudGUgZGV2ZSBzY3JpdmVyZSBjb21hbmRpIGphdmFzY3JpcHQuXHJcbiAgICogSW4gYmFzZSBhbGwndWx0aW1vIGNhcmF0dGVyZSBkaWdpdGF0byB2aWVuZSBpbXBvc3RhdG8gdW4gZWxlbmNvIGRpIG9nZ2V0dGkgbyBwcm9wcmlldMOgIGNoZSBsJ3V0ZW50ZSBoYSBhIGRpc3Bvc2l6aW9uZSBpbiBxdWVsIG1vbWVudG8uXHJcbiAgICogQHBhcmFtIGZpZWxkcyBBcnJheSBkaSBCYXNlRmllbGQgYWdnaXVudGkgYWxsYSBGb3JtXHJcbiAgICogQHBhcmFtIHR5cGVkRm9ybXVsYSBTdHJpbmdhIGRpZ2l0YXRhIGRhbGwndXRlbnRlXHJcbiAgICogQHN1bW1hcnkgSWwgbWV0b2RvIGltcG9zdGEgaSBzdWdnZXJpbWVudGkgYmFzYW5kb3NpIHN1IDMgY2FzaTpcclxuICAgKiAgMSkgbCd1dGVudGUgbm9uIGhhIGRpZ2l0YXRvIG51bGxhIG8gbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBmaW5pc2NlIGNvbiB1bm8gc3BhemlvIHZ1b3RvXHJcbiAgICogIDIpIGxhIHN0cmluZ2EgZGlnaXRhdGEgZGFsbCd1dGVudGUgZmluaXNjZSBjb24gdW4gXCIuXCJcclxuICAgKiAgMykgbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBub24gY29pbmNpZGUgY29uIG5lc3N1biBhbHRybyBjYXNvIHNvcHJhIChmaW5pc2NlIGNvbiB1biBjYXJhdHRlcmUgcXVhbHVucXVlKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgR2V0QXV0b2NvbXBsZXRlT3B0aW9ucyhcclxuICAgIGZpZWxkczogQXJyYXk8QmFzZUZpZWxkPixcclxuICAgIHR5cGVkRm9ybXVsYTogc3RyaW5nXHJcbiAgKTogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+IHtcclxuICAgIGxldCBhdXRvY29tcGxldGVPcHRpb25zOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4gPSBbXTtcclxuXHJcbiAgICAvLyBSZWN1cGVybyBpIG5vbWkgZGkgdHV0dGkgaSBjYW1waSBjcmVhdGkgZmlubyBhZCBvcmEgbmVsbGEgZm9ybS5cclxuICAgIGNvbnN0IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBmaWVsZHMubWFwKChmKSA9PlxyXG4gICAgICBmLkxhYmVsLnNwbGl0KFwiIFwiKS5qb2luKFwiX1wiKVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBOZWwgY2FzaSBpbiBjdWkgbCd1dGVudGUgbm9uIGhhIGluc2VyaXRvIG51bGxhIG9wcHVyZSBsYSBzdHJpbmdhIGZpbmlzY2UgY29uIHVubyBzcGF6aW8gdnVvdG8gbyB1biBzaW1ib2xvIGRpdmVyc28gZGEgXCIuXCJcclxuICAgIC8vICh1biBjYXJhdHRlcmUgbm9uIGFsZmFudW1lcmljbykgaW1wb3N0byBjb21lIHN1Z2dlcmltZW50aSBzb2xvIFwicmVjXCIgZSBcImN0eFwiLCBvdnZlcm8gZ2xpIHVuaWNpIGR1ZSBvZ2dldHRpIGEgY3VpIGwndXRlbnRlIGhhIGFjY2Vzc28uXHJcbiAgICBpZiAoXHJcbiAgICAgICF0eXBlZEZvcm11bGEgfHxcclxuICAgICAgKCF0eXBlZEZvcm11bGEuZW5kc1dpdGgoXCIuXCIpICYmXHJcbiAgICAgICAgbmV3IFJlZ0V4cChcIlteMC05YS16QS1aX11cIikudGVzdChcclxuICAgICAgICAgIHR5cGVkRm9ybXVsYS5zdWJzdHJpbmcodHlwZWRGb3JtdWxhLmxlbmd0aCAtIDEsIHR5cGVkRm9ybXVsYS5sZW5ndGgpXHJcbiAgICAgICAgKSlcclxuICAgICkge1xyXG4gICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gW1xyXG4gICAgICAgIHsgbGFiZWw6IFwicmVjXCIsIHZhbHVlOiAodHlwZWRGb3JtdWxhID8gdHlwZWRGb3JtdWxhIDogXCJcIikgKyBcInJlY1wiIH0sXHJcbiAgICAgICAgeyBsYWJlbDogXCJjdHhcIiwgdmFsdWU6ICh0eXBlZEZvcm11bGEgPyB0eXBlZEZvcm11bGEgOiBcIlwiKSArIFwiY3R4XCIgfSxcclxuICAgICAgXTtcclxuICAgIH1cclxuICAgIC8vIFNlIGxhIHN0cmluZ2EgZmluaXNjZSBjb24gdW4gXCIuXCIgdnVvbCBkaXJlIGNoZSBsJ3V0ZW50ZSBzdGEgY2VyY2FuZG8gZGkgYWNjZWRlcmUgYWQgdW5hIHByb3ByaWV0w6AgZGkgdW4gb2dnZXR0b1xyXG4gICAgLy8gYSBzdWEgZGlzcG9zaXppb25lLiBSZWN1cGVybyBpbCBub21lIGRlbGwndWx0aW1vIG9nZ2V0dG8gZGlnaXRhdG8gZGFsbCd1dGVudGUgZSBzZSBsJ29nZ2V0dG8gc2NlbHRvIMOoIFwicmVjXCIgbyBcImN0eFwiXHJcbiAgICAvLyBhbGxvcmEgc3VnZ2VyaXNjbyBsZSBwcm9wcmlldMOgIGNoZSBlc2lzdG9ubyBhbGwnaW50ZXJubyBkaSBxdWVzdGkgb2dnZXR0aSBhbHRyaW1lbnRpIG5vbiBtb3N0cm8gbnVsbGEuXHJcbiAgICBlbHNlIGlmICh0eXBlZEZvcm11bGEuZW5kc1dpdGgoXCIuXCIpKSB7XHJcbiAgICAgIGNvbnN0IGZvcm11bGFQaWVjZXM6IEFycmF5PHN0cmluZz4gPSB0eXBlZEZvcm11bGFcclxuICAgICAgICAuc3BsaXQoXCIgXCIpXHJcbiAgICAgICAgW3R5cGVkRm9ybXVsYS5zcGxpdChcIiBcIikubGVuZ3RoIC0gMV0uc3BsaXQoXCIuXCIpO1xyXG4gICAgICBpZiAoZm9ybXVsYVBpZWNlc1tmb3JtdWxhUGllY2VzLmxlbmd0aCAtIDJdID09PSBcInJlY1wiKSB7XHJcbiAgICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXMubWFwKChmKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4geyBsYWJlbDogZiwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIGYgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmIChmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gMl0gPT09IFwiY3R4XCIpIHtcclxuICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gT2JqZWN0LmtleXMoVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dCkubWFwKFxyXG4gICAgICAgICAgKGYpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6IGYsIHZhbHVlOiB0eXBlZEZvcm11bGEgKyBmIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICBmb3JtdWxhUGllY2VzLmxlbmd0aCA+IDIgJiZcclxuICAgICAgICBmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gM10gPT09IFwiY3R4XCIgJiZcclxuICAgICAgICBmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gMl0gPT09IFwiVXNlclwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBPYmplY3Qua2V5cyhcclxuICAgICAgICAgIFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmNvbnRleHQuVXNlclxyXG4gICAgICAgICkubWFwKChmKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4geyBsYWJlbDogZiwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIGYgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEluIHR1dHRpIGdsaSBhbHRyaSBjYXNpLCBvdnZlcm8gcXVhbmRvIGxhIHN0cmluZ2EgZGlnaXRhdGEgZmluaXNjZSBjb24gdW4gY2FyYXR0ZXJlIGRpdmVyc28gZGEgcXVlbGxpXHJcbiAgICAvLyBjb250cm9sbGF0aSBmaW5vcmEsIHZ1b2wgZGlyZSBjaGUgbCd1dGVudGUgc3RhIGRpZ2l0YW50byBpbCBub21lIGRpIHVuIG9nZ2V0dG8sIHVuYSBwcm9wcmlldMOgIG8gdW5hXHJcbiAgICAvLyBmdW56aW9uZSBqYXZhc2NyaXB0LiBDb250cm9sbG8gbGEgcGFyb2xhIGNoZSBsJ3V0ZW50ZSBzdGEgZGlnaXRhbmRvIGUgc2UgZmEgcGFydGUgZGkgdW5vIGRlZ2xpIG9nZ2V0dGkgYSBkaXNwb3NpemlvbmVcclxuICAgIC8vIG8gdW5hIHByb3ByaWV0w6AgZGkgZXNzaSBhbGxvcmEgc3VnZ2VyaXNjbyBpIHBvc3NpYmlsaSBtYXRjaC5cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zdCBhdmFpbGFibGVPcHRpb25zOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4gPSBbXTtcclxuXHJcbiAgICAgIC8vIFByZW5kbyB0dXR0aSBpIGJsb2NjaGkgZGkgY2FyYXR0ZXJpIGRpZ2l0YXRpIGRhbGwndXRlbnRlXHJcbiAgICAgIGNvbnN0IGFsbEZvcm11bGFXb3JkczogQXJyYXk8c3RyaW5nPiA9IHR5cGVkRm9ybXVsYS5zcGxpdChcIiBcIik7XHJcbiAgICAgIC8vIFByZW5kbyBsJ3VsdGltbyBibG9jY28gZGkgY2FyYXR0ZXJpIGRpZ2l0YXRvIGRhbGwndXRlbnRlXHJcbiAgICAgIGNvbnN0IGxhc3RUeXBlZFN0cmluZzogc3RyaW5nID1cclxuICAgICAgICBhbGxGb3JtdWxhV29yZHNbYWxsRm9ybXVsYVdvcmRzLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgLy8gU2UgbGEgbCd1bHRpbWEgc3RyaW5nYSBkaWdpdGF0YSBub24gY29udGllbmUgY2FyYXR0ZXJpIHNwZWNpYWxpIGFsbG9yYSBzcGxpdHRvIGxhIHN0cmluZ2FcclxuICAgICAgLy8gc3VpIFwiLlwiIGUgaW1wb3N0byBpIHN1Z2dlcmltZW50aSBpbiBiYXNlIGFsIHBhdGggZGVsbGEgcHJvcnBpZXTDoCBjaGUgc2kgc3RhIGRpZ2l0YW5kby5cclxuICAgICAgaWYgKCFuZXcgUmVnRXhwKFwiW14wLTlhLXpBLVpfLl1cIikudGVzdChsYXN0VHlwZWRTdHJpbmcpKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoID0gbGFzdFR5cGVkU3RyaW5nLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBjb25zdCBsYXN0VHlwZWRXb3JrID0gcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgbGV0IHByb3BlcnRpZXNUb0NoZWNrOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgICAgIGlmIChwcm9wZXJ0eVBhdGgubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gW1wicmVjXCIsIFwiY3R4XCJdO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICBwcm9wZXJ0eVBhdGgubGVuZ3RoID4gMSAmJlxyXG4gICAgICAgICAgcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAyXSA9PT0gXCJjdHhcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcHJvcGVydGllc1RvQ2hlY2sgPSBPYmplY3Qua2V5cyhVdGlsaXR5SGVscGVyU2VydmljZS5jb250ZXh0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgcHJvcGVydHlQYXRoLmxlbmd0aCA+IDIgJiZcclxuICAgICAgICAgIHByb3BlcnR5UGF0aFtwcm9wZXJ0eVBhdGgubGVuZ3RoIC0gM10gPT09IFwiY3R4XCIgJiZcclxuICAgICAgICAgIHByb3BlcnR5UGF0aFtwcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMl0gPT09IFwiVXNlclwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjayA9IE9iamVjdC5rZXlzKFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmNvbnRleHQuVXNlcik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgIHByb3BlcnR5UGF0aC5sZW5ndGggPiAxICYmXHJcbiAgICAgICAgICBwcm9wZXJ0eVBhdGhbcHJvcGVydHlQYXRoLmxlbmd0aCAtIDJdID09PSBcInJlY1wiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjayA9IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFc2VndW8gaWwgY29udHJvbGxvIHN1bGxlIHByb3ByaWV0w6AgcmVjdXBlcmF0ZSwgYWdnaXVuZ28gYWkgc3VnZ2VyaW1lbnRpIHR1dHRpIGkgbm9taSBjaGUgaW5pemlhbm8gY29uXHJcbiAgICAgICAgLy8gcXVlbGxvIGNoZSBzdGEgZGlnaXRhbmRvIGwndXRlbnRlLlxyXG4gICAgICAgIHByb3BlcnRpZXNUb0NoZWNrLmZvckVhY2goKHByb3ApID0+IHtcclxuICAgICAgICAgIGlmIChwcm9wLnN0YXJ0c1dpdGgobGFzdFR5cGVkV29yaykpIHtcclxuICAgICAgICAgICAgYXZhaWxhYmxlT3B0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgICBsYWJlbDogcHJvcCxcclxuICAgICAgICAgICAgICB2YWx1ZTpcclxuICAgICAgICAgICAgICAgIHR5cGVkRm9ybXVsYSArXHJcbiAgICAgICAgICAgICAgICBwcm9wLnN1YnN0cmluZyhsYXN0VHlwZWRXb3JrLmxlbmd0aCwgcHJvcC5sZW5ndGgpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IGF2YWlsYWJsZU9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGF1dG9jb21wbGV0ZU9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gaW52b2NhdG8gZGFsbCdodG1sIHBlciBpbXBvc3RhcmUgbGUgY2xhc3NpIGNzcyBwZXIgdmlzdWFsaXp6YXJlIGlsIGNhbXBvIGFsbCdpbnRlcm5vIGRlbGxhIGZvcm0uXHJcbiAgICogU2UgcGVyIGlsIGZpZWxkIHNvbm8gc3RhdGUgc3BlY2lmaWNhdGUgZGVsbGUgY2xhc3NpIGFsbG9yYSB2ZW5nb25vIGFwcGxjYXRlIHF1ZWxsZSwgYWx0cmltZW50aSB2ZW5nb25vIHVzYXRlXHJcbiAgICogZGVsbGUgY2xhc3NpIGRpIGRlZmF1bHQuXHJcbiAgICogQHBhcmFtIGZpZWxkIEJhc2VGaWVsZCBkYSB2aXN1YWxpenphcmUuXHJcbiAgICogQHJldHVybnMgUmVzdGl0dWlzY2UgdW5hIHN0cmluZ2EgY29udGVuZW50ZSBsZSBjbGFzc2kgY3NzIGRhIGFwcGxpY2FyZS5cclxuICAgKi9cclxuICBnZXRGaWVsZFN5bGVDbGFzcyhmaWVsZDogQmFzZUZpZWxkKTogc3RyaW5nIHtcclxuICAgICAgICBcclxuICAgIGlmIChmaWVsZC5Db2xTcGFuU2l6ZXMgJiYgZmllbGQuQ29sU3BhblNpemVzLmxlbmd0aCA+IDApe1xyXG4gICAgICB0aGlzLmRlYnVnTG9nKCdmaWVsZCcsIGZpZWxkKVxyXG5cclxuICAgICAgcmV0dXJuIGZpZWxkLkNvbFNwYW5TaXplcy5tYXAoKHNpemUpID0+XHJcbiAgICAgICAgQ29sU3BhblNpemVzRW51bVtzaXplXS50b1N0cmluZygpXHJcbiAgICAgICkuam9pbihcIiBcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFN0eWxlQ2xhc3MoZmllbGQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGludm9jYXRvIGRhbGwnaHRtbCBwZXIgaW1wb3N0YXJlIGxlIGNsYXNzaSBjc3MgcGVyIHZpc3VhbGl6emFyZSBpbCBjYW1wbyBhbGwnaW50ZXJubyBkZWxsYSBmb3JtLlxyXG4gICAqIFNlIHBlciBpbCBmaWVsZCBzb25vIHN0YXRlIHNwZWNpZmljYXRlIGRlbGxlIGNsYXNzaSBhbGxvcmEgdmVuZ29ubyBhcHBsY2F0ZSBxdWVsbGUsIGFsdHJpbWVudGkgdmVuZ29ubyB1c2F0ZVxyXG4gICAqIGRlbGxlIGNsYXNzaSBkaSBkZWZhdWx0LlxyXG4gICAqIEBwYXJhbSBmaWVsZCBCYXNlRmllbGQgZGEgdmlzdWFsaXp6YXJlLlxyXG4gICAqIEByZXR1cm5zIFJlc3RpdHVpc2NlIHVuYSBzdHJpbmdhIGNvbnRlbmVudGUgbGUgY2xhc3NpIGNzcyBkYSBhcHBsaWNhcmUuXHJcbiAgICovXHJcbiAgZ2V0RmllbGRBbnN3ZXJTdHlsZUNsYXNzKGZpZWxkOiBCYXNlRmllbGQpOiBzdHJpbmcge1xyXG4gICAgICAgIFxyXG4gICAgaWYgKGZpZWxkLkFuc3dlclN0eWxlICYmIGZpZWxkLkFuc3dlclN0eWxlLkNvbFNwYW5TaXplcyAmJiBmaWVsZC5BbnN3ZXJTdHlsZS5Db2xTcGFuU2l6ZXMubGVuZ3RoID4gMCl7XHJcbiAgICAgIHRoaXMuZGVidWdMb2coJ2ZpZWxkJywgZmllbGQpXHJcblxyXG4gICAgICByZXR1cm4gZmllbGQuQW5zd2VyU3R5bGUuQ29sU3BhblNpemVzLm1hcCgoc2l6ZSkgPT5cclxuICAgICAgICBDb2xTcGFuU2l6ZXNFbnVtW3NpemVdLnRvU3RyaW5nKClcclxuICAgICAgKS5qb2luKFwiIFwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0U3R5bGVDbGFzcyhmaWVsZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERlZmF1bHRTdHlsZUNsYXNzKGZpZWxkOiBCYXNlRmllbGQpOiBzdHJpbmd7XHJcbiAgICBcclxuICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKSB7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIGRpIHRlc3RvXCJdOlxyXG4gICAgICAgIHRoaXMuZGVidWdMb2coJ0NhbXBvIGRpIHRlc3RvJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgYWxpZ24tc2VsZi1lbmRcIjtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQXJlYSBkaSB0ZXN0b1wiXTpcclxuICAgICAgICB0aGlzLmRlYnVnTG9nKCdBcmVhIGRpIHRlc3RvJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMiBhbGlnbi1zZWxmLWVuZFwiO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJCb29sZWFub1wiXTpcclxuICAgICAgICB0aGlzLmRlYnVnTG9nKCdCb29sZWFubycpXHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IGFsaWduLXNlbGYtY2VudGVyXCI7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkRhdGEgZS9vIG9yYVwiXTpcclxuICAgICAgICB0aGlzLmRlYnVnTG9nKCdEYXRhIGUvbyBvcmEnKVxyXG4gICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNCBhbGlnbi1zZWxmLWVuZFwiO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJDYW1wbyBudW1lcmljb1wiXTpcclxuICAgICAgICB0aGlzLmRlYnVnTG9nKCdDYW1wbyBudW1lcmljbycpXHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IGFsaWduLXNlbGYtZW5kXCI7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkFsbGVnYXRvXCJdOlxyXG4gICAgICAgIHRoaXMuZGVidWdMb2coJ0FsbGVnYXRvJylcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAoZmllbGQgYXMgQXR0YWNobWVudEZpZWxkKS5Jc011bHRpQXR0YWNoIHx8XHJcbiAgICAgICAgICAoKGZpZWxkIGFzIEF0dGFjaG1lbnRGaWVsZCkuTWV0YWRhdGFGaWVsZHMgJiZcclxuICAgICAgICAgICAgKGZpZWxkIGFzIEF0dGFjaG1lbnRGaWVsZCkuTWV0YWRhdGFGaWVsZHMubGVuZ3RoID4gMClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTEyIGFsaWduLXNlbGYtZW5kXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNCBhbGlnbi1zZWxmLWVuZFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiSW1tYWdpbmVcIl06XHJcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZygnSW1tYWdpbmUnKVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIChmaWVsZCBhcyBJbWFnZUZpZWxkKS5BdHRhY2hEZWZpbml0aW9uLklzTXVsdGlBdHRhY2ggfHxcclxuICAgICAgICAgICgoZmllbGQgYXMgSW1hZ2VGaWVsZCkuQXR0YWNoRGVmaW5pdGlvbi5NZXRhZGF0YUZpZWxkcyAmJlxyXG4gICAgICAgICAgICAoZmllbGQgYXMgSW1hZ2VGaWVsZCkuQXR0YWNoRGVmaW5pdGlvbi5NZXRhZGF0YUZpZWxkcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTIgYWxpZ24tc2VsZi1lbmRcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IGFsaWduLXNlbGYtZW5kXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJFbGVuY28gZ2VuZXJpY29cIl06XHJcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZygnRWxlbmNvIGdlbmVyaWNvJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgYWxpZ24tc2VsZi1lbmRcIjtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiTG9va3VwXCJdOlxyXG4gICAgICAgIHRoaXMuZGVidWdMb2coJ0xvb2t1cCcpXHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IGFsaWduLXNlbGYtZW5kXCI7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkZvcm0gZGkgZGV0dGFnbGlvXCJdOlxyXG4gICAgICAgIHRoaXMuZGVidWdMb2coJ0Zvcm0gZGkgZGV0dGFnbGlvJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMiBhbGlnbi1zZWxmLWVuZFwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgaWwgRm9ybUdyb3VwIGNoZSByYXBwcmVzZW50YSB1bmEgRm9ybSBhIHBhcnRpcmUgZGFpIHN1b2kgQmFzZUZpZWxkLlxyXG4gICAqIEBwYXJhbSBmb3JtRmllbGRzIExpc3RhIGRlaSBCYXNlRmllbGQgY2hlIGNvbXBvbmdvbm8gbGEgZm9ybS5cclxuICAgKiBAcGFyYW0gcmVjb3JkIE9nZ2V0dG8gZGkgdGlwbyBSZWNvcmQgY2hlIGNvbnRpZW5lIGkgdmFsb3JpIGRlaSBjYW1waS5cclxuICAgKiBAcGFyYW0gb25seVZpZXcgU2UgVFJVRSBkaXNhYmlsaXRhIGxhIGZvcm0gcGVyIHJlbmRlcmxhIGluIHNvbGEgbGV0dHVyYS5cclxuICAgKiBAcGFyYW0gaW5jbHVkZUN1cnJlbnRGb3JtSW5GaWVsZCBTZSBUUlVFIHBvcG9sYSBsYSBwcm9wcmlldMOgIEZvcm1Gb3JtR3JvdXAgYWxsJ2ludGVybm8gZGkgb2duaSBCYXNlRmllbGQgY29uIGlsIEZvcm1Hcm91cCBjb3JyZW50ZS5cclxuICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1biBGb3JtR3JvdXAgcmFwcHJlc2VudGF0ZSBsYSBGb3JtIGEgY3VpIGFwcGFydGVuZ29ubyBpIEJhc2VGaWVsZCByaWNldnV0aSBpbiBpbnB1dC5cclxuICAgKi9cclxuICBwdWJsaWMgQ3JlYXRlRm9ybUZvcm1Hcm91cChcclxuICAgIGZvcm1GaWVsZHM6IEFycmF5PEJhc2VGaWVsZD4sXHJcbiAgICByZWNvcmQ6IFJlY29yZCxcclxuICAgIG9ubHlWaWV3ID0gZmFsc2UsXHJcbiAgICBpbmNsdWRlQ3VycmVudEZvcm1JbkZpZWxkID0gdHJ1ZVxyXG4gICk6IFVudHlwZWRGb3JtR3JvdXAge1xyXG4gICAgLy8gdGhpcy5kZWJ1Z0xvZyhcImZvcm1GaWVsZHNcIiwgZm9ybUZpZWxkcyk7XHJcbiAgICAvLyB0aGlzLmRlYnVnTG9nKFwicmVjb3JkXCIsIHJlY29yZCk7XHJcbiAgICAvLyB0aGlzLmRlYnVnTG9nKFwib25seVZpZXdcIiwgb25seVZpZXcpO1xyXG4gICAgLy8gdGhpcy5kZWJ1Z0xvZyhcImluY2x1ZGVDdXJyZW50Rm9ybUluRmllbGRcIiwgaW5jbHVkZUN1cnJlbnRGb3JtSW5GaWVsZCk7XHJcblxyXG4gICAgY29uc3QgZm9ybUZvcm06IFVudHlwZWRGb3JtR3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKFtdKTtcclxuXHJcbiAgICBmb3JtRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAvLyAgIHRoaXMuZGVidWdMb2coZmllbGQpO1xyXG4gICAgICBmb3JtRm9ybS5hZGRDb250cm9sKFxyXG4gICAgICAgIGZpZWxkLk5hbWUsXHJcbiAgICAgICAgdGhpcy5jcmVhdGVGaWVsZEZvcm1Db250cm9sKGZpZWxkLCByZWNvcmQpXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChpbmNsdWRlQ3VycmVudEZvcm1JbkZpZWxkKSB7XHJcbiAgICAgICAgLy8gdGhpcy5kZWJ1Z0xvZyhmaWVsZCk7XHJcbiAgICAgICAgICBcclxuICAgICAgICBmaWVsZC5Gb3JtRm9ybUdyb3VwID0gZm9ybUZvcm07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKG9ubHlWaWV3KSB7XHJcbiAgICAgIGZvcm1Gb3JtLmRpc2FibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ybUZvcm07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdW56aW9uZSBwZXIgY3JlYXJlIGUgYWdnaXVuZ2VyZSBhbCBGb3JtR3JvdXAgcmFwcHJlc2VudGFudGUgbGEgZm9ybSB1biBudW92byBGb3JtQ29udHJvbCBhIHBhcnRpcmUgZGEgdW4gRmllbGQuXHJcbiAgICogSW4gbnVvdm8gRm9ybUNvbnRyb2wgYXZyw6AgaWwgbm9tZSBkZWwgY2FtcG8gcGFzc2F0byBlIHZlcnJhbm5vIGltcG9zdGF0aSBpIFZhbGlkYXRvcnMgaW4gYmFzZSBhbCB0aXBvIGRlbCBjYW1wbyBzdGVzc28uXHJcbiAgICogQHBhcmFtIGZpZWxkIEJhc2VGaWVsZCBwZXIgY3VpIGNyZWFyZSBpbCBGb3JtQ29udHJvbCBkYSBpbnNlcmlyZSBuZWwgRm9ybUdyb3VwIGRlbGEgZm9ybS5cclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZUZpZWxkRm9ybUNvbnRyb2woXHJcbiAgICBmaWVsZDogQmFzZUZpZWxkLFxyXG4gICAgcmVjb3JkOiBSZWNvcmRcclxuICApOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgY29uc3QgdmFsaWRhdG9yczogQXJyYXk8VmFsaWRhdG9yRm4+ID0gW107XHJcblxyXG4gICAgaWYgKGZpZWxkLlJlcXVpcmVkKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblxyXG4gICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpIHtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQ2FtcG8gZGkgdGVzdG9cIl06XHJcbiAgICAgICAgaWYgKChmaWVsZCBhcyBUZXh0RmllbGQpLk1heExlbmdodCkge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKChmaWVsZCBhcyBUZXh0RmllbGQpLk1heExlbmdodCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKGZpZWxkIGFzIFRleHRGaWVsZCkuTWluTGVuZ2h0KSB7XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoKGZpZWxkIGFzIFRleHRGaWVsZCkuTWluTGVuZ2h0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAoKGZpZWxkIGFzIFRleHRGaWVsZCkuVGV4dE1hc2spIHtcclxuICAgICAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLlVybDpcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihVcmxSZWdleCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLkVtYWlsOlxyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBUZXh0TWFza0VudW0uVGVsZWZvbm86XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oVGVsUmVnZXgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJBcmVhIGRpIHRlc3RvXCJdOlxyXG4gICAgICAgIGlmICgoZmllbGQgYXMgVGV4dGFyZWFGaWVsZCkuTWF4TGVuZ2h0KSB7XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goXHJcbiAgICAgICAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKChmaWVsZCBhcyBUZXh0YXJlYUZpZWxkKS5NYXhMZW5naHQpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKGZpZWxkIGFzIFRleHRhcmVhRmllbGQpLk1pbkxlbmdodCkge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFxyXG4gICAgICAgICAgICBWYWxpZGF0b3JzLm1pbkxlbmd0aCgoZmllbGQgYXMgVGV4dGFyZWFGaWVsZCkuTWluTGVuZ2h0KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bS5BbGxlZ2F0bzpcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtLkltbWFnaW5lOlxyXG4gICAgICAgIGlmIChmaWVsZC5SZXF1aXJlZCkgdmFsaWRhdG9ycy5wdXNoKEFycmF5VmFsaWRhdG9ycy5taW5MZW5naHQoMSkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJFbGVuY28gZ2VuZXJpY29cIl06XHJcbiAgICAgICAgaWYgKChmaWVsZCBhcyBMaXN0VmFsdWVGaWVsZCkuSXNNdWx0aUNob2ljaGUpXHJcbiAgICAgICAgICBpZiAoZmllbGQuUmVxdWlyZWQpIHZhbGlkYXRvcnMucHVzaChBcnJheVZhbGlkYXRvcnMubWluTGVuZ2h0KDEpKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFVudHlwZWRGb3JtQ29udHJvbChyZWNvcmRbZmllbGQuTmFtZV0sIHZhbGlkYXRvcnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjb25maWd1cmFyZSBnbGkgZW5kcG9pbnQgZGEgdXNhcmUgZGkgZGVmYXVsdCBhIHBhcnRpcmUgZGFsbCd1cmwgYmFzZSBkZWwgc2VydmVyXHJcbiAgICogYSBjdWkgc2kgZGV2ZSBjb25uZXR0ZXJlIGUgYWwgdG9rZW4gZGEgcGFzc2FyZSBwZXIgYXV0ZW50aWNhcnNpLlxyXG4gICAqIEBwYXJhbSBiYXNlU2VydmVyVXJsIFN0cmluZ2EgZGVsbCd1cmwgYmFzZSBkZWwgc2VydmVyIChlczogXCJodHRwOi8vbG9jYWxob3N0OjUwMDBcIikuXHJcbiAgICogQHBhcmFtIHVzZXJUb2tlbiBUb2tlbiBkZWxsJ3V0ZW50ZSBsb2dnYXRvIGRhIHVzYXJlIHBlciBhdXRlbnRpY2Fyc2kgc2UgbmVjZXNzYXJpby5cclxuICAgKiBAcmV0dXJucyBSZXNpdHVpc2NlIGxhIGNvbmZpZ3VyYXppb25lIGNvbXBsZXRhIGRlZ2xpIGVuZFBvaW50IGRhIHVzYXJlIGRpIGRlZmF1bHQuXHJcbiAgICovXHJcbiAgcHVibGljIENvbmZpZ3VyZURlZmF1bHRFbmRQb2ludHMoXHJcbiAgICBiYXNlU2VydmVyVXJsOiBzdHJpbmcsXHJcbiAgICB1c2VyVG9rZW46IHN0cmluZ1xyXG4gICk6IEVuZFBvaW50Q29uZmlndXJhdGlvbiB7XHJcbiAgICBsZXQgZW5kUG9pbnRDb25maWd1cmF0aW9uOiBFbmRQb2ludENvbmZpZ3VyYXRpb24gPVxyXG4gICAgICBuZXcgRW5kUG9pbnRDb25maWd1cmF0aW9uKGJhc2VTZXJ2ZXJVcmwsIHVzZXJUb2tlbik7XHJcblxyXG4gICAgLy8gZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMgPSB7XHJcbiAgICAvLyAgIEdldEJ5Rm9ybUlERW5kUG9pbnQ6IHtcclxuICAgIC8vICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvZ2V0YWxsXCIsXHJcbiAgICAvLyAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgIC8vICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5HRVQsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIEdldEFsbEJ5RW50QW5kVXNlcklERW5kUG9pbnQ6IHtcclxuICAgIC8vICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvR2V0QWxsQnlVc2VySURcIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgR2V0QnlJREVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL2dldEJ5SURcIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgU2F2ZUVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL3NhdmVcIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLlBPU1QsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIER1cGxpY2F0ZUVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL2R1cGxpY2F0ZVwiLFxyXG4gICAgLy8gICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAvLyAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uR0VULFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBEZWxldGVFbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9kZWxldGVcIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkRFTEVURSxcclxuICAgIC8vICAgfSxcclxuICAgIC8vIH07XHJcbiAgICAvLyBlbmRQb2ludENvbmZpZ3VyYXRpb24uRm9ybXMgPSB7XHJcbiAgICAvLyAgIEdldEJ5SURFbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS9jb25mL2Zvcm1cIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgR2V0QnlJREFuZFZlcnNpb25FbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS9jb25mL0dldEJ5SURBbmRWZXJzaW9uXCIsXHJcbiAgICAvLyAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgIC8vICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5HRVQsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIFNhdmVFbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS9jb25mL2Zvcm1cIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLlBPU1QsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyB9O1xyXG4gICAgcmV0dXJuIGVuZFBvaW50Q29uZmlndXJhdGlvbjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBwcmVuZGUgdW5hIHN0cmluZ2EgaW4gaW5wdXQgZSB2ZXJpZmljYSBjaGUgb2duaSBwYXJlbnRlc2kgYXBlcnRhIHZlbmdhIGFuY2hlIGNoaXVzYVxyXG4gICAqIEByZXR1cm5zIHRydWUgc2UgbGUgcGFyZW50ZXNpIHNvbm8gcGFyaSBlIG9nbmkgcGFyZW50ZXNpIGNoaXVkZSBzZSBzdGVzc2EsIGZhbHNlIHNlIG1hbmNhbm8gcGFyZW50ZXNpIG8gbm9uIHZlbmdvbm8gY2hpdXNlXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyBzdHJpbmdDaGVja1BhcmVudGVzaXMoZXhwcmVzc2lvbiwgcmVxdWlyZWQgPSBmYWxzZSkge1xyXG4gICAgaWYgKGV4cHJlc3Npb24gPT0gdW5kZWZpbmVkIHx8IGV4cHJlc3Npb24gPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gcmVxdWlyZWQgPyBmYWxzZSA6IHRydWU7XHJcbiAgICB9XHJcbiAgICBsZXQgc3RhY2sgPSBbXTtcclxuICAgIGxldCBjdXJyZW50O1xyXG4gICAgY29uc3QgbWF0Y2hMb29rdXAgPSB7XHJcbiAgICAgIFwiKFwiOiBcIilcIixcclxuICAgICAgXCJbXCI6IFwiXVwiLFxyXG4gICAgICBcIntcIjogXCJ9XCIsXHJcbiAgICB9O1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwcmVzc2lvbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjdXJyZW50ID0gZXhwcmVzc2lvbltpXTsgLy9lYXNpZXIgdGhhbiB3cml0aW5nIGl0IG92ZXIgYW5kIG92ZXJcclxuXHJcbiAgICAgIGlmIChjdXJyZW50ID09PSBcIihcIiB8fCBjdXJyZW50ID09PSBcIltcIiB8fCBjdXJyZW50ID09PSBcIntcIikge1xyXG4gICAgICAgIHN0YWNrLnB1c2goY3VycmVudCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gXCIpXCIgfHwgY3VycmVudCA9PT0gXCJdXCIgfHwgY3VycmVudCA9PT0gXCJ9XCIpIHtcclxuICAgICAgICBjb25zdCBsYXN0QnJhY2tldCA9IHN0YWNrLnBvcCgpO1xyXG5cclxuICAgICAgICBpZiAobWF0Y2hMb29rdXBbbGFzdEJyYWNrZXRdICE9PSBjdXJyZW50KSB7XHJcbiAgICAgICAgICAvL2lmIHRoZSBzdGFjayBpcyBlbXB0eSwgLnBvcCgpIHJldHVybnMgdW5kZWZpbmVkLCBzbyB0aGlzIGV4cHJlc3Npb24gaXMgc3RpbGwgY29ycmVjdFxyXG5cclxuICAgICAgICAgIHJldHVybiBmYWxzZTsgLy90ZXJtaW5hdGUgaW1tZWRpYXRlbHkgLSBubyBuZWVkIHRvIGNvbnRpbnVlIHNjYW5uaW5nIHRoZSBzdHJpbmdcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RhY2subGVuZ3RoID09PSAwOyAvL2FueSBlbGVtZW50cyBtZWFuIGJyYWNrZXRzIGxlZnQgb3BlblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGNoZSBkYXRhIGxhIGNvbmZpZ3VyYXppb25lIGRpIHVuIGVuZHBvaW50IGNvc3RydWlzY2UgbCd1cmwgZGEgY2hpYW1hcmUsIGdsaSBldmVudHVhbGkgcGFyYW1ldHJpXHJcbiAgICogZGEgcGFzc2FyZSAobmVsIGJvZHkgbyBuZWxsYSByb3R0YSkgZWQgZWZmZXR0dWEgbGEgY2hpYW1hdGEuIEFsIHRlcm1pbmUgZGVsbGEgY2hpYW1hdGEgZXNlZ3VlIGxlIGV2ZW50dWFsaVxyXG4gICAqIGZ1bnppb25pIGRpIGNhbGxiYWNrIChzaWEgaW4gY2FzbyBkaSBzdWNjZXNzbyBjaGUgaW4gY2FzbyBkaSBlcnJvcmUpIHBhc3NhdGUgaW4gaW5wdXQuXHJcbiAgICogQHBhcmFtIGVuZFBvaW50RGF0YSBDb2ZpZ3VyYXppb25lIGRlbGwnZW5kcG9pbnQgZGEgY2hpYW1hcmUuXHJcbiAgICogQHBhcmFtIGR5bmFtaWNNb2R1bGVQYXJhbXMgQXJyYXkgZGVpIHBhcmFtZXRyaSBhZ2dpdW50aSBkYWwgbW9kdWxvIGRpbmFtaWNvIGEgcXVlbGxpIGdpw6AgY29uZmlndXJhdGlcclxuICAgKiAoYWQgZXNlbXBpbyBpbCByZWNvcmQgbyBsYSBmb3JtIGRhIHNhbHZhcmUgb3BwdXJlIGwnSUQgcGVyIHJlY3VwZXJhcmUgdW5hIHBhcnRpY29sYXJlIGVudGl0w6ApLlxyXG4gICAqIEBwYXJhbSBjYWxsYmFjayBNZXRvZG8gZGEgZXNlZ3VpcmUgaW4gY2FzbyBkaSBzdWNjZXNzbyBkb3BvIGxhIGNoaWFtYXRhIGh0dHAuXHJcbiAgICogTk9UQTogaW4gaW5wdXQgdmllbmUgcGFzc2F0YSBsYSByaXNwb3N0YSBkZWxsYSBjaGlhbWF0YSBzdGVzc2EuXHJcbiAgICogQHBhcmFtIGVycm9yQ2FsbEJhY2sgTWV0b2RvIGRhIGVzZWd1aXJlIGluIGNhc28gZGkgZXJyb3JlIGRvcG8gbGEgY2hpYW1hdGEgaHR0cC5cclxuICAgKiBOT1RBOiBpbiBpbnB1dCB2aWVuZSBwYXNzYXRvIGwnZXJyb3JlIGdlbmVyYXRvIGRlbGxhIGNoaWFtYXRhIHN0ZXNzYS5cclxuICAgKi9cclxuICBwdWJsaWMgUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgZW5kUG9pbnREYXRhOiBFbmRQb2ludERhdGEsXHJcbiAgICBkeW5hbWljTW9kdWxlUGFyYW1zOiBBcnJheTxFbmRQb2ludERhdGFQYXJhbXM+ID0gbnVsbCxcclxuICAgIGNhbGxiYWNrOiAoZTogRm9ybSB8IFJlY29yZCB8IEFycmF5PFJlY29yZD4pID0+IHZvaWQgPSBudWxsLFxyXG4gICAgZXJyb3JDYWxsQmFjazogKGVycjogdW5rbm93bikgPT4gdm9pZCA9IG51bGxcclxuICApOiB2b2lkIHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuYWRkUmVxdWVzdENvdW50ZXIoKTtcclxuXHJcbiAgICBsZXQgdXJsID0gYCR7ZW5kUG9pbnREYXRhLlVybH1gO1xyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgY29uc3QgYm9keVBhcmFtcyA9IHtcclxuICAgICAgQWRkaXRpb25hbFBhcmFtczoge30sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vI3JlZ2lvbiBtZXJnZVBhcmFtXHJcbiAgICAvLyB1bmlzY28gaSBkYXRpIGRpIGRlZmF1bHQgZGVmaW5pdGkgbmVsbGEgY29uZmlndXJhemlvbmUgZGVsbGEgY2hpYW1hdGEgY29uIGkgZGF0aSBjaGUgaW1wb3N0byBuZWxsYSBjaGlhbWF0YSBzcGVjaWZpY2FcclxuICAgIGlmIChlbmRQb2ludERhdGEuUGFyYW1zID09IHVuZGVmaW5lZCB8fCBlbmRQb2ludERhdGEuUGFyYW1zID09IG51bGwpIHtcclxuICAgICAgZW5kUG9pbnREYXRhLlBhcmFtcyA9IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKGR5bmFtaWNNb2R1bGVQYXJhbXMgPT0gdW5kZWZpbmVkIHx8IGR5bmFtaWNNb2R1bGVQYXJhbXMgPT0gbnVsbCkge1xyXG4gICAgICBkeW5hbWljTW9kdWxlUGFyYW1zID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWVyZ2VkUGFyYW1zOiBBcnJheTxFbmRQb2ludERhdGFQYXJhbXM+ID0gWy4uLmVuZFBvaW50RGF0YS5QYXJhbXNdO1xyXG5cclxuICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMuZm9yRWFjaCgob2JqKSA9PiB7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBtZXJnZWRQYXJhbXMuZmluZEluZGV4KFxyXG4gICAgICAgIChpdGVtKSA9PiBpdGVtLlBhcmFtTmFtZSA9PT0gb2JqLlBhcmFtTmFtZVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGV4aXN0aW5nSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgbWVyZ2VkUGFyYW1zW2V4aXN0aW5nSW5kZXhdLlBhcmFtVmFsdWUgPSBvYmouUGFyYW1WYWx1ZTtcclxuICAgICAgICBtZXJnZWRQYXJhbXNbZXhpc3RpbmdJbmRleF0uUGFyYW1UeXBlID0gb2JqLlBhcmFtVHlwZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtZXJnZWRQYXJhbXMucHVzaChvYmopO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAobWVyZ2VkUGFyYW1zKSB7XHJcbiAgICAgIG1lcmdlZFBhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAocGFyYW0uUGFyYW1UeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bXCJRdWVyeSBwYXJhbVwiXToge1xyXG4gICAgICAgICAgICBjb25zdCBzdHJpbmdQYXJhbTogc3RyaW5nID1cclxuICAgICAgICAgICAgICBwYXJhbS5QYXJhbU5hbWUgKyBcIj1cIiArIHBhcmFtLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zID1cclxuICAgICAgICAgICAgICAocXVlcnlQYXJhbXMgPT0gbnVsbCA/IFwiXCIgOiBxdWVyeVBhcmFtcyArIFwiJlwiKSArIHN0cmluZ1BhcmFtO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVtcIkluIHJvdXRlXCJdOiB7XHJcbiAgICAgICAgICAgIHVybCA9IHVybCArICh1cmwuZW5kc1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wiKSArIHBhcmFtLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtW1wiSW4gQm9keVwiXToge1xyXG4gICAgICAgICAgICBib2R5UGFyYW1zW3BhcmFtLlBhcmFtTmFtZV0gPSBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uIG1lcmdlUGFyYW1cclxuXHJcbiAgICAvLyNyZWdpb24gYWRkRGVmYXVsdFBhcmFtc1xyXG4gICAgLy8gU2UgbmVsbGEgY29uZmlndXJhemlvbmUgc29ubyBzdGF0aSBkZWZpbml0aSBwYXJhbWV0cmkgZGEgYWdnaXVuZ2VyZSBhbGxhIGNoaWFtYXRhIHF1ZXN0aSB2ZW5nb25vIGNpY2xhdGlcclxuICAgIC8vIGUgYWdnaXVudGkgbmVsIHB1bnRvIGluIGN1aSBkZXZvbm8gZXNzZXJlIHVzYXRpLlxyXG4gICAgLy8gaWYgKGVuZFBvaW50RGF0YS5QYXJhbXMpIHtcclxuICAgIC8vICAgICBlbmRQb2ludERhdGEuUGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgLy8gICAgICAgICBzd2l0Y2ggKHBhcmFtLlBhcmFtVHlwZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydRdWVyeSBwYXJhbSddOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nUGFyYW06IHN0cmluZyA9IHBhcmFtLlBhcmFtTmFtZSArIFwiPVwiICsgcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcyA9IChxdWVyeVBhcmFtcyA9PSBudWxsID8gXCJcIiA6IHF1ZXJ5UGFyYW1zICsgXCImXCIpICsgc3RyaW5nUGFyYW07XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ0luIHJvdXRlJ106IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAodXJsLmVuZHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIikgKyBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydJbiBCb2R5J106IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBib2R5UGFyYW1zLkFkZGl0aW9uYWxQYXJhbXNbcGFyYW0uUGFyYW1OYW1lXSA9IHBhcmFtLlBhcmFtVmFsdWU7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuICAgIC8vI2VuZHJlZ2lvbiBhZGREZWZhdWx0UGFyYW1zXHJcblxyXG4gICAgLy8jcmVnaW9uIGFkZFNwZWNpZmljUGFyYW1zXHJcbiAgICAvLyBTZSBzb25vIHN0YXRpIHBhc3NhdGkgcGFyYW1ldHJpIGRhIGFnZ2l1bmdlcmUgYWxsYSBjaGlhbWF0YSBkZWZpbml0aSBhbGwnaW50ZXJubyBkZWwgbW9kdWxvIGRpbmFtaWNvXHJcbiAgICAvLyB2ZW5nb25vIGNpY2xhdGkgZSBhZ2dpdW50aSBuZWwgcHVudG8gaW4gY3VpIGRldm9ubyBlc3NlcmUgdXNhdGkgZG9wbyBxdWVsbGkgZGVmaW5pdGkgbmVsbGEgY29uZmlndXJhemlvbmUuXHJcbiAgICAvLyBpZiAoZHluYW1pY01vZHVsZVBhcmFtcykge1xyXG4gICAgLy8gICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XHJcbiAgICAvLyAgICAgICAgIHN3aXRjaCAocGFyYW0uUGFyYW1UeXBlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ1F1ZXJ5IHBhcmFtJ106IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdQYXJhbTogc3RyaW5nID0gcGFyYW0uUGFyYW1OYW1lICsgXCI9XCIgKyBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zID09IG51bGwgPyBcIlwiIDogcXVlcnlQYXJhbXMgKyBcIiZcIikgKyBzdHJpbmdQYXJhbTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnSW4gcm91dGUnXToge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHVybCA9IHVybCArICh1cmwuZW5kc1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wiKSArIHBhcmFtLlBhcmFtVmFsdWU7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ0luIEJvZHknXToge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJvZHlQYXJhbXNbcGFyYW0uUGFyYW1OYW1lXSA9IHBhcmFtLlBhcmFtVmFsdWU7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9KVxyXG4gICAgLy8gfVxyXG4gICAgLy8jZW5kcmVnaW9uIGFkZFNwZWNpZmljUGFyYW1zXHJcblxyXG4gICAgaWYgKHF1ZXJ5UGFyYW1zICE9IG51bGwpIHtcclxuICAgICAgdXJsID1cclxuICAgICAgICAodXJsLmVuZHNXaXRoKFwiL1wiKSA/IHVybC5zdWJzdHJpbmcoMCwgdXJsLmxlbmd0aCAtIDEpIDogdXJsKSArXHJcbiAgICAgICAgXCI/XCIgK1xyXG4gICAgICAgIHF1ZXJ5UGFyYW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaHR0cFxyXG4gICAgICAucmVxdWVzdChlbmRQb2ludERhdGEuUmVxdWVzdE1ldGhvZCwgdXJsLCB7XHJcbiAgICAgICAgaGVhZGVyczogZW5kUG9pbnREYXRhLlRva2VuXHJcbiAgICAgICAgICA/IHsgQXV0aG9yaXphdGlvbjogZW5kUG9pbnREYXRhLlRva2VuIH1cclxuICAgICAgICAgIDogbnVsbCxcclxuICAgICAgICBib2R5OiAhW1JlcXVlc3RNZXRob2RFbnVtLkRFTEVURSwgUmVxdWVzdE1ldGhvZEVudW0uR0VUXS5pbmNsdWRlcyhcclxuICAgICAgICAgIGVuZFBvaW50RGF0YS5SZXF1ZXN0TWV0aG9kXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgPyBib2R5UGFyYW1zXHJcbiAgICAgICAgICA6IG51bGwsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlczogRm9ybSB8IFJlY29yZCB8IEFycmF5PFJlY29yZD4pID0+IHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UucmVtb3ZlUmVxdWVzdENvdW50ZXIoKTtcclxuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhyZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnJlbW92ZVJlcXVlc3RDb3VudGVyKCk7XHJcbiAgICAgICAgICBpZiAoZXJyb3JDYWxsQmFjaykge1xyXG4gICAgICAgICAgICBlcnJvckNhbGxCYWNrKGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIEVxcER5bmFtaWNNb2R1bGVEaWFsb2dTZXJ2aWNlLkVycm9yKGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlJ1bkVuZFBvaW50Q2FsbCAtIHN1YnNjcmliZSAtIGVuZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gIH1cclxufVxyXG4iXX0=
548
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0eUhlbHBlci5zZXJ2aWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBR0wsa0JBQWtCLEVBR2xCLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsYUFBYSxHQUNkLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xELE9BQU8sRUFDTCxxQkFBcUIsRUFHckIsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLHVDQUF1QyxDQUFDO0FBSy9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEdBQ1QsTUFBTSxrQ0FBa0MsQ0FBQztBQUcxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7O0FBT3BGLE1BQU0sT0FBTyxvQkFBb0I7SUFJL0IsUUFBUSxDQUFDLE9BQWUsRUFBRSxJQUFVO1FBQ2xDLElBQUcsSUFBSSxDQUFDLFNBQVMsRUFBQztZQUNoQixJQUFHLElBQUksRUFBQztnQkFDTixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTthQUMzQjtpQkFBSTtnQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2FBQ3JCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsWUFDVSxXQUErQixFQUMvQixJQUFnQixFQUNoQixjQUE4QjtRQUY5QixnQkFBVyxH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QUFFLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FDL0QsWUFBWSxDQUFDLGFBQWEsQ0FDM0I7Z0JBQ0MsQ0FBQyxDQUFDLFVBQVU7Z0JBQ1osQ0FBQyxDQUFDLElBQUk7U0FDVCxDQUFDO2FBQ0QsU0FBUyxDQUNSLENBQUMsR0FBa0MsRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMzQyxJQUFJLFFBQVEsRUFBRTtnQkFDWixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDZjtRQUNILENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzNDLElBQUksYUFBYSxFQUFFO2dCQUNqQixhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEI7WUFDRCw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9CLDhEQUE4RDtRQUNoRSxDQUFDLENBQ0YsQ0FBQztJQUVOLENBQUM7O0FBdm5CYSw0QkFBTyxHQUFZLElBQUksT0FBTyxFQUFFLENBQUM7a0hBRHBDLG9CQUFvQjtzSEFBcEIsb0JBQW9CLGNBRm5CLE1BQU07NEZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcclxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXHJcbiAgVW50eXBlZEZvcm1Hcm91cCxcclxuICBWYWxpZGF0b3JGbixcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VGaWVsZCxcclxuICBDb2xTcGFuU2l6ZXNFbnVtLFxyXG4gIEZpZWxkVHlwZUVudW0sXHJcbn0gZnJvbSBcIi4uL21vZGVscy9iYXNlRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9tb2RlbHMvY29udGV4dC5tb2RlbFwiO1xyXG5pbXBvcnQge1xyXG4gIEVuZFBvaW50Q29uZmlndXJhdGlvbixcclxuICBFbmRQb2ludERhdGEsXHJcbiAgRW5kUG9pbnREYXRhUGFyYW1zLFxyXG4gIFBhcmFtVHlwZUVudW0sXHJcbiAgUmVxdWVzdE1ldGhvZEVudW0sXHJcbn0gZnJvbSBcIi4uL21vZGVscy9lbmRQb2ludENvbmZpZ3VyYXRpb24ubW9kZWxcIjtcclxuaW1wb3J0IHsgQXR0YWNobWVudEZpZWxkIH0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvYXR0YWNobWVudEZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IEltYWdlRmllbGQgfSBmcm9tIFwiLi4vbW9kZWxzL2ZpZWxkcy9pbWFnZUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IExpc3RWYWx1ZUZpZWxkIH0gZnJvbSBcIi4uL21vZGVscy9maWVsZHMvbGlzdFZhbHVlRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgVGV4dGFyZWFGaWVsZCB9IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL3RleHRhcmVhRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHtcclxuICBUZXh0TWFza0VudW0sXHJcbiAgVGV4dEZpZWxkLFxyXG4gIFVybFJlZ2V4LFxyXG4gIFRlbFJlZ2V4LFxyXG59IGZyb20gXCIuLi9tb2RlbHMvZmllbGRzL3RleHRGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBGb3JtIH0gZnJvbSBcIi4uL21vZGVscy9mb3JtLm1vZGVsXCI7XHJcbmltcG9ydCB7IFJlY29yZCB9IGZyb20gXCIuLi9tb2RlbHMvcmVjb3JkLm1vZGVsXCI7XHJcbmltcG9ydCB7IEFycmF5VmFsaWRhdG9ycyB9IGZyb20gXCIuL2N1c3RvbS1mb3JtLXZhbGlkYXRvcnMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBFcXBEeW5hbWljTW9kdWxlRGlhbG9nU2VydmljZSB9IGZyb20gXCIuL2VxcC1keW5hbWljLW1vZHVsZS1kaWFsb2cuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTcGlubmVyU2VydmljZSB9IGZyb20gXCIuL3NwaW5uZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXJ2aWNlIH0gZnJvbSBcIi4vZ2xvYmFsLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFV0aWxpdHlIZWxwZXJTZXJ2aWNlIHtcclxuICBwdWJsaWMgc3RhdGljIGNvbnRleHQ6IENvbnRleHQgPSBuZXcgQ29udGV4dCgpO1xyXG5cclxuICBkZWJ1Z01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkZWJ1Z0xvZyhtZXNzYWdlOiBzdHJpbmcsIGl0ZW0/OiBhbnkpe1xyXG4gICAgaWYodGhpcy5kZWJ1Z01vZGUpe1xyXG4gICAgICBpZihpdGVtKXtcclxuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlLCBpdGVtKVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgc3Bpbm5lclNlcnZpY2U6IFNwaW5uZXJTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBwdWJsaWMgc3RhdGljIEV2YWx1YXRlRmllbGRGb3JtdWxhKFxyXG4gICAgZm9ybXVsYTogc3RyaW5nLFxyXG4gICAgcmVjOiBSZWNvcmQsXHJcbiAgICBjdHg6IGFueVxyXG4gICk6IGFueSB7XHJcbiAgICBjb25zdCBldmFsdWF0ZWRWYWx1ZSA9IGV2YWwoZm9ybXVsYSk7XHJcbiAgICByZXR1cm4gZXZhbHVhdGVkVmFsdWUgPyBldmFsdWF0ZWRWYWx1ZSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIFNldENvbnRleHQoY3R4OiBDb250ZXh0KSB7XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjdHg7XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1lcmljKG4pIHtcclxuICAgIHJldHVybiAhaXNOYU4obik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGluaXRTdHlsZXMoc3R5bGVjc3MpIHtcclxuICAgIHJldHVybiBzdHlsZWNzcy5zcGxpdChcIjtcIikucmVkdWNlKChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IGtleXBhciA9IGIuc3BsaXQoXCI6XCIpO1xyXG4gICAgICBpZiAoa2V5cGFyLmxlbmd0aCA+IDEpIGFba2V5cGFyWzBdLnRyaW0oKV0gPSBrZXlwYXJbMV0udHJpbSgpO1xyXG4gICAgICByZXR1cm4gYTtcclxuICAgIH0sIHt9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgR2V0RmllbGRUeXBlKGZpZWxkOiBCYXNlRmllbGQpIHtcclxuICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKSB7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIGRpIHRlc3RvXCJdOiB7XHJcbiAgICAgICAgY29uc3QgdDogVGV4dEZpZWxkID0gT2JqZWN0LmFzc2lnbihuZXcgVGV4dEZpZWxkKCksIGZpZWxkKTtcclxuICAgICAgICByZXR1cm4gdDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgaW1wb3N0YXJlIGkgdmFsb3JpIGRhIHN1Z2dlcmlyZSBuZWxsJ2F1dG9jb21wbGV0ZSBwZXIgaSBjYW1waSBpbiBjdWkgbCd1dGVudGUgZGV2ZSBzY3JpdmVyZSBjb21hbmRpIGphdmFzY3JpcHQuXHJcbiAgICogSW4gYmFzZSBhbGwndWx0aW1vIGNhcmF0dGVyZSBkaWdpdGF0byB2aWVuZSBpbXBvc3RhdG8gdW4gZWxlbmNvIGRpIG9nZ2V0dGkgbyBwcm9wcmlldMOgIGNoZSBsJ3V0ZW50ZSBoYSBhIGRpc3Bvc2l6aW9uZSBpbiBxdWVsIG1vbWVudG8uXHJcbiAgICogQHBhcmFtIGZpZWxkcyBBcnJheSBkaSBCYXNlRmllbGQgYWdnaXVudGkgYWxsYSBGb3JtXHJcbiAgICogQHBhcmFtIHR5cGVkRm9ybXVsYSBTdHJpbmdhIGRpZ2l0YXRhIGRhbGwndXRlbnRlXHJcbiAgICogQHN1bW1hcnkgSWwgbWV0b2RvIGltcG9zdGEgaSBzdWdnZXJpbWVudGkgYmFzYW5kb3NpIHN1IDMgY2FzaTpcclxuICAgKiAgMSkgbCd1dGVudGUgbm9uIGhhIGRpZ2l0YXRvIG51bGxhIG8gbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBmaW5pc2NlIGNvbiB1bm8gc3BhemlvIHZ1b3RvXHJcbiAgICogIDIpIGxhIHN0cmluZ2EgZGlnaXRhdGEgZGFsbCd1dGVudGUgZmluaXNjZSBjb24gdW4gXCIuXCJcclxuICAgKiAgMykgbGEgc3RyaW5nYSBkaWdpdGF0YSBkYWxsJ3V0ZW50ZSBub24gY29pbmNpZGUgY29uIG5lc3N1biBhbHRybyBjYXNvIHNvcHJhIChmaW5pc2NlIGNvbiB1biBjYXJhdHRlcmUgcXVhbHVucXVlKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgR2V0QXV0b2NvbXBsZXRlT3B0aW9ucyhcclxuICAgIGZpZWxkczogQXJyYXk8QmFzZUZpZWxkPixcclxuICAgIHR5cGVkRm9ybXVsYTogc3RyaW5nXHJcbiAgKTogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+IHtcclxuICAgIGxldCBhdXRvY29tcGxldGVPcHRpb25zOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4gPSBbXTtcclxuXHJcbiAgICAvLyBSZWN1cGVybyBpIG5vbWkgZGkgdHV0dGkgaSBjYW1waSBjcmVhdGkgZmlubyBhZCBvcmEgbmVsbGEgZm9ybS5cclxuICAgIGNvbnN0IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBmaWVsZHMubWFwKChmKSA9PlxyXG4gICAgICBmLkxhYmVsLnNwbGl0KFwiIFwiKS5qb2luKFwiX1wiKVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBOZWwgY2FzaSBpbiBjdWkgbCd1dGVudGUgbm9uIGhhIGluc2VyaXRvIG51bGxhIG9wcHVyZSBsYSBzdHJpbmdhIGZpbmlzY2UgY29uIHVubyBzcGF6aW8gdnVvdG8gbyB1biBzaW1ib2xvIGRpdmVyc28gZGEgXCIuXCJcclxuICAgIC8vICh1biBjYXJhdHRlcmUgbm9uIGFsZmFudW1lcmljbykgaW1wb3N0byBjb21lIHN1Z2dlcmltZW50aSBzb2xvIFwicmVjXCIgZSBcImN0eFwiLCBvdnZlcm8gZ2xpIHVuaWNpIGR1ZSBvZ2dldHRpIGEgY3VpIGwndXRlbnRlIGhhIGFjY2Vzc28uXHJcbiAgICBpZiAoXHJcbiAgICAgICF0eXBlZEZvcm11bGEgfHxcclxuICAgICAgKCF0eXBlZEZvcm11bGEuZW5kc1dpdGgoXCIuXCIpICYmXHJcbiAgICAgICAgbmV3IFJlZ0V4cChcIlteMC05YS16QS1aX11cIikudGVzdChcclxuICAgICAgICAgIHR5cGVkRm9ybXVsYS5zdWJzdHJpbmcodHlwZWRGb3JtdWxhLmxlbmd0aCAtIDEsIHR5cGVkRm9ybXVsYS5sZW5ndGgpXHJcbiAgICAgICAgKSlcclxuICAgICkge1xyXG4gICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gW1xyXG4gICAgICAgIHsgbGFiZWw6IFwicmVjXCIsIHZhbHVlOiAodHlwZWRGb3JtdWxhID8gdHlwZWRGb3JtdWxhIDogXCJcIikgKyBcInJlY1wiIH0sXHJcbiAgICAgICAgeyBsYWJlbDogXCJjdHhcIiwgdmFsdWU6ICh0eXBlZEZvcm11bGEgPyB0eXBlZEZvcm11bGEgOiBcIlwiKSArIFwiY3R4XCIgfSxcclxuICAgICAgXTtcclxuICAgIH1cclxuICAgIC8vIFNlIGxhIHN0cmluZ2EgZmluaXNjZSBjb24gdW4gXCIuXCIgdnVvbCBkaXJlIGNoZSBsJ3V0ZW50ZSBzdGEgY2VyY2FuZG8gZGkgYWNjZWRlcmUgYWQgdW5hIHByb3ByaWV0w6AgZGkgdW4gb2dnZXR0b1xyXG4gICAgLy8gYSBzdWEgZGlzcG9zaXppb25lLiBSZWN1cGVybyBpbCBub21lIGRlbGwndWx0aW1vIG9nZ2V0dG8gZGlnaXRhdG8gZGFsbCd1dGVudGUgZSBzZSBsJ29nZ2V0dG8gc2NlbHRvIMOoIFwicmVjXCIgbyBcImN0eFwiXHJcbiAgICAvLyBhbGxvcmEgc3VnZ2VyaXNjbyBsZSBwcm9wcmlldMOgIGNoZSBlc2lzdG9ubyBhbGwnaW50ZXJubyBkaSBxdWVzdGkgb2dnZXR0aSBhbHRyaW1lbnRpIG5vbiBtb3N0cm8gbnVsbGEuXHJcbiAgICBlbHNlIGlmICh0eXBlZEZvcm11bGEuZW5kc1dpdGgoXCIuXCIpKSB7XHJcbiAgICAgIGNvbnN0IGZvcm11bGFQaWVjZXM6IEFycmF5PHN0cmluZz4gPSB0eXBlZEZvcm11bGFcclxuICAgICAgICAuc3BsaXQoXCIgXCIpXHJcbiAgICAgICAgW3R5cGVkRm9ybXVsYS5zcGxpdChcIiBcIikubGVuZ3RoIC0gMV0uc3BsaXQoXCIuXCIpO1xyXG4gICAgICBpZiAoZm9ybXVsYVBpZWNlc1tmb3JtdWxhUGllY2VzLmxlbmd0aCAtIDJdID09PSBcInJlY1wiKSB7XHJcbiAgICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXMubWFwKChmKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4geyBsYWJlbDogZiwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIGYgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmIChmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gMl0gPT09IFwiY3R4XCIpIHtcclxuICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gT2JqZWN0LmtleXMoVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dCkubWFwKFxyXG4gICAgICAgICAgKGYpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6IGYsIHZhbHVlOiB0eXBlZEZvcm11bGEgKyBmIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICBmb3JtdWxhUGllY2VzLmxlbmd0aCA+IDIgJiZcclxuICAgICAgICBmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gM10gPT09IFwiY3R4XCIgJiZcclxuICAgICAgICBmb3JtdWxhUGllY2VzW2Zvcm11bGFQaWVjZXMubGVuZ3RoIC0gMl0gPT09IFwiVXNlclwiXHJcbiAgICAgICkge1xyXG4gICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnMgPSBPYmplY3Qua2V5cyhcclxuICAgICAgICAgIFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmNvbnRleHQuVXNlclxyXG4gICAgICAgICkubWFwKChmKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4geyBsYWJlbDogZiwgdmFsdWU6IHR5cGVkRm9ybXVsYSArIGYgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zID0gW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEluIHR1dHRpIGdsaSBhbHRyaSBjYXNpLCBvdnZlcm8gcXVhbmRvIGxhIHN0cmluZ2EgZGlnaXRhdGEgZmluaXNjZSBjb24gdW4gY2FyYXR0ZXJlIGRpdmVyc28gZGEgcXVlbGxpXHJcbiAgICAvLyBjb250cm9sbGF0aSBmaW5vcmEsIHZ1b2wgZGlyZSBjaGUgbCd1dGVudGUgc3RhIGRpZ2l0YW50byBpbCBub21lIGRpIHVuIG9nZ2V0dG8sIHVuYSBwcm9wcmlldMOgIG8gdW5hXHJcbiAgICAvLyBmdW56aW9uZSBqYXZhc2NyaXB0LiBDb250cm9sbG8gbGEgcGFyb2xhIGNoZSBsJ3V0ZW50ZSBzdGEgZGlnaXRhbmRvIGUgc2UgZmEgcGFydGUgZGkgdW5vIGRlZ2xpIG9nZ2V0dGkgYSBkaXNwb3NpemlvbmVcclxuICAgIC8vIG8gdW5hIHByb3ByaWV0w6AgZGkgZXNzaSBhbGxvcmEgc3VnZ2VyaXNjbyBpIHBvc3NpYmlsaSBtYXRjaC5cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zdCBhdmFpbGFibGVPcHRpb25zOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4gPSBbXTtcclxuXHJcbiAgICAgIC8vIFByZW5kbyB0dXR0aSBpIGJsb2NjaGkgZGkgY2FyYXR0ZXJpIGRpZ2l0YXRpIGRhbGwndXRlbnRlXHJcbiAgICAgIGNvbnN0IGFsbEZvcm11bGFXb3JkczogQXJyYXk8c3RyaW5nPiA9IHR5cGVkRm9ybXVsYS5zcGxpdChcIiBcIik7XHJcbiAgICAgIC8vIFByZW5kbyBsJ3VsdGltbyBibG9jY28gZGkgY2FyYXR0ZXJpIGRpZ2l0YXRvIGRhbGwndXRlbnRlXHJcbiAgICAgIGNvbnN0IGxhc3RUeXBlZFN0cmluZzogc3RyaW5nID1cclxuICAgICAgICBhbGxGb3JtdWxhV29yZHNbYWxsRm9ybXVsYVdvcmRzLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgLy8gU2UgbGEgbCd1bHRpbWEgc3RyaW5nYSBkaWdpdGF0YSBub24gY29udGllbmUgY2FyYXR0ZXJpIHNwZWNpYWxpIGFsbG9yYSBzcGxpdHRvIGxhIHN0cmluZ2FcclxuICAgICAgLy8gc3VpIFwiLlwiIGUgaW1wb3N0byBpIHN1Z2dlcmltZW50aSBpbiBiYXNlIGFsIHBhdGggZGVsbGEgcHJvcnBpZXTDoCBjaGUgc2kgc3RhIGRpZ2l0YW5kby5cclxuICAgICAgaWYgKCFuZXcgUmVnRXhwKFwiW14wLTlhLXpBLVpfLl1cIikudGVzdChsYXN0VHlwZWRTdHJpbmcpKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoID0gbGFzdFR5cGVkU3RyaW5nLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBjb25zdCBsYXN0VHlwZWRXb3JrID0gcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgbGV0IHByb3BlcnRpZXNUb0NoZWNrOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgICAgIGlmIChwcm9wZXJ0eVBhdGgubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrID0gW1wicmVjXCIsIFwiY3R4XCJdO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICBwcm9wZXJ0eVBhdGgubGVuZ3RoID4gMSAmJlxyXG4gICAgICAgICAgcHJvcGVydHlQYXRoW3Byb3BlcnR5UGF0aC5sZW5ndGggLSAyXSA9PT0gXCJjdHhcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcHJvcGVydGllc1RvQ2hlY2sgPSBPYmplY3Qua2V5cyhVdGlsaXR5SGVscGVyU2VydmljZS5jb250ZXh0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgcHJvcGVydHlQYXRoLmxlbmd0aCA+IDIgJiZcclxuICAgICAgICAgIHByb3BlcnR5UGF0aFtwcm9wZXJ0eVBhdGgubGVuZ3RoIC0gM10gPT09IFwiY3R4XCIgJiZcclxuICAgICAgICAgIHByb3BlcnR5UGF0aFtwcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMl0gPT09IFwiVXNlclwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjayA9IE9iamVjdC5rZXlzKFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmNvbnRleHQuVXNlcik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgIHByb3BlcnR5UGF0aC5sZW5ndGggPiAxICYmXHJcbiAgICAgICAgICBwcm9wZXJ0eVBhdGhbcHJvcGVydHlQYXRoLmxlbmd0aCAtIDJdID09PSBcInJlY1wiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjayA9IGF2YWlsYWJsZVJlY1Byb3BlcnRpZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFc2VndW8gaWwgY29udHJvbGxvIHN1bGxlIHByb3ByaWV0w6AgcmVjdXBlcmF0ZSwgYWdnaXVuZ28gYWkgc3VnZ2VyaW1lbnRpIHR1dHRpIGkgbm9taSBjaGUgaW5pemlhbm8gY29uXHJcbiAgICAgICAgLy8gcXVlbGxvIGNoZSBzdGEgZGlnaXRhbmRvIGwndXRlbnRlLlxyXG4gICAgICAgIHByb3BlcnRpZXNUb0NoZWNrLmZvckVhY2goKHByb3ApID0+IHtcclxuICAgICAgICAgIGlmIChwcm9wLnN0YXJ0c1dpdGgobGFzdFR5cGVkV29yaykpIHtcclxuICAgICAgICAgICAgYXZhaWxhYmxlT3B0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgICBsYWJlbDogcHJvcCxcclxuICAgICAgICAgICAgICB2YWx1ZTpcclxuICAgICAgICAgICAgICAgIHR5cGVkRm9ybXVsYSArXHJcbiAgICAgICAgICAgICAgICBwcm9wLnN1YnN0cmluZyhsYXN0VHlwZWRXb3JrLmxlbmd0aCwgcHJvcC5sZW5ndGgpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IGF2YWlsYWJsZU9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGF1dG9jb21wbGV0ZU9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gaW52b2NhdG8gZGFsbCdodG1sIHBlciBpbXBvc3RhcmUgbGUgY2xhc3NpIGNzcyBwZXIgdmlzdWFsaXp6YXJlIGlsIGNhbXBvIGFsbCdpbnRlcm5vIGRlbGxhIGZvcm0uXHJcbiAgICogU2UgcGVyIGlsIGZpZWxkIHNvbm8gc3RhdGUgc3BlY2lmaWNhdGUgZGVsbGUgY2xhc3NpIGFsbG9yYSB2ZW5nb25vIGFwcGxjYXRlIHF1ZWxsZSwgYWx0cmltZW50aSB2ZW5nb25vIHVzYXRlXHJcbiAgICogZGVsbGUgY2xhc3NpIGRpIGRlZmF1bHQuXHJcbiAgICogQHBhcmFtIGZpZWxkIEJhc2VGaWVsZCBkYSB2aXN1YWxpenphcmUuXHJcbiAgICogQHJldHVybnMgUmVzdGl0dWlzY2UgdW5hIHN0cmluZ2EgY29udGVuZW50ZSBsZSBjbGFzc2kgY3NzIGRhIGFwcGxpY2FyZS5cclxuICAgKi9cclxuICBnZXRGaWVsZFN5bGVDbGFzcyhmaWVsZDogQmFzZUZpZWxkKTogc3RyaW5nIHtcclxuICAgICAgICBcclxuICAgIGlmIChmaWVsZC5Db2xTcGFuU2l6ZXMgJiYgZmllbGQuQ29sU3BhblNpemVzLmxlbmd0aCA+IDApe1xyXG4gICAgICAvLy8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnZmllbGQnLCBmaWVsZClcclxuXHJcbiAgICAgIHJldHVybiBmaWVsZC5Db2xTcGFuU2l6ZXMubWFwKChzaXplKSA9PlxyXG4gICAgICAgIENvbFNwYW5TaXplc0VudW1bc2l6ZV0udG9TdHJpbmcoKVxyXG4gICAgICApLmpvaW4oXCIgXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRTdHlsZUNsYXNzKGZpZWxkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBpbnZvY2F0byBkYWxsJ2h0bWwgcGVyIGltcG9zdGFyZSBsZSBjbGFzc2kgY3NzIHBlciB2aXN1YWxpenphcmUgaWwgY2FtcG8gYWxsJ2ludGVybm8gZGVsbGEgZm9ybS5cclxuICAgKiBTZSBwZXIgaWwgZmllbGQgc29ubyBzdGF0ZSBzcGVjaWZpY2F0ZSBkZWxsZSBjbGFzc2kgYWxsb3JhIHZlbmdvbm8gYXBwbGNhdGUgcXVlbGxlLCBhbHRyaW1lbnRpIHZlbmdvbm8gdXNhdGVcclxuICAgKiBkZWxsZSBjbGFzc2kgZGkgZGVmYXVsdC5cclxuICAgKiBAcGFyYW0gZmllbGQgQmFzZUZpZWxkIGRhIHZpc3VhbGl6emFyZS5cclxuICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1bmEgc3RyaW5nYSBjb250ZW5lbnRlIGxlIGNsYXNzaSBjc3MgZGEgYXBwbGljYXJlLlxyXG4gICAqL1xyXG4gIGdldEZpZWxkQW5zd2VyU3R5bGVDbGFzcyhmaWVsZDogQmFzZUZpZWxkKTogc3RyaW5nIHtcclxuICAgICAgICBcclxuICAgIGlmIChmaWVsZC5BbnN3ZXJTdHlsZSAmJiBmaWVsZC5BbnN3ZXJTdHlsZS5Db2xTcGFuU2l6ZXMgJiYgZmllbGQuQW5zd2VyU3R5bGUuQ29sU3BhblNpemVzLmxlbmd0aCA+IDApe1xyXG4gICAgICAvLy8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnZmllbGQnLCBmaWVsZClcclxuXHJcbiAgICAgIHJldHVybiBmaWVsZC5BbnN3ZXJTdHlsZS5Db2xTcGFuU2l6ZXMubWFwKChzaXplKSA9PlxyXG4gICAgICAgIENvbFNwYW5TaXplc0VudW1bc2l6ZV0udG9TdHJpbmcoKVxyXG4gICAgICApLmpvaW4oXCIgXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRTdHlsZUNsYXNzKGZpZWxkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFN0eWxlQ2xhc3MoZmllbGQ6IEJhc2VGaWVsZCk6IHN0cmluZ3tcclxuICAgIFxyXG4gICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpIHtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQ2FtcG8gZGkgdGVzdG9cIl06XHJcbiAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdDYW1wbyBkaSB0ZXN0bycpXHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IGFsaWduLXNlbGYtZW5kXCI7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkFyZWEgZGkgdGVzdG9cIl06XHJcbiAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdBcmVhIGRpIHRlc3RvJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMiBhbGlnbi1zZWxmLWVuZFwiO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJCb29sZWFub1wiXTpcclxuICAgICAgICAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coJ0Jvb2xlYW5vJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgYWxpZ24tc2VsZi1jZW50ZXJcIjtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiRGF0YSBlL28gb3JhXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnRGF0YSBlL28gb3JhJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgYWxpZ24tc2VsZi1lbmRcIjtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQ2FtcG8gbnVtZXJpY29cIl06XHJcbiAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdDYW1wbyBudW1lcmljbycpXHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IGFsaWduLXNlbGYtZW5kXCI7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkFsbGVnYXRvXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnQWxsZWdhdG8nKVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIChmaWVsZCBhcyBBdHRhY2htZW50RmllbGQpLklzTXVsdGlBdHRhY2ggfHxcclxuICAgICAgICAgICgoZmllbGQgYXMgQXR0YWNobWVudEZpZWxkKS5NZXRhZGF0YUZpZWxkcyAmJlxyXG4gICAgICAgICAgICAoZmllbGQgYXMgQXR0YWNobWVudEZpZWxkKS5NZXRhZGF0YUZpZWxkcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTIgYWxpZ24tc2VsZi1lbmRcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC00IGNvbC1sZy00IGFsaWduLXNlbGYtZW5kXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJJbW1hZ2luZVwiXTpcclxuICAgICAgICAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coJ0ltbWFnaW5lJylcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAoZmllbGQgYXMgSW1hZ2VGaWVsZCkuQXR0YWNoRGVmaW5pdGlvbi5Jc011bHRpQXR0YWNoIHx8XHJcbiAgICAgICAgICAoKGZpZWxkIGFzIEltYWdlRmllbGQpLkF0dGFjaERlZmluaXRpb24uTWV0YWRhdGFGaWVsZHMgJiZcclxuICAgICAgICAgICAgKGZpZWxkIGFzIEltYWdlRmllbGQpLkF0dGFjaERlZmluaXRpb24uTWV0YWRhdGFGaWVsZHMubGVuZ3RoID4gMClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTEyIGFsaWduLXNlbGYtZW5kXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBcImNvbC1zbS0xMiBjb2wtbWQtNCBjb2wtbGctNCBhbGlnbi1zZWxmLWVuZFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiRWxlbmNvIGdlbmVyaWNvXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnRWxlbmNvIGdlbmVyaWNvJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgYWxpZ24tc2VsZi1lbmRcIjtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiTG9va3VwXCJdOlxyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnTG9va3VwJylcclxuICAgICAgICByZXR1cm4gXCJjb2wtc20tMTIgY29sLW1kLTQgY29sLWxnLTQgYWxpZ24tc2VsZi1lbmRcIjtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiRm9ybSBkaSBkZXR0YWdsaW9cIl06XHJcbiAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdGb3JtIGRpIGRldHRhZ2xpbycpXHJcbiAgICAgICAgcmV0dXJuIFwiY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTIgYWxpZ24tc2VsZi1lbmRcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY3JlYXJlIGlsIEZvcm1Hcm91cCBjaGUgcmFwcHJlc2VudGEgdW5hIEZvcm0gYSBwYXJ0aXJlIGRhaSBzdW9pIEJhc2VGaWVsZC5cclxuICAgKiBAcGFyYW0gZm9ybUZpZWxkcyBMaXN0YSBkZWkgQmFzZUZpZWxkIGNoZSBjb21wb25nb25vIGxhIGZvcm0uXHJcbiAgICogQHBhcmFtIHJlY29yZCBPZ2dldHRvIGRpIHRpcG8gUmVjb3JkIGNoZSBjb250aWVuZSBpIHZhbG9yaSBkZWkgY2FtcGkuXHJcbiAgICogQHBhcmFtIG9ubHlWaWV3IFNlIFRSVUUgZGlzYWJpbGl0YSBsYSBmb3JtIHBlciByZW5kZXJsYSBpbiBzb2xhIGxldHR1cmEuXHJcbiAgICogQHBhcmFtIGluY2x1ZGVDdXJyZW50Rm9ybUluRmllbGQgU2UgVFJVRSBwb3BvbGEgbGEgcHJvcHJpZXTDoCBGb3JtRm9ybUdyb3VwIGFsbCdpbnRlcm5vIGRpIG9nbmkgQmFzZUZpZWxkIGNvbiBpbCBGb3JtR3JvdXAgY29ycmVudGUuXHJcbiAgICogQHJldHVybnMgUmVzdGl0dWlzY2UgdW4gRm9ybUdyb3VwIHJhcHByZXNlbnRhdGUgbGEgRm9ybSBhIGN1aSBhcHBhcnRlbmdvbm8gaSBCYXNlRmllbGQgcmljZXZ1dGkgaW4gaW5wdXQuXHJcbiAgICovXHJcbiAgcHVibGljIENyZWF0ZUZvcm1Gb3JtR3JvdXAoXHJcbiAgICBmb3JtRmllbGRzOiBBcnJheTxCYXNlRmllbGQ+LFxyXG4gICAgcmVjb3JkOiBSZWNvcmQsXHJcbiAgICBvbmx5VmlldyA9IGZhbHNlLFxyXG4gICAgaW5jbHVkZUN1cnJlbnRGb3JtSW5GaWVsZCA9IHRydWVcclxuICApOiBVbnR5cGVkRm9ybUdyb3VwIHtcclxuICAgIC8vIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImZvcm1GaWVsZHNcIiwgZm9ybUZpZWxkcyk7XHJcbiAgICAvLyAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJyZWNvcmRcIiwgcmVjb3JkKTtcclxuICAgIC8vIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIm9ubHlWaWV3XCIsIG9ubHlWaWV3KTtcclxuICAgIC8vIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImluY2x1ZGVDdXJyZW50Rm9ybUluRmllbGRcIiwgaW5jbHVkZUN1cnJlbnRGb3JtSW5GaWVsZCk7XHJcblxyXG4gICAgY29uc3QgZm9ybUZvcm06IFVudHlwZWRGb3JtR3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKFtdKTtcclxuXHJcbiAgICBmb3JtRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAvLyAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhmaWVsZCk7XHJcbiAgICAgIGZvcm1Gb3JtLmFkZENvbnRyb2woXHJcbiAgICAgICAgZmllbGQuTmFtZSxcclxuICAgICAgICB0aGlzLmNyZWF0ZUZpZWxkRm9ybUNvbnRyb2woZmllbGQsIHJlY29yZClcclxuICAgICAgKTtcclxuICAgICAgaWYgKGluY2x1ZGVDdXJyZW50Rm9ybUluRmllbGQpIHtcclxuICAgICAgICAvLyAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coZmllbGQpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgZmllbGQuRm9ybUZvcm1Hcm91cCA9IGZvcm1Gb3JtO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChvbmx5Vmlldykge1xyXG4gICAgICBmb3JtRm9ybS5kaXNhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcm1Gb3JtO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnVuemlvbmUgcGVyIGNyZWFyZSBlIGFnZ2l1bmdlcmUgYWwgRm9ybUdyb3VwIHJhcHByZXNlbnRhbnRlIGxhIGZvcm0gdW4gbnVvdm8gRm9ybUNvbnRyb2wgYSBwYXJ0aXJlIGRhIHVuIEZpZWxkLlxyXG4gICAqIEluIG51b3ZvIEZvcm1Db250cm9sIGF2csOgIGlsIG5vbWUgZGVsIGNhbXBvIHBhc3NhdG8gZSB2ZXJyYW5ubyBpbXBvc3RhdGkgaSBWYWxpZGF0b3JzIGluIGJhc2UgYWwgdGlwbyBkZWwgY2FtcG8gc3Rlc3NvLlxyXG4gICAqIEBwYXJhbSBmaWVsZCBCYXNlRmllbGQgcGVyIGN1aSBjcmVhcmUgaWwgRm9ybUNvbnRyb2wgZGEgaW5zZXJpcmUgbmVsIEZvcm1Hcm91cCBkZWxhIGZvcm0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWVsZEZvcm1Db250cm9sKFxyXG4gICAgZmllbGQ6IEJhc2VGaWVsZCxcclxuICAgIHJlY29yZDogUmVjb3JkXHJcbiAgKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgIGNvbnN0IHZhbGlkYXRvcnM6IEFycmF5PFZhbGlkYXRvckZuPiA9IFtdO1xyXG5cclxuICAgIGlmIChmaWVsZC5SZXF1aXJlZCkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKSB7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIGRpIHRlc3RvXCJdOlxyXG4gICAgICAgIGlmICgoZmllbGQgYXMgVGV4dEZpZWxkKS5NYXhMZW5naHQpIHtcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aCgoZmllbGQgYXMgVGV4dEZpZWxkKS5NYXhMZW5naHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKChmaWVsZCBhcyBUZXh0RmllbGQpLk1pbkxlbmdodCkge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKChmaWVsZCBhcyBUZXh0RmllbGQpLk1pbkxlbmdodCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKChmaWVsZCBhcyBUZXh0RmllbGQpLlRleHRNYXNrKSB7XHJcbiAgICAgICAgICBjYXNlIFRleHRNYXNrRW51bS5Vcmw6XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oVXJsUmVnZXgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFRleHRNYXNrRW51bS5FbWFpbDpcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMuZW1haWwpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLlRlbGVmb25vOlxyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKFRlbFJlZ2V4KSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQXJlYSBkaSB0ZXN0b1wiXTpcclxuICAgICAgICBpZiAoKGZpZWxkIGFzIFRleHRhcmVhRmllbGQpLk1heExlbmdodCkge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFxyXG4gICAgICAgICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCgoZmllbGQgYXMgVGV4dGFyZWFGaWVsZCkuTWF4TGVuZ2h0KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKChmaWVsZCBhcyBUZXh0YXJlYUZpZWxkKS5NaW5MZW5naHQpIHtcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChcclxuICAgICAgICAgICAgVmFsaWRhdG9ycy5taW5MZW5ndGgoKGZpZWxkIGFzIFRleHRhcmVhRmllbGQpLk1pbkxlbmdodClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW0uQWxsZWdhdG86XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bS5JbW1hZ2luZTpcclxuICAgICAgICBpZiAoZmllbGQuUmVxdWlyZWQpIHZhbGlkYXRvcnMucHVzaChBcnJheVZhbGlkYXRvcnMubWluTGVuZ2h0KDEpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiRWxlbmNvIGdlbmVyaWNvXCJdOlxyXG4gICAgICAgIGlmICgoZmllbGQgYXMgTGlzdFZhbHVlRmllbGQpLklzTXVsdGlDaG9pY2hlKVxyXG4gICAgICAgICAgaWYgKGZpZWxkLlJlcXVpcmVkKSB2YWxpZGF0b3JzLnB1c2goQXJyYXlWYWxpZGF0b3JzLm1pbkxlbmdodCgxKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wocmVjb3JkW2ZpZWxkLk5hbWVdLCB2YWxpZGF0b3JzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY29uZmlndXJhcmUgZ2xpIGVuZHBvaW50IGRhIHVzYXJlIGRpIGRlZmF1bHQgYSBwYXJ0aXJlIGRhbGwndXJsIGJhc2UgZGVsIHNlcnZlclxyXG4gICAqIGEgY3VpIHNpIGRldmUgY29ubmV0dGVyZSBlIGFsIHRva2VuIGRhIHBhc3NhcmUgcGVyIGF1dGVudGljYXJzaS5cclxuICAgKiBAcGFyYW0gYmFzZVNlcnZlclVybCBTdHJpbmdhIGRlbGwndXJsIGJhc2UgZGVsIHNlcnZlciAoZXM6IFwiaHR0cDovL2xvY2FsaG9zdDo1MDAwXCIpLlxyXG4gICAqIEBwYXJhbSB1c2VyVG9rZW4gVG9rZW4gZGVsbCd1dGVudGUgbG9nZ2F0byBkYSB1c2FyZSBwZXIgYXV0ZW50aWNhcnNpIHNlIG5lY2Vzc2FyaW8uXHJcbiAgICogQHJldHVybnMgUmVzaXR1aXNjZSBsYSBjb25maWd1cmF6aW9uZSBjb21wbGV0YSBkZWdsaSBlbmRQb2ludCBkYSB1c2FyZSBkaSBkZWZhdWx0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBDb25maWd1cmVEZWZhdWx0RW5kUG9pbnRzKFxyXG4gICAgYmFzZVNlcnZlclVybDogc3RyaW5nLFxyXG4gICAgdXNlclRva2VuOiBzdHJpbmdcclxuICApOiBFbmRQb2ludENvbmZpZ3VyYXRpb24ge1xyXG4gICAgbGV0IGVuZFBvaW50Q29uZmlndXJhdGlvbjogRW5kUG9pbnRDb25maWd1cmF0aW9uID1cclxuICAgICAgbmV3IEVuZFBvaW50Q29uZmlndXJhdGlvbihiYXNlU2VydmVyVXJsLCB1c2VyVG9rZW4pO1xyXG5cclxuICAgIC8vIGVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzID0ge1xyXG4gICAgLy8gICBHZXRCeUZvcm1JREVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL2dldGFsbFwiLFxyXG4gICAgLy8gICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAvLyAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uR0VULFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBHZXRBbGxCeUVudEFuZFVzZXJJREVuZFBvaW50OiB7XHJcbiAgICAvLyAgICAgVXJsOiBiYXNlU2VydmVyVXJsICsgXCIvYXBpL3YxL0dldEFsbEJ5VXNlcklEXCIsXHJcbiAgICAvLyAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgIC8vICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5HRVQsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIEdldEJ5SURFbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9nZXRCeUlEXCIsXHJcbiAgICAvLyAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgIC8vICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5HRVQsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIFNhdmVFbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9zYXZlXCIsXHJcbiAgICAvLyAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgIC8vICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5QT1NULFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBEdXBsaWNhdGVFbmRQb2ludDoge1xyXG4gICAgLy8gICAgIFVybDogYmFzZVNlcnZlclVybCArIFwiL2FwaS92MS9kdXBsaWNhdGVcIixcclxuICAgIC8vICAgICBUb2tlbjogdXNlclRva2VuLFxyXG4gICAgLy8gICAgIFJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2RFbnVtLkdFVCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgRGVsZXRlRW5kUG9pbnQ6IHtcclxuICAgIC8vICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvdjEvZGVsZXRlXCIsXHJcbiAgICAvLyAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgIC8vICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5ERUxFVEUsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyB9O1xyXG4gICAgLy8gZW5kUG9pbnRDb25maWd1cmF0aW9uLkZvcm1zID0ge1xyXG4gICAgLy8gICBHZXRCeUlERW5kUG9pbnQ6IHtcclxuICAgIC8vICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvY29uZi9mb3JtXCIsXHJcbiAgICAvLyAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgIC8vICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5HRVQsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIEdldEJ5SURBbmRWZXJzaW9uRW5kUG9pbnQ6IHtcclxuICAgIC8vICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvY29uZi9HZXRCeUlEQW5kVmVyc2lvblwiLFxyXG4gICAgLy8gICAgIFRva2VuOiB1c2VyVG9rZW4sXHJcbiAgICAvLyAgICAgUmVxdWVzdE1ldGhvZDogUmVxdWVzdE1ldGhvZEVudW0uR0VULFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBTYXZlRW5kUG9pbnQ6IHtcclxuICAgIC8vICAgICBVcmw6IGJhc2VTZXJ2ZXJVcmwgKyBcIi9hcGkvY29uZi9mb3JtXCIsXHJcbiAgICAvLyAgICAgVG9rZW46IHVzZXJUb2tlbixcclxuICAgIC8vICAgICBSZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kRW51bS5QT1NULFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gfTtcclxuICAgIHJldHVybiBlbmRQb2ludENvbmZpZ3VyYXRpb247XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gcHJlbmRlIHVuYSBzdHJpbmdhIGluIGlucHV0IGUgdmVyaWZpY2EgY2hlIG9nbmkgcGFyZW50ZXNpIGFwZXJ0YSB2ZW5nYSBhbmNoZSBjaGl1c2FcclxuICAgKiBAcmV0dXJucyB0cnVlIHNlIGxlIHBhcmVudGVzaSBzb25vIHBhcmkgZSBvZ25pIHBhcmVudGVzaSBjaGl1ZGUgc2Ugc3Rlc3NhLCBmYWxzZSBzZSBtYW5jYW5vIHBhcmVudGVzaSBvIG5vbiB2ZW5nb25vIGNoaXVzZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgc3RyaW5nQ2hlY2tQYXJlbnRlc2lzKGV4cHJlc3Npb24sIHJlcXVpcmVkID0gZmFsc2UpIHtcclxuICAgIGlmIChleHByZXNzaW9uID09IHVuZGVmaW5lZCB8fCBleHByZXNzaW9uID09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHJlcXVpcmVkID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgfVxyXG4gICAgbGV0IHN0YWNrID0gW107XHJcbiAgICBsZXQgY3VycmVudDtcclxuICAgIGNvbnN0IG1hdGNoTG9va3VwID0ge1xyXG4gICAgICBcIihcIjogXCIpXCIsXHJcbiAgICAgIFwiW1wiOiBcIl1cIixcclxuICAgICAgXCJ7XCI6IFwifVwiLFxyXG4gICAgfTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHJlc3Npb24ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY3VycmVudCA9IGV4cHJlc3Npb25baV07IC8vZWFzaWVyIHRoYW4gd3JpdGluZyBpdCBvdmVyIGFuZCBvdmVyXHJcblxyXG4gICAgICBpZiAoY3VycmVudCA9PT0gXCIoXCIgfHwgY3VycmVudCA9PT0gXCJbXCIgfHwgY3VycmVudCA9PT0gXCJ7XCIpIHtcclxuICAgICAgICBzdGFjay5wdXNoKGN1cnJlbnQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQgPT09IFwiKVwiIHx8IGN1cnJlbnQgPT09IFwiXVwiIHx8IGN1cnJlbnQgPT09IFwifVwiKSB7XHJcbiAgICAgICAgY29uc3QgbGFzdEJyYWNrZXQgPSBzdGFjay5wb3AoKTtcclxuXHJcbiAgICAgICAgaWYgKG1hdGNoTG9va3VwW2xhc3RCcmFja2V0XSAhPT0gY3VycmVudCkge1xyXG4gICAgICAgICAgLy9pZiB0aGUgc3RhY2sgaXMgZW1wdHksIC5wb3AoKSByZXR1cm5zIHVuZGVmaW5lZCwgc28gdGhpcyBleHByZXNzaW9uIGlzIHN0aWxsIGNvcnJlY3RcclxuXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vdGVybWluYXRlIGltbWVkaWF0ZWx5IC0gbm8gbmVlZCB0byBjb250aW51ZSBzY2FubmluZyB0aGUgc3RyaW5nXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0YWNrLmxlbmd0aCA9PT0gMDsgLy9hbnkgZWxlbWVudHMgbWVhbiBicmFja2V0cyBsZWZ0IG9wZW5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBjaGUgZGF0YSBsYSBjb25maWd1cmF6aW9uZSBkaSB1biBlbmRwb2ludCBjb3N0cnVpc2NlIGwndXJsIGRhIGNoaWFtYXJlLCBnbGkgZXZlbnR1YWxpIHBhcmFtZXRyaVxyXG4gICAqIGRhIHBhc3NhcmUgKG5lbCBib2R5IG8gbmVsbGEgcm90dGEpIGVkIGVmZmV0dHVhIGxhIGNoaWFtYXRhLiBBbCB0ZXJtaW5lIGRlbGxhIGNoaWFtYXRhIGVzZWd1ZSBsZSBldmVudHVhbGlcclxuICAgKiBmdW56aW9uaSBkaSBjYWxsYmFjayAoc2lhIGluIGNhc28gZGkgc3VjY2Vzc28gY2hlIGluIGNhc28gZGkgZXJyb3JlKSBwYXNzYXRlIGluIGlucHV0LlxyXG4gICAqIEBwYXJhbSBlbmRQb2ludERhdGEgQ29maWd1cmF6aW9uZSBkZWxsJ2VuZHBvaW50IGRhIGNoaWFtYXJlLlxyXG4gICAqIEBwYXJhbSBkeW5hbWljTW9kdWxlUGFyYW1zIEFycmF5IGRlaSBwYXJhbWV0cmkgYWdnaXVudGkgZGFsIG1vZHVsbyBkaW5hbWljbyBhIHF1ZWxsaSBnacOgIGNvbmZpZ3VyYXRpXHJcbiAgICogKGFkIGVzZW1waW8gaWwgcmVjb3JkIG8gbGEgZm9ybSBkYSBzYWx2YXJlIG9wcHVyZSBsJ0lEIHBlciByZWN1cGVyYXJlIHVuYSBwYXJ0aWNvbGFyZSBlbnRpdMOgKS5cclxuICAgKiBAcGFyYW0gY2FsbGJhY2sgTWV0b2RvIGRhIGVzZWd1aXJlIGluIGNhc28gZGkgc3VjY2Vzc28gZG9wbyBsYSBjaGlhbWF0YSBodHRwLlxyXG4gICAqIE5PVEE6IGluIGlucHV0IHZpZW5lIHBhc3NhdGEgbGEgcmlzcG9zdGEgZGVsbGEgY2hpYW1hdGEgc3Rlc3NhLlxyXG4gICAqIEBwYXJhbSBlcnJvckNhbGxCYWNrIE1ldG9kbyBkYSBlc2VndWlyZSBpbiBjYXNvIGRpIGVycm9yZSBkb3BvIGxhIGNoaWFtYXRhIGh0dHAuXHJcbiAgICogTk9UQTogaW4gaW5wdXQgdmllbmUgcGFzc2F0byBsJ2Vycm9yZSBnZW5lcmF0byBkZWxsYSBjaGlhbWF0YSBzdGVzc2EuXHJcbiAgICovXHJcbiAgcHVibGljIFJ1bkVuZFBvaW50Q2FsbChcclxuICAgIGVuZFBvaW50RGF0YTogRW5kUG9pbnREYXRhLFxyXG4gICAgZHluYW1pY01vZHVsZVBhcmFtczogQXJyYXk8RW5kUG9pbnREYXRhUGFyYW1zPiA9IG51bGwsXHJcbiAgICBjYWxsYmFjazogKGU6IEZvcm0gfCBSZWNvcmQgfCBBcnJheTxSZWNvcmQ+KSA9PiB2b2lkID0gbnVsbCxcclxuICAgIGVycm9yQ2FsbEJhY2s6IChlcnI6IHVua25vd24pID0+IHZvaWQgPSBudWxsXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmFkZFJlcXVlc3RDb3VudGVyKCk7XHJcblxyXG4gICAgbGV0IHVybCA9IGAke2VuZFBvaW50RGF0YS5Vcmx9YDtcclxuICAgIGxldCBxdWVyeVBhcmFtczogc3RyaW5nID0gbnVsbDtcclxuICAgIGNvbnN0IGJvZHlQYXJhbXMgPSB7XHJcbiAgICAgIEFkZGl0aW9uYWxQYXJhbXM6IHt9LFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyNyZWdpb24gbWVyZ2VQYXJhbVxyXG4gICAgLy8gdW5pc2NvIGkgZGF0aSBkaSBkZWZhdWx0IGRlZmluaXRpIG5lbGxhIGNvbmZpZ3VyYXppb25lIGRlbGxhIGNoaWFtYXRhIGNvbiBpIGRhdGkgY2hlIGltcG9zdG8gbmVsbGEgY2hpYW1hdGEgc3BlY2lmaWNhXHJcbiAgICBpZiAoZW5kUG9pbnREYXRhLlBhcmFtcyA9PSB1bmRlZmluZWQgfHwgZW5kUG9pbnREYXRhLlBhcmFtcyA9PSBudWxsKSB7XHJcbiAgICAgIGVuZFBvaW50RGF0YS5QYXJhbXMgPSBbXTtcclxuICAgIH1cclxuICAgIGlmIChkeW5hbWljTW9kdWxlUGFyYW1zID09IHVuZGVmaW5lZCB8fCBkeW5hbWljTW9kdWxlUGFyYW1zID09IG51bGwpIHtcclxuICAgICAgZHluYW1pY01vZHVsZVBhcmFtcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1lcmdlZFBhcmFtczogQXJyYXk8RW5kUG9pbnREYXRhUGFyYW1zPiA9IFsuLi5lbmRQb2ludERhdGEuUGFyYW1zXTtcclxuXHJcbiAgICBkeW5hbWljTW9kdWxlUGFyYW1zLmZvckVhY2goKG9iaikgPT4ge1xyXG4gICAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gbWVyZ2VkUGFyYW1zLmZpbmRJbmRleChcclxuICAgICAgICAoaXRlbSkgPT4gaXRlbS5QYXJhbU5hbWUgPT09IG9iai5QYXJhbU5hbWVcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIG1lcmdlZFBhcmFtc1tleGlzdGluZ0luZGV4XS5QYXJhbVZhbHVlID0gb2JqLlBhcmFtVmFsdWU7XHJcbiAgICAgICAgbWVyZ2VkUGFyYW1zW2V4aXN0aW5nSW5kZXhdLlBhcmFtVHlwZSA9IG9iai5QYXJhbVR5cGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbWVyZ2VkUGFyYW1zLnB1c2gob2JqKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKG1lcmdlZFBhcmFtcykge1xyXG4gICAgICBtZXJnZWRQYXJhbXMuZm9yRWFjaCgocGFyYW0pID0+IHtcclxuICAgICAgICBzd2l0Y2ggKHBhcmFtLlBhcmFtVHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl06IHtcclxuICAgICAgICAgICAgY29uc3Qgc3RyaW5nUGFyYW06IHN0cmluZyA9XHJcbiAgICAgICAgICAgICAgcGFyYW0uUGFyYW1OYW1lICsgXCI9XCIgKyBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgICAgICAgICBxdWVyeVBhcmFtcyA9XHJcbiAgICAgICAgICAgICAgKHF1ZXJ5UGFyYW1zID09IG51bGwgPyBcIlwiIDogcXVlcnlQYXJhbXMgKyBcIiZcIikgKyBzdHJpbmdQYXJhbTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bXCJJbiByb3V0ZVwiXToge1xyXG4gICAgICAgICAgICB1cmwgPSB1cmwgKyAodXJsLmVuZHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIikgKyBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVtcIkluIEJvZHlcIl06IHtcclxuICAgICAgICAgICAgYm9keVBhcmFtc1twYXJhbS5QYXJhbU5hbWVdID0gcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvbiBtZXJnZVBhcmFtXHJcblxyXG4gICAgLy8jcmVnaW9uIGFkZERlZmF1bHRQYXJhbXNcclxuICAgIC8vIFNlIG5lbGxhIGNvbmZpZ3VyYXppb25lIHNvbm8gc3RhdGkgZGVmaW5pdGkgcGFyYW1ldHJpIGRhIGFnZ2l1bmdlcmUgYWxsYSBjaGlhbWF0YSBxdWVzdGkgdmVuZ29ubyBjaWNsYXRpXHJcbiAgICAvLyBlIGFnZ2l1bnRpIG5lbCBwdW50byBpbiBjdWkgZGV2b25vIGVzc2VyZSB1c2F0aS5cclxuICAgIC8vIGlmIChlbmRQb2ludERhdGEuUGFyYW1zKSB7XHJcbiAgICAvLyAgICAgZW5kUG9pbnREYXRhLlBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcclxuICAgIC8vICAgICAgICAgc3dpdGNoIChwYXJhbS5QYXJhbVR5cGUpIHtcclxuICAgIC8vICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnUXVlcnkgcGFyYW0nXToge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ1BhcmFtOiBzdHJpbmcgPSBwYXJhbS5QYXJhbU5hbWUgKyBcIj1cIiArIHBhcmFtLlBhcmFtVmFsdWU7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgPT0gbnVsbCA/IFwiXCIgOiBxdWVyeVBhcmFtcyArIFwiJlwiKSArIHN0cmluZ1BhcmFtO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydJbiByb3V0ZSddOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgKHVybC5lbmRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCIpICsgcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIGNhc2UgUGFyYW1UeXBlRW51bVsnSW4gQm9keSddOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYm9keVBhcmFtcy5BZGRpdGlvbmFsUGFyYW1zW3BhcmFtLlBhcmFtTmFtZV0gPSBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyB9XHJcbiAgICAvLyNlbmRyZWdpb24gYWRkRGVmYXVsdFBhcmFtc1xyXG5cclxuICAgIC8vI3JlZ2lvbiBhZGRTcGVjaWZpY1BhcmFtc1xyXG4gICAgLy8gU2Ugc29ubyBzdGF0aSBwYXNzYXRpIHBhcmFtZXRyaSBkYSBhZ2dpdW5nZXJlIGFsbGEgY2hpYW1hdGEgZGVmaW5pdGkgYWxsJ2ludGVybm8gZGVsIG1vZHVsbyBkaW5hbWljb1xyXG4gICAgLy8gdmVuZ29ubyBjaWNsYXRpIGUgYWdnaXVudGkgbmVsIHB1bnRvIGluIGN1aSBkZXZvbm8gZXNzZXJlIHVzYXRpIGRvcG8gcXVlbGxpIGRlZmluaXRpIG5lbGxhIGNvbmZpZ3VyYXppb25lLlxyXG4gICAgLy8gaWYgKGR5bmFtaWNNb2R1bGVQYXJhbXMpIHtcclxuICAgIC8vICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgLy8gICAgICAgICBzd2l0Y2ggKHBhcmFtLlBhcmFtVHlwZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydRdWVyeSBwYXJhbSddOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nUGFyYW06IHN0cmluZyA9IHBhcmFtLlBhcmFtTmFtZSArIFwiPVwiICsgcGFyYW0uUGFyYW1WYWx1ZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcyA9IChxdWVyeVBhcmFtcyA9PSBudWxsID8gXCJcIiA6IHF1ZXJ5UGFyYW1zICsgXCImXCIpICsgc3RyaW5nUGFyYW07XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBjYXNlIFBhcmFtVHlwZUVudW1bJ0luIHJvdXRlJ106IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAodXJsLmVuZHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIikgKyBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgY2FzZSBQYXJhbVR5cGVFbnVtWydJbiBCb2R5J106IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBib2R5UGFyYW1zW3BhcmFtLlBhcmFtTmFtZV0gPSBwYXJhbS5QYXJhbVZhbHVlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfSlcclxuICAgIC8vIH1cclxuICAgIC8vI2VuZHJlZ2lvbiBhZGRTcGVjaWZpY1BhcmFtc1xyXG5cclxuICAgIGlmIChxdWVyeVBhcmFtcyAhPSBudWxsKSB7XHJcbiAgICAgIHVybCA9XHJcbiAgICAgICAgKHVybC5lbmRzV2l0aChcIi9cIikgPyB1cmwuc3Vic3RyaW5nKDAsIHVybC5sZW5ndGggLSAxKSA6IHVybCkgK1xyXG4gICAgICAgIFwiP1wiICtcclxuICAgICAgICBxdWVyeVBhcmFtcztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmh0dHBcclxuICAgICAgLnJlcXVlc3QoZW5kUG9pbnREYXRhLlJlcXVlc3RNZXRob2QsIHVybCwge1xyXG4gICAgICAgIGhlYWRlcnM6IGVuZFBvaW50RGF0YS5Ub2tlblxyXG4gICAgICAgICAgPyB7IEF1dGhvcml6YXRpb246IGVuZFBvaW50RGF0YS5Ub2tlbiB9XHJcbiAgICAgICAgICA6IG51bGwsXHJcbiAgICAgICAgYm9keTogIVtSZXF1ZXN0TWV0aG9kRW51bS5ERUxFVEUsIFJlcXVlc3RNZXRob2RFbnVtLkdFVF0uaW5jbHVkZXMoXHJcbiAgICAgICAgICBlbmRQb2ludERhdGEuUmVxdWVzdE1ldGhvZFxyXG4gICAgICAgIClcclxuICAgICAgICAgID8gYm9keVBhcmFtc1xyXG4gICAgICAgICAgOiBudWxsLFxyXG4gICAgICB9KVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZXM6IEZvcm0gfCBSZWNvcmQgfCBBcnJheTxSZWNvcmQ+KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnJlbW92ZVJlcXVlc3RDb3VudGVyKCk7XHJcbiAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgY2FsbGJhY2socmVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5yZW1vdmVSZXF1ZXN0Q291bnRlcigpO1xyXG4gICAgICAgICAgaWYgKGVycm9yQ2FsbEJhY2spIHtcclxuICAgICAgICAgICAgZXJyb3JDYWxsQmFjayhlcnJvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBFcXBEeW5hbWljTW9kdWxlRGlhbG9nU2VydmljZS5FcnJvcihlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIlJ1bkVuZFBvaW50Q2FsbCAtIHN1YnNjcmliZSAtIGVuZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gIH1cclxufVxyXG4iXX0=