@churchillliving/se-ui-toolkit 6.54.211 → 6.54.213

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 (41) hide show
  1. package/esm2022/lib/components/base/form/form.component.mjs +129 -131
  2. package/esm2022/lib/components/shared/controls/Input-switch-control/Input-switch-control.component.mjs +26 -0
  3. package/esm2022/lib/components/shared/controls/add-button-control/add-button-control.component.mjs +25 -0
  4. package/esm2022/lib/components/shared/controls/autocomplete-control/autocomplete.component.mjs +44 -0
  5. package/esm2022/lib/components/shared/controls/calendar-control/calendar-control.component.mjs +54 -0
  6. package/esm2022/lib/components/shared/controls/checkbox-control/checkbox-control.component.mjs +3 -3
  7. package/esm2022/lib/components/shared/controls/dropdown-control/dropdown-control.component.mjs +44 -0
  8. package/esm2022/lib/components/shared/controls/hyperlink-control/hyperlink-control.component.mjs +48 -0
  9. package/esm2022/lib/components/shared/controls/label-control/label-control.component.mjs +52 -0
  10. package/esm2022/lib/components/shared/controls/lookup-control/lookup-control.component.mjs +42 -0
  11. package/esm2022/lib/components/shared/controls/multiselect-control/multiselect-control.component.mjs +52 -0
  12. package/esm2022/lib/components/shared/controls/note-detail-control/note-detail-control.component.mjs +24 -0
  13. package/esm2022/lib/components/shared/controls/numeric-input-control/numeric-input.component.mjs +3 -3
  14. package/esm2022/lib/components/shared/controls/password-control/password-control.component.mjs +38 -0
  15. package/esm2022/lib/components/shared/controls/section-header-control/section-header-control.component.mjs +16 -0
  16. package/esm2022/lib/components/shared/controls/select-button-control/select-button-control.component.mjs +35 -0
  17. package/esm2022/lib/components/shared/controls/spacer-control/spacer-control.component.mjs +16 -0
  18. package/esm2022/lib/components/shared/controls/text-input-control/text-input.component.mjs +3 -3
  19. package/esm2022/lib/components/shared/controls/textArea-control/textArea-control.component.mjs +38 -0
  20. package/esm2022/lib/se-ui-toolkit.module.mjs +46 -1
  21. package/esm2022/lib/services/hyperlink.service.mjs +2 -2
  22. package/fesm2022/churchillliving-se-ui-toolkit.mjs +677 -167
  23. package/fesm2022/churchillliving-se-ui-toolkit.mjs.map +1 -1
  24. package/lib/components/base/form/form.component.d.ts +6 -13
  25. package/lib/components/shared/controls/Input-switch-control/Input-switch-control.component.d.ts +11 -0
  26. package/lib/components/shared/controls/add-button-control/add-button-control.component.d.ts +11 -0
  27. package/lib/components/shared/controls/autocomplete-control/autocomplete.component.d.ts +17 -0
  28. package/lib/components/shared/controls/calendar-control/calendar-control.component.d.ts +21 -0
  29. package/lib/components/shared/controls/dropdown-control/dropdown-control.component.d.ts +17 -0
  30. package/lib/components/shared/controls/hyperlink-control/hyperlink-control.component.d.ts +22 -0
  31. package/lib/components/shared/controls/label-control/label-control.component.d.ts +21 -0
  32. package/lib/components/shared/controls/lookup-control/lookup-control.component.d.ts +16 -0
  33. package/lib/components/shared/controls/multiselect-control/multiselect-control.component.d.ts +14 -0
  34. package/lib/components/shared/controls/note-detail-control/note-detail-control.component.d.ts +11 -0
  35. package/lib/components/shared/controls/password-control/password-control.component.d.ts +15 -0
  36. package/lib/components/shared/controls/section-header-control/section-header-control.component.d.ts +9 -0
  37. package/lib/components/shared/controls/select-button-control/select-button-control.component.d.ts +14 -0
  38. package/lib/components/shared/controls/spacer-control/spacer-control.component.d.ts +9 -0
  39. package/lib/components/shared/controls/textArea-control/textArea-control.component.d.ts +15 -0
  40. package/lib/se-ui-toolkit.module.d.ts +72 -57
  41. package/package.json +1 -1
@@ -11,45 +11,50 @@ import * as i0 from "@angular/core";
11
11
  import * as i1 from "../../../services/authentication.service";
12
12
  import * as i2 from "../../../services/form.service";
13
13
  import * as i3 from "../../../services/alert.service";
