UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

261 lines 19.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { ComponentFactoryResolver, Directive, ElementRef, Inject, Input, } from '@angular/core'; import { takeWhile } from 'rxjs/operators'; import { createContainer, NbAdjustment, NbOverlayService, NbPosition, NbPositionBuilderService, NbTrigger, NbTriggerStrategyBuilder, patch, } from '../cdk'; import { NB_DOCUMENT } from '../../theme.options'; import { NbTooltipComponent } from './tooltip.component'; /* * * Tooltip directive for small text/icon hints. * * ### Installation * * Import `NbTooltipModule` to your feature module. * ```ts * @NgModule({ * imports: [ * // ... * NbTooltipModule, * ], * }) * export class PageModule { } * ``` * ### Usage * * @stacked-example(Showcase, tooltip/tooltip-showcase.component) * * Tooltip can accept a hint text and/or an icon: * @stacked-example(With Icon, tooltip/tooltip-with-icon.component) * * Same way as Popover, tooltip can accept placement position with `nbTooltipPlacement` proprety: * @stacked-example(Placements, tooltip/tooltip-placements.component) * * It is also possible to specify tooltip color using `nbTooltipStatus` property: * @stacked-example(Colored Tooltips, tooltip/tooltip-colors.component) * */ export class NbTooltipDirective { /** * @param {?} document * @param {?} hostRef * @param {?} positionBuilder * @param {?} overlay * @param {?} componentFactoryResolver */ constructor(document, hostRef, positionBuilder, overlay, componentFactoryResolver) { this.document = document; this.hostRef = hostRef; this.positionBuilder = positionBuilder; this.overlay = overlay; this.componentFactoryResolver = componentFactoryResolver; this.context = {}; /* * Position will be calculated relatively host element based on the position. * Can be top, right, bottom, left, start or end. */ this.position = NbPosition.TOP; /* * Container position will be changes automatically based on this strategy if container can't fit view port. * Set this property to any falsy value if you want to disable automatically adjustment. * Available values: clockwise, counterclockwise. */ this.adjustment = NbAdjustment.CLOCKWISE; this.alive = true; } /* * * @param {string} icon */ /** * @param {?} icon * @return {?} */ set icon(icon) { this.context = Object.assign(this.context, { icon }); } /* * * @param {string} status */ /** * @param {?} status * @return {?} */ set status(status) { this.context = Object.assign(this.context, { status }); } /** * @return {?} */ ngAfterViewInit() { this.positionStrategy = this.createPositionStrategy(); this.ref = this.overlay.create({ positionStrategy: this.positionStrategy, scrollStrategy: this.overlay.scrollStrategies.reposition(), }); this.triggerStrategy = this.createTriggerStrategy(); this.subscribeOnTriggers(); this.subscribeOnPositionChange(); } /** * @return {?} */ ngOnDestroy() { this.alive = false; } /** * @return {?} */ show() { this.container = createContainer(this.ref, NbTooltipComponent, { position: this.position, content: this.content, context: this.context, cfr: this.componentFactoryResolver, }, this.componentFactoryResolver); } /** * @return {?} */ hide() { this.ref.detach(); } /** * @return {?} */ toggle() { if (this.ref && this.ref.hasAttached()) { this.hide(); } else { this.show(); } } /** * @protected * @return {?} */ createPositionStrategy() { return this.positionBuilder .connectedTo(this.hostRef) .position(this.position) .adjustment(this.adjustment) .offset(8); } /** * @protected * @return {?} */ createTriggerStrategy() { return new NbTriggerStrategyBuilder() .document(this.document) .trigger(NbTrigger.HINT) .host(this.hostRef.nativeElement) .container(() => this.container) .build(); } /** * @protected * @return {?} */ subscribeOnPositionChange() { this.positionStrategy.positionChange .pipe(takeWhile(() => this.alive)) .subscribe((position) => patch(this.container, { position })); } /** * @protected * @return {?} */ subscribeOnTriggers() { this.triggerStrategy.show$.pipe(takeWhile(() => this.alive)).subscribe(() => this.show()); this.triggerStrategy.hide$.pipe(takeWhile(() => this.alive)).subscribe(() => this.hide()); } } NbTooltipDirective.decorators = [ { type: Directive, args: [{ selector: '[nbTooltip]' },] } ]; /** @nocollapse */ NbTooltipDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] }, { type: ElementRef }, { type: NbPositionBuilderService }, { type: NbOverlayService }, { type: ComponentFactoryResolver } ]; NbTooltipDirective.propDecorators = { content: [{ type: Input, args: ['nbTooltip',] }], position: [{ type: Input, args: ['nbTooltipPlacement',] }], adjustment: [{ type: Input, args: ['nbTooltipAdjustment',] }], icon: [{ type: Input, args: ['nbTooltipIcon',] }], status: [{ type: Input, args: ['nbTooltipStatus',] }] }; if (false) { /** @type {?} */ NbTooltipDirective.prototype.context; /** @type {?} */ NbTooltipDirective.prototype.content; /** @type {?} */ NbTooltipDirective.prototype.position; /** @type {?} */ NbTooltipDirective.prototype.adjustment; /** * @type {?} * @protected */ NbTooltipDirective.prototype.ref; /** * @type {?} * @protected */ NbTooltipDirective.prototype.container; /** * @type {?} * @protected */ NbTooltipDirective.prototype.positionStrategy; /** * @type {?} * @protected */ NbTooltipDirective.prototype.triggerStrategy; /** * @type {?} * @protected */ NbTooltipDirective.prototype.alive; /** * @type {?} * @protected */ NbTooltipDirective.prototype.document; /** * @type {?} * @private */ NbTooltipDirective.prototype.hostRef; /** * @type {?} * @private */ NbTooltipDirective.prototype.positionBuilder; /** * @type {?} * @private */ NbTooltipDirective.prototype.overlay; /** * @type {?} * @private */ NbTooltipDirective.prototype.componentFactoryResolver; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFFTCx3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQ0wsZUFBZSxFQUVmLFlBQVksRUFFWixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLHdCQUF3QixFQUN4QixTQUFTLEVBRVQsd0JBQXdCLEVBQ3hCLEtBQUssR0FDTixNQUFNLFFBQVEsQ0FBQztBQUNoQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQ3pELE1BQU0sT0FBTyxrQkFBa0I7Ozs7Ozs7O0lBaUQ3QixZQUEyQyxRQUFRLEVBQy9CLE9BQW1CLEVBQ25CLGVBQXlDLEVBQ3pDLE9BQXlCLEVBQ3pCLHdCQUFrRDtRQUozQixhQUFRLEdBQVIsUUFBUSxDQUFBO1FBQy9CLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsb0JBQWUsR0FBZixlQUFlLENBQTBCO1FBQ3pDLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQ3pCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFuRHRFLFlBQU8sR0FBVyxFQUFFLENBQUM7Ozs7O1FBY3JCLGFBQVEsR0FBZSxVQUFVLENBQUMsR0FBRyxDQUFDOzs7Ozs7UUFPdEMsZUFBVSxHQUFpQixZQUFZLENBQUMsU0FBUyxDQUFDO1FBd0J4QyxVQUFLLEdBQVksSUFBSSxDQUFD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Q29weXJpZ2h0IEFrdmVvLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgY3JlYXRlQ29udGFpbmVyLFxyXG4gIE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgTmJBZGp1c3RtZW50LFxyXG4gIE5iT3ZlcmxheVJlZixcclxuICBOYk92ZXJsYXlTZXJ2aWNlLFxyXG4gIE5iUG9zaXRpb24sXHJcbiAgTmJQb3NpdGlvbkJ1aWxkZXJTZXJ2aWNlLFxyXG4gIE5iVHJpZ2dlcixcclxuICBOYlRyaWdnZXJTdHJhdGVneSxcclxuICBOYlRyaWdnZXJTdHJhdGVneUJ1aWxkZXIsXHJcbiAgcGF0Y2gsXHJcbn0gZnJvbSAnLi4vY2RrJztcclxuaW1wb3J0IHsgTkJfRE9DVU1FTlQgfSBmcm9tICcuLi8uLi90aGVtZS5vcHRpb25zJztcclxuaW1wb3J0IHsgTmJUb29sdGlwQ29tcG9uZW50IH0gZnJvbSAnLi90b29sdGlwLmNvbXBvbmVudCc7XHJcblxyXG4vKlxyXG4gKlxyXG4gKiBUb29sdGlwIGRpcmVjdGl2ZSBmb3Igc21hbGwgdGV4dC9pY29uIGhpbnRzLlxyXG4gKlxyXG4gKiAjIyMgSW5zdGFsbGF0aW9uXHJcbiAqXHJcbiAqIEltcG9ydCBgTmJUb29sdGlwTW9kdWxlYCB0byB5b3VyIGZlYXR1cmUgbW9kdWxlLlxyXG4gKiBgYGB0c1xyXG4gKiBATmdNb2R1bGUoe1xyXG4gKiAgIGltcG9ydHM6IFtcclxuICogICBcdC8vIC4uLlxyXG4gKiAgICAgTmJUb29sdGlwTW9kdWxlLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBQYWdlTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2hvd2Nhc2UsIHRvb2x0aXAvdG9vbHRpcC1zaG93Y2FzZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqIFRvb2x0aXAgY2FuIGFjY2VwdCBhIGhpbnQgdGV4dCBhbmQvb3IgYW4gaWNvbjpcclxuICogQHN0YWNrZWQtZXhhbXBsZShXaXRoIEljb24sIHRvb2x0aXAvdG9vbHRpcC13aXRoLWljb24uY29tcG9uZW50KVxyXG4gKlxyXG4gKiBTYW1lIHdheSBhcyBQb3BvdmVyLCB0b29sdGlwIGNhbiBhY2NlcHQgcGxhY2VtZW50IHBvc2l0aW9uIHdpdGggYG5iVG9vbHRpcFBsYWNlbWVudGAgcHJvcHJldHk6XHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoUGxhY2VtZW50cywgdG9vbHRpcC90b29sdGlwLXBsYWNlbWVudHMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgdG9vbHRpcCBjb2xvciB1c2luZyBgbmJUb29sdGlwU3RhdHVzYCBwcm9wZXJ0eTpcclxuICogQHN0YWNrZWQtZXhhbXBsZShDb2xvcmVkIFRvb2x0aXBzLCB0b29sdGlwL3Rvb2x0aXAtY29sb3JzLmNvbXBvbmVudClcclxuICpcclxuICovXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuYlRvb2x0aXBdJyB9KVxyXG5leHBvcnQgY2xhc3MgTmJUb29sdGlwRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgY29udGV4dDogT2JqZWN0ID0ge307XHJcblxyXG4gIC8qXHJcbiAgICogUG9wb3ZlciBjb250ZW50IHdoaWNoIHdpbGwgYmUgcmVuZGVyZWQgaW4gTmJUb29sdGlwQ29tcG9uZW50LlxyXG4gICAqIEF2YWlsYWJsZSBjb250ZW50OiB0ZW1wbGF0ZSByZWYsIGNvbXBvbmVudCBhbmQgYW55IHByaW1pdGl2ZS5cclxuICAgKlxyXG4gICAqL1xyXG4gIEBJbnB1dCgnbmJUb29sdGlwJylcclxuICBjb250ZW50OiBzdHJpbmc7XHJcbiAgLypcclxuICAgKiBQb3NpdGlvbiB3aWxsIGJlIGNhbGN1bGF0ZWQgcmVsYXRpdmVseSBob3N0IGVsZW1lbnQgYmFzZWQgb24gdGhlIHBvc2l0aW9uLlxyXG4gICAqIENhbiBiZSB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHN0YXJ0IG9yIGVuZC5cclxuICAgKi9cclxuICBASW5wdXQoJ25iVG9vbHRpcFBsYWNlbWVudCcpXHJcbiAgcG9zaXRpb246IE5iUG9zaXRpb24gPSBOYlBvc2l0aW9uLlRPUDtcclxuICAvKlxyXG4gICAqIENvbnRhaW5lciBwb3NpdGlvbiB3aWxsIGJlIGNoYW5nZXMgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGlzIHN0cmF0ZWd5IGlmIGNvbnRhaW5lciBjYW4ndCBmaXQgdmlldyBwb3J0LlxyXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGFueSBmYWxzeSB2YWx1ZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGF1dG9tYXRpY2FsbHkgYWRqdXN0bWVudC5cclxuICAgKiBBdmFpbGFibGUgdmFsdWVzOiBjbG9ja3dpc2UsIGNvdW50ZXJjbG9ja3dpc2UuXHJcbiAgICovXHJcbiAgQElucHV0KCduYlRvb2x0aXBBZGp1c3RtZW50JylcclxuICBhZGp1c3RtZW50OiBOYkFkanVzdG1lbnQgPSBOYkFkanVzdG1lbnQuQ0xPQ0tXSVNFO1xyXG5cclxuICAvKlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGljb25cclxuICAgKi9cclxuICBASW5wdXQoJ25iVG9vbHRpcEljb24nKVxyXG4gIHNldCBpY29uKGljb246IHN0cmluZykge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gT2JqZWN0LmFzc2lnbih0aGlzLmNvbnRleHQsIHsgaWNvbiB9KTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdHVzXHJcbiAgICovXHJcbiAgQElucHV0KCduYlRvb2x0aXBTdGF0dXMnKVxyXG4gIHNldCBzdGF0dXMoc3RhdHVzOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IE9iamVjdC5hc3NpZ24odGhpcy5jb250ZXh0LCB7IHN0YXR1cyB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWY6IE5iT3ZlcmxheVJlZjtcclxuICBwcm90ZWN0ZWQgY29udGFpbmVyOiBDb21wb25lbnRSZWY8YW55PjtcclxuICBwcm90ZWN0ZWQgcG9zaXRpb25TdHJhdGVneTogTmJBZGp1c3RhYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTtcclxuICBwcm90ZWN0ZWQgdHJpZ2dlclN0cmF0ZWd5OiBOYlRyaWdnZXJTdHJhdGVneTtcclxuICBwcm90ZWN0ZWQgYWxpdmU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE5CX0RPQ1VNRU5UKSBwcm90ZWN0ZWQgZG9jdW1lbnQsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBob3N0UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcG9zaXRpb25CdWlsZGVyOiBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBvdmVybGF5OiBOYk92ZXJsYXlTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMucG9zaXRpb25TdHJhdGVneSA9IHRoaXMuY3JlYXRlUG9zaXRpb25TdHJhdGVneSgpO1xyXG4gICAgdGhpcy5yZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcclxuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5wb3NpdGlvblN0cmF0ZWd5LFxyXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRyaWdnZXJTdHJhdGVneSA9IHRoaXMuY3JlYXRlVHJpZ2dlclN0cmF0ZWd5KCk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpYmVPblRyaWdnZXJzKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZU9uUG9zaXRpb25DaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY3JlYXRlQ29udGFpbmVyKHRoaXMucmVmLCBOYlRvb2x0aXBDb21wb25lbnQsIHtcclxuICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXHJcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCxcclxuICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0LFxyXG4gICAgICBjZnI6IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgfSwgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMucmVmLmRldGFjaCgpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCkge1xyXG4gICAgaWYgKHRoaXMucmVmICYmIHRoaXMucmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCk6IE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xyXG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb25CdWlsZGVyXHJcbiAgICAgIC5jb25uZWN0ZWRUbyh0aGlzLmhvc3RSZWYpXHJcbiAgICAgIC5wb3NpdGlvbih0aGlzLnBvc2l0aW9uKVxyXG4gICAgICAuYWRqdXN0bWVudCh0aGlzLmFkanVzdG1lbnQpXHJcbiAgICAgIC5vZmZzZXQoOCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlVHJpZ2dlclN0cmF0ZWd5KCk6IE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuICAgIHJldHVybiBuZXcgTmJUcmlnZ2VyU3RyYXRlZ3lCdWlsZGVyKClcclxuICAgICAgLmRvY3VtZW50KHRoaXMuZG9jdW1lbnQpXHJcbiAgICAgIC50cmlnZ2VyKE5iVHJpZ2dlci5ISU5UKVxyXG4gICAgICAuaG9zdCh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudClcclxuICAgICAgLmNvbnRhaW5lcigoKSA9PiB0aGlzLmNvbnRhaW5lcilcclxuICAgICAgLmJ1aWxkKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3Vic2NyaWJlT25Qb3NpdGlvbkNoYW5nZSgpIHtcclxuICAgIHRoaXMucG9zaXRpb25TdHJhdGVneS5wb3NpdGlvbkNoYW5nZVxyXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHBvc2l0aW9uOiBOYlBvc2l0aW9uKSA9PiBwYXRjaCh0aGlzLmNvbnRhaW5lciwgeyBwb3NpdGlvbiB9KSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3Vic2NyaWJlT25UcmlnZ2VycygpIHtcclxuICAgIHRoaXMudHJpZ2dlclN0cmF0ZWd5LnNob3ckLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zaG93KCkpO1xyXG4gICAgdGhpcy50cmlnZ2VyU3RyYXRlZ3kuaGlkZSQucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhpZGUoKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==