UNPKG

@netgrif/components

Version:

Netgrif Application Engine frontend Angular components

193 lines 35.9 kB
import { Component, Inject, Optional, ViewChild } from '@angular/core'; import { AbstractCaseViewComponent, AllowedNetsService, AllowedNetsServiceFactory, CaseViewService, CategoryFactory, defaultCaseSearchCategoriesFactory, FilterType, NAE_CASE_REF_CREATE_CASE, NAE_CASE_REF_SEARCH, NAE_SEARCH_CATEGORIES, NAE_TAB_DATA, NAE_VIEW_ID_SEGMENT, OverflowService, SearchMode, SearchService, SimpleFilter, ViewIdService, DATA_FIELD_PORTAL_DATA, MultichoiceField, EnumerationField, NAE_DATAFIELD_ALLOWED_NETS, NAE_DEFAULT_HEADERS, NAE_CLICKABLE_CASES, NAE_OPEN_SINGLE_TASK, NAE_SINGLE_TASK_QUERY } from '@netgrif/components-core'; import { DefaultTabbedTaskViewComponent } from '../../tabbed/default-tabbed-task-view/default-tabbed-task-view.component'; import { DefaultTabbedSingleTaskViewComponent } from "../../tabbed/default-tabbed-single-task-view/default-tabbed-single-task-view.component"; import * as i0 from "@angular/core"; import * as i1 from "@netgrif/components-core"; import * as i2 from "@angular/common"; import * as i3 from "@ngbracket/ngx-layout"; import * as i4 from "@ngbracket/ngx-layout/extended"; import * as i5 from "../../../../../search/search-component/search.component"; import * as i6 from "../../../../../header/header.component"; import * as i7 from "../../../../../view/case-view/components/create-case-button/create-case-button.component"; import * as i8 from "../../../../../view/case-view/components/case-list-paginator/case-list-paginator.component"; const localAllowedNetsFactory = (factory, allowedNets) => { if (allowedNets?.length > 0) { return factory.createFromArray(allowedNets); } else { return factory.createWithAllNets(); } }; export class DefaultCaseRefListViewComponent extends AbstractCaseViewComponent { _injectedTabData; _dataFieldPortalData; _caseRefCreateCase; _caseRefSearch; _caseHeaders; _clickableCases; _openSingleTask; _singleTaskQuery; caseHeaderComponent; additionalFilterData; search; createCase; caseHeadersCount; constructor(caseViewService, overflowService, _injectedTabData, _dataFieldPortalData, _caseRefCreateCase = false, _caseRefSearch = false, _caseHeaders, _clickableCases = true, _openSingleTask = false, _singleTaskQuery) { super(caseViewService, overflowService, undefined, { enableCaseTitle: true, isCaseTitleRequired: true }); this._injectedTabData = _injectedTabData; this._dataFieldPortalData = _dataFieldPortalData; this._caseRefCreateCase = _caseRefCreateCase; this._caseRefSearch = _caseRefSearch; this._caseHeaders = _caseHeaders; this._clickableCases = _clickableCases; this._openSingleTask = _openSingleTask; this._singleTaskQuery = _singleTaskQuery; this.search = !!_caseRefSearch; this.createCase = !!_caseRefCreateCase; this.caseHeadersCount = this._caseHeaders?.length; } ngAfterViewInit() { this.initializeHeader(this.caseHeaderComponent); } isApproval() { return this._dataFieldPortalData?.dataField instanceof MultichoiceField || this._dataFieldPortalData?.dataField instanceof EnumerationField; } handleCaseClick(clickedCase) { if (this._injectedTabData !== null && this._clickableCases) { this.openTab(clickedCase); } } disabled() { return this._dataFieldPortalData?.dataField?.formControlRef.disabled; } openTab(openCase) { let baseFilter; if (this._singleTaskQuery !== undefined) { const query = JSON.parse(this._singleTaskQuery); if (query.query !== undefined) { query.query = query.query + ` AND caseId:${openCase.stringId}`; } else { if (query.case !== undefined) { query.case.id = openCase.stringId; } else { query.case = { id: `${openCase.stringId}` }; } } baseFilter = SimpleFilter.fromTaskQuery(query); } else { baseFilter = new SimpleFilter('', FilterType.TASK, { case: { id: `${openCase.stringId}` } }); } this._injectedTabData.tabViewRef.openTab({ label: { text: openCase.title, icon: openCase.icon ? openCase.icon : 'check_box' }, canBeClosed: true, tabContentComponent: this._openSingleTask ? DefaultTabbedSingleTaskViewComponent : DefaultTabbedTaskViewComponent, injectedObject: { baseFilter: baseFilter, allowedNets: [openCase.processIdentifier], navigationItemTaskData: this._injectedTabData.navigationItemTaskData, searchTypeConfiguration: { initialSearchMode: SearchMode.FULLTEXT, showSearchToggleButton: true }, showMoreMenu: true, headersChangeable: true, headersMode: ['sort', 'edit'], allowTableMode: true, defaultHeadersMode: 'sort' }, order: this._injectedTabData['tabViewOrder'], parentUniqueId: this._injectedTabData.tabUniqueId }, true, true); } createdCase(caze) { this.handleCaseClick(caze); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DefaultCaseRefListViewComponent, deps: [{ token: i1.CaseViewService }, { token: i1.OverflowService, optional: true }, { token: NAE_TAB_DATA, optional: true }, { token: DATA_FIELD_PORTAL_DATA, optional: true }, { token: NAE_CASE_REF_CREATE_CASE, optional: true }, { token: NAE_CASE_REF_SEARCH, optional: true }, { token: NAE_DEFAULT_HEADERS, optional: true }, { token: NAE_CLICKABLE_CASES, optional: true }, { token: NAE_OPEN_SINGLE_TASK, optional: true }, { token: NAE_SINGLE_TASK_QUERY, optional: true }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DefaultCaseRefListViewComponent, selector: "nc-default-case-view", providers: [ CategoryFactory, CaseViewService, SearchService, OverflowService, { provide: AllowedNetsService, useFactory: localAllowedNetsFactory, deps: [AllowedNetsServiceFactory, NAE_DATAFIELD_ALLOWED_NETS] }, { provide: NAE_VIEW_ID_SEGMENT, useValue: 'case' }, ViewIdService, { provide: NAE_SEARCH_CATEGORIES, useFactory: defaultCaseSearchCategoriesFactory, deps: [CategoryFactory] }, ], viewQueries: [{ propertyName: "caseHeaderComponent", first: true, predicate: ["header"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"case-view-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n\n <div class=\"case-view-search-container\">\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between\">\n <div fxLayoutAlign=\"start center\" fxFlex *ngIf=\"search\">\n <nc-search class=\"search-width\" [disabled]=\"disabled()\" [additionalFilterData]=\"additionalFilterData\"></nc-search>\n </div>\n <div fxLayoutAlign=\"end center\" *ngIf=\"createCase\">\n <nc-create-case-button [disabled]=\"disabled()\" [newCaseCreationConfig]=\"newCaseCreationConfig\" (caseCreatedEvent)=\"createdCase($event)\"></nc-create-case-button>\n </div>\n </div>\n </div>\n\n <div class=\"full-height transform-div custom-scrollbar\" [ngClass]=\"{'overflow-div': getOverflowStatus()}\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n <div class=\"full-height transform-div max-width-fix\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n <nc-header #header [type]=\"headerType\" [responsiveHeaders]=\"true\" class=\"case-header-padding\" [ngStyle]=\"{'width': getWidth()}\" [maxHeaderColumns]=\"caseHeadersCount\" [approval]=\"isApproval()\"></nc-header>\n\n <nc-case-list-paginator [selectedHeaders$]=\"selectedHeaders$\" [showDeleteMenu]=\"false\" [width]=\"getWidth()\" [approval]=\"isApproval()\" [disabled]=\"disabled()\"\n (caseClick)=\"handleCaseClick($event)\" [responsiveBody]=\"true\" fxFlex [textEllipsis]=\"true\"></nc-case-list-paginator>\n </div>\n </div>\n</div>\n\n", styles: [".case-view-container{margin:16px 24px;height:calc(100% - 32px);overflow:auto}@media screen and (max-width: 599.99px){.case-view-container{margin:12px}}.case-view-search-container{margin-top:16px;margin-bottom:2px;padding:0;max-height:50%}.case-header-padding{padding-top:16px;padding-left:1px;padding-right:1px}.font-size-20{font-size:20px}.search-width{width:100%}.search-fix{min-height:calc(100% + 2px);max-height:100%;overflow-y:auto}.full-height{height:100%}.overflow-div{overflow-x:scroll}.transform-div{transform:rotateX(180deg);-ms-transform:rotateX(180deg);-webkit-transform:rotateX(180deg)}.custom-scrollbar::-webkit-scrollbar{width:15px;height:15px;cursor:pointer}.max-width-fix{max-width:calc(100% - 8px)!important}.max-height{max-height:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i4.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "component", type: i5.SearchComponent, selector: "nc-search" }, { kind: "component", type: i6.HeaderComponent, selector: "nc-header" }, { kind: "component", type: i7.CreateCaseButtonComponent, selector: "nc-create-case-button", inputs: ["newCaseCreationConfig", "disabled"], outputs: ["caseCreatedEvent"] }, { kind: "component", type: i8.CaseListPaginatorComponent, selector: "nc-case-list-paginator" }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DefaultCaseRefListViewComponent, decorators: [{ type: Component, args: [{ selector: 'nc-default-case-view', providers: [ CategoryFactory, CaseViewService, SearchService, OverflowService, { provide: AllowedNetsService, useFactory: localAllowedNetsFactory, deps: [AllowedNetsServiceFactory, NAE_DATAFIELD_ALLOWED_NETS] }, { provide: NAE_VIEW_ID_SEGMENT, useValue: 'case' }, ViewIdService, { provide: NAE_SEARCH_CATEGORIES, useFactory: defaultCaseSearchCategoriesFactory, deps: [CategoryFactory] }, ], template: "<div class=\"case-view-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n\n <div class=\"case-view-search-container\">\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between\">\n <div fxLayoutAlign=\"start center\" fxFlex *ngIf=\"search\">\n <nc-search class=\"search-width\" [disabled]=\"disabled()\" [additionalFilterData]=\"additionalFilterData\"></nc-search>\n </div>\n <div fxLayoutAlign=\"end center\" *ngIf=\"createCase\">\n <nc-create-case-button [disabled]=\"disabled()\" [newCaseCreationConfig]=\"newCaseCreationConfig\" (caseCreatedEvent)=\"createdCase($event)\"></nc-create-case-button>\n </div>\n </div>\n </div>\n\n <div class=\"full-height transform-div custom-scrollbar\" [ngClass]=\"{'overflow-div': getOverflowStatus()}\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n <div class=\"full-height transform-div max-width-fix\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n <nc-header #header [type]=\"headerType\" [responsiveHeaders]=\"true\" class=\"case-header-padding\" [ngStyle]=\"{'width': getWidth()}\" [maxHeaderColumns]=\"caseHeadersCount\" [approval]=\"isApproval()\"></nc-header>\n\n <nc-case-list-paginator [selectedHeaders$]=\"selectedHeaders$\" [showDeleteMenu]=\"false\" [width]=\"getWidth()\" [approval]=\"isApproval()\" [disabled]=\"disabled()\"\n (caseClick)=\"handleCaseClick($event)\" [responsiveBody]=\"true\" fxFlex [textEllipsis]=\"true\"></nc-case-list-paginator>\n </div>\n </div>\n</div>\n\n", styles: [".case-view-container{margin:16px 24px;height:calc(100% - 32px);overflow:auto}@media screen and (max-width: 599.99px){.case-view-container{margin:12px}}.case-view-search-container{margin-top:16px;margin-bottom:2px;padding:0;max-height:50%}.case-header-padding{padding-top:16px;padding-left:1px;padding-right:1px}.font-size-20{font-size:20px}.search-width{width:100%}.search-fix{min-height:calc(100% + 2px);max-height:100%;overflow-y:auto}.full-height{height:100%}.overflow-div{overflow-x:scroll}.transform-div{transform:rotateX(180deg);-ms-transform:rotateX(180deg);-webkit-transform:rotateX(180deg)}.custom-scrollbar::-webkit-scrollbar{width:15px;height:15px;cursor:pointer}.max-width-fix{max-width:calc(100% - 8px)!important}.max-height{max-height:100%}\n"] }] }], ctorParameters: () => [{ type: i1.CaseViewService }, { type: i1.OverflowService, decorators: [{ type: Optional }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_TAB_DATA] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DATA_FIELD_PORTAL_DATA] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_CASE_REF_CREATE_CASE] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_CASE_REF_SEARCH] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_DEFAULT_HEADERS] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_CLICKABLE_CASES] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_OPEN_SINGLE_TASK] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_SINGLE_TASK_QUERY] }] }], propDecorators: { caseHeaderComponent: [{ type: ViewChild, args: ['header'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1jYXNlLXJlZi1saXN0LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzL3NyYy9saWIvbmF2aWdhdGlvbi9ncm91cC1uYXZpZ2F0aW9uLWNvbXBvbmVudC1yZXNvbHZlci9kZWZhdWx0LWNvbXBvbmVudHMvcmVmcy9kZWZhdWx0LWNhc2UtcmVmLWxpc3Qtdmlldy9kZWZhdWx0LWNhc2UtcmVmLWxpc3Qtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMvc3JjL2xpYi9uYXZpZ2F0aW9uL2dyb3VwLW5hdmlnYXRpb24tY29tcG9uZW50LXJlc29sdmVyL2RlZmF1bHQtY29tcG9uZW50cy9yZWZzL2RlZmF1bHQtY2FzZS1yZWYtbGlzdC12aWV3L2RlZmF1bHQtY2FzZS1yZWYtbGlzdC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BGLE9BQU8sRUFDSCx5QkFBeUIsRUFDekIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUV6QixlQUFlLEVBQ2YsZUFBZSxFQUNmLGtDQUFrQyxFQUNsQyxVQUFVLEVBQ1Ysd0JBQXdCLEVBQ3hCLG1CQUFtQixFQUVuQixxQkFBcUIsRUFDckIsWUFBWSxFQUNaLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsVUFBVSxFQUNWLGFBQWEsRUFDYixZQUFZLEVBRVosYUFBYSxFQUNiLHNCQUFzQixFQUV0QixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLDBCQUEwQixFQUMxQixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBRW5CLG9CQUFvQixFQUNwQixxQkFBcUIs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Qjt3QkFDUCxlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixlQUFlO3dCQUNmOzRCQUNJLE9BQU8sRUFBRSxrQkFBa0I7NEJBQzNCLFVBQVUsRUFBRSx1QkFBdUI7NEJBQ25DLElBQUksRUFBRSxDQUFDLHlCQUF5QixFQUFFLDBCQUEwQixDQUFDO3lCQUNoRTt3QkFDRCxFQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFDO3dCQUNoRCxhQUFhO3dCQUNiLEVBQUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxrQ0FBa0MsRUFBRSxJQUFJLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBQztxQkFDNUc7OzBCQVlZLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsWUFBWTs7MEJBQy9CLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsc0JBQXNCOzswQkFDekMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyx3QkFBd0I7OzBCQUMzQyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQ3RDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1COzswQkFDdEMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUN0QyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLG9CQUFvQjs7MEJBQ3ZDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMscUJBQXFCO3lDQWhCekIsbUJBQW1CO3NCQUE5QyxTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSW5qZWN0LCBPcHRpb25hbCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDYXNlVmlld0NvbXBvbmVudCxcbiAgICBBbGxvd2VkTmV0c1NlcnZpY2UsXG4gICAgQWxsb3dlZE5ldHNTZXJ2aWNlRmFjdG9yeSxcbiAgICBDYXNlLFxuICAgIENhc2VWaWV3U2VydmljZSxcbiAgICBDYXRlZ29yeUZhY3RvcnksXG4gICAgZGVmYXVsdENhc2VTZWFyY2hDYXRlZ29yaWVzRmFjdG9yeSxcbiAgICBGaWx0ZXJUeXBlLFxuICAgIE5BRV9DQVNFX1JFRl9DUkVBVEVfQ0FTRSxcbiAgICBOQUVfQ0FTRV9SRUZfU0VBUkNILFxuICAgIENhc2VSZWZGaWVsZCxcbiAgICBOQUVfU0VBUkNIX0NBVEVHT1JJRVMsXG4gICAgTkFFX1RBQl9EQVRBLFxuICAgIE5BRV9WSUVXX0lEX1NFR01FTlQsXG4gICAgT3ZlcmZsb3dTZXJ2aWNlLFxuICAgIFNlYXJjaE1vZGUsXG4gICAgU2VhcmNoU2VydmljZSxcbiAgICBTaW1wbGVGaWx0ZXIsXG4gICAgVGFza1NldERhdGFSZXF1ZXN0RmllbGRzLFxuICAgIFZpZXdJZFNlcnZpY2UsXG4gICAgREFUQV9GSUVMRF9QT1JUQUxfREFUQSxcbiAgICBEYXRhRmllbGRQb3J0YWxEYXRhLFxuICAgIE11bHRpY2hvaWNlRmllbGQsXG4gICAgRW51bWVyYXRpb25GaWVsZCxcbiAgICBOQUVfREFUQUZJRUxEX0FMTE9XRURfTkVUUyxcbiAgICBOQUVfREVGQVVMVF9IRUFERVJTLFxuICAgIE5BRV9DTElDS0FCTEVfQ0FTRVMsXG4gICAgRmlsdGVyLFxuICAgIE5BRV9PUEVOX1NJTkdMRV9UQVNLLFxuICAgIE5BRV9TSU5HTEVfVEFTS19RVUVSWVxufSBmcm9tICdAbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUnO1xuaW1wb3J0IHtIZWFkZXJDb21wb25lbnR9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2hlYWRlci9oZWFkZXIuY29tcG9uZW50J1xuaW1wb3J0IHtEZWZhdWx0VGFiYmVkVGFza1ZpZXdDb21wb25lbnR9IGZyb20gJy4uLy4uL3RhYmJlZC9kZWZhdWx0LXRhYmJlZC10YXNrLXZpZXcvZGVmYXVsdC10YWJiZWQtdGFzay12aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICAgIEluamVjdGVkVGFiYmVkVGFza1ZpZXdEYXRhV2l0aE5hdmlnYXRpb25JdGVtVGFza0RhdGFcbn0gZnJvbSBcIi4uLy4uL21vZGVsL2luamVjdGVkLXRhYmJlZC10YXNrLXZpZXctZGF0YS13aXRoLW5hdmlnYXRpb24taXRlbS10YXNrLWRhdGFcIjtcbmltcG9ydCB7XG4gICAgRGVmYXVsdFRhYmJlZFNpbmdsZVRhc2tWaWV3Q29tcG9uZW50XG59IGZyb20gXCIuLi8uLi90YWJiZWQvZGVmYXVsdC10YWJiZWQtc2luZ2xlLXRhc2stdmlldy9kZWZhdWx0LXRhYmJlZC1zaW5nbGUtdGFzay12aWV3LmNvbXBvbmVudFwiO1xuXG5jb25zdCBsb2NhbEFsbG93ZWROZXRzRmFjdG9yeSA9IChmYWN0b3J5OiBBbGxvd2VkTmV0c1NlcnZpY2VGYWN0b3J5LCBhbGxvd2VkTmV0czogQXJyYXk8c3RyaW5nPikgPT4ge1xuICAgIGlmIChhbGxvd2VkTmV0cz8ubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVGcm9tQXJyYXkoYWxsb3dlZE5ldHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZVdpdGhBbGxOZXRzKCk7XG4gICAgfVxufTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYy1kZWZhdWx0LWNhc2UtdmlldycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RlZmF1bHQtY2FzZS1yZWYtbGlzdC12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kZWZhdWx0LWNhc2UtcmVmLWxpc3Qtdmlldy5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBDYXRlZ29yeUZhY3RvcnksXG4gICAgICAgIENhc2VWaWV3U2VydmljZSxcbiAgICAgICAgU2VhcmNoU2VydmljZSxcbiAgICAgICAgT3ZlcmZsb3dTZXJ2aWNlLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBBbGxvd2VkTmV0c1NlcnZpY2UsXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiBsb2NhbEFsbG93ZWROZXRzRmFjdG9yeSxcbiAgICAgICAgICAgIGRlcHM6IFtBbGxvd2VkTmV0c1NlcnZpY2VGYWN0b3J5LCBOQUVfREFUQUZJRUxEX0FMTE9XRURfTkVUU11cbiAgICAgICAgfSxcbiAgICAgICAge3Byb3ZpZGU6IE5BRV9WSUVXX0lEX1NFR01FTlQsIHVzZVZhbHVlOiAnY2FzZSd9LFxuICAgICAgICBWaWV3SWRTZXJ2aWNlLFxuICAgICAgICB7cHJvdmlkZTogTkFFX1NFQVJDSF9DQVRFR09SSUVTLCB1c2VGYWN0b3J5OiBkZWZhdWx0Q2FzZVNlYXJjaENhdGVnb3JpZXNGYWN0b3J5LCBkZXBzOiBbQ2F0ZWdvcnlGYWN0b3J5XX0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRGVmYXVsdENhc2VSZWZMaXN0Vmlld0NvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Q2FzZVZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcblxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlcicpIHB1YmxpYyBjYXNlSGVhZGVyQ29tcG9uZW50OiBIZWFkZXJDb21wb25lbnQ7XG5cbiAgICBwdWJsaWMgYWRkaXRpb25hbEZpbHRlckRhdGE6IFRhc2tTZXREYXRhUmVxdWVzdEZpZWxkcztcbiAgICBwdWJsaWMgc2VhcmNoOiBib29sZWFuO1xuICAgIHB1YmxpYyBjcmVhdGVDYXNlOiBib29sZWFuO1xuICAgIHB1YmxpYyBjYXNlSGVhZGVyc0NvdW50O1xuXG4gICAgY29uc3RydWN0b3IoY2FzZVZpZXdTZXJ2aWNlOiBDYXNlVmlld1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgb3ZlcmZsb3dTZXJ2aWNlOiBPdmVyZmxvd1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfVEFCX0RBVEEpIHByb3RlY3RlZCBfaW5qZWN0ZWRUYWJEYXRhOiBJbmplY3RlZFRhYmJlZFRhc2tWaWV3RGF0YVdpdGhOYXZpZ2F0aW9uSXRlbVRhc2tEYXRhLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoREFUQV9GSUVMRF9QT1JUQUxfREFUQSkgcHJvdGVjdGVkIF9kYXRhRmllbGRQb3J0YWxEYXRhOiBEYXRhRmllbGRQb3J0YWxEYXRhPE11bHRpY2hvaWNlRmllbGQgfCBDYXNlUmVmRmllbGQgfCBFbnVtZXJhdGlvbkZpZWxkPixcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9DQVNFX1JFRl9DUkVBVEVfQ0FTRSkgcHJvdGVjdGVkIF9jYXNlUmVmQ3JlYXRlQ2FzZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkFFX0NBU0VfUkVGX1NFQVJDSCkgcHJvdGVjdGVkIF9jYXNlUmVmU2VhcmNoOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfREVGQVVMVF9IRUFERVJTKSBwcm90ZWN0ZWQgX2Nhc2VIZWFkZXJzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9DTElDS0FCTEVfQ0FTRVMpIHByb3RlY3RlZCBfY2xpY2thYmxlQ2FzZXM6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkFFX09QRU5fU0lOR0xFX1RBU0spIHByb3RlY3RlZCBfb3BlblNpbmdsZVRhc2s6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5BRV9TSU5HTEVfVEFTS19RVUVSWSkgcHJvdGVjdGVkIF9zaW5nbGVUYXNrUXVlcnk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihjYXNlVmlld1NlcnZpY2UsIG92ZXJmbG93U2VydmljZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBlbmFibGVDYXNlVGl0bGU6IHRydWUsXG4gICAgICAgICAgICBpc0Nhc2VUaXRsZVJlcXVpcmVkOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlYXJjaCA9ICEhX2Nhc2VSZWZTZWFyY2g7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2FzZSA9ICEhX2Nhc2VSZWZDcmVhdGVDYXNlO1xuICAgICAgICB0aGlzLmNhc2VIZWFkZXJzQ291bnQgPSB0aGlzLl9jYXNlSGVhZGVycz8ubGVuZ3RoO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplSGVhZGVyKHRoaXMuY2FzZUhlYWRlckNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQXBwcm92YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhRmllbGRQb3J0YWxEYXRhPy5kYXRhRmllbGQgaW5zdGFuY2VvZiBNdWx0aWNob2ljZUZpZWxkIHx8IHRoaXMuX2RhdGFGaWVsZFBvcnRhbERhdGE/LmRhdGFGaWVsZCBpbnN0YW5jZW9mIEVudW1lcmF0aW9uRmllbGQ7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUNhc2VDbGljayhjbGlja2VkQ2FzZTogQ2FzZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5faW5qZWN0ZWRUYWJEYXRhICE9PSBudWxsICAmJiB0aGlzLl9jbGlja2FibGVDYXNlcykge1xuICAgICAgICAgICAgdGhpcy5vcGVuVGFiKGNsaWNrZWRDYXNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFGaWVsZFBvcnRhbERhdGE/LmRhdGFGaWVsZD8uZm9ybUNvbnRyb2xSZWYuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9wZW5UYWIob3BlbkNhc2U6IENhc2UpIHtcbiAgICAgICAgbGV0IGJhc2VGaWx0ZXI6IEZpbHRlcjtcbiAgICAgICAgaWYgKHRoaXMuX3NpbmdsZVRhc2tRdWVyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9IEpTT04ucGFyc2UodGhpcy5fc2luZ2xlVGFza1F1ZXJ5KTtcbiAgICAgICAgICAgIGlmIChxdWVyeS5xdWVyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkucXVlcnkgPSBxdWVyeS5xdWVyeSArIGAgQU5EIGNhc2VJZDoke29wZW5DYXNlLnN0cmluZ0lkfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChxdWVyeS5jYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnkuY2FzZS5pZCA9IG9wZW5DYXNlLnN0cmluZ0lkXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnkuY2FzZSA9IHtpZDogYCR7b3BlbkNhc2Uuc3RyaW5nSWR9YH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmFzZUZpbHRlciA9IFNpbXBsZUZpbHRlci5mcm9tVGFza1F1ZXJ5KHF1ZXJ5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJhc2VGaWx0ZXIgPSBuZXcgU2ltcGxlRmlsdGVyKCcnLCBGaWx0ZXJUeXBlLlRBU0ssIHtjYXNlOiB7aWQ6IGAke29wZW5DYXNlLnN0cmluZ0lkfWB9fSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5qZWN0ZWRUYWJEYXRhLnRhYlZpZXdSZWYub3BlblRhYih7XG4gICAgICAgICAgICBsYWJlbDoge1xuICAgICAgICAgICAgICAgIHRleHQ6IG9wZW5DYXNlLnRpdGxlLFxuICAgICAgICAgICAgICAgIGljb246IG9wZW5DYXNlLmljb24gPyBvcGVuQ2FzZS5pY29uIDogJ2NoZWNrX2JveCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYW5CZUNsb3NlZDogdHJ1ZSxcbiAgICAgICAgICAgIHRhYkNvbnRlbnRDb21wb25lbnQ6IHRoaXMuX29wZW5TaW5nbGVUYXNrID8gRGVmYXVsdFRhYmJlZFNpbmdsZVRhc2tWaWV3Q29tcG9uZW50IDogRGVmYXVsdFRhYmJlZFRhc2tWaWV3Q29tcG9uZW50LFxuICAgICAgICAgICAgaW5qZWN0ZWRPYmplY3Q6IHtcbiAgICAgICAgICAgICAgICBiYXNlRmlsdGVyOiBiYXNlRmlsdGVyLFxuICAgICAgICAgICAgICAgIGFsbG93ZWROZXRzOiBbb3BlbkNhc2UucHJvY2Vzc0lkZW50aWZpZXJdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25JdGVtVGFza0RhdGE6IHRoaXMuX2luamVjdGVkVGFiRGF0YS5uYXZpZ2F0aW9uSXRlbVRhc2tEYXRhLFxuICAgICAgICAgICAgICAgIHNlYXJjaFR5cGVDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTZWFyY2hNb2RlOiBTZWFyY2hNb2RlLkZVTExURVhULFxuICAgICAgICAgICAgICAgICAgICBzaG93U2VhcmNoVG9nZ2xlQnV0dG9uOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaG93TW9yZU1lbnU6IHRydWUsXG4gICAgICAgICAgICAgICAgaGVhZGVyc0NoYW5nZWFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgaGVhZGVyc01vZGU6IFsnc29ydCcsICdlZGl0J10sXG4gICAgICAgICAgICAgICAgYWxsb3dUYWJsZU1vZGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdEhlYWRlcnNNb2RlOiAnc29ydCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcmRlcjogdGhpcy5faW5qZWN0ZWRUYWJEYXRhWyd0YWJWaWV3T3JkZXInXSxcbiAgICAgICAgICAgIHBhcmVudFVuaXF1ZUlkOiB0aGlzLl9pbmplY3RlZFRhYkRhdGEudGFiVW5pcXVlSWRcbiAgICAgICAgfSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlZENhc2UoY2F6ZTogQ2FzZSkge1xuICAgICAgICB0aGlzLmhhbmRsZUNhc2VDbGljayhjYXplKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FzZS12aWV3LWNvbnRhaW5lclwiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IHN0cmV0Y2hcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJjYXNlLXZpZXctc2VhcmNoLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW5cIj5cbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIGZ4RmxleCAqbmdJZj1cInNlYXJjaFwiPlxuICAgICAgICAgICAgICAgIDxuYy1zZWFyY2ggY2xhc3M9XCJzZWFyY2gtd2lkdGhcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiIFthZGRpdGlvbmFsRmlsdGVyRGF0YV09XCJhZGRpdGlvbmFsRmlsdGVyRGF0YVwiPjwvbmMtc2VhcmNoPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCIgKm5nSWY9XCJjcmVhdGVDYXNlXCI+XG4gICAgICAgICAgICAgICAgPG5jLWNyZWF0ZS1jYXNlLWJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiIFtuZXdDYXNlQ3JlYXRpb25Db25maWddPVwibmV3Q2FzZUNyZWF0aW9uQ29uZmlnXCIgKGNhc2VDcmVhdGVkRXZlbnQpPVwiY3JlYXRlZENhc2UoJGV2ZW50KVwiPjwvbmMtY3JlYXRlLWNhc2UtYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZ1bGwtaGVpZ2h0IHRyYW5zZm9ybS1kaXYgY3VzdG9tLXNjcm9sbGJhclwiIFtuZ0NsYXNzXT1cInsnb3ZlcmZsb3ctZGl2JzogZ2V0T3ZlcmZsb3dTdGF0dXMoKX1cIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBzdHJldGNoXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmdWxsLWhlaWdodCB0cmFuc2Zvcm0tZGl2IG1heC13aWR0aC1maXhcIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBzdHJldGNoXCI+XG4gICAgICAgICAgICA8bmMtaGVhZGVyICNoZWFkZXIgW3R5cGVdPVwiaGVhZGVyVHlwZVwiIFtyZXNwb25zaXZlSGVhZGVyc109XCJ0cnVlXCIgY2xhc3M9XCJjYXNlLWhlYWRlci1wYWRkaW5nXCIgW25nU3R5bGVdPVwieyd3aWR0aCc6IGdldFdpZHRoKCl9XCIgW21heEhlYWRlckNvbHVtbnNdPVwiY2FzZUhlYWRlcnNDb3VudFwiIFthcHByb3ZhbF09XCJpc0FwcHJvdmFsKClcIj48L25jLWhlYWRlcj5cblxuICAgICAgICAgICAgPG5jLWNhc2UtbGlzdC1wYWdpbmF0b3IgW3NlbGVjdGVkSGVhZGVycyRdPVwic2VsZWN0ZWRIZWFkZXJzJFwiIFtzaG93RGVsZXRlTWVudV09XCJmYWxzZVwiIFt3aWR0aF09XCJnZXRXaWR0aCgpXCIgW2FwcHJvdmFsXT1cImlzQXBwcm92YWwoKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXNlQ2xpY2spPVwiaGFuZGxlQ2FzZUNsaWNrKCRldmVudClcIiBbcmVzcG9uc2l2ZUJvZHldPVwidHJ1ZVwiIGZ4RmxleCBbdGV4dEVsbGlwc2lzXT1cInRydWVcIj48L25jLWNhc2UtbGlzdC1wYWdpbmF0b3I+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==