@coreui/angular
Version:
CoreUI Components Library for Angular
204 lines • 28.3 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { computed, DestroyRef, Directive, effect, inject, input, model } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { debounceTime, filter, finalize } from 'rxjs/operators';
import { createPopper } from '@popperjs/core';
import { IntersectionService, ListenersService } from '../services';
import { TooltipComponent } from './tooltip/tooltip.component';
import * as i0 from "@angular/core";
import * as i1 from "../services";
export class TooltipDirective {
get ariaDescribedBy() {
return this.tooltipId ? this.tooltipId : null;
}
#destroyRef;
#document;
constructor(renderer, hostElement, viewContainerRef, listenersService, changeDetectorRef, intersectionService) {
this.renderer = renderer;
this.hostElement = hostElement;
this.viewContainerRef = viewContainerRef;
this.listenersService = listenersService;
this.changeDetectorRef = changeDetectorRef;
this.intersectionService = intersectionService;
/**
* Content of tooltip
* @type {string | TemplateRef}
*/
this.content = input(undefined, { alias: 'cTooltip' });
this.contentEffect = effect(() => {
if (this.content()) {
this.destroyTooltipElement();
}
});
/**
* Optional popper Options object, takes precedence over cPopoverPlacement prop
* @type Partial<Options>
*/
this.popperOptions = input({}, { alias: 'cTooltipOptions' });
this.popperOptionsEffect = effect(() => {
this._popperOptions = {
...this._popperOptions,
placement: this.placement(),
...this.popperOptions()
};
});
this.popperOptionsComputed = computed(() => {
return { placement: this.placement(), ...this._popperOptions };
});
/**
* Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property.
* @type: 'top' | 'bottom' | 'left' | 'right'
* @default: 'top'
*/
this.placement = input('top', { alias: 'cTooltipPlacement' });
/**
* ElementRefDirective for positioning the tooltip on reference element
* @type: ElementRefDirective
* @default: undefined
*/
this.reference = input(undefined, { alias: 'cTooltipRef' });
this.referenceRef = computed(() => this.reference()?.elementRef ?? this.hostElement);
/**
* Sets which event handlers you’d like provided to your toggle prop. You can specify one trigger or an array of them.
* @type: 'Triggers | Triggers[]
*/
this.trigger = input('hover', { alias: 'cTooltipTrigger' });
/**
* Toggle the visibility of tooltip component.
* @type boolean
*/
this.visible = model(false, { alias: 'cTooltipVisible' });
this.visibleEffect = effect(() => {
this.visible() ? this.addTooltipElement() : this.removeTooltipElement();
});
this._popperOptions = {
modifiers: [
{
name: 'offset',
options: {
offset: [0, 5]
}
}
]
};
this.#destroyRef = inject(DestroyRef);
this.#document = inject(DOCUMENT);
}
ngAfterViewInit() {
this.intersectionServiceSubscribe();
}
ngOnDestroy() {
this.clearListeners();
this.destroyTooltipElement();
}
ngOnInit() {
this.setListeners();
}
setListeners() {
const config = {
hostElement: this.hostElement,
trigger: this.trigger(),
callbackToggle: () => {
this.visible.set(!this.visible());
},
callbackOff: () => {
this.visible.set(false);
},
callbackOn: () => {
this.visible.set(true);
}
};
this.listenersService.setListeners(config);
}
clearListeners() {
this.listenersService.clearListeners();
}
intersectionServiceSubscribe() {
this.intersectionService.createIntersectionObserver(this.referenceRef());
this.intersectionService.intersecting$
.pipe(filter((next) => next.hostElement === this.referenceRef()), debounceTime(100), finalize(() => {
this.intersectionService.unobserve(this.referenceRef());
}), takeUntilDestroyed(this.#destroyRef))
.subscribe((next) => {
this.visible.set(next.isIntersecting ? this.visible() : false);
});
}
getUID(prefix) {
let uid = prefix ?? 'random-id';
do {
uid = `${prefix}-${Math.floor(Math.random() * 1000000).toString(10)}`;
} while (this.#document.getElementById(uid));
return uid;
}
createTooltipElement() {
if (!this.tooltipRef) {
this.tooltipRef = this.viewContainerRef.createComponent(TooltipComponent);
// this.viewContainerRef.detach();
}
}
destroyTooltipElement() {
this.tooltip?.remove();
this.tooltipRef?.destroy();
// @ts-ignore
this.tooltipRef = undefined;
this.popperInstance?.destroy();
this.viewContainerRef?.detach();
this.viewContainerRef?.clear();
}
addTooltipElement() {
if (!this.content()) {
this.destroyTooltipElement();
return;
}
if (!this.tooltipRef) {
this.createTooltipElement();
}
this.tooltipRef?.setInput('content', this.content() ?? '');
this.tooltip = this.tooltipRef?.location.nativeElement;
this.renderer.addClass(this.tooltip, 'd-none');
this.renderer.addClass(this.tooltip, 'fade');
this.popperInstance?.destroy();
this.viewContainerRef.insert(this.tooltipRef.hostView);
this.renderer.appendChild(this.#document.body, this.tooltip);
this.popperInstance = createPopper(this.referenceRef().nativeElement, this.tooltip, {
...this.popperOptionsComputed()
});
if (!this.visible()) {
this.removeTooltipElement();
return;
}
setTimeout(() => {
this.tooltipId = this.getUID('tooltip');
this.tooltipRef?.setInput('id', this.tooltipId);
this.renderer.removeClass(this.tooltip, 'd-none');
this.tooltipRef?.setInput('visible', this.visible());
this.popperInstance?.forceUpdate();
this.changeDetectorRef?.markForCheck();
}, 100);
}
removeTooltipElement() {
this.tooltipId = '';
if (!this.tooltipRef) {
return;
}
this.tooltipRef.setInput('visible', false);
this.tooltipRef.setInput('id', undefined);
this.changeDetectorRef.markForCheck();
setTimeout(() => {
this.viewContainerRef?.detach();
}, 300);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TooltipDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i1.ListenersService }, { token: i0.ChangeDetectorRef }, { token: i1.IntersectionService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.12", type: TooltipDirective, isStandalone: true, selector: "[cTooltip]", inputs: { content: { classPropertyName: "content", publicName: "cTooltip", isSignal: true, isRequired: false, transformFunction: null }, popperOptions: { classPropertyName: "popperOptions", publicName: "cTooltipOptions", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "cTooltipPlacement", isSignal: true, isRequired: false, transformFunction: null }, reference: { classPropertyName: "reference", publicName: "cTooltipRef", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "cTooltipTrigger", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "cTooltipVisible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visible: "cTooltipVisibleChange" }, host: { properties: { "attr.aria-describedby": "ariaDescribedBy" } }, providers: [ListenersService, IntersectionService], exportAs: ["cTooltip"], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TooltipDirective, decorators: [{
type: Directive,
args: [{
selector: '[cTooltip]',
exportAs: 'cTooltip',
providers: [ListenersService, IntersectionService],
standalone: true,
host: { '[attr.aria-describedby]': 'ariaDescribedBy' }
}]
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i1.ListenersService }, { type: i0.ChangeDetectorRef }, { type: i1.IntersectionService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3Rvb2x0aXAvdG9vbHRpcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFJTCxRQUFRLEVBQ1IsVUFBVSxFQUNWLFNBQVMsRUFDVCxNQUFNLEVBRU4sTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBTU4sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUdqRSxPQUFPLEVBQW9CLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFTL0QsTUFBTSxPQUFPLGdCQUFnQjtJQStEM0IsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2hELENBQUM7SUFrQlEsV0FBVyxDQUFzQjtJQUNqQyxTQUFTLENBQW9CO0lBRXRDLFlBQ1UsUUFBbUIsRUFDbkIsV0FBdUIsRUFDdkIsZ0JBQWtDLEVBQ2xDLGdCQUFrQyxFQUNsQyxpQkFBb0MsRUFDcEMsbUJBQXdDO1FBTHhDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFr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QUFDOzs0RkFJdkMsZ0JBQWdCO2tCQVA1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxZQUFZO29CQUN0QixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsU0FBUyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUM7b0JBQ2xELFVBQVUsRUFBRSxJQUFJO29CQUNoQixJQUFJLEVBQUUsRUFBRSx5QkFBeUIsRUFBRSxpQkFBaUIsRUFBRTtpQkFDdkQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50UmVmLFxuICBjb21wdXRlZCxcbiAgRGVzdHJveVJlZixcbiAgRGlyZWN0aXZlLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgUmVuZGVyZXIyLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNyZWF0ZVBvcHBlciwgSW5zdGFuY2UsIE9wdGlvbnMgfSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5cbmltcG9ydCB7IFRyaWdnZXJzIH0gZnJvbSAnLi4vY29yZXVpLnR5cGVzJztcbmltcG9ydCB7IElMaXN0ZW5lcnNDb25maWcsIEludGVyc2VjdGlvblNlcnZpY2UsIExpc3RlbmVyc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBFbGVtZW50UmVmRGlyZWN0aXZlIH0gZnJvbSAnLi4vc2hhcmVkJztcbmltcG9ydCB7IFRvb2x0aXBDb21wb25lbnQgfSBmcm9tICcuL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY1Rvb2x0aXBdJyxcbiAgZXhwb3J0QXM6ICdjVG9vbHRpcCcsXG4gIHByb3ZpZGVyczogW0xpc3RlbmVyc1NlcnZpY2UsIEludGVyc2VjdGlvblNlcnZpY2VdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBob3N0OiB7ICdbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XSc6ICdhcmlhRGVzY3JpYmVkQnknIH1cbn0pXG5leHBvcnQgY2xhc3MgVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgLyoqXG4gICAqIENvbnRlbnQgb2YgdG9vbHRpcFxuICAgKiBAdHlwZSB7c3RyaW5nIHwgVGVtcGxhdGVSZWZ9XG4gICAqL1xuICByZWFkb25seSBjb250ZW50ID0gaW5wdXQ8c3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7IGFsaWFzOiAnY1Rvb2x0aXAnIH0pO1xuXG4gIGNvbnRlbnRFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0aGlzLmNvbnRlbnQoKSkge1xuICAgICAgdGhpcy5kZXN0cm95VG9vbHRpcEVsZW1lbnQoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwb3BwZXIgT3B0aW9ucyBvYmplY3QsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBjUG9wb3ZlclBsYWNlbWVudCBwcm9wXG4gICAqIEB0eXBlIFBhcnRpYWw8T3B0aW9ucz5cbiAgICovXG4gIHJlYWRvbmx5IHBvcHBlck9wdGlvbnMgPSBpbnB1dDxQYXJ0aWFsPE9wdGlvbnM+Pih7fSwgeyBhbGlhczogJ2NUb29sdGlwT3B0aW9ucycgfSk7XG5cbiAgcG9wcGVyT3B0aW9uc0VmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgdGhpcy5fcG9wcGVyT3B0aW9ucyA9IHtcbiAgICAgIC4uLnRoaXMuX3BvcHBlck9wdGlvbnMsXG4gICAgICBwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50KCksXG4gICAgICAuLi50aGlzLnBvcHBlck9wdGlvbnMoKVxuICAgIH07XG4gIH0pO1xuXG4gIHBvcHBlck9wdGlvbnNDb21wdXRlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4geyBwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50KCksIC4uLnRoaXMuX3BvcHBlck9wdGlvbnMgfTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERlc2NyaWJlcyB0aGUgcGxhY2VtZW50IG9mIHlvdXIgY29tcG9uZW50IGFmdGVyIFBvcHBlci5qcyBoYXMgYXBwbGllZCBhbGwgdGhlIG1vZGlmaWVycyB0aGF0IG1heSBoYXZlIGZsaXBwZWQgb3IgYWx0ZXJlZCB0aGUgb3JpZ2luYWxseSBwcm92aWRlZCBwbGFjZW1lbnQgcHJvcGVydHkuXG4gICAqIEB0eXBlOiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0J1xuICAgKiBAZGVmYXVsdDogJ3RvcCdcbiAgICovXG4gIHJlYWRvbmx5IHBsYWNlbWVudCA9IGlucHV0PCd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnPigndG9wJywgeyBhbGlhczogJ2NUb29sdGlwUGxhY2VtZW50JyB9KTtcblxuICAvKipcbiAgICogRWxlbWVudFJlZkRpcmVjdGl2ZSBmb3IgcG9zaXRpb25pbmcgdGhlIHRvb2x0aXAgb24gcmVmZXJlbmNlIGVsZW1lbnRcbiAgICogQHR5cGU6IEVsZW1lbnRSZWZEaXJlY3RpdmVcbiAgICogQGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlID0gaW5wdXQ8RWxlbWVudFJlZkRpcmVjdGl2ZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7IGFsaWFzOiAnY1Rvb2x0aXBSZWYnIH0pO1xuXG4gIHJlYWRvbmx5IHJlZmVyZW5jZVJlZiA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmVmZXJlbmNlKCk/LmVsZW1lbnRSZWYgPz8gdGhpcy5ob3N0RWxlbWVudCk7XG5cbiAgLyoqXG4gICAqIFNldHMgd2hpY2ggZXZlbnQgaGFuZGxlcnMgeW914oCZZCBsaWtlIHByb3ZpZGVkIHRvIHlvdXIgdG9nZ2xlIHByb3AuIFlvdSBjYW4gc3BlY2lmeSBvbmUgdHJpZ2dlciBvciBhbiBhcnJheSBvZiB0aGVtLlxuICAgKiBAdHlwZTogJ1RyaWdnZXJzIHwgVHJpZ2dlcnNbXVxuICAgKi9cbiAgcmVhZG9ubHkgdHJpZ2dlciA9IGlucHV0PFRyaWdnZXJzIHwgVHJpZ2dlcnNbXT4oJ2hvdmVyJywgeyBhbGlhczogJ2NUb29sdGlwVHJpZ2dlcicgfSk7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGUgdmlzaWJpbGl0eSBvZiB0b29sdGlwIGNvbXBvbmVudC5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKi9cbiAgcmVhZG9ubHkgdmlzaWJsZSA9IG1vZGVsKGZhbHNlLCB7IGFsaWFzOiAnY1Rvb2x0aXBWaXNpYmxlJyB9KTtcblxuICB2aXNpYmxlRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICB0aGlzLnZpc2libGUoKSA/IHRoaXMuYWRkVG9vbHRpcEVsZW1lbnQoKSA6IHRoaXMucmVtb3ZlVG9vbHRpcEVsZW1lbnQoKTtcbiAgfSk7XG5cbiAgZ2V0IGFyaWFEZXNjcmliZWRCeSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy50b29sdGlwSWQgPyB0aGlzLnRvb2x0aXBJZCA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHRvb2x0aXAhOiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSB0b29sdGlwSWQhOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9vbHRpcFJlZiE6IENvbXBvbmVudFJlZjxUb29sdGlwQ29tcG9uZW50PjtcbiAgcHJpdmF0ZSBwb3BwZXJJbnN0YW5jZSE6IEluc3RhbmNlO1xuXG4gIHByaXZhdGUgX3BvcHBlck9wdGlvbnM6IFBhcnRpYWw8T3B0aW9ucz4gPSB7XG4gICAgbW9kaWZpZXJzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgb2Zmc2V0OiBbMCwgNV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIF1cbiAgfTtcblxuICByZWFkb25seSAjZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcmVhZG9ubHkgI2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBob3N0RWxlbWVudDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcnNTZXJ2aWNlOiBMaXN0ZW5lcnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgaW50ZXJzZWN0aW9uU2VydmljZTogSW50ZXJzZWN0aW9uU2VydmljZVxuICApIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJzZWN0aW9uU2VydmljZVN1YnNjcmliZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckxpc3RlbmVycygpO1xuICAgIHRoaXMuZGVzdHJveVRvb2x0aXBFbGVtZW50KCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldExpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnOiBJTGlzdGVuZXJzQ29uZmlnID0ge1xuICAgICAgaG9zdEVsZW1lbnQ6IHRoaXMuaG9zdEVsZW1lbnQsXG4gICAgICB0cmlnZ2VyOiB0aGlzLnRyaWdnZXIoKSxcbiAgICAgIGNhbGxiYWNrVG9nZ2xlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlzaWJsZS5zZXQoIXRoaXMudmlzaWJsZSgpKTtcbiAgICAgIH0sXG4gICAgICBjYWxsYmFja09mZjogKCkgPT4ge1xuICAgICAgICB0aGlzLnZpc2libGUuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBjYWxsYmFja09uOiAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlzaWJsZS5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmxpc3RlbmVyc1NlcnZpY2Uuc2V0TGlzdGVuZXJzKGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuZXJzU2VydmljZS5jbGVhckxpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcnNlY3Rpb25TZXJ2aWNlU3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJzZWN0aW9uU2VydmljZS5jcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcih0aGlzLnJlZmVyZW5jZVJlZigpKTtcbiAgICB0aGlzLmludGVyc2VjdGlvblNlcnZpY2UuaW50ZXJzZWN0aW5nJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigobmV4dCkgPT4gbmV4dC5ob3N0RWxlbWVudCA9PT0gdGhpcy5yZWZlcmVuY2VSZWYoKSksXG4gICAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25TZXJ2aWNlLnVub2JzZXJ2ZSh0aGlzLnJlZmVyZW5jZVJlZigpKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLiNkZXN0cm95UmVmKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgobmV4dCkgPT4ge1xuICAgICAgICB0aGlzLnZpc2libGUuc2V0KG5leHQuaXNJbnRlcnNlY3RpbmcgPyB0aGlzLnZpc2libGUoKSA6IGZhbHNlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVSUQocHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB1aWQgPSBwcmVmaXggPz8gJ3JhbmRvbS1pZCc7XG4gICAgZG8ge1xuICAgICAgdWlkID0gYCR7cHJlZml4fS0ke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApLnRvU3RyaW5nKDEwKX1gO1xuICAgIH0gd2hpbGUgKHRoaXMuI2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHVpZCkpO1xuXG4gICAgcmV0dXJuIHVpZDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVG9vbHRpcEVsZW1lbnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRvb2x0aXBSZWYpIHtcbiAgICAgIHRoaXMudG9vbHRpcFJlZiA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQ8VG9vbHRpcENvbXBvbmVudD4oVG9vbHRpcENvbXBvbmVudCk7XG4gICAgICAvLyB0aGlzLnZpZXdDb250YWluZXJSZWYuZGV0YWNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95VG9vbHRpcEVsZW1lbnQoKTogdm9pZCB7XG4gICAgdGhpcy50b29sdGlwPy5yZW1vdmUoKTtcbiAgICB0aGlzLnRvb2x0aXBSZWY/LmRlc3Ryb3koKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy50b29sdGlwUmVmID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucG9wcGVySW5zdGFuY2U/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnZpZXdDb250YWluZXJSZWY/LmRldGFjaCgpO1xuICAgIHRoaXMudmlld0NvbnRhaW5lclJlZj8uY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVG9vbHRpcEVsZW1lbnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnQoKSkge1xuICAgICAgdGhpcy5kZXN0cm95VG9vbHRpcEVsZW1lbnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudG9vbHRpcFJlZikge1xuICAgICAgdGhpcy5jcmVhdGVUb29sdGlwRWxlbWVudCgpO1xuICAgIH1cblxuICAgIHRoaXMudG9vbHRpcFJlZj8uc2V0SW5wdXQoJ2NvbnRlbnQnLCB0aGlzLmNvbnRlbnQoKSA/PyAnJyk7XG5cbiAgICB0aGlzLnRvb2x0aXAgPSB0aGlzLnRvb2x0aXBSZWY/LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnRvb2x0aXAsICdkLW5vbmUnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMudG9vbHRpcCwgJ2ZhZGUnKTtcblxuICAgIHRoaXMucG9wcGVySW5zdGFuY2U/LmRlc3Ryb3koKTtcblxuICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5pbnNlcnQodGhpcy50b29sdGlwUmVmLmhvc3RWaWV3KTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuI2RvY3VtZW50LmJvZHksIHRoaXMudG9vbHRpcCk7XG5cbiAgICB0aGlzLnBvcHBlckluc3RhbmNlID0gY3JlYXRlUG9wcGVyKHRoaXMucmVmZXJlbmNlUmVmKCkubmF0aXZlRWxlbWVudCwgdGhpcy50b29sdGlwLCB7XG4gICAgICAuLi50aGlzLnBvcHBlck9wdGlvbnNDb21wdXRlZCgpXG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMudmlzaWJsZSgpKSB7XG4gICAgICB0aGlzLnJlbW92ZVRvb2x0aXBFbGVtZW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50b29sdGlwSWQgPSB0aGlzLmdldFVJRCgndG9vbHRpcCcpO1xuICAgICAgdGhpcy50b29sdGlwUmVmPy5zZXRJbnB1dCgnaWQnLCB0aGlzLnRvb2x0aXBJZCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMudG9vbHRpcCwgJ2Qtbm9uZScpO1xuICAgICAgdGhpcy50b29sdGlwUmVmPy5zZXRJbnB1dCgndmlzaWJsZScsIHRoaXMudmlzaWJsZSgpKTtcbiAgICAgIHRoaXMucG9wcGVySW5zdGFuY2U/LmZvcmNlVXBkYXRlKCk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmPy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVUb29sdGlwRWxlbWVudCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvb2x0aXBJZCA9ICcnO1xuICAgIGlmICghdGhpcy50b29sdGlwUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudG9vbHRpcFJlZi5zZXRJbnB1dCgndmlzaWJsZScsIGZhbHNlKTtcbiAgICB0aGlzLnRvb2x0aXBSZWYuc2V0SW5wdXQoJ2lkJywgdW5kZWZpbmVkKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmPy5kZXRhY2goKTtcbiAgICB9LCAzMDApO1xuICB9XG59XG4iXX0=