@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
308 lines • 31.1 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';
export class ResizeableDirective {
/**
* @param {?} element
* @param {?} renderer
* @param {?} renderer2
* @param {?} zone
*/
constructor(element, renderer, renderer2, zone) {
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 {?}
*/
(e) => {
this.move(e);
});
this.element = element.nativeElement;
}
/**
* @return {?}
*/
ngAfterViewInit() {
if (this.resizeEnabled && !this.unresizable) {
/** @type {?} */
const 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 {?}
*/
(event) => event.stopPropagation()));
}
}
/**
* @return {?}
*/
ngOnDestroy() {
this._destroySubscription();
if (this.resizeNodeEvent) {
this.resizeNodeEvent();
}
}
/**
* @param {?} event
* @return {?}
*/
onMouseup(event) {
this.zone.run((/**
* @return {?}
*/
() => {
/** @type {?} */
const movementX = event.clientX - this.mouseDownScreenX;
/** @type {?} */
const newWidth = this.initialWidth + movementX;
/** @type {?} */
const 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 {?}
*/
onMousedown(event) {
this.moveCount = 0;
/** @type {?} */
const 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 {?} */
const 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 {?}
*/
(clickEvent) => 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 {?} */
const mouseup = fromEvent(document, 'mouseup');
this.subscription = mouseup
.subscribe((/**
* @param {?} ev
* @return {?}
*/
(ev) => this.onMouseup(ev)));
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => {
window.document.addEventListener('mousemove', this.bindMousemove);
}));
}
}
/**
* @param {?} event
* @return {?}
*/
move(event) {
this.moveCount++;
if (this.moveCount % 2 === 0) {
return;
}
/** @type {?} */
const movementX = event.clientX - this.mouseDownScreenX;
/** @type {?} */
const newWidth = this.initialWidth + movementX;
/** @type {?} */
const 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 {?}
*/
setElementWidth(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 {?}
*/
getFinalWidth(newWidth) {
/** @type {?} */
const minWidth = this.handleWidth(this.minWidth);
/** @type {?} */
const maxWidth = this.handleWidth(this.maxWidth);
/** @type {?} */
const overMinWidth = !this.minWidth || newWidth >= minWidth;
/** @type {?} */
const underMaxWidth = !this.maxWidth || newWidth <= maxWidth;
/** @type {?} */
let finalWidth = !overMinWidth ? minWidth : (!underMaxWidth ? maxWidth : newWidth);
if (this.nextElement) {
/** @type {?} */
const nextWidth = this.totalWidth - finalWidth;
/** @type {?} */
const 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 {?}
*/
handleWidth(width) {
if (!width) {
return;
}
if (typeof width === 'number') {
return width;
}
if (width.includes('%')) {
/** @type {?} */
const tableWidth = this.tableViewRefElement.nativeElement.clientWidth;
return tableWidth * parseInt(width, 10) / 100;
}
return parseInt(width.replace(/[^\d]+/, ''), 10);
}
/**
* @private
* @return {?}
*/
_destroySubscription() {
if (this.subscription) {
this.subscription.unsubscribe();
this.subscription = undefined;
}
}
}
ResizeableDirective.decorators = [
{ type: Directive, args: [{
selector: '[dResizeable]'
},] }
];
/** @nocollapse */
ResizeableDirective.ctorParameters = () => [
{ 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'],] }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9kYXRhLXRhYmxlLyIsInNvdXJjZXMiOlsicmVzaXplYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0gsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsV0FBVyxFQUFFLE1BQU0sRUFDdkksTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJL0MsTUFBTSxPQUFPLG1CQUFtQjs7Ozs7OztJQTZCNUIsWUFBWSxPQUFtQixFQUFVLFFBQWtCLEVBQVUsU0FBb0IsRUFBVSxJQUFZO1FBQXRFLGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQTVCOUUsdUJBQWtCLEdBQUcsZUFBZSxDQUFDO1FBQzdELGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBWXBCLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMvQyxnQkFBVyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3BELGtCQUFhLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHaEUsYUFBUSxHQUFHLEtBQUssQ0FBQztRQWlHakIsa0JBQWE7Ozs7UUFBRyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxFQUFBO1FBeEZHLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUN6QyxDQUFDOzs7O0lBRUQsZUFBZTtRQUNYLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7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Ozs7WUFMbUMsVUFBVTtZQUExQyxRQUFRO1lBQUUsU0FBUztZQUEyRyxNQUFNOzs7aUNBT25JLFdBQVcsU0FBQyxrQkFBa0I7NEJBQzlCLEtBQUs7MEJBRUwsS0FBSzt1QkFFTCxXQUFXLFNBQUMsZUFBZSxjQUMzQixLQUFLO3VCQUVMLFdBQVcsU0FBQyxlQUFlLGNBQzNCLEtBQUs7a0NBQ0wsS0FBSztrQ0FDTCxLQUFLO3FCQUVMLE1BQU07MEJBQ04sTUFBTTs0QkFDTixNQUFNOzBCQTZETixZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDOzs7O0lBNUVyQyxpREFBc0U7O0lBQ3RFLDRDQUE4Qjs7SUFFOUIsMENBQThCOztJQUU5Qix1Q0FDbUM7O0lBRW5DLHVDQUNtQzs7SUFDbkMsa0RBQXlDOztJQUN6QyxrREFBeUM7O0lBRXpDLHFDQUF5RDs7SUFDekQsMENBQThEOztJQUM5RCw0Q0FBZ0U7O0lBQ2hFLHNDQUFxQjs7SUFDckIsMkNBQTJCOztJQUMzQix1Q0FBaUI7O0lBQ2pCLDhDQUFxQjs7SUFDckIsNENBQTJCOztJQUUzQiwwQ0FBaUI7O0lBQ2pCLHdDQUFrQjs7SUFDbEIsMkNBQXFCOztJQUNyQix5Q0FBbUI7O0lBQ25CLCtDQUF5Qjs7SUFDekIsK0NBQXlCOztJQXdGekIsNENBRUM7Ozs7O0lBekZnQyx1Q0FBMEI7Ozs7O0lBQUUsd0NBQTRCOzs7OztJQUFFLG1DQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBSZW5kZXJlciwgUmVuZGVyZXIyLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIEhvc3RCaW5kaW5nLCBOZ1pvbmVcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbZFJlc2l6ZWFibGVdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVzaXplYWJsZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnJlc2l6ZWFibGUnKSByZXNpemVFbmFibGVkQ2xhc3MgPSAncmVzaXplRW5hYmxlZCc7XHJcbiAgICBASW5wdXQoKSByZXNpemVFbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSB1bnJlc2l6YWJsZTogYm9vbGVhbjtcclxuXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIubWluV2lkdGgnKVxyXG4gICAgQElucHV0KCkgbWluV2lkdGg6IHN0cmluZyB8IG51bWJlcjtcclxuXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIubWF4V2lkdGgnKVxyXG4gICAgQElucHV0KCkgbWF4V2lkdGg6IHN0cmluZyB8IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIHJlc2l6ZUJhclJlZkVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgICBASW5wdXQoKSB0YWJsZVZpZXdSZWZFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBPdXRwdXQoKSByZXNpemU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIGJlZ2luUmVzaXplOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSByZXNpemluZ0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgICByZXNpemluZyA9IGZhbHNlO1xyXG4gICAgcmVzaXplTm9kZUV2ZW50OiBhbnk7XHJcbiAgICByZXNpemVPdmVybGF5OiBIVE1MRWxlbWVudDtcclxuICAgIC8vIHJlc2l6ZUJhck5vZGU6IEhUTUxTcGFuRWxlbWVudDtcclxuICAgIG5leHRFbGVtZW50OiBhbnk7XHJcbiAgICBtb3ZlQ291bnQ6IG51bWJlcjtcclxuICAgIGluaXRpYWxXaWR0aDogbnVtYmVyO1xyXG4gICAgdG90YWxXaWR0aDogbnVtYmVyO1xyXG4gICAgbmV4dEVsZW1lbnRXaWR0aDogbnVtYmVyO1xyXG4gICAgbW91c2VEb3duU2NyZWVuWDogbnVtYmVyO1xyXG4gICAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIsIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjIsIHByaXZhdGUgem9uZTogTmdab25lKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5yZXNpemVFbmFibGVkICYmICF0aGlzLnVucmVzaXphYmxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQodGhpcy5lbGVtZW50LCAnc3BhbicpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyhub2RlLCAncmVzaXplLWhhbmRsZScsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmF0dGFjaFZpZXdBZnRlcih0aGlzLmVsZW1lbnQsIG5vZGUpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU5vZGVFdmVudCA9IHRoaXMucmVuZGVyZXIubGlzdGVuKG5vZGUsICdjbGljaycsIChldmVudCkgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9kZXN0cm95U3Vic2NyaXB0aW9uKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzaXplTm9kZUV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplTm9kZUV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uTW91c2V1cChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtb3ZlbWVudFggPSBldmVudC5jbGllbnRYIC0gdGhpcy5tb3VzZURvd25TY3JlZW5YO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdXaWR0aCA9IHRoaXMuaW5pdGlhbFdpZHRoICsgbW92ZW1lbnRYO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmluYWxXaWR0aCA9IHRoaXMuZ2V0RmluYWxXaWR0aChuZXdXaWR0aCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0RWxlbWVudFdpZHRoKGZpbmFsV2lkdGgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyBkZXN0cm95IG92ZXJsYXlcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5kZXRhY2hWaWV3KFt0aGlzLnJlc2l6ZU92ZXJsYXldKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5yZW5kZXJlci5kZXN0cm95Vmlldyh0aGlzLmVsZW1lbnQsIFt0aGlzLnJlc2l6ZU92ZXJsYXldKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlcjIucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50LCB0aGlzLnJlc2l6ZU92ZXJsYXkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3ModGhpcy50YWJsZVZpZXdSZWZFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd0YWJsZS12aWV3LXNlbGVjdG9yJywgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3ModGhpcy5lbGVtZW50LCAnaG92ZXItYmcnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudFN0eWxlKHRoaXMucmVzaXplQmFyUmVmRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnZGlzcGxheScsICdub25lJyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZS5lbWl0KHt3aWR0aDogZmluYWxXaWR0aCwgbmV4dEVsZW1lbnRXaWR0aDogdGhpcy5uZXh0RWxlbWVudFdpZHRofSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uICYmICF0aGlzLnN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVzdHJveVN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuYmluZE1vdXNlbW92ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcclxuICAgIG9uTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tb3ZlQ291bnQgPSAwO1xyXG4gICAgICAgIGNvbnN0IGlzSGFuZGxlID0gKDxIVE1MRWxlbWVudD4oZXZlbnQudGFyZ2V0KSkuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXNpemUtaGFuZGxlJyk7XHJcblxyXG4gICAgICAgIGlmIChpc0hhbmRsZSAmJiAhdGhpcy51bnJlc2l6YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmJlZ2luUmVzaXplLmVtaXQoZXZlbnQpOyAvLyBlbWl0IGJlZ2luIHJlc2l6ZSBldmVudFxyXG5cclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsV2lkdGggPSB0aGlzLmVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxPZmZzZXQgPSB0aGlzLmVsZW1lbnQub2Zmc2V0TGVmdDtcclxuICAgICAgICAgICAgdGhpcy5tb3VzZURvd25TY3JlZW5YID0gZXZlbnQuY2xpZW50WDtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMubmV4dEVsZW1lbnQgPSB0aGlzLmVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy50b3RhbFdpZHRoID0gdGhpcy5uZXh0RWxlbWVudCA/IHRoaXMuaW5pdGlhbFdpZHRoICsgdGhpcy5uZXh0RWxlbWVudC5jbGllbnRXaWR0aCA6IHRoaXMuaW5pdGlhbFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgLy8gY3JlYXRlIHJlc2l6ZU92ZXJsYXlcclxuICAgICAgICAgICAgdGhpcy5yZXNpemVPdmVybGF5ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KHRoaXMuZWxlbWVudCwgJ2RpdicpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLnJlc2l6ZU92ZXJsYXksICdyZXNpemUtb3ZlcmxheScsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLnJlc2l6ZU92ZXJsYXksICdjbGljaycsIChjbGlja0V2ZW50OiBFdmVudCkgPT4gY2xpY2tFdmVudC5zdG9wUHJvcGFnYXRpb24oKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLnRhYmxlVmlld1JlZkVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3RhYmxlLXZpZXctc2VsZWN0b3InLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudFN0eWxlKHRoaXMucmVzaXplQmFyUmVmRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnZGlzcGxheScsICdibG9jaycpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRTdHlsZSh0aGlzLnJlc2l6ZUJhclJlZkVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2xlZnQnLFxyXG4gICAgICAgICAgICAgICAgKGluaXRpYWxPZmZzZXQgKyB0aGlzLmluaXRpYWxXaWR0aCkgKyAncHgnKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKHRoaXMuZWxlbWVudCwgJ2hvdmVyLWJnJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtb3VzZXVwID0gZnJvbUV2ZW50KGRvY3VtZW50LCAnbW91c2V1cCcpO1xyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG1vdXNldXBcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2OiBNb3VzZUV2ZW50KSA9PiB0aGlzLm9uTW91c2V1cChldikpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJpbmRNb3VzZW1vdmUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYmluZE1vdXNlbW92ZSA9IChlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb3ZlKGUpO1xyXG4gICAgfVxyXG5cclxuICAgIG1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1vdmVDb3VudCsrO1xyXG4gICAgICAgIGlmICh0aGlzLm1vdmVDb3VudCAlIDIgPT09IDAgKSB7ICByZXR1cm47IH1cclxuXHJcbiAgICAgICAgY29uc3QgbW92ZW1lbnRYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMubW91c2VEb3duU2NyZWVuWDtcclxuICAgICAgICBjb25zdCBuZXdXaWR0aCA9IHRoaXMuaW5pdGlhbFdpZHRoICsgbW92ZW1lbnRYO1xyXG5cclxuICAgICAgICBjb25zdCBmaW5hbFdpZHRoID0gdGhpcy5nZXRGaW5hbFdpZHRoKG5ld1dpZHRoKTtcclxuICAgICAgICB0aGlzLnNldEVsZW1lbnRXaWR0aChmaW5hbFdpZHRoKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRTdHlsZSh0aGlzLnJlc2l6ZUJhclJlZkVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2xlZnQnLCBgJHtmaW5hbFdpZHRoICsgdGhpcy5lbGVtZW50Lm9mZnNldExlZnR9cHhgKTtcclxuICAgICAgICB0aGlzLnJlc2l6aW5nRXZlbnQuZW1pdCh7IHdpZHRoOiBmaW5hbFdpZHRoLCBuZXh0RWxlbWVudFdpZHRoOiB0aGlzLm5leHRFbGVtZW50V2lkdGggfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRFbGVtZW50V2lkdGgoZmluYWxXaWR0aDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubmV4dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50U3R5bGUodGhpcy5uZXh0RWxlbWVudCwgJ3dpZHRoJywgYCR7dGhpcy5uZXh0RWxlbWVudFdpZHRofXB4YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudFN0eWxlKHRoaXMuZWxlbWVudCwgJ3dpZHRoJywgYCR7ZmluYWxXaWR0aH1weGApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0RmluYWxXaWR0aChuZXdXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBtaW5XaWR0aCA9IHRoaXMuaGFuZGxlV2lkdGgodGhpcy5taW5XaWR0aCk7XHJcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSB0aGlzLmhhbmRsZVdpZHRoKHRoaXMubWF4V2lkdGgpO1xyXG5cclxuICAgICAgICBjb25zdCBvdmVyTWluV2lkdGggPSAhdGhpcy5taW5XaWR0aCB8fCBuZXdXaWR0aCA+PSBtaW5XaWR0aDtcclxuICAgICAgICBjb25zdCB1bmRlck1heFdpZHRoID0gIXRoaXMubWF4V2lkdGggfHwgbmV3V2lkdGggPD0gbWF4V2lkdGg7XHJcblxyXG4gICAgICAgIGxldCBmaW5hbFdpZHRoID0gIW92ZXJNaW5XaWR0aCA/IG1pbldpZHRoIDogKCF1bmRlck1heFdpZHRoID8gbWF4V2lkdGggOiBuZXdXaWR0aCk7XHJcbiAgICAgICAgaWYgKHRoaXMubmV4dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV4dFdpZHRoID0gdGhpcy50b3RhbFdpZHRoIC0gZmluYWxXaWR0aDtcclxuICAgICAgICAgICAgY29uc3Qgbk1pbldpZHRoID0gdGhpcy5oYW5kbGVXaWR0aCh0aGlzLm5leHRFbGVtZW50LmdldEF0dHJpYnV0ZSgnbWluV2lkdGgnKSk7XHJcbiAgICAgICAgICAgIHRoaXMubmV4dEVsZW1lbnRXaWR0aCA9ICghbk1pbldpZHRoIHx8IG5leHRXaWR0aCA+PSBuTWluV2lkdGgpID8gbmV4dFdpZHRoIDogbk1pbldpZHRoO1xyXG4gICAgICAgICAgICBmaW5hbFdpZHRoID0gIHRoaXMudG90YWxXaWR0aCAtIHRoaXMubmV4dEVsZW1lbnRXaWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZpbmFsV2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVXaWR0aCh3aWR0aDogc3RyaW5nIHwgbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKCF3aWR0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygd2lkdGggPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB3aWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHdpZHRoLmluY2x1ZGVzKCclJykpIHtcclxuICAgICAgICAgICAgY29uc3QgdGFibGVXaWR0aCA9IHRoaXMudGFibGVWaWV3UmVmRWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgICAgICAgICByZXR1cm4gdGFibGVXaWR0aCAqIHBhcnNlSW50KHdpZHRoLCAxMCkgLyAxMDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXJzZUludCh3aWR0aC5yZXBsYWNlKC9bXlxcZF0rLywgJycpLCAxMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZGVzdHJveVN1YnNjcmlwdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==