UNPKG

@greg-md/ng-elevator

Version:

Make a container to elevate on the screen while scrolling with Angular.

189 lines (188 loc) 20.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Component, Input, HostBinding, HostListener, ElementRef, Renderer2, ChangeDetectionStrategy, ViewChildren, QueryList, Inject, PLATFORM_ID } from '@angular/core'; import { isPlatformBrowser } from '@angular/common'; import { offset } from './elevator.utils'; export class ElevatorComponent { /** * @param {?} elementRef * @param {?} renderer * @param {?} platformId */ constructor(elementRef, renderer, platformId) { this.elementRef = elementRef; this.renderer = renderer; this.platformId = platformId; this.lastPosition = 0; this.marginTop = 0; this.marginBottom = 0; } /** * @return {?} */ ngAfterViewInit() { this.initImagesLoad(); setTimeout(() => this.reloadPositions(true)); } /** * @return {?} */ windowScroll() { this.reloadPositions(); } /** * @return {?} */ windowResize() { this.reloadPositions(true); } /** * @return {?} */ initImagesLoad() { this.images.forEach(img => { const /** @type {?} */ loadUnload = this.renderer.listen(img, 'load', () => { this.reloadPositions(true); loadUnload(); }); }); } /** * @param {?=} keepPositions * @return {?} */ reloadPositions(keepPositions = false) { if (!isPlatformBrowser(this.platformId)) { return; } this.reloadYPositions(keepPositions); } /** * @param {?=} keepPositions * @return {?} */ reloadYPositions(keepPositions = false) { const /** @type {?} */ styles = getComputedStyle(this.elementRef.nativeElement); const /** @type {?} */ elevatorMarginTop = parseFloat(styles.marginTop); const /** @type {?} */ elevatorMarginBottom = parseFloat(styles.marginBottom); const /** @type {?} */ elevatorHeight = this.elementRef.nativeElement.offsetHeight + elevatorMarginTop + elevatorMarginBottom; if (elevatorHeight >= this.elementRef.nativeElement.parentNode.clientHeight) { this.setPosition(); return; } const /** @type {?} */ isScrollDown = window.scrollY > this.lastPosition; this.lastPosition = window.scrollY; const /** @type {?} */ elevatorDiff = (window.innerHeight - (elevatorHeight + this.marginTop + this.marginBottom)); const /** @type {?} */ hostPosition = this.elementRef.nativeElement.parentNode.getBoundingClientRect(); const /** @type {?} */ hostTop = (hostPosition.top * -1) + this.marginTop; const /** @type {?} */ hostBottom = (hostPosition.bottom - window.innerHeight) + this.marginBottom; const /** @type {?} */ elevatorPosition = this.elementRef.nativeElement.getBoundingClientRect(); const /** @type {?} */ elevatorTop = (elevatorPosition.top * -1) + elevatorMarginTop + this.marginTop; const /** @type {?} */ elevatorBottom = (elevatorPosition.bottom - window.innerHeight) + elevatorMarginBottom + this.marginBottom; const /** @type {?} */ elevatorWidth = parseFloat(this.elementRef.nativeElement.parentNode.clientWidth) - parseFloat(styles.marginLeft) - parseFloat(styles.marginRight); if (elevatorDiff >= 0 ? hostTop <= 0 : elevatorBottom > 0 && (!this.cssPosition || hostTop <= 0)) { this.setPosition(); } else { if (elevatorDiff >= 0) { if (hostBottom + elevatorDiff <= 0) { this.setPosition('absolute', null, 0, elevatorWidth); } else { this.setPosition('fixed', this.marginTop, null, elevatorWidth); } } else { this.setPosition('absolute', offset(this.elementRef.nativeElement).top - offset(this.elementRef.nativeElement.parentNode).top - elevatorMarginTop, null, elevatorWidth); if (isScrollDown || keepPositions) { if (hostBottom <= 0) { this.setPosition('absolute', null, 0, elevatorWidth); } else if (elevatorBottom <= 0) { this.setPosition('fixed', null, this.marginBottom); } } else { if (elevatorTop <= 0) { this.setPosition('fixed', this.marginTop, null, elevatorWidth); } } } } } /** * @return {?} */ prepareAbsolutePositions() { const /** @type {?} */ styles = getComputedStyle(this.elementRef.nativeElement); const /** @type {?} */ elevatorMarginTop = parseFloat(styles.marginTop); this.setPosition('absolute', offset(this.elementRef.nativeElement).top - offset(this.elementRef.nativeElement.parentNode).top - elevatorMarginTop); } /** * @param {?=} position * @param {?=} top * @param {?=} bottom * @param {?=} width * @return {?} */ setPosition(position = null, top = null, bottom = null, width = null) { this.cssPosition = position; this.cssTop = top; this.cssBottom = bottom; this.cssWidth = width; } } ElevatorComponent.decorators = [ { type: Component, args: [{ selector: 'greg-elevator', template: '<ng-content></ng-content>', styles: [':host { display: block; }'], changeDetection: ChangeDetectionStrategy.OnPush, },] }, ]; /** @nocollapse */ ElevatorComponent.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] } ]; ElevatorComponent.propDecorators = { marginTop: [{ type: Input }], marginBottom: [{ type: Input }], cssPosition: [{ type: HostBinding, args: ['style.position',] }], cssTop: [{ type: HostBinding, args: ['style.top.px',] }], cssBottom: [{ type: HostBinding, args: ['style.bottom.px',] }], cssWidth: [{ type: HostBinding, args: ['style.width.px',] }], images: [{ type: ViewChildren, args: ['img',] }], windowScroll: [{ type: HostListener, args: ['window:scroll',] }], windowResize: [{ type: HostListener, args: ['window:resize',] }] }; function ElevatorComponent_tsickle_Closure_declarations() { /** @type {?} */ ElevatorComponent.prototype.lastPosition; /** @type {?} */ ElevatorComponent.prototype.marginTop; /** @type {?} */ ElevatorComponent.prototype.marginBottom; /** @type {?} */ ElevatorComponent.prototype.cssPosition; /** @type {?} */ ElevatorComponent.prototype.cssTop; /** @type {?} */ ElevatorComponent.prototype.cssBottom; /** @type {?} */ ElevatorComponent.prototype.cssWidth; /** @type {?} */ ElevatorComponent.prototype.images; /** @type {?} */ ElevatorComponent.prototype.elementRef; /** @type {?} */ ElevatorComponent.prototype.renderer; /** @type {?} */ ElevatorComponent.prototype.platformId; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxldmF0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdyZWctbWQvbmctZWxldmF0b3IvIiwic291cmNlcyI6WyJsaWIvZWxldmF0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFVBQVUsRUFFVixTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLFlBQVksRUFDWixTQUFTLEVBQ1QsTUFBTSxFQUNOLFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFRMUMsTUFBTTs7Ozs7O0lBZ0JKLFlBQ1UsWUFDQSxVQUNxQixVQUFrQjtRQUZ2QyxlQUFVLEdBQVYsVUFBVTtRQUNWLGFBQVEsR0FBUixRQUFRO1FBQ2EsZUFBVSxHQUFWLFVBQVUsQ0FBUTs0QkFsQmxDLENBQUM7eUJBRUssQ0FBQzs0QkFDRSxDQUFDO0tBaUJ4Qjs7OztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUM5Qzs7OztJQUdELFlBQVk7UUFDVixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7S0FDeEI7Ozs7SUFHRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM1Qjs7OztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN4Qix1QkFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxH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VUFBVTtZQUVWLFNBQVM7eUNBb0NOLE1BQU0sU0FBQyxXQUFXOzs7d0JBaEJwQixLQUFLOzJCQUNMLEtBQUs7MEJBRUwsV0FBVyxTQUFDLGdCQUFnQjtxQkFFNUIsV0FBVyxTQUFDLGNBQWM7d0JBRTFCLFdBQVcsU0FBQyxpQkFBaUI7dUJBRTdCLFdBQVcsU0FBQyxnQkFBZ0I7cUJBRTVCLFlBQVksU0FBQyxLQUFLOzJCQWVsQixZQUFZLFNBQUMsZUFBZTsyQkFLNUIsWUFBWSxTQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBFbGVtZW50UmVmLFxuICBBZnRlclZpZXdJbml0LFxuICBSZW5kZXJlcjIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBWaWV3Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgSW5qZWN0LFxuICBQTEFURk9STV9JRFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgb2Zmc2V0IH0gZnJvbSAnLi9lbGV2YXRvci51dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dyZWctZWxldmF0b3InLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRWxldmF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgbGFzdFBvc2l0aW9uID0gMDtcblxuICBASW5wdXQoKSBtYXJnaW5Ub3AgPSAwO1xuICBASW5wdXQoKSBtYXJnaW5Cb3R0b20gPSAwO1xuXG4gIEBIb3N0QmluZGluZygnc3R5bGUucG9zaXRpb24nKSBjc3NQb3NpdGlvbjogc3RyaW5nO1xuXG4gIEBIb3N0QmluZGluZygnc3R5bGUudG9wLnB4JykgY3NzVG9wOiBudW1iZXI7XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5ib3R0b20ucHgnKSBjc3NCb3R0b206IG51bWJlcjtcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoLnB4JykgY3NzV2lkdGg6IG51bWJlcjtcblxuICBAVmlld0NoaWxkcmVuKCdpbWcnKSBpbWFnZXM6IFF1ZXJ5TGlzdDxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBzdHJpbmdcbiAgKSB7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5pbml0SW1hZ2VzTG9hZCgpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlbG9hZFBvc2l0aW9ucyh0cnVlKSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJylcbiAgd2luZG93U2Nyb2xsKCkge1xuICAgIHRoaXMucmVsb2FkUG9zaXRpb25zKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgd2luZG93UmVzaXplKCkge1xuICAgIHRoaXMucmVsb2FkUG9zaXRpb25zKHRydWUpO1xuICB9XG5cbiAgaW5pdEltYWdlc0xvYWQoKSB7XG4gICAgdGhpcy5pbWFnZXMuZm9yRWFjaChpbWcgPT4ge1xuICAgICAgY29uc3QgbG9hZFVubG9hZCA9IHRoaXMucmVuZGVyZXIubGlzdGVuKGltZywgJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkUG9zaXRpb25zKHRydWUpO1xuXG4gICAgICAgIGxvYWRVbmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkUG9zaXRpb25zKGtlZXBQb3NpdGlvbnMgPSBmYWxzZSkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVsb2FkWVBvc2l0aW9ucyhrZWVwUG9zaXRpb25zKTtcbiAgfVxuXG4gIHJlbG9hZFlQb3NpdGlvbnMoa2VlcFBvc2l0aW9ucyA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICBjb25zdCBlbGV2YXRvck1hcmdpblRvcCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCk7XG4gICAgY29uc3QgZWxldmF0b3JNYXJnaW5Cb3R0b20gPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5Cb3R0b20pO1xuXG4gICAgY29uc3QgZWxldmF0b3JIZWlnaHQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKyBlbGV2YXRvck1hcmdpblRvcCArIGVsZXZhdG9yTWFyZ2luQm90dG9tO1xuXG4gICAgaWYgKGVsZXZhdG9ySGVpZ2h0ID49IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGUuY2xpZW50SGVpZ2h0KSB7XG4gICAgICB0aGlzLnNldFBvc2l0aW9uKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1Njcm9sbERvd24gPSB3aW5kb3cuc2Nyb2xsWSA+IHRoaXMubGFzdFBvc2l0aW9uO1xuXG4gICAgdGhpcy5sYXN0UG9zaXRpb24gPSB3aW5kb3cuc2Nyb2xsWTtcblxuICAgIGNvbnN0IGVsZXZhdG9yRGlmZiA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgLSAoZWxldmF0b3JIZWlnaHQgKyB0aGlzLm1hcmdpblRvcCArIHRoaXMubWFyZ2luQm90dG9tKSk7XG5cbiAgICBjb25zdCBob3N0UG9zaXRpb24gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgaG9zdFRvcCA9IChob3N0UG9zaXRpb24udG9wICogLTEpICsgdGhpcy5tYXJnaW5Ub3A7XG5cbiAgICBjb25zdCBob3N0Qm90dG9tID0gKGhvc3RQb3NpdGlvbi5ib3R0b20gLSB3aW5kb3cuaW5uZXJIZWlnaHQpICsgdGhpcy5tYXJnaW5Cb3R0b207XG5cbiAgICBjb25zdCBlbGV2YXRvclBvc2l0aW9uID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBlbGV2YXRvclRvcCA9IChlbGV2YXRvclBvc2l0aW9uLnRvcCAqIC0xKSArIGVsZXZhdG9yTWFyZ2luVG9wICsgdGhpcy5tYXJnaW5Ub3A7XG5cbiAgICBjb25zdCBlbGV2YXRvckJvdHRvbSA9IChlbGV2YXRvclBvc2l0aW9uLmJvdHRvbSAtIHdpbmRvdy5pbm5lckhlaWdodCkgKyBlbGV2YXRvck1hcmdpbkJvdHRvbSArIHRoaXMubWFyZ2luQm90dG9tO1xuXG4gICAgY29uc3QgZWxldmF0b3JXaWR0aCA9IHBhcnNlRmxvYXQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZS5jbGllbnRXaWR0aClcbiAgICAgIC0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luTGVmdClcbiAgICAgIC0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luUmlnaHQpO1xuXG4gICAgaWYgKGVsZXZhdG9yRGlmZiA+PSAwID8gaG9zdFRvcCA8PSAwIDogZWxldmF0b3JCb3R0b20gPiAwICYmICghdGhpcy5jc3NQb3NpdGlvbiB8fCBob3N0VG9wIDw9IDApKSB7XG4gICAgICB0aGlzLnNldFBvc2l0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbGV2YXRvckRpZmYgPj0gMCkge1xuICAgICAgICBpZiAoaG9zdEJvdHRvbSArIGVsZXZhdG9yRGlmZiA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbignYWJzb2x1dGUnLCBudWxsLCAwLCBlbGV2YXRvcldpZHRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKCdmaXhlZCcsIHRoaXMubWFyZ2luVG9wLCBudWxsLCBlbGV2YXRvcldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihcbiAgICAgICAgICAnYWJzb2x1dGUnLFxuICAgICAgICAgIG9mZnNldCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkudG9wIC0gb2Zmc2V0KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGUpLnRvcCAtIGVsZXZhdG9yTWFyZ2luVG9wLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgZWxldmF0b3JXaWR0aFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChpc1Njcm9sbERvd24gfHwga2VlcFBvc2l0aW9ucykge1xuICAgICAgICAgIGlmIChob3N0Qm90dG9tIDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oJ2Fic29sdXRlJywgbnVsbCwgMCwgZWxldmF0b3JXaWR0aCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbGV2YXRvckJvdHRvbSA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKCdmaXhlZCcsIG51bGwsIHRoaXMubWFyZ2luQm90dG9tKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGVsZXZhdG9yVG9wIDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oJ2ZpeGVkJywgdGhpcy5tYXJnaW5Ub3AsIG51bGwsIGVsZXZhdG9yV2lkdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVBYnNvbHV0ZVBvc2l0aW9ucygpIHtcbiAgICBjb25zdCBzdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgIGNvbnN0IGVsZXZhdG9yTWFyZ2luVG9wID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luVG9wKTtcblxuICAgIHRoaXMuc2V0UG9zaXRpb24oXG4gICAgICAnYWJzb2x1dGUnLFxuICAgICAgb2Zmc2V0KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS50b3AgLSBvZmZzZXQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZSkudG9wIC0gZWxldmF0b3JNYXJnaW5Ub3BcbiAgICApO1xuICB9XG5cbiAgc2V0UG9zaXRpb24ocG9zaXRpb246IHN0cmluZyA9IG51bGwsIHRvcDogbnVtYmVyID0gbnVsbCwgYm90dG9tOiBudW1iZXIgPSBudWxsLCB3aWR0aDogbnVtYmVyID0gbnVsbCkge1xuICAgIHRoaXMuY3NzUG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICB0aGlzLmNzc1RvcCA9IHRvcDtcbiAgICB0aGlzLmNzc0JvdHRvbSA9IGJvdHRvbTtcbiAgICB0aGlzLmNzc1dpZHRoID0gd2lkdGg7XG4gIH1cbn1cbiJdfQ==