14
- import * as i4 from "@angular/platform-browser";
15
- import * as i5 from "primeng/dynamicdialog";
16
- import * as i6 from "../../../services/hyperlink.service";
17
- import * as i7 from "@angular/router";
18
- import * as i8 from "@angular/common";
19
- import * as i9 from "../../../services/grid.service";
20
- import * as i10 from "../../../services/page-logger.service";
21
- import * as i11 from "primeng/api";
22
- import * as i12 from "primeng/multiselect";
23
- import * as i13 from "@angular/forms";
24
- import * as i14 from "primeng/dropdown";
25
- import * as i15 from "primeng/calendar";
26
- import * as i16 from "primeng/button";
27
- import * as i17 from "primeng/progressspinner";
28
- import * as i18 from "primeng/inputtext";
29
- import * as i19 from "primeng/inputtextarea";
30
- import * as i20 from "primeng/selectbutton";
31
- import * as i21 from "primeng/autocomplete";
32
- import * as i22 from "primeng/accordion";
33
- import * as i23 from "primeng/confirmdialog";
34
- import * as i24 from "primeng/inputswitch";
35
- import * as i25 from "primeng/overlaypanel";
36
- import * as i26 from "../../shared/controls/text-input-control/text-input.component";
37
- import * as i27 from "../../shared/controls/numeric-input-control/numeric-input.component";
38
- import * as i28 from "../../shared/controls/checkbox-control/checkbox-control.component";
39
- import * as i29 from "../file-upload/file-upload.component";
40
- import * as i30 from "../cards/card.component";
41
- import * as i31 from "../report/reportGenerateBtn/generate-report-btn/generate-report-btn.component";
14
+ import * as i4 from "primeng/dynamicdialog";
15
+ import * as i5 from "../../../services/hyperlink.service";
16
+ import * as i6 from "@angular/router";
17
+ import * as i7 from "@angular/common";
18
+ import * as i8 from "../../../services/grid.service";
19
+ import * as i9 from "../../../services/page-logger.service";
20
+ import * as i10 from "primeng/api";
21
+ import * as i11 from "@angular/forms";
22
+ import * as i12 from "primeng/button";
23
+ import * as i13 from "primeng/progressspinner";
24
+ import * as i14 from "primeng/accordion";
25
+ import * as i15 from "primeng/confirmdialog";
26
+ import * as i16 from "primeng/overlaypanel";
27
+ import * as i17 from "../../shared/controls/text-input-control/text-input.component";
28
+ import * as i18 from "../../shared/controls/numeric-input-control/numeric-input.component";
29
+ import * as i19 from "../../shared/controls/checkbox-control/checkbox-control.component";
30
+ import * as i20 from "../../shared/controls/password-control/password-control.component";
31
+ import * as i21 from "../../shared/controls/spacer-control/spacer-control.component";
32
+ import * as i22 from "../../shared/controls/textArea-control/textArea-control.component";
33
+ import * as i23 from "../../shared/controls/calendar-control/calendar-control.component";
34
+ import * as i24 from "../../shared/controls/dropdown-control/dropdown-control.component";
35
+ import * as i25 from "../../shared/controls/autocomplete-control/autocomplete.component";
36
+ import * as i26 from "../../shared/controls/multiselect-control/multiselect-control.component";
37
+ import * as i27 from "../../shared/controls/hyperlink-control/hyperlink-control.component";
38
+ import * as i28 from "../../shared/controls/lookup-control/lookup-control.component";
39
+ import * as i29 from "../../shared/controls/select-button-control/select-button-control.component";
40
+ import * as i30 from "../../shared/controls/note-detail-control/note-detail-control.component";
41
+ import * as i31 from "../../shared/controls/section-header-control/section-header-control.component";
42
+ import * as i32 from "../../shared/controls/add-button-control/add-button-control.component";
43
+ import * as i33 from "../../shared/controls/Input-switch-control/Input-switch-control.component";
44
+ import * as i34 from "../../shared/controls/label-control/label-control.component";
45
+ import * as i35 from "../file-upload/file-upload.component";
46
+ import * as i36 from "../cards/card.component";
47
+ import * as i37 from "../report/reportGenerateBtn/generate-report-btn/generate-report-btn.component";
42
48
  export class FormComponent {
43
49
  set activeTestMode(val) {
44
50
  if (val === true) {
45
51
  debugger;
46
52
  }
47
53
  }
48
- constructor(authService, formService, alertService, sanitizer, dialogService, componentFactoryResolver, hyperlinkService, cdr, router, el, datePipe, gridService, pageLoggerService, renderer2, ngZone) {
54
+ constructor(authService, formService, alertService, dialogService, componentFactoryResolver, hyperlinkService, cdr, router, el, datePipe, gridService, pageLoggerService, renderer2, ngZone) {
49
55
  this.authService = authService;
50
56
  this.formService = formService;
51
57
  this.alertService = alertService;
52
- this.sanitizer = sanitizer;
53
58
  this.dialogService = dialogService;
54
59
  this.componentFactoryResolver = componentFactoryResolver;
55
60
  this.hyperlinkService = hyperlinkService;
@@ -109,6 +114,11 @@ export class FormComponent {
109
114
  let formValues = { ...this.form };
110
115
  formValues.formSections?.forEach((formSection) => {
111
116
  if (formSection.fields) {
117
+ if (formSection.headerFields?.length > 0) {
118
+ formSection.headerFields.forEach((headerField) => {
119
+ this.checkFieldRequired(headerField);
120
+ });
121
+ }
112
122
  formSection.fields.forEach((field) => {
113
123
  this.checkFieldRequired(field);
114
124
  if (field.isPassword) {
@@ -589,7 +599,8 @@ export class FormComponent {
589
599
  /**
590
600
  * open Dialog in hyperlink Control
591
601
  */
592
- hyperlinkDialog(formField, event) {
602
+ hyperlinkDialog(event) {
603
+ let formField = event.formField;
593
604
  if (formField.hyperlink?.target === EHyperlink.BLANK) {
594
605
  var value = formField.hyperlink.params;
595
606
  window.open('hyperlink' + formField.label);
@@ -601,7 +612,7 @@ export class FormComponent {
601
612
  }
602
613
  else if (formField.hyperlink?.target === EHyperlink.DIALOG) {
603
614
  this.onClickEvent(formField);
604
- if ((event && event.ctrlKey && formField.hyperlink.component) || formField.openInNewTab) {
615
+ if ((event && event.event.ctrlKey && formField.hyperlink.component) || formField.openInNewTab) {
605
616
  this.hyperlinkService.openDialogInNewTab(formField.hyperlink.component, formField.hyperlink?.params);
606
617
  }
607
618
  else {
@@ -705,54 +716,65 @@ export class FormComponent {
705
716
  this.showfileUploadError = false;
706
717
  }
707
718
  }
708
- onSaveForm() {
709
- let validity = true;
719
+ checkFieldsValitions(fields) {
710
720
  let errorMessageDetails = '';
711
- this.formService.fieldFocusedOut = false;
712
- this.gridService.columnFocusedOut = false;
713
- let muliSelectValue = {};
714
- this.form.formSections?.forEach((formSection) => {
715
- if (formSection.fields) {
716
- if (!this.formService.checkValidity(formSection.fields)) {
717
- formSection.fields?.forEach((formField) => {
718
- if (formField.errorMessage) {
719
- errorMessageDetails = errorMessageDetails
720
- ? errorMessageDetails + ' , ' + formField.errorMessage
721
- : formField.errorMessage;
722
- }
723
- });
724
- let field = formSection.fields.some((field) => field.requiredField && field.errorMessage && !field.value);
725
- if (validity && field) {
726
- this.alertService.error(errorMessageDetails, 5000, 'REQUIRED FIELD');
727
- }
728
- else {
729
- this.alertService.error(errorMessageDetails, 5000, 'INVALID FIELD');
721
+ let validity = true;
722
+ if (fields) {
723
+ if (!this.formService.checkValidity(fields)) {
724
+ fields?.forEach((formField) => {
725
+ if (formField.errorMessage) {
726
+ errorMessageDetails = errorMessageDetails
727
+ ? errorMessageDetails + ' , ' + formField.errorMessage
728
+ : formField.errorMessage;
730
729
  }
731
- validity = false;
730
+ });
731
+ let field = fields.some((field) => field.requiredField && field.errorMessage && !field.value);
732
+ if (validity && field) {
733
+ this.alertService.error(errorMessageDetails, 5000, 'REQUIRED FIELD');
732
734
  }
733
- formSection.fields.forEach((field) => {
734
- // set uploadFile URL in FormField in case of FILE_UPLOAD
735
- if (field.control === EFormControl.FILE_UPLOAD) {
736
- field.value = this.fileUploadUrls;
737
- if (field.validations && field.validations.length > 0) {
738
- field.validations.forEach((x) => {
739
- if (x.type === EValidator.REQUIRED && !field.value) {
740
- this.showfileUploadError = true;
741
- }
742
- });
743
- }
744
- }
745
- if (field.control === EFormControl.CARD) {
746
- if (field.card && field.card.data?.length > 0) {
747
- let selectedData = field.card.data.filter((x) => x.selectedCard && x.selectedCard.length > 0);
748
- if (selectedData && selectedData.length > 0) {
749
- field.card.data = selectedData;
735
+ else {
736
+ this.alertService.error(errorMessageDetails, 5000, 'INVALID FIELD');
737
+ }
738
+ validity = false;
739
+ }
740
+ fields.forEach((field) => {
741
+ // set uploadFile URL in FormField in case of FILE_UPLOAD
742
+ if (field.control === EFormControl.FILE_UPLOAD) {
743
+ field.value = this.fileUploadUrls;
744
+ if (field.validations && field.validations.length > 0) {
745
+ field.validations.forEach((x) => {
746
+ if (x.type === EValidator.REQUIRED && !field.value) {
747
+ this.showfileUploadError = true;
750
748
  }
749
+ });
750
+ }
751
+ }
752
+ if (field.control === EFormControl.CARD) {
753
+ if (field.card && field.card.data?.length > 0) {
754
+ let selectedData = field.card.data.filter((x) => x.selectedCard && x.selectedCard.length > 0);
755
+ if (selectedData && selectedData.length > 0) {
756
+ field.card.data = selectedData;
751
757
  }
752
758
  }
753
- });
759
+ }
760
+ });
761
+ }
762
+ return validity;
763
+ }
764
+ onSaveForm() {
765
+ let validity = true;
766
+ this.formService.fieldFocusedOut = false;
767
+ this.gridService.columnFocusedOut = false;
768
+ let muliSelectValue = {};
769
+ this.form.formSections?.forEach((formSection) => {
770
+ if (formSection.fields?.length > 0) {
771
+ validity = this.checkFieldsValitions(formSection.fields);
772
+ }
773
+ if (formSection.headerFields?.length > 0) {
774
+ validity = this.checkFieldsValitions(formSection.headerFields);
754
775
  }
755
776
  });
777
+ console.log('this.form.formSections:', this.form);
756
778
  if (validity) {
757
779
  // Save grid on formSave Button
758
780
  let customComponent = false;
@@ -1078,7 +1100,7 @@ export class FormComponent {
1078
1100
  const formFieldValue = typeof formField.value === 'object'
1079
1101
  ? formField.value.text
1080
1102
  : formField.value;
1081
- value = typeof value === 'object' ? value.text : value;
1103
+ value = typeof value === 'object' ? value?.text : value;
1082
1104
  if (formFieldValue !== value) {
1083
1105
  this.browserTabCloseEvent(true);
1084
1106
  if (formField.onChange) {
@@ -1100,26 +1122,6 @@ export class FormComponent {
1100
1122
  this.selectLookupField(formField);
1101
1123
  }
1102
1124
  }
1103
- setMultiSelectClass(formField) {
1104
- let multiSelectClass = '';
1105
- if (formField.errorMessage) {
1106
- if (formField.value && formField.value?.length > 2) {
1107
- multiSelectClass = 'ng-invalid ng-dirty wrap-chips';
1108
- }
1109
- else {
1110
- multiSelectClass = 'ng-invalid ng-dirty';
1111
- }
1112
- }
1113
- else {
1114
- if (formField.value && formField.value?.length > 2) {
1115
- multiSelectClass = 'form-control wrap-chips';
1116
- }
1117
- else {
1118
- multiSelectClass = 'form-control ng-dirty';
1119
- }
1120
- }
1121
- return multiSelectClass;
1122
- }
1123
1125
  /**
1124
1126
  * set Calendar Date Format && set Date Minute interval
1125
1127
  */
@@ -1191,9 +1193,10 @@ export class FormComponent {
1191
1193
  else
1192
1194
  return '';
1193
1195
  }
1194
- autoSearch(event, formField) {
1195
- if (formField && event) {
1196
- formField.onReturn(event.query, formField);
1196
+ autoSearch(event) {
1197
+ let formField = event.formField;
1198
+ if (formField && event && event.event) {
1199
+ formField.onReturn(event.event.query, formField);
1197
1200
  }
1198
1201
  }
1199
1202
  /**
@@ -1230,11 +1233,12 @@ export class FormComponent {
1230
1233
  /**
1231
1234
  * clear the dropdown value when click on x
1232
1235
  */
1233
- onClearValue(formField, event) {
1236
+ onClearValue(event) {
1234
1237
  // this.formService.checkValidity([formField]);
1238
+ let formField = event.formField;
1235
1239
  this.onChangeEvent(formField);
1236
1240
  this.dropDownChangeEvent.emit(formField);
1237
- if (!event.value) {
1241
+ if (!event.event.value) {
1238
1242
  this.onFocusOutEvent(formField);
1239
1243
  }
1240
1244
  }
@@ -1253,16 +1257,6 @@ export class FormComponent {
1253
1257
  typeOf(value) {
1254
1258
  return typeof value;
1255
1259
  }
1256
- /**
1257
- * convert unSafe link into safe link
1258
- */
1259
- sanitizeUrl(url) {
1260
- let linkUrl = url;
1261
- if (linkUrl) {
1262
- linkUrl = this.sanitizer.bypassSecurityTrustUrl(linkUrl);
1263
- }
1264
- return linkUrl;
1265
- }
1266
1260
  /**
1267
1261
  * invoke on dynamic buttons click
1268
1262
  */
@@ -1351,44 +1345,48 @@ export class FormComponent {
1351
1345
  isValidColumn(col) {
1352
1346
  return Number.isInteger(col) && col > 0 && col <= 12;
1353
1347
  }
1354
- async addDynamicPanelOverlayComponent(hoverData, overlayPanel, event) {
1348
+ async addDynamicPanelOverlayComponent(event) {
1349
+ let hoverData = event?.hoverData;
1350
+ let overlayPanel = event?.overlayPanel;
1355
1351
  this.ngZone.onStable.pipe(take(1)).subscribe(() => {
1356
- const data = { ...hoverData.data };
1357
- const dataKeys = Object.keys(hoverData.data);
1358
- if (dataKeys?.length > 0) {
1359
- dataKeys.forEach(key => {
1360
- var value = data[key];
1361
- if (value?.toString()?.includes('{') && value?.toString()?.includes('}')) {
1362
- var valueToFind = value.replace('{', '').replace('}', '');
1363
- data[key] = utilities.getFormFieldValue(this.form, valueToFind);
1364
- }
1365
- else if (!value) {
1366
- var matchedKeyValue = utilities.getFormFieldValue(this.form, key);
1367
- data[key] = matchedKeyValue;
1368
- }
1369
- });
1352
+ const data = { ...hoverData?.data };
1353
+ if (Object?.keys(data)?.length > 0) {
1354
+ const dataKeys = Object?.keys(hoverData?.data);
1355
+ if (dataKeys?.length > 0) {
1356
+ dataKeys.forEach(key => {
1357
+ var value = data[key];
1358
+ if (value?.toString()?.includes('{') && value?.toString()?.includes('}')) {
1359
+ var valueToFind = value.replace('{', '').replace('}', '');
1360
+ data[key] = utilities.getFormFieldValue(this.form, valueToFind);
1361
+ }
1362
+ else if (!value) {
1363
+ var matchedKeyValue = utilities.getFormFieldValue(this.form, key);
1364
+ data[key] = matchedKeyValue;
1365
+ }
1366
+ });
1367
+ }
1370
1368
  }
1371
1369
  hoverData?.style ? (this.overlayPanelStyle = hoverData.style) : '';
1372
1370
  this.panelOverlayViewContainer.clear();
1373
- const componentRef = this.panelOverlayViewContainer?.createComponent(hoverData.component);
1371
+ const componentRef = this.panelOverlayViewContainer?.createComponent(hoverData?.component);
1374
1372
  console.log(componentRef);
1375
1373
  if (hoverData.data) {
1376
1374
  componentRef.instance.config = [];
1377
1375
  componentRef.instance.config.data = data;
1378
1376
  }
1379
- overlayPanel.show(event);
1377
+ overlayPanel.show(event?.event);
1380
1378
  });
1381
1379
  }
1382
1380
  mouseLeaveEvent(overlayPanel) {
1383
- overlayPanel.hide();
1381
+ overlayPanel?.hide();
1384
1382
  }
1385
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormComponent, deps: [{ token: i1.AuthenticationService }, { token: i2.FormService }, { token: i3.AlertService }, { token: i4.DomSanitizer }, { token: i5.DialogService }, { token: i0.ComponentFactoryResolver }, { token: i6.HyperlinkService }, { token: i0.ChangeDetectorRef }, { token: i7.Router }, { token: i0.ElementRef }, { token: i8.DatePipe }, { token: i9.GridService }, { token: i10.PageLoggerService }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
1386
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: FormComponent, selector: "se-form", inputs: { stickyActions: "stickyActions", form: "form", saveButtonLabel: "saveButtonLabel", cancelButtonLabel: "cancelButtonLabel", hideSaveButton: "hideSaveButton", hideCancelButton: "hideCancelButton", formButtons: "formButtons", loading: "loading", activeTestMode: "activeTestMode" }, outputs: { saveForm: "saveForm", cancelForm: "cancelForm", dropDownChangeEvent: "dropDownChangeEvent", sectionClickedEvent: "sectionClickedEvent" }, host: { listeners: { "window:beforeunload": "beforeunloadHandler($event)" } }, viewQueries: [{ propertyName: "panelOverlayViewContainer", first: true, predicate: ["viewContainerRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "dynamicComponentContainer", predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div>\n<form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\" class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\" >\n <label class=\"mr-3 custom-link\" data-title-element=\"self\" [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\" (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div *ngFor=\"let headerField of formSection.headerFields\">\n <span [ngSwitch]=\"headerField.control\">\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent\"></input-control>\n </span>\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n </span>\n \n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\"> \n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n <!-- labelControl Hyperlink on lookup Control Field-->\n <div *ngIf=\"formField.label?.labelControl\" class=\"toFrontForTooltip\"\n (mouseenter)=\"(formField.label.labelControl.hoverData && formField.label.labelControl.hoverData.component) && addDynamicPanelOverlayComponent(formField.label.labelControl.hoverData, overlayPanel, $event)\"\n (mouseleave)=\"(formField.label.labelControl.hoverData && formField.label.labelControl.hoverData.component) && mouseLeaveEvent(overlayPanel)\"\n >\n <div class=\"link-label custom-link\"\n *ngIf=\"!formField.label.labelControl.hyperlink && !formField.label.labelControl.lookupControl && formField.label.labelControl.hoverData\">\n <span [class]=\"formField.disabledText ? 'disable-label-control' : '' \"><ng-container *ngTemplateOutlet=\"labelDisplay\"></ng-container>\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span></span> \n </div>\n <div class=\"link-label custom-link\"\n *ngIf=\"formField.label?.labelControl.hyperlink && formField.label?.labelControl.hyperlink.target !== '_iframe'\">\n <a tabindex=\"-1\" (click)=\"formField.onClick ? onClickEvent(formField) : '' \"\n [target]=\"formField.label.labelControl?.hyperlink?.target\"\n [class]=\"formField.disabledText ? 'disable-label-control' : '' \"\n [href]=\"formField.label.labelControl?.hyperlink?.link\" data-title-element=\"self\">\n <ng-container *ngTemplateOutlet=\"labelDisplay\"></ng-container>\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </a>\n </div>\n <div class=\"link-label custom-link\"\n *ngIf=\"formField.label?.labelControl.hyperlink && formField.label?.labelControl.hyperlink.target === '_iframe'\">\n <a tabindex=\"-1\" (click)=\"loadLabelControlIFrame(formField)\" \n data-title-element=\"self\">\n <ng-container *ngTemplateOutlet=\"labelDisplay\"></ng-container>\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </a>\n </div>\n <!-- labelControl on addTextbox, calendar -->\n <div class=\"link-label custom-link\"\n *ngIf=\"formField.label && formField.label.labelControl && formField.label.labelControl.lookupControl\">\n <a tabindex=\"-1\" [class]=\"formField.label.disabled ? 'disable-label-control' : ''\"\n (click)=\"selectLookupLabel(formField, $event)\" data-title-element=\"self\">\n <ng-container *ngTemplateOutlet=\"labelDisplay\"></ng-container>\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </a>\n </div>\n </div>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.SPACER\">\n <span [class]=\"formField.column? 'col-' +formField.column : ''\"></span>\n </div>\n </span>\n\n <!-- Input TextArea -->\n <span *ngIf=\"!formField.hidden\">\n\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <label [class]=\"formField.label.onClick ? 'custom-link' : ''\" (click)=\"\n formField.label.onClick && formField.label.onClick()\n \" data-title-element=\"self\">\n {{\n formField.label.labelControl\n ? ''\n : formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <textarea data-title-element=\"self\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" pInputTextarea [rows]=\"formField.row ? formField.row : 1 \"\n (change)=\"onChangeEvent(formField)\" (click)=\"handleClickEvent(formField)\"\n [(ngModel)]=\"formField.value\" [name]=\"formField.field\" [disabled]=\"formField.disabled\"\n [ngStyle]=\"{height: formField.height ? formField.height : ''}\"\n (blur)=\"onFocusOutEvent(formField)\"></textarea>\n </div>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control\n [field]=\"formField\" \n (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\"\n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent\"\n ></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control \n [field]=\"formField\"\n (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"\n ></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <label [class]=\"formField.label.onClick ? 'custom-link' : ''\" (click)=\"\n formField.label.onClick && formField.label.onClick()\n \" data-title-element=\"self\">\n {{\n formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <input data-title-element=\"self\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" type=\"password\" (click)=\"handleClickEvent(formField)\"\n (change)=\"onChangeEvent(formField)\" pInputText [(ngModel)]=\"formField.value\"\n [name]=\"formField.field\" (blur)=\"onFocusOutEvent(formField)\" />\n <span *ngIf=\"!formField?.isValid\" class=\"error\">{{ formField.errorMessage }}</span>\n <span *ngIf=\"formField.required\"> * </span>\n </div>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]= \"formField\" (onClick)=\"onClickEvent(formField)\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <span [class]=\"formField.disabled ? 'disabled-calendar-header-span' : ''\">\n <label \n *ngIf=\"!formField.label.labelControl\"\n [class]=\"formField.label.onClick ? 'custom-link' : ''\" \n (click)=\"formField.label.onClick && formField.label.onClick()\" \n data-title-element=\"self\">\n {{\n formField.label.labelControl\n ? ''\n : formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <p-calendar data-title-element=\"input\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty ' + formField.field\n : 'form-control '+ formField.field\n \" [showButtonBar]=\"!formField.timeOnly\" [(ngModel)]=\"formField.value\"\n [name]=\"formField.field\" [disabled]=\"formField.disabled\" hourFormat=\"12\"\n [defaultDate]=\"defaultDate\"\n [stepMinute]=\"formField.minutesInterval ? formField.minutesInterval : 1\"\n [showTime]=\"formField.showTime\" (onShow)=\"setCalendarDate(formField)\"\n [timeOnly]=\"formField.timeOnly\" [view]=\"formField.monthOnly ? 'month' : 'date' \"\n (click)=\"handleClickEvent(formField)\"\n [dateFormat]=\"formField?.format?.type ? formField.format?.type : calendarFormat\"\n (ngModelChange)=\"calendarChangeValue(formField)\" (onInput)=\"calendarInputValue(formField)\"\n (onClose)=\"onFocusOutEvent(formField)\">\n </p-calendar>\n <!-- [todayButtonStyleClass]=\"column.timeOnly ? 'hide-today-btn' : 'show-today-btn'\" -->\n <span *ngIf=\"!formField?.isValid\" data-title-element=\"self\" class=\"error\">{{ formField.errorMessage }}</span>\n </div>\n </span>\n\n <!-- Dropdown -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <label *ngIf=\"!formField.label?.labelControl\" \n [class]=\"formField.label.onClick ? 'custom-link' : ''\" \n (click)=\"formField.label.onClick && formField.label.onClick()\" \n data-title-element=\"self\">\n {{\n formField.label.labelControl\n ? ''\n : formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField && !formField.label?.labelControl\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-dropdown data-title-element=\"input,span\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty'\n : ''\n \" autocomplete=\"off\" [styleClass]='formField.field' [placeholder]=\"formField.value\"\n [options]=\"formField.data\" [filter]=\"formField.allowSearch\" [(ngModel)]=\"formField.value\"\n [optionLabel]=\"formField.optionLabel\" [optionValue]=\"formField.optionValue\"\n [name]=\"formField.field\" (keyup.Tab)=\"tabFocusEvent(formField)\"\n (click)=\"clearDropdownValue(formField)\" [disabled]=\"formField.disabled\"\n (onBlur)=\"onFocusOutEvent(formField)\" [showClear]=\"formField.value ? true : false\"\n (onChange)=\"onClearValue(formField, $event)\"\n [autoDisplayFirst]=\"formField.value > 0 ? true : false\">\n </p-dropdown>\n <span *ngIf=\"\n !formField?.isValid &&\n !formField.hidden\n \" class=\"error\" data-title-element=\"self\">{{ formField.errorMessage }}</span>\n </div>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <label [class]=\"formField.label.onClick ? 'custom-link' : ''\"\n (click)=\"formField.label.onClick && formField.label.onClick()\" data-title-element=\"self\">\n {{\n formField.label.labelControl\n ? ''\n : formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <span class=\"p-fluid\">\n <p-autoComplete data-title-element=\"input,span\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" [suggestions]=\"formField.data\" [(ngModel)]=\"formField.value\"\n (onChange)=\"onChangeEvent(formField)\" (click)=\"handleClickEvent(formField)\"\n (completeMethod)=\"autoSearch($event, formField)\" [dropdown]=\"formField.showOption\"\n [field]=\"formField.displayField\" [name]=\"formField.label\" [multiple]=\"true\"\n [disabled]=\"formField.disabled\" (onBlur)=\"onFocusOutEvent(formField)\">\n </p-autoComplete>\n </span>\n </div>\n </span>\n\n <!-- Multi-select -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <label [class]=\"formField.label.onClick ? 'custom-link' : ''\" (click)=\"\n formField.label.onClick && formField.label.onClick()\n \" data-title-element=\"self\">\n {{\n formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect data-title-element=\"input,span\" [class]=\"\n setMultiSelectClass(formField)\n \" [(ngModel)]=\"formField.value\" [options]=\"formField.data\" [optionLabel]=\"formField.optionLabel\"\n [optionValue]=\"formField.optionValue\" [appendTo]=\"'body'\" [name]=\"formField.field\"\n (onChange)=\"onChangeEvent(formField)\"\n (click)=\"formField.onClick ? formField.onClick() : ''\" [disabled]=\"formField.disabled\"\n (blur)=\"onFocusOutEvent(formField)\">\n </p-multiSelect>\n </div>\n </span>\n\n <!-- Hyperlink-->\n <span *ngIf=\"!formField.hidden\">\n <div [class]=\"\n formField.disabled\n ? 'disabled-link'\n : 'link-label custom-link'\n \" *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <div data-title-element=\"self\" *ngIf=\"\n formField.hyperlink &&\n formField.hyperlink.component\n \" (click)=\"hyperlinkDialog(formField, $event)\">\n {{ formField.label }}\n </div>\n <div [class]=\"\n formField.disabled\n ? 'disabled-link'\n : 'link-label custom-link'\n \" *ngIf=\"\n formField.hyperlink &&\n formField.hyperlink.target !== '_iframe' &&\n !formField.hyperlink.component\n \">\n <a tabindex=\"-1\" [href]=\"formField.disabled?'':sanitizeUrl(formField.hyperlink?.link)\" \n [target]=\"formField.hyperlink?.target\" (click)=\"handleClickEvent(formField)\"\n data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </a>\n </div>\n <div *ngIf=\"\n formField.hyperlink &&\n formField.hyperlink.target === '_iframe' &&\n !formField.hyperlink.component\n \">\n <a class=\"pl-2\" data-title-element=\"self\" tabindex=\"-1\" (click)=\"loadIFrame(formField)\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </a>\n </div>\n </div>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <span [class]=\"formField.disabled ? 'disabled-lookup-header' : ''\">\n <label *ngIf=\"!formField.label.labelControl\"\n [class]=\"formField.label.onClick ? 'custom-link' : ''\" (click)=\"formField.label.onClick && formField.label.onClick()\"\n data-title-element=\"self\">\n {{\n typeOf(formField.label) === 'object'\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <div class=\"close-icon-wrapper\">\n\n <span class=\"p-input-icon-right\">\n <i class=\"pi pi-chevron-right lookup-input-icon\"></i>\n <input \n data-title-element=\"self\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" \n class=\"form-component lookup-input\"\n type=\"text\"\n pInputText [(ngModel)]=\"formField.value && typeOf(formField.value) === 'object'\n ? formField.value.text\n : formField.value\" autocomplete=\"off\"\n [id]=\"formField.field\"\n [name]=\"formField.field\"\n (click)=\"selectLookupField(formField)\"\n [disabled]=\"formField.disabled\"\n (keyup.Tab)=\"selectLookupField(formField)\"\n readonly\n />\n </span>\n <div>\n <button tabindex=\"-1\" *ngIf=\"formField.value && !formField.disabled\" icon=\"pi pi-times\" pButton\n class=\"lookup-clear-icon-button\"\n type=\"button\" (click)=\"lookupClearValue(formField)\"></button>\n \n </div>\n </div>\n <span *ngIf=\"!formField?.isValid\" data-title-element=\"self\" class=\"error\">{{ formField.errorMessage }}</span>\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload \n [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span [class]=\"formField.class\" *ngIf=\"!formField.hidden\">\n <div class=\"p-0 flex flex-column\" *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <label *ngIf=\"!formField.label.labelControl\"\n [class]=\"formField.label.onClick ? 'custom-link' : ''\" (click)=\"\n formField.label.onClick && formField.label.onClick()\"\n data-title-element=\"self\">{{\n formField.label &&\n typeOf(formField.label) === 'object'\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton \n [class]=\"formField.errorMessage ? 'ng-invalid ng-dirty' : ''\" \n [name]=\"formField.field\"\n [(ngModel)]=\"formField.value\"\n [options]=\"formField.data\"\n optionValue=\"value\"\n optionLabel=\"label\"\n [disabled]=\"formField.disabled\"\n [multiple]=\"formField.displayStyle\"\n (onChange)=\"onChangeEvent(formField)\"\n (onChange)=\"onFocusOutEvent(formField)\">\n </p-selectButton>\n <span *ngIf=\"!formField?.isValid\" class=\"error\">{{ formField.errorMessage }}</span>\n </div>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <div [class]=\"formField.disabled\n ? 'disabled-link'\n : 'link-label custom-link'\n \">\n <span (click)=\"\n !formField.disabled\n ? handleNoteFieldDialog(formField)\n : ''\n \" data-title-element=\"self\">\n {{formField.label.labelControl\n ? ''\n : formField.label.onClick\n ? formField.label.name\n : formField.label}}\n <span *ngIf=\"formField.requiredField\" data-title-element=\"self\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </span>\n </div>\n </div>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <label [class]=\"formField.class\">\n <b data-title-element=\"self\" > {{ formField.label }} </b>\n </label>\n </div>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <button pButton type=\"button\" [icon]=\"formField.icon\" [title]=\"formField.label\" [label]=\"formField.label\"\n [disabled]=\"formField.disabled\"\n [ngStyle]=\"{background: formField.color ? formField.color : ''}\"\n (click)=\"onClickEvent(formField)\"\n [class]=\"formField.class?formField.class:''\"\n ></button>\n </div>\n </span>\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\" [title]=\"formField.label\"\n [params]=\"formField.params\" [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\" [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\" [form]=\"form\" [icon]=\"formField.icon\" [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n\n <!-- Add Input Switch -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.SWITCH\">\n <div>\n <label data-title-element=\"self\">\n {{ formField.label }}\n </label>\n </div>\n <p-inputSwitch [name]=\"formField.label ? formField.label: 'switch'\"\n [(ngModel)]=\"formField.value\" [disabled]=\"formField.disabled\"\n (click)=\"onClickEvent(formField)\"></p-inputSwitch>\n </div>\n </span>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\" (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\" class=\"p-button-danger ml-3\"></button> \n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\" [icon]=\"button.icon ? button.icon : ''\"\n class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\" [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n</form>\n<p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n</p-overlayPanel>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i11.Header, selector: "p-header" }, { kind: "component", type: i12.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "directive", type: i13.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i13.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: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i13.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i13.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i13.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i14.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i15.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i16.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i17.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration"] }, { kind: "directive", type: i18.InputText, selector: "[pInputText]" }, { kind: "directive", type: i19.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize"], outputs: ["onResize"] }, { kind: "component", type: i20.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i21.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "component", type: i22.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i22.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "component", type: i23.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "component", type: i24.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy"], outputs: ["onChange"] }, { kind: "component", type: i25.OverlayPanel, selector: "p-overlayPanel", inputs: ["dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i26.TextInputComponent, selector: "input-control", inputs: ["field"], outputs: ["changePassword", "changeEvent", "clickEvent", "focusEvent"] }, { kind: "component", type: i27.NumericInputComponent, selector: "numeric-control", inputs: ["field"], outputs: ["changeEvent", "selectLookup", "focusOutEvent"] }, { kind: "component", type: i28.CheckboxComponent, selector: "checkbox-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i29.FileUploadComponent, selector: "se-file-upload", inputs: ["acceptFileTypes", "allowMultiple", "fields"], outputs: ["fileUrl", "uploadFileOnReturn"] }, { kind: "component", type: i30.CardComponent, selector: "se-card", inputs: ["data", "width", "height", "card", "setCardData"], outputs: ["selectedCard"] }, { kind: "component", type: i31.GenerateReportBtnComponent, selector: "se-generate-report-btn", inputs: ["repInfo", "mappedFields", "label", "icon", "params", "class", "reportHeader", "reportFooter", "reportType", "showDialog", "form"] }] }); }
1383
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormComponent, deps: [{ token: i1.AuthenticationService }, { token: i2.FormService }, { token: i3.AlertService }, { token: i4.DialogService }, { token: i0.ComponentFactoryResolver }, { token: i5.HyperlinkService }, { token: i0.ChangeDetectorRef }, { token: i6.Router }, { token: i0.ElementRef }, { token: i7.DatePipe }, { token: i8.GridService }, { token: i9.PageLoggerService }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
1384
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: FormComponent, selector: "se-form", inputs: { stickyActions: "stickyActions", form: "form", saveButtonLabel: "saveButtonLabel", cancelButtonLabel: "cancelButtonLabel", hideSaveButton: "hideSaveButton", hideCancelButton: "hideCancelButton", formButtons: "formButtons", loading: "loading", activeTestMode: "activeTestMode" }, outputs: { saveForm: "saveForm", cancelForm: "cancelForm", dropDownChangeEvent: "dropDownChangeEvent", sectionClickedEvent: "sectionClickedEvent" }, host: { listeners: { "window:beforeunload": "beforeunloadHandler($event)" } }, viewQueries: [{ propertyName: "panelOverlayViewContainer", first: true, predicate: ["viewContainerRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "dynamicComponentContainer", predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div>\n <form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n <span [ngSwitch]=\"headerField.control\">\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i10.Header, selector: "p-header" }, { kind: "directive", type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i11.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i12.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i13.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration"] }, { kind: "component", type: i14.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i14.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "component", type: i15.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "component", type: i16.OverlayPanel, selector: "p-overlayPanel", inputs: ["dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i17.TextInputComponent, selector: "input-control", inputs: ["field"], outputs: ["changePassword", "changeEvent", "clickEvent", "focusEvent"] }, { kind: "component", type: i18.NumericInputComponent, selector: "numeric-control", inputs: ["field"], outputs: ["changeEvent", "selectLookup", "focusOutEvent"] }, { kind: "component", type: i19.CheckboxComponent, selector: "checkbox-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i20.PasswordComponent, selector: "password-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i21.SpacerControlComponent, selector: "spacer-control", inputs: ["formField"] }, { kind: "component", type: i22.TextAreaComponent, selector: "textArea-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i23.CalendarComponent, selector: "calendar-control", inputs: ["defaultDate", "calendarFormat", "formField"], outputs: ["ngModelChange", "onClick", "onFocusOut", "onShow", "onInput"] }, { kind: "component", type: i24.DropdownControlComponent, selector: "dropdown-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "keyupTab"] }, { kind: "component", type: i25.AutoCompleteControlComponent, selector: "autoComplete-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "completeMethod"] }, { kind: "component", type: i26.MultiSelectControlComponent, selector: "multiselect-control", inputs: ["formField"], outputs: ["onChange", "focusOutEvent"] }, { kind: "component", type: i27.HyperlinkControlComponent, selector: "hyperlink-control", inputs: ["formField"], outputs: ["onHyperlinkDialogClick", "onClick", "iframLoadEvent"] }, { kind: "component", type: i28.LookupControlComponent, selector: "lookup-control", inputs: ["formField"], outputs: ["onClick", "onClearLookupValue", "keyupTab"] }, { kind: "component", type: i29.SelectButtonControlComponent, selector: "select-button-control", inputs: ["formField"], outputs: ["onChange", "onFocusOut"] }, { kind: "component", type: i30.NoteDetailControlComponent, selector: "note-detail-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i31.SectionHeaderControlComponent, selector: "section-header-control", inputs: ["formField"] }, { kind: "component", type: i32.AddButtonControlComponent, selector: "add-button-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i33.InputSwitchControlComponent, selector: "Input-switch-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i34.LabelControlComponent, selector: "label-control", inputs: ["formField", "overlayPanel", "labelDisplay"], outputs: ["onMouseEnter", "onMouseLeave", "onClick", "onLoadLabelControlIFrameClick", "onSelectLookupLabelClick"] }, { kind: "component", type: i35.FileUploadComponent, selector: "se-file-upload", inputs: ["acceptFileTypes", "allowMultiple", "fields"], outputs: ["fileUrl", "uploadFileOnReturn"] }, { kind: "component", type: i36.CardComponent, selector: "se-card", inputs: ["data", "width", "height", "card", "setCardData"], outputs: ["selectedCard"] }, { kind: "component", type: i37.GenerateReportBtnComponent, selector: "se-generate-report-btn", inputs: ["repInfo", "mappedFields", "label", "icon", "params", "class", "reportHeader", "reportFooter", "reportType", "showDialog", "form"] }] }); }
1387
1385
  }
1388
1386
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormComponent, decorators: [{
1389
1387
  type: Component,
1390
- args: [{ selector: 'se-form', template: "<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div>\n<form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\" class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\" >\n <label class=\"mr-3 custom-link\" data-title-element=\"self\" [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\" (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div *ngFor=\"let headerField of formSection.headerFields\">\n <span [ngSwitch]=\"headerField.control\">\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent\"></input-control>\n </span>\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n </span>\n \n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\"> \n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n <!-- labelControl Hyperlink on lookup Control Field-->\n <div *ngIf=\"formField.label?.labelControl\" class=\"toFrontForTooltip\"\n (mouseenter)=\"(formField.label.labelControl.hoverData && formField.label.labelControl.hoverData.component) && addDynamicPanelOverlayComponent(formField.label.labelControl.hoverData, overlayPanel, $event)\"\n (mouseleave)=\"(formField.label.labelControl.hoverData && formField.label.labelControl.hoverData.component) && mouseLeaveEvent(overlayPanel)\"\n >\n <div class=\"link-label custom-link\"\n *ngIf=\"!formField.label.labelControl.hyperlink && !formField.label.labelControl.lookupControl && formField.label.labelControl.hoverData\">\n <span [class]=\"formField.disabledText ? 'disable-label-control' : '' \"><ng-container *ngTemplateOutlet=\"labelDisplay\"></ng-container>\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span></span> \n </div>\n <div class=\"link-label custom-link\"\n *ngIf=\"formField.label?.labelControl.hyperlink && formField.label?.labelControl.hyperlink.target !== '_iframe'\">\n <a tabindex=\"-1\" (click)=\"formField.onClick ? onClickEvent(formField) : '' \"\n [target]=\"formField.label.labelControl?.hyperlink?.target\"\n [class]=\"formField.disabledText ? 'disable-label-control' : '' \"\n [href]=\"formField.label.labelControl?.hyperlink?.link\" data-title-element=\"self\">\n <ng-container *ngTemplateOutlet=\"labelDisplay\"></ng-container>\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </a>\n </div>\n <div class=\"link-label custom-link\"\n *ngIf=\"formField.label?.labelControl.hyperlink && formField.label?.labelControl.hyperlink.target === '_iframe'\">\n <a tabindex=\"-1\" (click)=\"loadLabelControlIFrame(formField)\" \n data-title-element=\"self\">\n <ng-container *ngTemplateOutlet=\"labelDisplay\"></ng-container>\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </a>\n </div>\n <!-- labelControl on addTextbox, calendar -->\n <div class=\"link-label custom-link\"\n *ngIf=\"formField.label && formField.label.labelControl && formField.label.labelControl.lookupControl\">\n <a tabindex=\"-1\" [class]=\"formField.label.disabled ? 'disable-label-control' : ''\"\n (click)=\"selectLookupLabel(formField, $event)\" data-title-element=\"self\">\n <ng-container *ngTemplateOutlet=\"labelDisplay\"></ng-container>\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </a>\n </div>\n </div>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.SPACER\">\n <span [class]=\"formField.column? 'col-' +formField.column : ''\"></span>\n </div>\n </span>\n\n <!-- Input TextArea -->\n <span *ngIf=\"!formField.hidden\">\n\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <label [class]=\"formField.label.onClick ? 'custom-link' : ''\" (click)=\"\n formField.label.onClick && formField.label.onClick()\n \" data-title-element=\"self\">\n {{\n formField.label.labelControl\n ? ''\n : formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <textarea data-title-element=\"self\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" pInputTextarea [rows]=\"formField.row ? formField.row : 1 \"\n (change)=\"onChangeEvent(formField)\" (click)=\"handleClickEvent(formField)\"\n [(ngModel)]=\"formField.value\" [name]=\"formField.field\" [disabled]=\"formField.disabled\"\n [ngStyle]=\"{height: formField.height ? formField.height : ''}\"\n (blur)=\"onFocusOutEvent(formField)\"></textarea>\n </div>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control\n [field]=\"formField\" \n (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\"\n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent\"\n ></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control \n [field]=\"formField\"\n (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"\n ></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <label [class]=\"formField.label.onClick ? 'custom-link' : ''\" (click)=\"\n formField.label.onClick && formField.label.onClick()\n \" data-title-element=\"self\">\n {{\n formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <input data-title-element=\"self\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" type=\"password\" (click)=\"handleClickEvent(formField)\"\n (change)=\"onChangeEvent(formField)\" pInputText [(ngModel)]=\"formField.value\"\n [name]=\"formField.field\" (blur)=\"onFocusOutEvent(formField)\" />\n <span *ngIf=\"!formField?.isValid\" class=\"error\">{{ formField.errorMessage }}</span>\n <span *ngIf=\"formField.required\"> * </span>\n </div>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]= \"formField\" (onClick)=\"onClickEvent(formField)\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <span [class]=\"formField.disabled ? 'disabled-calendar-header-span' : ''\">\n <label \n *ngIf=\"!formField.label.labelControl\"\n [class]=\"formField.label.onClick ? 'custom-link' : ''\" \n (click)=\"formField.label.onClick && formField.label.onClick()\" \n data-title-element=\"self\">\n {{\n formField.label.labelControl\n ? ''\n : formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <p-calendar data-title-element=\"input\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty ' + formField.field\n : 'form-control '+ formField.field\n \" [showButtonBar]=\"!formField.timeOnly\" [(ngModel)]=\"formField.value\"\n [name]=\"formField.field\" [disabled]=\"formField.disabled\" hourFormat=\"12\"\n [defaultDate]=\"defaultDate\"\n [stepMinute]=\"formField.minutesInterval ? formField.minutesInterval : 1\"\n [showTime]=\"formField.showTime\" (onShow)=\"setCalendarDate(formField)\"\n [timeOnly]=\"formField.timeOnly\" [view]=\"formField.monthOnly ? 'month' : 'date' \"\n (click)=\"handleClickEvent(formField)\"\n [dateFormat]=\"formField?.format?.type ? formField.format?.type : calendarFormat\"\n (ngModelChange)=\"calendarChangeValue(formField)\" (onInput)=\"calendarInputValue(formField)\"\n (onClose)=\"onFocusOutEvent(formField)\">\n </p-calendar>\n <!-- [todayButtonStyleClass]=\"column.timeOnly ? 'hide-today-btn' : 'show-today-btn'\" -->\n <span *ngIf=\"!formField?.isValid\" data-title-element=\"self\" class=\"error\">{{ formField.errorMessage }}</span>\n </div>\n </span>\n\n <!-- Dropdown -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <label *ngIf=\"!formField.label?.labelControl\" \n [class]=\"formField.label.onClick ? 'custom-link' : ''\" \n (click)=\"formField.label.onClick && formField.label.onClick()\" \n data-title-element=\"self\">\n {{\n formField.label.labelControl\n ? ''\n : formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField && !formField.label?.labelControl\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-dropdown data-title-element=\"input,span\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty'\n : ''\n \" autocomplete=\"off\" [styleClass]='formField.field' [placeholder]=\"formField.value\"\n [options]=\"formField.data\" [filter]=\"formField.allowSearch\" [(ngModel)]=\"formField.value\"\n [optionLabel]=\"formField.optionLabel\" [optionValue]=\"formField.optionValue\"\n [name]=\"formField.field\" (keyup.Tab)=\"tabFocusEvent(formField)\"\n (click)=\"clearDropdownValue(formField)\" [disabled]=\"formField.disabled\"\n (onBlur)=\"onFocusOutEvent(formField)\" [showClear]=\"formField.value ? true : false\"\n (onChange)=\"onClearValue(formField, $event)\"\n [autoDisplayFirst]=\"formField.value > 0 ? true : false\">\n </p-dropdown>\n <span *ngIf=\"\n !formField?.isValid &&\n !formField.hidden\n \" class=\"error\" data-title-element=\"self\">{{ formField.errorMessage }}</span>\n </div>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <label [class]=\"formField.label.onClick ? 'custom-link' : ''\"\n (click)=\"formField.label.onClick && formField.label.onClick()\" data-title-element=\"self\">\n {{\n formField.label.labelControl\n ? ''\n : formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <span class=\"p-fluid\">\n <p-autoComplete data-title-element=\"input,span\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" [suggestions]=\"formField.data\" [(ngModel)]=\"formField.value\"\n (onChange)=\"onChangeEvent(formField)\" (click)=\"handleClickEvent(formField)\"\n (completeMethod)=\"autoSearch($event, formField)\" [dropdown]=\"formField.showOption\"\n [field]=\"formField.displayField\" [name]=\"formField.label\" [multiple]=\"true\"\n [disabled]=\"formField.disabled\" (onBlur)=\"onFocusOutEvent(formField)\">\n </p-autoComplete>\n </span>\n </div>\n </span>\n\n <!-- Multi-select -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <label [class]=\"formField.label.onClick ? 'custom-link' : ''\" (click)=\"\n formField.label.onClick && formField.label.onClick()\n \" data-title-element=\"self\">\n {{\n formField.label.onClick\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect data-title-element=\"input,span\" [class]=\"\n setMultiSelectClass(formField)\n \" [(ngModel)]=\"formField.value\" [options]=\"formField.data\" [optionLabel]=\"formField.optionLabel\"\n [optionValue]=\"formField.optionValue\" [appendTo]=\"'body'\" [name]=\"formField.field\"\n (onChange)=\"onChangeEvent(formField)\"\n (click)=\"formField.onClick ? formField.onClick() : ''\" [disabled]=\"formField.disabled\"\n (blur)=\"onFocusOutEvent(formField)\">\n </p-multiSelect>\n </div>\n </span>\n\n <!-- Hyperlink-->\n <span *ngIf=\"!formField.hidden\">\n <div [class]=\"\n formField.disabled\n ? 'disabled-link'\n : 'link-label custom-link'\n \" *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <div data-title-element=\"self\" *ngIf=\"\n formField.hyperlink &&\n formField.hyperlink.component\n \" (click)=\"hyperlinkDialog(formField, $event)\">\n {{ formField.label }}\n </div>\n <div [class]=\"\n formField.disabled\n ? 'disabled-link'\n : 'link-label custom-link'\n \" *ngIf=\"\n formField.hyperlink &&\n formField.hyperlink.target !== '_iframe' &&\n !formField.hyperlink.component\n \">\n <a tabindex=\"-1\" [href]=\"formField.disabled?'':sanitizeUrl(formField.hyperlink?.link)\" \n [target]=\"formField.hyperlink?.target\" (click)=\"handleClickEvent(formField)\"\n data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </a>\n </div>\n <div *ngIf=\"\n formField.hyperlink &&\n formField.hyperlink.target === '_iframe' &&\n !formField.hyperlink.component\n \">\n <a class=\"pl-2\" data-title-element=\"self\" tabindex=\"-1\" (click)=\"loadIFrame(formField)\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </a>\n </div>\n </div>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <span [class]=\"formField.disabled ? 'disabled-lookup-header' : ''\">\n <label *ngIf=\"!formField.label.labelControl\"\n [class]=\"formField.label.onClick ? 'custom-link' : ''\" (click)=\"formField.label.onClick && formField.label.onClick()\"\n data-title-element=\"self\">\n {{\n typeOf(formField.label) === 'object'\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <div class=\"close-icon-wrapper\">\n\n <span class=\"p-input-icon-right\">\n <i class=\"pi pi-chevron-right lookup-input-icon\"></i>\n <input \n data-title-element=\"self\" [class]=\"\n formField.errorMessage\n ? 'ng-invalid ng-dirty'\n : 'form-control'\n \" \n class=\"form-component lookup-input\"\n type=\"text\"\n pInputText [(ngModel)]=\"formField.value && typeOf(formField.value) === 'object'\n ? formField.value.text\n : formField.value\" autocomplete=\"off\"\n [id]=\"formField.field\"\n [name]=\"formField.field\"\n (click)=\"selectLookupField(formField)\"\n [disabled]=\"formField.disabled\"\n (keyup.Tab)=\"selectLookupField(formField)\"\n readonly\n />\n </span>\n <div>\n <button tabindex=\"-1\" *ngIf=\"formField.value && !formField.disabled\" icon=\"pi pi-times\" pButton\n class=\"lookup-clear-icon-button\"\n type=\"button\" (click)=\"lookupClearValue(formField)\"></button>\n \n </div>\n </div>\n <span *ngIf=\"!formField?.isValid\" data-title-element=\"self\" class=\"error\">{{ formField.errorMessage }}</span>\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload \n [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span [class]=\"formField.class\" *ngIf=\"!formField.hidden\">\n <div class=\"p-0 flex flex-column\" *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <label *ngIf=\"!formField.label.labelControl\"\n [class]=\"formField.label.onClick ? 'custom-link' : ''\" (click)=\"\n formField.label.onClick && formField.label.onClick()\"\n data-title-element=\"self\">{{\n formField.label &&\n typeOf(formField.label) === 'object'\n ? formField.label.name\n : formField.label\n }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton \n [class]=\"formField.errorMessage ? 'ng-invalid ng-dirty' : ''\" \n [name]=\"formField.field\"\n [(ngModel)]=\"formField.value\"\n [options]=\"formField.data\"\n optionValue=\"value\"\n optionLabel=\"label\"\n [disabled]=\"formField.disabled\"\n [multiple]=\"formField.displayStyle\"\n (onChange)=\"onChangeEvent(formField)\"\n (onChange)=\"onFocusOutEvent(formField)\">\n </p-selectButton>\n <span *ngIf=\"!formField?.isValid\" class=\"error\">{{ formField.errorMessage }}</span>\n </div>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <div [class]=\"formField.disabled\n ? 'disabled-link'\n : 'link-label custom-link'\n \">\n <span (click)=\"\n !formField.disabled\n ? handleNoteFieldDialog(formField)\n : ''\n \" data-title-element=\"self\">\n {{formField.label.labelControl\n ? ''\n : formField.label.onClick\n ? formField.label.name\n : formField.label}}\n <span *ngIf=\"formField.requiredField\" data-title-element=\"self\" [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </span>\n </div>\n </div>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <label [class]=\"formField.class\">\n <b data-title-element=\"self\" > {{ formField.label }} </b>\n </label>\n </div>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <button pButton type=\"button\" [icon]=\"formField.icon\" [title]=\"formField.label\" [label]=\"formField.label\"\n [disabled]=\"formField.disabled\"\n [ngStyle]=\"{background: formField.color ? formField.color : ''}\"\n (click)=\"onClickEvent(formField)\"\n [class]=\"formField.class?formField.class:''\"\n ></button>\n </div>\n </span>\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\" [title]=\"formField.label\"\n [params]=\"formField.params\" [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\" [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\" [form]=\"form\" [icon]=\"formField.icon\" [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n\n <!-- Add Input Switch -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.SWITCH\">\n <div>\n <label data-title-element=\"self\">\n {{ formField.label }}\n </label>\n </div>\n <p-inputSwitch [name]=\"formField.label ? formField.label: 'switch'\"\n [(ngModel)]=\"formField.value\" [disabled]=\"formField.disabled\"\n (click)=\"onClickEvent(formField)\"></p-inputSwitch>\n </div>\n </span>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\" (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\" class=\"p-button-danger ml-3\"></button> \n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\" [icon]=\"button.icon ? button.icon : ''\"\n class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\" [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n</form>\n<p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n</p-overlayPanel>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}\n"] }]
1391
- }], ctorParameters: function () { return [{ type: i1.AuthenticationService }, { type: i2.FormService }, { type: i3.AlertService }, { type: i4.DomSanitizer }, { type: i5.DialogService }, { type: i0.ComponentFactoryResolver }, { type: i6.HyperlinkService }, { type: i0.ChangeDetectorRef }, { type: i7.Router }, { type: i0.ElementRef }, { type: i8.DatePipe }, { type: i9.GridService }, { type: i10.PageLoggerService }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { panelOverlayViewContainer: [{
1388
+ args: [{ selector: 'se-form', template: "<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div>\n <form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n <span [ngSwitch]=\"headerField.control\">\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}\n"] }]
1389
+ }], ctorParameters: function () { return [{ type: i1.AuthenticationService }, { type: i2.FormService }, { type: i3.AlertService }, { type: i4.DialogService }, { type: i0.ComponentFactoryResolver }, { type: i5.HyperlinkService }, { type: i0.ChangeDetectorRef }, { type: i6.Router }, { type: i0.ElementRef }, { type: i7.DatePipe }, { type: i8.GridService }, { type: i9.PageLoggerService }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { panelOverlayViewContainer: [{
1392
1390
  type: ViewChild,
1393
1391
  args: ['viewContainerRef', { read: ViewContainerRef, static: true }]
1394
1392
  }], dynamicComponentContainer: [{
@@ -1424,4 +1422,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
1424
1422
  type: HostListener,
1425
1423
  args: ['window:beforeunload', ['$event']]
1426
1424
  }] } });
1427
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUErQyxZQUFZLEVBQStCLGdCQUFnQixFQUFjLFlBQVksRUFBcUIsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBSWxQLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBMEMsVUFBVSxFQUE2QixXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFFL0UsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFPN0QsT0FBTyxFQUFnQixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXRDLE1BQU0sT0FBTyxhQUFhO0lBaUJ4QixJQUFhLGNBQWMsQ0FBQyxHQUFRO1FBQ2xDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtZQUNoQixRQUFRLENBQUM7U0FDVjtJQUNI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SSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkE4Q1AsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIENvbXBvbmVudEZhY3RvcnksIFZpZXdDb250YWluZXJSZWYsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgUmVuZGVyZXIyLCBOZ1pvbmUsIFZpZXdDaGlsZCwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XG5pbXBvcnQgeyBOb3Rlc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9ub3Rlcy9ub3Rlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRUZvcm1Db250cm9sLCBFSHlwZXJsaW5rLCBJRm9ybUZpZWxkLCBJRHluYW1pY0Zvcm0sIElGb3JtU2VjdGlvbiwgRVZhbGlkYXRvciwgSUR5bmFtaWNDYXJkLCBJRm9ybUJ1dHRvbiwgRUZvcm1hdFR5cGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBFUGVybWlzc2lvblR5cGUsIElQZXJtaXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3VzZXItaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIHV0aWxpdGllcyBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBJZnJhbWVDb21wb25lbnQgfSBmcm9tICcuLi9pZnJhbWUvaWZyYW1lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb21tb24ubW9kZWwnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgR3JpZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFnZUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYWdlLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh5cGVybGlua1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9oeXBlcmxpbmsuc2VydmljZSc7XG5pbXBvcnQgeyBkcmFnZ2FibGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSU92ZXJsYXlQYW5lbERhdGEgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ3JpZC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NlLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3ZpZXdDb250YWluZXJSZWYnLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOnRydWV9KVxuICBwdWJsaWMgcGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZHJlbignZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyOiBRdWVyeUxpc3Q8Vmlld0NvbnRhaW5lclJlZj47XG5cbiAgQElucHV0KCkgc3RpY2t5QWN0aW9uczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGZvcm06IElEeW5hbWljRm9ybTtcbiAgQElucHV0KCkgc2F2ZUJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgY2FuY2VsQnV0dG9uTGFiZWw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBoaWRlU2F2ZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBoaWRlQ2FuY2VsQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZvcm1CdXR0b25zOiBJRm9ybUJ1dHRvbltdID0gW107XG4gIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBvdmVybGF5UGFuZWxTdHlsZToge307XG4gIFxuICBASW5wdXQoKSBzZXQgYWN0aXZlVGVzdE1vZGUodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpIHNhdmVGb3JtOiBFdmVudEVtaXR0ZXI8SUZvcm1TZWN0aW9uW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY2FuY2VsRm9ybTogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGRyb3BEb3duQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2VjdGlvbkNsaWNrZWRFdmVudDogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZHluYW1pY0Nhc2UgPSBFRm9ybUNvbnRyb2w7XG4gIHNhdmVGb3JtUGFnZTogU3Vic2NyaXB0aW9uO1xuICBwZXJtaXNzaW9uVHlwZSA9IEVQZXJtaXNzaW9uVHlwZTtcbiAgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gIGlzRm9ybURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRm9ybUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjb21wb25lbnRzTGlzdDogSURpY3Rpb25hcnlbXSA9IFtdO1xuICBmaWxlVXBsb2FkVXJsczogYW55O1xuICBzaG93ZmlsZVVwbG9hZEVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIGNhcmRMaXN0OiBJRHluYW1pY0NhcmQ7XG4gIGNhbGVuZGFyUHJldmlvdXNWYWx1ZTogc3RyaW5nID0gJyc7XG4gIGRlZmF1bHREYXRlOiBzdHJpbmcgPSAnJztcbiAgbG9va3VwRm9jdXNPdXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2FsZW5kYXJGb3JtYXQ6IHN0cmluZyA9ICdtbS9kZC95eSc7XG4gIHNldENhcmREYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBkaWFsb2dSZWY6IGFueTtcblxuICAvLyBhcHBseSBjaGVja2VkL3VuQ2hlY2tlZCBwcm9wIGZvciBDaGVja0JveCBvZiB0aGUgRm9ybVxuICBjaGVja2VkOiBib29sZWFuID0gdHJ1ZTtcbiAgdW5DaGVja2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aGVudGljYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwdWJsaWMgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgaHlwZXJsaW5rU2VydmljZSA6IEh5cGVybGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcbiAgICBwcml2YXRlIGdyaWRTZXJ2aWNlOiBHcmlkU2VydmljZSxcbiAgICBwcml2YXRlIHBhZ2VMb2dnZXJTZXJ2aWNlOiBQYWdlTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgLy8gYnJvd3NlciB0YWIgY2xvc2UgZXZlbnRcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcsIFsnJGV2ZW50J10pXG4gIGJlZm9yZXVubG9hZEhhbmRsZXIoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCB8fCB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5mb3JtU2VydmljZS5zZXRUb29sdGlwKCk7XG4gICAgLy8gYXBwbHkgdXNlciByb2xlIHBlcm1pc3Npb25zIG9uIGZvcm1cbiAgICB0aGlzLnJvbGVzID0gdGhpcy5hdXRoU2VydmljZS5nZXRVc2VyUm9sZXMoKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm0gJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgLy8gc3RhcnQgY2FyZExpc3QgcmVmZXJlbmNlIGJyZWFrIGZ1bmN0aW9uYWxpdHlcbiAgICAgIGxldCBmb3JtVmFsdWVzID0geyAuLi50aGlzLmZvcm0gfTtcblxuICAgICAgZm9ybVZhbHVlcy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZpZWxkUmVxdWlyZWQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmlzUGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgZmllbGQudGV4dFR5cGUgPSAncGFzc3dvcmQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdGltZSBpbnRvIGRhdGVcbiAgICAgICAgICAgIGlmIChmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmIGZpZWxkPy5vbkNoYW5nZSkge1xuICAgICAgICAgICAgICBmaWVsZFsncHJldmlvdXNWYWx1ZSddID0gZmllbGQ/LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmXG4gICAgICAgICAgICAgIGZpZWxkPy50aW1lT25seSAmJlxuICAgICAgICAgICAgICAoZmllbGQ/LnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdBTScpIHx8XG4gICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUoZmllbGQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkFVVE9DT01QTEVURSAmJlxuICAgICAgICAgICAgICBmaWVsZD8udmFsdWUgJiZcbiAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZD8udmFsdWUubWFwKFxuICAgICAgICAgICAgICAgICh2YWx1ZTogYW55KSA9PiB2YWx1ZVtmaWVsZD8uZGlzcGxheUZpZWxkXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgICAgICAodmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJzsnKSB8fFxuICAgICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJywnKSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCcsJywgJzsnKVxuICAgICAgICAgICAgICAgICAgPy5zcGxpdCgnOycpXG4gICAgICAgICAgICAgICAgICA/Lm1hcCgodmFsOiBhbnkpID0+ICh7IFtmaWVsZD8uZGlzcGxheUZpZWxkXTogdmFsIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCB0aGUgbXVsdGlTZWxlY3Qgc3RyaW5nIHZhbHVlIGluIGFycmF5XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTVVMVElTRUxFQ1QgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnLCcpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMqLFxccyovZywgXCIsXCIpPy50b1N0cmluZygpPy5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gW2ZpZWxkLnZhbHVlXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgICAgICB0aGlzLmZvcm0gPSB7fTtcbiAgICAgICAgICAgICAgZmllbGQ/LmNhcmQ/LmRhdGE/LmZvckVhY2goKHg6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5mb3JtU2VjdGlvbnMgJiZcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHguZHluYW1pY0Zvcm0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uczogSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmaWVsZD8uY2FyZD8uZm9ybVNlY3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmZvcm0gPSBmb3JtVmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW5kIGNhcmRMaXN0IHJlZmVyZW5jZSBicmVhayBmdW5jdGlvbmFsaXR5XG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9XG4gICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHxcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gJ3knIHx8XG4gICAgICAgICAgICAgICAgICBmaWVsZD8udmFsdWU/LnRvU3RyaW5nKCkgPT09ICcxJ1xuICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwbHlVc2VyUGVybWlzc2lvbnMoKTtcbiAgICAgIHRoaXMucmVtb3ZlV2hpdGVTcGFjZXMoKTtcbiAgICAgIHRoaXMuc2V0SHlwZXJsaW5rQ29tcG9uZW50Um91dGUoKTtcbiAgICAgIHRoaXMuc2V0Q2FsYW5kZXJXaWR0aCgpO1xuICAgICAgdGhpcy5vcmRlckZvcm1TZWN0aW9ucygpO1xuICAgICAgdGhpcy5vbkR5bmFtaWNGb3JtU3RhdGVDaGFuZ2UoKTtcbiAgICB9XG4gIH1cbiAgb3JkZXJGb3JtU2VjdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuZm9ybSAmJiB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50VXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdDdXJyZW50VXNlckluZm8nKSk7XG4gICAgICBsZXQgdXNlclNlY3Rpb24gPSBjdXJyZW50VXNlckluZm8/LnBhZ2VTZWN0aW9ucz8ubGVuZ3RoID4gMCA/IGN1cnJlbnRVc2VySW5mby5wYWdlU2VjdGlvbnMgOiBbXTtcbiAgICAgIGNvbnN0IHBhZ2VVcmwgPSB0aGlzLnBhZ2VOYW1lKCk7XG4gICAgICBpZiAodXNlclNlY3Rpb24/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXNlclNlY3Rpb24gPSB1c2VyU2VjdGlvbi5zb3J0KChhLCBiKSA9PiBiLmlkIC0gYS5pZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwidXNlclNlY3Rpb246XCIsIHVzZXJTZWN0aW9uKVxuICAgICAgICB1c2VyU2VjdGlvbi5mb3JFYWNoKChwYWdlU2VjdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hdGNoZWROYW1lOiBib29sZWFuID0gdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uc29tZSgoc2VjdGlvbikgPT4gcGFnZVNlY3Rpb24/LnNlY3Rpb24/LnRvTG93ZXJDYXNlKCkgPT09IHNlY3Rpb24/Lm5hbWU/LnRvTG93ZXJDYXNlKCkpICYmIHBhZ2VTZWN0aW9uPy5wYWdlPy50b0xvd2VyQ2FzZSgpID09PSBwYWdlVXJsPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChtYXRjaGVkTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5maW5kSW5kZXgoKHNlY3Rpb24pID0+IHBhZ2VTZWN0aW9uPy5zZWN0aW9uPy50b0xvd2VyQ2FzZSgpID09PSBzZWN0aW9uPy5uYW1lPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmIChwYWdlU2VjdGlvbi5yb2xlKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVzPy5sZW5ndGggPiAwICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocGFnZVNlY3Rpb24ucm9sZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN3YXBTZWN0aW9ucyhwYWdlU2VjdGlvbi5vcmRlciAtIDEsIGluZGV4KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zW2luZGV4XS5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnN3YXBTZWN0aW9ucyhwYWdlU2VjdGlvbi5vcmRlciAtIDEsIGluZGV4KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH07XG4gIH1cbiAgc3dhcFNlY3Rpb25zKG9yZGVyOiBudW1iZXIsIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByZU9yZGVyU2VjdGlvbiA9IHsgLi4udGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tvcmRlcl0gfTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zW29yZGVyXSA9IHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdO1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdID0gcmVPcmRlclNlY3Rpb247XG4gIH1cbiAgcGFnZU5hbWUoKSB7XG4gICAgbGV0IHVybCA9IHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpO1xuICAgIGlmICh1cmw/LmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIHVybCA9IHVybC5zcGxpdCgnPycpWzBdO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHNldEZvcm1TZWN0aW9uKHNlY3Rpb24sIGluZGV4LCBwYWdlU2VjdGlvbikge1xuICAgIGNvbnN0IHJlT3JkZXJTZWN0aW9uID0geyAuLi5zZWN0aW9uIH07XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuc3BsaWNlKHBhZ2VTZWN0aW9uPy5vcmRlciAtIDEsIDAsIHJlT3JkZXJTZWN0aW9uKTtcbiAgfVxuICBjaGVja0ZpZWxkUmVxdWlyZWQoZmllbGQ6IGFueSkge1xuICAgaWYoZmllbGQudmFsaWRhdGlvbnM/LmZpbmQodmFsaWRhdGlvbj0+dmFsaWRhdGlvbi50eXBlPT09RVZhbGlkYXRvci5SRVFVSVJFRCkpe1xuICAgICAgZmllbGQucmVxdWlyZWRGaWVsZCA9IHRydWU7XG4gICB9XG4gIH1cblxuICAvLyBzZXQgY2FsZW5kYXIgMiBPciA0IGRpZ2l0IHllYXIgZm9ybWF0XG4gIGNhbGVuZGFySW5wdXRWYWx1ZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZighZm9ybUZpZWxkLnRpbWVPbmx5KXtcbiAgICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmb3JtRmllbGQuZmllbGQpWzBdXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKHZhbDogYW55KSA9PiB7XG4gICAgICAgIGlmICghdmFsPy50YXJnZXQ/LnZhbHVlPy5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgaWYgKHZhbD8udGFyZ2V0Py52YWx1ZT8ubGVuZ3RoID09IDggfHwgZm9ybUZpZWxkPy5mb3JtYXQ/LnR5cGUgPT09IEVGb3JtYXRUeXBlLlNIT1JUREFURSkge1xuICAgICAgICAgICAgdmFsLnRhcmdldC52YWx1ZSA9IHZhbD8udGFyZ2V0Py52YWx1ZT8ucmVwbGFjZSgvKFxcZHsyfSkoXFxkezJ9KShcXGR7NH0pLywgJyQxLyQyLyQzJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHZhbD8udGFyZ2V0Py52YWx1ZS5sZW5ndGggPT0gNikge1xuICAgICAgICAgICAgdmFsLnRhcmdldC52YWx1ZSA9IHZhbD8udGFyZ2V0Py52YWx1ZT8ucmVwbGFjZSgvKFxcZHsyfSkoPz1cXGQpL2csICckMS8nKS50b1N0cmluZygpO1xuICAgICAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB5ZWFyID0gdmFsPy50YXJnZXQ/LnZhbHVlPy50b1N0cmluZygpLnNwbGl0KCcvJylbMl07XG4gICAgICAgIGlmICh5ZWFyPy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3l5JztcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZSh2YWw/LnRhcmdldD8udmFsdWUpPy50b0xvY2FsZURhdGVTdHJpbmcoXG4gICAgICAgICAgICAnZW4tVVMnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3knO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgIFxuICB9XG5cbiAgLy8gc2V0IHBlcmNlbnQgYW5kIGRlY2ltYWwgdmFsdWVzXG4gIHNldG51bWVyaWN2YWx1ZXMoKSB7XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzKSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTlVNRVJJQykge1xuICAgICAgICAgICAgY29uc3QgZGlnaXRzSW5mbyA9IGZpZWxkPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcbiAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5hbGxvd0NhbGN1bGF0ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICAgIChmaWVsZC52YWx1ZSAqIDEwMCk/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSAqIDEwMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChmaWVsZC52YWx1ZSkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KGZpZWxkLnZhbHVlKS50b0ZpeGVkKFxuICAgICAgICAgICAgICAgICAgZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAyXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZm9ybSBoYXMgYW55IGZpZWxkIHdpdGggZHluYW1pYyBjb21wb25lbnQ7XG4gICAqIENyZWF0ZXMgY29tcG9uZW50IGluc3RhbmNlIHVzaW5nIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxuICAgKiBJbmplY3RzIGNvbXBvbmVudCB0aHJvdWdoIHZpZXdSZWYuY3JlYXRlQ29tcG9uZW50KClcbiAgICogUGFzc2VzIGRhdGEgdG8gY29tcG9uZW50XG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIGV2ZW50cyBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudHNcbiAgICogRmluYWxseSBmb3JjZXMgQW5ndWxhciB0byBkZXRlY2ggY2hhbmdlc1xuICAgKi9cbiAgbG9hZER5bmFtaWNDb21wb25lbnRzKCkge1xuICAgIHRoaXMuY29tcG9uZW50c0xpc3QgPSBbXTtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55LCBmaWVsZEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ09NUE9ORU5UKSB7XG4gICAgICAgICAgY29uc3Qgdmlld1JlZjogYW55ID0gdGhpcy5keW5hbWljQ29tcG9uZW50Q29udGFpbmVyLmZpbmQoXG4gICAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgICAgeC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaWQgPT0gYCR7Zm9ybVNlY3Rpb24ubmFtZX0tJHtmaWVsZEluZGV4fWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogQ29tcG9uZW50LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGhhbmRsZXJzLFxuICAgICAgICAgIH0gPSBmaWVsZC5jb21wb25lbnRDb250cm9sO1xuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PiA9XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShDb21wb25lbnQpO1xuICAgICAgICAgIC8vIFBhc3NpbmcgZGF0YSB0byBjb21wb25lbnRcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB2aWV3UmVmPy5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgaWYoZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkKXtcbiAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlcjIuYWRkQ2xhc3MoY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIGZpZWxkLmNvbXBvbmVudENvbnRyb2wuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSA/PyB7fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xpc3QucHVzaCh7XG4gICAgICAgICAgICAgIG5hbWU6IGZpZWxkLmNvbXBvbmVudENvbnRyb2w/LmlkLFxuICAgICAgICAgICAgICB2YWx1ZTogY29tcG9uZW50UmVmLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBTdWJzY3JpYmVzIHRvIHRoZSBldmVudHMgcGFzc2VkIHRvIHRoZSBjb21wb25lbnRzXG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaGFuZGxlcnMpLmZvckVhY2goKFtldmVudCwgaGFuZGxlcl06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIChjb21wb25lbnRSZWYuaW5zdGFuY2VbZXZlbnRdIGFzIEV2ZW50RW1pdHRlcjxhbnk+KT8uc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpbnZva2UgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvL2ludm9rZSB3aGVuIGZpbGUgdXBsb2FkIE9SIGRlbGV0ZSBhIGZpbGVcbiAgZmlsZU9uY2hhbmdlRXZlbnQoKSB7XG4gICAgdGhpcy5zZXRDYXJkRGF0YSA9ICF0aGlzLnNldENhcmREYXRhO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIGxvYWQgZHluYW1pYyBjb21wb25lbnRzIGlmIGV4aXN0IGluIGZvcm1cbiAgICB0aGlzLnNldG51bWVyaWN2YWx1ZXMoKTtcbiAgICB0aGlzLm9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpO1xuICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnRzKCk7XG4gICAgdGhpcy5zZXRDYXJkUmVzcG9uc2VJZCgpO1xuICB9XG5cbiAgc2V0Q2FyZFJlc3BvbnNlSWQoKSB7XG4gICAgdXRpbGl0aWVzLm9uRHluYW1pY0NhcmRTdGF0ZUNoYW5nZSgpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZihyZXMuZGF0YT8uaXNTYXZlKXtcbiAgICAgICAgdGhpcy5zZXRDYXJkSWRzKHJlcy5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0RGVsZXRlQ2FyZElkKHJlcy5kYXRhPy5jYXJkRGF0YSwgcmVzLmRhdGE/LmR5bmFtaWNGb3JtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldERlbGV0ZUNhcmRJZCh1cGRhdGVkQ2FyZERhdGE6YW55LCBkeW5hbWljRm9ybTogSUR5bmFtaWNGb3JtKXtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoc2VjdGlvbjpJRm9ybVNlY3Rpb24pPT57XG4gICAgICBjb25zdCBjYXJkQ29udHJvbCA9IHNlY3Rpb24uZmllbGRzLmZpbmQoKGZpZWxkOklGb3JtRmllbGQpPT4gZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpO1xuICAgICAgaWYoY2FyZENvbnRyb2wpe1xuICAgICAgICBjYXJkQ29udHJvbC5jYXJkLmRhdGEgPSB1cGRhdGVkQ2FyZERhdGE7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIGR5bmFtaWNGb3JtID0gdGhpcy5mb3JtO1xuICB9XG5cbiAgc2V0Q2FyZElkcyhyZXMpIHtcbiAgICByZXMucmVjb3JkcyA9IHRoaXMuZ3JpZFNlcnZpY2Uuc2V0RGF0YUZpZWxkcyhyZXMucmVjb3Jkcyk7XG4gICAgcmVzLnJlY29yZHM/LmZvckVhY2goKHJlY29yZDogYW55LCByZWNvcmRJbmRleDogYW55KSA9PiB7XG4gICAgICBjb25zdCBtYXRjaENhcmQgPSByZXMuY2FyZHNJbmZvPy5maW5kKFxuICAgICAgICAoaW5mbywgY2FyZEluZGV4KSA9PlxuICAgICAgICAgIHJlY29yZEluZGV4ID09PSBjYXJkSW5kZXggJiYgcmVjb3JkW3Jlcy5maWVsZE5hbWU/LnRvTG93ZXJDYXNlKCldXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoQ2FyZCAmJiBPYmplY3Qua2V5cyhtYXRjaENhcmQpPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1hdGNoQ2FyZFtyZXMuZmllbGROYW1lXSA9IHJlY29yZFtyZXMuZmllbGROYW1lPy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQ7XG4gICAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZihyZXMuY2FyZElkKXtcbiAgICAgICAgICBmb3JtRmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHM/LmZpbmQoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEICYmIGZpZWxkLmlkID09PSByZXMuY2FyZElkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHM/LmZpbmQoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGZvcm1GaWVsZCkge1xuICAgICAgICAgIGlmIChyZXMuY2FyZHNJbmZvPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXMuY2FyZHNJbmZvPy5mb3JFYWNoKChjYXJkSWQpID0+IHtcbiAgICAgICAgICAgICAgY2FyZElkLmlkID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JtRmllbGQuY2FyZC5kYXRhID0gcmVzLmNhcmRzSW5mbztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2V0Q2FyZERhdGEgPSAhdGhpcy5zZXRDYXJkRGF0YTtcbiAgfVxuXG4gIHJlbW92ZVdoaXRlU3BhY2VzKCkge1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoc2VjdGlvbi5jbGFzcykgc2VjdGlvbi5jbGFzcyA9IHNlY3Rpb24uY2xhc3MucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldEh5cGVybGlua0NvbXBvbmVudFJvdXRlKCkge1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuSFlQRVJMSU5LICYmXG4gICAgICAgICAgZmllbGQuaHlwZXJsaW5rPy5jb21wb25lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIucmVzZXRDb25maWcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiAnaHlwZXJsaW5rJyArIGZpZWxkLmxhYmVsLFxuICAgICAgICAgICAgICBjb21wb25lbnQ6IGZpZWxkLmh5cGVybGluay5jb21wb25lbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4udGhpcy5yb3V0ZXIuY29uZmlnLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGJyb3dzZXJUYWJDbG9zZUV2ZW50KGV2ZW50OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGV2ZW50O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKXtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGFueSBjaGFuZ2UgaW4gRHluYW1pYyBGb3JtIGNvbXBvbmVudCBTdGF0ZVxuICAgKi9cbiAgb25EeW5hbWljRm9ybVN0YXRlQ2hhbmdlKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdXRpbGl0aWVzLm9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5pZCAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZk9iaiA9IHRoaXMuY29tcG9uZW50c0xpc3QuZmluZChcbiAgICAgICAgICAoeCkgPT4geC5uYW1lID09PSByZXNwb25zZS5pZFxuICAgICAgICApO1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmT2JqKSB7XG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UuZGF0YSA/PyB7fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBjb21wb25lbnRSZWZPYmoudmFsdWUuaW5zdGFuY2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmKHJlc3BvbnNlPy5sb2FkQ29tcG9uZW50KXtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZk9iai52YWx1ZS5pbnN0YW5jZS5uZ09uSW5pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBhcHBseSB1c2VyIHJvbGUgcGVybWlzc2lvbnNcbiAgYXBwbHlVc2VyUGVybWlzc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMuZm9ybSAmJiB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKSB7XG4gICAgICBsZXQgdG90YWxGaWVsZHM6IG51bWJlciA9IDA7XG4gICAgICBsZXQgZGlzYWJsZWRGaWVsZHM6IG51bWJlciA9IDA7XG4gICAgICBsZXQgaGlkZGVuRmllbGRzOiBudW1iZXIgPSAwO1xuXG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZm9ybUZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGVybWlzc2lvbnM6IGFueSA9IGZvcm1GaWVsZC5wZXJtaXNzaW9ucztcbiAgICAgICAgICAgIGxldCBzZWN0aW9uUGVybWlzc2lvbnM6IGFueSA9IFtdO1xuICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9ucykgc2VjdGlvblBlcm1pc3Npb25zID0gZm9ybVNlY3Rpb24ucGVybWlzc2lvbnM7XG4gICAgICAgICAgICBpZiAoIXBlcm1pc3Npb25zKSBwZXJtaXNzaW9ucyA9IHRoaXMuZm9ybS5wZXJtaXNzaW9ucztcbiAgICAgICAgICAgIGxldCBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChzZWN0aW9uUGVybWlzc2lvbnMgJiYgc2VjdGlvblBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc2VjdGlvblBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb246IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbi5yb2xlcy5mb3JFYWNoKChyb2xlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZCAmJiB0aGlzLnJvbGVzICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5WSUVXKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkVESVQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb25zICYmIHBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbi5yb2xlcyAmJiBwZXJtaXNzaW9uLnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24ucm9sZXMuZm9yRWFjaCgocm9sZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZCAmJiB0aGlzLnJvbGVzICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLlZJRVcgJiZcbiAgICAgICAgICAgICAgICAgICAgIWhhc1ZhbGlkRWRpdFBlcm1pc3Npb25cbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuRURJVCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGhhc1ZhbGlkRWRpdFBlcm1pc3Npb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQucGVybWlzc2lvbnMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5wZXJtaXNzaW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtU2VjdGlvbi5kaXNhYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvdGFsRmllbGRzKys7XG5cbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgZGlzYWJsZWRGaWVsZHMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZGVuRmllbGRzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmlzRm9ybURpc2FibGVkID0gdG90YWxGaWVsZHMgPiAwICYmIHRvdGFsRmllbGRzID09PSBkaXNhYmxlZEZpZWxkcztcbiAgICAgIHRoaXMuaXNGb3JtSGlkZGVuID0gdG90YWxGaWVsZHMgPiAwICYmIHRvdGFsRmllbGRzID09PSBoaWRkZW5GaWVsZHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gSUZyYW1lIGluIGh5cGVybGluayBDb250cm9sXG4gICAqL1xuICBzZWN0aW9uRGlzYWJsZWQoZm9ybVNlY3Rpb246IElGb3JtU2VjdGlvbikge1xuICAgIGlmIChmb3JtU2VjdGlvbi5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRTZWN0aW9uRmllbGRzKGZvcm1TZWN0aW9uLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYoZm9ybVNlY3Rpb24uZGlzYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFNlY3Rpb25GaWVsZHMoZm9ybVNlY3Rpb24sIGZhbHNlKTtcbiAgICB9ZWxzZSB7XG4gICAgICByZXR1cm4gZm9ybVNlY3Rpb247XG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZWRTZWN0aW9uRmllbGRzKGZvcm1TZWN0aW9uOiBJRm9ybVNlY3Rpb24sIGRpc2FibGVkOiBib29sZWFuKXtcbiAgICBmb3JtU2VjdGlvbi5maWVsZHMubWFwKChmaWVsZDogSUZvcm1GaWVsZCkgPT4ge1xuICAgICAgZmllbGQuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybVNlY3Rpb247XG4gIH1cblxuICBsb2FkSUZyYW1lKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIHRoaXMuaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKElmcmFtZUNvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiAnSHlwZXJsaW5rJyxcbiAgICAgIHdpZHRoOiBmb3JtRmllbGQuaHlwZXJsaW5rPy53aWR0aCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggOiAnOTAlJyxcbiAgICAgIGhlaWdodDogZm9ybUZpZWxkLmh5cGVybGluaz8uaGVpZ2h0ID8gZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHQgOiAnODAlJyxcbiAgICAgIGRhdGE6IHsgdmFsdWU6IGZvcm1GaWVsZC5oeXBlcmxpbms/LmxpbmssIGlGcmFtZUlkOiBmb3JtRmllbGQubGFiZWwgfSxcbiAgICB9KTtcbiAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYocmVmKTtcbiAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkKTtcbiAgICB9KTtcbiAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICBpZiAoZm9ybUZpZWxkLm9uUmV0dXJuKSB7XG4gICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIERpYWxvZyBpbiBoeXBlcmxpbmsgQ29udHJvbFxuICAgKi9cbiAgaHlwZXJsaW5rRGlhbG9nKGZvcm1GaWVsZDogSUZvcm1GaWVsZCwgZXZlbnQ6IGFueSkge1xuICAgIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuQkxBTkspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGZvcm1GaWVsZC5oeXBlcmxpbmsucGFyYW1zO1xuICAgICAgd2luZG93Lm9wZW4oJ2h5cGVybGluaycgKyBmb3JtRmllbGQubGFiZWwpO1xuICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLmh5cGVybGluaz8udGFyZ2V0ID09PSBFSHlwZXJsaW5rLlNFTEYpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnaHlwZXJsaW5rJyArIGZvcm1GaWVsZC5sYWJlbF0sIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IGZvcm1GaWVsZC5oeXBlcmxpbmsucGFyYW1zLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuRElBTE9HKSB7XG4gICAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgICAgaWYgKChldmVudCAmJiBldmVudC5jdHJsS2V5ICYmIGZvcm1GaWVsZC5oeXBlcmxpbmsuY29tcG9uZW50KSB8fCBmb3JtRmllbGQub3BlbkluTmV3VGFiKSB7XG4gICAgICAgIHRoaXMuaHlwZXJsaW5rU2VydmljZS5vcGVuRGlhbG9nSW5OZXdUYWIoZm9ybUZpZWxkLmh5cGVybGluay5jb21wb25lbnQsIGZvcm1GaWVsZC5oeXBlcmxpbms/LnBhcmFtcyk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3Blbihmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCwge1xuICAgICAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmh5cGVybGluay5kYXRhPy5oZWFkZXJcbiAgICAgICAgICAgID8gZm9ybUZpZWxkLmh5cGVybGluay5kYXRhPy5oZWFkZXJcbiAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgd2lkdGg6IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoIDogJycsXG4gICAgICAgICAgc3R5bGU6IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggPyB7fSA6IHsgJ21heC13aWR0aCc6ICdmaXQtY29udGVudCcgfSxcbiAgICAgICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0ID8gZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHQgOiAnODAlJyxcbiAgICAgICAgICBkYXRhOiBmb3JtRmllbGQuaHlwZXJsaW5rLnBhcmFtc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0IHx8IHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0KSB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UgPSB0aGlzLmludGVyY2VwdERpYWxvZ0Nsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGZvcm1GaWVsZC5oeXBlcmxpbms/LmNvbXBvbmVudD8ubmFtZTtcbiAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyhcbiAgICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBJZnJhbWUgb24gTGFiZWxcbiAgICovXG4gIGxvYWRMYWJlbENvbnRyb2xJRnJhbWUoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihJZnJhbWVDb21wb25lbnQsIHtcbiAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB3aWR0aDogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbmsud2lkdGhcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoXG4gICAgICAgIDogJzkwJScsXG4gICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rPy5oZWlnaHRcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodFxuICAgICAgICA6ICc4MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbms/LmxpbmtcbiAgICAgICAgICA/IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rLmxpbmtcbiAgICAgICAgICA6ICcnLFxuICAgICAgICBpRnJhbWVJZDogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksXG4gICAgICAnSWZyYW1lQ29tcG9uZW50J1xuICAgICk7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgIH0pO1xuICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICBmb3JtRmllbGQub25SZXR1cm4ocmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChmb3JtRmllbGQgJiYgZm9ybUZpZWxkLm9uQ2xpY2spIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZpbmQgdGhlIHJlcXVpcmVkIGZpZWxkIGluIGZvcm1cbiAgICovXG4vLyAgIGFwcGx5UmVxdWlyZWRGaWVsZFZhbGlkYXRpb24oKSB7XG4vLyBjb25zb2xlLmxvZygnYXBwbHlpbmcgcmVxdWlyZWRmaWxlZCB2YWxpZGF0aW9ucycpXG4vLyAgICAgaWYgKFxuLy8gICAgICAgdGhpcy5mb3JtICYmXG4vLyAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zICYmXG4vLyAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmxlbmd0aCA+IDBcbi8vICAgICApIHtcbi8vICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuLy8gICAgICAgICBzZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuLy8gICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWVsZCcsIGZpZWxkKVxuLy8gICAgICAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9ucyAmJiBmaWVsZC52YWxpZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4vLyAgICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9ucy5mb3JFYWNoKCh2YWxpZCkgPT4ge1xuLy8gICAgICAgICAgICAgICBpZiAodmFsaWQudHlwZSA9PT0gRVZhbGlkYXRvci5SRVFVSVJFRCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWVsZCcsZmllbGQsJ2lzIHJlcXVpcmVkJylcbi8vICAgICAgICAgICAgICAgICBmaWVsZC5yZXF1aXJlZEZpZWxkID0gdHJ1ZTtcbi8vICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgfVxuLy8gICAgICAgICB9KTtcbi8vICAgICAgIH0pO1xuLy8gICAgIH1cbi8vICAgfVxuXG4gIHNldEZpbGVVcmxzKGZpbGVVcmxzOiBhbnkpIHtcbiAgICBpZiAoZmlsZVVybHMgJiYgZmlsZVVybHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5maWxlVXBsb2FkVXJscyA9IGZpbGVVcmxzO1xuICAgICAgdGhpcy5zaG93ZmlsZVVwbG9hZEVycm9yID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgb25TYXZlRm9ybSgpIHtcbiAgICBsZXQgdmFsaWRpdHkgPSB0cnVlO1xuICAgIGxldCBlcnJvck1lc3NhZ2VEZXRhaWxzID0gJyc7XG4gICAgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICBsZXQgbXVsaVNlbGVjdFZhbHVlID0ge307XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoZm9ybVNlY3Rpb24uZmllbGRzKSkge1xuICAgICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMgPSBlcnJvck1lc3NhZ2VEZXRhaWxzXG4gICAgICAgICAgICAgICAgPyBlcnJvck1lc3NhZ2VEZXRhaWxzICsgJyAsICcgKyBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgOiBmb3JtRmllbGQuZXJyb3JNZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxldCBmaWVsZCA9IGZvcm1TZWN0aW9uLmZpZWxkcy5zb21lKFxuICAgICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5yZXF1aXJlZEZpZWxkICYmIGZpZWxkLmVycm9yTWVzc2FnZSAmJiAhZmllbGQudmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWxpZGl0eSAmJiBmaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgICAgIDUwMDAsXG4gICAgICAgICAgICAgICdSRVFVSVJFRCBGSUVMRCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKGVycm9yTWVzc2FnZURldGFpbHMsIDUwMDAsICdJTlZBTElEIEZJRUxEJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbGlkaXR5ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIHNldCB1cGxvYWRGaWxlIFVSTCBpbiBGb3JtRmllbGQgaW4gY2FzZSBvZiBGSUxFX1VQTE9BRFxuICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuRklMRV9VUExPQUQpIHtcbiAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5maWxlVXBsb2FkVXJscztcblxuICAgICAgICAgICAgaWYgKGZpZWxkLnZhbGlkYXRpb25zICYmIGZpZWxkLnZhbGlkYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsaWRhdGlvbnMuZm9yRWFjaCgoeDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHgudHlwZSA9PT0gRVZhbGlkYXRvci5SRVFVSVJFRCAmJiAhZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd2ZpbGVVcGxvYWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5jYXJkICYmIGZpZWxkLmNhcmQuZGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWREYXRhID0gZmllbGQuY2FyZC5kYXRhLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoeDogYW55KSA9PiB4LnNlbGVjdGVkQ2FyZCAmJiB4LnNlbGVjdGVkQ2FyZC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdGEgJiYgc2VsZWN0ZWREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5jYXJkLmRhdGEgPSBzZWxlY3RlZERhdGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh2YWxpZGl0eSkge1xuICAgICAgLy8gU2F2ZSBncmlkIG9uIGZvcm1TYXZlIEJ1dHRvblxuICAgICAgbGV0IGN1c3RvbUNvbXBvbmVudDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgbGV0IHRlbXBWYWx1ZTogYW55ID0gW107XG4gICAgICBsZXQgc2F2ZUFsbEdyaWQ6IGFueSA9IFtdO1xuICAgICAgbGV0IGdldEJ0bnM6IGFueSA9IFtdO1xuICAgICAgLy8gc2V0IHZhbHVlIGFzIDEgb3IgMCBpbiBjYXNlIG9mIGNoZWNrYm94XG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzICYmIHZhbGlkaXR5KSB7XG4gICAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSA9PT0gJycgfHwgZmllbGQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NvbnZlcnQgZGF0ZSBpbnRvIHRpbWUgYXMgc3RyaW5nXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQUxFTkRBUiAmJlxuICAgICAgICAgICAgICBmaWVsZC50aW1lT25seSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fCBmaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUoZmllbGQudmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChmaWVsZC5zaG93VGltZSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmllbGQudmFsdWUsICd5eXl5LU1NLWRkIEhIOm1tOnNzJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnQU0nKSAmJlxuICAgICAgICAgICAgICAgICFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ1BNJykpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAnaGg6bW0gYScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5OVU1FUklDKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBmaWVsZD8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZD8uZm9ybWF0Py50eXBlID09PSAncGVyY2VudCcpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcuJykgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGN1bGF0ZWRWYWx1ZSA/IGZpZWxkLnZhbHVlIDogZmllbGQudmFsdWUgLyAxMDApPy50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJy4nKSAmJiAhY2FsY3VsYXRlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSAvIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChmaWVsZC52YWx1ZSkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc2V0IHZhbHVlIG9mIGF1dG9Db21wbGV0ZSBhcyBzdHJpbmdzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgICAgIWZpZWxkLnNob3dBbGxWYWx1ZSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZS5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC52YWx1ZS5tYXAoXG4gICAgICAgICAgICAgICAgKHZhbHVlOiBhbnkpID0+IHZhbHVlW2ZpZWxkLmRpc3BsYXlGaWVsZF1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgKHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCc7JykgfHxcbiAgICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRlbXBWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCcsJywgJzsnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCBtdWx0aVNlbGVjdCBhcnJheSBpbnRvIHN0cmluZ1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTVVMVElTRUxFQ1QgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSkgJiZcbiAgICAgICAgICAgICAgZmllbGQuc2F2ZUFzU3RyaW5nICE9PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG11bGlTZWxlY3RWYWx1ZVtmaWVsZC5maWVsZF0gPSBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlPy50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlID8gMSA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTYXZlIGdyaWQgb24gZm9ybVNhdmUgQnV0dG9uXG4gICAgICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNPTVBPTkVOVCAmJiAhY3VzdG9tQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudCA9IHRydWU7XG4gICAgICAgICAgICAgIHNhdmVBbGxHcmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnI3NhdmVBbGxHcmlkVmFsdWVzJyk7XG4gICAgICAgICAgICAgIGdldEJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGZpZWxkPy5jb21wb25lbnRDb250cm9sPy5pZCArICcgJyArICcuc2F2ZVJvdycpO1xuICAgICAgICAgICAgICBpZiAoc2F2ZUFsbEdyaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2F2ZUFsbEdyaWRbMF0uY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtUGFnZSA9IGludGVydmFsKDc1MCkuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtUGFnZS51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGdldEJ0bnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNhdmVSb3dCdG4gb2YgZ2V0QnRucykge1xuICAgICAgICAgICAgICAgICAgc2F2ZVJvd0J0bj8uY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudChmYWxzZSk7XG4gICAgICBpZiAoIXNhdmVBbGxHcmlkLmxlbmd0aCAmJiAhZ2V0QnRucy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zYXZlRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKGZvcm1TZWN0aW9uLmZpZWxkcykge1xuICAgICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQUxFTkRBUiAmJlxuICAgICAgICAgICAgICBmaWVsZC50aW1lT25seSAmJiBmaWVsZC5zaG93VGltZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIGlmICh0eXBlb2YgZmllbGQudmFsdWUgPT09ICdzdHJpbmcnICYmIC9eXFxkezJ9OlxcZHsyfSBbQVBdTSQvLnRlc3QoZmllbGQudmFsdWUpKSB7XG4gICAgICAgICAgICAgIC8vICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmllbGQudmFsdWUsICdoaDptbSBhJyk7XG4gICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLk1VTFRJU0VMRUNUICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBtdWxpU2VsZWN0VmFsdWVbZmllbGQuZmllbGRdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkFVVE9DT01QTEVURSAmJlxuICAgICAgICAgICAgICAhZmllbGQuc2hvd0FsbFZhbHVlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB0ZW1wVmFsdWVcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCcsJywgJzsnKVxuICAgICAgICAgICAgICAgID8uc3BsaXQoJzsnKVxuICAgICAgICAgICAgICAgID8ubWFwKCh2YWw6IGFueSkgPT4gKHsgW2ZpZWxkLmRpc3BsYXlGaWVsZF06IHZhbCB9KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlID09PSAxID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZD8uZm9ybWF0Py50eXBlID09PSAncGVyY2VudCcpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGlnaXRzSW5mbyA9IGZpZWxkPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5hbGxvd0NhbGN1bGF0ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICAgIChmaWVsZC52YWx1ZSAqIDEwMCk/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSAqIDEwMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChmaWVsZC52YWx1ZSkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25DYW5jZWxGb3JtKCkge1xuICAgIGlmICh0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCB8fCB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlXG4gICAgICAgIC5jb25maXJtKHtcbiAgICAgICAgICBrZXk6ICdjYW5jZWxCdXR0b24nLFxuICAgICAgICAgIG1lc3NhZ2U6ICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuIFdvdWxkIHlvdSBsaWtlIHRvIGNvbnRpbnVlPycsXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzWzBdLmRldGFpbCA9PT0gJ1llcycpIHtcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbEZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgICAgICAgIHV0aWxpdGllcy5yZW1vdmVBY3RpdmVJY29uQ2xhc3MoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhbmNlbEZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgIHV0aWxpdGllcy5yZW1vdmVBY3RpdmVJY29uQ2xhc3MoKTtcbiAgICB9XG4gIH1cblxuICBsb29rdXBDbGVhclZhbHVlKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQudmFsdWUpIHtcbiAgICAgIGZvcm1GaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudCh0cnVlKTtcbiAgICB9XG4gICAgaWYgKGZvcm1GaWVsZC5vbkNoYW5nZSkge1xuICAgICAgZm9ybUZpZWxkLm9uQ2hhbmdlKGZvcm1GaWVsZCk7XG4gICAgfVxuICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgY2FsZW5kYXIgd2lkdGhcbiAgICovXG4gIHNldENhbGFuZGVyV2lkdGgoKSB7XG4gICAgY29uc3QgY2FsYW5kZXJFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnAtY2FsZW5kYXInKTtcbiAgICBsZXQgZm9ybTogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybScpO1xuICAgIGxldCB3aWR0aCA9IGZvcm0/LmNsaWVudFdpZHRoO1xuICAgIGNhbGFuZGVyRWxlbWVudD8uZm9yRWFjaCgoY2FsYW5kZXI6IGFueSkgPT4ge1xuICAgICAgY29uc3QgY2FsYW5kZXJPZnNldExlZnQgPSBjYWxhbmRlci5vZmZzZXRMZWZ0O1xuICAgICAgaWYgKGNhbGFuZGVyT2ZzZXRMZWZ0IDw9IHdpZHRoIC8gMikge1xuICAgICAgICBjYWxhbmRlci5jbGFzc0xpc3QuYWRkKCdvcGVuLXJpZ2h0LXNpZGUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIGR5bmFtaWMgZGlhbG9nIGRhdGFcbiAgICovXG4gIHNldERpYWxvZ0RhdGEoZm9ybUZpZWxkOiBJRm9ybUZpZWxkLCBkYXRhOiBhbnkpOiBhbnkge1xuICAgIGlmIChkYXRhICYmIGZvcm1GaWVsZCkge1xuICAgICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgICBkYXRhID0gdXRpbGl0aWVzLm9iakNvbnZlcnRUb0xvd2VyKGRhdGEpO1xuICAgICAgbGV0IHNlbGVjdGlvbjogc3RyaW5nID0gJyc7XG4gICAgICBpZiAoZm9ybUZpZWxkLnZhbHVlICYmIHR5cGVvZiBmb3JtRmllbGQudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUgJiZcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUudGV4dCAmJlxuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZS50ZXh0LnRvU3RyaW5nKCkudHJpbSgpXG4gICAgICAgICkge1xuICAgICAgICAgIHNlbGVjdGlvbiA9IGZvcm1GaWVsZC52YWx1ZS50ZXh0Py50b1N0cmluZygpPy50cmltKCk7XG4gICAgICAgICAgaWYgKGZvcm1GaWVsZC5kaXNwbGF5RmllbGQpIHtcbiAgICAgICAgICAgIHZhbHVlID0gZm9ybUZpZWxkLnZhbHVlPy52YWx1ZT8udG9TdHJpbmcoKT8udHJpbSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmb3JtRmllbGQudmFsdWUgJiYgZm9ybUZpZWxkLnZhbHVlLnRvU3RyaW5nKCkudHJpbSgpKSB7XG4gICAgICAgIHNlbGVjdGlvbiA9IGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8udHJpbSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGRhdGEuY29tcG9uZW50Py5uYW1lO1xuICAgICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgdGhpcy5wYWdlTG9nZ2VyU2VydmljZS5zYXZlUGFnZUxvZ2dlckluZm8oXG4gICAgICAgICAgdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKGRhdGEuY29tcG9uZW50LCB7XG4gICAgICAgIC4uLmRhdGEuZGF0YSxcbiAgICAgICAgc3R5bGVDbGFzczogJ2xvb2t1cC1tb2RlbCcsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbixcbiAgICAgICAgICBmaWVsZDogZm9ybUZpZWxkLmZpZWxkLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICB2YWx1ZUZpZWxkOiBkYXRhLmRhdGE/LnZhbHVlRmllbGQsXG4gICAgICAgICAgLi4uZGF0YS5kYXRhLmRhdGEsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZDogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicgKyBmb3JtRmllbGQuZmllbGRcbiAgICApO1xuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZS5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLm9uQ2xpY2sgJiYgZm9ybUZpZWxkLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICBmb3JtRmllbGQub25DbGljayhmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGxhYmVsXG4gICAqL1xuICBzZWxlY3RMb29rdXBMYWJlbChmb3JtRmllbGQ6IGFueSwgZXZlbnQ/OiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICBmb3JtRmllbGQubGFiZWwgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbFxuICAgICkge1xuICAgICAgaWYgKChldmVudC5jdHJsS2V5ICYmIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uY29tcG9uZW50KSB8fCBmb3JtRmllbGQ/LmxhYmVsPy5sYWJlbENvbnRyb2w/Lm9wZW5Jbk5ld1RhYikge1xuICAgICAgICB0aGlzLmh5cGVybGlua1NlcnZpY2Uub3BlbkRpYWxvZ0luTmV3VGFiKGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbC5jb21wb25lbnQsIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uZGF0YS5kYXRhKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCByZWY6IGFueSA9IHRoaXMuc2V0RGlhbG9nRGF0YShcbiAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkID8gZm9ybUZpZWxkPy5maWVsZCA6IGZvcm1GaWVsZD8ubGFiZWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXREaWFsb2dSZXNwb25zZShcbiAgICAgICAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgICAgICAgZm9ybUZpZWxkPy5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbCxcbiAgICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLmxhYmVsLm9uUmV0dXJuKVxuICAgICAgICAgICAgICBmb3JtRmllbGQubGFiZWwub25SZXR1cm4oZm9ybUZpZWxkLnZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICh7IGVycm9yIH06IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIGRpYWxvZyByZWYgd2hlbiBwb3B1cCBvcGVuXG4gICAqL1xuICBzZXREeW5hbWljRGlhbG9nUmVmKHJlZjogYW55KXtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2UuZGlhbG9nQ29tcG9uZW50UmVmTWFwLmdldChyZWYpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnQgPSBkaWFsb2dSZWY/Lmluc3RhbmNlIGFzIER5bmFtaWNEaWFsb2dDb21wb25lbnQ7XG4gICAgY29uc3QgYXJpYUxhYmVsbGVkQnkgPSBkeW5hbWljQ29tcG9uZW50LmdldEFyaWFMYWJlbGxlZEJ5KCk7XG4gICAgZHluYW1pY0NvbXBvbmVudC5nZXRBcmlhTGFiZWxsZWRCeSA9ICgpID0+IGFyaWFMYWJlbGxlZEJ5O1xuICB9XG5cbiAgaW50ZXJjZXB0RGlhbG9nQ2xvc2UoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgfHwgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQpIHtcbiAgICAgIGlmIChjb25maXJtKFwiWW91IHdpbGwgbG9zZSBjaGFuZ2VzIG5vdCBzYXZlZCBvbiBwYWdlLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT9cIikgPT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBkaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZFxuICAgKi9cbiAgc2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKGZvcm1GaWVsZC5sb29rdXBDb250cm9sKSB7XG4gICAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICB0aGlzLmxvb2t1cEZvY3VzT3V0ID0gdHJ1ZTtcbiAgICAgIGxldCB2YWx1ZSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5zZXREaWFsb2dEYXRhKGZvcm1GaWVsZCwgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wpO1xuICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQgPyBmb3JtRmllbGQ/LmZpZWxkIDogZm9ybUZpZWxkPy5sYWJlbCk7XG4gICAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCB8fCB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSA9IHRoaXMuaW50ZXJjZXB0RGlhbG9nQ2xvc2UuYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKFxuICAgICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnVzZXJTZWFyY2hlZD1mYWxzZTtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmZpZWxkKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtRmllbGQuZmllbGQpPy5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0RGlhbG9nUmVzcG9uc2UoXG4gICAgICAgICAgICAgIGZvcm1GaWVsZCxcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wsXG4gICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubG9va3VwRm9jdXNPdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIGZvcm1GaWVsZC5vblJldHVybihmb3JtRmllbGQudmFsdWUsIHJlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgICAgICAgY29uc3QgZm9ybUZpZWxkVmFsdWUgPVxuICAgICAgICAgICAgdHlwZW9mIGZvcm1GaWVsZC52YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgPyBmb3JtRmllbGQudmFsdWUudGV4dFxuICAgICAgICAgICAgICA6IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgICAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZS50ZXh0IDogdmFsdWU7XG4gICAgICAgICAgaWYgKGZvcm1GaWVsZFZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudCh0cnVlKTtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLm9uQ2hhbmdlKGZvcm1GaWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoeyBlcnJvciB9OiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hcGlFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIG9uQ2xpY2sgZXZlbnQgaW52b2tlZCAmJiBvcGVuIERpYWxvZyBvbiBsb29rdXBDb250cm9sIGZpZWxkL2xhYmVsXG4gICAqL1xuICBoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIHRoaXMub25DbGlja0V2ZW50KGZvcm1GaWVsZCk7XG4gICAgaWYgKGZvcm1GaWVsZCAmJiBmb3JtRmllbGQubG9va3VwQ29udHJvbCkge1xuICAgICAgdGhpcy5zZWxlY3RMb29rdXBMYWJlbChmb3JtRmllbGQpO1xuICAgICAgdGhpcy5zZWxlY3RMb29rdXBGaWVsZChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIHNldE11bHRpU2VsZWN0Q2xhc3MoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgbGV0IG11bHRpU2VsZWN0Q2xhc3MgPSAnJ1xuICAgIGlmIChmb3JtRmllbGQuZXJyb3JNZXNzYWdlKSB7XG4gICAgICBpZiAoZm9ybUZpZWxkLnZhbHVlICYmIGZvcm1GaWVsZC52YWx1ZT8ubGVuZ3RoID4gMikge1xuICAgICAgICBtdWx0aVNlbGVjdENsYXNzID0gJ25nLWludmFsaWQgbmctZGlydHkgd3JhcC1jaGlwcyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdWx0aVNlbGVjdENsYXNzID0gJ25nLWludmFsaWQgbmctZGlydHknO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZm9ybUZpZWxkLnZhbHVlICYmIGZvcm1GaWVsZC52YWx1ZT8ubGVuZ3RoID4gMikge1xuICAgICAgICBtdWx0aVNlbGVjdENsYXNzID0gJ2Zvcm0tY29udHJvbCB3cmFwLWNoaXBzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11bHRpU2VsZWN0Q2xhc3MgPSAnZm9ybS1jb250cm9sIG5nLWRpcnR5JztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG11bHRpU2VsZWN0Q2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogc2V0IENhbGVuZGFyIERhdGUgRm9ybWF0ICYmIHNldCBEYXRlIE1pbnV0ZSBpbnRlcnZhbFxuICAgKi9cbiAgc2V0Q2FsZW5kYXJEYXRlKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSKSB7XG4gICAgICAvLyBjb252ZXJ0IHRpbWUgaW50byBkYXRlIGZvcm1hdFxuICAgICAgaWYgKFxuICAgICAgICBmb3JtRmllbGQudGltZU9ubHkgJiZcbiAgICAgICAgKGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fFxuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSlcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0VGltZUluRGF0ZShmb3JtRmllbGQudmFsdWUpO1xuICAgICAgfWVsc2UgaWYgKFxuICAgICAgICAoZm9ybUZpZWxkLnNob3dUaW1lIHx8IGZvcm1GaWVsZC50aW1lT25seSkgJiZcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgIGZvcm1GaWVsZC5taW51dGVzSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZShcbiAgICAgICAgICB1dGlsaXRpZXMuc2V0TWludXRlc0ludGVydmFsKGZvcm1GaWVsZC52YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChmb3JtRmllbGQuc2hvd1RpbWUgfHwgZm9ybUZpZWxkLnRpbWVPbmx5KSAmJlxuICAgICAgICAhZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgIGZvcm1GaWVsZC5taW51dGVzSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZSh1dGlsaXRpZXMuc2V0TWludXRlc0ludGVydmFsKG5ldyBEYXRlKCkpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsZW5kYXJQcmV2aW91c1ZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgIH1cbiAgfVxuICBjYWxlbmRhckNoYW5nZVZhbHVlKGZvcm1GaWVsZDogYW55KSB7XG4gICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAhPT0gZm9ybUZpZWxkLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICAgIGZvcm1GaWVsZC5wcmV2aW91c1ZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgICAgICBmb3JtRmllbGQub25DaGFuZ2UoZm9ybUZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaW52b2tlZCBzZWN0aW9uIENsaWNrZWQgZXZlbnRcbiAgICovXG4gIGNsaWNrZWRTZWN0aW9uKHNlY3Rpb246IElGb3JtU2VjdGlvbikge1xuICAgIHRoaXMuc2VjdGlvbkNsaWNrZWRFdmVudC5lbWl0KHNlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gZGlhbG9nIGluIE5vdGVfRmllbGQgY29ucnRyb2xcbiAgICovXG4gIGhhbmRsZU5vdGVGaWVsZERpYWxvZyhmb3JtZmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihOb3Rlc0NvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiBmb3JtZmllbGQubGFiZWwgYXMgc3RyaW5nLFxuICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybWZpZWxkLnZhbHVlLFxuICAgICAgICBkaXNhYmxlZFRleHQ6IGZvcm1maWVsZC5kaXNhYmxlZFRleHQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1maWVsZD8uZmllbGQgPyBmb3JtZmllbGQ/LmZpZWxkIDogZm9ybWZpZWxkPy5sYWJlbCk7XG4gICAgICB9KTtcbiAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhICYmIGZvcm1maWVsZC5vblJldHVybikge1xuICAgICAgICAgIGZvcm1maWVsZC5vblJldHVybihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICh7IGVycm9yIH0pID0+IHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBzZXRDbGFzc05hbWUoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKTogc3RyaW5nIHtcbiAgICBpZiAoZm9ybUZpZWxkLmhpZGRlbikgcmV0dXJuICcgaGlkZGVuJztcbiAgICBlbHNlIHJldHVybiAnJztcbiAgfVxuXG4gIGF1dG9TZWFyY2goZXZlbnQ6IGFueSwgZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBpZiAoZm9ybUZpZWxkICYmIGV2ZW50KSB7XG4gICAgICBmb3JtRmllbGQub25SZXR1cm4oZXZlbnQucXVlcnksIGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGludm9rZWQgb25Gb2N1c091dCBFdmVudFxuICAgKi9cbiAgb25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGxldCByZWNvcmQ6IGFueSA9IHt9O1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKHNlY3Rpb24pID0+IHtcbiAgICAgIHNlY3Rpb24/LmZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChmb3JtRmllbGQuZmllbGQpIHtcbiAgICAgICAgICByZWNvcmRbZm9ybUZpZWxkLmZpZWxkXSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdXRpbGl0aWVzLnNldEh5cGVybGlua1BhcmFtVmFsdWUocmVjb3JkLCB0aGlzLmZvcm0pO1xuICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgICBpZiAoZm9ybUZpZWxkICYmIGZvcm1GaWVsZC5vbkZvY3VzT3V0ICYmIHRoaXMubG9va3VwRm9jdXNPdXQgPT09IGZhbHNlKSB7XG4gICAgICBmb3JtRmllbGQub25Gb2N1c091dChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIG9uQmFja1NwYWNlRXZlbnQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKHR5cGVvZiBmb3JtRmllbGQudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUudGV4dCA9IGZvcm1GaWVsZC52YWx1ZS50ZXh0LnN1YnN0cmluZyhcbiAgICAgICAgMCxcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQubGVuZ3RoIC0gMVxuICAgICAgKTtcbiAgICAgIGlmIChmb3JtRmllbGQudmFsdWUudGV4dC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAvL3RoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb3JtRmllbGQudmFsdWUgJiYgZm9ybUZpZWxkLnZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAvLyB0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjbGVhciB0aGUgZHJvcGRvd24gdmFsdWUgd2hlbiBjbGljayBvbiB4XG4gICAqL1xuICBvbkNsZWFyVmFsdWUoZm9ybUZpZWxkOiBJRm9ybUZpZWxkLCBldmVudDogYW55KSB7XG4gICAvLyB0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICAgIHRoaXMub25DaGFuZ2VFdmVudChmb3JtRmllbGQpO1xuICAgIHRoaXMuZHJvcERvd25DaGFuZ2VFdmVudC5lbWl0KGZvcm1GaWVsZCk7XG4gICAgaWYgKCFldmVudC52YWx1ZSkge1xuICAgICAgdGhpcy5vbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckRyb3Bkb3duVmFsdWUoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBvbkNoYW5nZSBFdmVudCB3aGVuIFZhbHVlIENoYW5nZWRcbiAgICovXG4gIG9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudCh0cnVlKTtcbiAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICBmb3JtRmllbGQub25DaGFuZ2UoZm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICB0eXBlT2YodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogY29udmVydCB1blNhZmUgbGluayBpbnRvIHNhZmUgbGlua1xuICAgKi9cbiAgc2FuaXRpemVVcmwodXJsOiBzdHJpbmcpIHtcbiAgICBsZXQgbGlua1VybDogYW55ID0gdXJsO1xuICAgIGlmIChsaW5rVXJsKSB7XG4gICAgICBsaW5rVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChsaW5rVXJsKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmtVcmw7XG4gIH1cblxuICAvKipcbiAgICogaW52b2tlIG9uIGR5bmFtaWMgYnV0dG9ucyBjbGlja1xuICAgKi9cbiAgb25OZXdCdXR0b25DbGljayhidXR0b24pIHtcbiAgICBsZXQgc2F2ZUFsbEdyaWQ6IGFueSA9IFtdO1xuICAgIGxldCBnZXRCdG5zOiBhbnkgPSBbXTtcbiAgICBsZXQgdmFsaWRpdHkgPSB0cnVlO1xuICAgIGxldCBlcnJvck1lc3NhZ2VEZXRhaWxzID0gJyc7XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgaWYgKCF0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoZm9ybVNlY3Rpb24uZmllbGRzKSkge1xuICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHM/LmZvckVhY2goKGZvcm1GaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGZvcm1GaWVsZC5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMgPSBlcnJvck1lc3NhZ2VEZXRhaWxzXG4gICAgICAgICAgICAgID8gZXJyb3JNZXNzYWdlRGV0YWlscyArICcgLCAnICsgZm9ybUZpZWxkLmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5lcnJvck1lc3NhZ2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGZpZWxkID0gZm9ybVNlY3Rpb24uZmllbGRzLnNvbWUoXG4gICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5yZXF1aXJlZEZpZWxkICYmIGZpZWxkLmVycm9yTWVzc2FnZSAmJiAhZmllbGQudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHZhbGlkaXR5ICYmIGZpZWxkKSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VEZXRhaWxzLFxuICAgICAgICAgICAgNTAwMCxcbiAgICAgICAgICAgICdSRVFVSVJFRCBGSUVMRCdcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKGVycm9yTWVzc2FnZURldGFpbHMsIDUwMDAsICdJTlZBTElEIEZJRUxEJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRpdHkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZGl0eSkge1xuICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICBzYXZlQWxsR3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkICsgJyAnICsgJyNzYXZlQWxsR3JpZFZhbHVlcycpO1xuICAgICAgICAgIGdldEJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGZpZWxkPy5jb21wb25lbnRDb250cm9sPy5pZCArICcgJyArICcuc2F2ZVJvdycpO1xuICAgICAgICAgIGlmIChzYXZlQWxsR3JpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNhdmVBbGxHcmlkWzBdLmNsaWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGdldEJ0bnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgc2F2ZVJvd0J0biBvZiBnZXRCdG5zKSB7XG4gICAgICAgICAgICAgIHNhdmVSb3dCdG4/LmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgYnV0dG9uLmZ1bmMoKTtcbiAgfVxuXG4gIHNlbGVjdGVkQ2FyZENsaWNrRXZlbnQoZGF0YTogYW55KSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5mb3JtICYmXG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zICYmXG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbjogYW55KSA9PiB7XG4gICAgICAgIHNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5jYXJkICYmIGZpZWxkLmNhcmQuZGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsZXQgb2JqID0gZmllbGQuY2FyZC5kYXRhW2RhdGEuaW5kZXhdO1xuICAgICAgICAgICAgICBpZiAob2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iai5zZWxlY3RlZENhcmQpIHtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmouc2VsZWN0ZWRDYXJkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvYmpbJ3NlbGVjdGVkQ2FyZCddID0gJ2NhcmQtYWN0aXZlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChkYXRhLnNlbGVjdGVkQ2FyZCkge1xuICAgICAgZGF0YVsnc2VsZWN0ZWRDYXJkJ10gPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YVsnc2VsZWN0ZWRDYXJkJ10gPSAnY2FyZC1hY3RpdmUnO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVBhc3N3b3JkVHlwZShmb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLnRleHRUeXBlID09ICd0ZXh0Jykge1xuICAgICAgZm9ybUZpZWxkLnRleHRUeXBlID0gJ3Bhc3N3b3JkJztcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybUZpZWxkLnRleHRUeXBlID0gJ3RleHQnO1xuICAgIH1cbiAgfVxuICBvbkxpbmtDbGljayhsaW5rLCBmb3JtU2VjdGlvbil7XG4gICAgaWYoIWxpbmsuZGlzYWJsZWQgJiYgIWZvcm1TZWN0aW9uLmRpc2FibGVkKXtcbiAgICAgIGxpbmsub25DbGljaygpO1xuICAgIH1cbiAgfVxuICBpc1ZhbGlkQ29sdW1uKGNvbDogYW55KXtcbiAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGNvbCkgJiYgY29sID4gMCAmJiBjb2wgPD0gMTJcbiAgfVxuIGFzeW5jIGFkZER5bmFtaWNQYW5lbE92ZXJsYXlDb21wb25lbnQoaG92ZXJEYXRhIDpJT3ZlcmxheVBhbmVsRGF0YSwgb3ZlcmxheVBhbmVsLCBldmVudCk6IFByb21pc2U8dm9pZD57XG4gIHRoaXMubmdab25lLm9uU3RhYmxlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpPT57XG4gICAgICBjb25zdCBkYXRhID0gey4uLmhvdmVyRGF0YS5kYXRhfTtcbiAgICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0LmtleXMoaG92ZXJEYXRhLmRhdGEpO1xuICAgICAgaWYoZGF0YUtleXM/Lmxlbmd0aCA+MCApe1xuICAgICAgICBkYXRhS2V5cy5mb3JFYWNoKGtleT0+e1xuICAgICAgICAgIHZhciB2YWx1ZSA9ZGF0YVtrZXldO1xuICAgICAgICAgIGlmKHZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygneycpICYmIHZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnfScpKXtcbiAgICAgICAgICAgIHZhciB2YWx1ZVRvRmluZCA9IHZhbHVlLnJlcGxhY2UoJ3snLCcnKS5yZXBsYWNlKCd9JywnJyk7XG4gICAgICAgICAgICBkYXRhW2tleV09IHV0aWxpdGllcy5nZXRGb3JtRmllbGRWYWx1ZSh0aGlzLmZvcm0sIHZhbHVlVG9GaW5kKTtcbiAgICAgICAgICB9ZWxzZSBpZighdmFsdWUpe1xuICAgICAgICAgICAgdmFyIG1hdGNoZWRLZXlWYWx1ZSA9IHV0aWxpdGllcy5nZXRGb3JtRmllbGRWYWx1ZSh0aGlzLmZvcm0sIGtleSk7XG4gICAgICAgICAgICBkYXRhW2tleV09bWF0Y2hlZEtleVZhbHVlOyBcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBob3ZlckRhdGE/LnN0eWxlID8gKHRoaXMub3ZlcmxheVBhbmVsU3R5bGUgPSBob3ZlckRhdGEuc3R5bGUpIDogJyc7XG4gICAgICB0aGlzLnBhbmVsT3ZlcmxheVZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZjphbnkgPSB0aGlzLnBhbmVsT3ZlcmxheVZpZXdDb250YWluZXI/LmNyZWF0ZUNvbXBvbmVudChob3ZlckRhdGEuY29tcG9uZW50KTtcbiAgICAgIGNvbnNvbGUubG9nKGNvbXBvbmVudFJlZilcbiAgICAgIGlmKGhvdmVyRGF0YS5kYXRhKXtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNvbmZpZyA9IFtdO1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuY29uZmlnLmRhdGEgPSBkYXRhO1xuICAgICAgfVxuICAgICAgb3ZlcmxheVBhbmVsLnNob3coZXZlbnQpO1xuICAgICAgXG4gICAgIH0pXG4gIH1cbiAgbW91c2VMZWF2ZUV2ZW50KG92ZXJsYXlQYW5lbCl7XG4gICAgb3ZlcmxheVBhbmVsLmhpZGUoKTtcbiAgfVxuXG59XG5cbiIsIjxwLWNvbmZpcm1EaWFsb2cgW3N0eWxlXT1cInsgd2lkdGg6ICc1MHZ3JyB9XCIga2V5PVwiY2FuY2VsQnV0dG9uXCI+PC9wLWNvbmZpcm1EaWFsb2c+XG48ZGl2PlxuPGZvcm0gKm5nSWY9XCIhaXNGb3JtSGlkZGVuICYmIGZvcm1cIj5cbiAgPGRpdiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICA8cC1wcm9ncmVzc1NwaW5uZXIgY2xhc3M9XCJwcm9ncmVzcy1zcGlubmVyIHAtcHJvZ3Jlc3Mtc3Bpbm5lci1jaXJjbGUgY3VzdG9tLXNwaW5uZXJcIj48L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImZsZXgtd3JhcFwiPlxuICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsgJ2ZpeGVkLWhlaWdodCc6IHN0aWNreUFjdGlvbnMgfVwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZm9ybVNlY3Rpb24gb2YgZm9ybS5mb3JtU2VjdGlvbnNcIiBbY2xhc3NdPVwiIWZvcm1TZWN0aW9uLmhpZGRlbiA/ICdjYXJkIHctMTAwJyA6ICcnXCI+XG4gICAgICAgIDxzcGFuIChjbGljayk9XCJjbGlja2VkU2VjdGlvbihmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWZvcm1TZWN0aW9uID8gJycgOiBzZWN0aW9uRGlzYWJsZWQoZm9ybVNlY3Rpb24pXCI+XG4gICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJmb3JtU2VjdGlvbi5oaWRkZW4gPyAnaGlkZGVuJyA6IGZvcm1TZWN0aW9uLmNsYXNzXCI+XG4gICAgICAgICAgICAgIDxwLWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICA8cC1hY2NvcmRpb25UYWIgW3NlbGVjdGVkXT1cImZvcm1TZWN0aW9uLmV4cGFuZGVkID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybVNlY3Rpb24uYWNjb3JkaW9uRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiIWZvcm1TZWN0aW9uLnNob3dBY2NvcmRpb24gPyAnaGlkZS1hY2NvcmRpYW4nIDogJydcIj5cbiAgICAgICAgICAgICAgICAgIDxwLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cImZvcm1TZWN0aW9uLmljb25cIiBbdGl0bGVdPVwiZm9ybVNlY3Rpb24ubmFtZVwiIGNsYXNzPVwibXItMSBwbC0yXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1YnNlY3Rpb24taGVhZGVyXCI+e3sgZm9ybVNlY3Rpb24ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9wLWhlYWRlcj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIHAtY29sIGZvcm0tY29tcG9uZW50IGFjY29yZGlvbi1oZWFkZXItd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCIhZm9ybVNlY3Rpb24uc2hvd0FjY29yZGlvblwiIGZvcj1cIm5hbWVcIiBjbGFzcz1cImFjY29yZGlvbkhlYWRlck5hbWUgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBbdGl0bGVdPVwiZm9ybVNlY3Rpb24ubmFtZVwiIFtjbGFzc109XCJmb3JtU2VjdGlvbi5pY29uXCIgY2xhc3M9XCJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdj4ge3sgZm9ybVNlY3Rpb24ubmFtZSB9fSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBsaW5rIG9mIGZvcm1TZWN0aW9uLmxpbmtzXCIgPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1yLTMgY3VzdG9tLWxpbmtcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgW2NsYXNzXT1cImxpbmsubmFtZSAmJiFmb3JtU2VjdGlvbi5kaXNhYmxlZCYmIWxpbmsuZGlzYWJsZWQgID8gJ2N1c3RvbS1saW5rJyA6ICdkaXNhYmxlZC1saW5rJ1wiIChjbGljayk9XCJvbkxpbmtDbGljayhsaW5rLCBmb3JtU2VjdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxpbmsubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBoZWFkZXJGaWVsZCBvZiBmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdTd2l0Y2hdPVwiaGVhZGVyRmllbGQuY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLklOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dC1jb250cm9sIFtmaWVsZF09XCJoZWFkZXJGaWVsZFwiIChjaGFuZ2VQYXNzd29yZCk9XCJjaGFuZ2VQYXNzd29yZFR5cGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzRXZlbnQpPVwib25Gb2N1c091dEV2ZW50XCI+PC9pbnB1dC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5VTUVSSUNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG51bWVyaWMtY29udHJvbCBbZmllbGRdPVwiaGVhZGVyRmllbGRcIiAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0TG9va3VwKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIiAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvbnVtZXJpYy1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNIRUNLQk9YXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjaGVja2JveC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2hlY2tib3gtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBmb3JtLWNvbXBvbmVudCBmb3JtLWJvZHktd3JhcHBlclwiPiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cIihmb3JtRmllbGQuY29udHJvbD09PSdhZGRfYnV0dG9uJz8gJyBmb3JtLWJ1dHRvbi1maWVsZC13cmFwcGVyICc6JycpK1xuICAgICAgICAgICAgICAgICAgICAoIGlzVmFsaWRDb2x1bW4oZm9ybUZpZWxkLmNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgPyAnY29sLScgKyBmb3JtRmllbGQuY29sdW1uICsgc2V0Q2xhc3NOYW1lKGZvcm1GaWVsZClcbiAgICAgICAgICAgICAgICAgICAgOiBpc1ZhbGlkQ29sdW1uKGZvcm0uY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGZvcm0uY29sdW1uICsgc2V0Q2xhc3NOYW1lKGZvcm1GaWVsZClcbiAgICAgICAgICAgICAgICAgICAgOiBmb3JtRmllbGQuY29sdW1uIHx8IGZvcm0uY29sdW1uXG4gICAgICAgICAgICAgICAgICAgID8gJyBjb2wgJ1xuICAgICAgICAgICAgICAgICAgICA6ICdjb2wtMTIgbWQ6Y29sLTMgZmxleCBmbGV4LWNvbHVtbicgKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKSlcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9ybUZpZWxkLmNvbnRyb2wgPT09ICdicmVha19saW5lJyA/ICdicmVhay1saW5lJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmb3JtRmllbGQgb2YgZm9ybVNlY3Rpb24uZmllbGRzOyBsZXQgZm9ybUZpZWxkSW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGFiZWxDb250cm9sIEh5cGVybGluayBvbiBsb29rdXAgIENvbnRyb2wgRmllbGQtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZm9ybUZpZWxkLmxhYmVsPy5sYWJlbENvbnRyb2xcIiBjbGFzcz1cInRvRnJvbnRGb3JUb29sdGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIihmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmhvdmVyRGF0YSAmJiBmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmhvdmVyRGF0YS5jb21wb25lbnQpICYmIGFkZER5bmFtaWNQYW5lbE92ZXJsYXlDb21wb25lbnQoZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5ob3ZlckRhdGEsIG92ZXJsYXlQYW5lbCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCIoZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5ob3ZlckRhdGEgJiYgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5ob3ZlckRhdGEuY29tcG9uZW50KSAgJiYgbW91c2VMZWF2ZUV2ZW50KG92ZXJsYXlQYW5lbClcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluay1sYWJlbCBjdXN0b20tbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rICYmICFmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmxvb2t1cENvbnRyb2wgJiYgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5ob3ZlckRhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJmb3JtRmllbGQuZGlzYWJsZWRUZXh0ID8gJ2Rpc2FibGUtbGFiZWwtY29udHJvbCcgOiAnJyBcIj48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGFiZWxEaXNwbGF5XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGZvcm1GaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPjwvc3Bhbj4gXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLWxhYmVsIGN1c3RvbS1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtRmllbGQubGFiZWw/LmxhYmVsQ29udHJvbC5oeXBlcmxpbmsgJiYgZm9ybUZpZWxkLmxhYmVsPy5sYWJlbENvbnRyb2wuaHlwZXJsaW5rLnRhcmdldCAhPT0gJ19pZnJhbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRhYmluZGV4PVwiLTFcIiAoY2xpY2spPVwiZm9ybUZpZWxkLm9uQ2xpY2sgPyBvbkNsaWNrRXZlbnQoZm9ybUZpZWxkKSA6ICcnIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RhcmdldF09XCJmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sPy5oeXBlcmxpbms/LnRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvcm1GaWVsZC5kaXNhYmxlZFRleHQgPyAnZGlzYWJsZS1sYWJlbC1jb250cm9sJyA6ICcnIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwiZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbD8uaHlwZXJsaW5rPy5saW5rXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsYWJlbERpc3BsYXlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZC5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZm9ybUZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmstbGFiZWwgY3VzdG9tLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1GaWVsZC5sYWJlbD8ubGFiZWxDb250cm9sLmh5cGVybGluayAmJiBmb3JtRmllbGQubGFiZWw/LmxhYmVsQ29udHJvbC5oeXBlcmxpbmsudGFyZ2V0ID09PSAnX2lmcmFtZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRhYmluZGV4PVwiLTFcIiAoY2xpY2spPVwibG9hZExhYmVsQ29udHJvbElGcmFtZShmb3JtRmllbGQpXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxhYmVsRGlzcGxheVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGxhYmVsQ29udHJvbCBvbiBhZGRUZXh0Ym94LCBjYWxlbmRhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLWxhYmVsIGN1c3RvbS1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtRmllbGQubGFiZWwgJiYgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbCAmJiBmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmxvb2t1cENvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGFiaW5kZXg9XCItMVwiIFtjbGFzc109XCJmb3JtRmllbGQubGFiZWwuZGlzYWJsZWQgPyAnZGlzYWJsZS1sYWJlbC1jb250cm9sJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TG9va3VwTGFiZWwoZm9ybUZpZWxkLCAkZXZlbnQpXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsYWJlbERpc3BsYXlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZC5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZm9ybUZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGFiZWxEaXNwbGF5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJmb3JtRmllbGQubGFiZWwuaWNvblwiIFtjbGFzc109XCJmb3JtRmllbGQubGFiZWwuaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5sYWJlbC5pY29uXCI+IHt7Zm9ybUZpZWxkLmxhYmVsLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJmb3JtRmllbGQuY29udHJvbFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TUEFDRVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiZm9ybUZpZWxkLmNvbHVtbj8gJ2NvbC0nICtmb3JtRmllbGQuY29sdW1uIDogJydcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElucHV0IFRleHRBcmVhIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlRFWFRBUkVBXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzc109XCJmb3JtRmllbGQubGFiZWwub25DbGljayA/ICdjdXN0b20tbGluaycgOiAnJ1wiIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQubGFiZWwub25DbGljayAmJiBmb3JtRmllbGQubGFiZWwub25DbGljaygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZm9ybUZpZWxkLmxhYmVsLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZm9ybUZpZWxkLmxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGZvcm1GaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZy1pbnZhbGlkIG5nLWRpcnR5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Zvcm0tY29udHJvbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHBJbnB1dFRleHRhcmVhIFtyb3dzXT1cImZvcm1GaWVsZC5yb3cgPyBmb3JtRmllbGQucm93IDogMSBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIiAoY2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybUZpZWxkLnZhbHVlXCIgW25hbWVdPVwiZm9ybUZpZWxkLmZpZWxkXCIgW2Rpc2FibGVkXT1cImZvcm1GaWVsZC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7aGVpZ2h0OiBmb3JtRmllbGQuaGVpZ2h0ID8gZm9ybUZpZWxkLmhlaWdodCA6ICcnfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0LWNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiZm9ybUZpZWxkXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZVBhc3N3b3JkKT1cImNoYW5nZVBhc3N3b3JkVHlwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c0V2ZW50KT1cIm9uRm9jdXNPdXRFdmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L2lucHV0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5VTUVSSUNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG51bWVyaWMtY29udHJvbCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0TG9va3VwKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbnVtZXJpYy1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBhc3N3b3JkIElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5QQVNTV09SRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3NdPVwiZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2sgPyAnY3VzdG9tLWxpbmsnIDogJydcIiAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2sgJiYgZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2soKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZm9ybUZpZWxkLmxhYmVsLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZm9ybUZpZWxkLmxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGZvcm1GaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZy1pbnZhbGlkIG5nLWRpcnR5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Zvcm0tY29udHJvbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHR5cGU9XCJwYXNzd29yZFwiIChjbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIiBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwiZm9ybUZpZWxkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImZvcm1GaWVsZC5maWVsZFwiIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQ/LmlzVmFsaWRcIiBjbGFzcz1cImVycm9yXCI+e3sgZm9ybUZpZWxkLmVycm9yTWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZC5yZXF1aXJlZFwiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2hlY2tib3ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNIRUNLQk9YXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNoZWNrYm94LWNvbnRyb2wgW2Zvcm1GaWVsZF09IFwiZm9ybUZpZWxkXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jaGVja2JveC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYWxlbmRhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FMRU5EQVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiZm9ybUZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWNhbGVuZGFyLWhlYWRlci1zcGFuJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJmb3JtRmllbGQubGFiZWwub25DbGljayA/ICdjdXN0b20tbGluaycgOiAnJ1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1GaWVsZC5sYWJlbC5vbkNsaWNrICYmIGZvcm1GaWVsZC5sYWJlbC5vbkNsaWNrKClcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmb3JtRmllbGQubGFiZWwubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZC5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZm9ybUZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJpbnB1dFwiICBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZy1pbnZhbGlkIG5nLWRpcnR5ICcgKyBmb3JtRmllbGQuZmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdmb3JtLWNvbnRyb2wgJysgZm9ybUZpZWxkLmZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBbc2hvd0J1dHRvbkJhcl09XCIhZm9ybUZpZWxkLnRpbWVPbmx5XCIgWyhuZ01vZGVsKV09XCJmb3JtRmllbGQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZm9ybUZpZWxkLmZpZWxkXCIgW2Rpc2FibGVkXT1cImZvcm1GaWVsZC5kaXNhYmxlZFwiIGhvdXJGb3JtYXQ9XCIxMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdERhdGVdPVwiZGVmYXVsdERhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ZXBNaW51dGVdPVwiZm9ybUZpZWxkLm1pbnV0ZXNJbnRlcnZhbCA/IGZvcm1GaWVsZC5taW51dGVzSW50ZXJ2YWwgOiAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJmb3JtRmllbGQuc2hvd1RpbWVcIiAob25TaG93KT1cInNldENhbGVuZGFyRGF0ZShmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aW1lT25seV09XCJmb3JtRmllbGQudGltZU9ubHlcIiBbdmlld109XCJmb3JtRmllbGQubW9udGhPbmx5ID8gJ21vbnRoJyA6ICdkYXRlJyBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCJmb3JtRmllbGQ/LmZvcm1hdD8udHlwZSA/IGZvcm1GaWVsZC5mb3JtYXQ/LnR5cGUgOiBjYWxlbmRhckZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjYWxlbmRhckNoYW5nZVZhbHVlKGZvcm1GaWVsZClcIiAob25JbnB1dCk9XCJjYWxlbmRhcklucHV0VmFsdWUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbG9zZSk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFt0b2RheUJ1dHRvblN0eWxlQ2xhc3NdPVwiY29sdW1uLnRpbWVPbmx5ID8gJ2hpZGUtdG9kYXktYnRuJyA6ICdzaG93LXRvZGF5LWJ0bidcIiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQ/LmlzVmFsaWRcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7IGZvcm1GaWVsZC5lcnJvck1lc3NhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5EUk9QRE9XTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cIiFmb3JtRmllbGQubGFiZWw/LmxhYmVsQ29udHJvbFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJmb3JtRmllbGQubGFiZWwub25DbGljayA/ICdjdXN0b20tbGluaycgOiAnJ1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtRmllbGQubGFiZWwub25DbGljayAmJiBmb3JtRmllbGQubGFiZWwub25DbGljaygpXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZm9ybUZpZWxkLmxhYmVsLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZm9ybUZpZWxkLmxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZCAmJiAhZm9ybUZpZWxkLmxhYmVsPy5sYWJlbENvbnRyb2xcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIGRhdGEtdGl0bGUtZWxlbWVudD1cImlucHV0LHNwYW5cIiBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZy1pbnZhbGlkIG5nLWRpcnR5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFtzdHlsZUNsYXNzXT0nZm9ybUZpZWxkLmZpZWxkJyBbcGxhY2Vob2xkZXJdPVwiZm9ybUZpZWxkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZvcm1GaWVsZC5kYXRhXCIgW2ZpbHRlcl09XCJmb3JtRmllbGQuYWxsb3dTZWFyY2hcIiBbKG5nTW9kZWwpXT1cImZvcm1GaWVsZC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiZm9ybUZpZWxkLm9wdGlvbkxhYmVsXCIgW29wdGlvblZhbHVlXT1cImZvcm1GaWVsZC5vcHRpb25WYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJmb3JtRmllbGQuZmllbGRcIiAoa2V5dXAuVGFiKT1cInRhYkZvY3VzRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJEcm9wZG93blZhbHVlKGZvcm1GaWVsZClcIiBbZGlzYWJsZWRdPVwiZm9ybUZpZWxkLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIiBbc2hvd0NsZWFyXT1cImZvcm1GaWVsZC52YWx1ZSA/IHRydWUgOiBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DbGVhclZhbHVlKGZvcm1GaWVsZCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmb3JtRmllbGQudmFsdWUgPiAwID8gdHJ1ZSA6IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZm9ybUZpZWxkPy5pc1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZm9ybUZpZWxkLmhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwiZXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+e3sgZm9ybUZpZWxkLmVycm9yTWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQXV0b0NvbXBsZXRlIFNlYXJjaCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQVVUT0NPTVBMRVRFXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzc109XCJmb3JtRmllbGQubGFiZWwub25DbGljayA/ICdjdXN0b20tbGluaycgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2sgJiYgZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2soKVwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5sYWJlbC5vbkNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZvcm1GaWVsZC5sYWJlbC5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1mbHVpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtYXV0b0NvbXBsZXRlIGRhdGEtdGl0bGUtZWxlbWVudD1cImlucHV0LHNwYW5cIiBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZy1pbnZhbGlkIG5nLWRpcnR5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Zvcm0tY29udHJvbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIFtzdWdnZXN0aW9uc109XCJmb3JtRmllbGQuZGF0YVwiIFsobmdNb2RlbCldPVwiZm9ybUZpZWxkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiIChjbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxldGVNZXRob2QpPVwiYXV0b1NlYXJjaCgkZXZlbnQsIGZvcm1GaWVsZClcIiBbZHJvcGRvd25dPVwiZm9ybUZpZWxkLnNob3dPcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiZm9ybUZpZWxkLmRpc3BsYXlGaWVsZFwiIFtuYW1lXT1cImZvcm1GaWVsZC5sYWJlbFwiIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1GaWVsZC5kaXNhYmxlZFwiIChvbkJsdXIpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1hdXRvQ29tcGxldGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aS1zZWxlY3QgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk1VTFRJU0VMRUNUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzc109XCJmb3JtRmllbGQubGFiZWwub25DbGljayA/ICdjdXN0b20tbGluaycgOiAnJ1wiIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQubGFiZWwub25DbGljayAmJiBmb3JtRmllbGQubGFiZWwub25DbGljaygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQubGFiZWwub25DbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmb3JtRmllbGQubGFiZWwubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmb3JtRmllbGQubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZC5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZm9ybUZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJpbnB1dCxzcGFuXCIgW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TXVsdGlTZWxlY3RDbGFzcyhmb3JtRmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBbKG5nTW9kZWwpXT1cImZvcm1GaWVsZC52YWx1ZVwiIFtvcHRpb25zXT1cImZvcm1GaWVsZC5kYXRhXCIgW29wdGlvbkxhYmVsXT1cImZvcm1GaWVsZC5vcHRpb25MYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uVmFsdWVdPVwiZm9ybUZpZWxkLm9wdGlvblZhbHVlXCIgW2FwcGVuZFRvXT1cIidib2R5J1wiIFtuYW1lXT1cImZvcm1GaWVsZC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtRmllbGQub25DbGljayA/IGZvcm1GaWVsZC5vbkNsaWNrKCkgOiAnJ1wiIFtkaXNhYmxlZF09XCJmb3JtRmllbGQuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEh5cGVybGluay0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdkaXNhYmxlZC1saW5rJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdsaW5rLWxhYmVsIGN1c3RvbS1saW5rJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiICAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSFlQRVJMSU5LXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmh5cGVybGluayAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgKGNsaWNrKT1cImh5cGVybGlua0RpYWxvZyhmb3JtRmllbGQsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1GaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2Rpc2FibGVkLWxpbmsnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2xpbmstbGFiZWwgY3VzdG9tLWxpbmsnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmh5cGVybGluayAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuaHlwZXJsaW5rLnRhcmdldCAhPT0gJ19pZnJhbWUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0YWJpbmRleD1cIi0xXCIgW2hyZWZdPVwiZm9ybUZpZWxkLmRpc2FibGVkPycnOnNhbml0aXplVXJsKGZvcm1GaWVsZC5oeXBlcmxpbms/LmxpbmspXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YXJnZXRdPVwiZm9ybUZpZWxkLmh5cGVybGluaz8udGFyZ2V0XCIgKGNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9ybUZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5oeXBlcmxpbmsgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmh5cGVybGluay50YXJnZXQgPT09ICdfaWZyYW1lJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZm9ybUZpZWxkLmh5cGVybGluay5jb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwbC0yXCIgIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiB0YWJpbmRleD1cIi0xXCIgKGNsaWNrKT1cImxvYWRJRnJhbWUoZm9ybUZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTG9va3VwIENvbnRyb2wgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkxPT0tVUF9JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJmb3JtRmllbGQuZGlzYWJsZWQgPyAnZGlzYWJsZWQtbG9va3VwLWhlYWRlcicgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwiIWZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2sgPyAnY3VzdG9tLWxpbmsnIDogJydcIiAoY2xpY2spPVwiZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2sgJiYgZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2soKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU9mKGZvcm1GaWVsZC5sYWJlbCkgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZm9ybUZpZWxkLmxhYmVsLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmb3JtRmllbGQubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGZvcm1GaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsb3NlLWljb24td3JhcHBlclwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtaW5wdXQtaWNvbi1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZXZyb24tcmlnaHQgbG9va3VwLWlucHV0LWljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmctaW52YWxpZCBuZy1kaXJ0eSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdmb3JtLWNvbnRyb2wnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb21wb25lbnQgbG9va3VwLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJmb3JtRmllbGQudmFsdWUgJiYgdHlwZU9mKGZvcm1GaWVsZC52YWx1ZSkgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZvcm1GaWVsZC52YWx1ZS50ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZvcm1GaWVsZC52YWx1ZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImZvcm1GaWVsZC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImZvcm1GaWVsZC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtRmllbGQuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLlRhYik9XCJzZWxlY3RMb29rdXBGaWVsZChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIiAqbmdJZj1cImZvcm1GaWVsZC52YWx1ZSAmJiAhZm9ybUZpZWxkLmRpc2FibGVkXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibG9va3VwLWNsZWFyLWljb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImxvb2t1cENsZWFyVmFsdWUoZm9ybUZpZWxkKVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQ/LmlzVmFsaWRcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7IGZvcm1GaWVsZC5lcnJvck1lc3NhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZpbGUgVXBsb2FkIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5GSUxFX1VQTE9BRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9ybUZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1maWxlLXVwbG9hZCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd011bHRpcGxlXT1cImZvcm1GaWVsZC5zZWxlY3RNdWx0aXBsZUZpbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRGaWxlVHlwZXNdPVwiZm9ybUZpZWxkLlNldGZpbGVUeXBlc1wiIFtmaWVsZHNdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlVXJsKT1cInNldEZpbGVVcmxzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwbG9hZEZpbGVPblJldHVybik9XCJmaWxlT25jaGFuZ2VFdmVudCgpXCI+PC9zZS1maWxlLXVwbG9hZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0IEJ1dHRvbiBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJmb3JtRmllbGQuY2xhc3NcIiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTAgZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TRUxFQ1RCVVRUT05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCIhZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9ybUZpZWxkLmxhYmVsLm9uQ2xpY2sgPyAnY3VzdG9tLWxpbmsnIDogJydcIiAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5sYWJlbC5vbkNsaWNrICYmIGZvcm1GaWVsZC5sYWJlbC5vbkNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5sYWJlbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU9mKGZvcm1GaWVsZC5sYWJlbCkgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZvcm1GaWVsZC5sYWJlbC5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNlbGVjdEJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJmb3JtRmllbGQuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZm9ybUZpZWxkLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybUZpZWxkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZvcm1GaWVsZC5kYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybUZpZWxkLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJmb3JtRmllbGQuZGlzcGxheVN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXNlbGVjdEJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQ/LmlzVmFsaWRcIiBjbGFzcz1cImVycm9yXCI+e3sgZm9ybUZpZWxkLmVycm9yTWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEaXNwbGF5ICBDYXJkIGZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DQVJEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGZvcm1GaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtY2FyZCBbY2FyZF09XCJmb3JtRmllbGQuY2FyZFwiIFtzZXRDYXJkRGF0YV09XCJzZXRDYXJkRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDYXJkKT1cInNlbGVjdGVkQ2FyZENsaWNrRXZlbnQoJGV2ZW50KVwiPjwvc2UtY2FyZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3RlIERldGFpbCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTk9URV9GSUVMRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImZvcm1GaWVsZC5kaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnZGlzYWJsZWQtbGluaydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2xpbmstbGFiZWwgY3VzdG9tLWxpbmsnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZm9ybUZpZWxkLmRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaGFuZGxlTm90ZUZpZWxkRGlhbG9nKGZvcm1GaWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2Zvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5sYWJlbC5vbkNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZm9ybUZpZWxkLmxhYmVsLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmb3JtRmllbGQubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZC5yZXF1aXJlZEZpZWxkXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHluYW1pYyBDb21wb25lbnQgQ29udGFpbmVyLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiZm9ybUZpZWxkLmhpZGRlbiA/ICdoaWRkZW4nIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInt7Zm9ybVNlY3Rpb24ubmFtZX19LXt7Zm9ybUZpZWxkSW5kZXh9fVwiICNkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNPTVBPTkVOVFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhlYWRlciBjb21wb25lbnQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VDVElPTl9IRUFERVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzXT1cImZvcm1GaWVsZC5jbGFzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiID4gIHt7IGZvcm1GaWVsZC5sYWJlbCB9fSA8L2I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIE9uQ2xpY2sgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BRERfQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIiBbaWNvbl09XCJmb3JtRmllbGQuaWNvblwiIFt0aXRsZV09XCJmb3JtRmllbGQubGFiZWxcIiBbbGFiZWxdPVwiZm9ybUZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtRmllbGQuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie2JhY2tncm91bmQ6IGZvcm1GaWVsZC5jb2xvciA/IGZvcm1GaWVsZC5jb2xvciA6ICcnfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvcm1GaWVsZC5jbGFzcz9mb3JtRmllbGQuY2xhc3M6JydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgR2VuZXJhdGUgUmVwb3J0IEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUkVQT1JUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWdlbmVyYXRlLXJlcG9ydC1idG4gW3JlcEluZm9dPVwiZm9ybUZpZWxkXCIgW2xhYmVsXT1cImZvcm1GaWVsZC5sYWJlbFwiIFt0aXRsZV09XCJmb3JtRmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmFtc109XCJmb3JtRmllbGQucGFyYW1zXCIgW3Nob3dEaWFsb2ddPVwiZm9ybUZpZWxkLnNob3dEaWFsb2dcIiBbcmVwb3J0VHlwZV09XCIgZm9ybUZpZWxkLnJlcG9ydFR5cGVcIiBbcmVwb3J0SGVhZGVyXT1cImZvcm1GaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImZvcm1GaWVsZC5yZXBvcnRGb290ZXJcIiBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiZm9ybUZpZWxkLmljb25cIiBbY2xhc3NdPVwiZm9ybUZpZWxkLmNsYXNzXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBJbnB1dCBTd2l0Y2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNXSVRDSFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXRTd2l0Y2ggW25hbWVdPVwiZm9ybUZpZWxkLmxhYmVsID8gZm9ybUZpZWxkLmxhYmVsOiAnc3dpdGNoJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1GaWVsZC52YWx1ZVwiIFtkaXNhYmxlZF09XCJmb3JtRmllbGQuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tFdmVudChmb3JtRmllbGQpXCI+PC9wLWlucHV0U3dpdGNoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxuICAgICAgICAgICAgICA8L3AtYWNjb3JkaW9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc3Bhbj5cblxuICAgIDwhLS0gc2F2ZSBhbmQgY2xvc2UgYnV0dG9ucyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGFjdGlvbnMtYnV0dG9ucy1tYWluLXdyYXBwZXIgZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCIgW25nQ2xhc3NdPVwieyBzdGlja3k6IHN0aWNreUFjdGlvbnMgfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlubmVyLXN0aWNreSBmb3JtLWNvbXBvbmVudCBhY3Rpb25zLWJ1dHRvbnMtd3JhcHBlci1kaXZcIj5cbiAgICAgICAgPCEtLSBzYXZlIGJ1dHRvbiAtLT5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFoaWRlU2F2ZUJ1dHRvblwiIFtkaXNhYmxlZF09XCJpc0Zvcm1EaXNhYmxlZFwiIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgW2xhYmVsXT1cInNhdmVCdXR0b25MYWJlbCA/IHNhdmVCdXR0b25MYWJlbCA6ICdTYXZlJ1wiIGNsYXNzPVwicC1idXR0b24tc3VjY2VzcyBmb3JtLXNhdmUtYnV0dG9uXCIgKGNsaWNrKT1cIm9uU2F2ZUZvcm0oKVwiPjwvYnV0dG9uPlxuICAgICAgICA8IS0tIGNsb3NlIGJ1dHRvbiAtLT5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFoaWRlQ2FuY2VsQnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRm9ybURpc2FibGVkXCIgKGNsaWNrKT1cIm9uQ2FuY2VsRm9ybSgpXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIiBbbGFiZWxdPVwiY2FuY2VsQnV0dG9uTGFiZWwgPyBjYW5jZWxCdXR0b25MYWJlbCA6ICdDYW5jZWwnXCIgY2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIgbWwtM1wiPjwvYnV0dG9uPiAgICAgICBcbiAgICAgICAgIDwhLS0gZHluYW1pYyBidXR0b25zIC0tPlxuICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGZvcm1CdXR0b25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFidXR0b24uaGlkZGVuXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2xhYmVsXT1cImJ1dHRvbi5sYWJlbFwiIFtpY29uXT1cImJ1dHRvbi5pY29uID8gYnV0dG9uLmljb24gOiAnJ1wiXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3MgbWwtM1wiIChjbGljayk9XCJvbk5ld0J1dHRvbkNsaWNrKGJ1dHRvbilcIiBbZGlzYWJsZWRdPVwiYnV0dG9uLmRpc2FibGVkID8gYnV0dG9uLmRpc2FibGVkIDogZmFsc2VcIj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Zvcm0+XG48cC1vdmVybGF5UGFuZWwgW3N0eWxlXT1cIm92ZXJsYXlQYW5lbFN0eWxlXCIgI292ZXJsYXlQYW5lbD5cbiAgPG5nLWNvbnRhaW5lciAjdmlld0NvbnRhaW5lclJlZj48L25nLWNvbnRhaW5lcj5cbjwvcC1vdmVybGF5UGFuZWw+XG48L2Rpdj4iXX0=
1425
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUErQyxZQUFZLEVBQStCLGdCQUFnQixFQUFjLFlBQVksRUFBcUIsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBSWxQLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBMEMsVUFBVSxFQUE2QixXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFFL0UsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNN0QsT0FBTyxFQUFnQixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXRDLE1BQU0sT0FBTyxhQUFhO0lBaUJ4QixJQUFhLGNBQWMsQ0FBQyxHQUFRO1FBQ2xDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtZQUNoQixRQUFRLENBQUM7U0FD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LEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUlPLGNBQWM7c0JBQTFCLEtBQUs7Z0JBS0ksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBNkNQLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxxQkFBcUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgQ2hhbmdlRGV0ZWN0b3JSZWYsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0LCBDb21wb25lbnRGYWN0b3J5LCBWaWV3Q29udGFpbmVyUmVmLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIFJlbmRlcmVyMiwgTmdab25lLCBWaWV3Q2hpbGQsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UsIER5bmFtaWNEaWFsb2dDb21wb25lbnQgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xuaW1wb3J0IHsgTm90ZXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvbm90ZXMvbm90ZXMuY29tcG9uZW50JztcbmltcG9ydCB7IEVGb3JtQ29udHJvbCwgRUh5cGVybGluaywgSUZvcm1GaWVsZCwgSUR5bmFtaWNGb3JtLCBJRm9ybVNlY3Rpb24sIEVWYWxpZGF0b3IsIElEeW5hbWljQ2FyZCwgSUZvcm1CdXR0b24sIEVGb3JtYXRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2Zvcm0ubW9kZWwnO1xuaW1wb3J0IHsgRVBlcm1pc3Npb25UeXBlLCBJUGVybWlzc2lvbiB9IGZyb20gJy4uLy4uLy4uL21vZGVscy91c2VyLWluZm8ubW9kZWwnO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aGVudGljYXRpb24uc2VydmljZSc7XG5pbXBvcnQgKiBhcyB1dGlsaXRpZXMgZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWZyYW1lQ29tcG9uZW50IH0gZnJvbSAnLi4vaWZyYW1lL2lmcmFtZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSURpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY29tbW9uLm1vZGVsJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBHcmlkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dyaWQuc2VydmljZSc7XG5pbXBvcnQgeyBQYWdlTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BhZ2UtbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBpbnRlcnZhbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSHlwZXJsaW5rU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2h5cGVybGluay5zZXJ2aWNlJztcbmltcG9ydCB7IGRyYWdnYWJsZURpYWxvZyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdGllcy5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJT3ZlcmxheVBhbmVsRGF0YSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9ncmlkLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2UtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZCgndmlld0NvbnRhaW5lclJlZicsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6dHJ1ZX0pXG4gIHB1YmxpYyBwYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuICBAVmlld0NoaWxkcmVuKCdkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGR5bmFtaWNDb21wb25lbnRDb250YWluZXI6IFF1ZXJ5TGlzdDxWaWV3Q29udGFpbmVyUmVmPjtcblxuICBASW5wdXQoKSBzdGlja3lBY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZm9ybTogSUR5bmFtaWNGb3JtO1xuICBASW5wdXQoKSBzYXZlQnV0dG9uTGFiZWw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBjYW5jZWxCdXR0b25MYWJlbDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGhpZGVTYXZlQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhpZGVDYW5jZWxCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZm9ybUJ1dHRvbnM6IElGb3JtQnV0dG9uW10gPSBbXTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIG92ZXJsYXlQYW5lbFN0eWxlOiB7fTtcbiAgXG4gIEBJbnB1dCgpIHNldCBhY3RpdmVUZXN0TW9kZSh2YWw6IGFueSkge1xuICAgIGlmICh2YWwgPT09IHRydWUpIHtcbiAgICAgIGRlYnVnZ2VyO1xuICAgIH1cbiAgfVxuICBAT3V0cHV0KCkgc2F2ZUZvcm06IEV2ZW50RW1pdHRlcjxJRm9ybVNlY3Rpb25bXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBjYW5jZWxGb3JtOiBFdmVudEVtaXR0ZXI8SUZvcm1TZWN0aW9uW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZHJvcERvd25DaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWN0aW9uQ2xpY2tlZEV2ZW50OiBFdmVudEVtaXR0ZXI8SUZvcm1TZWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBkeW5hbWljQ2FzZSA9IEVGb3JtQ29udHJvbDtcbiAgc2F2ZUZvcm1QYWdlOiBTdWJzY3JpcHRpb247XG4gIHBlcm1pc3Npb25UeXBlID0gRVBlcm1pc3Npb25UeXBlO1xuICByb2xlczogc3RyaW5nW10gPSBbXTtcbiAgaXNGb3JtRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNGb3JtSGlkZGVuOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbXBvbmVudHNMaXN0OiBJRGljdGlvbmFyeVtdID0gW107XG4gIGZpbGVVcGxvYWRVcmxzOiBhbnk7XG4gIHNob3dmaWxlVXBsb2FkRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2FyZExpc3Q6IElEeW5hbWljQ2FyZDtcbiAgY2FsZW5kYXJQcmV2aW91c1ZhbHVlOiBzdHJpbmcgPSAnJztcbiAgZGVmYXVsdERhdGU6IHN0cmluZyA9ICcnO1xuICBsb29rdXBGb2N1c091dDogYm9vbGVhbiA9IGZhbHNlO1xuICBjYWxlbmRhckZvcm1hdDogc3RyaW5nID0gJ21tL2RkL3l5JztcbiAgc2V0Q2FyZERhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIGRpYWxvZ1JlZjogYW55O1xuXG4gIC8vIGFwcGx5IGNoZWNrZWQvdW5DaGVja2VkIHByb3AgZm9yIENoZWNrQm94IG9mIHRoZSBGb3JtXG4gIGNoZWNrZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICB1bkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtU2VydmljZTogRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwdWJsaWMgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgaHlwZXJsaW5rU2VydmljZSA6IEh5cGVybGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcbiAgICBwcml2YXRlIGdyaWRTZXJ2aWNlOiBHcmlkU2VydmljZSxcbiAgICBwcml2YXRlIHBhZ2VMb2dnZXJTZXJ2aWNlOiBQYWdlTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgLy8gYnJvd3NlciB0YWIgY2xvc2UgZXZlbnRcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcsIFsnJGV2ZW50J10pXG4gIGJlZm9yZXVubG9hZEhhbmRsZXIoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCB8fCB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5mb3JtU2VydmljZS5zZXRUb29sdGlwKCk7XG4gICAgLy8gYXBwbHkgdXNlciByb2xlIHBlcm1pc3Npb25zIG9uIGZvcm1cbiAgICB0aGlzLnJvbGVzID0gdGhpcy5hdXRoU2VydmljZS5nZXRVc2VyUm9sZXMoKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm0gJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgLy8gc3RhcnQgY2FyZExpc3QgcmVmZXJlbmNlIGJyZWFrIGZ1bmN0aW9uYWxpdHlcbiAgICAgIGxldCBmb3JtVmFsdWVzID0geyAuLi50aGlzLmZvcm0gfTtcblxuICAgICAgZm9ybVZhbHVlcy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBpZihmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHM/Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzLmZvckVhY2goKGhlYWRlckZpZWxkKT0+e1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrRmllbGRSZXF1aXJlZChoZWFkZXJGaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZpZWxkUmVxdWlyZWQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmlzUGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgZmllbGQudGV4dFR5cGUgPSAncGFzc3dvcmQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdGltZSBpbnRvIGRhdGVcbiAgICAgICAgICAgIGlmIChmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmIGZpZWxkPy5vbkNoYW5nZSkge1xuICAgICAgICAgICAgICBmaWVsZFsncHJldmlvdXNWYWx1ZSddID0gZmllbGQ/LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmXG4gICAgICAgICAgICAgIGZpZWxkPy50aW1lT25seSAmJlxuICAgICAgICAgICAgICAoZmllbGQ/LnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdBTScpIHx8XG4gICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUoZmllbGQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkFVVE9DT01QTEVURSAmJlxuICAgICAgICAgICAgICBmaWVsZD8udmFsdWUgJiZcbiAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZD8udmFsdWUubWFwKFxuICAgICAgICAgICAgICAgICh2YWx1ZTogYW55KSA9PiB2YWx1ZVtmaWVsZD8uZGlzcGxheUZpZWxkXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgICAgICAodmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJzsnKSB8fFxuICAgICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJywnKSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCcsJywgJzsnKVxuICAgICAgICAgICAgICAgICAgPy5zcGxpdCgnOycpXG4gICAgICAgICAgICAgICAgICA/Lm1hcCgodmFsOiBhbnkpID0+ICh7IFtmaWVsZD8uZGlzcGxheUZpZWxkXTogdmFsIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCB0aGUgbXVsdGlTZWxlY3Qgc3RyaW5nIHZhbHVlIGluIGFycmF5XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTVVMVElTRUxFQ1QgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnLCcpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZS5yZXBsYWNlKC9cXHMqLFxccyovZywgXCIsXCIpPy50b1N0cmluZygpPy5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gW2ZpZWxkLnZhbHVlXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgICAgICB0aGlzLmZvcm0gPSB7fTtcbiAgICAgICAgICAgICAgZmllbGQ/LmNhcmQ/LmRhdGE/LmZvckVhY2goKHg6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5mb3JtU2VjdGlvbnMgJiZcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHguZHluYW1pY0Zvcm0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uczogSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmaWVsZD8uY2FyZD8uZm9ybVNlY3Rpb25zKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmZvcm0gPSBmb3JtVmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW5kIGNhcmRMaXN0IHJlZmVyZW5jZSBicmVhayBmdW5jdGlvbmFsaXR5XG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9XG4gICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHxcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gJ3knIHx8XG4gICAgICAgICAgICAgICAgICBmaWVsZD8udmFsdWU/LnRvU3RyaW5nKCkgPT09ICcxJ1xuICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwbHlVc2VyUGVybWlzc2lvbnMoKTtcbiAgICAgIHRoaXMucmVtb3ZlV2hpdGVTcGFjZXMoKTtcbiAgICAgIHRoaXMuc2V0SHlwZXJsaW5rQ29tcG9uZW50Um91dGUoKTtcbiAgICAgIHRoaXMuc2V0Q2FsYW5kZXJXaWR0aCgpO1xuICAgICAgdGhpcy5vcmRlckZvcm1TZWN0aW9ucygpO1xuICAgICAgdGhpcy5vbkR5bmFtaWNGb3JtU3RhdGVDaGFuZ2UoKTtcbiAgICB9XG4gIH1cbiAgb3JkZXJGb3JtU2VjdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuZm9ybSAmJiB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50VXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdDdXJyZW50VXNlckluZm8nKSk7XG4gICAgICBsZXQgdXNlclNlY3Rpb24gPSBjdXJyZW50VXNlckluZm8/LnBhZ2VTZWN0aW9ucz8ubGVuZ3RoID4gMCA/IGN1cnJlbnRVc2VySW5mby5wYWdlU2VjdGlvbnMgOiBbXTtcbiAgICAgIGNvbnN0IHBhZ2VVcmwgPSB0aGlzLnBhZ2VOYW1lKCk7XG4gICAgICBpZiAodXNlclNlY3Rpb24/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXNlclNlY3Rpb24gPSB1c2VyU2VjdGlvbi5zb3J0KChhLCBiKSA9PiBiLmlkIC0gYS5pZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwidXNlclNlY3Rpb246XCIsIHVzZXJTZWN0aW9uKVxuICAgICAgICB1c2VyU2VjdGlvbi5mb3JFYWNoKChwYWdlU2VjdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hdGNoZWROYW1lOiBib29sZWFuID0gdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uc29tZSgoc2VjdGlvbikgPT4gcGFnZVNlY3Rpb24/LnNlY3Rpb24/LnRvTG93ZXJDYXNlKCkgPT09IHNlY3Rpb24/Lm5hbWU/LnRvTG93ZXJDYXNlKCkpICYmIHBhZ2VTZWN0aW9uPy5wYWdlPy50b0xvd2VyQ2FzZSgpID09PSBwYWdlVXJsPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChtYXRjaGVkTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5maW5kSW5kZXgoKHNlY3Rpb24pID0+IHBhZ2VTZWN0aW9uPy5zZWN0aW9uPy50b0xvd2VyQ2FzZSgpID09PSBzZWN0aW9uPy5uYW1lPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmIChwYWdlU2VjdGlvbi5yb2xlKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVzPy5sZW5ndGggPiAwICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocGFnZVNlY3Rpb24ucm9sZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN3YXBTZWN0aW9ucyhwYWdlU2VjdGlvbi5vcmRlciAtIDEsIGluZGV4KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zW2luZGV4XS5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnN3YXBTZWN0aW9ucyhwYWdlU2VjdGlvbi5vcmRlciAtIDEsIGluZGV4KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH07XG4gIH1cbiAgc3dhcFNlY3Rpb25zKG9yZGVyOiBudW1iZXIsIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByZU9yZGVyU2VjdGlvbiA9IHsgLi4udGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tvcmRlcl0gfTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zW29yZGVyXSA9IHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdO1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdID0gcmVPcmRlclNlY3Rpb247XG4gIH1cbiAgcGFnZU5hbWUoKSB7XG4gICAgbGV0IHVybCA9IHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpO1xuICAgIGlmICh1cmw/LmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIHVybCA9IHVybC5zcGxpdCgnPycpWzBdO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHNldEZvcm1TZWN0aW9uKHNlY3Rpb24sIGluZGV4LCBwYWdlU2VjdGlvbikge1xuICAgIGNvbnN0IHJlT3JkZXJTZWN0aW9uID0geyAuLi5zZWN0aW9uIH07XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuc3BsaWNlKHBhZ2VTZWN0aW9uPy5vcmRlciAtIDEsIDAsIHJlT3JkZXJTZWN0aW9uKTtcbiAgfVxuICBjaGVja0ZpZWxkUmVxdWlyZWQoZmllbGQ6IGFueSkge1xuICAgaWYoZmllbGQudmFsaWRhdGlvbnM/LmZpbmQodmFsaWRhdGlvbj0+dmFsaWRhdGlvbi50eXBlPT09RVZhbGlkYXRvci5SRVFVSVJFRCkpe1xuICAgICAgZmllbGQucmVxdWlyZWRGaWVsZCA9IHRydWU7XG4gICB9XG4gIH1cblxuICAvLyBzZXQgY2FsZW5kYXIgMiBPciA0IGRpZ2l0IHllYXIgZm9ybWF0XG4gIGNhbGVuZGFySW5wdXRWYWx1ZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZighZm9ybUZpZWxkLnRpbWVPbmx5KXtcbiAgICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmb3JtRmllbGQuZmllbGQpWzBdXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKHZhbDogYW55KSA9PiB7XG4gICAgICAgIGlmICghdmFsPy50YXJnZXQ/LnZhbHVlPy5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgaWYgKHZhbD8udGFyZ2V0Py52YWx1ZT8ubGVuZ3RoID09IDggfHwgZm9ybUZpZWxkPy5mb3JtYXQ/LnR5cGUgPT09IEVGb3JtYXRUeXBlLlNIT1JUREFURSkge1xuICAgICAgICAgICAgdmFsLnRhcmdldC52YWx1ZSA9IHZhbD8udGFyZ2V0Py52YWx1ZT8ucmVwbGFjZSgvKFxcZHsyfSkoXFxkezJ9KShcXGR7NH0pLywgJyQxLyQyLyQzJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHZhbD8udGFyZ2V0Py52YWx1ZS5sZW5ndGggPT0gNikge1xuICAgICAgICAgICAgdmFsLnRhcmdldC52YWx1ZSA9IHZhbD8udGFyZ2V0Py52YWx1ZT8ucmVwbGFjZSgvKFxcZHsyfSkoPz1cXGQpL2csICckMS8nKS50b1N0cmluZygpO1xuICAgICAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB5ZWFyID0gdmFsPy50YXJnZXQ/LnZhbHVlPy50b1N0cmluZygpLnNwbGl0KCcvJylbMl07XG4gICAgICAgIGlmICh5ZWFyPy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3l5JztcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZSh2YWw/LnRhcmdldD8udmFsdWUpPy50b0xvY2FsZURhdGVTdHJpbmcoXG4gICAgICAgICAgICAnZW4tVVMnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3knO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgIFxuICB9XG5cbiAgLy8gc2V0IHBlcmNlbnQgYW5kIGRlY2ltYWwgdmFsdWVzXG4gIHNldG51bWVyaWN2YWx1ZXMoKSB7XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzKSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTlVNRVJJQykge1xuICAgICAgICAgICAgY29uc3QgZGlnaXRzSW5mbyA9IGZpZWxkPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcbiAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5hbGxvd0NhbGN1bGF0ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICAgIChmaWVsZC52YWx1ZSAqIDEwMCk/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSAqIDEwMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChmaWVsZC52YWx1ZSkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KGZpZWxkLnZhbHVlKS50b0ZpeGVkKFxuICAgICAgICAgICAgICAgICAgZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAyXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZm9ybSBoYXMgYW55IGZpZWxkIHdpdGggZHluYW1pYyBjb21wb25lbnQ7XG4gICAqIENyZWF0ZXMgY29tcG9uZW50IGluc3RhbmNlIHVzaW5nIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxuICAgKiBJbmplY3RzIGNvbXBvbmVudCB0aHJvdWdoIHZpZXdSZWYuY3JlYXRlQ29tcG9uZW50KClcbiAgICogUGFzc2VzIGRhdGEgdG8gY29tcG9uZW50XG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIGV2ZW50cyBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudHNcbiAgICogRmluYWxseSBmb3JjZXMgQW5ndWxhciB0byBkZXRlY2ggY2hhbmdlc1xuICAgKi9cbiAgbG9hZER5bmFtaWNDb21wb25lbnRzKCkge1xuICAgIHRoaXMuY29tcG9uZW50c0xpc3QgPSBbXTtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55LCBmaWVsZEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ09NUE9ORU5UKSB7XG4gICAgICAgICAgY29uc3Qgdmlld1JlZjogYW55ID0gdGhpcy5keW5hbWljQ29tcG9uZW50Q29udGFpbmVyLmZpbmQoXG4gICAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgICAgeC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaWQgPT0gYCR7Zm9ybVNlY3Rpb24ubmFtZX0tJHtmaWVsZEluZGV4fWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogQ29tcG9uZW50LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGhhbmRsZXJzLFxuICAgICAgICAgIH0gPSBmaWVsZC5jb21wb25lbnRDb250cm9sO1xuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PiA9XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShDb21wb25lbnQpO1xuICAgICAgICAgIC8vIFBhc3NpbmcgZGF0YSB0byBjb21wb25lbnRcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB2aWV3UmVmPy5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgaWYoZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkKXtcbiAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlcjIuYWRkQ2xhc3MoY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIGZpZWxkLmNvbXBvbmVudENvbnRyb2wuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSA/PyB7fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xpc3QucHVzaCh7XG4gICAgICAgICAgICAgIG5hbWU6IGZpZWxkLmNvbXBvbmVudENvbnRyb2w/LmlkLFxuICAgICAgICAgICAgICB2YWx1ZTogY29tcG9uZW50UmVmLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBTdWJzY3JpYmVzIHRvIHRoZSBldmVudHMgcGFzc2VkIHRvIHRoZSBjb21wb25lbnRzXG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaGFuZGxlcnMpLmZvckVhY2goKFtldmVudCwgaGFuZGxlcl06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIChjb21wb25lbnRSZWYuaW5zdGFuY2VbZXZlbnRdIGFzIEV2ZW50RW1pdHRlcjxhbnk+KT8uc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpbnZva2UgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvL2ludm9rZSB3aGVuIGZpbGUgdXBsb2FkIE9SIGRlbGV0ZSBhIGZpbGVcbiAgZmlsZU9uY2hhbmdlRXZlbnQoKSB7XG4gICAgdGhpcy5zZXRDYXJkRGF0YSA9ICF0aGlzLnNldENhcmREYXRhO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIGxvYWQgZHluYW1pYyBjb21wb25lbnRzIGlmIGV4aXN0IGluIGZvcm1cbiAgICB0aGlzLnNldG51bWVyaWN2YWx1ZXMoKTtcbiAgICB0aGlzLm9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpO1xuICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnRzKCk7XG4gICAgdGhpcy5zZXRDYXJkUmVzcG9uc2VJZCgpO1xuICB9XG5cbiAgc2V0Q2FyZFJlc3BvbnNlSWQoKSB7XG4gICAgdXRpbGl0aWVzLm9uRHluYW1pY0NhcmRTdGF0ZUNoYW5nZSgpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZihyZXMuZGF0YT8uaXNTYXZlKXtcbiAgICAgICAgdGhpcy5zZXRDYXJkSWRzKHJlcy5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0RGVsZXRlQ2FyZElkKHJlcy5kYXRhPy5jYXJkRGF0YSwgcmVzLmRhdGE/LmR5bmFtaWNGb3JtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldERlbGV0ZUNhcmRJZCh1cGRhdGVkQ2FyZERhdGE6YW55LCBkeW5hbWljRm9ybTogSUR5bmFtaWNGb3JtKXtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoc2VjdGlvbjpJRm9ybVNlY3Rpb24pPT57XG4gICAgICBjb25zdCBjYXJkQ29udHJvbCA9IHNlY3Rpb24uZmllbGRzLmZpbmQoKGZpZWxkOklGb3JtRmllbGQpPT4gZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpO1xuICAgICAgaWYoY2FyZENvbnRyb2wpe1xuICAgICAgICBjYXJkQ29udHJvbC5jYXJkLmRhdGEgPSB1cGRhdGVkQ2FyZERhdGE7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIGR5bmFtaWNGb3JtID0gdGhpcy5mb3JtO1xuICB9XG5cbiAgc2V0Q2FyZElkcyhyZXMpIHtcbiAgICByZXMucmVjb3JkcyA9IHRoaXMuZ3JpZFNlcnZpY2Uuc2V0RGF0YUZpZWxkcyhyZXMucmVjb3Jkcyk7XG4gICAgcmVzLnJlY29yZHM/LmZvckVhY2goKHJlY29yZDogYW55LCByZWNvcmRJbmRleDogYW55KSA9PiB7XG4gICAgICBjb25zdCBtYXRjaENhcmQgPSByZXMuY2FyZHNJbmZvPy5maW5kKFxuICAgICAgICAoaW5mbywgY2FyZEluZGV4KSA9PlxuICAgICAgICAgIHJlY29yZEluZGV4ID09PSBjYXJkSW5kZXggJiYgcmVjb3JkW3Jlcy5maWVsZE5hbWU/LnRvTG93ZXJDYXNlKCldXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoQ2FyZCAmJiBPYmplY3Qua2V5cyhtYXRjaENhcmQpPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1hdGNoQ2FyZFtyZXMuZmllbGROYW1lXSA9IHJlY29yZFtyZXMuZmllbGROYW1lPy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQ7XG4gICAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZihyZXMuY2FyZElkKXtcbiAgICAgICAgICBmb3JtRmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHM/LmZpbmQoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEICYmIGZpZWxkLmlkID09PSByZXMuY2FyZElkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHM/LmZpbmQoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGZvcm1GaWVsZCkge1xuICAgICAgICAgIGlmIChyZXMuY2FyZHNJbmZvPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXMuY2FyZHNJbmZvPy5mb3JFYWNoKChjYXJkSWQpID0+IHtcbiAgICAgICAgICAgICAgY2FyZElkLmlkID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JtRmllbGQuY2FyZC5kYXRhID0gcmVzLmNhcmRzSW5mbztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2V0Q2FyZERhdGEgPSAhdGhpcy5zZXRDYXJkRGF0YTtcbiAgfVxuXG4gIHJlbW92ZVdoaXRlU3BhY2VzKCkge1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoc2VjdGlvbi5jbGFzcykgc2VjdGlvbi5jbGFzcyA9IHNlY3Rpb24uY2xhc3MucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldEh5cGVybGlua0NvbXBvbmVudFJvdXRlKCkge1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuSFlQRVJMSU5LICYmXG4gICAgICAgICAgZmllbGQuaHlwZXJsaW5rPy5jb21wb25lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIucmVzZXRDb25maWcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiAnaHlwZXJsaW5rJyArIGZpZWxkLmxhYmVsLFxuICAgICAgICAgICAgICBjb21wb25lbnQ6IGZpZWxkLmh5cGVybGluay5jb21wb25lbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4udGhpcy5yb3V0ZXIuY29uZmlnLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGJyb3dzZXJUYWJDbG9zZUV2ZW50KGV2ZW50OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGV2ZW50O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKXtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGFueSBjaGFuZ2UgaW4gRHluYW1pYyBGb3JtIGNvbXBvbmVudCBTdGF0ZVxuICAgKi9cbiAgb25EeW5hbWljRm9ybVN0YXRlQ2hhbmdlKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdXRpbGl0aWVzLm9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5pZCAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZk9iaiA9IHRoaXMuY29tcG9uZW50c0xpc3QuZmluZChcbiAgICAgICAgICAoeCkgPT4geC5uYW1lID09PSByZXNwb25zZS5pZFxuICAgICAgICApO1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmT2JqKSB7XG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UuZGF0YSA/PyB7fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBjb21wb25lbnRSZWZPYmoudmFsdWUuaW5zdGFuY2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmKHJlc3BvbnNlPy5sb2FkQ29tcG9uZW50KXtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZk9iai52YWx1ZS5pbnN0YW5jZS5uZ09uSW5pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBhcHBseSB1c2VyIHJvbGUgcGVybWlzc2lvbnNcbiAgYXBwbHlVc2VyUGVybWlzc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMuZm9ybSAmJiB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKSB7XG4gICAgICBsZXQgdG90YWxGaWVsZHM6IG51bWJlciA9IDA7XG4gICAgICBsZXQgZGlzYWJsZWRGaWVsZHM6IG51bWJlciA9IDA7XG4gICAgICBsZXQgaGlkZGVuRmllbGRzOiBudW1iZXIgPSAwO1xuXG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZm9ybUZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGVybWlzc2lvbnM6IGFueSA9IGZvcm1GaWVsZC5wZXJtaXNzaW9ucztcbiAgICAgICAgICAgIGxldCBzZWN0aW9uUGVybWlzc2lvbnM6IGFueSA9IFtdO1xuICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9ucykgc2VjdGlvblBlcm1pc3Npb25zID0gZm9ybVNlY3Rpb24ucGVybWlzc2lvbnM7XG4gICAgICAgICAgICBpZiAoIXBlcm1pc3Npb25zKSBwZXJtaXNzaW9ucyA9IHRoaXMuZm9ybS5wZXJtaXNzaW9ucztcbiAgICAgICAgICAgIGxldCBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChzZWN0aW9uUGVybWlzc2lvbnMgJiYgc2VjdGlvblBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc2VjdGlvblBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb246IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbi5yb2xlcy5mb3JFYWNoKChyb2xlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZCAmJiB0aGlzLnJvbGVzICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5WSUVXKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkVESVQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb25zICYmIHBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbi5yb2xlcyAmJiBwZXJtaXNzaW9uLnJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24ucm9sZXMuZm9yRWFjaCgocm9sZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZCAmJiB0aGlzLnJvbGVzICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLlZJRVcgJiZcbiAgICAgICAgICAgICAgICAgICAgIWhhc1ZhbGlkRWRpdFBlcm1pc3Npb25cbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuRURJVCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGhhc1ZhbGlkRWRpdFBlcm1pc3Npb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQucGVybWlzc2lvbnMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5wZXJtaXNzaW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JtU2VjdGlvbi5kaXNhYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvdGFsRmllbGRzKys7XG5cbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgZGlzYWJsZWRGaWVsZHMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZGVuRmllbGRzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmlzRm9ybURpc2FibGVkID0gdG90YWxGaWVsZHMgPiAwICYmIHRvdGFsRmllbGRzID09PSBkaXNhYmxlZEZpZWxkcztcbiAgICAgIHRoaXMuaXNGb3JtSGlkZGVuID0gdG90YWxGaWVsZHMgPiAwICYmIHRvdGFsRmllbGRzID09PSBoaWRkZW5GaWVsZHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gSUZyYW1lIGluIGh5cGVybGluayBDb250cm9sXG4gICAqL1xuICBzZWN0aW9uRGlzYWJsZWQoZm9ybVNlY3Rpb246IElGb3JtU2VjdGlvbikge1xuICAgIGlmIChmb3JtU2VjdGlvbi5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRTZWN0aW9uRmllbGRzKGZvcm1TZWN0aW9uLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYoZm9ybVNlY3Rpb24uZGlzYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFNlY3Rpb25GaWVsZHMoZm9ybVNlY3Rpb24sIGZhbHNlKTtcbiAgICB9ZWxzZSB7XG4gICAgICByZXR1cm4gZm9ybVNlY3Rpb247XG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZWRTZWN0aW9uRmllbGRzKGZvcm1TZWN0aW9uOiBJRm9ybVNlY3Rpb24sIGRpc2FibGVkOiBib29sZWFuKXtcbiAgICBmb3JtU2VjdGlvbi5maWVsZHMubWFwKChmaWVsZDogSUZvcm1GaWVsZCkgPT4ge1xuICAgICAgZmllbGQuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybVNlY3Rpb247XG4gIH1cblxuICBsb2FkSUZyYW1lKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIHRoaXMuaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKElmcmFtZUNvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiAnSHlwZXJsaW5rJyxcbiAgICAgIHdpZHRoOiBmb3JtRmllbGQuaHlwZXJsaW5rPy53aWR0aCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggOiAnOTAlJyxcbiAgICAgIGhlaWdodDogZm9ybUZpZWxkLmh5cGVybGluaz8uaGVpZ2h0ID8gZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHQgOiAnODAlJyxcbiAgICAgIGRhdGE6IHsgdmFsdWU6IGZvcm1GaWVsZC5oeXBlcmxpbms/LmxpbmssIGlGcmFtZUlkOiBmb3JtRmllbGQubGFiZWwgfSxcbiAgICB9KTtcbiAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYocmVmKTtcbiAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkKTtcbiAgICB9KTtcbiAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICBpZiAoZm9ybUZpZWxkLm9uUmV0dXJuKSB7XG4gICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIERpYWxvZyBpbiBoeXBlcmxpbmsgQ29udHJvbFxuICAgKi9cbiAgaHlwZXJsaW5rRGlhbG9nKGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgZm9ybUZpZWxkOiBJRm9ybUZpZWxkID0gZXZlbnQuZm9ybUZpZWxkO1xuICAgIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuQkxBTkspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGZvcm1GaWVsZC5oeXBlcmxpbmsucGFyYW1zO1xuICAgICAgd2luZG93Lm9wZW4oJ2h5cGVybGluaycgKyBmb3JtRmllbGQubGFiZWwpO1xuICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLmh5cGVybGluaz8udGFyZ2V0ID09PSBFSHlwZXJsaW5rLlNFTEYpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnaHlwZXJsaW5rJyArIGZvcm1GaWVsZC5sYWJlbF0sIHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IGZvcm1GaWVsZC5oeXBlcmxpbmsucGFyYW1zLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuRElBTE9HKSB7XG4gICAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgICAgaWYgKChldmVudCAmJiBldmVudC5ldmVudC5jdHJsS2V5ICYmIGZvcm1GaWVsZC5oeXBlcmxpbmsuY29tcG9uZW50KSB8fCBmb3JtRmllbGQub3BlbkluTmV3VGFiKSB7XG4gICAgICAgIHRoaXMuaHlwZXJsaW5rU2VydmljZS5vcGVuRGlhbG9nSW5OZXdUYWIoZm9ybUZpZWxkLmh5cGVybGluay5jb21wb25lbnQsIGZvcm1GaWVsZC5oeXBlcmxpbms/LnBhcmFtcyk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3Blbihmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCwge1xuICAgICAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmh5cGVybGluay5kYXRhPy5oZWFkZXJcbiAgICAgICAgICAgID8gZm9ybUZpZWxkLmh5cGVybGluay5kYXRhPy5oZWFkZXJcbiAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgd2lkdGg6IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoIDogJycsXG4gICAgICAgICAgc3R5bGU6IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggPyB7fSA6IHsgJ21heC13aWR0aCc6ICdmaXQtY29udGVudCcgfSxcbiAgICAgICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0ID8gZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHQgOiAnODAlJyxcbiAgICAgICAgICBkYXRhOiBmb3JtRmllbGQuaHlwZXJsaW5rLnBhcmFtc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0IHx8IHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0KSB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UgPSB0aGlzLmludGVyY2VwdERpYWxvZ0Nsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGZvcm1GaWVsZC5oeXBlcmxpbms/LmNvbXBvbmVudD8ubmFtZTtcbiAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyhcbiAgICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLm9uUmV0dXJuKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBJZnJhbWUgb24gTGFiZWxcbiAgICovXG4gIGxvYWRMYWJlbENvbnRyb2xJRnJhbWUoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihJZnJhbWVDb21wb25lbnQsIHtcbiAgICAgIGhlYWRlcjogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB3aWR0aDogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbmsud2lkdGhcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoXG4gICAgICAgIDogJzkwJScsXG4gICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rPy5oZWlnaHRcbiAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodFxuICAgICAgICA6ICc4MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbms/LmxpbmtcbiAgICAgICAgICA/IGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wuaHlwZXJsaW5rLmxpbmtcbiAgICAgICAgICA6ICcnLFxuICAgICAgICBpRnJhbWVJZDogZm9ybUZpZWxkLmxhYmVsLm5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksXG4gICAgICAnSWZyYW1lQ29tcG9uZW50J1xuICAgICk7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgIH0pO1xuICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIHtcbiAgICAgICAgICBmb3JtRmllbGQub25SZXR1cm4ocmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChmb3JtRmllbGQgJiYgZm9ybUZpZWxkLm9uQ2xpY2spIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZpbmQgdGhlIHJlcXVpcmVkIGZpZWxkIGluIGZvcm1cbiAgICovXG4vLyAgIGFwcGx5UmVxdWlyZWRGaWVsZFZhbGlkYXRpb24oKSB7XG4vLyBjb25zb2xlLmxvZygnYXBwbHlpbmcgcmVxdWlyZWRmaWxlZCB2YWxpZGF0aW9ucycpXG4vLyAgICAgaWYgKFxuLy8gICAgICAgdGhpcy5mb3JtICYmXG4vLyAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zICYmXG4vLyAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmxlbmd0aCA+IDBcbi8vICAgICApIHtcbi8vICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuLy8gICAgICAgICBzZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuLy8gICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWVsZCcsIGZpZWxkKVxuLy8gICAgICAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9ucyAmJiBmaWVsZC52YWxpZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4vLyAgICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9ucy5mb3JFYWNoKCh2YWxpZCkgPT4ge1xuLy8gICAgICAgICAgICAgICBpZiAodmFsaWQudHlwZSA9PT0gRVZhbGlkYXRvci5SRVFVSVJFRCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWVsZCcsZmllbGQsJ2lzIHJlcXVpcmVkJylcbi8vICAgICAgICAgICAgICAgICBmaWVsZC5yZXF1aXJlZEZpZWxkID0gdHJ1ZTtcbi8vICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgfVxuLy8gICAgICAgICB9KTtcbi8vICAgICAgIH0pO1xuLy8gICAgIH1cbi8vICAgfVxuXG4gIHNldEZpbGVVcmxzKGZpbGVVcmxzOiBhbnkpIHtcbiAgICBpZiAoZmlsZVVybHMgJiYgZmlsZVVybHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5maWxlVXBsb2FkVXJscyA9IGZpbGVVcmxzO1xuICAgICAgdGhpcy5zaG93ZmlsZVVwbG9hZEVycm9yID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tGaWVsZHNWYWxpdGlvbnMoZmllbGRzOiBJRm9ybUZpZWxkW10pe1xuICAgIGxldCBlcnJvck1lc3NhZ2VEZXRhaWxzID0gJyc7XG4gICAgbGV0IHZhbGlkaXR5ID0gdHJ1ZTtcbiAgICBpZiAoZmllbGRzKSB7XG4gICAgICBpZiAoIXRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShmaWVsZHMpKSB7XG4gICAgICAgIGZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyA9IGVycm9yTWVzc2FnZURldGFpbHNcbiAgICAgICAgICAgICAgPyBlcnJvck1lc3NhZ2VEZXRhaWxzICsgJyAsICcgKyBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgIDogZm9ybUZpZWxkLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHMuc29tZShcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLnJlcXVpcmVkRmllbGQgJiYgZmllbGQuZXJyb3JNZXNzYWdlICYmICFmaWVsZC52YWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsaWRpdHkgJiYgZmllbGQpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgICA1MDAwLFxuICAgICAgICAgICAgJ1JFUVVJUkVEIEZJRUxEJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlRGV0YWlscywgNTAwMCwgJ0lOVkFMSUQgRklFTEQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAvLyBzZXQgdXBsb2FkRmlsZSBVUkwgaW4gRm9ybUZpZWxkIGluIGNhc2Ugb2YgRklMRV9VUExPQURcbiAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5GSUxFX1VQTE9BRCkge1xuICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5maWxlVXBsb2FkVXJscztcblxuICAgICAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9ucyAmJiBmaWVsZC52YWxpZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9ucy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHgudHlwZSA9PT0gRVZhbGlkYXRvci5SRVFVSVJFRCAmJiAhZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dmaWxlVXBsb2FkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpIHtcbiAgICAgICAgICBpZiAoZmllbGQuY2FyZCAmJiBmaWVsZC5jYXJkLmRhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZERhdGEgPSBmaWVsZC5jYXJkLmRhdGEuZmlsdGVyKFxuICAgICAgICAgICAgICAoeDogYW55KSA9PiB4LnNlbGVjdGVkQ2FyZCAmJiB4LnNlbGVjdGVkQ2FyZC5sZW5ndGggPiAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0YSAmJiBzZWxlY3RlZERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBmaWVsZC5jYXJkLmRhdGEgPSBzZWxlY3RlZERhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRpdHk7XG4gIH1cbiAgb25TYXZlRm9ybSgpIHtcbiAgICBsZXQgdmFsaWRpdHkgPSB0cnVlO1xuICAgIHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgbGV0IG11bGlTZWxlY3RWYWx1ZSA9IHt9O1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBpZihmb3JtU2VjdGlvbi5maWVsZHM/Lmxlbmd0aCA+IDApe1xuICAgICAgICB2YWxpZGl0eSA9IHRoaXMuY2hlY2tGaWVsZHNWYWxpdGlvbnMoZm9ybVNlY3Rpb24uZmllbGRzKTtcbiAgICAgIH1cblxuICAgICAgaWYoZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzPy5sZW5ndGggPiAwKXtcbiAgICAgICAgdmFsaWRpdHkgPSB0aGlzLmNoZWNrRmllbGRzVmFsaXRpb25zKGZvcm1TZWN0aW9uLmhlYWRlckZpZWxkcyk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZygndGhpcy5mb3JtLmZvcm1TZWN0aW9uczonLCB0aGlzLmZvcm0pXG4gICAgaWYgKHZhbGlkaXR5KSB7XG4gICAgICAvLyBTYXZlIGdyaWQgb24gZm9ybVNhdmUgQnV0dG9uXG4gICAgICBsZXQgY3VzdG9tQ29tcG9uZW50OiBib29sZWFuID0gZmFsc2U7XG4gICAgICBsZXQgdGVtcFZhbHVlOiBhbnkgPSBbXTtcbiAgICAgIGxldCBzYXZlQWxsR3JpZDogYW55ID0gW107XG4gICAgICBsZXQgZ2V0QnRuczogYW55ID0gW107XG4gICAgICAvLyBzZXQgdmFsdWUgYXMgMSBvciAwIGluIGNhc2Ugb2YgY2hlY2tib3hcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMgJiYgdmFsaWRpdHkpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlID09PSAnJyB8fCBmaWVsZC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29udmVydCBkYXRlIGludG8gdGltZSBhcyBzdHJpbmdcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmXG4gICAgICAgICAgICAgIGZpZWxkLnRpbWVPbmx5ICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdBTScpIHx8IGZpZWxkLnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0VGltZUluRGF0ZShmaWVsZC52YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGZpZWxkLnNob3dUaW1lKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWVsZC52YWx1ZSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICghZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCdBTScpICYmXG4gICAgICAgICAgICAgICAgIWZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnUE0nKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmllbGQudmFsdWUsICdoaDptbSBhJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLk5VTUVSSUMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGlnaXRzSW5mbyA9IGZpZWxkPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkPy5mb3JtYXQ/LnR5cGUgPT09ICdwZXJjZW50Jykge1xuICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5hbGxvd0NhbGN1bGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxjdWxhdGVkVmFsdWUgPSBmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJy4nKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2FsY3VsYXRlZFZhbHVlID8gZmllbGQudmFsdWUgOiBmaWVsZC52YWx1ZSAvIDEwMCk/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICApLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnLicpICYmICFjYWxjdWxhdGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KGZpZWxkLnZhbHVlKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzZXQgdmFsdWUgb2YgYXV0b0NvbXBsZXRlIGFzIHN0cmluZ3NcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkFVVE9DT01QTEVURSAmJlxuICAgICAgICAgICAgICAhZmllbGQuc2hvd0FsbFZhbHVlICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLnZhbHVlLm1hcChcbiAgICAgICAgICAgICAgICAodmFsdWU6IGFueSkgPT4gdmFsdWVbZmllbGQuZGlzcGxheUZpZWxkXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgICAgICAodmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJzsnKSB8fFxuICAgICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcoKT8uaW5jbHVkZXMoJywnKSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGVtcFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnJlcGxhY2VBbGwoJywnLCAnOycpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb252ZXJ0IG11bHRpU2VsZWN0IGFycmF5IGludG8gc3RyaW5nXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5NVUxUSVNFTEVDVCAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSAmJlxuICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKSAmJlxuICAgICAgICAgICAgICBmaWVsZC5zYXZlQXNTdHJpbmcgIT09IGZhbHNlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgbXVsaVNlbGVjdFZhbHVlW2ZpZWxkLmZpZWxkXSA9IGZpZWxkLnZhbHVlXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWU/LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNIRUNLQk9YKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgPyAxIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNhdmUgZ3JpZCBvbiBmb3JtU2F2ZSBCdXR0b25cbiAgICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ09NUE9ORU5UICYmICFjdXN0b21Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgc2F2ZUFsbEdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGZpZWxkPy5jb21wb25lbnRDb250cm9sPy5pZCArICcgJyArICcjc2F2ZUFsbEdyaWRWYWx1ZXMnKTtcbiAgICAgICAgICAgICAgZ2V0QnRucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkICsgJyAnICsgJy5zYXZlUm93Jyk7XG4gICAgICAgICAgICAgIGlmIChzYXZlQWxsR3JpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzYXZlQWxsR3JpZFswXS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUZvcm1QYWdlID0gaW50ZXJ2YWwoNzUwKS5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUZvcm1QYWdlLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoZ2V0QnRucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc2F2ZVJvd0J0biBvZiBnZXRCdG5zKSB7XG4gICAgICAgICAgICAgICAgICBzYXZlUm93QnRuPy5jbGljaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KGZhbHNlKTtcbiAgICAgIGlmICghc2F2ZUFsbEdyaWQubGVuZ3RoICYmICFnZXRCdG5zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNhdmVGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzKSB7XG4gICAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSICYmXG4gICAgICAgICAgICAgIGZpZWxkLnRpbWVPbmx5ICYmIGZpZWxkLnNob3dUaW1lXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gaWYgKHR5cGVvZiBmaWVsZC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgL15cXGR7Mn06XFxkezJ9IFtBUF1NJC8udGVzdChmaWVsZC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgLy8gICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlXG4gICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWVsZC52YWx1ZSwgJ2hoOm1tIGEnKTtcbiAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTVVMVElTRUxFQ1QgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IG11bGlTZWxlY3RWYWx1ZVtmaWVsZC5maWVsZF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQVVUT0NPTVBMRVRFICYmXG4gICAgICAgICAgICAgICFmaWVsZC5zaG93QWxsVmFsdWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRlbXBWYWx1ZVxuICAgICAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJywnLCAnOycpXG4gICAgICAgICAgICAgICAgPy5zcGxpdCgnOycpXG4gICAgICAgICAgICAgICAgPy5tYXAoKHZhbDogYW55KSA9PiAoeyBbZmllbGQuZGlzcGxheUZpZWxkXTogdmFsIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNIRUNLQk9YKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgPT09IDEgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkPy5mb3JtYXQ/LnR5cGUgPT09ICdwZXJjZW50Jykge1xuICAgICAgICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gZmllbGQ/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmFsbG93Q2FsY3VsYXRlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgICAgKGZpZWxkLnZhbHVlICogMTAwKT8udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICApLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlICogMTAwO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KGZpZWxkLnZhbHVlKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvbkNhbmNlbEZvcm0oKSB7XG4gICAgaWYgKHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0IHx8IHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2VcbiAgICAgICAgLmNvbmZpcm0oe1xuICAgICAgICAgIGtleTogJ2NhbmNlbEJ1dHRvbicsXG4gICAgICAgICAgbWVzc2FnZTogJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcy4gV291bGQgeW91IGxpa2UgdG8gY29udGludWU/JyxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXNbMF0uZGV0YWlsID09PSAnWWVzJykge1xuICAgICAgICAgICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgICAgICAgdXRpbGl0aWVzLnJlbW92ZUFjdGl2ZUljb25DbGFzcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FuY2VsRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgdXRpbGl0aWVzLnJlbW92ZUFjdGl2ZUljb25DbGFzcygpO1xuICAgIH1cbiAgfVxuXG4gIGxvb2t1cENsZWFyVmFsdWUoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKGZvcm1GaWVsZC52YWx1ZSkge1xuICAgICAgZm9ybUZpZWxkLnZhbHVlID0gJyc7XG4gICAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KHRydWUpO1xuICAgIH1cbiAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICBmb3JtRmllbGQub25DaGFuZ2UoZm9ybUZpZWxkKTtcbiAgICB9XG4gICAvLyB0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIHNldCBjYWxlbmRhciB3aWR0aFxuICAgKi9cbiAgc2V0Q2FsYW5kZXJXaWR0aCgpIHtcbiAgICBjb25zdCBjYWxhbmRlckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucC1jYWxlbmRhcicpO1xuICAgIGxldCBmb3JtOiBhbnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtJyk7XG4gICAgbGV0IHdpZHRoID0gZm9ybT8uY2xpZW50V2lkdGg7XG4gICAgY2FsYW5kZXJFbGVtZW50Py5mb3JFYWNoKChjYWxhbmRlcjogYW55KSA9PiB7XG4gICAgICBjb25zdCBjYWxhbmRlck9mc2V0TGVmdCA9IGNhbGFuZGVyLm9mZnNldExlZnQ7XG4gICAgICBpZiAoY2FsYW5kZXJPZnNldExlZnQgPD0gd2lkdGggLyAyKSB7XG4gICAgICAgIGNhbGFuZGVyLmNsYXNzTGlzdC5hZGQoJ29wZW4tcmlnaHQtc2lkZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIHNldCB0aGUgZHluYW1pYyBkaWFsb2cgZGF0YVxuICAgKi9cbiAgc2V0RGlhbG9nRGF0YShmb3JtRmllbGQ6IElGb3JtRmllbGQsIGRhdGE6IGFueSk6IGFueSB7XG4gICAgaWYgKGRhdGEgJiYgZm9ybUZpZWxkKSB7XG4gICAgICBsZXQgdmFsdWU6IGFueTtcbiAgICAgIGRhdGEgPSB1dGlsaXRpZXMub2JqQ29udmVydFRvTG93ZXIoZGF0YSk7XG4gICAgICBsZXQgc2VsZWN0aW9uOiBzdHJpbmcgPSAnJztcbiAgICAgIGlmIChmb3JtRmllbGQudmFsdWUgJiYgdHlwZW9mIGZvcm1GaWVsZC52YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSAmJlxuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZS50ZXh0ICYmXG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQudG9TdHJpbmcoKS50cmltKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VsZWN0aW9uID0gZm9ybUZpZWxkLnZhbHVlLnRleHQ/LnRvU3RyaW5nKCk/LnRyaW0oKTtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmRpc3BsYXlGaWVsZCkge1xuICAgICAgICAgICAgdmFsdWUgPSBmb3JtRmllbGQudmFsdWU/LnZhbHVlPy50b1N0cmluZygpPy50cmltKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC52YWx1ZSAmJiBmb3JtRmllbGQudmFsdWUudG9TdHJpbmcoKS50cmltKCkpIHtcbiAgICAgICAgc2VsZWN0aW9uID0gZm9ybUZpZWxkLnZhbHVlPy50b1N0cmluZygpPy50cmltKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21wb25lbnROYW1lID0gZGF0YS5jb21wb25lbnQ/Lm5hbWU7XG4gICAgICBpZiAoY29tcG9uZW50TmFtZSkge1xuICAgICAgICB0aGlzLnBhZ2VMb2dnZXJTZXJ2aWNlLnNhdmVQYWdlTG9nZ2VySW5mbyhcbiAgICAgICAgICB0aGlzLnJvdXRlci51cmw/LnN1YnN0cmluZygxKSxcbiAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oZGF0YS5jb21wb25lbnQsIHtcbiAgICAgICAgLi4uZGF0YS5kYXRhLFxuICAgICAgICBzdHlsZUNsYXNzOiAnbG9va3VwLW1vZGVsJyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uLFxuICAgICAgICAgIGZpZWxkOiBmb3JtRmllbGQuZmllbGQsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHZhbHVlRmllbGQ6IGRhdGEuZGF0YT8udmFsdWVGaWVsZCxcbiAgICAgICAgICAuLi5kYXRhLmRhdGEuZGF0YSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRhYkZvY3VzRXZlbnQoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICcuJyArIGZvcm1GaWVsZC5maWVsZFxuICAgICk7XG4gICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lLmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGlja0V2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQub25DbGljayAmJiBmb3JtRmllbGQuZGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNsaWNrKGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gZGlhbG9nIG9uIGxvb2t1cENvbnRyb2wgbGFiZWxcbiAgICovXG4gIHNlbGVjdExvb2t1cExhYmVsKGZvcm1GaWVsZDogYW55LCBldmVudD86IGFueSkge1xuICAgIGlmIChcbiAgICAgIGZvcm1GaWVsZC5sYWJlbCAmJlxuICAgICAgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbCAmJlxuICAgICAgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sXG4gICAgKSB7XG4gICAgICBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZm9ybUZpZWxkPy5sYWJlbD8ubGFiZWxDb250cm9sPy5sb29rdXBDb250cm9sPy5jb21wb25lbnQpIHx8IGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ub3BlbkluTmV3VGFiKSB7XG4gICAgICAgIHRoaXMuaHlwZXJsaW5rU2VydmljZS5vcGVuRGlhbG9nSW5OZXdUYWIoZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sLmNvbXBvbmVudCwgZm9ybUZpZWxkPy5sYWJlbD8ubGFiZWxDb250cm9sPy5sb29rdXBDb250cm9sPy5kYXRhLmRhdGEpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlZjogYW55ID0gdGhpcy5zZXREaWFsb2dEYXRhKFxuICAgICAgICAgIGZvcm1GaWVsZCxcbiAgICAgICAgICBmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmxvb2t1cENvbnRyb2xcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHJlZik7XG4gICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQgPyBmb3JtRmllbGQ/LmZpZWxkIDogZm9ybUZpZWxkPy5sYWJlbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldERpYWxvZ1Jlc3BvbnNlKFxuICAgICAgICAgICAgICAgIGZvcm1GaWVsZCxcbiAgICAgICAgICAgICAgICBmb3JtRmllbGQ/LmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sLFxuICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKTtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQubGFiZWwub25SZXR1cm4pXG4gICAgICAgICAgICAgIGZvcm1GaWVsZC5sYWJlbC5vblJldHVybihmb3JtRmllbGQudmFsdWUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKHsgZXJyb3IgfTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hcGlFcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNldCB0aGUgZGlhbG9nIHJlZiB3aGVuIHBvcHVwIG9wZW5cbiAgICovXG4gIHNldER5bmFtaWNEaWFsb2dSZWYocmVmOiBhbnkpe1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5kaWFsb2dDb21wb25lbnRSZWZNYXAuZ2V0KHJlZik7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudCA9IGRpYWxvZ1JlZj8uaW5zdGFuY2UgYXMgRHluYW1pY0RpYWxvZ0NvbXBvbmVudDtcbiAgICBjb25zdCBhcmlhTGFiZWxsZWRCeSA9IGR5bmFtaWNDb21wb25lbnQuZ2V0QXJpYUxhYmVsbGVkQnkoKTtcbiAgICBkeW5hbWljQ29tcG9uZW50LmdldEFyaWFMYWJlbGxlZEJ5ID0gKCkgPT4gYXJpYUxhYmVsbGVkQnk7XG4gIH1cblxuICBpbnRlcmNlcHREaWFsb2dDbG9zZShldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCB8fCB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCkge1xuICAgICAgaWYgKGNvbmZpcm0oXCJZb3Ugd2lsbCBsb3NlIGNoYW5nZXMgbm90IHNhdmVkIG9uIHBhZ2UuIFdvdWxkIHlvdSBsaWtlIHRvIGNvbnRpbnVlP1wiKSA9PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5kaWFsb2dSZWYuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGZpZWxkXG4gICAqL1xuICBzZWxlY3RMb29rdXBGaWVsZChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wpIHtcbiAgICAgIHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgPSBmYWxzZTtcbiAgICAgIHRoaXMubG9va3VwRm9jdXNPdXQgPSB0cnVlO1xuICAgICAgbGV0IHZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLnNldERpYWxvZ0RhdGEoZm9ybUZpZWxkLCBmb3JtRmllbGQubG9va3VwQ29udHJvbCk7XG4gICAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYodGhpcy5kaWFsb2dSZWYpO1xuICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCA/IGZvcm1GaWVsZD8uZmllbGQgOiBmb3JtRmllbGQ/LmxhYmVsKTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0IHx8IHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0KSB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlID0gdGhpcy5pbnRlcmNlcHREaWFsb2dDbG9zZS5iaW5kKHRoaXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UudXNlclNlYXJjaGVkPWZhbHNlO1xuICAgICAgICAgIGlmIChmb3JtRmllbGQuZmllbGQpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1GaWVsZC5maWVsZCk/LmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXREaWFsb2dSZXNwb25zZShcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLFxuICAgICAgICAgICAgICBmb3JtRmllbGQubG9va3VwQ29udHJvbCxcbiAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5sb29rdXBGb2N1c091dCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZC5vblJldHVybikgZm9ybUZpZWxkLm9uUmV0dXJuKGZvcm1GaWVsZC52YWx1ZSwgcmVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKTtcbiAgICAgICAgICBjb25zdCBmb3JtRmllbGRWYWx1ZSA9XG4gICAgICAgICAgICB0eXBlb2YgZm9ybUZpZWxkLnZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICA/IGZvcm1GaWVsZC52YWx1ZS50ZXh0XG4gICAgICAgICAgICAgIDogZm9ybUZpZWxkLnZhbHVlO1xuICAgICAgICAgIHZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlPy50ZXh0IDogdmFsdWU7XG4gICAgICAgICAgaWYgKGZvcm1GaWVsZFZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudCh0cnVlKTtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLm9uQ2hhbmdlKGZvcm1GaWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoeyBlcnJvciB9OiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hcGlFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIG9uQ2xpY2sgZXZlbnQgaW52b2tlZCAmJiBvcGVuIERpYWxvZyBvbiBsb29rdXBDb250cm9sIGZpZWxkL2xhYmVsXG4gICAqL1xuICBoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIHRoaXMub25DbGlja0V2ZW50KGZvcm1GaWVsZCk7XG4gICAgaWYgKGZvcm1GaWVsZCAmJiBmb3JtRmllbGQubG9va3VwQ29udHJvbCkge1xuICAgICAgdGhpcy5zZWxlY3RMb29rdXBMYWJlbChmb3JtRmllbGQpO1xuICAgICAgdGhpcy5zZWxlY3RMb29rdXBGaWVsZChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgQ2FsZW5kYXIgRGF0ZSBGb3JtYXQgJiYgc2V0IERhdGUgTWludXRlIGludGVydmFsXG4gICAqL1xuICBzZXRDYWxlbmRhckRhdGUoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKGZvcm1GaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIpIHtcbiAgICAgIC8vIGNvbnZlcnQgdGltZSBpbnRvIGRhdGUgZm9ybWF0XG4gICAgICBpZiAoXG4gICAgICAgIGZvcm1GaWVsZC50aW1lT25seSAmJlxuICAgICAgICAoZm9ybUZpZWxkLnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdBTScpIHx8XG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCdQTScpKVxuICAgICAgKSB7XG4gICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXRUaW1lSW5EYXRlKGZvcm1GaWVsZC52YWx1ZSk7XG4gICAgICB9ZWxzZSBpZiAoXG4gICAgICAgIChmb3JtRmllbGQuc2hvd1RpbWUgfHwgZm9ybUZpZWxkLnRpbWVPbmx5KSAmJlxuICAgICAgICBmb3JtRmllbGQudmFsdWUgJiZcbiAgICAgICAgZm9ybUZpZWxkLm1pbnV0ZXNJbnRlcnZhbFxuICAgICAgKSB7XG4gICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgIHV0aWxpdGllcy5zZXRNaW51dGVzSW50ZXJ2YWwoZm9ybUZpZWxkLnZhbHVlKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGZvcm1GaWVsZC5zaG93VGltZSB8fCBmb3JtRmllbGQudGltZU9ubHkpICYmXG4gICAgICAgICFmb3JtRmllbGQudmFsdWUgJiZcbiAgICAgICAgZm9ybUZpZWxkLm1pbnV0ZXNJbnRlcnZhbFxuICAgICAgKSB7XG4gICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IG5ldyBEYXRlKHV0aWxpdGllcy5zZXRNaW51dGVzSW50ZXJ2YWwobmV3IERhdGUoKSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxlbmRhclByZXZpb3VzVmFsdWUgPSBmb3JtRmllbGQudmFsdWU7XG4gICAgfVxuICB9XG4gIGNhbGVuZGFyQ2hhbmdlVmFsdWUoZm9ybUZpZWxkOiBhbnkpIHtcbiAgICBpZiAoZm9ybUZpZWxkLnZhbHVlICE9PSBmb3JtRmllbGQucHJldmlvdXNWYWx1ZSkge1xuICAgICAgdGhpcy5icm93c2VyVGFiQ2xvc2VFdmVudCh0cnVlKTtcbiAgICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgICAgZm9ybUZpZWxkLnByZXZpb3VzVmFsdWUgPSBmb3JtRmllbGQudmFsdWU7XG4gICAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZva2VkIHNlY3Rpb24gQ2xpY2tlZCBldmVudFxuICAgKi9cbiAgY2xpY2tlZFNlY3Rpb24oc2VjdGlvbjogSUZvcm1TZWN0aW9uKSB7XG4gICAgdGhpcy5zZWN0aW9uQ2xpY2tlZEV2ZW50LmVtaXQoc2VjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBkaWFsb2cgaW4gTm90ZV9GaWVsZCBjb25ydHJvbFxuICAgKi9cbiAgaGFuZGxlTm90ZUZpZWxkRGlhbG9nKGZvcm1maWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKE5vdGVzQ29tcG9uZW50LCB7XG4gICAgICBoZWFkZXI6IGZvcm1maWVsZC5sYWJlbCBhcyBzdHJpbmcsXG4gICAgICB3aWR0aDogJzUwJScsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHZhbHVlOiBmb3JtZmllbGQudmFsdWUsXG4gICAgICAgIGRpc2FibGVkVGV4dDogZm9ybWZpZWxkLmRpc2FibGVkVGV4dCxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHJlZik7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybWZpZWxkPy5maWVsZCA/IGZvcm1maWVsZD8uZmllbGQgOiBmb3JtZmllbGQ/LmxhYmVsKTtcbiAgICAgIH0pO1xuICAgIHJlZi5vbkNsb3NlLnN1YnNjcmliZShcbiAgICAgIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZm9ybWZpZWxkLm9uUmV0dXJuKSB7XG4gICAgICAgICAgZm9ybWZpZWxkLm9uUmV0dXJuKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKHsgZXJyb3IgfSkgPT4ge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hcGlFcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHNldENsYXNzTmFtZShmb3JtRmllbGQ6IElGb3JtRmllbGQpOiBzdHJpbmcge1xuICAgIGlmIChmb3JtRmllbGQuaGlkZGVuKSByZXR1cm4gJyBoaWRkZW4nO1xuICAgIGVsc2UgcmV0dXJuICcnO1xuICB9XG5cbiAgYXV0b1NlYXJjaChldmVudDogYW55KSB7XG4gICAgbGV0IGZvcm1GaWVsZDogSUZvcm1GaWVsZCA9IGV2ZW50LmZvcm1GaWVsZFxuICAgIGlmIChmb3JtRmllbGQgJiYgZXZlbnQgJiYgZXZlbnQuZXZlbnQpIHtcbiAgICAgIGZvcm1GaWVsZC5vblJldHVybihldmVudC5ldmVudC5xdWVyeSwgZm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaW52b2tlZCBvbkZvY3VzT3V0IEV2ZW50XG4gICAqL1xuICBvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgbGV0IHJlY29yZDogYW55ID0ge307XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuICAgICAgc2VjdGlvbj8uZmllbGRzPy5mb3JFYWNoKChmb3JtRmllbGQpID0+IHtcbiAgICAgICAgaWYgKGZvcm1GaWVsZC5maWVsZCkge1xuICAgICAgICAgIHJlY29yZFtmb3JtRmllbGQuZmllbGRdID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB1dGlsaXRpZXMuc2V0SHlwZXJsaW5rUGFyYW1WYWx1ZShyZWNvcmQsIHRoaXMuZm9ybSk7XG4gICAvLyB0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICAgIGlmIChmb3JtRmllbGQgJiYgZm9ybUZpZWxkLm9uRm9jdXNPdXQgJiYgdGhpcy5sb29rdXBGb2N1c091dCA9PT0gZmFsc2UpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkZvY3VzT3V0KGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgb25CYWNrU3BhY2VFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAodHlwZW9mIGZvcm1GaWVsZC52YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvcm1GaWVsZC52YWx1ZS50ZXh0ID0gZm9ybUZpZWxkLnZhbHVlLnRleHQuc3Vic3RyaW5nKFxuICAgICAgICAwLFxuICAgICAgICBmb3JtRmllbGQudmFsdWUudGV4dC5sZW5ndGggLSAxXG4gICAgICApO1xuICAgICAgaWYgKGZvcm1GaWVsZC52YWx1ZS50ZXh0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAmJiBmb3JtRmllbGQudmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgIC8vIHRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNsZWFyIHRoZSBkcm9wZG93biB2YWx1ZSB3aGVuIGNsaWNrIG9uIHhcbiAgICovXG4gIG9uQ2xlYXJWYWx1ZShldmVudDogYW55KSB7XG4gICAvLyB0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICAgbGV0IGZvcm1GaWVsZDogSUZvcm1GaWVsZCA9IGV2ZW50LmZvcm1GaWVsZDtcbiAgICB0aGlzLm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKTtcbiAgICB0aGlzLmRyb3BEb3duQ2hhbmdlRXZlbnQuZW1pdChmb3JtRmllbGQpO1xuICAgIGlmICghZXZlbnQuZXZlbnQudmFsdWUpIHtcbiAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJEcm9wZG93blZhbHVlKGZvcm1GaWVsZDogYW55KSB7XG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2Ugb25DaGFuZ2UgRXZlbnQgd2hlbiBWYWx1ZSBDaGFuZ2VkXG4gICAqL1xuICBvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgaWYgKGZvcm1GaWVsZC5vbkNoYW5nZSkge1xuICAgICAgZm9ybUZpZWxkLm9uQ2hhbmdlKGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgdHlwZU9mKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIGludm9rZSBvbiBkeW5hbWljIGJ1dHRvbnMgY2xpY2tcbiAgICovXG4gIG9uTmV3QnV0dG9uQ2xpY2soYnV0dG9uKSB7XG4gICAgbGV0IHNhdmVBbGxHcmlkOiBhbnkgPSBbXTtcbiAgICBsZXQgZ2V0QnRuczogYW55ID0gW107XG4gICAgbGV0IHZhbGlkaXR5ID0gdHJ1ZTtcbiAgICBsZXQgZXJyb3JNZXNzYWdlRGV0YWlscyA9ICcnO1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGlmICghdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KGZvcm1TZWN0aW9uLmZpZWxkcykpIHtcbiAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzPy5mb3JFYWNoKChmb3JtRmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChmb3JtRmllbGQuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VEZXRhaWxzID0gZXJyb3JNZXNzYWdlRGV0YWlsc1xuICAgICAgICAgICAgICA/IGVycm9yTWVzc2FnZURldGFpbHMgKyAnICwgJyArIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgOiBmb3JtRmllbGQuZXJyb3JNZXNzYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBmaWVsZCA9IGZvcm1TZWN0aW9uLmZpZWxkcy5zb21lKFxuICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQucmVxdWlyZWRGaWVsZCAmJiBmaWVsZC5lcnJvck1lc3NhZ2UgJiYgIWZpZWxkLnZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIGlmICh2YWxpZGl0eSAmJiBmaWVsZCkge1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyxcbiAgICAgICAgICAgIDUwMDAsXG4gICAgICAgICAgICAnUkVRVUlSRUQgRklFTEQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2VEZXRhaWxzLCA1MDAwLCAnSU5WQUxJRCBGSUVMRCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhbGlkaXR5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodmFsaWRpdHkpIHtcbiAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgc2F2ZUFsbEdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGZpZWxkPy5jb21wb25lbnRDb250cm9sPy5pZCArICcgJyArICcjc2F2ZUFsbEdyaWRWYWx1ZXMnKTtcbiAgICAgICAgICBnZXRCdG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnLnNhdmVSb3cnKTtcbiAgICAgICAgICBpZiAoc2F2ZUFsbEdyaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBzYXZlQWxsR3JpZFswXS5jbGljaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChnZXRCdG5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNhdmVSb3dCdG4gb2YgZ2V0QnRucykge1xuICAgICAgICAgICAgICBzYXZlUm93QnRuPy5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGJ1dHRvbi5mdW5jKCk7XG4gIH1cblxuICBzZWxlY3RlZENhcmRDbGlja0V2ZW50KGRhdGE6IGFueSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuZm9ybSAmJlxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucyAmJlxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb246IGFueSkgPT4ge1xuICAgICAgICBzZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEKSB7XG4gICAgICAgICAgICBpZiAoZmllbGQuY2FyZCAmJiBmaWVsZC5jYXJkLmRhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgbGV0IG9iaiA9IGZpZWxkLmNhcmQuZGF0YVtkYXRhLmluZGV4XTtcbiAgICAgICAgICAgICAgaWYgKG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmouc2VsZWN0ZWRDYXJkKSB7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgb2JqLnNlbGVjdGVkQ2FyZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb2JqWydzZWxlY3RlZENhcmQnXSA9ICdjYXJkLWFjdGl2ZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZGF0YS5zZWxlY3RlZENhcmQpIHtcbiAgICAgIGRhdGFbJ3NlbGVjdGVkQ2FyZCddID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFbJ3NlbGVjdGVkQ2FyZCddID0gJ2NhcmQtYWN0aXZlJztcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VQYXNzd29yZFR5cGUoZm9ybUZpZWxkKSB7XG4gICAgaWYgKGZvcm1GaWVsZC50ZXh0VHlwZSA9PSAndGV4dCcpIHtcbiAgICAgIGZvcm1GaWVsZC50ZXh0VHlwZSA9ICdwYXNzd29yZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1GaWVsZC50ZXh0VHlwZSA9ICd0ZXh0JztcbiAgICB9XG4gIH1cbiAgb25MaW5rQ2xpY2sobGluaywgZm9ybVNlY3Rpb24pe1xuICAgIGlmKCFsaW5rLmRpc2FibGVkICYmICFmb3JtU2VjdGlvbi5kaXNhYmxlZCl7XG4gICAgICBsaW5rLm9uQ2xpY2soKTtcbiAgICB9XG4gIH1cbiAgaXNWYWxpZENvbHVtbihjb2w6IGFueSl7XG4gICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihjb2wpICYmIGNvbCA+IDAgJiYgY29sIDw9IDEyXG4gIH1cbiBhc3luYyBhZGREeW5hbWljUGFuZWxPdmVybGF5Q29tcG9uZW50KGV2ZW50KTogUHJvbWlzZTx2b2lkPntcbiAgbGV0IGhvdmVyRGF0YSA6SU92ZXJsYXlQYW5lbERhdGEgPSBldmVudD8uaG92ZXJEYXRhO1xuICBsZXQgb3ZlcmxheVBhbmVsOiBhbnkgPSBldmVudD8ub3ZlcmxheVBhbmVsO1xuICB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKT0+e1xuICAgICAgY29uc3QgZGF0YSA9IHsuLi5ob3ZlckRhdGE/LmRhdGF9O1xuICAgICAgaWYoT2JqZWN0Py5rZXlzKGRhdGEpPy5sZW5ndGggPiAwKXtcbiAgICAgICAgY29uc3QgZGF0YUtleXMgPSBPYmplY3Q/LmtleXMoaG92ZXJEYXRhPy5kYXRhKTtcbiAgICAgICAgaWYoZGF0YUtleXM/Lmxlbmd0aCA+MCApe1xuICAgICAgICAgIGRhdGFLZXlzLmZvckVhY2goa2V5PT57XG4gICAgICAgICAgICB2YXIgdmFsdWUgPWRhdGFba2V5XTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygneycpICYmIHZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnfScpKXtcbiAgICAgICAgICAgICAgdmFyIHZhbHVlVG9GaW5kID0gdmFsdWUucmVwbGFjZSgneycsJycpLnJlcGxhY2UoJ30nLCcnKTtcbiAgICAgICAgICAgICAgZGF0YVtrZXldPSB1dGlsaXRpZXMuZ2V0Rm9ybUZpZWxkVmFsdWUodGhpcy5mb3JtLCB2YWx1ZVRvRmluZCk7XG4gICAgICAgICAgICB9ZWxzZSBpZighdmFsdWUpe1xuICAgICAgICAgICAgICB2YXIgbWF0Y2hlZEtleVZhbHVlID0gdXRpbGl0aWVzLmdldEZvcm1GaWVsZFZhbHVlKHRoaXMuZm9ybSwga2V5KTtcbiAgICAgICAgICAgICAgZGF0YVtrZXldPW1hdGNoZWRLZXlWYWx1ZTsgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBob3ZlckRhdGE/LnN0eWxlID8gKHRoaXMub3ZlcmxheVBhbmVsU3R5bGUgPSBob3ZlckRhdGEuc3R5bGUpIDogJyc7XG4gICAgICB0aGlzLnBhbmVsT3ZlcmxheVZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZjphbnkgPSB0aGlzLnBhbmVsT3ZlcmxheVZpZXdDb250YWluZXI/LmNyZWF0ZUNvbXBvbmVudChob3ZlckRhdGE/LmNvbXBvbmVudCk7XG4gICAgICBjb25zb2xlLmxvZyhjb21wb25lbnRSZWYpXG4gICAgICBpZihob3ZlckRhdGEuZGF0YSl7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcgPSBbXTtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNvbmZpZy5kYXRhID0gZGF0YTtcbiAgICAgIH1cbiAgICAgIG92ZXJsYXlQYW5lbC5zaG93KGV2ZW50Py5ldmVudCk7XG4gICAgICBcbiAgICAgfSlcbiAgfVxuICBtb3VzZUxlYXZlRXZlbnQob3ZlcmxheVBhbmVsKXtcbiAgICBvdmVybGF5UGFuZWw/LmhpZGUoKTtcbiAgfVxuXG59XG5cbiIsIjxwLWNvbmZpcm1EaWFsb2cgW3N0eWxlXT1cInsgd2lkdGg6ICc1MHZ3JyB9XCIga2V5PVwiY2FuY2VsQnV0dG9uXCI+PC9wLWNvbmZpcm1EaWFsb2c+XG48ZGl2PlxuICA8Zm9ybSAqbmdJZj1cIiFpc0Zvcm1IaWRkZW4gJiYgZm9ybVwiPlxuICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgY2xhc3M9XCJwcm9ncmVzcy1zcGlubmVyIHAtcHJvZ3Jlc3Mtc3Bpbm5lci1jaXJjbGUgY3VzdG9tLXNwaW5uZXJcIj48L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LXdyYXBcIj5cbiAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsgJ2ZpeGVkLWhlaWdodCc6IHN0aWNreUFjdGlvbnMgfVwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmb3JtU2VjdGlvbiBvZiBmb3JtLmZvcm1TZWN0aW9uc1wiIFtjbGFzc109XCIhZm9ybVNlY3Rpb24uaGlkZGVuID8gJ2NhcmQgdy0xMDAnIDogJydcIj5cbiAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiY2xpY2tlZFNlY3Rpb24oZm9ybVNlY3Rpb24pXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWZvcm1TZWN0aW9uID8gJycgOiBzZWN0aW9uRGlzYWJsZWQoZm9ybVNlY3Rpb24pXCI+XG4gICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImZvcm1TZWN0aW9uLmhpZGRlbiA/ICdoaWRkZW4nIDogZm9ybVNlY3Rpb24uY2xhc3NcIj5cbiAgICAgICAgICAgICAgICA8cC1hY2NvcmRpb24+XG4gICAgICAgICAgICAgICAgICA8cC1hY2NvcmRpb25UYWIgW3NlbGVjdGVkXT1cImZvcm1TZWN0aW9uLmV4cGFuZGVkID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIiFmb3JtU2VjdGlvbi5zaG93QWNjb3JkaW9uID8gJ2hpZGUtYWNjb3JkaWFuJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiZm9ybVNlY3Rpb24uaWNvblwiIFt0aXRsZV09XCJmb3JtU2VjdGlvbi5uYW1lXCIgY2xhc3M9XCJtci0xIHBsLTJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdWJzZWN0aW9uLWhlYWRlclwiPnt7IGZvcm1TZWN0aW9uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3AtaGVhZGVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwLWNvbCBmb3JtLWNvbXBvbmVudCBhY2NvcmRpb24taGVhZGVyLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCIhZm9ybVNlY3Rpb24uc2hvd0FjY29yZGlvblwiIGZvcj1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb25IZWFkZXJOYW1lIGZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBbdGl0bGVdPVwiZm9ybVNlY3Rpb24ubmFtZVwiIFtjbGFzc109XCJmb3JtU2VjdGlvbi5pY29uXCIgY2xhc3M9XCJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PiB7eyBmb3JtU2VjdGlvbi5uYW1lIH19IDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBsaW5rIG9mIGZvcm1TZWN0aW9uLmxpbmtzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtci0zIGN1c3RvbS1saW5rXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJsaW5rLm5hbWUgJiYhZm9ybVNlY3Rpb24uZGlzYWJsZWQmJiFsaW5rLmRpc2FibGVkICA/ICdjdXN0b20tbGluaycgOiAnZGlzYWJsZWQtbGluaydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25MaW5rQ2xpY2sobGluaywgZm9ybVNlY3Rpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxpbmsubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBoZWFkZXJGaWVsZCBvZiBmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHM7IGxldCBoZWFkZXJGaWVsZEluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ1N3aXRjaF09XCJoZWFkZXJGaWVsZC5jb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLklOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0LWNvbnRyb2wgW2ZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGNoYW5nZVBhc3N3b3JkKT1cImNoYW5nZVBhc3N3b3JkVHlwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzRXZlbnQpPVwib25Gb2N1c091dEV2ZW50XCI+PC9pbnB1dC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtZXJpYyBJbnB1dCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTlVNRVJJQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxudW1lcmljLWNvbnRyb2wgW2ZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0TG9va3VwKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L251bWVyaWMtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENoZWNrYm94IENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DSEVDS0JPWFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaGVja2JveC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NoZWNrYm94LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQYXNzd29yZCBJbnB1dCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUEFTU1dPUkRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFzc3dvcmQtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFzc3dvcmQtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1BBQ0VSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYWNlci1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIj48L3NwYWNlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgVGV4dEFyZWEgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5URVhUQVJFQVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QXJlYS1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvdGV4dEFyZWEtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2FsZW5kYXIgQ29udHJvbC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FMRU5EQVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FsZW5kYXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgW2RlZmF1bHREYXRlXT1cImRlZmF1bHREYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYWxlbmRhckZvcm1hdF09XCJjYWxlbmRhckZvcm1hdFwiIChvblNob3cpPVwic2V0Q2FsZW5kYXJEYXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY2FsZW5kYXJDaGFuZ2VWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbklucHV0KT1cImNhbGVuZGFySW5wdXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9jYWxlbmRhci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkRST1BET1dOXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRyb3Bkb3duLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChrZXl1cFRhYik9XCJ0YWJGb2N1c0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2xlYXJEcm9wZG93blZhbHVlKCRldmVudClcIiAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DbGVhclZhbHVlKCRldmVudClcIj48L2Ryb3Bkb3duLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEF1dG9Db21wbGV0ZSBTZWFyY2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BVVRPQ09NUExFVEVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXV0b0NvbXBsZXRlLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCIgKGNvbXBsZXRlTWV0aG9kKT1cImF1dG9TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvYXV0b0NvbXBsZXRlLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpLXNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk1VTFRJU0VMRUNUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L211bHRpc2VsZWN0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEh5cGVybGluay0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSFlQRVJMSU5LXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGh5cGVybGluay1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSHlwZXJsaW5rRGlhbG9nQ2xpY2spPVwiaHlwZXJsaW5rRGlhbG9nKCRldmVudClcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmcmFtTG9hZEV2ZW50KT1cImxvYWRJRnJhbWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaHlwZXJsaW5rLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvb2t1cCBDb250cm9sIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTE9PS1VQX0lOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvb2t1cC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAoa2V5dXBUYWIpPVwic2VsZWN0TG9va3VwRmllbGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsZWFyTG9va3VwVmFsdWUpPVwibG9va3VwQ2xlYXJWYWx1ZSgkZXZlbnQpXCI+PC9sb29rdXAtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0IEJ1dHRvbiBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNFTEVDVEJVVFRPTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QtYnV0dG9uLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L3NlbGVjdC1idXR0b24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZSBEZXRhaWwgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5OT1RFX0ZJRUxEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5vdGUtZGV0YWlsLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVOb3RlRmllbGREaWFsb2coJGV2ZW50KVwiPjwvbm90ZS1kZXRhaWwtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGNvbXBvbmVudC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VDVElPTl9IRUFERVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbi1oZWFkZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCI+PC9zZWN0aW9uLWhlYWRlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgT25DbGljayBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BRERfQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZC1idXR0b24tY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KCRldmVudClcIj48L2FkZC1idXR0b24tY29udHJvbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgR2VuZXJhdGUgUmVwb3J0IEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUkVQT1JUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZ2VuZXJhdGUtcmVwb3J0LWJ0biBbcmVwSW5mb109XCJoZWFkZXJGaWVsZFwiIFtsYWJlbF09XCJoZWFkZXJGaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJoZWFkZXJGaWVsZC5sYWJlbFwiIFtwYXJhbXNdPVwiaGVhZGVyRmllbGQucGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiaGVhZGVyRmllbGQuc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiBoZWFkZXJGaWVsZC5yZXBvcnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcG9ydEhlYWRlcl09XCJoZWFkZXJGaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImhlYWRlckZpZWxkLnJlcG9ydEZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBbaWNvbl09XCJoZWFkZXJGaWVsZC5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImhlYWRlckZpZWxkLmNsYXNzXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgSW5wdXQgU3dpdGNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1dJVENIXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiPjwvSW5wdXQtc3dpdGNoLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGFiZWxDb250cm9sIEh5cGVybGluayBvbiBsb29rdXAgIENvbnRyb2wgRmllbGQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJoZWFkZXJGaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiBbb3ZlcmxheVBhbmVsXT1cIm92ZXJsYXlQYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxEaXNwbGF5XT1cImxhYmVsRGlzcGxheVwiIChvbk1vdXNlRW50ZXIpPVwiYWRkRHluYW1pY1BhbmVsT3ZlcmxheUNvbXBvbmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbk1vdXNlTGVhdmUpPVwibW91c2VMZWF2ZUV2ZW50KCRldmVudClcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Mb2FkTGFiZWxDb250cm9sSUZyYW1lQ2xpY2spPVwibG9hZExhYmVsQ29udHJvbElGcmFtZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdExvb2t1cExhYmVsQ2xpY2spPVwic2VsZWN0TG9va3VwTGFiZWwoJGV2ZW50Py5mb3JtRmllbGQsICRldmVudD8uZXZlbnQpXCI+PC9sYWJlbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGFiZWxEaXNwbGF5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiaGVhZGVyRmllbGQubGFiZWwuaWNvblwiIFtjbGFzc109XCJoZWFkZXJGaWVsZC5sYWJlbC5pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmxhYmVsLmljb25cIj4ge3toZWFkZXJGaWVsZC5sYWJlbC5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEeW5hbWljIENvbXBvbmVudCBDb250YWluZXItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImhlYWRlckZpZWxkLmhpZGRlbiA/ICdoaWRkZW4nIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwie3tmb3JtU2VjdGlvbi5uYW1lfX0te3toZWFkZXJGaWVsZEluZGV4fX1cIiAjZHluYW1pY0NvbXBvbmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNPTVBPTkVOVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWxlIFVwbG9hZCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRklMRV9VUExPQURcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJoZWFkZXJGaWVsZC5kaXNhYmxlZCA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaGVhZGVyRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImhlYWRlckZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoaGVhZGVyRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1maWxlLXVwbG9hZCBbYWxsb3dNdWx0aXBsZV09XCJoZWFkZXJGaWVsZC5zZWxlY3RNdWx0aXBsZUZpbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdEZpbGVUeXBlc109XCJoZWFkZXJGaWVsZC5TZXRmaWxlVHlwZXNcIiBbZmllbGRzXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVVcmwpPVwic2V0RmlsZVVybHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cGxvYWRGaWxlT25SZXR1cm4pPVwiZmlsZU9uY2hhbmdlRXZlbnQoKVwiPjwvc2UtZmlsZS11cGxvYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckZpZWxkLmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGlzcGxheSAgQ2FyZCBmaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FSRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImhlYWRlckZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBoZWFkZXJGaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChoZWFkZXJGaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtY2FyZCBbY2FyZF09XCJoZWFkZXJGaWVsZC5jYXJkXCIgW3NldENhcmREYXRhXT1cInNldENhcmREYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2FyZCk9XCJzZWxlY3RlZENhcmRDbGlja0V2ZW50KCRldmVudClcIj48L3NlLWNhcmQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGZvcm0tY29tcG9uZW50IGZvcm0tYm9keS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiKGZvcm1GaWVsZC5jb250cm9sPT09J2FkZF9idXR0b24nPyAnIGZvcm0tYnV0dG9uLWZpZWxkLXdyYXBwZXIgJzonJykrXG4gICAgICAgICAgICAgICAgICAgICggaXNWYWxpZENvbHVtbihmb3JtRmllbGQuY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGZvcm1GaWVsZC5jb2x1bW4gKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKVxuICAgICAgICAgICAgICAgICAgICA6IGlzVmFsaWRDb2x1bW4oZm9ybS5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgID8gJ2NvbC0nICsgZm9ybS5jb2x1bW4gKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKVxuICAgICAgICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5jb2x1bW4gfHwgZm9ybS5jb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgPyAnIGNvbCAnXG4gICAgICAgICAgICAgICAgICAgIDogJ2NvbC0xMiBtZDpjb2wtMyBmbGV4IGZsZXgtY29sdW1uJyArIHNldENsYXNzTmFtZShmb3JtRmllbGQpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtRmllbGQuY29udHJvbCA9PT0gJ2JyZWFrX2xpbmUnID8gJ2JyZWFrLWxpbmUnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZvcm1GaWVsZCBvZiBmb3JtU2VjdGlvbi5maWVsZHM7IGxldCBmb3JtRmllbGRJbmRleCA9IGluZGV4XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGFiZWxDb250cm9sIEh5cGVybGluayBvbiBsb29rdXAgIENvbnRyb2wgRmllbGQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkPy5sYWJlbD8ubGFiZWxDb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgW292ZXJsYXlQYW5lbF09XCJvdmVybGF5UGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbERpc3BsYXldPVwibGFiZWxEaXNwbGF5XCIgKG9uTW91c2VFbnRlcik9XCJhZGREeW5hbWljUGFuZWxPdmVybGF5Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbk1vdXNlTGVhdmUpPVwibW91c2VMZWF2ZUV2ZW50KG92ZXJsYXlQYW5lbClcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uTG9hZExhYmVsQ29udHJvbElGcmFtZUNsaWNrKT1cImxvYWRMYWJlbENvbnRyb2xJRnJhbWUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0TG9va3VwTGFiZWxDbGljayk9XCJzZWxlY3RMb29rdXBMYWJlbCgkZXZlbnQ/LmZvcm1GaWVsZCwgJGV2ZW50Py5ldmVudClcIj48L2xhYmVsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsRGlzcGxheT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJmb3JtRmllbGQubGFiZWwuaWNvblwiIFtjbGFzc109XCJmb3JtRmllbGQubGFiZWwuaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmxhYmVsLmljb25cIj4ge3tmb3JtRmllbGQubGFiZWwubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiZm9ybUZpZWxkLmNvbnRyb2xcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1BBQ0VSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYWNlci1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCI+PC9zcGFjZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgVGV4dEFyZWEgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5URVhUQVJFQVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QXJlYS1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L3RleHRBcmVhLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dC1jb250cm9sIFtmaWVsZF09XCJmb3JtRmllbGRcIiAoY2hhbmdlUGFzc3dvcmQpPVwiY2hhbmdlUGFzc3dvcmRUeXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnRcIj48L2lucHV0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE51bWJlciBJbnB1dCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5VTUVSSUNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnVtZXJpYy1jb250cm9sIFtmaWVsZF09XCJmb3JtRmllbGRcIiAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RMb29rdXApPVwic2VsZWN0TG9va3VwRmllbGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvbnVtZXJpYy1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQYXNzd29yZCBJbnB1dCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlBBU1NXT1JEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhc3N3b3JkLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXNzd29yZC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDaGVja2JveCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0hFQ0tCT1hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2hlY2tib3gtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIiAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2hlY2tib3gtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYWxlbmRhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBTEVOREFSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbGVuZGFyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiBbZGVmYXVsdERhdGVdPVwiZGVmYXVsdERhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhbGVuZGFyRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCIgKG9uU2hvdyk9XCJzZXRDYWxlbmRhckRhdGUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIiAobmdNb2RlbENoYW5nZSk9XCJjYWxlbmRhckNoYW5nZVZhbHVlKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwiY2FsZW5kYXJJbnB1dFZhbHVlKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L2NhbGVuZGFyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRFJPUERPV05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHJvcGRvd24tY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChrZXl1cFRhYik9XCJ0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiY2xlYXJEcm9wZG93blZhbHVlKGZvcm1GaWVsZClcIiAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DbGVhclZhbHVlKCRldmVudClcIj48L2Ryb3Bkb3duLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEF1dG9Db21wbGV0ZSBTZWFyY2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BVVRPQ09NUExFVEVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXV0b0NvbXBsZXRlLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiIChjb21wbGV0ZU1ldGhvZCk9XCJhdXRvU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L2F1dG9Db21wbGV0ZS1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aS1zZWxlY3QgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5NVUxUSVNFTEVDVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvbXVsdGlzZWxlY3QtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSHlwZXJsaW5rLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5IWVBFUkxJTktcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHlwZXJsaW5rLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSHlwZXJsaW5rRGlhbG9nQ2xpY2spPVwiaHlwZXJsaW5rRGlhbG9nKCRldmVudClcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmcmFtTG9hZEV2ZW50KT1cImxvYWRJRnJhbWUoZm9ybUZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaHlwZXJsaW5rLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIExvb2t1cCBDb250cm9sIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTE9PS1VQX0lOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvb2t1cC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKGtleXVwVGFiKT1cInNlbGVjdExvb2t1cEZpZWxkKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhckxvb2t1cFZhbHVlKT1cImxvb2t1cENsZWFyVmFsdWUoZm9ybUZpZWxkKVwiPjwvbG9va3VwLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZpbGUgVXBsb2FkIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRklMRV9VUExPQURcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1GaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZm9ybUZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZmlsZS11cGxvYWQgW2FsbG93TXVsdGlwbGVdPVwiZm9ybUZpZWxkLnNlbGVjdE11bHRpcGxlRmlsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0RmlsZVR5cGVzXT1cImZvcm1GaWVsZC5TZXRmaWxlVHlwZXNcIiBbZmllbGRzXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlVXJsKT1cInNldEZpbGVVcmxzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkRmlsZU9uUmV0dXJuKT1cImZpbGVPbmNoYW5nZUV2ZW50KClcIj48L3NlLWZpbGUtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93ZmlsZVVwbG9hZEVycm9yXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWxlY3QgQnV0dG9uIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VMRUNUQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdC1idXR0b24tY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L3NlbGVjdC1idXR0b24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEaXNwbGF5ICBDYXJkIGZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FSRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9ybUZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWNhcmQgW2NhcmRdPVwiZm9ybUZpZWxkLmNhcmRcIiBbc2V0Q2FyZERhdGFdPVwic2V0Q2FyZERhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDYXJkKT1cInNlbGVjdGVkQ2FyZENsaWNrRXZlbnQoJGV2ZW50KVwiPjwvc2UtY2FyZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93ZmlsZVVwbG9hZEVycm9yXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3RlIERldGFpbCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5PVEVfRklFTERcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bm90ZS1kZXRhaWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVOb3RlRmllbGREaWFsb2coZm9ybUZpZWxkKVwiPjwvbm90ZS1kZXRhaWwtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHluYW1pYyBDb21wb25lbnQgQ29udGFpbmVyLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJmb3JtRmllbGQuaGlkZGVuID8gJ2hpZGRlbicgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ7e2Zvcm1TZWN0aW9uLm5hbWV9fS17e2Zvcm1GaWVsZEluZGV4fX1cIiAjZHluYW1pY0NvbXBvbmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNPTVBPTkVOVFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgY29tcG9uZW50LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TRUNUSU9OX0hFQURFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uLWhlYWRlci1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCI+PC9zZWN0aW9uLWhlYWRlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgT25DbGljayBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BRERfQlVUVE9OXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZC1idXR0b24tY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudChmb3JtRmllbGQpXCI+PC9hZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEdlbmVyYXRlIFJlcG9ydCBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5SRVBPUlRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1nZW5lcmF0ZS1yZXBvcnQtYnRuIFtyZXBJbmZvXT1cImZvcm1GaWVsZFwiIFtsYWJlbF09XCJmb3JtRmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZm9ybUZpZWxkLmxhYmVsXCIgW3BhcmFtc109XCJmb3JtRmllbGQucGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiZm9ybUZpZWxkLnNob3dEaWFsb2dcIiBbcmVwb3J0VHlwZV09XCIgZm9ybUZpZWxkLnJlcG9ydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImZvcm1GaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImZvcm1GaWVsZC5yZXBvcnRGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiZm9ybUZpZWxkLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9ybUZpZWxkLmNsYXNzXCI+PC9zZS1nZW5lcmF0ZS1yZXBvcnQtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgSW5wdXQgU3dpdGNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1dJVENIXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIj48L0lucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cbiAgICAgICAgICAgICAgICA8L3AtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gc2F2ZSBhbmQgY2xvc2UgYnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgYWN0aW9ucy1idXR0b25zLW1haW4td3JhcHBlciBmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiBbbmdDbGFzc109XCJ7IHN0aWNreTogc3RpY2t5QWN0aW9ucyB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lci1zdGlja3kgZm9ybS1jb21wb25lbnQgYWN0aW9ucy1idXR0b25zLXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgPCEtLSBzYXZlIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWhpZGVTYXZlQnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRm9ybURpc2FibGVkXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJzYXZlQnV0dG9uTGFiZWwgPyBzYXZlQnV0dG9uTGFiZWwgOiAnU2F2ZSdcIiBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3MgZm9ybS1zYXZlLWJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25TYXZlRm9ybSgpXCI+PC9idXR0b24+XG4gICAgICAgICAgPCEtLSBjbG9zZSBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFoaWRlQ2FuY2VsQnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRm9ybURpc2FibGVkXCIgKGNsaWNrKT1cIm9uQ2FuY2VsRm9ybSgpXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIFtsYWJlbF09XCJjYW5jZWxCdXR0b25MYWJlbCA/IGNhbmNlbEJ1dHRvbkxhYmVsIDogJ0NhbmNlbCdcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIgbWwtM1wiPjwvYnV0dG9uPlxuICAgICAgICAgIDwhLS0gZHluYW1pYyBidXR0b25zIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBmb3JtQnV0dG9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFidXR0b24uaGlkZGVuXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2xhYmVsXT1cImJ1dHRvbi5sYWJlbFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImJ1dHRvbi5pY29uID8gYnV0dG9uLmljb24gOiAnJ1wiIGNsYXNzPVwicC1idXR0b24tc3VjY2VzcyBtbC0zXCIgKGNsaWNrKT1cIm9uTmV3QnV0dG9uQ2xpY2soYnV0dG9uKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWQgPyBidXR0b24uZGlzYWJsZWQgOiBmYWxzZVwiPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbiAgPHAtb3ZlcmxheVBhbmVsIFtzdHlsZV09XCJvdmVybGF5UGFuZWxTdHlsZVwiICNvdmVybGF5UGFuZWw+XG4gICAgPG5nLWNvbnRhaW5lciAjdmlld0NvbnRhaW5lclJlZj48L25nLWNvbnRhaW5lcj5cbiAgPC9wLW92ZXJsYXlQYW5lbD5cbjwvZGl2PiJdfQ==