UNPKG

ngx-pluto

Version:
435 lines 38.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, ElementRef, Input, Renderer2, TemplateRef } from '@angular/core'; import { Overlay, OverlayPositionBuilder } from '@angular/cdk/overlay'; import { ComponentPortal } from '@angular/cdk/portal'; import { NpTooltip } from './tooltip.component'; /** @type {?} */ var OFFSET = 4; /** * Tooltip提示文本 * * <example-url>https://stackblitz.com/edit/np-tooltip-sample?embed=1&file=src/app/app.component.html</example-url> */ var NpTooltipDirective = /** @class */ (function () { function NpTooltipDirective(overlay, overlayPositionBuilder, elementRef, renderer) { this.overlay = overlay; this.overlayPositionBuilder = overlayPositionBuilder; this.elementRef = elementRef; this.renderer = renderer; /** * 显示提示文本 */ this.text = ''; /** * 支持上、右、下、左、上左、上右、下左、下右8个方向展示提示文本,默认展示上方提示文本 */ this.position = 'top'; /** * 提示文本背景色 */ this.bgColor = 'rgba(73, 89, 106, .7)'; /** * 提示文本水平方向X轴位移 */ this.offsetX = null; /** * 提示文本垂直方向Y轴位移 */ this.offsetY = null; /** * 是否展示提示文本指向箭头,默认展示 */ this.showArrow = true; /** * 触发方式,默认为鼠标hover */ this.trigger = 'hover'; this.withPositions = { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetX: 0, offsetY: -2 * OFFSET }; } /** * @return {?} */ NpTooltipDirective.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.initWithPositions(); /** @type {?} */ var positionStrategy = this.overlayPositionBuilder .flexibleConnectedTo(this.elementRef) .withPositions([this.withPositions]); this.overlayRef = this.overlay.create({ positionStrategy: positionStrategy, hasBackdrop: this.trigger === 'click' }); this.overlayRef.backdropClick().subscribe((/** * @param {?} res * @return {?} */ function (res) { _this.hide(); })); }; /** * @return {?} */ NpTooltipDirective.prototype.ngAfterViewInit = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var overlayElement; if (this.trigger === 'hover') { this.renderer.listen(this.elementRef.nativeElement, 'mouseenter', (/** * @return {?} */ function () { return _this.delayEnterLeave(true, true, 0.15); })); this.renderer.listen(this.elementRef.nativeElement, 'mouseleave', (/** * @return {?} */ function () { _this.delayEnterLeave(true, false, 0.1); if (_this.overlayRef && !overlayElement) { // NOTE: we bind events under "mouseleave" due to the overlayRef is only created after the overlay was completely shown up overlayElement = _this.overlayRef.overlayElement; _this.renderer.listen(overlayElement, 'mouseenter', (/** * @return {?} */ function () { return _this.delayEnterLeave(false, true); })); _this.renderer.listen(overlayElement, 'mouseleave', (/** * @return {?} */ function () { return _this.delayEnterLeave(false, false); })); } })); } else if (this.trigger === 'click') { this.renderer.listen(this.elementRef.nativeElement, 'click', (/** * @param {?} e * @return {?} */ function (e) { e.preventDefault(); _this.show(); })); } }; /** * @private * @return {?} */ NpTooltipDirective.prototype.initWithPositions = /** * @private * @return {?} */ function () { switch (this.position) { case 'top': this.withPositions = { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetX: this.offsetX === null ? 0 : this.offsetX, offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY }; break; case 'right': this.withPositions = { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: this.offsetX === null ? 2 * OFFSET : this.offsetX, offsetY: this.offsetY === null ? 0 : this.offsetY }; break; case 'bottom': this.withPositions = { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetX: this.offsetX === null ? 0 : this.offsetX, offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY }; break; case 'left': this.withPositions = { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: this.offsetX === null ? -2 * OFFSET : this.offsetX, offsetY: this.offsetY === null ? 0 : this.offsetY }; break; case 'topLeft': this.withPositions = { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetX: this.offsetX === null ? OFFSET : this.offsetX, offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY }; break; case 'topRight': this.withPositions = { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetX: this.offsetX === null ? -OFFSET : this.offsetX, offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY }; break; case 'bottomLeft': this.withPositions = { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetX: this.offsetX === null ? OFFSET : this.offsetX, offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY }; break; case 'bottomRight': this.withPositions = { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetX: this.offsetX === null ? -OFFSET : this.offsetX, offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY }; break; default: break; } if (this.position === 'top') { this.elementRef.nativeElement.classList.add('arrow-bottom'); } }; /** * @private * @return {?} */ NpTooltipDirective.prototype.buildArrow = /** * @private * @return {?} */ function () { if (!this.overlayRef || !this.overlayRef.hostElement) { return; } /** @type {?} */ var arrowPosition; switch (this.position) { case 'top': arrowPosition = 'arrow-bottom'; break; case 'right': arrowPosition = 'arrow-left'; break; case 'bottom': arrowPosition = 'arrow-top'; break; case 'left': arrowPosition = 'arrow-right'; break; case 'topLeft': arrowPosition = 'arrow-bottomRight'; break; case 'topRight': arrowPosition = 'arrow-bottomLeft'; break; case 'bottomLeft': arrowPosition = 'arrow-topRight'; break; case 'bottomRight': arrowPosition = 'arrow-topLeft'; break; default: break; } /** @type {?} */ var tooltipTag = this.overlayRef.hostElement.getElementsByTagName('np-tooltip')[0]; if (tooltipTag) { tooltipTag.classList.add(arrowPosition); } }; /** * @private * @param {?} isOrigin * @param {?} isEnter * @param {?=} delay * @return {?} */ NpTooltipDirective.prototype.delayEnterLeave = /** * @private * @param {?} isOrigin * @param {?} isEnter * @param {?=} delay * @return {?} */ function (isOrigin, isEnter, delay) { var _this = this; if (delay === void 0) { delay = -1; } if (this.delayTimer) { // Clear timer during the delay time window.clearTimeout(this.delayTimer); this.delayTimer = null; } else if (delay > 0) { this.delayTimer = window.setTimeout((/** * @return {?} */ function () { _this.delayTimer = null; isEnter ? _this.show() : _this.hide(); }), delay * 1000); } else { isEnter && isOrigin ? this.show() : this.hide(); // [Compatible] The "isOrigin" is used due to the tooltip will not hide immediately (may caused by the fade-out animation) } }; /** * @return {?} */ NpTooltipDirective.prototype.show = /** * @return {?} */ function () { if (this.overlayRef.hasAttached()) { return; } /** @type {?} */ var tooltipRef = this.overlayRef.attach(new ComponentPortal(NpTooltip)); if (this.text) { tooltipRef.instance.text = this.text; } if (this.template) { tooltipRef.instance.template = this.template; } tooltipRef.instance.bgColor = this.bgColor; if (this.showArrow) { this.buildArrow(); } }; /** * @return {?} */ NpTooltipDirective.prototype.hide = /** * @return {?} */ function () { if (this.overlayRef.hasAttached) { this.overlayRef.detach(); } }; NpTooltipDirective.decorators = [ { type: Directive, args: [{ selector: '[npTooltip]' },] } ]; /** @nocollapse */ NpTooltipDirective.ctorParameters = function () { return [ { type: Overlay }, { type: OverlayPositionBuilder }, { type: ElementRef }, { type: Renderer2 } ]; }; NpTooltipDirective.propDecorators = { text: [{ type: Input, args: ['npTooltip',] }], template: [{ type: Input }], position: [{ type: Input }], bgColor: [{ type: Input }], offsetX: [{ type: Input }], offsetY: [{ type: Input }], showArrow: [{ type: Input }], trigger: [{ type: Input }] }; return NpTooltipDirective; }()); export { NpTooltipDirective }; if (false) { /** * 显示提示文本 * @type {?} */ NpTooltipDirective.prototype.text; /** * 支持自定义模板ng-template展示提示文本 * @type {?} */ NpTooltipDirective.prototype.template; /** * 支持上、右、下、左、上左、上右、下左、下右8个方向展示提示文本,默认展示上方提示文本 * @type {?} */ NpTooltipDirective.prototype.position; /** * 提示文本背景色 * @type {?} */ NpTooltipDirective.prototype.bgColor; /** * 提示文本水平方向X轴位移 * @type {?} */ NpTooltipDirective.prototype.offsetX; /** * 提示文本垂直方向Y轴位移 * @type {?} */ NpTooltipDirective.prototype.offsetY; /** * 是否展示提示文本指向箭头,默认展示 * @type {?} */ NpTooltipDirective.prototype.showArrow; /** * 触发方式,默认为鼠标hover * @type {?} */ NpTooltipDirective.prototype.trigger; /** * @type {?} * @private */ NpTooltipDirective.prototype.overlayRef; /** * @type {?} * @private */ NpTooltipDirective.prototype.withPositions; /** * @type {?} * @private */ NpTooltipDirective.prototype.delayTimer; /** * @type {?} * @private */ NpTooltipDirective.prototype.overlay; /** * @type {?} * @private */ NpTooltipDirective.prototype.overlayPositionBuilder; /** * @type {?} * @private */ NpTooltipDirective.prototype.elementRef; /** @type {?} */ NpTooltipDirective.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsVUFBVSxFQUFnQixLQUFLLEVBQVUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SCxPQUFPLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7SUFFMUMsTUFBTSxHQUFHLENBQUM7Ozs7OztBQU9oQjtJQStCSSw0QkFBb0IsT0FBZ0IsRUFDeEIsc0JBQThDLEVBQzlDLFVBQXNCLEVBQ3ZCLFFBQW1CO1FBSFYsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUN4QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdkIsYUFBUSxHQUFSLFFBQVEsQ0FBVzs7OztRQTlCVixTQUFJLEdBQUcsRUFBRSxDQUFDOzs7O1FBSXJCLGFBQVEsR0FBc0IsS0FBSyxDQUFDOzs7O1FBRXBDLFlBQU8sR0FBVyx1QkFBdUIsQ0FBQzs7OztRQUUxQyxZQUFPLEdBQVcsSUFBSSxDQUFDOzs7O1FBRXZCLFlBQU8sR0FBVyxJQUFJLENBQUM7Ozs7UUFFdkIsY0FBUyxHQUFZLElBQUksQ0FBQzs7OztRQUUxQixZQUFPLEdBQXNCLE9BQU8sQ0FBQztRQUd0QyxrQkFBYSxHQUFRO1lBQ3pCLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsT0FBTyxFQUFFLENBQUM7WUFD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QUksQ0FBQyxTQUFTLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ3JCO0lBQ0wsQ0FBQzs7OztJQUVELGlDQUFJOzs7SUFBSjtRQUNJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM1QjtJQUNMLENBQUM7O2dCQW5QSixTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFOzs7O2dCQVg3QixPQUFPO2dCQUFFLHNCQUFzQjtnQkFETixVQUFVO2dCQUErQixTQUFTOzs7dUJBZ0IvRSxLQUFLLFNBQUMsV0FBVzsyQkFFakIsS0FBSzsyQkFFTCxLQUFLOzBCQUVMLEtBQUs7MEJBRUwsS0FBSzswQkFFTCxLQUFLOzRCQUVMLEtBQUs7MEJBRUwsS0FBSzs7SUFrT1YseUJBQUM7Q0FBQSxBQXBQRCxJQW9QQztTQW5QWSxrQkFBa0I7Ozs7OztJQUczQixrQ0FBOEI7Ozs7O0lBRTlCLHNDQUFvQzs7Ozs7SUFFcEMsc0NBQTZDOzs7OztJQUU3QyxxQ0FBbUQ7Ozs7O0lBRW5ELHFDQUFnQzs7Ozs7SUFFaEMscUNBQWdDOzs7OztJQUVoQyx1Q0FBbUM7Ozs7O0lBRW5DLHFDQUE4Qzs7Ozs7SUFFOUMsd0NBQStCOzs7OztJQUMvQiwyQ0FPRTs7Ozs7SUFDRix3Q0FBbUI7Ozs7O0lBRVAscUNBQXdCOzs7OztJQUNoQyxvREFBc0Q7Ozs7O0lBQ3RELHdDQUE4Qjs7SUFDOUIsc0NBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgUmVuZGVyZXIyLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5UG9zaXRpb25CdWlsZGVyLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgTnBUb29sdGlwIH0gZnJvbSAnLi90b29sdGlwLmNvbXBvbmVudCc7XHJcblxyXG5jb25zdCBPRkZTRVQgPSA0O1xyXG5cclxuLyoqXHJcbiogVG9vbHRpcOaPkOekuuaWh+acrFxyXG4qIFxyXG4qIDxleGFtcGxlLXVybD5odHRwczovL3N0YWNrYmxpdHouY29tL2VkaXQvbnAtdG9vbHRpcC1zYW1wbGU/ZW1iZWQ9MSZmaWxlPXNyYy9hcHAvYXBwLmNvbXBvbmVudC5odG1sPC9leGFtcGxlLXVybD5cclxuKi9cclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25wVG9vbHRpcF0nIH0pXHJcbmV4cG9ydCBjbGFzcyBOcFRvb2x0aXBEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIC8qKuaYvuekuuaPkOekuuaWh+acrCAqL1xyXG4gICAgQElucHV0KCducFRvb2x0aXAnKSB0ZXh0ID0gJyc7XHJcbiAgICAvKirmlK/mjIHoh6rlrprkuYnmqKHmnb9uZy10ZW1wbGF0ZeWxleekuuaPkOekuuaWh+acrCAqL1xyXG4gICAgQElucHV0KCkgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICAvKirmlK/mjIHkuIrjgIHlj7PjgIHkuIvjgIHlt6bjgIHkuIrlt6bjgIHkuIrlj7PjgIHkuIvlt6bjgIHkuIvlj7M45Liq5pa55ZCR5bGV56S65o+Q56S65paH5pys77yM6buY6K6k5bGV56S65LiK5pa55o+Q56S65paH5pysICovXHJcbiAgICBASW5wdXQoKSBwb3NpdGlvbjogTnBUb29sdGlwUG9zaXRpb24gPSAndG9wJztcclxuICAgIC8qKuaPkOekuuaWh+acrOiDjOaZr+iJsiAqL1xyXG4gICAgQElucHV0KCkgYmdDb2xvcjogc3RyaW5nID0gJ3JnYmEoNzMsIDg5LCAxMDYsIC43KSc7XHJcbiAgICAvKirmj5DnpLrmlofmnKzmsLTlubPmlrnlkJFY6L205L2N56e7ICovXHJcbiAgICBASW5wdXQoKSBvZmZzZXRYOiBudW1iZXIgPSBudWxsO1xyXG4gICAgLyoq5o+Q56S65paH5pys5Z6C55u05pa55ZCRWei9tOS9jeenuyAqL1xyXG4gICAgQElucHV0KCkgb2Zmc2V0WTogbnVtYmVyID0gbnVsbDtcclxuICAgIC8qKuaYr+WQpuWxleekuuaPkOekuuaWh+acrOaMh+WQkeeureWktO+8jOm7mOiupOWxleekuiAqL1xyXG4gICAgQElucHV0KCkgc2hvd0Fycm93OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8qKuinpuWPkeaWueW8j++8jOm7mOiupOS4uum8oOagh2hvdmVyICovXHJcbiAgICBASW5wdXQoKSB0cmlnZ2VyOiAnaG92ZXInIHwgJ2NsaWNrJyA9ICdob3Zlcic7XHJcblxyXG4gICAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmO1xyXG4gICAgcHJpdmF0ZSB3aXRoUG9zaXRpb25zOiBhbnkgPSB7XHJcbiAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgb3JpZ2luWTogJ3RvcCcsXHJcbiAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxyXG4gICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcclxuICAgICAgICBvZmZzZXRYOiAwLFxyXG4gICAgICAgIG9mZnNldFk6IC0yICogT0ZGU0VUXHJcbiAgICB9O1xyXG4gICAgcHJpdmF0ZSBkZWxheVRpbWVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcclxuICAgICAgICBwcml2YXRlIG92ZXJsYXlQb3NpdGlvbkJ1aWxkZXI6IE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIyKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbml0V2l0aFBvc2l0aW9ucygpO1xyXG5cclxuICAgICAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5UG9zaXRpb25CdWlsZGVyXHJcbiAgICAgICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZilcclxuICAgICAgICAgICAgLndpdGhQb3NpdGlvbnMoW3RoaXMud2l0aFBvc2l0aW9uc10pO1xyXG5cclxuICAgICAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHsgcG9zaXRpb25TdHJhdGVneSwgaGFzQmFja2Ryb3A6IHRoaXMudHJpZ2dlciA9PT0gJ2NsaWNrJyB9KTtcclxuICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgbGV0IG92ZXJsYXlFbGVtZW50O1xyXG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdob3ZlcicpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy5kZWxheUVudGVyTGVhdmUodHJ1ZSwgdHJ1ZSwgMC4xNSkpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNlbGVhdmUnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGF5RW50ZXJMZWF2ZSh0cnVlLCBmYWxzZSwgMC4xKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYgJiYgIW92ZXJsYXlFbGVtZW50KSB7IC8vIE5PVEU6IHdlIGJpbmQgZXZlbnRzIHVuZGVyIFwibW91c2VsZWF2ZVwiIGR1ZSB0byB0aGUgb3ZlcmxheVJlZiBpcyBvbmx5IGNyZWF0ZWQgYWZ0ZXIgdGhlIG92ZXJsYXkgd2FzIGNvbXBsZXRlbHkgc2hvd24gdXBcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5RWxlbWVudCA9IHRoaXMub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihvdmVybGF5RWxlbWVudCwgJ21vdXNlZW50ZXInLCAoKSA9PiB0aGlzLmRlbGF5RW50ZXJMZWF2ZShmYWxzZSwgdHJ1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKG92ZXJsYXlFbGVtZW50LCAnbW91c2VsZWF2ZScsICgpID0+IHRoaXMuZGVsYXlFbnRlckxlYXZlKGZhbHNlLCBmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2NsaWNrJykge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0V2l0aFBvc2l0aW9ucygpIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMucG9zaXRpb24pIHtcclxuICAgICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IDAgOiB0aGlzLm9mZnNldFgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogdGhpcy5vZmZzZXRZID09PSBudWxsID8gLTIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53aXRoUG9zaXRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRYOiB0aGlzLm9mZnNldFggPT09IG51bGwgPyAyICogT0ZGU0VUIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IDAgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IDAgOiB0aGlzLm9mZnNldFgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogdGhpcy5vZmZzZXRZID09PSBudWxsID8gMiAqIE9GRlNFVCA6IHRoaXMub2Zmc2V0WVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gLTIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogdGhpcy5vZmZzZXRZID09PSBudWxsID8gMCA6IHRoaXMub2Zmc2V0WVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd0b3BMZWZ0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gT0ZGU0VUIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IC0yICogT0ZGU0VUIDogdGhpcy5vZmZzZXRZXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3RvcFJpZ2h0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gLU9GRlNFVCA6IHRoaXMub2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiB0aGlzLm9mZnNldFkgPT09IG51bGwgPyAtMiAqIE9GRlNFVCA6IHRoaXMub2Zmc2V0WVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdib3R0b21MZWZ0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gT0ZGU0VUIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IDIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYm90dG9tUmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53aXRoUG9zaXRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRYOiB0aGlzLm9mZnNldFggPT09IG51bGwgPyAtT0ZGU0VUIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IDIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT09ICd0b3AnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Fycm93LWJvdHRvbScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ1aWxkQXJyb3coKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm92ZXJsYXlSZWYgfHwgIXRoaXMub3ZlcmxheVJlZi5ob3N0RWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgYXJyb3dQb3NpdGlvbjogc3RyaW5nO1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5wb3NpdGlvbikge1xyXG4gICAgICAgICAgICBjYXNlICd0b3AnOlxyXG4gICAgICAgICAgICAgICAgYXJyb3dQb3NpdGlvbiA9ICdhcnJvdy1ib3R0b20nXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgYXJyb3dQb3NpdGlvbiA9ICdhcnJvdy1sZWZ0J1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgICAgICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2Fycm93LXRvcCdcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctcmlnaHQnXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAndG9wTGVmdCc6XHJcbiAgICAgICAgICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2Fycm93LWJvdHRvbVJpZ2h0J1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3RvcFJpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctYm90dG9tTGVmdCdcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdib3R0b21MZWZ0JzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctdG9wUmlnaHQnXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYm90dG9tUmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgYXJyb3dQb3NpdGlvbiA9ICdhcnJvdy10b3BMZWZ0J1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0b29sdGlwVGFnID0gdGhpcy5vdmVybGF5UmVmLmhvc3RFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCducC10b29sdGlwJylbMF07XHJcbiAgICAgICAgaWYgKHRvb2x0aXBUYWcpIHtcclxuICAgICAgICAgICAgdG9vbHRpcFRhZy5jbGFzc0xpc3QuYWRkKGFycm93UG9zaXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlbGF5RW50ZXJMZWF2ZShpc09yaWdpbjogYm9vbGVhbiwgaXNFbnRlcjogYm9vbGVhbiwgZGVsYXk6IG51bWJlciA9IC0xKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVsYXlUaW1lcikgeyAvLyBDbGVhciB0aW1lciBkdXJpbmcgdGhlIGRlbGF5IHRpbWVcclxuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmRlbGF5VGltZXIgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGVsYXkgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVsYXlUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVsYXlUaW1lciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpc0VudGVyID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfSwgZGVsYXkgKiAxMDAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpc0VudGVyICYmIGlzT3JpZ2luID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTsgLy8gW0NvbXBhdGlibGVdIFRoZSBcImlzT3JpZ2luXCIgaXMgdXNlZCBkdWUgdG8gdGhlIHRvb2x0aXAgd2lsbCBub3QgaGlkZSBpbW1lZGlhdGVseSAobWF5IGNhdXNlZCBieSB0aGUgZmFkZS1vdXQgYW5pbWF0aW9uKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93KCkge1xyXG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0b29sdGlwUmVmOiBDb21wb25lbnRSZWY8TnBUb29sdGlwPlxyXG4gICAgICAgICAgICA9IHRoaXMub3ZlcmxheVJlZi5hdHRhY2gobmV3IENvbXBvbmVudFBvcnRhbChOcFRvb2x0aXApKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudGV4dCkge1xyXG4gICAgICAgICAgICB0b29sdGlwUmVmLmluc3RhbmNlLnRleHQgPSB0aGlzLnRleHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0b29sdGlwUmVmLmluc3RhbmNlLnRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRvb2x0aXBSZWYuaW5zdGFuY2UuYmdDb2xvciA9IHRoaXMuYmdDb2xvcjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0Fycm93KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnVpbGRBcnJvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYuaGFzQXR0YWNoZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTnBUb29sdGlwUG9zaXRpb24gPSAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICd0b3BMZWZ0JyB8ICd0b3BSaWdodCcgfCAnYm90dG9tTGVmdCcgfCAnYm90dG9tUmlnaHQnOyJdfQ==