UNPKG

ontimize-web-ngx

Version:
557 lines 82.9 kB
import { __decorate, __metadata } from "tslib"; import { Component, ElementRef, EventEmitter, HostListener, Injector, Optional, SkipSelf, ViewChild } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; import { BehaviorSubject, Subscription } from 'rxjs'; import { BooleanInputConverter } from '../../decorators/input-converter'; import { ComponentStateServiceProvider, O_COMPONENT_STATE_SERVICE } from '../../services/factories'; import { LocalStorageService } from '../../services/local-storage.service'; import { NavigationService } from '../../services/navigation.service'; import { OFormLayoutManagerService } from '../../services/o-form-layout-manager.service'; import { AbstractComponentStateService } from '../../services/state/o-component-state.service'; import { OFormLayoutManagerComponentStateService } from '../../services/state/o-form-layout-manager-component-state.service'; import { OTranslateService } from '../../services/translate/o-translate.service'; import { O_GLOBAL_CONFIG } from '../../types/o-global-config.type'; import { Codes } from '../../util/codes'; import { Util } from '../../util/util'; import { OFormLayoutDialogComponent } from './dialog/o-form-layout-dialog.component'; import { CanActivateFormLayoutChildGuard } from './guards/o-form-layout-can-activate-child.guard'; import { OFormLayoutManagerBase } from './o-form-layout-manager-base.class'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@angular/material/dialog"; import * as i3 from "./o-form-layout-manager-base.class"; import * as i4 from "@angular/common"; import * as i5 from "./tabgroup/o-form-layout-tabgroup.component"; import * as i6 from "./split-pane/o-form-layout-split-pane.component"; export const DEFAULT_INPUTS_O_FORM_LAYOUT_MANAGER = [ 'oattr: attr', 'mode', 'storeState: store-state', 'title', 'labelColumns: label-columns', 'separator', 'titleDataOrigin: title-data-origin', 'dialogWidth: dialog-width', 'dialogMinWidth: dialog-min-width', 'dialogMaxWidth: dialog-max-width', 'dialogHeight: dialog-height', 'dialogMinHeight: dialog-min-height', 'dialogMaxHeight dialog-max-height', 'dialogClass: dialog-class', 'dialogTitleSeparator: dialog-title-separator' ]; export const DEFAULT_OUTPUTS_O_FORM_LAYOUT_MANAGER = [ 'onMainTabSelected', 'onSelectedTabChange', 'onCloseTab' ]; export class OFormLayoutManagerComponent { get mode() { return this._mode; } set mode(value) { const availableModeValues = [OFormLayoutManagerComponent.DIALOG_MODE, OFormLayoutManagerComponent.TAB_MODE, OFormLayoutManagerComponent.SPLIT_PANE_MODE]; this._mode = (value || '').toLowerCase(); if (availableModeValues.indexOf(this._mode) === -1) { this._mode = OFormLayoutManagerComponent.DIALOG_MODE; } } set separator(value) { this._separator = value; } get separator() { return this._separator; } get labelColumns() { return this._labelColumns; } set labelColumns(value) { this._labelColumns = value; this._labelColsArray = Util.parseArray(value); } get labelColsArray() { return this._labelColsArray; } set labelColsArray(value) { this._labelColsArray = value; } get tabGroupOptions() { return this._tabGroupOptions; } addTabGroupOptions(value) { Object.assign(this._tabGroupOptions, value); if (value.hasOwnProperty('labelColumns')) { this.labelColsArray = Util.parseArray(value['labelColumns']); } if (value.hasOwnProperty('separator')) { this.separator = value['separator']; } if (value.hasOwnProperty('stretchTabs')) { this.stretchTabs = value['stretchTabs']; } } get dialogOptions() { return this._dialogOptions; } addDialogOptions(value) { Object.assign(this._dialogOptions, value); if (value.hasOwnProperty('labelColumns')) { this.labelColsArray = Util.parseArray(value['labelColumns']); } if (value.hasOwnProperty('separator')) { this.separator = value['separator']; } if (value.hasOwnProperty('dialogTitleSeparator')) { this.dialogTitleSeparator = value['dialogTitleSeparator']; } } get splitPaneOptions() { return this._splitPaneOptions; } addSplitPaneOptions(value) { Object.assign(this._splitPaneOptions, value); } constructor(injector, router, actRoute, dialog, elRef, parentFormLayoutManager) { this.injector = injector; this.router = router; this.actRoute = actRoute; this.dialog = dialog; this.elRef = elRef; this.parentFormLayoutManager = parentFormLayoutManager; this.OFormLayoutManagerComponent = OFormLayoutManagerComponent; this._mode = OFormLayoutManagerComponent.DIALOG_MODE; this.stretchTabs = false; this._separator = ' '; this.storeState = true; this.dialogClass = ''; this.dialogTitleSeparator = ':'; this.onMainTabSelected = new EventEmitter(); this.onSelectedTabChange = new EventEmitter(); this.onCloseTab = new EventEmitter(); this._labelColsArray = []; this._tabGroupOptions = {}; this._dialogOptions = {}; this._splitPaneOptions = {}; this.addingGuard = false; this._markForUpdate = false; this.onTriggerUpdate = new EventEmitter(); this.subscription = new Subscription(); this.oFormLayoutManagerService = this.injector.get(OFormLayoutManagerService); this.localStorageService = this.injector.get(LocalStorageService); this.translateService = this.injector.get(OTranslateService); this.navigationService = this.injector.get(NavigationService); this.componentStateService = this.injector.get(AbstractComponentStateService); if (this.storeState) { this.subscription.add(this.localStorageService.onRouteChange.subscribe(res => { this.updateStateStorage(); })); } this.getInjectionTokenConfig(); } getInjectionTokenConfig() { try { const oGlobalConfig = this.injector.get(O_GLOBAL_CONFIG); if (Util.isDefined(oGlobalConfig.storeState)) { this.storeState = oGlobalConfig.storeState; if (!this.storeState) { this.subscription.unsubscribe(); } } ; } catch (error) { } } get state() { return this.componentStateService.state; } ngOnInit() { this.addActivateChildGuard(); if (!Util.isDefined(this.oattr)) { this.oattr = (this.title || '') + this.mode; console.warn('o-form-layout-manager must have an unique attr'); } this.oFormLayoutManagerService.registerFormLayoutManager(this); if (this.storeState) { this.componentStateService.initialize(this); } } ngAfterViewInit() { setTimeout(() => { if (this.elRef) { this.elRef.nativeElement.removeAttribute('title'); } }); } ngOnDestroy() { if (this.subscription) { this.subscription.unsubscribe(); } this.oFormLayoutManagerService.removeFormLayoutManager(this); this.destroyActivateChildGuard(); } getAttribute() { return this.oattr; } getComponentKey() { return 'OFormLayoutManagerComponent_' + this.oattr; } getRouteKey() { let route = this.router.url; this.actRoute.params.subscribe(params => { Object.keys(params).forEach(key => { route = route.replace(params[key], key); }); }); return route; } getDataToStore() { const compRef = this.getLayoutModeComponent(); return Util.isDefined(compRef) ? compRef.getDataToStore() : {}; } beforeunloadHandler() { this.updateStateStorage(); } getLabelFromUrlParams(urlParams) { let label = ''; const keys = Object.keys(urlParams); keys.forEach((param, i) => { label += urlParams[param] + ((i < keys.length - 1) ? this.separator : ''); }); return label; } getFormDataFromLabelColumns(data) { const formData = {}; Object.keys(data).forEach(x => { if (this.labelColsArray.indexOf(x) > -1) { formData[x] = data[x]; } }); return formData; } addActivateChildGuard() { const routeConfig = this.getParentActRouteRoute(); if (Util.isDefined(routeConfig)) { const canActivateChildArray = (routeConfig.canActivateChild || []); let previouslyAdded = false; for (let i = 0, len = canActivateChildArray.length; i < len; i++) { const guardChild = this.injector.get(CanActivateFormLayoutChildGuard); previouslyAdded = (canActivateChildArray[i] === guardChild.constructor); if (previouslyAdded) { break; } } if (!previouslyAdded) { this.addingGuard = true; canActivateChildArray.push(CanActivateFormLayoutChildGuard); routeConfig.canActivateChild = canActivateChildArray; } } } destroyActivateChildGuard() { if (!this.addingGuard) { return; } this.oFormLayoutManagerService.activeFormLayoutManager = undefined; this.oFormLayoutManagerService.context = void 0; const routeConfig = this.getParentActRouteRoute(); if (Util.isDefined(routeConfig)) { for (let i = (routeConfig.canActivateChild || []).length - 1; i >= 0; i--) { const guardChild = this.injector.get(CanActivateFormLayoutChildGuard); if (routeConfig.canActivateChild[i] === guardChild.constructor) { routeConfig.canActivateChild.splice(i, 1); break; } } } } isDialogMode() { return this.mode === OFormLayoutManagerComponent.DIALOG_MODE; } isTabMode() { return this.mode === OFormLayoutManagerComponent.TAB_MODE; } isSplitPaneMode() { return this.mode === OFormLayoutManagerComponent.SPLIT_PANE_MODE; } addDetailComponent(childRoute, url, context) { childRoute = Util.getLastActivateRoute(childRoute); const newDetailComp = { params: childRoute.params, queryParams: childRoute.queryParams, urlSegments: childRoute.url, component: childRoute.routeConfig.component, url: url, id: Util.randomNumber().toString(), label: context?.label || '', innerFormsInfo: {}, rendered: false, insertionMode: childRoute.queryParams[Codes.INSERTION_MODE] === 'true', rendererSubject: new BehaviorSubject(false) }; newDetailComp.rendererSubject.subscribe((renderer) => { if (renderer) { this.navigationService.isNavigating = !renderer; } }); if (this.isDialogMode()) { this.openFormLayoutDialog(newDetailComp); } else { const compRef = this.getLayoutModeComponent(); if (Util.isDefined(compRef)) { compRef.openDetail(newDetailComp); } } } closeDetail(options) { const compRef = this.getLayoutModeComponent(); if (Util.isDefined(compRef)) { compRef.closeDetail(options); } } closeDetails(detailsData = [], options) { if (this.isTabMode() && Util.isDefined(this.oTabGroup)) { this.oTabGroup.closeDetails(detailsData, options); } } openFormLayoutDialog(detailComp) { const cssclass = ['o-form-layout-dialog-overlay']; if (this.dialogClass) { cssclass.push(this.dialogClass); } const dialogOptions = (this.dialogOptions || {}); const dialogConfig = { data: { data: detailComp, layoutManagerComponent: this, title: (this.title || dialogOptions.title), dialogTitleSeparator: this.dialogTitleSeparator }, width: dialogOptions.width || this.dialogWidth, minWidth: dialogOptions.minWidth || this.dialogMinWidth, maxWidth: dialogOptions.maxWidth || this.dialogMaxWidth, height: dialogOptions.height || this.dialogHeight, minHeight: dialogOptions.minHeight || this.dialogMinHeight, maxHeight: dialogOptions.maxHeight || this.dialogMaxHeight, disableClose: dialogOptions.disableClose || true, panelClass: dialogOptions.class || cssclass }; if (this.dialogOptions) { dialogConfig.closeOnNavigation = this.dialogOptions.closeOnNavigation; dialogConfig.backdropClass = this.dialogOptions.backdropClass; dialogConfig.position = this.dialogOptions.position; dialogConfig.disableClose = this.dialogOptions.disableClose; } this.dialogRef = this.dialog.open(OFormLayoutDialogComponent, dialogConfig); this.dialogRef.afterClosed().subscribe(() => { if (this.markForUpdate) { this.updateIfNeeded(); } else { this.reloadMainComponents(); } }); this.dialogRef.afterOpened().subscribe(() => { detailComp.rendered = true; detailComp.rendererSubject.next(true); }); } getFormCacheData() { const compRef = this.getLayoutModeComponent(); return Util.isDefined(compRef) ? compRef.getFormCacheData() : undefined; } setModifiedState(formAttr, modified, confirmExit) { const compRef = this.getLayoutModeComponent(); if (Util.isDefined(compRef)) { compRef.setModifiedState(formAttr, modified, confirmExit); } } getLabelFromData(data) { let label = ''; const isDataDefined = Util.isDefined(data); if (isDataDefined && data.hasOwnProperty('new_tab_title')) { label = this.translateService.get(data.new_tab_title); } else if (isDataDefined && this.labelColsArray.length !== 0) { this.labelColsArray.forEach((col, idx) => { if (data[col] !== undefined) { label += data[col] + ((idx < this.labelColsArray.length - 1) ? this.separator : ''); } }); } return label; } updateNavigation(data, keysValues, insertionMode) { const compRef = this.getLayoutModeComponent(); if (Util.isDefined(compRef)) { compRef.updateNavigation(data, keysValues, insertionMode); } } updateActiveData(data) { const compRef = this.getLayoutModeComponent(); if (Util.isDefined(compRef)) { compRef.updateActiveData(data); } } getRouteOfActiveItem() { const compRef = this.getLayoutModeComponent(); return Util.isDefined(compRef) ? compRef.getRouteOfActiveItem() : []; } isMainComponent(comp) { if (this.isDialogMode()) { return !comp.oFormLayoutDialog; } const compRef = this.getLayoutModeComponent(); return (Util.isDefined(compRef) && (compRef.isMainComponent(comp) || (Util.isDefined(comp.parentComponent)) && compRef.isMainComponent(comp.parentComponent))); } getRouteForComponent(comp) { const result = []; if (this.parentFormLayoutManager) { const parentRoute = this.parentFormLayoutManager.getRouteForComponent(comp); if (parentRoute && parentRoute.length > 0) { result.push(...parentRoute); } } if (!this.isMainComponent(comp)) { const activeRoute = this.getRouteOfActiveItem(); if (activeRoute && activeRoute.length > 0) { result.push(...activeRoute); } } return result; } setAsActiveFormLayoutManager() { this.oFormLayoutManagerService.activeFormLayoutManager = this; } reloadMainComponents() { this.onTriggerUpdate.emit(); } allowToUpdateNavigation(formAttr) { return (this.isTabMode() && Util.isDefined(this.oTabGroup) && Util.isDefined(this.titleDataOrigin)) ? this.titleDataOrigin === formAttr : true; } updateStateStorage() { if (!this.localStorageService || !this.storeState) { return; } const isTabMode = this.isTabMode() && Util.isDefined(this.oTabGroup); const isSplitPaneMode = this.isSplitPaneMode() && Util.isDefined(this.oSplitPane); if (isTabMode || isSplitPaneMode) { this.localStorageService.updateComponentStorage(this, this.getRouteKey()); } } getParentActRouteRoute() { let actRoute = this.actRoute; while (actRoute.parent !== undefined && actRoute.parent !== null) { if (actRoute.routeConfig.children || actRoute.routeConfig.loadChildren) { break; } actRoute = actRoute.parent; } return actRoute.routeConfig; } updateIfNeeded() { if (this.markForUpdate) { this.markForUpdate = false; this.onTriggerUpdate.emit(); } } getParams() { const compRef = this.getLayoutModeComponent(); return Util.isDefined(compRef) ? compRef.getParams() : undefined; } set markForUpdate(arg) { this._markForUpdate = arg; if (this.isSplitPaneMode()) { this.updateIfNeeded(); } } get markForUpdate() { return this._markForUpdate; } get ignoreCanDeactivate() { return !this.isSplitPaneMode(); } getLayoutModeComponent() { let compRef; if (this.isTabMode() && Util.isDefined(this.oTabGroup)) { compRef = this.oTabGroup; } else if (this.isDialogMode() && Util.isDefined(this.dialogRef)) { compRef = this.dialogRef.componentInstance; } else if (this.isSplitPaneMode() && Util.isDefined(this.oSplitPane)) { compRef = this.oSplitPane; } return compRef; } allowNavigation() { return !this.isTabMode(); } canAddDetailComponent() { const compRef = this.getLayoutModeComponent(); return Util.wrapIntoObservable(Util.isDefined(compRef) ? compRef.canAddDetailComponent() : true); } hasToConfirmExit(data, options) { if (Util.isDefined(options) && options.exitWithoutConfirmation) { return false; } const formsAttr = Object.keys(data.innerFormsInfo); let result = false; if (formsAttr.length > 0) { formsAttr.forEach(formAttr => { if (!result) { const formData = data.innerFormsInfo[formAttr]; result = formData.confirmOnExit && formData.modified; } }); } return result; } getIdOfActiveItem() { const compRef = this.getLayoutModeComponent(); return Util.isDefined(compRef) ? `${this.oattr}-${compRef.getIdOfActiveItem()}-` : ''; } } OFormLayoutManagerComponent.DIALOG_MODE = 'dialog'; OFormLayoutManagerComponent.TAB_MODE = 'tab'; OFormLayoutManagerComponent.SPLIT_PANE_MODE = 'split-pane'; OFormLayoutManagerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormLayoutManagerComponent, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.MatDialog }, { token: i0.ElementRef }, { token: i3.OFormLayoutManagerBase, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component }); OFormLayoutManagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OFormLayoutManagerComponent, selector: "o-form-layout-manager", inputs: { oattr: ["attr", "oattr"], mode: "mode", storeState: ["store-state", "storeState"], title: "title", labelColumns: ["label-columns", "labelColumns"], separator: "separator", titleDataOrigin: ["title-data-origin", "titleDataOrigin"], dialogWidth: ["dialog-width", "dialogWidth"], dialogMinWidth: ["dialog-min-width", "dialogMinWidth"], dialogMaxWidth: ["dialog-max-width", "dialogMaxWidth"], dialogHeight: ["dialog-height", "dialogHeight"], dialogMinHeight: ["dialog-min-height", "dialogMinHeight"], "dialogMaxHeight dialog-max-height": "dialogMaxHeight dialog-max-height", dialogClass: ["dialog-class", "dialogClass"], dialogTitleSeparator: ["dialog-title-separator", "dialogTitleSeparator"] }, outputs: { onMainTabSelected: "onMainTabSelected", onSelectedTabChange: "onSelectedTabChange", onCloseTab: "onCloseTab" }, host: { listeners: { "window:beforeunload": "beforeunloadHandler()" }, properties: { "class.o-form-layout-manager": "true" } }, providers: [ ComponentStateServiceProvider, { provide: O_COMPONENT_STATE_SERVICE, useClass: OFormLayoutManagerComponentStateService }, { provide: OFormLayoutManagerBase, useExisting: OFormLayoutManagerComponent } ], viewQueries: [{ propertyName: "oTabGroup", first: true, predicate: ["tabGroup"], descendants: true }, { propertyName: "oSplitPane", first: true, predicate: ["splitPane"], descendants: true }], ngImport: i0, template: "<ng-container [ngSwitch]=\"mode\">\n <ng-container *ngSwitchCase=\"OFormLayoutManagerComponent.TAB_MODE\">\n <o-form-layout-tabgroup #tabGroup [title]=\"title\" (onMainTabSelected)=\"onMainTabSelected.emit($event)\"\n (onSelectedTabChange)=\"onSelectedTabChange.emit($event)\" (onCloseTab)=\"onCloseTab.emit($event)\"\n [options]=\"tabGroupOptions\" [stretch-tabs]=\"stretchTabs\">\n <ng-content *ngTemplateOutlet=\"contentBlock\"></ng-content>\n </o-form-layout-tabgroup>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"OFormLayoutManagerComponent.SPLIT_PANE_MODE\">\n <o-form-layout-split-pane #splitPane [options]=\"splitPaneOptions\">\n <ng-content *ngTemplateOutlet=\"contentBlock\"></ng-content>\n </o-form-layout-split-pane>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"OFormLayoutManagerComponent.DIALOG_MODE\">\n <ng-content *ngTemplateOutlet=\"contentBlock\"></ng-content>\n </ng-container>\n</ng-container>\n\n\n<ng-template #contentBlock>\n <ng-content></ng-content>\n</ng-template>", styles: [".o-form-layout-manager{height:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i5.OFormLayoutTabGroupComponent, selector: "o-form-layout-tabgroup", inputs: ["title", "options", "stretch-tabs"], outputs: ["onMainTabSelected", "onSelectedTabChange", "onCloseTab"] }, { kind: "component", type: i6.OFormLayoutSplitPaneComponent, selector: "o-form-layout-split-pane", inputs: ["options"] }] }); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OFormLayoutManagerComponent.prototype, "storeState", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormLayoutManagerComponent, decorators: [{ type: Component, args: [{ selector: 'o-form-layout-manager', inputs: DEFAULT_INPUTS_O_FORM_LAYOUT_MANAGER, outputs: DEFAULT_OUTPUTS_O_FORM_LAYOUT_MANAGER, providers: [ ComponentStateServiceProvider, { provide: O_COMPONENT_STATE_SERVICE, useClass: OFormLayoutManagerComponentStateService }, { provide: OFormLayoutManagerBase, useExisting: OFormLayoutManagerComponent } ], host: { '[class.o-form-layout-manager]': 'true' }, template: "<ng-container [ngSwitch]=\"mode\">\n <ng-container *ngSwitchCase=\"OFormLayoutManagerComponent.TAB_MODE\">\n <o-form-layout-tabgroup #tabGroup [title]=\"title\" (onMainTabSelected)=\"onMainTabSelected.emit($event)\"\n (onSelectedTabChange)=\"onSelectedTabChange.emit($event)\" (onCloseTab)=\"onCloseTab.emit($event)\"\n [options]=\"tabGroupOptions\" [stretch-tabs]=\"stretchTabs\">\n <ng-content *ngTemplateOutlet=\"contentBlock\"></ng-content>\n </o-form-layout-tabgroup>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"OFormLayoutManagerComponent.SPLIT_PANE_MODE\">\n <o-form-layout-split-pane #splitPane [options]=\"splitPaneOptions\">\n <ng-content *ngTemplateOutlet=\"contentBlock\"></ng-content>\n </o-form-layout-split-pane>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"OFormLayoutManagerComponent.DIALOG_MODE\">\n <ng-content *ngTemplateOutlet=\"contentBlock\"></ng-content>\n </ng-container>\n</ng-container>\n\n\n<ng-template #contentBlock>\n <ng-content></ng-content>\n</ng-template>", styles: [".o-form-layout-manager{height:100%}\n"] }] }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.MatDialog }, { type: i0.ElementRef }, { type: i3.OFormLayoutManagerBase, decorators: [{ type: SkipSelf }, { type: Optional }] }]; }, propDecorators: { storeState: [], oTabGroup: [{ type: ViewChild, args: ['tabGroup'] }], oSplitPane: [{ type: ViewChild, args: ['splitPane'] }], beforeunloadHandler: [{ type: HostListener, args: ['window:beforeunload', []] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLWxheW91dC1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9sYXlvdXRzL2Zvcm0tbGF5b3V0L28tZm9ybS1sYXlvdXQtbWFuYWdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvbGF5b3V0cy9mb3JtLWxheW91dC9vLWZvcm0tbGF5b3V0LW1hbmFnZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osUUFBUSxFQUdSLFFBQVEsRUFDUixRQUFRLEVBRVIsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQWlDLE1BQU0sMEJBQTBCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGNBQWMsRUFBaUMsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGVBQWUsRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFakUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFJekUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDekYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFL0YsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLE1BQU0sb0VB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