@sd-angular/core 1.3.29 → 1.3.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/bundles/sd-angular-core-grid.umd.js +50 -187
  2. package/bundles/sd-angular-core-grid.umd.js.map +1 -1
  3. package/bundles/sd-angular-core-grid.umd.min.js +1 -1
  4. package/bundles/sd-angular-core-grid.umd.min.js.map +1 -1
  5. package/bundles/sd-angular-core-upload-excel.umd.js.map +1 -1
  6. package/bundles/sd-angular-core-upload-excel.umd.min.js.map +1 -1
  7. package/bundles/sd-angular-core.umd.js +4 -4
  8. package/bundles/sd-angular-core.umd.min.js +1 -1
  9. package/bundles/sd-angular-core.umd.min.js.map +1 -1
  10. package/esm2015/grid/src/lib/components/grid-popup-export-excel/grid-popup-export-excel.component.js +35 -27
  11. package/esm2015/grid/src/lib/components/grid-popup-export-excel/grid-popup-export-excel.model.js +1 -1
  12. package/esm2015/grid/src/lib/grid.component.js +11 -118
  13. package/esm2015/public-api.js +1 -3
  14. package/esm2015/upload-excel/src/lib/upload-excel.component.js +1 -1
  15. package/fesm2015/sd-angular-core-grid.js +43 -142
  16. package/fesm2015/sd-angular-core-grid.js.map +1 -1
  17. package/fesm2015/sd-angular-core-upload-excel.js.map +1 -1
  18. package/fesm2015/sd-angular-core.js +0 -1
  19. package/fesm2015/sd-angular-core.js.map +1 -1
  20. package/grid/sd-angular-core-grid.metadata.json +1 -1
  21. package/grid/src/lib/components/grid-popup-export-excel/grid-popup-export-excel.component.d.ts +12 -12
  22. package/grid/src/lib/components/grid-popup-export-excel/grid-popup-export-excel.model.d.ts +1 -2
  23. package/grid/src/lib/grid.component.d.ts +5 -6
  24. package/package.json +1 -1
  25. package/public-api.d.ts +0 -1
  26. package/{sd-angular-core-1.3.29.tgz → sd-angular-core-1.3.30.tgz} +0 -0
  27. package/upload-excel/sd-angular-core-upload-excel.metadata.json +1 -1
  28. package/bundles/sd-angular-core-excel.umd.js +0 -500
  29. package/bundles/sd-angular-core-excel.umd.js.map +0 -1
  30. package/bundles/sd-angular-core-excel.umd.min.js +0 -16
  31. package/bundles/sd-angular-core-excel.umd.min.js.map +0 -1
  32. package/esm2015/excel/index.js +0 -2
  33. package/esm2015/excel/sd-angular-core-excel.js +0 -5
  34. package/esm2015/excel/src/lib/excel.model.js +0 -3
  35. package/esm2015/excel/src/lib/excel.service.js +0 -91
  36. package/esm2015/excel/src/public-api.js +0 -6
  37. package/excel/index.d.ts +0 -1
  38. package/excel/package.json +0 -12
  39. package/excel/sd-angular-core-excel.d.ts +0 -4
  40. package/excel/sd-angular-core-excel.metadata.json +0 -1
  41. package/excel/src/lib/excel.model.d.ts +0 -65
  42. package/excel/src/lib/excel.service.d.ts +0 -26
  43. package/excel/src/public-api.d.ts +0 -2
  44. package/fesm2015/sd-angular-core-excel.js +0 -100
  45. package/fesm2015/sd-angular-core-excel.js.map +0 -1
@@ -5,7 +5,6 @@ import { DatePipe } from '@angular/common';
5
5
  import { DeviceDetectorService } from 'ngx-device-detector';
6
6
  import $ from 'jquery';
7
7
  import { SdApiService } from '@sd-angular/core/api';
8
- import { SdExcelService } from '@sd-angular/core/excel';
9
8
  import { SdNotifyService } from '@sd-angular/core/notify';
10
9
  import { SdLoadingService } from '@sd-angular/core/loading';
11
10
  import { SdTranslateService } from '@sd-angular/core/translate';
@@ -20,8 +19,9 @@ import { startWith } from 'rxjs/operators';
20
19
  import { SdCellEditorDefDirective } from './directives/cell-editor-def.directive';
21
20
  import { HandlerLocal } from './models/handler-local';
22
21
  import { HandlerDotnet } from './models/handler-dotnet';
