@vismaux/ngx-nordic-cool
Version:
Common Nordic-Cool components for Angular.
277 lines • 30.4 kB
JavaScript
import { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';
import { ComponentPortal } from '@angular/cdk/portal';
import { Directive, HostListener, Input, } from '@angular/core';
import { Subject } from 'rxjs';
import { map, takeUntil } from 'rxjs/operators';
import { NcTooltipComponent } from './tooltip.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
export class NcTooltipDirective {
constructor(elementRef, overlay, ngZone) {
this.elementRef = elementRef;
this.overlay = overlay;
this.ngZone = ngZone;
/** @ignore */
this.destroyed$ = new Subject();
/** @ignore */
this._content = null;
/** @ignore */
this._placement = 'right';
/** @ignore */
this._offset = 15;
/** @ignore */
this.mouseOver = false;
}
set content(value) {
if (value === this._content) {
return;
}
this._content = value;
// Hide tooltip with empty content
if (!this._content && this.overlayRef?.hasAttached()) {
this.hide();
return;
}
// Update the content in case tooltip is already opened
if (this.overlayRef?.hasAttached()) {
this.tooltipInstance.content = this._content;
this.tooltipInstance._markForCheck();
}
}
get content() {
return this._content;
}
set style(value) {
if (value === this._style) {
return;
}
this._style = value;
// Update the content in case tooltip is already opened
if (this.overlayRef?.hasAttached()) {
this.tooltipInstance.style = this._style;
this.tooltipInstance._markForCheck();
}
}
get style() {
return this._style;
}
set offset(value) {
if (value === undefined) {
return;
}
if (this._offset === value) {
return;
}
this._offset = value;
this.updateTooltipPlacement();
}
get offset() {
return this._offset;
}
set placement(value) {
if (this._placement === value) {
return;
}
this._placement = value;
this.updateTooltipPlacement();
}
get placement() {
return this._placement;
}
/** @ignore */
ngOnDestroy() {
this.destroyed$.next();
this.destroyed$.complete();
this.overlayRef?.detach();
this.overlayRef?.dispose();
}
show() {
if (this.overlayRef?.hasAttached()) {
return;
}
const overlayRef = this.createOverlay();
this.tooltipPortal =
this.tooltipPortal ?? new ComponentPortal(NcTooltipComponent);
this.tooltipInstanceDestroyed$ = new Subject();
this.tooltipInstance = overlayRef.attach(this.tooltipPortal).instance;
this.tooltipInstance.content = this.content;
this.tooltipInstance.style = this.style;
this.tooltipInstance
.afterMouseLeave()
.pipe(takeUntil(this.tooltipInstanceDestroyed$))
.subscribe(() => setTimeout(() => this.softHide()));
// Tell the instance current position (left, right, top, bottom)
this.currentPosition$
.pipe(takeUntil(this.tooltipInstanceDestroyed$))
.subscribe((position) => {
this.ngZone.run(() => {
this.tooltipInstance.position = position;
this.tooltipInstance.offset = this.offset;
this.tooltipInstance._markForCheck();
});
});
}
hide() {
if (!this.overlayRef?.hasAttached()) {
return;
}
this.overlayRef.detach();
this.tooltipInstanceDestroyed$.next();
this.tooltipInstanceDestroyed$.complete();
this.tooltipInstance = null;
}
toggle() {
if (!this.overlayRef?.hasAttached()) {
this.show();
return;
}
this.hide();
}
/** @ignore */
projectComponent(componentType) {
if (!this.tooltipInstance) {
throw new Error(`Trying to project content into a tooltip that is not yet created.`);
}
return this.tooltipInstance.projectComponent(componentType);
}
/** @ignore */
handleMouseEnter() {
if (this.disabled) {
return;
}
this.mouseOver = true;
this.show();
}
/** @ignore */
handleMouseLeave() {
if (this.disabled) {
return;
}
this.mouseOver = false;
setTimeout(() => this.softHide());
}
/**
* closes only if mouse is not over the host element nor the tooltip itself
* @ignore
*/
softHide() {
if (!this.mouseOver && !this.tooltipInstance?.mouseOver) {
this.hide();
}
}
/** @ignore */
createOverlay() {
if (this.overlayRef) {
return this.overlayRef;
}
const positionStrategy = this.overlay
.position()
.flexibleConnectedTo(this.elementRef);
this.currentPosition$ = positionStrategy.positionChanges.pipe(map((pos) => pos.connectionPair.panelClass));
const scrollStrategy = this.overlay.scrollStrategies.reposition();
this.overlayRef = this.overlay.create({ positionStrategy, scrollStrategy });
this.overlayRef
.keydownEvents()
.pipe(takeUntil(this.destroyed$))
.subscribe((event) => {
if (this.overlayRef?.hasAttached() &&
event.keyCode === ESCAPE &&
!hasModifierKey(event)) {
this.hide();
}
});
this.updatePosition();
return this.overlayRef;
}
/** @ignore */
updateTooltipPlacement() {
if (this.overlayRef) {
this.updatePosition();
this.overlayRef.updatePosition();
}
}
/** @ignore */
updatePosition() {
const position = this.overlayRef.getConfig()
.positionStrategy;
const positions = this.getPositions(this._placement);
position.withPositions(positions);
}
/** @ignore */
getPositions(preferredPlacement) {
const right = {
originX: 'end',
originY: 'center',
overlayX: 'start',
overlayY: 'center',
offsetX: this.offset,
panelClass: 'right',
};
const left = {
originX: 'start',
originY: 'center',
overlayX: 'end',
overlayY: 'center',
offsetX: -this.offset,
panelClass: 'left',
};
const top = {
originX: 'center',
originY: 'top',
overlayX: 'center',
overlayY: 'bottom',
offsetY: -this.offset,
panelClass: 'top',
};
const bottom = {
originX: 'center',
originY: 'bottom',
overlayX: 'center',
overlayY: 'top',
offsetY: this.offset,
panelClass: 'bottom',
};
switch (preferredPlacement) {
case 'right':
return [right, left, bottom, top];
case 'left':
return [left, right, bottom, top];
case 'top':
return [top, bottom, right, left];
case 'bottom':
return [bottom, top, right, left];
default:
throw new SyntaxError(`"${preferredPlacement}" value for 'placement' property is not supported. Available options: after, before, top, bottom, left or right.`);
}
}
}
NcTooltipDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcTooltipDirective, deps: [{ token: i0.ElementRef }, { token: i1.Overlay }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
NcTooltipDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.3", type: NcTooltipDirective, selector: "[ncTooltip]", inputs: { content: ["ncTooltip", "content"], style: ["ncTooltipStyle", "style"], disabled: ["ncTooltipDisabled", "disabled"], offset: ["ncTooltipOffsetSize", "offset"], placement: "placement" }, host: { listeners: { "mouseenter": "handleMouseEnter()", "mouseleave": "handleMouseLeave()" } }, exportAs: ["ncTooltip"], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcTooltipDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncTooltip]',
exportAs: 'ncTooltip',
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Overlay }, { type: i0.NgZone }]; }, propDecorators: { content: [{
type: Input,
args: ['ncTooltip']
}], style: [{
type: Input,
args: ['ncTooltipStyle']
}], disabled: [{
type: Input,
args: ['ncTooltipDisabled']
}], offset: [{
type: Input,
args: ['ncTooltipOffsetSize']
}], placement: [{
type: Input
}], handleMouseEnter: [{
type: HostListener,
args: ['mouseenter']
}], handleMouseLeave: [{
type: HostListener,
args: ['mouseleave']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9yZGljLWNvb2wvc3JjL2xpYi90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFPL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssR0FLTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQVN6RCxNQUFNLE9BQU8sa0JBQWtCO0lBaUc3QixZQUNVLFVBQXNCLEVBQ3RCLE9BQWdCLEVBQ2hCLE1BQWM7UUFGZCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQW5HeEIsY0FBYztRQUNKLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLGNBQWM7UUFDTixhQUFRLEdBQXFDLElBQUksQ0FBQztRQVcxRCxjQUFjO1FBQ04sZUFBVSxHQUF1QixPQUFPLENBQUM7UUFHakQsY0FBYztRQUNOLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDN0IsY0FBYztRQUNOLGNBQVMsR0FBWSxLQUFLLENBQUM7SUErRWhDLENBQUM7SUE3RUosSUFDSSxPQUFPLENBQUMsS0FBdUM7UUFDakQsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMzQixPQUFPO1NBQ1I7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LElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDcEMsS0FBSyxNQUFNO2dCQUNULE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNwQyxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLEtBQUssUUFBUTtnQkFDWCxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEM7Z0JBQ0UsTUFBTSxJQUFJLFdBQVcsQ0FDbkIsSUFBSSxrQkFBa0Isa0hBQWtILENBQ3pJLENBQUM7U0FDTDtJQUNILENBQUM7OytHQWhUVSxrQkFBa0I7bUdBQWxCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUo5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixRQUFRLEVBQUUsV0FBVztpQkFDdEI7NElBMEJLLE9BQU87c0JBRFYsS0FBSzt1QkFBQyxXQUFXO2dCQXdCZCxLQUFLO3NCQURSLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQWlCSyxRQUFRO3NCQUFuQyxLQUFLO3VCQUFDLG1CQUFtQjtnQkFFdEIsTUFBTTtzQkFEVCxLQUFLO3VCQUFDLHFCQUFxQjtnQkFtQnhCLFNBQVM7c0JBRFosS0FBSztnQkF5Rk4sZ0JBQWdCO3NCQURmLFlBQVk7dUJBQUMsWUFBWTtnQkFXMUIsZ0JBQWdCO3NCQURmLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVTQ0FQRSwgaGFzTW9kaWZpZXJLZXkgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGVkUG9zaXRpb24sXG4gIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcbiAgT3ZlcmxheSxcbiAgT3ZlcmxheVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTmNUb29sdGlwQ29tcG9uZW50IH0gZnJvbSAnLi90b29sdGlwLmNvbXBvbmVudCc7XG5cbmV4cG9ydCB0eXBlIE5jVG9vbHRpcFBsYWNlbWVudCA9ICdsZWZ0JyB8ICdyaWdodCcgfCAndG9wJyB8ICdib3R0b20nO1xuZXhwb3J0IHR5cGUgTmNUb29sdGlwU3R5bGUgPSAnZGVmYXVsdCcgfCAnZXJyb3InO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmNUb29sdGlwXScsXG4gIGV4cG9ydEFzOiAnbmNUb29sdGlwJyxcbn0pXG5leHBvcnQgY2xhc3MgTmNUb29sdGlwRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJvdGVjdGVkIGRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdCgpO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIF9jb250ZW50OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgdG9vbHRpcEluc3RhbmNlRGVzdHJveWVkJDogU3ViamVjdDx2b2lkPjtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIHRvb2x0aXBQb3J0YWw6IENvbXBvbmVudFBvcnRhbDxOY1Rvb2x0aXBDb21wb25lbnQ+O1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIHRvb2x0aXBJbnN0YW5jZTogTmNUb29sdGlwQ29tcG9uZW50O1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIGN1cnJlbnRQb3NpdGlvbiQ6IE9ic2VydmFibGU8TmNUb29sdGlwUGxhY2VtZW50PjtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfcGxhY2VtZW50OiBOY1Rvb2x0aXBQbGFjZW1lbnQgPSAncmlnaHQnO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIF9zdHlsZTogTmNUb29sdGlwU3R5bGU7XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgX29mZnNldDogbnVtYmVyID0gMTU7XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgbW91c2VPdmVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCduY1Rvb2x0aXAnKVxuICBzZXQgY29udGVudCh2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiB8IG51bGwpIHtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZW50ID0gdmFsdWU7XG5cbiAgICAvLyBIaWRlIHRvb2x0aXAgd2l0aCBlbXB0eSBjb250ZW50XG4gICAgaWYgKCF0aGlzLl9jb250ZW50ICYmIHRoaXMub3ZlcmxheVJlZj8uaGFzQXR0YWNoZWQoKSkge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBjb250ZW50IGluIGNhc2UgdG9vbHRpcCBpcyBhbHJlYWR5IG9wZW5lZFxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWY/Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRoaXMudG9vbHRpcEluc3RhbmNlLmNvbnRlbnQgPSB0aGlzLl9jb250ZW50O1xuICAgICAgdGhpcy50b29sdGlwSW5zdGFuY2UuX21hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuICBnZXQgY29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudDtcbiAgfVxuICBASW5wdXQoJ25jVG9vbHRpcFN0eWxlJylcbiAgc2V0IHN0eWxlKHZhbHVlOiBOY1Rvb2x0aXBTdHlsZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5fc3R5bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zdHlsZSA9IHZhbHVlO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb250ZW50IGluIGNhc2UgdG9vbHRpcCBpcyBhbHJlYWR5IG9wZW5lZFxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWY/Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRoaXMudG9vbHRpcEluc3RhbmNlLnN0eWxlID0gdGhpcy5fc3R5bGU7XG4gICAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIGdldCBzdHlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3R5bGU7XG4gIH1cbiAgQElucHV0KCduY1Rvb2x0aXBEaXNhYmxlZCcpIGRpc2FibGVkOiBib29sZWFuO1xuICBASW5wdXQoJ25jVG9vbHRpcE9mZnNldFNpemUnKVxuICBzZXQgb2Zmc2V0KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb2Zmc2V0ID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX29mZnNldCA9IHZhbHVlO1xuXG4gICAgdGhpcy51cGRhdGVUb29sdGlwUGxhY2VtZW50KCk7XG4gIH1cbiAgZ2V0IG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb2Zmc2V0O1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHBsYWNlbWVudCh2YWx1ZTogTmNUb29sdGlwUGxhY2VtZW50KSB7XG4gICAgaWYgKHRoaXMuX3BsYWNlbWVudCA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wbGFjZW1lbnQgPSB2YWx1ZTtcblxuICAgIHRoaXMudXBkYXRlVG9vbHRpcFBsYWNlbWVudCgpO1xuICB9XG4gIGdldCBwbGFjZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlbWVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICApIHt9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKTtcbiAgICB0aGlzLm92ZXJsYXlSZWY/LmRldGFjaCgpO1xuICAgIHRoaXMub3ZlcmxheVJlZj8uZGlzcG9zZSgpO1xuICB9XG5cbiAgc2hvdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmPy5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuY3JlYXRlT3ZlcmxheSgpO1xuICAgIHRoaXMudG9vbHRpcFBvcnRhbCA9XG4gICAgICB0aGlzLnRvb2x0aXBQb3J0YWwgPz8gbmV3IENvbXBvbmVudFBvcnRhbChOY1Rvb2x0aXBDb21wb25lbnQpO1xuXG4gICAgdGhpcy50b29sdGlwSW5zdGFuY2VEZXN0cm95ZWQkID0gbmV3IFN1YmplY3QoKTtcbiAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZSA9IG92ZXJsYXlSZWYuYXR0YWNoKHRoaXMudG9vbHRpcFBvcnRhbCkuaW5zdGFuY2U7XG4gICAgdGhpcy50b29sdGlwSW5zdGFuY2UuY29udGVudCA9IHRoaXMuY29udGVudDtcbiAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZS5zdHlsZSA9IHRoaXMuc3R5bGU7XG4gICAgdGhpcy50b29sdGlwSW5zdGFuY2VcbiAgICAgIC5hZnRlck1vdXNlTGVhdmUoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudG9vbHRpcEluc3RhbmNlRGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zb2Z0SGlkZSgpKSk7XG5cbiAgICAvLyBUZWxsIHRoZSBpbnN0YW5jZSBjdXJyZW50IHBvc2l0aW9uIChsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pXG4gICAgdGhpcy5jdXJyZW50UG9zaXRpb24kXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy50b29sdGlwSW5zdGFuY2VEZXN0cm95ZWQkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHBvc2l0aW9uKSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy50b29sdGlwSW5zdGFuY2UucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICAgICAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZS5vZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBoaWRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vdmVybGF5UmVmPy5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZURlc3Ryb3llZCQubmV4dCgpO1xuICAgIHRoaXMudG9vbHRpcEluc3RhbmNlRGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuICAgIHRoaXMudG9vbHRpcEluc3RhbmNlID0gbnVsbDtcbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub3ZlcmxheVJlZj8uaGFzQXR0YWNoZWQoKSkge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJvamVjdENvbXBvbmVudDxUPihjb21wb25lbnRUeXBlOiBUeXBlPFQ+KTogVCB7XG4gICAgaWYgKCF0aGlzLnRvb2x0aXBJbnN0YW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJ5aW5nIHRvIHByb2plY3QgY29udGVudCBpbnRvIGEgdG9vbHRpcCB0aGF0IGlzIG5vdCB5ZXQgY3JlYXRlZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvb2x0aXBJbnN0YW5jZS5wcm9qZWN0Q29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpXG4gIGhhbmRsZU1vdXNlRW50ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tb3VzZU92ZXIgPSB0cnVlO1xuICAgIHRoaXMuc2hvdygpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXG4gIGhhbmRsZU1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tb3VzZU92ZXIgPSBmYWxzZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc29mdEhpZGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogY2xvc2VzIG9ubHkgaWYgbW91c2UgaXMgbm90IG92ZXIgdGhlIGhvc3QgZWxlbWVudCBub3IgdGhlIHRvb2x0aXAgaXRzZWxmXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgc29mdEhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLm1vdXNlT3ZlciAmJiAhdGhpcy50b29sdGlwSW5zdGFuY2U/Lm1vdXNlT3Zlcikge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5KCk6IE92ZXJsYXlSZWYge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLm92ZXJsYXlSZWY7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVxuICAgICAgLnBvc2l0aW9uKClcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZik7XG4gICAgdGhpcy5jdXJyZW50UG9zaXRpb24kID0gcG9zaXRpb25TdHJhdGVneS5wb3NpdGlvbkNoYW5nZXMucGlwZShcbiAgICAgIG1hcCgocG9zKSA9PiBwb3MuY29ubmVjdGlvblBhaXIucGFuZWxDbGFzcyBhcyBOY1Rvb2x0aXBQbGFjZW1lbnQpXG4gICAgKTtcblxuICAgIGNvbnN0IHNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpO1xuXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7IHBvc2l0aW9uU3RyYXRlZ3ksIHNjcm9sbFN0cmF0ZWd5IH0pO1xuICAgIHRoaXMub3ZlcmxheVJlZlxuICAgICAgLmtleWRvd25FdmVudHMoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5vdmVybGF5UmVmPy5oYXNBdHRhY2hlZCgpICYmXG4gICAgICAgICAgZXZlbnQua2V5Q29kZSA9PT0gRVNDQVBFICYmXG4gICAgICAgICAgIWhhc01vZGlmaWVyS2V5KGV2ZW50KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XG5cbiAgICByZXR1cm4gdGhpcy5vdmVybGF5UmVmO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUb29sdGlwUGxhY2VtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLm92ZXJsYXlSZWYuZ2V0Q29uZmlnKClcbiAgICAgIC5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLmdldFBvc2l0aW9ucyh0aGlzLl9wbGFjZW1lbnQpO1xuICAgIHBvc2l0aW9uLndpdGhQb3NpdGlvbnMocG9zaXRpb25zKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25zKFxuICAgIHByZWZlcnJlZFBsYWNlbWVudDogTmNUb29sdGlwUGxhY2VtZW50XG4gICk6IENvbm5lY3RlZFBvc2l0aW9uW10ge1xuICAgIGNvbnN0IHJpZ2h0OiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtcbiAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcbiAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0LFxuICAgICAgcGFuZWxDbGFzczogJ3JpZ2h0JyxcbiAgICB9O1xuXG4gICAgY29uc3QgbGVmdDogQ29ubmVjdGVkUG9zaXRpb24gPSB7XG4gICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICBvdmVybGF5WTogJ2NlbnRlcicsXG4gICAgICBvZmZzZXRYOiAtdGhpcy5vZmZzZXQsXG4gICAgICBwYW5lbENsYXNzOiAnbGVmdCcsXG4gICAgfTtcblxuICAgIGNvbnN0IHRvcDogQ29ubmVjdGVkUG9zaXRpb24gPSB7XG4gICAgICBvcmlnaW5YOiAnY2VudGVyJyxcbiAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxuICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgb2Zmc2V0WTogLXRoaXMub2Zmc2V0LFxuICAgICAgcGFuZWxDbGFzczogJ3RvcCcsXG4gICAgfTtcblxuICAgIGNvbnN0IGJvdHRvbTogQ29ubmVjdGVkUG9zaXRpb24gPSB7XG4gICAgICBvcmlnaW5YOiAnY2VudGVyJyxcbiAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxuICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgb2Zmc2V0WTogdGhpcy5vZmZzZXQsXG4gICAgICBwYW5lbENsYXNzOiAnYm90dG9tJyxcbiAgICB9O1xuXG4gICAgc3dpdGNoIChwcmVmZXJyZWRQbGFjZW1lbnQpIHtcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgcmV0dXJuIFtyaWdodCwgbGVmdCwgYm90dG9tLCB0b3BdO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHJldHVybiBbbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wXTtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIHJldHVybiBbdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0XTtcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHJldHVybiBbYm90dG9tLCB0b3AsIHJpZ2h0LCBsZWZ0XTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICBgXCIke3ByZWZlcnJlZFBsYWNlbWVudH1cIiB2YWx1ZSBmb3IgJ3BsYWNlbWVudCcgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4gQXZhaWxhYmxlIG9wdGlvbnM6IGFmdGVyLCBiZWZvcmUsIHRvcCwgYm90dG9tLCBsZWZ0IG9yIHJpZ2h0LmBcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==