@hxui/angular
Version:
This README includes the steps that are necessary to import the HxUi-angular into a project or to contribute with development.
356 lines (355 loc) • 32.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Directive, HostListener, ViewContainerRef, Input, HostBinding, ElementRef, NgZone, ComponentFactoryResolver } from '@angular/core';
import { TooltipContentComponent } from './tooltip-content.component';
import { TooltipConfig } from './tooltip.config';
import { Context } from '../enums';
import { ComponentPortal } from '@angular/cdk/portal';
import { Overlay, ScrollDispatcher } from '@angular/cdk/overlay';
import { Directionality } from '@angular/cdk/bidi';
import { takeUntil, take } from 'rxjs/operators';
import { Subject } from 'rxjs';
var TooltipDirective = /** @class */ (function () {
function TooltipDirective(_elementRef, _viewContainerRef, overlay, _ngZone, _dir, _scrollDispatcher, _componentFactoryResolver, _config) {
this._elementRef = _elementRef;
this._viewContainerRef = _viewContainerRef;
this.overlay = overlay;
this._ngZone = _ngZone;
this._dir = _dir;
this._scrollDispatcher = _scrollDispatcher;
this._componentFactoryResolver = _componentFactoryResolver;
this._config = _config;
this._destroyed = new Subject();
this.position = 'relative';
this.placement = 'bottom';
this.showDelay = this._config.showDelay;
this.hideDelay = this._config.hideDelay;
this.context = Context.None;
Object.assign(this, _config);
}
/**
* @return {?}
*/
TooltipDirective.prototype.show = /**
* @return {?}
*/
function () {
this._show();
};
/**
* @return {?}
*/
TooltipDirective.prototype.hide = /**
* @return {?}
*/
function () {
this._hide();
};
/**
* Dispose the tooltip when destroyed.
*/
/**
* Dispose the tooltip when destroyed.
* @return {?}
*/
TooltipDirective.prototype.ngOnDestroy = /**
* Dispose the tooltip when destroyed.
* @return {?}
*/
function () {
if (this._overlayRef) {
this._overlayRef.dispose();
this._tooltipInstance = null;
}
this._destroyed.next();
this._destroyed.complete();
};
/**
* @param {?=} delay
* @return {?}
*/
TooltipDirective.prototype._show = /**
* @param {?=} delay
* @return {?}
*/
function (delay) {
var _this = this;
if (delay === void 0) { delay = this.showDelay; }
if (this.disabled || !this.content) {
return;
}
var /** @type {?} */ overlayRef = this._createOverlay();
this._detach();
this._portal = this._portal || new ComponentPortal(TooltipContentComponent, this._viewContainerRef);
this._tooltipInstance = overlayRef.attach(this._portal).instance;
this._tooltipInstance.afterHidden()
.pipe(takeUntil(this._destroyed))
.subscribe(function () { return _this._detach(); });
this._updateTooltipContent(); /** @type {?} */
((this._tooltipInstance)).show(delay);
};
/**
* @param {?=} delay
* @return {?}
*/
TooltipDirective.prototype._hide = /**
* @param {?=} delay
* @return {?}
*/
function (delay) {
if (delay === void 0) { delay = this.hideDelay; }
if (this._tooltipInstance) {
this._tooltipInstance.hide(delay);
}
};
/**
* @return {?}
*/
TooltipDirective.prototype._createOverlay = /**
* @return {?}
*/
function () {
var _this = this;
if (this._overlayRef) {
return this._overlayRef;
}
var /** @type {?} */ positionStrategy = this.overlay.position()
.flexibleConnectedTo(this._elementRef)
.withTransformOriginOn('.hx-tooltip')
.withFlexibleDimensions(false);
this._overlayRef = this.overlay.create({
positionStrategy: positionStrategy,
panelClass: 'hxa-tooltip-panel',
scrollStrategy: this.overlay.scrollStrategies.reposition()
});
this._updatePosition();
this._overlayRef.detachments()
.pipe(takeUntil(this._destroyed))
.subscribe(function () { return _this._detach(); });
return this._overlayRef;
};
/**
* @return {?}
*/
TooltipDirective.prototype._updatePosition = /**
* @return {?}
*/
function () {
var /** @type {?} */ position = /** @type {?} */ (((this._overlayRef)).getConfig().positionStrategy);
var /** @type {?} */ origin = this._getOrigin();
var /** @type {?} */ overlay = this._getOverlayPosition();
position.withPositions([
tslib_1.__assign({}, origin.main, overlay.main),
tslib_1.__assign({}, origin.fallback, overlay.fallback)
]);
};
/**
* Returns the origin position and a fallback position based on the user's position preference.
* The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`).
* @return {?}
*/
TooltipDirective.prototype._getOrigin = /**
* Returns the origin position and a fallback position based on the user's position preference.
* The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`).
* @return {?}
*/
function () {
var /** @type {?} */ placement = this.placement;
var /** @type {?} */ originPlacement;
if (placement === 'top' || placement === 'bottom') {
originPlacement = { originX: 'center', originY: placement === 'top' ? 'top' : 'bottom' };
}
else if (placement === 'left') {
originPlacement = { originX: 'start', originY: 'center' };
}
else if (placement === 'right') {
originPlacement = { originX: 'end', originY: 'center' };
}
else {
console.error('Position error', placement);
}
var _a = this._invertPosition(originPlacement.originX, originPlacement.originY), x = _a.x, y = _a.y;
return {
main: originPlacement,
fallback: { originX: x, originY: y }
};
};
/**
* Returns the overlay position and a fallback position based on the user's preference
* @return {?}
*/
TooltipDirective.prototype._getOverlayPosition = /**
* Returns the overlay position and a fallback position based on the user's preference
* @return {?}
*/
function () {
var /** @type {?} */ placement = this.placement;
var /** @type {?} */ overlayPlacement;
if (placement === 'top') {
overlayPlacement = { overlayX: 'center', overlayY: 'bottom' };
}
else if (placement === 'bottom') {
overlayPlacement = { overlayX: 'center', overlayY: 'top' };
}
else if (placement === 'left') {
overlayPlacement = { overlayX: 'end', overlayY: 'center' };
}
else if (placement === 'right') {
overlayPlacement = { overlayX: 'start', overlayY: 'center' };
}
else {
console.error('Could not find a position', placement);
}
var _a = this._invertPosition(overlayPlacement.overlayX, overlayPlacement.overlayY), x = _a.x, y = _a.y;
return {
main: overlayPlacement,
fallback: { overlayX: x, overlayY: y }
};
};
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
TooltipDirective.prototype._invertPosition = /**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
if (this.position === 'top' || this.position === 'bottom') {
if (y === 'top') {
y = 'bottom';
}
else if (y === 'bottom') {
y = 'top';
}
}
else {
if (x === 'end') {
x = 'start';
}
else if (x === 'start') {
x = 'end';
}
}
return { x: x, y: y };
};
/**
* @return {?}
*/
TooltipDirective.prototype._detach = /**
* @return {?}
*/
function () {
if (this._overlayRef && this._overlayRef.hasAttached()) {
this._overlayRef.detach();
}
this._tooltipInstance = null;
};
/**
* Updates the tooltip content and repositions the overlay according to the new content length
* @return {?}
*/
TooltipDirective.prototype._updateTooltipContent = /**
* Updates the tooltip content and repositions the overlay according to the new content length
* @return {?}
*/
function () {
var _this = this;
// Must wait for the content to be painted to the tooltip so that the overlay can properly
// calculate the correct positioning based on the size of its contents.
if (this._tooltipInstance) {
this._tooltipInstance.content = this.content;
this._tooltipInstance.placement = this.placement;
this._tooltipInstance.context = this.context;
this._ngZone.onMicrotaskEmpty.asObservable().pipe(take(1), takeUntil(this._destroyed)).subscribe(function () {
if (_this._tooltipInstance) {
/** @type {?} */ ((_this._overlayRef)).updatePosition();
}
});
}
};
TooltipDirective.decorators = [
{ type: Directive, args: [{
selector: '[hxTooltip], [hxaTooltip]'
},] },
];
/** @nocollapse */
TooltipDirective.ctorParameters = function () { return [
{ type: ElementRef, },
{ type: ViewContainerRef, },
{ type: Overlay, },
{ type: NgZone, },
{ type: Directionality, },
{ type: ScrollDispatcher, },
{ type: ComponentFactoryResolver, },
{ type: TooltipConfig, },
]; };
TooltipDirective.propDecorators = {
"position": [{ type: HostBinding, args: ['style.position',] },],
"content": [{ type: Input, args: ['hxTooltip',] },],
"disabled": [{ type: Input },],
"placement": [{ type: Input },],
"showDelay": [{ type: Input },],
"hideDelay": [{ type: Input },],
"context": [{ type: Input },],
"show": [{ type: HostListener, args: ['focusin',] }, { type: HostListener, args: ['mouseenter',] },],
"hide": [{ type: HostListener, args: ['focusout',] }, { type: HostListener, args: ['mouseleave',] },],
};
return TooltipDirective;
}());
export { TooltipDirective };
function TooltipDirective_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TooltipDirective.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TooltipDirective.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TooltipDirective.propDecorators;
/** @type {?} */
TooltipDirective.prototype._overlayRef;
/** @type {?} */
TooltipDirective.prototype._tooltipInstance;
/** @type {?} */
TooltipDirective.prototype._portal;
/** @type {?} */
TooltipDirective.prototype._destroyed;
/** @type {?} */
TooltipDirective.prototype.position;
/** @type {?} */
TooltipDirective.prototype.content;
/** @type {?} */
TooltipDirective.prototype.disabled;
/** @type {?} */
TooltipDirective.prototype.placement;
/** @type {?} */
TooltipDirective.prototype.showDelay;
/** @type {?} */
TooltipDirective.prototype.hideDelay;
/** @type {?} */
TooltipDirective.prototype.context;
/** @type {?} */
TooltipDirective.prototype._elementRef;
/** @type {?} */
TooltipDirective.prototype._viewContainerRef;
/** @type {?} */
TooltipDirective.prototype.overlay;
/** @type {?} */
TooltipDirective.prototype._ngZone;
/** @type {?} */
TooltipDirective.prototype._dir;
/** @type {?} */
TooltipDirective.prototype._scrollDispatcher;
/** @type {?} */
TooltipDirective.prototype._componentFactoryResolver;
/** @type {?} */
TooltipDirective.prototype._config;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3Rvb2x0aXAvdG9vbHRpcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsS0FBSyxFQUNMLFdBQVcsRUFBRSxVQUFVLEVBQ1osTUFBTSxFQUFFLHdCQUF3QixFQUM1QyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUlMLE9BQU8sRUFHUCxnQkFBZ0IsRUFFTSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7O0lBOEMzQiwwQkFDVSxhQUNBLG1CQUNELFNBQ0MsU0FDQSxNQUNBLG1CQUNBLDJCQUNBO1FBUEEsZ0JBQVcsR0FBWCxXQUFXO1FBQ1gsc0JBQWlCLEdBQWpCLGlCQUFpQjtRQUNsQixZQUFPLEdBQVAsT0FBTztRQUNOLFlBQU8sR0FBUCxPQUFPO1FBQ1AsU0FBSSxHQUFKLElBQUk7UUFDSixzQkFBaUIsR0FBakIsaUJBQWlCO1FBQ2pCLDhCQUF5QixHQUF6Qix5QkFBeUI7UUFDekIsWUFBTyxHQUFQLE9BQU87MEJBM0NhLElBQUksT0FBTyxFQUFFO3dCQUdoQyxVQUFVO3lC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LEtBQUs7OEJBR0wsS0FBSzs0QkFHTCxLQUFLO3lCQUdMLFlBQVksU0FBQyxTQUFTLGNBQ3RCLFlBQVksU0FBQyxZQUFZO3lCQUt6QixZQUFZLFNBQUMsVUFBVSxjQUN2QixZQUFZLFNBQUMsWUFBWTs7MkJBakU1Qjs7U0E2QmEsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBEaXJlY3RpdmUsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbiAgSW5wdXQsXHJcbiAgSG9zdEJpbmRpbmcsIEVsZW1lbnRSZWYsXHJcbiAgT25EZXN0cm95LCBOZ1pvbmUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUb29sdGlwQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4vdG9vbHRpcC1jb250ZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRvb2x0aXBDb25maWcgfSBmcm9tICcuL3Rvb2x0aXAuY29uZmlnJztcclxuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gJy4uL2VudW1zJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7XHJcbiAgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxyXG4gIEhvcml6b250YWxDb25uZWN0aW9uUG9zLFxyXG4gIE9yaWdpbkNvbm5lY3Rpb25Qb3NpdGlvbixcclxuICBPdmVybGF5LFxyXG4gIE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb24sXHJcbiAgT3ZlcmxheVJlZixcclxuICBTY3JvbGxEaXNwYXRjaGVyLFxyXG4gIFNjcm9sbFN0cmF0ZWd5LFxyXG4gIFZlcnRpY2FsQ29ubmVjdGlvblBvc30gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQge0RpcmVjdGlvbmFsaXR5fSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XHJcbmltcG9ydCB7dGFrZVVudGlsLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1toeFRvb2x0aXBdLCBbaHhhVG9vbHRpcF0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUb29sdGlwRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgX292ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsO1xyXG4gIF90b29sdGlwSW5zdGFuY2U6IFRvb2x0aXBDb250ZW50Q29tcG9uZW50IHwgbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfcG9ydGFsOiBDb21wb25lbnRQb3J0YWw8VG9vbHRpcENvbnRlbnRDb21wb25lbnQ+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIEBIb3N0QmluZGluZygnc3R5bGUucG9zaXRpb24nKVxyXG4gIHBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuXHJcbiAgQElucHV0KCdoeFRvb2x0aXAnKVxyXG4gIGNvbnRlbnQ6IHN0cmluZztcclxuXHJcbiAgQElucHV0KClcclxuICBkaXNhYmxlZDogYm9vbGVhbjtcclxuXHJcbiAgQElucHV0KClcclxuICBwbGFjZW1lbnQ6ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnID0gJ2JvdHRvbSc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2hvd0RlbGF5ID0gdGhpcy5fY29uZmlnLnNob3dEZWxheTtcclxuXHJcbiAgQElucHV0KClcclxuICBoaWRlRGVsYXkgPSB0aGlzLl9jb25maWcuaGlkZURlbGF5O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGNvbnRleHQ6IENvbnRleHQgPSBDb250ZXh0Lk5vbmU7XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzaW4nKVxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInKVxyXG4gIHNob3coKSB7XHJcbiAgICB0aGlzLl9zaG93KCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcpXHJcbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXHJcbiAgaGlkZSgpIHtcclxuICAgdGhpcy5faGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHB1YmxpYyBvdmVybGF5OiBPdmVybGF5LFxyXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIF9kaXI6IERpcmVjdGlvbmFsaXR5LFxyXG4gICAgcHJpdmF0ZSBfc2Nyb2xsRGlzcGF0Y2hlcjogU2Nyb2xsRGlzcGF0Y2hlcixcclxuICAgIHByaXZhdGUgX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJpdmF0ZSBfY29uZmlnOiBUb29sdGlwQ29uZmlnXHJcbiAgKSB7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIF9jb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcG9zZSB0aGUgdG9vbHRpcCB3aGVuIGRlc3Ryb3llZC5cclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpO1xyXG4gICAgICB0aGlzLl90b29sdGlwSW5zdGFuY2UgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2Rlc3Ryb3llZC5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Nob3coZGVsYXk6IG51bWJlciA9IHRoaXMuc2hvd0RlbGF5KSB7XHJcblxyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMuY29udGVudCkgeyByZXR1cm47IH1cclxuXHJcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5fY3JlYXRlT3ZlcmxheSgpO1xyXG5cclxuICAgIHRoaXMuX2RldGFjaCgpO1xyXG4gICAgdGhpcy5fcG9ydGFsID0gdGhpcy5fcG9ydGFsIHx8IG5ldyBDb21wb25lbnRQb3J0YWwoVG9vbHRpcENvbnRlbnRDb21wb25lbnQsIHRoaXMuX3ZpZXdDb250YWluZXJSZWYpO1xyXG4gICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlID0gb3ZlcmxheVJlZi5hdHRhY2godGhpcy5fcG9ydGFsKS5pbnN0YW5jZTtcclxuICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5hZnRlckhpZGRlbigpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2RldGFjaCgpKTtcclxuXHJcbiAgICB0aGlzLl91cGRhdGVUb29sdGlwQ29udGVudCgpO1xyXG4gICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlIS5zaG93KGRlbGF5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hpZGUoZGVsYXk6IG51bWJlciA9IHRoaXMuaGlkZURlbGF5KSB7XHJcbiAgICBpZiAodGhpcy5fdG9vbHRpcEluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5oaWRlKGRlbGF5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZU92ZXJsYXkoKTogT3ZlcmxheVJlZiB7XHJcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikge1xyXG4gICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5LnBvc2l0aW9uKClcclxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5fZWxlbWVudFJlZilcclxuICAgICAgLndpdGhUcmFuc2Zvcm1PcmlnaW5PbignLmh4LXRvb2x0aXAnKVxyXG4gICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoe1xyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiBwb3NpdGlvblN0cmF0ZWd5LFxyXG4gICAgICBwYW5lbENsYXNzOiAnaHhhLXRvb2x0aXAtcGFuZWwnLFxyXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpXHJcbiAgICB9KTtcclxuXHJcbiAgICAgdGhpcy5fdXBkYXRlUG9zaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLl9vdmVybGF5UmVmLmRldGFjaG1lbnRzKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZGV0YWNoKCkpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9vdmVybGF5UmVmO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVBvc2l0aW9uKCkge1xyXG4gICAgY29uc3QgcG9zaXRpb24gPVxyXG4gICAgICB0aGlzLl9vdmVybGF5UmVmIS5nZXRDb25maWcoKS5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTtcclxuICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuX2dldE9yaWdpbigpO1xyXG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuX2dldE92ZXJsYXlQb3NpdGlvbigpO1xyXG5cclxuICAgIHBvc2l0aW9uLndpdGhQb3NpdGlvbnMoW1xyXG4gICAgICB7Li4ub3JpZ2luLm1haW4sIC4uLm92ZXJsYXkubWFpbn0sXHJcbiAgICAgIHsuLi5vcmlnaW4uZmFsbGJhY2ssIC4uLm92ZXJsYXkuZmFsbGJhY2t9XHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG9yaWdpbiBwb3NpdGlvbiBhbmQgYSBmYWxsYmFjayBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgdXNlcidzIHBvc2l0aW9uIHByZWZlcmVuY2UuXHJcbiAgICogVGhlIGZhbGxiYWNrIHBvc2l0aW9uIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBvcmlnaW4gKGUuZy4gYCdib3R0b20nIC0+ICd0b3AnYCkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZ2V0T3JpZ2luKCk6IHttYWluOiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb24sIGZhbGxiYWNrOiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb259IHtcclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xyXG4gICAgbGV0IG9yaWdpblBsYWNlbWVudDogT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uO1xyXG5cclxuICAgIGlmIChwbGFjZW1lbnQgPT09ICd0b3AnIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgb3JpZ2luUGxhY2VtZW50ID0ge29yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiBwbGFjZW1lbnQgPT09ICd0b3AnID8gJ3RvcCcgOiAnYm90dG9tJ307XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XHJcbiAgICAgIG9yaWdpblBsYWNlbWVudCA9IHtvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnY2VudGVyJ307XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xyXG4gICAgICBvcmlnaW5QbGFjZW1lbnQgPSB7b3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdjZW50ZXInfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Bvc2l0aW9uIGVycm9yJywgcGxhY2VtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7eCwgeX0gPSB0aGlzLl9pbnZlcnRQb3NpdGlvbihvcmlnaW5QbGFjZW1lbnQub3JpZ2luWCwgb3JpZ2luUGxhY2VtZW50Lm9yaWdpblkpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1haW46IG9yaWdpblBsYWNlbWVudCxcclxuICAgICAgZmFsbGJhY2s6IHtvcmlnaW5YOiB4LCBvcmlnaW5ZOiB5fVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXR1cm5zIHRoZSBvdmVybGF5IHBvc2l0aW9uIGFuZCBhIGZhbGxiYWNrIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZSAqL1xyXG4gIHByaXZhdGUgX2dldE92ZXJsYXlQb3NpdGlvbigpOiB7bWFpbjogT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbiwgZmFsbGJhY2s6IE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb259IHtcclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xyXG4gICAgbGV0IG92ZXJsYXlQbGFjZW1lbnQ6IE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb247XHJcblxyXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHtvdmVybGF5WDogJ2NlbnRlcicsIG92ZXJsYXlZOiAnYm90dG9tJ307XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHtvdmVybGF5WDogJ2NlbnRlcicsIG92ZXJsYXlZOiAndG9wJ307XHJcbiAgICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XHJcbiAgICAgIG92ZXJsYXlQbGFjZW1lbnQgPSB7b3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2NlbnRlcid9O1xyXG4gICAgfSBlbHNlIGlmIChwbGFjZW1lbnQgPT09ICdyaWdodCcpIHtcclxuICAgICAgb3ZlcmxheVBsYWNlbWVudCA9IHtvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdjZW50ZXInfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGEgcG9zaXRpb24nLCBwbGFjZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHt4LCB5fSA9IHRoaXMuX2ludmVydFBvc2l0aW9uKG92ZXJsYXlQbGFjZW1lbnQub3ZlcmxheVgsIG92ZXJsYXlQbGFjZW1lbnQub3ZlcmxheVkpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1haW46IG92ZXJsYXlQbGFjZW1lbnQsXHJcbiAgICAgIGZhbGxiYWNrOiB7b3ZlcmxheVg6IHgsIG92ZXJsYXlZOiB5fVxyXG4gICAgfTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIF9pbnZlcnRQb3NpdGlvbih4OiBIb3Jpem9udGFsQ29ubmVjdGlvblBvcywgeTogVmVydGljYWxDb25uZWN0aW9uUG9zKSB7XHJcbiAgICBpZiAodGhpcy5wb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGhpcy5wb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgaWYgKHkgPT09ICd0b3AnKSB7XHJcbiAgICAgICAgeSA9ICdib3R0b20nO1xyXG4gICAgICB9IGVsc2UgaWYgKHkgPT09ICdib3R0b20nKSB7XHJcbiAgICAgICAgeSA9ICd0b3AnO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoeCA9PT0gJ2VuZCcpIHtcclxuICAgICAgICB4ID0gJ3N0YXJ0JztcclxuICAgICAgfSBlbHNlIGlmICh4ID09PSAnc3RhcnQnKSB7XHJcbiAgICAgICAgeCA9ICdlbmQnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHt4LCB5fTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2RldGFjaCgpIHtcclxuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmICYmIHRoaXMuX292ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBVcGRhdGVzIHRoZSB0b29sdGlwIGNvbnRlbnQgYW5kIHJlcG9zaXRpb25zIHRoZSBvdmVybGF5IGFjY29yZGluZyB0byB0aGUgbmV3IGNvbnRlbnQgbGVuZ3RoICovXHJcbiAgcHJpdmF0ZSBfdXBkYXRlVG9vbHRpcENvbnRlbnQoKSB7XHJcbiAgICAvLyBNdXN0IHdhaXQgZm9yIHRoZSBjb250ZW50IHRvIGJlIHBhaW50ZWQgdG8gdGhlIHRvb2x0aXAgc28gdGhhdCB0aGUgb3ZlcmxheSBjYW4gcHJvcGVybHlcclxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBwb3NpdGlvbmluZyBiYXNlZCBvbiB0aGUgc2l6ZSBvZiBpdHMgY29udGVudHMuXHJcbiAgICBpZiAodGhpcy5fdG9vbHRpcEluc3RhbmNlKSB7XHJcbiAgICAgICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XHJcbiAgICAgICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlLnBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xyXG4gICAgICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xyXG5cclxuXHJcbiAgICAgIHRoaXMuX25nWm9uZS5vbk1pY3JvdGFza0VtcHR5LmFzT2JzZXJ2YWJsZSgpLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKVxyXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSkge1xyXG4gICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiEudXBkYXRlUG9zaXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=