ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
380 lines • 34.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: dropdown.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __decorate, __metadata, __read, __spread } from "tslib";
/**
* @license
* Copyright Alibaba.com All Rights Reserved.
*
* 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 { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';
import { Overlay } from '@angular/cdk/overlay';
import { TemplatePortal } from '@angular/cdk/portal';
import { Directive, ElementRef, EventEmitter, Input, Output, ViewContainerRef } from '@angular/core';
import { POSITION_MAP } from 'ng-zorro-antd/core/overlay';
import { InputBoolean } from 'ng-zorro-antd/core/util';
import { BehaviorSubject, combineLatest, EMPTY, fromEvent, merge, Subject } from 'rxjs';
import { auditTime, distinctUntilChanged, filter, map, mapTo, switchMap, takeUntil } from 'rxjs/operators';
/** @type {?} */
var listOfPositions = [POSITION_MAP.bottomLeft, POSITION_MAP.bottomRight, POSITION_MAP.topRight, POSITION_MAP.topLeft];
var NzDropDownDirective = /** @class */ (function () {
function NzDropDownDirective(elementRef, overlay, viewContainerRef) {
this.elementRef = elementRef;
this.overlay = overlay;
this.viewContainerRef = viewContainerRef;
this.overlayRef = null;
this.destroy$ = new Subject();
this.positionStrategy = this.overlay.position().flexibleConnectedTo(this.elementRef.nativeElement).withLockedPosition();
this.inputVisible$ = new BehaviorSubject(false);
this.nzTrigger$ = new BehaviorSubject('hover');
this.overlayClose$ = new Subject();
this.nzDropdownMenu = null;
this.nzTrigger = 'hover';
this.nzMatchWidthElement = null;
this.nzBackdrop = true;
this.nzClickHide = true;
this.nzDisabled = false;
this.nzVisible = false;
this.nzOverlayClassName = null;
this.nzOverlayStyle = {};
this.nzPlacement = 'bottomLeft';
this.nzVisibleChange = new EventEmitter();
}
/**
* @template T
* @param {?} key
* @param {?} value
* @return {?}
*/
NzDropDownDirective.prototype.setDropdownMenuValue = /**
* @template T
* @param {?} key
* @param {?} value
* @return {?}
*/
function (key, value) {
if (this.nzDropdownMenu) {
this.nzDropdownMenu.setValue(key, value);
}
};
/**
* @return {?}
*/
NzDropDownDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.positionStrategy.positionChanges.pipe(takeUntil(this.destroy$)).subscribe((/**
* @param {?} change
* @return {?}
*/
function (change) {
_this.setDropdownMenuValue('dropDownPosition', change.connectionPair.originY);
}));
};
/**
* @return {?}
*/
NzDropDownDirective.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
if (this.nzDropdownMenu) {
/** @type {?} */
var nativeElement_1 = this.elementRef.nativeElement;
/**
* host mouse state *
* @type {?}
*/
var hostMouseState$ = merge(fromEvent(nativeElement_1, 'mouseenter').pipe(mapTo(true)), fromEvent(nativeElement_1, 'mouseleave').pipe(mapTo(false)));
/**
* menu mouse state *
* @type {?}
*/
var menuMouseState$ = this.nzDropdownMenu.mouseState$;
/**
* merged mouse state *
* @type {?}
*/
var mergedMouseState$_1 = merge(menuMouseState$, hostMouseState$);
/**
* host click state *
* @type {?}
*/
var hostClickState$_1 = fromEvent(nativeElement_1, 'click').pipe(mapTo(true));
/**
* visible state switch by nzTrigger *
* @type {?}
*/
var visibleStateByTrigger$ = this.nzTrigger$.pipe(switchMap((/**
* @param {?} trigger
* @return {?}
*/
function (trigger) {
if (trigger === 'hover') {
return mergedMouseState$_1;
}
else if (trigger === 'click') {
return hostClickState$_1;
}
else {
return EMPTY;
}
})));
/** @type {?} */
var descendantMenuItemClick$ = this.nzDropdownMenu.descendantMenuItemClick$.pipe(filter((/**
* @return {?}
*/
function () { return _this.nzClickHide; })), mapTo(false));
/** @type {?} */
var domTriggerVisible$ = merge(visibleStateByTrigger$, descendantMenuItemClick$, this.overlayClose$).pipe(filter((/**
* @return {?}
*/
function () { return !_this.nzDisabled; })));
/** @type {?} */
var visible$ = merge(this.inputVisible$, domTriggerVisible$);
combineLatest([visible$, this.nzDropdownMenu.isChildSubMenuOpen$])
.pipe(map((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = __read(_a, 2), visible = _b[0], sub = _b[1];
return visible || sub;
})), auditTime(150), distinctUntilChanged(), takeUntil(this.destroy$))
.subscribe((/**
* @param {?} visible
* @return {?}
*/
function (visible) {
/** @type {?} */
var element = _this.nzMatchWidthElement ? _this.nzMatchWidthElement.nativeElement : nativeElement_1;
/** @type {?} */
var triggerWidth = element.getBoundingClientRect().width;
if (_this.nzVisible !== visible) {
_this.nzVisibleChange.emit(visible);
}
_this.nzVisible = visible;
if (visible) {
/** set up overlayRef **/
if (!_this.overlayRef) {
/** new overlay **/
_this.overlayRef = _this.overlay.create({
positionStrategy: _this.positionStrategy,
minWidth: triggerWidth,
disposeOnNavigation: true,
hasBackdrop: _this.nzTrigger === 'click',
backdropClass: _this.nzBackdrop ? undefined : 'nz-overlay-transparent-backdrop',
scrollStrategy: _this.overlay.scrollStrategies.reposition()
});
merge(_this.overlayRef.backdropClick(), _this.overlayRef.detachments(), _this.overlayRef.keydownEvents().pipe(filter((/**
* @param {?} e
* @return {?}
*/
function (e) { return e.keyCode === ESCAPE && !hasModifierKey(e); }))))
.pipe(mapTo(false), takeUntil(_this.destroy$))
.subscribe(_this.overlayClose$);
}
else {
/**
* update overlay config *
* @type {?}
*/
var overlayConfig = _this.overlayRef.getConfig();
overlayConfig.minWidth = triggerWidth;
overlayConfig.hasBackdrop = _this.nzTrigger === 'click';
}
/** open dropdown with animation **/
_this.positionStrategy.withPositions(__spread([POSITION_MAP[_this.nzPlacement]], listOfPositions));
/** reset portal if needed **/
if (!_this.portal || _this.portal.templateRef !== (/** @type {?} */ (_this.nzDropdownMenu)).templateRef) {
_this.portal = new TemplatePortal((/** @type {?} */ (_this.nzDropdownMenu)).templateRef, _this.viewContainerRef);
}
_this.overlayRef.attach(_this.portal);
}
else {
/** detach overlayRef if needed **/
if (_this.overlayRef) {
_this.overlayRef.detach();
}
}
}));
}
};
/**
* @return {?}
*/
NzDropDownDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.destroy$.next();
this.destroy$.complete();
if (this.overlayRef) {
this.overlayRef.dispose();
this.overlayRef = null;
}
};
/**
* @param {?} changes
* @return {?}
*/
NzDropDownDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var nzVisible = changes.nzVisible, nzPlacement = changes.nzPlacement, nzDisabled = changes.nzDisabled, nzOverlayClassName = changes.nzOverlayClassName, nzOverlayStyle = changes.nzOverlayStyle, nzTrigger = changes.nzTrigger;
if (nzTrigger) {
this.nzTrigger$.next(this.nzTrigger);
}
if (nzVisible) {
this.inputVisible$.next(this.nzVisible);
}
if (nzDisabled && this.nzDisabled) {
this.inputVisible$.next(false);
}
if (nzOverlayClassName) {
this.setDropdownMenuValue('nzOverlayClassName', this.nzOverlayClassName);
}
if (nzOverlayStyle) {
this.setDropdownMenuValue('nzOverlayStyle', this.nzOverlayStyle);
}
if (nzPlacement) {
this.setDropdownMenuValue('dropDownPosition', this.nzPlacement.indexOf('top') !== -1 ? 'top' : 'bottom');
}
};
NzDropDownDirective.decorators = [
{ type: Directive, args: [{
selector: '[nz-dropdown]',
exportAs: 'nzDropdown',
host: {
'[attr.disabled]': "nzDisabled ? '' : null",
'[class.ant-dropdown-trigger]': 'true'
}
},] }
];
/** @nocollapse */
NzDropDownDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Overlay },
{ type: ViewContainerRef }
]; };
NzDropDownDirective.propDecorators = {
nzDropdownMenu: [{ type: Input }],
nzTrigger: [{ type: Input }],
nzMatchWidthElement: [{ type: Input }],
nzBackdrop: [{ type: Input }],
nzClickHide: [{ type: Input }],
nzDisabled: [{ type: Input }],
nzVisible: [{ type: Input }],
nzOverlayClassName: [{ type: Input }],
nzOverlayStyle: [{ type: Input }],
nzPlacement: [{ type: Input }],
nzVisibleChange: [{ type: Output }]
};
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzDropDownDirective.prototype, "nzBackdrop", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzDropDownDirective.prototype, "nzClickHide", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzDropDownDirective.prototype, "nzDisabled", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzDropDownDirective.prototype, "nzVisible", void 0);
return NzDropDownDirective;
}());
export { NzDropDownDirective };
if (false) {
/** @type {?} */
NzDropDownDirective.ngAcceptInputType_nzBackdrop;
/** @type {?} */
NzDropDownDirective.ngAcceptInputType_nzClickHide;
/** @type {?} */
NzDropDownDirective.ngAcceptInputType_nzDisabled;
/** @type {?} */
NzDropDownDirective.ngAcceptInputType_nzVisible;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.portal;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.overlayRef;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.destroy$;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.positionStrategy;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.inputVisible$;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.nzTrigger$;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.overlayClose$;
/** @type {?} */
NzDropDownDirective.prototype.nzDropdownMenu;
/** @type {?} */
NzDropDownDirective.prototype.nzTrigger;
/** @type {?} */
NzDropDownDirective.prototype.nzMatchWidthElement;
/** @type {?} */
NzDropDownDirective.prototype.nzBackdrop;
/** @type {?} */
NzDropDownDirective.prototype.nzClickHide;
/** @type {?} */
NzDropDownDirective.prototype.nzDisabled;
/** @type {?} */
NzDropDownDirective.prototype.nzVisible;
/** @type {?} */
NzDropDownDirective.prototype.nzOverlayClassName;
/** @type {?} */
NzDropDownDirective.prototype.nzOverlayStyle;
/** @type {?} */
NzDropDownDirective.prototype.nzPlacement;
/** @type {?} */
NzDropDownDirective.prototype.nzVisibleChange;
/** @type {?} */
NzDropDownDirective.prototype.elementRef;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.overlay;
/**
* @type {?}
* @private
*/
NzDropDownDirective.prototype.viewContainerRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC9kcm9wZG93bi8iLCJzb3VyY2VzIjpbImRyb3Bkb3duLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUVOLGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RixPQUFPLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFHckcsZUFBZSxHQUFHLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQztBQUV4SDtJQXVDRSw2QkFBbUIsVUFBc0IsRUFBVSxPQUFnQixFQUFVLGdCQUFrQztRQUE1RixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0Is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TCxLQUFLOzZCQUNMLEtBQUs7OEJBQ0wsS0FBSzs2QkFDTCxLQUFLOzRCQUNMLEtBQUs7cUNBQ0wsS0FBSztpQ0FDTCxLQUFLOzhCQUNMLEtBQUs7a0NBQ0wsTUFBTTs7SUFQa0I7UUFBZixZQUFZLEVBQUU7OzJEQUFtQjtJQUNsQjtRQUFmLFlBQVksRUFBRTs7NERBQW9CO0lBQ25CO1FBQWYsWUFBWSxFQUFFOzsyREFBb0I7SUFDbkI7UUFBZixZQUFZLEVBQUU7OzBEQUFtQjtJQTRJN0MsMEJBQUM7Q0FBQSxBQXZLRCxJQXVLQztTQS9KWSxtQkFBbUI7OztJQUM5QixpREFBa0Q7O0lBQ2xELGtEQUFtRDs7SUFDbkQsaURBQWtEOztJQUNsRCxnREFBaUQ7Ozs7O0lBRWpELHFDQUErQjs7Ozs7SUFDL0IseUNBQTZDOzs7OztJQUM3Qyx1Q0FBaUM7Ozs7O0lBQ2pDLCtDQUEySDs7Ozs7SUFDM0gsNENBQTREOzs7OztJQUM1RCx5Q0FBcUU7Ozs7O0lBQ3JFLDRDQUErQzs7SUFDL0MsNkNBQStEOztJQUMvRCx3Q0FBZ0Q7O0lBQ2hELGtEQUF1RDs7SUFDdkQseUNBQTJDOztJQUMzQywwQ0FBNEM7O0lBQzVDLHlDQUE0Qzs7SUFDNUMsd0NBQTJDOztJQUMzQyxpREFBa0Q7O0lBQ2xELDZDQUE4Qzs7SUFDOUMsMENBQXFEOztJQUNyRCw4Q0FBK0U7O0lBUW5FLHlDQUE2Qjs7Ozs7SUFBRSxzQ0FBd0I7Ozs7O0lBQUUsK0NBQTBDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IEVTQ0FQRSwgaGFzTW9kaWZpZXJLZXkgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBPU0lUSU9OX01BUCB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9vdmVybGF5JztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgSW5kZXhhYmxlT2JqZWN0IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IElucHV0Qm9vbGVhbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgRU1QVFksIGZyb21FdmVudCwgbWVyZ2UsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGF1ZGl0VGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBtYXBUbywgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOekRyb3Bkb3duTWVudUNvbXBvbmVudCwgTnpQbGFjZW1lbnRUeXBlIH0gZnJvbSAnLi9kcm9wZG93bi1tZW51LmNvbXBvbmVudCc7XG5cbmNvbnN0IGxpc3RPZlBvc2l0aW9ucyA9IFtQT1NJVElPTl9NQVAuYm90dG9tTGVmdCwgUE9TSVRJT05fTUFQLmJvdHRvbVJpZ2h0LCBQT1NJVElPTl9NQVAudG9wUmlnaHQsIFBPU0lUSU9OX01BUC50b3BMZWZ0XTtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW256LWRyb3Bkb3duXScsXG4gIGV4cG9ydEFzOiAnbnpEcm9wZG93bicsXG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIuZGlzYWJsZWRdJzogYG56RGlzYWJsZWQgPyAnJyA6IG51bGxgLFxuICAgICdbY2xhc3MuYW50LWRyb3Bkb3duLXRyaWdnZXJdJzogJ3RydWUnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgTnpEcm9wRG93bkRpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBPbkluaXQge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpCYWNrZHJvcDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpDbGlja0hpZGU6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256RGlzYWJsZWQ6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256VmlzaWJsZTogQm9vbGVhbklucHV0O1xuXG4gIHByaXZhdGUgcG9ydGFsOiBUZW1wbGF0ZVBvcnRhbDtcbiAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXkucG9zaXRpb24oKS5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS53aXRoTG9ja2VkUG9zaXRpb24oKTtcbiAgcHJpdmF0ZSBpbnB1dFZpc2libGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbnpUcmlnZ2VyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8J2NsaWNrJyB8ICdob3Zlcic+KCdob3ZlcicpO1xuICBwcml2YXRlIG92ZXJsYXlDbG9zZSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBASW5wdXQoKSBuekRyb3Bkb3duTWVudTogTnpEcm9wZG93bk1lbnVDb21wb25lbnQgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpUcmlnZ2VyOiAnY2xpY2snIHwgJ2hvdmVyJyA9ICdob3Zlcic7XG4gIEBJbnB1dCgpIG56TWF0Y2hXaWR0aEVsZW1lbnQ6IEVsZW1lbnRSZWYgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56QmFja2Ryb3AgPSB0cnVlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpDbGlja0hpZGUgPSB0cnVlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpEaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpWaXNpYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG56T3ZlcmxheUNsYXNzTmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG56T3ZlcmxheVN0eWxlOiBJbmRleGFibGVPYmplY3QgPSB7fTtcbiAgQElucHV0KCkgbnpQbGFjZW1lbnQ6IE56UGxhY2VtZW50VHlwZSA9ICdib3R0b21MZWZ0JztcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56VmlzaWJsZUNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHNldERyb3Bkb3duTWVudVZhbHVlPFQgZXh0ZW5kcyBrZXlvZiBOekRyb3Bkb3duTWVudUNvbXBvbmVudD4oa2V5OiBULCB2YWx1ZTogTnpEcm9wZG93bk1lbnVDb21wb25lbnRbVF0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uekRyb3Bkb3duTWVudSkge1xuICAgICAgdGhpcy5uekRyb3Bkb3duTWVudS5zZXRWYWx1ZShrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LCBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wb3NpdGlvblN0cmF0ZWd5LnBvc2l0aW9uQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGNoYW5nZSA9PiB7XG4gICAgICB0aGlzLnNldERyb3Bkb3duTWVudVZhbHVlKCdkcm9wRG93blBvc2l0aW9uJywgY2hhbmdlLmNvbm5lY3Rpb25QYWlyLm9yaWdpblkpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm56RHJvcGRvd25NZW51KSB7XG4gICAgICBjb25zdCBuYXRpdmVFbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgLyoqIGhvc3QgbW91c2Ugc3RhdGUgKiovXG4gICAgICBjb25zdCBob3N0TW91c2VTdGF0ZSQgPSBtZXJnZShcbiAgICAgICAgZnJvbUV2ZW50KG5hdGl2ZUVsZW1lbnQsICdtb3VzZWVudGVyJykucGlwZShtYXBUbyh0cnVlKSksXG4gICAgICAgIGZyb21FdmVudChuYXRpdmVFbGVtZW50LCAnbW91c2VsZWF2ZScpLnBpcGUobWFwVG8oZmFsc2UpKVxuICAgICAgKTtcbiAgICAgIC8qKiBtZW51IG1vdXNlIHN0YXRlICoqL1xuICAgICAgY29uc3QgbWVudU1vdXNlU3RhdGUkID0gdGhpcy5uekRyb3Bkb3duTWVudS5tb3VzZVN0YXRlJDtcbiAgICAgIC8qKiBtZXJnZWQgbW91c2Ugc3RhdGUgKiovXG4gICAgICBjb25zdCBtZXJnZWRNb3VzZVN0YXRlJCA9IG1lcmdlKG1lbnVNb3VzZVN0YXRlJCwgaG9zdE1vdXNlU3RhdGUkKTtcbiAgICAgIC8qKiBob3N0IGNsaWNrIHN0YXRlICoqL1xuICAgICAgY29uc3QgaG9zdENsaWNrU3RhdGUkID0gZnJvbUV2ZW50KG5hdGl2ZUVsZW1lbnQsICdjbGljaycpLnBpcGUobWFwVG8odHJ1ZSkpO1xuICAgICAgLyoqIHZpc2libGUgc3RhdGUgc3dpdGNoIGJ5IG56VHJpZ2dlciAqKi9cbiAgICAgIGNvbnN0IHZpc2libGVTdGF0ZUJ5VHJpZ2dlciQgPSB0aGlzLm56VHJpZ2dlciQucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHRyaWdnZXIgPT4ge1xuICAgICAgICAgIGlmICh0cmlnZ2VyID09PSAnaG92ZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VkTW91c2VTdGF0ZSQ7XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICAgICAgICByZXR1cm4gaG9zdENsaWNrU3RhdGUkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlc2NlbmRhbnRNZW51SXRlbUNsaWNrJCA9IHRoaXMubnpEcm9wZG93bk1lbnUuZGVzY2VuZGFudE1lbnVJdGVtQ2xpY2skLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLm56Q2xpY2tIaWRlKSxcbiAgICAgICAgbWFwVG8oZmFsc2UpXG4gICAgICApO1xuICAgICAgY29uc3QgZG9tVHJpZ2dlclZpc2libGUkID0gbWVyZ2UodmlzaWJsZVN0YXRlQnlUcmlnZ2VyJCwgZGVzY2VuZGFudE1lbnVJdGVtQ2xpY2skLCB0aGlzLm92ZXJsYXlDbG9zZSQpLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5uekRpc2FibGVkKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHZpc2libGUkID0gbWVyZ2UodGhpcy5pbnB1dFZpc2libGUkLCBkb21UcmlnZ2VyVmlzaWJsZSQpO1xuICAgICAgY29tYmluZUxhdGVzdChbdmlzaWJsZSQsIHRoaXMubnpEcm9wZG93bk1lbnUuaXNDaGlsZFN1Yk1lbnVPcGVuJF0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgoW3Zpc2libGUsIHN1Yl0pID0+IHZpc2libGUgfHwgc3ViKSxcbiAgICAgICAgICBhdWRpdFRpbWUoMTUwKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHZpc2libGU6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5uek1hdGNoV2lkdGhFbGVtZW50ID8gdGhpcy5uek1hdGNoV2lkdGhFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiBuYXRpdmVFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJXaWR0aCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgaWYgKHRoaXMubnpWaXNpYmxlICE9PSB2aXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLm56VmlzaWJsZUNoYW5nZS5lbWl0KHZpc2libGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm56VmlzaWJsZSA9IHZpc2libGU7XG4gICAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgIC8qKiBzZXQgdXAgb3ZlcmxheVJlZiAqKi9cbiAgICAgICAgICAgIGlmICghdGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICAgICAgICAgIC8qKiBuZXcgb3ZlcmxheSAqKi9cbiAgICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5wb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgIG1pbldpZHRoOiB0cmlnZ2VyV2lkdGgsXG4gICAgICAgICAgICAgICAgZGlzcG9zZU9uTmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBoYXNCYWNrZHJvcDogdGhpcy5uelRyaWdnZXIgPT09ICdjbGljaycsXG4gICAgICAgICAgICAgICAgYmFja2Ryb3BDbGFzczogdGhpcy5uekJhY2tkcm9wID8gdW5kZWZpbmVkIDogJ256LW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxuICAgICAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCksXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaG1lbnRzKCksXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmtleWRvd25FdmVudHMoKS5waXBlKGZpbHRlcihlID0+IGUua2V5Q29kZSA9PT0gRVNDQVBFICYmICFoYXNNb2RpZmllcktleShlKSkpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucGlwZShtYXBUbyhmYWxzZSksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMub3ZlcmxheUNsb3NlJCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvKiogdXBkYXRlIG92ZXJsYXkgY29uZmlnICoqL1xuICAgICAgICAgICAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gdGhpcy5vdmVybGF5UmVmLmdldENvbmZpZygpO1xuICAgICAgICAgICAgICBvdmVybGF5Q29uZmlnLm1pbldpZHRoID0gdHJpZ2dlcldpZHRoO1xuICAgICAgICAgICAgICBvdmVybGF5Q29uZmlnLmhhc0JhY2tkcm9wID0gdGhpcy5uelRyaWdnZXIgPT09ICdjbGljayc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiogb3BlbiBkcm9wZG93biB3aXRoIGFuaW1hdGlvbiAqKi9cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25TdHJhdGVneS53aXRoUG9zaXRpb25zKFtQT1NJVElPTl9NQVBbdGhpcy5uelBsYWNlbWVudF0sIC4uLmxpc3RPZlBvc2l0aW9uc10pO1xuICAgICAgICAgICAgLyoqIHJlc2V0IHBvcnRhbCBpZiBuZWVkZWQgKiovXG4gICAgICAgICAgICBpZiAoIXRoaXMucG9ydGFsIHx8IHRoaXMucG9ydGFsLnRlbXBsYXRlUmVmICE9PSB0aGlzLm56RHJvcGRvd25NZW51IS50ZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgICB0aGlzLnBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLm56RHJvcGRvd25NZW51IS50ZW1wbGF0ZVJlZiwgdGhpcy52aWV3Q29udGFpbmVyUmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5hdHRhY2godGhpcy5wb3J0YWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiogZGV0YWNoIG92ZXJsYXlSZWYgaWYgbmVlZGVkICoqL1xuICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IHsgbnpWaXNpYmxlLCBuelBsYWNlbWVudCwgbnpEaXNhYmxlZCwgbnpPdmVybGF5Q2xhc3NOYW1lLCBuek92ZXJsYXlTdHlsZSwgbnpUcmlnZ2VyIH0gPSBjaGFuZ2VzO1xuICAgIGlmIChuelRyaWdnZXIpIHtcbiAgICAgIHRoaXMubnpUcmlnZ2VyJC5uZXh0KHRoaXMubnpUcmlnZ2VyKTtcbiAgICB9XG4gICAgaWYgKG56VmlzaWJsZSkge1xuICAgICAgdGhpcy5pbnB1dFZpc2libGUkLm5leHQodGhpcy5uelZpc2libGUpO1xuICAgIH1cbiAgICBpZiAobnpEaXNhYmxlZCAmJiB0aGlzLm56RGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuaW5wdXRWaXNpYmxlJC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKG56T3ZlcmxheUNsYXNzTmFtZSkge1xuICAgICAgdGhpcy5zZXREcm9wZG93bk1lbnVWYWx1ZSgnbnpPdmVybGF5Q2xhc3NOYW1lJywgdGhpcy5uek92ZXJsYXlDbGFzc05hbWUpO1xuICAgIH1cbiAgICBpZiAobnpPdmVybGF5U3R5bGUpIHtcbiAgICAgIHRoaXMuc2V0RHJvcGRvd25NZW51VmFsdWUoJ256T3ZlcmxheVN0eWxlJywgdGhpcy5uek92ZXJsYXlTdHlsZSk7XG4gICAgfVxuICAgIGlmIChuelBsYWNlbWVudCkge1xuICAgICAgdGhpcy5zZXREcm9wZG93bk1lbnVWYWx1ZSgnZHJvcERvd25Qb3NpdGlvbicsIHRoaXMubnpQbGFjZW1lbnQuaW5kZXhPZigndG9wJykgIT09IC0xID8gJ3RvcCcgOiAnYm90dG9tJyk7XG4gICAgfVxuICB9XG59XG4iXX0=