@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
526 lines • 42.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: popper/popper.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, NgZone, Output, Renderer2, ViewChild, } from '@angular/core';
import Popper from 'popper.js';
var PopperComponent = /** @class */ (function () {
function PopperComponent(el, renderer, ngZone, changeDetectorRef) {
var _this = this;
this.el = el;
this.renderer = renderer;
this.ngZone = ngZone;
this.changeDetectorRef = changeDetectorRef;
this.fluidPopper = true;
this.appendTo = 'body';
this.popper = null;
this._isOpen = false;
this.directionAnimationTransformOrigin = {
'top': '0 100%',
'bottom': '0 0'
};
this.openChange = new EventEmitter();
this.onDocumentClick = (/**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (!!_this.appendTo && _this.popperContainer.nativeElement !== $event.target &&
!_this.popperContainer.nativeElement.contains($event.target)) {
_this.open = false;
}
else if (!_this.appendTo && _this.open && !_this.el.nativeElement.contains($event.target)) {
_this.open = false;
}
});
this.blockEvent = (/**
* @param {?} $event
* @return {?}
*/
function ($event) {
$event.preventDefault();
$event.stopPropagation();
});
}
Object.defineProperty(PopperComponent.prototype, "open", {
get: /**
* @return {?}
*/
function () {
return this._isOpen;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
var _this = this;
if (this._isOpen === value) {
return;
}
this.animate = true;
if (!!value) {
this.show();
}
else {
this.close();
}
this._isOpen = value;
PopperComponent.nextTick((/**
* @return {?}
*/
function () {
_this.openChange.emit(value);
_this.setBlurListener();
}));
},
enumerable: true,
configurable: true
});
/**
* @param {?} fn
* @return {?}
*/
PopperComponent.nextTick = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
var _this = this;
// Force to run fn after current data changed.
setTimeout((/**
* @return {?}
*/
function () { return fn.bind(_this)(); }));
};
/**
* @return {?}
*/
PopperComponent.prototype.show = /**
* @return {?}
*/
function () {
var e_1, _a;
// Append to selector or original parent.
if (!!this.appendTo) {
if (this.fluidPopper) {
/** @type {?} */
var popperWidth = this.popperActivator.nativeElement && this.popperActivator.nativeElement.offsetWidth;
/** @type {?} */
var firstEle = this.popperContainer.nativeElement.firstElementChild;
if (firstEle.classList.contains('devui-search-container')) {
try {
for (var _b = tslib_1.__values(this.popperContainer.nativeElement.children), _c = _b.next(); !_c.done; _c = _b.next()) {
var child = _c.value;
child.style.width = popperWidth + "px";
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
}
else {
firstEle.style.width = popperWidth + "px";
}
}
this.attachPopperContainerToSelector(this.appendTo);
}
else {
this.attachPopperContainerToNode(this.popperParent);
}
this.popper = this.createPopper();
this.renderer.setStyle(this.popperContainer.nativeElement, 'display', 'block');
};
/**
* @private
* @return {?}
*/
PopperComponent.prototype.close = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var popperContainer = this.popperContainer.nativeElement;
this.setTransition('close');
// For IE 11/Edge
if (popperContainer.style.transform.match(/scale3d\(1, 1, 1\)/)) {
// Replace transform open state with close state
this.renderer.setStyle(popperContainer, 'transform', popperContainer.style.transform.replace('scale3d(1, 1, 1)', 'scale3d(1, 0, 1)'));
}
else {
// perspective(1px) solves pixel shift caused by webkit transform
this.renderer.setStyle(popperContainer, 'transform', popperContainer.style.transform + " scale3d(1, 0, 1) perspective(1px)");
}
// Set container to transparent
this.renderer.setStyle(popperContainer, 'opacity', 0);
// Can't use bind(this) since it calls itself
/** @type {?} */
var that = this;
/** @type {?} */
var handler = (/**
* @param {?} e
* @return {?}
*/
function (e) {
if (!that.open && that.popper) {
// Set final state of container to invisible
that.renderer.setStyle(popperContainer, 'display', 'none');
that.animate = false;
// Remove transition
that.setTransition();
that.popper.destroy();
that.popper = null;
that.detachPopperContainer();
}
e.currentTarget.removeEventListener(e.type, handler);
});
this.popperContainer.nativeElement.addEventListener('transitionend', handler);
};
/**
* @return {?}
*/
PopperComponent.prototype.setBlurListener = /**
* @return {?}
*/
function () {
var _this = this;
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
function () {
if (_this.open) {
document.addEventListener('click', _this.onDocumentClick);
_this.popperContainer.nativeElement.addEventListener('click', _this.blockEvent);
}
else {
document.removeEventListener('click', _this.onDocumentClick);
_this.popperContainer.nativeElement.removeEventListener('click', _this.blockEvent);
}
}));
};
/**
* @private
* @param {?} data
* @return {?}
*/
PopperComponent.prototype.applyTransitionStyle = /**
* @private
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
/** @type {?} */
var optionsContainer = this.popperContainer.nativeElement;
this.updateContainerTransitionDirection(data.flipped);
if (this.animate) {
// perspective(1px) solves pixel shift caused by webkit transform
this.renderer.setStyle(optionsContainer, 'transform', optionsContainer.style.transform + " scale3d(1, 0, 1) perspective(1px)");
// Set container init state to transparent as beginning of the transition.
this.renderer.setStyle(optionsContainer, 'opacity', 0);
PopperComponent.nextTick((/**
* @return {?}
*/
function () {
_this.setTransition('open');
/** @type {?} */
var that = _this;
/** @type {?} */
var handler = (/**
* @param {?} e
* @return {?}
*/
function (e) {
// remove transition
that.setTransition();
e.currentTarget.removeEventListener(e.type, handler);
});
optionsContainer.addEventListener('transitionend', handler);
_this.renderer.setStyle(optionsContainer, 'transform', optionsContainer.style.transform.replace('scale3d(1, 0, 1)', 'scale3d(1, 1, 1)'));
_this.renderer.setStyle(optionsContainer, 'opacity', 1);
_this.animate = false;
}));
}
else {
// handle popper re-rendering, incoming transform doesn't have scale info
this.renderer.setStyle(optionsContainer, 'transform', optionsContainer.style.transform + (this.open ? ' scale3d(1, 1, 1)' : ' scale3d(1, 0, 1)') + ' perspective(1px)');
}
};
/**
* @private
* @param {?} flipped
* @return {?}
*/
PopperComponent.prototype.updateContainerTransitionDirection = /**
* @private
* @param {?} flipped
* @return {?}
*/
function (flipped) {
/** @type {?} */
var direction = flipped ? 'top' : 'bottom';
if (this.popperDirection !== direction) {
this.popperDirection = direction;
this.setTransitionOrigin();
}
};
/**
* @private
* @return {?}
*/
PopperComponent.prototype.setTransitionOrigin = /**
* @private
* @return {?}
*/
function () {
if (this.popperContainer.nativeElement) {
this.renderer.setStyle(this.popperContainer.nativeElement, 'transform-origin', this.directionAnimationTransformOrigin[this.popperDirection]);
}
};
/**
* @private
* @return {?}
*/
PopperComponent.prototype.createPopper = /**
* @private
* @return {?}
*/
function () {
return new Popper(this.popperActivator.nativeElement, this.popperContainer.nativeElement, (/** @type {?} */ ({
placement: 'bottom-start',
modifiers: {
preventOverflow: {
// Do not stick to the window edge
escapeWithReference: true,
},
applyReactStyle: {
enabled: true,
// Apply extra transition and transform to popper
fn: this.applyTransitionStyle.bind(this),
},
offset: {
// Set vertical offset 5px
offset: '0, 5px'
}
},
positionFixed: !!this.appendTo
})));
};
/**
* @private
* @param {?=} command
* @return {?}
*/
PopperComponent.prototype.setTransition = /**
* @private
* @param {?=} command
* @return {?}
*/
function (command) {
if (command === void 0) { command = null; }
/** @type {?} */
var popperContainer = this.popperContainer.nativeElement;
if (this.animate && command) {
if (command === 'open') {
this.renderer.setStyle(popperContainer, 'transition', 'transform .2s cubic-bezier(0.23, 1, 0.32, 1)');
}
else if (command === 'close') {
popperContainer.style.transition = 'all .15s cubic-bezier(0.755, 0.05, 0.855, 0.06)';
}
}
else {
this.renderer.setStyle(popperContainer, 'transition', null);
}
};
/**
* @return {?}
*/
PopperComponent.prototype.update = /**
* @return {?}
*/
function () {
var _this = this;
PopperComponent.nextTick((/**
* @return {?}
*/
function () {
if (_this.popper) {
_this.popper.update();
}
}));
};
/**
* @return {?}
*/
PopperComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
// Close popper
this.open = false;
};
/**
* @private
* @return {?}
*/
PopperComponent.prototype.detachPopperContainer = /**
* @private
* @return {?}
*/
function () {
// Cache popper's parent and popper node.
this.popperParent = this.popperContainer.nativeElement.parentNode;
this.popperNode = this.popperContainer.nativeElement;
if (this.popperParent && this.popperNode) {
this.popperParent.removeChild(this.popperNode);
}
};
/**
* @private
* @param {?} nodeParent
* @return {?}
*/
PopperComponent.prototype.attachPopperContainerToNode = /**
* @private
* @param {?} nodeParent
* @return {?}
*/
function (nodeParent) {
if (nodeParent && this.popperNode) {
this.popperParent = nodeParent;
this.popperParent.appendChild(this.popperNode);
}
};
/**
* @private
* @param {?} targetSelector
* @return {?}
*/
PopperComponent.prototype.attachPopperContainerToSelector = /**
* @private
* @param {?} targetSelector
* @return {?}
*/
function (targetSelector) {
/** @type {?} */
var nodeParent = document.querySelector(targetSelector);
this.attachPopperContainerToNode(nodeParent);
};
/**
* @return {?}
*/
PopperComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
// Detach popper container once view initialized.
this.detachPopperContainer();
};
PopperComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'popper-component',
template: "<div class=\"popper\">\r\n <div class=\"popper-activator\" #popperActivator>\r\n <ng-content select=\"[popper-activator]\"></ng-content>\r\n </div>\r\n <div class=\"popper-container\" #popperContainer [ngClass]=\"{ fluid: fluidPopper && !appendTo }\">\r\n <ng-content select=\"[popper-prepend]\"></ng-content>\r\n <div class=\"popper-container-scrollable devui-scrollbar\">\r\n <ng-content select=\"[popper-container]\"></ng-content>\r\n </div>\r\n <ng-content select=\"[popper-append]\"></ng-content>\r\n </div>\r\n</div>\r\n",
styles: [".popper{position:relative;width:100%}.popper .popper-activator{width:100%}.popper-container{display:none;z-index:1051;position:absolute;box-shadow:0 4px 8px 0 rgba(41,48,64,.2);background:#fff;border:none;backface-visibility:hidden;-webkit-backface-visibility:hidden}.popper-container .popper-container-scrollable{max-height:300px;min-height:40px;width:100%;overflow-y:auto;overflow-x:auto}.popper-container.fluid{width:100%}:host{display:block}"]
}] }
];
/** @nocollapse */
PopperComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: NgZone },
{ type: ChangeDetectorRef }
]; };
PopperComponent.propDecorators = {
open: [{ type: Input }],
fluidPopper: [{ type: Input }],
appendTo: [{ type: Input }],
openChange: [{ type: Output }],
popperActivator: [{ type: ViewChild, args: ['popperActivator', { static: true },] }],
popperContainer: [{ type: ViewChild, args: ['popperContainer', { static: true },] }]
};
return PopperComponent;
}());
export { PopperComponent };
if (false) {
/** @type {?} */
PopperComponent.prototype.fluidPopper;
/** @type {?} */
PopperComponent.prototype.appendTo;
/**
* @type {?}
* @protected
*/
PopperComponent.prototype.popper;
/**
* @type {?}
* @protected
*/
PopperComponent.prototype._isOpen;
/**
* @type {?}
* @protected
*/
PopperComponent.prototype.animate;
/**
* @type {?}
* @protected
*/
PopperComponent.prototype.popperDirection;
/**
* @type {?}
* @protected
*/
PopperComponent.prototype.directionAnimationTransformOrigin;
/**
* @type {?}
* @protected
*/
PopperComponent.prototype.popperNode;
/**
* @type {?}
* @protected
*/
PopperComponent.prototype.popperParent;
/** @type {?} */
PopperComponent.prototype.openChange;
/** @type {?} */
PopperComponent.prototype.popperActivator;
/** @type {?} */
PopperComponent.prototype.popperContainer;
/** @type {?} */
PopperComponent.prototype.onDocumentClick;
/**
* @type {?}
* @private
*/
PopperComponent.prototype.blockEvent;
/**
* @type {?}
* @protected
*/
PopperComponent.prototype.el;
/**
* @type {?}
* @protected
*/
PopperComponent.prototype.renderer;
/**
* @type {?}
* @protected
*/
PopperComponent.prototype.ngZone;
/**
* @type {?}
* @protected
*/
PopperComponent.prototype.changeDetectorRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL3V0aWxzLyIsInNvdXJjZXMiOlsicG9wcGVyL3BvcHBlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUVOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sTUFBdUIsTUFBTSxXQUFXLENBQUM7QUFFaEQ7SUE2REUseUJBQXNCLEVBQWMsRUFBWSxRQUFtQixFQUFZLE1BQWMsRUFDdkUsaUJBQW9DO1FBRDFELGlCQUVDO1FBRnFCLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBWSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVksV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUN2RSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBbkNqRCxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNuQixhQUFRLEdBQUcsTUFBTSxDQUFDO1FBQ2pCLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFDdEIsWUFBTyxHQUFRLEtBQUssQ0FBQztRQUdyQixzQ0FBaUMsR0FBRztZQUM1QyxLQUFLLEVBQUUsUUFBUTtZQUNmLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7UUFJUSxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVExQyxvQkFBZTs7OztRQUFHLFVBQUMsTUFBa0I7WUFDbkMsSUFBSSxDQUFDLENBQUMsS0FBSSxDQUFDLFFBQVEsSUFBSSxLQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsS0FBSyxNQUFNLENBQUMsTUFBTTtnQkFDekUsQ0FBQyxLQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM3RCxLQUFJLENB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Ozs7OztJQUNGLHFDQUFxQjs7Ozs7SUFDckIsdUNBQXVCOztJQUV2QixxQ0FBMEM7O0lBQzFDLDBDQUE0RTs7SUFDNUUsMENBQTRFOztJQU01RSwwQ0FPQzs7Ozs7SUFDRCxxQ0FHQzs7Ozs7SUFFVyw2QkFBd0I7Ozs7O0lBQUUsbUNBQTZCOzs7OztJQUFFLGlDQUF3Qjs7Ozs7SUFDakYsNENBQThDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBOZ1pvbmUsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgUG9wcGVyLCB7UG9wcGVyT3B0aW9uc30gZnJvbSAncG9wcGVyLmpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ3BvcHBlci1jb21wb25lbnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wb3BwZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogW2AuL3BvcHBlci5jb21wb25lbnQuc2Nzc2BdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUG9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgZ2V0IG9wZW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG9wZW4odmFsdWUpIHtcclxuICAgIGlmICh0aGlzLl9pc09wZW4gPT09IHZhbHVlKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5hbmltYXRlID0gdHJ1ZTtcclxuICAgIGlmICghIXZhbHVlKSB7XHJcbiAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faXNPcGVuID0gdmFsdWU7XHJcblxyXG4gICAgUG9wcGVyQ29tcG9uZW50Lm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQodmFsdWUpO1xyXG4gICAgICB0aGlzLnNldEJsdXJMaXN0ZW5lcigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIGZsdWlkUG9wcGVyID0gdHJ1ZTtcclxuICBASW5wdXQoKSBhcHBlbmRUbyA9ICdib2R5JztcclxuICBwcm90ZWN0ZWQgcG9wcGVyOiBQb3BwZXIgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfaXNPcGVuOiBhbnkgPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgYW5pbWF0ZTogYm9vbGVhbjtcclxuICBwcm90ZWN0ZWQgcG9wcGVyRGlyZWN0aW9uOiBzdHJpbmc7XHJcbiAgcHJvdGVjdGVkIGRpcmVjdGlvbkFuaW1hdGlvblRyYW5zZm9ybU9yaWdpbiA9IHtcclxuICAgICd0b3AnOiAnMCAxMDAlJyxcclxuICAgICdib3R0b20nOiAnMCAwJ1xyXG4gIH07XHJcbiAgcHJvdGVjdGVkIHBvcHBlck5vZGU7XHJcbiAgcHJvdGVjdGVkIHBvcHBlclBhcmVudDtcclxuXHJcbiAgQE91dHB1dCgpIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQFZpZXdDaGlsZCgncG9wcGVyQWN0aXZhdG9yJywgeyBzdGF0aWM6IHRydWUgfSkgcG9wcGVyQWN0aXZhdG9yOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3BvcHBlckNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIHBvcHBlckNvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuXHJcbiAgc3RhdGljIG5leHRUaWNrKGZuKSB7XHJcbiAgICAvLyBGb3JjZSB0byBydW4gZm4gYWZ0ZXIgY3VycmVudCBkYXRhIGNoYW5nZWQuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IGZuLmJpbmQodGhpcykoKSk7XHJcbiAgfVxyXG4gIG9uRG9jdW1lbnRDbGljayA9ICgkZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGlmICghIXRoaXMuYXBwZW5kVG8gJiYgdGhpcy5wb3BwZXJDb250YWluZXIubmF0aXZlRWxlbWVudCAhPT0gJGV2ZW50LnRhcmdldCAmJlxyXG4gICAgICAhdGhpcy5wb3BwZXJDb250YWluZXIubmF0aXZlRWxlbWVudC5jb250YWlucygkZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAoIXRoaXMuYXBwZW5kVG8gJiYgdGhpcy5vcGVuICYmICF0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoJGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgYmxvY2tFdmVudCA9ICgkZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmLCBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJvdGVjdGVkIG5nWm9uZTogTmdab25lLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICAvLyBBcHBlbmQgdG8gc2VsZWN0b3Igb3Igb3JpZ2luYWwgcGFyZW50LlxyXG4gICAgaWYgKCEhdGhpcy5hcHBlbmRUbykge1xyXG4gICAgICBpZiAodGhpcy5mbHVpZFBvcHBlcikge1xyXG4gICAgICAgIGNvbnN0IHBvcHBlcldpZHRoID0gdGhpcy5wb3BwZXJBY3RpdmF0b3IubmF0aXZlRWxlbWVudCAmJiB0aGlzLnBvcHBlckFjdGl2YXRvci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGNvbnN0IGZpcnN0RWxlID0gIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcbiAgICAgICAgaWYgKGZpcnN0RWxlLmNsYXNzTGlzdC5jb250YWlucygnZGV2dWktc2VhcmNoLWNvbnRhaW5lcicpKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgY2hpbGQuc3R5bGUud2lkdGggPSBgJHtwb3BwZXJXaWR0aH1weGA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZpcnN0RWxlLnN0eWxlLndpZHRoID0gYCR7cG9wcGVyV2lkdGh9cHhgO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmF0dGFjaFBvcHBlckNvbnRhaW5lclRvU2VsZWN0b3IodGhpcy5hcHBlbmRUbyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmF0dGFjaFBvcHBlckNvbnRhaW5lclRvTm9kZSh0aGlzLnBvcHBlclBhcmVudCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvcHBlciA9IHRoaXMuY3JlYXRlUG9wcGVyKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ2Jsb2NrJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsb3NlKCkge1xyXG4gICAgY29uc3QgcG9wcGVyQ29udGFpbmVyID0gdGhpcy5wb3BwZXJDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuc2V0VHJhbnNpdGlvbignY2xvc2UnKTtcclxuICAgIC8vIEZvciBJRSAxMS9FZGdlXHJcbiAgICBpZiAocG9wcGVyQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybS5tYXRjaCgvc2NhbGUzZFxcKDEsIDEsIDFcXCkvKSkge1xyXG4gICAgICAvLyBSZXBsYWNlIHRyYW5zZm9ybSBvcGVuIHN0YXRlIHdpdGggY2xvc2Ugc3RhdGVcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwb3BwZXJDb250YWluZXIsICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgIHBvcHBlckNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0ucmVwbGFjZSgnc2NhbGUzZCgxLCAxLCAxKScsICdzY2FsZTNkKDEsIDAsIDEpJykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gcGVyc3BlY3RpdmUoMXB4KSBzb2x2ZXMgcGl4ZWwgc2hpZnQgY2F1c2VkIGJ5IHdlYmtpdCB0cmFuc2Zvcm1cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwb3BwZXJDb250YWluZXIsICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgIHBvcHBlckNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gKyBgIHNjYWxlM2QoMSwgMCwgMSkgcGVyc3BlY3RpdmUoMXB4KWApO1xyXG4gICAgfVxyXG4gICAgLy8gU2V0IGNvbnRhaW5lciB0byB0cmFuc3BhcmVudFxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwb3BwZXJDb250YWluZXIsICdvcGFjaXR5JywgMCk7XHJcblxyXG4gICAgLy8gQ2FuJ3QgdXNlIGJpbmQodGhpcykgc2luY2UgaXQgY2FsbHMgaXRzZWxmXHJcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcclxuICAgIGNvbnN0IGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBpZiAoIXRoYXQub3BlbiAmJiB0aGF0LnBvcHBlcikge1xyXG4gICAgICAgIC8vIFNldCBmaW5hbCBzdGF0ZSBvZiBjb250YWluZXIgdG8gaW52aXNpYmxlXHJcbiAgICAgICAgdGhhdC5yZW5kZXJlci5zZXRTdHlsZShwb3BwZXJDb250YWluZXIsICdkaXNwbGF5JywgJ25vbmUnKTtcclxuICAgICAgICB0aGF0LmFuaW1hdGUgPSBmYWxzZTtcclxuICAgICAgICAvLyBSZW1vdmUgdHJhbnNpdGlvblxyXG4gICAgICAgIHRoYXQuc2V0VHJhbnNpdGlvbigpO1xyXG4gICAgICAgIHRoYXQucG9wcGVyLmRlc3Ryb3koKTtcclxuICAgICAgICB0aGF0LnBvcHBlciA9IG51bGw7XHJcbiAgICAgICAgdGhhdC5kZXRhY2hQb3BwZXJDb250YWluZXIoKTtcclxuICAgICAgfVxyXG4gICAgICBlLmN1cnJlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsIGhhbmRsZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHNldEJsdXJMaXN0ZW5lcigpIHtcclxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMub3Blbikge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgICAgIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmJsb2NrRXZlbnQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgICAgIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmJsb2NrRXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlUcmFuc2l0aW9uU3R5bGUoZGF0YTogUG9wcGVyLkRhdGEpIHtcclxuICAgIGNvbnN0IG9wdGlvbnNDb250YWluZXIgPSB0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy51cGRhdGVDb250YWluZXJUcmFuc2l0aW9uRGlyZWN0aW9uKGRhdGEuZmxpcHBlZCk7XHJcbiAgICBpZiAodGhpcy5hbmltYXRlKSB7XHJcbiAgICAgIC8vIHBlcnNwZWN0aXZlKDFweCkgc29sdmVzIHBpeGVsIHNoaWZ0IGNhdXNlZCBieSB3ZWJraXQgdHJhbnNmb3JtXHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3B0aW9uc0NvbnRhaW5lciwgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgb3B0aW9uc0NvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gKyBgIHNjYWxlM2QoMSwgMCwgMSkgcGVyc3BlY3RpdmUoMXB4KWApO1xyXG4gICAgICAvLyBTZXQgY29udGFpbmVyIGluaXQgc3RhdGUgdG8gdHJhbnNwYXJlbnQgYXMgYmVnaW5uaW5nIG9mIHRoZSB0cmFuc2l0aW9uLlxyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG9wdGlvbnNDb250YWluZXIsICdvcGFjaXR5JywgMCk7XHJcbiAgICAgIFBvcHBlckNvbXBvbmVudC5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uKCdvcGVuJyk7XHJcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAvLyByZW1vdmUgdHJhbnNpdGlvblxyXG4gICAgICAgICAgdGhhdC5zZXRUcmFuc2l0aW9uKCk7XHJcbiAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsIGhhbmRsZXIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIG9wdGlvbnNDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3B0aW9uc0NvbnRhaW5lciwgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgICBvcHRpb25zQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybS5yZXBsYWNlKCdzY2FsZTNkKDEsIDAsIDEpJywgJ3NjYWxlM2QoMSwgMSwgMSknKSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvcHRpb25zQ29udGFpbmVyLCAnb3BhY2l0eScsIDEpO1xyXG4gICAgICAgIHRoaXMuYW5pbWF0ZSA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGhhbmRsZSBwb3BwZXIgcmUtcmVuZGVyaW5nLCBpbmNvbWluZyB0cmFuc2Zvcm0gZG9lc24ndCBoYXZlIHNjYWxlIGluZm9cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvcHRpb25zQ29udGFpbmVyLCAndHJhbnNmb3JtJyxcclxuICAgICAgICBvcHRpb25zQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSArICh0aGlzLm9wZW4gPyAnIHNjYWxlM2QoMSwgMSwgMSknIDogJyBzY2FsZTNkKDEsIDAsIDEpJykgKyAnIHBlcnNwZWN0aXZlKDFweCknKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29udGFpbmVyVHJhbnNpdGlvbkRpcmVjdGlvbihmbGlwcGVkOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBmbGlwcGVkID8gJ3RvcCcgOiAnYm90dG9tJztcclxuICAgIGlmICh0aGlzLnBvcHBlckRpcmVjdGlvbiAhPT0gZGlyZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMucG9wcGVyRGlyZWN0aW9uID0gZGlyZWN0aW9uO1xyXG4gICAgICB0aGlzLnNldFRyYW5zaXRpb25PcmlnaW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VHJhbnNpdGlvbk9yaWdpbigpIHtcclxuICAgIGlmICh0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wb3BwZXJDb250YWluZXIubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybS1vcmlnaW4nLFxyXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uQW5pbWF0aW9uVHJhbnNmb3JtT3JpZ2luW3RoaXMucG9wcGVyRGlyZWN0aW9uXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVBvcHBlcigpIHtcclxuICAgIHJldHVybiBuZXcgUG9wcGVyKHRoaXMucG9wcGVyQWN0aXZhdG9yLm5hdGl2ZUVsZW1lbnQsIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgcGxhY2VtZW50OiAnYm90dG9tLXN0YXJ0JyxcclxuICAgICAgbW9kaWZpZXJzOiB7XHJcbiAgICAgICAgcHJldmVudE92ZXJmbG93OiB7XHJcbiAgICAgICAgICAvLyBEbyBub3Qgc3RpY2sgdG8gdGhlIHdpbmRvdyBlZGdlXHJcbiAgICAgICAgICBlc2NhcGVXaXRoUmVmZXJlbmNlOiB0cnVlLFxyXG4gICAgICAgICAgLy8gYm91bmRhcmllc0VsZW1lbnQ6ICd2aWV3cG9ydCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIGFwcGx5UmVhY3RTdHlsZToge1xyXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgIC8vIEFwcGx5IGV4dHJhIHRyYW5zaXRpb24gYW5kIHRyYW5zZm9ybSB0byBwb3BwZXJcclxuICAgICAgICAgIGZuOiB0aGlzLmFwcGx5VHJhbnNpdGlvblN0eWxlLmJpbmQodGhpcyksXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvZmZzZXQ6IHtcclxuICAgICAgICAgIC8vIFNldCB2ZXJ0aWNhbCBvZmZzZXQgNXB4XHJcbiAgICAgICAgICBvZmZzZXQ6ICcwLCA1cHgnXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBwb3NpdGlvbkZpeGVkOiAhIXRoaXMuYXBwZW5kVG9cclxuICAgIH0gYXMgUG9wcGVyT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFRyYW5zaXRpb24oY29tbWFuZCA9IG51bGwpIHtcclxuICAgIGNvbnN0IHBvcHBlckNvbnRhaW5lciA9IHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5hbmltYXRlICYmIGNvbW1hbmQpIHtcclxuICAgICAgaWYgKGNvbW1hbmQgPT09ICdvcGVuJykge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocG9wcGVyQ29udGFpbmVyLCAndHJhbnNpdGlvbicsICd0cmFuc2Zvcm0gLjJzIGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKScpO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT09ICdjbG9zZScpIHtcclxuICAgICAgICBwb3BwZXJDb250YWluZXIuc3R5bGUudHJhbnNpdGlvbiA9ICdhbGwgLjE1cyBjdWJpYy1iZXppZXIoMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2KSc7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocG9wcGVyQ29udGFpbmVyLCAndHJhbnNpdGlvbicsIG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZSgpIHtcclxuICAgIFBvcHBlckNvbXBvbmVudC5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnBvcHBlcikgeyB0aGlzLnBvcHBlci51cGRhdGUoKTsgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vIENsb3NlIHBvcHBlclxyXG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRldGFjaFBvcHBlckNvbnRhaW5lcigpIHtcclxuICAgIC8vIENhY2hlIHBvcHBlcidzIHBhcmVudCBhbmQgcG9wcGVyIG5vZGUuXHJcbiAgICB0aGlzLnBvcHBlclBhcmVudCA9IHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgIHRoaXMucG9wcGVyTm9kZSA9IHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5wb3BwZXJQYXJlbnQgJiYgdGhpcy5wb3BwZXJOb2RlKSB7XHJcbiAgICAgIHRoaXMucG9wcGVyUGFyZW50LnJlbW92ZUNoaWxkKHRoaXMucG9wcGVyTm9kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGF0dGFjaFBvcHBlckNvbnRhaW5lclRvTm9kZShub2RlUGFyZW50KSB7XHJcbiAgICBpZiAobm9kZVBhcmVudCAmJiB0aGlzLnBvcHBlck5vZGUpIHtcclxuICAgICAgdGhpcy5wb3BwZXJQYXJlbnQgPSBub2RlUGFyZW50O1xyXG4gICAgICB0aGlzLnBvcHBlclBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLnBvcHBlck5vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhdHRhY2hQb3BwZXJDb250YWluZXJUb1NlbGVjdG9yKHRhcmdldFNlbGVjdG9yKSB7XHJcbiAgICBjb25zdCBub2RlUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRTZWxlY3Rvcik7XHJcbiAgICB0aGlzLmF0dGFjaFBvcHBlckNvbnRhaW5lclRvTm9kZShub2RlUGFyZW50KTtcclxuICB9XHJcblxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAvLyBEZXRhY2ggcG9wcGVyIGNvbnRhaW5lciBvbmNlIHZpZXcgaW5pdGlhbGl6ZWQuXHJcbiAgICB0aGlzLmRldGFjaFBvcHBlckNvbnRhaW5lcigpO1xyXG4gIH1cclxufVxyXG4iXX0=