UNPKG

ontimize-web-ngx

Version:
139 lines 44.4 kB
import { moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop'; import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; import { Util } from '../../util/util'; import { Codes } from '../../util/codes'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/flex-layout/flex"; import * as i3 from "@angular/material/button"; import * as i4 from "@angular/material/checkbox"; import * as i5 from "@angular/material/icon"; import * as i6 from "@angular/material/list"; import * as i7 from "@angular/cdk/drag-drop"; import * as i8 from "./dual-list-selector-item/date/o-dual-list-selector-date-item.component"; import * as i9 from "../../pipes/o-translate.pipe"; export const DEFAULT_DUAL_LIST_SELECTOR = [ 'key', 'display', 'dataSource:data-source', 'dataDestination: data-destination', 'titleListDataSource: title-list-data-source', 'titleListDataDestination: title-list-data-destination', 'groupedColumnTypes:grouped-column-types', 'description' ]; export class ODualListSelectorComponent { constructor() { this.dataSource = []; this.dataDestination = []; this.titleListDataSource = ''; this.titleListDataDestination = ''; this.description = ''; this.key = ''; this.display = ''; this.groupedColumnTypes = []; } drop(event) { if (event.previousContainer === event.container) { moveItemInArray(event.container.data, event.previousIndex, event.currentIndex); } else { transferArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex); } } addToGroupedColumns(columnsToGrouped) { const self = this; columnsToGrouped.selectedOptions.selected.forEach(x => { self.dataDestination.push(x.value); self.dataSource = this.dataSource.filter(groupedColumn => groupedColumn[this.key] != x.value[this.key]); }); } removeGroupedColumns(groupedColumns) { const self = this; groupedColumns.selectedOptions.selected.forEach(x => { self.dataSource.push(x.value); self.dataDestination = this.dataDestination.filter(groupedColumn => groupedColumn[this.key] != x.value[this.key]); }); } onRemoveGroupColumn(column) { this.dataDestination = this.dataDestination.filter((oCol) => oCol[this.key] !== column[this.key]); this.dataSource.push(column); } isAllSelected(list) { const numSelected = list.selectedOptions.selected.length; const numRows = list.options ? list.options.length : 0; return numRows !== 0 && numSelected === numRows; } masterToggle(list) { list.selectedOptions.selected.length === list.options.length ? list.selectedOptions.clear() : list.selectAll(); } hasValue(list) { return list.selectedOptions.selected.length > 0; } isDisabledSortAsc(list) { let sortAsc = true; if (list.selectedOptions.selected.length !== 0) { const index = list.options.toArray().findIndex(x => x.value[this.key] === list.selectedOptions.selected[0].value[this.key]); if (index > 0) { sortAsc = false; } } return sortAsc; } isDisabledSortDesc(list) { let sortDesc = true; if (list.selectedOptions.selected.length !== 0) { const index = list.options.toArray().findIndex(x => x.value[this.key] === list.selectedOptions.selected[0].value[this.key]); if (index >= 0 && (index + 1) !== list.options.toArray().length) { sortDesc = false; } } return sortDesc; } sortAscSelectedItems(list) { const self = this; const itemsSelected = list.selectedOptions.selected; itemsSelected.forEach(item => { const index = list.options.toArray().findIndex(x => x.value[this.key] === item.value[this.key]); moveItemInArray(this.dataDestination, index, index - 1); }); } sortDescSelectedItems(list) { const self = this; const itemsSelected = list.selectedOptions.selected; itemsSelected.forEach(item => { const index = list.options.toArray().findIndex(x => x.value[this.key] === item.value[this.key]); moveItemInArray(self.dataDestination, index, index + 1); }); } getCheckboxLabel(list) { let label = ''; if (Util.isDefined(list.options)) { label = '(' + list.selectedOptions.selected.length + '/' + list.options.length + ')'; } return label; } getSelectedItems() { return this.dataDestination; } setSelectedItems(items) { this.dataDestination = items; } getGroupedColumnTypes() { return this.groupedColumnTypes; } get groupedDateColumns() { return this.groupedColumnTypes.filter(groupedColumn => Codes.TYPES_DATE_GROUPS.findIndex(type => type === groupedColumn.type) > -1); } } ODualListSelectorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODualListSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); ODualListSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ODualListSelectorComponent, selector: "o-dual-list-selector", inputs: { key: "key", display: "display", dataSource: ["data-source", "dataSource"], dataDestination: ["data-destination", "dataDestination"], titleListDataSource: ["title-list-data-source", "titleListDataSource"], titleListDataDestination: ["title-list-data-destination", "titleListDataDestination"], groupedColumnTypes: ["grouped-column-types", "groupedColumnTypes"], description: "description" }, host: { properties: { "class.o-dual-list-selector": "true" } }, ngImport: i0, template: "<div mat-subheader>{{description | oTranslate }} </div>\n\n<div class=\"o-dual-list-selector-wrapper-selector-list\">\n\n <div class=\"o-dual-list-selector-list\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"50%\">\n <div fxLayout=\"row\" fxFlex class=\"o-dual-list-selector-source-wrapper\">\n <mat-selection-list fxFlex cdkDropList id=\"item-source-list\" #itemsList [cdkDropListData]=\"dataSource\"\n [cdkDropListConnectedTo]=\"['item-destination-list']\" (cdkDropListDropped)=\"drop($event)\" cdkDropListSortingDisabled>\n\n <mat-list-item>\n <mat-checkbox (change)=\"$event ? masterToggle(itemsList) : null\" [checked]=\"isAllSelected(itemsList)\"\n [indeterminate]=\"hasValue(itemsList) && !isAllSelected(itemsList)\" fxFlex>\n <span fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n <span>{{ titleListDataSource | oTranslate }}</span>\n <span>{{ getCheckboxLabel(itemsList) }} </span>\n </span>\n </mat-checkbox>\n </mat-list-item>\n\n <mat-list-option checkboxPosition=\"before\" *ngFor=\"let item of dataSource\" [value]=\"item\" cdkDrag class=\"o-drag-list-item-box\">\n <span matListItemLine>{{ (item[display]) | oTranslate }} </span>\n </mat-list-option>\n </mat-selection-list>\n\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"50px\" fxLayoutGap=\"24px\">\n <button mat-mini-fab (click)=\"addToGroupedColumns(itemsList)\" [disabled]=\"itemsList.selectedOptions.selected.length===0\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button mat-mini-fab (click)=\"removeGroupedColumns(selectedItemsList)\" [disabled]=\"selectedItemsList.selectedOptions.selected.length===0\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"o-dual-list-selector-list\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"50%\">\n <div fxLayout=\"row\" fxFlex class=\"o-dual-list-selector-destination-wrapper\">\n <mat-selection-list fxFlex cdkDropList id=\"item-destination-list\" #selectedItemsList [cdkDropListData]=\"dataDestination\"\n [cdkDropListConnectedTo]=\"['item-source-list']\" (cdkDropListDropped)=\"drop($event)\">\n <mat-list-item>\n <mat-checkbox (change)=\"$event ? masterToggle(selectedItemsList) : null\" [checked]=\"isAllSelected(selectedItemsList)\"\n [indeterminate]=\"hasValue(selectedItemsList) && !isAllSelected(selectedItemsList)\" fxFlex>\n <span fxLayoutAlign=\"space-between center\">\n <span>{{ titleListDataDestination | oTranslate}}</span>\n <span>{{ getCheckboxLabel(selectedItemsList) }}</span>\n </span>\n </mat-checkbox>\n </mat-list-item>\n\n <mat-list-option checkboxPosition=\"before\" *ngFor=\"let itemSelected of dataDestination\" [value]=\"itemSelected\" cdkDrag\n class=\"o-drag-list-item-box\">\n\n <ng-container *ngIf=\"itemSelected.type === 'date'; else defaultRenderer\">\n <o-dual-list-selector-date-item [item]=itemSelected.attr [grouped-date-columns]=\"groupedColumnTypes\" ></o-dual-list-selector-date-item>\n </ng-container>\n\n <ng-template #defaultRenderer>\n <span matListItemLine>{{ itemSelected[display] | oTranslate }} </span>\n </ng-template>\n\n </mat-list-option>\n\n <div class=\"mat-caption drop-empty-message\" *ngIf=\"dataDestination.length===0\">\n {{ 'DUAL_LIST_SELECTOR.DROP_EMPTY_MESSAGE' | oTranslate }}\n </div>\n </mat-selection-list>\n\n\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"50px\" fxLayoutGap=\"24px\">\n <button mat-mini-fab [disabled]=\"isDisabledSortAsc(selectedItemsList)\" (click)=\"sortAscSelectedItems(selectedItemsList)\">\n <mat-icon>expand_less</mat-icon>\n </button>\n <button mat-mini-fab [disabled]=\"isDisabledSortDesc(selectedItemsList)\" (click)=\"sortDescSelectedItems(selectedItemsList)\">\n <mat-icon>expand_more</mat-icon>\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".o-dual-list-selector{width:100%;height:100%;display:flex;flex-direction:column;flex-wrap:nowrap}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list{flex:1}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-destination-wrapper,.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-source-wrapper{overflow:auto}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-mini-fab{line-height:14px;height:18px;width:18px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-mini-fab .mat-icon{font-size:18px;height:18px;width:18px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base{overflow-y:auto;width:100%;position:relative;border-radius:4px;padding:0 16px 16px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base .mat-mdc-list-item.mat-mdc-list-item:not(.mat-mdc-list-option){margin:0}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base .mat-mdc-list-item.mat-mdc-list-item:not(.mat-mdc-list-option) .mat-mdc-list-item-line{font-weight:500}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .mat-list-option.cdk-drag.o-drag-list-item-box .mdc-list-item__content{cursor:move}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .drop-empty-message{position:absolute;width:calc(100% - 16px);text-align:center;opacity:.5;top:50%}\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.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: i2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i2.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: i2.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: "component", type: i3.MatMiniFabButton, selector: "button[mat-mini-fab]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i6.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "component", type: i6.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "directive", type: i6.MatListSubheaderCssMatStyler, selector: "[mat-subheader], [matSubheader]" }, { kind: "directive", type: i6.MatListItemLine, selector: "[matListItemLine]" }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i8.ODualListSelectorDateItemComponent, selector: "o-dual-list-selector-date-item", inputs: ["item", "grouped-date-columns"] }, { kind: "pipe", type: i9.OTranslatePipe, name: "oTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODualListSelectorComponent, decorators: [{ type: Component, args: [{ selector: 'o-dual-list-selector', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, inputs: DEFAULT_DUAL_LIST_SELECTOR, host: { '[class.o-dual-list-selector]': 'true' }, template: "<div mat-subheader>{{description | oTranslate }} </div>\n\n<div class=\"o-dual-list-selector-wrapper-selector-list\">\n\n <div class=\"o-dual-list-selector-list\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"50%\">\n <div fxLayout=\"row\" fxFlex class=\"o-dual-list-selector-source-wrapper\">\n <mat-selection-list fxFlex cdkDropList id=\"item-source-list\" #itemsList [cdkDropListData]=\"dataSource\"\n [cdkDropListConnectedTo]=\"['item-destination-list']\" (cdkDropListDropped)=\"drop($event)\" cdkDropListSortingDisabled>\n\n <mat-list-item>\n <mat-checkbox (change)=\"$event ? masterToggle(itemsList) : null\" [checked]=\"isAllSelected(itemsList)\"\n [indeterminate]=\"hasValue(itemsList) && !isAllSelected(itemsList)\" fxFlex>\n <span fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n <span>{{ titleListDataSource | oTranslate }}</span>\n <span>{{ getCheckboxLabel(itemsList) }} </span>\n </span>\n </mat-checkbox>\n </mat-list-item>\n\n <mat-list-option checkboxPosition=\"before\" *ngFor=\"let item of dataSource\" [value]=\"item\" cdkDrag class=\"o-drag-list-item-box\">\n <span matListItemLine>{{ (item[display]) | oTranslate }} </span>\n </mat-list-option>\n </mat-selection-list>\n\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"50px\" fxLayoutGap=\"24px\">\n <button mat-mini-fab (click)=\"addToGroupedColumns(itemsList)\" [disabled]=\"itemsList.selectedOptions.selected.length===0\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button mat-mini-fab (click)=\"removeGroupedColumns(selectedItemsList)\" [disabled]=\"selectedItemsList.selectedOptions.selected.length===0\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"o-dual-list-selector-list\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"50%\">\n <div fxLayout=\"row\" fxFlex class=\"o-dual-list-selector-destination-wrapper\">\n <mat-selection-list fxFlex cdkDropList id=\"item-destination-list\" #selectedItemsList [cdkDropListData]=\"dataDestination\"\n [cdkDropListConnectedTo]=\"['item-source-list']\" (cdkDropListDropped)=\"drop($event)\">\n <mat-list-item>\n <mat-checkbox (change)=\"$event ? masterToggle(selectedItemsList) : null\" [checked]=\"isAllSelected(selectedItemsList)\"\n [indeterminate]=\"hasValue(selectedItemsList) && !isAllSelected(selectedItemsList)\" fxFlex>\n <span fxLayoutAlign=\"space-between center\">\n <span>{{ titleListDataDestination | oTranslate}}</span>\n <span>{{ getCheckboxLabel(selectedItemsList) }}</span>\n </span>\n </mat-checkbox>\n </mat-list-item>\n\n <mat-list-option checkboxPosition=\"before\" *ngFor=\"let itemSelected of dataDestination\" [value]=\"itemSelected\" cdkDrag\n class=\"o-drag-list-item-box\">\n\n <ng-container *ngIf=\"itemSelected.type === 'date'; else defaultRenderer\">\n <o-dual-list-selector-date-item [item]=itemSelected.attr [grouped-date-columns]=\"groupedColumnTypes\" ></o-dual-list-selector-date-item>\n </ng-container>\n\n <ng-template #defaultRenderer>\n <span matListItemLine>{{ itemSelected[display] | oTranslate }} </span>\n </ng-template>\n\n </mat-list-option>\n\n <div class=\"mat-caption drop-empty-message\" *ngIf=\"dataDestination.length===0\">\n {{ 'DUAL_LIST_SELECTOR.DROP_EMPTY_MESSAGE' | oTranslate }}\n </div>\n </mat-selection-list>\n\n\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"50px\" fxLayoutGap=\"24px\">\n <button mat-mini-fab [disabled]=\"isDisabledSortAsc(selectedItemsList)\" (click)=\"sortAscSelectedItems(selectedItemsList)\">\n <mat-icon>expand_less</mat-icon>\n </button>\n <button mat-mini-fab [disabled]=\"isDisabledSortDesc(selectedItemsList)\" (click)=\"sortDescSelectedItems(selectedItemsList)\">\n <mat-icon>expand_more</mat-icon>\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".o-dual-list-selector{width:100%;height:100%;display:flex;flex-direction:column;flex-wrap:nowrap}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list{flex:1}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-destination-wrapper,.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-source-wrapper{overflow:auto}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-mini-fab{line-height:14px;height:18px;width:18px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-mini-fab .mat-icon{font-size:18px;height:18px;width:18px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base{overflow-y:auto;width:100%;position:relative;border-radius:4px;padding:0 16px 16px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base .mat-mdc-list-item.mat-mdc-list-item:not(.mat-mdc-list-option){margin:0}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base .mat-mdc-list-item.mat-mdc-list-item:not(.mat-mdc-list-option) .mat-mdc-list-item-line{font-weight:500}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .mat-list-option.cdk-drag.o-drag-list-item-box .mdc-list-item__content{cursor:move}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .drop-empty-message{position:absolute;width:calc(100% - 16px);text-align:center;opacity:.5;top:50%}\n"] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1kdWFsLWxpc3Qtc2VsZWN0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvZHVhbC1saXN0LXNlbGVjdG9yL28tZHVhbC1saXN0LXNlbGVjdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2R1YWwtbGlzdC1zZWxlY3Rvci9vLWR1YWwtbGlzdC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd0RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7OztBQUV6QyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUV4QyxLQUFLO0lBRUwsU0FBUztJQUVULHdCQUF3QjtJQUV4QixtQ0FBbUM7SUFDbkMsNkNBQTZDO0lBQzdDLHVEQUF1RDtJQUN2RCx5Q0FBeUM7SUFDekMsYUFBYTtDQUNkLENBQUM7QUFhRixNQUFNLE9BQU8sMEJBQTBCO0lBWHZDO1FBYVMsZUFBVSxHQUFlLEVBQUUsQ0FBQztRQUM1QixvQkFBZSxHQUFlLEVBQUUsQ0FBQztRQUNqQyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsNkJBQXdCLEdBQVcsRUFBRSxDQUFDO1FBQ3RDLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLFFBQUcsR0FBRyxFQUFFLENBQUM7UUFDVCxZQUFPLEdBQUcsRUFB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OlsiaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSwgdHJhbnNmZXJBcnJheUl0ZW0gfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRTZWxlY3Rpb25MaXN0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGlzdCc7XG5pbXBvcnQgeyBPR3JvdXBlZENvbHVtblR5cGVzIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1ncm91cGVkLWNvbHVtbi10eXBlcy50eXBlJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi8uLi91dGlsL2NvZGVzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRFVBTF9MSVNUX1NFTEVDVE9SID0gW1xuICAvL2tleTogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZpZWxkIG9mIGVhY2ggb2JqZWN0IGluIHRoZSBkYXRhIHNvdXJjZSBhbmQgZGF0YSBkZXN0aW5hdGlvbiBhcnJheXNcbiAgJ2tleScsXG4gIC8vZGlzcGxheSAtIFRoZSBmaWVsZCBvZiBlYWNoIG9iamVjdCBmb3IgZGlzcGxheWluZyB0aGUgb2JqZWN0IGVhY2ggdGhlIGxpc3RzLFxuICAnZGlzcGxheScsXG4gIC8vZGF0YS1zb3VyY2U6IFRoZSBzb3VyY2UgYXJyYXkgb2Ygb2JqZWN0cyBvciBzdHJpbmdzIGZvciB0aGUgbGlzdC5cbiAgJ2RhdGFTb3VyY2U6ZGF0YS1zb3VyY2UnLFxuICAvL2RhdGEtZGVzdGluYXRpb24gOiBUaGUgZGVzdGluYXRpb24gYXJyYXkgb2Ygb2JqZWN0cyBvciBzdHJpbmdzIHNlbGVjdGVkIGZyb20gdGhlIHNvdXJjZVxuICAnZGF0YURlc3RpbmF0aW9uOiBkYXRhLWRlc3RpbmF0aW9uJyxcbiAgJ3RpdGxlTGlzdERhdGFTb3VyY2U6IHRpdGxlLWxpc3QtZGF0YS1zb3VyY2UnLFxuICAndGl0bGVMaXN0RGF0YURlc3RpbmF0aW9uOiB0aXRsZS1saXN0LWRhdGEtZGVzdGluYXRpb24nLFxuICAnZ3JvdXBlZENvbHVtblR5cGVzOmdyb3VwZWQtY29sdW1uLXR5cGVzJyxcbiAgJ2Rlc2NyaXB0aW9uJ1xuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby1kdWFsLWxpc3Qtc2VsZWN0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vby1kdWFsLWxpc3Qtc2VsZWN0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vLWR1YWwtbGlzdC1zZWxlY3Rvci5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW5wdXRzOiBERUZBVUxUX0RVQUxfTElTVF9TRUxFQ1RPUixcbiAgaG9zdDoge1xuICAgICdbY2xhc3Muby1kdWFsLWxpc3Qtc2VsZWN0b3JdJzogJ3RydWUnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgT0R1YWxMaXN0U2VsZWN0b3JDb21wb25lbnQge1xuXG4gIHB1YmxpYyBkYXRhU291cmNlOiBBcnJheTxhbnk+ID0gW107XG4gIHB1YmxpYyBkYXRhRGVzdGluYXRpb246IEFycmF5PGFueT4gPSBbXTtcbiAgcHVibGljIHRpdGxlTGlzdERhdGFTb3VyY2U6IHN0cmluZyA9ICcnO1xuICBwdWJsaWMgdGl0bGVMaXN0RGF0YURlc3RpbmF0aW9uOiBzdHJpbmcgPSAnJztcbiAgcHVibGljIGRlc2NyaXB0aW9uID0gJyc7XG4gIHB1YmxpYyBrZXkgPSAnJztcbiAgcHVibGljIGRpc3BsYXkgPSAnJztcbiAgcHVibGljIGdyb3VwZWRDb2x1bW5UeXBlczogT0dyb3VwZWRDb2x1bW5UeXBlc1tdID0gW107XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XG5cbiAgICBpZiAoZXZlbnQucHJldmlvdXNDb250YWluZXIgPT09IGV2ZW50LmNvbnRhaW5lcikge1xuICAgICAgbW92ZUl0ZW1JbkFycmF5KGV2ZW50LmNvbnRhaW5lci5kYXRhLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmFuc2ZlckFycmF5SXRlbShldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhLFxuICAgICAgICBldmVudC5jb250YWluZXIuZGF0YSxcbiAgICAgICAgZXZlbnQucHJldmlvdXNJbmRleCxcbiAgICAgICAgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB9XG4gIH1cblxuICBhZGRUb0dyb3VwZWRDb2x1bW5zKGNvbHVtbnNUb0dyb3VwZWQ6IE1hdFNlbGVjdGlvbkxpc3QpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb2x1bW5zVG9Hcm91cGVkLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5mb3JFYWNoKHggPT4ge1xuICAgICAgLy9hZGRlZCBpbiBkYXRhRGVzdGluYXRpb25cbiAgICAgIHNlbGYuZGF0YURlc3RpbmF0aW9uLnB1c2goeC52YWx1ZSk7XG4gICAgICAvL3JlbW92ZSBpdGVtIGluIGRhdGFTb3VyY2VcbiAgICAgIHNlbGYuZGF0YVNvdXJjZSA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoZ3JvdXBlZENvbHVtbiA9PiBncm91cGVkQ29sdW1uW3RoaXMua2V5XSAhPSB4LnZhbHVlW3RoaXMua2V5XSk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIHJlbW92ZUdyb3VwZWRDb2x1bW5zKGdyb3VwZWRDb2x1bW5zOiBNYXRTZWxlY3Rpb25MaXN0KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgZ3JvdXBlZENvbHVtbnMuc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmZvckVhY2goeCA9PiB7XG5cbiAgICAgIHNlbGYuZGF0YVNvdXJjZS5wdXNoKHgudmFsdWUpO1xuICAgICAgc2VsZi5kYXRhRGVzdGluYXRpb24gPSB0aGlzLmRhdGFEZXN0aW5hdGlvbi5maWx0ZXIoZ3JvdXBlZENvbHVtbiA9PiBncm91cGVkQ29sdW1uW3RoaXMua2V5XSAhPSB4LnZhbHVlW3RoaXMua2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICBvblJlbW92ZUdyb3VwQ29sdW1uKGNvbHVtbjogYW55KSB7XG4gICAgdGhpcy5kYXRhRGVzdGluYXRpb24gPSB0aGlzLmRhdGFEZXN0aW5hdGlvbi5maWx0ZXIoKG9Db2w6IGFueSkgPT4gb0NvbFt0aGlzLmtleV0gIT09IGNvbHVtblt0aGlzLmtleV0pO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5wdXNoKGNvbHVtbik7XG4gIH1cblxuICBpc0FsbFNlbGVjdGVkKGxpc3Q6IE1hdFNlbGVjdGlvbkxpc3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IGxpc3Quc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmxlbmd0aDtcbiAgICBjb25zdCBudW1Sb3dzID0gbGlzdC5vcHRpb25zID8gbGlzdC5vcHRpb25zLmxlbmd0aCA6IDA7XG4gICAgcmV0dXJuIG51bVJvd3MgIT09IDAgJiYgbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XG5cbiAgfVxuXG4gIG1hc3RlclRvZ2dsZShsaXN0OiBNYXRTZWxlY3Rpb25MaXN0KSB7XG4gICAgbGlzdC5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubGVuZ3RoID09PSBsaXN0Lm9wdGlvbnMubGVuZ3RoID9cbiAgICAgIGxpc3Quc2VsZWN0ZWRPcHRpb25zLmNsZWFyKCkgOlxuICAgICAgbGlzdC5zZWxlY3RBbGwoKTtcblxuICB9XG5cbiAgaGFzVmFsdWUobGlzdDogTWF0U2VsZWN0aW9uTGlzdCkge1xuICAgIHJldHVybiBsaXN0LnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGggPiAwXG4gIH1cbiAgaXNEaXNhYmxlZFNvcnRBc2MobGlzdDogTWF0U2VsZWN0aW9uTGlzdCkge1xuICAgIGxldCBzb3J0QXNjID0gdHJ1ZTtcbiAgICBpZiAobGlzdC5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGxpc3Qub3B0aW9ucy50b0FycmF5KCkuZmluZEluZGV4KHggPT4geC52YWx1ZVt0aGlzLmtleV0gPT09IGxpc3Quc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkWzBdLnZhbHVlW3RoaXMua2V5XSk7XG5cbiAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgc29ydEFzYyA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgfVxuICAgIHJldHVybiBzb3J0QXNjO1xuICB9XG5cbiAgaXNEaXNhYmxlZFNvcnREZXNjKGxpc3Q6IE1hdFNlbGVjdGlvbkxpc3QpIHtcbiAgICBsZXQgc29ydERlc2MgPSB0cnVlO1xuICAgIGlmIChsaXN0LnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gbGlzdC5vcHRpb25zLnRvQXJyYXkoKS5maW5kSW5kZXgoeCA9PiB4LnZhbHVlW3RoaXMua2V5XSA9PT0gbGlzdC5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWRbMF0udmFsdWVbdGhpcy5rZXldKTtcblxuICAgICAgaWYgKGluZGV4ID49IDAgJiYgKGluZGV4ICsgMSkgIT09IGxpc3Qub3B0aW9ucy50b0FycmF5KCkubGVuZ3RoKSB7XG4gICAgICAgIHNvcnREZXNjID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIHNvcnREZXNjO1xuICB9XG5cbiAgc29ydEFzY1NlbGVjdGVkSXRlbXMobGlzdDogTWF0U2VsZWN0aW9uTGlzdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGl0ZW1zU2VsZWN0ZWQgPSBsaXN0LnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZDtcbiAgICBpdGVtc1NlbGVjdGVkLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IGxpc3Qub3B0aW9ucy50b0FycmF5KCkuZmluZEluZGV4KHggPT4geC52YWx1ZVt0aGlzLmtleV0gPT09IGl0ZW0udmFsdWVbdGhpcy5rZXldKTtcbiAgICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmRhdGFEZXN0aW5hdGlvbiwgaW5kZXgsIGluZGV4IC0gMSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgZGVzYyBzZWxlY3RlZCBpdGVtc1xuICAgKiBAcGFyYW0gbGlzdFxuICAgKi9cbiAgc29ydERlc2NTZWxlY3RlZEl0ZW1zKGxpc3Q6IE1hdFNlbGVjdGlvbkxpc3QpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBpdGVtc1NlbGVjdGVkID0gbGlzdC5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQ7XG4gICAgaXRlbXNTZWxlY3RlZC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBsaXN0Lm9wdGlvbnMudG9BcnJheSgpLmZpbmRJbmRleCh4ID0+IHgudmFsdWVbdGhpcy5rZXldID09PSBpdGVtLnZhbHVlW3RoaXMua2V5XSk7XG4gICAgICBtb3ZlSXRlbUluQXJyYXkoc2VsZi5kYXRhRGVzdGluYXRpb24sIGluZGV4LCBpbmRleCArIDEpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2hlY2tib3hMYWJlbChsaXN0OiBNYXRTZWxlY3Rpb25MaXN0KSB7XG4gICAgbGV0IGxhYmVsID0gJyc7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGxpc3Qub3B0aW9ucykpIHtcbiAgICAgIGxhYmVsID0gJygnICsgbGlzdC5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubGVuZ3RoICsgJy8nICsgbGlzdC5vcHRpb25zLmxlbmd0aCArICcpJztcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgc2VsZWN0ZWQgaXRlbXNcbiAgICogQHJldHVybnMgc2VsZWN0ZWQgaXRlbXNcbiAgICovXG4gIGdldFNlbGVjdGVkSXRlbXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YURlc3RpbmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgc2VsZWN0ZWQgaXRlbXNcbiAgICogQHBhcmFtIGl0ZW1zXG4gICAqL1xuICBzZXRTZWxlY3RlZEl0ZW1zKGl0ZW1zOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5kYXRhRGVzdGluYXRpb24gPSBpdGVtcztcbiAgfVxuXG4gIGdldEdyb3VwZWRDb2x1bW5UeXBlcygpOiBPR3JvdXBlZENvbHVtblR5cGVzW10ge1xuICAgIHJldHVybiB0aGlzLmdyb3VwZWRDb2x1bW5UeXBlcztcbiAgfVxuICBnZXQgZ3JvdXBlZERhdGVDb2x1bW5zKCk6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzLmZpbHRlcihncm91cGVkQ29sdW1uID0+IENvZGVzLlRZUEVTX0RBVEVfR1JPVVBTLmZpbmRJbmRleCh0eXBlID0+IHR5cGUgPT09IGdyb3VwZWRDb2x1bW4udHlwZSkgPiAtMSlcbiAgfVxufVxuIiwiPGRpdiBtYXQtc3ViaGVhZGVyPnt7ZGVzY3JpcHRpb24gfCBvVHJhbnNsYXRlIH19IDwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiby1kdWFsLWxpc3Qtc2VsZWN0b3Itd3JhcHBlci1zZWxlY3Rvci1saXN0XCI+XG5cbiAgPGRpdiBjbGFzcz1cIm8tZHVhbC1saXN0LXNlbGVjdG9yLWxpc3RcIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBzdHJldGNoXCIgZnhGbGV4PVwiNTAlXCI+XG4gICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4RmxleCBjbGFzcz1cIm8tZHVhbC1saXN0LXNlbGVjdG9yLXNvdXJjZS13cmFwcGVyXCI+XG4gICAgICA8bWF0LXNlbGVjdGlvbi1saXN0IGZ4RmxleCBjZGtEcm9wTGlzdCBpZD1cIml0ZW0tc291cmNlLWxpc3RcIiAjaXRlbXNMaXN0IFtjZGtEcm9wTGlzdERhdGFdPVwiZGF0YVNvdXJjZVwiXG4gICAgICAgIFtjZGtEcm9wTGlzdENvbm5lY3RlZFRvXT1cIlsnaXRlbS1kZXN0aW5hdGlvbi1saXN0J11cIiAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiIGNka0Ryb3BMaXN0U29ydGluZ0Rpc2FibGVkPlxuXG4gICAgICAgIDxtYXQtbGlzdC1pdGVtPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoaXRlbXNMaXN0KSA6IG51bGxcIiBbY2hlY2tlZF09XCJpc0FsbFNlbGVjdGVkKGl0ZW1zTGlzdClcIlxuICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaGFzVmFsdWUoaXRlbXNMaXN0KSAgJiYgIWlzQWxsU2VsZWN0ZWQoaXRlbXNMaXN0KVwiIGZ4RmxleD5cbiAgICAgICAgICAgIDxzcGFuIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW4gY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IHRpdGxlTGlzdERhdGFTb3VyY2UgfCBvVHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRDaGVja2JveExhYmVsKGl0ZW1zTGlzdCkgfX0gPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L21hdC1saXN0LWl0ZW0+XG5cbiAgICAgICAgPG1hdC1saXN0LW9wdGlvbiBjaGVja2JveFBvc2l0aW9uPVwiYmVmb3JlXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YVNvdXJjZVwiIFt2YWx1ZV09XCJpdGVtXCIgY2RrRHJhZyBjbGFzcz1cIm8tZHJhZy1saXN0LWl0ZW0tYm94XCI+XG4gICAgICAgICAgPHNwYW4gbWF0TGlzdEl0ZW1MaW5lPnt7IChpdGVtW2Rpc3BsYXldKSB8IG9UcmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICA8L21hdC1saXN0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxuXG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiBmeEZsZXg9XCI1MHB4XCIgZnhMYXlvdXRHYXA9XCIyNHB4XCI+XG4gICAgICAgIDxidXR0b24gbWF0LW1pbmktZmFiIChjbGljayk9XCJhZGRUb0dyb3VwZWRDb2x1bW5zKGl0ZW1zTGlzdClcIiBbZGlzYWJsZWRdPVwiaXRlbXNMaXN0LnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGg9PT0wXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgKGNsaWNrKT1cInJlbW92ZUdyb3VwZWRDb2x1bW5zKHNlbGVjdGVkSXRlbXNMaXN0KVwiIFtkaXNhYmxlZF09XCJzZWxlY3RlZEl0ZW1zTGlzdC5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubGVuZ3RoPT09MFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5jaGV2cm9uX2xlZnQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiby1kdWFsLWxpc3Qtc2VsZWN0b3ItbGlzdFwiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IHN0cmV0Y2hcIiBmeEZsZXg9XCI1MCVcIj5cbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhGbGV4IGNsYXNzPVwiby1kdWFsLWxpc3Qtc2VsZWN0b3ItZGVzdGluYXRpb24td3JhcHBlclwiPlxuICAgICAgPG1hdC1zZWxlY3Rpb24tbGlzdCBmeEZsZXggY2RrRHJvcExpc3QgaWQ9XCJpdGVtLWRlc3RpbmF0aW9uLWxpc3RcIiAjc2VsZWN0ZWRJdGVtc0xpc3QgW2Nka0Ryb3BMaXN0RGF0YV09XCJkYXRhRGVzdGluYXRpb25cIlxuICAgICAgICBbY2RrRHJvcExpc3RDb25uZWN0ZWRUb109XCJbJ2l0ZW0tc291cmNlLWxpc3QnXVwiIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG4gICAgICAgIDxtYXQtbGlzdC1pdGVtPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoc2VsZWN0ZWRJdGVtc0xpc3QpIDogbnVsbFwiIFtjaGVja2VkXT1cImlzQWxsU2VsZWN0ZWQoc2VsZWN0ZWRJdGVtc0xpc3QpXCJcbiAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImhhc1ZhbHVlKHNlbGVjdGVkSXRlbXNMaXN0KSAmJiAhaXNBbGxTZWxlY3RlZChzZWxlY3RlZEl0ZW1zTGlzdClcIiBmeEZsZXg+XG4gICAgICAgICAgICA8c3BhbiBmeExheW91dEFsaWduPVwic3BhY2UtYmV0d2VlbiBjZW50ZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgdGl0bGVMaXN0RGF0YURlc3RpbmF0aW9uIHwgb1RyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRDaGVja2JveExhYmVsKHNlbGVjdGVkSXRlbXNMaXN0KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC9tYXQtbGlzdC1pdGVtPlxuXG4gICAgICAgIDxtYXQtbGlzdC1vcHRpb24gY2hlY2tib3hQb3NpdGlvbj1cImJlZm9yZVwiICpuZ0Zvcj1cImxldCBpdGVtU2VsZWN0ZWQgb2YgZGF0YURlc3RpbmF0aW9uXCIgW3ZhbHVlXT1cIml0ZW1TZWxlY3RlZFwiIGNka0RyYWdcbiAgICAgICAgICBjbGFzcz1cIm8tZHJhZy1saXN0LWl0ZW0tYm94XCI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVNlbGVjdGVkLnR5cGUgPT09ICdkYXRlJzsgZWxzZSBkZWZhdWx0UmVuZGVyZXJcIj5cbiAgICAgICAgICAgIDxvLWR1YWwtbGlzdC1zZWxlY3Rvci1kYXRlLWl0ZW0gW2l0ZW1dPWl0ZW1TZWxlY3RlZC5hdHRyIFtncm91cGVkLWRhdGUtY29sdW1uc109XCJncm91cGVkQ29sdW1uVHlwZXNcIiA+PC9vLWR1YWwtbGlzdC1zZWxlY3Rvci1kYXRlLWl0ZW0+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRSZW5kZXJlcj5cbiAgICAgICAgICAgIDxzcGFuIG1hdExpc3RJdGVtTGluZT57eyBpdGVtU2VsZWN0ZWRbZGlzcGxheV0gfCBvVHJhbnNsYXRlIH19IDwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDwvbWF0LWxpc3Qtb3B0aW9uPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtY2FwdGlvbiBkcm9wLWVtcHR5LW1lc3NhZ2VcIiAqbmdJZj1cImRhdGFEZXN0aW5hdGlvbi5sZW5ndGg9PT0wXCI+XG4gICAgICAgICAge3sgJ0RVQUxfTElTVF9TRUxFQ1RPUi5EUk9QX0VNUFRZX01FU1NBR0UnIHwgb1RyYW5zbGF0ZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxuXG5cbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIGZ4RmxleD1cIjUwcHhcIiBmeExheW91dEdhcD1cIjI0cHhcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRTb3J0QXNjKHNlbGVjdGVkSXRlbXNMaXN0KVwiIChjbGljayk9XCJzb3J0QXNjU2VsZWN0ZWRJdGVtcyhzZWxlY3RlZEl0ZW1zTGlzdClcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXhwYW5kX2xlc3M8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRTb3J0RGVzYyhzZWxlY3RlZEl0ZW1zTGlzdClcIiAoY2xpY2spPVwic29ydERlc2NTZWxlY3RlZEl0ZW1zKHNlbGVjdGVkSXRlbXNMaXN0KVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5leHBhbmRfbW9yZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==