22
+ import { SdExportService } from '@sd-angular/core/export';
23
23
  export class SdGrid {
24
- constructor(configuration, ref, deviceService, handlerLocal, handlerDotnet, translateService, datePipe, loadingService, apiService, excelService, notifyService, editorVisiblePipe) {
24
+ constructor(configuration, ref, deviceService, handlerLocal, handlerDotnet, translateService, datePipe, loadingService, apiService, exportService, notifyService, editorVisiblePipe) {
25
25
  this.configuration = configuration;
26
26
  this.ref = ref;
27
27
  this.handlerLocal = handlerLocal;
@@ -30,7 +30,7 @@ export class SdGrid {
30
30
  this.datePipe = datePipe;
31
31
  this.loadingService = loadingService;
32
32
  this.apiService = apiService;
33
- this.excelService = excelService;
33
+ this.exportService = exportService;
34
34
  this.notifyService = notifyService;
35
35
  this.editorVisiblePipe = editorVisiblePipe;
36
36
  this.isMobileOrTablet = false;
@@ -772,118 +772,11 @@ export class SdGrid {
772
772
  columns.forEach(handle);
773
773
  return obj;
774
774
  });
775
- this.excelService.generateExcelDataByTemplate(params.excelConfig.fullPath, params.excelColumns, items, params.excelConfig.name);
776
- });
777
- this.bigExport = () => __awaiter(this, void 0, void 0, function* () {
778
- var _p, _q, _r, _s;
779
- const pageSize = 1000;
780
- let pageNumber = 1;
781
- this.loadingService.start();
782
- try {
783
- let exportItems = [];
784
- let filePath = null;
785
- let destination = null;
786
- let latestRow = 0;
787
- while (true) {
788
- if ((_p = this.gridOption.export) === null || _p === void 0 ? void 0 : _p.items) {
789
- exportItems = yield ((_q = this.gridOption.export) === null || _q === void 0 ? void 0 : _q.items(this.getFilterInfo(pageNumber, pageSize)).finally(this.loadingService.stop));
790
- }
791
- else {
792
- exportItems = yield this.getExportItems(pageNumber, pageSize).finally(this.loadingService.stop);
793
- }
794
- if ((_r = this.gridOption.export) === null || _r === void 0 ? void 0 : _r.mapping) {
795
- const results = this.gridOption.export.mapping(exportItems);
796
- if (results instanceof Promise) {
797
- exportItems = yield results;
798
- }
799
- else {
800
- exportItems = results;
801
- }
802
- }
803
- const columns = [...this.gridOption.columns, ...(((_s = this.gridOption.export) === null || _s === void 0 ? void 0 : _s.columns) || [])];
804
- const items = exportItems.map(item => {
805
- const obj = {};
806
- const handle = (column) => {
807
- if (column.type === 'children') {
808
- column.children.forEach(handle);
809
- }
810
- else if (column.transform) {
811
- obj[column.field] = column.transform(item[column.field], item);
812
- }
813
- else if (item[column.field] === undefined || item[column.field] === null || item[column.field] === '') {
814
- obj[column.field] = '';
815
- }
816
- else if (column.type === 'string' || column.type === 'number' || column.type === 'color') {
817
- // Nếu cell là string hoặc number thì gán bằng chính nó
818
- obj[column.field] = item[column.field];
819
- }
820
- else if (column.type === 'bool') {
821
- // Nếu là bool thì gán bằng giá trị trueValue và falseValue (nếu có), mặc định là TRUE/FALSE
822
- if (item[column.field]) {
823
- obj[column.field] = column.trueValue || 'True';
824
- }
825
- else {
826
- obj[column.field] = column.falseValue || 'False';
827
- }
828
- }
829
- else if (column.type === 'date') {
830
- // Nếu là date thì convert theo đúng format
831
- const date = new Date(item[column.field]);
832
- obj[column.field] = this.datePipe.transform(date, 'dd/MM/yyyy');
833
- }
834
- else if (column.type === 'datetime') {
835
- // Nếu là datetime thì convert theo đúng format
836
- const date = new Date(item[column.field]);
837
- obj[column.field] = this.datePipe.transform(date, 'dd/MM/yyyy HH:mm:ss');
838
- }
839
- else if (column.type === 'time') {
840
- // Nếu là time thì convert theo đúng format
841
- const date = new Date(item[column.field]);
842
- obj[column.field] = this.datePipe.transform(date, 'HH:mm:ss');
843
- }
844
- else if (column.type === 'values') {
845
- // Nếu là values thì lấy giá trị của value được chọn
846
- const data = column.values.find(e => e.value === item[column.field]);
847
- if (data) {
848
- obj[column.field] = data.text;
849
- }
850
- else {
851
- obj[column.field] = item[column.field];
852
- }
853
- }
854
- else if (column.type === 'radio') {
855
- const data = column.values.find(e => e[column.valueField] === item[column.field]);
856
- if (data) {
857
- obj[column.field] = data[column.displayField];
858
- }
859
- else {
860
- obj[column.field] = item[column.field];
861
- }
862
- }
863
- };
864
- columns.forEach(handle);
865
- return obj;
866
- });
867
- const result = yield this.excelService.bigExport({
868
- columns,
869
- items,
870
- latestRow,
871
- filePath,
872
- destination
873
- });
874
- latestRow = result.latestRow;
875
- filePath = result.filePath;
876
- destination = result.destination;
877
- if ((pageNumber - 1) * pageSize + items.length >= this.total) {
878
- yield this.excelService.download(filePath);
879
- break;
880
- }
881
- pageNumber++;
882
- }
883
- }
884
- finally {
885
- this.loadingService.stop();
886
- }
775
+ this.exportService.exportByTemplate({
776
+ filePath: params.excelConfig.fullPath,
777
+ columns: params.excelColumns,
778
+ items
779
+ });
887
780
  });
888
781
  this.onEditorChange = () => {
889
782
  this.ref.detectChanges();
@@ -1256,7 +1149,7 @@ _numberOfFooterRows = new WeakMap(), _paginator = new WeakMap(), _subscription =
1256
1149
  SdGrid.decorators = [
1257
1150
  { type: Component, args: [{
1258
1151
  selector: 'sd-grid',
1259
- template: "<div class=\"clearfix\"></div>\r\n<ng-container *ngIf=\"!isMobileOrTablet && !gridOption?.filter?.disabled\">\r\n <div class=\"row mx-0 mt-5\">\r\n <div\r\n *ngIf=\"gridOption?.key && gridOption?.filter?.multiple !== false && (!gridOption?.filter?.quickFilterVisibility || gridOption?.filter?.quickFilterVisibility === 'inline')\"\r\n class=\"col-lg-2 col-md-3 col-sm-6 px-4\">\r\n <mat-form-field class=\"sd-md\" appearance=\"outline\" style=\"width: 100%;\">\r\n <mat-label>{{'Quick filters' | sdTranslate}}</mat-label>\r\n <mat-select [(ngModel)]=\"selectedQuickFilter\" (selectionChange)=\"onSelectQuickFilter($event?.value)\" #matSelect>\r\n <mat-option value=\"\">{{'Please select' | sdTranslate}}</mat-option>\r\n <mat-option *ngFor=\"let quickFilter of quickFilters\" [value]=\"quickFilter.code\">\r\n <div style=\"display:flex; justify-content: space-between\">\r\n <span>{{quickFilter.code}}</span>\r\n <div>\r\n <mat-icon class=\"mr-1 c-fa-icon\" (click)=\"onEditQuickFilter($event, quickFilter)\" fontSet=\"fa\"\r\n fontIcon=\"fa-pencil\"></mat-icon>\r\n <mat-icon class=\"mr-0 c-fa-icon\" (click)=\"onDeleteQuickFilter($event, quickFilter)\" fontSet=\"fa\"\r\n fontIcon=\"fa-trash-o\"></mat-icon>\r\n </div>\r\n </div>\r\n </mat-option>\r\n <mat-option>\r\n <div (click)=\"onCreateQuickFilter($event)\">\r\n <mat-icon class=\"mr-1\" fontSet=\"material-icons-outlined\">add</mat-icon>\r\n <span>{{'Create quick filter' | sdTranslate}}</span>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <sd-grid-desktop-inline-filter class=\"c-display-contents\" [columns]=\"gridOption.columns\" [filter]=\"filter\"\r\n [externalFilter]=\"externalFilter\" (sdChange)=\"updateFilter()\" [inlineExternal]=\"inlineExternal\"\r\n [inlineColumn]=\"inlineColumn\" [filterOption]=\"gridOption.filter\">\r\n </sd-grid-desktop-inline-filter>\r\n </div>\r\n</ng-container>\r\n<div *ngIf=\"!isMobileOrTablet; else elseMobileOrTablet\" class=\"sd-box\"\r\n [ngClass]=\"{'box-shadow-none': gridOption.hideFooter}\">\r\n <ng-container *ngTemplateOutlet=\"gridViewContent\"></ng-container>\r\n <div [ngClass]=\"{'d-none': gridOption.hideFooter}\" class=\"sd-box-footer clearfix\">\r\n <div style=\"display: flex; align-items: center; align-content: space-between;\">\r\n <div style=\"flex: 1;\">\r\n <sd-button *ngIf=\"sdGridPopupFilter\" class=\"mr-6\" [title]=\"'Filter' | sdTranslate\" icon=\"filter_list\" size=\"sm\"\r\n (action)=\"onFilterPopup()\"></sd-button>\r\n <sd-button *ngIf=\"!gridOption?.hideReload\" class=\"mr-6\" [title]=\"'Reload' | sdTranslate\" icon=\"refresh\"\r\n size=\"sm\" (action)=\"reload()\"></sd-button>\r\n <sd-button *ngIf=\"gridOption.onImportExcel\" class=\"mr-6\" [title]=\"'Import' | sdTranslate\" icon=\"publish\"\r\n size=\"sm\" (action)=\"sdGridImportExcel.open()\"></sd-button>\r\n <ng-container *ngIf=\"sdGridPopupExportExcel\">\r\n <sd-button *ngIf=\"!gridOption.key\" class=\"mr-6\" [title]=\"'Export' | sdTranslate\" icon=\"get_app\" size=\"sm\"\r\n (action)=\"sdGridPopupExportExcel.exportDefault()\" [disabled]=\"!viewItems?.length\">\r\n </sd-button>\r\n <sd-button *ngIf=\"gridOption.key\" class=\"mr-6\" [title]=\"'Export' | sdTranslate\" icon=\"get_app\" size=\"sm\"\r\n [matMenuTriggerFor]=\"menu\" [disabled]=\"!viewItems?.length\">\r\n </sd-button>\r\n <mat-menu #menu=\"matMenu\">\r\n <button mat-menu-item (click)=\"sdGridPopupExportExcel.exportDefault()\" type=\"button\">\r\n <mat-icon>get_app</mat-icon>\r\n <span> {{'Export all columns' | sdTranslate}}</span>\r\n </button>\r\n <button mat-menu-item (click)=\"sdGridPopupExportExcel.open()\" type=\"button\">\r\n <mat-icon>settings</mat-icon>\r\n <span> {{'Configure' | sdTranslate}}</span>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <sd-button *ngIf=\"gridOption.export?.bigExport\" class=\"mr-6\" [title]=\"'Big export' | sdTranslate\" icon=\"get_app\"\r\n size=\"sm\" (action)=\"bigExport()\" [disabled]=\"!viewItems?.length\">\r\n </sd-button>\r\n <sd-button *ngIf=\"gridOption.key\" class=\"mr-6\" [title]=\"'Configure' | sdTranslate\" icon=\"settings\" size=\"sm\"\r\n (action)=\"sdGridConfig.open()\"></sd-button>\r\n </div>\r\n <div style=\"flex: 1;\">\r\n <mat-paginator [length]=\"total\" [pageSize]=\"gridOption.paginate?.pageSize\" hidePageSize>\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<ng-template #elseMobileOrTablet>\r\n <div class=\"sd-box c-mobile-box\">\r\n <div *ngIf=\"!gridOption?.mobileOrTablet?.useGridView\" class=\"sd-box-body c-mobile-body\"\r\n [ngClass]=\"{'c-loading': isLoading}\" #gridBody>\r\n <i [ngClass]=\"{'d-none': !isLoading}\" class=\"fa fa-4x fa-spinner fa-pulse c-loading-icon\"></i>\r\n <ng-container *ngFor=\"let item of viewItems\">\r\n <div class=\"c-mobile-item\" [ngClass]=\"{'c-mobile-item-selected':item.isChecked}\">\r\n <sd-grid-mobile-item-view [gridOption]=\"gridOption\" [item]=\"item\" (check)=\"onCheck(item)\">\r\n </sd-grid-mobile-item-view>\r\n <div class=\"p-2\" *ngIf=\"gridOption?.subInformation && item?.subInformation?.isOpened\">\r\n <sd-grid-sub-information [subItems]=\"item?.subInformation?.subItems\" [option]=\"gridOption?.subInformation\">\r\n </sd-grid-sub-information>\r\n </div>\r\n <div class=\"c-mobile-command\">\r\n <div>\r\n <i *ngIf=\"gridOption?.subInformation && item.subInformation?.isLoading\"\r\n class=\"fa fa-spinner fa-spin ml-1 c-mobile-action\" (click)=\"expandOrCollapse(item)\"></i>\r\n <i *ngIf=\"gridOption?.subInformation && !item.subInformation?.isLoading\" class=\"fa ml-1 c-mobile-action\"\r\n [ngClass]=\"{'fa-plus': !item.subInformation?.isOpened, 'fa-minus': item.subInformation?.isOpened}\"\r\n (click)=\"expandOrCollapse(item)\"></i>\r\n </div>\r\n <ng-container *ngIf=\"gridOption.commands | mobileCommandFilter:item | async; $implicit as filteredCommands\">\r\n <div *ngIf=\"filteredCommands.length\">\r\n <button [matMenuTriggerFor]=\"menu\" aria-hidden=\"true\" mat-icon-button type=\"button\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <!-- <i [matMenuTriggerFor]=\"menu\" class=\"fa fa-navicon fa-fw c-mobile-action\"></i> -->\r\n <mat-menu #menu=\"matMenu\">\r\n <button *ngFor=\"let command of filteredCommands\" mat-menu-item (click)=\"command.click(item)\"\r\n [disabled]=\"command.disabled | commandDisabled:item\" type=\"button\">\r\n <i *ngIf=\"!command.fontSet\" class=\"{{command.icon | commandIcon:item}}\"></i>\r\n <mat-icon *ngIf=\"command.fontSet\" [fontSet]=\"command.fontSet\">{{command.icon | commandIcon:item}}\r\n </mat-icon>\r\n <span> {{command.title | commandTitle:item}}</span>\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"gridOption?.mobileOrTablet?.useGridView\">\r\n <ng-container *ngTemplateOutlet=\"gridViewContent\"></ng-container>\r\n </ng-container>\r\n <div [ngClass]=\"{'d-none': gridOption.hideFooter}\" class=\"sd-box-footer clearfix\">\r\n <sd-button icon=\"more_horiz\" size=\"sm\" [matMenuTriggerFor]=\"mobileAction\"></sd-button>\r\n <mat-menu #mobileAction=\"matMenu\">\r\n <button *ngIf=\"sdGridPopupFilter\" mat-menu-item (click)=\"onFilterPopup()\" type=\"button\">\r\n <mat-icon>filter_list</mat-icon>\r\n <span> {{'Filter' | sdTranslate}}</span>\r\n </button>\r\n <button *ngIf=\"!gridOption?.hideReload\" mat-menu-item (click)=\"reload()\" type=\"button\">\r\n <mat-icon>refresh</mat-icon>\r\n <span> {{'Reload' | sdTranslate}}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.onImportExcel\" mat-menu-item (click)=\"sdGridImportExcel.open()\" type=\"button\">\r\n <mat-icon>publish</mat-icon>\r\n <span> {{'Import' | sdTranslate}}</span>\r\n </button>\r\n <button *ngIf=\"sdGridPopupExportExcel\" mat-menu-item (click)=\"sdGridPopupExportExcel.open()\" type=\"button\"\r\n [disabled]=\"!viewItems?.length\">\r\n <mat-icon>get_app</mat-icon>\r\n <span> {{'Export' | sdTranslate}}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.key\" mat-menu-item (click)=\"sdGridConfig.open()\" type=\"button\">\r\n <mat-icon>settings</mat-icon>\r\n <span> {{'Configure' | sdTranslate}}</span>\r\n </button>\r\n </mat-menu>\r\n <ng-container *ngIf=\"gridOption?.key && gridOption?.filter?.multiple !== false && !gridOption?.filter?.disabled\">\r\n <sd-button icon=\"filter_list\" size=\"sm\" [matMenuTriggerFor]=\"mobileQuickFilter\"></sd-button>\r\n <mat-menu #mobileQuickFilter=\"matMenu\">\r\n <button mat-menu-item *ngFor=\"let quickFilter of quickFilters\" (click)=\"onSelectQuickFilter(quickFilter.code)\"\r\n type=\"button\" style=\"display:flex; justify-content: space-between\">\r\n <span>{{quickFilter.code}}</span>\r\n <div>\r\n <mat-icon class=\"mr-1\" (click)=\"onEditQuickFilter($event, quickFilter)\">edit</mat-icon>\r\n <mat-icon class=\"mr-0\" (click)=\"onDeleteQuickFilter($event, quickFilter)\">delete</mat-icon>\r\n </div>\r\n </button>\r\n <button mat-menu-item (click)=\"onCreateQuickFilter($event)\" type=\"button\">\r\n <mat-icon class=\"mr-1\" fontSet=\"material-icons-outlined\">add</mat-icon>\r\n <span>{{'Create quick filter' | sdTranslate}}</span>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <div class=\"row mr-0 ml-0 text-right pull-right\">\r\n <mat-paginator [length]=\"total\" [pageSize]=\"gridOption.paginate?.pageSize\" hidePageSize>\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<!-- Modal Configure Grid -->\r\n<sd-grid-config (sdChange)=\"loadConfig($event)\" #sdGridConfig></sd-grid-config>\r\n<sd-grid-popup-editor (save)=\"onSave($event)\" #sdGridPopupEditor></sd-grid-popup-editor>\r\n<!-- Import Excel -->\r\n<sd-grid-import-excel *ngIf=\"gridOption?.onImportExcel\" [key]=\"gridOption?.key\" [columns]=\"gridOption?.columns\"\r\n [accept]=\"gridOption?.onImportExcel\" #sdGridImportExcel></sd-grid-import-excel>\r\n<sd-grid-popup-export-excel *ngIf=\"!gridOption.export?.disabled\" [key]=\"gridOption?.key\" [columns]=\"gridOption?.columns\"\r\n [extendColumns]=\"gridOption?.export?.columns\" [fileName]=\"gridOption?.export?.fileName\"\r\n [exportOption]=\"gridOption?.export\" [validator]=\"gridOption?.export?.validator\"\r\n (exportByTemplate)=\"onExportByTemplate($event)\" #sdGridPopupExportExcel>\r\n</sd-grid-popup-export-excel>\r\n<sd-grid-popup-filter\r\n *ngIf=\"!gridOption?.filter?.disabled && (isMobileOrTablet || gridOption?.filter?.type === 'popup')\"\r\n [key]=\"gridOption?.key\" (accept)=\"updateFilter($event)\" [filterOption]=\"gridOption?.filter\" (clear)=\"onClearFilter()\"\r\n (loadInlineFilter)=\"onFilterConfigurationLoaded($event)\" #sdGridPopupFilter>\r\n</sd-grid-popup-filter>\r\n\r\n<ng-template #gridViewContent>\r\n <div class=\"sd-box-body p-0\">\r\n <div class=\"row mx-0\">\r\n <div [ngClass]=\"{'c-loading': isLoading}\" class=\"table-responsive\" #gridBody style=\"position: relative;\">\r\n <i [ngClass]=\"{'d-none': !isLoading}\" class=\"fa fa-5x fa-spinner fa-pulse c-loading-icon\"></i>\r\n <table *ngIf=\"gridOption\" class=\"table c-table\"\r\n [ngClass]=\"{'c-loading-margin': isLoading, 'c-bordered': configuration?.style?.bordered, 'c-stripped': configuration?.style?.bordered}\"\r\n style=\"border:0!important;\">\r\n <thead class=\"thead-light\">\r\n <tr>\r\n <th class=\"position-sticky c-sticky-all align-middle p-0\" style=\"width:4px; min-width: 4px;\" #fixedHeader>\r\n </th>\r\n <th *ngIf=\"configuration?.style?.bordered\" class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\"\r\n #fixedHeader></th>\r\n <th *ngIf=\"gridOption?.subInformation\" class=\"position-sticky c-sticky-all align-middle text-center p-0\"\r\n style=\"width:30px;min-width: 30px;line-height: 3rem\" #fixedHeader>\r\n </th>\r\n <th *ngIf=\"gridOption?.subInformation && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n <th *ngIf=\"gridOption?.checkable && viewItems?.length\"\r\n class=\"position-sticky c-sticky-all align-middle text-center p-0 w-20\" style=\"width:20px;\" #fixedHeader>\r\n <mat-checkbox [color]=\"'primary'\" [(ngModel)]=\"isCheckedAll\"\r\n (change)=\"checkAll(isCheckedAll)\"></mat-checkbox>\r\n </th>\r\n <th *ngIf=\"gridOption?.checkable && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n <th *ngIf=\"gridOption?.commands?.length && viewItems?.length\"\r\n class=\"position-sticky align-middle text-center p-0 c-sticky-all c-w-1\" #fixedHeader>\r\n </th>\r\n <th *ngIf=\"gridOption.commands?.length && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n <th *ngIf=\"gridOption.editor?.addable || gridOption.editor?.editable\"\r\n class=\"position-sticky c-sticky-all align-middle text-center p-0\"\r\n style=\"width:60px;min-width:60px;max-width:60px;line-height: 1.5\" #fixedHeader>\r\n <div *ngIf=\"gridOption.editor.addable\" class=\"align-middle text-center\">\r\n <button *ngIf=\"!gridOption.editor.limit || (gridOption.editor.limit > items.length)\" type=\"button\"\r\n (click)=\"onCreate()\" aria-label=\"Add\" mat-icon-button type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n </div>\r\n </th>\r\n <th *ngIf=\"gridOption.editor && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n <th *ngIf=\"gridOption?.numberable\" class=\"position-sticky c-sticky-all align-middle text-center p-0\"\r\n style=\"width:20px;\" #fixedHeader>\r\n #\r\n </th>\r\n <th *ngIf=\"gridOption?.numberable && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n <ng-container *ngFor=\"let column of fixedColumns\">\r\n <th class=\"position-sticky align-middle cursor-pointer c-cell c-sticky-all\" #fixedHeader\r\n [ngStyle]=\"{'width':column.width ? column.width : '','max-width': column.width ? column.width : '','min-width': !column.width || column.width === 'auto' ? '200px' : column.width}\">\r\n <span [title]=\"column.title\" class=\"c-header-title\" (click)=\"sort(column)\">\r\n {{column.title}}\r\n <i *ngIf=\"column.type !== 'children' && column.type !== 'image' && gridOption.sortable !== false && column.sortable !== false && orderBy !== column.field\"\r\n class=\"fa fa-sort fa-fw\"></i>\r\n <i *ngIf=\"orderBy === column.field && orderDirection == 'ASC'\" class=\"fa fa-sort-asc fa-fw\"></i>\r\n <i *ngIf=\"orderBy === column.field && orderDirection == 'DESC'\" class=\"fa fa-sort-desc fa-fw\"></i>\r\n </span>\r\n <ng-container\r\n *ngIf=\"!gridOption?.filter?.disabled && gridOption?.filter?.columnInline !== 'outside' && !column?.filter?.disabled && (inlineColumn[column.field] || gridOption?.filter?.type === 'inline')\">\r\n <sd-input size=\"sm\"\r\n *ngIf=\"column.type === 'string' || column.type === 'number' || column.type === 'children'\"\r\n [(model)]=\"filter[column.field]\" (keyupEnter)=\"updateFilter()\">\r\n </sd-input>\r\n <sd-select *ngIf=\"column.type === 'bool'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\"\r\n [items]=\"[{value: 1, display: column.trueValue || 'TRUE'}, {value: 0, display: column.falseValue || 'FALSE'}]\"\r\n valueField=\"value\" displayField=\"display\">\r\n </sd-select>\r\n <sd-select *ngIf=\"column.type === 'values'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\" [items]=\"column.values\" valueField=\"value\" displayField=\"text\"\r\n [filtered]=\"column?.editor?.autocomplete\">\r\n </sd-select>\r\n <sd-select *ngIf=\"column.type === 'radio'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\" [items]=\"column.values\" [valueField]=\"column.valueField\"\r\n [displayField]=\"column.displayField\">\r\n </sd-select>\r\n <sd-date-time size=\"sm\"\r\n *ngIf=\"column.type === 'date' || column.type === 'datetime' || column.type === 'time'\"\r\n [(model)]=\"filter[column.field]\" (sdChange)=\"updateFilter()\" type=\"date\">\r\n </sd-date-time>\r\n </ng-container>\r\n </th>\r\n <th *ngIf=\"configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n </ng-container>\r\n <th *ngFor=\"let column of normalColumns\"\r\n class=\"position-sticky align-middle cursor-pointer border-top-0 border-bottom-0 c-cell c-sticky-top c-normal-column\"\r\n [ngStyle]=\"{'width':column.width ? column.width : '','max-width': column.width ? column.width : '','min-width': !column.width || column.width === 'auto' ? '200px' : column.width}\">\r\n <span [title]=\"column.title\" class=\"c-header-title\" (click)=\"sort(column)\">\r\n {{column.title}}\r\n <i *ngIf=\"column.type !== 'children' && gridOption.sortable !== false && column.sortable !== false && orderBy !== column.field\"\r\n class=\"fa fa-sort fa-fw\"></i>\r\n <i *ngIf=\"orderBy == column.field && orderDirection == 'ASC'\" class=\"fa fa-sort-asc fa-fw\"></i>\r\n <i *ngIf=\"orderBy == column.field && orderDirection == 'DESC'\" class=\"fa fa-sort-desc fa-fw\"></i>\r\n </span>\r\n <ng-container\r\n *ngIf=\"!gridOption?.filter?.disabled && gridOption?.filter?.columnInline !== 'outside' && !column?.filter?.disabled && (inlineColumn[column.field] || gridOption?.filter?.type === 'inline')\">\r\n <sd-input size=\"sm\"\r\n *ngIf=\"column.type === 'string' || column.type === 'number' || column.type === 'children'\"\r\n [(model)]=\"filter[column.field]\" (keyupEnter)=\"updateFilter()\">\r\n </sd-input>\r\n <sd-select *ngIf=\"column.type === 'bool'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\"\r\n [items]=\"[{value: 1, display: column.trueValue || 'TRUE'}, {value: 0, display: column.falseValue || 'FALSE'}]\"\r\n valueField=\"value\" displayField=\"display\">\r\n </sd-select>\r\n <sd-select *ngIf=\"column.type === 'values'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\" [items]=\"column.values\" valueField=\"value\" displayField=\"text\"\r\n [filtered]=\"column?.editor?.autocomplete\">\r\n </sd-select>\r\n <sd-select *ngIf=\"column.type === 'radio'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\" [items]=\"column.values\" [valueField]=\"column.valueField\"\r\n [displayField]=\"column.displayField\">\r\n </sd-select>\r\n <sd-date-time size=\"sm\"\r\n *ngIf=\"column.type === 'date' || column.type === 'datetime' || column.type === 'time'\"\r\n [(model)]=\"filter[column.field]\" (sdChange)=\"updateFilter()\" type=\"date\">\r\n </sd-date-time>\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let item of viewItems; index as idx; trackBy: trackById\">\r\n <tr>\r\n <td class=\"position-sticky c-sticky-left p-0\"\r\n [ngClass]=\"{'c-error': ((gridOption.editor?.type === 'inline' || item.editingStatus) && item.editorHandler?.errorMessage), \r\n 'c-selected': !((gridOption.editor?.type === 'inline' || item.editingStatus) && item.editorHandler?.errorMessage) && selectedItem === item}\"\r\n style=\"width:4px;min-width: 4px;left:0\" matTooltipPosition=\"after\"\r\n [matTooltip]=\"item.editingStatus ? item.editorHandler?.errorMessage:''\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.subInformation\" class=\"position-sticky text-center align-middle p-0 c-sticky-left\"\r\n style=\"width:30px;min-width: 30px;line-height: 3rem\" #fixedBody>\r\n <button *ngIf=\"!item.editingStatus\" (click)=\"expandOrCollapse(item)\" type=\"button\" class=\"c-btn-icon\">\r\n <i *ngIf=\"item.subInformation?.isLoading\" class=\"fa fa-spinner fa-spin\"></i>\r\n <i *ngIf=\"!item.subInformation?.isLoading\" class=\"fa\"\r\n [ngClass]=\"{'fa-caret-right': !item.subInformation?.isOpened, 'fa-caret-down': item.subInformation?.isOpened}\"></i>\r\n </button>\r\n </td>\r\n <td *ngIf=\"gridOption.subInformation && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.checkable && viewItems?.length\"\r\n class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n <div *ngIf=\"!item.editingStatus\" class=\"align-middle text-center w-20\" style=\"width:20px;\">\r\n <mat-checkbox [color]=\"'primary'\" [(ngModel)]=\"item.isChecked\"\r\n (change)=\"onCheck(item, true)\"></mat-checkbox>\r\n </div>\r\n </td>\r\n <td *ngIf=\"gridOption.checkable && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.commands?.length && viewItems?.length\"\r\n class=\"position-sticky align-middle px-2 py-0 c-sticky-left c-w-1\" #fixedBody>\r\n <div *ngIf=\"!item.editingStatus\" class=\"d-flex align-middle text-center justify-content-center\">\r\n <ng-container\r\n *ngIf=\"gridOption.commands | commandFilter:item | async; $implicit as filteredCommands\">\r\n <section *ngFor=\"let command of filteredCommands\">\r\n <ng-container *ngIf=\"!command.children?.length; else elseCommandChildren\">\r\n <button *ngIf=\"!command.fontSet\" (click)=\"command.click(item)\" type=\"button\"\r\n class=\"c-btn-icon\" [matTooltip]=\"command.title | commandTitle:item\"\r\n [disabled]=\"command.disabled | commandDisabled:item\">\r\n <i class=\"{{command.icon | commandIcon:item}}\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button *ngIf=\"command.fontSet\" [matTooltip]=\"command.title | commandTitle:item\"\r\n [disabled]=\"command.disabled | commandDisabled:item\" (click)=\"command.click(item)\"\r\n type=\"button\" aria-hidden=\"true\" mat-icon-button>\r\n <mat-icon [fontSet]=\"command.fontSet\">{{command.icon | commandIcon:item}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <ng-template #elseCommandChildren>\r\n <button *ngIf=\"command.icon\" [matMenuTriggerFor]=\"menu\" type=\"button\" class=\"c-btn-icon\"\r\n [matTooltip]=\"command.title\" [disabled]=\"command.disabled | commandDisabled:item\">\r\n <i class=\"{{command.icon | commandIcon:item}}\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button *ngIf=\"!command.icon\" mat-icon-button [matMenuTriggerFor]=\"menu\" type=\"button\"\r\n class=\"c-btn-icon-30\" [matTooltip]=\"command.title\"\r\n [disabled]=\"command.disabled | commandDisabled:item\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <ng-container *ngFor=\"let childCommand of command.children\">\r\n <button *ngIf=\"!(item | commandHidden:childCommand | async)\" type=\"button\" mat-menu-item\r\n [disabled]=\"childCommand.disabled | commandDisabled:item\"\r\n (click)=\"childCommand.click(item)\">\r\n <i *ngIf=\"!childCommand.fontSet\" class=\"{{childCommand.icon | commandIcon:item}}\"></i>\r\n <mat-icon *ngIf=\"childCommand.fontSet\" [fontSet]=\"childCommand.fontSet\">\r\n {{childCommand.icon | commandIcon:item}}</mat-icon>\r\n <span> {{childCommand.title | commandTitle:item}}</span>\r\n </button>\r\n </ng-container>\r\n </mat-menu>\r\n </ng-template>\r\n </section>\r\n </ng-container>\r\n </div>\r\n </td>\r\n <td *ngIf=\"gridOption.commands?.length && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.editor?.addable || gridOption.editor?.editable\"\r\n class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n <div class=\"align-middle text-center\"\r\n style=\"width:60px;min-width:60px;max-width:60px;line-height: 1.5\">\r\n <button\r\n *ngIf=\"!item.editingStatus && gridOption.editor?.type !== 'inline' && gridOption.editor?.editable\"\r\n [disabled]=\"item.editorHandler?.disabled\" (click)=\"onUpdate(item, true)\" aria-label=\"Edit\"\r\n type=\"button\" mat-icon-button>\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button *ngIf=\"item.editingStatus && gridOption.editor?.type !== 'inline'\"\r\n [disabled]=\"item.editorHandler?.errorMessage || item.editorHandler?.saving\" (click)=\"onSave(item)\"\r\n type=\"button\" aria-label=\"Save\" mat-icon-button>\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button *ngIf=\"item.editingStatus || gridOption.editor?.type === 'inline'\" (click)=\"onCancel(item)\"\r\n aria-label=\"Cancel\" mat-icon-button\r\n [disabled]=\"gridOption.editor?.type === 'inline' && item.editorHandler?.disabled\" type=\"button\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </div>\r\n </td>\r\n <td *ngIf=\"gridOption.editor && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.numberable\" class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n <div *ngIf=\"!item.editingStatus\" class=\"align-middle text-center\" style=\"width:20px;\">\r\n <!-- {{gridOption.paginate?.pageSize * (currentPage - 1) + idx + 1}} -->\r\n {{idx + 1}}\r\n </div>\r\n </td>\r\n <td *ngIf=\"gridOption.numberable && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <ng-template ngFor let-column [ngForOf]=\"fixedColumns\">\r\n <td class=\"position-sticky align-middle c-cell c-sticky-left\"\r\n [ngClass]=\"{'text-center': column.type !== 'string' && column.type !== 'number' && column.type !== 'children', 'text-right': column.type === 'number'}\"\r\n [ngStyle]=\"{'width':column.width ? column.width : '','min-width': !column.width || column.width === 'auto' ? '200px' : column.width}\"\r\n (click)=\"rowHandler.click(item)\" #fixedBody>\r\n <ng-container *ngIf=\"column.type !== 'children';else elseColumnChildren\">\r\n <ng-container *ngIf=\"item[column.field] | editorHandler:item:gridOption\">\r\n <div\r\n *ngIf=\"item.editorHandler[column.field].visible && gridOption.editor?.validate && !(item[column.field] | editorValidate:item:gridOption.editor.validate | async)\">\r\n </div>\r\n <ng-container *ngIf=\"item.editorHandler[column.field].visible;else columnView\">\r\n <div style=\"width: 100%\">\r\n <ng-container *ngIf=\"cellEditorDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellEditorDef[column.field].templateRef;context:{item: item, idx: idx, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n <sd-grid-desktop-column-edit *ngIf=\"!cellEditorDef[column.field]\" [column]=\"column\"\r\n [item]=\"item\" (sdChange)=\"onEditorChange()\">\r\n </sd-grid-desktop-column-edit>\r\n </div>\r\n </ng-container>\r\n <ng-template #columnView>\r\n <div class=\"align-middle\" (dblclick)=\"rowHandler.dblClick(item)\">\r\n <ng-container *ngIf=\"cellDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellDef[column.field].templateRef;context:{item: item, idx: idx, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n <sd-grid-desktop-column-view *ngIf=\"!cellDef[column.field]\" [column]=\"column\" [item]=\"item\">\r\n </sd-grid-desktop-column-view>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseColumnChildren>\r\n <sd-grid-desktop-column-children-view [column]=\"column\" [item]=\"item\">\r\n </sd-grid-desktop-column-children-view>\r\n </ng-template>\r\n </td>\r\n <td *ngIf=\"configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n </ng-template>\r\n <td *ngFor=\"let column of normalColumns\" class=\"align-middle c-cell c-normal-column\"\r\n (click)=\"rowHandler.click(item)\"\r\n [ngClass]=\"{'text-center': column.type !== 'string' && column.type !== 'number' && column.type !== 'children', 'text-right': column.type === 'number'}\"\r\n (dblclick)=\"rowHandler.dblClick(item)\"\r\n [ngStyle]=\"{'width':column.width ? column.width : '', 'min-width': !column.width || column.width === 'auto' ? '200px' : column.width}\">\r\n <ng-container *ngIf=\"column.type !== 'children';else elseColumnChildren\">\r\n <ng-container *ngIf=\"item[column.field] | editorHandler:item:gridOption\">\r\n <div\r\n *ngIf=\"item.editorHandler[column.field].visible && gridOption.editor?.validate && !(item[column.field] | editorValidate:item:gridOption.editor.validate | async)\">\r\n </div>\r\n <ng-container *ngIf=\"item.editorHandler[column.field].visible;else columnView\">\r\n <div style=\"width: 100%\">\r\n <ng-container *ngIf=\"cellEditorDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellEditorDef[column.field].templateRef;context:{item: item, idx: idx, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n <sd-grid-desktop-column-edit *ngIf=\"!cellEditorDef[column.field]\" [column]=\"column\"\r\n [item]=\"item\" (sdChange)=\"onEditorChange()\">\r\n </sd-grid-desktop-column-edit>\r\n </div>\r\n </ng-container>\r\n <ng-template #columnView>\r\n <div class=\"align-middle\" (dblclick)=\"rowHandler.dblClick(item)\">\r\n <ng-container *ngIf=\"cellDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellDef[column.field].templateRef;context:{item: item, idx: idx, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n <sd-grid-desktop-column-view *ngIf=\"!cellDef[column.field]\" [column]=\"column\" [item]=\"item\">\r\n </sd-grid-desktop-column-view>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseColumnChildren>\r\n <sd-grid-desktop-column-children-view [column]=\"column\" [item]=\"item\">\r\n </sd-grid-desktop-column-children-view>\r\n </ng-template>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"gridOption?.subInformation && item?.subInformation?.isOpened\" class=\"c-no-hover\">\r\n <td class=\"p-10\" colspan=\"100\">\r\n <sd-grid-sub-information [subItems]=\"item?.subInformation?.subItems\"\r\n [option]=\"gridOption?.subInformation\">\r\n </sd-grid-sub-information>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <ng-container *ngIf=\"viewItems?.length\">\r\n <ng-container *ngFor=\"let footerIndex of footerRows\">\r\n <tr>\r\n <td class=\"position-sticky c-sticky-left p-0\" style=\"width:4px;min-width: 4px;left:0\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.subInformation\"\r\n class=\"position-sticky text-center align-middle p-0 c-sticky-left\"\r\n style=\"width:30px;min-width: 30px;line-height: 3rem\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"gridOption.subInformation && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.checkable && viewItems?.length\"\r\n class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"gridOption.checkable && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.commands?.length && viewItems?.length\"\r\n class=\"position-sticky align-middle px-2 py-0 c-sticky-left c-w-1\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"gridOption.commands?.length && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.editor?.addable || gridOption.editor?.editable\"\r\n class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"gridOption.editor && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.numberable\" class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"gridOption.numberable && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <ng-template ngFor let-column [ngForOf]=\"fixedColumns\">\r\n <td class=\"position-sticky align-middle p-0 c-sticky-left\" #fixedBody>\r\n <ng-container *ngIf=\"cellFooterDef[column.field] && cellFooterDef[column.field][footerIndex]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellFooterDef[column.field][footerIndex].templateRef;context:{items: viewItems, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n <td *ngIf=\"configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n </ng-template>\r\n <td *ngFor=\"let column of normalColumns\" class=\"align-middle p-0 c-normal-column\">\r\n <ng-container *ngIf=\"cellFooterDef[column.field] && cellFooterDef[column.field][footerIndex]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellFooterDef[column.field][footerIndex].templateRef;context:{items: viewItems, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n <tr *ngIf=\"!viewItems?.length && !isLoading\">\r\n <td class=\"c-empty\" colspan=\"100\">\r\n <mat-icon>cloud_off</mat-icon>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>",
1152
+ template: "<div class=\"clearfix\"></div>\r\n<ng-container *ngIf=\"!isMobileOrTablet && !gridOption?.filter?.disabled\">\r\n <div class=\"row mx-0 mt-5\">\r\n <div\r\n *ngIf=\"gridOption?.key && gridOption?.filter?.multiple !== false && (!gridOption?.filter?.quickFilterVisibility || gridOption?.filter?.quickFilterVisibility === 'inline')\"\r\n class=\"col-lg-2 col-md-3 col-sm-6 px-4\">\r\n <mat-form-field class=\"sd-md\" appearance=\"outline\" style=\"width: 100%;\">\r\n <mat-label>{{'Quick filters' | sdTranslate}}</mat-label>\r\n <mat-select [(ngModel)]=\"selectedQuickFilter\" (selectionChange)=\"onSelectQuickFilter($event?.value)\" #matSelect>\r\n <mat-option value=\"\">{{'Please select' | sdTranslate}}</mat-option>\r\n <mat-option *ngFor=\"let quickFilter of quickFilters\" [value]=\"quickFilter.code\">\r\n <div style=\"display:flex; justify-content: space-between\">\r\n <span>{{quickFilter.code}}</span>\r\n <div>\r\n <mat-icon class=\"mr-1 c-fa-icon\" (click)=\"onEditQuickFilter($event, quickFilter)\" fontSet=\"fa\"\r\n fontIcon=\"fa-pencil\"></mat-icon>\r\n <mat-icon class=\"mr-0 c-fa-icon\" (click)=\"onDeleteQuickFilter($event, quickFilter)\" fontSet=\"fa\"\r\n fontIcon=\"fa-trash-o\"></mat-icon>\r\n </div>\r\n </div>\r\n </mat-option>\r\n <mat-option>\r\n <div (click)=\"onCreateQuickFilter($event)\">\r\n <mat-icon class=\"mr-1\" fontSet=\"material-icons-outlined\">add</mat-icon>\r\n <span>{{'Create quick filter' | sdTranslate}}</span>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <sd-grid-desktop-inline-filter class=\"c-display-contents\" [columns]=\"gridOption.columns\" [filter]=\"filter\"\r\n [externalFilter]=\"externalFilter\" (sdChange)=\"updateFilter()\" [inlineExternal]=\"inlineExternal\"\r\n [inlineColumn]=\"inlineColumn\" [filterOption]=\"gridOption.filter\">\r\n </sd-grid-desktop-inline-filter>\r\n </div>\r\n</ng-container>\r\n<div *ngIf=\"!isMobileOrTablet; else elseMobileOrTablet\" class=\"sd-box\"\r\n [ngClass]=\"{'box-shadow-none': gridOption.hideFooter}\">\r\n <ng-container *ngTemplateOutlet=\"gridViewContent\"></ng-container>\r\n <div [ngClass]=\"{'d-none': gridOption.hideFooter}\" class=\"sd-box-footer clearfix\">\r\n <div style=\"display: flex; align-items: center; align-content: space-between;\">\r\n <div style=\"flex: 1;\">\r\n <sd-button *ngIf=\"sdGridPopupFilter\" class=\"mr-6\" [title]=\"'Filter' | sdTranslate\" icon=\"filter_list\" size=\"sm\"\r\n (action)=\"onFilterPopup()\"></sd-button>\r\n <sd-button *ngIf=\"!gridOption?.hideReload\" class=\"mr-6\" [title]=\"'Reload' | sdTranslate\" icon=\"refresh\"\r\n size=\"sm\" (action)=\"reload()\"></sd-button>\r\n <sd-button *ngIf=\"gridOption.onImportExcel\" class=\"mr-6\" [title]=\"'Import' | sdTranslate\" icon=\"publish\"\r\n size=\"sm\" (action)=\"sdGridImportExcel.open()\"></sd-button>\r\n <ng-container *ngIf=\"sdGridPopupExportExcel\">\r\n <sd-button *ngIf=\"!gridOption.key\" class=\"mr-6\" [title]=\"'Export' | sdTranslate\" icon=\"get_app\" size=\"sm\"\r\n (action)=\"sdGridPopupExportExcel.exportDefault()\" [disabled]=\"!viewItems?.length\">\r\n </sd-button>\r\n <sd-button *ngIf=\"gridOption.key\" class=\"mr-6\" [title]=\"'Export' | sdTranslate\" icon=\"get_app\" size=\"sm\"\r\n [matMenuTriggerFor]=\"menu\" [disabled]=\"!viewItems?.length\">\r\n </sd-button>\r\n <mat-menu #menu=\"matMenu\">\r\n <button mat-menu-item (click)=\"sdGridPopupExportExcel.exportDefault()\" type=\"button\">\r\n <mat-icon>get_app</mat-icon>\r\n <span> {{'Export all columns' | sdTranslate}}</span>\r\n </button>\r\n <button mat-menu-item (click)=\"sdGridPopupExportExcel.open()\" type=\"button\">\r\n <mat-icon>settings</mat-icon>\r\n <span> {{'Configure' | sdTranslate}}</span>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <sd-button *ngIf=\"gridOption.key\" class=\"mr-6\" [title]=\"'Configure' | sdTranslate\" icon=\"settings\" size=\"sm\"\r\n (action)=\"sdGridConfig.open()\"></sd-button>\r\n </div>\r\n <div style=\"flex: 1;\">\r\n <mat-paginator [length]=\"total\" [pageSize]=\"gridOption.paginate?.pageSize\" hidePageSize>\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<ng-template #elseMobileOrTablet>\r\n <div class=\"sd-box c-mobile-box\">\r\n <div *ngIf=\"!gridOption?.mobileOrTablet?.useGridView\" class=\"sd-box-body c-mobile-body\"\r\n [ngClass]=\"{'c-loading': isLoading}\" #gridBody>\r\n <i [ngClass]=\"{'d-none': !isLoading}\" class=\"fa fa-4x fa-spinner fa-pulse c-loading-icon\"></i>\r\n <ng-container *ngFor=\"let item of viewItems\">\r\n <div class=\"c-mobile-item\" [ngClass]=\"{'c-mobile-item-selected':item.isChecked}\">\r\n <sd-grid-mobile-item-view [gridOption]=\"gridOption\" [item]=\"item\" (check)=\"onCheck(item)\">\r\n </sd-grid-mobile-item-view>\r\n <div class=\"p-2\" *ngIf=\"gridOption?.subInformation && item?.subInformation?.isOpened\">\r\n <sd-grid-sub-information [subItems]=\"item?.subInformation?.subItems\" [option]=\"gridOption?.subInformation\">\r\n </sd-grid-sub-information>\r\n </div>\r\n <div class=\"c-mobile-command\">\r\n <div>\r\n <i *ngIf=\"gridOption?.subInformation && item.subInformation?.isLoading\"\r\n class=\"fa fa-spinner fa-spin ml-1 c-mobile-action\" (click)=\"expandOrCollapse(item)\"></i>\r\n <i *ngIf=\"gridOption?.subInformation && !item.subInformation?.isLoading\" class=\"fa ml-1 c-mobile-action\"\r\n [ngClass]=\"{'fa-plus': !item.subInformation?.isOpened, 'fa-minus': item.subInformation?.isOpened}\"\r\n (click)=\"expandOrCollapse(item)\"></i>\r\n </div>\r\n <ng-container *ngIf=\"gridOption.commands | mobileCommandFilter:item | async; $implicit as filteredCommands\">\r\n <div *ngIf=\"filteredCommands.length\">\r\n <button [matMenuTriggerFor]=\"menu\" aria-hidden=\"true\" mat-icon-button type=\"button\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <!-- <i [matMenuTriggerFor]=\"menu\" class=\"fa fa-navicon fa-fw c-mobile-action\"></i> -->\r\n <mat-menu #menu=\"matMenu\">\r\n <button *ngFor=\"let command of filteredCommands\" mat-menu-item (click)=\"command.click(item)\"\r\n [disabled]=\"command.disabled | commandDisabled:item\" type=\"button\">\r\n <i *ngIf=\"!command.fontSet\" class=\"{{command.icon | commandIcon:item}}\"></i>\r\n <mat-icon *ngIf=\"command.fontSet\" [fontSet]=\"command.fontSet\">{{command.icon | commandIcon:item}}\r\n </mat-icon>\r\n <span> {{command.title | commandTitle:item}}</span>\r\n </button>\r\n </mat-menu>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"gridOption?.mobileOrTablet?.useGridView\">\r\n <ng-container *ngTemplateOutlet=\"gridViewContent\"></ng-container>\r\n </ng-container>\r\n <div [ngClass]=\"{'d-none': gridOption.hideFooter}\" class=\"sd-box-footer clearfix\">\r\n <sd-button icon=\"more_horiz\" size=\"sm\" [matMenuTriggerFor]=\"mobileAction\"></sd-button>\r\n <mat-menu #mobileAction=\"matMenu\">\r\n <button *ngIf=\"sdGridPopupFilter\" mat-menu-item (click)=\"onFilterPopup()\" type=\"button\">\r\n <mat-icon>filter_list</mat-icon>\r\n <span> {{'Filter' | sdTranslate}}</span>\r\n </button>\r\n <button *ngIf=\"!gridOption?.hideReload\" mat-menu-item (click)=\"reload()\" type=\"button\">\r\n <mat-icon>refresh</mat-icon>\r\n <span> {{'Reload' | sdTranslate}}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.onImportExcel\" mat-menu-item (click)=\"sdGridImportExcel.open()\" type=\"button\">\r\n <mat-icon>publish</mat-icon>\r\n <span> {{'Import' | sdTranslate}}</span>\r\n </button>\r\n <button *ngIf=\"sdGridPopupExportExcel\" mat-menu-item (click)=\"sdGridPopupExportExcel.open()\" type=\"button\"\r\n [disabled]=\"!viewItems?.length\">\r\n <mat-icon>get_app</mat-icon>\r\n <span> {{'Export' | sdTranslate}}</span>\r\n </button>\r\n <button *ngIf=\"gridOption.key\" mat-menu-item (click)=\"sdGridConfig.open()\" type=\"button\">\r\n <mat-icon>settings</mat-icon>\r\n <span> {{'Configure' | sdTranslate}}</span>\r\n </button>\r\n </mat-menu>\r\n <ng-container *ngIf=\"gridOption?.key && gridOption?.filter?.multiple !== false && !gridOption?.filter?.disabled\">\r\n <sd-button icon=\"filter_list\" size=\"sm\" [matMenuTriggerFor]=\"mobileQuickFilter\"></sd-button>\r\n <mat-menu #mobileQuickFilter=\"matMenu\">\r\n <button mat-menu-item *ngFor=\"let quickFilter of quickFilters\" (click)=\"onSelectQuickFilter(quickFilter.code)\"\r\n type=\"button\" style=\"display:flex; justify-content: space-between\">\r\n <span>{{quickFilter.code}}</span>\r\n <div>\r\n <mat-icon class=\"mr-1\" (click)=\"onEditQuickFilter($event, quickFilter)\">edit</mat-icon>\r\n <mat-icon class=\"mr-0\" (click)=\"onDeleteQuickFilter($event, quickFilter)\">delete</mat-icon>\r\n </div>\r\n </button>\r\n <button mat-menu-item (click)=\"onCreateQuickFilter($event)\" type=\"button\">\r\n <mat-icon class=\"mr-1\" fontSet=\"material-icons-outlined\">add</mat-icon>\r\n <span>{{'Create quick filter' | sdTranslate}}</span>\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n <div class=\"row mr-0 ml-0 text-right pull-right\">\r\n <mat-paginator [length]=\"total\" [pageSize]=\"gridOption.paginate?.pageSize\" hidePageSize>\r\n </mat-paginator>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<!-- Modal Configure Grid -->\r\n<sd-grid-config (sdChange)=\"loadConfig($event)\" #sdGridConfig></sd-grid-config>\r\n<sd-grid-popup-editor (save)=\"onSave($event)\" #sdGridPopupEditor></sd-grid-popup-editor>\r\n<!-- Import Excel -->\r\n<sd-grid-import-excel *ngIf=\"gridOption?.onImportExcel\" [key]=\"gridOption?.key\" [columns]=\"gridOption?.columns\"\r\n [accept]=\"gridOption?.onImportExcel\" #sdGridImportExcel></sd-grid-import-excel>\r\n<sd-grid-popup-export-excel *ngIf=\"!gridOption.export?.disabled\" [key]=\"gridOption?.key\" [columns]=\"gridOption?.columns\"\r\n [extendColumns]=\"gridOption?.export?.columns\" [fileName]=\"gridOption?.export?.fileName\"\r\n [exportOption]=\"gridOption?.export\" [validator]=\"gridOption?.export?.validator\"\r\n (exportByTemplate)=\"onExportByTemplate($event)\" #sdGridPopupExportExcel>\r\n</sd-grid-popup-export-excel>\r\n<sd-grid-popup-filter\r\n *ngIf=\"!gridOption?.filter?.disabled && (isMobileOrTablet || gridOption?.filter?.type === 'popup')\"\r\n [key]=\"gridOption?.key\" (accept)=\"updateFilter($event)\" [filterOption]=\"gridOption?.filter\" (clear)=\"onClearFilter()\"\r\n (loadInlineFilter)=\"onFilterConfigurationLoaded($event)\" #sdGridPopupFilter>\r\n</sd-grid-popup-filter>\r\n\r\n<ng-template #gridViewContent>\r\n <div class=\"sd-box-body p-0\">\r\n <div class=\"row mx-0\">\r\n <div [ngClass]=\"{'c-loading': isLoading}\" class=\"table-responsive\" #gridBody style=\"position: relative;\">\r\n <i [ngClass]=\"{'d-none': !isLoading}\" class=\"fa fa-5x fa-spinner fa-pulse c-loading-icon\"></i>\r\n <table *ngIf=\"gridOption\" class=\"table c-table\"\r\n [ngClass]=\"{'c-loading-margin': isLoading, 'c-bordered': configuration?.style?.bordered, 'c-stripped': configuration?.style?.bordered}\"\r\n style=\"border:0!important;\">\r\n <thead class=\"thead-light\">\r\n <tr>\r\n <th class=\"position-sticky c-sticky-all align-middle p-0\" style=\"width:4px; min-width: 4px;\" #fixedHeader>\r\n </th>\r\n <th *ngIf=\"configuration?.style?.bordered\" class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\"\r\n #fixedHeader></th>\r\n <th *ngIf=\"gridOption?.subInformation\" class=\"position-sticky c-sticky-all align-middle text-center p-0\"\r\n style=\"width:30px;min-width: 30px;line-height: 3rem\" #fixedHeader>\r\n </th>\r\n <th *ngIf=\"gridOption?.subInformation && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n <th *ngIf=\"gridOption?.checkable && viewItems?.length\"\r\n class=\"position-sticky c-sticky-all align-middle text-center p-0 w-20\" style=\"width:20px;\" #fixedHeader>\r\n <mat-checkbox [color]=\"'primary'\" [(ngModel)]=\"isCheckedAll\"\r\n (change)=\"checkAll(isCheckedAll)\"></mat-checkbox>\r\n </th>\r\n <th *ngIf=\"gridOption?.checkable && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n <th *ngIf=\"gridOption?.commands?.length && viewItems?.length\"\r\n class=\"position-sticky align-middle text-center p-0 c-sticky-all c-w-1\" #fixedHeader>\r\n </th>\r\n <th *ngIf=\"gridOption.commands?.length && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n <th *ngIf=\"gridOption.editor?.addable || gridOption.editor?.editable\"\r\n class=\"position-sticky c-sticky-all align-middle text-center p-0\"\r\n style=\"width:60px;min-width:60px;max-width:60px;line-height: 1.5\" #fixedHeader>\r\n <div *ngIf=\"gridOption.editor.addable\" class=\"align-middle text-center\">\r\n <button *ngIf=\"!gridOption.editor.limit || (gridOption.editor.limit > items.length)\" type=\"button\"\r\n (click)=\"onCreate()\" aria-label=\"Add\" mat-icon-button type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n </div>\r\n </th>\r\n <th *ngIf=\"gridOption.editor && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n <th *ngIf=\"gridOption?.numberable\" class=\"position-sticky c-sticky-all align-middle text-center p-0\"\r\n style=\"width:20px;\" #fixedHeader>\r\n #\r\n </th>\r\n <th *ngIf=\"gridOption?.numberable && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n <ng-container *ngFor=\"let column of fixedColumns\">\r\n <th class=\"position-sticky align-middle cursor-pointer c-cell c-sticky-all\" #fixedHeader\r\n [ngStyle]=\"{'width':column.width ? column.width : '','max-width': column.width ? column.width : '','min-width': !column.width || column.width === 'auto' ? '200px' : column.width}\">\r\n <span [title]=\"column.title\" class=\"c-header-title\" (click)=\"sort(column)\">\r\n {{column.title}}\r\n <i *ngIf=\"column.type !== 'children' && column.type !== 'image' && gridOption.sortable !== false && column.sortable !== false && orderBy !== column.field\"\r\n class=\"fa fa-sort fa-fw\"></i>\r\n <i *ngIf=\"orderBy === column.field && orderDirection == 'ASC'\" class=\"fa fa-sort-asc fa-fw\"></i>\r\n <i *ngIf=\"orderBy === column.field && orderDirection == 'DESC'\" class=\"fa fa-sort-desc fa-fw\"></i>\r\n </span>\r\n <ng-container\r\n *ngIf=\"!gridOption?.filter?.disabled && gridOption?.filter?.columnInline !== 'outside' && !column?.filter?.disabled && (inlineColumn[column.field] || gridOption?.filter?.type === 'inline')\">\r\n <sd-input size=\"sm\"\r\n *ngIf=\"column.type === 'string' || column.type === 'number' || column.type === 'children'\"\r\n [(model)]=\"filter[column.field]\" (keyupEnter)=\"updateFilter()\">\r\n </sd-input>\r\n <sd-select *ngIf=\"column.type === 'bool'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\"\r\n [items]=\"[{value: 1, display: column.trueValue || 'TRUE'}, {value: 0, display: column.falseValue || 'FALSE'}]\"\r\n valueField=\"value\" displayField=\"display\">\r\n </sd-select>\r\n <sd-select *ngIf=\"column.type === 'values'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\" [items]=\"column.values\" valueField=\"value\" displayField=\"text\"\r\n [filtered]=\"column?.editor?.autocomplete\">\r\n </sd-select>\r\n <sd-select *ngIf=\"column.type === 'radio'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\" [items]=\"column.values\" [valueField]=\"column.valueField\"\r\n [displayField]=\"column.displayField\">\r\n </sd-select>\r\n <sd-date-time size=\"sm\"\r\n *ngIf=\"column.type === 'date' || column.type === 'datetime' || column.type === 'time'\"\r\n [(model)]=\"filter[column.field]\" (sdChange)=\"updateFilter()\" type=\"date\">\r\n </sd-date-time>\r\n </ng-container>\r\n </th>\r\n <th *ngIf=\"configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-all\" #fixedHeader></th>\r\n </ng-container>\r\n <th *ngFor=\"let column of normalColumns\"\r\n class=\"position-sticky align-middle cursor-pointer border-top-0 border-bottom-0 c-cell c-sticky-top c-normal-column\"\r\n [ngStyle]=\"{'width':column.width ? column.width : '','max-width': column.width ? column.width : '','min-width': !column.width || column.width === 'auto' ? '200px' : column.width}\">\r\n <span [title]=\"column.title\" class=\"c-header-title\" (click)=\"sort(column)\">\r\n {{column.title}}\r\n <i *ngIf=\"column.type !== 'children' && gridOption.sortable !== false && column.sortable !== false && orderBy !== column.field\"\r\n class=\"fa fa-sort fa-fw\"></i>\r\n <i *ngIf=\"orderBy == column.field && orderDirection == 'ASC'\" class=\"fa fa-sort-asc fa-fw\"></i>\r\n <i *ngIf=\"orderBy == column.field && orderDirection == 'DESC'\" class=\"fa fa-sort-desc fa-fw\"></i>\r\n </span>\r\n <ng-container\r\n *ngIf=\"!gridOption?.filter?.disabled && gridOption?.filter?.columnInline !== 'outside' && !column?.filter?.disabled && (inlineColumn[column.field] || gridOption?.filter?.type === 'inline')\">\r\n <sd-input size=\"sm\"\r\n *ngIf=\"column.type === 'string' || column.type === 'number' || column.type === 'children'\"\r\n [(model)]=\"filter[column.field]\" (keyupEnter)=\"updateFilter()\">\r\n </sd-input>\r\n <sd-select *ngIf=\"column.type === 'bool'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\"\r\n [items]=\"[{value: 1, display: column.trueValue || 'TRUE'}, {value: 0, display: column.falseValue || 'FALSE'}]\"\r\n valueField=\"value\" displayField=\"display\">\r\n </sd-select>\r\n <sd-select *ngIf=\"column.type === 'values'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\" [items]=\"column.values\" valueField=\"value\" displayField=\"text\"\r\n [filtered]=\"column?.editor?.autocomplete\">\r\n </sd-select>\r\n <sd-select *ngIf=\"column.type === 'radio'\" size=\"sm\" [(model)]=\"filter[column.field]\"\r\n (sdChange)=\"updateFilter()\" [items]=\"column.values\" [valueField]=\"column.valueField\"\r\n [displayField]=\"column.displayField\">\r\n </sd-select>\r\n <sd-date-time size=\"sm\"\r\n *ngIf=\"column.type === 'date' || column.type === 'datetime' || column.type === 'time'\"\r\n [(model)]=\"filter[column.field]\" (sdChange)=\"updateFilter()\" type=\"date\">\r\n </sd-date-time>\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let item of viewItems; index as idx; trackBy: trackById\">\r\n <tr>\r\n <td class=\"position-sticky c-sticky-left p-0\"\r\n [ngClass]=\"{'c-error': ((gridOption.editor?.type === 'inline' || item.editingStatus) && item.editorHandler?.errorMessage), \r\n 'c-selected': !((gridOption.editor?.type === 'inline' || item.editingStatus) && item.editorHandler?.errorMessage) && selectedItem === item}\"\r\n style=\"width:4px;min-width: 4px;left:0\" matTooltipPosition=\"after\"\r\n [matTooltip]=\"item.editingStatus ? item.editorHandler?.errorMessage:''\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.subInformation\" class=\"position-sticky text-center align-middle p-0 c-sticky-left\"\r\n style=\"width:30px;min-width: 30px;line-height: 3rem\" #fixedBody>\r\n <button *ngIf=\"!item.editingStatus\" (click)=\"expandOrCollapse(item)\" type=\"button\" class=\"c-btn-icon\">\r\n <i *ngIf=\"item.subInformation?.isLoading\" class=\"fa fa-spinner fa-spin\"></i>\r\n <i *ngIf=\"!item.subInformation?.isLoading\" class=\"fa\"\r\n [ngClass]=\"{'fa-caret-right': !item.subInformation?.isOpened, 'fa-caret-down': item.subInformation?.isOpened}\"></i>\r\n </button>\r\n </td>\r\n <td *ngIf=\"gridOption.subInformation && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.checkable && viewItems?.length\"\r\n class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n <div *ngIf=\"!item.editingStatus\" class=\"align-middle text-center w-20\" style=\"width:20px;\">\r\n <mat-checkbox [color]=\"'primary'\" [(ngModel)]=\"item.isChecked\"\r\n (change)=\"onCheck(item, true)\"></mat-checkbox>\r\n </div>\r\n </td>\r\n <td *ngIf=\"gridOption.checkable && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.commands?.length && viewItems?.length\"\r\n class=\"position-sticky align-middle px-2 py-0 c-sticky-left c-w-1\" #fixedBody>\r\n <div *ngIf=\"!item.editingStatus\" class=\"d-flex align-middle text-center justify-content-center\">\r\n <ng-container\r\n *ngIf=\"gridOption.commands | commandFilter:item | async; $implicit as filteredCommands\">\r\n <section *ngFor=\"let command of filteredCommands\">\r\n <ng-container *ngIf=\"!command.children?.length; else elseCommandChildren\">\r\n <button *ngIf=\"!command.fontSet\" (click)=\"command.click(item)\" type=\"button\"\r\n class=\"c-btn-icon\" [matTooltip]=\"command.title | commandTitle:item\"\r\n [disabled]=\"command.disabled | commandDisabled:item\">\r\n <i class=\"{{command.icon | commandIcon:item}}\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button *ngIf=\"command.fontSet\" [matTooltip]=\"command.title | commandTitle:item\"\r\n [disabled]=\"command.disabled | commandDisabled:item\" (click)=\"command.click(item)\"\r\n type=\"button\" aria-hidden=\"true\" mat-icon-button>\r\n <mat-icon [fontSet]=\"command.fontSet\">{{command.icon | commandIcon:item}}</mat-icon>\r\n </button>\r\n </ng-container>\r\n <ng-template #elseCommandChildren>\r\n <button *ngIf=\"command.icon\" [matMenuTriggerFor]=\"menu\" type=\"button\" class=\"c-btn-icon\"\r\n [matTooltip]=\"command.title\" [disabled]=\"command.disabled | commandDisabled:item\">\r\n <i class=\"{{command.icon | commandIcon:item}}\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button *ngIf=\"!command.icon\" mat-icon-button [matMenuTriggerFor]=\"menu\" type=\"button\"\r\n class=\"c-btn-icon-30\" [matTooltip]=\"command.title\"\r\n [disabled]=\"command.disabled | commandDisabled:item\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <ng-container *ngFor=\"let childCommand of command.children\">\r\n <button *ngIf=\"!(item | commandHidden:childCommand | async)\" type=\"button\" mat-menu-item\r\n [disabled]=\"childCommand.disabled | commandDisabled:item\"\r\n (click)=\"childCommand.click(item)\">\r\n <i *ngIf=\"!childCommand.fontSet\" class=\"{{childCommand.icon | commandIcon:item}}\"></i>\r\n <mat-icon *ngIf=\"childCommand.fontSet\" [fontSet]=\"childCommand.fontSet\">\r\n {{childCommand.icon | commandIcon:item}}</mat-icon>\r\n <span> {{childCommand.title | commandTitle:item}}</span>\r\n </button>\r\n </ng-container>\r\n </mat-menu>\r\n </ng-template>\r\n </section>\r\n </ng-container>\r\n </div>\r\n </td>\r\n <td *ngIf=\"gridOption.commands?.length && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.editor?.addable || gridOption.editor?.editable\"\r\n class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n <div class=\"align-middle text-center\"\r\n style=\"width:60px;min-width:60px;max-width:60px;line-height: 1.5\">\r\n <button\r\n *ngIf=\"!item.editingStatus && gridOption.editor?.type !== 'inline' && gridOption.editor?.editable\"\r\n [disabled]=\"item.editorHandler?.disabled\" (click)=\"onUpdate(item, true)\" aria-label=\"Edit\"\r\n type=\"button\" mat-icon-button>\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button *ngIf=\"item.editingStatus && gridOption.editor?.type !== 'inline'\"\r\n [disabled]=\"item.editorHandler?.errorMessage || item.editorHandler?.saving\" (click)=\"onSave(item)\"\r\n type=\"button\" aria-label=\"Save\" mat-icon-button>\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button *ngIf=\"item.editingStatus || gridOption.editor?.type === 'inline'\" (click)=\"onCancel(item)\"\r\n aria-label=\"Cancel\" mat-icon-button\r\n [disabled]=\"gridOption.editor?.type === 'inline' && item.editorHandler?.disabled\" type=\"button\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </div>\r\n </td>\r\n <td *ngIf=\"gridOption.editor && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.numberable\" class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n <div *ngIf=\"!item.editingStatus\" class=\"align-middle text-center\" style=\"width:20px;\">\r\n <!-- {{gridOption.paginate?.pageSize * (currentPage - 1) + idx + 1}} -->\r\n {{idx + 1}}\r\n </div>\r\n </td>\r\n <td *ngIf=\"gridOption.numberable && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <ng-template ngFor let-column [ngForOf]=\"fixedColumns\">\r\n <td class=\"position-sticky align-middle c-cell c-sticky-left\"\r\n [ngClass]=\"{'text-center': column.type !== 'string' && column.type !== 'number' && column.type !== 'children', 'text-right': column.type === 'number'}\"\r\n [ngStyle]=\"{'width':column.width ? column.width : '','min-width': !column.width || column.width === 'auto' ? '200px' : column.width}\"\r\n (click)=\"rowHandler.click(item)\" #fixedBody>\r\n <ng-container *ngIf=\"column.type !== 'children';else elseColumnChildren\">\r\n <ng-container *ngIf=\"item[column.field] | editorHandler:item:gridOption\">\r\n <div\r\n *ngIf=\"item.editorHandler[column.field].visible && gridOption.editor?.validate && !(item[column.field] | editorValidate:item:gridOption.editor.validate | async)\">\r\n </div>\r\n <ng-container *ngIf=\"item.editorHandler[column.field].visible;else columnView\">\r\n <div style=\"width: 100%\">\r\n <ng-container *ngIf=\"cellEditorDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellEditorDef[column.field].templateRef;context:{item: item, idx: idx, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n <sd-grid-desktop-column-edit *ngIf=\"!cellEditorDef[column.field]\" [column]=\"column\"\r\n [item]=\"item\" (sdChange)=\"onEditorChange()\">\r\n </sd-grid-desktop-column-edit>\r\n </div>\r\n </ng-container>\r\n <ng-template #columnView>\r\n <div class=\"align-middle\" (dblclick)=\"rowHandler.dblClick(item)\">\r\n <ng-container *ngIf=\"cellDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellDef[column.field].templateRef;context:{item: item, idx: idx, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n <sd-grid-desktop-column-view *ngIf=\"!cellDef[column.field]\" [column]=\"column\" [item]=\"item\">\r\n </sd-grid-desktop-column-view>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseColumnChildren>\r\n <sd-grid-desktop-column-children-view [column]=\"column\" [item]=\"item\">\r\n </sd-grid-desktop-column-children-view>\r\n </ng-template>\r\n </td>\r\n <td *ngIf=\"configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n </ng-template>\r\n <td *ngFor=\"let column of normalColumns\" class=\"align-middle c-cell c-normal-column\"\r\n (click)=\"rowHandler.click(item)\"\r\n [ngClass]=\"{'text-center': column.type !== 'string' && column.type !== 'number' && column.type !== 'children', 'text-right': column.type === 'number'}\"\r\n (dblclick)=\"rowHandler.dblClick(item)\"\r\n [ngStyle]=\"{'width':column.width ? column.width : '', 'min-width': !column.width || column.width === 'auto' ? '200px' : column.width}\">\r\n <ng-container *ngIf=\"column.type !== 'children';else elseColumnChildren\">\r\n <ng-container *ngIf=\"item[column.field] | editorHandler:item:gridOption\">\r\n <div\r\n *ngIf=\"item.editorHandler[column.field].visible && gridOption.editor?.validate && !(item[column.field] | editorValidate:item:gridOption.editor.validate | async)\">\r\n </div>\r\n <ng-container *ngIf=\"item.editorHandler[column.field].visible;else columnView\">\r\n <div style=\"width: 100%\">\r\n <ng-container *ngIf=\"cellEditorDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellEditorDef[column.field].templateRef;context:{item: item, idx: idx, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n <sd-grid-desktop-column-edit *ngIf=\"!cellEditorDef[column.field]\" [column]=\"column\"\r\n [item]=\"item\" (sdChange)=\"onEditorChange()\">\r\n </sd-grid-desktop-column-edit>\r\n </div>\r\n </ng-container>\r\n <ng-template #columnView>\r\n <div class=\"align-middle\" (dblclick)=\"rowHandler.dblClick(item)\">\r\n <ng-container *ngIf=\"cellDef[column.field]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellDef[column.field].templateRef;context:{item: item, idx: idx, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n <sd-grid-desktop-column-view *ngIf=\"!cellDef[column.field]\" [column]=\"column\" [item]=\"item\">\r\n </sd-grid-desktop-column-view>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseColumnChildren>\r\n <sd-grid-desktop-column-children-view [column]=\"column\" [item]=\"item\">\r\n </sd-grid-desktop-column-children-view>\r\n </ng-template>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"gridOption?.subInformation && item?.subInformation?.isOpened\" class=\"c-no-hover\">\r\n <td class=\"p-10\" colspan=\"100\">\r\n <sd-grid-sub-information [subItems]=\"item?.subInformation?.subItems\"\r\n [option]=\"gridOption?.subInformation\">\r\n </sd-grid-sub-information>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <ng-container *ngIf=\"viewItems?.length\">\r\n <ng-container *ngFor=\"let footerIndex of footerRows\">\r\n <tr>\r\n <td class=\"position-sticky c-sticky-left p-0\" style=\"width:4px;min-width: 4px;left:0\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.subInformation\"\r\n class=\"position-sticky text-center align-middle p-0 c-sticky-left\"\r\n style=\"width:30px;min-width: 30px;line-height: 3rem\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"gridOption.subInformation && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.checkable && viewItems?.length\"\r\n class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"gridOption.checkable && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.commands?.length && viewItems?.length\"\r\n class=\"position-sticky align-middle px-2 py-0 c-sticky-left c-w-1\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"gridOption.commands?.length && viewItems?.length && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.editor?.addable || gridOption.editor?.editable\"\r\n class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"gridOption.editor && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <td *ngIf=\"gridOption.numberable\" class=\"position-sticky c-sticky-left align-middle p-0\" #fixedBody>\r\n </td>\r\n <td *ngIf=\"gridOption.numberable && configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n <ng-template ngFor let-column [ngForOf]=\"fixedColumns\">\r\n <td class=\"position-sticky align-middle p-0 c-sticky-left\" #fixedBody>\r\n <ng-container *ngIf=\"cellFooterDef[column.field] && cellFooterDef[column.field][footerIndex]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellFooterDef[column.field][footerIndex].templateRef;context:{items: viewItems, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n <td *ngIf=\"configuration?.style?.bordered\"\r\n class=\"position-sticky h-100 p-0 c-sticky-spliter c-sticky-left\" #fixedBody></td>\r\n </ng-template>\r\n <td *ngFor=\"let column of normalColumns\" class=\"align-middle p-0 c-normal-column\">\r\n <ng-container *ngIf=\"cellFooterDef[column.field] && cellFooterDef[column.field][footerIndex]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"cellFooterDef[column.field][footerIndex].templateRef;context:{items: viewItems, column:column}\">\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n <tr *ngIf=\"!viewItems?.length && !isLoading\">\r\n <td class=\"c-empty\" colspan=\"100\">\r\n <mat-icon>cloud_off</mat-icon>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>",
1260
1153
  changeDetection: ChangeDetectionStrategy.OnPush,
1261
1154
  styles: [".text-black400{color:#757575}.c-table.table{margin-bottom:5px}.c-table.table td.c-empty,.c-table.table th.c-empty{background-color:#fff;border:none!important;text-align:center}.c-table.table td.c-empty mat-icon,.c-table.table th.c-empty mat-icon{font-size:150px;height:auto;margin-bottom:30px;margin-top:30px;opacity:.2;width:auto}.c-table.table.c-bordered,.c-table.table.c-bordered td,.c-table.table.c-bordered th{border:1px solid #dee2e6!important}.c-table.table.c-bordered td.c-empty,.c-table.table.c-bordered th.c-empty{background-color:#fff;border:none!important;text-align:center}.c-table.table.c-bordered td.c-empty mat-icon,.c-table.table.c-bordered th.c-empty mat-icon{font-size:150px;height:auto;margin-bottom:30px;margin-top:30px;opacity:.2;width:auto}.c-table.table.c-bordered td.c-normal-column,.c-table.table.c-bordered th.c-normal-column{border-left:none!important}.c-table.table.c-bordered td.c-sticky-spliter,.c-table.table.c-bordered th.c-sticky-spliter{background-color:#dee2e6!important;border:none!important;display:table-cell;max-width:1px!important;min-width:1px!important;width:1px!important}.c-table.table.c-bordered td.c-sticky-left,.c-table.table.c-bordered th.c-sticky-left{border-left:0!important;border-right:0!important}.c-table.table.c-bordered td.c-sticky-all,.c-table.table.c-bordered th.c-sticky-all{border:0!important}.c-table.table thead.thead-light th{background-color:#eceff1;border-top:none!important;color:#2f3136;font-size:14px!important;height:40px;min-width:0}.c-table.table thead.thead-light th.c-cell{padding:3px 5px!important}.c-table.table thead.thead-light th .mat-checkbox label{margin-bottom:0}.c-table.table tbody tr:not(.c-no-hover):hover,.c-table.table tbody tr:not(.c-no-hover):hover td.c-sticky-left{background-color:#e3f2fd!important}.c-table.table tbody tr:not(.c-no-hover):nth-of-type(odd){background-color:#fafafa}.c-table.table tbody tr:not(.c-no-hover):nth-of-type(odd) .c-sticky-left{background-color:#fafafa!important}.c-table.table tbody tr:not(.c-no-hover):nth-of-type(odd) .c-sticky-left.c-sticky-spliter{background-color:#dee2e6!important;border:none!important}.c-table.table tbody tr:not(.c-no-hover):nth-of-type(odd) .c-sticky-left.c-selected{background-color:#2962ff!important}.c-table.table tbody tr:not(.c-no-hover):nth-of-type(odd) .c-sticky-left.c-error{background-color:#f82c13!important}.c-table.table tbody tr:not(.c-no-hover):nth-of-type(2n){background-color:#fff}.c-table.table tbody tr:not(.c-no-hover):nth-of-type(2n) .c-sticky-left{background-color:#fff!important}.c-table.table tbody tr:not(.c-no-hover):nth-of-type(2n) .c-sticky-left.c-sticky-spliter{background-color:#dee2e6!important;border:none!important}.c-table.table tbody tr:not(.c-no-hover):nth-of-type(2n) .c-sticky-left.c-selected{background-color:#2962ff!important}.c-table.table tbody tr:not(.c-no-hover):nth-of-type(2n) .c-sticky-left.c-error{background-color:#f82c13!important}.c-table.table tbody td{font-size:13px!important;min-height:25px;min-width:0}.c-table.table tbody td.c-cell{padding:3px 5px!important}.grid-header{overflow-x:hidden;overflow-y:hidden}.c-cell-padding{padding:3px 5px!important}.c-header-title{font-weight:500;text-transform:capitalize}span.c-header-title{display:block;overflow:hidden!important;padding:0 .3rem;text-overflow:ellipsis;white-space:nowrap}.status{border-radius:1.5rem;display:inline-block;font-weight:500;padding:4px 8px;text-align:center;text-transform:uppercase}.status.c-desktop-status{width:100%}.status.c-align-left{text-align:left!important}.status-success{color:#43a047}.status-danger{color:#f44336}.page-item{cursor:pointer}.sumarize{background-color:#00bcd4;border-radius:10rem;color:#fff;display:inline-block;font-size:12px;font-weight:500;line-height:1;padding:8px 12px;text-align:center;text-transform:uppercase;white-space:normal}.cursor-pointer{cursor:pointer}.c-overflow-x-hidden{overflow-x:hidden}.c-grid-header,.c-overflow-y-hidden{overflow-y:hidden}.c-grid-header{overflow-x:hidden}.c-input-xs{font-size:13px!important;height:28px!important;line-height:1.5!important;padding:3px!important}.c-sticky-top{top:0!important;z-index:20}.c-sticky-left{left:0;z-index:20}.c-sticky-all{left:0;top:0!important;z-index:30}.c-sticky-spliter{background-color:#dee2e6!important;border:none!important;z-index:40!important}.c-badge:not(.c-children){border-radius:10rem;display:block!important;font-size:12px;font-weight:500;margin:0 auto;max-width:80%;padding:.3rem!important}.c-badge.c-children{font-size:14px;font-weight:500;padding:5px!important}.blinker{-webkit-animation:blinker .5s linear infinite;animation:blinker .5s linear infinite;color:#1c87c9;font-weight:500}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.c-loading{opacity:.4}.c-loading-icon{left:calc(50% - 2.5rem);position:-webkit-sticky;position:sticky;top:calc(50% - 2.5rem)}.c-loading-margin{margin-top:-5rem}fieldset.c-fieldset-mobile{border:1px solid #e0e0e0;border-radius:5px;padding:3px 5px}legend.c-legend-mobile{border-bottom:none;font-size:16px;font-weight:500;margin:0 10px;padding:0 5px;width:auto}.c-mobile-box{border-top:none!important;box-shadow:0 0 3px 0 rgba(0,0,0,.3)}.c-mobile-body{margin-bottom:5px;margin-top:5px;overflow-x:auto}.c-mobile-item{border:1px solid #fff;border-radius:5px;box-shadow:0 0 3px 0 rgba(0,0,0,.3);margin:8px 0;padding:5px}.c-mobile-item.c-mobile-item-selected{border:2px solid #2962ff!important}.c-mobile-item:nth-of-type(odd){background-color:#fafafa}.c-mobile-item:nth-of-type(2n){background-color:#fff}.c-mobile-row{margin-bottom:3px;margin-top:0}.c-desktop-title{font-size:13px;line-height:1.7}.c-desktop-title,.c-mobile-title{color:#212529;font-weight:700;margin-right:3px}.c-mobile-title{font-size:14px}.c-children,.c-mobile-value{color:#212529;font-size:14px;overflow-wrap:break-word}.c-mobile-badge{font-size:14px;font-weight:500;padding:5px!important}.c-mobile-command{align-items:center;border-top:1px solid #f4f4f4;display:flex;justify-content:space-between;padding:5px 3px 0}.c-mobile-action{font-size:18px!important}.c-mobile-checkable{margin:5px 0 5px -5px!important}.c-m-3{margin:3px!important}.c-m-5{margin:5px!important}.c-w-1{min-width:1px;width:1px}.c-display-contents{display:contents}.w-20{width:20px!important}.c-btn-icon-30{height:30px;line-height:30px;width:30px}.c-btn-icon{background:none!important;border:none;display:inline-flex;height:16px;opacity:.8;padding:0 3px}.c-btn-icon:hover{cursor:pointer;opacity:1}.c-btn-icon:disabled{background:none!important;border:none;cursor:not-allowed;opacity:.3}:host td .mat-icon-button,:host th .mat-icon-button{height:24px;line-height:24px;width:24px}:host td .mat-icon-button .material-icons,:host th .mat-icon-button .material-icons{font-size:20px}:host ::ng-deep .mat-paginator-container{height:32px;min-height:32px}:host ::ng-deep .mat-paginator-container .mat-icon-button{height:28px;line-height:28px;width:28px}:host ::ng-deep .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .mat-checkbox label{margin-bottom:0}"]
1262
1155
  },] }
@@ -1271,7 +1164,7 @@ SdGrid.ctorParameters = () => [
1271
1164
  { type: DatePipe },
1272
1165
  { type: SdLoadingService },
1273
1166
  { type: SdApiService },
1274
- { type: SdExcelService },
1167
+ { type: SdExportService },
1275
1168
  { type: SdNotifyService },
1276
1169
  { type: EditorHandlerPipe }
1277
1170
  ];
@@ -1295,4 +1188,4 @@ SdGrid.propDecorators = {
1295
1188
  paginator: [{ type: ViewChild, args: [MatPaginator,] }],
1296
1189
  option: [{ type: Input }]
1297
1190
  };
1298
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvbmdoaWF0dDE1X29uZW1vdW50L0RvY3VtZW50cy9saWItY29yZS11aS9wcm9qZWN0cy9zZC1jb3JlL2dyaWQvIiwic291cmNlcyI6WyJzcmMvbGliL2dyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUVULHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLFNBQVMsRUFHVCxNQUFNLEVBQ04sUUFBUSxFQUNSLGVBQWUsRUFDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQ0wsWUFBWSxFQUNiLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUNMLGNBQWMsRUFHZixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFDTCxlQUFlLEVBQ2hCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUNMLGdCQUFnQixFQUNqQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbkIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQWdCLGlCQUFpQixFQUFnRCxNQUFNLGNBQWMsQ0FBQztBQUk3RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU0zQyxPQUFPLEVBQXNCLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztB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QUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQzdFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFO3dCQUNwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQzs2QkFDckcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQzt3QkFDbEksTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDaEQsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUN2RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzt3QkFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7cUJBQ3BCO3lCQUFNO3dCQUNMLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxD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QjtZQXZCWCxRQUFRO1lBbUJmLGdCQUFnQjtZQWRoQixZQUFZO1lBSVosY0FBYztZQU1kLGVBQWU7WUFlUixpQkFBaUI7OzsyQkFzRXZCLFlBQVksU0FBQyxhQUFhOzBCQUMxQixZQUFZLFNBQUMsV0FBVztpQ0FFeEIsU0FBUyxTQUFDLG9CQUFvQjs0QkFDOUIsU0FBUyxTQUFDLGVBQWU7NEJBRXpCLFNBQVMsU0FBQyxlQUFlO3lCQUN6QixTQUFTLFNBQUMsWUFBWTt1QkFDdEIsU0FBUyxTQUFDLFVBQVU7MkJBRXBCLFNBQVMsU0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dDQUMxQyxTQUFTLFNBQUMsbUJBQW1CO2dDQUU3QixTQUFTLFNBQUMsbUJBQW1CO3dCQUM3QixTQUFTLFNBQUMsV0FBVztxQ0FFckIsU0FBUyxTQUFDLHdCQUF3QjtnQ0FDbEMsU0FBUyxTQUFDLG1CQUFtQjt1QkFFN0IsZUFBZSxTQUFDLGtCQUFrQjs2QkFLbEMsZUFBZSxTQUFDLHdCQUF3Qjs2QkFLeEMsZUFBZSxTQUFDLHdCQUF3Qjt3QkFReEMsU0FBUyxTQUFDLFlBQVk7cUJBT3RCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIEluamVjdCxcclxuICBPcHRpb25hbCxcclxuICBDb250ZW50Q2hpbGRyZW5cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBEZXZpY2VEZXRlY3RvclNlcnZpY2UgfSBmcm9tICduZ3gtZGV2aWNlLWRldGVjdG9yJztcclxuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcclxuXHJcbmltcG9ydCB7XHJcbiAgU2RBcGlTZXJ2aWNlXHJcbn0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS9hcGknO1xyXG5cclxuaW1wb3J0IHtcclxuICBTZEV4Y2VsU2VydmljZSxcclxuICBFeGNlbENvbmZpZyxcclxuICBFeGNlbFRlbXBhdGVDb2x1bW5cclxufSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL2V4Y2VsJztcclxuXHJcbmltcG9ydCB7XHJcbiAgU2ROb3RpZnlTZXJ2aWNlXHJcbn0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS9ub3RpZnknO1xyXG5cclxuaW1wb3J0IHtcclxuICBTZExvYWRpbmdTZXJ2aWNlXHJcbn0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS9sb2FkaW5nJztcclxuXHJcbmltcG9ydCB7XHJcbiAgU2RUcmFuc2xhdGVTZXJ2aWNlXHJcbn0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS90cmFuc2xhdGUnO1xyXG5cclxuaW1wb3J0IHsgU2RHcmlkT3B0aW9uLCBkZWZhdWx0R3JpZE9wdGlvbiwgR3JpZEl0ZW0sIFNkR3JpZENvbHVtbiwgU2RHcmlkRXh0ZXJuYWxGaWx0ZXIgfSBmcm9tICcuL2dyaWQubW9kZWwnO1xyXG5cclxuaW1wb3J0IHsgQ29uZmlnUmVzdWx0IH0gZnJvbSAnLi9jb21wb25lbnRzL2dyaWQtY29uZmlnL2dyaWQtY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgU2RHcmlkQ29uZmlnIH0gZnJvbSAnLi9jb21wb25lbnRzL2dyaWQtY29uZmlnL2dyaWQtY29uZmlnLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVkaXRvckhhbmRsZXJQaXBlIH0gZnJvbSAnLi9waXBlcy9lZGl0b3ItaGFuZGxlci5waXBlJztcclxuaW1wb3J0IHsgU2RHcmlkUG9wdXBFZGl0b3IgfSBmcm9tICcuL2NvbXBvbmVudHMvZ3JpZC1wb3B1cC1lZGl0b3IvZ3JpZC1wb3B1cC1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2RHcmlkUG9wdXBGaWx0ZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvZ3JpZC1wb3B1cC1maWx0ZXIvZ3JpZC1wb3B1cC1maWx0ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgbWVyZ2UsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTZEdyaWRQb3B1cEV4cG9ydEV4Y2VsIH0gZnJvbSAnLi9jb21wb25lbnRzL2dyaWQtcG9wdXAtZXhwb3J0LWV4Y2VsL2dyaWQtcG9wdXAtZXhwb3J0LWV4Y2VsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFF1aWNrRmlsdGVyLCBGaWx0ZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2dyaWQtcG9wdXAtZmlsdGVyL2dyaWQtcG9wdXAtZmlsdGVyLm1vZGVsJztcclxuaW1wb3J0IHsgTWF0U2VsZWN0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgU2RHcmlkRmlsdGVySW5mbyB9IGZyb20gJy4vbW9kZWxzL2ZpbHRlci1pbmZvLm1vZGVsJztcclxuXHJcbmltcG9ydCB7IElHcmlkQ29uZmlndXJhdGlvbiwgR1JJRF9DT05GSUcgfSBmcm9tICcuL21vZGVscy9ncmlkLWNvbmZpZ3VyYXRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBTZENlbGxEZWZEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY2VsbC1kZWYuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2RDZWxsRm9vdGVyRGV2RGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2NlbGwtZm9vdGVyLWRlZi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFNkQ2VsbEVkaXRvckRlZkRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jZWxsLWVkaXRvci1kZWYuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgSUhhbmRsZXJTZXJ2ZXIsIElIYW5kbGVyTG9jYWwgfSBmcm9tICcuL21vZGVscy9oYW5kbGVyJztcclxuaW1wb3J0IHsgSGFuZGxlckxvY2FsIH0gZnJvbSAnLi9tb2RlbHMvaGFuZGxlci1sb2NhbCc7XHJcbmltcG9ydCB7IEhhbmRsZXJEb3RuZXQgfSBmcm9tICcuL21vZGVscy9oYW5kbGVyLWRvdG5ldCc7XHJcbmltcG9ydCB7IFNkR3JpZEltcG9ydEV4Y2VsIH0gZnJvbSAnLi9jb21wb25lbnRzL2dyaWQtaW1wb3J0LWV4Y2VsL2dyaWQtaW1wb3J0LWV4Y2VsLmNvbXBvbmVudCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZC1ncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZEdyaWQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgaGFuZGxlcjogSUhhbmRsZXJTZXJ2ZXIgfCBJSGFuZGxlckxvY2FsO1xyXG4gIGlzTW9iaWxlT3JUYWJsZXQgPSBmYWxzZTtcclxuICBkaXNwbGF5S2V5ID0gJ1NEQ1VTVE9NJztcclxuICBncmlkT3B0aW9uOiBTZEdyaWRPcHRpb247XHJcbiAgb3JkZXJCeTogc3RyaW5nO1xyXG4gIG9yZGVyRGlyZWN0aW9uOiAnQVNDJyB8ICdERVNDJztcclxuICBsb2NhbEl0ZW1zOiBHcmlkSXRlbVtdID0gW107XHJcbiAgaXRlbXM6IEdyaWRJdGVtW10gPSBbXTtcclxuICB0b3RhbDogbnVtYmVyO1xyXG4gIGZpbHRlcjoge1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55XHJcbiAgfSA9IHt9O1xyXG4gIGV4dGVybmFsRmlsdGVyOiB7XHJcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcclxuICB9ID0ge307XHJcbiAgaGlkZGVuUGFnaW5hdGUgPSBmYWxzZTtcclxuICBpbmxpbmVFeHRlcm5hbDoge1xyXG4gICAgW2tleTogc3RyaW5nXTogYm9vbGVhbjtcclxuICB9ID0ge307XHJcbiAgaW5saW5lQ29sdW1uOiB7XHJcbiAgICBba2V5OiBzdHJpbmddOiBib29sZWFuO1xyXG4gIH0gPSB7fTtcclxuICBxdWlja0ZpbHRlcnM6IFF1aWNrRmlsdGVyW10gPSBbXTtcclxuICBzZWxlY3RlZFF1aWNrRmlsdGVyOiBzdHJpbmc7XHJcbiAgLy8gUGFnaW5hdGVcclxuICBwYWdlcyA9IFsxXTtcclxuICBwYWdlQ291bnQgPSA1O1xyXG4gIHRvdGFsUGFnZSA9IDE7XHJcblxyXG4gIC8vIExvYWRpbmdcclxuICBpc0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgdmlld0l0ZW1zOiBHcmlkSXRlbVtdID0gW107XHJcbiAgc3VtYXJpemU6IHN0cmluZztcclxuXHJcbiAgZml4ZWRDb2x1bW5zOiBTZEdyaWRDb2x1bW5bXSA9IFtdO1xyXG4gIG5vcm1hbENvbHVtbnM6IFNkR3JpZENvbHVtbltdID0gW107XHJcbiAgY29sdW1uczogU2RHcmlkQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgaXNDaGVja2VkQWxsID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRJdGVtczogYW55W10gPSBbXTtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbignZml4ZWRIZWFkZXInKSBwcml2YXRlIGZpeGVkSGVhZGVyczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ2ZpeGVkQm9keScpIHByaXZhdGUgZml4ZWRCb2RpZXM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZml4ZWRHcmlkQ29udGFpbmVyJykgZml4ZWRHcmlkQ29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2dyaWRGaXhlZEJvZHknKSBncmlkRml4ZWRCb2R5OiBFbGVtZW50UmVmO1xyXG5cclxuICBAVmlld0NoaWxkKCdncmlkQ29udGFpbmVyJykgZ3JpZENvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdncmlkSGVhZGVyJykgZ3JpZEhlYWRlcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdncmlkQm9keScpIGdyaWRCb2R5OiBFbGVtZW50UmVmO1xyXG5cclxuICBAVmlld0NoaWxkKCdzZEdyaWRDb25maWcnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzZEdyaWRDb25maWc6IFNkR3JpZENvbmZpZztcclxuICBAVmlld0NoaWxkKCdzZEdyaWRQb3B1cEVkaXRvcicpIHNkR3JpZFBvcHVwRWRpdG9yOiBTZEdyaWRQb3B1cEVkaXRvcjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnc2RHcmlkUG9wdXBGaWx0ZXInKSBzZEdyaWRQb3B1cEZpbHRlcjogU2RHcmlkUG9wdXBGaWx0ZXI7XHJcbiAgQFZpZXdDaGlsZCgnbWF0U2VsZWN0JykgbWF0U2VsZWN0OiBNYXRTZWxlY3Q7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NkR3JpZFBvcHVwRXhwb3J0RXhjZWwnKSBzZEdyaWRQb3B1cEV4cG9ydEV4Y2VsOiBTZEdyaWRQb3B1cEV4cG9ydEV4Y2VsO1xyXG4gIEBWaWV3Q2hpbGQoJ3NkR3JpZEltcG9ydEV4Y2VsJykgc2RHcmlkSW1wb3J0RXhjZWw6IFNkR3JpZEltcG9ydEV4Y2VsO1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFNkQ2VsbERlZkRpcmVjdGl2ZSkgY2VsbERlZnMgPSBuZXcgUXVlcnlMaXN0PFNkQ2VsbERlZkRpcmVjdGl2ZT4oKTtcclxuICBjZWxsRGVmOiB7XHJcbiAgICBbY29sdW1uOiBzdHJpbmddOiBTZENlbGxEZWZEaXJlY3RpdmVcclxuICB9ID0ge307XHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oU2RDZWxsRWRpdG9yRGVmRGlyZWN0aXZlKSBjZWxsRWRpdG9yRGVmcyA9IG5ldyBRdWVyeUxpc3Q8U2RDZWxsRWRpdG9yRGVmRGlyZWN0aXZlPigpO1xyXG4gIGNlbGxFZGl0b3JEZWY6IHtcclxuICAgIFtjb2x1bW46IHN0cmluZ106IFNkQ2VsbEVkaXRvckRlZkRpcmVjdGl2ZVxyXG4gIH0gPSB7fTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihTZENlbGxGb290ZXJEZXZEaXJlY3RpdmUpIGNlbGxGb290ZXJEZWZzID0gbmV3IFF1ZXJ5TGlzdDxTZENlbGxGb290ZXJEZXZEaXJlY3RpdmU+KCk7XHJcbiAgY2VsbEZvb3RlckRlZjoge1xyXG4gICAgW2NvbHVtbjogc3RyaW5nXTogU2RDZWxsRm9vdGVyRGV2RGlyZWN0aXZlW107XHJcbiAgfSA9IHt9O1xyXG4gICNudW1iZXJPZkZvb3RlclJvd3MgPSAwO1xyXG4gIGZvb3RlclJvd3M6IG51bWJlcltdID0gW107XHJcblxyXG4gICNwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcclxuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcikgc2V0IHBhZ2luYXRvcihwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcikge1xyXG4gICAgaWYgKHBhZ2luYXRvciAmJiB0aGlzLiNwYWdpbmF0b3IgIT09IHBhZ2luYXRvcikge1xyXG4gICAgICB0aGlzLiNwYWdpbmF0b3IgPSBwYWdpbmF0b3I7XHJcbiAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQocGFnaW5hdG9yLnBhZ2Uuc3Vic2NyaWJlKHRoaXMuc2VsZWN0UGFnZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG9wdGlvbih2YWx1ZTogU2RHcmlkT3B0aW9uKSB7XHJcbiAgICB0aGlzLnNldE9wdGlvbih2YWx1ZSk7XHJcbiAgfVxyXG4gIHNlbGVjdGVkSXRlbTogYW55ID0gbnVsbDtcclxuICAjc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIHJvd0hhbmRsZXIgPSB7XHJcbiAgICBjbGljazogKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24ub25DbGlja1Jvdykge1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbi5vbkNsaWNrUm93KGl0ZW0pO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZGJsQ2xpY2s6IChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLm9uRGJsQ2xpY2tSb3cpIHtcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb24ub25EYmxDbGlja1JvdyhpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgc2V0T3B0aW9uID0gKG9wdGlvbjogU2RHcmlkT3B0aW9uKSA9PiB7XHJcbiAgICBvcHRpb24gPSB0aGlzLmluaXRDb25maWd1cmF0aW9uKG9wdGlvbik7XHJcbiAgICBvcHRpb24gPSB0aGlzLmluaXRUcmFuc2xhdGUob3B0aW9uKTtcclxuICAgIGRlbGV0ZSB0aGlzLmdyaWRPcHRpb247XHJcbiAgICB0aGlzLmdyaWRPcHRpb24gPSBvcHRpb247XHJcbiAgICAvLyBMb+G6oWkgYuG7jyBuaOG7r25nIGNvbW1hbmQgYuG7iyDhuqluXHJcbiAgICB0aGlzLmdyaWRPcHRpb24uY29tbWFuZHMgPSB0aGlzLmdyaWRPcHRpb24uY29tbWFuZHMuZmlsdGVyKGNvbW1hbmQgPT4ge1xyXG4gICAgICBjb25zdCBoaWRkZW4gPSBjb21tYW5kLmhpZGRlbjtcclxuICAgICAgaWYgKGhpZGRlbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiAoaGlkZGVuKSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICByZXR1cm4gIWhpZGRlbjtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAoaGlkZGVuKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgcmV0dXJuICFoaWRkZW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5zZEdyaWRDb25maWcuc2V0T3B0aW9uKHtcclxuICAgICAga2V5OiBvcHRpb24ua2V5LFxyXG4gICAgICBwYWdlU2l6ZTogdGhpcy5ncmlkT3B0aW9uLnBhZ2luYXRlLnBhZ2VTaXplLFxyXG4gICAgICBjb2x1bW5zOiB0aGlzLmdyaWRPcHRpb24uY29sdW1uc1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmluaXRFeHRlcm5hbEZpbHRlcigpO1xyXG4gICAgdGhpcy5yZXNpemUoKTtcclxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q29uZmlndXJhdGlvbiA9IChvcHRpb246IFNkR3JpZE9wdGlvbikgPT4ge1xyXG4gICAgY29uc3QgZ3JpZENvbmZpZ3VyYXRpb24gPSB0aGlzLmNvbmZpZ3VyYXRpb247XHJcbiAgICAvLyBGaWx0ZXJcclxuICAgIGlmICghb3B0aW9uLmZpbHRlcj8udHlwZSAmJiBncmlkQ29uZmlndXJhdGlvbj8uZmlsdGVyPy50eXBlKSB7XHJcbiAgICAgIGlmICghb3B0aW9uLmZpbHRlcikge1xyXG4gICAgICAgIG9wdGlvbi5maWx0ZXIgPSB7XHJcbiAgICAgICAgICB0eXBlOiBncmlkQ29uZmlndXJhdGlvbi5maWx0ZXIudHlwZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgb3B0aW9uLmZpbHRlci50eXBlID0gZ3JpZENvbmZpZ3VyYXRpb24uZmlsdGVyLnR5cGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghb3B0aW9uLmZpbHRlcj8uY29sdW1uSW5saW5lICYmIGdyaWRDb25maWd1cmF0aW9uPy5maWx0ZXI/LmNvbHVtbklubGluZSkge1xyXG4gICAgICBpZiAoIW9wdGlvbi5maWx0ZXIpIHtcclxuICAgICAgICBvcHRpb24uZmlsdGVyID0ge1xyXG4gICAgICAgICAgY29sdW1uSW5saW5lOiBncmlkQ29uZmlndXJhdGlvbi5maWx0ZXIuY29sdW1uSW5saW5lXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvcHRpb24uZmlsdGVyLmNvbHVtbklubGluZSA9IGdyaWRDb25maWd1cmF0aW9uLmZpbHRlci5jb2x1bW5JbmxpbmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghb3B0aW9uLmZpbHRlcj8ucXVpY2tGaWx0ZXJWaXNpYmlsaXR5ICYmIGdyaWRDb25maWd1cmF0aW9uPy5maWx0ZXI/LnF1aWNrRmlsdGVyVmlzaWJpbGl0eSkge1xyXG4gICAgICBpZiAoIW9wdGlvbi5maWx0ZXIpIHtcclxuICAgICAgICBvcHRpb24uZmlsdGVyID0ge1xyXG4gICAgICAgICAgcXVpY2tGaWx0ZXJWaXNpYmlsaXR5OiBncmlkQ29uZmlndXJhdGlvbi5maWx0ZXIucXVpY2tGaWx0ZXJWaXNpYmlsaXR5XHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvcHRpb24uZmlsdGVyLnF1aWNrRmlsdGVyVmlzaWJpbGl0eSA9IGdyaWRDb25maWd1cmF0aW9uLmZpbHRlci5xdWlja0ZpbHRlclZpc2liaWxpdHk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIFRyYW5zbGF0ZVxyXG4gICAgb3B0aW9uLnRyYW5zbGF0ZSA9IG9wdGlvbi50cmFuc2xhdGUgPz8gZ3JpZENvbmZpZ3VyYXRpb24/LnRyYW5zbGF0ZTtcclxuICAgIHN3aXRjaCAob3B0aW9uLnR5cGUpIHtcclxuICAgICAgY2FzZSAnbG9jYWwnOlxyXG4gICAgICAgIHRoaXMuaGFuZGxlciA9IHRoaXMuaGFuZGxlckxvY2FsO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkb3RuZXQnOlxyXG4gICAgICAgIHRoaXMuaGFuZGxlciA9IHRoaXMuaGFuZGxlckRvdG5ldDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY3VzdG9tJzpcclxuICAgICAgICB0aGlzLmhhbmRsZXIgPSBvcHRpb24uaGFuZGxlckN1c3RvbSB8fCBncmlkQ29uZmlndXJhdGlvbj8uaGFuZGxlckN1c3RvbTtcclxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcikge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLm5vdGlmeS53YXJuaW5nKGBIYW5kbGVyIGN1c3RvbSB3YXMgbm90IGZvdW5kYCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgLi4uZGVmYXVsdEdyaWRPcHRpb24sIC4uLm9wdGlvbiB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0VHJhbnNsYXRlID0gKG9wdGlvbjogU2RHcmlkT3B0aW9uKSA9PiB7XHJcbiAgICBjb25zdCB7IHRyYW5zbGF0ZSB9ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlO1xyXG4gICAgb3B0aW9uLmNvbW1hbmRzPy5mb3JFYWNoKGNvbW1hbmQgPT4ge1xyXG4gICAgICBpZiAoIW9wdGlvbi50cmFuc2xhdGUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHR5cGVvZiAoY29tbWFuZC50aXRsZSkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29tbWFuZC50aXRsZSA9IHRyYW5zbGF0ZShjb21tYW5kLnRpdGxlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoJ2NoaWxkcmVuJyBpbiBjb21tYW5kKSB7XHJcbiAgICAgICAgY29tbWFuZC5jaGlsZHJlbj8uZm9yRWFjaChjaGlsZENvbW1hbmQgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiAoY2hpbGRDb21tYW5kLnRpdGxlKSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY2hpbGRDb21tYW5kLnRpdGxlID0gdHJhbnNsYXRlKGNoaWxkQ29tbWFuZC50aXRsZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgb3B0aW9uLmNvbHVtbnM/LmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgaWYgKGNvbHVtbi50cmFuc2xhdGUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvcHRpb24udHJhbnNsYXRlIHx8IGNvbHVtbi50cmFuc2xhdGUpIHtcclxuICAgICAgICBjb2x1bW4udGl0bGUgPSB0cmFuc2xhdGUoY29sdW1uLnRpdGxlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdjaGlsZHJlbicpIHtcclxuICAgICAgICBjb2x1bW4/LmNoaWxkcmVuPy5mb3JFYWNoKGNoaWxkQ29sdW1uID0+IHtcclxuICAgICAgICAgIGlmIChjaGlsZENvbHVtbi50cmFuc2xhdGUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChvcHRpb24udHJhbnNsYXRlIHx8IGNoaWxkQ29sdW1uLnRyYW5zbGF0ZSkge1xyXG4gICAgICAgICAgICBjaGlsZENvbHVtbi50aXRsZSA9IHRyYW5zbGF0ZShjaGlsZENvbHVtbi50aXRsZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgb3B0aW9uLmZpbHRlcj8uZXh0ZXJuYWxGaWx0ZXJzPy5mb3JFYWNoKGV4dGVybmFsRmlsdGVyID0+IHtcclxuICAgICAgaWYgKG9wdGlvbi50cmFuc2xhdGUpIHtcclxuICAgICAgICBleHRlcm5hbEZpbHRlci50aXRsZSA9IHRyYW5zbGF0ZShleHRlcm5hbEZpbHRlci50aXRsZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG9wdGlvbjtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChHUklEX0NPTkZJRykgQE9wdGlvbmFsKCkgcHVibGljIGNvbmZpZ3VyYXRpb246IElHcmlkQ29uZmlndXJhdGlvbixcclxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIGRldmljZVNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgaGFuZGxlckxvY2FsOiBIYW5kbGVyTG9jYWwsXHJcbiAgICBwcml2YXRlIGhhbmRsZXJEb3RuZXQ6IEhhbmRsZXJEb3RuZXQsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFNkVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLFxyXG4gICAgcHJpdmF0ZSBsb2FkaW5nU2VydmljZTogU2RMb2FkaW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogU2RBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBleGNlbFNlcnZpY2U6IFNkRXhjZWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZnlTZXJ2aWNlOiBTZE5vdGlmeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVkaXRvclZpc2libGVQaXBlOiBFZGl0b3JIYW5kbGVyUGlwZSkge1xyXG4gICAgdGhpcy5pc01vYmlsZU9yVGFibGV0ID0gIWRldmljZVNlcnZpY2UuaXNEZXNrdG9wKCk7XHJcbiAgICAvLyB0aGlzLnJlZi5kZXRhY2goKTtcclxuICAgIC8vIHNldEludGVydmFsKCgpID0+IHtcclxuICAgIC8vICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAvLyB9LCAxMDAwKTtcclxuICAgIC8vIHJlZi5kZXRhY2goKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy5maXhlZEhlYWRlcnMuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aChbXSkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpeGVkSGVhZGVycyA9IHRoaXMuZml4ZWRIZWFkZXJzLnRvQXJyYXkoKTtcclxuICAgICAgICBpZiAoZml4ZWRIZWFkZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBsZWZ0ID0gJChmaXhlZEhlYWRlcnNbMF0ubmF0aXZlRWxlbWVudCkub3V0ZXJXaWR0aCh0cnVlKTtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZml4ZWRIZWFkZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICQoZml4ZWRIZWFkZXJzW2ldLm5hdGl2ZUVsZW1lbnQpLmNzcyh7IGxlZnQgfSk7XHJcbiAgICAgICAgICAgIGxlZnQgKz0gJChmaXhlZEhlYWRlcnNbaV0ubmF0aXZlRWxlbWVudCkub3V0ZXJXaWR0aCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sIDEwMCk7XHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKG1lcmdlKHRoaXMuZml4ZWRCb2RpZXMuY2hhbmdlcywgdGhpcy5jZWxsRm9vdGVyRGVmcy5jaGFuZ2VzKS5waXBlKHN0YXJ0V2l0aCh7fSkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpeGVkQm9kaWVzID0gdGhpcy5maXhlZEJvZGllcy50b0FycmF5KCk7XHJcbiAgICAgICAgaWYgKGZpeGVkQm9kaWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IGZpeGVkUGVyUm93ID0gdGhpcy5maXhlZEJvZGllcy5sZW5ndGggLyAodGhpcy52aWV3SXRlbXMubGVuZ3RoICsgdGhpcy4jbnVtYmVyT2ZGb290ZXJSb3dzKTtcclxuICAgICAgICAgIGxldCBsZWZ0ID0gJChmaXhlZEJvZGllc1swXS5uYXRpdmVFbGVtZW50KS5vdXRlcldpZHRoKHRydWUpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBmaXhlZEJvZGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaSAlIGZpeGVkUGVyUm93ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgbGVmdCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgJChmaXhlZEJvZGllc1tpXS5uYXRpdmVFbGVtZW50KS5jc3MoeyBsZWZ0IH0pO1xyXG4gICAgICAgICAgICBsZWZ0ICs9ICQoZml4ZWRCb2RpZXNbaV0ubmF0aXZlRWxlbWVudCkub3V0ZXJXaWR0aCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZml4ZWRIZWFkZXJzID0gdGhpcy5maXhlZEhlYWRlcnMudG9BcnJheSgpO1xyXG4gICAgICAgIGlmIChmaXhlZEhlYWRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGxlZnQgPSAkKGZpeGVkSGVhZGVyc1swXS5uYXRpdmVFbGVtZW50KS5vdXRlcldpZHRoKHRydWUpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBmaXhlZEhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgJChmaXhlZEhlYWRlcnNbaV0ubmF0aXZlRWxlbWVudCkuY3NzKHsgbGVmdCB9KTtcclxuICAgICAgICAgICAgbGVmdCArPSAkKGZpeGVkSGVhZGVyc1tpXS5uYXRpdmVFbGVtZW50KS5vdXRlcldpZHRoKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMTAwKTtcclxuICAgIH0pKTtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy5jZWxsRGVmcy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKFtdKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jZWxsRGVmID0ge307XHJcbiAgICAgIGZvciAoY29uc3QgY2VsbERlZiBvZiB0aGlzLmNlbGxEZWZzKSB7XHJcbiAgICAgICAgaWYgKGNlbGxEZWYuc2RDZWxsRGVmKSB7XHJcbiAgICAgICAgICB0aGlzLmNlbGxEZWZbY2VsbERlZi5zZENlbGxEZWZdID0gY2VsbERlZjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy5jZWxsRWRpdG9yRGVmcy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKFtdKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jZWxsRWRpdG9yRGVmID0ge307XHJcbiAgICAgIGZvciAoY29uc3QgY2VsbEVkaXRvckRlZiBvZiB0aGlzLmNlbGxFZGl0b3JEZWZzKSB7XHJcbiAgICAgICAgaWYgKGNlbGxFZGl0b3JEZWYuc2RDZWxsRWRpdG9yRGVmKSB7XHJcbiAgICAgICAgICB0aGlzLmNlbGxFZGl0b3JEZWZbY2VsbEVkaXRvckRlZi5zZENlbGxFZGl0b3JEZWZdID0gY2VsbEVkaXRvckRlZjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy5jZWxsRm9vdGVyRGVmcy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKFtdKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jZWxsRm9vdGVyRGVmID0ge307XHJcbiAgICAgIHRoaXMuI251bWJlck9mRm9vdGVyUm93cyA9IDA7XHJcbiAgICAgIGZvciAoY29uc3QgY2VsbEZvb3RlckRlZiBvZiB0aGlzLmNlbGxGb290ZXJEZWZzKSB7XHJcbiAgICAgICAgaWYgKGNlbGxGb290ZXJEZWYuc2RDZWxsRm9vdGVyRGVmKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuY2VsbEZvb3RlckRlZltjZWxsRm9vdGVyRGVmLnNkQ2VsbEZvb3RlckRlZl0pIHtcclxuICAgICAgICAgICAgdGhpcy5jZWxsRm9vdGVyRGVmW2NlbGxGb290ZXJEZWYuc2RDZWxsRm9vdGVyRGVmXSA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jZWxsRm9vdGVyRGVmW2NlbGxGb290ZXJEZWYuc2RDZWxsRm9vdGVyRGVmXS5wdXNoKGNlbGxGb290ZXJEZWYpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY2VsbEZvb3RlckRlZltjZWxsRm9vdGVyRGVmLnNkQ2VsbEZvb3RlckRlZl0ubGVuZ3RoID4gdGhpcy4jbnVtYmVyT2ZGb290ZXJSb3dzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuI251bWJlck9mRm9vdGVyUm93cyA9IHRoaXMuY2VsbEZvb3RlckRlZltjZWxsRm9vdGVyRGVmLnNkQ2VsbEZvb3RlckRlZl0ubGVuZ3RoO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvb3RlclJvd3MgPSBBcnJheSh0aGlzLiNudW1iZXJPZkZvb3RlclJvd3MpLmZpbGwoMCkubWFwKCh2LCBpKSA9PiBpKTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICByZWxvYWQgPSBhc3luYyAoZ3JpZEl0ZW1zPzogYW55W10pID0+IHtcclxuICAgIGlmICh0aGlzLmlzTG9hZGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBjdXJyZW50UGFnZSA9ICh0aGlzLiNwYWdpbmF0b3I/LnBhZ2VJbmRleCB8fCAwKSArIDE7XHJcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuI3BhZ2luYXRvcj8ucGFnZVNpemUgfHwgNTA7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgIT09ICdsb2NhbCcpIHtcclxuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyIGFzIElIYW5kbGVyU2VydmVyO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGhhbmRsZXIubWFwUmVxdWVzdCh0aGlzLmdldEZpbHRlckluZm8oY3VycmVudFBhZ2UsIHBhZ2VTaXplKSk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi5tZXRob2QgPT09ICdHRVQnKSB7XHJcbiAgICAgICAgICBjb25zdCBxdWVyeVN0cmluZyA9IE9iamVjdC5rZXlzKGZpbHRlcikuZmlsdGVyKGtleSA9PiBmaWx0ZXJba2V5XSAhPT0gbnVsbCAmJiBmaWx0ZXJba2V5XSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAubWFwKGtleSA9PiBrZXkgKyAnPScgKyBmaWx0ZXJba2V5XSkuam9pbignJicpO1xyXG4gICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5ncmlkT3B0aW9uLnVybC5pbmNsdWRlcygnPycpID8gYCR7dGhpcy5ncmlkT3B0aW9uLnVybH0mJHtxdWVyeVN0cmluZ31gIDogYCR7dGhpcy5ncmlkT3B0aW9uLnVybH0/JHtxdWVyeVN0cmluZ31gO1xyXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UuZ2V0KHVybCk7XHJcbiAgICAgICAgICBjb25zdCB7IGl0ZW1zLCB0b3RhbCB9ID0gaGFuZGxlci5tYXBSZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICAgICAgICB0aGlzLml0ZW1zID0gaXRlbXM7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnBvc3QodGhpcy5ncmlkT3B0aW9uLnVybCwgZmlsdGVyKTtcclxuICAgICAgICAgIGNvbnN0IHsgaXRlbXMsIHRvdGFsIH0gPSBoYW5kbGVyLm1hcFJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICAgICAgICAgIHRoaXMuaXRlbXMgPSBpdGVtcztcclxuICAgICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlciBhcyBJSGFuZGxlckxvY2FsO1xyXG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuZ3JpZE9wdGlvbi5pdGVtcykgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGdyaWRJdGVtcykpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2NhbEl0ZW1zID0gZ3JpZEl0ZW1zO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcygpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgICB0aGlzLmxvY2FsSXRlbXMgPSBhd2FpdCByZXN1bHRzO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMubG9jYWxJdGVtcyA9IHJlc3VsdHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5ncmlkT3B0aW9uLml0ZW1zID0gZ3JpZEl0ZW1zIHx8IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcztcclxuICAgICAgICAgIHRoaXMubG9jYWxJdGVtcyA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBoYW5kbGVyLmZpbHRlcih0aGlzLmxvY2FsSXRlbXMsIHtcclxuICAgICAgICAgIGN1c3RvbUZpbHRlcjogdGhpcy5ncmlkT3B0aW9uLmZpbHRlci5jdXN0b21GaWx0ZXIsXHJcbiAgICAgICAgICByYXdGaWx0ZXI6IHRoaXMuZmlsdGVyLFxyXG4gICAgICAgICAgY29sdW1uczogdGhpcy5ncmlkT3B0aW9uLmNvbHVtbnMsXHJcbiAgICAgICAgICByYXdFeHRlcm5hbEZpbHRlcjogdGhpcy5leHRlcm5hbEZpbHRlcixcclxuICAgICAgICAgIGV4dGVybmFsRmlsdGVyczogdGhpcy5ncmlkT3B0aW9uLmZpbHRlcj8uZXh0ZXJuYWxGaWx0ZXJzLFxyXG4gICAgICAgICAgb3JkZXJCeTogdGhpcy5vcmRlckJ5LFxyXG4gICAgICAgICAgb3JkZXJEaXJlY3Rpb246IHRoaXMub3JkZXJEaXJlY3Rpb24sXHJcbiAgICAgICAgICBwYWdlTnVtYmVyOiBjdXJyZW50UGFnZSxcclxuICAgICAgICAgIHBhZ2VTaXplXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pdGVtcyA9IHJlc3BvbnNlLml0ZW1zO1xyXG4gICAgICAgIHRoaXMudG90YWwgPSByZXNwb25zZS50b3RhbDtcclxuICAgICAgICBcclxuICAgICAgfVxyXG4gICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiBpdGVtLm9yaWdpbkl0ZW0gPSB7IC4uLml0ZW0gfSk7XHJcbiAgICAgIHRoaXMuaXNDaGVja2VkQWxsID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuI3NldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgICAgYXdhaXQgdGhpcy5ncmlkT3B0aW9uPy5vblJlbG9hZENvbXBsZXRlZD8uKHRoaXMuaXRlbXMpO1xyXG4gICAgICB0aGlzLmdlbmVyYXRlVmlld0l0ZW1zKCk7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVFZGl0b3JIYW5kbGVycygpO1xyXG4gICAgICAkKHRoaXMuZ3JpZEJvZHkubmF0aXZlRWxlbWVudCkuc2Nyb2xsVG9wKDApO1xyXG4gICAgICBpZiAoY3VycmVudFBhZ2UgPiAxICYmICF0aGlzLnZpZXdJdGVtcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy4jcGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLmhhbmRsZS5lcnJvcihlcnJvcik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVsb2FkSXRlbShkYXRhOiB7IFtpZDogc3RyaW5nXTogYW55IH0pIHtcclxuICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goaWQgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtcy5maW5kKGUgPT4gISFlLmlkICYmIGUuaWQgPT09IGlkKTtcclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb24uY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICBpZiAoaXRlbVtjb2x1bW4uZmllbGRdICE9PSB1bmRlZmluZWQgJiYgZGF0YVtpZF1bY29sdW1uLmZpZWxkXSAhPT0gdW5kZWZpbmVkICYmIGl0ZW1bY29sdW1uLmZpZWxkXSAhPT0gZGF0YVtpZF1bY29sdW1uLmZpZWxkXSkge1xyXG4gICAgICAgICAgICB0aGlzLmJsaW5rKGl0ZW0sIGNvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihpdGVtLCBkYXRhW2lkXSk7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUVkaXRvckhhbmxkZXIoaXRlbSk7XHJcbiAgICAgICAgdGhpcy5zdG9wQmxpbmsoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJsaW5rKGl0ZW06IEdyaWRJdGVtLCBmaWVsZDogc3RyaW5nKSB7XHJcbiAgICBpdGVtLmJsaW5rZXIgPSBpdGVtLmJsaW5rZXIgfHwge307XHJcbiAgICBpdGVtLmJsaW5rZXJbZmllbGRdID0gdHJ1ZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBzdG9wQmxpbmsoKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy52aWV3SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmJsaW5rZXIgPSB7fTtcclxuICAgICAgfSk7XHJcbiAgICB9LCAxNTAwKTtcclxuICB9XHJcblxyXG4gIGRldGVjdENoYW5nZXMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVWaWV3SXRlbXMoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50UGFnZSA9ICh0aGlzLiNwYWdpbmF0b3I/LnBhZ2VJbmRleCB8fCAwKSArIDE7XHJcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuI3BhZ2luYXRvcj8ucGFnZVNpemUgfHwgNTA7XHJcbiAgICBkZWxldGUgdGhpcy52aWV3SXRlbXM7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdsb2NhbCcpIHtcclxuICAgICAgdGhpcy52aWV3SXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcigoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICByZXR1cm4gaW5kZXggPj0gKGN1cnJlbnRQYWdlIC0gMSkgKiBwYWdlU2l6ZVxyXG4gICAgICAgICAgJiYgaW5kZXggPCBjdXJyZW50UGFnZSAqIHBhZ2VTaXplO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudmlld0l0ZW1zID0gdGhpcy5pdGVtcztcclxuICAgIH1cclxuICAgIHRoaXMudmlld0l0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgIGl0ZW0uYmxpbmtlciA9IGl0ZW0uYmxpbmtlciB8fCB7fTtcclxuICAgICAgaXRlbS5zdWJJbmZvcm1hdGlvbiA9IGl0ZW0uc3ViSW5mb3JtYXRpb24gfHwge307XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBlZGl0ZWRJdGVtcygpIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IHtcclxuICAgICAgaWYgKCFpdGVtLm9yaWdpbkl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoT2JqZWN0LmtleXMoaXRlbS5vcmlnaW5JdGVtKS5zb21lKGtleSA9PiBpdGVtLm9yaWdpbkl0ZW1ba2V5XSAhPT0gaXRlbVtrZXldKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0pLm1hcChpdGVtID0+IHtcclxuICAgICAgY29uc3QgeyB0ZW1wb3JhcnksXHJcbiAgICAgICAgb3JpZ2luSXRlbSxcclxuICAgICAgICBlZGl0b3JIYW5kbGVyLFxyXG4gICAgICAgIGVkaXRpbmdTdGF0dXMsXHJcbiAgICAgICAgaXNDaGVja2VkLFxyXG4gICAgICAgIHN1YkluZm9ybWF0aW9uLFxyXG4gICAgICAgIGJsaW5rZXIsXHJcbiAgICAgICAgLi4ucmVzdWx0IH0gPSBpdGVtO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RQYWdlID0gKCkgPT4ge1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgIHRoaXMucmVsb2FkKHRoaXMubG9jYWxJdGVtcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbG9hZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlRmlsdGVyID0gKHBhcmFtPzogeyBmaWx0ZXI6IGFueSwgZXh0ZXJuYWxGaWx0ZXI6IGFueSB9KSA9PiB7XHJcbiAgICB0aGlzLmZpbHRlciA9IHBhcmFtPy5maWx0ZXIgfHwgdGhpcy5maWx0ZXI7XHJcbiAgICB0aGlzLmV4dGVybmFsRmlsdGVyID0gcGFyYW0/LmV4dGVybmFsRmlsdGVyIHx8IHRoaXMuZXh0ZXJuYWxGaWx0ZXI7XHJcbiAgICB0aGlzLiNwYWdpbmF0b3IucGFnZUluZGV4ID0gMDtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICB0aGlzLnJlbG9hZCh0aGlzLmxvY2FsSXRlbXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZWxvYWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gQ2hlY2thYmxlXHJcblxyXG4gICNzZXRTZWxlY3RlZEl0ZW1zID0gKCkgPT4ge1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gdGhpcy5pdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlzQ2hlY2tlZClcclxuICAgICAgLm1hcChpdGVtID0+IHtcclxuICAgICAgICBjb25zdCB7IHRlbXBvcmFyeSxcclxuICAgICAgICAgIG9yaWdpbkl0ZW0sXHJcbiAgICAgICAgICBlZGl0b3JIYW5kbGVyLFxyXG4gICAgICAgICAgZWRpdGluZ1N0YXR1cyxcclxuICAgICAgICAgIGlzQ2hlY2tlZCxcclxuICAgICAgICAgIHN1YkluZm9ybWF0aW9uLFxyXG4gICAgICAgICAgYmxpbmtlcixcclxuICAgICAgICAgIC4uLnJlc3VsdCB9ID0gaXRlbTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQ2hlY2sgPSAoaXRlbTogR3JpZEl0ZW0sIGlzQ2hlY2tib3g/OiBib29sZWFuKSA9PiB7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbi5jaGVja2FibGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc0NoZWNrYm94KSB7XHJcbiAgICAgIGl0ZW0uaXNDaGVja2VkID0gIWl0ZW0uaXNDaGVja2VkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0NoZWNrZWRBbGwgPSB0aGlzLml0ZW1zLmxlbmd0aCA9PT0gdGhpcy5pdGVtcy5maWx0ZXIoZSA9PiBlLmlzQ2hlY2tlZCkubGVuZ3RoO1xyXG4gICAgdGhpcy5ncmlkT3B0aW9uLm9uQ2hlY2s/Lih0aGlzLml0ZW1zLmZpbHRlcihlID0+IGUuaXNDaGVja2VkKSwgaXRlbSk7XHJcbiAgICB0aGlzLiNzZXRTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICBjaGVja0FsbChpc0NoZWNrZWRBbGw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNDaGVja2VkQWxsID0gaXNDaGVja2VkQWxsO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5pc0NoZWNrZWQgPSB0aGlzLmlzQ2hlY2tlZEFsbCk7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLm9uQ2hlY2spIHtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9uLm9uQ2hlY2sodGhpcy5pdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlzQ2hlY2tlZCkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy4jc2V0U2VsZWN0ZWRJdGVtcygpO1xyXG4gIH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBTb3J0XHJcbiAgc29ydCA9IChjb2x1bW46IFNkR3JpZENvbHVtbikgPT4ge1xyXG4gICAgaWYgKGNvbHVtbi50eXBlID09PSAnY2hpbGRyZW4nIHx8IGNvbHVtbi50eXBlID09PSAnaW1hZ2UnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNvcnRhYmxlID0gdGhpcy5ncmlkT3B0aW9uLnNvcnRhYmxlID8/IHRydWU7XHJcbiAgICBjb25zdCBjb2x1bW5Tb3J0YWJsZSA9IGNvbHVtbi5zb3J0YWJsZSA/PyB0cnVlO1xyXG4gICAgaWYgKCFzb3J0YWJsZSB8fCAhY29sdW1uU29ydGFibGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3JkZXJCeSA9PT0gY29sdW1uLmZpZWxkKSB7XHJcbiAgICAgIHRoaXMub3JkZXJEaXJlY3Rpb24gPSB0aGlzLm9yZGVyRGlyZWN0aW9uID09PSAnQVNDJyA/ICdERVNDJyA6ICdBU0MnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcmRlckJ5ID0gY29sdW1uLmZpZWxkO1xyXG4gICAgICB0aGlzLm9yZGVyRGlyZWN0aW9uID0gJ0FTQyc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdsb2NhbCcpIHtcclxuICAgICAgdGhpcy5yZWxvYWQodGhpcy5sb2NhbEl0ZW1zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVsb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIFJlc2l6ZSBHcmlkXHJcbiAgcHJpdmF0ZSByZXNpemUoKSB7XHJcbiAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb24uaGVpZ2h0KSB7XHJcbiAgICAgIHRoaXMuZ3JpZEJvZHkubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmdyaWRPcHRpb24uaGVpZ2h0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkQm9keS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3dpbmRvdy5pbm5lckhlaWdodCAtIDMwMH1weGA7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vIEzhuqV5IG9mZnNldCB0b3AgxJHhu4MgxJFp4buBdSBjaOG7iW5oIGvDrWNoIHRoxrDhu5tjIEdyaWQgduG7q2EgduG7m2kgbcOgbiBow6xuaFxyXG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuZ3JpZEJvZHkubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XHJcbiAgICAgICAgLy8gY29uc3QgdG9wID0gJCh0aGlzLmdyaWRCb2R5Lm5hdGl2ZUVsZW1lbnQpLm9mZnNldCgpLnRvcDtcclxuICAgICAgICBjb25zdCBib3R0b20gPSB0aGlzLmdyaWRPcHRpb24uaGlkZUZvb3RlciA/IDAgOiAodGhpcy5pc01vYmlsZU9yVGFibGV0ID8gNDUgOiA1NSk7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gdG9wIC0gYm90dG9tO1xyXG4gICAgICAgIHRoaXMuZ3JpZEJvZHkubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICB9LCAwKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gTOG6pXkgb2Zmc2V0IHRvcCDEkeG7gyDEkWnhu4F1IGNo4buJbmgga8OtY2ggdGjGsOG7m2MgR3JpZCB24burYSB24bubaSBtw6BuIGjDrG5oXHJcbiAgICAgICAgY29uc3QgdG9wID0gdGhpcy5ncmlkQm9keS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuICAgICAgICAvLyBjb25zdCB0b3AgPSAkKHRoaXMuZ3JpZEJvZHkubmF0aXZlRWxlbWVudCkub2Zmc2V0KCkudG9wO1xyXG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuZ3JpZE9wdGlvbi5oaWRlRm9vdGVyID8gMCA6ICh0aGlzLmlzTW9iaWxlT3JUYWJsZXQgPyA0NSA6IDU1KTtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0b3AgLSBib3R0b207XHJcbiAgICAgICAgdGhpcy5ncmlkQm9keS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcbiAgICAgIH0sIDIwMCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vIEzhuqV5IG9mZnNldCB0b3AgxJHhu4MgxJFp4buBdSBjaOG7iW5oIGvDrWNoIHRoxrDhu5tjIEdyaWQgduG7q2EgduG7m2kgbcOgbiBow6xuaFxyXG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuZ3JpZEJvZHkubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XHJcbiAgICAgICAgLy8gY29uc3QgdG9wID0gJCh0aGlzLmdyaWRCb2R5Lm5hdGl2ZUVsZW1lbnQpLm9mZnNldCgpLnRvcDtcclxuICAgICAgICBjb25zdCBib3R0b20gPSB0aGlzLmdyaWRPcHRpb24uaGlkZUZvb3RlciA/IDAgOiAodGhpcy5pc01vYmlsZU9yVGFibGV0ID8gNDUgOiA1NSk7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gdG9wIC0gYm90dG9tO1xyXG4gICAgICAgIHRoaXMuZ3JpZEJvZHkubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICB9LCA1MDApO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyBM4bqleSBvZmZzZXQgdG9wIMSR4buDIMSRaeG7gXUgY2jhu4luaCBrw61jaCB0aMaw4bubYyBHcmlkIHbhu6thIHbhu5tpIG3DoG4gaMOsbmhcclxuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLmdyaWRCb2R5Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgICAgIC8vIGNvbnN0IHRvcCA9ICQodGhpcy5ncmlkQm9keS5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS50b3A7XHJcbiAgICAgICAgY29uc3QgYm90dG9tID0gdGhpcy5ncmlkT3B0aW9uLmhpZGVGb290ZXIgPyAwIDogKHRoaXMuaXNNb2JpbGVPclRhYmxldCA/IDQ1IDogNTUpO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHRvcCAtIGJvdHRvbTtcclxuICAgICAgICB0aGlzLmdyaWRCb2R5Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRIZWlnaHQoaGVpZ2h0Pzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmdyaWRPcHRpb24uaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgdGhpcy5yZXNpemUoKTtcclxuICB9XHJcblxyXG4gIC8vICNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEltcG9ydCwgRXhwb3J0LCBDb25maWdcclxuXHJcbiAgbG9hZENvbmZpZyhjb25maWdSZXN1bHQ6IENvbmZpZ1Jlc3VsdCkge1xyXG4gICAgdGhpcy5ncmlkT3B0aW9uLnBhZ2luYXRlLnBhZ2VTaXplID0gY29uZmlnUmVzdWx0LnBhZ2VTaXplO1xyXG4gICAgdGhpcy5ncmlkT3B0aW9uLmNvbHVtbnMgPSBjb25maWdSZXN1bHQuY29sdW1ucztcclxuICAgIHRoaXMuZml4ZWRDb2x1bW5zID0gY29uZmlnUmVzdWx0LmZpeGVkQ29sdW1ucztcclxuICAgIHRoaXMubm9ybWFsQ29sdW1ucyA9IGNvbmZpZ1Jlc3VsdC5ub3JtYWxDb2x1bW5zO1xyXG4gICAgdGhpcy5jb2x1bW5zID0gWy4uLnRoaXMuZml4ZWRDb2x1bW5zLCAuLi50aGlzLm5vcm1hbENvbHVtbnNdO1xyXG4gICAgdGhpcy5pbml0RmlsdGVyKCk7XHJcbiAgICB0aGlzLmluaXREaWN0aW9uYXJ5Q29sdW1uVmFsdWVzKCk7XHJcbiAgICB0aGlzLnJlbG9hZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0RmlsdGVyKCkge1xyXG4gICAgdGhpcy5ncmlkT3B0aW9uLmNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAvLyBHw6FuIGdpw6EgdHLhu4sgZmlsdGVyIG3hurdjIMSR4buLbmggY2hvIHThu6tuZyBj4buZdFxyXG4gICAgICB0aGlzLmZpbHRlcltjb2x1bW4uZmllbGRdID0gdGhpcy5maWx0ZXJbY29sdW1uLmZpZWxkXSA/PyAnJztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0RGljdGlvbmFyeUNvbHVtblZhbHVlcygpIHtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbi5jb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAndmFsdWVzJykge1xyXG4gICAgICAgIGNvbHVtbi5kaWN0aW9uYXJ5ID0ge307XHJcbiAgICAgICAgaWYgKGNvbHVtbi52YWx1ZXMpIHtcclxuICAgICAgICAgIGNvbHVtbi52YWx1ZXMuZm9yRWFjaChlID0+IHtcclxuICAgICAgICAgICAgY29sdW1uLmRpY3Rpb25hcnlbZS52YWx1ZS50b1N0cmluZygpXSA9IHtcclxuICAgICAgICAgICAgICB0ZXh0OiBlLnRleHQsXHJcbiAgICAgICAgICAgICAgaWNvbjogZS5pY29uLFxyXG4gICAgICAgICAgICAgIGNvbG9yOiBlLmNvbG9yLFxyXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogZS5iYWNrZ3JvdW5kQ29sb3JcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdjaGlsZHJlbicpIHtcclxuICAgICAgICBjb2x1bW4uY2hpbGRyZW4uZm9yRWFjaChjaGlsZENvbHVtbiA9PiB7XHJcbiAgICAgICAgICBpZiAoY2hpbGRDb2x1bW4udHlwZSA9PT0gJ3ZhbHVlcycpIHtcclxuICAgICAgICAgICAgY2hpbGRDb2x1bW4uZGljdGlvbmFyeSA9IHt9O1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRDb2x1bW4udmFsdWVzKSB7XHJcbiAgICAgICAgICAgICAgY2hpbGRDb2x1bW4udmFsdWVzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZENvbHVtbi5kaWN0aW9uYXJ5W2UudmFsdWUudG9TdHJpbmcoKV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgIHRleHQ6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgaWNvbjogZS5pY29uLFxyXG4gICAgICAgICAgICAgICAgICBjb2xvcjogZS5jb2xvcixcclxuICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBlLmJhY2tncm91bmRDb2xvclxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlRWRpdG9ySGFuZGxlcnMoKSB7XHJcbiAgICB0aGlzLnZpZXdJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICB0aGlzLmdlbmVyYXRlRWRpdG9ySGFubGRlcihpdGVtKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUVkaXRvckhhbmxkZXIoaXRlbTogR3JpZEl0ZW0pIHtcclxuICAgIC8vIGl0ZW0uZWRpdG9ySGFuZGxlciA9IGl0ZW0uZWRpdG9ySGFuZGxlciB8fCB7fTtcclxuICAgIHRoaXMuZWRpdG9yVmlzaWJsZVBpcGUudHJhbnNmb3JtKG51bGwsIGl0ZW0sIHRoaXMuZ3JpZE9wdGlvbik7XHJcbiAgfVxyXG4gIHRyYWNrQnlJZChpbmRleCwgaXRlbSkge1xyXG4gICAgcmV0dXJuIGl0ZW0uaWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNGaWx0ZXJpbmcoKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmZpbHRlcikuc29tZSh2YWx1ZSA9PiAhIXZhbHVlKTtcclxuICB9XHJcblxyXG4gIG9uRmlsdGVyUG9wdXAoKSB7XHJcbiAgICBjb25zdCBmMSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZmlsdGVyKTtcclxuICAgIGNvbnN0IGYyID0gSlNPTi5zdHJpbmdpZnkodGhpcy5leHRlcm5hbEZpbHRlcik7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSBKU09OLnBhcnNlKGYxKTtcclxuICAgIGNvbnN0IGV4dGVybmFsRmlsdGVyID0gSlNPTi5wYXJzZShmMik7XHJcbiAgICB0aGlzLnNkR3JpZFBvcHVwRmlsdGVyLm9wZW4odGhpcy5maXhlZENvbHVtbnMsIHRoaXMubm9ybWFsQ29sdW1ucywgZmlsdGVyLCBleHRlcm5hbEZpbHRlciwgdGhpcy5ncmlkT3B0aW9uLmZpbHRlcj8uZXh0ZXJuYWxGaWx0ZXJzKTtcclxuICB9XHJcblxyXG4gIGNsZWFyRmlsdGVyID0gKCkgPT4ge1xyXG4gICAgdGhpcy5maWx0ZXIgPSB7fTtcclxuICAgIHRoaXMuZXh0ZXJuYWxGaWx0ZXIgPSB7fTtcclxuICAgIHRoaXMuaW5pdEZpbHRlcigpO1xyXG4gICAgdGhpcy5pbml0RXh0ZXJuYWxGaWx0ZXIoKTtcclxuICAgIGlmICh0aGlzLnNkR3JpZFBvcHVwRmlsdGVyKSB7XHJcbiAgICAgIHRoaXMuc2RHcmlkUG9wdXBGaWx0ZXIuZmlsdGVyID0gdGhpcy5maWx0ZXI7XHJcbiAgICAgIHRoaXMuc2RHcmlkUG9wdXBGaWx0ZXIuZXh0ZXJuYWxGaWx0ZXIgPSB0aGlzLmV4dGVybmFsRmlsdGVyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DbGVhckZpbHRlciA9ICgpID0+IHtcclxuICAgIHRoaXMuY2xlYXJGaWx0ZXIoKTtcclxuICAgIHRoaXMucmVsb2FkKCk7XHJcbiAgfVxyXG5cclxuICBleHBhbmRPckNvbGxhcHNlID0gYXN5bmMgKGdyaWRJdGVtOiBHcmlkSXRlbSkgPT4ge1xyXG4gICAgY29uc3QgeyB0ZW1wb3JhcnksXHJcbiAgICAgIG9yaWdpbkl0ZW0sXHJcbiAgICAgIGVkaXRvckhhbmRsZXIsXHJcbiAgICAgIGVkaXRpbmdTdGF0dXMsXHJcbiAgICAgIGlzQ2hlY2tlZCxcclxuICAgICAgc3ViSW5mb3JtYXRpb24sXHJcbiAgICAgIC4uLml0ZW0gfSA9IGdyaWRJdGVtO1xyXG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb24uc3ViSW5mb3JtYXRpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGdyaWRJdGVtLnN1YkluZm9ybWF0aW9uPy5pc09wZW5lZCkge1xyXG4gICAgICBncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5pc09wZW5lZCA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnN1YkluZm9ybWF0aW9uLmxhenlMb2FkaW5nICYmICFncmlkSXRlbS5zdWJJbmZvcm1hdGlvbj8uaXNMb2FkZWQpIHtcclxuICAgICAgZ3JpZEl0ZW0uc3ViSW5mb3JtYXRpb24uaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5zdWJJdGVtcyA9IGF3YWl0IHRoaXMuZ3JpZE9wdGlvbi5zdWJJbmZvcm1hdGlvbi5vbkxvYWQoaXRlbSk7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGdyaWRJdGVtLnN1YkluZm9ybWF0aW9uLnN1Ykl0ZW1zKSkge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLmFsZXJ0Lndhcm5pbmcoYERhdGEgaXMgbm90IGFuIGFycmF5YCk7XHJcbiAgICAgICAgICBncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5zdWJJdGVtcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgZ3JpZEl0ZW0uc3ViSW5mb3JtYXRpb24uaXNPcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLmhhbmRsZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIGdyaWRJdGVtLnN1YkluZm9ybWF0aW9uLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnN1YkluZm9ybWF0aW9uLmxhenlMb2FkaW5nID09PSBmYWxzZSAmJiAhZ3JpZEl0ZW0uc3ViSW5mb3JtYXRpb24uaXNMb2FkZWQpIHtcclxuICAgICAgZ3JpZEl0ZW0uc3ViSW5mb3JtYXRpb24uc3ViSXRlbXMgPSBncmlkSXRlbVt0aGlzLmdyaWRPcHRpb24uc3ViSW5mb3JtYXRpb24uZmllbGRdO1xyXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZ3JpZEl0ZW0uc3ViSW5mb3JtYXRpb24uc3ViSXRlbXMpKSB7XHJcbiAgICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLmFsZXJ0Lndhcm5pbmcoYERhdGEgaXMgbm90IGFuIGFycmF5YCk7XHJcbiAgICAgICAgZ3JpZEl0ZW0uc3ViSW5mb3JtYXRpb24uc3ViSXRlbXMgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICBncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgIGdyaWRJdGVtLnN1YkluZm9ybWF0aW9uLmlzT3BlbmVkID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZ3JpZEl0ZW0uc3ViSW5mb3JtYXRpb24uaXNPcGVuZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICAvLyNyZWdpb24gRWRpdGFibGVcclxuICBvbkNyZWF0ZSA9ICgpID0+IHtcclxuICAgIGNvbnN0IHsgdHlwZSwgZWRpdG9yLCBjb2x1bW5zIH0gPSB0aGlzLmdyaWRPcHRpb247XHJcbiAgICBpZiAoIWVkaXRvcj8uYWRkYWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtOiBHcmlkSXRlbSA9IHt9O1xyXG4gICAgLy8gR8OhbiBnacOhIHRy4buLIG3hurdjIMSR4buLbmhcclxuICAgIGNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICd2YWx1ZXMnKSB7XHJcbiAgICAgICAgaXRlbVtjb2x1bW4uZmllbGRdID0gJyc7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdib29sJykge1xyXG4gICAgICAgIGl0ZW1bY29sdW1uLmZpZWxkXSA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgaXRlbVtjb2x1bW4uZmllbGRdID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBlZGl0b3Iub25BZGQ/LihpdGVtKTtcclxuICAgIC8vIMSQxrBhIGl0ZW0gbMOqbiBkw7JuZyDEkeG6p3UgdGnDqm4gbuG6v3UgdHlwZSBraMOhYyBwb3B1cFxyXG4gICAgaWYgKGVkaXRvci50eXBlICE9PSAncG9wdXAnKSB7XHJcbiAgICAgIGlmICh0eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoMCwgMCwgaXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy52aWV3SXRlbXMuc3BsaWNlKDAsIDAsIGl0ZW0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vblVwZGF0ZShpdGVtLCBmYWxzZSk7XHJcbiAgfVxyXG4gIG9uVXBkYXRlID0gKGl0ZW06IEdyaWRJdGVtLCBpc01vZGlmaWVkPzogYm9vbGVhbikgPT4ge1xyXG4gICAgY29uc3QgeyBlZGl0b3IsIGNvbHVtbnMgfSA9IHRoaXMuZ3JpZE9wdGlvbjtcclxuICAgIGl0ZW0uZWRpdGluZ1N0YXR1cyA9IGlzTW9kaWZpZWQgPyAndXBkYXRlJyA6ICdjcmVhdGUnO1xyXG4gICAgaXRlbS50ZW1wb3JhcnkgPSB7IC4uLml0ZW0gfTtcclxuICAgIHRoaXMuZ2VuZXJhdGVFZGl0b3JIYW5sZGVyKGl0ZW0pO1xyXG4gICAgaWYgKGVkaXRvci50eXBlID09PSAncG9wdXAnKSB7XHJcbiAgICAgIHRoaXMuc2RHcmlkUG9wdXBFZGl0b3Iub3BlbihpdGVtLCBjb2x1bW5zLCBpc01vZGlmaWVkKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgb25TYXZlID0gYXN5bmMgKGl0ZW06IEdyaWRJdGVtKSA9PiB7XHJcbiAgICBjb25zdCB7IGVkaXRvciB9ID0gdGhpcy5ncmlkT3B0aW9uO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaXRlbS5lZGl0b3JIYW5kbGVyLnNhdmluZyA9IHRydWU7XHJcbiAgICAgIGlmIChlZGl0b3IudmFsaWRhdGUpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBlZGl0b3IudmFsaWRhdGUoaXRlbSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCByZXN1bHQ7XHJcbiAgICAgICAgICBpZiAobWVzc2FnZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBtZXNzYWdlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlc3VsdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGVkaXRvci5vblNhdmUpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBlZGl0b3Iub25TYXZlKGl0ZW0pO1xyXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICBhd2FpdCByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXRlbS5lZGl0aW5nU3RhdHVzID09PSAnY3JlYXRlJyAmJiBlZGl0b3IudHlwZSA9PT0gJ3BvcHVwJykge1xyXG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoMCwgMCwgaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmlld0l0ZW1zLnNwbGljZSgwLCAwLCBpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaXRlbS5lZGl0aW5nU3RhdHVzID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmdlbmVyYXRlRWRpdG9ySGFubGRlcihpdGVtKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB0aGlzLm5vdGlmeVNlcnZpY2Uubm90aWZ5Lndhcm5pbmcoZXJyKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGl0ZW0uZWRpdG9ySGFuZGxlci5zYXZpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DYW5jZWwgPSAoaXRlbTogR3JpZEl0ZW0pID0+IHtcclxuICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzLmdyaWRPcHRpb247XHJcbiAgICBpZiAoZWRpdG9yLnR5cGUgPT09ICdpbmxpbmUnKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICAgIGNvbnN0IGlkeDEgPSB0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSk7XHJcbiAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaWR4MSwgMSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaWR4MiA9IHRoaXMudmlld0l0ZW1zLmluZGV4T2YoaXRlbSk7XHJcbiAgICAgIHRoaXMudmlld0l0ZW1zLnNwbGljZShpZHgyLCAxKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGl0ZW0uZWRpdGluZ1N0YXR1cyA9PT0gJ2NyZWF0ZScpIHtcclxuICAgICAgaWYgKGVkaXRvci50eXBlICE9PSAncG9wdXAnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZSgwLCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52aWV3SXRlbXMuc3BsaWNlKDAsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBPYmplY3QuYXNzaWduKGl0ZW0sIGl0ZW0udGVtcG9yYXJ5KTtcclxuICAgICAgaXRlbS5lZGl0aW5nU3RhdHVzID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmdlbmVyYXRlRWRpdG9ySGFubGRlcihpdGVtKTtcclxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0RXh0ZXJuYWxGaWx0ZXIgPSAoKSA9PiB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLmZpbHRlcj8uZXh0ZXJuYWxGaWx0ZXJzPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5ncmlkT3B0aW9uLmZpbHRlci5leHRlcm5hbEZpbHRlcnMuZm9yRWFjaChleHRlcm5hbEZpbHRlciA9PiB7XHJcbiAgICAgICAgaWYgKGV4dGVybmFsRmlsdGVyLnR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBpZiAoZXh0ZXJuYWxGaWx0ZXIuZGVmYXVsdCkge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVybmFsRmlsdGVyW2V4dGVybmFsRmlsdGVyLmZpZWxkXSA9IGV4dGVybmFsRmlsdGVyLmRlZmF1bHQgPz8gJyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChleHRlcm5hbEZpbHRlci50eXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgaWYgKGV4dGVybmFsRmlsdGVyLmRlZmF1bHQpIHtcclxuICAgICAgICAgICAgdGhpcy5leHRlcm5hbEZpbHRlcltleHRlcm5hbEZpbHRlci5maWVsZF0gPSBleHRlcm5hbEZpbHRlci5kZWZhdWx0ID8/IHVuZGVmaW5lZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV4dGVybmFsRmlsdGVyLnR5cGUgPT09ICdkYXRlcmFuZ2UnKSB7XHJcbiAgICAgICAgICB0aGlzLmV4dGVybmFsRmlsdGVyW2V4dGVybmFsRmlsdGVyLmZpZWxkXSA9IHtcclxuICAgICAgICAgICAgZnJvbTogZXh0ZXJuYWxGaWx0ZXIuZGVmYXVsdEZyb20gPz8gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB0bzogZXh0ZXJuYWxGaWx0ZXIuZGVmYXVsdFRvID8/IHVuZGVmaW5lZFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV4dGVybmFsRmlsdGVyLnR5cGUgPT09ICdudW1iZXJyYW5nZScpIHtcclxuICAgICAgICAgIHRoaXMuZXh0ZXJuYWxGaWx0ZXJbZXh0ZXJuYWxGaWx0ZXIuZmllbGRdID0ge1xyXG4gICAgICAgICAgICBmcm9tOiBleHRlcm5hbEZpbHRlci5kZWZhdWx0RnJvbSA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRvOiBleHRlcm5hbEZpbHRlci5kZWZhdWx0VG8gPz8gdW5kZWZpbmVkXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXh0ZXJuYWxGaWx0ZXIudHlwZSA9PT0gJ2RhdGVyYW5nZWZ1bGwnKSB7XHJcbiAgICAgICAgICB0aGlzLmV4dGVybmFsRmlsdGVyW2V4dGVybmFsRmlsdGVyLmZpZWxkXSA9IHtcclxuICAgICAgICAgICAgZnJvbTogZXh0ZXJuYWxGaWx0ZXIuZGVmYXVsdEZyb20gPz8gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB0bzogZXh0ZXJuYWxGaWx0ZXIuZGVmYXVsdFRvID8/IHVuZGVmaW5lZFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV4dGVybmFsRmlsdGVyLnR5cGUgPT09ICd2YWx1ZXMnKSB7IC8vIGFuZG4xXHJcbiAgICAgICAgICBpZiAoZXh0ZXJuYWxGaWx0ZXIuZGVmYXVsdCkge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVybmFsRmlsdGVyW2V4dGVybmFsRmlsdGVyLmZpZWxkXSA9IGV4dGVybmFsRmlsdGVyLmRlZmF1bHQgPz8gJyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBvblNlYXJjaCA9IChzZWFyY2hWYWx1ZTogc3RyaW5nLCBpdGVtOiBHcmlkSXRlbSwgY29sdW1uOiBTZEdyaWRDb2x1bW4pID0+IHtcclxuICAgIGl0ZW1bY29sdW1uLmZpZWxkXSA9IHNlYXJjaFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgb25GaWx0ZXJDb25maWd1cmF0aW9uTG9hZGVkID0gKHBhcmFtOiBGaWx0ZXJDb25maWd1cmF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLnF1aWNrRmlsdGVycyA9IHBhcmFtLnF1aWNrRmlsdGVycyB8fCBbXTtcclxuICAgIHRoaXMuc2VsZWN0ZWRRdWlja0ZpbHRlciA9IHBhcmFtLnNlbGVjdGVkUXVpY2tGaWx0ZXIgfHwgJyc7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFF1aWNrRmlsdGVyKSB7XHJcbiAgICAgIGNvbnN0IHF1aWNrRmlsdGVyID0gdGhpcy5xdWlja0ZpbHRlcnMuZmluZChlID0+IGUuY29kZSA9PT0gdGhpcy5zZWxlY3RlZFF1aWNrRmlsdGVyKTtcclxuICAgICAgaWYgKHF1aWNrRmlsdGVyKSB7XHJcbiAgICAgICAgY29uc3QgZjEgPSBKU09OLnN0cmluZ2lmeShxdWlja0ZpbHRlci5maWx0ZXIpO1xyXG4gICAgICAgIGNvbnN0IGYyID0gSlNPTi5zdHJpbmdpZnkocXVpY2tGaWx0ZXIuZXh0ZXJuYWxGaWx0ZXIpO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyID0gSlNPTi5wYXJzZShmMSk7XHJcbiAgICAgICAgdGhpcy5leHRlcm5hbEZpbHRlciA9IHRoaXMucmVmcmVzaEV4dGVybmFsRmlsdGVyKHRoaXMuZ3JpZE9wdGlvbj8uZmlsdGVyPy5leHRlcm5hbEZpbHRlcnMsIEpTT04ucGFyc2UoZjIpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5pbmxpbmVFeHRlcm5hbCA9IHBhcmFtLmlubGluZUV4dGVybmFsIHx8IHt9O1xyXG4gICAgdGhpcy5pbmxpbmVDb2x1bW4gPSBwYXJhbS5pbmxpbmVDb2x1bW4gfHwge307XHJcbiAgICB0aGlzLnJlc2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RRdWlja0ZpbHRlciA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBxdWlja0ZpbHRlciA9IHRoaXMucXVpY2tGaWx0ZXJzLmZpbmQoZSA9PiBlLmNvZGUgPT09IHZhbHVlKTtcclxuICAgIGlmIChxdWlja0ZpbHRlcj8uY29kZSkge1xyXG4gICAgICBjb25zdCBmMSA9IEpTT04uc3RyaW5naWZ5KHF1aWNrRmlsdGVyLmZpbHRlcik7XHJcbiAgICAgIGNvbnN0IGYyID0gSlNPTi5zdHJpbmdpZnkocXVpY2tGaWx0ZXIuZXh0ZXJuYWxGaWx0ZXIpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUXVpY2tGaWx0ZXIgPSBxdWlja0ZpbHRlcj8uY29kZTtcclxuICAgICAgdGhpcy5maWx0ZXIgPSBKU09OLnBhcnNlKGYxKTtcclxuICAgICAgdGhpcy5leHRlcm5hbEZpbHRlciA9IHRoaXMucmVmcmVzaEV4dGVybmFsRmlsdGVyKHRoaXMuZ3JpZE9wdGlvbj8uZmlsdGVyPy5leHRlcm5hbEZpbHRlcnMsIEpTT04ucGFyc2UoZjIpKTtcclxuICAgICAgdGhpcy51cGRhdGVGaWx0ZXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWlja0ZpbHRlciA9ICcnO1xyXG4gICAgICB0aGlzLm9uQ2xlYXJGaWx0ZXIoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2RHcmlkUG9wdXBGaWx0ZXI/LnVwZGF0ZUNvbmZpZ3VyYXRpb24odGhpcy5zZWxlY3RlZFF1aWNrRmlsdGVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RXhwb3J0SXRlbXMgPSBhc3luYyAocGFnZU51bWJlcjogbnVtYmVyID0gMSwgcGFnZVNpemU6IG51bWJlciA9IDEwMDAwKSA9PiB7XHJcbiAgICBpZiAodGhpcy5pc0xvYWRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlICE9PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlciBhcyBJSGFuZGxlclNlcnZlcjtcclxuICAgICAgICBjb25zdCBmaWx0ZXIgPSBoYW5kbGVyLm1hcFJlcXVlc3QodGhpcy5nZXRGaWx0ZXJJbmZvKHBhZ2VOdW1iZXIsIHBhZ2VTaXplKSk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi5tZXRob2QgPT09ICdHRVQnKSB7XHJcbiAgICAgICAgICBjb25zdCBxdWVyeVN0cmluZyA9IE9iamVjdC5rZXlzKGZpbHRlcikuZmlsdGVyKGtleSA9PiBmaWx0ZXJba2V5XSAhPT0gbnVsbCAmJiBmaWx0ZXJba2V5XSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAubWFwKGtleSA9PiBrZXkgKyAnPScgKyBmaWx0ZXJba2V5XSkuam9pbignJicpO1xyXG4gICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5ncmlkT3B0aW9uLnVybC5pbmNsdWRlcygnPycpID8gYCR7dGhpcy5ncmlkT3B0aW9uLnVybH0mJHtxdWVyeVN0cmluZ31gIDogYCR7dGhpcy5ncmlkT3B0aW9uLnVybH0/JHtxdWVyeVN0cmluZ31gO1xyXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UuZ2V0KHVybCk7XHJcbiAgICAgICAgICByZXR1cm4gaGFuZGxlci5tYXBSZXNwb25zZShyZXNwb25zZSkuaXRlbXM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hcGlTZXJ2aWNlLnBvc3QodGhpcy5ncmlkT3B0aW9uLnVybCwgZmlsdGVyKTtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVyLm1hcFJlc3BvbnNlKHJlc3BvbnNlKS5pdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGxvY2FsSXRlbXMgPSBbXTtcclxuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyIGFzIElIYW5kbGVyTG9jYWw7XHJcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5ncmlkT3B0aW9uLml0ZW1zKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcygpO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdHMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgIGxvY2FsSXRlbXMgPSBhd2FpdCByZXN1bHRzO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbG9jYWxJdGVtcyA9IHJlc3VsdHM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxvY2FsSXRlbXMgPSB0aGlzLmdyaWRPcHRpb24uaXRlbXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gaGFuZGxlci5maWx0ZXIobG9jYWxJdGVtcywge1xyXG4gICAgICAgICAgY3VzdG9tRmlsdGVyOiB0aGlzLmdyaWRPcHRpb24uZmlsdGVyLmN1c3RvbUZpbHRlcixcclxuICAgICAgICAgIHJhd0ZpbHRlcjogdGhpcy5maWx0ZXIsXHJcbiAgICAgICAgICBjb2x1bW5zOiB0aGlzLmdyaWRPcHRpb24uY29sdW1ucyxcclxuICAgICAgICAgIHJhd0V4dGVybmFsRmlsdGVyOiB0aGlzLmV4dGVybmFsRmlsdGVyLFxyXG4gICAgICAgICAgZXh0ZXJuYWxGaWx0ZXJzOiB0aGlzLmdyaWRPcHRpb24uZmlsdGVyPy5leHRlcm5hbEZpbHRlcnMsXHJcbiAgICAgICAgICBvcmRlckJ5OiB0aGlzLm9yZGVyQnksXHJcbiAgICAgICAgICBvcmRlckRpcmVjdGlvbjogdGhpcy5vcmRlckRpcmVjdGlvbixcclxuICAgICAgICAgIHBhZ2VOdW1iZXIsXHJcbiAgICAgICAgICBwYWdlU2l6ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZS5pdGVtcztcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLmhhbmRsZS5lcnJvcihlcnJvcik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpbHRlckluZm8gPSAocGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyKTogU2RHcmlkRmlsdGVySW5mbyA9PiB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcikpIHtcclxuICAgICAgaWYgKHR5cGVvZiAodGhpcy5maWx0ZXJba2V5XSkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJba2V5XSA9IHRoaXMuZmlsdGVyW2tleV0udHJpbSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmV4dGVybmFsRmlsdGVyKSkge1xyXG4gICAgICBpZiAodHlwZW9mICh0aGlzLmV4dGVybmFsRmlsdGVyW2tleV0pID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRoaXMuZXh0ZXJuYWxGaWx0ZXJba2V5XSA9IHRoaXMuZXh0ZXJuYWxGaWx0ZXJba2V5XS50cmltKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGN1c3RvbUZpbHRlcjogdGhpcy5ncmlkT3B0aW9uLmZpbHRlci5jdXN0b21GaWx0ZXIsXHJcbiAgICAgIHJhd0ZpbHRlcjogdGhpcy5maWx0ZXIsXHJcbiAgICAgIGNvbHVtbnM6IHRoaXMuZ3JpZE9wdGlvbi5jb2x1bW5zLFxyXG4gICAgICByYXdFeHRlcm5hbEZpbHRlcjogdGhpcy5leHRlcm5hbEZpbHRlcixcclxuICAgICAgZXh0ZXJuYWxGaWx0ZXJzOiB0aGlzLmdyaWRPcHRpb24uZmlsdGVyPy5leHRlcm5hbEZpbHRlcnMsXHJcbiAgICAgIG9yZGVyQnk6IHRoaXMub3JkZXJCeSxcclxuICAgICAgb3JkZXJEaXJlY3Rpb246IHRoaXMub3JkZXJEaXJlY3Rpb24sXHJcbiAgICAgIHBhZ2VOdW1iZXIsXHJcbiAgICAgIHBhZ2VTaXplXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgb25FeHBvcnRCeVRlbXBsYXRlID0gYXN5bmMgKHBhcmFtczogeyBleGNlbENvbmZpZzogRXhjZWxDb25maWcsIGV4Y2VsQ29sdW1uczogRXhjZWxUZW1wYXRlQ29sdW1uW10gfSkgPT4ge1xyXG4gICAgdGhpcy5sb2FkaW5nU2VydmljZS5zdGFydCgpO1xyXG4gICAgbGV0IGV4cG9ydEl0ZW1zID0gW107XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8uaXRlbXMpIHtcclxuICAgICAgZXhwb3J0SXRlbXMgPSBhd2FpdCB0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5pdGVtcyh0aGlzLmdldEZpbHRlckluZm8oMSwgMTAwMDApKS5maW5hbGx5KHRoaXMubG9hZGluZ1NlcnZpY2Uuc3RvcCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBleHBvcnRJdGVtcyA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0SXRlbXMoKS5maW5hbGx5KHRoaXMubG9hZGluZ1NlcnZpY2Uuc3RvcCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8ubWFwcGluZykge1xyXG4gICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydC5tYXBwaW5nKGV4cG9ydEl0ZW1zLCBwYXJhbXMuZXhjZWxDb25maWcubmFtZSk7XHJcbiAgICAgIGlmIChyZXN1bHRzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgIGV4cG9ydEl0ZW1zID0gYXdhaXQgcmVzdWx0cztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBleHBvcnRJdGVtcyA9IHJlc3VsdHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGNvbHVtbnMgPSBbLi4udGhpcy5ncmlkT3B0aW9uLmNvbHVtbnMsIC4uLih0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5jb2x1bW5zIHx8IFtdKV07XHJcbiAgICBjb25zdCBpdGVtcyA9IGV4cG9ydEl0ZW1zLm1hcChpdGVtID0+IHtcclxuICAgICAgY29uc3Qgb2JqOiBhbnkgPSB7fTtcclxuICAgICAgY29uc3QgaGFuZGxlID0gKGNvbHVtbjogU2RHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAnY2hpbGRyZW4nKSB7XHJcbiAgICAgICAgICBjb2x1bW4uY2hpbGRyZW4uZm9yRWFjaChoYW5kbGUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnRyYW5zZm9ybSkge1xyXG4gICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4udHJhbnNmb3JtKGl0ZW1bY29sdW1uLmZpZWxkXSwgaXRlbSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtW2NvbHVtbi5maWVsZF0gPT09IHVuZGVmaW5lZCB8fCBpdGVtW2NvbHVtbi5maWVsZF0gPT09IG51bGwgfHwgaXRlbVtjb2x1bW4uZmllbGRdID09PSAnJykge1xyXG4gICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSAnJztcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnc3RyaW5nJyB8fCBjb2x1bW4udHlwZSA9PT0gJ251bWJlcicgfHwgY29sdW1uLnR5cGUgPT09ICdjb2xvcicpIHtcclxuICAgICAgICAgIC8vIE7hur91IGNlbGwgbMOgIHN0cmluZyBob+G6t2MgbnVtYmVyIHRow6wgZ8OhbiBi4bqxbmcgY2jDrW5oIG7Ds1xyXG4gICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBpdGVtW2NvbHVtbi5maWVsZF07XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2Jvb2wnKSB7XHJcbiAgICAgICAgICAvLyBO4bq/dSBsw6AgYm9vbCB0aMOsIGfDoW4gYuG6sW5nIGdpw6EgdHLhu4sgdHJ1ZVZhbHVlIHbDoCBmYWxzZVZhbHVlIChu4bq/dSBjw7MpLCBt4bq3YyDEkeG7i25oIGzDoCBUUlVFL0ZBTFNFXHJcbiAgICAgICAgICBpZiAoaXRlbVtjb2x1bW4uZmllbGRdKSB7XHJcbiAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gY29sdW1uLnRydWVWYWx1ZSB8fCAnVHJ1ZSc7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGNvbHVtbi5mYWxzZVZhbHVlIHx8ICdGYWxzZSc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAvLyBO4bq/dSBsw6AgZGF0ZSB0aMOsIGNvbnZlcnQgdGhlbyDEkcO6bmcgZm9ybWF0XHJcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXRlbVtjb2x1bW4uZmllbGRdKTtcclxuICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSwgJ2RkL01NL3l5eXknKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAvLyBO4bq/dSBsw6AgZGF0ZXRpbWUgdGjDrCBjb252ZXJ0IHRoZW8gxJHDum5nIGZvcm1hdFxyXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGl0ZW1bY29sdW1uLmZpZWxkXSk7XHJcbiAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICdkZC9NTS95eXl5IEhIOm1tOnNzJyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3RpbWUnKSB7XHJcbiAgICAgICAgICAvLyBO4bq/dSBsw6AgdGltZSB0aMOsIGNvbnZlcnQgdGhlbyDEkcO6bmcgZm9ybWF0XHJcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXRlbVtjb2x1bW4uZmllbGRdKTtcclxuICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSwgJ0hIOm1tOnNzJyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3ZhbHVlcycpIHtcclxuICAgICAgICAgIC8vIE7hur91IGzDoCB2YWx1ZXMgdGjDrCBs4bqleSBnacOhIHRy4buLIGPhu6dhIHZhbHVlIMSRxrDhu6NjIGNo4buNblxyXG4gICAgICAgICAgY29uc3QgZGF0YSA9IGNvbHVtbi52YWx1ZXMuZmluZChlID0+IGUudmFsdWUgPT09IGl0ZW1bY29sdW1uLmZpZWxkXSk7XHJcbiAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGRhdGEudGV4dDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdyYWRpbycpIHtcclxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb2x1bW4udmFsdWVzLmZpbmQoZSA9PiBlW2NvbHVtbi52YWx1ZUZpZWxkXSA9PT0gaXRlbVtjb2x1bW4uZmllbGRdKTtcclxuICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gZGF0YVtjb2x1bW4uZGlzcGxheUZpZWxkXTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgY29sdW1ucy5mb3JFYWNoKGhhbmRsZSk7XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZXhjZWxTZXJ2aWNlLmdlbmVyYXRlRXhjZWxEYXRhQnlUZW1wbGF0ZShwYXJhbXMuZXhjZWxDb25maWcuZnVsbFBhdGgsIHBhcmFtcy5leGNlbENvbHVtbnMsIGl0ZW1zLCBwYXJhbXMuZXhjZWxDb25maWcubmFtZSk7XHJcbiAgfVxyXG5cclxuICBiaWdFeHBvcnQgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBwYWdlU2l6ZSA9IDEwMDA7XHJcbiAgICBsZXQgcGFnZU51bWJlciA9IDE7XHJcbiAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnN0YXJ0KCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgZXhwb3J0SXRlbXMgPSBbXTtcclxuICAgICAgbGV0IGZpbGVQYXRoOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICBsZXQgZGVzdGluYXRpb246IHN0cmluZyA9IG51bGw7XHJcbiAgICAgIGxldCBsYXRlc3RSb3cgPSAwO1xyXG4gICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5pdGVtcykge1xyXG4gICAgICAgICAgZXhwb3J0SXRlbXMgPSBhd2FpdCB0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5pdGVtcyh0aGlzLmdldEZpbHRlckluZm8ocGFnZU51bWJlciwgcGFnZVNpemUpKS5maW5hbGx5KHRoaXMubG9hZGluZ1NlcnZpY2Uuc3RvcCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGV4cG9ydEl0ZW1zID0gYXdhaXQgdGhpcy5nZXRFeHBvcnRJdGVtcyhwYWdlTnVtYmVyLCBwYWdlU2l6ZSkuZmluYWxseSh0aGlzLmxvYWRpbmdTZXJ2aWNlLnN0b3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8ubWFwcGluZykge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JpZE9wdGlvbi5leHBvcnQubWFwcGluZyhleHBvcnRJdGVtcyk7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgZXhwb3J0SXRlbXMgPSBhd2FpdCByZXN1bHRzO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZXhwb3J0SXRlbXMgPSByZXN1bHRzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb2x1bW5zID0gWy4uLnRoaXMuZ3JpZE9wdGlvbi5jb2x1bW5zLCAuLi4odGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8uY29sdW1ucyB8fCBbXSldO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZXhwb3J0SXRlbXMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgY29uc3Qgb2JqOiBhbnkgPSB7fTtcclxuICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IChjb2x1bW46IFNkR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdjaGlsZHJlbicpIHtcclxuICAgICAgICAgICAgICBjb2x1bW4uY2hpbGRyZW4uZm9yRWFjaChoYW5kbGUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50cmFuc2Zvcm0pIHtcclxuICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGNvbHVtbi50cmFuc2Zvcm0oaXRlbVtjb2x1bW4uZmllbGRdLCBpdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtW2NvbHVtbi5maWVsZF0gPT09IHVuZGVmaW5lZCB8fCBpdGVtW2NvbHVtbi5maWVsZF0gPT09IG51bGwgfHwgaXRlbVtjb2x1bW4uZmllbGRdID09PSAnJykge1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gJyc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdzdHJpbmcnIHx8IGNvbHVtbi50eXBlID09PSAnbnVtYmVyJyB8fCBjb2x1bW4udHlwZSA9PT0gJ2NvbG9yJykge1xyXG4gICAgICAgICAgICAgIC8vIE7hur91IGNlbGwgbMOgIHN0cmluZyBob+G6t2MgbnVtYmVyIHRow6wgZ8OhbiBi4bqxbmcgY2jDrW5oIG7Ds1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnYm9vbCcpIHtcclxuICAgICAgICAgICAgICAvLyBO4bq/dSBsw6AgYm9vbCB0aMOsIGfDoW4gYuG6sW5nIGdpw6EgdHLhu4sgdHJ1ZVZhbHVlIHbDoCBmYWxzZVZhbHVlIChu4bq/dSBjw7MpLCBt4bq3YyDEkeG7i25oIGzDoCBUUlVFL0ZBTFNFXHJcbiAgICAgICAgICAgICAgaWYgKGl0ZW1bY29sdW1uLmZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4udHJ1ZVZhbHVlIHx8ICdUcnVlJztcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4uZmFsc2VWYWx1ZSB8fCAnRmFsc2UnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgICAgLy8gTuG6v3UgbMOgIGRhdGUgdGjDrCBjb252ZXJ0IHRoZW8gxJHDum5nIGZvcm1hdFxyXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtW2NvbHVtbi5maWVsZF0pO1xyXG4gICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSwgJ2RkL01NL3l5eXknKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgIC8vIE7hur91IGzDoCBkYXRldGltZSB0aMOsIGNvbnZlcnQgdGhlbyDEkcO6bmcgZm9ybWF0XHJcbiAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGl0ZW1bY29sdW1uLmZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShkYXRlLCAnZGQvTU0veXl5eSBISDptbTpzcycpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAndGltZScpIHtcclxuICAgICAgICAgICAgICAvLyBO4bq/dSBsw6AgdGltZSB0aMOsIGNvbnZlcnQgdGhlbyDEkcO6bmcgZm9ybWF0XHJcbiAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGl0ZW1bY29sdW1uLmZpZWxkXSk7XHJcbiAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShkYXRlLCAnSEg6bW06c3MnKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3ZhbHVlcycpIHtcclxuICAgICAgICAgICAgICAvLyBO4bq/dSBsw6AgdmFsdWVzIHRow6wgbOG6pXkgZ2nDoSB0cuG7iyBj4bunYSB2YWx1ZSDEkcaw4bujYyBjaOG7jW5cclxuICAgICAgICAgICAgICBjb25zdCBkYXRhID0gY29sdW1uLnZhbHVlcy5maW5kKGUgPT4gZS52YWx1ZSA9PT0gaXRlbVtjb2x1bW4uZmllbGRdKTtcclxuICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBkYXRhLnRleHQ7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3JhZGlvJykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb2x1bW4udmFsdWVzLmZpbmQoZSA9PiBlW2NvbHVtbi52YWx1ZUZpZWxkXSA9PT0gaXRlbVtjb2x1bW4uZmllbGRdKTtcclxuICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBkYXRhW2NvbHVtbi5kaXNwbGF5RmllbGRdO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGl0ZW1bY29sdW1uLmZpZWxkXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBjb2x1bW5zLmZvckVhY2goaGFuZGxlKTtcclxuICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGNlbFNlcnZpY2UuYmlnRXhwb3J0KHtcclxuICAgICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgICBpdGVtcyxcclxuICAgICAgICAgIGxhdGVzdFJvdyxcclxuICAgICAgICAgIGZpbGVQYXRoLFxyXG4gICAgICAgICAgZGVzdGluYXRpb25cclxuICAgICAgICB9KTtcclxuICAgICAgICBsYXRlc3RSb3cgPSByZXN1bHQubGF0ZXN0Um93O1xyXG4gICAgICAgIGZpbGVQYXRoID0gcmVzdWx0LmZpbGVQYXRoO1xyXG4gICAgICAgIGRlc3RpbmF0aW9uID0gcmVzdWx0LmRlc3RpbmF0aW9uO1xyXG4gICAgICAgIGlmICgocGFnZU51bWJlciAtIDEpICogcGFnZVNpemUgKyBpdGVtcy5sZW5ndGggPj0gdGhpcy50b3RhbCkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5leGNlbFNlcnZpY2UuZG93bmxvYWQoZmlsZVBhdGgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhZ2VOdW1iZXIrKztcclxuICAgICAgfVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5sb2FkaW5nU2VydmljZS5zdG9wKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaW52YWxpZEl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuZmlsdGVyKGUgPT4gZS5lZGl0b3JIYW5kbGVyPy5lcnJvck1lc3NhZ2UpLm1hcChlID0+IHtcclxuICAgICAgY29uc3QgeyB0ZW1wb3JhcnksXHJcbiAgICAgICAgb3JpZ2luSXRlbSxcclxuICAgICAgICBlZGl0b3JIYW5kbGVyLFxyXG4gICAgICAgIGVkaXRpbmdTdGF0dXMsXHJcbiAgICAgICAgaXNDaGVja2VkLFxyXG4gICAgICAgIHN1YkluZm9ybWF0aW9uLFxyXG4gICAgICAgIGJsaW5rZXIsXHJcbiAgICAgICAgLi4uaXRlbSB9ID0gZTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpdGVtLFxyXG4gICAgICAgIG1lc3NhZ2U6IGUuZWRpdG9ySGFuZGxlci5lcnJvck1lc3NhZ2VcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdyaWRJdGVtcygpIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW1zLm1hcChlID0+IHtcclxuICAgICAgY29uc3QgeyB0ZW1wb3JhcnksXHJcbiAgICAgICAgb3JpZ2luSXRlbSxcclxuICAgICAgICBlZGl0b3JIYW5kbGVyLFxyXG4gICAgICAgIGVkaXRpbmdTdGF0dXMsXHJcbiAgICAgICAgaXNDaGVja2VkLFxyXG4gICAgICAgIHN1YkluZm9ybWF0aW9uLFxyXG4gICAgICAgIGJsaW5rZXIsXHJcbiAgICAgICAgLi4uaXRlbSB9ID0gZTtcclxuICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uRWRpdG9yQ2hhbmdlID0gKCkgPT4ge1xyXG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBvblNlbGVjdFBhZ2VTaXplID0gKCkgPT4ge1xyXG4gICAgdGhpcy5yZWxvYWQoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSByZWZyZXNoRXh0ZXJuYWxGaWx0ZXIgPSAoZXh0ZXJuYWxGaWx0ZXJzOiBTZEdyaWRFeHRlcm5hbEZpbHRlcltdLCBleHRlcm5hbEZpbHRlcjogYW55KSA9PiB7XHJcbiAgICBleHRlcm5hbEZpbHRlciA9IGV4dGVybmFsRmlsdGVyIHx8IHt9O1xyXG4gICAgZXh0ZXJuYWxGaWx0ZXJzID0gZXh0ZXJuYWxGaWx0ZXJzIHx8IFtdO1xyXG4gICAgZXh0ZXJuYWxGaWx0ZXJzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgIGlmIChlLnR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgZXh0ZXJuYWxGaWx0ZXJbZS5maWVsZF0gPSBleHRlcm5hbEZpbHRlcltlLmZpZWxkXSA/PyBlLmRlZmF1bHQgPz8gJyc7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChlLnR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgZXh0ZXJuYWxGaWx0ZXJbZS5maWVsZF0gPSBleHRlcm5hbEZpbHRlcltlLmZpZWxkXSA/PyBlLmRlZmF1bHQgPz8gdW5kZWZpbmVkO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZS50eXBlID09PSAnZGF0ZXJhbmdlJykge1xyXG4gICAgICAgIGV4dGVybmFsRmlsdGVyW2UuZmllbGRdID0ge1xyXG4gICAgICAgICAgZnJvbTogZXh0ZXJuYWxGaWx0ZXJbZS5maWVsZF0/LmZyb20gPz8gZS5kZWZhdWx0RnJvbSA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgICB0bzogZXh0ZXJuYWxGaWx0ZXJbZS5maWVsZF0/LnRvID8/IGUuZGVmYXVsdFRvID8/IHVuZGVmaW5lZFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChlLnR5cGUgPT09ICdudW1iZXJyYW5nZScpIHtcclxuICAgICAgICBleHRlcm5hbEZpbHRlcltlLmZpZWxkXSA9IHtcclxuICAgICAgICAgIGZyb206IGV4dGVybmFsRmlsdGVyW2UuZmllbGRdPy5mcm9tID8/IGUuZGVmYXVsdEZyb20gPz8gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgdG86IGV4dGVybmFsRmlsdGVyW2UuZmllbGRdPy50byA/PyBlLmRlZmF1bHRUbyA/PyB1bmRlZmluZWRcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZS50eXBlID09PSAnZGF0ZXJhbmdlZnVsbCcpIHtcclxuICAgICAgICBleHRlcm5hbEZpbHRlcltlLmZpZWxkXSA9IHtcclxuICAgICAgICAgIGZyb206IGV4dGVybmFsRmlsdGVyW2UuZmllbGRdPy5mcm9tID8/IGUuZGVmYXVsdEZyb20gPz8gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgdG86IGV4dGVybmFsRmlsdGVyW2UuZmllbGRdPy50byA/PyBlLmRlZmF1bHRUbyA/PyB1bmRlZmluZWRcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZS50eXBlID09PSAndmFsdWVzJykgeyAvLyBhbmRuMVxyXG4gICAgICAgIGV4dGVybmFsRmlsdGVyW2UuZmllbGRdID0gKGV4dGVybmFsRmlsdGVyW2UuZmllbGRdIHx8IGUuZGVmYXVsdCkgPz8gJyc7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBleHRlcm5hbEZpbHRlcjtcclxuICB9XHJcblxyXG4gIG9uQ3JlYXRlUXVpY2tGaWx0ZXIgPSAoZXY/OiBFdmVudCkgPT4ge1xyXG4gICAgdGhpcy5tYXRTZWxlY3Q/LmNsb3NlKCk7XHJcbiAgICB0aGlzLm9uRmlsdGVyUG9wdXAoKTtcclxuICAgIHRoaXMuc2RHcmlkUG9wdXBGaWx0ZXI/LmNsb3NlKCk7XHJcbiAgICB0aGlzLnNkR3JpZFBvcHVwRmlsdGVyPy5vbkNyZWF0ZVF1aWNrRmlsdGVyKGV2KTtcclxuICB9XHJcblxyXG4gIG9uRWRpdFF1aWNrRmlsdGVyID0gKGV2OiBFdmVudCwgcXVpY2tGaWx0ZXI/OiBRdWlja0ZpbHRlcikgPT4ge1xyXG4gICAgdGhpcy5tYXRTZWxlY3Q/LmNsb3NlKCk7XHJcbiAgICB0aGlzLm9uRmlsdGVyUG9wdXAoKTtcclxuICAgIHRoaXMuc2RHcmlkUG9wdXBGaWx0ZXI/LmNsb3NlKCk7XHJcbiAgICB0aGlzLnNkR3JpZFBvcHVwRmlsdGVyPy5vbkVkaXRRdWlja0ZpbHRlcihldiwgcXVpY2tGaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgb25EZWxldGVRdWlja0ZpbHRlciA9IChldjogRXZlbnQsIHF1aWNrRmlsdGVyPzogUXVpY2tGaWx0ZXIpID0+IHtcclxuICAgIHRoaXMubWF0U2VsZWN0Py5jbG9zZSgpO1xyXG4gICAgdGhpcy5vbkZpbHRlclBvcHVwKCk7XHJcbiAgICB0aGlzLnNkR3JpZFBvcHVwRmlsdGVyPy5jbG9zZSgpO1xyXG4gICAgdGhpcy5zZEdyaWRQb3B1cEZpbHRlcj8ub25EZWxldGVRdWlja0ZpbHRlcihldiwgcXVpY2tGaWx0ZXIpO1xyXG4gIH1cclxufVxyXG4iXX0=
1191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvbmdoaWF0dDE1X29uZW1vdW50L0RvY3VtZW50cy9saWItY29yZS11aS9wcm9qZWN0cy9zZC1jb3JlL2dyaWQvIiwic291cmNlcyI6WyJzcmMvbGliL2dyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUVULHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLFNBQVMsRUFHVCxNQUFNLEVBQ04sUUFBUSxFQUNSLGVBQWUsRUFDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQ0wsWUFBWSxFQUNiLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUNMLGVBQWUsRUFDaEIsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2pCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEMsT0FBTyxFQUNMLGtCQUFrQixFQUNuQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFBZ0IsaUJBQWlCLEVBQWdELE1BQU0sY0FBYyxDQUFDO0FBSTdHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR2hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTTNDLE9BQU8sRUFBc0IsV0FBVyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFD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QUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQzdFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFO3dCQUNwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQzs2QkFDckcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQzt3QkFDbEksTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDaEQsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUN2RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzt3QkFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7cUJBQ3BCO3lCQUFNO3dCQUNMLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxD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Q29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIFZpZXdDaGlsZHJlbixcclxuICBRdWVyeUxpc3QsXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgSW5qZWN0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIENvbnRlbnRDaGlsZHJlblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IERldmljZURldGVjdG9yU2VydmljZSB9IGZyb20gJ25neC1kZXZpY2UtZGV0ZWN0b3InO1xyXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xyXG5cclxuaW1wb3J0IHtcclxuICBTZEFwaVNlcnZpY2VcclxufSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL2FwaSc7XHJcblxyXG5pbXBvcnQge1xyXG4gIFNkTm90aWZ5U2VydmljZVxyXG59IGZyb20gJ0BzZC1hbmd1bGFyL2NvcmUvbm90aWZ5JztcclxuXHJcbmltcG9ydCB7XHJcbiAgU2RMb2FkaW5nU2VydmljZVxyXG59IGZyb20gJ0BzZC1hbmd1bGFyL2NvcmUvbG9hZGluZyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIFNkVHJhbnNsYXRlU2VydmljZVxyXG59IGZyb20gJ0BzZC1hbmd1bGFyL2NvcmUvdHJhbnNsYXRlJztcclxuXHJcbmltcG9ydCB7IFNkR3JpZE9wdGlvbiwgZGVmYXVsdEdyaWRPcHRpb24sIEdyaWRJdGVtLCBTZEdyaWRDb2x1bW4sIFNkR3JpZEV4dGVybmFsRmlsdGVyIH0gZnJvbSAnLi9ncmlkLm1vZGVsJztcclxuXHJcbmltcG9ydCB7IENvbmZpZ1Jlc3VsdCB9IGZyb20gJy4vY29tcG9uZW50cy9ncmlkLWNvbmZpZy9ncmlkLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFNkR3JpZENvbmZpZyB9IGZyb20gJy4vY29tcG9uZW50cy9ncmlkLWNvbmZpZy9ncmlkLWNvbmZpZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFZGl0b3JIYW5kbGVyUGlwZSB9IGZyb20gJy4vcGlwZXMvZWRpdG9yLWhhbmRsZXIucGlwZSc7XHJcbmltcG9ydCB7IFNkR3JpZFBvcHVwRWRpdG9yIH0gZnJvbSAnLi9jb21wb25lbnRzL2dyaWQtcG9wdXAtZWRpdG9yL2dyaWQtcG9wdXAtZWRpdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNkR3JpZFBvcHVwRmlsdGVyIH0gZnJvbSAnLi9jb21wb25lbnRzL2dyaWQtcG9wdXAtZmlsdGVyL2dyaWQtcG9wdXAtZmlsdGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IG1lcmdlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2RHcmlkUG9wdXBFeHBvcnRFeGNlbCB9IGZyb20gJy4vY29tcG9uZW50cy9ncmlkLXBvcHVwLWV4cG9ydC1leGNlbC9ncmlkLXBvcHVwLWV4cG9ydC1leGNlbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBRdWlja0ZpbHRlciwgRmlsdGVyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY29tcG9uZW50cy9ncmlkLXBvcHVwLWZpbHRlci9ncmlkLXBvcHVwLWZpbHRlci5tb2RlbCc7XHJcbmltcG9ydCB7IE1hdFNlbGVjdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IFNkR3JpZEZpbHRlckluZm8gfSBmcm9tICcuL21vZGVscy9maWx0ZXItaW5mby5tb2RlbCc7XHJcblxyXG5pbXBvcnQgeyBJR3JpZENvbmZpZ3VyYXRpb24sIEdSSURfQ09ORklHIH0gZnJvbSAnLi9tb2RlbHMvZ3JpZC1jb25maWd1cmF0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgU2RDZWxsRGVmRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2NlbGwtZGVmLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNkQ2VsbEZvb3RlckRldkRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jZWxsLWZvb3Rlci1kZWYuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBTZENlbGxFZGl0b3JEZWZEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY2VsbC1lZGl0b3ItZGVmLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IElIYW5kbGVyU2VydmVyLCBJSGFuZGxlckxvY2FsIH0gZnJvbSAnLi9tb2RlbHMvaGFuZGxlcic7XHJcbmltcG9ydCB7IEhhbmRsZXJMb2NhbCB9IGZyb20gJy4vbW9kZWxzL2hhbmRsZXItbG9jYWwnO1xyXG5pbXBvcnQgeyBIYW5kbGVyRG90bmV0IH0gZnJvbSAnLi9tb2RlbHMvaGFuZGxlci1kb3RuZXQnO1xyXG5pbXBvcnQgeyBTZEdyaWRJbXBvcnRFeGNlbCB9IGZyb20gJy4vY29tcG9uZW50cy9ncmlkLWltcG9ydC1leGNlbC9ncmlkLWltcG9ydC1leGNlbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTZEV4cG9ydFNlcnZpY2UgfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL2V4cG9ydCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZC1ncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3JpZC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZEdyaWQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgaGFuZGxlcjogSUhhbmRsZXJTZXJ2ZXIgfCBJSGFuZGxlckxvY2FsO1xyXG4gIGlzTW9iaWxlT3JUYWJsZXQgPSBmYWxzZTtcclxuICBkaXNwbGF5S2V5ID0gJ1NEQ1VTVE9NJztcclxuICBncmlkT3B0aW9uOiBTZEdyaWRPcHRpb247XHJcbiAgb3JkZXJCeTogc3RyaW5nO1xyXG4gIG9yZGVyRGlyZWN0aW9uOiAnQVNDJyB8ICdERVNDJztcclxuICBsb2NhbEl0ZW1zOiBHcmlkSXRlbVtdID0gW107XHJcbiAgaXRlbXM6IEdyaWRJdGVtW10gPSBbXTtcclxuICB0b3RhbDogbnVtYmVyO1xyXG4gIGZpbHRlcjoge1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55XHJcbiAgfSA9IHt9O1xyXG4gIGV4dGVybmFsRmlsdGVyOiB7XHJcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcclxuICB9ID0ge307XHJcbiAgaGlkZGVuUGFnaW5hdGUgPSBmYWxzZTtcclxuICBpbmxpbmVFeHRlcm5hbDoge1xyXG4gICAgW2tleTogc3RyaW5nXTogYm9vbGVhbjtcclxuICB9ID0ge307XHJcbiAgaW5saW5lQ29sdW1uOiB7XHJcbiAgICBba2V5OiBzdHJpbmddOiBib29sZWFuO1xyXG4gIH0gPSB7fTtcclxuICBxdWlja0ZpbHRlcnM6IFF1aWNrRmlsdGVyW10gPSBbXTtcclxuICBzZWxlY3RlZFF1aWNrRmlsdGVyOiBzdHJpbmc7XHJcbiAgLy8gUGFnaW5hdGVcclxuICBwYWdlcyA9IFsxXTtcclxuICBwYWdlQ291bnQgPSA1O1xyXG4gIHRvdGFsUGFnZSA9IDE7XHJcblxyXG4gIC8vIExvYWRpbmdcclxuICBpc0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgdmlld0l0ZW1zOiBHcmlkSXRlbVtdID0gW107XHJcbiAgc3VtYXJpemU6IHN0cmluZztcclxuXHJcbiAgZml4ZWRDb2x1bW5zOiBTZEdyaWRDb2x1bW5bXSA9IFtdO1xyXG4gIG5vcm1hbENvbHVtbnM6IFNkR3JpZENvbHVtbltdID0gW107XHJcbiAgY29sdW1uczogU2RHcmlkQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgaXNDaGVja2VkQWxsID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRJdGVtczogYW55W10gPSBbXTtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbignZml4ZWRIZWFkZXInKSBwcml2YXRlIGZpeGVkSGVhZGVyczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ2ZpeGVkQm9keScpIHByaXZhdGUgZml4ZWRCb2RpZXM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZml4ZWRHcmlkQ29udGFpbmVyJykgZml4ZWRHcmlkQ29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2dyaWRGaXhlZEJvZHknKSBncmlkRml4ZWRCb2R5OiBFbGVtZW50UmVmO1xyXG5cclxuICBAVmlld0NoaWxkKCdncmlkQ29udGFpbmVyJykgZ3JpZENvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdncmlkSGVhZGVyJykgZ3JpZEhlYWRlcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdncmlkQm9keScpIGdyaWRCb2R5OiBFbGVtZW50UmVmO1xyXG5cclxuICBAVmlld0NoaWxkKCdzZEdyaWRDb25maWcnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzZEdyaWRDb25maWc6IFNkR3JpZENvbmZpZztcclxuICBAVmlld0NoaWxkKCdzZEdyaWRQb3B1cEVkaXRvcicpIHNkR3JpZFBvcHVwRWRpdG9yOiBTZEdyaWRQb3B1cEVkaXRvcjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnc2RHcmlkUG9wdXBGaWx0ZXInKSBzZEdyaWRQb3B1cEZpbHRlcjogU2RHcmlkUG9wdXBGaWx0ZXI7XHJcbiAgQFZpZXdDaGlsZCgnbWF0U2VsZWN0JykgbWF0U2VsZWN0OiBNYXRTZWxlY3Q7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NkR3JpZFBvcHVwRXhwb3J0RXhjZWwnKSBzZEdyaWRQb3B1cEV4cG9ydEV4Y2VsOiBTZEdyaWRQb3B1cEV4cG9ydEV4Y2VsO1xyXG4gIEBWaWV3Q2hpbGQoJ3NkR3JpZEltcG9ydEV4Y2VsJykgc2RHcmlkSW1wb3J0RXhjZWw6IFNkR3JpZEltcG9ydEV4Y2VsO1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFNkQ2VsbERlZkRpcmVjdGl2ZSkgY2VsbERlZnMgPSBuZXcgUXVlcnlMaXN0PFNkQ2VsbERlZkRpcmVjdGl2ZT4oKTtcclxuICBjZWxsRGVmOiB7XHJcbiAgICBbY29sdW1uOiBzdHJpbmddOiBTZENlbGxEZWZEaXJlY3RpdmVcclxuICB9ID0ge307XHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oU2RDZWxsRWRpdG9yRGVmRGlyZWN0aXZlKSBjZWxsRWRpdG9yRGVmcyA9IG5ldyBRdWVyeUxpc3Q8U2RDZWxsRWRpdG9yRGVmRGlyZWN0aXZlPigpO1xyXG4gIGNlbGxFZGl0b3JEZWY6IHtcclxuICAgIFtjb2x1bW46IHN0cmluZ106IFNkQ2VsbEVkaXRvckRlZkRpcmVjdGl2ZVxyXG4gIH0gPSB7fTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihTZENlbGxGb290ZXJEZXZEaXJlY3RpdmUpIGNlbGxGb290ZXJEZWZzID0gbmV3IFF1ZXJ5TGlzdDxTZENlbGxGb290ZXJEZXZEaXJlY3RpdmU+KCk7XHJcbiAgY2VsbEZvb3RlckRlZjoge1xyXG4gICAgW2NvbHVtbjogc3RyaW5nXTogU2RDZWxsRm9vdGVyRGV2RGlyZWN0aXZlW107XHJcbiAgfSA9IHt9O1xyXG4gICNudW1iZXJPZkZvb3RlclJvd3MgPSAwO1xyXG4gIGZvb3RlclJvd3M6IG51bWJlcltdID0gW107XHJcblxyXG4gICNwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcclxuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcikgc2V0IHBhZ2luYXRvcihwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcikge1xyXG4gICAgaWYgKHBhZ2luYXRvciAmJiB0aGlzLiNwYWdpbmF0b3IgIT09IHBhZ2luYXRvcikge1xyXG4gICAgICB0aGlzLiNwYWdpbmF0b3IgPSBwYWdpbmF0b3I7XHJcbiAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQocGFnaW5hdG9yLnBhZ2Uuc3Vic2NyaWJlKHRoaXMuc2VsZWN0UGFnZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG9wdGlvbih2YWx1ZTogU2RHcmlkT3B0aW9uKSB7XHJcbiAgICB0aGlzLnNldE9wdGlvbih2YWx1ZSk7XHJcbiAgfVxyXG4gIHNlbGVjdGVkSXRlbTogYW55ID0gbnVsbDtcclxuICAjc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIHJvd0hhbmRsZXIgPSB7XHJcbiAgICBjbGljazogKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24ub25DbGlja1Jvdykge1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbi5vbkNsaWNrUm93KGl0ZW0pO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZGJsQ2xpY2s6IChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLm9uRGJsQ2xpY2tSb3cpIHtcclxuICAgICAgICB0aGlzLmdyaWRPcHRpb24ub25EYmxDbGlja1JvdyhpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgc2V0T3B0aW9uID0gKG9wdGlvbjogU2RHcmlkT3B0aW9uKSA9PiB7XHJcbiAgICBvcHRpb24gPSB0aGlzLmluaXRDb25maWd1cmF0aW9uKG9wdGlvbik7XHJcbiAgICBvcHRpb24gPSB0aGlzLmluaXRUcmFuc2xhdGUob3B0aW9uKTtcclxuICAgIGRlbGV0ZSB0aGlzLmdyaWRPcHRpb247XHJcbiAgICB0aGlzLmdyaWRPcHRpb24gPSBvcHRpb247XHJcbiAgICAvLyBMb+G6oWkgYuG7jyBuaOG7r25nIGNvbW1hbmQgYuG7iyDhuqluXHJcbiAgICB0aGlzLmdyaWRPcHRpb24uY29tbWFuZHMgPSB0aGlzLmdyaWRPcHRpb24uY29tbWFuZHMuZmlsdGVyKGNvbW1hbmQgPT4ge1xyXG4gICAgICBjb25zdCBoaWRkZW4gPSBjb21tYW5kLmhpZGRlbjtcclxuICAgICAgaWYgKGhpZGRlbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiAoaGlkZGVuKSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICByZXR1cm4gIWhpZGRlbjtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAoaGlkZGVuKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgcmV0dXJuICFoaWRkZW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5zZEdyaWRDb25maWcuc2V0T3B0aW9uKHtcclxuICAgICAga2V5OiBvcHRpb24ua2V5LFxyXG4gICAgICBwYWdlU2l6ZTogdGhpcy5ncmlkT3B0aW9uLnBhZ2luYXRlLnBhZ2VTaXplLFxyXG4gICAgICBjb2x1bW5zOiB0aGlzLmdyaWRPcHRpb24uY29sdW1uc1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmluaXRFeHRlcm5hbEZpbHRlcigpO1xyXG4gICAgdGhpcy5yZXNpemUoKTtcclxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q29uZmlndXJhdGlvbiA9IChvcHRpb246IFNkR3JpZE9wdGlvbikgPT4ge1xyXG4gICAgY29uc3QgZ3JpZENvbmZpZ3VyYXRpb24gPSB0aGlzLmNvbmZpZ3VyYXRpb247XHJcbiAgICAvLyBGaWx0ZXJcclxuICAgIGlmICghb3B0aW9uLmZpbHRlcj8udHlwZSAmJiBncmlkQ29uZmlndXJhdGlvbj8uZmlsdGVyPy50eXBlKSB7XHJcbiAgICAgIGlmICghb3B0aW9uLmZpbHRlcikge1xyXG4gICAgICAgIG9wdGlvbi5maWx0ZXIgPSB7XHJcbiAgICAgICAgICB0eXBlOiBncmlkQ29uZmlndXJhdGlvbi5maWx0ZXIudHlwZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgb3B0aW9uLmZpbHRlci50eXBlID0gZ3JpZENvbmZpZ3VyYXRpb24uZmlsdGVyLnR5cGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghb3B0aW9uLmZpbHRlcj8uY29sdW1uSW5saW5lICYmIGdyaWRDb25maWd1cmF0aW9uPy5maWx0ZXI/LmNvbHVtbklubGluZSkge1xyXG4gICAgICBpZiAoIW9wdGlvbi5maWx0ZXIpIHtcclxuICAgICAgICBvcHRpb24uZmlsdGVyID0ge1xyXG4gICAgICAgICAgY29sdW1uSW5saW5lOiBncmlkQ29uZmlndXJhdGlvbi5maWx0ZXIuY29sdW1uSW5saW5lXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvcHRpb24uZmlsdGVyLmNvbHVtbklubGluZSA9IGdyaWRDb25maWd1cmF0aW9uLmZpbHRlci5jb2x1bW5JbmxpbmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghb3B0aW9uLmZpbHRlcj8ucXVpY2tGaWx0ZXJWaXNpYmlsaXR5ICYmIGdyaWRDb25maWd1cmF0aW9uPy5maWx0ZXI/LnF1aWNrRmlsdGVyVmlzaWJpbGl0eSkge1xyXG4gICAgICBpZiAoIW9wdGlvbi5maWx0ZXIpIHtcclxuICAgICAgICBvcHRpb24uZmlsdGVyID0ge1xyXG4gICAgICAgICAgcXVpY2tGaWx0ZXJWaXNpYmlsaXR5OiBncmlkQ29uZmlndXJhdGlvbi5maWx0ZXIucXVpY2tGaWx0ZXJWaXNpYmlsaXR5XHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvcHRpb24uZmlsdGVyLnF1aWNrRmlsdGVyVmlzaWJpbGl0eSA9IGdyaWRDb25maWd1cmF0aW9uLmZpbHRlci5xdWlja0ZpbHRlclZpc2liaWxpdHk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIFRyYW5zbGF0ZVxyXG4gICAgb3B0aW9uLnRyYW5zbGF0ZSA9IG9wdGlvbi50cmFuc2xhdGUgPz8gZ3JpZENvbmZpZ3VyYXRpb24/LnRyYW5zbGF0ZTtcclxuICAgIHN3aXRjaCAob3B0aW9uLnR5cGUpIHtcclxuICAgICAgY2FzZSAnbG9jYWwnOlxyXG4gICAgICAgIHRoaXMuaGFuZGxlciA9IHRoaXMuaGFuZGxlckxvY2FsO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkb3RuZXQnOlxyXG4gICAgICAgIHRoaXMuaGFuZGxlciA9IHRoaXMuaGFuZGxlckRvdG5ldDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY3VzdG9tJzpcclxuICAgICAgICB0aGlzLmhhbmRsZXIgPSBvcHRpb24uaGFuZGxlckN1c3RvbSB8fCBncmlkQ29uZmlndXJhdGlvbj8uaGFuZGxlckN1c3RvbTtcclxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcikge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLm5vdGlmeS53YXJuaW5nKGBIYW5kbGVyIGN1c3RvbSB3YXMgbm90IGZvdW5kYCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgLi4uZGVmYXVsdEdyaWRPcHRpb24sIC4uLm9wdGlvbiB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0VHJhbnNsYXRlID0gKG9wdGlvbjogU2RHcmlkT3B0aW9uKSA9PiB7XHJcbiAgICBjb25zdCB7IHRyYW5zbGF0ZSB9ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlO1xyXG4gICAgb3B0aW9uLmNvbW1hbmRzPy5mb3JFYWNoKGNvbW1hbmQgPT4ge1xyXG4gICAgICBpZiAoIW9wdGlvbi50cmFuc2xhdGUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHR5cGVvZiAoY29tbWFuZC50aXRsZSkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29tbWFuZC50aXRsZSA9IHRyYW5zbGF0ZShjb21tYW5kLnRpdGxlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoJ2NoaWxkcmVuJyBpbiBjb21tYW5kKSB7XHJcbiAgICAgICAgY29tbWFuZC5jaGlsZHJlbj8uZm9yRWFjaChjaGlsZENvbW1hbmQgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiAoY2hpbGRDb21tYW5kLnRpdGxlKSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY2hpbGRDb21tYW5kLnRpdGxlID0gdHJhbnNsYXRlKGNoaWxkQ29tbWFuZC50aXRsZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgb3B0aW9uLmNvbHVtbnM/LmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgaWYgKGNvbHVtbi50cmFuc2xhdGUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvcHRpb24udHJhbnNsYXRlIHx8IGNvbHVtbi50cmFuc2xhdGUpIHtcclxuICAgICAgICBjb2x1bW4udGl0bGUgPSB0cmFuc2xhdGUoY29sdW1uLnRpdGxlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdjaGlsZHJlbicpIHtcclxuICAgICAgICBjb2x1bW4/LmNoaWxkcmVuPy5mb3JFYWNoKGNoaWxkQ29sdW1uID0+IHtcclxuICAgICAgICAgIGlmIChjaGlsZENvbHVtbi50cmFuc2xhdGUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChvcHRpb24udHJhbnNsYXRlIHx8IGNoaWxkQ29sdW1uLnRyYW5zbGF0ZSkge1xyXG4gICAgICAgICAgICBjaGlsZENvbHVtbi50aXRsZSA9IHRyYW5zbGF0ZShjaGlsZENvbHVtbi50aXRsZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgb3B0aW9uLmZpbHRlcj8uZXh0ZXJuYWxGaWx0ZXJzPy5mb3JFYWNoKGV4dGVybmFsRmlsdGVyID0+IHtcclxuICAgICAgaWYgKG9wdGlvbi50cmFuc2xhdGUpIHtcclxuICAgICAgICBleHRlcm5hbEZpbHRlci50aXRsZSA9IHRyYW5zbGF0ZShleHRlcm5hbEZpbHRlci50aXRsZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG9wdGlvbjtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChHUklEX0NPTkZJRykgQE9wdGlvbmFsKCkgcHVibGljIGNvbmZpZ3VyYXRpb246IElHcmlkQ29uZmlndXJhdGlvbixcclxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIGRldmljZVNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgaGFuZGxlckxvY2FsOiBIYW5kbGVyTG9jYWwsXHJcbiAgICBwcml2YXRlIGhhbmRsZXJEb3RuZXQ6IEhhbmRsZXJEb3RuZXQsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFNkVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLFxyXG4gICAgcHJpdmF0ZSBsb2FkaW5nU2VydmljZTogU2RMb2FkaW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogU2RBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBleHBvcnRTZXJ2aWNlOiBTZEV4cG9ydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5vdGlmeVNlcnZpY2U6IFNkTm90aWZ5U2VydmljZSxcclxuICAgIHByaXZhdGUgZWRpdG9yVmlzaWJsZVBpcGU6IEVkaXRvckhhbmRsZXJQaXBlKSB7XHJcbiAgICB0aGlzLmlzTW9iaWxlT3JUYWJsZXQgPSAhZGV2aWNlU2VydmljZS5pc0Rlc2t0b3AoKTtcclxuICAgIC8vIHRoaXMucmVmLmRldGFjaCgpO1xyXG4gICAgLy8gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgLy8gICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIC8vIH0sIDEwMDApO1xyXG4gICAgLy8gcmVmLmRldGFjaCgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmZpeGVkSGVhZGVycy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKFtdKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZml4ZWRIZWFkZXJzID0gdGhpcy5maXhlZEhlYWRlcnMudG9BcnJheSgpO1xyXG4gICAgICAgIGlmIChmaXhlZEhlYWRlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGxlZnQgPSAkKGZpeGVkSGVhZGVyc1swXS5uYXRpdmVFbGVtZW50KS5vdXRlcldpZHRoKHRydWUpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBmaXhlZEhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgJChmaXhlZEhlYWRlcnNbaV0ubmF0aXZlRWxlbWVudCkuY3NzKHsgbGVmdCB9KTtcclxuICAgICAgICAgICAgbGVmdCArPSAkKGZpeGVkSGVhZGVyc1tpXS5uYXRpdmVFbGVtZW50KS5vdXRlcldpZHRoKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMTAwKTtcclxuICAgIH0pKTtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQobWVyZ2UodGhpcy5maXhlZEJvZGllcy5jaGFuZ2VzLCB0aGlzLmNlbGxGb290ZXJEZWZzLmNoYW5nZXMpLnBpcGUoc3RhcnRXaXRoKHt9KSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZml4ZWRCb2RpZXMgPSB0aGlzLmZpeGVkQm9kaWVzLnRvQXJyYXkoKTtcclxuICAgICAgICBpZiAoZml4ZWRCb2RpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgZml4ZWRQZXJSb3cgPSB0aGlzLmZpeGVkQm9kaWVzLmxlbmd0aCAvICh0aGlzLnZpZXdJdGVtcy5sZW5ndGggKyB0aGlzLiNudW1iZXJPZkZvb3RlclJvd3MpO1xyXG4gICAgICAgICAgbGV0IGxlZnQgPSAkKGZpeGVkQm9kaWVzWzBdLm5hdGl2ZUVsZW1lbnQpLm91dGVyV2lkdGgodHJ1ZSk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGZpeGVkQm9kaWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChpICUgZml4ZWRQZXJSb3cgPT09IDApIHtcclxuICAgICAgICAgICAgICBsZWZ0ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAkKGZpeGVkQm9kaWVzW2ldLm5hdGl2ZUVsZW1lbnQpLmNzcyh7IGxlZnQgfSk7XHJcbiAgICAgICAgICAgIGxlZnQgKz0gJChmaXhlZEJvZGllc1tpXS5uYXRpdmVFbGVtZW50KS5vdXRlcldpZHRoKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmaXhlZEhlYWRlcnMgPSB0aGlzLmZpeGVkSGVhZGVycy50b0FycmF5KCk7XHJcbiAgICAgICAgaWYgKGZpeGVkSGVhZGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBsZXQgbGVmdCA9ICQoZml4ZWRIZWFkZXJzWzBdLm5hdGl2ZUVsZW1lbnQpLm91dGVyV2lkdGgodHJ1ZSk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGZpeGVkSGVhZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAkKGZpeGVkSGVhZGVyc1tpXS5uYXRpdmVFbGVtZW50KS5jc3MoeyBsZWZ0IH0pO1xyXG4gICAgICAgICAgICBsZWZ0ICs9ICQoZml4ZWRIZWFkZXJzW2ldLm5hdGl2ZUVsZW1lbnQpLm91dGVyV2lkdGgodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAxMDApO1xyXG4gICAgfSkpO1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmNlbGxEZWZzLmNoYW5nZXMucGlwZShzdGFydFdpdGgoW10pKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNlbGxEZWYgPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBjZWxsRGVmIG9mIHRoaXMuY2VsbERlZnMpIHtcclxuICAgICAgICBpZiAoY2VsbERlZi5zZENlbGxEZWYpIHtcclxuICAgICAgICAgIHRoaXMuY2VsbERlZltjZWxsRGVmLnNkQ2VsbERlZl0gPSBjZWxsRGVmO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmNlbGxFZGl0b3JEZWZzLmNoYW5nZXMucGlwZShzdGFydFdpdGgoW10pKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNlbGxFZGl0b3JEZWYgPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBjZWxsRWRpdG9yRGVmIG9mIHRoaXMuY2VsbEVkaXRvckRlZnMpIHtcclxuICAgICAgICBpZiAoY2VsbEVkaXRvckRlZi5zZENlbGxFZGl0b3JEZWYpIHtcclxuICAgICAgICAgIHRoaXMuY2VsbEVkaXRvckRlZltjZWxsRWRpdG9yRGVmLnNkQ2VsbEVkaXRvckRlZl0gPSBjZWxsRWRpdG9yRGVmO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmNlbGxGb290ZXJEZWZzLmNoYW5nZXMucGlwZShzdGFydFdpdGgoW10pKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNlbGxGb290ZXJEZWYgPSB7fTtcclxuICAgICAgdGhpcy4jbnVtYmVyT2ZGb290ZXJSb3dzID0gMDtcclxuICAgICAgZm9yIChjb25zdCBjZWxsRm9vdGVyRGVmIG9mIHRoaXMuY2VsbEZvb3RlckRlZnMpIHtcclxuICAgICAgICBpZiAoY2VsbEZvb3RlckRlZi5zZENlbGxGb290ZXJEZWYpIHtcclxuICAgICAgICAgIGlmICghdGhpcy5jZWxsRm9vdGVyRGVmW2NlbGxGb290ZXJEZWYuc2RDZWxsRm9vdGVyRGVmXSkge1xyXG4gICAgICAgICAgICB0aGlzLmNlbGxGb290ZXJEZWZbY2VsbEZvb3RlckRlZi5zZENlbGxGb290ZXJEZWZdID0gW107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmNlbGxGb290ZXJEZWZbY2VsbEZvb3RlckRlZi5zZENlbGxGb290ZXJEZWZdLnB1c2goY2VsbEZvb3RlckRlZik7XHJcbiAgICAgICAgICBpZiAodGhpcy5jZWxsRm9vdGVyRGVmW2NlbGxGb290ZXJEZWYuc2RDZWxsRm9vdGVyRGVmXS5sZW5ndGggPiB0aGlzLiNudW1iZXJPZkZvb3RlclJvd3MpIHtcclxuICAgICAgICAgICAgdGhpcy4jbnVtYmVyT2ZGb290ZXJSb3dzID0gdGhpcy5jZWxsRm9vdGVyRGVmW2NlbGxGb290ZXJEZWYuc2RDZWxsRm9vdGVyRGVmXS5sZW5ndGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZm9vdGVyUm93cyA9IEFycmF5KHRoaXMuI251bWJlck9mRm9vdGVyUm93cykuZmlsbCgwKS5tYXAoKHYsIGkpID0+IGkpO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHJlbG9hZCA9IGFzeW5jIChncmlkSXRlbXM/OiBhbnlbXSkgPT4ge1xyXG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gKHRoaXMuI3BhZ2luYXRvcj8ucGFnZUluZGV4IHx8IDApICsgMTtcclxuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy4jcGFnaW5hdG9yPy5wYWdlU2l6ZSB8fCA1MDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSAhPT0gJ2xvY2FsJykge1xyXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXIgYXMgSUhhbmRsZXJTZXJ2ZXI7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyID0gaGFuZGxlci5tYXBSZXF1ZXN0KHRoaXMuZ2V0RmlsdGVySW5mbyhjdXJyZW50UGFnZSwgcGFnZVNpemUpKTtcclxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLm1ldGhvZCA9PT0gJ0dFVCcpIHtcclxuICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmtleXMoZmlsdGVyKS5maWx0ZXIoa2V5ID0+IGZpbHRlcltrZXldICE9PSBudWxsICYmIGZpbHRlcltrZXldICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIC5tYXAoa2V5ID0+IGtleSArICc9JyArIGZpbHRlcltrZXldKS5qb2luKCcmJyk7XHJcbiAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdyaWRPcHRpb24udXJsLmluY2x1ZGVzKCc/JykgPyBgJHt0aGlzLmdyaWRPcHRpb24udXJsfSYke3F1ZXJ5U3RyaW5nfWAgOiBgJHt0aGlzLmdyaWRPcHRpb24udXJsfT8ke3F1ZXJ5U3RyaW5nfWA7XHJcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5nZXQodXJsKTtcclxuICAgICAgICAgIGNvbnN0IHsgaXRlbXMsIHRvdGFsIH0gPSBoYW5kbGVyLm1hcFJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICAgICAgICAgIHRoaXMuaXRlbXMgPSBpdGVtcztcclxuICAgICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UucG9zdCh0aGlzLmdyaWRPcHRpb24udXJsLCBmaWx0ZXIpO1xyXG4gICAgICAgICAgY29uc3QgeyBpdGVtcywgdG90YWwgfSA9IGhhbmRsZXIubWFwUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gICAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyIGFzIElIYW5kbGVyTG9jYWw7XHJcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5ncmlkT3B0aW9uLml0ZW1zKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZ3JpZEl0ZW1zKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvY2FsSXRlbXMgPSBncmlkSXRlbXM7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5ncmlkT3B0aW9uLml0ZW1zKCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHRzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubG9jYWxJdGVtcyA9IGF3YWl0IHJlc3VsdHM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5sb2NhbEl0ZW1zID0gcmVzdWx0cztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWRPcHRpb24uaXRlbXMgPSBncmlkSXRlbXMgfHwgdGhpcy5ncmlkT3B0aW9uLml0ZW1zO1xyXG4gICAgICAgICAgdGhpcy5sb2NhbEl0ZW1zID0gdGhpcy5ncmlkT3B0aW9uLml0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGhhbmRsZXIuZmlsdGVyKHRoaXMubG9jYWxJdGVtcywge1xyXG4gICAgICAgICAgY3VzdG9tRmlsdGVyOiB0aGlzLmdyaWRPcHRpb24uZmlsdGVyLmN1c3RvbUZpbHRlcixcclxuICAgICAgICAgIHJhd0ZpbHRlcjogdGhpcy5maWx0ZXIsXHJcbiAgICAgICAgICBjb2x1bW5zOiB0aGlzLmdyaWRPcHRpb24uY29sdW1ucyxcclxuICAgICAgICAgIHJhd0V4dGVybmFsRmlsdGVyOiB0aGlzLmV4dGVybmFsRmlsdGVyLFxyXG4gICAgICAgICAgZXh0ZXJuYWxGaWx0ZXJzOiB0aGlzLmdyaWRPcHRpb24uZmlsdGVyPy5leHRlcm5hbEZpbHRlcnMsXHJcbiAgICAgICAgICBvcmRlckJ5OiB0aGlzLm9yZGVyQnksXHJcbiAgICAgICAgICBvcmRlckRpcmVjdGlvbjogdGhpcy5vcmRlckRpcmVjdGlvbixcclxuICAgICAgICAgIHBhZ2VOdW1iZXI6IGN1cnJlbnRQYWdlLFxyXG4gICAgICAgICAgcGFnZVNpemVcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLml0ZW1zID0gcmVzcG9uc2UuaXRlbXM7XHJcbiAgICAgICAgdGhpcy50b3RhbCA9IHJlc3BvbnNlLnRvdGFsO1xyXG4gICAgICAgIFxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0ub3JpZ2luSXRlbSA9IHsgLi4uaXRlbSB9KTtcclxuICAgICAgdGhpcy5pc0NoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgICAgdGhpcy4jc2V0U2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgICBhd2FpdCB0aGlzLmdyaWRPcHRpb24/Lm9uUmVsb2FkQ29tcGxldGVkPy4odGhpcy5pdGVtcyk7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVWaWV3SXRlbXMoKTtcclxuICAgICAgdGhpcy5nZW5lcmF0ZUVkaXRvckhhbmRsZXJzKCk7XHJcbiAgICAgICQodGhpcy5ncmlkQm9keS5uYXRpdmVFbGVtZW50KS5zY3JvbGxUb3AoMCk7XHJcbiAgICAgIGlmIChjdXJyZW50UGFnZSA+IDEgJiYgIXRoaXMudmlld0l0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLiNwYWdpbmF0b3IuZmlyc3RQYWdlKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLm5vdGlmeVNlcnZpY2UuaGFuZGxlLmVycm9yKGVycm9yKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWxvYWRJdGVtKGRhdGE6IHsgW2lkOiBzdHJpbmddOiBhbnkgfSkge1xyXG4gICAgT2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaChpZCA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoZSA9PiAhIWUuaWQgJiYgZS5pZCA9PT0gaWQpO1xyXG4gICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbi5jb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAgIGlmIChpdGVtW2NvbHVtbi5maWVsZF0gIT09IHVuZGVmaW5lZCAmJiBkYXRhW2lkXVtjb2x1bW4uZmllbGRdICE9PSB1bmRlZmluZWQgJiYgaXRlbVtjb2x1bW4uZmllbGRdICE9PSBkYXRhW2lkXVtjb2x1bW4uZmllbGRdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmxpbmsoaXRlbSwgY29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGl0ZW0sIGRhdGFbaWRdKTtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlRWRpdG9ySGFubGRlcihpdGVtKTtcclxuICAgICAgICB0aGlzLnN0b3BCbGluaygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmxpbmsoaXRlbTogR3JpZEl0ZW0sIGZpZWxkOiBzdHJpbmcpIHtcclxuICAgIGl0ZW0uYmxpbmtlciA9IGl0ZW0uYmxpbmtlciB8fCB7fTtcclxuICAgIGl0ZW0uYmxpbmtlcltmaWVsZF0gPSB0cnVlO1xyXG4gIH1cclxuICBwcml2YXRlIHN0b3BCbGluaygpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnZpZXdJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uYmxpbmtlciA9IHt9O1xyXG4gICAgICB9KTtcclxuICAgIH0sIDE1MDApO1xyXG4gIH1cclxuXHJcbiAgZGV0ZWN0Q2hhbmdlcyA9ICgpID0+IHtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZVZpZXdJdGVtcygpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gKHRoaXMuI3BhZ2luYXRvcj8ucGFnZUluZGV4IHx8IDApICsgMTtcclxuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy4jcGFnaW5hdG9yPy5wYWdlU2l6ZSB8fCA1MDtcclxuICAgIGRlbGV0ZSB0aGlzLnZpZXdJdGVtcztcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICB0aGlzLnZpZXdJdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBpbmRleCA+PSAoY3VycmVudFBhZ2UgLSAxKSAqIHBhZ2VTaXplXHJcbiAgICAgICAgICAmJiBpbmRleCA8IGN1cnJlbnRQYWdlICogcGFnZVNpemU7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy52aWV3SXRlbXMgPSB0aGlzLml0ZW1zO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgaXRlbS5ibGlua2VyID0gaXRlbS5ibGlua2VyIHx8IHt9O1xyXG4gICAgICBpdGVtLnN1YkluZm9ybWF0aW9uID0gaXRlbS5zdWJJbmZvcm1hdGlvbiB8fCB7fTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVkaXRlZEl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xyXG4gICAgICBpZiAoIWl0ZW0ub3JpZ2luSXRlbSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChPYmplY3Qua2V5cyhpdGVtLm9yaWdpbkl0ZW0pLnNvbWUoa2V5ID0+IGl0ZW0ub3JpZ2luSXRlbVtrZXldICE9PSBpdGVtW2tleV0pKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSkubWFwKGl0ZW0gPT4ge1xyXG4gICAgICBjb25zdCB7IHRlbXBvcmFyeSxcclxuICAgICAgICBvcmlnaW5JdGVtLFxyXG4gICAgICAgIGVkaXRvckhhbmRsZXIsXHJcbiAgICAgICAgZWRpdGluZ1N0YXR1cyxcclxuICAgICAgICBpc0NoZWNrZWQsXHJcbiAgICAgICAgc3ViSW5mb3JtYXRpb24sXHJcbiAgICAgICAgYmxpbmtlcixcclxuICAgICAgICAuLi5yZXN1bHQgfSA9IGl0ZW07XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFBhZ2UgPSAoKSA9PiB7XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdsb2NhbCcpIHtcclxuICAgICAgdGhpcy5yZWxvYWQodGhpcy5sb2NhbEl0ZW1zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVsb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaWx0ZXIgPSAocGFyYW0/OiB7IGZpbHRlcjogYW55LCBleHRlcm5hbEZpbHRlcjogYW55IH0pID0+IHtcclxuICAgIHRoaXMuZmlsdGVyID0gcGFyYW0/LmZpbHRlciB8fCB0aGlzLmZpbHRlcjtcclxuICAgIHRoaXMuZXh0ZXJuYWxGaWx0ZXIgPSBwYXJhbT8uZXh0ZXJuYWxGaWx0ZXIgfHwgdGhpcy5leHRlcm5hbEZpbHRlcjtcclxuICAgIHRoaXMuI3BhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgIHRoaXMucmVsb2FkKHRoaXMubG9jYWxJdGVtcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbG9hZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtcztcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBDaGVja2FibGVcclxuXHJcbiAgI3NldFNlbGVjdGVkSXRlbXMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uaXNDaGVja2VkKVxyXG4gICAgICAubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgdGVtcG9yYXJ5LFxyXG4gICAgICAgICAgb3JpZ2luSXRlbSxcclxuICAgICAgICAgIGVkaXRvckhhbmRsZXIsXHJcbiAgICAgICAgICBlZGl0aW5nU3RhdHVzLFxyXG4gICAgICAgICAgaXNDaGVja2VkLFxyXG4gICAgICAgICAgc3ViSW5mb3JtYXRpb24sXHJcbiAgICAgICAgICBibGlua2VyLFxyXG4gICAgICAgICAgLi4ucmVzdWx0IH0gPSBpdGVtO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DaGVjayA9IChpdGVtOiBHcmlkSXRlbSwgaXNDaGVja2JveD86IGJvb2xlYW4pID0+IHtcclxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9uLmNoZWNrYWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzQ2hlY2tib3gpIHtcclxuICAgICAgaXRlbS5pc0NoZWNrZWQgPSAhaXRlbS5pc0NoZWNrZWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzQ2hlY2tlZEFsbCA9IHRoaXMuaXRlbXMubGVuZ3RoID09PSB0aGlzLml0ZW1zLmZpbHRlcihlID0+IGUuaXNDaGVja2VkKS5sZW5ndGg7XHJcbiAgICB0aGlzLmdyaWRPcHRpb24ub25DaGVjaz8uKHRoaXMuaXRlbXMuZmlsdGVyKGUgPT4gZS5pc0NoZWNrZWQpLCBpdGVtKTtcclxuICAgIHRoaXMuI3NldFNlbGVjdGVkSXRlbXMoKTtcclxuICB9XHJcblxyXG4gIGNoZWNrQWxsKGlzQ2hlY2tlZEFsbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc0NoZWNrZWRBbGwgPSBpc0NoZWNrZWRBbGw7XHJcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiBpdGVtLmlzQ2hlY2tlZCA9IHRoaXMuaXNDaGVja2VkQWxsKTtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb24ub25DaGVjaykge1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb24ub25DaGVjayh0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uaXNDaGVja2VkKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLiNzZXRTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIFNvcnRcclxuICBzb3J0ID0gKGNvbHVtbjogU2RHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdjaGlsZHJlbicgfHwgY29sdW1uLnR5cGUgPT09ICdpbWFnZScpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc29ydGFibGUgPSB0aGlzLmdyaWRPcHRpb24uc29ydGFibGUgPz8gdHJ1ZTtcclxuICAgIGNvbnN0IGNvbHVtblNvcnRhYmxlID0gY29sdW1uLnNvcnRhYmxlID8/IHRydWU7XHJcbiAgICBpZiAoIXNvcnRhYmxlIHx8ICFjb2x1bW5Tb3J0YWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcmRlckJ5ID09PSBjb2x1bW4uZmllbGQpIHtcclxuICAgICAgdGhpcy5vcmRlckRpcmVjdGlvbiA9IHRoaXMub3JkZXJEaXJlY3Rpb24gPT09ICdBU0MnID8gJ0RFU0MnIDogJ0FTQyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9yZGVyQnkgPSBjb2x1bW4uZmllbGQ7XHJcbiAgICAgIHRoaXMub3JkZXJEaXJlY3Rpb24gPSAnQVNDJztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb24udHlwZSA9PT0gJ2xvY2FsJykge1xyXG4gICAgICB0aGlzLnJlbG9hZCh0aGlzLmxvY2FsSXRlbXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZWxvYWQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vICNyZWdpb24gUmVzaXplIEdyaWRcclxuICBwcml2YXRlIHJlc2l6ZSgpIHtcclxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi5oZWlnaHQpIHtcclxuICAgICAgdGhpcy5ncmlkQm9keS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuZ3JpZE9wdGlvbi5oZWlnaHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyaWRCb2R5Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7d2luZG93LmlubmVySGVpZ2h0IC0gMzAwfXB4YDtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gTOG6pXkgb2Zmc2V0IHRvcCDEkeG7gyDEkWnhu4F1IGNo4buJbmgga8OtY2ggdGjGsOG7m2MgR3JpZCB24burYSB24bubaSBtw6BuIGjDrG5oXHJcbiAgICAgICAgY29uc3QgdG9wID0gdGhpcy5ncmlkQm9keS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuICAgICAgICAvLyBjb25zdCB0b3AgPSAkKHRoaXMuZ3JpZEJvZHkubmF0aXZlRWxlbWVudCkub2Zmc2V0KCkudG9wO1xyXG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuZ3JpZE9wdGlvbi5oaWRlRm9vdGVyID8gMCA6ICh0aGlzLmlzTW9iaWxlT3JUYWJsZXQgPyA0NSA6IDU1KTtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0b3AgLSBib3R0b207XHJcbiAgICAgICAgdGhpcy5ncmlkQm9keS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcbiAgICAgIH0sIDApO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyBM4bqleSBvZmZzZXQgdG9wIMSR4buDIMSRaeG7gXUgY2jhu4luaCBrw61jaCB0aMaw4bubYyBHcmlkIHbhu6thIHbhu5tpIG3DoG4gaMOsbmhcclxuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLmdyaWRCb2R5Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgICAgIC8vIGNvbnN0IHRvcCA9ICQodGhpcy5ncmlkQm9keS5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS50b3A7XHJcbiAgICAgICAgY29uc3QgYm90dG9tID0gdGhpcy5ncmlkT3B0aW9uLmhpZGVGb290ZXIgPyAwIDogKHRoaXMuaXNNb2JpbGVPclRhYmxldCA/IDQ1IDogNTUpO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHRvcCAtIGJvdHRvbTtcclxuICAgICAgICB0aGlzLmdyaWRCb2R5Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuICAgICAgfSwgMjAwKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gTOG6pXkgb2Zmc2V0IHRvcCDEkeG7gyDEkWnhu4F1IGNo4buJbmgga8OtY2ggdGjGsOG7m2MgR3JpZCB24burYSB24bubaSBtw6BuIGjDrG5oXHJcbiAgICAgICAgY29uc3QgdG9wID0gdGhpcy5ncmlkQm9keS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuICAgICAgICAvLyBjb25zdCB0b3AgPSAkKHRoaXMuZ3JpZEJvZHkubmF0aXZlRWxlbWVudCkub2Zmc2V0KCkudG9wO1xyXG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuZ3JpZE9wdGlvbi5oaWRlRm9vdGVyID8gMCA6ICh0aGlzLmlzTW9iaWxlT3JUYWJsZXQgPyA0NSA6IDU1KTtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0b3AgLSBib3R0b207XHJcbiAgICAgICAgdGhpcy5ncmlkQm9keS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcbiAgICAgIH0sIDUwMCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vIEzhuqV5IG9mZnNldCB0b3AgxJHhu4MgxJFp4buBdSBjaOG7iW5oIGvDrWNoIHRoxrDhu5tjIEdyaWQgduG7q2EgduG7m2kgbcOgbiBow6xuaFxyXG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuZ3JpZEJvZHkubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XHJcbiAgICAgICAgLy8gY29uc3QgdG9wID0gJCh0aGlzLmdyaWRCb2R5Lm5hdGl2ZUVsZW1lbnQpLm9mZnNldCgpLnRvcDtcclxuICAgICAgICBjb25zdCBib3R0b20gPSB0aGlzLmdyaWRPcHRpb24uaGlkZUZvb3RlciA/IDAgOiAodGhpcy5pc01vYmlsZU9yVGFibGV0ID8gNDUgOiA1NSk7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gdG9wIC0gYm90dG9tO1xyXG4gICAgICAgIHRoaXMuZ3JpZEJvZHkubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICB9LCAxMDAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEhlaWdodChoZWlnaHQ/OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZ3JpZE9wdGlvbi5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICB0aGlzLnJlc2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW1wb3J0LCBFeHBvcnQsIENvbmZpZ1xyXG5cclxuICBsb2FkQ29uZmlnKGNvbmZpZ1Jlc3VsdDogQ29uZmlnUmVzdWx0KSB7XHJcbiAgICB0aGlzLmdyaWRPcHRpb24ucGFnaW5hdGUucGFnZVNpemUgPSBjb25maWdSZXN1bHQucGFnZVNpemU7XHJcbiAgICB0aGlzLmdyaWRPcHRpb24uY29sdW1ucyA9IGNvbmZpZ1Jlc3VsdC5jb2x1bW5zO1xyXG4gICAgdGhpcy5maXhlZENvbHVtbnMgPSBjb25maWdSZXN1bHQuZml4ZWRDb2x1bW5zO1xyXG4gICAgdGhpcy5ub3JtYWxDb2x1bW5zID0gY29uZmlnUmVzdWx0Lm5vcm1hbENvbHVtbnM7XHJcbiAgICB0aGlzLmNvbHVtbnMgPSBbLi4udGhpcy5maXhlZENvbHVtbnMsIC4uLnRoaXMubm9ybWFsQ29sdW1uc107XHJcbiAgICB0aGlzLmluaXRGaWx0ZXIoKTtcclxuICAgIHRoaXMuaW5pdERpY3Rpb25hcnlDb2x1bW5WYWx1ZXMoKTtcclxuICAgIHRoaXMucmVsb2FkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRGaWx0ZXIoKSB7XHJcbiAgICB0aGlzLmdyaWRPcHRpb24uY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgIC8vIEfDoW4gZ2nDoSB0cuG7iyBmaWx0ZXIgbeG6t2MgxJHhu4tuaCBjaG8gdOG7q25nIGPhu5l0XHJcbiAgICAgIHRoaXMuZmlsdGVyW2NvbHVtbi5maWVsZF0gPSB0aGlzLmZpbHRlcltjb2x1bW4uZmllbGRdID8/ICcnO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXREaWN0aW9uYXJ5Q29sdW1uVmFsdWVzKCkge1xyXG4gICAgdGhpcy5ncmlkT3B0aW9uLmNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICd2YWx1ZXMnKSB7XHJcbiAgICAgICAgY29sdW1uLmRpY3Rpb25hcnkgPSB7fTtcclxuICAgICAgICBpZiAoY29sdW1uLnZhbHVlcykge1xyXG4gICAgICAgICAgY29sdW1uLnZhbHVlcy5mb3JFYWNoKGUgPT4ge1xyXG4gICAgICAgICAgICBjb2x1bW4uZGljdGlvbmFyeVtlLnZhbHVlLnRvU3RyaW5nKCldID0ge1xyXG4gICAgICAgICAgICAgIHRleHQ6IGUudGV4dCxcclxuICAgICAgICAgICAgICBpY29uOiBlLmljb24sXHJcbiAgICAgICAgICAgICAgY29sb3I6IGUuY29sb3IsXHJcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBlLmJhY2tncm91bmRDb2xvclxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2NoaWxkcmVuJykge1xyXG4gICAgICAgIGNvbHVtbi5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkQ29sdW1uID0+IHtcclxuICAgICAgICAgIGlmIChjaGlsZENvbHVtbi50eXBlID09PSAndmFsdWVzJykge1xyXG4gICAgICAgICAgICBjaGlsZENvbHVtbi5kaWN0aW9uYXJ5ID0ge307XHJcbiAgICAgICAgICAgIGlmIChjaGlsZENvbHVtbi52YWx1ZXMpIHtcclxuICAgICAgICAgICAgICBjaGlsZENvbHVtbi52YWx1ZXMuZm9yRWFjaChlID0+IHtcclxuICAgICAgICAgICAgICAgIGNoaWxkQ29sdW1uLmRpY3Rpb25hcnlbZS52YWx1ZS50b1N0cmluZygpXSA9IHtcclxuICAgICAgICAgICAgICAgICAgdGV4dDogZS50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICBpY29uOiBlLmljb24sXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBlLmNvbG9yLFxyXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGUuYmFja2dyb3VuZENvbG9yXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVFZGl0b3JIYW5kbGVycygpIHtcclxuICAgIHRoaXMudmlld0l0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVFZGl0b3JIYW5sZGVyKGl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlRWRpdG9ySGFubGRlcihpdGVtOiBHcmlkSXRlbSkge1xyXG4gICAgLy8gaXRlbS5lZGl0b3JIYW5kbGVyID0gaXRlbS5lZGl0b3JIYW5kbGVyIHx8IHt9O1xyXG4gICAgdGhpcy5lZGl0b3JWaXNpYmxlUGlwZS50cmFuc2Zvcm0obnVsbCwgaXRlbSwgdGhpcy5ncmlkT3B0aW9uKTtcclxuICB9XHJcbiAgdHJhY2tCeUlkKGluZGV4LCBpdGVtKSB7XHJcbiAgICByZXR1cm4gaXRlbS5pZDtcclxuICB9XHJcblxyXG4gIGdldCBpc0ZpbHRlcmluZygpIHtcclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZmlsdGVyKS5zb21lKHZhbHVlID0+ICEhdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb25GaWx0ZXJQb3B1cCgpIHtcclxuICAgIGNvbnN0IGYxID0gSlNPTi5zdHJpbmdpZnkodGhpcy5maWx0ZXIpO1xyXG4gICAgY29uc3QgZjIgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmV4dGVybmFsRmlsdGVyKTtcclxuICAgIGNvbnN0IGZpbHRlciA9IEpTT04ucGFyc2UoZjEpO1xyXG4gICAgY29uc3QgZXh0ZXJuYWxGaWx0ZXIgPSBKU09OLnBhcnNlKGYyKTtcclxuICAgIHRoaXMuc2RHcmlkUG9wdXBGaWx0ZXIub3Blbih0aGlzLmZpeGVkQ29sdW1ucywgdGhpcy5ub3JtYWxDb2x1bW5zLCBmaWx0ZXIsIGV4dGVybmFsRmlsdGVyLCB0aGlzLmdyaWRPcHRpb24uZmlsdGVyPy5leHRlcm5hbEZpbHRlcnMpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJGaWx0ZXIgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmZpbHRlciA9IHt9O1xyXG4gICAgdGhpcy5leHRlcm5hbEZpbHRlciA9IHt9O1xyXG4gICAgdGhpcy5pbml0RmlsdGVyKCk7XHJcbiAgICB0aGlzLmluaXRFeHRlcm5hbEZpbHRlcigpO1xyXG4gICAgaWYgKHRoaXMuc2RHcmlkUG9wdXBGaWx0ZXIpIHtcclxuICAgICAgdGhpcy5zZEdyaWRQb3B1cEZpbHRlci5maWx0ZXIgPSB0aGlzLmZpbHRlcjtcclxuICAgICAgdGhpcy5zZEdyaWRQb3B1cEZpbHRlci5leHRlcm5hbEZpbHRlciA9IHRoaXMuZXh0ZXJuYWxGaWx0ZXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyRmlsdGVyID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jbGVhckZpbHRlcigpO1xyXG4gICAgdGhpcy5yZWxvYWQoKTtcclxuICB9XHJcblxyXG4gIGV4cGFuZE9yQ29sbGFwc2UgPSBhc3luYyAoZ3JpZEl0ZW06IEdyaWRJdGVtKSA9PiB7XHJcbiAgICBjb25zdCB7IHRlbXBvcmFyeSxcclxuICAgICAgb3JpZ2luSXRlbSxcclxuICAgICAgZWRpdG9ySGFuZGxlcixcclxuICAgICAgZWRpdGluZ1N0YXR1cyxcclxuICAgICAgaXNDaGVja2VkLFxyXG4gICAgICBzdWJJbmZvcm1hdGlvbixcclxuICAgICAgLi4uaXRlbSB9ID0gZ3JpZEl0ZW07XHJcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbi5zdWJJbmZvcm1hdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZ3JpZEl0ZW0uc3ViSW5mb3JtYXRpb24/LmlzT3BlbmVkKSB7XHJcbiAgICAgIGdyaWRJdGVtLnN1YkluZm9ybWF0aW9uLmlzT3BlbmVkID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb24uc3ViSW5mb3JtYXRpb24ubGF6eUxvYWRpbmcgJiYgIWdyaWRJdGVtLnN1YkluZm9ybWF0aW9uPy5pc0xvYWRlZCkge1xyXG4gICAgICBncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGdyaWRJdGVtLnN1YkluZm9ybWF0aW9uLnN1Ykl0ZW1zID0gYXdhaXQgdGhpcy5ncmlkT3B0aW9uLnN1YkluZm9ybWF0aW9uLm9uTG9hZChpdGVtKTtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZ3JpZEl0ZW0uc3ViSW5mb3JtYXRpb24uc3ViSXRlbXMpKSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeVNlcnZpY2UuYWxlcnQud2FybmluZyhgRGF0YSBpcyBub3QgYW4gYXJyYXlgKTtcclxuICAgICAgICAgIGdyaWRJdGVtLnN1YkluZm9ybWF0aW9uLnN1Ykl0ZW1zID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyaWRJdGVtLnN1YkluZm9ybWF0aW9uLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGdyaWRJdGVtLnN1YkluZm9ybWF0aW9uLmlzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICBncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5pc09wZW5lZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeVNlcnZpY2UuaGFuZGxlLmVycm9yKGVycik7XHJcbiAgICAgICAgZ3JpZEl0ZW0uc3ViSW5mb3JtYXRpb24uaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb24uc3ViSW5mb3JtYXRpb24ubGF6eUxvYWRpbmcgPT09IGZhbHNlICYmICFncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5pc0xvYWRlZCkge1xyXG4gICAgICBncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5zdWJJdGVtcyA9IGdyaWRJdGVtW3RoaXMuZ3JpZE9wdGlvbi5zdWJJbmZvcm1hdGlvbi5maWVsZF07XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5zdWJJdGVtcykpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeVNlcnZpY2UuYWxlcnQud2FybmluZyhgRGF0YSBpcyBub3QgYW4gYXJyYXlgKTtcclxuICAgICAgICBncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5zdWJJdGVtcyA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGdyaWRJdGVtLnN1YkluZm9ybWF0aW9uLmlzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgZ3JpZEl0ZW0uc3ViSW5mb3JtYXRpb24uaXNPcGVuZWQgPSB0cnVlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBncmlkSXRlbS5zdWJJbmZvcm1hdGlvbi5pc09wZW5lZCA9IHRydWU7XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIC8vI3JlZ2lvbiBFZGl0YWJsZVxyXG4gIG9uQ3JlYXRlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgeyB0eXBlLCBlZGl0b3IsIGNvbHVtbnMgfSA9IHRoaXMuZ3JpZE9wdGlvbjtcclxuICAgIGlmICghZWRpdG9yPy5hZGRhYmxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW06IEdyaWRJdGVtID0ge307XHJcbiAgICAvLyBHw6FuIGdpw6EgdHLhu4sgbeG6t2MgxJHhu4tuaFxyXG4gICAgY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ3ZhbHVlcycpIHtcclxuICAgICAgICBpdGVtW2NvbHVtbi5maWVsZF0gPSAnJztcclxuICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2Jvb2wnKSB7XHJcbiAgICAgICAgaXRlbVtjb2x1bW4uZmllbGRdID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICBpdGVtW2NvbHVtbi5maWVsZF0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGVkaXRvci5vbkFkZD8uKGl0ZW0pO1xyXG4gICAgLy8gxJDGsGEgaXRlbSBsw6puIGTDsm5nIMSR4bqndSB0acOqbiBu4bq/dSB0eXBlIGtow6FjIHBvcHVwXHJcbiAgICBpZiAoZWRpdG9yLnR5cGUgIT09ICdwb3B1cCcpIHtcclxuICAgICAgaWYgKHR5cGUgPT09ICdsb2NhbCcpIHtcclxuICAgICAgICB0aGlzLml0ZW1zLnNwbGljZSgwLCAwLCBpdGVtKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnZpZXdJdGVtcy5zcGxpY2UoMCwgMCwgaXRlbSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9uVXBkYXRlKGl0ZW0sIGZhbHNlKTtcclxuICB9XHJcbiAgb25VcGRhdGUgPSAoaXRlbTogR3JpZEl0ZW0sIGlzTW9kaWZpZWQ/OiBib29sZWFuKSA9PiB7XHJcbiAgICBjb25zdCB7IGVkaXRvciwgY29sdW1ucyB9ID0gdGhpcy5ncmlkT3B0aW9uO1xyXG4gICAgaXRlbS5lZGl0aW5nU3RhdHVzID0gaXNNb2RpZmllZCA/ICd1cGRhdGUnIDogJ2NyZWF0ZSc7XHJcbiAgICBpdGVtLnRlbXBvcmFyeSA9IHsgLi4uaXRlbSB9O1xyXG4gICAgdGhpcy5nZW5lcmF0ZUVkaXRvckhhbmxkZXIoaXRlbSk7XHJcbiAgICBpZiAoZWRpdG9yLnR5cGUgPT09ICdwb3B1cCcpIHtcclxuICAgICAgdGhpcy5zZEdyaWRQb3B1cEVkaXRvci5vcGVuKGl0ZW0sIGNvbHVtbnMsIGlzTW9kaWZpZWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBvblNhdmUgPSBhc3luYyAoaXRlbTogR3JpZEl0ZW0pID0+IHtcclxuICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzLmdyaWRPcHRpb247XHJcbiAgICB0cnkge1xyXG4gICAgICBpdGVtLmVkaXRvckhhbmRsZXIuc2F2aW5nID0gdHJ1ZTtcclxuICAgICAgaWYgKGVkaXRvci52YWxpZGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVkaXRvci52YWxpZGF0ZShpdGVtKTtcclxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHJlc3VsdDtcclxuICAgICAgICAgIGlmIChtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG1lc3NhZ2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVzdWx0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoZWRpdG9yLm9uU2F2ZSkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVkaXRvci5vblNhdmUoaXRlbSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgIGF3YWl0IHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpdGVtLmVkaXRpbmdTdGF0dXMgPT09ICdjcmVhdGUnICYmIGVkaXRvci50eXBlID09PSAncG9wdXAnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZSgwLCAwLCBpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52aWV3SXRlbXMuc3BsaWNlKDAsIDAsIGl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpdGVtLmVkaXRpbmdTdGF0dXMgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVFZGl0b3JIYW5sZGVyKGl0ZW0pO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHRoaXMubm90aWZ5U2VydmljZS5ub3RpZnkud2FybmluZyhlcnIpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgaXRlbS5lZGl0b3JIYW5kbGVyLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbCA9IChpdGVtOiBHcmlkSXRlbSkgPT4ge1xyXG4gICAgY29uc3QgeyBlZGl0b3IgfSA9IHRoaXMuZ3JpZE9wdGlvbjtcclxuICAgIGlmIChlZGl0b3IudHlwZSA9PT0gJ2lubGluZScpIHtcclxuICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbi50eXBlID09PSAnbG9jYWwnKSB7XHJcbiAgICAgICAgY29uc3QgaWR4MSA9IHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgICB0aGlzLml0ZW1zLnNwbGljZShpZHgxLCAxKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpZHgyID0gdGhpcy52aWV3SXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgdGhpcy52aWV3SXRlbXMuc3BsaWNlKGlkeDIsIDEpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoaXRlbS5lZGl0aW5nU3RhdHVzID09PSAnY3JlYXRlJykge1xyXG4gICAgICBpZiAoZWRpdG9yLnR5cGUgIT09ICdwb3B1cCcpIHtcclxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgPT09ICdsb2NhbCcpIHtcclxuICAgICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKDAsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZpZXdJdGVtcy5zcGxpY2UoMCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwgaXRlbS50ZW1wb3JhcnkpO1xyXG4gICAgICBpdGVtLmVkaXRpbmdTdGF0dXMgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVFZGl0b3JIYW5sZGVyKGl0ZW0pO1xyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRFeHRlcm5hbEZpbHRlciA9ICgpID0+IHtcclxuICAgIGlmICh0aGlzLmdyaWRPcHRpb24uZmlsdGVyPy5leHRlcm5hbEZpbHRlcnM/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmdyaWRPcHRpb24uZmlsdGVyLmV4dGVybmFsRmlsdGVycy5mb3JFYWNoKGV4dGVybmFsRmlsdGVyID0+IHtcclxuICAgICAgICBpZiAoZXh0ZXJuYWxGaWx0ZXIudHlwZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGlmIChleHRlcm5hbEZpbHRlci5kZWZhdWx0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZXJuYWxGaWx0ZXJbZXh0ZXJuYWxGaWx0ZXIuZmllbGRdID0gZXh0ZXJuYWxGaWx0ZXIuZGVmYXVsdCA/PyAnJztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV4dGVybmFsRmlsdGVyLnR5cGUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICBpZiAoZXh0ZXJuYWxGaWx0ZXIuZGVmYXVsdCkge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVybmFsRmlsdGVyW2V4dGVybmFsRmlsdGVyLmZpZWxkXSA9IGV4dGVybmFsRmlsdGVyLmRlZmF1bHQgPz8gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXh0ZXJuYWxGaWx0ZXIudHlwZSA9PT0gJ2RhdGVyYW5nZScpIHtcclxuICAgICAgICAgIHRoaXMuZXh0ZXJuYWxGaWx0ZXJbZXh0ZXJuYWxGaWx0ZXIuZmllbGRdID0ge1xyXG4gICAgICAgICAgICBmcm9tOiBleHRlcm5hbEZpbHRlci5kZWZhdWx0RnJvbSA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRvOiBleHRlcm5hbEZpbHRlci5kZWZhdWx0VG8gPz8gdW5kZWZpbmVkXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXh0ZXJuYWxGaWx0ZXIudHlwZSA9PT0gJ251bWJlcnJhbmdlJykge1xyXG4gICAgICAgICAgdGhpcy5leHRlcm5hbEZpbHRlcltleHRlcm5hbEZpbHRlci5maWVsZF0gPSB7XHJcbiAgICAgICAgICAgIGZyb206IGV4dGVybmFsRmlsdGVyLmRlZmF1bHRGcm9tID8/IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdG86IGV4dGVybmFsRmlsdGVyLmRlZmF1bHRUbyA/PyB1bmRlZmluZWRcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChleHRlcm5hbEZpbHRlci50eXBlID09PSAnZGF0ZXJhbmdlZnVsbCcpIHtcclxuICAgICAgICAgIHRoaXMuZXh0ZXJuYWxGaWx0ZXJbZXh0ZXJuYWxGaWx0ZXIuZmllbGRdID0ge1xyXG4gICAgICAgICAgICBmcm9tOiBleHRlcm5hbEZpbHRlci5kZWZhdWx0RnJvbSA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRvOiBleHRlcm5hbEZpbHRlci5kZWZhdWx0VG8gPz8gdW5kZWZpbmVkXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXh0ZXJuYWxGaWx0ZXIudHlwZSA9PT0gJ3ZhbHVlcycpIHsgLy8gYW5kbjFcclxuICAgICAgICAgIGlmIChleHRlcm5hbEZpbHRlci5kZWZhdWx0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZXJuYWxGaWx0ZXJbZXh0ZXJuYWxGaWx0ZXIuZmllbGRdID0gZXh0ZXJuYWxGaWx0ZXIuZGVmYXVsdCA/PyAnJztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIG9uU2VhcmNoID0gKHNlYXJjaFZhbHVlOiBzdHJpbmcsIGl0ZW06IEdyaWRJdGVtLCBjb2x1bW46IFNkR3JpZENvbHVtbikgPT4ge1xyXG4gICAgaXRlbVtjb2x1bW4uZmllbGRdID0gc2VhcmNoVmFsdWU7XHJcbiAgfVxyXG5cclxuICBvbkZpbHRlckNvbmZpZ3VyYXRpb25Mb2FkZWQgPSAocGFyYW06IEZpbHRlckNvbmZpZ3VyYXRpb24pID0+IHtcclxuICAgIHRoaXMucXVpY2tGaWx0ZXJzID0gcGFyYW0ucXVpY2tGaWx0ZXJzIHx8IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZFF1aWNrRmlsdGVyID0gcGFyYW0uc2VsZWN0ZWRRdWlja0ZpbHRlciB8fCAnJztcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkUXVpY2tGaWx0ZXIpIHtcclxuICAgICAgY29uc3QgcXVpY2tGaWx0ZXIgPSB0aGlzLnF1aWNrRmlsdGVycy5maW5kKGUgPT4gZS5jb2RlID09PSB0aGlzLnNlbGVjdGVkUXVpY2tGaWx0ZXIpO1xyXG4gICAgICBpZiAocXVpY2tGaWx0ZXIpIHtcclxuICAgICAgICBjb25zdCBmMSA9IEpTT04uc3RyaW5naWZ5KHF1aWNrRmlsdGVyLmZpbHRlcik7XHJcbiAgICAgICAgY29uc3QgZjIgPSBKU09OLnN0cmluZ2lmeShxdWlja0ZpbHRlci5leHRlcm5hbEZpbHRlcik7XHJcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBKU09OLnBhcnNlKGYxKTtcclxuICAgICAgICB0aGlzLmV4dGVybmFsRmlsdGVyID0gdGhpcy5yZWZyZXNoRXh0ZXJuYWxGaWx0ZXIodGhpcy5ncmlkT3B0aW9uPy5maWx0ZXI/LmV4dGVybmFsRmlsdGVycywgSlNPTi5wYXJzZShmMikpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmlubGluZUV4dGVybmFsID0gcGFyYW0uaW5saW5lRXh0ZXJuYWwgfHwge307XHJcbiAgICB0aGlzLmlubGluZUNvbHVtbiA9IHBhcmFtLmlubGluZUNvbHVtbiB8fCB7fTtcclxuICAgIHRoaXMucmVzaXplKCk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdFF1aWNrRmlsdGVyID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IHF1aWNrRmlsdGVyID0gdGhpcy5xdWlja0ZpbHRlcnMuZmluZChlID0+IGUuY29kZSA9PT0gdmFsdWUpO1xyXG4gICAgaWYgKHF1aWNrRmlsdGVyPy5jb2RlKSB7XHJcbiAgICAgIGNvbnN0IGYxID0gSlNPTi5zdHJpbmdpZnkocXVpY2tGaWx0ZXIuZmlsdGVyKTtcclxuICAgICAgY29uc3QgZjIgPSBKU09OLnN0cmluZ2lmeShxdWlja0ZpbHRlci5leHRlcm5hbEZpbHRlcik7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWlja0ZpbHRlciA9IHF1aWNrRmlsdGVyPy5jb2RlO1xyXG4gICAgICB0aGlzLmZpbHRlciA9IEpTT04ucGFyc2UoZjEpO1xyXG4gICAgICB0aGlzLmV4dGVybmFsRmlsdGVyID0gdGhpcy5yZWZyZXNoRXh0ZXJuYWxGaWx0ZXIodGhpcy5ncmlkT3B0aW9uPy5maWx0ZXI/LmV4dGVybmFsRmlsdGVycywgSlNPTi5wYXJzZShmMikpO1xyXG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFF1aWNrRmlsdGVyID0gJyc7XHJcbiAgICAgIHRoaXMub25DbGVhckZpbHRlcigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZEdyaWRQb3B1cEZpbHRlcj8udXBkYXRlQ29uZmlndXJhdGlvbih0aGlzLnNlbGVjdGVkUXVpY2tGaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRFeHBvcnRJdGVtcyA9IGFzeW5jIChwYWdlTnVtYmVyOiBudW1iZXIgPSAxLCBwYWdlU2l6ZTogbnVtYmVyID0gMTAwMDApID0+IHtcclxuICAgIGlmICh0aGlzLmlzTG9hZGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLnR5cGUgIT09ICdsb2NhbCcpIHtcclxuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyIGFzIElIYW5kbGVyU2VydmVyO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGhhbmRsZXIubWFwUmVxdWVzdCh0aGlzLmdldEZpbHRlckluZm8ocGFnZU51bWJlciwgcGFnZVNpemUpKTtcclxuICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9uLm1ldGhvZCA9PT0gJ0dFVCcpIHtcclxuICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmtleXMoZmlsdGVyKS5maWx0ZXIoa2V5ID0+IGZpbHRlcltrZXldICE9PSBudWxsICYmIGZpbHRlcltrZXldICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIC5tYXAoa2V5ID0+IGtleSArICc9JyArIGZpbHRlcltrZXldKS5qb2luKCcmJyk7XHJcbiAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdyaWRPcHRpb24udXJsLmluY2x1ZGVzKCc/JykgPyBgJHt0aGlzLmdyaWRPcHRpb24udXJsfSYke3F1ZXJ5U3RyaW5nfWAgOiBgJHt0aGlzLmdyaWRPcHRpb24udXJsfT8ke3F1ZXJ5U3RyaW5nfWA7XHJcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpU2VydmljZS5nZXQodXJsKTtcclxuICAgICAgICAgIHJldHVybiBoYW5kbGVyLm1hcFJlc3BvbnNlKHJlc3BvbnNlKS5pdGVtcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaVNlcnZpY2UucG9zdCh0aGlzLmdyaWRPcHRpb24udXJsLCBmaWx0ZXIpO1xyXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZXIubWFwUmVzcG9uc2UocmVzcG9uc2UpLml0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgbG9jYWxJdGVtcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXIgYXMgSUhhbmRsZXJMb2NhbDtcclxuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmdyaWRPcHRpb24uaXRlbXMpID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5ncmlkT3B0aW9uLml0ZW1zKCk7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cyBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgbG9jYWxJdGVtcyA9IGF3YWl0IHJlc3VsdHM7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsb2NhbEl0ZW1zID0gcmVzdWx0cztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9jYWxJdGVtcyA9IHRoaXMuZ3JpZE9wdGlvbi5pdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBoYW5kbGVyLmZpbHRlcihsb2NhbEl0ZW1zLCB7XHJcbiAgICAgICAgICBjdXN0b21GaWx0ZXI6IHRoaXMuZ3JpZE9wdGlvbi5maWx0ZXIuY3VzdG9tRmlsdGVyLFxyXG4gICAgICAgICAgcmF3RmlsdGVyOiB0aGlzLmZpbHRlcixcclxuICAgICAgICAgIGNvbHVtbnM6IHRoaXMuZ3JpZE9wdGlvbi5jb2x1bW5zLFxyXG4gICAgICAgICAgcmF3RXh0ZXJuYWxGaWx0ZXI6IHRoaXMuZXh0ZXJuYWxGaWx0ZXIsXHJcbiAgICAgICAgICBleHRlcm5hbEZpbHRlcnM6IHRoaXMuZ3JpZE9wdGlvbi5maWx0ZXI/LmV4dGVybmFsRmlsdGVycyxcclxuICAgICAgICAgIG9yZGVyQnk6IHRoaXMub3JkZXJCeSxcclxuICAgICAgICAgIG9yZGVyRGlyZWN0aW9uOiB0aGlzLm9yZGVyRGlyZWN0aW9uLFxyXG4gICAgICAgICAgcGFnZU51bWJlcixcclxuICAgICAgICAgIHBhZ2VTaXplXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLml0ZW1zO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLm5vdGlmeVNlcnZpY2UuaGFuZGxlLmVycm9yKGVycm9yKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmlsdGVySW5mbyA9IChwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBTZEdyaWRGaWx0ZXJJbmZvID0+IHtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKSkge1xyXG4gICAgICBpZiAodHlwZW9mICh0aGlzLmZpbHRlcltrZXldKSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0aGlzLmZpbHRlcltrZXldID0gdGhpcy5maWx0ZXJba2V5XS50cmltKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuZXh0ZXJuYWxGaWx0ZXIpKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgKHRoaXMuZXh0ZXJuYWxGaWx0ZXJba2V5XSkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdGhpcy5leHRlcm5hbEZpbHRlcltrZXldID0gdGhpcy5leHRlcm5hbEZpbHRlcltrZXldLnRyaW0oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY3VzdG9tRmlsdGVyOiB0aGlzLmdyaWRPcHRpb24uZmlsdGVyLmN1c3RvbUZpbHRlcixcclxuICAgICAgcmF3RmlsdGVyOiB0aGlzLmZpbHRlcixcclxuICAgICAgY29sdW1uczogdGhpcy5ncmlkT3B0aW9uLmNvbHVtbnMsXHJcbiAgICAgIHJhd0V4dGVybmFsRmlsdGVyOiB0aGlzLmV4dGVybmFsRmlsdGVyLFxyXG4gICAgICBleHRlcm5hbEZpbHRlcnM6IHRoaXMuZ3JpZE9wdGlvbi5maWx0ZXI/LmV4dGVybmFsRmlsdGVycyxcclxuICAgICAgb3JkZXJCeTogdGhpcy5vcmRlckJ5LFxyXG4gICAgICBvcmRlckRpcmVjdGlvbjogdGhpcy5vcmRlckRpcmVjdGlvbixcclxuICAgICAgcGFnZU51bWJlcixcclxuICAgICAgcGFnZVNpemVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBvbkV4cG9ydEJ5VGVtcGxhdGUgPSBhc3luYyAocGFyYW1zOiB7IGV4Y2VsQ29uZmlnOiBhbnksIGV4Y2VsQ29sdW1uczogYW55W10gfSkgPT4ge1xyXG4gICAgdGhpcy5sb2FkaW5nU2VydmljZS5zdGFydCgpO1xyXG4gICAgbGV0IGV4cG9ydEl0ZW1zID0gW107XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8uaXRlbXMpIHtcclxuICAgICAgZXhwb3J0SXRlbXMgPSBhd2FpdCB0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5pdGVtcyh0aGlzLmdldEZpbHRlckluZm8oMSwgMTAwMDApKS5maW5hbGx5KHRoaXMubG9hZGluZ1NlcnZpY2Uuc3RvcCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBleHBvcnRJdGVtcyA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0SXRlbXMoKS5maW5hbGx5KHRoaXMubG9hZGluZ1NlcnZpY2Uuc3RvcCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9uLmV4cG9ydD8ubWFwcGluZykge1xyXG4gICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5ncmlkT3B0aW9uLmV4cG9ydC5tYXBwaW5nKGV4cG9ydEl0ZW1zLCBwYXJhbXMuZXhjZWxDb25maWcubmFtZSk7XHJcbiAgICAgIGlmIChyZXN1bHRzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgIGV4cG9ydEl0ZW1zID0gYXdhaXQgcmVzdWx0cztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBleHBvcnRJdGVtcyA9IHJlc3VsdHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGNvbHVtbnMgPSBbLi4udGhpcy5ncmlkT3B0aW9uLmNvbHVtbnMsIC4uLih0aGlzLmdyaWRPcHRpb24uZXhwb3J0Py5jb2x1bW5zIHx8IFtdKV07XHJcbiAgICBjb25zdCBpdGVtcyA9IGV4cG9ydEl0ZW1zLm1hcChpdGVtID0+IHtcclxuICAgICAgY29uc3Qgb2JqOiBhbnkgPSB7fTtcclxuICAgICAgY29uc3QgaGFuZGxlID0gKGNvbHVtbjogU2RHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAnY2hpbGRyZW4nKSB7XHJcbiAgICAgICAgICBjb2x1bW4uY2hpbGRyZW4uZm9yRWFjaChoYW5kbGUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnRyYW5zZm9ybSkge1xyXG4gICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4udHJhbnNmb3JtKGl0ZW1bY29sdW1uLmZpZWxkXSwgaXRlbSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtW2NvbHVtbi5maWVsZF0gPT09IHVuZGVmaW5lZCB8fCBpdGVtW2NvbHVtbi5maWVsZF0gPT09IG51bGwgfHwgaXRlbVtjb2x1bW4uZmllbGRdID09PSAnJykge1xyXG4gICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSAnJztcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnc3RyaW5nJyB8fCBjb2x1bW4udHlwZSA9PT0gJ251bWJlcicgfHwgY29sdW1uLnR5cGUgPT09ICdjb2xvcicpIHtcclxuICAgICAgICAgIC8vIE7hur91IGNlbGwgbMOgIHN0cmluZyBob+G6t2MgbnVtYmVyIHRow6wgZ8OhbiBi4bqxbmcgY2jDrW5oIG7Ds1xyXG4gICAgICAgICAgb2JqW2NvbHVtbi5maWVsZF0gPSBpdGVtW2NvbHVtbi5maWVsZF07XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2Jvb2wnKSB7XHJcbiAgICAgICAgICAvLyBO4bq/dSBsw6AgYm9vbCB0aMOsIGfDoW4gYuG6sW5nIGdpw6EgdHLhu4sgdHJ1ZVZhbHVlIHbDoCBmYWxzZVZhbHVlIChu4bq/dSBjw7MpLCBt4bq3YyDEkeG7i25oIGzDoCBUUlVFL0ZBTFNFXHJcbiAgICAgICAgICBpZiAoaXRlbVtjb2x1bW4uZmllbGRdKSB7XHJcbiAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gY29sdW1uLnRydWVWYWx1ZSB8fCAnVHJ1ZSc7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGNvbHVtbi5mYWxzZVZhbHVlIHx8ICdGYWxzZSc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAvLyBO4bq/dSBsw6AgZGF0ZSB0aMOsIGNvbnZlcnQgdGhlbyDEkcO6bmcgZm9ybWF0XHJcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXRlbVtjb2x1bW4uZmllbGRdKTtcclxuICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSwgJ2RkL01NL3l5eXknKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnZGF0ZXRpbWUnKSB7XHJcbiAgICAgICAgICAvLyBO4bq/dSBsw6AgZGF0ZXRpbWUgdGjDrCBjb252ZXJ0IHRoZW8gxJHDum5nIGZvcm1hdFxyXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGl0ZW1bY29sdW1uLmZpZWxkXSk7XHJcbiAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICdkZC9NTS95eXl5IEhIOm1tOnNzJyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3RpbWUnKSB7XHJcbiAgICAgICAgICAvLyBO4bq/dSBsw6AgdGltZSB0aMOsIGNvbnZlcnQgdGhlbyDEkcO6bmcgZm9ybWF0XHJcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXRlbVtjb2x1bW4uZmllbGRdKTtcclxuICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSwgJ0hIOm1tOnNzJyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ3ZhbHVlcycpIHtcclxuICAgICAgICAgIC8vIE7hur91IGzDoCB2YWx1ZXMgdGjDrCBs4bqleSBnacOhIHRy4buLIGPhu6dhIHZhbHVlIMSRxrDhu6NjIGNo4buNblxyXG4gICAgICAgICAgY29uc3QgZGF0YSA9IGNvbHVtbi52YWx1ZXMuZmluZChlID0+IGUudmFsdWUgPT09IGl0ZW1bY29sdW1uLmZpZWxkXSk7XHJcbiAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBvYmpbY29sdW1uLmZpZWxkXSA9IGRhdGEudGV4dDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdyYWRpbycpIHtcclxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb2x1bW4udmFsdWVzLmZpbmQoZSA9PiBlW2NvbHVtbi52YWx1ZUZpZWxkXSA9PT0gaXRlbVtjb2x1bW4uZmllbGRdKTtcclxuICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gZGF0YVtjb2x1bW4uZGlzcGxheUZpZWxkXTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9ialtjb2x1bW4uZmllbGRdID0gaXRlbVtjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgY29sdW1ucy5mb3JFYWNoKGhhbmRsZSk7XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZXhwb3J0U2VydmljZS5leHBvcnRCeVRlbXBsYXRlKHtcclxuICAgICAgZmlsZVBhdGg6IHBhcmFtcy5leGNlbENvbmZpZy5mdWxsUGF0aCxcclxuICAgICAgY29sdW1uczogcGFyYW1zLmV4Y2VsQ29sdW1ucyxcclxuICAgICAgaXRlbXNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGludmFsaWRJdGVtcygpIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW1zLmZpbHRlcihlID0+IGUuZWRpdG9ySGFuZGxlcj8uZXJyb3JNZXNzYWdlKS5tYXAoZSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgdGVtcG9yYXJ5LFxyXG4gICAgICAgIG9yaWdpbkl0ZW0sXHJcbiAgICAgICAgZWRpdG9ySGFuZGxlcixcclxuICAgICAgICBlZGl0aW5nU3RhdHVzLFxyXG4gICAgICAgIGlzQ2hlY2tlZCxcclxuICAgICAgICBzdWJJbmZvcm1hdGlvbixcclxuICAgICAgICBibGlua2VyLFxyXG4gICAgICAgIC4uLml0ZW0gfSA9IGU7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaXRlbSxcclxuICAgICAgICBtZXNzYWdlOiBlLmVkaXRvckhhbmRsZXIuZXJyb3JNZXNzYWdlXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBncmlkSXRlbXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5tYXAoZSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgdGVtcG9yYXJ5LFxyXG4gICAgICAgIG9yaWdpbkl0ZW0sXHJcbiAgICAgICAgZWRpdG9ySGFuZGxlcixcclxuICAgICAgICBlZGl0aW5nU3RhdHVzLFxyXG4gICAgICAgIGlzQ2hlY2tlZCxcclxuICAgICAgICBzdWJJbmZvcm1hdGlvbixcclxuICAgICAgICBibGlua2VyLFxyXG4gICAgICAgIC4uLml0ZW0gfSA9IGU7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkVkaXRvckNoYW5nZSA9ICgpID0+IHtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgb25TZWxlY3RQYWdlU2l6ZSA9ICgpID0+IHtcclxuICAgIHRoaXMucmVsb2FkKCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgcmVmcmVzaEV4dGVybmFsRmlsdGVyID0gKGV4dGVybmFsRmlsdGVyczogU2RHcmlkRXh0ZXJuYWxGaWx0ZXJbXSwgZXh0ZXJuYWxGaWx0ZXI6IGFueSkgPT4ge1xyXG4gICAgZXh0ZXJuYWxGaWx0ZXIgPSBleHRlcm5hbEZpbHRlciB8fCB7fTtcclxuICAgIGV4dGVybmFsRmlsdGVycyA9IGV4dGVybmFsRmlsdGVycyB8fCBbXTtcclxuICAgIGV4dGVybmFsRmlsdGVycy5mb3JFYWNoKGUgPT4ge1xyXG4gICAgICBpZiAoZS50eXBlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGV4dGVybmFsRmlsdGVyW2UuZmllbGRdID0gZXh0ZXJuYWxGaWx0ZXJbZS5maWVsZF0gPz8gZS5kZWZhdWx0ID8/ICcnO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZS50eXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIGV4dGVybmFsRmlsdGVyW2UuZmllbGRdID0gZXh0ZXJuYWxGaWx0ZXJbZS5maWVsZF0gPz8gZS5kZWZhdWx0ID8/IHVuZGVmaW5lZDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGUudHlwZSA9PT0gJ2RhdGVyYW5nZScpIHtcclxuICAgICAgICBleHRlcm5hbEZpbHRlcltlLmZpZWxkXSA9IHtcclxuICAgICAgICAgIGZyb206IGV4dGVybmFsRmlsdGVyW2UuZmllbGRdPy5mcm9tID8/IGUuZGVmYXVsdEZyb20gPz8gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgdG86IGV4dGVybmFsRmlsdGVyW2UuZmllbGRdPy50byA/PyBlLmRlZmF1bHRUbyA/PyB1bmRlZmluZWRcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZS50eXBlID09PSAnbnVtYmVycmFuZ2UnKSB7XHJcbiAgICAgICAgZXh0ZXJuYWxGaWx0ZXJbZS5maWVsZF0gPSB7XHJcbiAgICAgICAgICBmcm9tOiBleHRlcm5hbEZpbHRlcltlLmZpZWxkXT8uZnJvbSA/PyBlLmRlZmF1bHRGcm9tID8/IHVuZGVmaW5lZCxcclxuICAgICAgICAgIHRvOiBleHRlcm5hbEZpbHRlcltlLmZpZWxkXT8udG8gPz8gZS5kZWZhdWx0VG8gPz8gdW5kZWZpbmVkXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGUudHlwZSA9PT0gJ2RhdGVyYW5nZWZ1bGwnKSB7XHJcbiAgICAgICAgZXh0ZXJuYWxGaWx0ZXJbZS5maWVsZF0gPSB7XHJcbiAgICAgICAgICBmcm9tOiBleHRlcm5hbEZpbHRlcltlLmZpZWxkXT8uZnJvbSA/PyBlLmRlZmF1bHRGcm9tID8/IHVuZGVmaW5lZCxcclxuICAgICAgICAgIHRvOiBleHRlcm5hbEZpbHRlcltlLmZpZWxkXT8udG8gPz8gZS5kZWZhdWx0VG8gPz8gdW5kZWZpbmVkXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGUudHlwZSA9PT0gJ3ZhbHVlcycpIHsgLy8gYW5kbjFcclxuICAgICAgICBleHRlcm5hbEZpbHRlcltlLmZpZWxkXSA9IChleHRlcm5hbEZpbHRlcltlLmZpZWxkXSB8fCBlLmRlZmF1bHQpID8/ICcnO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZXh0ZXJuYWxGaWx0ZXI7XHJcbiAgfVxyXG5cclxuICBvbkNyZWF0ZVF1aWNrRmlsdGVyID0gKGV2PzogRXZlbnQpID0+IHtcclxuICAgIHRoaXMubWF0U2VsZWN0Py5jbG9zZSgpO1xyXG4gICAgdGhpcy5vbkZpbHRlclBvcHVwKCk7XHJcbiAgICB0aGlzLnNkR3JpZFBvcHVwRmlsdGVyPy5jbG9zZSgpO1xyXG4gICAgdGhpcy5zZEdyaWRQb3B1cEZpbHRlcj8ub25DcmVhdGVRdWlja0ZpbHRlcihldik7XHJcbiAgfVxyXG5cclxuICBvbkVkaXRRdWlja0ZpbHRlciA9IChldjogRXZlbnQsIHF1aWNrRmlsdGVyPzogUXVpY2tGaWx0ZXIpID0+IHtcclxuICAgIHRoaXMubWF0U2VsZWN0Py5jbG9zZSgpO1xyXG4gICAgdGhpcy5vbkZpbHRlclBvcHVwKCk7XHJcbiAgICB0aGlzLnNkR3JpZFBvcHVwRmlsdGVyPy5jbG9zZSgpO1xyXG4gICAgdGhpcy5zZEdyaWRQb3B1cEZpbHRlcj8ub25FZGl0UXVpY2tGaWx0ZXIoZXYsIHF1aWNrRmlsdGVyKTtcclxuICB9XHJcblxyXG4gIG9uRGVsZXRlUXVpY2tGaWx0ZXIgPSAoZXY6IEV2ZW50LCBxdWlja0ZpbHRlcj86IFF1aWNrRmlsdGVyKSA9PiB7XHJcbiAgICB0aGlzLm1hdFNlbGVjdD8uY2xvc2UoKTtcclxuICAgIHRoaXMub25GaWx0ZXJQb3B1cCgpO1xyXG4gICAgdGhpcy5zZEdyaWRQb3B1cEZpbHRlcj8uY2xvc2UoKTtcclxuICAgIHRoaXMuc2RHcmlkUG9wdXBGaWx0ZXI/Lm9uRGVsZXRlUXVpY2tGaWx0ZXIoZXYsIHF1aWNrRmlsdGVyKTtcclxuICB9XHJcbn1cclxuIl19