@ngx-performance-ui/ui
Version:
Ngx Performance UI - UI
235 lines • 18.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { ApplicationRef, ComponentFactoryResolver, Directive, ElementRef, Injector, Input, ReflectiveInjector, Renderer2, ViewContainerRef, } from '@angular/core';
import { Select, Store, Actions, ofActionDispatched } from '@ngxs/store';
import { Observable, Subject } from 'rxjs';
import { filter } from 'rxjs/operators';
import { TooltipComponent } from '../components';
import { createProjectableNode } from '../utils';
import { EventListenerRemove, EventListenerAdd, EventListenerScrollVertical, takeUntilDestroy, takeUntilNotNull, EventListenerState, } from '@ngx-performance-ui/core';
export class TooltipDirective {
/**
* @param {?} actions
* @param {?} appRef
* @param {?} elRef
* @param {?} injector
* @param {?} renderer
* @param {?} resolver
* @param {?} vcRef
* @param {?} store
*/
constructor(actions, appRef, elRef, injector, renderer, resolver, vcRef, store) {
this.actions = actions;
this.appRef = appRef;
this.elRef = elRef;
this.injector = injector;
this.renderer = renderer;
this.resolver = resolver;
this.vcRef = vcRef;
this.store = store;
this.context = {};
this.placement = 'top';
this.trigger = 'mousemove';
this.destroy$ = new Subject();
}
/**
* @return {?}
*/
get containerRect() {
return ((/** @type {?} */ (((/** @type {?} */ (this.tooltip.location.nativeElement))).childNodes[0]))).getBoundingClientRect();
}
/**
* @return {?}
*/
ngOnInit() {
(this.trigger === 'mousemove' ? this.mousemove$ : this.click$)
.pipe(takeUntilDestroy(this), filter((/**
* @param {?} event
* @return {?}
*/
event => !!event)))
.subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
/** @type {?} */
let onMouseContainerOver = false;
if (this.tooltip) {
this.tooltip.hostView.detectChanges();
const { top, bottom, left, right } = this.containerRect;
const { x, y } = event;
onMouseContainerOver = top < y && bottom > y && left < x && right > x;
}
if (!this.tooltip && this.elRef.nativeElement.contains(event.target)) {
this.show();
}
else if (this.tooltip && !this.elRef.nativeElement.contains(event.target) && !onMouseContainerOver) {
this.hide();
}
}));
}
/**
* @return {?}
*/
ngOnDestroy() {
this.hide();
}
/**
* @return {?}
*/
show() {
/** @type {?} */
const element = (/** @type {?} */ (this.elRef.nativeElement));
/** @type {?} */
const injector = ReflectiveInjector.resolveAndCreate([
{ provide: 'TOOLTIP_PROVIDER', useValue: (/** @type {?} */ ({ element, placement: this.placement })) },
]);
/** @type {?} */
const projectableNode = createProjectableNode.call(this, this.content);
this.tooltip = this.resolver.resolveComponentFactory(TooltipComponent).create(injector, [projectableNode]);
this.appRef.attachView(this.tooltip.hostView);
this.renderer.appendChild(this.renderer.selectRootElement('p-root', true), ((/** @type {?} */ (this.tooltip.hostView))).rootNodes[0]);
this.subscribeTo();
}
/**
* @return {?}
*/
hide() {
if (this.tooltip) {
this.tooltip.destroy();
this.tooltip = null;
}
this.destroy$.next();
this.store.dispatch(new EventListenerRemove('resize'));
}
/**
* @return {?}
*/
subscribeTo() {
this.store.dispatch(new EventListenerAdd('resize'));
this.resize$
.pipe(filter((/**
* @param {?} event
* @return {?}
*/
event => !!event)), takeUntilNotNull(this.destroy$))
.subscribe((/**
* @param {?} _
* @return {?}
*/
_ => this.hide()));
this.actions
.pipe(ofActionDispatched(EventListenerScrollVertical), takeUntilNotNull(this.destroy$))
.subscribe((/**
* @param {?} _
* @return {?}
*/
_ => this.hide()));
}
}
TooltipDirective.decorators = [
{ type: Directive, args: [{
selector: '[pTooltip]',
exportAs: 'pTooltip',
},] }
];
/** @nocollapse */
TooltipDirective.ctorParameters = () => [
{ type: Actions },
{ type: ApplicationRef },
{ type: ElementRef },
{ type: Injector },
{ type: Renderer2 },
{ type: ComponentFactoryResolver },
{ type: ViewContainerRef },
{ type: Store }
];
TooltipDirective.propDecorators = {
content: [{ type: Input, args: ['pTooltip',] }],
context: [{ type: Input, args: ['pTooltipContext',] }],
placement: [{ type: Input, args: ['pTooltipPlacement',] }],
trigger: [{ type: Input, args: ['pTooltipTrigger',] }]
};
tslib_1.__decorate([
Select(EventListenerState.getOne('mousemove')),
tslib_1.__metadata("design:type", Observable)
], TooltipDirective.prototype, "mousemove$", void 0);
tslib_1.__decorate([
Select(EventListenerState.getOne('click')),
tslib_1.__metadata("design:type", Observable)
], TooltipDirective.prototype, "click$", void 0);
tslib_1.__decorate([
Select(EventListenerState.getOne('resize')),
tslib_1.__metadata("design:type", Observable)
], TooltipDirective.prototype, "resize$", void 0);
if (false) {
/** @type {?} */
TooltipDirective.prototype.content;
/** @type {?} */
TooltipDirective.prototype.context;
/** @type {?} */
TooltipDirective.prototype.placement;
/** @type {?} */
TooltipDirective.prototype.trigger;
/** @type {?} */
TooltipDirective.prototype.mousemove$;
/** @type {?} */
TooltipDirective.prototype.click$;
/** @type {?} */
TooltipDirective.prototype.resize$;
/**
* @type {?}
* @private
*/
TooltipDirective.prototype.tooltip;
/**
* @type {?}
* @private
*/
TooltipDirective.prototype.destroy$;
/**
* @type {?}
* @private
*/
TooltipDirective.prototype.actions;
/**
* @type {?}
* @private
*/
TooltipDirective.prototype.appRef;
/**
* @type {?}
* @private
*/
TooltipDirective.prototype.elRef;
/**
* @type {?}
* @private
*/
TooltipDirective.prototype.injector;
/**
* @type {?}
* @private
*/
TooltipDirective.prototype.renderer;
/**
* @type {?}
* @private
*/
TooltipDirective.prototype.resolver;
/**
* @type {?}
* @private
*/
TooltipDirective.prototype.vcRef;
/**
* @type {?}
* @private
*/
TooltipDirective.prototype.store;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4LXBlcmZvcm1hbmNlLXVpL3VpLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUV4QixTQUFTLEVBQ1QsVUFBVSxFQUVWLFFBQVEsRUFDUixLQUFLLEVBR0wsa0JBQWtCLEVBQ2xCLFNBQVMsRUFHVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBQ2hCLDJCQUEyQixFQUMzQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixHQUNuQixNQUFNLDBCQUEwQixDQUFDO0FBTWxDLE1BQU0sT0FBTyxnQkFBZ0I7Ozs7Ozs7Ozs7O0lBOEIzQixZQUNVLE9BQWdCLEVBQ2hCLE1BQXNCLEVBQ3RCLEtBQWlCLEVBQ2pCLFFBQWtCLEVBQ2xCLFFBQW1CLEVBQ25CLFFBQWtDLEVBQ2xDLEtBQXVCLEVBQ3ZCLEtBQVk7UUFQWixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNs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LENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFDLENBQUM7SUFDakMsQ0FBQzs7O1lBbEhGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsUUFBUSxFQUFFLFVBQVU7YUFDckI7Ozs7WUFsQnVCLE9BQU87WUFoQjdCLGNBQWM7WUFJZCxVQUFVO1lBRVYsUUFBUTtZQUtSLFNBQVM7WUFWVCx3QkFBd0I7WUFheEIsZ0JBQWdCO1lBRUQsS0FBSzs7O3NCQW9CbkIsS0FBSyxTQUFDLFVBQVU7c0JBR2hCLEtBQUssU0FBQyxpQkFBaUI7d0JBR3ZCLEtBQUssU0FBQyxtQkFBbUI7c0JBR3pCLEtBQUssU0FBQyxpQkFBaUI7O0FBSXhCO0lBREMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztzQ0FDbkMsVUFBVTtvREFBYTtBQUduQztJQURDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7c0NBQ25DLFVBQVU7Z0RBQWE7QUFHL0I7SUFEQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3NDQUNuQyxVQUFVO2lEQUFhOzs7SUFuQmhDLG1DQUMrQzs7SUFFL0MsbUNBQ2tCOztJQUVsQixxQ0FDdUQ7O0lBRXZELG1DQUM2Qzs7SUFFN0Msc0NBQ21DOztJQUVuQyxrQ0FDK0I7O0lBRS9CLG1DQUNnQzs7Ozs7SUFFaEMsbUNBQWdEOzs7OztJQUVoRCxvQ0FBdUM7Ozs7O0lBT3JDLG1DQUF3Qjs7Ozs7SUFDeEIsa0NBQThCOzs7OztJQUM5QixpQ0FBeUI7Ozs7O0lBQ3pCLG9DQUEwQjs7Ozs7SUFDMUIsb0NBQTJCOzs7OztJQUMzQixvQ0FBMEM7Ozs7O0lBQzFDLGlDQUErQjs7Ozs7SUFDL0IsaUNBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXBwbGljYXRpb25SZWYsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgQ29tcG9uZW50UmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEVtYmVkZGVkVmlld1JlZixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgUmVmbGVjdGl2ZUluamVjdG9yLFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNlbGVjdCwgU3RvcmUsIEFjdGlvbnMsIG9mQWN0aW9uRGlzcGF0Y2hlZCB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRvb2x0aXBDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzJztcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgY3JlYXRlUHJvamVjdGFibGVOb2RlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgRXZlbnRMaXN0ZW5lclJlbW92ZSxcbiAgRXZlbnRMaXN0ZW5lckFkZCxcbiAgRXZlbnRMaXN0ZW5lclNjcm9sbFZlcnRpY2FsLFxuICB0YWtlVW50aWxEZXN0cm95LFxuICB0YWtlVW50aWxOb3ROdWxsLFxuICBFdmVudExpc3RlbmVyU3RhdGUsXG59IGZyb20gJ0BuZ3gtcGVyZm9ybWFuY2UtdWkvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1twVG9vbHRpcF0nLFxuICBleHBvcnRBczogJ3BUb29sdGlwJyxcbn0pXG5leHBvcnQgY2xhc3MgVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCdwVG9vbHRpcCcpXG4gIGNvbnRlbnQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4gfCBUeXBlPGFueT47XG5cbiAgQElucHV0KCdwVG9vbHRpcENvbnRleHQnKVxuICBjb250ZXh0OiBhbnkgPSB7fTtcblxuICBASW5wdXQoJ3BUb29sdGlwUGxhY2VtZW50JylcbiAgcGxhY2VtZW50OiAndG9wJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAnYm90dG9tJyA9ICd0b3AnO1xuXG4gIEBJbnB1dCgncFRvb2x0aXBUcmlnZ2VyJylcbiAgdHJpZ2dlcjogJ21vdXNlbW92ZScgfCAnY2xpY2snID0gJ21vdXNlbW92ZSc7XG5cbiAgQFNlbGVjdChFdmVudExpc3RlbmVyU3RhdGUuZ2V0T25lKCdtb3VzZW1vdmUnKSlcbiAgbW91c2Vtb3ZlJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcblxuICBAU2VsZWN0KEV2ZW50TGlzdGVuZXJTdGF0ZS5nZXRPbmUoJ2NsaWNrJykpXG4gIGNsaWNrJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcblxuICBAU2VsZWN0KEV2ZW50TGlzdGVuZXJTdGF0ZS5nZXRPbmUoJ3Jlc2l6ZScpKVxuICByZXNpemUkOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+O1xuXG4gIHByaXZhdGUgdG9vbHRpcDogQ29tcG9uZW50UmVmPFRvb2x0aXBDb21wb25lbnQ+O1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGdldCBjb250YWluZXJSZWN0KCk6IENsaWVudFJlY3Qge1xuICAgIHJldHVybiAoKHRoaXMudG9vbHRpcC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jaGlsZE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWN0aW9uczogQWN0aW9ucyxcbiAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgdmNSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmUsXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICAodGhpcy50cmlnZ2VyID09PSAnbW91c2Vtb3ZlJyA/IHRoaXMubW91c2Vtb3ZlJCA6IHRoaXMuY2xpY2skKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3kodGhpcyksXG4gICAgICAgIGZpbHRlcihldmVudCA9PiAhIWV2ZW50KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICBsZXQgb25Nb3VzZUNvbnRhaW5lck92ZXIgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcCkge1xuICAgICAgICAgIHRoaXMudG9vbHRpcC5ob3N0Vmlldy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgY29uc3QgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSA9IHRoaXMuY29udGFpbmVyUmVjdDtcbiAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGV2ZW50O1xuICAgICAgICAgIG9uTW91c2VDb250YWluZXJPdmVyID0gdG9wIDwgeSAmJiBib3R0b20gPiB5ICYmIGxlZnQgPCB4ICYmIHJpZ2h0ID4geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50b29sdGlwICYmIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50b29sdGlwICYmICF0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAhb25Nb3VzZUNvbnRhaW5lck92ZXIpIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICAgIHsgcHJvdmlkZTogJ1RPT0xUSVBfUFJPVklERVInLCB1c2VWYWx1ZTogeyBlbGVtZW50LCBwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50IH0gYXMgVG9vbHRpcC5Db25maWcgfSxcbiAgICBdKTtcbiAgICBjb25zdCBwcm9qZWN0YWJsZU5vZGUgPSBjcmVhdGVQcm9qZWN0YWJsZU5vZGUuY2FsbCh0aGlzLCB0aGlzLmNvbnRlbnQpO1xuXG4gICAgdGhpcy50b29sdGlwID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShUb29sdGlwQ29tcG9uZW50KS5jcmVhdGUoaW5qZWN0b3IsIFtwcm9qZWN0YWJsZU5vZGVdKTtcblxuICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy50b29sdGlwLmhvc3RWaWV3KTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKFxuICAgICAgdGhpcy5yZW5kZXJlci5zZWxlY3RSb290RWxlbWVudCgncC1yb290JywgdHJ1ZSksXG4gICAgICAodGhpcy50b29sdGlwLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0sXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvKCk7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICh0aGlzLnRvb2x0aXApIHtcbiAgICAgIHRoaXMudG9vbHRpcC5kZXN0cm95KCk7XG4gICAgICB0aGlzLnRvb2x0aXAgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBFdmVudExpc3RlbmVyUmVtb3ZlKCdyZXNpemUnKSk7XG4gIH1cblxuICBzdWJzY3JpYmVUbygpIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBFdmVudExpc3RlbmVyQWRkKCdyZXNpemUnKSk7XG5cbiAgICB0aGlzLnJlc2l6ZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gISFldmVudCksXG4gICAgICAgIHRha2VVbnRpbE5vdE51bGwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKF8gPT4gdGhpcy5oaWRlKCkpO1xuXG4gICAgdGhpcy5hY3Rpb25zXG4gICAgICAucGlwZShcbiAgICAgICAgb2ZBY3Rpb25EaXNwYXRjaGVkKEV2ZW50TGlzdGVuZXJTY3JvbGxWZXJ0aWNhbCksXG4gICAgICAgIHRha2VVbnRpbE5vdE51bGwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKF8gPT4gdGhpcy5oaWRlKCkpO1xuICB9XG59XG4iXX0=