@tsi-developpement/tsi-shared-ui 1.7.30 → 1.7.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,6 +10,7 @@ import { DynamicFormService } from '../../services/dynamic-form/dynamic-form.ser
10
10
  import { TsiModalFooterComponent } from '../tsi-modal-footer/tsi-modal-footer.component';
11
11
  import { TsiModalHeaderComponent } from '../tsi-modal-header/tsi-modal-header.component';
12
12
  import { FormulaireService } from '../../services/dynamic-form/formulaire.service';
13
+ import { isNullOrEmpty } from '../../functions';
13
14
  import * as i0 from "@angular/core";
14
15
  import * as i1 from "../../services/status/entityStatus.service";
15
16
  import * as i2 from "../../services/status/status-color.service";
@@ -91,6 +92,7 @@ export class TsiFormComponent {
91
92
  set mode(value) {
92
93
  this._mode = value;
93
94
  this.getColonnePersonnalisee();
95
+ this.recalculateFormsVisibility();
94
96
  }
95
97
  get mode() {
96
98
  return this._mode;
@@ -101,6 +103,11 @@ export class TsiFormComponent {
101
103
  set isReportingToolbarDisabled(value) {
102
104
  this._isReportingToolbarDisabled = value;
103
105
  }
106
+ get doesHaveForms() { return this._doesHaveForms; }
107
+ set doesHaveForms(value) {
108
+ this._doesHaveForms = value;
109
+ this.recalculateFormsVisibility();
110
+ }
104
111
  //#region ctor
105
112
  constructor(entityStatusService, statusColorService, _fichierService, _errorResponseManagerService, _tsiConfirmService, _tsiNotificationService, _cdr, _layoutHelperService, workflowConfigurationService, _colonnePersonnaliseeService, ref, config) {
106
113
  this.entityStatusService = entityStatusService;
@@ -135,8 +142,9 @@ export class TsiFormComponent {
135
142
  this.formRefChange = new EventEmitter();
136
143
  this.onStatusChange = new EventEmitter();
137
144
  this.colonnesPersonnaliseeGrouped = [];
145
+ this.canShowForms = false;
138
146
  this.formsOfBusinessClass = [];
139
- this.doesHaveForms = false;
147
+ this._doesHaveForms = false;
140
148
  this.dynamicFormService = inject(DynamicFormService);
141
149
  this.formulaireService = inject(FormulaireService);
142
150
  //#endregion
@@ -511,12 +519,13 @@ export class TsiFormComponent {
511
519
  },
512
520
  });
513
521
  }
522
+ recalculateFormsVisibility() { this.canShowForms = this.doesHaveForms && !isNullOrEmpty(this.mode) && this.mode != Modes.create; }
514
523
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFormComponent, deps: [{ token: i1.EntityStatusService }, { token: i2.StatusColorService }, { token: i3.FichierService }, { token: i4.ErrorResponseManagerService }, { token: i5.TsiConfirmationService }, { token: i6.TsiNotificationService }, { token: i0.ChangeDetectorRef }, { token: i7.LayoutHelperService }, { token: i8.WorkflowConfigurationService }, { token: i9.ColonnePersonnaliseeService }, { token: i10.DynamicDialogRef }, { token: i10.DynamicDialogConfig }], target: i0.ɵɵFactoryTarget.Component }); }
515
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiFormComponent, selector: "tsi-form", inputs: { class: "class", autocomplete: "autocomplete", optionalEndpoints: "optionalEndpoints", disabled: "disabled", isLoading: "isLoading", modalSize: "modalSize", formEndpoint: "formEndpoint", formName: "formName", isReportingToolbarDisabled: "isReportingToolbarDisabled", isCreateOnly: "isCreateOnly" }, outputs: { onSave: "onSave", onSubmit: "onSubmit", onSubmitFormWorkflowConfiguration: "onSubmitFormWorkflowConfiguration", formRefChange: "formRefChange", onStatusChange: "onStatusChange" }, queries: [{ propertyName: "modalHeaderComp", first: true, predicate: TsiModalHeaderComponent, descendants: true }, { propertyName: "modalFooterComp", first: true, predicate: TsiModalFooterComponent, descendants: true }], viewQueries: [{ propertyName: "formRef", first: true, predicate: ["formRef"], descendants: true }, { propertyName: "reportingApp", first: true, predicate: ["reportingApp"], descendants: true }, { propertyName: "toolbarTemplateRef", first: true, predicate: ["toolbarTemplate"], descendants: true }, { propertyName: "dynamicToolbarContainers", predicate: ["dynamicToolbarContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicFootersContainers", predicate: ["dynamicFooterContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<form class=\"form-horizontal\" autocomplete=\"off\" (ngSubmit)=\"handleFormSubmit($event)\" #formRef=\"ngForm\">\r\n <ng-template #toolbarTemplate>\r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"mb-1 gap-2\" class=\"w-full\" (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\" (dragenter)=\"onDragEnter($event)\" (dragleave)=\"onDragLeave($event)\">\r\n\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"mt-1 ml-2\">\r\n {{ inputTitle }}\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"right\">\r\n <div class=\"mt-1 mr-2\">\r\n <app-reporting *ngIf=\"formEndpoint\" [fromTsiForm]=\"true\" [id]=\"this.id\" [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\" [reportDiscriminator]=\"descriminatorValue\" [isFormEndpointPaged]=\"true\"\r\n [nombreDocumentsJoints]=\"nombreDocuments\" [configModeButtonId]=\"configModeButtonId\"\r\n [isReportingToolbarDisabled]=\"isReportingToolbarDisabled\" (toggleDesignMode)=\"toggleDesignMode($event)\"\r\n [businessClass]=\"businessClass\" (closedModalFileUpload)=\"getNombreFichier()\"\r\n [showImportExportButton]=\"false\" #reportingApp>\r\n </app-reporting>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n\r\n </p-toolbar>\r\n </ng-template>\r\n\r\n <div *busy=\"isLoading\"></div>\r\n\r\n <fieldset [disabled]=\"disabled\">\r\n <div class=\"card mr\">\r\n <p-tabView>\r\n\r\n <p-tabPanel header=\"\" \r\n [headerStyle]=\"colonnesPersonnaliseeGrouped.length === 0 && !doesHaveForms\r\n ? { display: 'none' } \r\n : null\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <i class=\"pi pi-home mr-2\"></i>\r\n <span class=\"main-tab-text\">{{ 'shared_form_maintabTitle' | localize }}</span>\r\n </ng-template>\r\n\r\n <ng-content></ng-content>\r\n </p-tabPanel>\r\n\r\n <!-- Dynamic tabs -->\r\n <ng-container *ngIf=\"colonnesPersonnaliseeGrouped.length > 0\">\r\n <p-tabPanel *ngFor=\"let grp of colonnesPersonnaliseeGrouped\" [header]=\"grp.groupe\">\r\n\r\n <ng-template #dynamicToolbarContainer></ng-template>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col-12 grid form-row\" *ngFor=\"let col of grp.colonnes\">\r\n <div class=\"col-3 form-label\">\r\n <Tsi-Label [labelValue]=\"col.nom\"></Tsi-Label>\r\n </div>\r\n\r\n <!-- String -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.string\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Text-Box [(inputField)]=\"col.data.valeurString\"></Tsi-Text-Box>\r\n </div>\r\n </div>\r\n\r\n <!-- Int -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.int\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Integer [(inputField)]=\"col.data.valeurInt\"></Tsi-Integer>\r\n </div>\r\n </div>\r\n\r\n <!-- Decimal -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.decimal\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Decimal-Input [(inputField)]=\"col.data.valeurDecimal\"></Tsi-Decimal-Input>\r\n </div>\r\n </div>\r\n\r\n <!-- Boolean -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.boolean\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-CheckBox [isBinary]=\"false\" [(inputField)]=\"col.data.valeurBoolean\">\r\n </Tsi-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <!-- Binary -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.binary\">\r\n binary input (not handled yet)\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <ng-template #dynamicFooterContainer></ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"doesHaveForms\">\r\n <p-tabPanel [header]=\"'shared_form_dynamicFormsTab_Title' | localize\">\r\n <ng-template pTemplate=\"content\">\r\n <shared-dynamic-form-list\r\n [occurence]=\"id\"\r\n [occurenceBusinessClass]=\"businessClass\"\r\n [occurenceDiscriminatorValue]=\"descriminatorValue\"\r\n [ignoreDialogConfig]=\"true\" />\r\n </ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n </p-tabView>\r\n </div>\r\n </fieldset>\r\n\r\n <div *ngIf=\"(businessClass && entityStatusList.length > 0) ||\r\n workflowInformation?.workflowUid ||\r\n workflowConfigurationService.isDesginModeFromWorkflow\" class=\"mx-4 px-2 my-1 shared-footer-bar\">\r\n\r\n <div *ngIf=\"businessClass && entityStatusList && entityStatusList.length > 0\">\r\n <div class=\"flex align-items-center gap-2\" presentationDesigner=\"shared_crud_status\">\r\n <Tsi-Label [labelValue]=\"'shared_crud_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo [id-field]=\"'key'\" [label-field]=\"'value'\" [datasource]=\"entityStatusList\" [(bind)]=\"status\"\r\n [comboType]=\"'status'\" [statusMetadata]=\"statusMetadataComboStatus\"></Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n <div *ngIf=\"workflowInformation?.workflowUid || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n class=\"flex col-10\">\r\n <div presentationDesigner=\"shared_workflowName\" class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow'| localize\">\r\n </Tsi-Label>\r\n <Tsi-Text-Box [disabled]=\"true\" [inputName]=\"'workflowName'\" [(inputField)]=\"workflowInformation.workflowName\">\r\n </Tsi-Text-Box>\r\n </div>\r\n <div presentationDesigner=\"administration_workflow_workflow_current_status\"\r\n class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_current_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" [disabled]=\"true\" id-field=\"key\" label-field=\"value\"\r\n [bind]=\"workflowInformation.workflowEtat\" [isFiltered]=\"true\"\r\n [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\" [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n <div class=\"col-4\">\r\n <div *ngIf=\"mode != formModes.create || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n presentationDesigner=\"administration_workflow_workflow_next_status\"\r\n class=\"flex gap-2 align-items-center no-border\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_next_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" id-field=\"key\" label-field=\"value\" [(bind)]=\"selectedWorkflowEtatUid\"\r\n [isFiltered]=\"true\" [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\"\r\n [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\" (bindChange)=\"confirmUpdateWorkflowEtat($event)\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>", styles: [".border-black{border:solid 2px black}.no-border{border:none!important}.shared-footer-bar{display:flex;align-items:center;width:calc(100% - 300px);height:2.5rem;position:absolute;bottom:0;z-index:5}.mr{margin:0 12px 5px}.input-wrapper,.input-wrapper>tsi-text-box,.input-wrapper>tsi-integer,.input-wrapper>tsi-decimal-input,.input-wrapper>tsi-check-box{width:100%;display:block}.form-input{display:flex;align-items:center}.main-tab-text{display:inline-block}@media (max-width: 768px){.main-tab-text{display:none}}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i12.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i12.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i12.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i13.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i14.Toolbar, selector: "p-toolbar", inputs: ["style", "styleClass", "ariaLabelledBy"] }, { kind: "component", type: i15.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i15.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: i16.TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: ["elementSourceUrl", "listSourceUrl", "listSourceParams", "id-field", "label-field", "multiple", "sort", "showClear", "reloadDataSource", "isFiltered", "selectedLabel", "maxWidth", "businessClass", "comboType", "statusMetadata", "currentRowItem", "datasource", "bind", "maxSelectedLabels", "tooltipMaxDisplayedItems", "bindMode", "showSearchButton", "showAddButton", "showConsultButton", "showUpdateButton"], outputs: ["bindChange", "datasource-loaded", "init", "isLoaded", "selectedLabelChange", "onClick", "onSearchButtonClick", "selectionChange"] }, { kind: "component", type: i17.TsiCheckboxComponent, selector: "Tsi-CheckBox", inputs: ["class", "isBinary", "checked", "tooltipText", "tooltipPosition"], outputs: ["inputFieldChange", "checkedChange"] }, { kind: "component", type: i18.TsiDecimalInputComponent, selector: "Tsi-Decimal-Input", inputs: ["numOfDecimal", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i19.TsiIntegerComponent, selector: "Tsi-Integer", inputs: ["class", "minValue", "maxValue", "delayChangeTime"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i20.TsiTextBoxComponent, selector: "Tsi-Text-Box", inputs: ["textBoxType", "autocomplete"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i21.TsiLabelComponent, selector: "Tsi-Label", inputs: ["labelValue", "styleClass", "infoText"] }, { kind: "component", type: i22.ReportingComponent, selector: "app-reporting", inputs: ["showImportExportButton", "showNoteButton", "showInfoButton", "showUploadButton", "isReportingToolbarDisabled", "formName", "formEndpoint", "formEndpointBody", "isFormEndpointPaged", "filtersHtmlTemplate", "optionalEndpoints", "businessClass", "cudComponent", "httpMethodType", "requestData", "customReportingMode", "pagedRequest", "reportDiscriminator", "nombreDocumentsJoints", "id", "configModeButtonId", "selectedItemUids", "fromTsiForm", "customSendMailMode", "reportingInformation"], outputs: ["onSave", "refreshData", "closedModalFileUpload", "toggleDesignMode"] }, { kind: "component", type: i23.DynamicFormListComponent, selector: "shared-dynamic-form-list", inputs: ["occurence", "occurenceBusinessClass", "occurenceDiscriminatorValue", "ignoreDialogConfig"] }, { kind: "directive", type: i24.BusyDirective, selector: "[busy]", inputs: ["busy"] }, { kind: "directive", type: i25.PresentationDesignerDirective, selector: "[presentationDesigner]" }, { kind: "pipe", type: i26.LocalizePipe, name: "localize" }] }); }
524
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiFormComponent, selector: "tsi-form", inputs: { class: "class", autocomplete: "autocomplete", optionalEndpoints: "optionalEndpoints", disabled: "disabled", isLoading: "isLoading", modalSize: "modalSize", formEndpoint: "formEndpoint", formName: "formName", isReportingToolbarDisabled: "isReportingToolbarDisabled", isCreateOnly: "isCreateOnly" }, outputs: { onSave: "onSave", onSubmit: "onSubmit", onSubmitFormWorkflowConfiguration: "onSubmitFormWorkflowConfiguration", formRefChange: "formRefChange", onStatusChange: "onStatusChange" }, queries: [{ propertyName: "modalHeaderComp", first: true, predicate: TsiModalHeaderComponent, descendants: true }, { propertyName: "modalFooterComp", first: true, predicate: TsiModalFooterComponent, descendants: true }], viewQueries: [{ propertyName: "formRef", first: true, predicate: ["formRef"], descendants: true }, { propertyName: "reportingApp", first: true, predicate: ["reportingApp"], descendants: true }, { propertyName: "toolbarTemplateRef", first: true, predicate: ["toolbarTemplate"], descendants: true }, { propertyName: "dynamicToolbarContainers", predicate: ["dynamicToolbarContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicFootersContainers", predicate: ["dynamicFooterContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<form class=\"form-horizontal\" autocomplete=\"off\" (ngSubmit)=\"handleFormSubmit($event)\" #formRef=\"ngForm\">\r\n <ng-template #toolbarTemplate>\r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"mb-1 gap-2\" class=\"w-full\" (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\" (dragenter)=\"onDragEnter($event)\" (dragleave)=\"onDragLeave($event)\">\r\n\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"mt-1 ml-2\">\r\n {{ inputTitle }}\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"right\">\r\n <div class=\"mt-1 mr-2\">\r\n <app-reporting *ngIf=\"formEndpoint\" [fromTsiForm]=\"true\" [id]=\"this.id\" [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\" [reportDiscriminator]=\"descriminatorValue\" [isFormEndpointPaged]=\"true\"\r\n [nombreDocumentsJoints]=\"nombreDocuments\" [configModeButtonId]=\"configModeButtonId\"\r\n [isReportingToolbarDisabled]=\"isReportingToolbarDisabled\" (toggleDesignMode)=\"toggleDesignMode($event)\"\r\n [businessClass]=\"businessClass\" (closedModalFileUpload)=\"getNombreFichier()\"\r\n [showImportExportButton]=\"false\" #reportingApp>\r\n </app-reporting>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n\r\n </p-toolbar>\r\n </ng-template>\r\n\r\n <div *busy=\"isLoading\"></div>\r\n\r\n <fieldset [disabled]=\"disabled\">\r\n <div class=\"card mr\">\r\n <p-tabView>\r\n\r\n <p-tabPanel header=\"\" \r\n [headerStyle]=\"colonnesPersonnaliseeGrouped.length === 0 && !canShowForms\r\n ? { display: 'none' } \r\n : null\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <i class=\"pi pi-home mr-2\"></i>\r\n <span class=\"main-tab-text\">{{ 'shared_form_maintabTitle' | localize }}</span>\r\n </ng-template>\r\n\r\n <ng-content></ng-content>\r\n </p-tabPanel>\r\n\r\n <!-- Dynamic tabs -->\r\n <ng-container *ngIf=\"colonnesPersonnaliseeGrouped.length > 0\">\r\n <p-tabPanel *ngFor=\"let grp of colonnesPersonnaliseeGrouped\" [header]=\"grp.groupe\">\r\n\r\n <ng-template #dynamicToolbarContainer></ng-template>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col-12 grid form-row\" *ngFor=\"let col of grp.colonnes\">\r\n <div class=\"col-3 form-label\">\r\n <Tsi-Label [labelValue]=\"col.nom\"></Tsi-Label>\r\n </div>\r\n\r\n <!-- String -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.string\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Text-Box [(inputField)]=\"col.data.valeurString\"></Tsi-Text-Box>\r\n </div>\r\n </div>\r\n\r\n <!-- Int -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.int\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Integer [(inputField)]=\"col.data.valeurInt\"></Tsi-Integer>\r\n </div>\r\n </div>\r\n\r\n <!-- Decimal -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.decimal\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Decimal-Input [(inputField)]=\"col.data.valeurDecimal\"></Tsi-Decimal-Input>\r\n </div>\r\n </div>\r\n\r\n <!-- Boolean -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.boolean\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-CheckBox [isBinary]=\"false\" [(inputField)]=\"col.data.valeurBoolean\">\r\n </Tsi-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <!-- Binary -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.binary\">\r\n binary input (not handled yet)\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <ng-template #dynamicFooterContainer></ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"canShowForms\">\r\n <p-tabPanel [header]=\"'shared_form_dynamicFormsTab_Title' | localize\">\r\n <ng-template pTemplate=\"content\">\r\n <shared-dynamic-form-list\r\n [occurence]=\"id\"\r\n [occurenceBusinessClass]=\"businessClass\"\r\n [occurenceDiscriminatorValue]=\"descriminatorValue\"\r\n [ignoreDialogConfig]=\"true\" />\r\n </ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n </p-tabView>\r\n </div>\r\n </fieldset>\r\n\r\n <div *ngIf=\"(businessClass && entityStatusList.length > 0) ||\r\n workflowInformation?.workflowUid ||\r\n workflowConfigurationService.isDesginModeFromWorkflow\" class=\"mx-4 px-2 my-1 shared-footer-bar\">\r\n\r\n <div *ngIf=\"businessClass && entityStatusList && entityStatusList.length > 0\">\r\n <div class=\"flex align-items-center gap-2\" presentationDesigner=\"shared_crud_status\">\r\n <Tsi-Label [labelValue]=\"'shared_crud_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo [id-field]=\"'key'\" [label-field]=\"'value'\" [datasource]=\"entityStatusList\" [(bind)]=\"status\"\r\n [comboType]=\"'status'\" [statusMetadata]=\"statusMetadataComboStatus\"></Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n <div *ngIf=\"workflowInformation?.workflowUid || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n class=\"flex col-10\">\r\n <div presentationDesigner=\"shared_workflowName\" class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow'| localize\">\r\n </Tsi-Label>\r\n <Tsi-Text-Box [disabled]=\"true\" [inputName]=\"'workflowName'\" [(inputField)]=\"workflowInformation.workflowName\">\r\n </Tsi-Text-Box>\r\n </div>\r\n <div presentationDesigner=\"administration_workflow_workflow_current_status\"\r\n class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_current_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" [disabled]=\"true\" id-field=\"key\" label-field=\"value\"\r\n [bind]=\"workflowInformation.workflowEtat\" [isFiltered]=\"true\"\r\n [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\" [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n <div class=\"col-4\">\r\n <div *ngIf=\"mode != formModes.create || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n presentationDesigner=\"administration_workflow_workflow_next_status\"\r\n class=\"flex gap-2 align-items-center no-border\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_next_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" id-field=\"key\" label-field=\"value\" [(bind)]=\"selectedWorkflowEtatUid\"\r\n [isFiltered]=\"true\" [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\"\r\n [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\" (bindChange)=\"confirmUpdateWorkflowEtat($event)\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>", styles: [".border-black{border:solid 2px black}.no-border{border:none!important}.shared-footer-bar{display:flex;align-items:center;width:calc(100% - 300px);height:2.5rem;position:absolute;bottom:0;z-index:5}.mr{margin:0 12px 5px}.input-wrapper,.input-wrapper>tsi-text-box,.input-wrapper>tsi-integer,.input-wrapper>tsi-decimal-input,.input-wrapper>tsi-check-box{width:100%;display:block}.form-input{display:flex;align-items:center}.main-tab-text{display:inline-block}@media (max-width: 768px){.main-tab-text{display:none}}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i12.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i12.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i12.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i13.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i14.Toolbar, selector: "p-toolbar", inputs: ["style", "styleClass", "ariaLabelledBy"] }, { kind: "component", type: i15.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i15.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: i16.TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: ["elementSourceUrl", "listSourceUrl", "listSourceParams", "id-field", "label-field", "multiple", "sort", "showClear", "reloadDataSource", "isFiltered", "selectedLabel", "maxWidth", "businessClass", "comboType", "statusMetadata", "currentRowItem", "datasource", "bind", "maxSelectedLabels", "tooltipMaxDisplayedItems", "bindMode", "showSearchButton", "showAddButton", "showConsultButton", "showUpdateButton"], outputs: ["bindChange", "datasource-loaded", "init", "isLoaded", "selectedLabelChange", "onClick", "onSearchButtonClick", "selectionChange"] }, { kind: "component", type: i17.TsiCheckboxComponent, selector: "Tsi-CheckBox", inputs: ["class", "isBinary", "checked", "tooltipText", "tooltipPosition"], outputs: ["inputFieldChange", "checkedChange"] }, { kind: "component", type: i18.TsiDecimalInputComponent, selector: "Tsi-Decimal-Input", inputs: ["numOfDecimal", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i19.TsiIntegerComponent, selector: "Tsi-Integer", inputs: ["class", "minValue", "maxValue", "delayChangeTime"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i20.TsiTextBoxComponent, selector: "Tsi-Text-Box", inputs: ["textBoxType", "autocomplete"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i21.TsiLabelComponent, selector: "Tsi-Label", inputs: ["labelValue", "styleClass", "infoText"] }, { kind: "component", type: i22.ReportingComponent, selector: "app-reporting", inputs: ["showImportExportButton", "showNoteButton", "showInfoButton", "showUploadButton", "isReportingToolbarDisabled", "formName", "formEndpoint", "formEndpointBody", "isFormEndpointPaged", "filtersHtmlTemplate", "optionalEndpoints", "businessClass", "cudComponent", "httpMethodType", "requestData", "customReportingMode", "pagedRequest", "reportDiscriminator", "nombreDocumentsJoints", "id", "configModeButtonId", "selectedItemUids", "fromTsiForm", "customSendMailMode", "reportingInformation"], outputs: ["onSave", "refreshData", "closedModalFileUpload", "toggleDesignMode"] }, { kind: "component", type: i23.DynamicFormListComponent, selector: "shared-dynamic-form-list", inputs: ["occurence", "occurenceBusinessClass", "occurenceDiscriminatorValue", "ignoreDialogConfig"] }, { kind: "directive", type: i24.BusyDirective, selector: "[busy]", inputs: ["busy"] }, { kind: "directive", type: i25.PresentationDesignerDirective, selector: "[presentationDesigner]" }, { kind: "pipe", type: i26.LocalizePipe, name: "localize" }] }); }
516
525
  }
517
526
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFormComponent, decorators: [{
518
527
  type: Component,
519
- args: [{ selector: 'tsi-form', template: "<form class=\"form-horizontal\" autocomplete=\"off\" (ngSubmit)=\"handleFormSubmit($event)\" #formRef=\"ngForm\">\r\n <ng-template #toolbarTemplate>\r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"mb-1 gap-2\" class=\"w-full\" (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\" (dragenter)=\"onDragEnter($event)\" (dragleave)=\"onDragLeave($event)\">\r\n\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"mt-1 ml-2\">\r\n {{ inputTitle }}\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"right\">\r\n <div class=\"mt-1 mr-2\">\r\n <app-reporting *ngIf=\"formEndpoint\" [fromTsiForm]=\"true\" [id]=\"this.id\" [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\" [reportDiscriminator]=\"descriminatorValue\" [isFormEndpointPaged]=\"true\"\r\n [nombreDocumentsJoints]=\"nombreDocuments\" [configModeButtonId]=\"configModeButtonId\"\r\n [isReportingToolbarDisabled]=\"isReportingToolbarDisabled\" (toggleDesignMode)=\"toggleDesignMode($event)\"\r\n [businessClass]=\"businessClass\" (closedModalFileUpload)=\"getNombreFichier()\"\r\n [showImportExportButton]=\"false\" #reportingApp>\r\n </app-reporting>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n\r\n </p-toolbar>\r\n </ng-template>\r\n\r\n <div *busy=\"isLoading\"></div>\r\n\r\n <fieldset [disabled]=\"disabled\">\r\n <div class=\"card mr\">\r\n <p-tabView>\r\n\r\n <p-tabPanel header=\"\" \r\n [headerStyle]=\"colonnesPersonnaliseeGrouped.length === 0 && !doesHaveForms\r\n ? { display: 'none' } \r\n : null\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <i class=\"pi pi-home mr-2\"></i>\r\n <span class=\"main-tab-text\">{{ 'shared_form_maintabTitle' | localize }}</span>\r\n </ng-template>\r\n\r\n <ng-content></ng-content>\r\n </p-tabPanel>\r\n\r\n <!-- Dynamic tabs -->\r\n <ng-container *ngIf=\"colonnesPersonnaliseeGrouped.length > 0\">\r\n <p-tabPanel *ngFor=\"let grp of colonnesPersonnaliseeGrouped\" [header]=\"grp.groupe\">\r\n\r\n <ng-template #dynamicToolbarContainer></ng-template>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col-12 grid form-row\" *ngFor=\"let col of grp.colonnes\">\r\n <div class=\"col-3 form-label\">\r\n <Tsi-Label [labelValue]=\"col.nom\"></Tsi-Label>\r\n </div>\r\n\r\n <!-- String -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.string\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Text-Box [(inputField)]=\"col.data.valeurString\"></Tsi-Text-Box>\r\n </div>\r\n </div>\r\n\r\n <!-- Int -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.int\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Integer [(inputField)]=\"col.data.valeurInt\"></Tsi-Integer>\r\n </div>\r\n </div>\r\n\r\n <!-- Decimal -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.decimal\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Decimal-Input [(inputField)]=\"col.data.valeurDecimal\"></Tsi-Decimal-Input>\r\n </div>\r\n </div>\r\n\r\n <!-- Boolean -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.boolean\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-CheckBox [isBinary]=\"false\" [(inputField)]=\"col.data.valeurBoolean\">\r\n </Tsi-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <!-- Binary -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.binary\">\r\n binary input (not handled yet)\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <ng-template #dynamicFooterContainer></ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"doesHaveForms\">\r\n <p-tabPanel [header]=\"'shared_form_dynamicFormsTab_Title' | localize\">\r\n <ng-template pTemplate=\"content\">\r\n <shared-dynamic-form-list\r\n [occurence]=\"id\"\r\n [occurenceBusinessClass]=\"businessClass\"\r\n [occurenceDiscriminatorValue]=\"descriminatorValue\"\r\n [ignoreDialogConfig]=\"true\" />\r\n </ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n </p-tabView>\r\n </div>\r\n </fieldset>\r\n\r\n <div *ngIf=\"(businessClass && entityStatusList.length > 0) ||\r\n workflowInformation?.workflowUid ||\r\n workflowConfigurationService.isDesginModeFromWorkflow\" class=\"mx-4 px-2 my-1 shared-footer-bar\">\r\n\r\n <div *ngIf=\"businessClass && entityStatusList && entityStatusList.length > 0\">\r\n <div class=\"flex align-items-center gap-2\" presentationDesigner=\"shared_crud_status\">\r\n <Tsi-Label [labelValue]=\"'shared_crud_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo [id-field]=\"'key'\" [label-field]=\"'value'\" [datasource]=\"entityStatusList\" [(bind)]=\"status\"\r\n [comboType]=\"'status'\" [statusMetadata]=\"statusMetadataComboStatus\"></Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n <div *ngIf=\"workflowInformation?.workflowUid || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n class=\"flex col-10\">\r\n <div presentationDesigner=\"shared_workflowName\" class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow'| localize\">\r\n </Tsi-Label>\r\n <Tsi-Text-Box [disabled]=\"true\" [inputName]=\"'workflowName'\" [(inputField)]=\"workflowInformation.workflowName\">\r\n </Tsi-Text-Box>\r\n </div>\r\n <div presentationDesigner=\"administration_workflow_workflow_current_status\"\r\n class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_current_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" [disabled]=\"true\" id-field=\"key\" label-field=\"value\"\r\n [bind]=\"workflowInformation.workflowEtat\" [isFiltered]=\"true\"\r\n [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\" [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n <div class=\"col-4\">\r\n <div *ngIf=\"mode != formModes.create || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n presentationDesigner=\"administration_workflow_workflow_next_status\"\r\n class=\"flex gap-2 align-items-center no-border\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_next_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" id-field=\"key\" label-field=\"value\" [(bind)]=\"selectedWorkflowEtatUid\"\r\n [isFiltered]=\"true\" [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\"\r\n [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\" (bindChange)=\"confirmUpdateWorkflowEtat($event)\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>", styles: [".border-black{border:solid 2px black}.no-border{border:none!important}.shared-footer-bar{display:flex;align-items:center;width:calc(100% - 300px);height:2.5rem;position:absolute;bottom:0;z-index:5}.mr{margin:0 12px 5px}.input-wrapper,.input-wrapper>tsi-text-box,.input-wrapper>tsi-integer,.input-wrapper>tsi-decimal-input,.input-wrapper>tsi-check-box{width:100%;display:block}.form-input{display:flex;align-items:center}.main-tab-text{display:inline-block}@media (max-width: 768px){.main-tab-text{display:none}}\n"] }]
528
+ args: [{ selector: 'tsi-form', template: "<form class=\"form-horizontal\" autocomplete=\"off\" (ngSubmit)=\"handleFormSubmit($event)\" #formRef=\"ngForm\">\r\n <ng-template #toolbarTemplate>\r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"mb-1 gap-2\" class=\"w-full\" (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\" (dragenter)=\"onDragEnter($event)\" (dragleave)=\"onDragLeave($event)\">\r\n\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"mt-1 ml-2\">\r\n {{ inputTitle }}\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"right\">\r\n <div class=\"mt-1 mr-2\">\r\n <app-reporting *ngIf=\"formEndpoint\" [fromTsiForm]=\"true\" [id]=\"this.id\" [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\" [reportDiscriminator]=\"descriminatorValue\" [isFormEndpointPaged]=\"true\"\r\n [nombreDocumentsJoints]=\"nombreDocuments\" [configModeButtonId]=\"configModeButtonId\"\r\n [isReportingToolbarDisabled]=\"isReportingToolbarDisabled\" (toggleDesignMode)=\"toggleDesignMode($event)\"\r\n [businessClass]=\"businessClass\" (closedModalFileUpload)=\"getNombreFichier()\"\r\n [showImportExportButton]=\"false\" #reportingApp>\r\n </app-reporting>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n\r\n </p-toolbar>\r\n </ng-template>\r\n\r\n <div *busy=\"isLoading\"></div>\r\n\r\n <fieldset [disabled]=\"disabled\">\r\n <div class=\"card mr\">\r\n <p-tabView>\r\n\r\n <p-tabPanel header=\"\" \r\n [headerStyle]=\"colonnesPersonnaliseeGrouped.length === 0 && !canShowForms\r\n ? { display: 'none' } \r\n : null\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <i class=\"pi pi-home mr-2\"></i>\r\n <span class=\"main-tab-text\">{{ 'shared_form_maintabTitle' | localize }}</span>\r\n </ng-template>\r\n\r\n <ng-content></ng-content>\r\n </p-tabPanel>\r\n\r\n <!-- Dynamic tabs -->\r\n <ng-container *ngIf=\"colonnesPersonnaliseeGrouped.length > 0\">\r\n <p-tabPanel *ngFor=\"let grp of colonnesPersonnaliseeGrouped\" [header]=\"grp.groupe\">\r\n\r\n <ng-template #dynamicToolbarContainer></ng-template>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col-12 grid form-row\" *ngFor=\"let col of grp.colonnes\">\r\n <div class=\"col-3 form-label\">\r\n <Tsi-Label [labelValue]=\"col.nom\"></Tsi-Label>\r\n </div>\r\n\r\n <!-- String -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.string\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Text-Box [(inputField)]=\"col.data.valeurString\"></Tsi-Text-Box>\r\n </div>\r\n </div>\r\n\r\n <!-- Int -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.int\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Integer [(inputField)]=\"col.data.valeurInt\"></Tsi-Integer>\r\n </div>\r\n </div>\r\n\r\n <!-- Decimal -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.decimal\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Decimal-Input [(inputField)]=\"col.data.valeurDecimal\"></Tsi-Decimal-Input>\r\n </div>\r\n </div>\r\n\r\n <!-- Boolean -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.boolean\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-CheckBox [isBinary]=\"false\" [(inputField)]=\"col.data.valeurBoolean\">\r\n </Tsi-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <!-- Binary -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.binary\">\r\n binary input (not handled yet)\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <ng-template #dynamicFooterContainer></ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"canShowForms\">\r\n <p-tabPanel [header]=\"'shared_form_dynamicFormsTab_Title' | localize\">\r\n <ng-template pTemplate=\"content\">\r\n <shared-dynamic-form-list\r\n [occurence]=\"id\"\r\n [occurenceBusinessClass]=\"businessClass\"\r\n [occurenceDiscriminatorValue]=\"descriminatorValue\"\r\n [ignoreDialogConfig]=\"true\" />\r\n </ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n </p-tabView>\r\n </div>\r\n </fieldset>\r\n\r\n <div *ngIf=\"(businessClass && entityStatusList.length > 0) ||\r\n workflowInformation?.workflowUid ||\r\n workflowConfigurationService.isDesginModeFromWorkflow\" class=\"mx-4 px-2 my-1 shared-footer-bar\">\r\n\r\n <div *ngIf=\"businessClass && entityStatusList && entityStatusList.length > 0\">\r\n <div class=\"flex align-items-center gap-2\" presentationDesigner=\"shared_crud_status\">\r\n <Tsi-Label [labelValue]=\"'shared_crud_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo [id-field]=\"'key'\" [label-field]=\"'value'\" [datasource]=\"entityStatusList\" [(bind)]=\"status\"\r\n [comboType]=\"'status'\" [statusMetadata]=\"statusMetadataComboStatus\"></Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n <div *ngIf=\"workflowInformation?.workflowUid || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n class=\"flex col-10\">\r\n <div presentationDesigner=\"shared_workflowName\" class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow'| localize\">\r\n </Tsi-Label>\r\n <Tsi-Text-Box [disabled]=\"true\" [inputName]=\"'workflowName'\" [(inputField)]=\"workflowInformation.workflowName\">\r\n </Tsi-Text-Box>\r\n </div>\r\n <div presentationDesigner=\"administration_workflow_workflow_current_status\"\r\n class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_current_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" [disabled]=\"true\" id-field=\"key\" label-field=\"value\"\r\n [bind]=\"workflowInformation.workflowEtat\" [isFiltered]=\"true\"\r\n [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\" [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n <div class=\"col-4\">\r\n <div *ngIf=\"mode != formModes.create || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n presentationDesigner=\"administration_workflow_workflow_next_status\"\r\n class=\"flex gap-2 align-items-center no-border\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_next_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" id-field=\"key\" label-field=\"value\" [(bind)]=\"selectedWorkflowEtatUid\"\r\n [isFiltered]=\"true\" [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\"\r\n [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\" (bindChange)=\"confirmUpdateWorkflowEtat($event)\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>", styles: [".border-black{border:solid 2px black}.no-border{border:none!important}.shared-footer-bar{display:flex;align-items:center;width:calc(100% - 300px);height:2.5rem;position:absolute;bottom:0;z-index:5}.mr{margin:0 12px 5px}.input-wrapper,.input-wrapper>tsi-text-box,.input-wrapper>tsi-integer,.input-wrapper>tsi-decimal-input,.input-wrapper>tsi-check-box{width:100%;display:block}.form-input{display:flex;align-items:center}.main-tab-text{display:inline-block}@media (max-width: 768px){.main-tab-text{display:none}}\n"] }]
520
529
  }], ctorParameters: () => [{ type: i1.EntityStatusService }, { type: i2.StatusColorService }, { type: i3.FichierService }, { type: i4.ErrorResponseManagerService }, { type: i5.TsiConfirmationService }, { type: i6.TsiNotificationService }, { type: i0.ChangeDetectorRef }, { type: i7.LayoutHelperService }, { type: i8.WorkflowConfigurationService }, { type: i9.ColonnePersonnaliseeService }, { type: i10.DynamicDialogRef }, { type: i10.DynamicDialogConfig }], propDecorators: { formRef: [{
521
530
  type: ViewChild,
522
531
  args: ['formRef']
@@ -569,4 +578,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
569
578
  type: ViewChildren,
570
579
  args: ['dynamicFooterContainer', { read: ViewContainerRef }]
571
580
  }] } });
572
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL3RzaS1mb3JtL3RzaS1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2ktZm9ybS90c2ktZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBSUwsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBR04sU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGNBQWMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEMsT0FBTyxFQUE0QixPQUFPLEVBQW1DLCtCQUErQixFQUFFLG1DQUFtQyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hLLE9BQU8sRUFBRSx3QkFBd0IsRUFBdUMsTUFBTSxpREFBaUQsQ0FBQztBQUVoSSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFVdEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPbkYsTUFBTSxPQUFPLGdCQUFnQjtJQXlCM0IsSUFBSSxrQkFBa0IsS0FBeUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLElBQUksa0JBQWtCLENBQUMsS0FBeUI7UUFDOUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBVUQsSUFDSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxLQUF5QjtRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUNJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQXlCO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQVFELDJCQUEyQjtJQUMzQixJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixJQUFJLGFBQWEsQ0FBQyxLQUF5QjtRQUN6QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUFJLEVBQUU7UUFDSixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUFJLEVBQUUsQ0FBQyxLQUF5QjtRQUM5QixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQztRQUNqQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLElBQUksTUFBTSxDQUFDLEtBQXlCO1FBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsS0FBeUI7UUFDaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFDSSwwQkFBMEI7UUFDNUIsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksMEJBQTBCLENBQUMsS0FBYztRQUMzQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFpQ0QsY0FBYztJQUNkLFlBQ1UsbUJBQXdDLEVBQ3hDLGtCQUFzQyxFQUN2QyxlQUErQixFQUM5Qiw0QkFBeUQsRUFDekQsa0JBQTBDLEVBQzFDLHVCQUErQyxFQUMvQyxJQUF1QixFQUN2QixvQkFBeUMsRUFDMUMsNEJBQTBELEVBQzFELDRCQUF5RCxFQUN6RCxHQUFzQixFQUN0QixNQUE0QjtRQVgzQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdkMsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQzlCLGlDQUE0QixHQUE1Qiw0QkFBNEIsQ0FBNkI7UUFDekQsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUF3QjtRQUMxQyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXdCO1FBQy9DLFNBQUksR0FBSixJQUFJLENBQW1CO1FBQ3ZCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBcUI7UUFDMUMsaUNBQTRCLEdBQTVCLDRCQUE0QixDQUE4QjtRQUMxRCxpQ0FBNEIsR0FBNUIsNEJBQTRCLENBQTZCO1FBQ3pELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQXNCO1FBbks5QixhQUFRLEdBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRXZDLHdCQUF3QjtRQUNoQixnQ0FBMkIsR0FBWSxLQUFLLENBQUM7UUFVNUMsaUJBQVksR0FBVyxLQUFLLENBQUM7UUFLN0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixjQUFTLEdBQVksS0FBSyxDQUFDO1FBRTFCLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRW5DLHdCQUFtQixHQUF1QixTQUFTLENBQUM7UUFPNUQscUJBQWdCLEdBQW1DLEVBQUUsQ0FBQztRQUd0RCxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLG9CQUFlLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN6QixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQW9GbEIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFdkMsWUFBWTtRQUVaLGlCQUFpQjtRQUNQLGFBQVEsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN0RCxzQ0FBaUMsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMvRSxrQkFBYSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ2pFLG1CQUFjLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFnQjVFLGlDQUE0QixHQUEwQyxFQUFFLENBQUM7UUFDekUseUJBQW9CLEdBQVUsRUFBRSxDQUFDO1FBQ2pDLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRS9CLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hELHNCQUFpQixHQUF1QixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQWtDbEUsWUFBWTtRQUVaLG1CQUFtQjtRQUNYLHlCQUFvQixHQUF3QyxJQUFJLG1DQUFtQyxFQUFFLENBQUM7UUF5QzlHLGtDQUE2QixHQUMzQix1QkFBdUIsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1FBQzFELHlDQUFvQyxHQUFHLEVBQUUsQ0FBQztRQUUxQyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLHVCQUFrQixHQUFHLDZCQUE2QixDQUFDO1FBZ0NuRCxhQUFRLEdBQUcsUUFBUSxDQUFDO0lBcEdoQixDQUFDO0lBRUwscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFdEIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsb0NBQW9DLEVBQUUsQ0FBQztnQkFDckcsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQ0FBb0MsR0FBRyxLQUFLLENBQUE7WUFDaEUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBS0QsSUFBSSxtQkFBbUIsQ0FBQyxLQUEwQztRQUNoRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFBO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDekIsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyx1QkFBdUIsQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDakosQ0FBQztJQUNILENBQUM7SUFFRCxtSEFBbUg7SUFDbkgsc0NBQXNDO0lBQ3RDLE1BQU07SUFDTixxQ0FBcUM7SUFDckMsY0FBYztJQUNkLE1BQU07SUFDTixVQUFVO0lBQ1Ysd0dBQXdHO0lBQ3hHLHdDQUF3QztJQUN4QyxvQ0FBb0M7SUFDcEMsOERBQThEO0lBQzlELG9FQUFvRTtJQUNwRSwyREFBMkQ7SUFDM0Qsd0lBQXdJO0lBQ3hJLHdFQUF3RTtJQUN4RSxzQ0FBc0M7SUFDdEMsaUdBQWlHO0lBQ2pHLHVFQUF1RTtJQUN2RSxnQ0FBZ0M7SUFDaEMsbUZBQW1GO0lBQ25GLDZIQUE2SDtJQUM3SCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixvQkFBb0I7SUFDcEIsMkJBQTJCO0lBQzNCLE1BQU07SUFDTixJQUFJO0lBRUosSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUE7SUFDbEMsQ0FBQztJQVlELGFBQWE7SUFFYixnQ0FBZ0M7SUFDaEMsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtRQUM3QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLElBQUksSUFBSSxtQ0FBbUMsRUFBRSxDQUFBO1FBQzlHLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUE7UUFDaEUsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyx1QkFBdUIsQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDakosQ0FBQztRQUNELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTyx5QkFBeUI7UUFDL0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyw0QkFBNEI7YUFDM0QsbUJBQW1CLENBQUMsU0FBUyxDQUM1QixLQUFLLEVBQUUsSUFBUyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMseUJBQXlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxJQUFJLENBQUMsa0JBQWtCLENBQUMseUJBQXlCO3FCQUM5QyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFBO2dCQUNuQyxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQTtZQUN0SSxDQUFDO1FBQ0gsQ0FBQyxDQUNGLENBQUE7SUFDTCxDQUFDO0lBR08sdUJBQXVCO1FBQzdCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ2xELENBQUM7YUFDSSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxhQUFxQixFQUFFLEVBQVc7UUFDaEUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzNGLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ2hCLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO3dCQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDOzRCQUNiLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSx3QkFBd0IsQ0FDcEMsU0FBUyxFQUNULElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFDZixTQUFTLEVBQUUsU0FBUyxFQUNwQixTQUFTLEVBQUUsU0FBUyxFQUNwQixTQUFTLEVBQUUsU0FBUyxDQUNyQixDQUFDO3dCQUNKLENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBRUwsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEdBQUcsQ0FBQztnQkFFeEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtnQkFDNUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRVIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0RBQWtELEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdkUsQ0FBQztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFVO1FBQ3pCLGdEQUFnRDtRQUNoRCx1REFBdUQ7UUFFdkQscUJBQXFCO1FBQ3JCLGdEQUFnRDtRQUNoRCw0RUFBNEU7UUFFNUUsMkVBQTJFO1FBQzNFLDhDQUE4QztRQUM5QyxtREFBbUQ7UUFDbkQsMERBQTBEO1FBQzFELE1BQU07SUFDUixDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDMUQsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLE1BQU0sT0FBTyxHQUEwQyxTQUFTLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFFMUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsZUFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQztZQUNyRixPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZ0IsQ0FBQyxVQUFVLENBQUM7WUFFL0QsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUMxRCxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxPQUFPLEdBQTBDLFNBQVMsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUMxRyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUE7WUFDNUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUNyRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO1lBRWxELElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQ3JFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7WUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxZQUFZO0lBRVosdUJBQXVCO0lBQ3ZCLGdCQUFnQixDQUFDLEtBQVU7UUFDekIsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUMvRCxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3BELENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLHlDQUF5QyxFQUFFLENBQUE7WUFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFDRCxZQUFZO0lBRVoseUNBQXlDO1FBQ3ZDLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQ3RGLENBQUM7UUFFRixJQUFJLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzlDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDYixFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksd0JBQXdCLENBQ3BDLFNBQVMsRUFDVCxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQ2YsU0FBUyxFQUFFLFNBQVMsRUFDcEIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsU0FBUyxFQUFFLFNBQVMsQ0FDckIsQ0FBQztvQkFDSixDQUFDO29CQUVELE1BQU0sT0FBTyxHQUFHLElBQUksd0JBQXdCLENBQzFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFNBQVMsRUFDMUIsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLEVBQUUsRUFDOUIsRUFBRSxDQUFDLEdBQUcsRUFDTixFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFDckIsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQ2pCLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUNyQixFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFDcEIsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQ3BCLEVBQUUsQ0FBQyxXQUFXLENBQ2YsQ0FBQztvQkFFRixJQUFJLENBQUMsa0JBQWtCLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUVoRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLHVEQUF1RCxFQUNqRSxJQUFJLENBQUMsa0JBQWtCLENBQUMseUJBQXlCLENBQ2xELENBQUE7SUFFSCxDQUFDO0lBRUQsbUJBQW1CO0lBR25CLHlCQUF5QixDQUFDLEtBQVU7UUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNsQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsRUFBRSxtQ0FBbUMsRUFDekcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtvQkFDckIsSUFBSSxPQUFPLEdBQUcsSUFBSSwrQkFBK0IsRUFBRSxDQUFBO29CQUNuRCxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7b0JBQ3hDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQTtvQkFDNUIsT0FBTyxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztvQkFDbEMsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDO29CQUN6RCxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUE7b0JBQzVELE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUE7b0JBQzNFLE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFlBQVksQ0FBQTtvQkFDN0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtvQkFDcEIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLCtCQUErQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FDbEY7d0JBQ0UsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7NEJBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTs0QkFFakIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztnQ0FDNUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBOzRCQUMzQixDQUFDOzRCQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO3dCQUN4QixDQUFDO3dCQUNELEtBQUssRUFBRSxDQUFDLEtBQXdCLEVBQUUsRUFBRTs0QkFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTs0QkFDbEIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQTs0QkFDbkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7NEJBQ2hELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO3dCQUN4QixDQUFDO3FCQUNGLENBQ0YsQ0FBQTtnQkFDSCxDQUFDO3FCQUNJLENBQUM7b0JBQ0osSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQTtnQkFDckMsQ0FBQztZQUNILENBQUMsQ0FDRixDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFLTyxxQkFBcUI7UUFFM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHdDQUF3QyxDQUFDLElBQUksQ0FBQyxhQUFjLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUYsSUFBSSxFQUFFLENBQUMsSUFBNEIsRUFBRSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPO2dCQUNsQixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1lBQ3hDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsdUJBQXVCO0lBQ2YsZUFBZTtRQUNyQixJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDckUsSUFBSSxFQUFFLENBQUMsSUFBOEIsRUFBRSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPO2dCQUVsQixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQzVDLENBQUM7Z0JBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUNuQyxDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxZQUFZO0lBRVosVUFBVSxDQUFDLEtBQWdCO1FBQ3pCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBZ0I7UUFDckIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQztRQUN4QyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDdEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVLENBQUMsSUFBVSxFQUFFLGFBQXFCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQTRCLEVBQUUsRUFBRTtZQUMvQyxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQXFCLENBQUM7WUFDcEQsSUFBSSxDQUFDLFdBQVc7Z0JBQUUsT0FBTztZQUV6QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFNUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNwQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkMsYUFBYSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzlCLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLGFBQWEsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzVDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQy9CLGFBQWEsQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDO1lBQ3RDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUM3QyxhQUFhLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDekMsYUFBYSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUE7WUFFdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNuRCxJQUFJLEVBQUUsR0FBRyxFQUFFO29CQUNULElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUN4QixJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNyQixDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLFFBQTJCLEVBQUUsRUFBRTtvQkFDckMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRCxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRUYsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFtQjtRQUNyQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLENBQUMsR0FBUztRQUNaLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM5QyxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUN0QixDQUFDO2lCQUNJLENBQUM7Z0JBQ0osSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsQ0FBQyxDQUFDLEdBQVc7UUFDWCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSTtlQUNwQixJQUFJLENBQUMsUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsZUFBZTtpQkFDakIseUJBQXlCLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQ3hDLFNBQVMsQ0FBQztnQkFDVCxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztnQkFDOUIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxRQUEyQixFQUFFLEVBQUU7b0JBQ3JDLGdFQUFnRTtvQkFDaEUsT0FBTyxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsRUFBRSxRQUFRLENBQUMsQ0FBQTtnQkFDeEUsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWdCO1FBQzFCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBaUI7UUFDM0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRztnQkFDckIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQztnQkFDcEIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQzthQUNyQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsS0FBZ0I7UUFDMUIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV0QixJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxLQUFnQjtRQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUM7WUFDcEIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQztTQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVPLDBCQUEwQjtRQUNoQyxJQUFHLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPO1FBRS9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzthQUM3RixTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQUUsT0FBTztnQkFDaEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDNUIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckIsQ0FBQztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7K0dBM25CVSxnQkFBZ0I7bUdBQWhCLGdCQUFnQixnbEJBb0liLHVCQUF1QixrRkFFdkIsdUJBQXVCLCthQUVZLGdCQUFnQixnSEFHakIsZ0JBQWdCLDZCQzdMbEUsd25QQStKTzs7NEZEN0dNLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxVQUFVO29lQVlFLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDTyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBSWhCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUlHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxNQUFNO3NCQUFmLE1BQU07Z0JBa0JILFlBQVk7c0JBRGYsS0FBSztnQkFXRixRQUFRO3NCQURYLEtBQUs7Z0JBK0RGLDBCQUEwQjtzQkFEN0IsS0FBSztnQkFTRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csaUNBQWlDO3NCQUExQyxNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFHdUIsa0JBQWtCO3NCQUEvQyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDVyxlQUFlO3NCQUFyRCxZQUFZO3VCQUFDLHVCQUF1QjtnQkFFRSxlQUFlO3NCQUFyRCxZQUFZO3VCQUFDLHVCQUF1QjtnQkFHckMsd0JBQXdCO3NCQUR2QixZQUFZO3VCQUFDLHlCQUF5QixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUluRSx3QkFBd0I7c0JBRHZCLFlBQVk7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICBBZnRlckNvbnRlbnRDaGVja2VkLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbXBvbmVudFJlZixcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdDb250YWluZXJSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmb3JtVHlwZSB9IGZyb20gJy4uLy4uL2NvbnN0cy9mb3JtLXR5cGUnO1xyXG5pbXBvcnQgeyBBZG1pbmlzdHJhdGlvbkVuZHBvaW50cyB9IGZyb20gJy4uLy4uL2VuZC1wb2ludHMvZW5kcG9pbnRzJztcclxuaW1wb3J0IHsgTW9kZXMgfSBmcm9tICcuLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IElNb2RhbFNpemUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgRW50aXR5UHJvcGVydGllc1Jlc3BvbnNlLCBGaWNoaWVyLCBLZXlWYWx1ZVBhaXIsIE9wdGlvbmFsRW5kcG9pbnRzLCB1cGRhdGVFbnRpdHlXb3JrZmxvd0luZm9ybWF0aW9uLCB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IENvbG9ubmVQZXJzb25uYWxpc2VlRGF0YSwgQ29sb25uZVBlcnNvbm5hbGlzZWVHcm91cGVkUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvZHluYW1pYy1mb3JtL2NvbG9ubmUtcGVyc29ubmFsaXNlZSc7XHJcbmltcG9ydCB7IFN0YXR1c01ldGFkYXRhUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvc3RhdHVzL2NvbG9yLXN0YXR1cyc7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2xvY2FsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBDb2xvbm5lUGVyc29ubmFsaXNlZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9keW5hbWljLWZvcm0vY29sb25uZS1wZXJzb25uYWxpc2VlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEeW5hbWljRm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWNoaWVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpY2hpZXIvZmljaGllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5b3V0SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xheW91dC9sYXlvdXQtaGVscGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vZXJyb3ItcmVzcG9uc2UtbWFuYWdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpQ29uZmlybWF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktY29uZmlybWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUc2lOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL3RzaS1ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eVN0YXR1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdGF0dXMvZW50aXR5U3RhdHVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdGF0dXNDb2xvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdGF0dXMvc3RhdHVzLWNvbG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvd29ya2Zsb3cvd29ya2Zsb3ctY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVwb3J0aW5nQ29tcG9uZW50IH0gZnJvbSAnLi4vcmVwb3J0aW5nL3JlcG9ydGluZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lNb2RhbEZvb3RlckNvbXBvbmVudCB9IGZyb20gJy4uL3RzaS1tb2RhbC1mb290ZXIvdHNpLW1vZGFsLWZvb3Rlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lNb2RhbEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL3RzaS1tb2RhbC1oZWFkZXIvdHNpLW1vZGFsLWhlYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGb3JtdWxhaXJlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2R5bmFtaWMtZm9ybS9mb3JtdWxhaXJlLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0c2ktZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RzaS1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktZm9ybS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XHJcbiAgcHVibGljIGxvY2FsaXplPyA9IGluamVjdChMb2NhbGl6ZVBpcGUpXHJcbiAgXHJcbiAgLy8jcmVnaW9uIHByaXZhdGUgZmllbGRzXHJcbiAgcHJpdmF0ZSBfaXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIHByb3BlcnRpZXNcclxuICBAVmlld0NoaWxkKCdmb3JtUmVmJykgZm9ybVJlZj86IE5nRm9ybTtcclxuICBAVmlld0NoaWxkKFwicmVwb3J0aW5nQXBwXCIpIHJlcG9ydGluZ0FwcD86IFJlcG9ydGluZ0NvbXBvbmVudFxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIFxyXG4gIC8vI3JlZ2lvbiBpbnB1dHNcclxuICBASW5wdXQoKSBjbGFzcz86IHN0cmluZztcclxuICBASW5wdXQoKSBhdXRvY29tcGxldGU6IHN0cmluZyA9ICdvZmYnO1xyXG4gIC8vIEBJbnB1dCgpIGZvcm1OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgLy8gQElucHV0KCkgZm9ybUVuZHBvaW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgXHJcbiAgQElucHV0KCkgb3B0aW9uYWxFbmRwb2ludHM/OiBPcHRpb25hbEVuZHBvaW50cztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG1vZGFsU2l6ZT86IElNb2RhbFNpemU7XHJcbiAgQE91dHB1dCgpIG9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwcml2YXRlIF9kZXNjcmltaW5hdG9yVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICBnZXQgZGVzY3JpbWluYXRvclZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9kZXNjcmltaW5hdG9yVmFsdWU7IH1cclxuICBzZXQgZGVzY3JpbWluYXRvclZhbHVlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2Rlc2NyaW1pbmF0b3JWYWx1ZSA9IHZhbHVlOyAgICBcclxuICAgIHRoaXMuZ2V0QWxsRm9ybXNPZkJ1c2luZXNzQ2xhc3MoKTtcclxuICB9XHJcblxyXG4gIGVudGl0eVN0YXR1c0xpc3Q6IEtleVZhbHVlUGFpcjxzdHJpbmcsIHN0cmluZz5bXSA9IFtdO1xyXG5cclxuICBub21icmVEb2N1bWVudHM6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBpc0RyYWdPdmVyID0gZmFsc2U7XHJcbiAgbWVzc2FnZVBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XHJcbiAgcHJpdmF0ZSBkcmFnRW50ZXJDb3VudCA9IDA7XHJcbiAgcHJpdmF0ZSBfZm9ybU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBcclxuICBASW5wdXQoKVxyXG4gIGdldCBmb3JtRW5kcG9pbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JtRW5kcG9pbnQ7XHJcbiAgfVxyXG5cclxuICBzZXQgZm9ybUVuZHBvaW50KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2Zvcm1FbmRwb2ludCA9IHZhbHVlO1xyXG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGZvcm1OYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9ybU5hbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgZm9ybU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZm9ybU5hbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9idXNpbmVzc0NsYXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfaWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9tb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZm9ybUVuZHBvaW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfc3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIEdldHRlciBmb3IgYnVzaW5lc3NDbGFzc1xyXG4gIGdldCBidXNpbmVzc0NsYXNzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fYnVzaW5lc3NDbGFzcztcclxuICB9XHJcblxyXG4gIC8vIFNldHRlciBmb3IgYnVzaW5lc3NDbGFzc1xyXG4gIHNldCBidXNpbmVzc0NsYXNzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2J1c2luZXNzQ2xhc3MgPSB2YWx1ZTtcclxuICAgIHRoaXMuZ2V0Q29sb25uZVBlcnNvbm5hbGlzZWUoKTtcclxuICAgIHRoaXMuZ2V0RW50aXR5U3RhdHVzKCk7XHJcbiAgICB0aGlzLmdldFN0YXR1c01ldGFGb3JDb21ibygpO1xyXG4gICAgdGhpcy5nZXRBbGxGb3Jtc09mQnVzaW5lc3NDbGFzcygpO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0dGVyIGZvciBpZFxyXG4gIGdldCBpZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gIH1cclxuXHJcbiAgLy8gU2V0dGVyIGZvciBpZFxyXG4gIHNldCBpZCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xyXG4gICAgdGhpcy5nZXRDb2xvbm5lUGVyc29ubmFsaXNlZSgpO1xyXG4gICAgdGhpcy5nZXROb21icmVGaWNoaWVyKCk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXR0ZXIgZm9yIHN0YXR1c1xyXG4gIGdldCBzdGF0dXMoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XHJcbiAgfVxyXG5cclxuICAvLyBTZXR0ZXIgZm9yIHN0YXR1c1xyXG4gIHNldCBzdGF0dXModmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fc3RhdHVzID0gdmFsdWU7XHJcbiAgICB0aGlzLm9uU3RhdHVzQ2hhbmdlLmVtaXQodGhpcy5fc3RhdHVzKTtcclxuICB9XHJcblxyXG4gIHNldCBtb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX21vZGUgPSB2YWx1ZTtcclxuICAgIHRoaXMuZ2V0Q29sb25uZVBlcnNvbm5hbGlzZWUoKVxyXG4gIH1cclxuXHJcbiAgZ2V0IG1vZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgaXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgaXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzUmVwb3J0aW5nVG9vbGJhckRpc2FibGVkID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBpc0NyZWF0ZU9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBvdXRwdXRzXHJcbiAgQE91dHB1dCgpIG9uU3VibWl0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvblN1Ym1pdEZvcm1Xb3JrZmxvd0NvbmZpZ3VyYXRpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZvcm1SZWZDaGFuZ2U6IEV2ZW50RW1pdHRlcjxOZ0Zvcm0+ID0gbmV3IEV2ZW50RW1pdHRlcjxOZ0Zvcm0+KCk7XHJcbiAgQE91dHB1dCgpIG9uU3RhdHVzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBAVmlld0NoaWxkKCd0b29sYmFyVGVtcGxhdGUnKSB0b29sYmFyVGVtcGxhdGVSZWYgITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAQ29udGVudENoaWxkKFRzaU1vZGFsSGVhZGVyQ29tcG9uZW50KSBtb2RhbEhlYWRlckNvbXA/OiBUc2lNb2RhbEhlYWRlckNvbXBvbmVudDtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChUc2lNb2RhbEZvb3RlckNvbXBvbmVudCkgbW9kYWxGb290ZXJDb21wPzogVHNpTW9kYWxGb290ZXJDb21wb25lbnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ2R5bmFtaWNUb29sYmFyQ29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXHJcbiAgZHluYW1pY1Rvb2xiYXJDb250YWluZXJzITogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+O1xyXG5cclxuICBAVmlld0NoaWxkcmVuKCdkeW5hbWljRm9vdGVyQ29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXHJcbiAgZHluYW1pY0Zvb3RlcnNDb250YWluZXJzITogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+O1xyXG5cclxuICBpbnB1dFRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbG9ubmVzUGVyc29ubmFsaXNlZUdyb3VwZWQ6IENvbG9ubmVQZXJzb25uYWxpc2VlR3JvdXBlZFJlc3BvbnNlW10gPSBbXTtcclxuICBmb3Jtc09mQnVzaW5lc3NDbGFzczogYW55W10gPSBbXTtcclxuICBkb2VzSGF2ZUZvcm1zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGR5bmFtaWNGb3JtU2VydmljZSA9IGluamVjdChEeW5hbWljRm9ybVNlcnZpY2UpO1xyXG4gIGZvcm11bGFpcmVTZXJ2aWNlIDogRm9ybXVsYWlyZVNlcnZpY2UgPSBpbmplY3QoRm9ybXVsYWlyZVNlcnZpY2UpO1xyXG5cclxuICAvLyNyZWdpb24gY3RvclxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbnRpdHlTdGF0dXNTZXJ2aWNlOiBFbnRpdHlTdGF0dXNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdGF0dXNDb2xvclNlcnZpY2U6IFN0YXR1c0NvbG9yU2VydmljZSxcclxuICAgIHB1YmxpYyBfZmljaGllclNlcnZpY2U6IEZpY2hpZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlOiBFcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90c2lDb25maXJtU2VydmljZTogVHNpQ29uZmlybWF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX3RzaU5vdGlmaWNhdGlvblNlcnZpY2U6IFRzaU5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBfbGF5b3V0SGVscGVyU2VydmljZTogTGF5b3V0SGVscGVyU2VydmljZSxcclxuICAgIHB1YmxpYyB3b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlOiBXb3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxyXG4gICAgcHVibGljIF9jb2xvbm5lUGVyc29ubmFsaXNlZVNlcnZpY2U6IENvbG9ubmVQZXJzb25uYWxpc2VlU2VydmljZSxcclxuICAgIHB1YmxpYyByZWY/OiBEeW5hbWljRGlhbG9nUmVmLFxyXG4gICAgcHVibGljIGNvbmZpZz86IER5bmFtaWNEaWFsb2dDb25maWcsXHJcblxyXG4gICkgeyB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICBpZiAodGhpcy5yZXBvcnRpbmdBcHApIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlLmlzRGVzaWduTW9kZSAmJiB0aGlzLnJlcG9ydGluZ0FwcC5zaG93UHJlc2VudGF0aW9uRGVzaWduZXJDb25maWdCdXR0b24pIHtcclxuICAgICAgICB0aGlzLnJlcG9ydGluZ0FwcC5zaG93UHJlc2VudGF0aW9uRGVzaWduZXJDb25maWdCdXR0b24gPSBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNhdmVkRGF0YVN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnNhdmVkRGF0YVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gdmFyaWFibGVzXHJcbiAgcHJpdmF0ZSBfd29ya2Zsb3dJbmZvcm1hdGlvbjogd29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVzcG9uc2UgPSBuZXcgd29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVzcG9uc2UoKTtcclxuICBzZXQgd29ya2Zsb3dJbmZvcm1hdGlvbih2YWx1ZTogd29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVzcG9uc2UpIHtcclxuICAgIHRoaXMuX3dvcmtmbG93SW5mb3JtYXRpb24gPSB2YWx1ZVxyXG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgaWYgKHRoaXMubW9kZSAhPSBNb2Rlcy5jcmVhdGUgJiYgdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXQpIHtcclxuICAgICAgdGhpcy5nZXRXb3JrZmxvd0V0YXRTdWl2YW50QXNLZXlWYWx1ZVBhaXIgPSBBZG1pbmlzdHJhdGlvbkVuZHBvaW50cy5nZXRXb3JrZmxvd0V0YXRTdWl2YW50QnlXb3JrZmxvd0V0YXQodGhpcy53b3JrZmxvd0luZm9ybWF0aW9uLndvcmtmbG93RXRhdClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGFzeW5jIGdldFdvcmtmbG93RW50aXR5SW5mb3JtYXRpb24oYnVzaW5lc3NDbGFzczogc3RyaW5nLCB1aWRPYmplY3Q/OiBzdHJpbmcsIGRpc2NyaW1pbmF0b3JDbGFzc05hbWUgPzogc3RyaW5nLCBcclxuICAvLyBkaXNjcmltaW5hdG9yUHJvcGVydHlOYW1lID86IHN0cmluZ1xyXG4gIC8vICkge1xyXG4gIC8vICAgaWYgKHRoaXMubW9kZSAhPSBNb2Rlcy5jcmVhdGUpIHtcclxuICAvLyAgICAgcmV0dXJuO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdHJ5IHtcclxuICAvLyAgICAgbGV0IHJlcXVlc3Q6IEdldFdvcmtmbG93SW5zdGFuY2VJbmZvcm1hdGlvblJlcXVlc3QgPSBuZXcgR2V0V29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVxdWVzdCgpO1xyXG4gIC8vICAgICByZXF1ZXN0LmNsYXNzTmFtZSA9IGJ1c2luZXNzQ2xhc3NcclxuICAvLyAgICAgcmVxdWVzdC51aWRPYmpldCA9IHVpZE9iamVjdDtcclxuICAvLyAgICAgcmVxdWVzdC5kaXNjcmltaW5hdG9yQ2xhc3NOYW1lID0gZGlzY3JpbWluYXRvckNsYXNzTmFtZVxyXG4gIC8vICAgICByZXF1ZXN0LmRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWUgPSBkaXNjcmltaW5hdG9yUHJvcGVydHlOYW1lXHJcbiAgLy8gICAgIHJlcXVlc3QuZGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5kZXNjcmltaW5hdG9yVmFsdWVcclxuICAvLyAgICAgdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlXb3JrbGZvd0luc3RhbmNlSW5mb3JtYXRpb24ocmVxdWVzdCkpXHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKFwidGhpcy53b3JrZmxvd0luZm9ybWF0aW9uXCIsIHRoaXMud29ya2Zsb3dJbmZvcm1hdGlvbilcclxuICAvLyAgICAgaWYgKHRoaXMud29ya2Zsb3dJbmZvcm1hdGlvbikge1xyXG4gIC8vICAgICAgIGxldCB3b3JrZmxvd0V0YXRGb3JtID0gdGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS53b3JrZmxvd0V0YXRGb3JtRm9yQ3VycmVudEZvcm1cclxuICAvLyAgICAgICAgID8uZmluZCh4ID0+IHgudWlkID09IHRoaXMud29ya2Zsb3dJbmZvcm1hdGlvbj8ud29ya2Zsb3dFdGF0KVxyXG4gIC8vICAgICAgIGlmICh3b3JrZmxvd0V0YXRGb3JtKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLndvcmtmbG93RXRhdEZvckZvckN1cnJlbnRFbnRpdHlGb3JtID1cclxuICAvLyAgICAgICAgICAgdGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5tYXBXb3JrZmxvd0V0YXRGb3JtVG9QcmVzZW50YXRpb25TZXR0aW5nKHdvcmtmbG93RXRhdEZvcm0ud29ya2Zsb3dFdGF0c0Zvcm1zKVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgLy8gICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBnZXQgd29ya2Zsb3dJbmZvcm1hdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLl93b3JrZmxvd0luZm9ybWF0aW9uXHJcbiAgfVxyXG4gIGdldFdvcmtmbG93RXRhdEFzS2V5VmFsdWVQYWlyID1cclxuICAgIEFkbWluaXN0cmF0aW9uRW5kcG9pbnRzLmdldFdvcmtmbG93RXRhdEFzS2V5VmFsdWVQYWlyKCk7XHJcbiAgZ2V0V29ya2Zsb3dFdGF0U3VpdmFudEFzS2V5VmFsdWVQYWlyID0gJyc7XHJcbiAgc2VsZWN0ZWRXb3JrZmxvd0V0YXRVaWQ6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw7XHJcbiAgaXNDb21ib0Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZm9ybU1vZGVzID0gTW9kZXM7XHJcblxyXG4gIGNvbmZpZ01vZGVCdXR0b25JZCA9IFwiY29uZmctbW9kZS1idXR0b24tZnJvbS1mb3JtXCI7XHJcbiAgY3VkQ29tcG9uZW50OiBhbnlcclxuICBjb25maWdEYXRhOiBhbnlcclxuICBzYXZlZERhdGFTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb25cclxuICAvLyAjZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBoYW5kbGUgTGlmZWN5Y2xlIEhvb2tzXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1ZENvbXBvbmVudCA9IHRoaXMuY29uZmlnPy5kYXRhPy5jdWRDb21wb25lbnQ7XHJcbiAgICB0aGlzLmNvbmZpZ0RhdGEgPSB0aGlzLmNvbmZpZ1xyXG4gICAgdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uID0gdGhpcy5jb25maWc/LmRhdGE/LndvcmtmbG93SW5mb3JtYXRpb24gPz8gbmV3IHdvcmtmbG93SW5zdGFuY2VJbmZvcm1hdGlvblJlc3BvbnNlKClcclxuICAgIGNvbnNvbGUubG9nKFwid29ya2Zsb3dJbmZvcm1hdGlvbiA9PiBcIiwgdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uKVxyXG4gICAgaWYgKHRoaXMubW9kZSAhPSBNb2Rlcy5jcmVhdGUgJiYgdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXQpIHtcclxuICAgICAgdGhpcy5nZXRXb3JrZmxvd0V0YXRTdWl2YW50QXNLZXlWYWx1ZVBhaXIgPSBBZG1pbmlzdHJhdGlvbkVuZHBvaW50cy5nZXRXb3JrZmxvd0V0YXRTdWl2YW50QnlXb3JrZmxvd0V0YXQodGhpcy53b3JrZmxvd0luZm9ybWF0aW9uLndvcmtmbG93RXRhdClcclxuICAgIH1cclxuICAgIHRoaXMuX2luaXRGb3JtU2F2ZVN1YnNjcmlwdGlvbigpO1xyXG4gICAgdGhpcy5nZXRBbGxGb3Jtc09mQnVzaW5lc3NDbGFzcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdEZvcm1TYXZlU3Vic2NyaXB0aW9uKCkge1xyXG4gICAgdGhpcy5zYXZlZERhdGFTdWJzY3JpcHRpb24gPSB0aGlzLl9jb2xvbm5lUGVyc29ubmFsaXNlZVNlcnZpY2VcclxuICAgICAgLmRhdGFTYXZlZE9ic2VydmFibGUuc3Vic2NyaWJlKFxyXG4gICAgICAgIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5keW5hbWljRm9ybVNlcnZpY2UuY29sb25uZXNQZXJzb25uYWxpc2VlRGF0YVxyXG4gICAgICAgICAgICAgIC5mb3JFYWNoKHggPT4geC5vY2N1cmVuY2UgPSBkYXRhKVxyXG4gICAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl9jb2xvbm5lUGVyc29ubmFsaXNlZVNlcnZpY2UuYWRkT3JVcGRhdGVGb3JtdWxhaXJlRGF0YSh0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhKSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICB9XHJcblxyXG4gIGZvcm1UeXBlID0gZm9ybVR5cGU7XHJcbiAgcHJpdmF0ZSBnZXRDb2xvbm5lUGVyc29ubmFsaXNlZSgpIHtcclxuICAgIGlmICh0aGlzLmJ1c2luZXNzQ2xhc3MgJiYgdGhpcy5tb2RlID09IE1vZGVzLmNyZWF0ZSkge1xyXG4gICAgICB0aGlzLl9nZXRDb2xvbm5lUGVyc29ubmFsaXNlKHRoaXMuYnVzaW5lc3NDbGFzcylcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuYnVzaW5lc3NDbGFzcyAmJiB0aGlzLm1vZGUgIT0gTW9kZXMuY3JlYXRlICYmIHRoaXMuaWQpIHtcclxuICAgICAgdGhpcy5fZ2V0Q29sb25uZVBlcnNvbm5hbGlzZSh0aGlzLmJ1c2luZXNzQ2xhc3MsIHRoaXMuaWQpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRDb2xvbm5lUGVyc29ubmFsaXNlKGJ1c2luZXNzQ2xhc3M6IHN0cmluZywgaWQ/OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2NvbG9ubmVQZXJzb25uYWxpc2VlU2VydmljZS5nZXRDb2xvbm5lc1BlcnNvbm5hbGlzZWUoYnVzaW5lc3NDbGFzcywgdGhpcy5pZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgIHJlcy5mb3JFYWNoKGNwZyA9PiB7XHJcbiAgICAgICAgICBjcGcuY29sb25uZXMuZm9yRWFjaChjcCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghY3AuZGF0YSkge1xyXG4gICAgICAgICAgICAgIGNwLmRhdGEgPSBuZXcgQ29sb25uZVBlcnNvbm5hbGlzZWVEYXRhKFxyXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5pZCwgY3AudWlkLFxyXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jb2xvbm5lc1BlcnNvbm5hbGlzZWVHcm91cGVkID0gcmVzO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX3Byb2Nlc3NEeW5hbWljVGFicygpXHJcbiAgICAgICAgfSwgMCk7XHJcblxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3Igd2hlbiBnZXR0aW5nIGxpc3Qgb2YgY29sb25uZSBwZXJzb25uYWxpc2VlXCIsIGVycik7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB0b2dnbGVEZXNpZ25Nb2RlKGV2ZW50OiBhbnkpIHtcclxuICAgIC8vIHRoaXMuY29uZmlnRGF0YS5kYXRhLmN1ZENvbXBvbmVudCA9IHVuZGVmaW5lZFxyXG4gICAgLy8gdGhpcy5jb25maWdEYXRhLmRhdGEud29ya2Zsb3dJbmZvcm1hdGlvbiA9IHVuZGVmaW5lZFxyXG5cclxuICAgIC8vIHRoaXMucmVmPy5jbG9zZSgpO1xyXG4gICAgLy8gdGhpcy5fbGF5b3V0SGVscGVyU2VydmljZS5pc0Rlc2lnbk1vZGUgPSB0cnVlXHJcbiAgICAvLyB0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlLmN1cnJlbnRGb3JtTmFtZSA9IHRoaXMuZ2V0Q29tcG9uZW50SWRlbnRpZmllcigpXHJcblxyXG4gICAgLy8gdGhpcy5yZWYgPSB0aGlzLl9kaWFsb2dTZXJ2aWNlLm9wZW4odGhpcy5jdWRDb21wb25lbnQsIHRoaXMuY29uZmlnRGF0YSk7XHJcbiAgICAvLyB0aGlzLnJlZi5vbkNsb3NlLnN1YnNjcmliZSgodmFsPzogYW55KSA9PiB7XHJcbiAgICAvLyAgIHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuaXNEZXNpZ25Nb2RlID0gZmFsc2VcclxuICAgIC8vICAgdGhpcy5fbGF5b3V0SGVscGVyU2VydmljZS5jdXJyZW50Rm9ybU5hbWUgPSB1bmRlZmluZWRcclxuICAgIC8vIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJvY2Vzc0R5bmFtaWNUYWJzKCkge1xyXG4gICAgdGhpcy5keW5hbWljVG9vbGJhckNvbnRhaW5lcnMudG9BcnJheSgpLmZvckVhY2goY29udGFpbmVyID0+IHtcclxuICAgICAgY29udGFpbmVyLmNsZWFyKCk7XHJcbiAgICAgIGNvbnN0IGNvbXBSZWY6IENvbXBvbmVudFJlZjxUc2lNb2RhbEhlYWRlckNvbXBvbmVudD4gPSBjb250YWluZXIuY3JlYXRlQ29tcG9uZW50KFRzaU1vZGFsSGVhZGVyQ29tcG9uZW50KTtcclxuXHJcbiAgICAgIGNvbXBSZWYuaW5zdGFuY2UudG9vbGJhclRlbXBsYXRlSGVhZGVyID0gdGhpcy5tb2RhbEhlYWRlckNvbXAhLnRvb2xiYXJUZW1wbGF0ZUhlYWRlcjtcclxuICAgICAgY29tcFJlZi5pbnN0YW5jZS5pbnB1dFRpdGxlID0gdGhpcy5tb2RhbEhlYWRlckNvbXAhLmlucHV0VGl0bGU7XHJcblxyXG4gICAgICBjb21wUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZHluYW1pY0Zvb3RlcnNDb250YWluZXJzLnRvQXJyYXkoKS5mb3JFYWNoKGNvbnRhaW5lciA9PiB7XHJcbiAgICAgIGNvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICBjb25zdCBjb21wUmVmOiBDb21wb25lbnRSZWY8VHNpTW9kYWxGb290ZXJDb21wb25lbnQ+ID0gY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChUc2lNb2RhbEZvb3RlckNvbXBvbmVudCk7XHJcbiAgICAgIGNvbXBSZWYuaW5zdGFuY2UuZm9vdGVyVGVtcGxhdGVSZWYgPSB0aGlzLm1vZGFsRm9vdGVyQ29tcD8uZm9vdGVyVGVtcGxhdGVSZWZcclxuICAgICAgY29tcFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudG9vbGJhclRlbXBsYXRlUmVmICYmIHRoaXMubW9kYWxIZWFkZXJDb21wKSB7XHJcbiAgICAgIHRoaXMubW9kYWxIZWFkZXJDb21wLnRvb2xiYXJUZW1wbGF0ZUhlYWRlciA9IHRoaXMudG9vbGJhclRlbXBsYXRlUmVmO1xyXG4gICAgICB0aGlzLmlucHV0VGl0bGUgPSB0aGlzLm1vZGFsSGVhZGVyQ29tcC5pbnB1dFRpdGxlO1xyXG5cclxuICAgICAgdGhpcy5tb2RhbEhlYWRlckNvbXAudG9vbGJhclRlbXBsYXRlSGVhZGVyID0gdGhpcy50b29sYmFyVGVtcGxhdGVSZWY7XHJcbiAgICAgIHRoaXMuaW5wdXRUaXRsZSA9IHRoaXMubW9kYWxIZWFkZXJDb21wLmlucHV0VGl0bGU7XHJcbiAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mb3JtUmVmQ2hhbmdlLmVtaXQodGhpcy5mb3JtUmVmKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBoYW5kbGUgZXZlbnRzXHJcbiAgaGFuZGxlRm9ybVN1Ym1pdChldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy53b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvdykge1xyXG4gICAgICB0aGlzLm9uU3VibWl0Rm9ybVdvcmtmbG93Q29uZmlndXJhdGlvbi5lbWl0KGV2ZW50KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc3luY0R5bmFtaWNDb2x1bW5EYXRhVG9EeW5hbWljRm9ybVNlcnZpY2UoKVxyXG4gICAgICB0aGlzLm9uU3VibWl0LmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgc3luY0R5bmFtaWNDb2x1bW5EYXRhVG9EeW5hbWljRm9ybVNlcnZpY2UoKSB7XHJcbiAgICBjb25zdCBleGlzdGluZ1VpZHMgPSBuZXcgU2V0KFxyXG4gICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhLm1hcCh4ID0+IHguY29sb25uZVBlcnNvbm5hbGlzZWVVaWQpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuY29sb25uZXNQZXJzb25uYWxpc2VlR3JvdXBlZC5mb3JFYWNoKGNwZyA9PiB7XHJcbiAgICAgIGNwZy5jb2xvbm5lcy5mb3JFYWNoKGNwID0+IHtcclxuICAgICAgICBpZiAoIWV4aXN0aW5nVWlkcy5oYXMoY3AudWlkKSkge1xyXG4gICAgICAgICAgaWYgKCFjcC5kYXRhKSB7XHJcbiAgICAgICAgICAgIGNwLmRhdGEgPSBuZXcgQ29sb25uZVBlcnNvbm5hbGlzZWVEYXRhKFxyXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICB0aGlzLmlkLCBjcC51aWQsXHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBuZXdEYXRhID0gbmV3IENvbG9ubmVQZXJzb25uYWxpc2VlRGF0YShcclxuICAgICAgICAgICAgY3A/LmRhdGE/LnVpZCA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGNwPy5kYXRhPy5vY2N1cmVuY2UgPz8gdGhpcy5pZCxcclxuICAgICAgICAgICAgY3AudWlkLFxyXG4gICAgICAgICAgICBjcC5kYXRhLnZhbGV1ckJvb2xlYW4sXHJcbiAgICAgICAgICAgIGNwLmRhdGEudmFsZXVySW50LFxyXG4gICAgICAgICAgICBjcC5kYXRhLnZhbGV1ckRlY2ltYWwsXHJcbiAgICAgICAgICAgIGNwLmRhdGEudmFsZXVyU3RyaW5nLFxyXG4gICAgICAgICAgICBjcC5kYXRhLnZhbGV1ckJpbmFyeSxcclxuICAgICAgICAgICAgY3Aub2JzZXJ2YXRpb25cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgdGhpcy5keW5hbWljRm9ybVNlcnZpY2UuY29sb25uZXNQZXJzb25uYWxpc2VlRGF0YS5wdXNoKG5ld0RhdGEpO1xyXG5cclxuICAgICAgICAgIGV4aXN0aW5nVWlkcy5hZGQoY3AudWlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc29sZS5sb2coXCJ0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhID0+IFwiLFxyXG4gICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhXHJcbiAgICApXHJcblxyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiB3b3JrZmxvd1xyXG5cclxuXHJcbiAgY29uZmlybVVwZGF0ZVdvcmtmbG93RXRhdChldmVudDogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZyhldmVudClcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICB0aGlzLl90c2lDb25maXJtU2VydmljZS5jb25maXJtKFwiYWRtaW5pc3RyYXRpb25fY29uZmlybV9zdGF0dXNfY2hhbmdlXCIsIFwiYWRtaW5pc3RyYXRpb25fY29uZmlybWF0aW9uX3RpdGxlXCIsXHJcbiAgICAgICAgKHJlc3VsdDogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcclxuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgdXBkYXRlRW50aXR5V29ya2Zsb3dJbmZvcm1hdGlvbigpXHJcbiAgICAgICAgICAgIHJlcXVlc3QuY2xhc3NOYW1lID0gdGhpcy5fYnVzaW5lc3NDbGFzcztcclxuICAgICAgICAgICAgcmVxdWVzdC51aWRPYmplY3QgPSB0aGlzLl9pZFxyXG4gICAgICAgICAgICByZXF1ZXN0Lm5ld1dvcmtmbG93U3RhdHVzID0gZXZlbnQ7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qud29ya2Zsb3cgPSB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24/LndvcmtmbG93VWlkO1xyXG4gICAgICAgICAgICByZXF1ZXN0LndvcmtmbG93RXRhdCA9IHRoaXMud29ya2Zsb3dJbmZvcm1hdGlvbi53b3JrZmxvd0V0YXRcclxuICAgICAgICAgICAgcmVxdWVzdC53b3JrZmxvd0luc3RhbmNlVWlkID0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0luc3RhbmNlVWlkXHJcbiAgICAgICAgICAgIHJlcXVlc3Qud29ya2Zsb3dFdGF0ID0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXRcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVxdWVzdClcclxuICAgICAgICAgICAgdGhpcy53b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLnVwZGF0ZUVudGl0eVdvcmtmbG93SW5mb3JtYXRpb24ocmVxdWVzdCkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpXHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnN0YXR1cyAhPSBudWxsICYmIGRhdGEuc3RhdHVzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gZGF0YS5zdGF0dXNcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3dFdGF0VWlkID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLl90c2lOb3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKGVycm9yPy5lcnJvcilcclxuICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvd0V0YXRVaWQgPSBudWxsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBzdGF0dXNNZXRhZGF0YUNvbWJvU3RhdHVzPzogU3RhdHVzTWV0YWRhdGFSZXNwb25zZTtcclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGF0dXNNZXRhRm9yQ29tYm8oKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5zdGF0dXNDb2xvclNlcnZpY2UuZ2V0U3RhdHVzQ29sb3JEZXRhaWxzQnlCdXNpbmVzc0NsYXNzTmFtZSh0aGlzLmJ1c2luZXNzQ2xhc3MhKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YTogU3RhdHVzTWV0YWRhdGFSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzTWV0YWRhdGFDb21ib1N0YXR1cyA9IGRhdGE7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBFbnRpdHkgc3RhdHVzXHJcbiAgcHJpdmF0ZSBnZXRFbnRpdHlTdGF0dXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVudGl0eVN0YXR1c1NlcnZpY2UuZ2V0RW50aXR5U3RhdHVzKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGE6IEVudGl0eVByb3BlcnRpZXNSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAoZGF0YS5lbnRpdHlTdGF0dXMgJiYgQXJyYXkuaXNBcnJheShkYXRhLmVudGl0eVN0YXR1cykpIHtcclxuICAgICAgICAgIHRoaXMuZW50aXR5U3RhdHVzTGlzdCA9IGRhdGEuZW50aXR5U3RhdHVzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gTW9kZXMuY3JlYXRlKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IGRhdGEuZGVmYXVsdFN0YXR1cztcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zZXRNZXNzYWdlUG9zaXRpb24oZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM7XHJcbiAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNbMF07XHJcbiAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKSB8fCAnJztcclxuICAgICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudXBsb2FkRmlsZShmaWxlLCBmaWxlRXh0ZW5zaW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBsb2FkRmlsZShmaWxlOiBGaWxlLCBmaWxlRXh0ZW5zaW9uOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKGU6IFByb2dyZXNzRXZlbnQ8RmlsZVJlYWRlcj4pID0+IHtcclxuICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBlLnRhcmdldD8ucmVzdWx0IGFzIEFycmF5QnVmZmVyO1xyXG4gICAgICBpZiAoIWFycmF5QnVmZmVyKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBiYXNlNjRDb250ZW50ID0gdGhpcy5hcnJheUJ1ZmZlclRvQmFzZTY0KGFycmF5QnVmZmVyKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpY2hpZXJUb1NlbmQgPSBuZXcgRmljaGllcigpO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLmRhdGVGaWNoaWVyID0gbmV3IERhdGUoKTtcclxuICAgICAgZmljaGllclRvU2VuZC5ub20gPSBmaWxlLm5hbWU7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQub2JqZXQgPSAnJztcclxuICAgICAgZmljaGllclRvU2VuZC5ub21GaWNoaWVyQ29tcGxldCA9IGZpbGUubmFtZTtcclxuICAgICAgZmljaGllclRvU2VuZC5kZXNjcmlwdGlvbiA9ICcnO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLmNvbnRlbnUgPSBiYXNlNjRDb250ZW50O1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLnRhYmxlTGllZSA9IHRoaXMuYnVzaW5lc3NDbGFzcztcclxuICAgICAgZmljaGllclRvU2VuZC5wa2V5ID0gdGhpcy5pZD8udG9TdHJpbmcoKTtcclxuICAgICAgZmljaGllclRvU2VuZC5leHRlbnNpb24gPSBmaWxlRXh0ZW5zaW9uXHJcblxyXG4gICAgICB0aGlzLl9maWNoaWVyU2VydmljZS5jcmVhdGUoZmljaGllclRvU2VuZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldE5vbWJyZUZpY2hpZXIoKTtcclxuICAgICAgICAgIHRoaXMuX3RzaU5vdGlmaWNhdGlvblNlcnZpY2Uuc3VjY2VzcyhcImZpY2hpZXJfam9pbnRcIik7XHJcbiAgICAgICAgICB0aGlzLm9uU2F2ZS5lbWl0KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLnNob3dFcnJvck1lc3NhZ2UocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcclxuICB9XHJcblxyXG4gIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgYmluYXJ5ID0gJyc7XHJcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICBjb25zdCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnRvYShiaW5hcnkpO1xyXG4gIH1cclxuXHJcbiAgaGlkZSh2YWw/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnJlZiAhPSBudWxsICYmIHRoaXMucmVmICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodmFsID09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5yZWY/LmRlc3Ryb3koKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlZj8uY2xvc2UodmFsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbChrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5sb2NhbGl6ZSAhPSBudWxsXHJcbiAgICAgICYmIHRoaXMubG9jYWxpemUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShrZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGtleTtcclxuICB9XHJcblxyXG4gIGdldE5vbWJyZUZpY2hpZXIoKSB7XHJcbiAgICBpZiAodGhpcy5pZCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpY2hpZXJTZXJ2aWNlXHJcbiAgICAgICAgLkdldE5vbWJyZUZpY2hpZXJKb2ludEJ5SWQodGhpcy5pZCA/PyBcIlwiKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ub21icmVEb2N1bWVudHMgPSBkYXRhO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAocmVzcG9uc2U6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZS5zaG93RXJyb3JNZXNzYWdlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHRvIGdldCBudW1iZXIgb2YgZmlsZXMgb24gdGhpcyByZWNvcmRcIiwgcmVzcG9uc2UpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25EcmFnRW50ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0VudGVyQ291bnQrKztcclxuXHJcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5zZXRNZXNzYWdlUG9zaXRpb24oZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRHJhZ092ZXIpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlUG9zaXRpb24gPSB7XHJcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCArIDUsXHJcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSArIDVcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRHJhZ0xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmRyYWdFbnRlckNvdW50LS07XHJcblxyXG4gICAgaWYgKHRoaXMuZHJhZ0VudGVyQ291bnQgPD0gMCkge1xyXG4gICAgICB0aGlzLmlzRHJhZ092ZXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5kcmFnRW50ZXJDb3VudCA9IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldE1lc3NhZ2VQb3NpdGlvbihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLm1lc3NhZ2VQb3NpdGlvbiA9IHtcclxuICAgICAgeDogZXZlbnQuY2xpZW50WCArIDUsXHJcbiAgICAgIHk6IGV2ZW50LmNsaWVudFkgKyA1LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QWxsRm9ybXNPZkJ1c2luZXNzQ2xhc3MoKSB7XHJcbiAgICBpZighdGhpcy5idXNpbmVzc0NsYXNzKSByZXR1cm47XHJcbiAgICBcclxuICAgIHRoaXMuZm9ybXVsYWlyZVNlcnZpY2UuZ2V0QWxsRm9ybXNPZkJ1c2luZXNzQ2xhc3ModGhpcy5idXNpbmVzc0NsYXNzLCB0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSlcclxuICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAodmFsdWUpID0+IHtcclxuICAgICAgICBpZiAoIXZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPCAxKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5mb3Jtc09mQnVzaW5lc3NDbGFzcyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuZG9lc0hhdmVGb3JtcyA9IHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICB9LFxyXG4gICAgfSlcclxuICB9XHJcbn0iLCI8Zm9ybSBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChuZ1N1Ym1pdCk9XCJoYW5kbGVGb3JtU3VibWl0KCRldmVudClcIiAjZm9ybVJlZj1cIm5nRm9ybVwiPlxyXG4gIDxuZy10ZW1wbGF0ZSAjdG9vbGJhclRlbXBsYXRlPlxyXG4gICAgPHAtdG9vbGJhciAqbmdJZj1cImZvcm1FbmRwb2ludFwiIHN0eWxlQ2xhc3M9XCJtYi0xIGdhcC0yXCIgY2xhc3M9XCJ3LWZ1bGxcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCJcclxuICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudClcIiAoZHJhZ2VudGVyKT1cIm9uRHJhZ0VudGVyKCRldmVudClcIiAoZHJhZ2xlYXZlKT1cIm9uRHJhZ0xlYXZlKCRldmVudClcIj5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJsZWZ0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTEgbWwtMlwiPlxyXG4gICAgICAgICAge3sgaW5wdXRUaXRsZSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInJpZ2h0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTEgbXItMlwiPlxyXG4gICAgICAgICAgPGFwcC1yZXBvcnRpbmcgKm5nSWY9XCJmb3JtRW5kcG9pbnRcIiBbZnJvbVRzaUZvcm1dPVwidHJ1ZVwiIFtpZF09XCJ0aGlzLmlkXCIgW2Zvcm1FbmRwb2ludF09XCJmb3JtRW5kcG9pbnRcIlxyXG4gICAgICAgICAgICBbZm9ybU5hbWVdPVwiZm9ybU5hbWVcIiBbcmVwb3J0RGlzY3JpbWluYXRvcl09XCJkZXNjcmltaW5hdG9yVmFsdWVcIiBbaXNGb3JtRW5kcG9pbnRQYWdlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgW25vbWJyZURvY3VtZW50c0pvaW50c109XCJub21icmVEb2N1bWVudHNcIiBbY29uZmlnTW9kZUJ1dHRvbklkXT1cImNvbmZpZ01vZGVCdXR0b25JZFwiXHJcbiAgICAgICAgICAgIFtpc1JlcG9ydGluZ1Rvb2xiYXJEaXNhYmxlZF09XCJpc1JlcG9ydGluZ1Rvb2xiYXJEaXNhYmxlZFwiICh0b2dnbGVEZXNpZ25Nb2RlKT1cInRvZ2dsZURlc2lnbk1vZGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtidXNpbmVzc0NsYXNzXT1cImJ1c2luZXNzQ2xhc3NcIiAoY2xvc2VkTW9kYWxGaWxlVXBsb2FkKT1cImdldE5vbWJyZUZpY2hpZXIoKVwiXHJcbiAgICAgICAgICAgIFtzaG93SW1wb3J0RXhwb3J0QnV0dG9uXT1cImZhbHNlXCIgI3JlcG9ydGluZ0FwcD5cclxuICAgICAgICAgIDwvYXBwLXJlcG9ydGluZz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJpc0RyYWdPdmVyXCIgW25nU3R5bGVdPVwieyBsZWZ0OiBtZXNzYWdlUG9zaXRpb24ueCArICdweCcsIHRvcDogbWVzc2FnZVBvc2l0aW9uLnkgKyAncHgnIH1cIlxyXG4gICAgICAgIGNsYXNzPVwiZHJhZy1tZXNzYWdlIGN1cnNvci1mb2xsb3dcIj5cclxuICAgICAgICB7eyBcIkpvaW50dXJlXCIgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L3AtdG9vbGJhcj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8ZGl2ICpidXN5PVwiaXNMb2FkaW5nXCI+PC9kaXY+XHJcblxyXG4gIDxmaWVsZHNldCBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1yXCI+XHJcbiAgICAgIDxwLXRhYlZpZXc+XHJcblxyXG4gICAgICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cIlwiIFxyXG4gICAgICAgIFtoZWFkZXJTdHlsZV09XCJjb2xvbm5lc1BlcnNvbm5hbGlzZWVHcm91cGVkLmxlbmd0aCA9PT0gMCAmJiAhZG9lc0hhdmVGb3Jtc1xyXG4gICAgICA/IHsgZGlzcGxheTogJ25vbmUnIH0gXHJcbiAgICAgIDogbnVsbFwiPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWhvbWUgbXItMlwiPjwvaT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFpbi10YWItdGV4dFwiPnt7ICdzaGFyZWRfZm9ybV9tYWludGFiVGl0bGUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG5cclxuICAgICAgICA8IS0tIER5bmFtaWMgdGFicyAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sb25uZXNQZXJzb25uYWxpc2VlR3JvdXBlZC5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICA8cC10YWJQYW5lbCAqbmdGb3I9XCJsZXQgZ3JwIG9mIGNvbG9ubmVzUGVyc29ubmFsaXNlZUdyb3VwZWRcIiBbaGVhZGVyXT1cImdycC5ncm91cGVcIj5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZHluYW1pY1Rvb2xiYXJDb250YWluZXI+PC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBncmlkIGZvcm0tcm93XCIgKm5nRm9yPVwibGV0IGNvbCBvZiBncnAuY29sb25uZXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyBmb3JtLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiY29sLm5vbVwiPjwvVHNpLUxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBTdHJpbmcgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTggZm9ybS1pbnB1dFwiICpuZ0lmPVwiY29sLnR5cGUgPT09IGZvcm1UeXBlLnN0cmluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktVGV4dC1Cb3ggWyhpbnB1dEZpZWxkKV09XCJjb2wuZGF0YS52YWxldXJTdHJpbmdcIj48L1RzaS1UZXh0LUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEludCAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOCBmb3JtLWlucHV0XCIgKm5nSWY9XCJjb2wudHlwZSA9PT0gZm9ybVR5cGUuaW50XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1JbnRlZ2VyIFsoaW5wdXRGaWVsZCldPVwiY29sLmRhdGEudmFsZXVySW50XCI+PC9Uc2ktSW50ZWdlcj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIERlY2ltYWwgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTggZm9ybS1pbnB1dFwiICpuZ0lmPVwiY29sLnR5cGUgPT09IGZvcm1UeXBlLmRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtSW5wdXQgWyhpbnB1dEZpZWxkKV09XCJjb2wuZGF0YS52YWxldXJEZWNpbWFsXCI+PC9Uc2ktRGVjaW1hbC1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEJvb2xlYW4gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTggZm9ybS1pbnB1dFwiICpuZ0lmPVwiY29sLnR5cGUgPT09IGZvcm1UeXBlLmJvb2xlYW5cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUNoZWNrQm94IFtpc0JpbmFyeV09XCJmYWxzZVwiIFsoaW5wdXRGaWVsZCldPVwiY29sLmRhdGEudmFsZXVyQm9vbGVhblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrQm94PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gQmluYXJ5IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGZvcm0taW5wdXRcIiAqbmdJZj1cImNvbC50eXBlID09PSBmb3JtVHlwZS5iaW5hcnlcIj5cclxuICAgICAgICAgICAgICAgICAgYmluYXJ5IGlucHV0IChub3QgaGFuZGxlZCB5ZXQpXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkeW5hbWljRm9vdGVyQ29udGFpbmVyPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkb2VzSGF2ZUZvcm1zXCI+XHJcbiAgICAgICAgICA8cC10YWJQYW5lbCBbaGVhZGVyXT1cIidzaGFyZWRfZm9ybV9keW5hbWljRm9ybXNUYWJfVGl0bGUnIHwgbG9jYWxpemVcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICA8c2hhcmVkLWR5bmFtaWMtZm9ybS1saXN0XHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZV09XCJpZFwiXHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZUJ1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZURpc2NyaW1pbmF0b3JWYWx1ZV09XCJkZXNjcmltaW5hdG9yVmFsdWVcIlxyXG4gICAgICAgICAgICAgIFtpZ25vcmVEaWFsb2dDb25maWddPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8L3AtdGFiVmlldz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZmllbGRzZXQ+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCIoYnVzaW5lc3NDbGFzcyAmJiBlbnRpdHlTdGF0dXNMaXN0Lmxlbmd0aCA+IDApIHx8XHJcbiAgICAgICAgd29ya2Zsb3dJbmZvcm1hdGlvbj8ud29ya2Zsb3dVaWQgfHxcclxuICAgICAgICB3b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvd1wiIGNsYXNzPVwibXgtNCBweC0yIG15LTEgc2hhcmVkLWZvb3Rlci1iYXJcIj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiYnVzaW5lc3NDbGFzcyAmJiBlbnRpdHlTdGF0dXNMaXN0ICYmIGVudGl0eVN0YXR1c0xpc3QubGVuZ3RoID4gMFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIiBwcmVzZW50YXRpb25EZXNpZ25lcj1cInNoYXJlZF9jcnVkX3N0YXR1c1wiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ3NoYXJlZF9jcnVkX3N0YXR1cydcIj48L1RzaS1MYWJlbD5cclxuICAgICAgICA8VHNpLVNlYXJjaC1Db21ibyBbaWQtZmllbGRdPVwiJ2tleSdcIiBbbGFiZWwtZmllbGRdPVwiJ3ZhbHVlJ1wiIFtkYXRhc291cmNlXT1cImVudGl0eVN0YXR1c0xpc3RcIiBbKGJpbmQpXT1cInN0YXR1c1wiXHJcbiAgICAgICAgICBbY29tYm9UeXBlXT1cIidzdGF0dXMnXCIgW3N0YXR1c01ldGFkYXRhXT1cInN0YXR1c01ldGFkYXRhQ29tYm9TdGF0dXNcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwid29ya2Zsb3dJbmZvcm1hdGlvbj8ud29ya2Zsb3dVaWQgfHwgd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5pc0Rlc2dpbk1vZGVGcm9tV29ya2Zsb3dcIlxyXG4gICAgICBjbGFzcz1cImZsZXggY29sLTEwXCI+XHJcbiAgICAgIDxkaXYgcHJlc2VudGF0aW9uRGVzaWduZXI9XCJzaGFyZWRfd29ya2Zsb3dOYW1lXCIgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBjb2wtNFwiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ2FkbWluaXN0cmF0aW9uX3dvcmtmbG93X3dvcmtmbG93J3wgbG9jYWxpemVcIj5cclxuICAgICAgICA8L1RzaS1MYWJlbD5cclxuICAgICAgICA8VHNpLVRleHQtQm94IFtkaXNhYmxlZF09XCJ0cnVlXCIgW2lucHV0TmFtZV09XCInd29ya2Zsb3dOYW1lJ1wiIFsoaW5wdXRGaWVsZCldPVwid29ya2Zsb3dJbmZvcm1hdGlvbi53b3JrZmxvd05hbWVcIj5cclxuICAgICAgICA8L1RzaS1UZXh0LUJveD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgcHJlc2VudGF0aW9uRGVzaWduZXI9XCJhZG1pbmlzdHJhdGlvbl93b3JrZmxvd193b3JrZmxvd19jdXJyZW50X3N0YXR1c1wiXHJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBjb2wtNFwiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ2FkbWluaXN0cmF0aW9uX3dvcmtmbG93X3dvcmtmbG93X2N1cnJlbnRfc3RhdHVzJ1wiPjwvVHNpLUxhYmVsPlxyXG4gICAgICAgIDxUc2ktU2VhcmNoLUNvbWJvIGNsYXNzPVwidy03XCIgW2Rpc2FibGVkXT1cInRydWVcIiBpZC1maWVsZD1cImtleVwiIGxhYmVsLWZpZWxkPVwidmFsdWVcIlxyXG4gICAgICAgICAgW2JpbmRdPVwid29ya2Zsb3dJbmZvcm1hdGlvbi53b3JrZmxvd0V0YXRcIiBbaXNGaWx0ZXJlZF09XCJ0cnVlXCJcclxuICAgICAgICAgIFtlbGVtZW50U291cmNlVXJsXT1cImdldFdvcmtmbG93RXRhdEFzS2V5VmFsdWVQYWlyXCIgW2xpc3RTb3VyY2VVcmxdPVwiZ2V0V29ya2Zsb3dFdGF0U3VpdmFudEFzS2V5VmFsdWVQYWlyXCI+XHJcbiAgICAgICAgPC9Uc2ktU2VhcmNoLUNvbWJvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIm1vZGUgIT0gZm9ybU1vZGVzLmNyZWF0ZSB8fCB3b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvd1wiXHJcbiAgICAgICAgICBwcmVzZW50YXRpb25EZXNpZ25lcj1cImFkbWluaXN0cmF0aW9uX3dvcmtmbG93X3dvcmtmbG93X25leHRfc3RhdHVzXCJcclxuICAgICAgICAgIGNsYXNzPVwiZmxleCBnYXAtMiBhbGlnbi1pdGVtcy1jZW50ZXIgbm8tYm9yZGVyXCI+XHJcbiAgICAgICAgICA8VHNpLUxhYmVsIFtsYWJlbFZhbHVlXT1cIidhZG1pbmlzdHJhdGlvbl93b3JrZmxvd193b3JrZmxvd19uZXh0X3N0YXR1cydcIj48L1RzaS1MYWJlbD5cclxuICAgICAgICAgIDxUc2ktU2VhcmNoLUNvbWJvIGNsYXNzPVwidy03XCIgaWQtZmllbGQ9XCJrZXlcIiBsYWJlbC1maWVsZD1cInZhbHVlXCIgWyhiaW5kKV09XCJzZWxlY3RlZFdvcmtmbG93RXRhdFVpZFwiXHJcbiAgICAgICAgICAgIFtpc0ZpbHRlcmVkXT1cInRydWVcIiBbZWxlbWVudFNvdXJjZVVybF09XCJnZXRXb3JrZmxvd0V0YXRBc0tleVZhbHVlUGFpclwiXHJcbiAgICAgICAgICAgIFtsaXN0U291cmNlVXJsXT1cImdldFdvcmtmbG93RXRhdFN1aXZhbnRBc0tleVZhbHVlUGFpclwiIChiaW5kQ2hhbmdlKT1cImNvbmZpcm1VcGRhdGVXb3JrZmxvd0V0YXQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPC9Uc2ktU2VhcmNoLUNvbWJvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+Il19
581
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL3RzaS1mb3JtL3RzaS1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2ktZm9ybS90c2ktZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBSUwsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBR04sU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGNBQWMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEMsT0FBTyxFQUE0QixPQUFPLEVBQW1DLCtCQUErQixFQUFFLG1DQUFtQyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hLLE9BQU8sRUFBRSx3QkFBd0IsRUFBdUMsTUFBTSxpREFBaUQsQ0FBQztBQUVoSSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFVdEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixF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QWM7c0JBQXZCLE1BQU07Z0JBR3VCLGtCQUFrQjtzQkFBL0MsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ1csZUFBZTtzQkFBckQsWUFBWTt1QkFBQyx1QkFBdUI7Z0JBRUUsZUFBZTtzQkFBckQsWUFBWTt1QkFBQyx1QkFBdUI7Z0JBR3JDLHdCQUF3QjtzQkFEdkIsWUFBWTt1QkFBQyx5QkFBeUIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFJbkUsd0JBQXdCO3NCQUR2QixZQUFZO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb21wb25lbnRSZWYsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBpbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlbixcclxuICBWaWV3Q29udGFpbmVyUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ0NvbmZpZywgRHluYW1pY0RpYWxvZ1JlZiB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZm9ybVR5cGUgfSBmcm9tICcuLi8uLi9jb25zdHMvZm9ybS10eXBlJztcclxuaW1wb3J0IHsgQWRtaW5pc3RyYXRpb25FbmRwb2ludHMgfSBmcm9tICcuLi8uLi9lbmQtcG9pbnRzL2VuZHBvaW50cyc7XHJcbmltcG9ydCB7IE1vZGVzIH0gZnJvbSAnLi4vLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBJTW9kYWxTaXplIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IEVudGl0eVByb3BlcnRpZXNSZXNwb25zZSwgRmljaGllciwgS2V5VmFsdWVQYWlyLCBPcHRpb25hbEVuZHBvaW50cywgdXBkYXRlRW50aXR5V29ya2Zsb3dJbmZvcm1hdGlvbiwgd29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBDb2xvbm5lUGVyc29ubmFsaXNlZURhdGEsIENvbG9ubmVQZXJzb25uYWxpc2VlR3JvdXBlZFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2R5bmFtaWMtZm9ybS9jb2xvbm5lLXBlcnNvbm5hbGlzZWUnO1xyXG5pbXBvcnQgeyBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3N0YXR1cy9jb2xvci1zdGF0dXMnO1xyXG5pbXBvcnQgeyBMb2NhbGl6ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9sb2NhbGl6ZS5waXBlJztcclxuaW1wb3J0IHsgQ29sb25uZVBlcnNvbm5hbGlzZWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHluYW1pYy1mb3JtL2NvbG9ubmUtcGVyc29ubmFsaXNlZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRHluYW1pY0Zvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmljaGllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWNoaWVyL2ZpY2hpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IExheW91dEhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYXlvdXQvbGF5b3V0LWhlbHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL2Vycm9yLXJlc3BvbnNlLW1hbmFnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRzaUNvbmZpcm1hdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vdHNpLWNvbmZpcm1hdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlTdGF0dXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdHVzL2VudGl0eVN0YXR1cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RhdHVzQ29sb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdHVzL3N0YXR1cy1jb2xvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgV29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3dvcmtmbG93L3dvcmtmbG93LWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFJlcG9ydGluZ0NvbXBvbmVudCB9IGZyb20gJy4uL3JlcG9ydGluZy9yZXBvcnRpbmcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVHNpTW9kYWxGb290ZXJDb21wb25lbnQgfSBmcm9tICcuLi90c2ktbW9kYWwtZm9vdGVyL3RzaS1tb2RhbC1mb290ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVHNpTW9kYWxIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi90c2ktbW9kYWwtaGVhZGVyL3RzaS1tb2RhbC1oZWFkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRm9ybXVsYWlyZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9keW5hbWljLWZvcm0vZm9ybXVsYWlyZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgaXNOdWxsT3JFbXB0eSB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3RzaS1mb3JtJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHNpLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RzaS1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUc2lGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRDaGVja2VkIHtcclxuICBwdWJsaWMgbG9jYWxpemU/ID0gaW5qZWN0KExvY2FsaXplUGlwZSlcclxuICBcclxuICAvLyNyZWdpb24gcHJpdmF0ZSBmaWVsZHNcclxuICBwcml2YXRlIF9pc1JlcG9ydGluZ1Rvb2xiYXJEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gcHJvcGVydGllc1xyXG4gIEBWaWV3Q2hpbGQoJ2Zvcm1SZWYnKSBmb3JtUmVmPzogTmdGb3JtO1xyXG4gIEBWaWV3Q2hpbGQoXCJyZXBvcnRpbmdBcHBcIikgcmVwb3J0aW5nQXBwPzogUmVwb3J0aW5nQ29tcG9uZW50XHJcbiAgLy8jZW5kcmVnaW9uXHJcbiAgXHJcbiAgLy8jcmVnaW9uIGlucHV0c1xyXG4gIEBJbnB1dCgpIGNsYXNzPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGF1dG9jb21wbGV0ZTogc3RyaW5nID0gJ29mZic7XHJcbiAgLy8gQElucHV0KCkgZm9ybU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAvLyBASW5wdXQoKSBmb3JtRW5kcG9pbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBcclxuICBASW5wdXQoKSBvcHRpb25hbEVuZHBvaW50cz86IE9wdGlvbmFsRW5kcG9pbnRzO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbW9kYWxTaXplPzogSU1vZGFsU2l6ZTtcclxuICBAT3V0cHV0KCkgb25TYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHByaXZhdGUgX2Rlc2NyaW1pbmF0b3JWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gIGdldCBkZXNjcmltaW5hdG9yVmFsdWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2Rlc2NyaW1pbmF0b3JWYWx1ZTsgfVxyXG4gIHNldCBkZXNjcmltaW5hdG9yVmFsdWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZGVzY3JpbWluYXRvclZhbHVlID0gdmFsdWU7ICAgIFxyXG4gICAgdGhpcy5nZXRBbGxGb3Jtc09mQnVzaW5lc3NDbGFzcygpO1xyXG4gIH1cclxuXHJcbiAgZW50aXR5U3RhdHVzTGlzdDogS2V5VmFsdWVQYWlyPHN0cmluZywgc3RyaW5nPltdID0gW107XHJcblxyXG4gIG5vbWJyZURvY3VtZW50czogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIGlzRHJhZ092ZXIgPSBmYWxzZTtcclxuICBtZXNzYWdlUG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfTtcclxuICBwcml2YXRlIGRyYWdFbnRlckNvdW50ID0gMDtcclxuICBwcml2YXRlIF9mb3JtTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIFxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGZvcm1FbmRwb2ludCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1FbmRwb2ludDtcclxuICB9XHJcblxyXG4gIHNldCBmb3JtRW5kcG9pbnQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZm9ybUVuZHBvaW50ID0gdmFsdWU7XHJcbiAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgZm9ybU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JtTmFtZTtcclxuICB9XHJcblxyXG4gIHNldCBmb3JtTmFtZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9mb3JtTmFtZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2J1c2luZXNzQ2xhc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9pZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX21vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9mb3JtRW5kcG9pbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9zdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLy8gR2V0dGVyIGZvciBidXNpbmVzc0NsYXNzXHJcbiAgZ2V0IGJ1c2luZXNzQ2xhc3MoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9idXNpbmVzc0NsYXNzO1xyXG4gIH1cclxuXHJcbiAgLy8gU2V0dGVyIGZvciBidXNpbmVzc0NsYXNzXHJcbiAgc2V0IGJ1c2luZXNzQ2xhc3ModmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fYnVzaW5lc3NDbGFzcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5nZXRDb2xvbm5lUGVyc29ubmFsaXNlZSgpO1xyXG4gICAgdGhpcy5nZXRFbnRpdHlTdGF0dXMoKTtcclxuICAgIHRoaXMuZ2V0U3RhdHVzTWV0YUZvckNvbWJvKCk7XHJcbiAgICB0aGlzLmdldEFsbEZvcm1zT2ZCdXNpbmVzc0NsYXNzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXR0ZXIgZm9yIGlkXHJcbiAgZ2V0IGlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5faWQ7XHJcbiAgfVxyXG5cclxuICAvLyBTZXR0ZXIgZm9yIGlkXHJcbiAgc2V0IGlkKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2lkID0gdmFsdWU7XHJcbiAgICB0aGlzLmdldENvbG9ubmVQZXJzb25uYWxpc2VlKCk7XHJcbiAgICB0aGlzLmdldE5vbWJyZUZpY2hpZXIoKTtcclxuICB9XHJcblxyXG4gIC8vIEdldHRlciBmb3Igc3RhdHVzXHJcbiAgZ2V0IHN0YXR1cygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcclxuICB9XHJcblxyXG4gIC8vIFNldHRlciBmb3Igc3RhdHVzXHJcbiAgc2V0IHN0YXR1cyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9zdGF0dXMgPSB2YWx1ZTtcclxuICAgIHRoaXMub25TdGF0dXNDaGFuZ2UuZW1pdCh0aGlzLl9zdGF0dXMpO1xyXG4gIH1cclxuXHJcbiAgc2V0IG1vZGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fbW9kZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5nZXRDb2xvbm5lUGVyc29ubmFsaXNlZSgpO1xyXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUZvcm1zVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1vZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgaXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgaXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzUmVwb3J0aW5nVG9vbGJhckRpc2FibGVkID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBpc0NyZWF0ZU9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBvdXRwdXRzXHJcbiAgQE91dHB1dCgpIG9uU3VibWl0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvblN1Ym1pdEZvcm1Xb3JrZmxvd0NvbmZpZ3VyYXRpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZvcm1SZWZDaGFuZ2U6IEV2ZW50RW1pdHRlcjxOZ0Zvcm0+ID0gbmV3IEV2ZW50RW1pdHRlcjxOZ0Zvcm0+KCk7XHJcbiAgQE91dHB1dCgpIG9uU3RhdHVzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBAVmlld0NoaWxkKCd0b29sYmFyVGVtcGxhdGUnKSB0b29sYmFyVGVtcGxhdGVSZWYgITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAQ29udGVudENoaWxkKFRzaU1vZGFsSGVhZGVyQ29tcG9uZW50KSBtb2RhbEhlYWRlckNvbXA/OiBUc2lNb2RhbEhlYWRlckNvbXBvbmVudDtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChUc2lNb2RhbEZvb3RlckNvbXBvbmVudCkgbW9kYWxGb290ZXJDb21wPzogVHNpTW9kYWxGb290ZXJDb21wb25lbnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ2R5bmFtaWNUb29sYmFyQ29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXHJcbiAgZHluYW1pY1Rvb2xiYXJDb250YWluZXJzITogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+O1xyXG5cclxuICBAVmlld0NoaWxkcmVuKCdkeW5hbWljRm9vdGVyQ29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXHJcbiAgZHluYW1pY0Zvb3RlcnNDb250YWluZXJzITogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+O1xyXG5cclxuICBpbnB1dFRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbG9ubmVzUGVyc29ubmFsaXNlZUdyb3VwZWQ6IENvbG9ubmVQZXJzb25uYWxpc2VlR3JvdXBlZFJlc3BvbnNlW10gPSBbXTtcclxuICBjYW5TaG93Rm9ybXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmb3Jtc09mQnVzaW5lc3NDbGFzczogYW55W10gPSBbXTsgIFxyXG4gIHByaXZhdGUgX2RvZXNIYXZlRm9ybXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBnZXQgZG9lc0hhdmVGb3JtcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2RvZXNIYXZlRm9ybXM7IH1cclxuICBzZXQgZG9lc0hhdmVGb3Jtcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZG9lc0hhdmVGb3JtcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUZvcm1zVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgZHluYW1pY0Zvcm1TZXJ2aWNlID0gaW5qZWN0KER5bmFtaWNGb3JtU2VydmljZSk7XHJcbiAgZm9ybXVsYWlyZVNlcnZpY2UgOiBGb3JtdWxhaXJlU2VydmljZSA9IGluamVjdChGb3JtdWxhaXJlU2VydmljZSk7XHJcblxyXG4gIC8vI3JlZ2lvbiBjdG9yXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVudGl0eVN0YXR1c1NlcnZpY2U6IEVudGl0eVN0YXR1c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0YXR1c0NvbG9yU2VydmljZTogU3RhdHVzQ29sb3JTZXJ2aWNlLFxyXG4gICAgcHVibGljIF9maWNoaWVyU2VydmljZTogRmljaGllclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9lcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2U6IEVycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgX3RzaUNvbmZpcm1TZXJ2aWNlOiBUc2lDb25maXJtYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdHNpTm90aWZpY2F0aW9uU2VydmljZTogVHNpTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF9sYXlvdXRIZWxwZXJTZXJ2aWNlOiBMYXlvdXRIZWxwZXJTZXJ2aWNlLFxyXG4gICAgcHVibGljIHdvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2U6IFdvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UsXHJcbiAgICBwdWJsaWMgX2NvbG9ubmVQZXJzb25uYWxpc2VlU2VydmljZTogQ29sb25uZVBlcnNvbm5hbGlzZWVTZXJ2aWNlLFxyXG4gICAgcHVibGljIHJlZj86IER5bmFtaWNEaWFsb2dSZWYsXHJcbiAgICBwdWJsaWMgY29uZmlnPzogRHluYW1pY0RpYWxvZ0NvbmZpZyxcclxuXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIGlmICh0aGlzLnJlcG9ydGluZ0FwcCkge1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuaXNEZXNpZ25Nb2RlICYmIHRoaXMucmVwb3J0aW5nQXBwLnNob3dQcmVzZW50YXRpb25EZXNpZ25lckNvbmZpZ0J1dHRvbikge1xyXG4gICAgICAgIHRoaXMucmVwb3J0aW5nQXBwLnNob3dQcmVzZW50YXRpb25EZXNpZ25lckNvbmZpZ0J1dHRvbiA9IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2F2ZWREYXRhU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuc2F2ZWREYXRhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiB2YXJpYWJsZXNcclxuICBwcml2YXRlIF93b3JrZmxvd0luZm9ybWF0aW9uOiB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSA9IG5ldyB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSgpO1xyXG4gIHNldCB3b3JrZmxvd0luZm9ybWF0aW9uKHZhbHVlOiB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSkge1xyXG4gICAgdGhpcy5fd29ya2Zsb3dJbmZvcm1hdGlvbiA9IHZhbHVlXHJcbiAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICBpZiAodGhpcy5tb2RlICE9IE1vZGVzLmNyZWF0ZSAmJiB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24/LndvcmtmbG93RXRhdCkge1xyXG4gICAgICB0aGlzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRBc0tleVZhbHVlUGFpciA9IEFkbWluaXN0cmF0aW9uRW5kcG9pbnRzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRCeVdvcmtmbG93RXRhdCh0aGlzLndvcmtmbG93SW5mb3JtYXRpb24ud29ya2Zsb3dFdGF0KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgZ2V0V29ya2Zsb3dFbnRpdHlJbmZvcm1hdGlvbihidXNpbmVzc0NsYXNzOiBzdHJpbmcsIHVpZE9iamVjdD86IHN0cmluZywgZGlzY3JpbWluYXRvckNsYXNzTmFtZSA/OiBzdHJpbmcsIFxyXG4gIC8vIGRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWUgPzogc3RyaW5nXHJcbiAgLy8gKSB7XHJcbiAgLy8gICBpZiAodGhpcy5tb2RlICE9IE1vZGVzLmNyZWF0ZSkge1xyXG4gIC8vICAgICByZXR1cm47XHJcbiAgLy8gICB9XHJcbiAgLy8gICB0cnkge1xyXG4gIC8vICAgICBsZXQgcmVxdWVzdDogR2V0V29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVxdWVzdCA9IG5ldyBHZXRXb3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXF1ZXN0KCk7XHJcbiAgLy8gICAgIHJlcXVlc3QuY2xhc3NOYW1lID0gYnVzaW5lc3NDbGFzc1xyXG4gIC8vICAgICByZXF1ZXN0LnVpZE9iamV0ID0gdWlkT2JqZWN0O1xyXG4gIC8vICAgICByZXF1ZXN0LmRpc2NyaW1pbmF0b3JDbGFzc05hbWUgPSBkaXNjcmltaW5hdG9yQ2xhc3NOYW1lXHJcbiAgLy8gICAgIHJlcXVlc3QuZGlzY3JpbWluYXRvclByb3BlcnR5TmFtZSA9IGRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWVcclxuICAvLyAgICAgcmVxdWVzdC5kaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZVxyXG4gIC8vICAgICB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24gPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eVdvcmtsZm93SW5zdGFuY2VJbmZvcm1hdGlvbihyZXF1ZXN0KSlcclxuICAvLyAgICAgY29uc29sZS5sb2coXCJ0aGlzLndvcmtmbG93SW5mb3JtYXRpb25cIiwgdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uKVxyXG4gIC8vICAgICBpZiAodGhpcy53b3JrZmxvd0luZm9ybWF0aW9uKSB7XHJcbiAgLy8gICAgICAgbGV0IHdvcmtmbG93RXRhdEZvcm0gPSB0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLndvcmtmbG93RXRhdEZvcm1Gb3JDdXJyZW50Rm9ybVxyXG4gIC8vICAgICAgICAgPy5maW5kKHggPT4geC51aWQgPT0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXQpXHJcbiAgLy8gICAgICAgaWYgKHdvcmtmbG93RXRhdEZvcm0pIHtcclxuICAvLyAgICAgICAgIHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2Uud29ya2Zsb3dFdGF0Rm9yRm9yQ3VycmVudEVudGl0eUZvcm0gPVxyXG4gIC8vICAgICAgICAgICB0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLm1hcFdvcmtmbG93RXRhdEZvcm1Ub1ByZXNlbnRhdGlvblNldHRpbmcod29ya2Zsb3dFdGF0Rm9ybS53b3JrZmxvd0V0YXRzRm9ybXMpXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjYXRjaCAoZXJyb3IpIHtcclxuICAvLyAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIGdldCB3b3JrZmxvd0luZm9ybWF0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtmbG93SW5mb3JtYXRpb25cclxuICB9XHJcbiAgZ2V0V29ya2Zsb3dFdGF0QXNLZXlWYWx1ZVBhaXIgPVxyXG4gICAgQWRtaW5pc3RyYXRpb25FbmRwb2ludHMuZ2V0V29ya2Zsb3dFdGF0QXNLZXlWYWx1ZVBhaXIoKTtcclxuICBnZXRXb3JrZmxvd0V0YXRTdWl2YW50QXNLZXlWYWx1ZVBhaXIgPSAnJztcclxuICBzZWxlY3RlZFdvcmtmbG93RXRhdFVpZDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbDtcclxuICBpc0NvbWJvRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmb3JtTW9kZXMgPSBNb2RlcztcclxuXHJcbiAgY29uZmlnTW9kZUJ1dHRvbklkID0gXCJjb25mZy1tb2RlLWJ1dHRvbi1mcm9tLWZvcm1cIjtcclxuICBjdWRDb21wb25lbnQ6IGFueVxyXG4gIGNvbmZpZ0RhdGE6IGFueVxyXG4gIHNhdmVkRGF0YVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvblxyXG4gIC8vICNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGhhbmRsZSBMaWZlY3ljbGUgSG9va3NcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VkQ29tcG9uZW50ID0gdGhpcy5jb25maWc/LmRhdGE/LmN1ZENvbXBvbmVudDtcclxuICAgIHRoaXMuY29uZmlnRGF0YSA9IHRoaXMuY29uZmlnXHJcbiAgICB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24gPSB0aGlzLmNvbmZpZz8uZGF0YT8ud29ya2Zsb3dJbmZvcm1hdGlvbiA/PyBuZXcgd29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVzcG9uc2UoKVxyXG4gICAgY29uc29sZS5sb2coXCJ3b3JrZmxvd0luZm9ybWF0aW9uID0+IFwiLCB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24pXHJcbiAgICBpZiAodGhpcy5tb2RlICE9IE1vZGVzLmNyZWF0ZSAmJiB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24/LndvcmtmbG93RXRhdCkge1xyXG4gICAgICB0aGlzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRBc0tleVZhbHVlUGFpciA9IEFkbWluaXN0cmF0aW9uRW5kcG9pbnRzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRCeVdvcmtmbG93RXRhdCh0aGlzLndvcmtmbG93SW5mb3JtYXRpb24ud29ya2Zsb3dFdGF0KVxyXG4gICAgfVxyXG4gICAgdGhpcy5faW5pdEZvcm1TYXZlU3Vic2NyaXB0aW9uKCk7XHJcbiAgICB0aGlzLmdldEFsbEZvcm1zT2ZCdXNpbmVzc0NsYXNzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0Rm9ybVNhdmVTdWJzY3JpcHRpb24oKSB7XHJcbiAgICB0aGlzLnNhdmVkRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMuX2NvbG9ubmVQZXJzb25uYWxpc2VlU2VydmljZVxyXG4gICAgICAuZGF0YVNhdmVkT2JzZXJ2YWJsZS5zdWJzY3JpYmUoXHJcbiAgICAgICAgYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZHluYW1pY0Zvcm1TZXJ2aWNlLmNvbG9ubmVzUGVyc29ubmFsaXNlZURhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhXHJcbiAgICAgICAgICAgICAgLmZvckVhY2goeCA9PiB4Lm9jY3VyZW5jZSA9IGRhdGEpXHJcbiAgICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuX2NvbG9ubmVQZXJzb25uYWxpc2VlU2VydmljZS5hZGRPclVwZGF0ZUZvcm11bGFpcmVEYXRhKHRoaXMuZHluYW1pY0Zvcm1TZXJ2aWNlLmNvbG9ubmVzUGVyc29ubmFsaXNlZURhdGEpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gIH1cclxuXHJcbiAgZm9ybVR5cGUgPSBmb3JtVHlwZTtcclxuICBwcml2YXRlIGdldENvbG9ubmVQZXJzb25uYWxpc2VlKCkge1xyXG4gICAgaWYgKHRoaXMuYnVzaW5lc3NDbGFzcyAmJiB0aGlzLm1vZGUgPT0gTW9kZXMuY3JlYXRlKSB7XHJcbiAgICAgIHRoaXMuX2dldENvbG9ubmVQZXJzb25uYWxpc2UodGhpcy5idXNpbmVzc0NsYXNzKVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5idXNpbmVzc0NsYXNzICYmIHRoaXMubW9kZSAhPSBNb2Rlcy5jcmVhdGUgJiYgdGhpcy5pZCkge1xyXG4gICAgICB0aGlzLl9nZXRDb2xvbm5lUGVyc29ubmFsaXNlKHRoaXMuYnVzaW5lc3NDbGFzcywgdGhpcy5pZClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldENvbG9ubmVQZXJzb25uYWxpc2UoYnVzaW5lc3NDbGFzczogc3RyaW5nLCBpZD86IHN0cmluZykge1xyXG4gICAgdGhpcy5fY29sb25uZVBlcnNvbm5hbGlzZWVTZXJ2aWNlLmdldENvbG9ubmVzUGVyc29ubmFsaXNlZShidXNpbmVzc0NsYXNzLCB0aGlzLmlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgcmVzLmZvckVhY2goY3BnID0+IHtcclxuICAgICAgICAgIGNwZy5jb2xvbm5lcy5mb3JFYWNoKGNwID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjcC5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgY3AuZGF0YSA9IG5ldyBDb2xvbm5lUGVyc29ubmFsaXNlZURhdGEoXHJcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlkLCBjcC51aWQsXHJcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWRcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmNvbG9ubmVzUGVyc29ubmFsaXNlZUdyb3VwZWQgPSByZXM7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fcHJvY2Vzc0R5bmFtaWNUYWJzKClcclxuICAgICAgICB9LCAwKTtcclxuXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvciB3aGVuIGdldHRpbmcgbGlzdCBvZiBjb2xvbm5lIHBlcnNvbm5hbGlzZWVcIiwgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHRvZ2dsZURlc2lnbk1vZGUoZXZlbnQ6IGFueSkge1xyXG4gICAgLy8gdGhpcy5jb25maWdEYXRhLmRhdGEuY3VkQ29tcG9uZW50ID0gdW5kZWZpbmVkXHJcbiAgICAvLyB0aGlzLmNvbmZpZ0RhdGEuZGF0YS53b3JrZmxvd0luZm9ybWF0aW9uID0gdW5kZWZpbmVkXHJcblxyXG4gICAgLy8gdGhpcy5yZWY/LmNsb3NlKCk7XHJcbiAgICAvLyB0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlLmlzRGVzaWduTW9kZSA9IHRydWVcclxuICAgIC8vIHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuY3VycmVudEZvcm1OYW1lID0gdGhpcy5nZXRDb21wb25lbnRJZGVudGlmaWVyKClcclxuXHJcbiAgICAvLyB0aGlzLnJlZiA9IHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3Blbih0aGlzLmN1ZENvbXBvbmVudCwgdGhpcy5jb25maWdEYXRhKTtcclxuICAgIC8vIHRoaXMucmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKCh2YWw/OiBhbnkpID0+IHtcclxuICAgIC8vICAgdGhpcy5fbGF5b3V0SGVscGVyU2VydmljZS5pc0Rlc2lnbk1vZGUgPSBmYWxzZVxyXG4gICAgLy8gICB0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlLmN1cnJlbnRGb3JtTmFtZSA9IHVuZGVmaW5lZFxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcm9jZXNzRHluYW1pY1RhYnMoKSB7XHJcbiAgICB0aGlzLmR5bmFtaWNUb29sYmFyQ29udGFpbmVycy50b0FycmF5KCkuZm9yRWFjaChjb250YWluZXIgPT4ge1xyXG4gICAgICBjb250YWluZXIuY2xlYXIoKTtcclxuICAgICAgY29uc3QgY29tcFJlZjogQ29tcG9uZW50UmVmPFRzaU1vZGFsSGVhZGVyQ29tcG9uZW50PiA9IGNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoVHNpTW9kYWxIZWFkZXJDb21wb25lbnQpO1xyXG5cclxuICAgICAgY29tcFJlZi5pbnN0YW5jZS50b29sYmFyVGVtcGxhdGVIZWFkZXIgPSB0aGlzLm1vZGFsSGVhZGVyQ29tcCEudG9vbGJhclRlbXBsYXRlSGVhZGVyO1xyXG4gICAgICBjb21wUmVmLmluc3RhbmNlLmlucHV0VGl0bGUgPSB0aGlzLm1vZGFsSGVhZGVyQ29tcCEuaW5wdXRUaXRsZTtcclxuXHJcbiAgICAgIGNvbXBSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5keW5hbWljRm9vdGVyc0NvbnRhaW5lcnMudG9BcnJheSgpLmZvckVhY2goY29udGFpbmVyID0+IHtcclxuICAgICAgY29udGFpbmVyLmNsZWFyKCk7XHJcbiAgICAgIGNvbnN0IGNvbXBSZWY6IENvbXBvbmVudFJlZjxUc2lNb2RhbEZvb3RlckNvbXBvbmVudD4gPSBjb250YWluZXIuY3JlYXRlQ29tcG9uZW50KFRzaU1vZGFsRm9vdGVyQ29tcG9uZW50KTtcclxuICAgICAgY29tcFJlZi5pbnN0YW5jZS5mb290ZXJUZW1wbGF0ZVJlZiA9IHRoaXMubW9kYWxGb290ZXJDb21wPy5mb290ZXJUZW1wbGF0ZVJlZlxyXG4gICAgICBjb21wUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy50b29sYmFyVGVtcGxhdGVSZWYgJiYgdGhpcy5tb2RhbEhlYWRlckNvbXApIHtcclxuICAgICAgdGhpcy5tb2RhbEhlYWRlckNvbXAudG9vbGJhclRlbXBsYXRlSGVhZGVyID0gdGhpcy50b29sYmFyVGVtcGxhdGVSZWY7XHJcbiAgICAgIHRoaXMuaW5wdXRUaXRsZSA9IHRoaXMubW9kYWxIZWFkZXJDb21wLmlucHV0VGl0bGU7XHJcblxyXG4gICAgICB0aGlzLm1vZGFsSGVhZGVyQ29tcC50b29sYmFyVGVtcGxhdGVIZWFkZXIgPSB0aGlzLnRvb2xiYXJUZW1wbGF0ZVJlZjtcclxuICAgICAgdGhpcy5pbnB1dFRpdGxlID0gdGhpcy5tb2RhbEhlYWRlckNvbXAuaW5wdXRUaXRsZTtcclxuICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZvcm1SZWZDaGFuZ2UuZW1pdCh0aGlzLmZvcm1SZWYpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGhhbmRsZSBldmVudHNcclxuICBoYW5kbGVGb3JtU3VibWl0KGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLndvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UuaXNEZXNnaW5Nb2RlRnJvbVdvcmtmbG93KSB7XHJcbiAgICAgIHRoaXMub25TdWJtaXRGb3JtV29ya2Zsb3dDb25maWd1cmF0aW9uLmVtaXQoZXZlbnQpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zeW5jRHluYW1pY0NvbHVtbkRhdGFUb0R5bmFtaWNGb3JtU2VydmljZSgpXHJcbiAgICAgIHRoaXMub25TdWJtaXQuZW1pdChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBzeW5jRHluYW1pY0NvbHVtbkRhdGFUb0R5bmFtaWNGb3JtU2VydmljZSgpIHtcclxuICAgIGNvbnN0IGV4aXN0aW5nVWlkcyA9IG5ldyBTZXQoXHJcbiAgICAgIHRoaXMuZHluYW1pY0Zvcm1TZXJ2aWNlLmNvbG9ubmVzUGVyc29ubmFsaXNlZURhdGEubWFwKHggPT4geC5jb2xvbm5lUGVyc29ubmFsaXNlZVVpZClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5jb2xvbm5lc1BlcnNvbm5hbGlzZWVHcm91cGVkLmZvckVhY2goY3BnID0+IHtcclxuICAgICAgY3BnLmNvbG9ubmVzLmZvckVhY2goY3AgPT4ge1xyXG4gICAgICAgIGlmICghZXhpc3RpbmdVaWRzLmhhcyhjcC51aWQpKSB7XHJcbiAgICAgICAgICBpZiAoIWNwLmRhdGEpIHtcclxuICAgICAgICAgICAgY3AuZGF0YSA9IG5ldyBDb2xvbm5lUGVyc29ubmFsaXNlZURhdGEoXHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgIHRoaXMuaWQsIGNwLnVpZCxcclxuICAgICAgICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgQ29sb25uZVBlcnNvbm5hbGlzZWVEYXRhKFxyXG4gICAgICAgICAgICBjcD8uZGF0YT8udWlkID8/IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgY3A/LmRhdGE/Lm9jY3VyZW5jZSA/PyB0aGlzLmlkLFxyXG4gICAgICAgICAgICBjcC51aWQsXHJcbiAgICAgICAgICAgIGNwLmRhdGEudmFsZXVyQm9vbGVhbixcclxuICAgICAgICAgICAgY3AuZGF0YS52YWxldXJJbnQsXHJcbiAgICAgICAgICAgIGNwLmRhdGEudmFsZXVyRGVjaW1hbCxcclxuICAgICAgICAgICAgY3AuZGF0YS52YWxldXJTdHJpbmcsXHJcbiAgICAgICAgICAgIGNwLmRhdGEudmFsZXVyQmluYXJ5LFxyXG4gICAgICAgICAgICBjcC5vYnNlcnZhdGlvblxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhLnB1c2gobmV3RGF0YSk7XHJcblxyXG4gICAgICAgICAgZXhpc3RpbmdVaWRzLmFkZChjcC51aWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcInRoaXMuZHluYW1pY0Zvcm1TZXJ2aWNlLmNvbG9ubmVzUGVyc29ubmFsaXNlZURhdGEgPT4gXCIsXHJcbiAgICAgIHRoaXMuZHluYW1pY0Zvcm1TZXJ2aWNlLmNvbG9ubmVzUGVyc29ubmFsaXNlZURhdGFcclxuICAgIClcclxuXHJcbiAgfVxyXG5cclxuICAvLyAjcmVnaW9uIHdvcmtmbG93XHJcblxyXG5cclxuICBjb25maXJtVXBkYXRlV29ya2Zsb3dFdGF0KGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnNvbGUubG9nKGV2ZW50KVxyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIHRoaXMuX3RzaUNvbmZpcm1TZXJ2aWNlLmNvbmZpcm0oXCJhZG1pbmlzdHJhdGlvbl9jb25maXJtX3N0YXR1c19jaGFuZ2VcIiwgXCJhZG1pbmlzdHJhdGlvbl9jb25maXJtYXRpb25fdGl0bGVcIixcclxuICAgICAgICAocmVzdWx0OiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZVxyXG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyB1cGRhdGVFbnRpdHlXb3JrZmxvd0luZm9ybWF0aW9uKClcclxuICAgICAgICAgICAgcmVxdWVzdC5jbGFzc05hbWUgPSB0aGlzLl9idXNpbmVzc0NsYXNzO1xyXG4gICAgICAgICAgICByZXF1ZXN0LnVpZE9iamVjdCA9IHRoaXMuX2lkXHJcbiAgICAgICAgICAgIHJlcXVlc3QubmV3V29ya2Zsb3dTdGF0dXMgPSBldmVudDtcclxuICAgICAgICAgICAgcmVxdWVzdC53b3JrZmxvdyA9IHRoaXMud29ya2Zsb3dJbmZvcm1hdGlvbj8ud29ya2Zsb3dVaWQ7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qud29ya2Zsb3dFdGF0ID0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uLndvcmtmbG93RXRhdFxyXG4gICAgICAgICAgICByZXF1ZXN0LndvcmtmbG93SW5zdGFuY2VVaWQgPSB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24/LndvcmtmbG93SW5zdGFuY2VVaWRcclxuICAgICAgICAgICAgcmVxdWVzdC53b3JrZmxvd0V0YXQgPSB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24/LndvcmtmbG93RXRhdFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXF1ZXN0KVxyXG4gICAgICAgICAgICB0aGlzLndvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UudXBkYXRlRW50aXR5V29ya2Zsb3dJbmZvcm1hdGlvbihyZXF1ZXN0KS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSlcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3RhdHVzICE9IG51bGwgJiYgZGF0YS5zdGF0dXMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBkYXRhLnN0YXR1c1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvd0V0YXRVaWQgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3RzaU5vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IoZXJyb3I/LmVycm9yKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93RXRhdFVpZCA9IG51bGxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHN0YXR1c01ldGFkYXRhQ29tYm9TdGF0dXM/OiBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlO1xyXG5cclxuICBwcml2YXRlIGdldFN0YXR1c01ldGFGb3JDb21ibygpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLnN0YXR1c0NvbG9yU2VydmljZS5nZXRTdGF0dXNDb2xvckRldGFpbHNCeUJ1c2luZXNzQ2xhc3NOYW1lKHRoaXMuYnVzaW5lc3NDbGFzcyEpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhOiBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5zdGF0dXNNZXRhZGF0YUNvbWJvU3RhdHVzID0gZGF0YTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIEVudGl0eSBzdGF0dXNcclxuICBwcml2YXRlIGdldEVudGl0eVN0YXR1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuZW50aXR5U3RhdHVzU2VydmljZS5nZXRFbnRpdHlTdGF0dXModGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YTogRW50aXR5UHJvcGVydGllc1Jlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmIChkYXRhLmVudGl0eVN0YXR1cyAmJiBBcnJheS5pc0FycmF5KGRhdGEuZW50aXR5U3RhdHVzKSkge1xyXG4gICAgICAgICAgdGhpcy5lbnRpdHlTdGF0dXNMaXN0ID0gZGF0YS5lbnRpdHlTdGF0dXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBNb2Rlcy5jcmVhdGUpIHtcclxuICAgICAgICAgIHRoaXMuc3RhdHVzID0gZGF0YS5kZWZhdWx0U3RhdHVzO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnNldE1lc3NhZ2VQb3NpdGlvbihldmVudCk7XHJcbiAgfVxyXG5cclxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIGNvbnN0IGZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyPy5maWxlcztcclxuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc1swXTtcclxuICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xyXG4gICAgICB0aGlzLmlzRHJhZ092ZXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy51cGxvYWRGaWxlKGZpbGUsIGZpbGVFeHRlbnNpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGxvYWRGaWxlKGZpbGU6IEZpbGUsIGZpbGVFeHRlbnNpb246IHN0cmluZykge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogUHJvZ3Jlc3NFdmVudDxGaWxlUmVhZGVyPikgPT4ge1xyXG4gICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGUudGFyZ2V0Py5yZXN1bHQgYXMgQXJyYXlCdWZmZXI7XHJcbiAgICAgIGlmICghYXJyYXlCdWZmZXIpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSB0aGlzLmFycmF5QnVmZmVyVG9CYXNlNjQoYXJyYXlCdWZmZXIpO1xyXG5cclxuICAgICAgY29uc3QgZmljaGllclRvU2VuZCA9IG5ldyBGaWNoaWVyKCk7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuZGF0ZUZpY2hpZXIgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLm5vbSA9IGZpbGUubmFtZTtcclxuICAgICAgZmljaGllclRvU2VuZC5vYmpldCA9ICcnO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLm5vbUZpY2hpZXJDb21wbGV0ID0gZmlsZS5uYW1lO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLmRlc2NyaXB0aW9uID0gJyc7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuY29udGVudSA9IGJhc2U2NENvbnRlbnQ7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQudGFibGVMaWVlID0gdGhpcy5idXNpbmVzc0NsYXNzO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLnBrZXkgPSB0aGlzLmlkPy50b1N0cmluZygpO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLmV4dGVuc2lvbiA9IGZpbGVFeHRlbnNpb25cclxuXHJcbiAgICAgIHRoaXMuX2ZpY2hpZXJTZXJ2aWNlLmNyZWF0ZShmaWNoaWVyVG9TZW5kKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZ2V0Tm9tYnJlRmljaGllcigpO1xyXG4gICAgICAgICAgdGhpcy5fdHNpTm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKFwiZmljaGllcl9qb2ludFwiKTtcclxuICAgICAgICAgIHRoaXMub25TYXZlLmVtaXQoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAocmVzcG9uc2U6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9lcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2Uuc2hvd0Vycm9yTWVzc2FnZShyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgYXJyYXlCdWZmZXJUb0Jhc2U2NChidWZmZXI6IEFycmF5QnVmZmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBiaW5hcnkgPSAnJztcclxuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgIGNvbnN0IGxlbiA9IGJ5dGVzLmJ5dGVMZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcclxuICAgIH1cclxuICAgIHJldHVybiBidG9hKGJpbmFyeSk7XHJcbiAgfVxyXG5cclxuICBoaWRlKHZhbD86IGFueSkge1xyXG4gICAgaWYgKHRoaXMucmVmICE9IG51bGwgJiYgdGhpcy5yZWYgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmICh2YWwgPT0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLnJlZj8uZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVmPy5jbG9zZSh2YWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsKGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmxvY2FsaXplICE9IG51bGxcclxuICAgICAgJiYgdGhpcy5sb2NhbGl6ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubG9jYWxpemUudHJhbnNmb3JtKGtleSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ga2V5O1xyXG4gIH1cclxuXHJcbiAgZ2V0Tm9tYnJlRmljaGllcigpIHtcclxuICAgIGlmICh0aGlzLmlkICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5fZmljaGllclNlcnZpY2VcclxuICAgICAgICAuR2V0Tm9tYnJlRmljaGllckpvaW50QnlJZCh0aGlzLmlkID8/IFwiXCIpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm5vbWJyZURvY3VtZW50cyA9IGRhdGE7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChyZXNwb25zZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgLy8gdGhpcy5fZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLnNob3dFcnJvck1lc3NhZ2UocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgdG8gZ2V0IG51bWJlciBvZiBmaWxlcyBvbiB0aGlzIHJlY29yZFwiLCByZXNwb25zZSlcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRyYWdFbnRlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5kcmFnRW50ZXJDb3VudCsrO1xyXG5cclxuICAgIHRoaXMuaXNEcmFnT3ZlciA9IHRydWU7XHJcbiAgICB0aGlzLnNldE1lc3NhZ2VQb3NpdGlvbihldmVudCk7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNEcmFnT3Zlcikge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VQb3NpdGlvbiA9IHtcclxuICAgICAgICB4OiBldmVudC5jbGllbnRYICsgNSxcclxuICAgICAgICB5OiBldmVudC5jbGllbnRZICsgNVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0VudGVyQ291bnQtLTtcclxuXHJcbiAgICBpZiAodGhpcy5kcmFnRW50ZXJDb3VudCA8PSAwKSB7XHJcbiAgICAgIHRoaXMuaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRyYWdFbnRlckNvdW50ID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0TWVzc2FnZVBvc2l0aW9uKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubWVzc2FnZVBvc2l0aW9uID0ge1xyXG4gICAgICB4OiBldmVudC5jbGllbnRYICsgNSxcclxuICAgICAgeTogZXZlbnQuY2xpZW50WSArIDUsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRBbGxGb3Jtc09mQnVzaW5lc3NDbGFzcygpIHtcclxuICAgIGlmKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHJldHVybjtcclxuICAgIFxyXG4gICAgdGhpcy5mb3JtdWxhaXJlU2VydmljZS5nZXRBbGxGb3Jtc09mQnVzaW5lc3NDbGFzcyh0aGlzLmJ1c2luZXNzQ2xhc3MsIHRoaXMuZGVzY3JpbWluYXRvclZhbHVlKVxyXG4gICAgLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICghdmFsdWUgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHJldHVybjtcclxuICAgICAgICB0aGlzLmZvcm1zT2ZCdXNpbmVzc0NsYXNzID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5kb2VzSGF2ZUZvcm1zID0gdHJ1ZTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG4gIH1cclxuICBcclxuICBwcml2YXRlIHJlY2FsY3VsYXRlRm9ybXNWaXNpYmlsaXR5KCkgeyB0aGlzLmNhblNob3dGb3JtcyA9IHRoaXMuZG9lc0hhdmVGb3JtcyAmJiAhaXNOdWxsT3JFbXB0eSh0aGlzLm1vZGUpICYmIHRoaXMubW9kZSAhPSBNb2Rlcy5jcmVhdGU7IH1cclxufSIsIjxmb3JtIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKG5nU3VibWl0KT1cImhhbmRsZUZvcm1TdWJtaXQoJGV2ZW50KVwiICNmb3JtUmVmPVwibmdGb3JtXCI+XHJcbiAgPG5nLXRlbXBsYXRlICN0b29sYmFyVGVtcGxhdGU+XHJcbiAgICA8cC10b29sYmFyICpuZ0lmPVwiZm9ybUVuZHBvaW50XCIgc3R5bGVDbGFzcz1cIm1iLTEgZ2FwLTJcIiBjbGFzcz1cInctZnVsbFwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxyXG4gICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50KVwiIChkcmFnZW50ZXIpPVwib25EcmFnRW50ZXIoJGV2ZW50KVwiIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImxlZnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBtbC0yXCI+XHJcbiAgICAgICAgICB7eyBpbnB1dFRpdGxlIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicmlnaHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBtci0yXCI+XHJcbiAgICAgICAgICA8YXBwLXJlcG9ydGluZyAqbmdJZj1cImZvcm1FbmRwb2ludFwiIFtmcm9tVHNpRm9ybV09XCJ0cnVlXCIgW2lkXT1cInRoaXMuaWRcIiBbZm9ybUVuZHBvaW50XT1cImZvcm1FbmRwb2ludFwiXHJcbiAgICAgICAgICAgIFtmb3JtTmFtZV09XCJmb3JtTmFtZVwiIFtyZXBvcnREaXNjcmltaW5hdG9yXT1cImRlc2NyaW1pbmF0b3JWYWx1ZVwiIFtpc0Zvcm1FbmRwb2ludFBhZ2VkXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbbm9tYnJlRG9jdW1lbnRzSm9pbnRzXT1cIm5vbWJyZURvY3VtZW50c1wiIFtjb25maWdNb2RlQnV0dG9uSWRdPVwiY29uZmlnTW9kZUJ1dHRvbklkXCJcclxuICAgICAgICAgICAgW2lzUmVwb3J0aW5nVG9vbGJhckRpc2FibGVkXT1cImlzUmVwb3J0aW5nVG9vbGJhckRpc2FibGVkXCIgKHRvZ2dsZURlc2lnbk1vZGUpPVwidG9nZ2xlRGVzaWduTW9kZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2J1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiIChjbG9zZWRNb2RhbEZpbGVVcGxvYWQpPVwiZ2V0Tm9tYnJlRmljaGllcigpXCJcclxuICAgICAgICAgICAgW3Nob3dJbXBvcnRFeHBvcnRCdXR0b25dPVwiZmFsc2VcIiAjcmVwb3J0aW5nQXBwPlxyXG4gICAgICAgICAgPC9hcHAtcmVwb3J0aW5nPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImlzRHJhZ092ZXJcIiBbbmdTdHlsZV09XCJ7IGxlZnQ6IG1lc3NhZ2VQb3NpdGlvbi54ICsgJ3B4JywgdG9wOiBtZXNzYWdlUG9zaXRpb24ueSArICdweCcgfVwiXHJcbiAgICAgICAgY2xhc3M9XCJkcmFnLW1lc3NhZ2UgY3Vyc29yLWZvbGxvd1wiPlxyXG4gICAgICAgIHt7IFwiSm9pbnR1cmVcIiB8IGxvY2FsaXplIH19XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvcC10b29sYmFyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxkaXYgKmJ1c3k9XCJpc0xvYWRpbmdcIj48L2Rpdj5cclxuXHJcbiAgPGZpZWxkc2V0IFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgbXJcIj5cclxuICAgICAgPHAtdGFiVmlldz5cclxuXHJcbiAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwiXCIgXHJcbiAgICAgICAgW2hlYWRlclN0eWxlXT1cImNvbG9ubmVzUGVyc29ubmFsaXNlZUdyb3VwZWQubGVuZ3RoID09PSAwICYmICFjYW5TaG93Rm9ybXNcclxuICAgICAgPyB7IGRpc3BsYXk6ICdub25lJyB9IFxyXG4gICAgICA6IG51bGxcIj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1ob21lIG1yLTJcIj48L2k+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1haW4tdGFiLXRleHRcIj57eyAnc2hhcmVkX2Zvcm1fbWFpbnRhYlRpdGxlJyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgICAgIDwvcC10YWJQYW5lbD5cclxuXHJcbiAgICAgICAgPCEtLSBEeW5hbWljIHRhYnMgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbG9ubmVzUGVyc29ubmFsaXNlZUdyb3VwZWQubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgPHAtdGFiUGFuZWwgKm5nRm9yPVwibGV0IGdycCBvZiBjb2xvbm5lc1BlcnNvbm5hbGlzZWVHcm91cGVkXCIgW2hlYWRlcl09XCJncnAuZ3JvdXBlXCI+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2R5bmFtaWNUb29sYmFyQ29udGFpbmVyPjwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZ3JpZCBmb3JtLXJvd1wiICpuZ0Zvcj1cImxldCBjb2wgb2YgZ3JwLmNvbG9ubmVzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgZm9ybS1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLUxhYmVsIFtsYWJlbFZhbHVlXT1cImNvbC5ub21cIj48L1RzaS1MYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gU3RyaW5nIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGZvcm0taW5wdXRcIiAqbmdJZj1cImNvbC50eXBlID09PSBmb3JtVHlwZS5zdHJpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLVRleHQtQm94IFsoaW5wdXRGaWVsZCldPVwiY29sLmRhdGEudmFsZXVyU3RyaW5nXCI+PC9Uc2ktVGV4dC1Cb3g+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBJbnQgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTggZm9ybS1pbnB1dFwiICpuZ0lmPVwiY29sLnR5cGUgPT09IGZvcm1UeXBlLmludFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlciBbKGlucHV0RmllbGQpXT1cImNvbC5kYXRhLnZhbGV1ckludFwiPjwvVHNpLUludGVnZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBEZWNpbWFsIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGZvcm0taW5wdXRcIiAqbmdJZj1cImNvbC50eXBlID09PSBmb3JtVHlwZS5kZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLUlucHV0IFsoaW5wdXRGaWVsZCldPVwiY29sLmRhdGEudmFsZXVyRGVjaW1hbFwiPjwvVHNpLURlY2ltYWwtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBCb29sZWFuIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGZvcm0taW5wdXRcIiAqbmdJZj1cImNvbC50eXBlID09PSBmb3JtVHlwZS5ib29sZWFuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja0JveCBbaXNCaW5hcnldPVwiZmFsc2VcIiBbKGlucHV0RmllbGQpXT1cImNvbC5kYXRhLnZhbGV1ckJvb2xlYW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja0JveD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEJpbmFyeSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOCBmb3JtLWlucHV0XCIgKm5nSWY9XCJjb2wudHlwZSA9PT0gZm9ybVR5cGUuYmluYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgIGJpbmFyeSBpbnB1dCAobm90IGhhbmRsZWQgeWV0KVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZHluYW1pY0Zvb3RlckNvbnRhaW5lcj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FuU2hvd0Zvcm1zXCI+XHJcbiAgICAgICAgICA8cC10YWJQYW5lbCBbaGVhZGVyXT1cIidzaGFyZWRfZm9ybV9keW5hbWljRm9ybXNUYWJfVGl0bGUnIHwgbG9jYWxpemVcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICA8c2hhcmVkLWR5bmFtaWMtZm9ybS1saXN0XHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZV09XCJpZFwiXHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZUJ1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZURpc2NyaW1pbmF0b3JWYWx1ZV09XCJkZXNjcmltaW5hdG9yVmFsdWVcIlxyXG4gICAgICAgICAgICAgIFtpZ25vcmVEaWFsb2dDb25maWddPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8L3AtdGFiVmlldz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZmllbGRzZXQ+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCIoYnVzaW5lc3NDbGFzcyAmJiBlbnRpdHlTdGF0dXNMaXN0Lmxlbmd0aCA+IDApIHx8XHJcbiAgICAgICAgd29ya2Zsb3dJbmZvcm1hdGlvbj8ud29ya2Zsb3dVaWQgfHxcclxuICAgICAgICB3b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvd1wiIGNsYXNzPVwibXgtNCBweC0yIG15LTEgc2hhcmVkLWZvb3Rlci1iYXJcIj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiYnVzaW5lc3NDbGFzcyAmJiBlbnRpdHlTdGF0dXNMaXN0ICYmIGVudGl0eVN0YXR1c0xpc3QubGVuZ3RoID4gMFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIiBwcmVzZW50YXRpb25EZXNpZ25lcj1cInNoYXJlZF9jcnVkX3N0YXR1c1wiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ3NoYXJlZF9jcnVkX3N0YXR1cydcIj48L1RzaS1MYWJlbD5cclxuICAgICAgICA8VHNpLVNlYXJjaC1Db21ibyBbaWQtZmllbGRdPVwiJ2tleSdcIiBbbGFiZWwtZmllbGRdPVwiJ3ZhbHVlJ1wiIFtkYXRhc291cmNlXT1cImVudGl0eVN0YXR1c0xpc3RcIiBbKGJpbmQpXT1cInN0YXR1c1wiXHJcbiAgICAgICAgICBbY29tYm9UeXBlXT1cIidzdGF0dXMnXCIgW3N0YXR1c01ldGFkYXRhXT1cInN0YXR1c01ldGFkYXRhQ29tYm9TdGF0dXNcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwid29ya2Zsb3dJbmZvcm1hdGlvbj8ud29ya2Zsb3dVaWQgfHwgd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5pc0Rlc2dpbk1vZGVGcm9tV29ya2Zsb3dcIlxyXG4gICAgICBjbGFzcz1cImZsZXggY29sLTEwXCI+XHJcbiAgICAgIDxkaXYgcHJlc2VudGF0aW9uRGVzaWduZXI9XCJzaGFyZWRfd29ya2Zsb3dOYW1lXCIgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBjb2wtNFwiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ2FkbWluaXN0cmF0aW9uX3dvcmtmbG93X3dvcmtmbG93J3wgbG9jYWxpemVcIj5cclxuICAgICAgICA8L1RzaS1MYWJlbD5cclxuICAgICAgICA8VHNpLVRleHQtQm94IFtkaXNhYmxlZF09XCJ0cnVlXCIgW2lucHV0TmFtZV09XCInd29ya2Zsb3dOYW1lJ1wiIFsoaW5wdXRGaWVsZCldPVwid29ya2Zsb3dJbmZvcm1hdGlvbi53b3JrZmxvd05hbWVcIj5cclxuICAgICAgICA8L1RzaS1UZXh0LUJveD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgcHJlc2VudGF0aW9uRGVzaWduZXI9XCJhZG1pbmlzdHJhdGlvbl93b3JrZmxvd193b3JrZmxvd19jdXJyZW50X3N0YXR1c1wiXHJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBjb2wtNFwiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ2FkbWluaXN0cmF0aW9uX3dvcmtmbG93X3dvcmtmbG93X2N1cnJlbnRfc3RhdHVzJ1wiPjwvVHNpLUxhYmVsPlxyXG4gICAgICAgIDxUc2ktU2VhcmNoLUNvbWJvIGNsYXNzPVwidy03XCIgW2Rpc2FibGVkXT1cInRydWVcIiBpZC1maWVsZD1cImtleVwiIGxhYmVsLWZpZWxkPVwidmFsdWVcIlxyXG4gICAgICAgICAgW2JpbmRdPVwid29ya2Zsb3dJbmZvcm1hdGlvbi53b3JrZmxvd0V0YXRcIiBbaXNGaWx0ZXJlZF09XCJ0cnVlXCJcclxuICAgICAgICAgIFtlbGVtZW50U291cmNlVXJsXT1cImdldFdvcmtmbG93RXRhdEFzS2V5VmFsdWVQYWlyXCIgW2xpc3RTb3VyY2VVcmxdPVwiZ2V0V29ya2Zsb3dFdGF0U3VpdmFudEFzS2V5VmFsdWVQYWlyXCI+XHJcbiAgICAgICAgPC9Uc2ktU2VhcmNoLUNvbWJvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIm1vZGUgIT0gZm9ybU1vZGVzLmNyZWF0ZSB8fCB3b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvd1wiXHJcbiAgICAgICAgICBwcmVzZW50YXRpb25EZXNpZ25lcj1cImFkbWluaXN0cmF0aW9uX3dvcmtmbG93X3dvcmtmbG93X25leHRfc3RhdHVzXCJcclxuICAgICAgICAgIGNsYXNzPVwiZmxleCBnYXAtMiBhbGlnbi1pdGVtcy1jZW50ZXIgbm8tYm9yZGVyXCI+XHJcbiAgICAgICAgICA8VHNpLUxhYmVsIFtsYWJlbFZhbHVlXT1cIidhZG1pbmlzdHJhdGlvbl93b3JrZmxvd193b3JrZmxvd19uZXh0X3N0YXR1cydcIj48L1RzaS1MYWJlbD5cclxuICAgICAgICAgIDxUc2ktU2VhcmNoLUNvbWJvIGNsYXNzPVwidy03XCIgaWQtZmllbGQ9XCJrZXlcIiBsYWJlbC1maWVsZD1cInZhbHVlXCIgWyhiaW5kKV09XCJzZWxlY3RlZFdvcmtmbG93RXRhdFVpZFwiXHJcbiAgICAgICAgICAgIFtpc0ZpbHRlcmVkXT1cInRydWVcIiBbZWxlbWVudFNvdXJjZVVybF09XCJnZXRXb3JrZmxvd0V0YXRBc0tleVZhbHVlUGFpclwiXHJcbiAgICAgICAgICAgIFtsaXN0U291cmNlVXJsXT1cImdldFdvcmtmbG93RXRhdFN1aXZhbnRBc0tleVZhbHVlUGFpclwiIChiaW5kQ2hhbmdlKT1cImNvbmZpcm1VcGRhdGVXb3JrZmxvd0V0YXQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPC9Uc2ktU2VhcmNoLUNvbWJvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+Il19