gamma-app-controller 1.0.2 → 1.0.5

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.
@@ -268,7 +268,7 @@ export class PageConfigComponent {
268
268
  }
269
269
  updateWidget() {
270
270
  let modifiedConfig = this.reformatWidgetConfig(this.dashBoardWidgetConfig, this.newWidgetIndex);
271
- modifiedConfig['filterId'] = (modifiedConfig.filters.filterId) ? modifiedConfig.filters.filterId : null;
271
+ modifiedConfig['filterId'] = (modifiedConfig.filters && modifiedConfig.filters.filterId) ? modifiedConfig.filters.filterId : null;
272
272
  delete modifiedConfig['filters'];
273
273
  this.service.editAppWidgetConfig(modifiedConfig).subscribe({
274
274
  next: (data) => {
@@ -295,23 +295,7 @@ export class PageConfigComponent {
295
295
  widgetProperties: this.addedwidGetConfig,
296
296
  pageId: this.pageId,
297
297
  filterId: this.selectedFilterId,
298
- widgetNode: [
299
- {
300
- id: this.commonService.primeryRendomeId(5),
301
- nodeTitle: "",
302
- filterId: "",
303
- nodeProperties: {
304
- "display": true,
305
- "widgetTitle": "",
306
- "width": "w-1/2",
307
- "height": "",
308
- },
309
- compConfig: {
310
- dynamicComponentRefs: [],
311
- viewConfig: []
312
- }
313
- }
314
- ],
298
+ widgetNode: [],
315
299
  compConfig: {
316
300
  dynamicComponentRefs: [],
317
301
  viewConfig: []
@@ -499,9 +483,9 @@ export class PageConfigComponent {
499
483
  let w_height = (div.widgetProperties.height == "") ? "h-auto" : 'h-[' + div.widgetProperties.height + ']';
500
484
  rowDiv.classList.add(div.widgetProperties.width, w_height, 'border');
501
485
  const filterDiv = document.createElement('div');
502
- if (div.filters) {
503
- this.loadFilterComponent(div, filterDiv, div.filters.filterItems);
504
- }
486
+ debugger;
487
+ const filterItems = (div.filters) ? div.filters.filterItems : [];
488
+ this.loadFilterComponent(div, filterDiv, filterItems);
505
489
  rowDiv.appendChild(filterDiv);
506
490
  if (div.widgetNode && div.widgetNode.length && div.widgetNode.length != 0) {
507
491
  const mainItemDiv = document.createElement('div');
@@ -577,8 +561,13 @@ export class PageConfigComponent {
577
561
  let apiCalls = [];
578
562
  this.service.getAppDatasetConfig(element.datasetId).subscribe({
579
563
  next: (dataset) => {
580
- const datasetWithLimit = this.setDataSetsLimit(dataset);
581
- apiCalls.push(this.datasetService.getDataFromDataSet(datasetWithLimit, datasetWithLimit.datasetId, this.defaultApplyedFilter));
564
+ if (dataset.datasetType !== "sqlQuery" && dataset.datasetType !== "plainjson") {
565
+ const datasetWithLimit = this.setDataSetsLimit(dataset);
566
+ apiCalls.push(this.datasetService.getDataFromDataSet(datasetWithLimit, datasetWithLimit.datasetId, this.defaultApplyedFilter));
567
+ }
568
+ else {
569
+ apiCalls.push(this.datasetService.getDataFromDataSet(dataset, dataset.datasetId, this.defaultApplyedFilter));
570
+ }
582
571
  Promise.all(apiCalls).then(() => {
583
572
  this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
584
573
  element.kpiConfig['dataSource'] = this.uniqueDataSetObject[element.datasetId];
@@ -957,10 +946,10 @@ export class PageConfigComponent {
957
946
  }
958
947
  }
959
948
  PageConfigComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: PageConfigComponent, deps: [{ token: i1.CommonService }, { token: i2.ActivatedRoute }, { token: i0.ViewContainerRef }, { token: i0.ComponentFactoryResolver }, { token: i3.ApplicationContentService }, { token: i4.ToastrService }, { token: i2.Router }, { token: i5.ApplicationDatssetsCall }], target: i0.ɵɵFactoryTarget.Component });
960
- PageConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: PageConfigComponent, selector: "app-dashbord-config", viewQueries: [{ propertyName: "dynamicComponentContainer", first: true, predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicContainer", first: true, predicate: ["dynamicContainer"], descendants: true, static: true }, { propertyName: "scrollView", first: true, predicate: DxScrollViewComponent, descendants: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<!-- <div class=\"flex flex-col flex-auto w-full\"> -->\n<div class=\"flex flex-row h-screen\">\n <div class=\"flex-grow border-r h-full\">\n <div class=\"scrollable-content\">\n <!-- <div class=\"flex flex-wrap p-2 border\"> -->\n <!-- <app-advance-header [filterItems]=\"filterItems\" [pageTitle]=\"'Dashboard'\" [isEditButton]=\"false\"\n [isAdvanceButton]=\"true\"></app-advance-header> -->\n <div class=\"flex flex-wrap my-3\" #dynamicContainer></div>\n\n </div>\n <div class=\"flex flex-row justify-center items-center h-16 m-2 border\">\n <lib-common-header [pageTitle]=\"''\"></lib-common-header>\n <!-- <div class=\"{{commonService.btn_success_md}} m-2 \" (click)=\"getCreateDataSetPage()\">Create\n Dataset\n </div> -->\n <div class=\"{{commonService.btn_primary_md}} m-2\" (click)=\"addWidget()\">Add Layout\n </div>\n <!-- <div class=\"{{commonService.btn_success_md}} m-2\" (click)=\"getCreateViewPage()\">Create\n View\n </div> -->\n <div class=\"{{commonService.btnOthersPurple}} m-2 cursar-pointer\" (click)=\"getViewPage()\">View Page\n </div>\n <!-- <div class=\"{{commonService.btn_warning_md}} m-2 cursar-pointer\" (click)=\"getAllPage()\">All Pages\n </div> -->\n\n </div>\n </div>\n <div class=\"flex-shrink-0 w-1/4 p-2 h-full\">\n <ng-container *ngIf=\"isDashBoardContent\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\" (click)=\"backToMainView()\">\n Back\n </div>\n <ng-container *ngFor=\"let item of page_config.api_config; let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b\">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.widGetConfig.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <!-- <button (click)=\"editSelectedWidget(item, i)\"\n class=\"w-8 h-8 bg-sky-600 hover:bg-blue-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-edit\"></i>\n </button> -->\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isWidgetCreationContent\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n <span *ngIf=\"!islayoutCreate\">Widget Settings</span>\n <span *ngIf=\"islayoutCreate\">Layout Settings</span>\n </h6>\n <div class=\"flex flex-row my-4\">\n <dx-check-box class=\"ml-auto\" [(ngModel)]=\"addedwidGetConfig.display\" text=\"Display\"></dx-check-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Width</span>\n <dx-select-box class=\"w-1/2\" [items]=\"widget_width\"\n [(ngModel)]=\"addedwidGetConfig.width\"></dx-select-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Height</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.height\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <span class=\"text-md my-auto px-2\">Widget Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetTitle\"></dx-text-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <span class=\"text-md my-auto px-2\">Widget Name</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetName\"></dx-text-box>\n </div>\n\n\n <div class=\"flex flex-row mb-5 justify-between\" *ngIf=\"islayoutCreate\">\n <span class=\"text-sm my-auto px-2\">Layout Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Filter</span>\n <dx-select-box class=\"w-1/2\" [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"selectedFilterId\"\n (onValueChanged)=\"getFilterValueById($event)\"></dx-select-box>\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div class=\"mt-6\" *ngIf=\"!islayoutCreate && isEditMainLayout\">\n <ng-container\n *ngFor=\"let item of dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode;let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b \">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.nodeProperties.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n *ngIf=\"i !== dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </div>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Application Views\n </div>\n <div class=\"border-x border-b p-2\">\n <ng-container *ngFor=\"let item of allWidgetInnerContent; let i = index\">\n <div class=\"group w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.viewName}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== allWidgetInnerContent.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentViews(item)\">\n <i class=\"fa fa-eye\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentDatasets(item)\">\n <i class=\"fa fa-database\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromConfig(i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Add Filter For View\n\n </div>\n <div class=\"border-x border-b p-2\">\n <div class=\"flex flex-row py-3 border-b\">\n <dx-check-box [(ngModel)]=\"addedwidGetConfig.isWidgetFilter\"\n text=\"Popup Columns Filter Enable\"></dx-check-box>\n </div>\n <div class=\"flex flex-row my-2 border-b\">\n <ng-container *ngFor=\"let item of nodeProperticeFilters; let i = index\">\n <div class=\"flex flex-wrap border-b\">\n <div class=\"px-1 w-1/3\">\n <div class=\"text-md\">Input Type</div>\n <dx-select-box [items]=\"['text']\" [(ngModel)]=\"item.input_type\"\n value=\"text\"></dx-select-box>\n </div>\n <div class=\"px-1-1 w-2/3\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Server Column</div>\n <dx-text-box [(ngModel)]=\"item.server_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Local Column</div>\n <dx-text-box [(ngModel)]=\"item.local_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/3\" *ngIf=\"item.input_type == 'select'\">\n <div class=\"text-md\">Columns Name</div>\n <dx-text-box [(ngModel)]=\"item.select_box_option\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\">\n <div class=\"flex justify-end\">\n <div class=\"{{commonService.btn_danger_sm}} w-24 mt-6 text-center\"\n (click)=\"deleteNodeFilter(i)\">Delete Filter</div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"{{commonService.btn_primary_sm}} w-auto text-center\"\n (click)=\"getNodeProperticeFilterOption()\">Add\n Filter</div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-row justify-end items-center h-16 m-2\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div *ngIf=\"islayoutCreate\"\n class=\"{{commonService.btn_success_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addLayoutTOview()\">Add View\n </div>\n <div *ngIf=\"!islayoutCreate && !isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addWidgetTOview()\">Add Layout\n </div>\n <div *ngIf=\"!islayoutCreate && isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateLayoutWidgetTOview()\">Update Layout\n </div>\n\n </ng-container>\n\n <div class=\"{{commonService.btn_warning_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateToView()\" *ngIf=\"isUpdateWidget\">Update View\n </div>\n\n </div>\n\n\n <!-- <pre><code>{{dashBoardWidgetConfig | json}}</code></pre> -->\n </ng-container>\n <ng-container *ngIf=\"isChartButtonClick\">\n <h6\n class=\"mb-2 font-bold text-md tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-bar-chart-o mr-2\"></i> Select View\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursor-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n </h6>\n <div class=\" h-[80vh] overflow-x-auto\">\n <div class=\"relative my-2 \">\n <input type=\"text\" [(ngModel)]=\"viewToSearch\" (keyup)=\"filterViews()\" (keydown)=\"filterViews()\"\n class=\"bg-gray-800 border border-gray-700 text-gray-200 text-sm focus:ring-gray-400 focus:border-gray-500 block w-full p-4 h-8 rounded\"\n placeholder=\"Search View\" />\n <button type=\"button\" class=\"absolute inset-y-0 right-0 flex items-center pr-6\">\n <mat-icon class=\"rotate-90 cursor-pointer\" [svgIcon]=\"'heroicons_outline:search'\"></mat-icon>\n </button>\n </div>\n <ng-container *ngFor=\"let item of filteredComponentConfig\">\n <div class=\"relative group my-3 w-full\">\n <!-- Item View Name -->\n <div class=\"text-md font-bold border-b py-2 cursar-pointer\">\n {{item.viewName}}</div>\n\n <!-- Hover Buttons -->\n <div\n class=\"absolute top-0 right-0 flex space-x-2 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pb-2\">\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700\">\n <i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"\n (click)=\"editComponentViews(item)\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-green-500 hover:bg-green-700\"\n (click)=\"getComponentConfig(item)\">\n <i class=\"fa fa-plus\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"isDefaultView\">\n <ng-container *ngFor=\"let item of dashBoardWidgetConfig.widgets; let i = index\">\n <div class=\"group my-3 w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.widgetTitle}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== dashBoardWidgetConfig.widgets.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"getEditViewFromLayout(item,i)\">\n <i class=\"fa fa-pencil-square\" aria-hidden=\"true\"></i>\n\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromLayout(item,i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n\n </div>\n</div>\n<!-- </div> -->\n\n<dx-popup [(visible)]=\"isEditOptionClick\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"{{editViewdataSourceModal.viewName}}\">\n <div *dxTemplate=\"let data of 'content'\">\n\n <app-dash-chart [datasetmodal]=\"editViewdataSourceModal\" (getChartConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'chart'\"></app-dash-chart>\n <app-dash-table [datasetmodal]=\"editViewdataSourceModal\" (getTableConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'table'\"></app-dash-table>\n <!-- <app-dash-other [datasetmodal]=\"editViewdataSourceModal\" *ngIf=\"editViewdataSourceModal.viewType == 'others'\"\n (createOtherComponentView)=\"getEmitNewChartCongig($event)\"></app-dash-other> -->\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isCreateDataset\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateDatasetWithDatasetId\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\" (onHidden)=\"getDatasetPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [selectedDatasetId]=\"selectedDatasetId\" [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n<dx-popup [(visible)]=\"isCreateNewViewWithDefaultView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\"\n [width]=\"1200\" [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\"\n (onHidden)=\"getViewPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [selectedViewId]=\"selectedViewId\" [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateNewView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isAdvanceLayout\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"700\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-2/3 mb-2\">\n <div class=\"text-md mb-2\">Select Views</div>\n <dx-tag-box [dataSource]=\"componentConfigDataSource\" valueExpr=\"viewId\" displayExpr=\"viewName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedViewsIds\"\n [maxDisplayedTags]=\"3\" (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add To View\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\" (click)=\"cancelCdrConfig()\">Cancel\n </button> -->\n </div>\n </div>\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'80%'\">\n\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of advanceLayoutContainer; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\">View Name</div>\n <dx-text-box [(ngModel)]=\"item.compConfig.viewConfig[0].viewName\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Title</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Width</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"widget_width\"\n [(ngModel)]=\"item.nodeProperties.width\"></dx-select-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Height</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.height\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"item.filterId\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mt-8\">\n <dx-check-box [(ngModel)]=\"item.nodeProperties.display\" text=\"Display\"></dx-check-box>\n </div>\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteView(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 my-2 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\" (click)=\"submitAdvanceView()\">Add\n Layout</button>\n </div>\n </div>\n</dx-popup>", styles: ["::ng-deep #scrollview-demo{min-height:550px}::ng-deep #scrollview{height:auto;position:absolute;top:0;bottom:300px;padding:20px}::ng-deep #scrollview-content{white-space:pre-wrap}.scrollable-content{height:85vh;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i8.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i9.DxPopupComponent, selector: "dx-popup", inputs: ["accessKey", "animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "dragAndResizeArea", "dragEnabled", "dragOutsideBoundary", "elementAttr", "focusStateEnabled", "fullScreen", "height", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "resizeEnabled", "restorePosition", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showTitle", "tabIndex", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onResize", "onResizeEnd", "onResizeStart", "onShowing", "onShown", "onTitleRendered", "accessKeyChange", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "dragAndResizeAreaChange", "dragEnabledChange", "dragOutsideBoundaryChange", "elementAttrChange", "focusStateEnabledChange", "fullScreenChange", "heightChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "resizeEnabledChange", "restorePositionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showTitleChange", "tabIndexChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i10.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { kind: "component", type: i11.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i12.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i13.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.LoadingComponent, selector: "app-loading" }, { kind: "component", type: i17.CreateCompViewComponent, selector: "app-create-comp-view", inputs: ["kpiTreeData", "isHeader", "selectedViewId"] }, { kind: "component", type: i18.DashChartComponent, selector: "app-dash-chart", inputs: ["datasetmodal"], outputs: ["getChartConfigOutPut"] }, { kind: "component", type: i19.DashTableComponent, selector: "app-dash-table", inputs: ["datasetmodal"], outputs: ["getTableConfigOutPut"] }, { kind: "component", type: i20.CreateDatasetComponent, selector: "app-create-dataset", inputs: ["isHeader", "selectedDatasetId"] }, { kind: "component", type: i21.CommonHeaderComponent, selector: "lib-common-header", inputs: ["pageTitle"] }] });
949
+ PageConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: PageConfigComponent, selector: "app-dashbord-config", viewQueries: [{ propertyName: "dynamicComponentContainer", first: true, predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicContainer", first: true, predicate: ["dynamicContainer"], descendants: true, static: true }, { propertyName: "scrollView", first: true, predicate: DxScrollViewComponent, descendants: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"flex flex-row h-[90vh] w-full\">\n <div class=\"w-3/4 border-r h-full flex flex-col px-2\">\n <!-- Scrollable content -->\n <div class=\"flex-grow overflow-y-auto\">\n <div class=\"flex flex-wrap my-3\" #dynamicContainer></div>\n </div>\n\n <!-- Fixed bottom section -->\n <div class=\"flex flex-row justify-center items-center h-16 m-2 border shrink-0\">\n <lib-common-header [pageTitle]=\"''\"></lib-common-header>\n <div class=\"{{commonService.btn_primary_md}} m-2\" (click)=\"addWidget()\">Add Layout</div>\n <div class=\"{{commonService.btnOthersPurple}} m-2 cursor-pointer\" (click)=\"getViewPage()\">View Page</div>\n </div>\n </div>\n <div class=\"w-1/4 p-2 h-full\">\n <ng-container *ngIf=\"isDashBoardContent\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\" (click)=\"backToMainView()\">\n Back\n </div>\n <ng-container *ngFor=\"let item of page_config.api_config; let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b\">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.widGetConfig.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <!-- <button (click)=\"editSelectedWidget(item, i)\"\n class=\"w-8 h-8 bg-sky-600 hover:bg-blue-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-edit\"></i>\n </button> -->\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isWidgetCreationContent\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n <span *ngIf=\"!islayoutCreate\">Widget Settings</span>\n <span *ngIf=\"islayoutCreate\">Layout Settings</span>\n </h6>\n <div class=\"flex flex-row my-4\">\n <dx-check-box class=\"ml-auto\" [(ngModel)]=\"addedwidGetConfig.display\" text=\"Display\"></dx-check-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Width</span>\n <dx-select-box class=\"w-1/2\" [items]=\"widget_width\"\n [(ngModel)]=\"addedwidGetConfig.width\"></dx-select-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Height</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.height\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <div class=\"text-md my-auto px-2\">Widget Title</div>\n <div><dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetTitle\"></dx-text-box></div>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <span class=\"text-md my-auto px-2\">Widget Name</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetName\"></dx-text-box>\n </div>\n\n\n <div class=\"flex flex-row mb-5 justify-between\" *ngIf=\"islayoutCreate\">\n <span class=\"text-sm my-auto px-2\">Layout Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Filter</span>\n <dx-select-box class=\"w-1/2\" [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"selectedFilterId\"\n (onValueChanged)=\"getFilterValueById($event)\"></dx-select-box>\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div class=\"mt-6\" *ngIf=\"!islayoutCreate && isEditMainLayout\">\n <ng-container\n *ngFor=\"let item of dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode;let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b \">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.nodeProperties.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n *ngIf=\"i !== dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </div>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Application Views\n </div>\n <div class=\"border-x border-b p-2\">\n <ng-container *ngFor=\"let item of allWidgetInnerContent; let i = index\">\n <div class=\"group w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.viewName}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== allWidgetInnerContent.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentViews(item)\">\n <i class=\"fa fa-eye\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentDatasets(item)\">\n <i class=\"fa fa-database\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromConfig(i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Add Filter For View\n\n </div>\n <div class=\"border-x border-b p-2\">\n <div class=\"flex flex-row py-3 border-b\">\n <dx-check-box [(ngModel)]=\"addedwidGetConfig.isWidgetFilter\"\n text=\"Popup Columns Filter Enable\"></dx-check-box>\n </div>\n <div class=\"flex flex-row my-2 border-b\">\n <ng-container *ngFor=\"let item of nodeProperticeFilters; let i = index\">\n <div class=\"flex flex-wrap border-b\">\n <div class=\"px-1 w-1/3\">\n <div class=\"text-md\">Input Type</div>\n <dx-select-box [items]=\"['text']\" [(ngModel)]=\"item.input_type\"\n value=\"text\"></dx-select-box>\n </div>\n <div class=\"px-1-1 w-2/3\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Server Column</div>\n <dx-text-box [(ngModel)]=\"item.server_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Local Column</div>\n <dx-text-box [(ngModel)]=\"item.local_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/3\" *ngIf=\"item.input_type == 'select'\">\n <div class=\"text-md\">Columns Name</div>\n <dx-text-box [(ngModel)]=\"item.select_box_option\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\">\n <div class=\"flex justify-end\">\n <div class=\"{{commonService.btn_danger_sm}} w-24 mt-6 text-center\"\n (click)=\"deleteNodeFilter(i)\">Delete Filter</div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"{{commonService.btn_primary_sm}} w-auto text-center\"\n (click)=\"getNodeProperticeFilterOption()\">Add\n Filter</div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-row justify-end items-center h-16 m-2\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div *ngIf=\"islayoutCreate\"\n class=\"{{commonService.btn_success_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addLayoutTOview()\">Add View\n </div>\n <div *ngIf=\"!islayoutCreate && !isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addWidgetTOview()\">Add Layout\n </div>\n <div *ngIf=\"!islayoutCreate && isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateLayoutWidgetTOview()\">Update Layout\n </div>\n\n </ng-container>\n\n <div class=\"{{commonService.btn_warning_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateToView()\" *ngIf=\"isUpdateWidget\">Update View\n </div>\n\n </div>\n\n\n <!-- <pre><code>{{dashBoardWidgetConfig | json}}</code></pre> -->\n </ng-container>\n <ng-container *ngIf=\"isChartButtonClick\">\n <h6\n class=\"mb-2 font-bold text-md tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-bar-chart-o mr-2\"></i> Select View\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursor-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n </h6>\n <div class=\" h-[80vh] overflow-x-auto\">\n <div class=\"relative my-2 \">\n <input type=\"text\" [(ngModel)]=\"viewToSearch\" (keyup)=\"filterViews()\" (keydown)=\"filterViews()\"\n class=\"bg-gray-800 border border-gray-700 text-gray-200 text-sm focus:ring-gray-400 focus:border-gray-500 block w-full p-4 h-8 rounded\"\n placeholder=\"Search View\" />\n <button type=\"button\" class=\"absolute inset-y-0 right-0 flex items-center pr-6\">\n <mat-icon class=\"rotate-90 cursor-pointer\" [svgIcon]=\"'heroicons_outline:search'\"></mat-icon>\n </button>\n </div>\n <ng-container *ngFor=\"let item of filteredComponentConfig\">\n <div class=\"relative group my-3 w-full\">\n <!-- Item View Name -->\n <div class=\"text-md font-bold border-b py-2 cursar-pointer\">\n {{item.viewName}}</div>\n\n <!-- Hover Buttons -->\n <div\n class=\"absolute top-0 right-0 flex space-x-2 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pb-2\">\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700\">\n <i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"\n (click)=\"editComponentViews(item)\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-green-500 hover:bg-green-700\"\n (click)=\"getComponentConfig(item)\">\n <i class=\"fa fa-plus\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"isDefaultView\">\n <ng-container *ngFor=\"let item of dashBoardWidgetConfig.widgets; let i = index\">\n <div class=\"group my-3 w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.widgetTitle}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== dashBoardWidgetConfig.widgets.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"getEditViewFromLayout(item,i)\">\n <i class=\"fa fa-pencil-square\" aria-hidden=\"true\"></i>\n\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromLayout(item,i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n\n </div>\n</div>\n<!-- </div> -->\n\n<dx-popup [(visible)]=\"isEditOptionClick\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"{{editViewdataSourceModal.viewName}}\">\n <div *dxTemplate=\"let data of 'content'\">\n\n <app-dash-chart [datasetmodal]=\"editViewdataSourceModal\" (getChartConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'chart'\"></app-dash-chart>\n <app-dash-table [datasetmodal]=\"editViewdataSourceModal\" (getTableConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'table'\"></app-dash-table>\n <!-- <app-dash-other [datasetmodal]=\"editViewdataSourceModal\" *ngIf=\"editViewdataSourceModal.viewType == 'others'\"\n (createOtherComponentView)=\"getEmitNewChartCongig($event)\"></app-dash-other> -->\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isCreateDataset\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateDatasetWithDatasetId\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\" (onHidden)=\"getDatasetPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [selectedDatasetId]=\"selectedDatasetId\" [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n<dx-popup [(visible)]=\"isCreateNewViewWithDefaultView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\"\n [width]=\"1200\" [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\"\n (onHidden)=\"getViewPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [selectedViewId]=\"selectedViewId\" [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateNewView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isAdvanceLayout\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"700\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-2/3 mb-2\">\n <div class=\"text-md mb-2\">Select Views</div>\n <dx-tag-box [dataSource]=\"componentConfigDataSource\" valueExpr=\"viewId\" displayExpr=\"viewName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedViewsIds\"\n [maxDisplayedTags]=\"3\" (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add To View\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\" (click)=\"cancelCdrConfig()\">Cancel\n </button> -->\n </div>\n </div>\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'80%'\">\n\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of advanceLayoutContainer; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\">View Name</div>\n <dx-text-box [(ngModel)]=\"item.compConfig.viewConfig[0].viewName\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Title</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Width</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"widget_width\"\n [(ngModel)]=\"item.nodeProperties.width\"></dx-select-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Height</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.height\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"item.filterId\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mt-8\">\n <dx-check-box [(ngModel)]=\"item.nodeProperties.display\" text=\"Display\"></dx-check-box>\n </div>\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteView(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 my-2 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\" (click)=\"submitAdvanceView()\">Add\n Layout</button>\n </div>\n </div>\n</dx-popup>", styles: ["::ng-deep #scrollview-demo{min-height:550px}::ng-deep #scrollview{height:auto;position:absolute;top:0;bottom:300px;padding:20px}::ng-deep #scrollview-content{white-space:pre-wrap}.scrollable-content{height:90vh;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i8.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i9.DxPopupComponent, selector: "dx-popup", inputs: ["accessKey", "animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "dragAndResizeArea", "dragEnabled", "dragOutsideBoundary", "elementAttr", "focusStateEnabled", "fullScreen", "height", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "resizeEnabled", "restorePosition", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showTitle", "tabIndex", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onResize", "onResizeEnd", "onResizeStart", "onShowing", "onShown", "onTitleRendered", "accessKeyChange", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "dragAndResizeAreaChange", "dragEnabledChange", "dragOutsideBoundaryChange", "elementAttrChange", "focusStateEnabledChange", "fullScreenChange", "heightChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "resizeEnabledChange", "restorePositionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showTitleChange", "tabIndexChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i10.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { kind: "component", type: i11.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i12.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i13.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.LoadingComponent, selector: "app-loading" }, { kind: "component", type: i17.CreateCompViewComponent, selector: "app-create-comp-view", inputs: ["kpiTreeData", "isHeader", "selectedViewId"] }, { kind: "component", type: i18.DashChartComponent, selector: "app-dash-chart", inputs: ["datasetmodal"], outputs: ["getChartConfigOutPut"] }, { kind: "component", type: i19.DashTableComponent, selector: "app-dash-table", inputs: ["datasetmodal"], outputs: ["getTableConfigOutPut"] }, { kind: "component", type: i20.CreateDatasetComponent, selector: "app-create-dataset", inputs: ["isHeader", "selectedDatasetId"] }, { kind: "component", type: i21.CommonHeaderComponent, selector: "lib-common-header", inputs: ["pageTitle"] }] });
961
950
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: PageConfigComponent, decorators: [{
962
951
  type: Component,
963
- args: [{ selector: 'app-dashbord-config', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<!-- <div class=\"flex flex-col flex-auto w-full\"> -->\n<div class=\"flex flex-row h-screen\">\n <div class=\"flex-grow border-r h-full\">\n <div class=\"scrollable-content\">\n <!-- <div class=\"flex flex-wrap p-2 border\"> -->\n <!-- <app-advance-header [filterItems]=\"filterItems\" [pageTitle]=\"'Dashboard'\" [isEditButton]=\"false\"\n [isAdvanceButton]=\"true\"></app-advance-header> -->\n <div class=\"flex flex-wrap my-3\" #dynamicContainer></div>\n\n </div>\n <div class=\"flex flex-row justify-center items-center h-16 m-2 border\">\n <lib-common-header [pageTitle]=\"''\"></lib-common-header>\n <!-- <div class=\"{{commonService.btn_success_md}} m-2 \" (click)=\"getCreateDataSetPage()\">Create\n Dataset\n </div> -->\n <div class=\"{{commonService.btn_primary_md}} m-2\" (click)=\"addWidget()\">Add Layout\n </div>\n <!-- <div class=\"{{commonService.btn_success_md}} m-2\" (click)=\"getCreateViewPage()\">Create\n View\n </div> -->\n <div class=\"{{commonService.btnOthersPurple}} m-2 cursar-pointer\" (click)=\"getViewPage()\">View Page\n </div>\n <!-- <div class=\"{{commonService.btn_warning_md}} m-2 cursar-pointer\" (click)=\"getAllPage()\">All Pages\n </div> -->\n\n </div>\n </div>\n <div class=\"flex-shrink-0 w-1/4 p-2 h-full\">\n <ng-container *ngIf=\"isDashBoardContent\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\" (click)=\"backToMainView()\">\n Back\n </div>\n <ng-container *ngFor=\"let item of page_config.api_config; let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b\">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.widGetConfig.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <!-- <button (click)=\"editSelectedWidget(item, i)\"\n class=\"w-8 h-8 bg-sky-600 hover:bg-blue-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-edit\"></i>\n </button> -->\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isWidgetCreationContent\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n <span *ngIf=\"!islayoutCreate\">Widget Settings</span>\n <span *ngIf=\"islayoutCreate\">Layout Settings</span>\n </h6>\n <div class=\"flex flex-row my-4\">\n <dx-check-box class=\"ml-auto\" [(ngModel)]=\"addedwidGetConfig.display\" text=\"Display\"></dx-check-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Width</span>\n <dx-select-box class=\"w-1/2\" [items]=\"widget_width\"\n [(ngModel)]=\"addedwidGetConfig.width\"></dx-select-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Height</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.height\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <span class=\"text-md my-auto px-2\">Widget Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetTitle\"></dx-text-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <span class=\"text-md my-auto px-2\">Widget Name</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetName\"></dx-text-box>\n </div>\n\n\n <div class=\"flex flex-row mb-5 justify-between\" *ngIf=\"islayoutCreate\">\n <span class=\"text-sm my-auto px-2\">Layout Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Filter</span>\n <dx-select-box class=\"w-1/2\" [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"selectedFilterId\"\n (onValueChanged)=\"getFilterValueById($event)\"></dx-select-box>\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div class=\"mt-6\" *ngIf=\"!islayoutCreate && isEditMainLayout\">\n <ng-container\n *ngFor=\"let item of dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode;let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b \">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.nodeProperties.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n *ngIf=\"i !== dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </div>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Application Views\n </div>\n <div class=\"border-x border-b p-2\">\n <ng-container *ngFor=\"let item of allWidgetInnerContent; let i = index\">\n <div class=\"group w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.viewName}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== allWidgetInnerContent.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentViews(item)\">\n <i class=\"fa fa-eye\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentDatasets(item)\">\n <i class=\"fa fa-database\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromConfig(i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Add Filter For View\n\n </div>\n <div class=\"border-x border-b p-2\">\n <div class=\"flex flex-row py-3 border-b\">\n <dx-check-box [(ngModel)]=\"addedwidGetConfig.isWidgetFilter\"\n text=\"Popup Columns Filter Enable\"></dx-check-box>\n </div>\n <div class=\"flex flex-row my-2 border-b\">\n <ng-container *ngFor=\"let item of nodeProperticeFilters; let i = index\">\n <div class=\"flex flex-wrap border-b\">\n <div class=\"px-1 w-1/3\">\n <div class=\"text-md\">Input Type</div>\n <dx-select-box [items]=\"['text']\" [(ngModel)]=\"item.input_type\"\n value=\"text\"></dx-select-box>\n </div>\n <div class=\"px-1-1 w-2/3\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Server Column</div>\n <dx-text-box [(ngModel)]=\"item.server_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Local Column</div>\n <dx-text-box [(ngModel)]=\"item.local_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/3\" *ngIf=\"item.input_type == 'select'\">\n <div class=\"text-md\">Columns Name</div>\n <dx-text-box [(ngModel)]=\"item.select_box_option\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\">\n <div class=\"flex justify-end\">\n <div class=\"{{commonService.btn_danger_sm}} w-24 mt-6 text-center\"\n (click)=\"deleteNodeFilter(i)\">Delete Filter</div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"{{commonService.btn_primary_sm}} w-auto text-center\"\n (click)=\"getNodeProperticeFilterOption()\">Add\n Filter</div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-row justify-end items-center h-16 m-2\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div *ngIf=\"islayoutCreate\"\n class=\"{{commonService.btn_success_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addLayoutTOview()\">Add View\n </div>\n <div *ngIf=\"!islayoutCreate && !isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addWidgetTOview()\">Add Layout\n </div>\n <div *ngIf=\"!islayoutCreate && isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateLayoutWidgetTOview()\">Update Layout\n </div>\n\n </ng-container>\n\n <div class=\"{{commonService.btn_warning_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateToView()\" *ngIf=\"isUpdateWidget\">Update View\n </div>\n\n </div>\n\n\n <!-- <pre><code>{{dashBoardWidgetConfig | json}}</code></pre> -->\n </ng-container>\n <ng-container *ngIf=\"isChartButtonClick\">\n <h6\n class=\"mb-2 font-bold text-md tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-bar-chart-o mr-2\"></i> Select View\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursor-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n </h6>\n <div class=\" h-[80vh] overflow-x-auto\">\n <div class=\"relative my-2 \">\n <input type=\"text\" [(ngModel)]=\"viewToSearch\" (keyup)=\"filterViews()\" (keydown)=\"filterViews()\"\n class=\"bg-gray-800 border border-gray-700 text-gray-200 text-sm focus:ring-gray-400 focus:border-gray-500 block w-full p-4 h-8 rounded\"\n placeholder=\"Search View\" />\n <button type=\"button\" class=\"absolute inset-y-0 right-0 flex items-center pr-6\">\n <mat-icon class=\"rotate-90 cursor-pointer\" [svgIcon]=\"'heroicons_outline:search'\"></mat-icon>\n </button>\n </div>\n <ng-container *ngFor=\"let item of filteredComponentConfig\">\n <div class=\"relative group my-3 w-full\">\n <!-- Item View Name -->\n <div class=\"text-md font-bold border-b py-2 cursar-pointer\">\n {{item.viewName}}</div>\n\n <!-- Hover Buttons -->\n <div\n class=\"absolute top-0 right-0 flex space-x-2 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pb-2\">\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700\">\n <i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"\n (click)=\"editComponentViews(item)\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-green-500 hover:bg-green-700\"\n (click)=\"getComponentConfig(item)\">\n <i class=\"fa fa-plus\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"isDefaultView\">\n <ng-container *ngFor=\"let item of dashBoardWidgetConfig.widgets; let i = index\">\n <div class=\"group my-3 w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.widgetTitle}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== dashBoardWidgetConfig.widgets.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"getEditViewFromLayout(item,i)\">\n <i class=\"fa fa-pencil-square\" aria-hidden=\"true\"></i>\n\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromLayout(item,i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n\n </div>\n</div>\n<!-- </div> -->\n\n<dx-popup [(visible)]=\"isEditOptionClick\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"{{editViewdataSourceModal.viewName}}\">\n <div *dxTemplate=\"let data of 'content'\">\n\n <app-dash-chart [datasetmodal]=\"editViewdataSourceModal\" (getChartConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'chart'\"></app-dash-chart>\n <app-dash-table [datasetmodal]=\"editViewdataSourceModal\" (getTableConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'table'\"></app-dash-table>\n <!-- <app-dash-other [datasetmodal]=\"editViewdataSourceModal\" *ngIf=\"editViewdataSourceModal.viewType == 'others'\"\n (createOtherComponentView)=\"getEmitNewChartCongig($event)\"></app-dash-other> -->\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isCreateDataset\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateDatasetWithDatasetId\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\" (onHidden)=\"getDatasetPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [selectedDatasetId]=\"selectedDatasetId\" [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n<dx-popup [(visible)]=\"isCreateNewViewWithDefaultView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\"\n [width]=\"1200\" [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\"\n (onHidden)=\"getViewPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [selectedViewId]=\"selectedViewId\" [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateNewView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isAdvanceLayout\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"700\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-2/3 mb-2\">\n <div class=\"text-md mb-2\">Select Views</div>\n <dx-tag-box [dataSource]=\"componentConfigDataSource\" valueExpr=\"viewId\" displayExpr=\"viewName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedViewsIds\"\n [maxDisplayedTags]=\"3\" (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add To View\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\" (click)=\"cancelCdrConfig()\">Cancel\n </button> -->\n </div>\n </div>\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'80%'\">\n\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of advanceLayoutContainer; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\">View Name</div>\n <dx-text-box [(ngModel)]=\"item.compConfig.viewConfig[0].viewName\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Title</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Width</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"widget_width\"\n [(ngModel)]=\"item.nodeProperties.width\"></dx-select-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Height</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.height\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"item.filterId\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mt-8\">\n <dx-check-box [(ngModel)]=\"item.nodeProperties.display\" text=\"Display\"></dx-check-box>\n </div>\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteView(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 my-2 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\" (click)=\"submitAdvanceView()\">Add\n Layout</button>\n </div>\n </div>\n</dx-popup>", styles: ["::ng-deep #scrollview-demo{min-height:550px}::ng-deep #scrollview{height:auto;position:absolute;top:0;bottom:300px;padding:20px}::ng-deep #scrollview-content{white-space:pre-wrap}.scrollable-content{height:85vh;overflow-y:auto}\n"] }]
952
+ args: [{ selector: 'app-dashbord-config', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"flex flex-row h-[90vh] w-full\">\n <div class=\"w-3/4 border-r h-full flex flex-col px-2\">\n <!-- Scrollable content -->\n <div class=\"flex-grow overflow-y-auto\">\n <div class=\"flex flex-wrap my-3\" #dynamicContainer></div>\n </div>\n\n <!-- Fixed bottom section -->\n <div class=\"flex flex-row justify-center items-center h-16 m-2 border shrink-0\">\n <lib-common-header [pageTitle]=\"''\"></lib-common-header>\n <div class=\"{{commonService.btn_primary_md}} m-2\" (click)=\"addWidget()\">Add Layout</div>\n <div class=\"{{commonService.btnOthersPurple}} m-2 cursor-pointer\" (click)=\"getViewPage()\">View Page</div>\n </div>\n </div>\n <div class=\"w-1/4 p-2 h-full\">\n <ng-container *ngIf=\"isDashBoardContent\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\" (click)=\"backToMainView()\">\n Back\n </div>\n <ng-container *ngFor=\"let item of page_config.api_config; let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b\">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.widGetConfig.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <!-- <button (click)=\"editSelectedWidget(item, i)\"\n class=\"w-8 h-8 bg-sky-600 hover:bg-blue-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-edit\"></i>\n </button> -->\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isWidgetCreationContent\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n <span *ngIf=\"!islayoutCreate\">Widget Settings</span>\n <span *ngIf=\"islayoutCreate\">Layout Settings</span>\n </h6>\n <div class=\"flex flex-row my-4\">\n <dx-check-box class=\"ml-auto\" [(ngModel)]=\"addedwidGetConfig.display\" text=\"Display\"></dx-check-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Width</span>\n <dx-select-box class=\"w-1/2\" [items]=\"widget_width\"\n [(ngModel)]=\"addedwidGetConfig.width\"></dx-select-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Height</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.height\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <div class=\"text-md my-auto px-2\">Widget Title</div>\n <div><dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetTitle\"></dx-text-box></div>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <span class=\"text-md my-auto px-2\">Widget Name</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetName\"></dx-text-box>\n </div>\n\n\n <div class=\"flex flex-row mb-5 justify-between\" *ngIf=\"islayoutCreate\">\n <span class=\"text-sm my-auto px-2\">Layout Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Filter</span>\n <dx-select-box class=\"w-1/2\" [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"selectedFilterId\"\n (onValueChanged)=\"getFilterValueById($event)\"></dx-select-box>\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div class=\"mt-6\" *ngIf=\"!islayoutCreate && isEditMainLayout\">\n <ng-container\n *ngFor=\"let item of dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode;let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b \">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.nodeProperties.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n *ngIf=\"i !== dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </div>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Application Views\n </div>\n <div class=\"border-x border-b p-2\">\n <ng-container *ngFor=\"let item of allWidgetInnerContent; let i = index\">\n <div class=\"group w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.viewName}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== allWidgetInnerContent.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentViews(item)\">\n <i class=\"fa fa-eye\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentDatasets(item)\">\n <i class=\"fa fa-database\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromConfig(i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Add Filter For View\n\n </div>\n <div class=\"border-x border-b p-2\">\n <div class=\"flex flex-row py-3 border-b\">\n <dx-check-box [(ngModel)]=\"addedwidGetConfig.isWidgetFilter\"\n text=\"Popup Columns Filter Enable\"></dx-check-box>\n </div>\n <div class=\"flex flex-row my-2 border-b\">\n <ng-container *ngFor=\"let item of nodeProperticeFilters; let i = index\">\n <div class=\"flex flex-wrap border-b\">\n <div class=\"px-1 w-1/3\">\n <div class=\"text-md\">Input Type</div>\n <dx-select-box [items]=\"['text']\" [(ngModel)]=\"item.input_type\"\n value=\"text\"></dx-select-box>\n </div>\n <div class=\"px-1-1 w-2/3\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Server Column</div>\n <dx-text-box [(ngModel)]=\"item.server_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Local Column</div>\n <dx-text-box [(ngModel)]=\"item.local_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/3\" *ngIf=\"item.input_type == 'select'\">\n <div class=\"text-md\">Columns Name</div>\n <dx-text-box [(ngModel)]=\"item.select_box_option\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\">\n <div class=\"flex justify-end\">\n <div class=\"{{commonService.btn_danger_sm}} w-24 mt-6 text-center\"\n (click)=\"deleteNodeFilter(i)\">Delete Filter</div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"{{commonService.btn_primary_sm}} w-auto text-center\"\n (click)=\"getNodeProperticeFilterOption()\">Add\n Filter</div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-row justify-end items-center h-16 m-2\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div *ngIf=\"islayoutCreate\"\n class=\"{{commonService.btn_success_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addLayoutTOview()\">Add View\n </div>\n <div *ngIf=\"!islayoutCreate && !isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addWidgetTOview()\">Add Layout\n </div>\n <div *ngIf=\"!islayoutCreate && isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateLayoutWidgetTOview()\">Update Layout\n </div>\n\n </ng-container>\n\n <div class=\"{{commonService.btn_warning_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateToView()\" *ngIf=\"isUpdateWidget\">Update View\n </div>\n\n </div>\n\n\n <!-- <pre><code>{{dashBoardWidgetConfig | json}}</code></pre> -->\n </ng-container>\n <ng-container *ngIf=\"isChartButtonClick\">\n <h6\n class=\"mb-2 font-bold text-md tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-bar-chart-o mr-2\"></i> Select View\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursor-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n </h6>\n <div class=\" h-[80vh] overflow-x-auto\">\n <div class=\"relative my-2 \">\n <input type=\"text\" [(ngModel)]=\"viewToSearch\" (keyup)=\"filterViews()\" (keydown)=\"filterViews()\"\n class=\"bg-gray-800 border border-gray-700 text-gray-200 text-sm focus:ring-gray-400 focus:border-gray-500 block w-full p-4 h-8 rounded\"\n placeholder=\"Search View\" />\n <button type=\"button\" class=\"absolute inset-y-0 right-0 flex items-center pr-6\">\n <mat-icon class=\"rotate-90 cursor-pointer\" [svgIcon]=\"'heroicons_outline:search'\"></mat-icon>\n </button>\n </div>\n <ng-container *ngFor=\"let item of filteredComponentConfig\">\n <div class=\"relative group my-3 w-full\">\n <!-- Item View Name -->\n <div class=\"text-md font-bold border-b py-2 cursar-pointer\">\n {{item.viewName}}</div>\n\n <!-- Hover Buttons -->\n <div\n class=\"absolute top-0 right-0 flex space-x-2 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pb-2\">\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700\">\n <i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"\n (click)=\"editComponentViews(item)\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-green-500 hover:bg-green-700\"\n (click)=\"getComponentConfig(item)\">\n <i class=\"fa fa-plus\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"isDefaultView\">\n <ng-container *ngFor=\"let item of dashBoardWidgetConfig.widgets; let i = index\">\n <div class=\"group my-3 w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.widgetTitle}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== dashBoardWidgetConfig.widgets.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"getEditViewFromLayout(item,i)\">\n <i class=\"fa fa-pencil-square\" aria-hidden=\"true\"></i>\n\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromLayout(item,i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n\n </div>\n</div>\n<!-- </div> -->\n\n<dx-popup [(visible)]=\"isEditOptionClick\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"{{editViewdataSourceModal.viewName}}\">\n <div *dxTemplate=\"let data of 'content'\">\n\n <app-dash-chart [datasetmodal]=\"editViewdataSourceModal\" (getChartConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'chart'\"></app-dash-chart>\n <app-dash-table [datasetmodal]=\"editViewdataSourceModal\" (getTableConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'table'\"></app-dash-table>\n <!-- <app-dash-other [datasetmodal]=\"editViewdataSourceModal\" *ngIf=\"editViewdataSourceModal.viewType == 'others'\"\n (createOtherComponentView)=\"getEmitNewChartCongig($event)\"></app-dash-other> -->\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isCreateDataset\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateDatasetWithDatasetId\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\" (onHidden)=\"getDatasetPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [selectedDatasetId]=\"selectedDatasetId\" [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n<dx-popup [(visible)]=\"isCreateNewViewWithDefaultView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\"\n [width]=\"1200\" [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\"\n (onHidden)=\"getViewPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [selectedViewId]=\"selectedViewId\" [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateNewView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isAdvanceLayout\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"700\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-2/3 mb-2\">\n <div class=\"text-md mb-2\">Select Views</div>\n <dx-tag-box [dataSource]=\"componentConfigDataSource\" valueExpr=\"viewId\" displayExpr=\"viewName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedViewsIds\"\n [maxDisplayedTags]=\"3\" (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add To View\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\" (click)=\"cancelCdrConfig()\">Cancel\n </button> -->\n </div>\n </div>\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'80%'\">\n\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of advanceLayoutContainer; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\">View Name</div>\n <dx-text-box [(ngModel)]=\"item.compConfig.viewConfig[0].viewName\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Title</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Width</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"widget_width\"\n [(ngModel)]=\"item.nodeProperties.width\"></dx-select-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Height</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.height\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"item.filterId\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mt-8\">\n <dx-check-box [(ngModel)]=\"item.nodeProperties.display\" text=\"Display\"></dx-check-box>\n </div>\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteView(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 my-2 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\" (click)=\"submitAdvanceView()\">Add\n Layout</button>\n </div>\n </div>\n</dx-popup>", styles: ["::ng-deep #scrollview-demo{min-height:550px}::ng-deep #scrollview{height:auto;position:absolute;top:0;bottom:300px;padding:20px}::ng-deep #scrollview-content{white-space:pre-wrap}.scrollable-content{height:90vh;overflow-y:auto}\n"] }]
964
953
  }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ActivatedRoute }, { type: i0.ViewContainerRef }, { type: i0.ComponentFactoryResolver }, { type: i3.ApplicationContentService }, { type: i4.ToastrService }, { type: i2.Router }, { type: i5.ApplicationDatssetsCall }]; }, propDecorators: { dynamicComponentContainer: [{
965
954
  type: ViewChild,
966
955
  args: ['dynamicComponentContainer', { read: ViewContainerRef }]
@@ -974,4 +963,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
974
963
  type: ViewChild,
975
964
  args: [DxScrollViewComponent, { static: false }]
976
965
  }] } });
977
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3BhZ2UtY29udHJvbGxlci9wYWdlLWNvbmZpZy9wYWdlLWNvbmZpZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvcGFnZS1jb250cm9sbGVyL3BhZ2UtY29uZmlnL3BhZ2UtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFrRyxTQUFTLEVBQWdCLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSXBNLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRCxPQUFPLE1BQU0sTUFBTSx1QkFBdUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxRkFBcUYsQ0FBQztBQUNsSSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5RUFBeUUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxtR0FBbUcsQ0FBQztBQUN0SixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyRkFBMkYsQ0FBQztBQUMxSSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxxR0FBcUcsQ0FBQztBQUN6SixPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxxR0FBcUcsQ0FBQztBQUV6SixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxtRkFBbUYsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFP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dG9yeVJlc29sdmVyLCBDb21wb25lbnRSZWYsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95LCBPbkluaXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRXh0cmFzLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNvbmZpcm0gfSBmcm9tICdkZXZleHRyZW1lL3VpL2RpYWxvZyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IER4U2Nyb2xsVmlld0NvbXBvbmVudCB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhcic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkRhdHNzZXRzQ2FsbCB9IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWRhdGFzZXQtY2FsbC5zZXJ2aWNlJztcbmltcG9ydCBtb21lbnQgZnJvbSAnLi8uLi8uLi9tb21lbnQtaGVscGVyJztcbmltcG9ydCB7IEdhbW1hVG9kYXlQcmV2aW91c0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtdG9kYXktcHJldmlvdXMvZ2FtbWEtdG9kYXktcHJldmlvdXMuY29tcG9uZW50JztcbmltcG9ydCB7IEFwcEFkdmFuY2VIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2FwcC1hZHZhbmNlLWhlYWRlci9hcHAtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYVRhYmxlV2l0aFBlcmNlbnRhZ2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS9nYW1tYS10YWJsZS13aXRoLXBlcmNlbnRhZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IEdhbW1TaW5nbGVOdW1iZXJDYXJkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tLXNpbmdsZS1udW1iZXItY2FyZC9nYW1tLXNpbmdsZS1udW1iZXItY2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFBZHZhbmNlT3BlcmF0b3JUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtYWR2YW5jZS1vcGVyYXRvci10YWJsZS9nYW1tYS1hZHZhbmNlLW9wZXJhdG9yLXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBZHZhbmNlV2lkZ2V0SGVhZGVyRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9hZHZhbmNlLXdpZGdldC1oZWFkZXItZmlsdGVyL2FkdmFuY2Utd2lkZ2V0LWhlYWRlci1maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgR2FtbWFBZHZhbmNlQ2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWFkdmFuY2UtY2hhcnQvZ2FtbWEtYWR2YW5jZS1jaGFydC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGFzaGJvcmQtY29uZmlnJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2UtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnZS1jb25maWcuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBQYWdlQ29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBkYXNoYm9yZF9jb250YWluZXI6IGFueSA9IFtdO1xuICBzZWxlY3RlZF93aWR0aDogYW55O1xuICB3aWRnZXRfd2lkdGggPSBbJ3ctZnVsbCcsICd3LTEvMicsICd3LTEvMycsICd3LTIvMycsICd3LTEvNCcsICd3LTMvNCcsICd3LTEvNScsICd3LTQvNScsICd3LTEvNicsICd3LTUvNiddXG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbiA9IHRydWU7XG4gIGN1c3RvbWVyczogYW55O1xuICBwYWdlSGVhZGVyc0RhdGE6IGFueTtcbiAgcGFnZV90aXRsZSA9ICdEYXNoYm9hcmQnO1xuICBpc1NydlR5cGVPcGVyYXRvcjogYm9vbGVhbjtcbiAgZGVmYXVsdFN0YXJ0RGF0ZTtcbiAgZGVmYXVsdEVuZERhdGU7XG4gIHBhZ2VfY29uZmlnO1xuICBvcGVyYXRpb25MZXZlbHM6IGFueTtcbiAgZmlsdGVyX3ZhbHVlO1xuICBpc1RvZ2dsZVN3aWNoOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNEYXRlUGlja2VyOiBib29sZWFuID0gZmFsc2U7XG4gIGlzVG9nZ2xlRXZlbnRTdGF0dXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNFZGl0Q2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNDb25maWdWaWV3OiBib29sZWFuO1xuICBpc0xvYWRlcjogYm9vbGVhbjtcbiAgY29tcG9uZW50TmFtZTogYW55O1xuICBpc1VwZGF0ZVdpZGdldDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGlzQ2hhcnRCdXR0b25DbGljazogYm9vbGVhbjtcbiAgY2hhcnRBY2Nlc3M6IGFueTtcbiAgY2hhcnRUeXBlOiBhbnk7XG4gIGRhc2hDaGFydENvbVNvdXJjZTogYW55O1xuICBpc0dlbmVyYXRlOiBib29sZWFuXG4gIGlzRmlsdGVySW5wdXRzOiBib29sZWFuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cblxuICBAVmlld0NoaWxkKCdkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGR5bmFtaWNDb21wb25lbnRDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBjb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2R5bmFtaWNDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBkeW5hbWljQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIGR5bmFtaWNDb21wb25lbnRSZWZzOiBDb21wb25lbnRSZWY8YW55PltdID0gW107XG4gIC8vIGR5bmFtaWNDb21wb25lbnRSZWZzOiBDb21wb25lbnRSZWY8YW55PltdID0gW107XG5cbiAgQ29tcFJlZnM6IENvbXBvbmVudFJlZjxhbnk+O1xuXG4gIGNvbXBvbmVudENsYXNzTWFwID0ge1xuICAgIEdhbW1hQWR2YW5jZUNoYXJ0Q29tcG9uZW50LFxuICAgIEdhbW1hVG9kYXlQcmV2aW91c0NvbXBvbmVudCxcbiAgICBBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50LFxuICAgIEdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudCxcbiAgICBHYW1tU2luZ2xlTnVtYmVyQ2FyZENvbXBvbmVudCxcbiAgICBHYW1tYUFkdmFuY2VPcGVyYXRvclRhYmxlQ29tcG9uZW50LFxuICAgIEFkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnRcbiAgfTtcbiAgZGF0YVNvdXJjZU1hdGFEYXRhOiBhbnkgPSBbXTtcbiAgcXVlcnlUeXBlID0gXCJtb25nb1wiO1xuICBkYXRhU2V0TW9kYWw6IGFueSA9IFtdO1xuICBjb21wb25lbnRDb25maWdEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgc2VsZXNjZWREYXRhU291cmNlOiBhbnk7XG4gIGRhdGFTb3VyY2VNb2RhbDogYW55ID0ge307XG4gIGlzRGFzaEJvYXJkQ29udGVudDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNlbGVjdGVkVmlld0Zvcm1Db21wb25lbnQ6IGFueSA9IHt9O1xuICBhZGRlZHdpZEdldENvbmZpZyA9IHtcbiAgICBcImRpc3BsYXlcIjogdHJ1ZSxcbiAgICBcIndpZGdldFRpdGxlXCI6IFwiXCIsXG4gICAgXCJ3aWR0aFwiOiBcIlwiLFxuICAgIFwiaGVpZ2h0XCI6IFwiXCIsXG4gICAgXCJpc1dpZGdldEZpbHRlclwiOiBmYWxzZVxuICB9XG5cbiAgZGFzaEJvYXJkV2lkZ2V0Q29uZmlnOiBhbnkgPSBbXG4gIF07XG4gIGlzV2lkZ2V0Q3JlYXRpb25Db250ZW50OiBib29sZWFuO1xuICBzZWxlY3RlZFdpZHRoOiBhbnk7XG4gIHNlbGVjdGVkSGVpZ2h0OiBhbnk7XG4gIG5ld1dpZGdldEluZGV4OiBhbnk7XG4gIHNlbGVjdGVkSW5kZXhPYmpGb3JDaGFydDogYW55ID0ge307XG4gIHNlbGVjdGVkQ29udGFpbmVyT2JqZWN0Rm9yQ2hhcnQ6IGFueSA9IHt9O1xuICBkYXRhU2V0dGFibGVEYXRhU291cmNlOiBhbnk7XG4gIHVuaXF1ZURhdGFTZXRPYmplY3QgPSB7fTtcblxuICBpc0Rhc2hCb2FyZENvbnRlbnRUeXBlVmlldzogYm9vbGVhbjtcbiAgcGFnZUlkOiBhbnk7XG4gIGlzbGF5b3V0Q3JlYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIHdpZGdldE5hbWU6IGFueTtcbiAgd2lkZ2V0VGl0bGU6IGFueTtcbiAgYWxsV2lkZ2V0SW5uZXJDb250ZW50OiBhbnk7XG4gIGlzRGVmYXVsdFZpZXc6IEJvb2xlYW4gPSB0cnVlO1xuICBpc0VkaXRNYWluTGF5b3V0OiBCb29sZWFuO1xuICBmaWx0ZXJEYXRhU291cmNlOiBhbnk7XG4gIHNlbGVjdGVkRmlsdGVySWQ6IGFueTtcblxuICB2aWV3VG9TZWFyY2g6IHN0cmluZyA9ICcnO1xuICBmaWx0ZXJlZENvbXBvbmVudENvbmZpZzogYW55W10gPSBbXTtcbiAgaXNFZGl0T3B0aW9uQ2xpY2s6IGJvb2xlYW47XG4gIGVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsOiBhbnkgPSB7fTtcblxuICBlZGl0SXRlbUZvclVwZGF0ZTogYW55ID0ge307XG4gIHBhZ2VUaXRsZTogYW55O1xuICBwYWdlVXJsOiBhbnk7XG4gIGFsbFdpZGdldEJ5RGF0YXNldDogYW55ID0gW107XG5cbiAgc2VsZWN0ZWRGaWx0ZXJzRGVmYXVsdDogYW55O1xuXG4gIG5vZGVQcm9wZXJ0aWNlRmlsdGVyczogYW55ID0gW107XG5cbiAgaXNDcmVhdGVEYXRhc2V0OiBib29sZWFuO1xuICBzZWxlY3RlZERhdGFzZXRJZDogYW55O1xuICBpc0NyZWF0ZURhdGFzZXRXaXRoRGF0YXNldElkOiBib29sZWFuO1xuXG4gIGlzQ3JlYXRlTmV3VmlldzogYm9vbGVhbjtcbiAgaXNDcmVhdGVOZXdWaWV3V2l0aERlZmF1bHRWaWV3OiBib29sZWFuO1xuXG4gIGRlZmF1bHRBcHBseWVkRmlsdGVyOiBhbnk7XG4gIGlzV2lkZ2V0RmlsdGVyczogYm9vbGVhbjtcbiAgbm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlOiBhbnk7XG4gIHNlbGVjdGVkRmlsdGVyRGF0YXNvdXJjZTogYW55ID0ge307XG4gIEBWaWV3Q2hpbGQoRHhTY3JvbGxWaWV3Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgc2Nyb2xsVmlldzogRHhTY3JvbGxWaWV3Q29tcG9uZW50O1xuXG4gIHNlbGVjdGVkVmlld0lkOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBkYXRhc2V0U2VydmljZTogQXBwbGljYXRpb25EYXRzc2V0c0NhbGwsXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0Rhc2hCb2FyZENvbnRlbnRUeXBlVmlldyA9ICh0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zWydjb250ZW50VHlwZSddID09ICd2aWV3JykgPyB0cnVlIDogZmFsc2U7XG4gICAgdGhpcy5wYWdlSWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zWydwYWdlSWQnXTtcblxuICAgIHRoaXMuZ2V0RGF0YVNldCgpO1xuICAgIHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSA9IG1vbWVudCgpLnN1YnRyYWN0KCcxMCcsICdkYXlzJykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgdGhpcy5kZWZhdWx0RW5kRGF0ZSA9IG1vbWVudCgpLnN1YnRyYWN0KCcxJywgJ2RheXMnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICB0aGlzLmdldEZpbHRlckl0ZW1zKClcbiAgICB0aGlzLmdldEFsbFZpZXdzSXRlbXMoKVxuXG4gICAgdGhpcy5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKVxuICB9XG5cbiAgZ2V0QWxsVmlld3NJdGVtcygpIHtcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwVmlld0NvbmZpZ3MoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2UgPSBkYXRhO1xuICAgICAgICB0aGlzLmZpbHRlcmVkQ29tcG9uZW50Q29uZmlnID0gdGhpcy5jb21wb25lbnRDb25maWdEYXRhU291cmNlO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1ZpZXcgQ29uZmlnJyk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGdldEZpbHRlckl0ZW1zKCkge1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBGaWx0ZXJDb25maWdzKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJEYXRhU291cmNlID0gZGF0YTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdFcnJvcicpO1xuXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZ2V0QXBwUGFnZURldGFpbENvbmZpZ0J5UGFnZUlkKCkge1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnKHRoaXMucGFnZUlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZyA9IGRhdGE7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlID0gZGF0YS5wYWdlTmFtZTtcbiAgICAgICAgdGhpcy5wYWdlVXJsID0gZGF0YS5wYWdlVXJsO1xuICAgICAgICBpZiAoZGF0YS53aWRnZXRzICYmIGRhdGEud2lkZ2V0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICB0aGlzLmdldENvbXBvbmVudENvbmZpZ1NldCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdFcnJvcicpO1xuXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cbiAgZ2V0Q29tcG9uZW50Q29uZmlnU2V0KCkge1xuICAgIGxldCBkZWZhdWx0RmlsdGVycyA9IHsgb3BlcmF0aW9uRmlsdGVyOiB7IHN0YXJ0RGF0ZTogXCJcIiwgZW5kRGF0ZTogXCJcIiB9IH07XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKHdpZGdldCA9PiB7XG4gICAgICBpZiAod2lkZ2V0LmZpbHRlcnMpIHtcbiAgICAgICAgd2lkZ2V0LmZpbHRlcnMuZmlsdGVySXRlbXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICBpZiAoZWxlbWVudC5maWx0ZXJUeXBlID09PSAnZGF0ZScgfHwgZWxlbWVudC5maWx0ZXJUeXBlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kZWZhdWx0RmlsdGVyVHlwZSA9PT0gXCJkeW5hbWljXCIgJiYgZWxlbWVudC5tb21lbnRGdW5jdGlvbiAhPT0gXCJcIiAmJiBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZSAhPT0gXCJcIiAmJiBlbGVtZW50Lm1vbWVudEZvcm1hdCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICBsZXQgW2NvdW50LCB1bml0XSA9IGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLmVuZERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRFbmREYXRlID0gbW9tZW50KClbZWxlbWVudC5tb21lbnRGdW5jdGlvbl0ocGFyc2VJbnQoY291bnQpLCB1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcInN0YXJ0RGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLnN0YXJ0RGF0ZSA9IG1vbWVudCgpW2VsZW1lbnQubW9tZW50RnVuY3Rpb25dKHBhcnNlSW50KGNvdW50KSwgdW5pdCkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICh0eXBlb2YgZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUgIT09IFwiXCIpIHx8XG4gICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKSAmJiBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50Lm9wZXJhdG9yTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlcltlbGVtZW50Lm9wZXJhdG9yTmFtZV0gPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgPyBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZVxuICAgICAgICAgICAgICAgICAgOiBbZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWVdO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlcltlbGVtZW50LmFwaU5hbWVdID0gZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUuam9pbihcIixcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICB0aGlzLmRlZmF1bHRBcHBseWVkRmlsdGVyID0gZGVmYXVsdEZpbHRlcnM7XG5cbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICAvLyB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgIHRoaXMuY3JlYXRlRGl2RWxlbWVudHModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXG4gIH1cblxuICBnZXREYXRhU2V0KCkge1xuICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBEYXRhc2V0Q29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YVNldHRhYmxlRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdEYXRhc2V0IENyZWF0aW9uJylcblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cblxuICBnZXRDb21wb25lbnRDb25maWcoZXZlbnQpIHtcbiAgICBjb25zdCBmb3VuZE9iamVjdCA9IHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZS5maW5kKHZpZXcgPT4gdmlldy52aWV3SWQgPT09IGV2ZW50LnZpZXdJZCk7XG4gICAgdGhpcy5nZXRFbWl0TmV3Q2hhcnRDb25maWcoZm91bmRPYmplY3QpO1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgfVxuXG4gIGFkZE5ld2NoYXJ0KCkge1xuICAgIHRoaXMuaXNHZW5lcmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gZmFsc2U7XG4gIH1cblxuXG4gIGFkZFdpZGdldCgpIHtcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSB0cnVlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IGZhbHNlO1xuICAgIHRoaXMuaXNFZGl0TWFpbkxheW91dCA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IGZhbHNlO1xuICAgIHRoaXMud2lkZ2V0TmFtZSA9ICcnO1xuICAgIHRoaXMud2lkZ2V0VGl0bGUgPSAnJztcbiAgICB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnID0ge1xuICAgICAgXCJkaXNwbGF5XCI6IHRydWUsXG4gICAgICBcIndpZGdldFRpdGxlXCI6IFwiXCIsXG4gICAgICBcIndpZHRoXCI6IFwiXCIsXG4gICAgICBcImhlaWdodFwiOiBcIlwiLFxuICAgICAgXCJpc1dpZGdldEZpbHRlclwiOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGdldFdpdGgoZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRXaWR0aCA9IGUudmFsdWU7XG4gIH1cblxuICBnZXRIZWlnaHQoZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRIZWlnaHQgPSBlLnZhbHVlO1xuICB9XG5cbiAgYWRkTGF5b3V0VE92aWV3KCkge1xuICAgIGxldCBpbm5lcl9ub2RlID0ge1xuICAgICAgaWQ6IHRoaXMuY29tbW9uU2VydmljZS5wcmltZXJ5UmVuZG9tZUlkKDUpLFxuICAgICAgbm9kZVRpdGxlOiBcIlwiLFxuICAgICAgZmlsdGVySWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJJZCxcbiAgICAgIG5vZGVQcm9wZXJ0aWVzOiB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnLFxuICAgICAgY29tcENvbmZpZzoge1xuICAgICAgICBkeW5hbWljQ29tcG9uZW50UmVmczogW10sXG4gICAgICAgIHZpZXdDb25maWc6IFtdXG4gICAgICB9LFxuICAgIH1cbiAgICBpZiAodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlKSB7XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUucHVzaChpbm5lcl9ub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlID0gW107XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUucHVzaChpbm5lcl9ub2RlKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVXaWRnZXQoKTtcbiAgfVxuXG5cblxuICByZWZvcm1hdFdpZGdldENvbmZpZyhkYXNoQm9hcmRXaWRnZXRDb25maWcsIGluZGV4ID0gbnVsbCkge1xuICAgIGNvbnN0IHByb2Nlc3NXaWRnZXQgPSAod2lkZ2V0KSA9PiB7XG4gICAgICB3aWRnZXQuY29tcENvbmZpZy52aWV3Q29uZmlnID0gd2lkZ2V0LmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgd2lkZ2V0LmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcblxuICAgICAgaWYgKHdpZGdldC53aWRnZXROb2RlICYmIHdpZGdldC53aWRnZXROb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd2lkZ2V0LndpZGdldE5vZGUuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZyA9IG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLm1hcChjb25maWcgPT4gY29uZmlnLnZpZXdJZCk7XG4gICAgICAgICAgbm9kZS5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzID0gW107XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoaW5kZXggIT09IG51bGwgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmxlbmd0aCkge1xuICAgICAgcHJvY2Vzc1dpZGdldChkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tpbmRleF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKHdpZGdldCA9PiBwcm9jZXNzV2lkZ2V0KHdpZGdldCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tpbmRleF07XG4gIH1cblxuICB1cGRhdGVXaWRnZXQoKSB7XG4gICAgbGV0IG1vZGlmaWVkQ29uZmlnID0gdGhpcy5yZWZvcm1hdFdpZGdldENvbmZpZyh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZywgdGhpcy5uZXdXaWRnZXRJbmRleCk7XG4gICAgbW9kaWZpZWRDb25maWdbJ2ZpbHRlcklkJ10gPSAobW9kaWZpZWRDb25maWcuZmlsdGVycy5maWx0ZXJJZCkgPyBtb2RpZmllZENvbmZpZy5maWx0ZXJzLmZpbHRlcklkIDogbnVsbDtcbiAgICBkZWxldGUgbW9kaWZpZWRDb25maWdbJ2ZpbHRlcnMnXTtcbiAgICB0aGlzLnNlcnZpY2UuZWRpdEFwcFdpZGdldENvbmZpZyhtb2RpZmllZENvbmZpZykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKVxuICAgICAgICB0aGlzLmJhY2tUb01haW5WaWV3KCk7XG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnV2lkZ2V0IENyZWF0aW9uJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IGZhbHNlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IHRydWU7XG4gIH1cblxuICB1cGRhdGVMYXlvdXRXaWRnZXRUT3ZpZXcoKSB7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMudXBkYXRlV2lkZ2V0KCk7XG4gIH1cblxuICBhZGRXaWRnZXRUT3ZpZXcoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIHdpZGdldElkOiB0aGlzLmNvbW1vblNlcnZpY2UucHJpbWVyeVJlbmRvbWVJZCg1KSxcbiAgICAgIHdpZGdldE5hbWU6IHRoaXMud2lkZ2V0TmFtZSxcbiAgICAgIHdpZGdldFRpdGxlOiB0aGlzLndpZGdldFRpdGxlLFxuICAgICAgd2lkZ2V0UHJvcGVydGllczogdGhpcy5hZGRlZHdpZEdldENvbmZpZyxcbiAgICAgIHBhZ2VJZDogdGhpcy5wYWdlSWQsXG4gICAgICBmaWx0ZXJJZDogdGhpcy5zZWxlY3RlZEZpbHRlcklkLFxuICAgICAgd2lkZ2V0Tm9kZTogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IHRoaXMuY29tbW9uU2VydmljZS5wcmltZXJ5UmVuZG9tZUlkKDUpLFxuICAgICAgICAgIG5vZGVUaXRsZTogXCJcIixcbiAgICAgICAgICBmaWx0ZXJJZDogXCJcIixcbiAgICAgICAgICBub2RlUHJvcGVydGllczoge1xuICAgICAgICAgICAgXCJkaXNwbGF5XCI6IHRydWUsXG4gICAgICAgICAgICBcIndpZGdldFRpdGxlXCI6IFwiXCIsXG4gICAgICAgICAgICBcIndpZHRoXCI6IFwidy0xLzJcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0XCI6IFwiXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21wQ29uZmlnOiB7XG4gICAgICAgICAgICBkeW5hbWljQ29tcG9uZW50UmVmczogW10sXG4gICAgICAgICAgICB2aWV3Q29uZmlnOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGNvbXBDb25maWc6IHtcbiAgICAgICAgZHluYW1pY0NvbXBvbmVudFJlZnM6IFtdLFxuICAgICAgICB2aWV3Q29uZmlnOiBbXVxuICAgICAgfSxcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS5jcmVhdGVBcHBXaWRnZXRDb25maWcob2JqKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICAvLyB0aGlzLmNyZWF0ZURpdkVsZW1lbnRzKHRoaXMudW5pcXVlRGF0YVNldE9iamVjdClcbiAgICAgICAgdGhpcy5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKVxuXG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdXaWRnZXQgQ3JlYXRpb24nKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5wdXNoKG9iailcbiAgICAvLyB0aGlzLmluc2VydER5bmFtaWNDb21wb25lbnRzKCk7XG5cblxuICAgIHRoaXMuZHluYW1pY0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9ICcnO1xuXG4gICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IGZhbHNlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IHRydWU7XG4gIH1cblxuICBpbnNlcnROZXdXaWdldChpbmRleCkge1xuICAgIHRoaXMuYWRkZWR3aWRHZXRDb25maWcgPSB7XG4gICAgICBcImRpc3BsYXlcIjogdHJ1ZSxcbiAgICAgIFwid2lkZ2V0VGl0bGVcIjogXCJcIixcbiAgICAgIFwid2lkdGhcIjogXCJcIixcbiAgICAgIFwiaGVpZ2h0XCI6IFwiXCIsXG4gICAgICBcImlzV2lkZ2V0RmlsdGVyXCI6IGZhbHNlXG4gICAgfVxuICAgIHRoaXMuaXNVcGRhdGVXaWRnZXQgPSBmYWxzZTtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gdHJ1ZTtcbiAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaXNsYXlvdXRDcmVhdGUgPSB0cnVlO1xuICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSBpbmRleDtcbiAgfVxuICBpbnNlcnRDaGFydFdpZ2V0KGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50KSB7XG5cbiAgICB0aGlzLmlzR2VuZXJhdGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IHRydWU7XG4gICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IGZhbHNlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRDb250YWluZXJPYmplY3RGb3JDaGFydCA9IGNvbnRhaW5lckVsZW1lbnQ7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4T2JqRm9yQ2hhcnQgPSBpbmRleE9iajtcbiAgICB0aGlzLnNlbGVjdGVkVmlld0Zvcm1Db21wb25lbnQgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIGdldEVtaXROZXdDaGFydENvbmZpZyhkYXRhKSB7XG4gICAgLy8gbGV0IGRhdGFzZXRfY29uZmlnID0gdGhpcy5kYXRhU2V0TW9kYWwuZmluZChkYXRhc2V0ID0+IGRhdGFzZXQuZGF0YXNldElkID09IGRhdGEuZGF0YXNldElkKTtcbiAgICAvLyBhd2FpdCB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChkYXRhc2V0X2NvbmZpZywgZGF0YXNldF9jb25maWcuZGF0YXNldElkLCB0aGlzLnNlbGVjdGVkRmlsdGVyc0RlZmF1bHQpXG4gICAgLy8gZGF0YS5rcGlDb25maWdbJ2RhdGFTb3VyY2UnXSA9IHRoaXMudW5pcXVlRGF0YVNldE9iamVjdFtkYXRhc2V0X2NvbmZpZy5kYXRhc2V0SWRdO1xuICAgIHRoaXMuc2VsZWN0ZWRJbmRleE9iakZvckNoYXJ0LmNvbXBDb25maWcudmlld0NvbmZpZy5wdXNoKGRhdGEpXG4gICAgdGhpcy5sb2FkRHluYW1pY0NvbXBvbmVudChkYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXhPYmpGb3JDaGFydCwgdGhpcy5zZWxlY3RlZENvbnRhaW5lck9iamVjdEZvckNoYXJ0KTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZylcbiAgICB0aGlzLnVwZGF0ZVdpZGdldCgpO1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2sgPSBmYWxzZTtcblxuICAgIC8vIH1cblxuICB9XG5cbiAgdXBkYXRlVG9WaWV3KCkge1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnVwZGF0ZVdpZGdldCgpO1xuICB9XG5cbiAgZGVsZXRlV2lkZ2V0KGl0ZW0sIGluZGV4KSB7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlbGV0ZUluc2VydFdpZGdldChpdGVtLCBjaGlsZEluZGV4LCBwYXJlbnRJbmRleCkge1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbcGFyZW50SW5kZXhdLndpZGdldE5vZGUuc3BsaWNlKGNoaWxkSW5kZXgsIDEpXG4gICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFdpZGdldFRpdGxlRGl2KGl0ZW0sIGRpdikge1xuICAgIGNvbnN0IHdpZGdldERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdpZGdldERpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicsICdqdXN0aWZ5LWJldHdlZW4nLCAnZm9udC1ib2xkJywgJ3RleHQtbWQnLCAndGV4dC1ncmF5LTkwMCcsICdkYXJrOnRleHQtd2hpdGUnLCAnYm9yZGVyLWInLCAncC0zJywgJ2JnLWdyYXktODAwJywgJ214LTInLCAncm91bmRlZC10LWxnJyk7XG4gICAgY29uc3QgdGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aXRsZURpdi5pbm5lclRleHQgPSAoaXRlbS5ub2RlUHJvcGVydGllcykgPyBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlIDogXCJcIjtcbiAgICB3aWRnZXREaXYuYXBwZW5kKHRpdGxlRGl2KVxuXG4gICAgLy8gQWRkIEZvbnRBd2Vzb21lIGVkaXQgaWNvblxuICAgIGNvbnN0IGVkaXRJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xuICAgIGVkaXRJY29uLmNsYXNzTGlzdC5hZGQoJ2ZhJywgJ2ZhLXBlbmNpbCcsICdtbC0yJywgJ2N1cnNvci1wb2ludGVyJywgJ3RleHQtYmx1ZS00MDAnLCAnaG92ZXI6dGV4dC1ibHVlLTcwMCcpO1xuICAgIHdpZGdldERpdi5hcHBlbmQoZWRpdEljb24pO1xuXG4gICAgaWYgKGl0ZW0ubm9kZVByb3BlcnRpZXMuaXNXaWRnZXRGaWx0ZXIpIHtcbiAgICAgIGNvbnN0IHNlYXJjaENvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgc2VhcmNoQ29udGFpbmVyRGl2LmNsYXNzTGlzdC5hZGQoJ2ZsZXgnLCAnaXRlbXMtY2VudGVyJywgJ3NwYWNlLXgtMicpO1xuICAgICAgY29uc3Qgc2VhcmNoQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBzZWFyY2hCdXR0b24uaW5uZXJUZXh0ID0gJ0ZpbHRlcic7XG4gICAgICBzZWFyY2hCdXR0b24uY2xhc3NMaXN0LmFkZCgncHgtMycsICdweS0xLjUnLCAnYmctYmx1ZS02MDAnLCAnbXItMicsICd0ZXh0LXdoaXRlJywgJ3JvdW5kZWQnLCAnaG92ZXI6YmctYmx1ZS03MDAnKTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlID0gW107XG5cbiAgICAgIHNlYXJjaEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc1dpZGdldEZpbHRlcnMgPSB0cnVlO1xuICAgICAgICBsZXQgZmlsdGVQcm9wZXJ0aWNlID0gW107XG4gICAgICAgIGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgbGV0IGtleV9uYW1lID0gdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0W2VsZW1lbnQuZGF0YXNldElkXVswXTtcbiAgICAgICAgICBPYmplY3Qua2V5cyhrZXlfbmFtZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmaWx0ZVByb3BlcnRpY2UuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICBmaWx0ZVByb3BlcnRpY2UucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBmaWx0ZVByb3BlcnRpY2UuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgY29sdW1uTmFtZTogZWxlbWVudCxcbiAgICAgICAgICAgIGRhdGFUeXBlOiBcImZsb2F0XCIsXG4gICAgICAgICAgICBvcGVyYXRvcjogXCJcIixcbiAgICAgICAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZS5wdXNoKG9iailcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHNlYXJjaENvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChzZWFyY2hCdXR0b24pXG4gICAgICB3aWRnZXREaXYuYXBwZW5kQ2hpbGQodGl0bGVEaXYpO1xuICAgICAgd2lkZ2V0RGl2LmFwcGVuZENoaWxkKHNlYXJjaENvbnRhaW5lckRpdik7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0uZmlsdGVySWQpIHtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlID0ge307XG4gICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZVsndmlld0NvbmZpZyddID0gaXRlbTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlWydoYXZpbmdDb25maWcnXSA9IFtdO1xuXG4gICAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwRmlsdGVyQ29uZmlnKGl0ZW0uZmlsdGVySWQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICB0aGlzLmxvYWRXaWRnZXRGaWx0ZXJDb21wb25lbnQoaXRlbSwgd2lkZ2V0RGl2LCBkYXRhLmZpbHRlckl0ZW1zKTtcbiAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaXRlbS5ub2RlUHJvcGVydGllcy5ub2RlZmlsdGVycyAmJiBpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3Qgc2VhcmNoQ29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzZWFyY2hDb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdpdGVtcy1jZW50ZXInLCAnc3BhY2UteC0yJyk7XG4gICAgICBpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZpbHRlckRpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicpO1xuICAgICAgICBpZiAoZmlsdGVyLmlucHV0X3R5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGNvbnN0IHRleHRCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICAgIHRleHRCb3gudHlwZSA9ICd0ZXh0JztcbiAgICAgICAgICB0ZXh0Qm94LnBsYWNlaG9sZGVyID0gYEVudGVyICR7ZmlsdGVyLmxvY2FsX2NvbHVtbn1gO1xuICAgICAgICAgIHRleHRCb3guY2xhc3NMaXN0LmFkZCgncHgtMicsICdweS0xLjUnLCAncm91bmRlZCcsICdib3JkZXInLCAnbXItMScsICdib3JkZXItZ3JheS01MDAnLCAndGV4dC1ncmF5LTkwMCcsICdkYXJrOmJnLWdyYXktNzAwJywgJ2Rhcms6dGV4dC13aGl0ZScpO1xuICAgICAgICAgIGNvbnN0IHNlYXJjaEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgIHNlYXJjaEJ1dHRvbi5pbm5lclRleHQgPSAnU2VhcmNoJztcbiAgICAgICAgICBzZWFyY2hCdXR0b24uY2xhc3NMaXN0LmFkZCgncHgtMycsICdweS0xLjUnLCAnYmctYmx1ZS02MDAnLCAnbXItMicsICd0ZXh0LXdoaXRlJywgJ3JvdW5kZWQnLCAnaG92ZXI6YmctYmx1ZS03MDAnKTtcbiAgICAgICAgICBjb25zdCBzZXBhcmVyb3RCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBzZXBhcmVyb3RCdXR0b24uaW5uZXJIVE1MID0gJ3wnO1xuICAgICAgICAgIHNlYXJjaEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0ZXh0Qm94LnZhbHVlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1RleHQgc2VhcmNoIGJ1dHRvbiBjbGlja2VkIHdpdGg6Jywgc2VhcmNoVGVybSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZmlsdGVyRGl2LmFwcGVuZENoaWxkKHRleHRCb3gpO1xuICAgICAgICAgIGZpbHRlckRpdi5hcHBlbmRDaGlsZChzZWFyY2hCdXR0b24pO1xuICAgICAgICAgIGZpbHRlckRpdi5hcHBlbmRDaGlsZChzZXBhcmVyb3RCdXR0b24pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VhcmNoQ29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGZpbHRlckRpdik7XG4gICAgICB9KTtcbiAgICAgIHdpZGdldERpdi5hcHBlbmRDaGlsZChzZWFyY2hDb250YWluZXJEaXYpO1xuICAgIH1cblxuICAgIGVkaXRJY29uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG4gICAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5maW5kSW5kZXgob2JqZWN0ID0+IG9iamVjdC53aWRnZXRJZCA9PT0gZGl2LndpZGdldElkKTtcbiAgICAgIHRoaXMuaXNVcGRhdGVXaWRnZXQgPSB0cnVlO1xuICAgICAgdGhpcy5pc2xheW91dENyZWF0ZSA9IHRydWU7XG4gICAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2sgPSBmYWxzZTtcbiAgICAgIHRoaXMubm9kZVByb3BlcnRpY2VGaWx0ZXJzID0gKGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMgJiYgaXRlbS5ub2RlUHJvcGVydGllcy5ub2RlZmlsdGVycy5sZW5ndGggIT09IDApID8gaXRlbS5ub2RlUHJvcGVydGllcy5ub2RlZmlsdGVycyA6IFtdO1xuICAgICAgaXRlbS5ub2RlUHJvcGVydGllc1snbm9kZWZpbHRlcnMnXSA9IHRoaXMubm9kZVByb3BlcnRpY2VGaWx0ZXJzO1xuICAgICAgdGhpcy5hZGRlZHdpZEdldENvbmZpZyA9IGl0ZW0ubm9kZVByb3BlcnRpZXM7XG4gICAgICB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudCA9IGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnO1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcklkID0gKGl0ZW0uZmlsdGVySWQpID8gaXRlbS5maWx0ZXJJZCA6IFwiXCI7XG4gICAgICB0aGlzLmVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsID0ge307XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVyRGF0YXNvdXJjZSA9IGl0ZW07XG4gICAgfSk7XG4gICAgcmV0dXJuIHdpZGdldERpdjtcbiAgfVxuXG5cbiAgZ2V0RmlsdGVyVmFsdWVCeUlkKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmV2ZW50KSB7XG4gICAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwRmlsdGVyQ29uZmlnKGV2ZW50LnZhbHVlKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0ZWRGaWx0ZXJEYXRhc291cmNlKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJEYXRhc291cmNlLmZpbHRlcklkID0gdGhpcy5zZWxlY3RlZEZpbHRlcklkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLmZpbHRlcnMgPSBkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFwiRmlsdGVyIENoYW5nZWRcIilcbiAgICAgICAgfSwgZXJyb2U6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnRmlsdGVyIFVwZGF0ZScpXG5cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuXG4gIGNyZWF0ZURpdkVsZW1lbnRzKGRhdGFzZXRCeUlkKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5keW5hbWljQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZvckVhY2goYXN5bmMgZGl2ID0+IHtcbiAgICAgIGNvbnN0IHJvd0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbGV0IHdfaGVpZ2h0ID0gKGRpdi53aWRnZXRQcm9wZXJ0aWVzLmhlaWdodCA9PSBcIlwiKSA/IFwiaC1hdXRvXCIgOiAnaC1bJyArIGRpdi53aWRnZXRQcm9wZXJ0aWVzLmhlaWdodCArICddJztcbiAgICAgIHJvd0Rpdi5jbGFzc0xpc3QuYWRkKGRpdi53aWRnZXRQcm9wZXJ0aWVzLndpZHRoLCB3X2hlaWdodCwgJ2JvcmRlcicpO1xuICAgICAgY29uc3QgZmlsdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBpZiAoZGl2LmZpbHRlcnMpIHtcbiAgICAgICAgdGhpcy5sb2FkRmlsdGVyQ29tcG9uZW50KGRpdiwgZmlsdGVyRGl2LCBkaXYuZmlsdGVycy5maWx0ZXJJdGVtcyk7XG4gICAgICB9XG5cbiAgICAgIHJvd0Rpdi5hcHBlbmRDaGlsZChmaWx0ZXJEaXYpXG5cbiAgICAgIGlmIChkaXYud2lkZ2V0Tm9kZSAmJiBkaXYud2lkZ2V0Tm9kZS5sZW5ndGggJiYgZGl2LndpZGdldE5vZGUubGVuZ3RoICE9IDApIHtcbiAgICAgICAgY29uc3QgbWFpbkl0ZW1EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbWFpbkl0ZW1EaXYuY2xhc3NMaXN0LmFkZChcImZsZXhcIiwgXCJmbGV4LXdyYXBcIik7XG4gICAgICAgIHRoaXMubG9hZFdpZGdldE5vZGVzKGRpdiwgbWFpbkl0ZW1EaXYsIGRhdGFzZXRCeUlkKTtcbiAgICAgICAgLy8gZm9yIGxvb3Agb24gd2lkZ2V0XG4gICAgICAgIHJvd0Rpdi5hcHBlbmRDaGlsZChtYWluSXRlbURpdik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBfaW5uZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHBfaW5uZXJEaXYuY2xhc3NMaXN0LmFkZCgncm91bmRlZCcsICdqdXN0aWZ5LWNlbnRlcicsICdpdGVtcy1jZW50ZXInLCAnYm9yZGVyJywgJ3AtMScsICdtLTEnLCAnZmxleCcsICdmbGV4LXJvdycpO1xuICAgICAgLy8gYWRkIHdpZGdldCBidXR0b25cbiAgICAgIGNvbnN0IHBfYnV0dG9uX3dpZGdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcF9idXR0b25fd2lkZ2V0LmlubmVyVGV4dCA9ICdBZGQgU2luZ2xlIExheW91dCc7XG4gICAgICBwX2J1dHRvbl93aWRnZXQuY2xhc3NMaXN0LmFkZCgnYmctYmx1ZS03MDAnLCBcInAtMVwiLCBcInctZml0XCIsIFwiY3Vyc29yLXBvaW50ZXJcIiwgJ3RleHQteHMnKVxuICAgICAgcF9idXR0b25fd2lkZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZmluZEluZGV4KG9iamVjdCA9PiBvYmplY3Qud2lkZ2V0SWQgPT09IGRpdi53aWRnZXRJZCk7XG4gICAgICAgIHRoaXMuaW5zZXJ0TmV3V2lnZXQoaW5kZXgpO1xuICAgICAgfSk7XG4gICAgICAvLyBhZGQgY2hhcnQgYnV0dG9uXG4gICAgICAvLyBjb25zdCBwX2J1dHRvbl9jaGFydCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgLy8gcF9idXR0b25fY2hhcnQuaW5uZXJUZXh0ID0gJ0FkZCBWaWV3JztcbiAgICAgIC8vIHBfYnV0dG9uX2NoYXJ0LmNsYXNzTGlzdC5hZGQoJ2JnLWdyZWVuLTcwMCcsIFwicC0xXCIsIFwidy1maXRcIiwgXCJjdXJzb3ItcG9pbnRlclwiLCAndGV4dC14cycpXG4gICAgICAvLyBwX2J1dHRvbl9jaGFydC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIC8vICAgY29uc3QgY29tcF9vYmplY3QgPSB0aGlzLmZpbmRXaWRnZXRCeUlkKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMsIGRpdi53aWRnZXRJZCk7XG4gICAgICAvLyAgIHRoaXMuaW5zZXJ0Q2hhcnRXaWdldChjb21wX29iamVjdCwgcm93RGl2KTtcbiAgICAgIC8vIH0pO1xuXG4gICAgICAvLyBkZWxldGUgd2lkZ2V0IGJ1dHRvblxuICAgICAgY29uc3QgcF9kZWxfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBwX2RlbF9idXR0b24uaW5uZXJUZXh0ID0gJ0RldGV0ZSBsYXlvdXQnO1xuICAgICAgcF9kZWxfYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2JnLXJlZC03MDAnLCBcInAtMVwiLCBcInctZml0XCIsIFwiY3Vyc29yLXBvaW50ZXJcIiwgJ3RleHQteHMnKVxuICAgICAgcF9kZWxfYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGNvbmZpcm0oXCI8aT5BcmUgWW91IFN1cmU/PC9pPlwiLCBcIkRlbGV0ZSBMYXlvdXRcIik7XG4gICAgICAgIHJlc3VsdC50aGVuKChkaWFsb2dSZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5tYXAoY29uZmlnID0+IGNvbmZpZy53aWRnZXRJZCk7XG4gICAgICAgICAgICByb3dEaXYucmVtb3ZlKClcblxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmVkaXRBcHBQYWdlQ29uZmlnKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKVxuICAgICAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1dpZGdldCBDcmVhdGlvbicpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuc3BsaWNlKGluZGV4LCAxKTtcblxuXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLy8gYWR2YW5jZWQgYnV0dG9uXG4gICAgICBjb25zdCBhZHZhbmNlX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgYWR2YW5jZV9idXR0b24uaW5uZXJUZXh0ID0gJ0FkdmFuY2UgTGF5b3V0JztcbiAgICAgIGFkdmFuY2VfYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2JnLXllbGxvdy03MDAnLCBcInAtMVwiLCBcInctZml0XCIsIFwiY3Vyc29yLXBvaW50ZXJcIiwgJ3RleHQteHMnKVxuICAgICAgYWR2YW5jZV9idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBfb2JqZWN0ID0gdGhpcy5maW5kV2lkZ2V0QnlJZCh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLCBkaXYud2lkZ2V0SWQpO1xuICAgICAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5maW5kSW5kZXgob2JqZWN0ID0+IG9iamVjdC53aWRnZXRJZCA9PT0gZGl2LndpZGdldElkKTtcblxuICAgICAgICAvLyB0aGlzLmluc2VydENoYXJ0V2lnZXQoY29tcF9vYmplY3QsIHJvd0Rpdik7XG4gICAgICAgIHRoaXMuaXNBZHZhbmNlTGF5b3V0ID0gdHJ1ZTtcblxuICAgICAgfSk7XG5cbiAgICAgIHBfaW5uZXJEaXYuYXBwZW5kQ2hpbGQoYWR2YW5jZV9idXR0b24pO1xuICAgICAgLy8gcF9pbm5lckRpdi5hcHBlbmRDaGlsZChwX2J1dHRvbl9jaGFydCk7XG4gICAgICBwX2lubmVyRGl2LmFwcGVuZENoaWxkKHBfYnV0dG9uX3dpZGdldCk7XG4gICAgICBwX2lubmVyRGl2LmFwcGVuZENoaWxkKHBfZGVsX2J1dHRvbik7XG5cbiAgICAgIGlmICghdGhpcy5pc0Rhc2hCb2FyZENvbnRlbnRUeXBlVmlldykge1xuICAgICAgICByb3dEaXYuYXBwZW5kQ2hpbGQocF9pbm5lckRpdik7XG4gICAgICB9XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocm93RGl2KTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRXaWRnZXROb2RlcyhkaXY6IGFueSwgbWFpbkl0ZW1EaXY6IGFueSwgZGF0YXNldEJ5SWQ6IGFueSkge1xuICAgIGRpdi53aWRnZXROb2RlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKGl0ZW0sIG1haW5JdGVtRGl2LCBkYXRhc2V0QnlJZCwgZGl2KTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRTaW5nbGVXaWRnZXROb2RlKGl0ZW06IGFueSwgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQsIGRhdGFzZXRCeUlkOiBhbnksIGRpdikge1xuICAgIGxldCB3X2hlaWdodCA9IChpdGVtLm5vZGVQcm9wZXJ0aWVzLmhlaWdodCA9PSBcIlwiKSA/IFwiaC1hdXRvXCIgOiAnaC1bJyArIGl0ZW0ubm9kZVByb3BlcnRpZXMuaGVpZ2h0ICsgJ10nO1xuICAgIGxldCB3X3dpZHRoID0gKGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkdGggPT0gXCJcIikgPyBcInctZnVsbFwiIDogaXRlbS5ub2RlUHJvcGVydGllcy53aWR0aDtcbiAgICBjb25zdCBpdGVtRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaXRlbURpdi5jbGFzc0xpc3QuYWRkKHdfd2lkdGgsIHdfaGVpZ2h0LCAnYm9yZGVyJywgJ3AtMScpO1xuXG4gICAgY29uc3QgZmxleENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGZsZXhDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdqdXN0aWZ5LWJldHdlZW4nLCAnaXRlbXMtY2VudGVyJywgJ3RleHQtZ3JheS05MDAnLCAnZGFyazp0ZXh0LXdoaXRlJywgJ2JnLWdyYXktODAwJywgJ214LTInLCAncm91bmRlZC10LWxnJyk7IC8vIEZsZXhib3ggY29udGFpbmVyXG5cbiAgICBjb25zdCB3aWRnZXREaXYgPSB0aGlzLmdldFdpZGdldFRpdGxlRGl2KGl0ZW0sIGRpdilcbiAgICBpdGVtLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQua3BpQ29uZmlnKSB7XG4gICAgICAgIGxldCBhcGlDYWxscyA9IFtdO1xuICAgICAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwRGF0YXNldENvbmZpZyhlbGVtZW50LmRhdGFzZXRJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoZGF0YXNldDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhc2V0V2l0aExpbWl0ID0gdGhpcy5zZXREYXRhU2V0c0xpbWl0KGRhdGFzZXQpO1xuICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChkYXRhc2V0V2l0aExpbWl0LCBkYXRhc2V0V2l0aExpbWl0LmRhdGFzZXRJZCwgdGhpcy5kZWZhdWx0QXBwbHllZEZpbHRlcikpO1xuICAgICAgICAgICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgICAgICAgICAgZWxlbWVudC5rcGlDb25maWdbJ2RhdGFTb3VyY2UnXSA9IHRoaXMudW5pcXVlRGF0YVNldE9iamVjdFtlbGVtZW50LmRhdGFzZXRJZF1cbiAgICAgICAgICAgICAgY29uc3QgY29tcF9vYmplY3QgPSB0aGlzLmZpbmRXaWRnZXRCeUlkKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMsIGl0ZW0uaWQpO1xuICAgICAgICAgICAgICB0aGlzLmxvYWREeW5hbWljQ29tcG9uZW50KGVsZW1lbnQsIGNvbXBfb2JqZWN0LCBpdGVtRGl2KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcblxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmbGV4Q29udGFpbmVyLmFwcGVuZENoaWxkKHdpZGdldERpdik7XG5cbiAgICAvLyBDcmVhdGUgYnV0dG9ucyBjb250YWluZXIgZm9yIGFsaWdubWVudFxuICAgIGNvbnN0IGJ1dHRvbnNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBidXR0b25zQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2ZsZXgnLCAnbXgtMicpOyAvLyBUbyBhbGlnbiBidXR0b25zIHNpZGUgYnkgc2lkZSB3aXRoIHNvbWUgc3BhY2luZ1xuXG5cbiAgICBjb25zdCBpbm5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGlubmVyRGl2LmNsYXNzTGlzdC5hZGQoJ3JvdW5kZWQnLCAnanVzdGlmeS1jZW50ZXInLCAnaXRlbXMtY2VudGVyJywgJ3AtMScsICdtLTEnLCAnZmxleCcsICdmbGV4LXJvdycpO1xuXG4gICAgY29uc3QgYnV0dG9uX2NoYXJ0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYnV0dG9uX2NoYXJ0LmlubmVyVGV4dCA9ICdBZGQgVmlldyc7XG4gICAgYnV0dG9uX2NoYXJ0LmNsYXNzTGlzdC5hZGQoJ2JnLWdyZWVuLTcwMCcsIFwicC0xXCIsIFwidy1maXRcIiwgXCJjdXJzb3ItcG9pbnRlclwiLCAndGV4dC14cycpXG4gICAgYnV0dG9uX2NoYXJ0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZmluZEluZGV4KG9iamVjdCA9PiBvYmplY3Qud2lkZ2V0SWQgPT09IGRpdi53aWRnZXRJZCk7XG4gICAgICBjb25zdCBjb21wX29iamVjdCA9IHRoaXMuZmluZFdpZGdldEJ5SWQodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cywgaXRlbS5pZCk7XG4gICAgICB0aGlzLmluc2VydENoYXJ0V2lnZXQoY29tcF9vYmplY3QsIGl0ZW1EaXYpO1xuICAgIH0pO1xuXG5cbiAgICBjb25zdCBkZWxfYnV0dG9uX2NoYXJ0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGVsX2J1dHRvbl9jaGFydC5pbm5lclRleHQgPSAnRGV0ZXRlJztcbiAgICBkZWxfYnV0dG9uX2NoYXJ0LmNsYXNzTGlzdC5hZGQoJ2JnLXJlZC03MDAnLCBcInAtMVwiLCBcInctZml0XCIsIFwiY3Vyc29yLXBvaW50ZXJcIiwgJ3RleHQteHMnKVxuICAgIGRlbF9idXR0b25fY2hhcnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0ID0gY29uZmlybShcIjxpPkFyZSBZb3UgU3VyZT88L2k+XCIsIFwiRGVsZXRlIFZpZXdcIik7XG4gICAgICByZXN1bHQudGhlbigoZGlhbG9nUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChkaWFsb2dSZXN1bHQpIHtcbiAgICAgICAgICBsZXQgd2lkZ2V0SW5kZXggPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZpbmRJbmRleChvYmplY3QgPT4gb2JqZWN0LndpZGdldElkID09PSBkaXYud2lkZ2V0SWQpO1xuICAgICAgICAgIGNvbnN0IG1hcGVkT2JqZWN0ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t3aWRnZXRJbmRleF1cbiAgICAgICAgICBpZiAobWFwZWRPYmplY3Qud2lkZ2V0Tm9kZSAmJiBtYXBlZE9iamVjdC53aWRnZXROb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBtYXBJbmRleCA9IG1hcGVkT2JqZWN0LndpZGdldE5vZGUuZmluZEluZGV4KGluZCA9PiBpbmQuaWQgPT09IGl0ZW0uaWQpXG4gICAgICAgICAgICBtYXBlZE9iamVjdC53aWRnZXROb2RlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICAgIG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnID0gbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcubWFwKGNvbmZpZyA9PiBjb25maWcudmlld0lkKTtcbiAgICAgICAgICAgICAgbm9kZS5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzID0gW107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1hcGVkT2JqZWN0LndpZGdldE5vZGUuc3BsaWNlKG1hcEluZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwZWRPYmplY3RbJ2ZpbHRlcklkJ10gPSAobWFwZWRPYmplY3QuZmlsdGVycykgPyBtYXBlZE9iamVjdC5maWx0ZXJzLmZpbHRlcklkIDogbnVsbDtcbiAgICAgICAgICBkZWxldGUgbWFwZWRPYmplY3RbJ2ZpbHRlcnMnXTtcbiAgICAgICAgICBtYXBlZE9iamVjdC5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzID0gW107XG4gICAgICAgICAgdGhpcy5zZXJ2aWNlLmVkaXRBcHBXaWRnZXRDb25maWcobWFwZWRPYmplY3QpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0QXBwUGFnZURldGFpbENvbmZpZ0J5UGFnZUlkKClcbiAgICAgICAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdXaWRnZXQgQ3JlYXRpb24nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpdGVtRGl2LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG5cbiAgICAvLyBpbm5lckRpdi5hcHBlbmRDaGlsZChidXR0b25fY2hhcnQpO1xuICAgIC8vIGlubmVyRGl2LmFwcGVuZENoaWxkKGRlbF9idXR0b25fY2hhcnQpO1xuICAgIC8vIEFwcGVuZCBidXR0b25zIHRvIGJ1dHRvbnMgY29udGFpbmVyXG4gICAgYnV0dG9uc0NvbnRhaW5lci5hcHBlbmRDaGlsZChidXR0b25fY2hhcnQpO1xuICAgIGJ1dHRvbnNDb250YWluZXIuYXBwZW5kQ2hpbGQoZGVsX2J1dHRvbl9jaGFydCk7XG5cbiAgICAvLyBBZGQgdGhlIGJ1dHRvbnMgY29udGFpbmVyIHRvIHRoZSBmbGV4IGNvbnRhaW5lclxuICAgIGZsZXhDb250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uc0NvbnRhaW5lcik7XG4gICAgaWYgKCF0aGlzLmlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3KSB7XG4gICAgfVxuICAgIGl0ZW1EaXYuYXBwZW5kQ2hpbGQoZmxleENvbnRhaW5lcik7XG4gICAgLy8gaXRlbURpdi5hcHBlbmRDaGlsZCh3aWRnZXREaXYpO1xuXG4gICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZChpdGVtRGl2KVxuXG5cblxuICB9XG5cblxuXG4gIGZpbmRXaWRnZXRCeUlkKGNvbmZpZ3M6IGFueVtdLCBpZDogc3RyaW5nKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy53aWRnZXROb2RlICYmIGNvbmZpZy53aWRnZXROb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRXaWRnZXRCeUlkKGNvbmZpZy53aWRnZXROb2RlLCBpZCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZGVsZXRlV2lkZ2V0QnlJZChjb25maWdzOiBhbnlbXSwgaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSBjb25maWdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoY29uZmlnc1tpXS5pZCA9PT0gaWQpIHtcbiAgICAgICAgY29uZmlncy5zcGxpY2UoaSwgMSk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZ3NbaV0ud2lkZ2V0Tm9kZSAmJiBjb25maWdzW2ldLndpZGdldE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmRlbGV0ZVdpZGdldEJ5SWQoY29uZmlnc1tpXS53aWRnZXROb2RlLCBpZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9hZER5bmFtaWNDb21wb25lbnQoZGF0YSwgaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQpOiBhbnkge1xuICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5jb21wb25lbnRDbGFzc01hcFtkYXRhLmtwaUNvbmZpZ1snY29tcG9uZW50TmFtZSddXTtcbiAgICB0aGlzLkNvbXBSZWZzID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRDbGFzcyk7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlID0gdGhpcy5Db21wUmVmcy5pbnN0YW5jZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuY2hhcnREYXRhU291cmNlID0gZGF0YTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uua3BpX25hbWUgPSBcIlwiO1xuXG4gICAgaW5kZXhPYmouY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcy5wdXNoKHRoaXMuQ29tcFJlZnMpO1xuICAgIGNvbnN0IGNzc0NsYXNzID0gXCJ3LWZ1bGxcIjtcbiAgICB0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChjc3NDbGFzcyk7XG4gICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbG9hZEZpbHRlckNvbXBvbmVudChpbmRleE9iaiwgY29udGFpbmVyRWxlbWVudCwgZmlsdGVySXRlbXMpIHtcblxuICAgIGxldCBzZWxlY3RlZERhdGVzID0geyBzdGFydERhdGU6IHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSwgZW5kRGF0ZTogdGhpcy5kZWZhdWx0RW5kRGF0ZSB9XG4gICAgY29uc3QgY29tcG9uZW50Q2xhc3MgPSB0aGlzLmNvbXBvbmVudENsYXNzTWFwWydBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50J107XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnNlbGVjdGVkRGF0ZXMgPSBzZWxlY3RlZERhdGVzO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5maWx0ZXJJdGVtcyA9IGZpbHRlckl0ZW1zO1xuXG5cbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UucGFnZVRpdGxlID0gdGhpcy5wYWdlVGl0bGU7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmlzRWRpdEJ1dHRvbiA9IGZhbHNlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5pc0FkdmFuY2VCdXR0b24gPSB0cnVlO1xuXG4gICAgaW5kZXhPYmouY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcy5wdXNoKHRoaXMuQ29tcFJlZnMpO1xuICAgIGNvbnN0IGNzc0NsYXNzID0gXCJ3LWZ1bGxcIjtcbiAgICB0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChjc3NDbGFzcyk7XG4gICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbG9hZFdpZGdldEZpbHRlckNvbXBvbmVudChpbmRleE9iaiwgY29udGFpbmVyRWxlbWVudCwgZmlsdGVySXRlbXMpIHtcbiAgICBsZXQgdXNlck5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcl9uYW1lJylcbiAgICBsZXQgc2VsZWN0ZWREYXRlcyA9IHsgc3RhcnREYXRlOiB0aGlzLmRlZmF1bHRTdGFydERhdGUsIGVuZERhdGU6IHRoaXMuZGVmYXVsdEVuZERhdGUgfVxuICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5jb21wb25lbnRDbGFzc01hcFsnQWR2YW5jZVdpZGdldEhlYWRlckZpbHRlckNvbXBvbmVudCddO1xuICAgIHRoaXMuQ29tcFJlZnMgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudENsYXNzKTtcbiAgICBjb25zdCBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLkNvbXBSZWZzLmluc3RhbmNlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5zZWxlY3RlZERhdGVzID0gc2VsZWN0ZWREYXRlcztcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZmlsdGVySXRlbXMgPSBmaWx0ZXJJdGVtcztcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZ2V0V2lkZ2V0RmlsdGVyQ29uZmlnLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5nZXRXaWRnZXRGaWx0ZXJGb3JUZW1wbGF0ZSh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICBpbmRleE9iai5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzLnB1c2godGhpcy5Db21wUmVmcyk7XG4gICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgZ2V0RGVsZXRlVmlld0Zyb21Db25maWcoaW5kZXgpIHtcbiAgICBjb25zb2xlLmxvZyhpbmRleCk7XG4gICAgdGhpcy5hbGxXaWRnZXRJbm5lckNvbnRlbnQuc3BsaWNlKGluZGV4LCAxKVxuICB9XG5cbiAgbW92ZUl0ZW1Gb3JQYWdlVmlldyhpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXJlY3Rpb24gPT09ICd1cCcgPyBpbmRleCAtIDEgOiBpbmRleCArIDE7XG4gICAgLy8gUHJldmVudCBtb3ZpbmcgYmV5b25kIGFycmF5IGJvdW5kc1xuICAgIGlmIChuZXdQb3NpdGlvbiA8IDAgfHwgbmV3UG9zaXRpb24gPj0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgLy8gTW92ZSBpdGVtXG4gICAgY29uc3QgaXRlbVRvTW92ZSA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZVtpbmRleF07XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLnNwbGljZShpbmRleCwgMSk7IC8vIFJlbW92ZSBpdGVtIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZS5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGl0ZW1Ub01vdmUpOyAvLyBJbnNlcnQgaXRlbSBpbiBuZXcgcG9zaXRpb25cbiAgfVxuICBtb3ZlSXRlbUZvckNvbHVtbnMoaW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nKTogdm9pZCB7XG4gICAgLy8gUHJldmVudCBtb3ZpbmcgYmV5b25kIGFycmF5IGJvdW5kc1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5hbGxXaWRnZXRJbm5lckNvbnRlbnQubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXJlY3Rpb24gPT09ICd1cCcgPyBpbmRleCAtIDEgOiBpbmRleCArIDE7XG4gICAgLy8gUHJldmVudCBtb3ZpbmcgYmV5b25kIGFycmF5IGJvdW5kc1xuICAgIGlmIChuZXdQb3NpdGlvbiA8IDAgfHwgbmV3UG9zaXRpb24gPj0gdGhpcy5hbGxXaWRnZXRJbm5lckNvbnRlbnQubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBNb3ZlIGl0ZW1cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5hbGxXaWRnZXRJbm5lckNvbnRlbnRbaW5kZXhdO1xuICAgIHRoaXMuYWxsV2lkZ2V0SW5uZXJDb250ZW50LnNwbGljZShpbmRleCwgMSk7IC8vIFJlbW92ZSBpdGVtIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgIHRoaXMuYWxsV2lkZ2V0SW5uZXJDb250ZW50LnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7IC8vIEluc2VydCBpdGVtIGluIG5ldyBwb3NpdGlvblxuICB9XG5cbiAgbW92ZUl0ZW1Gb3JXaWRnZXQoaW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nKTogdm9pZCB7XG4gICAgLy8gUHJldmVudCBtb3ZpbmcgYmV5b25kIGFycmF5IGJvdW5kc1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgMCB8fCBuZXdQb3NpdGlvbiA+PSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgLy8gTW92ZSBpdGVtXG4gICAgY29uc3QgaXRlbVRvTW92ZSA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbaW5kZXhdO1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuc3BsaWNlKGluZGV4LCAxKTsgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uXG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGl0ZW1Ub01vdmUpOyAvLyBJbnNlcnQgaXRlbSBpbiBuZXcgcG9zaXRpb25cbiAgfVxuXG4gIGdldEVkaXRWaWV3RnJvbUxheW91dChkYXRhLCBpbmRleCkge1xuXG4gICAgdGhpcy5pc0VkaXRNYWluTGF5b3V0ID0gdHJ1ZTtcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IHRydWU7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gZmFsc2U7XG4gICAgdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLmlzVXBkYXRlV2lkZ2V0ID0gZmFsc2U7XG4gICAgdGhpcy53aWRnZXROYW1lID0gZGF0YS53aWRnZXROYW1lO1xuICAgIHRoaXMud2lkZ2V0VGl0bGUgPSBkYXRhLndpZGdldFRpdGxlO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJJZCA9IGRhdGEuZmlsdGVycy5maWx0ZXJJZDtcbiAgICB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnID0gZGF0YS53aWRnZXRQcm9wZXJ0aWVzO1xuICB9XG5cblxuICBiYWNrVG9NYWluVmlldygpIHtcbiAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSB0cnVlO1xuICAgIHRoaXMuaXNVcGRhdGVXaWRnZXQgPSBmYWxzZTtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLmlzRWRpdE1haW5MYXlvdXQgPSBmYWxzZTtcbiAgICB0aGlzLmlzbGF5b3V0Q3JlYXRlID0gZmFsc2U7XG4gICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmaWx0ZXJWaWV3cygpIHtcbiAgICBpZiAodGhpcy52aWV3VG9TZWFyY2gudHJpbSgpICE9PSAnJykge1xuICAgICAgdGhpcy5maWx0ZXJlZENvbXBvbmVudENvbmZpZyA9IHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZS5maWx0ZXIoKGl0ZW06IGFueSkgPT5cbiAgICAgICAgaXRlbS52aWV3TmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMudmlld1RvU2VhcmNoLnRvTG93ZXJDYXNlKCkpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQ29tcG9uZW50Q29uZmlnID0gdGhpcy5jb21wb25lbnRDb25maWdEYXRhU291cmNlO1xuICAgIH1cbiAgfVxuXG4gIGVkaXRDb21wb25lbnRWaWV3cyhpdGVtKSB7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEl0ZW1Gb3JVcGRhdGUgPSBpdGVtO1xuICAgIGlmICh0aGlzLmlzVXBkYXRlV2lkZ2V0ICYmICF0aGlzLmlzQ2hhcnRCdXR0b25DbGljaykge1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXdJZCA9IGl0ZW0udmlld0lkO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNDcmVhdGVOZXdWaWV3V2l0aERlZmF1bHRWaWV3ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgIH0sIDQwMCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgICAgJ3ZpZXdJZCc6IGl0ZW0udmlld0lkLFxuICAgICAgICAgICdwYWdlSWQnOiB0aGlzLnBhZ2VJZFxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydhcHBzL2NvbnRyb2xQYW5lbC9hcHBsaWNhdGlvbkNvbnRlbnQvYXBwbGljYXRpb25WaWV3cyddLCBuYXZpZ2F0aW9uKTtcbiAgICB9XG4gIH1cbiAgZWRpdENvbXBvbmVudERhdGFzZXRzKGl0ZW0pIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5lZGl0SXRlbUZvclVwZGF0ZSA9IGl0ZW07XG4gICAgaWYgKHRoaXMuaXNVcGRhdGVXaWRnZXQgJiYgIXRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YXNldElkID0gaXRlbS5kYXRhc2V0SWQ7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0NyZWF0ZURhdGFzZXRXaXRoRGF0YXNldElkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgIH0sIDQwMCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgICAgJ3ZpZXdJZCc6IGl0ZW0udmlld0lkLFxuICAgICAgICAgICdwYWdlSWQnOiB0aGlzLnBhZ2VJZFxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydhcHBzL2NvbnRyb2xQYW5lbC9hcHBsaWNhdGlvbkNvbnRlbnQvYXBwbGljYXRpb25WaWV3cyddLCBuYXZpZ2F0aW9uKTtcbiAgICB9XG4gIH1cblxuICBnZXRBbGxQYWdlKCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnYXBwcy9jb250cm9sUGFuZWwvYXBwbGljYXRpb25Db250ZW50L2FwcGxpY2F0aW9uRGFzaGJvYXJkJ10pO1xuICB9XG5cbiAgdHJhbnNmb3JtQ29sdW1uc0ZvckNvbHVtbnMoaW5wdXRDb2x1bW5zKSB7XG4gICAgY29uc3QgY29sdW1ucyA9IFtdO1xuXG4gICAgaW5wdXRDb2x1bW5zLmZvckVhY2goY29sID0+IHtcbiAgICAgIGNvbHVtbnMucHVzaCh7XG4gICAgICAgIGRhdGFGaWVsZDogY29sLmRhdGFGaWVsZCxcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgY2FwdGlvbjogY29sLmNhcHRpb24sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cblxuICBnZXRDcmVhdGVEYXRhU2V0UGFnZSgpIHtcbiAgICB0aGlzLmlzQ3JlYXRlRGF0YXNldCA9IHRydWU7XG4gIH1cblxuICBnZXRDcmVhdGVWaWV3UGFnZSgpIHtcblxuICAgIHRoaXMuc2VsZWN0ZWRWaWV3SWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pc0NyZWF0ZU5ld1ZpZXcgPSB0cnVlO1xuICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICB9LCA0MDApO1xuICB9XG5cblxuICBnZXRFbWl0TmV3Q2hhcnRDb25naWcoZXZlbnQpIHtcbiAgICBkZWxldGUgZXZlbnQua3BpQ29uZmlnLmRhdGFTb3VyY2U7XG4gICAgdGhpcy5lZGl0SXRlbUZvclVwZGF0ZVsna3BpQ29uZmlnJ10gPSBldmVudC5rcGlDb25maWc7XG5cbiAgICBjb25zb2xlLmxvZyh0aGlzLmVkaXRJdGVtRm9yVXBkYXRlKTtcbiAgICB0aGlzLnNlcnZpY2UudXBkYXRlQXBwVmlld0NvbmZpZyh0aGlzLmVkaXRJdGVtRm9yVXBkYXRlKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmlzRWRpdE9wdGlvbkNsaWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoJ1ZpZXcgVXBkYXRlIFN1Y2Nlc3NmdWxseScpXG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnVmlldyBDcmVhdGlvbicpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cbiAgZ2V0Vmlld1BhZ2UoKSB7XG4gICAgbGV0IG5hdmlnYXRpb25FeHRyYXM6IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICBcInBhZ2VJZFwiOiB0aGlzLnBhZ2VJZFxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5wYWdlVXJsXSwgbmF2aWdhdGlvbkV4dHJhcylcblxuICB9XG4gIC8vIG5vZGVwcm9wZXJ0aWNlIGZpbHRlciBcblxuICBnZXROb2RlUHJvcGVydGljZUZpbHRlck9wdGlvbigpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgaW5wdXRfdHlwZTogXCJ0ZXh0XCIsXG4gICAgICBzZXJ2ZXJfY29sdW1uOiBcIlwiLFxuICAgICAgbG9jYWxfY29sdW1uOiBcIlwiLFxuICAgICAgc2VsZWN0X2JveF9vcHRpb246IFwiXCIsXG4gICAgfVxuICAgIHRoaXMubm9kZVByb3BlcnRpY2VGaWx0ZXJzLnB1c2gob2JqKVxuICB9XG5cbiAgZGVsZXRlTm9kZUZpbHRlcihpbmRleCkge1xuICAgIHRoaXMubm9kZVByb3BlcnRpY2VGaWx0ZXJzLnNwbGljZShpbmRleCwgMSlcbiAgfVxuXG4gIHNldERhdGFTZXRzTGltaXQoZGF0YXNldCkge1xuICAgIGxldCBsaW1pdCA9IHsgXCJsaW1pdFwiOiBcIjEwXCIgfVxuICAgIGRhdGFzZXQuY29uZmlnLnF1ZXJ5Q29uZmlnLnJlcUZpZWxkcy5wdXNoKGxpbWl0KTtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIGdldFZpZXdQb3B1cEhpZGUoZSkge1xuICAgIHRoaXMuZ2V0QWxsVmlld3NJdGVtcygpO1xuICB9XG5cbiAgZ2V0RGF0YXNldFBvcHVwSGlkZShlKSB7XG5cbiAgfVxuXG4gIHN1Ym1pdEZpbHRlcigpIHtcblxuICB9XG5cbiAgZ2V0V2lkZ2V0RmlsdGVyRm9yVGVtcGxhdGUodmFsdWUpIHtcbiAgICB0aGlzLmdldERhdGFTZXQoKTtcbiAgfVxuXG4gIGdldERlbGV0ZVZpZXdGcm9tTGF5b3V0KGl0ZW0sIGkpIHtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLnNwbGljZShpLCAxKTtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZvckVhY2god2lkZ2V0ID0+IHtcbiAgICAgIHdpZGdldC5jb21wQ29uZmlnLnZpZXdDb25maWcgPSB3aWRnZXQuY29tcENvbmZpZy52aWV3Q29uZmlnLm1hcChjb25maWcgPT4gY29uZmlnLnZpZXdJZCk7XG4gICAgICB3aWRnZXQuY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcyA9IFtdO1xuICAgICAgaWYgKHdpZGdldC53aWRnZXROb2RlICYmIHdpZGdldC53aWRnZXROb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd2lkZ2V0LndpZGdldE5vZGUuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZyA9IG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLm1hcChjb25maWcgPT4gY29uZmlnLnZpZXdJZCk7XG4gICAgICAgICAgbm9kZS5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzID0gW107XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG4gICAgY29uc3Qgd2lkZ2V0RGF0YSA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnO1xuICAgIHdpZGdldERhdGFbJ3dpZGdldHMnXSA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMubWFwKGl0ZW0gPT4gaXRlbS53aWRnZXRJZCk7XG4gICAgd2lkZ2V0RGF0YVsnZmlsdGVySWQnXSA9ICh3aWRnZXREYXRhLmZpbHRlcnMpID8gd2lkZ2V0RGF0YS5maWx0ZXJzLmZpbHRlcklkIDogbnVsbDtcbiAgICBkZWxldGUgd2lkZ2V0RGF0YVsnZmlsdGVycyddO1xuXG4gICAgdGhpcy5zZXJ2aWNlLmVkaXRBcHBQYWdlQ29uZmlnKHdpZGdldERhdGEpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXCJMYXlvdXQgRGVsZXRlZCBTdWNjZXNzZnVsbHlcIilcbiAgICAgICAgdGhpcy5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKVxuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1dpZGdldCBDcmVhdGlvbicpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cbiAgLy8gYWR2YW5jZSBMYXlvdXQgXG4gIGlzQWR2YW5jZUxheW91dDogYm9vbGVhbjtcbiAgaXNQcm9jZWVkOiBib29sZWFuO1xuICBzZWxlY3RlZFZpZXdzSWRzOiBhbnkgPSBbXTtcbiAgYWR2YW5jZUxheW91dENvbnRhaW5lcjogYW55ID0gW107XG4gIGdldFByb2Nlc3NGb3JDb25maWcoKSB7XG4gICAgdGhpcy5hZHZhbmNlTGF5b3V0Q29udGFpbmVyID0gW107XG4gICAgY29uc3QgZmlsdGVyZWRDb2x1bW5zID0gdGhpcy5jb21wb25lbnRDb25maWdEYXRhU291cmNlLmZpbHRlcihjb2x1bW4gPT4gdGhpcy5zZWxlY3RlZFZpZXdzSWRzLmluY2x1ZGVzKGNvbHVtbi52aWV3SWQpKTtcbiAgICBjb25zdCBjb2x1bW5EZWZMaXN0ID0gW107XG5cbiAgICBmaWx0ZXJlZENvbHVtbnMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIC8vIGNvbnN0IGV4aXN0aW5nQ29sdW1uID0gZmFsc2U7XG4gICAgICBsZXQgb2JqID0ge1xuICAgICAgICBcImlkXCI6IHRoaXMuY29tbW9uU2VydmljZS5wcmltZXJ5UmVuZG9tZUlkKDUpLFxuICAgICAgICBcIm5vZGVUaXRsZVwiOiBcIlwiLFxuICAgICAgICBcImNvbXBDb25maWdcIjoge1xuICAgICAgICAgIFwiZHluYW1pY0NvbXBvbmVudFJlZnNcIjogW10sXG4gICAgICAgICAgXCJ2aWV3Q29uZmlnXCI6IFtlbGVtZW50XVxuICAgICAgICB9LFxuICAgICAgICBcImZpbHRlcklkXCI6IG51bGwsXG4gICAgICAgIFwibm9kZVByb3BlcnRpZXNcIjoge1xuICAgICAgICAgIFwiZGlzcGxheVwiOiB0cnVlLFxuICAgICAgICAgIFwid2lkZ2V0VGl0bGVcIjogXCJcIixcbiAgICAgICAgICBcIndpZHRoXCI6IFwiXCIsXG4gICAgICAgICAgXCJoZWlnaHRcIjogXCJcIixcbiAgICAgICAgICBcImlzV2lkZ2V0RmlsdGVyXCI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYWR2YW5jZUxheW91dENvbnRhaW5lci5wdXNoKG9iaik7XG5cbiAgICB9KTtcblxuICAgIHRoaXMuaXNQcm9jZWVkID0gdHJ1ZTtcbiAgfVxuXG4gIGdldFNlbGVjdGVkQ29sdW1uU291cmNlKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmV2ZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlld3NJZHMgPSBldmVudC52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBzdWJtaXRBZHZhbmNlVmlldygpIHtcbiAgICBpZiAodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlICYmIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZSA9IFsuLi50aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUsIC4uLnRoaXMuYWR2YW5jZUxheW91dENvbnRhaW5lcl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZSA9IHRoaXMuYWR2YW5jZUxheW91dENvbnRhaW5lcjtcbiAgICB9XG4gICAgdGhpcy5pc0FkdmFuY2VMYXlvdXQgPSBmYWxzZTtcbiAgICB0aGlzLmFkdmFuY2VMYXlvdXRDb250YWluZXIgPSBbXTtcbiAgICB0aGlzLmlzUHJvY2VlZCA9IGZhbHNlO1xuICAgIHRoaXMudXBkYXRlV2lkZ2V0KCk7XG4gIH1cblxuXG5cbiAgZGVsZXRlVmlldyhpKSB7XG5cbiAgfVxufVxuIiwiPGFwcC1sb2FkaW5nICpuZ0lmPVwibG9hZGluZ01vZGFsXCI+PC9hcHAtbG9hZGluZz5cblxuPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gdy1mdWxsXCI+IC0tPlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaC1zY3JlZW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93IGJvcmRlci1yIGgtZnVsbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsYWJsZS1jb250ZW50XCI+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBwLTIgYm9yZGVyXCI+IC0tPlxuICAgICAgICAgICAgPCEtLSA8YXBwLWFkdmFuY2UtaGVhZGVyIFtmaWx0ZXJJdGVtc109XCJmaWx0ZXJJdGVtc1wiIFtwYWdlVGl0bGVdPVwiJ0Rhc2hib2FyZCdcIiBbaXNFZGl0QnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW2lzQWR2YW5jZUJ1dHRvbl09XCJ0cnVlXCI+PC9hcHAtYWR2YW5jZS1oZWFkZXI+IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIG15LTNcIiAjZHluYW1pY0NvbnRhaW5lcj48L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGgtMTYgbS0yIGJvcmRlclwiPlxuICAgICAgICAgICAgPGxpYi1jb21tb24taGVhZGVyIFtwYWdlVGl0bGVdPVwiJydcIj48L2xpYi1jb21tb24taGVhZGVyPlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gbS0yIFwiIChjbGljayk9XCJnZXRDcmVhdGVEYXRhU2V0UGFnZSgpXCI+Q3JlYXRlXG4gICAgICAgICAgICAgICAgRGF0YXNldFxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IG0tMlwiIChjbGljayk9XCJhZGRXaWRnZXQoKVwiPkFkZCBMYXlvdXRcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gbS0yXCIgKGNsaWNrKT1cImdldENyZWF0ZVZpZXdQYWdlKClcIj5DcmVhdGVcbiAgICAgICAgICAgICAgICBWaWV3XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bk90aGVyc1B1cnBsZX19IG0tMiBjdXJzYXItcG9pbnRlclwiIChjbGljayk9XCJnZXRWaWV3UGFnZSgpXCI+VmlldyBQYWdlXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fd2FybmluZ19tZH19IG0tMiBjdXJzYXItcG9pbnRlclwiIChjbGljayk9XCJnZXRBbGxQYWdlKClcIj5BbGwgUGFnZXNcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1zaHJpbmstMCB3LTEvNCBwLTIgaC1mdWxsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0Rhc2hCb2FyZENvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuRGFya0JsYWNrfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCIgKGNsaWNrKT1cImJhY2tUb01haW5WaWV3KClcIj5cbiAgICAgICAgICAgICAgICBCYWNrXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFnZV9jb25maWcuYXBpX2NvbmZpZzsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBweS0yIGZvbnQtYm9sZCAgdGV4dC13aGl0ZSBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ud2lkR2V0Q29uZmlnLndpZGdldFRpdGxlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIChjbGljayk9XCJlZGl0U2VsZWN0ZWRXaWRnZXQoaXRlbSwgaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy04IGgtOCBiZy1za3ktNjAwIGhvdmVyOmJnLWJsdWUtODAwIHRleHQtd2hpdGUgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1lZGl0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy04IGgtOCBiZy1yZWQtNjAwIGhvdmVyOmJnLXJlZC04MDAgdGV4dC13aGl0ZSByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzV2lkZ2V0Q3JlYXRpb25Db250ZW50XCI+XG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJtYi0yIGZvbnQtYm9sZCB0ZXh0LWxnIHRyYWNraW5nLXRpZ2h0IHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlIGJvcmRlci1iIHBiLTNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZVwiPldpZGdldCBTZXR0aW5nczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzbGF5b3V0Q3JlYXRlXCI+TGF5b3V0IFNldHRpbmdzPC9zcGFuPlxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG15LTRcIj5cbiAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IGNsYXNzPVwibWwtYXV0b1wiIFsobmdNb2RlbCldPVwiYWRkZWR3aWRHZXRDb25maWcuZGlzcGxheVwiIHRleHQ9XCJEaXNwbGF5XCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW1kIG15LWF1dG8gcHgtMlwiPldpZHRoPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IGNsYXNzPVwidy0xLzJcIiBbaXRlbXNdPVwid2lkZ2V0X3dpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhZGRlZHdpZEdldENvbmZpZy53aWR0aFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWQgbXktYXV0byBweC0yXCI+SGVpZ2h0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBjbGFzcz1cInctMS8yXCIgWyhuZ01vZGVsKV09XCJhZGRlZHdpZEdldENvbmZpZy5oZWlnaHRcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTIganVzdGlmeS1iZXR3ZWVuXCIgKm5nSWY9XCIhaXNsYXlvdXRDcmVhdGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWQgbXktYXV0byBweC0yXCI+V2lkZ2V0IFRpdGxlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBjbGFzcz1cInctMS8yXCIgWyhuZ01vZGVsKV09XCJ3aWRnZXRUaXRsZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTIganVzdGlmeS1iZXR3ZWVuXCIgKm5nSWY9XCIhaXNsYXlvdXRDcmVhdGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWQgbXktYXV0byBweC0yXCI+V2lkZ2V0IE5hbWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IGNsYXNzPVwidy0xLzJcIiBbKG5nTW9kZWwpXT1cIndpZGdldE5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItNSBqdXN0aWZ5LWJldHdlZW5cIiAqbmdJZj1cImlzbGF5b3V0Q3JlYXRlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIG15LWF1dG8gcHgtMlwiPkxheW91dCBUaXRsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggY2xhc3M9XCJ3LTEvMlwiIFsobmdNb2RlbCldPVwiYWRkZWR3aWRHZXRDb25maWcud2lkZ2V0VGl0bGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW1kIG15LWF1dG8gcHgtMlwiPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBjbGFzcz1cInctMS8yXCIgW2l0ZW1zXT1cImZpbHRlckRhdGFTb3VyY2VcIiBkaXNwbGF5RXhwcj1cImZpbHRlck5hbWVcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVFeHByPVwiZmlsdGVySWRcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVySWRcIlxuICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiZ2V0RmlsdGVyVmFsdWVCeUlkKCRldmVudClcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNVcGRhdGVXaWRnZXRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNlwiICpuZ0lmPVwiIWlzbGF5b3V0Q3JlYXRlICYmIGlzRWRpdE1haW5MYXlvdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbbmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGU7bGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGJvcmRlci1iIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIHB5LTIgZm9udC1ib2xkICB0ZXh0LXdoaXRlIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzcGFjZS14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDBcIiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvclBhZ2VWaWV3KGksICd1cCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImkgIT09ICBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tuZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZS5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yUGFnZVZpZXcoaSwgJ2Rvd24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTggaC04IGJnLXJlZC02MDAgaG92ZXI6YmctcmVkLTgwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNVcGRhdGVXaWRnZXRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBBcHBsaWNhdGlvbiBWaWV3c1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXIteCBib3JkZXItYiBwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhbGxXaWRnZXRJbm5lckNvbnRlbnQ7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cCAgdy1mdWxsIGZsZXgganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIGZvbnQtYm9sZCAgcHktMiBjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0udmlld05hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggc3BhY2UteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSAwXCIgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JDb2x1bW5zKGksICd1cCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gYWxsV2lkZ2V0SW5uZXJDb250ZW50Lmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JDb2x1bW5zKGksICdkb3duJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctYmx1ZS01MDAgaG92ZXI6YmctYmx1ZS03MDAgbWItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdENvbXBvbmVudFZpZXdzKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV5ZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctYmx1ZS01MDAgaG92ZXI6YmctYmx1ZS03MDAgbWItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdENvbXBvbmVudERhdGFzZXRzKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWRhdGFiYXNlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1yZWQtNTAwIGhvdmVyOmJnLXJlZC03MDAgbWItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0RGVsZXRlVmlld0Zyb21Db25maWcoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVXBkYXRlV2lkZ2V0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gQWRkIEZpbHRlciBGb3IgVmlld1xuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci14IGJvcmRlci1iIHAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBweS0zIGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFsobmdNb2RlbCldPVwiYWRkZWR3aWRHZXRDb25maWcuaXNXaWRnZXRGaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJQb3B1cCBDb2x1bW5zIEZpbHRlciBFbmFibGVcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG15LTIgYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygbm9kZVByb3BlcnRpY2VGaWx0ZXJzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZFwiPklucHV0IFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ3RleHQnXVwiIFsobmdNb2RlbCldPVwiaXRlbS5pbnB1dF90eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInRleHRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMS0xIHctMi8zXCIgKm5nSWY9XCJpdGVtLmlucHV0X3R5cGUgPT0gJ3RleHQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZFwiPlNlcnZlciBDb2x1bW48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uc2VydmVyX2NvbHVtblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMS0xIHctMS8yXCIgKm5nSWY9XCJpdGVtLmlucHV0X3R5cGUgPT0gJ3RleHQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZFwiPkxvY2FsIENvbHVtbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5sb2NhbF9jb2x1bW5cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEtMSB3LTEvM1wiICpuZ0lmPVwiaXRlbS5pbnB1dF90eXBlID09ICdzZWxlY3QnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZFwiPkNvbHVtbnMgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5zZWxlY3RfYm94X29wdGlvblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMS0xIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IHctMjQgbXQtNiB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVOb2RlRmlsdGVyKGkpXCI+RGVsZXRlIEZpbHRlcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gdy1hdXRvIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXROb2RlUHJvcGVydGljZUZpbHRlck9wdGlvbigpXCI+QWRkXG4gICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXIgaC0xNiBtLTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bkRhcmtCbGFja319IG0tMiB3LWZpdCB0ZXh0LWNlbnRlciBjdXJzYXItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiYWNrVG9NYWluVmlldygpXCI+QmFja1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNVcGRhdGVXaWRnZXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzbGF5b3V0Q3JlYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRMYXlvdXRUT3ZpZXcoKVwiPkFkZCBWaWV3XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzbGF5b3V0Q3JlYXRlICYmICFpc0VkaXRNYWluTGF5b3V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRXaWRnZXRUT3ZpZXcoKVwiPkFkZCBMYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNsYXlvdXRDcmVhdGUgJiYgaXNFZGl0TWFpbkxheW91dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IG0tMiB3LWZpdCB0ZXh0LWNlbnRlciBjdXJzYXItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlTGF5b3V0V2lkZ2V0VE92aWV3KClcIj5VcGRhdGUgTGF5b3V0XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl93YXJuaW5nX21kfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVRvVmlldygpXCIgKm5nSWY9XCJpc1VwZGF0ZVdpZGdldFwiPlVwZGF0ZSBWaWV3XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDwhLS0gPHByZT48Y29kZT57e2Rhc2hCb2FyZFdpZGdldENvbmZpZyB8IGpzb259fTwvY29kZT48L3ByZT4gLS0+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDaGFydEJ1dHRvbkNsaWNrXCI+XG4gICAgICAgICAgICA8aDZcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1iLTIgZm9udC1ib2xkIHRleHQtbWQgdHJhY2tpbmctdGlnaHQgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUgYm9yZGVyLWIgcGItMyBmbGV4ICBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJhci1jaGFydC1vIG1yLTJcIj48L2k+IFNlbGVjdCBWaWV3XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5EYXJrQmxhY2t9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmFja1RvTWFpblZpZXcoKVwiPkJhY2tcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvaDY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIGgtWzgwdmhdIG92ZXJmbG93LXgtYXV0b1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBteS0yIFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInZpZXdUb1NlYXJjaFwiIChrZXl1cCk9XCJmaWx0ZXJWaWV3cygpXCIgKGtleWRvd24pPVwiZmlsdGVyVmlld3MoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJnLWdyYXktODAwIGJvcmRlciBib3JkZXItZ3JheS03MDAgdGV4dC1ncmF5LTIwMCB0ZXh0LXNtIGZvY3VzOnJpbmctZ3JheS00MDAgZm9jdXM6Ym9yZGVyLWdyYXktNTAwIGJsb2NrIHctZnVsbCBwLTQgaC04IHJvdW5kZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggVmlld1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQteS0wIHJpZ2h0LTAgZmxleCBpdGVtcy1jZW50ZXIgcHItNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm90YXRlLTkwIGN1cnNvci1wb2ludGVyXCIgW3N2Z0ljb25dPVwiJ2hlcm9pY29uc19vdXRsaW5lOnNlYXJjaCdcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkQ29tcG9uZW50Q29uZmlnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBncm91cCBteS0zIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJdGVtIFZpZXcgTmFtZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIGZvbnQtYm9sZCBib3JkZXItYiBweS0yIGN1cnNhci1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnZpZXdOYW1lfX08L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIb3ZlciBCdXR0b25zIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTAgIHJpZ2h0LTAgZmxleCBzcGFjZS14LTIgb3BhY2l0eS0wIGdyb3VwLWhvdmVyOm9wYWNpdHktMTAwIHRyYW5zaXRpb24tb3BhY2l0eSBkdXJhdGlvbi0zMDAgcGItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctYmx1ZS01MDAgaG92ZXI6YmctYmx1ZS03MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wZW5jaWwtc3F1YXJlLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRDb21wb25lbnRWaWV3cyhpdGVtKVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm91bmRlZC1mdWxsIHAtMiB0ZXh0LXdoaXRlIGJnLWdyZWVuLTUwMCBob3ZlcjpiZy1ncmVlbi03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0Q29tcG9uZW50Q29uZmlnKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1c1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNEZWZhdWx0Vmlld1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0czsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cCBteS0zIHctZnVsbCBmbGV4IGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgZm9udC1ib2xkICBweS0yIGN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ud2lkZ2V0VGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzcGFjZS14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSAwXCIgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yV2lkZ2V0KGksICd1cCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yV2lkZ2V0KGksICdkb3duJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctYmx1ZS01MDAgaG92ZXI6YmctYmx1ZS03MDAgbWItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldEVkaXRWaWV3RnJvbUxheW91dChpdGVtLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wZW5jaWwtc3F1YXJlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctcmVkLTUwMCBob3ZlcjpiZy1yZWQtNzAwIG1iLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXREZWxldGVWaWV3RnJvbUxheW91dChpdGVtLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgIDwvZGl2PlxuPC9kaXY+XG48IS0tIDwvZGl2PiAtLT5cblxuPGR4LXBvcHVwIFsodmlzaWJsZSldPVwiaXNFZGl0T3B0aW9uQ2xpY2tcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJmYWxzZVwiIFtkcmFnRW5hYmxlZF09XCJmYWxzZVwiIFt3aWR0aF09XCIxMjAwXCJcbiAgICBbaGVpZ2h0XT1cIidhdXRvJ1wiIFtzaG93VGl0bGVdPVwidHJ1ZVwiIGNsYXNzPVwicG9wdXBcIiB0aXRsZT1cInt7ZWRpdFZpZXdkYXRhU291cmNlTW9kYWwudmlld05hbWV9fVwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cblxuICAgICAgICA8YXBwLWRhc2gtY2hhcnQgW2RhdGFzZXRtb2RhbF09XCJlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbFwiIChnZXRDaGFydENvbmZpZ091dFB1dCk9XCJnZXRFbWl0TmV3Q2hhcnRDb25naWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAqbmdJZj1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsLnZpZXdUeXBlID09ICdjaGFydCdcIj48L2FwcC1kYXNoLWNoYXJ0PlxuICAgICAgICA8YXBwLWRhc2gtdGFibGUgW2RhdGFzZXRtb2RhbF09XCJlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbFwiIChnZXRUYWJsZUNvbmZpZ091dFB1dCk9XCJnZXRFbWl0TmV3Q2hhcnRDb25naWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAqbmdJZj1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsLnZpZXdUeXBlID09ICd0YWJsZSdcIj48L2FwcC1kYXNoLXRhYmxlPlxuICAgICAgICA8IS0tIDxhcHAtZGFzaC1vdGhlciBbZGF0YXNldG1vZGFsXT1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsXCIgKm5nSWY9XCJlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbC52aWV3VHlwZSA9PSAnb3RoZXJzJ1wiXG4gICAgICAgICAgICAoY3JlYXRlT3RoZXJDb21wb25lbnRWaWV3KT1cImdldEVtaXROZXdDaGFydENvbmdpZygkZXZlbnQpXCI+PC9hcHAtZGFzaC1vdGhlcj4gLS0+XG4gICAgPC9kaXY+XG48L2R4LXBvcHVwPlxuXG5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzQ3JlYXRlRGF0YXNldFwiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjEyMDBcIlxuICAgIFtoZWlnaHRdPVwiNjAwXCIgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwiRGF0YXNldCBFZGl0b3JcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkeC1zY3JvbGwtdmlldyBjbGFzcz1cImgtZnVsbFwiIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxMDAlJ1wiPlxuICAgICAgICAgICAgPGFwcC1jcmVhdGUtZGF0YXNldCBbaXNIZWFkZXJdPVwiZmFsc2VcIj48L2FwcC1jcmVhdGUtZGF0YXNldD5cbiAgICAgICAgPC9keC1zY3JvbGwtdmlldz5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+XG48ZHgtcG9wdXAgWyh2aXNpYmxlKV09XCJpc0NyZWF0ZURhdGFzZXRXaXRoRGF0YXNldElkXCIgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwiZmFsc2VcIiBbZHJhZ0VuYWJsZWRdPVwiZmFsc2VcIiBbd2lkdGhdPVwiMTIwMFwiXG4gICAgW2hlaWdodF09XCI2MDBcIiBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJEYXRhc2V0IEVkaXRvclwiIChvbkhpZGRlbik9XCJnZXREYXRhc2V0UG9wdXBIaWRlKCRldmVudClcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkeC1zY3JvbGwtdmlldyBjbGFzcz1cImgtZnVsbFwiIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxMDAlJ1wiPlxuICAgICAgICAgICAgPGFwcC1jcmVhdGUtZGF0YXNldCBbc2VsZWN0ZWREYXRhc2V0SWRdPVwic2VsZWN0ZWREYXRhc2V0SWRcIiBbaXNIZWFkZXJdPVwiZmFsc2VcIj48L2FwcC1jcmVhdGUtZGF0YXNldD5cbiAgICAgICAgPC9keC1zY3JvbGwtdmlldz5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+XG5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzQ3JlYXRlTmV3Vmlld1dpdGhEZWZhdWx0Vmlld1wiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCJcbiAgICBbd2lkdGhdPVwiMTIwMFwiIFtoZWlnaHRdPVwiNjAwXCIgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwiVmlld3MgRWRpdG9yXCJcbiAgICAob25IaWRkZW4pPVwiZ2V0Vmlld1BvcHVwSGlkZSgkZXZlbnQpXCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuICAgICAgICA8ZHgtc2Nyb2xsLXZpZXcgY2xhc3M9XCJoLWZ1bGxcIiBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInMTAwJSdcIj5cbiAgICAgICAgICAgIDxhcHAtY3JlYXRlLWNvbXAtdmlldyBbc2VsZWN0ZWRWaWV3SWRdPVwic2VsZWN0ZWRWaWV3SWRcIiBbaXNIZWFkZXJdPVwiZmFsc2VcIj48L2FwcC1jcmVhdGUtY29tcC12aWV3PlxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzQ3JlYXRlTmV3Vmlld1wiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjEyMDBcIlxuICAgIFtoZWlnaHRdPVwiNjAwXCIgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwiVmlld3MgRWRpdG9yXCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuICAgICAgICA8ZHgtc2Nyb2xsLXZpZXcgY2xhc3M9XCJoLWZ1bGxcIiBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInMTAwJSdcIj5cbiAgICAgICAgICAgIDxhcHAtY3JlYXRlLWNvbXAtdmlldyBbaXNIZWFkZXJdPVwiZmFsc2VcIj48L2FwcC1jcmVhdGUtY29tcC12aWV3PlxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD5cblxuXG48ZHgtcG9wdXAgWyh2aXNpYmxlKV09XCJpc1dpZGdldEZpbHRlcnNcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJmYWxzZVwiIFtkcmFnRW5hYmxlZF09XCJmYWxzZVwiIFt3aWR0aF09XCI4MDBcIiBbaGVpZ2h0XT1cIjQwMFwiXG4gICAgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwiRGF0YXNldCBGaWx0ZXJcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJteS0yXCI+XG4gICAgICAgICAgICA8ZHgtc2Nyb2xsLXZpZXcgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzg1JSdcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIG5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5jb2x1bW5OYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ2dldCcsJ2xldCddXCIgWyhuZ01vZGVsKV09XCJpdGVtLm9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJPcGVyYXRvclwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0udmFsdWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgbXgtMSBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdWJtaXRGaWx0ZXIoKVwiPlN1Ym1pdDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+XG48ZHgtcG9wdXAgWyh2aXNpYmxlKV09XCJpc0FkdmFuY2VMYXlvdXRcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJmYWxzZVwiIFtkcmFnRW5hYmxlZF09XCJmYWxzZVwiIFt3aWR0aF09XCIxMjAwXCJcbiAgICBbaGVpZ2h0XT1cIjcwMFwiIFtzaG93VGl0bGVdPVwidHJ1ZVwiIGNsYXNzPVwicG9wdXBcIiB0aXRsZT1cIkRhdGFzZXQgRmlsdGVyXCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBweC0yIG1iLTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTIvMyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPlNlbGVjdCBWaWV3czwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10YWctYm94IFtkYXRhU291cmNlXT1cImNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2VcIiB2YWx1ZUV4cHI9XCJ2aWV3SWRcIiBkaXNwbGF5RXhwcj1cInZpZXdOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW211bHRpbGluZV09XCJ0cnVlXCIgW3Nob3dTZWxlY3Rpb25Db250cm9sc109XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFZpZXdzSWRzXCJcbiAgICAgICAgICAgICAgICAgICAgW21heERpc3BsYXllZFRhZ3NdPVwiM1wiIChvblZhbHVlQ2hhbmdlZCk9XCJnZXRTZWxlY3RlZENvbHVtblNvdXJjZSgkZXZlbnQpXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDwvZHgtdGFnLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8zIHB4LTJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gbXQtNlwiIChjbGljayk9XCJnZXRQcm9jZXNzRm9yQ29uZmlnKClcIj5cbiAgICAgICAgICAgICAgICAgICAgQWRkIFRvIFZpZXdcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9tZH19IGN1cnNvci1wb2ludGVyIG10LTZcIiAoY2xpY2spPVwiY2FuY2VsQ2RyQ29uZmlnKClcIj5DYW5jZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGR4LXNjcm9sbC12aWV3IFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIic4MCUnXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTIgYm9yZGVyLWJcIiAqbmdJZj1cImlzUHJvY2VlZFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYWR2YW5jZUxheW91dENvbnRhaW5lcjsgbGV0IGkgPSBpbmRleDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5WaWV3IE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmNvbXBDb25maWcudmlld0NvbmZpZ1swXS52aWV3TmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPldpZGdldCBUaXRsZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPldpZGdldCBXaWR0aDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwid2lkZ2V0X3dpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZHRoXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPldpZGdldCBIZWlnaHQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLm5vZGVQcm9wZXJ0aWVzLmhlaWdodFwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPldpZGdldCBGaWx0ZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiZmlsdGVyRGF0YVNvdXJjZVwiIGRpc3BsYXlFeHByPVwiZmlsdGVyTmFtZVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUV4cHI9XCJmaWx0ZXJJZFwiIFsobmdNb2RlbCldPVwiaXRlbS5maWx0ZXJJZFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtdC04XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLm5vZGVQcm9wZXJ0aWVzLmRpc3BsYXlcIiB0ZXh0PVwiRGlzcGxheVwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyIG10LThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlVmlldyhpKVwiPjxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBteC0xIG15LTIgZmxleC1ncm93XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiIChjbGljayk9XCJzdWJtaXRBZHZhbmNlVmlldygpXCI+QWRkXG4gICAgICAgICAgICAgICAgTGF5b3V0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD4iXX0=
966
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3BhZ2UtY29udHJvbGxlci9wYWdlLWNvbmZpZy9wYWdlLWNvbmZpZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvcGFnZS1jb250cm9sbGVyL3BhZ2UtY29uZmlnL3BhZ2UtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFrRyxTQUFTLEVBQWdCLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSXBNLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRCxPQUFPLE1BQU0sTUFBTSx1QkFBdUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxRkFBcUYsQ0FBQztBQUNsSSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5RUFBeUUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxtR0FBbUcsQ0FBQztBQUN0SixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyRkFBMkYsQ0FBQztBQUMxSSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxxR0FBcUcsQ0FBQztBQUN6SixPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxxR0FBcUcsQ0FBQztBQUV6SixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxtRkFBbUYsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFP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LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZiwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIE9uSW5pdCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FeHRyYXMsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY29uZmlybSB9IGZyb20gJ2RldmV4dHJlbWUvdWkvZGlhbG9nJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgRHhTY3JvbGxWaWV3Q29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uRGF0c3NldHNDYWxsIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tZGF0YXNldC1jYWxsLnNlcnZpY2UnO1xuaW1wb3J0IG1vbWVudCBmcm9tICcuLy4uLy4uL21vbWVudC1oZWxwZXInO1xuaW1wb3J0IHsgR2FtbWFUb2RheVByZXZpb3VzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS10b2RheS1wcmV2aW91cy9nYW1tYS10b2RheS1wcmV2aW91cy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXBwQWR2YW5jZUhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvYXBwLWFkdmFuY2UtaGVhZGVyL2FwcC1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlL2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbVNpbmdsZU51bWJlckNhcmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW0tc2luZ2xlLW51bWJlci1jYXJkL2dhbW0tc2luZ2xlLW51bWJlci1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYUFkdmFuY2VPcGVyYXRvclRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS1hZHZhbmNlLW9wZXJhdG9yLXRhYmxlL2dhbW1hLWFkdmFuY2Utb3BlcmF0b3ItdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEFkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2FkdmFuY2Utd2lkZ2V0LWhlYWRlci1maWx0ZXIvYWR2YW5jZS13aWRnZXQtaGVhZGVyLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5pbXBvcnQgeyBHYW1tYUFkdmFuY2VDaGFydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtYWR2YW5jZS1jaGFydC9nYW1tYS1hZHZhbmNlLWNoYXJ0LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1kYXNoYm9yZC1jb25maWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFnZS1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYWdlLWNvbmZpZy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VDb25maWdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGRhc2hib3JkX2NvbnRhaW5lcjogYW55ID0gW107XG4gIHNlbGVjdGVkX3dpZHRoOiBhbnk7XG4gIHdpZGdldF93aWR0aCA9IFsndy1mdWxsJywgJ3ctMS8yJywgJ3ctMS8zJywgJ3ctMi8zJywgJ3ctMS80JywgJ3ctMy80JywgJ3ctMS81JywgJ3ctNC81JywgJ3ctMS82JywgJ3ctNS82J11cbiAgbG9hZGluZ01vZGFsOiBib29sZWFuID0gdHJ1ZTtcbiAgY3VzdG9tZXJzOiBhbnk7XG4gIHBhZ2VIZWFkZXJzRGF0YTogYW55O1xuICBwYWdlX3RpdGxlID0gJ0Rhc2hib2FyZCc7XG4gIGlzU3J2VHlwZU9wZXJhdG9yOiBib29sZWFuO1xuICBkZWZhdWx0U3RhcnREYXRlO1xuICBkZWZhdWx0RW5kRGF0ZTtcbiAgcGFnZV9jb25maWc7XG4gIG9wZXJhdGlvbkxldmVsczogYW55O1xuICBmaWx0ZXJfdmFsdWU7XG4gIGlzVG9nZ2xlU3dpY2g6IGJvb2xlYW4gPSB0cnVlO1xuICBpc0RhdGVQaWNrZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNUb2dnbGVFdmVudFN0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0VkaXRDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvbmZpZ1ZpZXc6IGJvb2xlYW47XG4gIGlzTG9hZGVyOiBib29sZWFuO1xuICBjb21wb25lbnROYW1lOiBhbnk7XG4gIGlzVXBkYXRlV2lkZ2V0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgaXNDaGFydEJ1dHRvbkNsaWNrOiBib29sZWFuO1xuICBjaGFydEFjY2VzczogYW55O1xuICBjaGFydFR5cGU6IGFueTtcbiAgZGFzaENoYXJ0Q29tU291cmNlOiBhbnk7XG4gIGlzR2VuZXJhdGU6IGJvb2xlYW5cbiAgaXNGaWx0ZXJJbnB1dHM6IGJvb2xlYW5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIEBWaWV3Q2hpbGQoJ2R5bmFtaWNDb21wb25lbnRDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGNvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnZHluYW1pY0NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGR5bmFtaWNDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgZHluYW1pY0NvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcbiAgLy8gZHluYW1pY0NvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcblxuICBDb21wUmVmczogQ29tcG9uZW50UmVmPGFueT47XG5cbiAgY29tcG9uZW50Q2xhc3NNYXAgPSB7XG4gICAgR2FtbWFBZHZhbmNlQ2hhcnRDb21wb25lbnQsXG4gICAgR2FtbWFUb2RheVByZXZpb3VzQ29tcG9uZW50LFxuICAgIEFwcEFkdmFuY2VIZWFkZXJDb21wb25lbnQsXG4gICAgR2FtbWFUYWJsZVdpdGhQZXJjZW50YWdlQ29tcG9uZW50LFxuICAgIEdhbW1TaW5nbGVOdW1iZXJDYXJkQ29tcG9uZW50LFxuICAgIEdhbW1hQWR2YW5jZU9wZXJhdG9yVGFibGVDb21wb25lbnQsXG4gICAgQWR2YW5jZVdpZGdldEhlYWRlckZpbHRlckNvbXBvbmVudFxuICB9O1xuICBkYXRhU291cmNlTWF0YURhdGE6IGFueSA9IFtdO1xuICBxdWVyeVR5cGUgPSBcIm1vbmdvXCI7XG4gIGRhdGFTZXRNb2RhbDogYW55ID0gW107XG4gIGNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBzZWxlc2NlZERhdGFTb3VyY2U6IGFueTtcbiAgZGF0YVNvdXJjZU1vZGFsOiBhbnkgPSB7fTtcbiAgaXNEYXNoQm9hcmRDb250ZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2VsZWN0ZWRWaWV3Rm9ybUNvbXBvbmVudDogYW55ID0ge307XG4gIGFkZGVkd2lkR2V0Q29uZmlnID0ge1xuICAgIFwiZGlzcGxheVwiOiB0cnVlLFxuICAgIFwid2lkZ2V0VGl0bGVcIjogXCJcIixcbiAgICBcIndpZHRoXCI6IFwiXCIsXG4gICAgXCJoZWlnaHRcIjogXCJcIixcbiAgICBcImlzV2lkZ2V0RmlsdGVyXCI6IGZhbHNlXG4gIH1cblxuICBkYXNoQm9hcmRXaWRnZXRDb25maWc6IGFueSA9IFtcbiAgXTtcbiAgaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQ6IGJvb2xlYW47XG4gIHNlbGVjdGVkV2lkdGg6IGFueTtcbiAgc2VsZWN0ZWRIZWlnaHQ6IGFueTtcbiAgbmV3V2lkZ2V0SW5kZXg6IGFueTtcbiAgc2VsZWN0ZWRJbmRleE9iakZvckNoYXJ0OiBhbnkgPSB7fTtcbiAgc2VsZWN0ZWRDb250YWluZXJPYmplY3RGb3JDaGFydDogYW55ID0ge307XG4gIGRhdGFTZXR0YWJsZURhdGFTb3VyY2U6IGFueTtcbiAgdW5pcXVlRGF0YVNldE9iamVjdCA9IHt9O1xuXG4gIGlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3OiBib29sZWFuO1xuICBwYWdlSWQ6IGFueTtcbiAgaXNsYXlvdXRDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgd2lkZ2V0TmFtZTogYW55O1xuICB3aWRnZXRUaXRsZTogYW55O1xuICBhbGxXaWRnZXRJbm5lckNvbnRlbnQ6IGFueTtcbiAgaXNEZWZhdWx0VmlldzogQm9vbGVhbiA9IHRydWU7XG4gIGlzRWRpdE1haW5MYXlvdXQ6IEJvb2xlYW47XG4gIGZpbHRlckRhdGFTb3VyY2U6IGFueTtcbiAgc2VsZWN0ZWRGaWx0ZXJJZDogYW55O1xuXG4gIHZpZXdUb1NlYXJjaDogc3RyaW5nID0gJyc7XG4gIGZpbHRlcmVkQ29tcG9uZW50Q29uZmlnOiBhbnlbXSA9IFtdO1xuICBpc0VkaXRPcHRpb25DbGljazogYm9vbGVhbjtcbiAgZWRpdFZpZXdkYXRhU291cmNlTW9kYWw6IGFueSA9IHt9O1xuXG4gIGVkaXRJdGVtRm9yVXBkYXRlOiBhbnkgPSB7fTtcbiAgcGFnZVRpdGxlOiBhbnk7XG4gIHBhZ2VVcmw6IGFueTtcbiAgYWxsV2lkZ2V0QnlEYXRhc2V0OiBhbnkgPSBbXTtcblxuICBzZWxlY3RlZEZpbHRlcnNEZWZhdWx0OiBhbnk7XG5cbiAgbm9kZVByb3BlcnRpY2VGaWx0ZXJzOiBhbnkgPSBbXTtcblxuICBpc0NyZWF0ZURhdGFzZXQ6IGJvb2xlYW47XG4gIHNlbGVjdGVkRGF0YXNldElkOiBhbnk7XG4gIGlzQ3JlYXRlRGF0YXNldFdpdGhEYXRhc2V0SWQ6IGJvb2xlYW47XG5cbiAgaXNDcmVhdGVOZXdWaWV3OiBib29sZWFuO1xuICBpc0NyZWF0ZU5ld1ZpZXdXaXRoRGVmYXVsdFZpZXc6IGJvb2xlYW47XG5cbiAgZGVmYXVsdEFwcGx5ZWRGaWx0ZXI6IGFueTtcbiAgaXNXaWRnZXRGaWx0ZXJzOiBib29sZWFuO1xuICBub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2U6IGFueTtcbiAgc2VsZWN0ZWRGaWx0ZXJEYXRhc291cmNlOiBhbnkgPSB7fTtcbiAgQFZpZXdDaGlsZChEeFNjcm9sbFZpZXdDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSBzY3JvbGxWaWV3OiBEeFNjcm9sbFZpZXdDb21wb25lbnQ7XG5cbiAgc2VsZWN0ZWRWaWV3SWQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIHNlcnZpY2U6IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGRhdGFzZXRTZXJ2aWNlOiBBcHBsaWNhdGlvbkRhdHNzZXRzQ2FsbCxcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3ID0gKHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ2NvbnRlbnRUeXBlJ10gPT0gJ3ZpZXcnKSA/IHRydWUgOiBmYWxzZTtcbiAgICB0aGlzLnBhZ2VJZCA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ3BhZ2VJZCddO1xuXG4gICAgdGhpcy5nZXREYXRhU2V0KCk7XG4gICAgdGhpcy5kZWZhdWx0U3RhcnREYXRlID0gbW9tZW50KCkuc3VidHJhY3QoJzEwJywgJ2RheXMnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICB0aGlzLmRlZmF1bHRFbmREYXRlID0gbW9tZW50KCkuc3VidHJhY3QoJzEnLCAnZGF5cycpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgIHRoaXMuZ2V0RmlsdGVySXRlbXMoKVxuICAgIHRoaXMuZ2V0QWxsVmlld3NJdGVtcygpXG5cbiAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG4gIH1cblxuICBnZXRBbGxWaWV3c0l0ZW1zKCkge1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBWaWV3Q29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb21wb25lbnRDb25maWcgPSB0aGlzLmNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2U7XG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnVmlldyBDb25maWcnKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0RmlsdGVySXRlbXMoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcEZpbHRlckNvbmZpZ3MoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmZpbHRlckRhdGFTb3VyY2UgPSBkYXRhO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0Vycm9yJyk7XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBnZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcFBhZ2VEZXRhaWxDb25maWcodGhpcy5wYWdlSWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnID0gZGF0YTtcbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBkYXRhLnBhZ2VOYW1lO1xuICAgICAgICB0aGlzLnBhZ2VVcmwgPSBkYXRhLnBhZ2VVcmw7XG4gICAgICAgIGlmIChkYXRhLndpZGdldHMgJiYgZGF0YS53aWRnZXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMuZ2V0Q29tcG9uZW50Q29uZmlnU2V0KClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0Vycm9yJyk7XG5cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBnZXRDb21wb25lbnRDb25maWdTZXQoKSB7XG4gICAgbGV0IGRlZmF1bHRGaWx0ZXJzID0geyBvcGVyYXRpb25GaWx0ZXI6IHsgc3RhcnREYXRlOiBcIlwiLCBlbmREYXRlOiBcIlwiIH0gfTtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZvckVhY2god2lkZ2V0ID0+IHtcbiAgICAgIGlmICh3aWRnZXQuZmlsdGVycykge1xuICAgICAgICB3aWRnZXQuZmlsdGVycy5maWx0ZXJJdGVtcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50LmZpbHRlclR5cGUgPT09ICdkYXRlJyB8fCBlbGVtZW50LmZpbHRlclR5cGUgPT09ICdkYXRldGltZScpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRlZmF1bHRGaWx0ZXJUeXBlID09PSBcImR5bmFtaWNcIiAmJiBlbGVtZW50Lm1vbWVudEZ1bmN0aW9uICE9PSBcIlwiICYmIGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiICYmIGVsZW1lbnQubW9tZW50Rm9ybWF0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgIGxldCBbY291bnQsIHVuaXRdID0gZWxlbWVudC5kZWZhdWx0RmlsdGVyVmFsdWUuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJlbmREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kaXNwbGF5KSB7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXIuZW5kRGF0ZSA9IG1vbWVudCgpW2VsZW1lbnQubW9tZW50RnVuY3Rpb25dKHBhcnNlSW50KGNvdW50KSwgdW5pdCkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwic3RhcnREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXIuc3RhcnREYXRlID0gbW9tZW50KClbZWxlbWVudC5tb21lbnRGdW5jdGlvbl0ocGFyc2VJbnQoY291bnQpLCB1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKHR5cGVvZiBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZSAhPT0gXCJcIikgfHxcbiAgICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUpICYmIGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQub3BlcmF0b3JOYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyW2VsZW1lbnQub3BlcmF0b3JOYW1lXSA9IEFycmF5LmlzQXJyYXkoZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUpXG4gICAgICAgICAgICAgICAgICA/IGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlXG4gICAgICAgICAgICAgICAgICA6IFtlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZV07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyW2VsZW1lbnQuYXBpTmFtZV0gPSBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZS5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgIH0pO1xuICAgIGxldCBhcGlDYWxscyA9IFtdO1xuICAgIHRoaXMuZGVmYXVsdEFwcGx5ZWRGaWx0ZXIgPSBkZWZhdWx0RmlsdGVycztcblxuICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgIC8vIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgICAgdGhpcy5jcmVhdGVEaXZFbGVtZW50cyh0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QpO1xuICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cbiAgfVxuXG4gIGdldERhdGFTZXQoKSB7XG4gICAgdGhpcy5pc0xvYWRlciA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcERhdGFzZXRDb25maWdzKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhU2V0dGFibGVEYXRhU291cmNlID0gZGF0YTtcbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0RhdGFzZXQgQ3JlYXRpb24nKVxuXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cblxuXG4gIGdldENvbXBvbmVudENvbmZpZyhldmVudCkge1xuICAgIGNvbnN0IGZvdW5kT2JqZWN0ID0gdGhpcy5jb21wb25lbnRDb25maWdEYXRhU291cmNlLmZpbmQodmlldyA9PiB2aWV3LnZpZXdJZCA9PT0gZXZlbnQudmlld0lkKTtcbiAgICB0aGlzLmdldEVtaXROZXdDaGFydENvbmZpZyhmb3VuZE9iamVjdCk7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICB9XG5cbiAgYWRkTmV3Y2hhcnQoKSB7XG4gICAgdGhpcy5pc0dlbmVyYXRlID0gZmFsc2U7XG4gICAgdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2sgPSB0cnVlO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSBmYWxzZTtcbiAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSBmYWxzZTtcbiAgfVxuXG5cbiAgYWRkV2lkZ2V0KCkge1xuICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IHRydWU7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gZmFsc2U7XG4gICAgdGhpcy5pc0VkaXRNYWluTGF5b3V0ID0gZmFsc2U7XG4gICAgdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLmlzVXBkYXRlV2lkZ2V0ID0gZmFsc2U7XG4gICAgdGhpcy53aWRnZXROYW1lID0gJyc7XG4gICAgdGhpcy53aWRnZXRUaXRsZSA9ICcnO1xuICAgIHRoaXMuYWRkZWR3aWRHZXRDb25maWcgPSB7XG4gICAgICBcImRpc3BsYXlcIjogdHJ1ZSxcbiAgICAgIFwid2lkZ2V0VGl0bGVcIjogXCJcIixcbiAgICAgIFwid2lkdGhcIjogXCJcIixcbiAgICAgIFwiaGVpZ2h0XCI6IFwiXCIsXG4gICAgICBcImlzV2lkZ2V0RmlsdGVyXCI6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgZ2V0V2l0aChlKSB7XG4gICAgdGhpcy5zZWxlY3RlZFdpZHRoID0gZS52YWx1ZTtcbiAgfVxuXG4gIGdldEhlaWdodChlKSB7XG4gICAgdGhpcy5zZWxlY3RlZEhlaWdodCA9IGUudmFsdWU7XG4gIH1cblxuICBhZGRMYXlvdXRUT3ZpZXcoKSB7XG4gICAgbGV0IGlubmVyX25vZGUgPSB7XG4gICAgICBpZDogdGhpcy5jb21tb25TZXJ2aWNlLnByaW1lcnlSZW5kb21lSWQoNSksXG4gICAgICBub2RlVGl0bGU6IFwiXCIsXG4gICAgICBmaWx0ZXJJZDogdGhpcy5zZWxlY3RlZEZpbHRlcklkLFxuICAgICAgbm9kZVByb3BlcnRpZXM6IHRoaXMuYWRkZWR3aWRHZXRDb25maWcsXG4gICAgICBjb21wQ29uZmlnOiB7XG4gICAgICAgIGR5bmFtaWNDb21wb25lbnRSZWZzOiBbXSxcbiAgICAgICAgdmlld0NvbmZpZzogW11cbiAgICAgIH0sXG4gICAgfVxuICAgIGlmICh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUpIHtcbiAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZS5wdXNoKGlubmVyX25vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUgPSBbXTtcbiAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZS5wdXNoKGlubmVyX25vZGUpO1xuICAgIH1cblxuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnVwZGF0ZVdpZGdldCgpO1xuICB9XG5cblxuXG4gIHJlZm9ybWF0V2lkZ2V0Q29uZmlnKGRhc2hCb2FyZFdpZGdldENvbmZpZywgaW5kZXggPSBudWxsKSB7XG4gICAgY29uc3QgcHJvY2Vzc1dpZGdldCA9ICh3aWRnZXQpID0+IHtcbiAgICAgIHdpZGdldC5jb21wQ29uZmlnLnZpZXdDb25maWcgPSB3aWRnZXQuY29tcENvbmZpZy52aWV3Q29uZmlnLm1hcChjb25maWcgPT4gY29uZmlnLnZpZXdJZCk7XG4gICAgICB3aWRnZXQuY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcyA9IFtdO1xuXG4gICAgICBpZiAod2lkZ2V0LndpZGdldE5vZGUgJiYgd2lkZ2V0LndpZGdldE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICB3aWRnZXQud2lkZ2V0Tm9kZS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnID0gbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcubWFwKGNvbmZpZyA9PiBjb25maWcudmlld0lkKTtcbiAgICAgICAgICBub2RlLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChpbmRleCAhPT0gbnVsbCAmJiBpbmRleCA+PSAwICYmIGluZGV4IDwgZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMubGVuZ3RoKSB7XG4gICAgICBwcm9jZXNzV2lkZ2V0KGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW2luZGV4XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZvckVhY2god2lkZ2V0ID0+IHByb2Nlc3NXaWRnZXQod2lkZ2V0KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW2luZGV4XTtcbiAgfVxuXG4gIHVwZGF0ZVdpZGdldCgpIHtcbiAgICBsZXQgbW9kaWZpZWRDb25maWcgPSB0aGlzLnJlZm9ybWF0V2lkZ2V0Q29uZmlnKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLCB0aGlzLm5ld1dpZGdldEluZGV4KTtcbiAgICBtb2RpZmllZENvbmZpZ1snZmlsdGVySWQnXSA9IChtb2RpZmllZENvbmZpZy5maWx0ZXJzICYmIG1vZGlmaWVkQ29uZmlnLmZpbHRlcnMuZmlsdGVySWQpID8gbW9kaWZpZWRDb25maWcuZmlsdGVycy5maWx0ZXJJZCA6IG51bGw7XG4gICAgZGVsZXRlIG1vZGlmaWVkQ29uZmlnWydmaWx0ZXJzJ107XG4gICAgdGhpcy5zZXJ2aWNlLmVkaXRBcHBXaWRnZXRDb25maWcobW9kaWZpZWRDb25maWcpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0QXBwUGFnZURldGFpbENvbmZpZ0J5UGFnZUlkKClcbiAgICAgICAgdGhpcy5iYWNrVG9NYWluVmlldygpO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1dpZGdldCBDcmVhdGlvbicpXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSBmYWxzZTtcbiAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSB0cnVlO1xuICB9XG5cbiAgdXBkYXRlTGF5b3V0V2lkZ2V0VE92aWV3KCkge1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnVwZGF0ZVdpZGdldCgpO1xuICB9XG5cbiAgYWRkV2lkZ2V0VE92aWV3KCkge1xuICAgIGxldCBvYmogPSB7XG4gICAgICB3aWRnZXRJZDogdGhpcy5jb21tb25TZXJ2aWNlLnByaW1lcnlSZW5kb21lSWQoNSksXG4gICAgICB3aWRnZXROYW1lOiB0aGlzLndpZGdldE5hbWUsXG4gICAgICB3aWRnZXRUaXRsZTogdGhpcy53aWRnZXRUaXRsZSxcbiAgICAgIHdpZGdldFByb3BlcnRpZXM6IHRoaXMuYWRkZWR3aWRHZXRDb25maWcsXG4gICAgICBwYWdlSWQ6IHRoaXMucGFnZUlkLFxuICAgICAgZmlsdGVySWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJJZCxcbiAgICAgIHdpZGdldE5vZGU6IFtcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgIGlkOiB0aGlzLmNvbW1vblNlcnZpY2UucHJpbWVyeVJlbmRvbWVJZCg1KSxcbiAgICAgICAgLy8gICBub2RlVGl0bGU6IFwiXCIsXG4gICAgICAgIC8vICAgZmlsdGVySWQ6IFwiXCIsXG4gICAgICAgIC8vICAgbm9kZVByb3BlcnRpZXM6IHtcbiAgICAgICAgLy8gICAgIFwiZGlzcGxheVwiOiB0cnVlLFxuICAgICAgICAvLyAgICAgXCJ3aWRnZXRUaXRsZVwiOiBcIlwiLFxuICAgICAgICAvLyAgICAgXCJ3aWR0aFwiOiBcInctMS8yXCIsXG4gICAgICAgIC8vICAgICBcImhlaWdodFwiOiBcIlwiLFxuICAgICAgICAvLyAgIH0sXG4gICAgICAgIC8vICAgY29tcENvbmZpZzoge1xuICAgICAgICAvLyAgICAgZHluYW1pY0NvbXBvbmVudFJlZnM6IFtdLFxuICAgICAgICAvLyAgICAgdmlld0NvbmZpZzogW11cbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH1cbiAgICAgIF0sXG4gICAgICBjb21wQ29uZmlnOiB7XG4gICAgICAgIGR5bmFtaWNDb21wb25lbnRSZWZzOiBbXSxcbiAgICAgICAgdmlld0NvbmZpZzogW11cbiAgICAgIH0sXG4gICAgfVxuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnNlcnZpY2UuY3JlYXRlQXBwV2lkZ2V0Q29uZmlnKG9iaikuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgLy8gdGhpcy5jcmVhdGVEaXZFbGVtZW50cyh0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QpXG4gICAgICAgIHRoaXMuZ2V0QXBwUGFnZURldGFpbENvbmZpZ0J5UGFnZUlkKClcblxuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnV2lkZ2V0IENyZWF0aW9uJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMucHVzaChvYmopXG4gICAgLy8gdGhpcy5pbnNlcnREeW5hbWljQ29tcG9uZW50cygpO1xuXG5cbiAgICB0aGlzLmR5bmFtaWNDb250YWluZXIubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnJztcblxuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSBmYWxzZTtcbiAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSB0cnVlO1xuICB9XG5cbiAgaW5zZXJ0TmV3V2lnZXQoaW5kZXgpIHtcbiAgICB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnID0ge1xuICAgICAgXCJkaXNwbGF5XCI6IHRydWUsXG4gICAgICBcIndpZGdldFRpdGxlXCI6IFwiXCIsXG4gICAgICBcIndpZHRoXCI6IFwiXCIsXG4gICAgICBcImhlaWdodFwiOiBcIlwiLFxuICAgICAgXCJpc1dpZGdldEZpbHRlclwiOiBmYWxzZVxuICAgIH1cbiAgICB0aGlzLmlzVXBkYXRlV2lkZ2V0ID0gZmFsc2U7XG4gICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IHRydWU7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gZmFsc2U7XG4gICAgdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLmlzbGF5b3V0Q3JlYXRlID0gdHJ1ZTtcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gaW5kZXg7XG4gIH1cbiAgaW5zZXJ0Q2hhcnRXaWdldChpbmRleE9iaiwgY29udGFpbmVyRWxlbWVudCkge1xuXG4gICAgdGhpcy5pc0dlbmVyYXRlID0gZmFsc2U7XG4gICAgdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2sgPSB0cnVlO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSBmYWxzZTtcbiAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkQ29udGFpbmVyT2JqZWN0Rm9yQ2hhcnQgPSBjb250YWluZXJFbGVtZW50O1xuICAgIHRoaXMuc2VsZWN0ZWRJbmRleE9iakZvckNoYXJ0ID0gaW5kZXhPYmo7XG4gICAgdGhpcy5zZWxlY3RlZFZpZXdGb3JtQ29tcG9uZW50ID0ge307XG4gIH1cblxuICBhc3luYyBnZXRFbWl0TmV3Q2hhcnRDb25maWcoZGF0YSkge1xuICAgIC8vIGxldCBkYXRhc2V0X2NvbmZpZyA9IHRoaXMuZGF0YVNldE1vZGFsLmZpbmQoZGF0YXNldCA9PiBkYXRhc2V0LmRhdGFzZXRJZCA9PSBkYXRhLmRhdGFzZXRJZCk7XG4gICAgLy8gYXdhaXQgdGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZGF0YXNldF9jb25maWcsIGRhdGFzZXRfY29uZmlnLmRhdGFzZXRJZCwgdGhpcy5zZWxlY3RlZEZpbHRlcnNEZWZhdWx0KVxuICAgIC8vIGRhdGEua3BpQ29uZmlnWydkYXRhU291cmNlJ10gPSB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3RbZGF0YXNldF9jb25maWcuZGF0YXNldElkXTtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXhPYmpGb3JDaGFydC5jb21wQ29uZmlnLnZpZXdDb25maWcucHVzaChkYXRhKVxuICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnQoZGF0YSwgdGhpcy5zZWxlY3RlZEluZGV4T2JqRm9yQ2hhcnQsIHRoaXMuc2VsZWN0ZWRDb250YWluZXJPYmplY3RGb3JDaGFydCk7XG4gICAgY29uc29sZS5sb2codGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcpXG4gICAgdGhpcy51cGRhdGVXaWRnZXQoKTtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gZmFsc2U7XG5cbiAgICAvLyB9XG5cbiAgfVxuXG4gIHVwZGF0ZVRvVmlldygpIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVXaWRnZXQoKTtcbiAgfVxuXG4gIGRlbGV0ZVdpZGdldChpdGVtLCBpbmRleCkge1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuc3BsaWNlKGluZGV4LCAxKVxuICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWxldGVJbnNlcnRXaWRnZXQoaXRlbSwgY2hpbGRJbmRleCwgcGFyZW50SW5kZXgpIHtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3BhcmVudEluZGV4XS53aWRnZXROb2RlLnNwbGljZShjaGlsZEluZGV4LCAxKVxuICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRXaWRnZXRUaXRsZURpdihpdGVtLCBkaXYpIHtcbiAgICBjb25zdCB3aWRnZXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB3aWRnZXREaXYuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdpdGVtcy1jZW50ZXInLCAnanVzdGlmeS1iZXR3ZWVuJywgJ2ZvbnQtYm9sZCcsICd0ZXh0LW1kJywgJ3RleHQtZ3JheS05MDAnLCAnZGFyazp0ZXh0LXdoaXRlJywgJ2JvcmRlci1iJywgJ3AtMycsICdiZy1ncmF5LTgwMCcsICdteC0yJywgJ3JvdW5kZWQtdC1sZycpO1xuICAgIGNvbnN0IHRpdGxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGl0bGVEaXYuaW5uZXJUZXh0ID0gKGl0ZW0ubm9kZVByb3BlcnRpZXMpID8gaXRlbS5ub2RlUHJvcGVydGllcy53aWRnZXRUaXRsZSA6IFwiXCI7XG4gICAgd2lkZ2V0RGl2LmFwcGVuZCh0aXRsZURpdilcblxuICAgIC8vIEFkZCBGb250QXdlc29tZSBlZGl0IGljb25cbiAgICBjb25zdCBlZGl0SWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKTtcbiAgICBlZGl0SWNvbi5jbGFzc0xpc3QuYWRkKCdmYScsICdmYS1wZW5jaWwnLCAnbWwtMicsICdjdXJzb3ItcG9pbnRlcicsICd0ZXh0LWJsdWUtNDAwJywgJ2hvdmVyOnRleHQtYmx1ZS03MDAnKTtcbiAgICB3aWRnZXREaXYuYXBwZW5kKGVkaXRJY29uKTtcblxuICAgIGlmIChpdGVtLm5vZGVQcm9wZXJ0aWVzLmlzV2lkZ2V0RmlsdGVyKSB7XG4gICAgICBjb25zdCBzZWFyY2hDb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNlYXJjaENvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicsICdzcGFjZS14LTInKTtcbiAgICAgIGNvbnN0IHNlYXJjaEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgc2VhcmNoQnV0dG9uLmlubmVyVGV4dCA9ICdGaWx0ZXInO1xuICAgICAgc2VhcmNoQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3B4LTMnLCAncHktMS41JywgJ2JnLWJsdWUtNjAwJywgJ21yLTInLCAndGV4dC13aGl0ZScsICdyb3VuZGVkJywgJ2hvdmVyOmJnLWJsdWUtNzAwJyk7XG4gICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZSA9IFtdO1xuXG4gICAgICBzZWFyY2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNXaWRnZXRGaWx0ZXJzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGZpbHRlUHJvcGVydGljZSA9IFtdO1xuICAgICAgICBpdGVtLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGxldCBrZXlfbmFtZSA9IHRoaXMudW5pcXVlRGF0YVNldE9iamVjdFtlbGVtZW50LmRhdGFzZXRJZF1bMF07XG4gICAgICAgICAgT2JqZWN0LmtleXMoa2V5X25hbWUpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmICghZmlsdGVQcm9wZXJ0aWNlLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgZmlsdGVQcm9wZXJ0aWNlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZmlsdGVQcm9wZXJ0aWNlLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgIGNvbHVtbk5hbWU6IGVsZW1lbnQsXG4gICAgICAgICAgICBkYXRhVHlwZTogXCJmbG9hdFwiLFxuICAgICAgICAgICAgb3BlcmF0b3I6IFwiXCIsXG4gICAgICAgICAgICB2YWx1ZTogXCJcIixcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2UucHVzaChvYmopXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBzZWFyY2hDb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoc2VhcmNoQnV0dG9uKVxuICAgICAgd2lkZ2V0RGl2LmFwcGVuZENoaWxkKHRpdGxlRGl2KTtcbiAgICAgIHdpZGdldERpdi5hcHBlbmRDaGlsZChzZWFyY2hDb250YWluZXJEaXYpO1xuICAgIH1cblxuICAgIGlmIChpdGVtLmZpbHRlcklkKSB7XG4gICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZSA9IHt9O1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2VbJ3ZpZXdDb25maWcnXSA9IGl0ZW07XG4gICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZVsnaGF2aW5nQ29uZmlnJ10gPSBbXTtcblxuICAgICAgdGhpcy5zZXJ2aWNlLmdldEFwcEZpbHRlckNvbmZpZyhpdGVtLmZpbHRlcklkKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgdGhpcy5sb2FkV2lkZ2V0RmlsdGVyQ29tcG9uZW50KGl0ZW0sIHdpZGdldERpdiwgZGF0YS5maWx0ZXJJdGVtcyk7XG4gICAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMgJiYgaXRlbS5ub2RlUHJvcGVydGllcy5ub2RlZmlsdGVycy5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnN0IHNlYXJjaENvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgc2VhcmNoQ29udGFpbmVyRGl2LmNsYXNzTGlzdC5hZGQoJ2ZsZXgnLCAnaXRlbXMtY2VudGVyJywgJ3NwYWNlLXgtMicpO1xuICAgICAgaXRlbS5ub2RlUHJvcGVydGllcy5ub2RlZmlsdGVycy5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBmaWx0ZXJEaXYuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdpdGVtcy1jZW50ZXInKTtcbiAgICAgICAgaWYgKGZpbHRlci5pbnB1dF90eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0Qm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICB0ZXh0Qm94LnR5cGUgPSAndGV4dCc7XG4gICAgICAgICAgdGV4dEJveC5wbGFjZWhvbGRlciA9IGBFbnRlciAke2ZpbHRlci5sb2NhbF9jb2x1bW59YDtcbiAgICAgICAgICB0ZXh0Qm94LmNsYXNzTGlzdC5hZGQoJ3B4LTInLCAncHktMS41JywgJ3JvdW5kZWQnLCAnYm9yZGVyJywgJ21yLTEnLCAnYm9yZGVyLWdyYXktNTAwJywgJ3RleHQtZ3JheS05MDAnLCAnZGFyazpiZy1ncmF5LTcwMCcsICdkYXJrOnRleHQtd2hpdGUnKTtcbiAgICAgICAgICBjb25zdCBzZWFyY2hCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICBzZWFyY2hCdXR0b24uaW5uZXJUZXh0ID0gJ1NlYXJjaCc7XG4gICAgICAgICAgc2VhcmNoQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3B4LTMnLCAncHktMS41JywgJ2JnLWJsdWUtNjAwJywgJ21yLTInLCAndGV4dC13aGl0ZScsICdyb3VuZGVkJywgJ2hvdmVyOmJnLWJsdWUtNzAwJyk7XG4gICAgICAgICAgY29uc3Qgc2VwYXJlcm90QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgc2VwYXJlcm90QnV0dG9uLmlubmVySFRNTCA9ICd8JztcbiAgICAgICAgICBzZWFyY2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWFyY2hUZXJtID0gdGV4dEJveC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUZXh0IHNlYXJjaCBidXR0b24gY2xpY2tlZCB3aXRoOicsIHNlYXJjaFRlcm0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZpbHRlckRpdi5hcHBlbmRDaGlsZCh0ZXh0Qm94KTtcbiAgICAgICAgICBmaWx0ZXJEaXYuYXBwZW5kQ2hpbGQoc2VhcmNoQnV0dG9uKTtcbiAgICAgICAgICBmaWx0ZXJEaXYuYXBwZW5kQ2hpbGQoc2VwYXJlcm90QnV0dG9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlYXJjaENvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChmaWx0ZXJEaXYpO1xuICAgICAgfSk7XG4gICAgICB3aWRnZXREaXYuYXBwZW5kQ2hpbGQoc2VhcmNoQ29udGFpbmVyRGl2KTtcbiAgICB9XG5cbiAgICBlZGl0SWNvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcblxuICAgICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZmluZEluZGV4KG9iamVjdCA9PiBvYmplY3Qud2lkZ2V0SWQgPT09IGRpdi53aWRnZXRJZCk7XG4gICAgICB0aGlzLmlzVXBkYXRlV2lkZ2V0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNsYXlvdXRDcmVhdGUgPSB0cnVlO1xuICAgICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IHRydWU7XG4gICAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gZmFsc2U7XG4gICAgICB0aGlzLm5vZGVQcm9wZXJ0aWNlRmlsdGVycyA9IChpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzICYmIGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMubGVuZ3RoICE9PSAwKSA/IGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMgOiBbXTtcbiAgICAgIGl0ZW0ubm9kZVByb3BlcnRpZXNbJ25vZGVmaWx0ZXJzJ10gPSB0aGlzLm5vZGVQcm9wZXJ0aWNlRmlsdGVycztcbiAgICAgIHRoaXMuYWRkZWR3aWRHZXRDb25maWcgPSBpdGVtLm5vZGVQcm9wZXJ0aWVzO1xuICAgICAgdGhpcy5hbGxXaWRnZXRJbm5lckNvbnRlbnQgPSBpdGVtLmNvbXBDb25maWcudmlld0NvbmZpZztcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJJZCA9IChpdGVtLmZpbHRlcklkKSA/IGl0ZW0uZmlsdGVySWQgOiBcIlwiO1xuICAgICAgdGhpcy5lZGl0Vmlld2RhdGFTb3VyY2VNb2RhbCA9IHt9O1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlckRhdGFzb3VyY2UgPSBpdGVtO1xuICAgIH0pO1xuICAgIHJldHVybiB3aWRnZXREaXY7XG4gIH1cblxuXG4gIGdldEZpbHRlclZhbHVlQnlJZChldmVudCkge1xuICAgIGlmIChldmVudC5ldmVudCkge1xuICAgICAgdGhpcy5zZXJ2aWNlLmdldEFwcEZpbHRlckNvbmZpZyhldmVudC52YWx1ZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnNlbGVjdGVkRmlsdGVyRGF0YXNvdXJjZSkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVyRGF0YXNvdXJjZS5maWx0ZXJJZCA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJJZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS5maWx0ZXJzID0gZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhcIkZpbHRlciBDaGFuZ2VkXCIpXG4gICAgICAgIH0sIGVycm9lOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0ZpbHRlciBVcGRhdGUnKVxuXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cblxuICBjcmVhdGVEaXZFbGVtZW50cyhkYXRhc2V0QnlJZCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZHluYW1pY0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuXG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKGFzeW5jIGRpdiA9PiB7XG4gICAgICBjb25zdCByb3dEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGxldCB3X2hlaWdodCA9IChkaXYud2lkZ2V0UHJvcGVydGllcy5oZWlnaHQgPT0gXCJcIikgPyBcImgtYXV0b1wiIDogJ2gtWycgKyBkaXYud2lkZ2V0UHJvcGVydGllcy5oZWlnaHQgKyAnXSc7XG4gICAgICByb3dEaXYuY2xhc3NMaXN0LmFkZChkaXYud2lkZ2V0UHJvcGVydGllcy53aWR0aCwgd19oZWlnaHQsICdib3JkZXInKTtcbiAgICAgIGNvbnN0IGZpbHRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGVidWdnZXJcbiAgICAgIGNvbnN0IGZpbHRlckl0ZW1zID0gKGRpdi5maWx0ZXJzKSA/IGRpdi5maWx0ZXJzLmZpbHRlckl0ZW1zIDogW107XG4gICAgICAvLyBpZiAoZGl2LmZpbHRlcnMpIHtcbiAgICAgIHRoaXMubG9hZEZpbHRlckNvbXBvbmVudChkaXYsIGZpbHRlckRpdiwgZmlsdGVySXRlbXMpO1xuICAgICAgLy8gfVxuXG4gICAgICByb3dEaXYuYXBwZW5kQ2hpbGQoZmlsdGVyRGl2KVxuXG4gICAgICBpZiAoZGl2LndpZGdldE5vZGUgJiYgZGl2LndpZGdldE5vZGUubGVuZ3RoICYmIGRpdi53aWRnZXROb2RlLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgIGNvbnN0IG1haW5JdGVtRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG1haW5JdGVtRGl2LmNsYXNzTGlzdC5hZGQoXCJmbGV4XCIsIFwiZmxleC13cmFwXCIpO1xuICAgICAgICB0aGlzLmxvYWRXaWRnZXROb2RlcyhkaXYsIG1haW5JdGVtRGl2LCBkYXRhc2V0QnlJZCk7XG4gICAgICAgIC8vIGZvciBsb29wIG9uIHdpZGdldFxuICAgICAgICByb3dEaXYuYXBwZW5kQ2hpbGQobWFpbkl0ZW1EaXYpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwX2lubmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBwX2lubmVyRGl2LmNsYXNzTGlzdC5hZGQoJ3JvdW5kZWQnLCAnanVzdGlmeS1jZW50ZXInLCAnaXRlbXMtY2VudGVyJywgJ2JvcmRlcicsICdwLTEnLCAnbS0xJywgJ2ZsZXgnLCAnZmxleC1yb3cnKTtcbiAgICAgIC8vIGFkZCB3aWRnZXQgYnV0dG9uXG4gICAgICBjb25zdCBwX2J1dHRvbl93aWRnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHBfYnV0dG9uX3dpZGdldC5pbm5lclRleHQgPSAnQWRkIFNpbmdsZSBMYXlvdXQnO1xuICAgICAgcF9idXR0b25fd2lkZ2V0LmNsYXNzTGlzdC5hZGQoJ2JnLWJsdWUtNzAwJywgXCJwLTFcIiwgXCJ3LWZpdFwiLCBcImN1cnNvci1wb2ludGVyXCIsICd0ZXh0LXhzJylcbiAgICAgIHBfYnV0dG9uX3dpZGdldC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcblxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZpbmRJbmRleChvYmplY3QgPT4gb2JqZWN0LndpZGdldElkID09PSBkaXYud2lkZ2V0SWQpO1xuICAgICAgICB0aGlzLmluc2VydE5ld1dpZ2V0KGluZGV4KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBkZWxldGUgd2lkZ2V0IGJ1dHRvblxuICAgICAgY29uc3QgcF9kZWxfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBwX2RlbF9idXR0b24uaW5uZXJUZXh0ID0gJ0RldGV0ZSBsYXlvdXQnO1xuICAgICAgcF9kZWxfYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2JnLXJlZC03MDAnLCBcInAtMVwiLCBcInctZml0XCIsIFwiY3Vyc29yLXBvaW50ZXJcIiwgJ3RleHQteHMnKVxuICAgICAgcF9kZWxfYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGNvbmZpcm0oXCI8aT5BcmUgWW91IFN1cmU/PC9pPlwiLCBcIkRlbGV0ZSBMYXlvdXRcIik7XG4gICAgICAgIHJlc3VsdC50aGVuKChkaWFsb2dSZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5tYXAoY29uZmlnID0+IGNvbmZpZy53aWRnZXRJZCk7XG4gICAgICAgICAgICByb3dEaXYucmVtb3ZlKClcblxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmVkaXRBcHBQYWdlQ29uZmlnKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKVxuICAgICAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1dpZGdldCBDcmVhdGlvbicpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gdHJ1ZTtcblxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC8vIGFkdmFuY2VkIGJ1dHRvblxuICAgICAgY29uc3QgYWR2YW5jZV9idXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGFkdmFuY2VfYnV0dG9uLmlubmVyVGV4dCA9ICdBZHZhbmNlIExheW91dCc7XG4gICAgICBhZHZhbmNlX2J1dHRvbi5jbGFzc0xpc3QuYWRkKCdiZy15ZWxsb3ctNzAwJywgXCJwLTFcIiwgXCJ3LWZpdFwiLCBcImN1cnNvci1wb2ludGVyXCIsICd0ZXh0LXhzJylcbiAgICAgIGFkdmFuY2VfYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb21wX29iamVjdCA9IHRoaXMuZmluZFdpZGdldEJ5SWQodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cywgZGl2LndpZGdldElkKTtcbiAgICAgICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZmluZEluZGV4KG9iamVjdCA9PiBvYmplY3Qud2lkZ2V0SWQgPT09IGRpdi53aWRnZXRJZCk7XG5cbiAgICAgICAgdGhpcy5pc0FkdmFuY2VMYXlvdXQgPSB0cnVlO1xuXG4gICAgICB9KTtcblxuICAgICAgcF9pbm5lckRpdi5hcHBlbmRDaGlsZChhZHZhbmNlX2J1dHRvbik7XG4gICAgICBwX2lubmVyRGl2LmFwcGVuZENoaWxkKHBfYnV0dG9uX3dpZGdldCk7XG4gICAgICBwX2lubmVyRGl2LmFwcGVuZENoaWxkKHBfZGVsX2J1dHRvbik7XG5cbiAgICAgIGlmICghdGhpcy5pc0Rhc2hCb2FyZENvbnRlbnRUeXBlVmlldykge1xuICAgICAgICByb3dEaXYuYXBwZW5kQ2hpbGQocF9pbm5lckRpdik7XG4gICAgICB9XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocm93RGl2KTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRXaWRnZXROb2RlcyhkaXY6IGFueSwgbWFpbkl0ZW1EaXY6IGFueSwgZGF0YXNldEJ5SWQ6IGFueSkge1xuICAgIGRpdi53aWRnZXROb2RlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKGl0ZW0sIG1haW5JdGVtRGl2LCBkYXRhc2V0QnlJZCwgZGl2KTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRTaW5nbGVXaWRnZXROb2RlKGl0ZW06IGFueSwgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQsIGRhdGFzZXRCeUlkOiBhbnksIGRpdikge1xuICAgIGxldCB3X2hlaWdodCA9IChpdGVtLm5vZGVQcm9wZXJ0aWVzLmhlaWdodCA9PSBcIlwiKSA/IFwiaC1hdXRvXCIgOiAnaC1bJyArIGl0ZW0ubm9kZVByb3BlcnRpZXMuaGVpZ2h0ICsgJ10nO1xuICAgIGxldCB3X3dpZHRoID0gKGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkdGggPT0gXCJcIikgPyBcInctZnVsbFwiIDogaXRlbS5ub2RlUHJvcGVydGllcy53aWR0aDtcbiAgICBjb25zdCBpdGVtRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaXRlbURpdi5jbGFzc0xpc3QuYWRkKHdfd2lkdGgsIHdfaGVpZ2h0LCAnYm9yZGVyJywgJ3AtMScpO1xuXG4gICAgY29uc3QgZmxleENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGZsZXhDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdqdXN0aWZ5LWJldHdlZW4nLCAnaXRlbXMtY2VudGVyJywgJ3RleHQtZ3JheS05MDAnLCAnZGFyazp0ZXh0LXdoaXRlJywgJ2JnLWdyYXktODAwJywgJ214LTInLCAncm91bmRlZC10LWxnJyk7IC8vIEZsZXhib3ggY29udGFpbmVyXG5cbiAgICBjb25zdCB3aWRnZXREaXYgPSB0aGlzLmdldFdpZGdldFRpdGxlRGl2KGl0ZW0sIGRpdilcbiAgICBpdGVtLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQua3BpQ29uZmlnKSB7XG4gICAgICAgIGxldCBhcGlDYWxscyA9IFtdO1xuICAgICAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwRGF0YXNldENvbmZpZyhlbGVtZW50LmRhdGFzZXRJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoZGF0YXNldDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoZGF0YXNldC5kYXRhc2V0VHlwZSAhPT0gXCJzcWxRdWVyeVwiICYmIGRhdGFzZXQuZGF0YXNldFR5cGUgIT09IFwicGxhaW5qc29uXCIpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YXNldFdpdGhMaW1pdCA9IHRoaXMuc2V0RGF0YVNldHNMaW1pdChkYXRhc2V0KTtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChkYXRhc2V0V2l0aExpbWl0LCBkYXRhc2V0V2l0aExpbWl0LmRhdGFzZXRJZCwgdGhpcy5kZWZhdWx0QXBwbHllZEZpbHRlcikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChkYXRhc2V0LCBkYXRhc2V0LmRhdGFzZXRJZCwgdGhpcy5kZWZhdWx0QXBwbHllZEZpbHRlcikpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgICAgICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydkYXRhU291cmNlJ10gPSB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3RbZWxlbWVudC5kYXRhc2V0SWRdXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBfb2JqZWN0ID0gdGhpcy5maW5kV2lkZ2V0QnlJZCh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLCBpdGVtLmlkKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkRHluYW1pY0NvbXBvbmVudChlbGVtZW50LCBjb21wX29iamVjdCwgaXRlbURpdik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG5cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG4gICAgZmxleENvbnRhaW5lci5hcHBlbmRDaGlsZCh3aWRnZXREaXYpO1xuXG4gICAgLy8gQ3JlYXRlIGJ1dHRvbnMgY29udGFpbmVyIGZvciBhbGlnbm1lbnRcbiAgICBjb25zdCBidXR0b25zQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYnV0dG9uc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ214LTInKTsgLy8gVG8gYWxpZ24gYnV0dG9ucyBzaWRlIGJ5IHNpZGUgd2l0aCBzb21lIHNwYWNpbmdcblxuXG4gICAgY29uc3QgaW5uZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBpbm5lckRpdi5jbGFzc0xpc3QuYWRkKCdyb3VuZGVkJywgJ2p1c3RpZnktY2VudGVyJywgJ2l0ZW1zLWNlbnRlcicsICdwLTEnLCAnbS0xJywgJ2ZsZXgnLCAnZmxleC1yb3cnKTtcblxuICAgIGNvbnN0IGJ1dHRvbl9jaGFydCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGJ1dHRvbl9jaGFydC5pbm5lclRleHQgPSAnQWRkIFZpZXcnO1xuICAgIGJ1dHRvbl9jaGFydC5jbGFzc0xpc3QuYWRkKCdiZy1ncmVlbi03MDAnLCBcInAtMVwiLCBcInctZml0XCIsIFwiY3Vyc29yLXBvaW50ZXJcIiwgJ3RleHQteHMnKVxuICAgIGJ1dHRvbl9jaGFydC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZpbmRJbmRleChvYmplY3QgPT4gb2JqZWN0LndpZGdldElkID09PSBkaXYud2lkZ2V0SWQpO1xuICAgICAgY29uc3QgY29tcF9vYmplY3QgPSB0aGlzLmZpbmRXaWRnZXRCeUlkKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMsIGl0ZW0uaWQpO1xuICAgICAgdGhpcy5pbnNlcnRDaGFydFdpZ2V0KGNvbXBfb2JqZWN0LCBpdGVtRGl2KTtcbiAgICB9KTtcblxuXG4gICAgY29uc3QgZGVsX2J1dHRvbl9jaGFydCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRlbF9idXR0b25fY2hhcnQuaW5uZXJUZXh0ID0gJ0RldGV0ZSc7XG4gICAgZGVsX2J1dHRvbl9jaGFydC5jbGFzc0xpc3QuYWRkKCdiZy1yZWQtNzAwJywgXCJwLTFcIiwgXCJ3LWZpdFwiLCBcImN1cnNvci1wb2ludGVyXCIsICd0ZXh0LXhzJylcbiAgICBkZWxfYnV0dG9uX2NoYXJ0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgbGV0IHJlc3VsdCA9IGNvbmZpcm0oXCI8aT5BcmUgWW91IFN1cmU/PC9pPlwiLCBcIkRlbGV0ZSBWaWV3XCIpO1xuICAgICAgcmVzdWx0LnRoZW4oKGRpYWxvZ1Jlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgICAgbGV0IHdpZGdldEluZGV4ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5maW5kSW5kZXgob2JqZWN0ID0+IG9iamVjdC53aWRnZXRJZCA9PT0gZGl2LndpZGdldElkKTtcbiAgICAgICAgICBjb25zdCBtYXBlZE9iamVjdCA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbd2lkZ2V0SW5kZXhdXG4gICAgICAgICAgaWYgKG1hcGVkT2JqZWN0LndpZGdldE5vZGUgJiYgbWFwZWRPYmplY3Qud2lkZ2V0Tm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgbWFwSW5kZXggPSBtYXBlZE9iamVjdC53aWRnZXROb2RlLmZpbmRJbmRleChpbmQgPT4gaW5kLmlkID09PSBpdGVtLmlkKVxuICAgICAgICAgICAgbWFwZWRPYmplY3Qud2lkZ2V0Tm9kZS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZyA9IG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLm1hcChjb25maWcgPT4gY29uZmlnLnZpZXdJZCk7XG4gICAgICAgICAgICAgIG5vZGUuY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcyA9IFtdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtYXBlZE9iamVjdC53aWRnZXROb2RlLnNwbGljZShtYXBJbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcGVkT2JqZWN0WydmaWx0ZXJJZCddID0gKG1hcGVkT2JqZWN0LmZpbHRlcnMpID8gbWFwZWRPYmplY3QuZmlsdGVycy5maWx0ZXJJZCA6IG51bGw7XG4gICAgICAgICAgZGVsZXRlIG1hcGVkT2JqZWN0WydmaWx0ZXJzJ107XG4gICAgICAgICAgbWFwZWRPYmplY3QuY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcyA9IFtdO1xuICAgICAgICAgIHRoaXMuc2VydmljZS5lZGl0QXBwV2lkZ2V0Q29uZmlnKG1hcGVkT2JqZWN0KS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG4gICAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnV2lkZ2V0IENyZWF0aW9uJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaXRlbURpdi5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuXG4gICAgLy8gaW5uZXJEaXYuYXBwZW5kQ2hpbGQoYnV0dG9uX2NoYXJ0KTtcbiAgICAvLyBpbm5lckRpdi5hcHBlbmRDaGlsZChkZWxfYnV0dG9uX2NoYXJ0KTtcbiAgICAvLyBBcHBlbmQgYnV0dG9ucyB0byBidXR0b25zIGNvbnRhaW5lclxuICAgIGJ1dHRvbnNDb250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uX2NoYXJ0KTtcbiAgICBidXR0b25zQ29udGFpbmVyLmFwcGVuZENoaWxkKGRlbF9idXR0b25fY2hhcnQpO1xuXG4gICAgLy8gQWRkIHRoZSBidXR0b25zIGNvbnRhaW5lciB0byB0aGUgZmxleCBjb250YWluZXJcbiAgICBmbGV4Q29udGFpbmVyLmFwcGVuZENoaWxkKGJ1dHRvbnNDb250YWluZXIpO1xuICAgIGlmICghdGhpcy5pc0Rhc2hCb2FyZENvbnRlbnRUeXBlVmlldykge1xuICAgIH1cbiAgICBpdGVtRGl2LmFwcGVuZENoaWxkKGZsZXhDb250YWluZXIpO1xuICAgIC8vIGl0ZW1EaXYuYXBwZW5kQ2hpbGQod2lkZ2V0RGl2KTtcblxuICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbURpdilcblxuXG5cbiAgfVxuXG5cblxuICBmaW5kV2lkZ2V0QnlJZChjb25maWdzOiBhbnlbXSwgaWQ6IHN0cmluZyk6IGFueSB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcud2lkZ2V0Tm9kZSAmJiBjb25maWcud2lkZ2V0Tm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kV2lkZ2V0QnlJZChjb25maWcud2lkZ2V0Tm9kZSwgaWQpO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlbGV0ZVdpZGdldEJ5SWQoY29uZmlnczogYW55W10sIGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gY29uZmlncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKGNvbmZpZ3NbaV0uaWQgPT09IGlkKSB7XG4gICAgICAgIGNvbmZpZ3Muc3BsaWNlKGksIDEpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWdzW2ldLndpZGdldE5vZGUgJiYgY29uZmlnc1tpXS53aWRnZXROb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5kZWxldGVXaWRnZXRCeUlkKGNvbmZpZ3NbaV0ud2lkZ2V0Tm9kZSwgaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvYWREeW5hbWljQ29tcG9uZW50KGRhdGEsIGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50KTogYW55IHtcbiAgICBjb25zdCBjb21wb25lbnRDbGFzcyA9IHRoaXMuY29tcG9uZW50Q2xhc3NNYXBbZGF0YS5rcGlDb25maWdbJ2NvbXBvbmVudE5hbWUnXV07XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmNoYXJ0RGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmtwaV9uYW1lID0gXCJcIjtcblxuICAgIGluZGV4T2JqLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMucHVzaCh0aGlzLkNvbXBSZWZzKTtcbiAgICBjb25zdCBjc3NDbGFzcyA9IFwidy1mdWxsXCI7XG4gICAgdGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoY3NzQ2xhc3MpO1xuICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIGxvYWRGaWx0ZXJDb21wb25lbnQoaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQsIGZpbHRlckl0ZW1zKSB7XG5cbiAgICBsZXQgc2VsZWN0ZWREYXRlcyA9IHsgc3RhcnREYXRlOiB0aGlzLmRlZmF1bHRTdGFydERhdGUsIGVuZERhdGU6IHRoaXMuZGVmYXVsdEVuZERhdGUgfVxuICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5jb21wb25lbnRDbGFzc01hcFsnQXBwQWR2YW5jZUhlYWRlckNvbXBvbmVudCddO1xuICAgIHRoaXMuQ29tcFJlZnMgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudENsYXNzKTtcbiAgICBjb25zdCBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLkNvbXBSZWZzLmluc3RhbmNlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5zZWxlY3RlZERhdGVzID0gc2VsZWN0ZWREYXRlcztcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZmlsdGVySXRlbXMgPSBmaWx0ZXJJdGVtcztcblxuXG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnBhZ2VUaXRsZSA9IHRoaXMucGFnZVRpdGxlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5pc0VkaXRCdXR0b24gPSBmYWxzZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuaXNBZHZhbmNlQnV0dG9uID0gdHJ1ZTtcblxuICAgIGluZGV4T2JqLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMucHVzaCh0aGlzLkNvbXBSZWZzKTtcbiAgICBjb25zdCBjc3NDbGFzcyA9IFwidy1mdWxsXCI7XG4gICAgdGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoY3NzQ2xhc3MpO1xuICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIGxvYWRXaWRnZXRGaWx0ZXJDb21wb25lbnQoaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQsIGZpbHRlckl0ZW1zKSB7XG4gICAgbGV0IHVzZXJOYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJfbmFtZScpXG4gICAgbGV0IHNlbGVjdGVkRGF0ZXMgPSB7IHN0YXJ0RGF0ZTogdGhpcy5kZWZhdWx0U3RhcnREYXRlLCBlbmREYXRlOiB0aGlzLmRlZmF1bHRFbmREYXRlIH1cbiAgICBjb25zdCBjb21wb25lbnRDbGFzcyA9IHRoaXMuY29tcG9uZW50Q2xhc3NNYXBbJ0FkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnQnXTtcbiAgICB0aGlzLkNvbXBSZWZzID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRDbGFzcyk7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlID0gdGhpcy5Db21wUmVmcy5pbnN0YW5jZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uuc2VsZWN0ZWREYXRlcyA9IHNlbGVjdGVkRGF0ZXM7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmZpbHRlckl0ZW1zID0gZmlsdGVySXRlbXM7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmdldFdpZGdldEZpbHRlckNvbmZpZy5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuZ2V0V2lkZ2V0RmlsdGVyRm9yVGVtcGxhdGUodmFsdWUpO1xuICAgIH0pO1xuXG4gICAgaW5kZXhPYmouY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcy5wdXNoKHRoaXMuQ29tcFJlZnMpO1xuICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIGdldERlbGV0ZVZpZXdGcm9tQ29uZmlnKGluZGV4KSB7XG4gICAgY29uc29sZS5sb2coaW5kZXgpO1xuICAgIHRoaXMuYWxsV2lkZ2V0SW5uZXJDb250ZW50LnNwbGljZShpbmRleCwgMSlcbiAgfVxuXG4gIG1vdmVJdGVtRm9yUGFnZVZpZXcoaW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nKTogdm9pZCB7XG4gICAgLy8gUHJldmVudCBtb3ZpbmcgYmV5b25kIGFycmF5IGJvdW5kc1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlyZWN0aW9uID09PSAndXAnID8gaW5kZXggLSAxIDogaW5kZXggKyAxO1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID49IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZS5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE1vdmUgaXRlbVxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGVbaW5kZXhdO1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZS5zcGxpY2UoaW5kZXgsIDEpOyAvLyBSZW1vdmUgaXRlbSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpdGVtVG9Nb3ZlKTsgLy8gSW5zZXJ0IGl0ZW0gaW4gbmV3IHBvc2l0aW9uXG4gIH1cbiAgbW92ZUl0ZW1Gb3JDb2x1bW5zKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuYWxsV2lkZ2V0SW5uZXJDb250ZW50Lmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlyZWN0aW9uID09PSAndXAnID8gaW5kZXggLSAxIDogaW5kZXggKyAxO1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID49IHRoaXMuYWxsV2lkZ2V0SW5uZXJDb250ZW50Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgLy8gTW92ZSBpdGVtXG4gICAgY29uc3QgaXRlbVRvTW92ZSA9IHRoaXMuYWxsV2lkZ2V0SW5uZXJDb250ZW50W2luZGV4XTtcbiAgICB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudC5zcGxpY2UoaW5kZXgsIDEpOyAvLyBSZW1vdmUgaXRlbSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudC5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGl0ZW1Ub01vdmUpOyAvLyBJbnNlcnQgaXRlbSBpbiBuZXcgcG9zaXRpb25cbiAgfVxuXG4gIG1vdmVJdGVtRm9yV2lkZ2V0KGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXJlY3Rpb24gPT09ICd1cCcgPyBpbmRleCAtIDEgOiBpbmRleCArIDE7XG4gICAgLy8gUHJldmVudCBtb3ZpbmcgYmV5b25kIGFycmF5IGJvdW5kc1xuICAgIGlmIChuZXdQb3NpdGlvbiA8IDAgfHwgbmV3UG9zaXRpb24gPj0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE1vdmUgaXRlbVxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW2luZGV4XTtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLnNwbGljZShpbmRleCwgMSk7IC8vIFJlbW92ZSBpdGVtIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpdGVtVG9Nb3ZlKTsgLy8gSW5zZXJ0IGl0ZW0gaW4gbmV3IHBvc2l0aW9uXG4gIH1cblxuICBnZXRFZGl0Vmlld0Zyb21MYXlvdXQoZGF0YSwgaW5kZXgpIHtcblxuICAgIHRoaXMuaXNFZGl0TWFpbkxheW91dCA9IHRydWU7XG4gICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSB0cnVlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IGZhbHNlO1xuICAgIHRoaXMud2lkZ2V0TmFtZSA9IGRhdGEud2lkZ2V0TmFtZTtcbiAgICB0aGlzLndpZGdldFRpdGxlID0gZGF0YS53aWRnZXRUaXRsZTtcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVySWQgPSBkYXRhLmZpbHRlcnMuZmlsdGVySWQ7XG4gICAgdGhpcy5hZGRlZHdpZEdldENvbmZpZyA9IGRhdGEud2lkZ2V0UHJvcGVydGllcztcbiAgfVxuXG5cbiAgYmFja1RvTWFpblZpZXcoKSB7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gdHJ1ZTtcbiAgICB0aGlzLmlzVXBkYXRlV2lkZ2V0ID0gZmFsc2U7XG4gICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5pc0VkaXRNYWluTGF5b3V0ID0gZmFsc2U7XG4gICAgdGhpcy5pc2xheW91dENyZWF0ZSA9IGZhbHNlO1xuICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZmlsdGVyVmlld3MoKSB7XG4gICAgaWYgKHRoaXMudmlld1RvU2VhcmNoLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDb21wb25lbnRDb25maWcgPSB0aGlzLmNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2UuZmlsdGVyKChpdGVtOiBhbnkpID0+XG4gICAgICAgIGl0ZW0udmlld05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnZpZXdUb1NlYXJjaC50b0xvd2VyQ2FzZSgpKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJlZENvbXBvbmVudENvbmZpZyA9IHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZTtcbiAgICB9XG4gIH1cblxuICBlZGl0Q29tcG9uZW50Vmlld3MoaXRlbSkge1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRJdGVtRm9yVXBkYXRlID0gaXRlbTtcbiAgICBpZiAodGhpcy5pc1VwZGF0ZVdpZGdldCAmJiAhdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2spIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3SWQgPSBpdGVtLnZpZXdJZDtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzQ3JlYXRlTmV3Vmlld1dpdGhEZWZhdWx0VmlldyA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICB9LCA0MDApO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uRXh0cmFzID0ge1xuICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgICd2aWV3SWQnOiBpdGVtLnZpZXdJZCxcbiAgICAgICAgICAncGFnZUlkJzogdGhpcy5wYWdlSWRcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnYXBwcy9jb250cm9sUGFuZWwvYXBwbGljYXRpb25Db250ZW50L2FwcGxpY2F0aW9uVmlld3MnXSwgbmF2aWdhdGlvbik7XG4gICAgfVxuICB9XG4gIGVkaXRDb21wb25lbnREYXRhc2V0cyhpdGVtKSB7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEl0ZW1Gb3JVcGRhdGUgPSBpdGVtO1xuICAgIGlmICh0aGlzLmlzVXBkYXRlV2lkZ2V0ICYmICF0aGlzLmlzQ2hhcnRCdXR0b25DbGljaykge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGFzZXRJZCA9IGl0ZW0uZGF0YXNldElkO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNDcmVhdGVEYXRhc2V0V2l0aERhdGFzZXRJZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICB9LCA0MDApO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uRXh0cmFzID0ge1xuICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgICd2aWV3SWQnOiBpdGVtLnZpZXdJZCxcbiAgICAgICAgICAncGFnZUlkJzogdGhpcy5wYWdlSWRcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnYXBwcy9jb250cm9sUGFuZWwvYXBwbGljYXRpb25Db250ZW50L2FwcGxpY2F0aW9uVmlld3MnXSwgbmF2aWdhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWxsUGFnZSgpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2FwcHMvY29udHJvbFBhbmVsL2FwcGxpY2F0aW9uQ29udGVudC9hcHBsaWNhdGlvbkRhc2hib2FyZCddKTtcbiAgfVxuXG4gIHRyYW5zZm9ybUNvbHVtbnNGb3JDb2x1bW5zKGlucHV0Q29sdW1ucykge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcblxuICAgIGlucHV0Q29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICBjb2x1bW5zLnB1c2goe1xuICAgICAgICBkYXRhRmllbGQ6IGNvbC5kYXRhRmllbGQsXG4gICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgIGNhcHRpb246IGNvbC5jYXB0aW9uLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG5cbiAgZ2V0Q3JlYXRlRGF0YVNldFBhZ2UoKSB7XG4gICAgdGhpcy5pc0NyZWF0ZURhdGFzZXQgPSB0cnVlO1xuICB9XG5cbiAgZ2V0Q3JlYXRlVmlld1BhZ2UoKSB7XG5cbiAgICB0aGlzLnNlbGVjdGVkVmlld0lkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaXNDcmVhdGVOZXdWaWV3ID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgfSwgNDAwKTtcbiAgfVxuXG5cbiAgZ2V0RW1pdE5ld0NoYXJ0Q29uZ2lnKGV2ZW50KSB7XG4gICAgZGVsZXRlIGV2ZW50LmtwaUNvbmZpZy5kYXRhU291cmNlO1xuICAgIHRoaXMuZWRpdEl0ZW1Gb3JVcGRhdGVbJ2twaUNvbmZpZyddID0gZXZlbnQua3BpQ29uZmlnO1xuXG4gICAgY29uc29sZS5sb2codGhpcy5lZGl0SXRlbUZvclVwZGF0ZSk7XG4gICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZUFwcFZpZXdDb25maWcodGhpcy5lZGl0SXRlbUZvclVwZGF0ZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pc0VkaXRPcHRpb25DbGljayA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKCdWaWV3IFVwZGF0ZSBTdWNjZXNzZnVsbHknKVxuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1ZpZXcgQ3JlYXRpb24nKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG4gIGdldFZpZXdQYWdlKCkge1xuICAgIGxldCBuYXZpZ2F0aW9uRXh0cmFzOiBOYXZpZ2F0aW9uRXh0cmFzID0ge1xuICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgXCJwYWdlSWRcIjogdGhpcy5wYWdlSWRcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMucGFnZVVybF0sIG5hdmlnYXRpb25FeHRyYXMpXG5cbiAgfVxuICAvLyBub2RlcHJvcGVydGljZSBmaWx0ZXIgXG5cbiAgZ2V0Tm9kZVByb3BlcnRpY2VGaWx0ZXJPcHRpb24oKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIGlucHV0X3R5cGU6IFwidGV4dFwiLFxuICAgICAgc2VydmVyX2NvbHVtbjogXCJcIixcbiAgICAgIGxvY2FsX2NvbHVtbjogXCJcIixcbiAgICAgIHNlbGVjdF9ib3hfb3B0aW9uOiBcIlwiLFxuICAgIH1cbiAgICB0aGlzLm5vZGVQcm9wZXJ0aWNlRmlsdGVycy5wdXNoKG9iailcbiAgfVxuXG4gIGRlbGV0ZU5vZGVGaWx0ZXIoaW5kZXgpIHtcbiAgICB0aGlzLm5vZGVQcm9wZXJ0aWNlRmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpXG4gIH1cblxuICBzZXREYXRhU2V0c0xpbWl0KGRhdGFzZXQpIHtcbiAgICBsZXQgbGltaXQgPSB7IFwibGltaXRcIjogXCIxMFwiIH1cbiAgICBkYXRhc2V0LmNvbmZpZy5xdWVyeUNvbmZpZy5yZXFGaWVsZHMucHVzaChsaW1pdCk7XG4gICAgcmV0dXJuIGRhdGFzZXQ7XG4gIH1cblxuICBnZXRWaWV3UG9wdXBIaWRlKGUpIHtcbiAgICB0aGlzLmdldEFsbFZpZXdzSXRlbXMoKTtcbiAgfVxuXG4gIGdldERhdGFzZXRQb3B1cEhpZGUoZSkge1xuXG4gIH1cblxuICBzdWJtaXRGaWx0ZXIoKSB7XG5cbiAgfVxuXG4gIGdldFdpZGdldEZpbHRlckZvclRlbXBsYXRlKHZhbHVlKSB7XG4gICAgdGhpcy5nZXREYXRhU2V0KCk7XG4gIH1cblxuICBnZXREZWxldGVWaWV3RnJvbUxheW91dChpdGVtLCBpKSB7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5zcGxpY2UoaSwgMSk7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKHdpZGdldCA9PiB7XG4gICAgICB3aWRnZXQuY29tcENvbmZpZy52aWV3Q29uZmlnID0gd2lkZ2V0LmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgd2lkZ2V0LmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcbiAgICAgIGlmICh3aWRnZXQud2lkZ2V0Tm9kZSAmJiB3aWRnZXQud2lkZ2V0Tm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHdpZGdldC53aWRnZXROb2RlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcgPSBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgICAgIG5vZGUuY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcyA9IFtdO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IHdpZGdldERhdGEgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZztcbiAgICB3aWRnZXREYXRhWyd3aWRnZXRzJ10gPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLm1hcChpdGVtID0+IGl0ZW0ud2lkZ2V0SWQpO1xuICAgIHdpZGdldERhdGFbJ2ZpbHRlcklkJ10gPSAod2lkZ2V0RGF0YS5maWx0ZXJzKSA/IHdpZGdldERhdGEuZmlsdGVycy5maWx0ZXJJZCA6IG51bGw7XG4gICAgZGVsZXRlIHdpZGdldERhdGFbJ2ZpbHRlcnMnXTtcblxuICAgIHRoaXMuc2VydmljZS5lZGl0QXBwUGFnZUNvbmZpZyh3aWRnZXREYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFwiTGF5b3V0IERlbGV0ZWQgU3VjY2Vzc2Z1bGx5XCIpXG4gICAgICAgIHRoaXMuZ2V0QXBwUGFnZURldGFpbENvbmZpZ0J5UGFnZUlkKClcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdXaWRnZXQgQ3JlYXRpb24nKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG4gIC8vIGFkdmFuY2UgTGF5b3V0IFxuICBpc0FkdmFuY2VMYXlvdXQ6IGJvb2xlYW47XG4gIGlzUHJvY2VlZDogYm9vbGVhbjtcbiAgc2VsZWN0ZWRWaWV3c0lkczogYW55ID0gW107XG4gIGFkdmFuY2VMYXlvdXRDb250YWluZXI6IGFueSA9IFtdO1xuICBnZXRQcm9jZXNzRm9yQ29uZmlnKCkge1xuICAgIHRoaXMuYWR2YW5jZUxheW91dENvbnRhaW5lciA9IFtdO1xuICAgIGNvbnN0IGZpbHRlcmVkQ29sdW1ucyA9IHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZS5maWx0ZXIoY29sdW1uID0+IHRoaXMuc2VsZWN0ZWRWaWV3c0lkcy5pbmNsdWRlcyhjb2x1bW4udmlld0lkKSk7XG4gICAgY29uc3QgY29sdW1uRGVmTGlzdCA9IFtdO1xuXG4gICAgZmlsdGVyZWRDb2x1bW5zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAvLyBjb25zdCBleGlzdGluZ0NvbHVtbiA9IGZhbHNlO1xuICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgXCJpZFwiOiB0aGlzLmNvbW1vblNlcnZpY2UucHJpbWVyeVJlbmRvbWVJZCg1KSxcbiAgICAgICAgXCJub2RlVGl0bGVcIjogXCJcIixcbiAgICAgICAgXCJjb21wQ29uZmlnXCI6IHtcbiAgICAgICAgICBcImR5bmFtaWNDb21wb25lbnRSZWZzXCI6IFtdLFxuICAgICAgICAgIFwidmlld0NvbmZpZ1wiOiBbZWxlbWVudF1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWx0ZXJJZFwiOiBudWxsLFxuICAgICAgICBcIm5vZGVQcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICBcImRpc3BsYXlcIjogdHJ1ZSxcbiAgICAgICAgICBcIndpZGdldFRpdGxlXCI6IFwiXCIsXG4gICAgICAgICAgXCJ3aWR0aFwiOiBcIlwiLFxuICAgICAgICAgIFwiaGVpZ2h0XCI6IFwiXCIsXG4gICAgICAgICAgXCJpc1dpZGdldEZpbHRlclwiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmFkdmFuY2VMYXlvdXRDb250YWluZXIucHVzaChvYmopO1xuXG4gICAgfSk7XG5cbiAgICB0aGlzLmlzUHJvY2VlZCA9IHRydWU7XG4gIH1cblxuICBnZXRTZWxlY3RlZENvbHVtblNvdXJjZShldmVudCkge1xuICAgIGlmIChldmVudC5ldmVudCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXdzSWRzID0gZXZlbnQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgc3VibWl0QWR2YW5jZVZpZXcoKSB7XG4gICAgaWYgKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZSAmJiB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUgPSBbLi4udGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLCAuLi50aGlzLmFkdmFuY2VMYXlvdXRDb250YWluZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUgPSB0aGlzLmFkdmFuY2VMYXlvdXRDb250YWluZXI7XG4gICAgfVxuICAgIHRoaXMuaXNBZHZhbmNlTGF5b3V0ID0gZmFsc2U7XG4gICAgdGhpcy5hZHZhbmNlTGF5b3V0Q29udGFpbmVyID0gW107XG4gICAgdGhpcy5pc1Byb2NlZWQgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZVdpZGdldCgpO1xuICB9XG5cblxuXG4gIGRlbGV0ZVZpZXcoaSkge1xuXG4gIH1cbn1cbiIsIjxhcHAtbG9hZGluZyAqbmdJZj1cImxvYWRpbmdNb2RhbFwiPjwvYXBwLWxvYWRpbmc+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGgtWzkwdmhdIHctZnVsbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3LTMvNCBib3JkZXItciBoLWZ1bGwgZmxleCBmbGV4LWNvbCBweC0yXCI+XG4gICAgICAgIDwhLS0gU2Nyb2xsYWJsZSBjb250ZW50IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93IG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIG15LTNcIiAjZHluYW1pY0NvbnRhaW5lcj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGaXhlZCBib3R0b20gc2VjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGgtMTYgbS0yIGJvcmRlciBzaHJpbmstMFwiPlxuICAgICAgICAgICAgPGxpYi1jb21tb24taGVhZGVyIFtwYWdlVGl0bGVdPVwiJydcIj48L2xpYi1jb21tb24taGVhZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IG0tMlwiIChjbGljayk9XCJhZGRXaWRnZXQoKVwiPkFkZCBMYXlvdXQ8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuT3RoZXJzUHVycGxlfX0gbS0yIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImdldFZpZXdQYWdlKClcIj5WaWV3IFBhZ2U8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInctMS80IHAtMiBoLWZ1bGxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRGFzaEJvYXJkQ29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5EYXJrQmxhY2t9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc2FyLXBvaW50ZXJcIiAoY2xpY2spPVwiYmFja1RvTWFpblZpZXcoKVwiPlxuICAgICAgICAgICAgICAgIEJhY2tcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYWdlX2NvbmZpZy5hcGlfY29uZmlnOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIHB5LTIgZm9udC1ib2xkICB0ZXh0LXdoaXRlIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS53aWRHZXRDb25maWcud2lkZ2V0VGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggc3BhY2UteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gKGNsaWNrKT1cImVkaXRTZWxlY3RlZFdpZGdldChpdGVtLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTggaC04IGJnLXNreS02MDAgaG92ZXI6YmctYmx1ZS04MDAgdGV4dC13aGl0ZSByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWVkaXRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTggaC04IGJnLXJlZC02MDAgaG92ZXI6YmctcmVkLTgwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxoNiBjbGFzcz1cIm1iLTIgZm9udC1ib2xkIHRleHQtbGcgdHJhY2tpbmctdGlnaHQgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUgYm9yZGVyLWIgcGItM1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzbGF5b3V0Q3JlYXRlXCI+V2lkZ2V0IFNldHRpbmdzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNsYXlvdXRDcmVhdGVcIj5MYXlvdXQgU2V0dGluZ3M8L3NwYW4+XG4gICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbXktNFwiPlxuICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggY2xhc3M9XCJtbC1hdXRvXCIgWyhuZ01vZGVsKV09XCJhZGRlZHdpZEdldENvbmZpZy5kaXNwbGF5XCIgdGV4dD1cIkRpc3BsYXlcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWQgbXktYXV0byBweC0yXCI+V2lkdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggY2xhc3M9XCJ3LTEvMlwiIFtpdGVtc109XCJ3aWRnZXRfd2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFkZGVkd2lkR2V0Q29uZmlnLndpZHRoXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtYi0yIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tZCBteS1hdXRvIHB4LTJcIj5IZWlnaHQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IGNsYXNzPVwidy0xLzJcIiBbKG5nTW9kZWwpXT1cImFkZGVkd2lkR2V0Q29uZmlnLmhlaWdodFwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG15LWF1dG8gcHgtMlwiPldpZGdldCBUaXRsZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+PGR4LXRleHQtYm94IGNsYXNzPVwidy0xLzJcIiBbKG5nTW9kZWwpXT1cIndpZGdldFRpdGxlXCI+PC9keC10ZXh0LWJveD48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tZCBteS1hdXRvIHB4LTJcIj5XaWRnZXQgTmFtZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggY2xhc3M9XCJ3LTEvMlwiIFsobmdNb2RlbCldPVwid2lkZ2V0TmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtYi01IGp1c3RpZnktYmV0d2VlblwiICpuZ0lmPVwiaXNsYXlvdXRDcmVhdGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gbXktYXV0byBweC0yXCI+TGF5b3V0IFRpdGxlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBjbGFzcz1cInctMS8yXCIgWyhuZ01vZGVsKV09XCJhZGRlZHdpZEdldENvbmZpZy53aWRnZXRUaXRsZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWQgbXktYXV0byBweC0yXCI+RmlsdGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IGNsYXNzPVwidy0xLzJcIiBbaXRlbXNdPVwiZmlsdGVyRGF0YVNvdXJjZVwiIGRpc3BsYXlFeHByPVwiZmlsdGVyTmFtZVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZUV4cHI9XCJmaWx0ZXJJZFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGaWx0ZXJJZFwiXG4gICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXRGaWx0ZXJWYWx1ZUJ5SWQoJGV2ZW50KVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1VwZGF0ZVdpZGdldFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC02XCIgKm5nSWY9XCIhaXNsYXlvdXRDcmVhdGUgJiYgaXNFZGl0TWFpbkxheW91dFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tuZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZTtsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMiBmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgcHktMiBmb250LWJvbGQgIHRleHQtd2hpdGUgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gMFwiIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yUGFnZVZpZXcoaSwgJ3VwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaSAhPT0gIGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW25ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JQYWdlVmlldyhpLCAnZG93bicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctOCBoLTggYmctcmVkLTYwMCBob3ZlcjpiZy1yZWQtODAwIHRleHQtd2hpdGUgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1VwZGF0ZVdpZGdldFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHB5LTEgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+IEFwcGxpY2F0aW9uIFZpZXdzXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci14IGJvcmRlci1iIHAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFsbFdpZGdldElubmVyQ29udGVudDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwICB3LWZ1bGwgZmxleCBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgZm9udC1ib2xkICBweS0yIGN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS52aWV3TmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzcGFjZS14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDBcIiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvckNvbHVtbnMoaSwgJ3VwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSBhbGxXaWRnZXRJbm5lckNvbnRlbnQubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvckNvbHVtbnMoaSwgJ2Rvd24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1ibHVlLTUwMCBob3ZlcjpiZy1ibHVlLTcwMCBtYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q29tcG9uZW50Vmlld3MoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZXllXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1ibHVlLTUwMCBob3ZlcjpiZy1ibHVlLTcwMCBtYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q29tcG9uZW50RGF0YXNldHMoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZGF0YWJhc2VcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm91bmRlZC1mdWxsIHAtMiB0ZXh0LXdoaXRlIGJnLXJlZC01MDAgaG92ZXI6YmctcmVkLTcwMCBtYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXREZWxldGVWaWV3RnJvbUNvbmZpZyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNVcGRhdGVXaWRnZXRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBBZGQgRmlsdGVyIEZvciBWaWV3XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLXggYm9yZGVyLWIgcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHB5LTMgYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggWyhuZ01vZGVsKV09XCJhZGRlZHdpZEdldENvbmZpZy5pc1dpZGdldEZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlBvcHVwIENvbHVtbnMgRmlsdGVyIEVuYWJsZVwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbXktMiBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBub2RlUHJvcGVydGljZUZpbHRlcnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kXCI+SW5wdXQgVHlwZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsndGV4dCddXCIgWyhuZ01vZGVsKV09XCJpdGVtLmlucHV0X3R5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwidGV4dFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xLTEgdy0yLzNcIiAqbmdJZj1cIml0ZW0uaW5wdXRfdHlwZSA9PSAndGV4dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kXCI+U2VydmVyIENvbHVtbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5zZXJ2ZXJfY29sdW1uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xLTEgdy0xLzJcIiAqbmdJZj1cIml0ZW0uaW5wdXRfdHlwZSA9PSAndGV4dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kXCI+TG9jYWwgQ29sdW1uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmxvY2FsX2NvbHVtblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMS0xIHctMS8zXCIgKm5nSWY9XCJpdGVtLmlucHV0X3R5cGUgPT0gJ3NlbGVjdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kXCI+Q29sdW1ucyBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLnNlbGVjdF9ib3hfb3B0aW9uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xLTEgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gdy0yNCBtdC02IHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZU5vZGVGaWx0ZXIoaSlcIj5EZWxldGUgRmlsdGVyPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSB3LWF1dG8gdGV4dC1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldE5vZGVQcm9wZXJ0aWNlRmlsdGVyT3B0aW9uKClcIj5BZGRcbiAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlcjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlciBoLTE2IG0tMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuRGFya0JsYWNrfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJhY2tUb01haW5WaWV3KClcIj5CYWNrXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1VwZGF0ZVdpZGdldFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNsYXlvdXRDcmVhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc2FyLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZExheW91dFRPdmlldygpXCI+QWRkIFZpZXdcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNsYXlvdXRDcmVhdGUgJiYgIWlzRWRpdE1haW5MYXlvdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc2FyLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFdpZGdldFRPdmlldygpXCI+QWRkIExheW91dFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZSAmJiBpc0VkaXRNYWluTGF5b3V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVMYXlvdXRXaWRnZXRUT3ZpZXcoKVwiPlVwZGF0ZSBMYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3dhcm5pbmdfbWR9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc2FyLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVG9WaWV3KClcIiAqbmdJZj1cImlzVXBkYXRlV2lkZ2V0XCI+VXBkYXRlIFZpZXdcbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgPCEtLSA8cHJlPjxjb2RlPnt7ZGFzaEJvYXJkV2lkZ2V0Q29uZmlnIHwganNvbn19PC9jb2RlPjwvcHJlPiAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NoYXJ0QnV0dG9uQ2xpY2tcIj5cbiAgICAgICAgICAgIDxoNlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWItMiBmb250LWJvbGQgdGV4dC1tZCB0cmFja2luZy10aWdodCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZSBib3JkZXItYiBwYi0zIGZsZXggIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFyLWNoYXJ0LW8gbXItMlwiPjwvaT4gU2VsZWN0IFZpZXdcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bkRhcmtCbGFja319IG0tMiB3LWZpdCB0ZXh0LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiYWNrVG9NYWluVmlldygpXCI+QmFja1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgaC1bODB2aF0gb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIG15LTIgXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwidmlld1RvU2VhcmNoXCIgKGtleXVwKT1cImZpbHRlclZpZXdzKClcIiAoa2V5ZG93bik9XCJmaWx0ZXJWaWV3cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmctZ3JheS04MDAgYm9yZGVyIGJvcmRlci1ncmF5LTcwMCB0ZXh0LWdyYXktMjAwIHRleHQtc20gZm9jdXM6cmluZy1ncmF5LTQwMCBmb2N1czpib3JkZXItZ3JheS01MDAgYmxvY2sgdy1mdWxsIHAtNCBoLTggcm91bmRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBWaWV3XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC15LTAgcmlnaHQtMCBmbGV4IGl0ZW1zLWNlbnRlciBwci02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJyb3RhdGUtOTAgY3Vyc29yLXBvaW50ZXJcIiBbc3ZnSWNvbl09XCInaGVyb2ljb25zX291dGxpbmU6c2VhcmNoJ1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRDb21wb25lbnRDb25maWdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGdyb3VwIG15LTMgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEl0ZW0gVmlldyBOYW1lIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgZm9udC1ib2xkIGJvcmRlci1iIHB5LTIgY3Vyc2FyLXBvaW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0udmlld05hbWV9fTwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhvdmVyIEJ1dHRvbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSB0b3AtMCAgcmlnaHQtMCBmbGV4IHNwYWNlLXgtMiBvcGFjaXR5LTAgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgdHJhbnNpdGlvbi1vcGFjaXR5IGR1cmF0aW9uLTMwMCBwYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1ibHVlLTUwMCBob3ZlcjpiZy1ibHVlLTcwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBlbmNpbC1zcXVhcmUtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdENvbXBvbmVudFZpZXdzKGl0ZW0pXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctZ3JlZW4tNTAwIGhvdmVyOmJnLWdyZWVuLTcwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXRDb21wb25lbnRDb25maWcoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0RlZmF1bHRWaWV3XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwIG15LTMgdy1mdWxsIGZsZXgganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBmb250LWJvbGQgIHB5LTIgY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS53aWRnZXRUaXRsZX19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDBcIiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JXaWRnZXQoaSwgJ3VwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JXaWRnZXQoaSwgJ2Rvd24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1ibHVlLTUwMCBob3ZlcjpiZy1ibHVlLTcwMCBtYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0RWRpdFZpZXdGcm9tTGF5b3V0KGl0ZW0saSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBlbmNpbC1zcXVhcmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1yZWQtNTAwIGhvdmVyOmJnLXJlZC03MDAgbWItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldERlbGV0ZVZpZXdGcm9tTGF5b3V0KGl0ZW0saSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgPC9kaXY+XG48L2Rpdj5cbjwhLS0gPC9kaXY+IC0tPlxuXG48ZHgtcG9wdXAgWyh2aXNpYmxlKV09XCJpc0VkaXRPcHRpb25DbGlja1wiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjEyMDBcIlxuICAgIFtoZWlnaHRdPVwiJ2F1dG8nXCIgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwie3tlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbC52aWV3TmFtZX19XCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuXG4gICAgICAgIDxhcHAtZGFzaC1jaGFydCBbZGF0YXNldG1vZGFsXT1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsXCIgKGdldENoYXJ0Q29uZmlnT3V0UHV0KT1cImdldEVtaXROZXdDaGFydENvbmdpZygkZXZlbnQpXCJcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdFZpZXdkYXRhU291cmNlTW9kYWwudmlld1R5cGUgPT0gJ2NoYXJ0J1wiPjwvYXBwLWRhc2gtY2hhcnQ+XG4gICAgICAgIDxhcHAtZGFzaC10YWJsZSBbZGF0YXNldG1vZGFsXT1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsXCIgKGdldFRhYmxlQ29uZmlnT3V0UHV0KT1cImdldEVtaXROZXdDaGFydENvbmdpZygkZXZlbnQpXCJcbiAgICAgICAgICAgICpuZ0lmPVwiZWRpdFZpZXdkYXRhU291cmNlTW9kYWwudmlld1R5cGUgPT0gJ3RhYmxlJ1wiPjwvYXBwLWRhc2gtdGFibGU+XG4gICAgICAgIDwhLS0gPGFwcC1kYXNoLW90aGVyIFtkYXRhc2V0bW9kYWxdPVwiZWRpdFZpZXdkYXRhU291cmNlTW9kYWxcIiAqbmdJZj1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsLnZpZXdUeXBlID09ICdvdGhlcnMnXCJcbiAgICAgICAgICAgIChjcmVhdGVPdGhlckNvbXBvbmVudFZpZXcpPVwiZ2V0RW1pdE5ld0NoYXJ0Q29uZ2lnKCRldmVudClcIj48L2FwcC1kYXNoLW90aGVyPiAtLT5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+XG5cblxuPGR4LXBvcHVwIFsodmlzaWJsZSldPVwiaXNDcmVhdGVEYXRhc2V0XCIgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwiZmFsc2VcIiBbZHJhZ0VuYWJsZWRdPVwiZmFsc2VcIiBbd2lkdGhdPVwiMTIwMFwiXG4gICAgW2hlaWdodF09XCI2MDBcIiBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJEYXRhc2V0IEVkaXRvclwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cbiAgICAgICAgPGR4LXNjcm9sbC12aWV3IGNsYXNzPVwiaC1mdWxsXCIgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzEwMCUnXCI+XG4gICAgICAgICAgICA8YXBwLWNyZWF0ZS1kYXRhc2V0IFtpc0hlYWRlcl09XCJmYWxzZVwiPjwvYXBwLWNyZWF0ZS1kYXRhc2V0PlxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzQ3JlYXRlRGF0YXNldFdpdGhEYXRhc2V0SWRcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJmYWxzZVwiIFtkcmFnRW5hYmxlZF09XCJmYWxzZVwiIFt3aWR0aF09XCIxMjAwXCJcbiAgICBbaGVpZ2h0XT1cIjYwMFwiIFtzaG93VGl0bGVdPVwidHJ1ZVwiIGNsYXNzPVwicG9wdXBcIiB0aXRsZT1cIkRhdGFzZXQgRWRpdG9yXCIgKG9uSGlkZGVuKT1cImdldERhdGFzZXRQb3B1cEhpZGUoJGV2ZW50KVwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cbiAgICAgICAgPGR4LXNjcm9sbC12aWV3IGNsYXNzPVwiaC1mdWxsXCIgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzEwMCUnXCI+XG4gICAgICAgICAgICA8YXBwLWNyZWF0ZS1kYXRhc2V0IFtzZWxlY3RlZERhdGFzZXRJZF09XCJzZWxlY3RlZERhdGFzZXRJZFwiIFtpc0hlYWRlcl09XCJmYWxzZVwiPjwvYXBwLWNyZWF0ZS1kYXRhc2V0PlxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD5cblxuPGR4LXBvcHVwIFsodmlzaWJsZSldPVwiaXNDcmVhdGVOZXdWaWV3V2l0aERlZmF1bHRWaWV3XCIgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwiZmFsc2VcIiBbZHJhZ0VuYWJsZWRdPVwiZmFsc2VcIlxuICAgIFt3aWR0aF09XCIxMjAwXCIgW2hlaWdodF09XCI2MDBcIiBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJWaWV3cyBFZGl0b3JcIlxuICAgIChvbkhpZGRlbik9XCJnZXRWaWV3UG9wdXBIaWRlKCRldmVudClcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkeC1zY3JvbGwtdmlldyBjbGFzcz1cImgtZnVsbFwiIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxMDAlJ1wiPlxuICAgICAgICAgICAgPGFwcC1jcmVhdGUtY29tcC12aWV3IFtzZWxlY3RlZFZpZXdJZF09XCJzZWxlY3RlZFZpZXdJZFwiIFtpc0hlYWRlcl09XCJmYWxzZVwiPjwvYXBwLWNyZWF0ZS1jb21wLXZpZXc+XG4gICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XG4gICAgPC9kaXY+XG48L2R4LXBvcHVwPlxuPGR4LXBvcHVwIFsodmlzaWJsZSldPVwiaXNDcmVhdGVOZXdWaWV3XCIgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwiZmFsc2VcIiBbZHJhZ0VuYWJsZWRdPVwiZmFsc2VcIiBbd2lkdGhdPVwiMTIwMFwiXG4gICAgW2hlaWdodF09XCI2MDBcIiBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJWaWV3cyBFZGl0b3JcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkeC1zY3JvbGwtdmlldyBjbGFzcz1cImgtZnVsbFwiIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxMDAlJ1wiPlxuICAgICAgICAgICAgPGFwcC1jcmVhdGUtY29tcC12aWV3IFtpc0hlYWRlcl09XCJmYWxzZVwiPjwvYXBwLWNyZWF0ZS1jb21wLXZpZXc+XG4gICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XG4gICAgPC9kaXY+XG48L2R4LXBvcHVwPlxuXG5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzV2lkZ2V0RmlsdGVyc1wiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjgwMFwiIFtoZWlnaHRdPVwiNDAwXCJcbiAgICBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJEYXRhc2V0IEZpbHRlclwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTJcIj5cbiAgICAgICAgICAgIDxkeC1zY3JvbGwtdmlldyBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInODUlJ1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygbm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmNvbHVtbk5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnZ2V0JywnbGV0J11cIiBbKG5nTW9kZWwpXT1cIml0ZW0ub3BlcmF0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wZXJhdG9yXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS52YWx1ZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBteC0xIGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC0yXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN1Ym1pdEZpbHRlcigpXCI+U3VibWl0PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzQWR2YW5jZUxheW91dFwiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjEyMDBcIlxuICAgIFtoZWlnaHRdPVwiNzAwXCIgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwiRGF0YXNldCBGaWx0ZXJcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHB4LTIgbWItM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMi8zIG1iLTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+U2VsZWN0IFZpZXdzPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW2RhdGFTb3VyY2VdPVwiY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZVwiIHZhbHVlRXhwcj1cInZpZXdJZFwiIGRpc3BsYXlFeHByPVwidmlld05hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbbXVsdGlsaW5lXT1cInRydWVcIiBbc2hvd1NlbGVjdGlvbkNvbnRyb2xzXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkVmlld3NJZHNcIlxuICAgICAgICAgICAgICAgICAgICBbbWF4RGlzcGxheWVkVGFnc109XCIzXCIgKG9uVmFsdWVDaGFuZ2VkKT1cImdldFNlbGVjdGVkQ29sdW1uU291cmNlKCRldmVudClcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPC9keC10YWctYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzMgcHgtMlwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fSBtdC02XCIgKGNsaWNrKT1cImdldFByb2Nlc3NGb3JDb25maWcoKVwiPlxuICAgICAgICAgICAgICAgICAgICBBZGQgVG8gVmlld1xuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtNlwiIChjbGljayk9XCJjYW5jZWxDZHJDb25maWcoKVwiPkNhbmNlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+IC0tPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZHgtc2Nyb2xsLXZpZXcgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzgwJSdcIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMiBib3JkZXItYlwiICpuZ0lmPVwiaXNQcm9jZWVkXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhZHZhbmNlTGF5b3V0Q29udGFpbmVyOyBsZXQgaSA9IGluZGV4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPlZpZXcgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnWzBdLnZpZXdOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+V2lkZ2V0IFRpdGxlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5ub2RlUHJvcGVydGllcy53aWRnZXRUaXRsZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+V2lkZ2V0IFdpZHRoPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJ3aWRnZXRfd2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0ubm9kZVByb3BlcnRpZXMud2lkdGhcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+V2lkZ2V0IEhlaWdodDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ubm9kZVByb3BlcnRpZXMuaGVpZ2h0XCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+V2lkZ2V0IEZpbHRlcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJmaWx0ZXJEYXRhU291cmNlXCIgZGlzcGxheUV4cHI9XCJmaWx0ZXJOYW1lXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcj1cImZpbHRlcklkXCIgWyhuZ01vZGVsKV09XCJpdGVtLmZpbHRlcklkXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG10LThcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ubm9kZVByb3BlcnRpZXMuZGlzcGxheVwiIHRleHQ9XCJEaXNwbGF5XCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXIgbXQtOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVWaWV3KGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZHgtc2Nyb2xsLXZpZXc+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIG14LTEgbXktMiBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC0yXCIgKGNsaWNrKT1cInN1Ym1pdEFkdmFuY2VWaWV3KClcIj5BZGRcbiAgICAgICAgICAgICAgICBMYXlvdXQ8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2R4LXBvcHVwPiJdfQ==