@netgrif/components
Version:
Netgrif Application Engine frontend Angular components
102 lines • 31.6 kB
JavaScript
import { Component, Inject, Optional } from '@angular/core';
import { AbstractCasePanelComponent, DATA_FIELD_PORTAL_DATA, EnumerationField, MultichoiceField } from '@netgrif/components-core';
import * as i0 from "@angular/core";
import * as i1 from "@netgrif/components-core";
import * as i2 from "@ngx-translate/core";
import * as i3 from "@angular/common";
import * as i4 from "@ngbracket/ngx-layout";
import * as i5 from "@ngbracket/ngx-layout/extended";
import * as i6 from "@angular/material/button";
import * as i7 from "@angular/material/checkbox";
import * as i8 from "@angular/material/icon";
import * as i9 from "@angular/material/menu";
import * as i10 from "@angular/material/radio";
import * as i11 from "@angular/forms";
import * as i12 from "../panel.component";
import * as i13 from "../panel-item/panel-item.component";
export class CasePanelComponent extends AbstractCasePanelComponent {
_caseResourceService;
_caseViewService;
_snackBarService;
_translateService;
_log;
_userService;
_currencyPipe;
_permissionService;
_overflowService;
_dataFieldPortalData;
_changeValue;
constructor(_caseResourceService, _caseViewService, _snackBarService, _translateService, _log, _userService, _currencyPipe, _permissionService, _overflowService, _dataFieldPortalData) {
super(_caseResourceService, _caseViewService, _snackBarService, _translateService, _log, _userService, _currencyPipe, _permissionService, _overflowService);
this._caseResourceService = _caseResourceService;
this._caseViewService = _caseViewService;
this._snackBarService = _snackBarService;
this._translateService = _translateService;
this._log = _log;
this._userService = _userService;
this._currencyPipe = _currencyPipe;
this._permissionService = _permissionService;
this._overflowService = _overflowService;
this._dataFieldPortalData = _dataFieldPortalData;
this._changeValue = true;
}
typeApproval() {
return this._dataFieldPortalData?.dataField instanceof MultichoiceField ? 'multichoice' : 'enumeration';
}
caseValue() {
return this.case_.stringId;
}
ngOnInit() {
super.ngOnInit();
if (this._dataFieldPortalData !== null && this._dataFieldPortalData.dataField instanceof MultichoiceField) {
this.approvalFormControl.setValue(this._dataFieldPortalData.dataField.value?.includes(this.case_.stringId));
this.approvalFormControl.valueChanges.subscribe(value => {
if (this._changeValue) {
if (value) {
this._dataFieldPortalData.dataField.value = [...this._dataFieldPortalData.dataField.value, this.case_.stringId];
}
else {
const index = this._dataFieldPortalData.dataField.value.indexOf(this.case_.stringId);
if (index >= 0) {
const arr = [...this._dataFieldPortalData.dataField.value];
arr.splice(index, 1);
this._dataFieldPortalData.dataField.value = arr;
}
}
}
this._changeValue = true;
});
this._dataFieldPortalData.dataField.valueChanges().subscribe(() => {
this._changeValue = false;
this.approvalFormControl.setValue(this._dataFieldPortalData.dataField.value?.includes(this.case_.stringId));
});
}
if (this._dataFieldPortalData !== null && this._dataFieldPortalData.dataField instanceof EnumerationField) {
this.approvalFormControl.setValue(this._dataFieldPortalData.dataField.value);
this.approvalFormControl.valueChanges.subscribe(value => {
if (this._changeValue) {
this._dataFieldPortalData.dataField.value = this.case_.stringId;
}
this._changeValue = true;
});
this._dataFieldPortalData.dataField.valueChanges().subscribe(() => {
this._changeValue = false;
this.approvalFormControl.setValue(this._dataFieldPortalData.dataField.value);
});
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CasePanelComponent, deps: [{ token: i1.CaseResourceService }, { token: i1.CaseViewService }, { token: i1.SnackBarService }, { token: i2.TranslateService }, { token: i1.LoggerService }, { token: i1.UserService }, { token: i3.CurrencyPipe }, { token: i1.PermissionService }, { token: i1.OverflowService, optional: true }, { token: DATA_FIELD_PORTAL_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CasePanelComponent, selector: "nc-case-panel", usesInheritance: true, ngImport: i0, template: "<nc-app-panel [panelHeader]=\"casePanelHeader\" [preventExpand]=\"true\" [first]=\"first\" [last]=\"last\"\n [caseColor]=case_.color>\n <ng-template #casePanelHeader>\n <div fxLayoutAlign=\"start center\" fxLayout=\"row\" fxFlex=\"95\" (click)=\"preventSelectionClick($event)\">\n <mat-checkbox *ngIf=\"approval && typeApproval() === 'multichoice'\" [formControl]=\"approvalFormControl\" (click)=\"$event.stopPropagation();\" color='primary' class=\"checkbox-padding\"></mat-checkbox>\n <mat-radio-group *ngIf=\"approval && typeApproval() === 'enumeration'\" [formControl]=\"approvalFormControl\" (click)=\"$event.stopPropagation();\" class=\"radio-padding\" color='primary'>\n <mat-radio-button [value]=\"caseValue()\"></mat-radio-button>\n </mat-radio-group>\n <div *ngFor=\"let field of featuredFieldsValues; let i = index\" fxFlex\n class=\"text-column-div\" [ngStyle]=\"{'min-width': getMinWidth()}\"\n [fxHide.lt-xl]=\"i >= 4 && responsiveBody && !overflowMode\"\n [fxHide.lt-lg]=\"i >= 3 && responsiveBody && !overflowMode\"\n [fxHide.lt-md]=\"i >= 2 && responsiveBody && !overflowMode\"\n [fxHide.lt-sm]=\"i >= 1 && responsiveBody && !overflowMode\"\n [ngClass]=\"{'panel-header-padding': !textEllipsis && field.type !== 'button'}\">\n <nc-panel-item\n [leadingIcon]=\"case_.icon\"\n [leadingIconEnabled]=\"i === 0\"\n [featuredValue]=\"field\"\n [textEllipsis]=\"textEllipsis\">\n </nc-panel-item>\n </div>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\" fxFlex=\"5\">\n <div *ngIf=\"showDeleteMenu && canDelete()\">\n <button mat-icon-button (click)=\"show($event)\" [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"deleteCase()\">\n <mat-icon>delete</mat-icon>\n <span>{{ 'panel.case.delete' | translate}}</span>\n </button>\n </mat-menu>\n </div>\n </div>\n </ng-template>\n</nc-app-panel>\n", styles: [".case-panel-icon{margin-right:8px}.panel-main-content{margin-top:16px}.text-column-ellipsis{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.text-column-word-wrap{word-break:break-word!important;white-space:pre-line!important}.text-column-margin{margin-right:15px;line-height:24px}.text-column-div{min-width:0;width:0}.panel-header-padding{padding:9px 0!important}.width-100{width:100%}.pre-line-dialog{white-space:pre-line!important}.checkbox-padding{padding-right:12px}.radio-padding{padding-left:2px;padding-right:6px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.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: i4.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: i4.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: i5.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "directive", type: i5.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: i5.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: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i10.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i10.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i12.PanelComponent, selector: "nc-app-panel" }, { kind: "component", type: i13.PanelItemComponent, selector: "nc-panel-item" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CasePanelComponent, decorators: [{
type: Component,
args: [{ selector: 'nc-case-panel', template: "<nc-app-panel [panelHeader]=\"casePanelHeader\" [preventExpand]=\"true\" [first]=\"first\" [last]=\"last\"\n [caseColor]=case_.color>\n <ng-template #casePanelHeader>\n <div fxLayoutAlign=\"start center\" fxLayout=\"row\" fxFlex=\"95\" (click)=\"preventSelectionClick($event)\">\n <mat-checkbox *ngIf=\"approval && typeApproval() === 'multichoice'\" [formControl]=\"approvalFormControl\" (click)=\"$event.stopPropagation();\" color='primary' class=\"checkbox-padding\"></mat-checkbox>\n <mat-radio-group *ngIf=\"approval && typeApproval() === 'enumeration'\" [formControl]=\"approvalFormControl\" (click)=\"$event.stopPropagation();\" class=\"radio-padding\" color='primary'>\n <mat-radio-button [value]=\"caseValue()\"></mat-radio-button>\n </mat-radio-group>\n <div *ngFor=\"let field of featuredFieldsValues; let i = index\" fxFlex\n class=\"text-column-div\" [ngStyle]=\"{'min-width': getMinWidth()}\"\n [fxHide.lt-xl]=\"i >= 4 && responsiveBody && !overflowMode\"\n [fxHide.lt-lg]=\"i >= 3 && responsiveBody && !overflowMode\"\n [fxHide.lt-md]=\"i >= 2 && responsiveBody && !overflowMode\"\n [fxHide.lt-sm]=\"i >= 1 && responsiveBody && !overflowMode\"\n [ngClass]=\"{'panel-header-padding': !textEllipsis && field.type !== 'button'}\">\n <nc-panel-item\n [leadingIcon]=\"case_.icon\"\n [leadingIconEnabled]=\"i === 0\"\n [featuredValue]=\"field\"\n [textEllipsis]=\"textEllipsis\">\n </nc-panel-item>\n </div>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\" fxFlex=\"5\">\n <div *ngIf=\"showDeleteMenu && canDelete()\">\n <button mat-icon-button (click)=\"show($event)\" [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"deleteCase()\">\n <mat-icon>delete</mat-icon>\n <span>{{ 'panel.case.delete' | translate}}</span>\n </button>\n </mat-menu>\n </div>\n </div>\n </ng-template>\n</nc-app-panel>\n", styles: [".case-panel-icon{margin-right:8px}.panel-main-content{margin-top:16px}.text-column-ellipsis{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.text-column-word-wrap{word-break:break-word!important;white-space:pre-line!important}.text-column-margin{margin-right:15px;line-height:24px}.text-column-div{min-width:0;width:0}.panel-header-padding{padding:9px 0!important}.width-100{width:100%}.pre-line-dialog{white-space:pre-line!important}.checkbox-padding{padding-right:12px}.radio-padding{padding-left:2px;padding-right:6px}\n"] }]
}], ctorParameters: () => [{ type: i1.CaseResourceService }, { type: i1.CaseViewService }, { type: i1.SnackBarService }, { type: i2.TranslateService }, { type: i1.LoggerService }, { type: i1.UserService }, { type: i3.CurrencyPipe }, { type: i1.PermissionService }, { type: i1.OverflowService, decorators: [{
type: Optional
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [DATA_FIELD_PORTAL_DATA]
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMvc3JjL2xpYi9wYW5lbC9jYXNlLXBhbmVsL2Nhc2UtcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzL3NyYy9saWIvcGFuZWwvY2FzZS1wYW5lbC9jYXNlLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFVLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQ0gsMEJBQTBCLEVBQ1Qsc0JBQXNCLEVBQXVCLGdCQUFnQixFQUMvRCxnQkFBZ0IsRUFHbEMsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBV2xDLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSwwQkFBMEI7SUFHeEM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDSDtJQUNlO0lBQ2dDO0lBWHhELFlBQVksQ0FBVTtJQUVoQyxZQUFzQixvQkFBeUMsRUFDekMsZ0JBQWlDLEVBQ2pDLGdCQUFpQyxFQUNqQyxpQkFBbUMsRUFDbkMsSUFBbUIsRUFDbkIsWUFBeUIsRUFDekIsYUFBMkIsRUFDOUIsa0JBQXFDLEVBQ3RCLGdCQUFpQyxFQUNELG9CQUE4RTtRQUM1SSxLQUFLLENBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQzFELGlCQUFpQixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFYOUUseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtRQUN6QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBQ2pDLHFCQUFnQixHQUFoQixnQkFBZ0Is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QztZQUM3RSxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDcEQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNsQixJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBOEIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7aUJBQ3pGO2dCQUNGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUM5RCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQWUsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFBO1NBQ0w7SUFDTCxDQUFDO3dHQS9EUSxrQkFBa0IsdVRBWUssc0JBQXNCOzRGQVo3QyxrQkFBa0IsNEVDbEIvQiw4MkVBc0NBOzs0RkRwQmEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNJLGVBQWU7OzBCQWVaLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgT25Jbml0LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0Q2FzZVBhbmVsQ29tcG9uZW50LFxuICAgIENhc2VWaWV3U2VydmljZSwgREFUQV9GSUVMRF9QT1JUQUxfREFUQSwgRGF0YUZpZWxkUG9ydGFsRGF0YSwgRW51bWVyYXRpb25GaWVsZCxcbiAgICBMb2dnZXJTZXJ2aWNlLCBNdWx0aWNob2ljZUZpZWxkLFxuICAgIE92ZXJmbG93U2VydmljZSxcbiAgICBVc2VyU2VydmljZVxufSBmcm9tICdAbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUnO1xuaW1wb3J0IHtDYXNlUmVzb3VyY2VTZXJ2aWNlLCBQZXJtaXNzaW9uU2VydmljZX0gZnJvbSAnQG5ldGdyaWYvY29tcG9uZW50cy1jb3JlJztcbmltcG9ydCB7U25hY2tCYXJTZXJ2aWNlfSBmcm9tICdAbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7Q3VycmVuY3lQaXBlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25jLWNhc2UtcGFuZWwnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYXNlLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYXNlLXBhbmVsLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2FzZVBhbmVsQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RDYXNlUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHByb3RlY3RlZCBfY2hhbmdlVmFsdWU6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2Nhc2VSZXNvdXJjZVNlcnZpY2U6IENhc2VSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9jYXNlVmlld1NlcnZpY2U6IENhc2VWaWV3U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3NuYWNrQmFyU2VydmljZTogU25hY2tCYXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2N1cnJlbmN5UGlwZTogQ3VycmVuY3lQaXBlLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBfcGVybWlzc2lvblNlcnZpY2U6IFBlcm1pc3Npb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfb3ZlcmZsb3dTZXJ2aWNlOiBPdmVyZmxvd1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEQVRBX0ZJRUxEX1BPUlRBTF9EQVRBKSBwcm90ZWN0ZWQgX2RhdGFGaWVsZFBvcnRhbERhdGE6IERhdGFGaWVsZFBvcnRhbERhdGE8TXVsdGljaG9pY2VGaWVsZCB8IEVudW1lcmF0aW9uRmllbGQ+KSB7XG4gICAgICAgIHN1cGVyKF9jYXNlUmVzb3VyY2VTZXJ2aWNlLCBfY2FzZVZpZXdTZXJ2aWNlLCBfc25hY2tCYXJTZXJ2aWNlLFxuICAgICAgICAgICAgX3RyYW5zbGF0ZVNlcnZpY2UsIF9sb2csIF91c2VyU2VydmljZSwgX2N1cnJlbmN5UGlwZSwgX3Blcm1pc3Npb25TZXJ2aWNlLCBfb3ZlcmZsb3dTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlVmFsdWUgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyB0eXBlQXBwcm92YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhRmllbGRQb3J0YWxEYXRhPy5kYXRhRmllbGQgaW5zdGFuY2VvZiBNdWx0aWNob2ljZUZpZWxkID8gJ211bHRpY2hvaWNlJyA6ICdlbnVtZXJhdGlvbic7XG4gICAgfVxuXG4gICAgcHVibGljIGNhc2VWYWx1ZSgpIHtcbiAgICAgICByZXR1cm4gdGhpcy5jYXNlXy5zdHJpbmdJZDtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGFGaWVsZFBvcnRhbERhdGEgIT09IG51bGwgJiYgdGhpcy5fZGF0YUZpZWxkUG9ydGFsRGF0YS5kYXRhRmllbGQgaW5zdGFuY2VvZiBNdWx0aWNob2ljZUZpZWxkKSB7XG4gICAgICAgICAgICB0aGlzLmFwcHJvdmFsRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5fZGF0YUZpZWxkUG9ydGFsRGF0YS5kYXRhRmllbGQudmFsdWU/LmluY2x1ZGVzKHRoaXMuY2FzZV8uc3RyaW5nSWQpKTtcbiAgICAgICAgICAgIHRoaXMuYXBwcm92YWxGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2hhbmdlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5fZGF0YUZpZWxkUG9ydGFsRGF0YS5kYXRhRmllbGQgYXMgTXVsdGljaG9pY2VGaWVsZCkudmFsdWUgPSBbLi4udGhpcy5fZGF0YUZpZWxkUG9ydGFsRGF0YS5kYXRhRmllbGQudmFsdWUsIHRoaXMuY2FzZV8uc3RyaW5nSWRdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9kYXRhRmllbGRQb3J0YWxEYXRhLmRhdGFGaWVsZC52YWx1ZS5pbmRleE9mKHRoaXMuY2FzZV8uc3RyaW5nSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyID0gWy4uLnRoaXMuX2RhdGFGaWVsZFBvcnRhbERhdGEuZGF0YUZpZWxkLnZhbHVlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5fZGF0YUZpZWxkUG9ydGFsRGF0YS5kYXRhRmllbGQgYXMgTXVsdGljaG9pY2VGaWVsZCkudmFsdWUgPSBhcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlVmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuX2RhdGFGaWVsZFBvcnRhbERhdGEuZGF0YUZpZWxkLnZhbHVlQ2hhbmdlcygpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcHJvdmFsRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5fZGF0YUZpZWxkUG9ydGFsRGF0YS5kYXRhRmllbGQudmFsdWU/LmluY2x1ZGVzKHRoaXMuY2FzZV8uc3RyaW5nSWQpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RhdGFGaWVsZFBvcnRhbERhdGEgIT09IG51bGwgJiYgdGhpcy5fZGF0YUZpZWxkUG9ydGFsRGF0YS5kYXRhRmllbGQgaW5zdGFuY2VvZiBFbnVtZXJhdGlvbkZpZWxkKSB7XG4gICAgICAgICAgICB0aGlzLmFwcHJvdmFsRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5fZGF0YUZpZWxkUG9ydGFsRGF0YS5kYXRhRmllbGQudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5hcHByb3ZhbEZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGFuZ2VWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5fZGF0YUZpZWxkUG9ydGFsRGF0YS5kYXRhRmllbGQgYXMgRW51bWVyYXRpb25GaWVsZCkudmFsdWUgPSB0aGlzLmNhc2VfLnN0cmluZ0lkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZVZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLl9kYXRhRmllbGRQb3J0YWxEYXRhLmRhdGFGaWVsZC52YWx1ZUNoYW5nZXMoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZVZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHByb3ZhbEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuX2RhdGFGaWVsZFBvcnRhbERhdGEuZGF0YUZpZWxkLnZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiPG5jLWFwcC1wYW5lbCBbcGFuZWxIZWFkZXJdPVwiY2FzZVBhbmVsSGVhZGVyXCIgW3ByZXZlbnRFeHBhbmRdPVwidHJ1ZVwiIFtmaXJzdF09XCJmaXJzdFwiIFtsYXN0XT1cImxhc3RcIlxuICAgICAgICAgICAgICBbY2FzZUNvbG9yXT1jYXNlXy5jb2xvcj5cbiAgICA8bmctdGVtcGxhdGUgI2Nhc2VQYW5lbEhlYWRlcj5cbiAgICAgICAgPGRpdiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCIgZnhMYXlvdXQ9XCJyb3dcIiBmeEZsZXg9XCI5NVwiIChjbGljayk9XCJwcmV2ZW50U2VsZWN0aW9uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCAqbmdJZj1cImFwcHJvdmFsICYmIHR5cGVBcHByb3ZhbCgpID09PSAnbXVsdGljaG9pY2UnXCIgW2Zvcm1Db250cm9sXT1cImFwcHJvdmFsRm9ybUNvbnRyb2xcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiIGNvbG9yPSdwcmltYXJ5JyBjbGFzcz1cImNoZWNrYm94LXBhZGRpbmdcIj48L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgKm5nSWY9XCJhcHByb3ZhbCAmJiB0eXBlQXBwcm92YWwoKSA9PT0gJ2VudW1lcmF0aW9uJ1wiIFtmb3JtQ29udHJvbF09XCJhcHByb3ZhbEZvcm1Db250cm9sXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIiBjbGFzcz1cInJhZGlvLXBhZGRpbmdcIiBjb2xvcj0ncHJpbWFyeSc+XG4gICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cImNhc2VWYWx1ZSgpXCI+PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmZWF0dXJlZEZpZWxkc1ZhbHVlczsgbGV0IGkgPSBpbmRleFwiIGZ4RmxleFxuICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtY29sdW1uLWRpdlwiIFtuZ1N0eWxlXT1cInsnbWluLXdpZHRoJzogZ2V0TWluV2lkdGgoKX1cIlxuICAgICAgICAgICAgICAgICBbZnhIaWRlLmx0LXhsXT1cImkgPj0gNCAmJiByZXNwb25zaXZlQm9keSAmJiAhb3ZlcmZsb3dNb2RlXCJcbiAgICAgICAgICAgICAgICAgW2Z4SGlkZS5sdC1sZ109XCJpID49IDMgJiYgcmVzcG9uc2l2ZUJvZHkgJiYgIW92ZXJmbG93TW9kZVwiXG4gICAgICAgICAgICAgICAgIFtmeEhpZGUubHQtbWRdPVwiaSA+PSAyICYmIHJlc3BvbnNpdmVCb2R5ICYmICFvdmVyZmxvd01vZGVcIlxuICAgICAgICAgICAgICAgICBbZnhIaWRlLmx0LXNtXT1cImkgPj0gMSAmJiByZXNwb25zaXZlQm9keSAmJiAhb3ZlcmZsb3dNb2RlXCJcbiAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydwYW5lbC1oZWFkZXItcGFkZGluZyc6ICF0ZXh0RWxsaXBzaXMgJiYgZmllbGQudHlwZSAhPT0gJ2J1dHRvbid9XCI+XG4gICAgICAgICAgICAgICAgPG5jLXBhbmVsLWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgW2xlYWRpbmdJY29uXT1cImNhc2VfLmljb25cIlxuICAgICAgICAgICAgICAgICAgICBbbGVhZGluZ0ljb25FbmFibGVkXT1cImkgPT09IDBcIlxuICAgICAgICAgICAgICAgICAgICBbZmVhdHVyZWRWYWx1ZV09XCJmaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0RWxsaXBzaXNdPVwidGV4dEVsbGlwc2lzXCI+XG4gICAgICAgICAgICAgICAgPC9uYy1wYW5lbC1pdGVtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIiBmeEZsZXg9XCI1XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlbGV0ZU1lbnUgJiYgY2FuRGVsZXRlKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic2hvdygkZXZlbnQpXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImRlbGV0ZUNhc2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyAncGFuZWwuY2FzZS5kZWxldGUnIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbmMtYXBwLXBhbmVsPlxuIl19