@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
344 lines • 32.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: resizeable.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Renderer, Renderer2, Directive, ElementRef, HostListener, Input, Output, EventEmitter, HostBinding, NgZone } from '@angular/core';
import { fromEvent } from 'rxjs';
var ResizeableDirective = /** @class */ (function () {
function ResizeableDirective(element, renderer, renderer2, zone) {
var _this = this;
this.renderer = renderer;
this.renderer2 = renderer2;
this.zone = zone;
this.resizeEnabledClass = 'resizeEnabled';
this.resizeEnabled = true;
this.resize = new EventEmitter();
this.beginResize = new EventEmitter();
this.resizingEvent = new EventEmitter();
this.resizing = false;
this.bindMousemove = (/**
* @param {?} e
* @return {?}
*/
function (e) {
_this.move(e);
});
this.element = element.nativeElement;
}
/**
* @return {?}
*/
ResizeableDirective.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
if (this.resizeEnabled && !this.unresizable) {
/** @type {?} */
var node = this.renderer.createElement(this.element, 'span');
this.renderer.setElementClass(node, 'resize-handle', true);
this.renderer.attachViewAfter(this.element, node);
this.resizeNodeEvent = this.renderer.listen(node, 'click', (/**
* @param {?} event
* @return {?}
*/
function (event) { return event.stopPropagation(); }));
}
};
/**
* @return {?}
*/
ResizeableDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this._destroySubscription();
if (this.resizeNodeEvent) {
this.resizeNodeEvent();
}
};
/**
* @param {?} event
* @return {?}
*/
ResizeableDirective.prototype.onMouseup = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
this.zone.run((/**
* @return {?}
*/
function () {
/** @type {?} */
var movementX = event.clientX - _this.mouseDownScreenX;
/** @type {?} */
var newWidth = _this.initialWidth + movementX;
/** @type {?} */
var finalWidth = _this.getFinalWidth(newWidth);
_this.setElementWidth(finalWidth);
_this.resizing = false;
// destroy overlay
_this.renderer.detachView([_this.resizeOverlay]);
// this.renderer.destroyView(this.element, [this.resizeOverlay]);
_this.renderer2.removeChild(_this.element, _this.resizeOverlay);
_this.renderer.setElementClass(_this.tableViewRefElement.nativeElement, 'table-view-selector', false);
_this.renderer.setElementClass(_this.element, 'hover-bg', false);
_this.renderer.setElementStyle(_this.resizeBarRefElement.nativeElement, 'display', 'none');
_this.resize.emit({ width: finalWidth, nextElementWidth: _this.nextElementWidth });
}));
if (this.subscription && !this.subscription.closed) {
this._destroySubscription();
}
window.document.removeEventListener('mousemove', this.bindMousemove);
};
/**
* @param {?} event
* @return {?}
*/
ResizeableDirective.prototype.onMousedown = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
this.moveCount = 0;
/** @type {?} */
var isHandle = ((/** @type {?} */ ((event.target)))).classList.contains('resize-handle');
if (isHandle && !this.unresizable) {
this.beginResize.emit(event); // emit begin resize event
this.initialWidth = this.element.clientWidth;
/** @type {?} */
var initialOffset = this.element.offsetLeft;
this.mouseDownScreenX = event.clientX;
event.stopPropagation();
this.nextElement = this.element.nextElementSibling;
this.resizing = true;
this.totalWidth = this.nextElement ? this.initialWidth + this.nextElement.clientWidth : this.initialWidth;
// create resizeOverlay
this.resizeOverlay = this.renderer.createElement(this.element, 'div');
this.renderer.setElementClass(this.resizeOverlay, 'resize-overlay', true);
this.renderer.listen(this.resizeOverlay, 'click', (/**
* @param {?} clickEvent
* @return {?}
*/
function (clickEvent) { return clickEvent.stopPropagation(); }));
this.renderer.setElementClass(this.tableViewRefElement.nativeElement, 'table-view-selector', true);
this.renderer.setElementStyle(this.resizeBarRefElement.nativeElement, 'display', 'block');
this.renderer.setElementStyle(this.resizeBarRefElement.nativeElement, 'left', (initialOffset + this.initialWidth) + 'px');
this.renderer.setElementClass(this.element, 'hover-bg', true);
/** @type {?} */
var mouseup = fromEvent(document, 'mouseup');
this.subscription = mouseup
.subscribe((/**
* @param {?} ev
* @return {?}
*/
function (ev) { return _this.onMouseup(ev); }));
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
window.document.addEventListener('mousemove', _this.bindMousemove);
}));
}
};
/**
* @param {?} event
* @return {?}
*/
ResizeableDirective.prototype.move = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.moveCount++;
if (this.moveCount % 2 === 0) {
return;
}
/** @type {?} */
var movementX = event.clientX - this.mouseDownScreenX;
/** @type {?} */
var newWidth = this.initialWidth + movementX;
/** @type {?} */
var finalWidth = this.getFinalWidth(newWidth);
this.setElementWidth(finalWidth);
this.renderer.setElementStyle(this.resizeBarRefElement.nativeElement, 'left', finalWidth + this.element.offsetLeft + "px");
this.resizingEvent.emit({ width: finalWidth, nextElementWidth: this.nextElementWidth });
};
/**
* @private
* @param {?} finalWidth
* @return {?}
*/
ResizeableDirective.prototype.setElementWidth = /**
* @private
* @param {?} finalWidth
* @return {?}
*/
function (finalWidth) {
if (this.nextElement) {
this.renderer.setElementStyle(this.nextElement, 'width', this.nextElementWidth + "px");
}
this.renderer.setElementStyle(this.element, 'width', finalWidth + "px");
};
/**
* @private
* @param {?} newWidth
* @return {?}
*/
ResizeableDirective.prototype.getFinalWidth = /**
* @private
* @param {?} newWidth
* @return {?}
*/
function (newWidth) {
/** @type {?} */
var minWidth = this.handleWidth(this.minWidth);
/** @type {?} */
var maxWidth = this.handleWidth(this.maxWidth);
/** @type {?} */
var overMinWidth = !this.minWidth || newWidth >= minWidth;
/** @type {?} */
var underMaxWidth = !this.maxWidth || newWidth <= maxWidth;
/** @type {?} */
var finalWidth = !overMinWidth ? minWidth : (!underMaxWidth ? maxWidth : newWidth);
if (this.nextElement) {
/** @type {?} */
var nextWidth = this.totalWidth - finalWidth;
/** @type {?} */
var nMinWidth = this.handleWidth(this.nextElement.getAttribute('minWidth'));
this.nextElementWidth = (!nMinWidth || nextWidth >= nMinWidth) ? nextWidth : nMinWidth;
finalWidth = this.totalWidth - this.nextElementWidth;
}
return finalWidth;
};
/**
* @private
* @param {?} width
* @return {?}
*/
ResizeableDirective.prototype.handleWidth = /**
* @private
* @param {?} width
* @return {?}
*/
function (width) {
if (!width) {
return;
}
if (typeof width === 'number') {
return width;
}
if (width.includes('%')) {
/** @type {?} */
var tableWidth = this.tableViewRefElement.nativeElement.clientWidth;
return tableWidth * parseInt(width, 10) / 100;
}
return parseInt(width.replace(/[^\d]+/, ''), 10);
};
/**
* @private
* @return {?}
*/
ResizeableDirective.prototype._destroySubscription = /**
* @private
* @return {?}
*/
function () {
if (this.subscription) {
this.subscription.unsubscribe();
this.subscription = undefined;
}
};
ResizeableDirective.decorators = [
{ type: Directive, args: [{
selector: '[dResizeable]'
},] }
];
/** @nocollapse */
ResizeableDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer },
{ type: Renderer2 },
{ type: NgZone }
]; };
ResizeableDirective.propDecorators = {
resizeEnabledClass: [{ type: HostBinding, args: ['class.resizeable',] }],
resizeEnabled: [{ type: Input }],
unresizable: [{ type: Input }],
minWidth: [{ type: HostBinding, args: ['attr.minWidth',] }, { type: Input }],
maxWidth: [{ type: HostBinding, args: ['attr.maxWidth',] }, { type: Input }],
resizeBarRefElement: [{ type: Input }],
tableViewRefElement: [{ type: Input }],
resize: [{ type: Output }],
beginResize: [{ type: Output }],
resizingEvent: [{ type: Output }],
onMousedown: [{ type: HostListener, args: ['mousedown', ['$event'],] }]
};
return ResizeableDirective;
}());
export { ResizeableDirective };
if (false) {
/** @type {?} */
ResizeableDirective.prototype.resizeEnabledClass;
/** @type {?} */
ResizeableDirective.prototype.resizeEnabled;
/** @type {?} */
ResizeableDirective.prototype.unresizable;
/** @type {?} */
ResizeableDirective.prototype.minWidth;
/** @type {?} */
ResizeableDirective.prototype.maxWidth;
/** @type {?} */
ResizeableDirective.prototype.resizeBarRefElement;
/** @type {?} */
ResizeableDirective.prototype.tableViewRefElement;
/** @type {?} */
ResizeableDirective.prototype.resize;
/** @type {?} */
ResizeableDirective.prototype.beginResize;
/** @type {?} */
ResizeableDirective.prototype.resizingEvent;
/** @type {?} */
ResizeableDirective.prototype.element;
/** @type {?} */
ResizeableDirective.prototype.subscription;
/** @type {?} */
ResizeableDirective.prototype.resizing;
/** @type {?} */
ResizeableDirective.prototype.resizeNodeEvent;
/** @type {?} */
ResizeableDirective.prototype.resizeOverlay;
/** @type {?} */
ResizeableDirective.prototype.nextElement;
/** @type {?} */
ResizeableDirective.prototype.moveCount;
/** @type {?} */
ResizeableDirective.prototype.initialWidth;
/** @type {?} */
ResizeableDirective.prototype.totalWidth;
/** @type {?} */
ResizeableDirective.prototype.nextElementWidth;
/** @type {?} */
ResizeableDirective.prototype.mouseDownScreenX;
/** @type {?} */
ResizeableDirective.prototype.bindMousemove;
/**
* @type {?}
* @private
*/
ResizeableDirective.prototype.renderer;
/**
* @type {?}
* @private
*/
ResizeableDirective.prototype.renderer2;
/**
* @type {?}
* @private
*/
ResizeableDirective.prototype.zone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9kYXRhLXRhYmxlLyIsInNvdXJjZXMiOlsicmVzaXplYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0gsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsV0FBVyxFQUFFLE1BQU0sRUFDdkksTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0M7SUFnQ0ksNkJBQVksT0FBbUIsRUFBVSxRQUFrQixFQUFVLFNBQW9CLEVBQVUsSUFBWTtRQUEvRyxpQkFFQztRQUZ3QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFVLFNBQUksR0FBSixJQUFJLENBQVE7UUE1QjlFLHVCQUFrQixHQUFHLGVBQWUsQ0FBQztRQUM3RCxrQkFBYSxHQUFHLElBQUksQ0FBQztRQVlwQixXQUFNLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDL0MsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwRCxrQkFBYSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBR2hFLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFpR2pCLGtCQUFhOzs7O1FBQUcsVUFBQyxDQUFDO1lBQ2QsS0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDLEVBQUE7UUF4RkcsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0lBQ3pDLENBQUM7Ozs7SUFFRCw2Q0FBZTs7O0lBQWY7UUFDSSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFOztnQkFDbkMsSUFBSSxH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LEdBQUcsU0FBUyxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQzs7Z0JBbkxKLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtpQkFDMUI7Ozs7Z0JBTG1DLFVBQVU7Z0JBQTFDLFFBQVE7Z0JBQUUsU0FBUztnQkFBMkcsTUFBTTs7O3FDQU9uSSxXQUFXLFNBQUMsa0JBQWtCO2dDQUM5QixLQUFLOzhCQUVMLEtBQUs7MkJBRUwsV0FBVyxTQUFDLGVBQWUsY0FDM0IsS0FBSzsyQkFFTCxXQUFXLFNBQUMsZUFBZSxjQUMzQixLQUFLO3NDQUNMLEtBQUs7c0NBQ0wsS0FBSzt5QkFFTCxNQUFNOzhCQUNOLE1BQU07Z0NBQ04sTUFBTTs4QkE2RE4sWUFBWSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7SUFvR3pDLDBCQUFDO0NBQUEsQUFwTEQsSUFvTEM7U0FqTFksbUJBQW1COzs7SUFDNUIsaURBQXNFOztJQUN0RSw0Q0FBOEI7O0lBRTlCLDBDQUE4Qjs7SUFFOUIsdUNBQ21DOztJQUVuQyx1Q0FDbUM7O0lBQ25DLGtEQUF5Qzs7SUFDekMsa0RBQXlDOztJQUV6QyxxQ0FBeUQ7O0lBQ3pELDBDQUE4RDs7SUFDOUQsNENBQWdFOztJQUNoRSxzQ0FBcUI7O0lBQ3JCLDJDQUEyQjs7SUFDM0IsdUNBQWlCOztJQUNqQiw4Q0FBcUI7O0lBQ3JCLDRDQUEyQjs7SUFFM0IsMENBQWlCOztJQUNqQix3Q0FBa0I7O0lBQ2xCLDJDQUFxQjs7SUFDckIseUNBQW1COztJQUNuQiwrQ0FBeUI7O0lBQ3pCLCtDQUF5Qjs7SUF3RnpCLDRDQUVDOzs7OztJQXpGZ0MsdUNBQTBCOzs7OztJQUFFLHdDQUE0Qjs7Ozs7SUFBRSxtQ0FBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgUmVuZGVyZXIsIFJlbmRlcmVyMiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBIb3N0QmluZGluZywgTmdab25lXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2RSZXNpemVhYmxlXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFJlc2l6ZWFibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5yZXNpemVhYmxlJykgcmVzaXplRW5hYmxlZENsYXNzID0gJ3Jlc2l6ZUVuYWJsZWQnO1xyXG4gICAgQElucHV0KCkgcmVzaXplRW5hYmxlZCA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KCkgdW5yZXNpemFibGU6IGJvb2xlYW47XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLm1pbldpZHRoJylcclxuICAgIEBJbnB1dCgpIG1pbldpZHRoOiBzdHJpbmcgfCBudW1iZXI7XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLm1heFdpZHRoJylcclxuICAgIEBJbnB1dCgpIG1heFdpZHRoOiBzdHJpbmcgfCBudW1iZXI7XHJcbiAgICBASW5wdXQoKSByZXNpemVCYXJSZWZFbGVtZW50OiBFbGVtZW50UmVmO1xyXG4gICAgQElucHV0KCkgdGFibGVWaWV3UmVmRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAT3V0cHV0KCkgcmVzaXplOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBiZWdpblJlc2l6ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVzaXppbmdFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gICAgcmVzaXppbmcgPSBmYWxzZTtcclxuICAgIHJlc2l6ZU5vZGVFdmVudDogYW55O1xyXG4gICAgcmVzaXplT3ZlcmxheTogSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyByZXNpemVCYXJOb2RlOiBIVE1MU3BhbkVsZW1lbnQ7XHJcbiAgICBuZXh0RWxlbWVudDogYW55O1xyXG4gICAgbW92ZUNvdW50OiBudW1iZXI7XHJcbiAgICBpbml0aWFsV2lkdGg6IG51bWJlcjtcclxuICAgIHRvdGFsV2lkdGg6IG51bWJlcjtcclxuICAgIG5leHRFbGVtZW50V2lkdGg6IG51bWJlcjtcclxuICAgIG1vdXNlRG93blNjcmVlblg6IG51bWJlcjtcclxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyLCBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzaXplRW5hYmxlZCAmJiAhdGhpcy51bnJlc2l6YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KHRoaXMuZWxlbWVudCwgJ3NwYW4nKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3Mobm9kZSwgJ3Jlc2l6ZS1oYW5kbGUnLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hdHRhY2hWaWV3QWZ0ZXIodGhpcy5lbGVtZW50LCBub2RlKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemVOb2RlRXZlbnQgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbihub2RlLCAnY2xpY2snLCAoZXZlbnQpID0+IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZGVzdHJveVN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZU5vZGVFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU5vZGVFdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbk1vdXNldXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbW92ZW1lbnRYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMubW91c2VEb3duU2NyZWVuWDtcclxuICAgICAgICAgICAgY29uc3QgbmV3V2lkdGggPSB0aGlzLmluaXRpYWxXaWR0aCArIG1vdmVtZW50WDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsV2lkdGggPSB0aGlzLmdldEZpbmFsV2lkdGgobmV3V2lkdGgpO1xyXG4gICAgICAgICAgICB0aGlzLnNldEVsZW1lbnRXaWR0aChmaW5hbFdpZHRoKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gZGVzdHJveSBvdmVybGF5XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuZGV0YWNoVmlldyhbdGhpcy5yZXNpemVPdmVybGF5XSk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMucmVuZGVyZXIuZGVzdHJveVZpZXcodGhpcy5lbGVtZW50LCBbdGhpcy5yZXNpemVPdmVybGF5XSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIyLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCwgdGhpcy5yZXNpemVPdmVybGF5KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKHRoaXMudGFibGVWaWV3UmVmRWxlbWVudC5uYXRpdmVFbGVtZW50LCAndGFibGUtdmlldy1zZWxlY3RvcicsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKHRoaXMuZWxlbWVudCwgJ2hvdmVyLWJnJywgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRTdHlsZSh0aGlzLnJlc2l6ZUJhclJlZkVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXNpemUuZW1pdCh7d2lkdGg6IGZpbmFsV2lkdGgsIG5leHRFbGVtZW50V2lkdGg6IHRoaXMubmV4dEVsZW1lbnRXaWR0aH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbiAmJiAhdGhpcy5zdWJzY3JpcHRpb24uY2xvc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lTdWJzY3JpcHRpb24oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJpbmRNb3VzZW1vdmUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXHJcbiAgICBvbk1vdXNlZG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubW92ZUNvdW50ID0gMDtcclxuICAgICAgICBjb25zdCBpc0hhbmRsZSA9ICg8SFRNTEVsZW1lbnQ+KGV2ZW50LnRhcmdldCkpLmNsYXNzTGlzdC5jb250YWlucygncmVzaXplLWhhbmRsZScpO1xyXG5cclxuICAgICAgICBpZiAoaXNIYW5kbGUgJiYgIXRoaXMudW5yZXNpemFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5iZWdpblJlc2l6ZS5lbWl0KGV2ZW50KTsgLy8gZW1pdCBiZWdpbiByZXNpemUgZXZlbnRcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFdpZHRoID0gdGhpcy5lbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsT2Zmc2V0ID0gdGhpcy5lbGVtZW50Lm9mZnNldExlZnQ7XHJcbiAgICAgICAgICAgIHRoaXMubW91c2VEb3duU2NyZWVuWCA9IGV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLm5leHRFbGVtZW50ID0gdGhpcy5lbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcclxuICAgICAgICAgICAgdGhpcy5yZXNpemluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudG90YWxXaWR0aCA9IHRoaXMubmV4dEVsZW1lbnQgPyB0aGlzLmluaXRpYWxXaWR0aCArIHRoaXMubmV4dEVsZW1lbnQuY2xpZW50V2lkdGggOiB0aGlzLmluaXRpYWxXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSByZXNpemVPdmVybGF5XHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplT3ZlcmxheSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCh0aGlzLmVsZW1lbnQsICdkaXYnKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3ModGhpcy5yZXNpemVPdmVybGF5LCAncmVzaXplLW92ZXJsYXknLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5yZXNpemVPdmVybGF5LCAnY2xpY2snLCAoY2xpY2tFdmVudDogRXZlbnQpID0+IGNsaWNrRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3ModGhpcy50YWJsZVZpZXdSZWZFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd0YWJsZS12aWV3LXNlbGVjdG9yJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRTdHlsZSh0aGlzLnJlc2l6ZUJhclJlZkVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50U3R5bGUodGhpcy5yZXNpemVCYXJSZWZFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdsZWZ0JyxcclxuICAgICAgICAgICAgICAgIChpbml0aWFsT2Zmc2V0ICsgdGhpcy5pbml0aWFsV2lkdGgpICsgJ3B4Jyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLmVsZW1lbnQsICdob3Zlci1iZycsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbW91c2V1cCA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNldXAnKTtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBtb3VzZXVwXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldjogTW91c2VFdmVudCkgPT4gdGhpcy5vbk1vdXNldXAoZXYpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5iaW5kTW91c2Vtb3ZlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGJpbmRNb3VzZW1vdmUgPSAoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubW92ZShlKTtcclxuICAgIH1cclxuXHJcbiAgICBtb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tb3ZlQ291bnQrKztcclxuICAgICAgICBpZiAodGhpcy5tb3ZlQ291bnQgJSAyID09PSAwICkgeyAgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vdmVtZW50WCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLm1vdXNlRG93blNjcmVlblg7XHJcbiAgICAgICAgY29uc3QgbmV3V2lkdGggPSB0aGlzLmluaXRpYWxXaWR0aCArIG1vdmVtZW50WDtcclxuXHJcbiAgICAgICAgY29uc3QgZmluYWxXaWR0aCA9IHRoaXMuZ2V0RmluYWxXaWR0aChuZXdXaWR0aCk7XHJcbiAgICAgICAgdGhpcy5zZXRFbGVtZW50V2lkdGgoZmluYWxXaWR0aCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50U3R5bGUodGhpcy5yZXNpemVCYXJSZWZFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7ZmluYWxXaWR0aCArIHRoaXMuZWxlbWVudC5vZmZzZXRMZWZ0fXB4YCk7XHJcbiAgICAgICAgdGhpcy5yZXNpemluZ0V2ZW50LmVtaXQoeyB3aWR0aDogZmluYWxXaWR0aCwgbmV4dEVsZW1lbnRXaWR0aDogdGhpcy5uZXh0RWxlbWVudFdpZHRoIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0RWxlbWVudFdpZHRoKGZpbmFsV2lkdGg6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLm5leHRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudFN0eWxlKHRoaXMubmV4dEVsZW1lbnQsICd3aWR0aCcsIGAke3RoaXMubmV4dEVsZW1lbnRXaWR0aH1weGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRTdHlsZSh0aGlzLmVsZW1lbnQsICd3aWR0aCcsIGAke2ZpbmFsV2lkdGh9cHhgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEZpbmFsV2lkdGgobmV3V2lkdGg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgbWluV2lkdGggPSB0aGlzLmhhbmRsZVdpZHRoKHRoaXMubWluV2lkdGgpO1xyXG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gdGhpcy5oYW5kbGVXaWR0aCh0aGlzLm1heFdpZHRoKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb3Zlck1pbldpZHRoID0gIXRoaXMubWluV2lkdGggfHwgbmV3V2lkdGggPj0gbWluV2lkdGg7XHJcbiAgICAgICAgY29uc3QgdW5kZXJNYXhXaWR0aCA9ICF0aGlzLm1heFdpZHRoIHx8IG5ld1dpZHRoIDw9IG1heFdpZHRoO1xyXG5cclxuICAgICAgICBsZXQgZmluYWxXaWR0aCA9ICFvdmVyTWluV2lkdGggPyBtaW5XaWR0aCA6ICghdW5kZXJNYXhXaWR0aCA/IG1heFdpZHRoIDogbmV3V2lkdGgpO1xyXG4gICAgICAgIGlmICh0aGlzLm5leHRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRXaWR0aCA9IHRoaXMudG90YWxXaWR0aCAtIGZpbmFsV2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IG5NaW5XaWR0aCA9IHRoaXMuaGFuZGxlV2lkdGgodGhpcy5uZXh0RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21pbldpZHRoJykpO1xyXG4gICAgICAgICAgICB0aGlzLm5leHRFbGVtZW50V2lkdGggPSAoIW5NaW5XaWR0aCB8fCBuZXh0V2lkdGggPj0gbk1pbldpZHRoKSA/IG5leHRXaWR0aCA6IG5NaW5XaWR0aDtcclxuICAgICAgICAgICAgZmluYWxXaWR0aCA9ICB0aGlzLnRvdGFsV2lkdGggLSB0aGlzLm5leHRFbGVtZW50V2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaW5hbFdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlV2lkdGgod2lkdGg6IHN0cmluZyB8IG51bWJlcikge1xyXG4gICAgICAgIGlmICghd2lkdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICByZXR1cm4gd2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3aWR0aC5pbmNsdWRlcygnJScpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlV2lkdGggPSB0aGlzLnRhYmxlVmlld1JlZkVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgICAgICAgICAgcmV0dXJuIHRhYmxlV2lkdGggKiBwYXJzZUludCh3aWR0aCwgMTApIC8gMTAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGFyc2VJbnQod2lkdGgucmVwbGFjZSgvW15cXGRdKy8sICcnKSwgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2Rlc3Ryb3lTdWJzY3JpcHRpb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=