ng-devui
Version:
DevUI components based on Angular
209 lines • 70.9 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
import { Component, EventEmitter, Input, Output, QueryList, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
import { I18nService } from 'ng-devui/i18n';
import { DevConfigService, expandCollapseForDomDestroy, WithConfig } from 'ng-devui/utils';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { TreeFactory } from './tree-factory.class';
import * as i0 from "@angular/core";
import * as i1 from "ng-devui/i18n";
import * as i2 from "ng-devui/utils";
import * as i3 from "@angular/common";
import * as i4 from "ng-devui/loading";
import * as i5 from "@angular/cdk/scrolling";
import * as i6 from "./tree-nodes.component";
import * as i7 from "./pipe/transfer-to-array.pipe";
export class TreeComponent {
constructor(i18n, devConfigService) {
this.i18n = i18n;
this.devConfigService = devConfigService;
this.treeNodeTitleKey = 'title';
this.checkboxDisabledKey = 'disabled';
this.selectDisabledKey = 'disabled';
this.toggleDisabledKey = 'disableToggle';
this.virtualScroll = false;
this.virtualScrollHeight = '800px';
this.showAnimation = true;
this.minBufferPx = 600;
this.maxBufferPx = 900;
this.itemSize = 30;
this.indent = '16px';
/**
* 默认不需要判断parentId是否undefined,有业务使用了空字符串作为非根目录的id,导致必须判断来区分,当业务整改后移除该判断
* @deprecated
*/
this.canIdEmpty = true;
this.nodeSelected = new EventEmitter();
this.nodeDblClicked = new EventEmitter();
this.nodeRightClicked = new EventEmitter();
this.nodeToggled = new EventEmitter();
this.afterTreeInit = new EventEmitter();
this.treeNodes = [];
this.destroy$ = new Subject();
this.afterInitAnimate = true;
}
ngOnInit() {
this.initTree();
this.i18nCommonText = this.i18n.getI18nText().common;
this.i18nSubscription = this.i18n.langChange().subscribe((data) => {
this.i18nCommonText = data.common;
});
}
ngOnChanges(changes) {
if (changes && changes.tree && !changes.tree.isFirstChange()) {
this.initTree();
}
}
initTree() {
this.treeFactory = TreeFactory.fromTree({
treeItems: this.tree,
isVirtualScroll: this.virtualScroll,
treeNodeChildrenKey: this.treeNodeChildrenKey,
treeNodeIdKey: this.treeNodeIdKey,
treeNodeTitleKey: this.treeNodeTitleKey,
checkboxDisabledKey: this.checkboxDisabledKey,
selectDisabledKey: this.selectDisabledKey,
toggleDisabledKey: this.toggleDisabledKey,
});
this.treeFactory.canIdEmpty = this.canIdEmpty;
if (this.virtualScroll) {
this.treeFactory.flattenNodes.pipe(takeUntil(this.destroy$)).subscribe((data) => {
this.treeNodes = data;
});
this.treeFactory.getFlattenNodes();
}
this.afterTreeInit.emit(this.treeFactory.nodes);
}
ngAfterViewInit() {
setTimeout(() => {
this.afterInitAnimate = false;
});
}
contextmenuEvent(event, node) {
this.nodeRightClicked.emit({ node: node, event: event });
}
selectNode(event, treeNode) {
if (treeNode.data.disableSelect) {
return;
}
if (!this.isSelectableRegion(event.target)) {
return;
}
this.nodeSelected.emit(treeNode);
this.treeFactory.activeNodeById(treeNode.id);
}
toggleNode(event, treeNode) {
if (treeNode.data.disableToggle) {
return;
}
this.treeFactory.toggleNodeById(treeNode.id);
this.nodeToggled.emit(treeNode);
}
scrollToIndex(index) {
this.viewPort.scrollToIndex(index, 'smooth');
}
appendTreeItems(treeItems, parentId) {
if (!this.treeFactory.nodes[parentId]) {
throw new Error('parent node does not exist.');
}
this.treeFactory.mapTreeItems({
treeItems: treeItems,
parentId: parentId,
treeNodeChildrenKey: this.treeNodeChildrenKey,
treeNodeIdKey: this.treeNodeIdKey,
treeNodeTitleKey: this.treeNodeTitleKey,
checkboxDisabledKey: this.checkboxDisabledKey,
selectDisabledKey: this.selectDisabledKey,
toggleDisabledKey: this.toggleDisabledKey,
});
}
nodeDblClick(event, node) {
this.nodeDblClicked.emit(node);
}
isSelectableRegion(ele) {
if (ele && !ele.classList.contains('devui-tree-node__content--value-wrapper')
&& !ele.classList.contains('devui-tree-node__content')
&& !ele.classList.contains('devui-tree-node__title')
&& !ele.classList.contains('devui-tree-node-highlight')
&& ele.tagName !== 'D-HIGHLIGHT'
&& ele.parentNode?.tagName !== 'D-HIGHLIGHT') {
return false;
}
return true;
}
ngOnDestroy() {
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
this.destroy$.next();
this.destroy$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeComponent, deps: [{ token: i1.I18nService }, { token: i2.DevConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TreeComponent, selector: "d-tree", inputs: { tree: "tree", treeNodesRef: "treeNodesRef", treeNodeIdKey: "treeNodeIdKey", treeNodeChildrenKey: "treeNodeChildrenKey", iconParentOpen: "iconParentOpen", iconParentClose: "iconParentClose", iconLeaf: "iconLeaf", loadingTemplateRef: "loadingTemplateRef", treeNodeTitleKey: "treeNodeTitleKey", checkboxDisabledKey: "checkboxDisabledKey", selectDisabledKey: "selectDisabledKey", toggleDisabledKey: "toggleDisabledKey", virtualScroll: "virtualScroll", virtualScrollHeight: "virtualScrollHeight", showAnimation: "showAnimation", minBufferPx: "minBufferPx", maxBufferPx: "maxBufferPx", itemSize: "itemSize", indent: "indent", canIdEmpty: "canIdEmpty" }, outputs: { nodeSelected: "nodeSelected", nodeDblClicked: "nodeDblClicked", nodeRightClicked: "nodeRightClicked", nodeToggled: "nodeToggled", afterTreeInit: "afterTreeInit" }, viewQueries: [{ propertyName: "viewPort", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "treeNodeContent", predicate: ["treeNodeContent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<cdk-virtual-scroll-viewport\n *ngIf=\"virtualScroll\"\n class=\"devui-scrollbar devui-scroll-overlay\"\n [itemSize]=\"itemSize\"\n [minBufferPx]=\"minBufferPx\"\n [maxBufferPx]=\"maxBufferPx\"\n [style.height]=\"virtualScrollHeight\"\n>\n <d-tree-nodes\n [virtualScroll]=\"true\"\n [treeList]=\"treeNodes\"\n [treeNodesRef]=\"treeNodesRef ? treeNodesRef : virtualScrollRef\"\n [treeFactory]=\"treeFactory\"\n >\n </d-tree-nodes>\n</cdk-virtual-scroll-viewport>\n\n<d-tree-nodes\n *ngIf=\"!virtualScroll\"\n [treeList]=\"treeFactory.treeRoot\"\n [treeNodesRef]=\"treeNodesRef ? treeNodesRef : default\"\n [treeFactory]=\"treeFactory\"\n>\n</d-tree-nodes>\n<!-- TODO: \u865A\u62DF\u6EDA\u52A8\u652F\u6301\u52A8\u6548 -->\n<ng-template #virtualScrollRef let-treeNode=\"treeNode\" let-treeFactory=\"treeFactory\">\n <div\n class=\"devui-tree-node\"\n [style.paddingLeft.px]=\"treeNode.data.depth * 24\"\n [ngClass]=\"{\n 'devui-tree-node__open': treeNode.data.isOpen,\n 'devui-tree-node__customIcon': iconParentClose\n }\"\n #treeNodeContent\n >\n <div\n class=\"devui-tree-vertical-line\"\n *ngFor=\"let item of treeNode.data.depth | transferToArrayPipe; let i = index\"\n [style.marginLeft.px]=\"i === 0 ? -16 : -16 - 24 * i\"\n [ngStyle]=\"{ height: i === 0 && treeNode.data.isLast && !treeNode.data.isOpen ? '15px' : '30px' }\"\n ></div>\n <div\n *ngIf=\"treeNode.data.depth\"\n [ngStyle]=\"{ width: treeNode.data.isParent ? '8px' : '16px' }\"\n class=\"devui-tree-horizontal-line\"\n ></div>\n <div\n class=\"devui-tree-node__content\"\n [class.active]=\"treeNode.data.isActive\"\n [class.devui-tree-node--parent]=\"(treeNode.data.children || []).length > 0\"\n (click)=\"selectNode($event, treeNode)\"\n >\n <div class=\"devui-tree-node__content--value-wrapper\" [class.isMatch]=\"treeNode.data.isMatch\">\n <span\n (click)=\"toggleNode($event, treeNode)\"\n *ngIf=\"(treeNode.data.children || []).length > 0 || treeNode.data.isParent\"\n class=\"devui-tree-node__folder\"\n [class.toggle-disabled]=\"treeNode.data.disableToggle\"\n >\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"iconParentClose && !treeNode.data.isOpen\" [innerHTML]=\"iconParentClose\"></span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"iconParentOpen && treeNode.data.isOpen\" [innerHTML]=\"iconParentOpen\"></span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"!iconParentClose && !treeNode.data.isOpen\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <path\n d=\"M8.75,4 L8.75,7.25 L12,7.25 L12,8.75 L8.749,8.75 L8.75,12 L7.25,12 L7.249,8.75 L4,8.75 L4,7.25 L7.25,7.25 L7.25,4 L8.75,4 Z\"\n ></path>\n </g>\n </svg>\n </span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"!iconParentOpen && treeNode.data.isOpen\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-close\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <rect x=\"4\" y=\"7\" width=\"8\" height=\"2\"></rect>\n </g>\n </svg>\n </span>\n </span>\n <span class=\"devui-tree-node__leaf\" *ngIf=\"(treeNode.data.children || []).length === 0 && !treeNode.data.isParent\">\n <span *ngIf=\"!iconLeaf\" class=\"devui-leaf-icon-none\" [ngStyle]=\"{ width: indent }\"></span>\n <span *ngIf=\"iconLeaf\" [innerHTML]=\"iconLeaf\"></span>\n </span>\n <span\n (dblclick)=\"nodeDblClick($event, treeNode)\"\n (contextmenu)=\"contextmenuEvent($event, treeNode)\"\n class=\"devui-tree-node__title\"\n [class.select-disabled]=\"treeNode.data.disableSelect\"\n title=\"{{ treeNode.data.title }}\"\n >{{ treeNode.data.title }}</span\n >\n <span\n dLoading\n [showLoading]=\"treeNode.data.loading\"\n [loadingTemplateRef]=\"loadingTemplateRef ? loadingTemplateRef : defaultLoadingTmpl\"\n >\n </span>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #default let-treeNode=\"treeNode\" let-treeFactory=\"treeFactory\">\n <div\n class=\"devui-tree-node devui-tree-without-virtual-scroll\"\n [ngClass]=\"{\n 'devui-tree-node__open': treeNode.data.isOpen,\n 'devui-tree-node__customIcon': iconParentClose\n }\"\n #treeNodeContent\n >\n <div\n class=\"devui-tree-node__content\"\n [class.active]=\"treeNode.data.isActive\"\n [class.devui-tree-node--parent]=\"(treeNode.data.children || []).length > 0\"\n (click)=\"selectNode($event, treeNode)\"\n >\n <div class=\"devui-tree-node__content--value-wrapper\" [class.isMatch]=\"treeNode.data.isMatch\">\n <span\n (click)=\"toggleNode($event, treeNode)\"\n *ngIf=\"(treeNode.data.children || []).length > 0 || treeNode.data.isParent\"\n class=\"devui-tree-node__folder\"\n [class.toggle-disabled]=\"treeNode.data.disableToggle\"\n >\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"iconParentClose && !treeNode.data.isOpen\" [innerHTML]=\"iconParentClose\"></span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"iconParentOpen && treeNode.data.isOpen\" [innerHTML]=\"iconParentOpen\"></span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"!iconParentClose && !treeNode.data.isOpen\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <path\n d=\"M8.75,4 L8.75,7.25 L12,7.25 L12,8.75 L8.749,8.75 L8.75,12 L7.25,12 L7.249,8.75 L4,8.75 L4,7.25 L7.25,7.25 L7.25,4 L8.75,4 Z\"\n ></path>\n </g>\n </svg>\n </span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"!iconParentOpen && treeNode.data.isOpen\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-close\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <rect x=\"4\" y=\"7\" width=\"8\" height=\"2\"></rect>\n </g>\n </svg>\n </span>\n </span>\n <span class=\"devui-tree-node__leaf\" *ngIf=\"(treeNode.data.children || []).length === 0 && !treeNode.data.isParent\">\n <span *ngIf=\"!iconLeaf\" class=\"devui-leaf-icon-none\" [ngStyle]=\"{ width: indent }\"></span>\n <span *ngIf=\"iconLeaf\" [innerHTML]=\"iconLeaf\"></span>\n </span>\n <span\n (dblclick)=\"nodeDblClick($event, treeNode)\"\n (contextmenu)=\"contextmenuEvent($event, treeNode)\"\n class=\"devui-tree-node__title\"\n [class.select-disabled]=\"treeNode.data.disableSelect\"\n title=\"{{ treeNode.data.title }}\"\n >{{ treeNode.data.title }}</span\n >\n <span\n dLoading\n [showLoading]=\"treeNode.data.loading\"\n [loadingTemplateRef]=\"loadingTemplateRef ? loadingTemplateRef : defaultLoadingTmpl\"\n >\n </span>\n </div>\n </div>\n <div\n *ngIf=\"treeNode.data.isOpen\"\n class=\"devui-tree-node__children\"\n @collapseForDomDestroy\n [@.disabled]=\"afterInitAnimate || !showAnimation\"\n >\n <d-tree-nodes [treeList]=\"treeNode.data.children || []\" [treeNodesRef]=\"default\" [treeFactory]=\"treeFactory\"> </d-tree-nodes>\n </div>\n </div>\n</ng-template>\n\n<ng-template #defaultLoadingTmpl>\n <span class=\"devui-loading-children\">{{ i18nCommonText?.loading }}</span>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}:host{display:block}.devui-text-ellipsis,.devui-tree-node .devui-tree-node__title{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.devui-tree-node{color:var(--devui-text, #191919);line-height:1.5;white-space:nowrap;position:relative}.devui-tree-node .devui-tree-node__content{display:inline-flex;align-items:center;font-size:var(--devui-font-size, 12px);padding-right:10px;width:100%;border-radius:var(--devui-border-radius, 2px);padding-left:6px}.devui-tree-node .devui-tree-node__content.active{background-color:var(--devui-list-item-selected-bg, #cedefd);text-decoration:none;border-color:transparent}.devui-tree-node .devui-tree-node__content.active .devui-tree-node__title{color:var(--devui-text, #191919);font-weight:700}.devui-tree-node .devui-tree-node__content:not(.active):hover{background-color:var(--devui-list-item-hover-bg, #f2f2f3)}.devui-tree-node .devui-tree-node__content--value-wrapper{display:inline-flex;align-items:center;height:30px;width:100%}.devui-tree-node .devui-tree-node__children{padding-left:10px}.devui-tree-node .devui-tree-node__children:first-child{border-left-color:transparent}.devui-tree-node .devui-tree-node__children .devui-tree-node{margin-left:8px;content:\"\";position:relative}.devui-tree-node .devui-tree-node__children .devui-tree-node:last-child{border-left-color:transparent}.devui-tree-node .devui-tree-node__title{margin-left:4px;display:inline-block;border:1px dashed transparent;border-radius:var(--devui-border-radius, 2px);max-width:100%}.devui-tree-node .devui-tree-node__title:not(.disabled){cursor:pointer}.devui-tree-node .devui-tree-node__edit{margin-left:.4em;padding:.1em}.devui-tree-node .devui-tree-node__edit>.devui-input-sm{height:26px}.devui-tree-node .devui-tree-node__edit>.devui-input-sm.error,.devui-tree-node .devui-tree-node__edit>.devui-input-sm.error:hover,.devui-tree-node .devui-tree-node__edit>.devui-input-sm.error:focus{border-color:var(--devui-danger, #e02128)}.devui-tree-node .devui-tree-node__leaf:not(.disabled){cursor:default}.devui-tree-node .devui-tree-node__leaf .devui-tree-node__leaf--default{color:#f2a71f}.devui-tree-node .devui-tree-node__leaf .devui-leaf-icon-none{display:inline-block;height:16px}.devui-tree-node .devui-tree-node__folder{display:inline-block;vertical-align:middle;-webkit-user-select:none;user-select:none;font-size:var(--devui-font-size-icon, 16px);height:16px;line-height:16px}.devui-tree-node .devui-tree-node__folder .devui-tree-node__folder--icon{display:inline-block;height:16px;line-height:16px}.devui-tree-node .devui-tree-node__folder .devui-tree-node__folder--icon:hover svg g path{fill:var(--devui-icon-fill-hover, #191919)}.devui-tree-node .devui-tree-node__folder .devui-tree-node__folder--icon:hover svg g rect{stroke:var(--devui-icon-fill-hover, #191919)}.devui-tree-node .devui-tree-node__folder:not(.disabled){cursor:pointer}.devui-tree-node .devui-tree-node__folder .devui-tree-node__folder--default{color:#f2b806}.devui-tree-node .devui-loading-children{display:inline-block;vertical-align:middle;margin-left:.5em;margin-top:.15em;color:var(--devui-info, #0a59f7);font-style:italic;font-size:1em;animation-name:devui-loading-children;animation-duration:2s;animation-timing-function:ease-in-out;animation-iteration-count:infinite}@keyframes devui-loading-children{0%{color:#627fe1}12.5%{color:#627fe1}25%{color:#617fe1}37.5%{color:#617ee1}50%{color:#607ee0}62.5%{color:#607ee0}75%{color:#5f7de0}87.5%{color:#5e7ce0}to{color:#5e7ce0}}.devui-tree-node svg.svg-icon path{fill:var(--devui-icon-fill, #595959)}.devui-tree-node svg.svg-icon rect{stroke:var(--devui-icon-fill, #595959)}.devui-tree-node.devui-tree-node__open:not(.devui-tree-node__customIcon)>.devui-tree-node__content svg.svg-icon path{fill:var(--devui-icon-fill-active, #191919)}.devui-tree-node.devui-tree-node__open:not(.devui-tree-node__customIcon)>.devui-tree-node__content svg.svg-icon rect{stroke:var(--devui-icon-fill-active, #191919)}.devui-tree-node.devui-tree-node__open:not(.devui-tree-node__customIcon)>.devui-tree-node__content svg.svg-icon.svg-icon-close rect:last-child{stroke:none;fill:var(--devui-icon-fill-active, #191919)}.devui-tree-node svg.svg-icon.svg-icon-close rect:last-child{stroke:none;fill:var(--devui-icon-text, #808080)}::ng-deep .devui-tree-mask{background:var(--devui-list-item-hover-bg, #f2f2f3)}.devui-tree-node.devui-tree-without-virtual-scroll.devui-tree-node__open>.devui-tree-node__content{position:relative}.devui-tree-node.devui-tree-without-virtual-scroll>.devui-tree-node__children{position:relative}.devui-tree-node.devui-tree-without-virtual-scroll>.devui-tree-node__children:before{content:\"\";width:1px;height:calc(100% - 15px);background-color:var(--devui-dividing-line, #f0f0f0);position:absolute;left:9px;top:0}.devui-tree-node.devui-tree-without-virtual-scroll>.devui-tree-node__children .devui-tree-node__content{position:relative}.devui-tree-node.devui-tree-without-virtual-scroll>.devui-tree-node__children .devui-tree-node__content:before{content:\"\";width:8px;height:1px;background-color:var(--devui-dividing-line, #f0f0f0);position:absolute;left:-9px;top:50%}.devui-tree-vertical-line{width:1px;background-color:var(--devui-dividing-line, #f0f0f0);position:absolute}.devui-tree-horizontal-line{height:1px;background-color:var(--devui-dividing-line, #f0f0f0);position:absolute;top:50%;margin-left:-16px}.toggle-disabled{cursor:not-allowed!important}.toggle-disabled svg.svg-icon rect{stroke:var(--devui-disabled-text, #c2c2c2)!important}.toggle-disabled svg.svg-icon.svg-icon-close rect:last-child{stroke:none!important;fill:var(--devui-disabled-text, #c2c2c2)!important}.toggle-disabled svg.svg-icon path{fill:var(--devui-disabled-text, #c2c2c2)!important}.select-disabled{color:var(--devui-disabled-text, #c2c2c2)!important;cursor:not-allowed!important;background-color:transparent!important}.devui-tree-node__content{transition:color var(--devui-animation-duration-fast, .1s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1)),background-color var(--devui-animation-duration-fast, .1s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1))}::ng-deep d-tree .cdk-virtual-scroll-content-wrapper{width:100%}\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.LoadingDirective, selector: "[dLoading]", inputs: ["backdrop", "message", "positionType", "showLoading", "view", "zIndex", "loading", "loadingStyle", "loadingTemplateRef"], exportAs: ["dLoading"] }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i6.TreeNodesComponent, selector: "d-tree-nodes", inputs: ["treeList", "treeNodesRef", "treeFactory", "virtualScroll"] }, { kind: "pipe", type: i7.TransferToArrayPipe, name: "transferToArrayPipe" }], animations: [expandCollapseForDomDestroy] }); }
}
__decorate([
WithConfig(),
__metadata("design:type", Object)
], TreeComponent.prototype, "showAnimation", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeComponent, decorators: [{
type: Component,
args: [{ selector: 'd-tree', preserveWhitespaces: false, animations: [expandCollapseForDomDestroy], template: "<cdk-virtual-scroll-viewport\n *ngIf=\"virtualScroll\"\n class=\"devui-scrollbar devui-scroll-overlay\"\n [itemSize]=\"itemSize\"\n [minBufferPx]=\"minBufferPx\"\n [maxBufferPx]=\"maxBufferPx\"\n [style.height]=\"virtualScrollHeight\"\n>\n <d-tree-nodes\n [virtualScroll]=\"true\"\n [treeList]=\"treeNodes\"\n [treeNodesRef]=\"treeNodesRef ? treeNodesRef : virtualScrollRef\"\n [treeFactory]=\"treeFactory\"\n >\n </d-tree-nodes>\n</cdk-virtual-scroll-viewport>\n\n<d-tree-nodes\n *ngIf=\"!virtualScroll\"\n [treeList]=\"treeFactory.treeRoot\"\n [treeNodesRef]=\"treeNodesRef ? treeNodesRef : default\"\n [treeFactory]=\"treeFactory\"\n>\n</d-tree-nodes>\n<!-- TODO: \u865A\u62DF\u6EDA\u52A8\u652F\u6301\u52A8\u6548 -->\n<ng-template #virtualScrollRef let-treeNode=\"treeNode\" let-treeFactory=\"treeFactory\">\n <div\n class=\"devui-tree-node\"\n [style.paddingLeft.px]=\"treeNode.data.depth * 24\"\n [ngClass]=\"{\n 'devui-tree-node__open': treeNode.data.isOpen,\n 'devui-tree-node__customIcon': iconParentClose\n }\"\n #treeNodeContent\n >\n <div\n class=\"devui-tree-vertical-line\"\n *ngFor=\"let item of treeNode.data.depth | transferToArrayPipe; let i = index\"\n [style.marginLeft.px]=\"i === 0 ? -16 : -16 - 24 * i\"\n [ngStyle]=\"{ height: i === 0 && treeNode.data.isLast && !treeNode.data.isOpen ? '15px' : '30px' }\"\n ></div>\n <div\n *ngIf=\"treeNode.data.depth\"\n [ngStyle]=\"{ width: treeNode.data.isParent ? '8px' : '16px' }\"\n class=\"devui-tree-horizontal-line\"\n ></div>\n <div\n class=\"devui-tree-node__content\"\n [class.active]=\"treeNode.data.isActive\"\n [class.devui-tree-node--parent]=\"(treeNode.data.children || []).length > 0\"\n (click)=\"selectNode($event, treeNode)\"\n >\n <div class=\"devui-tree-node__content--value-wrapper\" [class.isMatch]=\"treeNode.data.isMatch\">\n <span\n (click)=\"toggleNode($event, treeNode)\"\n *ngIf=\"(treeNode.data.children || []).length > 0 || treeNode.data.isParent\"\n class=\"devui-tree-node__folder\"\n [class.toggle-disabled]=\"treeNode.data.disableToggle\"\n >\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"iconParentClose && !treeNode.data.isOpen\" [innerHTML]=\"iconParentClose\"></span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"iconParentOpen && treeNode.data.isOpen\" [innerHTML]=\"iconParentOpen\"></span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"!iconParentClose && !treeNode.data.isOpen\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <path\n d=\"M8.75,4 L8.75,7.25 L12,7.25 L12,8.75 L8.749,8.75 L8.75,12 L7.25,12 L7.249,8.75 L4,8.75 L4,7.25 L7.25,7.25 L7.25,4 L8.75,4 Z\"\n ></path>\n </g>\n </svg>\n </span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"!iconParentOpen && treeNode.data.isOpen\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-close\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <rect x=\"4\" y=\"7\" width=\"8\" height=\"2\"></rect>\n </g>\n </svg>\n </span>\n </span>\n <span class=\"devui-tree-node__leaf\" *ngIf=\"(treeNode.data.children || []).length === 0 && !treeNode.data.isParent\">\n <span *ngIf=\"!iconLeaf\" class=\"devui-leaf-icon-none\" [ngStyle]=\"{ width: indent }\"></span>\n <span *ngIf=\"iconLeaf\" [innerHTML]=\"iconLeaf\"></span>\n </span>\n <span\n (dblclick)=\"nodeDblClick($event, treeNode)\"\n (contextmenu)=\"contextmenuEvent($event, treeNode)\"\n class=\"devui-tree-node__title\"\n [class.select-disabled]=\"treeNode.data.disableSelect\"\n title=\"{{ treeNode.data.title }}\"\n >{{ treeNode.data.title }}</span\n >\n <span\n dLoading\n [showLoading]=\"treeNode.data.loading\"\n [loadingTemplateRef]=\"loadingTemplateRef ? loadingTemplateRef : defaultLoadingTmpl\"\n >\n </span>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #default let-treeNode=\"treeNode\" let-treeFactory=\"treeFactory\">\n <div\n class=\"devui-tree-node devui-tree-without-virtual-scroll\"\n [ngClass]=\"{\n 'devui-tree-node__open': treeNode.data.isOpen,\n 'devui-tree-node__customIcon': iconParentClose\n }\"\n #treeNodeContent\n >\n <div\n class=\"devui-tree-node__content\"\n [class.active]=\"treeNode.data.isActive\"\n [class.devui-tree-node--parent]=\"(treeNode.data.children || []).length > 0\"\n (click)=\"selectNode($event, treeNode)\"\n >\n <div class=\"devui-tree-node__content--value-wrapper\" [class.isMatch]=\"treeNode.data.isMatch\">\n <span\n (click)=\"toggleNode($event, treeNode)\"\n *ngIf=\"(treeNode.data.children || []).length > 0 || treeNode.data.isParent\"\n class=\"devui-tree-node__folder\"\n [class.toggle-disabled]=\"treeNode.data.disableToggle\"\n >\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"iconParentClose && !treeNode.data.isOpen\" [innerHTML]=\"iconParentClose\"></span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"iconParentOpen && treeNode.data.isOpen\" [innerHTML]=\"iconParentOpen\"></span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"!iconParentClose && !treeNode.data.isOpen\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <path\n d=\"M8.75,4 L8.75,7.25 L12,7.25 L12,8.75 L8.749,8.75 L8.75,12 L7.25,12 L7.249,8.75 L4,8.75 L4,7.25 L7.25,7.25 L7.25,4 L8.75,4 Z\"\n ></path>\n </g>\n </svg>\n </span>\n <span class=\"devui-tree-node__folder--icon\" *ngIf=\"!iconParentOpen && treeNode.data.isOpen\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-close\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <rect x=\"4\" y=\"7\" width=\"8\" height=\"2\"></rect>\n </g>\n </svg>\n </span>\n </span>\n <span class=\"devui-tree-node__leaf\" *ngIf=\"(treeNode.data.children || []).length === 0 && !treeNode.data.isParent\">\n <span *ngIf=\"!iconLeaf\" class=\"devui-leaf-icon-none\" [ngStyle]=\"{ width: indent }\"></span>\n <span *ngIf=\"iconLeaf\" [innerHTML]=\"iconLeaf\"></span>\n </span>\n <span\n (dblclick)=\"nodeDblClick($event, treeNode)\"\n (contextmenu)=\"contextmenuEvent($event, treeNode)\"\n class=\"devui-tree-node__title\"\n [class.select-disabled]=\"treeNode.data.disableSelect\"\n title=\"{{ treeNode.data.title }}\"\n >{{ treeNode.data.title }}</span\n >\n <span\n dLoading\n [showLoading]=\"treeNode.data.loading\"\n [loadingTemplateRef]=\"loadingTemplateRef ? loadingTemplateRef : defaultLoadingTmpl\"\n >\n </span>\n </div>\n </div>\n <div\n *ngIf=\"treeNode.data.isOpen\"\n class=\"devui-tree-node__children\"\n @collapseForDomDestroy\n [@.disabled]=\"afterInitAnimate || !showAnimation\"\n >\n <d-tree-nodes [treeList]=\"treeNode.data.children || []\" [treeNodesRef]=\"default\" [treeFactory]=\"treeFactory\"> </d-tree-nodes>\n </div>\n </div>\n</ng-template>\n\n<ng-template #defaultLoadingTmpl>\n <span class=\"devui-loading-children\">{{ i18nCommonText?.loading }}</span>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}:host{display:block}.devui-text-ellipsis,.devui-tree-node .devui-tree-node__title{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.devui-tree-node{color:var(--devui-text, #191919);line-height:1.5;white-space:nowrap;position:relative}.devui-tree-node .devui-tree-node__content{display:inline-flex;align-items:center;font-size:var(--devui-font-size, 12px);padding-right:10px;width:100%;border-radius:var(--devui-border-radius, 2px);padding-left:6px}.devui-tree-node .devui-tree-node__content.active{background-color:var(--devui-list-item-selected-bg, #cedefd);text-decoration:none;border-color:transparent}.devui-tree-node .devui-tree-node__content.active .devui-tree-node__title{color:var(--devui-text, #191919);font-weight:700}.devui-tree-node .devui-tree-node__content:not(.active):hover{background-color:var(--devui-list-item-hover-bg, #f2f2f3)}.devui-tree-node .devui-tree-node__content--value-wrapper{display:inline-flex;align-items:center;height:30px;width:100%}.devui-tree-node .devui-tree-node__children{padding-left:10px}.devui-tree-node .devui-tree-node__children:first-child{border-left-color:transparent}.devui-tree-node .devui-tree-node__children .devui-tree-node{margin-left:8px;content:\"\";position:relative}.devui-tree-node .devui-tree-node__children .devui-tree-node:last-child{border-left-color:transparent}.devui-tree-node .devui-tree-node__title{margin-left:4px;display:inline-block;border:1px dashed transparent;border-radius:var(--devui-border-radius, 2px);max-width:100%}.devui-tree-node .devui-tree-node__title:not(.disabled){cursor:pointer}.devui-tree-node .devui-tree-node__edit{margin-left:.4em;padding:.1em}.devui-tree-node .devui-tree-node__edit>.devui-input-sm{height:26px}.devui-tree-node .devui-tree-node__edit>.devui-input-sm.error,.devui-tree-node .devui-tree-node__edit>.devui-input-sm.error:hover,.devui-tree-node .devui-tree-node__edit>.devui-input-sm.error:focus{border-color:var(--devui-danger, #e02128)}.devui-tree-node .devui-tree-node__leaf:not(.disabled){cursor:default}.devui-tree-node .devui-tree-node__leaf .devui-tree-node__leaf--default{color:#f2a71f}.devui-tree-node .devui-tree-node__leaf .devui-leaf-icon-none{display:inline-block;height:16px}.devui-tree-node .devui-tree-node__folder{display:inline-block;vertical-align:middle;-webkit-user-select:none;user-select:none;font-size:var(--devui-font-size-icon, 16px);height:16px;line-height:16px}.devui-tree-node .devui-tree-node__folder .devui-tree-node__folder--icon{display:inline-block;height:16px;line-height:16px}.devui-tree-node .devui-tree-node__folder .devui-tree-node__folder--icon:hover svg g path{fill:var(--devui-icon-fill-hover, #191919)}.devui-tree-node .devui-tree-node__folder .devui-tree-node__folder--icon:hover svg g rect{stroke:var(--devui-icon-fill-hover, #191919)}.devui-tree-node .devui-tree-node__folder:not(.disabled){cursor:pointer}.devui-tree-node .devui-tree-node__folder .devui-tree-node__folder--default{color:#f2b806}.devui-tree-node .devui-loading-children{display:inline-block;vertical-align:middle;margin-left:.5em;margin-top:.15em;color:var(--devui-info, #0a59f7);font-style:italic;font-size:1em;animation-name:devui-loading-children;animation-duration:2s;animation-timing-function:ease-in-out;animation-iteration-count:infinite}@keyframes devui-loading-children{0%{color:#627fe1}12.5%{color:#627fe1}25%{color:#617fe1}37.5%{color:#617ee1}50%{color:#607ee0}62.5%{color:#607ee0}75%{color:#5f7de0}87.5%{color:#5e7ce0}to{color:#5e7ce0}}.devui-tree-node svg.svg-icon path{fill:var(--devui-icon-fill, #595959)}.devui-tree-node svg.svg-icon rect{stroke:var(--devui-icon-fill, #595959)}.devui-tree-node.devui-tree-node__open:not(.devui-tree-node__customIcon)>.devui-tree-node__content svg.svg-icon path{fill:var(--devui-icon-fill-active, #191919)}.devui-tree-node.devui-tree-node__open:not(.devui-tree-node__customIcon)>.devui-tree-node__content svg.svg-icon rect{stroke:var(--devui-icon-fill-active, #191919)}.devui-tree-node.devui-tree-node__open:not(.devui-tree-node__customIcon)>.devui-tree-node__content svg.svg-icon.svg-icon-close rect:last-child{stroke:none;fill:var(--devui-icon-fill-active, #191919)}.devui-tree-node svg.svg-icon.svg-icon-close rect:last-child{stroke:none;fill:var(--devui-icon-text, #808080)}::ng-deep .devui-tree-mask{background:var(--devui-list-item-hover-bg, #f2f2f3)}.devui-tree-node.devui-tree-without-virtual-scroll.devui-tree-node__open>.devui-tree-node__content{position:relative}.devui-tree-node.devui-tree-without-virtual-scroll>.devui-tree-node__children{position:relative}.devui-tree-node.devui-tree-without-virtual-scroll>.devui-tree-node__children:before{content:\"\";width:1px;height:calc(100% - 15px);background-color:var(--devui-dividing-line, #f0f0f0);position:absolute;left:9px;top:0}.devui-tree-node.devui-tree-without-virtual-scroll>.devui-tree-node__children .devui-tree-node__content{position:relative}.devui-tree-node.devui-tree-without-virtual-scroll>.devui-tree-node__children .devui-tree-node__content:before{content:\"\";width:8px;height:1px;background-color:var(--devui-dividing-line, #f0f0f0);position:absolute;left:-9px;top:50%}.devui-tree-vertical-line{width:1px;background-color:var(--devui-dividing-line, #f0f0f0);position:absolute}.devui-tree-horizontal-line{height:1px;background-color:var(--devui-dividing-line, #f0f0f0);position:absolute;top:50%;margin-left:-16px}.toggle-disabled{cursor:not-allowed!important}.toggle-disabled svg.svg-icon rect{stroke:var(--devui-disabled-text, #c2c2c2)!important}.toggle-disabled svg.svg-icon.svg-icon-close rect:last-child{stroke:none!important;fill:var(--devui-disabled-text, #c2c2c2)!important}.toggle-disabled svg.svg-icon path{fill:var(--devui-disabled-text, #c2c2c2)!important}.select-disabled{color:var(--devui-disabled-text, #c2c2c2)!important;cursor:not-allowed!important;background-color:transparent!important}.devui-tree-node__content{transition:color var(--devui-animation-duration-fast, .1s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1)),background-color var(--devui-animation-duration-fast, .1s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1))}::ng-deep d-tree .cdk-virtual-scroll-content-wrapper{width:100%}\n"] }]
}], ctorParameters: () => [{ type: i1.I18nService }, { type: i2.DevConfigService }], propDecorators: { tree: [{
type: Input
}], treeNodesRef: [{
type: Input
}], treeNodeIdKey: [{
type: Input
}], treeNodeChildrenKey: [{
type: Input
}], iconParentOpen: [{
type: Input
}], iconParentClose: [{
type: Input
}], iconLeaf: [{
type: Input
}], loadingTemplateRef: [{
type: Input
}], treeNodeTitleKey: [{
type: Input
}], checkboxDisabledKey: [{
type: Input
}], selectDisabledKey: [{
type: Input
}], toggleDisabledKey: [{
type: Input
}], virtualScroll: [{
type: Input
}], virtualScrollHeight: [{
type: Input
}], showAnimation: [{
type: Input
}], minBufferPx: [{
type: Input
}], maxBufferPx: [{
type: Input
}], itemSize: [{
type: Input
}], indent: [{
type: Input
}], canIdEmpty: [{
type: Input
}], nodeSelected: [{
type: Output
}], nodeDblClicked: [{
type: Output
}], nodeRightClicked: [{
type: Output
}], nodeToggled: [{
type: Output
}], afterTreeInit: [{
type: Output
}], treeNodeContent: [{
type: ViewChildren,
args: ['treeNodeContent']
}], viewPort: [{
type: ViewChild,
args: [CdkVirtualScrollViewport]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS90cmVlL3RyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvdHJlZS90cmVlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWlCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsMkJBQTJCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0YsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBeUIsV0FBVyxFQUFZLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7OztBQVFwRixNQUFNLE9BQU8sYUFBYTtJQXVDeEIsWUFBb0IsSUFBaUIsRUFBVSxnQkFBa0M7UUFBN0QsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUE3QnhFLHFCQUFnQixHQUFHLE9BQU8sQ0FBQztRQUMzQix3QkFBbUIsR0FBRyxVQUFVLENBQUM7UUFDakMsc0JBQWlCLEdBQUcsVUFBVSxDQUFDO1FBQy9CLHNCQUFpQixHQUFHLGVBQWUsQ0FBQztRQUNwQyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0Qix3QkFBbUIsR0FBRyxPQUFPLENBQUM7UUFDaEIsa0JBQWEsR0FBRyxJQUFJLENBQUM7UUFDbkMsZ0JBQVcsR0FBRyxHQUFH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