UNPKG

dynamic-display-shared

Version:

A library for dynamic view

389 lines 97.7 kB
import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; import { EventEmitter, Output, ViewChild, ElementRef, HostListener, ChangeDetectorRef } from '@angular/core'; import { EntityDetailsViewModel } from '../model/entity-details.view-model'; import { DeviceTypeService } from '../services/device-type.service'; import { EntityService } from '../services/entity.service'; import { Inject } from '@angular/core'; import { applyDownloadLink } from '../documents/documents.helper'; import { StorageService } from '../documents/storage.service'; import { ParametersGroup } from '../model/entity-details.view-model'; import { isSimpleParameter, isEntityParameter, getSimpleParameters } from '../model/view-model.helper'; import { MatDialog } from '@angular/material/dialog'; import { LongTextDialogComponent } from './long-text-dialog/long-text-dialog.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/material/expansion"; import * as i3 from "../services/entity.service"; import * as i4 from "../services/device-type.service"; import * as i5 from "../documents/storage.service"; import * as i6 from "@angular/material/tooltip"; import * as i7 from "@angular/material/dialog"; import * as i8 from "@angular/material/icon"; class EntitiesCollectionViewComponent { constructor() { } ngOnInit() { } } EntitiesCollectionViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: EntitiesCollectionViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); EntitiesCollectionViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: EntitiesCollectionViewComponent, selector: "app-entities-collection-view", inputs: { entityParameter: "entityParameter" }, ngImport: i0, template: "<div *ngIf=\"entityParameter\" class=\"entities-collection\">\r\n <app-inner-entity-details *ngIf=\"entityParameter.value.length === 1\"\r\n [entityDetailsViewModel]=\"entityParameter.value[0]\">\r\n </app-inner-entity-details>\r\n <div *ngIf=\"entityParameter.value.length > 1\">\r\n <mat-expansion-panel *ngIf=\"$any(entityParameter).enableExpansion\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{entityParameter.value[0].pluralEntitiesDescription}}\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n {{entityParameter.value.length}} {{entityParameter.value[0].pluralEntitiesDescription}}\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <app-entities-list [entities]=\"entityParameter.value\"></app-entities-list>\r\n\r\n </mat-expansion-panel>\r\n <div *ngIf=\"$any(!entityParameter).enableExpansion\">\r\n <app-entities-list [entities]=\"entityParameter.value\"></app-entities-list>\r\n </div>\r\n </div>\r\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i0.forwardRef(function () { return i2.MatExpansionPanel; }), selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i0.forwardRef(function () { return i2.MatExpansionPanelHeader; }), selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i0.forwardRef(function () { return i2.MatExpansionPanelTitle; }), selector: "mat-panel-title" }, { kind: "directive", type: i0.forwardRef(function () { return i2.MatExpansionPanelDescription; }), selector: "mat-panel-description" }, { kind: "component", type: i0.forwardRef(function () { return InnerEntityDetailsComponent; }), selector: "app-inner-entity-details", inputs: ["entityDetailsViewModel", "currentPage"], outputs: ["expantionOpened", "expantionClosed"] }, { kind: "component", type: i0.forwardRef(function () { return EntitiesListComponent; }), selector: "app-entities-list", inputs: ["displayEntitiesInline", "displayEntityBackground", "entities", "columnsNumber", "index", "isProcess"], outputs: ["entityClickEmitter"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: EntitiesCollectionViewComponent, decorators: [{ type: Component, args: [{ selector: 'app-entities-collection-view', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"entityParameter\" class=\"entities-collection\">\r\n <app-inner-entity-details *ngIf=\"entityParameter.value.length === 1\"\r\n [entityDetailsViewModel]=\"entityParameter.value[0]\">\r\n </app-inner-entity-details>\r\n <div *ngIf=\"entityParameter.value.length > 1\">\r\n <mat-expansion-panel *ngIf=\"$any(entityParameter).enableExpansion\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{entityParameter.value[0].pluralEntitiesDescription}}\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n {{entityParameter.value.length}} {{entityParameter.value[0].pluralEntitiesDescription}}\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <app-entities-list [entities]=\"entityParameter.value\"></app-entities-list>\r\n\r\n </mat-expansion-panel>\r\n <div *ngIf=\"$any(!entityParameter).enableExpansion\">\r\n <app-entities-list [entities]=\"entityParameter.value\"></app-entities-list>\r\n </div>\r\n </div>\r\n</div>" }] }], ctorParameters: function () { return []; }, propDecorators: { entityParameter: [{ type: Input }] } }); class EntitiesListComponent { constructor(entittService, deviceTypeService, changeDetector) { this.entittService = entittService; this.deviceTypeService = deviceTypeService; this.changeDetector = changeDetector; this.entityClickEmitter = new EventEmitter(); } ngOnInit() { this.deviceTypeService.isMobile$.subscribe(isMobile => { this.isMobile = isMobile; this.changeDetector.markForCheck(); }); } ngAfterViewInit() { if (this.isProcess && this.elementView && !this.isMobile) { this.equalHeightEntitiesList(); } } entityClick(entityDetailsViewModel) { console.log(`from entities list: ${entityDetailsViewModel.id}`); this.entityClickEmitter.emit(entityDetailsViewModel); } equalHeightEntitiesList() { this.viewHeight = this.elementView.nativeElement.offsetHeight; this.index === 0 ? this.entittService.innerEntitiesProcessHeight = [] : null; if ((this.index % 2) === 0) { if (!(this.entittService.innerEntitiesProcessHeight[this.index + 1])) { this.entittService.innerEntitiesProcessHeight[this.index] = this.viewHeight; document.getElementById(`entitiesList${this.index}`).style.height = this.entittService.innerEntitiesProcessHeight[this.index] + 'px'; } else { document.getElementById(`entitiesList${this.index}`).style.height = this.entittService.innerEntitiesProcessHeight[this.index] + 'px'; } } else { if (this.entittService.innerEntitiesProcessHeight[this.index - 1] > this.viewHeight) { this.entittService.innerEntitiesProcessHeight[this.index] = this.entittService.innerEntitiesProcessHeight[this.index - 1]; document.getElementById(`entitiesList${this.index}`).style.height = this.entittService.innerEntitiesProcessHeight[this.index] + 'px'; } else { this.entittService.innerEntitiesProcessHeight[this.index] = this.viewHeight; if (this.entittService.innerEntitiesProcessHeight[this.index - 1]) { this.entittService.innerEntitiesProcessHeight[this.index - 1] = this.entittService.innerEntitiesProcessHeight[this.index]; document.getElementById(`entitiesList${this.index - 1}`).style.height = this.entittService.innerEntitiesProcessHeight[this.index - 1] + 'px'; } } } } onResize() { if (this.index === undefined) { this.entittService.innerEntitiesProcessHeight = []; } else if (!this.isMobile) { this.equalHeightEntitiesList(); } } } EntitiesListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: EntitiesListComponent, deps: [{ token: i3.EntityService }, { token: i4.DeviceTypeService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); EntitiesListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: EntitiesListComponent, selector: "app-entities-list", inputs: { displayEntitiesInline: "displayEntitiesInline", displayEntityBackground: "displayEntityBackground", entities: "entities", columnsNumber: "columnsNumber", index: "index", isProcess: "isProcess" }, outputs: { entityClickEmitter: "entityClickEmitter" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "elementView", first: true, predicate: ["spanElement"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div *ngIf=\"entities\">\r\n <div id=\"column-count\" [style.column-count]=\"columnsNumber\" #entitiesListElement id=\"{{'entitiesList'+index}}\"\r\n [class.entities-background]=\"isProcess\">\r\n <div #spanElement>\r\n <div *ngFor=\"let entity of entities; index as i\" [class.entity-item-inline]=\"displayEntitiesInline\"\r\n [class.entity-item-in-collection]=\"!displayEntitiesInline\"\r\n [class.border-buttom]=\"i==entities.length-1 && isProcess\">\r\n <div [class.entity-background]=\"displayEntityBackground\">\r\n <app-inner-entity-details (click)=\"entityClick(entity)\" [entityDetailsViewModel]=\"entity\">\r\n </app-inner-entity-details>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".entity-item-in-collection{border-top:solid 1px #ddd}.entity-item-inline{display:inline-block}.entity-background{background-color:#62b0a763;margin:2px;width:max-content}.entities-background{background-color:#f5f5f5}.border-buttom{border-bottom:solid 1px #ddd}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i0.forwardRef(function () { return InnerEntityDetailsComponent; }), selector: "app-inner-entity-details", inputs: ["entityDetailsViewModel", "currentPage"], outputs: ["expantionOpened", "expantionClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: EntitiesListComponent, decorators: [{ type: Component, args: [{ selector: 'app-entities-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"entities\">\r\n <div id=\"column-count\" [style.column-count]=\"columnsNumber\" #entitiesListElement id=\"{{'entitiesList'+index}}\"\r\n [class.entities-background]=\"isProcess\">\r\n <div #spanElement>\r\n <div *ngFor=\"let entity of entities; index as i\" [class.entity-item-inline]=\"displayEntitiesInline\"\r\n [class.entity-item-in-collection]=\"!displayEntitiesInline\"\r\n [class.border-buttom]=\"i==entities.length-1 && isProcess\">\r\n <div [class.entity-background]=\"displayEntityBackground\">\r\n <app-inner-entity-details (click)=\"entityClick(entity)\" [entityDetailsViewModel]=\"entity\">\r\n </app-inner-entity-details>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".entity-item-in-collection{border-top:solid 1px #ddd}.entity-item-inline{display:inline-block}.entity-background{background-color:#62b0a763;margin:2px;width:max-content}.entities-background{background-color:#f5f5f5}.border-buttom{border-bottom:solid 1px #ddd}\n"] }] }], ctorParameters: function () { return [{ type: i3.EntityService }, { type: i4.DeviceTypeService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { displayEntitiesInline: [{ type: Input }], displayEntityBackground: [{ type: Input }], entities: [{ type: Input }], columnsNumber: [{ type: Input }], index: [{ type: Input }], isProcess: [{ type: Input }], entityClickEmitter: [{ type: Output }], elementView: [{ type: ViewChild, args: ['spanElement', { read: ElementRef, static: false }] }], onResize: [{ type: HostListener, args: ['window:resize', ['$event']] }] } }); class InnerEntityDetailsComponent { constructor(storageService, env) { this.storageService = storageService; this.env = env; this.expantionOpened = new EventEmitter(); this.expantionClosed = new EventEmitter(); this.isDisplayDevIndications = this.env.isDisplayDevIndications; this.mobWidth = (window.screen.width); } ngOnInit() { } getMoreClasses() { const defaultClass = 'entity-container'; if (this.entityDetailsViewModel.cssClasses) { console.log(this.entityDetailsViewModel.cssClasses); return `${defaultClass} ${this.entityDetailsViewModel.cssClasses}`; } else { return defaultClass; } } onResize() { this.mobWidth = (window.screen.width); } downloadDocument(parameter) { this.storageService.getReadSASTokenURL(parameter.storedFileName).subscribe(url => { applyDownloadLink(url, parameter.value, true); }); } groupCollectionOpen() { console.log("expantion opened event2 in inner-entity-details"); this.expantionOpened.emit(); } groupCollectionClosed() { this.expantionClosed.emit(); } getIsDisplayGroup(group) { let isDisplayGroup = false; let innerGroup = group; if (innerGroup) { for (let i = 0; i < innerGroup.parameters.length; i++) { if ((innerGroup.parameters[i].hideWhenEmptyValue === null || innerGroup.parameters[i].hideWhenEmptyValue === false) || (innerGroup.parameters[i].value !== null && innerGroup.parameters[i].value !== '')) { isDisplayGroup = true; break; } else { isDisplayGroup = false; } } } return isDisplayGroup; } } InnerEntityDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: InnerEntityDetailsComponent, deps: [{ token: i5.StorageService }, { token: 'env' }], target: i0.ɵɵFactoryTarget.Component }); InnerEntityDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: InnerEntityDetailsComponent, selector: "app-inner-entity-details", inputs: { entityDetailsViewModel: "entityDetailsViewModel", currentPage: "currentPage" }, outputs: { expantionOpened: "expantionOpened", expantionClosed: "expantionClosed" }, host: { listeners: { "window:resize": "onResize($event)" } }, ngImport: i0, template: "<div *ngIf=\"entityDetailsViewModel\" [class]=\"getMoreClasses()\"\r\n[matTooltip]=\"isDisplayDevIndications? this.entityDetailsViewModel.type + ', ' + entityDetailsViewModel.presentationEntityId + ' (' + entityDetailsViewModel.id + ', ' + entityDetailsViewModel.fixedId + ')': '' \" matTooltipPosition=\"above\">\r\n <!-- <span dir=\"ltr\" *ngIf=\"isDisplayDevIndications\"\r\n class=\"dev-indication\">{{entityDetailsViewModel.presentationEntityId}} ({{entityDetailsViewModel.id}}, {{entityDetailsViewModel.fixedId}})</span> -->\r\n <div *ngFor=\"let group of entityDetailsViewModel.parametersGroups; let i = index\" class=\"parameters-group\">\r\n <span *ngIf=\"entityDetailsViewModel.isDisplayDescription && i === 0 && mobWidth > 700\"\r\n class=\"title-parameter bold entity-description\">{{entityDetailsViewModel.description}}</span>\r\n <app-parameters-group *ngIf=\"getIsDisplayGroup(group)\" class=\"group-delimitation\" (expantionClosed)=\"groupCollectionClosed()\"\r\n (expantionOpened)=\"groupCollectionOpen()\" [group]=\"group\" (downloadDocument)=\"downloadDocument($event)\"\r\n [style.width.%]=\"100\" [currentPage]=\"currentPage\">\r\n </app-parameters-group>\r\n </div>\r\n</div>\r\n", styles: [".parameters-group{display:flex;align-items:center}.parameters-group .parameters-group{padding:0!important}.entity-description{padding:10px 10px 10px 0}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i6.MatTooltip; }), selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i0.forwardRef(function () { return ParametersGroupComponent; }), selector: "app-parameters-group", inputs: ["group", "cssClasses", "currentPage"], outputs: ["downloadDocument", "expantionOpened", "expantionClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: InnerEntityDetailsComponent, decorators: [{ type: Component, args: [{ selector: 'app-inner-entity-details', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"entityDetailsViewModel\" [class]=\"getMoreClasses()\"\r\n[matTooltip]=\"isDisplayDevIndications? this.entityDetailsViewModel.type + ', ' + entityDetailsViewModel.presentationEntityId + ' (' + entityDetailsViewModel.id + ', ' + entityDetailsViewModel.fixedId + ')': '' \" matTooltipPosition=\"above\">\r\n <!-- <span dir=\"ltr\" *ngIf=\"isDisplayDevIndications\"\r\n class=\"dev-indication\">{{entityDetailsViewModel.presentationEntityId}} ({{entityDetailsViewModel.id}}, {{entityDetailsViewModel.fixedId}})</span> -->\r\n <div *ngFor=\"let group of entityDetailsViewModel.parametersGroups; let i = index\" class=\"parameters-group\">\r\n <span *ngIf=\"entityDetailsViewModel.isDisplayDescription && i === 0 && mobWidth > 700\"\r\n class=\"title-parameter bold entity-description\">{{entityDetailsViewModel.description}}</span>\r\n <app-parameters-group *ngIf=\"getIsDisplayGroup(group)\" class=\"group-delimitation\" (expantionClosed)=\"groupCollectionClosed()\"\r\n (expantionOpened)=\"groupCollectionOpen()\" [group]=\"group\" (downloadDocument)=\"downloadDocument($event)\"\r\n [style.width.%]=\"100\" [currentPage]=\"currentPage\">\r\n </app-parameters-group>\r\n </div>\r\n</div>\r\n", styles: [".parameters-group{display:flex;align-items:center}.parameters-group .parameters-group{padding:0!important}.entity-description{padding:10px 10px 10px 0}\n"] }] }], ctorParameters: function () { return [{ type: i5.StorageService }, { type: undefined, decorators: [{ type: Inject, args: ['env'] }] }]; }, propDecorators: { entityDetailsViewModel: [{ type: Input }], currentPage: [{ type: Input }], expantionOpened: [{ type: Output }], expantionClosed: [{ type: Output }], onResize: [{ type: HostListener, args: ['window:resize', ['$event']] }] } }); class ParametersGroupComponent { constructor(cd, dialog, deviceTypeService, changeDetector, env) { this.cd = cd; this.dialog = dialog; this.deviceTypeService = deviceTypeService; this.changeDetector = changeDetector; this.env = env; this.isDisplayDevIndications = this.env.isDisplayDevIndications; this.downloadDocument = new EventEmitter(); this.expantionOpened = new EventEmitter(); this.expantionClosed = new EventEmitter(); this.counter = 0; } set group(value) { this._group = value; this.cd.markForCheck(); } get group() { return this._group; } get parameters() { return this.group.parameters.filter(p => !this.currentPage || p.page == this.currentPage); } ngOnInit() { this.deviceTypeService.isMobile$.subscribe(isMobile => { this.isMobile = isMobile; this.changeDetector.markForCheck(); }); } getValueCssClassName(parameter) { if (parameter.metadata.fieldType === 8 && parameter.value && (parameter.value.slice(parameter.value.length - 1) !== '%')) { parameter.value = (parameter.value) + '%'; } return parameter.valueCssClassName ? parameter.valueCssClassName : 'simple-parameter'; } getParameterValue(parameter) { if (parameter.isMulti) { return parameter.value.join(','); } else if (parameter.value) { if (parameter.charactersNumber && parameter.value.length > parameter.charactersNumber) { return parameter.value.slice(0, parameter.charactersNumber) + '...'; } else if (parameter.value.length > 40 && this.isMobile) { return parameter.value.slice(0, 40) + '...'; } else if (parameter.value.length > 70) { return parameter.value.slice(0, 70) + '...'; } return parameter.value === "False" ? "לא" : parameter.value === "True" ? "כן" : parameter.value; } return parameter.value; } isLongValue(parameter) { if (parameter.value === this.getParameterValue(parameter) || (parameter.isMulti)) { return false; } return true; } getLabelCssClassName(parameter) { return parameter.labelCssClassName ? parameter.labelCssClassName : 'simple-parameter'; } valueClick(parameter) { if (this.isLongValue(parameter)) { const dialogRef = this.dialog.open(LongTextDialogComponent, { width: '60%', data: { title: parameter.displayName ? parameter.displayName : parameter.metadata.name, longText: parameter.value }, direction: 'rtl', }); } } isSimpleParameter(parameter) { return isSimpleParameter(parameter); } isEntityParameter(parameter) { return isEntityParameter(parameter); } log(message) { console.log(message); } getIconColor(iconName) { // temporary.... return iconName.includes('warning') ? 'warn' : 'primary'; } getIconClass(iconName) { // temporary.... return iconName.includes('warning') ? 'warning' : 'standard-icon'; } getLabelLocation(parameter) { if ((window.screen.width < 700) && (parameter.labelLocation === 3)) { return 1; } else { return parameter.labelLocation; } } downloadDocumentEmit(parameter) { this.downloadDocument.emit(parameter); } groupCollectionOpen() { console.log("open expantion event1 in parameters-group"); this.expantionOpened.emit(); } groupCollectionClosed() { this.expantionClosed.emit(); } } ParametersGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: ParametersGroupComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i7.MatDialog }, { token: i4.DeviceTypeService }, { token: i0.ChangeDetectorRef }, { token: 'env' }], target: i0.ɵɵFactoryTarget.Component }); ParametersGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: ParametersGroupComponent, selector: "app-parameters-group", inputs: { group: "group", cssClasses: "cssClasses", currentPage: "currentPage" }, outputs: { downloadDocument: "downloadDocument", expantionOpened: "expantionOpened", expantionClosed: "expantionClosed" }, ngImport: i0, template: "<div *ngIf=\"group\" class=\"layout\">\r\n <span *ngFor=\"let parameter of parameters\" [class.snap-left]=\"$any(parameter).snapLeft\" class=\"parameters-group-collection\">\r\n <span *ngIf=\"isSimpleParameter(parameter) && !($any(parameter).hideWhenEmptyValue && !parameter.value)\"\r\n class=\"parameter-container\" [matTooltip]=\"isDisplayDevIndications? $any(parameter).metadata.id: null\" matTooltipPosition=\"right\">\r\n <!-- <span *ngIf=\"isDisplayDevIndications\" class=\"parameter-metadata-id\">{{parameter.metadata.id}}</span> -->\r\n <mat-icon *ngIf=\"$any(parameter).iconName\" [color]=\"getIconColor($any(parameter).iconName)\" [inline]=\"true\">\r\n {{$any(parameter).iconName}}</mat-icon>\r\n <span [ngSwitch]=\"getLabelLocation(parameter)\">\r\n <!-- [class]=\"getIconClass(parameter.iconName)\" -->\r\n <span *ngSwitchCase=\"3\" class=\"parameter-label-stack-container-span\" [class.snap-left]=\"$any(parameter).snapLeft\">\r\n <div class=\"parameter-label-stack-container\">\r\n <div class=\"parameter-label-stack first {{getValueCssClassName(parameter)}}\"\r\n [class.long-text]=\"isLongValue(parameter)\" (click)=\"valueClick(parameter)\">\r\n {{getParameterValue(parameter)}}</div>\r\n <div class=\"parameter-label-stack second {{getLabelCssClassName(parameter)}}\">{{parameter.displayName? parameter.displayName: $any(parameter).metadata.name}}\r\n </div>\r\n </div>\r\n </span>\r\n <span *ngSwitchCase=\"4\" class=\"parameter-label-stack-container-span\" [class.snap-left]=\"$any(parameter).snapLeft\">\r\n <div class=\"parameter-label-stack-container\">\r\n <div class=\"parameter-label-stack first {{getValueCssClassName(parameter)}}\"\r\n [class.long-text]=\"isLongValue(parameter)\" (click)=\"valueClick(parameter)\">\r\n {{parameter.displayName? parameter.displayName: $any(parameter).metadata.name}}</div>\r\n <div class=\"parameter-label-stack second {{getLabelCssClassName(parameter)}}\">{{getParameterValue(parameter)}}\r\n </div>\r\n </div>\r\n </span>\r\n <span *ngSwitchCase=\"0\" class=\"{{getLabelCssClassName(parameter)}}\" [class.snap-left]=\"$any(parameter).snapLeft\">\r\n <span *ngIf=\" !$any(parameter).isLink\" class=\"simple-text {{getValueCssClassName(parameter)}}\"\r\n [class.long-text]=\"isLongValue(parameter)\" (click)=\"valueClick(parameter)\">{{getParameterValue(parameter)}}\r\n </span>\r\n <a *ngIf=\"$any(parameter).isLink\" href=\"{{parameter.value}}\"\r\n target=\"_blank\">{{$any(parameter).linkDescription ? $any(parameter).linkDescription : parameter.value}}</a>\r\n\r\n </span>\r\n <span *ngSwitchCase=\"1\" [class.snap-left]=\"$any(parameter).snapLeft\">\r\n <span class=\"simple-label {{getLabelCssClassName(parameter)}}\">{{parameter.displayName? parameter.displayName: $any(parameter).metadata.name}}\r\n </span>\r\n\r\n <span *ngIf=\"$any(parameter).metadata.fieldType !== 11; else fileView\">\r\n <span *ngIf=\"!$any(parameter).isLink\" class=\"simple-text {{getValueCssClassName(parameter)}}\"\r\n [class.long-text]=\"isLongValue(parameter)\"\r\n (click)=\"valueClick(parameter)\">{{getParameterValue(parameter)}}\r\n </span>\r\n </span>\r\n\r\n <ng-template #fileView>\r\n <a *ngIf=\"parameter.value\" (click)=\"downloadDocumentEmit(parameter)\" class=\"file-link\"\r\n target=\"_blank\"><span>\r\n {{parameter.value}}\r\n </span></a>\r\n <span *ngIf=\"!parameter.value\" class=\"no-doc\">\u05D0\u05D9\u05DF \u05DE\u05E1\u05DE\u05DA</span>\r\n </ng-template>\r\n\r\n <a *ngIf=\"$any(parameter).isLink\" href=\"{{parameter.value}}\" target=\"_blank\">{{$any(parameter).linkDescription}}</a>\r\n </span>\r\n\r\n <span *ngSwitchCase=\"2\" [class.snap-left]=\"$any(parameter).snapLeft\">\r\n <span *ngIf=\"!$any(parameter).isLink\" class=\"simple-label {{getValueCssClassName(parameter)}}\"\r\n [class.long-text]=\"isLongValue(parameter)\" (click)=\"valueClick(parameter)\">{{getParameterValue(parameter)}}\r\n </span>\r\n <span class=\"simple-text {{getLabelCssClassName(parameter)}}\">{{parameter.displayName? parameter.displayName: $any(parameter).metadata.name}}\r\n </span>\r\n\r\n <a *ngIf=\"$any(parameter).isLink\" href=\"{{parameter.value}}\" target=\"_blank\">{{$any(parameter).linkDescription}}</a>\r\n </span>\r\n </span>\r\n\r\n </span>\r\n\r\n <span *ngIf=\"isEntityParameter(parameter)\" >\r\n\r\n <app-groups-collection (expantionClosed)=\"groupCollectionClosed()\" (expantionOpened)=\"groupCollectionOpen()\" *ngIf=\"$any(parameter).groupByParameterId\" [entityParameter]=\"parameter\" class=\"group-collection\">\r\n </app-groups-collection>\r\n <app-entities-collection-view *ngIf=\"!$any(parameter).groupByParameterId\" [entityParameter]=\"parameter\">\r\n </app-entities-collection-view>\r\n </span>\r\n </span>\r\n\r\n</div>\r\n", styles: [".label-under{color:red}.parameter-label-stack-container{position:relative;width:130px;display:inline-block;height:40px}.parameter-label-stack{position:absolute;display:inline-block;width:100%;text-align:center}.snap-left{float:left;margin-right:auto}.first{z-index:1}.second{margin-top:15px;z-index:2}.top-big-value{font-size:20pt}.bottom-gray-small-label{margin-top:30px!important;font-size:smaller;color:#a5a2a2}.simple-text{display:inline-block;margin-left:5px}.group-key{font-weight:700}.warning{color:#dc143c}.standard-icon{color:gray}.parameters-group .parameters-group{padding:0!important}.layout{display:inline-flex;align-items:center;flex-flow:row wrap;width:100%;padding:10px}.parameter-container{display:flex;flex-flow:row nowrap}@media screen and (orientation: portrait) and (max-width: 700px){.layout{width:unset}.top-big-value{font-style:normal;line-height:29px;margin-left:3px;font-weight:700;color:#5f9ea0;font-size:15px}.bottom-gray-small-label{font-size:15px;color:#000}.simple-text{margin-left:5px;display:initial}.snap-left{margin-right:0}}.snap-left{margin-right:0}.long-text{width:-moz-fit-content;width:fit-content;white-space:nowrap;cursor:pointer}.file-link{text-decoration:underline;margin-right:14px}.no-doc{font-weight:700;color:#b9aeb9;margin-right:7px}\n"], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return i1.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgSwitch; }), selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i0.forwardRef(function () { return i1.NgSwitchCase; }), selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i0.forwardRef(function () { return i8.MatIcon; }), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i0.forwardRef(function () { return i6.MatTooltip; }), selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i0.forwardRef(function () { return EntitiesCollectionViewComponent; }), selector: "app-entities-collection-view", inputs: ["entityParameter"] }, { kind: "component", type: i0.forwardRef(function () { return GroupsCollectionComponent; }), selector: "app-groups-collection", inputs: ["entityParameter"], outputs: ["expantionOpened", "expantionClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: ParametersGroupComponent, decorators: [{ type: Component, args: [{ selector: 'app-parameters-group', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"group\" class=\"layout\">\r\n <span *ngFor=\"let parameter of parameters\" [class.snap-left]=\"$any(parameter).snapLeft\" class=\"parameters-group-collection\">\r\n <span *ngIf=\"isSimpleParameter(parameter) && !($any(parameter).hideWhenEmptyValue && !parameter.value)\"\r\n class=\"parameter-container\" [matTooltip]=\"isDisplayDevIndications? $any(parameter).metadata.id: null\" matTooltipPosition=\"right\">\r\n <!-- <span *ngIf=\"isDisplayDevIndications\" class=\"parameter-metadata-id\">{{parameter.metadata.id}}</span> -->\r\n <mat-icon *ngIf=\"$any(parameter).iconName\" [color]=\"getIconColor($any(parameter).iconName)\" [inline]=\"true\">\r\n {{$any(parameter).iconName}}</mat-icon>\r\n <span [ngSwitch]=\"getLabelLocation(parameter)\">\r\n <!-- [class]=\"getIconClass(parameter.iconName)\" -->\r\n <span *ngSwitchCase=\"3\" class=\"parameter-label-stack-container-span\" [class.snap-left]=\"$any(parameter).snapLeft\">\r\n <div class=\"parameter-label-stack-container\">\r\n <div class=\"parameter-label-stack first {{getValueCssClassName(parameter)}}\"\r\n [class.long-text]=\"isLongValue(parameter)\" (click)=\"valueClick(parameter)\">\r\n {{getParameterValue(parameter)}}</div>\r\n <div class=\"parameter-label-stack second {{getLabelCssClassName(parameter)}}\">{{parameter.displayName? parameter.displayName: $any(parameter).metadata.name}}\r\n </div>\r\n </div>\r\n </span>\r\n <span *ngSwitchCase=\"4\" class=\"parameter-label-stack-container-span\" [class.snap-left]=\"$any(parameter).snapLeft\">\r\n <div class=\"parameter-label-stack-container\">\r\n <div class=\"parameter-label-stack first {{getValueCssClassName(parameter)}}\"\r\n [class.long-text]=\"isLongValue(parameter)\" (click)=\"valueClick(parameter)\">\r\n {{parameter.displayName? parameter.displayName: $any(parameter).metadata.name}}</div>\r\n <div class=\"parameter-label-stack second {{getLabelCssClassName(parameter)}}\">{{getParameterValue(parameter)}}\r\n </div>\r\n </div>\r\n </span>\r\n <span *ngSwitchCase=\"0\" class=\"{{getLabelCssClassName(parameter)}}\" [class.snap-left]=\"$any(parameter).snapLeft\">\r\n <span *ngIf=\" !$any(parameter).isLink\" class=\"simple-text {{getValueCssClassName(parameter)}}\"\r\n [class.long-text]=\"isLongValue(parameter)\" (click)=\"valueClick(parameter)\">{{getParameterValue(parameter)}}\r\n </span>\r\n <a *ngIf=\"$any(parameter).isLink\" href=\"{{parameter.value}}\"\r\n target=\"_blank\">{{$any(parameter).linkDescription ? $any(parameter).linkDescription : parameter.value}}</a>\r\n\r\n </span>\r\n <span *ngSwitchCase=\"1\" [class.snap-left]=\"$any(parameter).snapLeft\">\r\n <span class=\"simple-label {{getLabelCssClassName(parameter)}}\">{{parameter.displayName? parameter.displayName: $any(parameter).metadata.name}}\r\n </span>\r\n\r\n <span *ngIf=\"$any(parameter).metadata.fieldType !== 11; else fileView\">\r\n <span *ngIf=\"!$any(parameter).isLink\" class=\"simple-text {{getValueCssClassName(parameter)}}\"\r\n [class.long-text]=\"isLongValue(parameter)\"\r\n (click)=\"valueClick(parameter)\">{{getParameterValue(parameter)}}\r\n </span>\r\n </span>\r\n\r\n <ng-template #fileView>\r\n <a *ngIf=\"parameter.value\" (click)=\"downloadDocumentEmit(parameter)\" class=\"file-link\"\r\n target=\"_blank\"><span>\r\n {{parameter.value}}\r\n </span></a>\r\n <span *ngIf=\"!parameter.value\" class=\"no-doc\">\u05D0\u05D9\u05DF \u05DE\u05E1\u05DE\u05DA</span>\r\n </ng-template>\r\n\r\n <a *ngIf=\"$any(parameter).isLink\" href=\"{{parameter.value}}\" target=\"_blank\">{{$any(parameter).linkDescription}}</a>\r\n </span>\r\n\r\n <span *ngSwitchCase=\"2\" [class.snap-left]=\"$any(parameter).snapLeft\">\r\n <span *ngIf=\"!$any(parameter).isLink\" class=\"simple-label {{getValueCssClassName(parameter)}}\"\r\n [class.long-text]=\"isLongValue(parameter)\" (click)=\"valueClick(parameter)\">{{getParameterValue(parameter)}}\r\n </span>\r\n <span class=\"simple-text {{getLabelCssClassName(parameter)}}\">{{parameter.displayName? parameter.displayName: $any(parameter).metadata.name}}\r\n </span>\r\n\r\n <a *ngIf=\"$any(parameter).isLink\" href=\"{{parameter.value}}\" target=\"_blank\">{{$any(parameter).linkDescription}}</a>\r\n </span>\r\n </span>\r\n\r\n </span>\r\n\r\n <span *ngIf=\"isEntityParameter(parameter)\" >\r\n\r\n <app-groups-collection (expantionClosed)=\"groupCollectionClosed()\" (expantionOpened)=\"groupCollectionOpen()\" *ngIf=\"$any(parameter).groupByParameterId\" [entityParameter]=\"parameter\" class=\"group-collection\">\r\n </app-groups-collection>\r\n <app-entities-collection-view *ngIf=\"!$any(parameter).groupByParameterId\" [entityParameter]=\"parameter\">\r\n </app-entities-collection-view>\r\n </span>\r\n </span>\r\n\r\n</div>\r\n", styles: [".label-under{color:red}.parameter-label-stack-container{position:relative;width:130px;display:inline-block;height:40px}.parameter-label-stack{position:absolute;display:inline-block;width:100%;text-align:center}.snap-left{float:left;margin-right:auto}.first{z-index:1}.second{margin-top:15px;z-index:2}.top-big-value{font-size:20pt}.bottom-gray-small-label{margin-top:30px!important;font-size:smaller;color:#a5a2a2}.simple-text{display:inline-block;margin-left:5px}.group-key{font-weight:700}.warning{color:#dc143c}.standard-icon{color:gray}.parameters-group .parameters-group{padding:0!important}.layout{display:inline-flex;align-items:center;flex-flow:row wrap;width:100%;padding:10px}.parameter-container{display:flex;flex-flow:row nowrap}@media screen and (orientation: portrait) and (max-width: 700px){.layout{width:unset}.top-big-value{font-style:normal;line-height:29px;margin-left:3px;font-weight:700;color:#5f9ea0;font-size:15px}.bottom-gray-small-label{font-size:15px;color:#000}.simple-text{margin-left:5px;display:initial}.snap-left{margin-right:0}}.snap-left{margin-right:0}.long-text{width:-moz-fit-content;width:fit-content;white-space:nowrap;cursor:pointer}.file-link{text-decoration:underline;margin-right:14px}.no-doc{font-weight:700;color:#b9aeb9;margin-right:7px}\n"] }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i7.MatDialog }, { type: i4.DeviceTypeService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{ type: Inject, args: ['env'] }] }]; }, propDecorators: { group: [{ type: Input }], cssClasses: [{ type: Input }], currentPage: [{ type: Input }], downloadDocument: [{ type: Output }], expantionOpened: [{ type: Output }], expantionClosed: [{ type: Output }] } }); class GroupsCollectionComponent { constructor() { this.expantionOpened = new EventEmitter(); this.expantionClosed = new EventEmitter(); } ngOnInit() { // @ts-ignore this.groups = this.getChildsGroups(this.entityParameter.value, this.entityParameter.groupByParameterId); } ngAfterViewInit() { // console.log(this.groups.length); } getChildsGroups(entities, groupByParameterId) { const groups = new Map(); for (let i = 0, ntt = entities[0]; i < entities.length; i++, ntt = entities[i]) { // atention: it return only the first value of 'groupByParameterId' const parameterKey = getSimpleParameters(ntt.parametersGroups.flatMap(group => group.parameters)) .find(pr => pr.metadata.id === groupByParameterId); let key; let nttWithoutParameter; if (parameterKey) { key = parameterKey.metadata.name + ' ' + parameterKey.value; nttWithoutParameter = { ...ntt, parametersGroups: [...ntt.parametersGroups.map(g => ({ ...g, parameters: g.parameters .filter(p => isSimpleParameter(p) ? p.metadata.id !== parameterKey.metadata.id : true) }))] }; const collection = groups.get(key); if (!collection) { groups.set(key, [nttWithoutParameter]); } else { collection.push(nttWithoutParameter); } } else { // key = 'ללא'; } } // console.log('in time ' + (this.counter++) + ' keys:' + groups.size); const x = [...groups.entries()]; const y = [...groups.values()]; const z = [...groups.keys()]; return [...groups.entries()].map(entry => ({ groupKey: entry[0], entities: entry[1].sort((a, b) => a.parametersGroups.flatMap(ntt => ntt.parameters)[0].value.localeCompare(b.parametersGroups.flatMap(ntt => ntt.parameters)[0].value)) })); } onExpantionOpened() { this.expantionOpened.emit(); } onExpantionClosed() { this.expantionClosed.emit(); } } GroupsCollectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: GroupsCollectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); GroupsCollectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: GroupsCollectionComponent, selector: "app-groups-collection", inputs: { entityParameter: "entityParameter" }, outputs: { expantionOpened: "expantionOpened", expantionClosed: "expantionClosed" }, ngImport: i0, template: "<div *ngIf=\"groups\">\r\n <mat-accordion>\r\n <div *ngFor=\"let groupChild of groups\">\r\n <mat-expansion-panel (closed)=\"onExpantionClosed()\" (opened)=\"onExpantionOpened()\" class=\"expantion-panel\" >\r\n <mat-expansion-panel-header class=\"expantion-header\">\r\n <mat-panel-title>{{groupChild.groupKey}}\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n {{groupChild.entities.length}} {{groupChild.entities[0].pluralEntitiesDescription}}\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <app-entities-list [entities]=\"groupChild.entities\"></app-entities-list>\r\n </mat-expansion-panel>\r\n </div>\r\n </mat-accordion>\r\n</div>\r\n\r\n\r\n\r\n", styles: [".expantion-header{background-color:#f5f5f5}.expantion-panel{width:41vw}@media screen and (orientation: portrait) and (max-width: 700px){.expantion-panel{width:88vw}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i2.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i2.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i2.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i2.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "component", type: EntitiesListComponent, selector: "app-entities-list", inputs: ["displayEntitiesInline", "displayEntityBackground", "entities", "columnsNumber", "index", "isProcess"], outputs: ["entityClickEmitter"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: GroupsCollectionComponent, decorators: [{ type: Component, args: [{ selector: 'app-groups-collection', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"groups\">\r\n <mat-accordion>\r\n <div *ngFor=\"let groupChild of groups\">\r\n <mat-expansion-panel (closed)=\"onExpantionClosed()\" (opened)=\"onExpantionOpened()\" class=\"expantion-panel\" >\r\n <mat-expansion-panel-header class=\"expantion-header\">\r\n <mat-panel-title>{{groupChild.groupKey}}\r\n </mat-panel-title>\r\n <mat-panel-description>\r\n {{groupChild.entities.length}} {{groupChild.entities[0].pluralEntitiesDescription}}\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <app-entities-list [entities]=\"groupChild.entities\"></app-entities-list>\r\n </mat-expansion-panel>\r\n </div>\r\n </mat-accordion>\r\n</div>\r\n\r\n\r\n\r\n", styles: [".expantion-header{background-color:#f5f5f5}.expantion-panel{width:41vw}@media screen and (orientation: portrait) and (max-width: 700px){.expantion-panel{width:88vw}}\n"] }] }], ctorParameters: function () { return []; }, propDecorators: { entityParameter: [{ type: Input }], expantionOpened: [{ type: Output }], expantionClosed: [{ type: Output }] } }); export { EntitiesCollectionViewComponent, EntitiesListComponent, InnerEntityDetailsComponent, ParametersGroupComponent, GroupsCollectionComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdXJzaXZlLWNvbXBvbmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLWRpc3BsYXktc2hhcmVkL3NyYy9saWIvc2hhcmVkL2NvbXBvbmVudHMvcmVjdXJzaXZlLWNvbXBvbmVudHMudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLWRpc3BsYXktc2hhcmVkL3NyYy9saWIvc2hhcmVkL2NvbXBvbmVudHMvZW50aXRpZXMtY29sbGVjdGlvbi12aWV3L2VudGl0aWVzLWNvbGxlY3Rpb24tdmlldy5jb21wb25lbnQuaHRtbCIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2R5bmFtaWMtZGlzcGxheS1zaGFyZWQvc3JjL2xpYi9zaGFyZWQvY29tcG9uZW50cy9lbnRpdGllcy1saXN0L2VudGl0aWVzLWxpc3QuY29tcG9uZW50Lmh0bWwiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLWRpc3BsYXktc2hhcmVkL3NyYy9saWIvc2hhcmVkL2NvbXBvbmVudHMvaW5uZXItZW50aXR5LWRldGFpbHMvaW5uZXItZW50aXR5LWRldGFpbHMuY29tcG9uZW50Lmh0bWwiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLWRpc3BsYXktc2hhcmVkL3NyYy9saWIvc2hhcmVkL2NvbXBvbmVudHMvcGFyYW1ldGVycy1ncm91cC9wYXJhbWV0ZXJzLWdyb3VwLmNvbXBvbmVudC5odG1sIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHluYW1pYy1kaXNwbGF5LXNoYXJlZC9zcmMvbGliL3NoYXJlZC9jb21wb25lbnRzL2dyb3Vwcy1jb2xsZWN0aW9uL2dyb3Vwcy1jb2xsZWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWEsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDOzs7Ozs7Ozs7O0FBU3hGLE1BTU0sK0JBQStCO0lBSW5DLGdCQUFnQixDQUFDO0lBRWpCLFFBQVE7SUFDUixDQUFDOzs0SEFQRywrQkFBK0I7Z0hBQS9CLCtCQUErQixvSENoQ3JDLHFoQ0FxQk0sODlCRGdIQSwyQkFBMkIsZ05BbkYzQixxQkFBcUI7MkZBbEJyQiwrQkFBK0I7a0JBTnBDLFNBQVM7K0JBQ0UsOEJBQThCLG1CQUd2Qix1QkFBdUIsQ0FBQyxNQUFNOzBFQUt4QyxlQUFlO3NCQURyQixLQUFLOztBQVVSLE1BTU0scUJBQXFCO0lBZXpCLFlBQW9CL