UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

630 lines 63.9 kB
import { __decorate, __extends, __metadata, __param } from "tslib"; import { Directive, ElementRef, HostListener, Input, NgModule, ChangeDetectorRef, OnInit, Output, EventEmitter, Optional, HostBinding, Inject } from '@angular/core'; import { useAnimation } from '@angular/animations'; import { scaleInCenter } from '../../animations/scale/index'; import { fadeOut } from '../../animations/fade/index'; import { IgxOverlayService } from '../../services/overlay/overlay'; import { HorizontalAlignment, AutoPositionStrategy } from '../../services'; import { CommonModule } from '@angular/common'; import { IgxNavigationService } from '../../core/navigation'; import { IgxToggleDirective, IgxToggleActionDirective } from '../toggle/toggle.directive'; /** * **Ignite UI for Angular Tooltip Target** - * [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/tooltip.html) * * The Ignite UI for Angular Tooltip Target directive is used to mark an HTML element in the markup as one that has a tooltip. * The tooltip target is used in combination with the Ignite UI for Angular Tooltip by assigning the exported tooltip reference to the * target's selector property. * * Example: * ```html * <button [igxTooltipTarget]="tooltipRef">Hover me</button> * <span #tooltipRef="tooltip" igxTooltip>Hello there, I am a tooltip!</span> * ``` */ var IgxTooltipTargetDirective = /** @class */ (function (_super) { __extends(IgxTooltipTargetDirective, _super); function IgxTooltipTargetDirective(_element, _navigationService) { var _this = _super.call(this, _element, _navigationService) || this; _this._element = _element; _this._navigationService = _navigationService; /** * Gets/sets the amount of milliseconds that should pass before showing the tooltip. * * ```typescript * // get * let tooltipShowDelay = this.tooltipTarget.showDelay; * ``` * * ```html * <!--set--> * <button [igxTooltipTarget]="tooltipRef" showDelay="1500">Hover me</button> * <span #tooltipRef="tooltip" igxTooltip>Hello there, I am a tooltip!</span> * ``` */ _this.showDelay = 500; /** * Gets/sets the amount of milliseconds that should pass before hiding the tooltip. * * ```typescript * // get * let tooltipHideDelay = this.tooltipTarget.hideDelay; * ``` * * ```html * <!--set--> * <button [igxTooltipTarget]="tooltipRef" hideDelay="1500">Hover me</button> * <span #tooltipRef="tooltip" igxTooltip>Hello there, I am a tooltip!</span> * ``` */ _this.hideDelay = 500; /** * Specifies if the tooltip should not show when hovering its target with the mouse. (defaults to false) * While setting this property to 'true' will disable the user interactions that shows/hides the tooltip, * the developer will still be able to show/hide the tooltip through the API. * * ```typescript * // get * let tooltipDisabledValue = this.tooltipTarget.tooltipDisabled; * ``` * * ```html * <!--set--> * <button [igxTooltipTarget]="tooltipRef" [tooltipDisabled]="true">Hover me</button> * <span #tooltipRef="tooltip" igxTooltip>Hello there, I am a tooltip!</span> * ``` */ _this.tooltipDisabled = false; /** * Emits an event when the tooltip that is associated with this target starts showing. * This event is fired before the start of the countdown to showing the tooltip. * * ```typescript * tooltipShowing(args: ITooltipShowEventArgs) { * alert("Tooltip started showing!"); * } * ``` * * ```html * <button [igxTooltipTarget]="tooltipRef" * (onTooltipShow)='tooltipShowing($event)'>Hover me</button> * <span #tooltipRef="tooltip" igxTooltip>Hello there, I am a tooltip!</span> * ``` */ _this.onTooltipShow = new EventEmitter(); /** * Emits an event when the tooltip that is associated with this target starts hiding. * This event is fired before the start of the countdown to hiding the tooltip. * * ```typescript * tooltipHiding(args: ITooltipHideEventArgs) { * alert("Tooltip started hiding!"); * } * ``` * * ```html * <button [igxTooltipTarget]="tooltipRef" * (onTooltipHide)='tooltipHiding($event)'>Hover me</button> * <span #tooltipRef="tooltip" igxTooltip>Hello there, I am a tooltip!</span> * ``` */ _this.onTooltipHide = new EventEmitter(); return _this; } Object.defineProperty(IgxTooltipTargetDirective.prototype, "target", { /** * @hidden */ get: function () { if (typeof this._target === 'string') { return this._navigationService.get(this._target); } return this._target; }, /** * @hidden */ set: function (target) { if (target !== null && target !== '') { this._target = target; } }, enumerable: true, configurable: true }); Object.defineProperty(IgxTooltipTargetDirective.prototype, "nativeElement", { /** * Gets the respective native element of the directive. * * ```typescript * let tooltipTargetElement = this.tooltipTarget.nativeElement; * ``` */ get: function () { return this._element.nativeElement; }, enumerable: true, configurable: true }); Object.defineProperty(IgxTooltipTargetDirective.prototype, "tooltipHidden", { /** * Indicates if the tooltip that is is associated with this target is currently hidden. * * ```typescript * let tooltipHiddenValue = this.tooltipTarget.tooltipHidden; * ``` */ get: function () { return !this.target || this.target.collapsed; }, enumerable: true, configurable: true }); /** * @hidden */ IgxTooltipTargetDirective.prototype.ngOnInit = function () { _super.prototype.ngOnInit.call(this); var positionSettings = { target: this.nativeElement, horizontalDirection: HorizontalAlignment.Center, horizontalStartPoint: HorizontalAlignment.Center, openAnimation: useAnimation(scaleInCenter, { params: { duration: '150ms' } }), closeAnimation: useAnimation(fadeOut, { params: { duration: '75ms' } }) }; this._overlayDefaults.positionStrategy = new AutoPositionStrategy(positionSettings); this._overlayDefaults.closeOnOutsideClick = false; }; IgxTooltipTargetDirective.prototype.checkOutletAndOutsideClick = function () { if (this.outlet) { this._overlayDefaults.outlet = this.outlet; } }; Object.defineProperty(IgxTooltipTargetDirective.prototype, "mergedOverlaySettings", { get: function () { return Object.assign({}, this._overlayDefaults, this.overlaySettings); }, enumerable: true, configurable: true }); // Return true if the execution in onMouseEnter should be terminated after this method IgxTooltipTargetDirective.prototype.preMouseEnterCheck = function () { // If tooltip is about to be opened if (this.target.toBeShown) { clearTimeout(this.target.timeoutId); this.target.toBeShown = false; } // If Tooltip is opened or about to be hidden if (!this.target.collapsed || this.target.toBeHidden) { clearTimeout(this.target.timeoutId); var hidingArgs = { target: this, tooltip: this.target, cancel: false }; this.onTooltipHide.emit(hidingArgs); if (hidingArgs.cancel) { return true; } // if close animation has started finish it, or close the tooltip with no animation this.target.forceClose(this.mergedOverlaySettings); this.target.toBeHidden = false; } return false; }; // Return true if the execution in onMouseLeave should be terminated after this method IgxTooltipTargetDirective.prototype.preMouseLeaveCheck = function () { clearTimeout(this.target.timeoutId); // If tooltip is about to be opened if (this.target.toBeShown) { this.target.toBeShown = false; this.target.toBeHidden = false; return true; } return false; }; /** * @hidden */ IgxTooltipTargetDirective.prototype.onKeydownEscape = function (event) { var hidingArgs = { target: this, tooltip: this.target, cancel: false }; this.onTooltipHide.emit(hidingArgs); if (hidingArgs.cancel) { return; } this.target.toBeHidden = true; this.target.close(); this.target.toBeHidden = false; }; /** * @hidden */ IgxTooltipTargetDirective.prototype.onClick = function () { if (!this.target.collapsed) { var hidingArgs = { target: this, tooltip: this.target, cancel: false }; this.onTooltipHide.emit(hidingArgs); if (hidingArgs.cancel) { return; } this.target.forceClose(this.mergedOverlaySettings); } }; /** * @hidden */ IgxTooltipTargetDirective.prototype.onMouseEnter = function () { var _this = this; if (this.tooltipDisabled) { return; } this.checkOutletAndOutsideClick(); var shouldReturn = this.preMouseEnterCheck(); if (shouldReturn) { return; } var showingArgs = { target: this, tooltip: this.target, cancel: false }; this.onTooltipShow.emit(showingArgs); if (showingArgs.cancel) { return; } this.target.toBeShown = true; this.target.timeoutId = setTimeout(function () { _this.target.open(_this.mergedOverlaySettings); // Call open() of IgxTooltipDirective _this.target.toBeShown = false; }, this.showDelay); }; /** * @hidden */ IgxTooltipTargetDirective.prototype.onMouseLeave = function () { var _this = this; if (this.tooltipDisabled) { return; } this.checkOutletAndOutsideClick(); var shouldReturn = this.preMouseLeaveCheck(); if (shouldReturn || this.target.collapsed) { return; } var hidingArgs = { target: this, tooltip: this.target, cancel: false }; this.onTooltipHide.emit(hidingArgs); if (hidingArgs.cancel) { return; } this.target.toBeHidden = true; this.target.timeoutId = setTimeout(function () { _this.target.close(); // Call close() of IgxTooltipDirective _this.target.toBeHidden = false; }, this.hideDelay); }; /** * @hidden */ IgxTooltipTargetDirective.prototype.onTouchStart = function (event) { if (this.tooltipDisabled) { return; } this.showTooltip(); }; /** * @hidden */ IgxTooltipTargetDirective.prototype.onDocumentTouchStart = function (event) { if (this.tooltipDisabled) { return; } if (this.nativeElement !== event.target && !this.nativeElement.contains(event.target)) { this.hideTooltip(); } }; /** * Shows the tooltip by respecting the 'showDelay' property. * * ```typescript * this.tooltipTarget.showTooltip(); * ``` */ IgxTooltipTargetDirective.prototype.showTooltip = function () { var _this = this; clearTimeout(this.target.timeoutId); if (!this.target.collapsed) { var hidingArgs = { target: this, tooltip: this.target, cancel: false }; this.onTooltipHide.emit(hidingArgs); if (hidingArgs.cancel) { return; } // if close animation has started finish it, or close the tooltip with no animation this.target.forceClose(this.mergedOverlaySettings); this.target.toBeHidden = false; } var showingArgs = { target: this, tooltip: this.target, cancel: false }; this.onTooltipShow.emit(showingArgs); if (showingArgs.cancel) { return; } this.target.toBeShown = true; this.target.timeoutId = setTimeout(function () { _this.target.open(_this.mergedOverlaySettings); // Call open() of IgxTooltipDirective _this.target.toBeShown = false; }, this.showDelay); }; /** * Hides the tooltip by respecting the 'hideDelay' property. * * ```typescript * this.tooltipTarget.hideTooltip(); * ``` */ IgxTooltipTargetDirective.prototype.hideTooltip = function () { var _this = this; if (this.target.collapsed && this.target.toBeShown) { clearTimeout(this.target.timeoutId); } if (this.target.collapsed || this.target.toBeHidden) { return; } var hidingArgs = { target: this, tooltip: this.target, cancel: false }; this.onTooltipHide.emit(hidingArgs); if (hidingArgs.cancel) { return; } this.target.toBeHidden = true; this.target.timeoutId = setTimeout(function () { _this.target.close(); // Call close() of IgxTooltipDirective _this.target.toBeHidden = false; }, this.hideDelay); }; IgxTooltipTargetDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: IgxNavigationService, decorators: [{ type: Optional }] } ]; }; __decorate([ Input('showDelay'), __metadata("design:type", Object) ], IgxTooltipTargetDirective.prototype, "showDelay", void 0); __decorate([ Input('hideDelay'), __metadata("design:type", Object) ], IgxTooltipTargetDirective.prototype, "hideDelay", void 0); __decorate([ Input('tooltipDisabled'), __metadata("design:type", Object) ], IgxTooltipTargetDirective.prototype, "tooltipDisabled", void 0); __decorate([ Input('igxTooltipTarget'), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxTooltipTargetDirective.prototype, "target", null); __decorate([ Output(), __metadata("design:type", Object) ], IgxTooltipTargetDirective.prototype, "onTooltipShow", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxTooltipTargetDirective.prototype, "onTooltipHide", void 0); __decorate([ HostListener('document:keydown.escape', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxTooltipTargetDirective.prototype, "onKeydownEscape", null); __decorate([ HostListener('click'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxTooltipTargetDirective.prototype, "onClick", null); __decorate([ HostListener('mouseenter'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxTooltipTargetDirective.prototype, "onMouseEnter", null); __decorate([ HostListener('mouseleave'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxTooltipTargetDirective.prototype, "onMouseLeave", null); __decorate([ HostListener('touchstart', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxTooltipTargetDirective.prototype, "onTouchStart", null); __decorate([ HostListener('document:touchstart', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxTooltipTargetDirective.prototype, "onDocumentTouchStart", null); IgxTooltipTargetDirective = __decorate([ Directive({ exportAs: 'tooltipTarget', selector: '[igxTooltipTarget]' }), __param(1, Optional()), __metadata("design:paramtypes", [ElementRef, IgxNavigationService]) ], IgxTooltipTargetDirective); return IgxTooltipTargetDirective; }(IgxToggleActionDirective)); export { IgxTooltipTargetDirective }; var NEXT_ID = 0; /** * **Ignite UI for Angular Tooltip** - * [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/tooltip.html) * * The Ignite UI for Angular Tooltip directive is used to mark an HTML element in the markup as one that should behave as a tooltip. * The tooltip is used in combination with the Ignite UI for Angular Tooltip Target by assigning the exported tooltip reference to the * respective target's selector property. * * Example: * ```html * <button [igxTooltipTarget]="tooltipRef">Hover me</button> * <span #tooltipRef="tooltip" igxTooltip>Hello there, I am a tooltip!</span> * ``` */ var IgxTooltipDirective = /** @class */ (function (_super) { __extends(IgxTooltipDirective, _super); /** @hidden */ function IgxTooltipDirective(elementRef, cdr, overlayService, navigationService) { var _this = // D.P. constructor duplication due to es6 compilation, might be obsolete in the future _super.call(this, elementRef, cdr, overlayService, navigationService) || this; /** * @hidden * Returns whether close time out has started */ _this.toBeHidden = false; /** * @hidden * Returns whether open time out has started */ _this.toBeShown = false; /** * Identifier for the tooltip. * If this is property is not explicitly set, it will be automatically generated. * * ```typescript * let tooltipId = this.tooltip.id; * ``` */ _this.id = "igx-tooltip-" + NEXT_ID++; return _this; } Object.defineProperty(IgxTooltipDirective.prototype, "hiddenClass", { /** * @hidden */ get: function () { return this.collapsed; }, enumerable: true, configurable: true }); Object.defineProperty(IgxTooltipDirective.prototype, "defaultClass", { /** * @hidden */ get: function () { return !this.collapsed; }, enumerable: true, configurable: true }); Object.defineProperty(IgxTooltipDirective.prototype, "role", { /** * Get the role attribute of the tooltip. * * ```typescript * let tooltipRole = this.tooltip.role; * ``` */ get: function () { return 'tooltip'; }, enumerable: true, configurable: true }); /** * If there is open animation in progress this method will finish is. * If there is no open animation in progress this method will open the toggle with no animation. * @param overlaySettings setting to use for opening the toggle */ IgxTooltipDirective.prototype.forceOpen = function (overlaySettings) { var info = this.overlayService.getOverlayById(this._overlayId); var hasOpenAnimation = info ? info.openAnimationPlayer : false; if (hasOpenAnimation) { info.openAnimationPlayer.finish(); info.openAnimationPlayer.reset(); info.openAnimationPlayer = null; } else if (this.collapsed) { var animation = overlaySettings.positionStrategy.settings.openAnimation; overlaySettings.positionStrategy.settings.openAnimation = null; this.open(overlaySettings); overlaySettings.positionStrategy.settings.openAnimation = animation; } }; /** * If there is close animation in progress this method will finish is. * If there is no close animation in progress this method will close the toggle with no animation. * @param overlaySettings settings to use for closing the toggle */ IgxTooltipDirective.prototype.forceClose = function (overlaySettings) { var info = this.overlayService.getOverlayById(this._overlayId); var hasCloseAnimation = info ? info.closeAnimationPlayer : false; if (hasCloseAnimation) { info.closeAnimationPlayer.finish(); info.closeAnimationPlayer.reset(); info.closeAnimationPlayer = null; } else if (!this.collapsed) { var animation = overlaySettings.positionStrategy.settings.closeAnimation; overlaySettings.positionStrategy.settings.closeAnimation = null; this.close(); overlaySettings.positionStrategy.settings.closeAnimation = animation; } }; IgxTooltipDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: ChangeDetectorRef }, { type: IgxOverlayService, decorators: [{ type: Inject, args: [IgxOverlayService,] }] }, { type: IgxNavigationService, decorators: [{ type: Optional }] } ]; }; __decorate([ HostBinding('class.igx-tooltip--hidden'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxTooltipDirective.prototype, "hiddenClass", null); __decorate([ HostBinding('class.igx-tooltip--desktop'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxTooltipDirective.prototype, "defaultClass", null); __decorate([ Input('context'), __metadata("design:type", Object) ], IgxTooltipDirective.prototype, "context", void 0); __decorate([ HostBinding('attr.id'), Input(), __metadata("design:type", Object) ], IgxTooltipDirective.prototype, "id", void 0); __decorate([ HostBinding('attr.role'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxTooltipDirective.prototype, "role", null); IgxTooltipDirective = __decorate([ Directive({ exportAs: 'tooltip', selector: '[igxTooltip]' }), __param(2, Inject(IgxOverlayService)), __param(3, Optional()), __metadata("design:paramtypes", [ElementRef, ChangeDetectorRef, IgxOverlayService, IgxNavigationService]) ], IgxTooltipDirective); return IgxTooltipDirective; }(IgxToggleDirective)); export { IgxTooltipDirective }; /** * @hidden */ var IgxTooltipModule = /** @class */ (function () { function IgxTooltipModule() { } IgxTooltipModule = __decorate([ NgModule({ declarations: [IgxTooltipDirective, IgxTooltipTargetDirective], exports: [IgxTooltipDirective, IgxTooltipTargetDirective], imports: [CommonModule], providers: [IgxOverlayService] }) ], IgxTooltipModule); return IgxTooltipModule; }()); export { IgxTooltipModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUMvRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUN0RCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQXFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBYzFGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFLSDtJQUErQyw2Q0FBd0I7SUFzSW5FLG1DQUFvQixRQUFvQixFQUNoQixrQkFBd0M7UUFEaEUsWUFFSSxrQkFBTSxRQUFRLEVBQUUsa0JBQWtCLENBQUMsU0FDdEM7UUFIbUIsY0FBUSxHQUFSLFFBQVEsQ0FBWTtRQUNoQix3QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO1FBdEloRTs7Ozs7Ozs7Ozs7OztXQWFHO1FBRUks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QUFDO1lBQzlELE9BQU8sRUFBRSxDQUFDLG1CQUFtQixFQUFFLHlCQUF5QixDQUFDO1lBQ3pELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN2QixTQUFTLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztTQUNqQyxDQUFDO09BQ1csZ0JBQWdCLENBQUk7SUFBRCx1QkFBQztDQUFBLEFBQWpDLElBQWlDO1NBQXBCLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBOZ01vZHVsZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uSW5pdCxcbiAgICBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT3B0aW9uYWwsIEhvc3RCaW5kaW5nLCBJbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB1c2VBbmltYXRpb24gfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IHNjYWxlSW5DZW50ZXIgfSBmcm9tICcuLi8uLi9hbmltYXRpb25zL3NjYWxlL2luZGV4JztcbmltcG9ydCB7IGZhZGVPdXQgfSBmcm9tICcuLi8uLi9hbmltYXRpb25zL2ZhZGUvaW5kZXgnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L292ZXJsYXknO1xuaW1wb3J0IHsgSG9yaXpvbnRhbEFsaWdubWVudCwgQXV0b1Bvc2l0aW9uU3RyYXRlZ3ksIFBvc2l0aW9uU2V0dGluZ3MsIE92ZXJsYXlTZXR0aW5ncyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJZ3hOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvbmF2aWdhdGlvbic7XG5pbXBvcnQgeyBJZ3hUb2dnbGVEaXJlY3RpdmUsIElneFRvZ2dsZUFjdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IElCYXNlRXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRvb2x0aXBTaG93RXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VFdmVudEFyZ3Mge1xuICAgIHRhcmdldDogSWd4VG9vbHRpcFRhcmdldERpcmVjdGl2ZTtcbiAgICB0b29sdGlwOiBJZ3hUb29sdGlwRGlyZWN0aXZlO1xuICAgIGNhbmNlbDogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVRvb2x0aXBIaWRlRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VFdmVudEFyZ3Mge1xuICAgIHRhcmdldDogSWd4VG9vbHRpcFRhcmdldERpcmVjdGl2ZTtcbiAgICB0b29sdGlwOiBJZ3hUb29sdGlwRGlyZWN0aXZlO1xuICAgIGNhbmNlbDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBUb29sdGlwIFRhcmdldCoqIC1cbiAqIFtEb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5pbmZyYWdpc3RpY3MuY29tL3Byb2R1Y3RzL2lnbml0ZS11aS1hbmd1bGFyL2FuZ3VsYXIvY29tcG9uZW50cy90b29sdGlwLmh0bWwpXG4gKlxuICogVGhlIElnbml0ZSBVSSBmb3IgQW5ndWxhciBUb29sdGlwIFRhcmdldCBkaXJlY3RpdmUgaXMgdXNlZCB0byBtYXJrIGFuIEhUTUwgZWxlbWVudCBpbiB0aGUgbWFya3VwIGFzIG9uZSB0aGF0IGhhcyBhIHRvb2x0aXAuXG4gKiBUaGUgdG9vbHRpcCB0YXJnZXQgaXMgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBJZ25pdGUgVUkgZm9yIEFuZ3VsYXIgVG9vbHRpcCBieSBhc3NpZ25pbmcgdGhlIGV4cG9ydGVkIHRvb2x0aXAgcmVmZXJlbmNlIHRvIHRoZVxuICogdGFyZ2V0J3Mgc2VsZWN0b3IgcHJvcGVydHkuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYGh0bWxcbiAqIDxidXR0b24gW2lneFRvb2x0aXBUYXJnZXRdPVwidG9vbHRpcFJlZlwiPkhvdmVyIG1lPC9idXR0b24+XG4gKiA8c3BhbiAjdG9vbHRpcFJlZj1cInRvb2x0aXBcIiBpZ3hUb29sdGlwPkhlbGxvIHRoZXJlLCBJIGFtIGEgdG9vbHRpcCE8L3NwYW4+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgZXhwb3J0QXM6ICd0b29sdGlwVGFyZ2V0JyxcbiAgICBzZWxlY3RvcjogJ1tpZ3hUb29sdGlwVGFyZ2V0XSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4VG9vbHRpcFRhcmdldERpcmVjdGl2ZSBleHRlbmRzIElneFRvZ2dsZUFjdGlvbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICogR2V0cy9zZXRzIHRoZSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRoYXQgc2hvdWxkIHBhc3MgYmVmb3JlIHNob3dpbmcgdGhlIHRvb2x0aXAuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IHRvb2x0aXBTaG93RGVsYXkgPSB0aGlzLnRvb2x0aXBUYXJnZXQuc2hvd0RlbGF5O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8YnV0dG9uIFtpZ3hUb29sdGlwVGFyZ2V0XT1cInRvb2x0aXBSZWZcIiBzaG93RGVsYXk9XCIxNTAwXCI+SG92ZXIgbWU8L2J1dHRvbj5cbiAgICAgKiA8c3BhbiAjdG9vbHRpcFJlZj1cInRvb2x0aXBcIiBpZ3hUb29sdGlwPkhlbGxvIHRoZXJlLCBJIGFtIGEgdG9vbHRpcCE8L3NwYW4+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCdzaG93RGVsYXknKVxuICAgIHB1YmxpYyBzaG93RGVsYXkgPSA1MDA7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL3NldHMgdGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdGhhdCBzaG91bGQgcGFzcyBiZWZvcmUgaGlkaW5nIHRoZSB0b29sdGlwLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCB0b29sdGlwSGlkZURlbGF5ID0gdGhpcy50b29sdGlwVGFyZ2V0LmhpZGVEZWxheTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGJ1dHRvbiBbaWd4VG9vbHRpcFRhcmdldF09XCJ0b29sdGlwUmVmXCIgaGlkZURlbGF5PVwiMTUwMFwiPkhvdmVyIG1lPC9idXR0b24+XG4gICAgICogPHNwYW4gI3Rvb2x0aXBSZWY9XCJ0b29sdGlwXCIgaWd4VG9vbHRpcD5IZWxsbyB0aGVyZSwgSSBhbSBhIHRvb2x0aXAhPC9zcGFuPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgnaGlkZURlbGF5JylcbiAgICBwdWJsaWMgaGlkZURlbGF5ID0gNTAwO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGlmIHRoZSB0b29sdGlwIHNob3VsZCBub3Qgc2hvdyB3aGVuIGhvdmVyaW5nIGl0cyB0YXJnZXQgd2l0aCB0aGUgbW91c2UuIChkZWZhdWx0cyB0byBmYWxzZSlcbiAgICAgKiBXaGlsZSBzZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gJ3RydWUnIHdpbGwgZGlzYWJsZSB0aGUgdXNlciBpbnRlcmFjdGlvbnMgdGhhdCBzaG93cy9oaWRlcyB0aGUgdG9vbHRpcCxcbiAgICAgKiB0aGUgZGV2ZWxvcGVyIHdpbGwgc3RpbGwgYmUgYWJsZSB0byBzaG93L2hpZGUgdGhlIHRvb2x0aXAgdGhyb3VnaCB0aGUgQVBJLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCB0b29sdGlwRGlzYWJsZWRWYWx1ZSA9IHRoaXMudG9vbHRpcFRhcmdldC50b29sdGlwRGlzYWJsZWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxidXR0b24gW2lneFRvb2x0aXBUYXJnZXRdPVwidG9vbHRpcFJlZlwiIFt0b29sdGlwRGlzYWJsZWRdPVwidHJ1ZVwiPkhvdmVyIG1lPC9idXR0b24+XG4gICAgICogPHNwYW4gI3Rvb2x0aXBSZWY9XCJ0b29sdGlwXCIgaWd4VG9vbHRpcD5IZWxsbyB0aGVyZSwgSSBhbSBhIHRvb2x0aXAhPC9zcGFuPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgndG9vbHRpcERpc2FibGVkJylcbiAgICBwdWJsaWMgdG9vbHRpcERpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQElucHV0KCdpZ3hUb29sdGlwVGFyZ2V0JylcbiAgICBzZXQgdGFyZ2V0KHRhcmdldDogYW55KSB7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCB0YXJnZXQoKTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl90YXJnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblNlcnZpY2UuZ2V0KHRoaXMuX3RhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByZXNwZWN0aXZlIG5hdGl2ZSBlbGVtZW50IG9mIHRoZSBkaXJlY3RpdmUuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRvb2x0aXBUYXJnZXRFbGVtZW50ID0gdGhpcy50b29sdGlwVGFyZ2V0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgdG9vbHRpcCB0aGF0IGlzIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhcmdldCBpcyBjdXJyZW50bHkgaGlkZGVuLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB0b29sdGlwSGlkZGVuVmFsdWUgPSB0aGlzLnRvb2x0aXBUYXJnZXQudG9vbHRpcEhpZGRlbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvb2x0aXBIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy50YXJnZXQgfHwgdGhpcy50YXJnZXQuY29sbGFwc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIHRvb2x0aXAgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXJnZXQgc3RhcnRzIHNob3dpbmcuXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBjb3VudGRvd24gdG8gc2hvd2luZyB0aGUgdG9vbHRpcC5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0b29sdGlwU2hvd2luZyhhcmdzOiBJVG9vbHRpcFNob3dFdmVudEFyZ3MpIHtcbiAgICAgKiAgICBhbGVydChcIlRvb2x0aXAgc3RhcnRlZCBzaG93aW5nIVwiKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGJ1dHRvbiBbaWd4VG9vbHRpcFRhcmdldF09XCJ0b29sdGlwUmVmXCJcbiAgICAgKiAgICAgICAgIChvblRvb2x0aXBTaG93KT0ndG9vbHRpcFNob3dpbmcoJGV2ZW50KSc+SG92ZXIgbWU8L2J1dHRvbj5cbiAgICAgKiA8c3BhbiAjdG9vbHRpcFJlZj1cInRvb2x0aXBcIiBpZ3hUb29sdGlwPkhlbGxvIHRoZXJlLCBJIGFtIGEgdG9vbHRpcCE8L3NwYW4+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uVG9vbHRpcFNob3cgPSBuZXcgRXZlbnRFbWl0dGVyPElUb29sdGlwU2hvd0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIHRvb2x0aXAgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXJnZXQgc3RhcnRzIGhpZGluZy5cbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGNvdW50ZG93biB0byBoaWRpbmcgdGhlIHRvb2x0aXAuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdG9vbHRpcEhpZGluZyhhcmdzOiBJVG9vbHRpcEhpZGVFdmVudEFyZ3MpIHtcbiAgICAgKiAgICBhbGVydChcIlRvb2x0aXAgc3RhcnRlZCBoaWRpbmchXCIpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8YnV0dG9uIFtpZ3hUb29sdGlwVGFyZ2V0XT1cInRvb2x0aXBSZWZcIlxuICAgICAqICAgICAgICAgKG9uVG9vbHRpcEhpZGUpPSd0b29sdGlwSGlkaW5nKCRldmVudCknPkhvdmVyIG1lPC9idXR0b24+XG4gICAgICogPHNwYW4gI3Rvb2x0aXBSZWY9XCJ0b29sdGlwXCIgaWd4VG9vbHRpcD5IZWxsbyB0aGVyZSwgSSBhbSBhIHRvb2x0aXAhPC9zcGFuPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblRvb2x0aXBIaWRlID0gbmV3IEV2ZW50RW1pdHRlcjxJVG9vbHRpcEhpZGVFdmVudEFyZ3M+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9uYXZpZ2F0aW9uU2VydmljZTogSWd4TmF2aWdhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoX2VsZW1lbnQsIF9uYXZpZ2F0aW9uU2VydmljZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgICAgICBjb25zdCBwb3NpdGlvblNldHRpbmdzOiBQb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICBob3Jpem9udGFsRGlyZWN0aW9uOiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgICAgIG9wZW5BbmltYXRpb246IHVzZUFuaW1hdGlvbihzY2FsZUluQ2VudGVyLCB7IHBhcmFtczogeyBkdXJhdGlvbjogJzE1MG1zJyB9IH0pLFxuICAgICAgICAgICAgY2xvc2VBbmltYXRpb246IHVzZUFuaW1hdGlvbihmYWRlT3V0LCB7IHBhcmFtczogeyBkdXJhdGlvbjogJzc1bXMnIH0gfSlcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5RGVmYXVsdHMucG9zaXRpb25TdHJhdGVneSA9IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneShwb3NpdGlvblNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fb3ZlcmxheURlZmF1bHRzLmNsb3NlT25PdXRzaWRlQ2xpY2sgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrT3V0bGV0QW5kT3V0c2lkZUNsaWNrKCkge1xuICAgICAgICBpZiAodGhpcy5vdXRsZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlEZWZhdWx0cy5vdXRsZXQgPSB0aGlzLm91dGxldDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IG1lcmdlZE92ZXJsYXlTZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX292ZXJsYXlEZWZhdWx0cywgdGhpcy5vdmVybGF5U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBleGVjdXRpb24gaW4gb25Nb3VzZUVudGVyIHNob3VsZCBiZSB0ZXJtaW5hdGVkIGFmdGVyIHRoaXMgbWV0aG9kXG4gICAgcHJpdmF0ZSBwcmVNb3VzZUVudGVyQ2hlY2soKSB7XG4gICAgICAgIC8vIElmIHRvb2x0aXAgaXMgYWJvdXQgdG8gYmUgb3BlbmVkXG4gICAgICAgIGlmICh0aGlzLnRhcmdldC50b0JlU2hvd24pIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRhcmdldC50aW1lb3V0SWQpO1xuICAgICAgICAgICAgdGhpcy50YXJnZXQudG9CZVNob3duID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBUb29sdGlwIGlzIG9wZW5lZCBvciBhYm91dCB0byBiZSBoaWRkZW5cbiAgICAgICAgaWYgKCF0aGlzLnRhcmdldC5jb2xsYXBzZWQgfHwgdGhpcy50YXJnZXQudG9CZUhpZGRlbikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGFyZ2V0LnRpbWVvdXRJZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGhpZGluZ0FyZ3MgPSB7IHRhcmdldDogdGhpcywgdG9vbHRpcDogdGhpcy50YXJnZXQsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgICAgIHRoaXMub25Ub29sdGlwSGlkZS5lbWl0KGhpZGluZ0FyZ3MpO1xuXG4gICAgICAgICAgICBpZiAoaGlkaW5nQXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gIGlmIGNsb3NlIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCBmaW5pc2ggaXQsIG9yIGNsb3NlIHRoZSB0b29sdGlwIHdpdGggbm8gYW5pbWF0aW9uXG4gICAgICAgICAgICB0aGlzLnRhcmdldC5mb3JjZUNsb3NlKHRoaXMubWVyZ2VkT3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LnRvQmVIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhlY3V0aW9uIGluIG9uTW91c2VMZWF2ZSBzaG91bGQgYmUgdGVybWluYXRlZCBhZnRlciB0aGlzIG1ldGhvZFxuICAgIHByaXZhdGUgcHJlTW91c2VMZWF2ZUNoZWNrKCk6IGJvb2xlYW4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50YXJnZXQudGltZW91dElkKTtcblxuICAgICAgICAvLyBJZiB0b29sdGlwIGlzIGFib3V0IHRvIGJlIG9wZW5lZFxuICAgICA