UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

612 lines (605 loc) 69.4 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { __decorate, __metadata } from "tslib"; import { FocusMonitor } from '@angular/cdk/a11y'; import { Directionality } from '@angular/cdk/bidi'; import { BACKSPACE, ESCAPE, TAB } from '@angular/cdk/keycodes'; import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay'; import { ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, forwardRef, Host, Injector, Input, Optional, Output, Renderer2, Self, TemplateRef, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { slideMotion } from 'ng-zorro-antd/core/animation'; import { NzConfigService, WithConfig } from 'ng-zorro-antd/core/config'; import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation'; import { reqAnimFrame } from 'ng-zorro-antd/core/polyfill'; import { NzTreeBase, NzTreeHigherOrderServiceToken } from 'ng-zorro-antd/core/tree'; import { InputBoolean, isNotNil } from 'ng-zorro-antd/core/util'; import { NzSelectSearchComponent } from 'ng-zorro-antd/select'; import { NzTreeComponent } from 'ng-zorro-antd/tree'; import { merge, of as observableOf, Subject } from 'rxjs'; import { filter, takeUntil, tap } from 'rxjs/operators'; import { NzTreeSelectService } from './tree-select.service'; export function higherOrderServiceFactory(injector) { return injector.get(NzTreeSelectService); } const NZ_CONFIG_MODULE_NAME = 'treeSelect'; const TREE_SELECT_DEFAULT_CLASS = 'ant-select-dropdown ant-select-tree-dropdown'; export class NzTreeSelectComponent extends NzTreeBase { constructor(nzTreeService, nzConfigService, renderer, cdr, elementRef, directionality, focusMonitor, noAnimation) { super(nzTreeService); this.nzConfigService = nzConfigService; this.renderer = renderer; this.cdr = cdr; this.elementRef = elementRef; this.directionality = directionality; this.focusMonitor = focusMonitor; this.noAnimation = noAnimation; this._nzModuleName = NZ_CONFIG_MODULE_NAME; this.nzId = null; this.nzAllowClear = true; this.nzShowExpand = true; this.nzShowLine = false; this.nzDropdownMatchSelectWidth = true; this.nzCheckable = false; this.nzHideUnMatched = false; this.nzShowIcon = false; this.nzShowSearch = false; this.nzDisabled = false; this.nzAsyncData = false; this.nzMultiple = false; this.nzDefaultExpandAll = false; this.nzCheckStrictly = false; this.nzVirtualItemSize = 28; this.nzVirtualMaxBufferPx = 500; this.nzVirtualMinBufferPx = 28; this.nzVirtualHeight = null; this.nzNodes = []; this.nzOpen = false; this.nzSize = 'default'; this.nzPlaceHolder = ''; this.nzDropdownStyle = null; this.nzBackdrop = false; this.nzDisplayWith = (node) => node.title; this.nzMaxTagPlaceholder = null; this.nzOpenChange = new EventEmitter(); this.nzCleared = new EventEmitter(); this.nzRemoved = new EventEmitter(); this.nzExpandChange = new EventEmitter(); this.nzTreeClick = new EventEmitter(); this.nzTreeCheckBoxChange = new EventEmitter(); this.dropdownClassName = TREE_SELECT_DEFAULT_CLASS; this.isComposing = false; this.isDestroy = true; this.isNotFound = false; this.focused = false; this.inputValue = ''; this.dropDownPosition = 'bottom'; this.selectedNodes = []; this.expandedKeys = []; this.value = []; this.dir = 'ltr'; this.destroy$ = new Subject(); this.onChange = _value => { }; this.onTouched = () => { }; // TODO: move to host after View Engine deprecation this.elementRef.nativeElement.classList.add('ant-select'); this.renderer.addClass(this.elementRef.nativeElement, 'ant-select'); this.renderer.addClass(this.elementRef.nativeElement, 'ant-tree-select'); } set nzExpandedKeys(value) { this.expandedKeys = value; } get nzExpandedKeys() { return this.expandedKeys; } get treeTemplate() { return this.nzTreeTemplate || this.nzTreeTemplateChild; } get placeHolderDisplay() { return this.inputValue || this.isComposing || this.selectedNodes.length ? 'none' : 'block'; } get isMultiple() { return this.nzMultiple || this.nzCheckable; } ngOnInit() { var _a; this.isDestroy = false; this.subscribeSelectionChange(); (_a = this.directionality.change) === null || _a === void 0 ? void 0 : _a.pipe(takeUntil(this.destroy$)).subscribe((direction) => { this.dir = direction; this.cdr.detectChanges(); }); this.dir = this.directionality.value; this.focusMonitor .monitor(this.elementRef, true) .pipe(takeUntil(this.destroy$)) .subscribe(focusOrigin => { if (!focusOrigin) { this.focused = false; this.cdr.markForCheck(); Promise.resolve().then(() => { this.onTouched(); }); } else { this.focused = true; this.cdr.markForCheck(); } }); } ngOnDestroy() { this.isDestroy = true; this.closeDropDown(); this.destroy$.next(); this.destroy$.complete(); } isComposingChange(isComposing) { this.isComposing = isComposing; } setDisabledState(isDisabled) { this.nzDisabled = isDisabled; this.closeDropDown(); } ngOnChanges(changes) { const { nzNodes, nzDropdownClassName } = changes; if (nzNodes) { this.updateSelectedNodes(true); } if (nzDropdownClassName) { const className = this.nzDropdownClassName && this.nzDropdownClassName.trim(); this.dropdownClassName = className ? `${TREE_SELECT_DEFAULT_CLASS} ${className}` : TREE_SELECT_DEFAULT_CLASS; } } writeValue(value) { if (isNotNil(value)) { if (this.isMultiple && Array.isArray(value)) { this.value = value; } else { this.value = [value]; } this.updateSelectedNodes(true); } else { this.value = []; this.selectedNodes.forEach(node => { this.removeSelected(node, false); }); this.selectedNodes = []; } this.cdr.markForCheck(); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } onKeydown(event) { if (this.nzDisabled) { return; } switch (event.keyCode) { case ESCAPE: /** * Skip the ESCAPE processing, it will be handled in {@link onOverlayKeyDown}. */ break; case TAB: this.closeDropDown(); break; default: if (!this.nzOpen) { this.openDropdown(); } } } trigger() { if (this.nzDisabled || (!this.nzDisabled && this.nzOpen)) { this.closeDropDown(); } else { this.openDropdown(); } } openDropdown() { if (!this.nzDisabled) { this.nzOpen = true; this.nzOpenChange.emit(this.nzOpen); this.updateCdkConnectedOverlayStatus(); if (this.nzShowSearch || this.isMultiple) { this.focusOnInput(); } } } closeDropDown() { this.onTouched(); this.nzOpen = false; this.inputValue = ''; this.isNotFound = false; this.nzOpenChange.emit(this.nzOpen); this.cdr.markForCheck(); } onKeyDownInput(e) { const keyCode = e.keyCode; const eventTarget = e.target; if (this.isMultiple && !eventTarget.value && keyCode === BACKSPACE) { e.preventDefault(); if (this.selectedNodes.length) { const removeNode = this.selectedNodes[this.selectedNodes.length - 1]; this.removeSelected(removeNode); } } } onExpandedKeysChange(value) { this.nzExpandChange.emit(value); this.expandedKeys = [...value.keys]; } setInputValue(value) { this.inputValue = value; this.updatePosition(); } removeSelected(node, emit = true) { node.isSelected = false; node.isChecked = false; if (this.nzCheckable) { this.nzTreeService.conduct(node, this.nzCheckStrictly); } else { this.nzTreeService.setSelectedNodeList(node, this.nzMultiple); } if (emit) { this.nzRemoved.emit(node); } } focusOnInput() { if (this.nzSelectSearchComponent) { this.nzSelectSearchComponent.focus(); } } subscribeSelectionChange() { merge(this.nzTreeClick.pipe(tap((event) => { const node = event.node; if (this.nzCheckable && !node.isDisabled && !node.isDisableCheckbox) { node.isChecked = !node.isChecked; node.isHalfChecked = false; if (!this.nzCheckStrictly) { this.nzTreeService.conduct(node); } } if (this.nzCheckable) { node.isSelected = false; } }), filter((event) => { const node = event.node; return this.nzCheckable ? !node.isDisabled && !node.isDisableCheckbox : !node.isDisabled && node.isSelectable; })), this.nzCheckable ? this.nzTreeCheckBoxChange : observableOf(), this.nzCleared, this.nzRemoved) .pipe(takeUntil(this.destroy$)) .subscribe(() => { this.updateSelectedNodes(); const value = this.selectedNodes.map(node => node.key); this.value = [...value]; if (this.nzShowSearch || this.isMultiple) { this.inputValue = ''; this.isNotFound = false; } if (this.isMultiple) { this.onChange(value); this.focusOnInput(); this.updatePosition(); } else { this.closeDropDown(); this.onChange(value.length ? value[0] : null); } }); } updateSelectedNodes(init = false) { if (init) { const nodes = this.coerceTreeNodes(this.nzNodes); this.nzTreeService.isMultiple = this.isMultiple; this.nzTreeService.isCheckStrictly = this.nzCheckStrictly; this.nzTreeService.initTree(nodes); if (this.nzCheckable) { this.nzTreeService.conductCheck(this.value, this.nzCheckStrictly); } else { this.nzTreeService.conductSelectedKeys(this.value, this.isMultiple); } } this.selectedNodes = [...(this.nzCheckable ? this.getCheckedNodeList() : this.getSelectedNodeList())]; } updatePosition() { reqAnimFrame(() => { var _a, _b; (_b = (_a = this.cdkConnectedOverlay) === null || _a === void 0 ? void 0 : _a.overlayRef) === null || _b === void 0 ? void 0 : _b.updatePosition(); }); } onPositionChange(position) { this.dropDownPosition = position.connectionPair.originY; } onClearSelection() { this.selectedNodes.forEach(node => { this.removeSelected(node, false); }); this.nzCleared.emit(); } onClickOutside(event) { if (!this.elementRef.nativeElement.contains(event.target)) { this.closeDropDown(); } } setSearchValues($event) { Promise.resolve().then(() => { this.isNotFound = (this.nzShowSearch || this.isMultiple) && !!this.inputValue && $event.matchedKeys.length === 0; }); } updateCdkConnectedOverlayStatus() { this.triggerWidth = this.cdkOverlayOrigin.elementRef.nativeElement.getBoundingClientRect().width; } trackValue(_index, option) { return option.key; } } NzTreeSelectComponent.decorators = [ { type: Component, args: [{ selector: 'nz-tree-select', exportAs: 'nzTreeSelect', animations: [slideMotion], template: ` <ng-template cdkConnectedOverlay nzConnectedOverlay [cdkConnectedOverlayHasBackdrop]="nzBackdrop" [cdkConnectedOverlayOrigin]="cdkOverlayOrigin" [cdkConnectedOverlayOpen]="nzOpen" [cdkConnectedOverlayTransformOriginOn]="'.ant-select-tree-dropdown'" [cdkConnectedOverlayMinWidth]="$any(nzDropdownMatchSelectWidth ? null : triggerWidth)" [cdkConnectedOverlayWidth]="$any(nzDropdownMatchSelectWidth ? triggerWidth : null)" (overlayOutsideClick)="onClickOutside($event)" (detach)="closeDropDown()" (positionChange)="onPositionChange($event)" > <div [@slideMotion]="'enter'" [ngClass]="dropdownClassName" [@.disabled]="noAnimation?.nzNoAnimation" [nzNoAnimation]="noAnimation?.nzNoAnimation" [class.ant-select-dropdown-placement-bottomLeft]="dropDownPosition === 'bottom'" [class.ant-select-dropdown-placement-topLeft]="dropDownPosition === 'top'" [class.ant-tree-select-dropdown-rtl]="dir === 'rtl'" [dir]="dir" [ngStyle]="nzDropdownStyle" > <nz-tree #treeRef [hidden]="isNotFound" nzNoAnimation nzSelectMode nzBlockNode [nzData]="nzNodes" [nzMultiple]="nzMultiple" [nzSearchValue]="inputValue" [nzHideUnMatched]="nzHideUnMatched" [nzShowIcon]="nzShowIcon" [nzCheckable]="nzCheckable" [nzAsyncData]="nzAsyncData" [nzShowExpand]="nzShowExpand" [nzShowLine]="nzShowLine" [nzExpandedIcon]="nzExpandedIcon" [nzExpandAll]="nzDefaultExpandAll" [nzExpandedKeys]="expandedKeys" [nzCheckedKeys]="nzCheckable ? value : []" [nzSelectedKeys]="!nzCheckable ? value : []" [nzTreeTemplate]="treeTemplate" [nzCheckStrictly]="nzCheckStrictly" [nzVirtualItemSize]="nzVirtualItemSize" [nzVirtualMaxBufferPx]="nzVirtualMaxBufferPx" [nzVirtualMinBufferPx]="nzVirtualMinBufferPx" [nzVirtualHeight]="nzVirtualHeight" (nzExpandChange)="onExpandedKeysChange($event)" (nzClick)="nzTreeClick.emit($event)" (nzCheckedKeysChange)="updateSelectedNodes()" (nzSelectedKeysChange)="updateSelectedNodes()" (nzCheckBoxChange)="nzTreeCheckBoxChange.emit($event)" (nzSearchValueChange)="setSearchValues($event)" ></nz-tree> <span *ngIf="nzNodes.length === 0 || isNotFound" class="ant-select-not-found"> <nz-embed-empty [nzComponentName]="'tree-select'" [specificContent]="nzNotFoundContent"></nz-embed-empty> </span> </div> </ng-template> <div cdkOverlayOrigin class="ant-select-selector"> <ng-container *ngIf="isMultiple"> <nz-select-item *ngFor="let node of selectedNodes | slice: 0:nzMaxTagCount; trackBy: trackValue" [deletable]="true" [disabled]="node.isDisabled || nzDisabled" [label]="nzDisplayWith(node)" (delete)="removeSelected(node, true)" ></nz-select-item> <nz-select-item *ngIf="selectedNodes.length > nzMaxTagCount" [contentTemplateOutlet]="nzMaxTagPlaceholder" [contentTemplateOutletContext]="selectedNodes | slice: nzMaxTagCount" [deletable]="false" [disabled]="false" [label]="'+ ' + (selectedNodes.length - nzMaxTagCount) + ' ...'" ></nz-select-item> </ng-container> <nz-select-search [nzId]="nzId" [showInput]="nzShowSearch" (keydown)="onKeyDownInput($event)" (isComposingChange)="isComposing = $event" (valueChange)="setInputValue($event)" [value]="inputValue" [mirrorSync]="isMultiple" [disabled]="nzDisabled" [focusTrigger]="nzOpen" ></nz-select-search> <nz-select-placeholder *ngIf="nzPlaceHolder && selectedNodes.length === 0" [placeholder]="nzPlaceHolder" [style.display]="placeHolderDisplay" ></nz-select-placeholder> <nz-select-item *ngIf="!isMultiple && selectedNodes.length === 1 && !isComposing && inputValue === ''" [deletable]="false" [disabled]="false" [label]="nzDisplayWith(selectedNodes[0])" ></nz-select-item> <nz-select-arrow *ngIf="!isMultiple"></nz-select-arrow> <nz-select-clear *ngIf="nzAllowClear && !nzDisabled && selectedNodes.length" (clear)="onClearSelection()"></nz-select-clear> </div> `, providers: [ NzTreeSelectService, { provide: NzTreeHigherOrderServiceToken, useFactory: higherOrderServiceFactory, deps: [[new Self(), Injector]] }, { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NzTreeSelectComponent), multi: true } ], host: { '[class.ant-select-lg]': 'nzSize==="large"', '[class.ant-select-rtl]': 'dir==="rtl"', '[class.ant-select-sm]': 'nzSize==="small"', '[class.ant-select-disabled]': 'nzDisabled', '[class.ant-select-single]': '!isMultiple', '[class.ant-select-show-arrow]': '!isMultiple', '[class.ant-select-show-search]': '!isMultiple', '[class.ant-select-multiple]': 'isMultiple', '[class.ant-select-allow-clear]': 'nzAllowClear', '[class.ant-select-open]': 'nzOpen', '[class.ant-select-focused]': 'nzOpen || focused', '(click)': 'trigger()', '(keydown)': 'onKeydown($event)' } },] } ]; NzTreeSelectComponent.ctorParameters = () => [ { type: NzTreeSelectService }, { type: NzConfigService }, { type: Renderer2 }, { type: ChangeDetectorRef }, { type: ElementRef }, { type: Directionality, decorators: [{ type: Optional }] }, { type: FocusMonitor }, { type: NzNoAnimationDirective, decorators: [{ type: Host }, { type: Optional }] } ]; NzTreeSelectComponent.propDecorators = { nzId: [{ type: Input }], nzAllowClear: [{ type: Input }], nzShowExpand: [{ type: Input }], nzShowLine: [{ type: Input }], nzDropdownMatchSelectWidth: [{ type: Input }], nzCheckable: [{ type: Input }], nzHideUnMatched: [{ type: Input }], nzShowIcon: [{ type: Input }], nzShowSearch: [{ type: Input }], nzDisabled: [{ type: Input }], nzAsyncData: [{ type: Input }], nzMultiple: [{ type: Input }], nzDefaultExpandAll: [{ type: Input }], nzCheckStrictly: [{ type: Input }], nzVirtualItemSize: [{ type: Input }], nzVirtualMaxBufferPx: [{ type: Input }], nzVirtualMinBufferPx: [{ type: Input }], nzVirtualHeight: [{ type: Input }], nzExpandedIcon: [{ type: Input }], nzNotFoundContent: [{ type: Input }], nzNodes: [{ type: Input }], nzOpen: [{ type: Input }], nzSize: [{ type: Input }], nzPlaceHolder: [{ type: Input }], nzDropdownStyle: [{ type: Input }], nzDropdownClassName: [{ type: Input }], nzBackdrop: [{ type: Input }], nzExpandedKeys: [{ type: Input }], nzDisplayWith: [{ type: Input }], nzMaxTagCount: [{ type: Input }], nzMaxTagPlaceholder: [{ type: Input }], nzOpenChange: [{ type: Output }], nzCleared: [{ type: Output }], nzRemoved: [{ type: Output }], nzExpandChange: [{ type: Output }], nzTreeClick: [{ type: Output }], nzTreeCheckBoxChange: [{ type: Output }], nzSelectSearchComponent: [{ type: ViewChild, args: [NzSelectSearchComponent, { static: false },] }], treeRef: [{ type: ViewChild, args: ['treeRef', { static: false },] }], cdkOverlayOrigin: [{ type: ViewChild, args: [CdkOverlayOrigin, { static: true },] }], cdkConnectedOverlay: [{ type: ViewChild, args: [CdkConnectedOverlay, { static: false },] }], nzTreeTemplate: [{ type: Input }], nzTreeTemplateChild: [{ type: ContentChild, args: ['nzTreeTemplate', { static: true },] }] }; __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzTreeSelectComponent.prototype, "nzAllowClear", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzTreeSelectComponent.prototype, "nzShowExpand", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzTreeSelectComponent.prototype, "nzShowLine", void 0); __decorate([ InputBoolean(), WithConfig(), __metadata("design:type", Boolean) ], NzTreeSelectComponent.prototype, "nzDropdownMatchSelectWidth", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzTreeSelectComponent.prototype, "nzCheckable", void 0); __decorate([ InputBoolean(), WithConfig(), __metadata("design:type", Boolean) ], NzTreeSelectComponent.prototype, "nzHideUnMatched", void 0); __decorate([ InputBoolean(), WithConfig(), __metadata("design:type", Boolean) ], NzTreeSelectComponent.prototype, "nzShowIcon", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzTreeSelectComponent.prototype, "nzShowSearch", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeSelectComponent.prototype, "nzDisabled", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeSelectComponent.prototype, "nzAsyncData", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeSelectComponent.prototype, "nzMultiple", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeSelectComponent.prototype, "nzDefaultExpandAll", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeSelectComponent.prototype, "nzCheckStrictly", void 0); __decorate([ WithConfig(), __metadata("design:type", String) ], NzTreeSelectComponent.prototype, "nzSize", void 0); __decorate([ WithConfig(), __metadata("design:type", Object) ], NzTreeSelectComponent.prototype, "nzBackdrop", void 0); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy90cmVlLXNlbGVjdC90cmVlLXNlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHOztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRCxPQUFPLEVBQWEsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFrQyxNQUFNLHNCQUFzQixDQUFDO0FBQzdHLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixJQUFJLEVBQ0osUUFBUSxFQUNSLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxJQUFJLEVBRUosV0FBVyxFQUNYLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBZSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFFTCxVQUFVLEVBRVYsNkJBQTZCLEVBRzlCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztB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bnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuXG5pbXBvcnQgeyBEaXJlY3Rpb24sIERpcmVjdGlvbmFsaXR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHsgQkFDS1NQQUNFLCBFU0NBUEUsIFRBQiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBDZGtDb25uZWN0ZWRPdmVybGF5LCBDZGtPdmVybGF5T3JpZ2luLCBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNlbGYsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBzbGlkZU1vdGlvbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9hbmltYXRpb24nO1xuaW1wb3J0IHsgTnpDb25maWdLZXksIE56Q29uZmlnU2VydmljZSwgV2l0aENvbmZpZyB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgTnpOb0FuaW1hdGlvbkRpcmVjdGl2ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9uby1hbmltYXRpb24nO1xuaW1wb3J0IHsgcmVxQW5pbUZyYW1lIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3BvbHlmaWxsJztcblxuaW1wb3J0IHtcbiAgTnpGb3JtYXRFbWl0RXZlbnQsXG4gIE56VHJlZUJhc2UsXG4gIE56VHJlZUJhc2VTZXJ2aWNlLFxuICBOelRyZWVIaWdoZXJPcmRlclNlcnZpY2VUb2tlbixcbiAgTnpUcmVlTm9kZSxcbiAgTnpUcmVlTm9kZU9wdGlvbnNcbn0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3RyZWUnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBOZ1N0eWxlSW50ZXJmYWNlLCBOelNpemVMRFNUeXBlLCBPbkNoYW5nZVR5cGUsIE9uVG91Y2hlZFR5cGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuLCBpc05vdE5pbCB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcbmltcG9ydCB7IE56U2VsZWN0U2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnbmctem9ycm8tYW50ZC9zZWxlY3QnO1xuaW1wb3J0IHsgTnpUcmVlQ29tcG9uZW50IH0gZnJvbSAnbmctem9ycm8tYW50ZC90cmVlJztcblxuaW1wb3J0IHsgbWVyZ2UsIG9mIGFzIG9ic2VydmFibGVPZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE56VHJlZVNlbGVjdFNlcnZpY2UgfSBmcm9tICcuL3RyZWUtc2VsZWN0LnNlcnZpY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGlnaGVyT3JkZXJTZXJ2aWNlRmFjdG9yeShpbmplY3RvcjogSW5qZWN0b3IpOiBOelRyZWVCYXNlU2VydmljZSB7XG4gIHJldHVybiBpbmplY3Rvci5nZXQoTnpUcmVlU2VsZWN0U2VydmljZSk7XG59XG5cbmNvbnN0IE5aX0NPTkZJR19NT0RVTEVfTkFNRTogTnpDb25maWdLZXkgPSAndHJlZVNlbGVjdCc7XG5jb25zdCBUUkVFX1NFTEVDVF9ERUZBVUxUX0NMQVNTID0gJ2FudC1zZWxlY3QtZHJvcGRvd24gYW50LXNlbGVjdC10cmVlLWRyb3Bkb3duJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotdHJlZS1zZWxlY3QnLFxuICBleHBvcnRBczogJ256VHJlZVNlbGVjdCcsXG4gIGFuaW1hdGlvbnM6IFtzbGlkZU1vdGlvbl0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgICBuekNvbm5lY3RlZE92ZXJsYXlcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwibnpCYWNrZHJvcFwiXG4gICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJuek9wZW5cIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlUcmFuc2Zvcm1PcmlnaW5Pbl09XCInLmFudC1zZWxlY3QtdHJlZS1kcm9wZG93bidcIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlNaW5XaWR0aF09XCIkYW55KG56RHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoID8gbnVsbCA6IHRyaWdnZXJXaWR0aClcIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlXaWR0aF09XCIkYW55KG56RHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoID8gdHJpZ2dlcldpZHRoIDogbnVsbClcIlxuICAgICAgKG92ZXJsYXlPdXRzaWRlQ2xpY2spPVwib25DbGlja091dHNpZGUoJGV2ZW50KVwiXG4gICAgICAoZGV0YWNoKT1cImNsb3NlRHJvcERvd24oKVwiXG4gICAgICAocG9zaXRpb25DaGFuZ2UpPVwib25Qb3NpdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIFtAc2xpZGVNb3Rpb25dPVwiJ2VudGVyJ1wiXG4gICAgICAgIFtuZ0NsYXNzXT1cImRyb3Bkb3duQ2xhc3NOYW1lXCJcbiAgICAgICAgW0AuZGlzYWJsZWRdPVwibm9BbmltYXRpb24/Lm56Tm9BbmltYXRpb25cIlxuICAgICAgICBbbnpOb0FuaW1hdGlvbl09XCJub0FuaW1hdGlvbj8ubnpOb0FuaW1hdGlvblwiXG4gICAgICAgIFtjbGFzcy5hbnQtc2VsZWN0LWRyb3Bkb3duLXBsYWNlbWVudC1ib3R0b21MZWZ0XT1cImRyb3BEb3duUG9zaXRpb24gPT09ICdib3R0b20nXCJcbiAgICAgICAgW2NsYXNzLmFudC1zZWxlY3QtZHJvcGRvd24tcGxhY2VtZW50LXRvcExlZnRdPVwiZHJvcERvd25Qb3NpdGlvbiA9PT0gJ3RvcCdcIlxuICAgICAgICBbY2xhc3MuYW50LXRyZWUtc2VsZWN0LWRyb3Bkb3duLXJ0bF09XCJkaXIgPT09ICdydGwnXCJcbiAgICAgICAgW2Rpcl09XCJkaXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJuekRyb3Bkb3duU3R5bGVcIlxuICAgICAgPlxuICAgICAgICA8bnotdHJlZVxuICAgICAgICAgICN0cmVlUmVmXG4gICAgICAgICAgW2hpZGRlbl09XCJpc05vdEZvdW5kXCJcbiAgICAgICAgICBuek5vQW5pbWF0aW9uXG4gICAgICAgICAgbnpTZWxlY3RNb2RlXG4gICAgICAgICAgbnpCbG9ja05vZGVcbiAgICAgICAgICBbbnpEYXRhXT1cIm56Tm9kZXNcIlxuICAgICAgICAgIFtuek11bHRpcGxlXT1cIm56TXVsdGlwbGVcIlxuICAgICAgICAgIFtuelNlYXJjaFZhbHVlXT1cImlucHV0VmFsdWVcIlxuICAgICAgICAgIFtuekhpZGVVbk1hdGNoZWRdPVwibnpIaWRlVW5NYXRjaGVkXCJcbiAgICAgICAgICBbbnpTaG93SWNvbl09XCJuelNob3dJY29uXCJcbiAgICAgICAgICBbbnpDaGVja2FibGVdPVwibnpDaGVja2FibGVcIlxuICAgICAgICAgIFtuekFzeW5jRGF0YV09XCJuekFzeW5jRGF0YVwiXG4gICAgICAgICAgW256U2hvd0V4cGFuZF09XCJuelNob3dFeHBhbmRcIlxuICAgICAgICAgIFtuelNob3dMaW5lXT1cIm56U2hvd0xpbmVcIlxuICAgICAgICAgIFtuekV4cGFuZGVkSWNvbl09XCJuekV4cGFuZGVkSWNvblwiXG4gICAgICAgICAgW256RXhwYW5kQWxsXT1cIm56RGVmYXVsdEV4cGFuZEFsbFwiXG4gICAgICAgICAgW256RXhwYW5kZWRLZXlzXT1cImV4cGFuZGVkS2V5c1wiXG4gICAgICAgICAgW256Q2hlY2tlZEtleXNdPVwibnpDaGVja2FibGUgPyB2YWx1ZSA6IFtdXCJcbiAgICAgICAgICBbbnpTZWxlY3RlZEtleXNdPVwiIW56Q2hlY2thYmxlID8gdmFsdWUgOiBbXVwiXG4gICAgICAgICAgW256VHJlZVRlbXBsYXRlXT1cInRyZWVUZW1wbGF0ZVwiXG4gICAgICAgICAgW256Q2hlY2tTdHJpY3RseV09XCJuekNoZWNrU3RyaWN0bHlcIlxuICAgICAgICAgIFtuelZpcnR1YWxJdGVtU2l6ZV09XCJuelZpcnR1YWxJdGVtU2l6ZVwiXG4gICAgICAgICAgW256VmlydHVhbE1heEJ1ZmZlclB4XT1cIm56VmlydHVhbE1heEJ1ZmZlclB4XCJcbiAgICAgICAgICBbbnpWaXJ0dWFsTWluQnVmZmVyUHhdPVwibnpWaXJ0dWFsTWluQnVmZmVyUHhcIlxuICAgICAgICAgIFtuelZpcnR1YWxIZWlnaHRdPVwibnpWaXJ0dWFsSGVpZ2h0XCJcbiAgICAgICAgICAobnpFeHBhbmRDaGFuZ2UpPVwib25FeHBhbmRlZEtleXNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgKG56Q2xpY2spPVwibnpUcmVlQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAobnpDaGVja2VkS2V5c0NoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZE5vZGVzKClcIlxuICAgICAgICAgIChuelNlbGVjdGVkS2V5c0NoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZE5vZGVzKClcIlxuICAgICAgICAgIChuekNoZWNrQm94Q2hhbmdlKT1cIm56VHJlZUNoZWNrQm94Q2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKG56U2VhcmNoVmFsdWVDaGFuZ2UpPVwic2V0U2VhcmNoVmFsdWVzKCRldmVudClcIlxuICAgICAgICA+PC9uei10cmVlPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIm56Tm9kZXMubGVuZ3RoID09PSAwIHx8IGlzTm90Rm91bmRcIiBjbGFzcz1cImFudC1zZWxlY3Qtbm90LWZvdW5kXCI+XG4gICAgICAgICAgPG56LWVtYmVkLWVtcHR5IFtuekNvbXBvbmVudE5hbWVdPVwiJ3RyZWUtc2VsZWN0J1wiIFtzcGVjaWZpY0NvbnRlbnRdPVwibnpOb3RGb3VuZENvbnRlbnRcIj48L256LWVtYmVkLWVtcHR5PlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPGRpdiBjZGtPdmVybGF5T3JpZ2luIGNsYXNzPVwiYW50LXNlbGVjdC1zZWxlY3RvclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTXVsdGlwbGVcIj5cbiAgICAgICAgPG56LXNlbGVjdC1pdGVtXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG5vZGUgb2Ygc2VsZWN0ZWROb2RlcyB8IHNsaWNlOiAwOm56TWF4VGFnQ291bnQ7IHRyYWNrQnk6IHRyYWNrVmFsdWVcIlxuICAgICAgICAgIFtkZWxldGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm5vZGUuaXNEaXNhYmxlZCB8fCBuekRpc2FibGVkXCJcbiAgICAgICAgICBbbGFiZWxdPVwibnpEaXNwbGF5V2l0aChub2RlKVwiXG4gICAgICAgICAgKGRlbGV0ZSk9XCJyZW1vdmVTZWxlY3RlZChub2RlLCB0cnVlKVwiXG4gICAgICAgID48L256LXNlbGVjdC1pdGVtPlxuXG4gICAgICAgIDxuei1zZWxlY3QtaXRlbVxuICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWROb2Rlcy5sZW5ndGggPiBuek1heFRhZ0NvdW50XCJcbiAgICAgICAgICBbY29udGVudFRlbXBsYXRlT3V0bGV0XT1cIm56TWF4VGFnUGxhY2Vob2xkZXJcIlxuICAgICAgICAgIFtjb250ZW50VGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInNlbGVjdGVkTm9kZXMgfCBzbGljZTogbnpNYXhUYWdDb3VudFwiXG4gICAgICAgICAgW2RlbGV0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJysgJyArIChzZWxlY3RlZE5vZGVzLmxlbmd0aCAtIG56TWF4VGFnQ291bnQpICsgJyAuLi4nXCJcbiAgICAgICAgPjwvbnotc2VsZWN0LWl0ZW0+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG56LXNlbGVjdC1zZWFyY2hcbiAgICAgICAgW256SWRdPVwibnpJZFwiXG4gICAgICAgIFtzaG93SW5wdXRdPVwibnpTaG93U2VhcmNoXCJcbiAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIChpc0NvbXBvc2luZ0NoYW5nZSk9XCJpc0NvbXBvc2luZyA9ICRldmVudFwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJzZXRJbnB1dFZhbHVlKCRldmVudClcIlxuICAgICAgICBbdmFsdWVdPVwiaW5wdXRWYWx1ZVwiXG4gICAgICAgIFttaXJyb3JTeW5jXT1cImlzTXVsdGlwbGVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibnpEaXNhYmxlZFwiXG4gICAgICAgIFtmb2N1c1RyaWdnZXJdPVwibnpPcGVuXCJcbiAgICAgID48L256LXNlbGVjdC1zZWFyY2g+XG5cbiAgICAgIDxuei1zZWxlY3QtcGxhY2Vob2xkZXJcbiAgICAgICAgKm5nSWY9XCJuelBsYWNlSG9sZGVyICYmIHNlbGVjdGVkTm9kZXMubGVuZ3RoID09PSAwXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm56UGxhY2VIb2xkZXJcIlxuICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJwbGFjZUhvbGRlckRpc3BsYXlcIlxuICAgIC