@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
307 lines • 32 kB
JavaScript
import * as tslib_1 from "tslib";
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
import { Component, Input, Output, EventEmitter, Renderer2, ElementRef, ViewChild } from '@angular/core';
import { PopupComponent } from './popup.component';
import { Keys, Utils } from '@true-directive/base';
/**
* Dropdown base component.
*/
var DropdownBaseComponent = /** @class */ (function () {
function DropdownBaseComponent(_elementRef, _renderer) {
this._elementRef = _elementRef;
this._renderer = _renderer;
this.usePopup = true;
this.currentPopupVisible = false;
this.disableTextEditor = false;
this.disabled = null;
this.maxDropDownHeight = '300px';
this.blur = new EventEmitter();
this.keydown = new EventEmitter();
this.onChange = function (_) { };
this.onTouched = function () { };
this._validBlur = false;
this._useAltDown = true;
this.shownByKey = false;
this._touched = false;
this._skipFocusOnPopupClose = false;
}
Object.defineProperty(DropdownBaseComponent.prototype, "popupPosition", {
get: function () {
return this.popup.position;
},
set: function (pos) {
this.currentPopupPosition = pos;
if (this.popup) {
this.popup.position = pos;
}
},
enumerable: true,
configurable: true
});
DropdownBaseComponent.prototype.registerOnChange = function (fn) { this.onChange = fn; };
DropdownBaseComponent.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
Object.defineProperty(DropdownBaseComponent.prototype, "useAltDown", {
get: function () {
return this._useAltDown;
},
set: function (v) {
this._useAltDown = v;
},
enumerable: true,
configurable: true
});
DropdownBaseComponent.prototype.fetchData = function (dataQuery, data) {
//
};
DropdownBaseComponent.prototype.inputBlur = function (e) {
// This touch was accepted
this.onTouched();
// We shouldn't close window if the focus is moved to a popup window
var l = e.relatedTarget;
if (l === null || Utils.isAncestor(this.popup.popup.nativeElement, l)) {
// l = null if the focus is moved to a grid because tabIndex = -1
// If the focus is moved to another element, then l != null
// If the focus is moved by mouse click, then documentclick event occurs
// and popup will be closed.
return;
}
if (l === null || Utils.isAncestor(this._elementRef.nativeElement, l)) {
// Window isn't closed if the focus moved to one of child elements
return;
}
// Close the popup window
if (this.popup.visible && !this._validBlur) {
this._skipFocusOnPopupClose = true;
this.popup.closePopup();
}
// Reset the flag
this._validBlur = false;
this.blur.emit(e);
};
DropdownBaseComponent.prototype.inputClick = function (e) {
// Prevent popup from disabled input
if (this.disabled) {
return;
}
if (this.disableTextEditor) {
if (this.popupVisible) {
this.closePopup();
}
else {
this.showByTarget();
}
e.stopPropagation();
e.preventDefault();
}
};
DropdownBaseComponent.prototype.inputTouchStart = function (e) {
this._touched = true;
if (this.disableTextEditor) {
e.stopPropagation();
e.preventDefault();
}
};
DropdownBaseComponent.prototype.inputTouchMove = function (e) {
this._touched = false;
};
DropdownBaseComponent.prototype.inputTouchEnd = function (e) {
if (!this.disabled && this.disableTextEditor) {
if (!this.popupVisible && this._touched) {
// Show the popup window by touchend event
this.showByTarget();
if (e.cancelable) {
e.preventDefault();
}
}
e.stopPropagation();
}
};
Object.defineProperty(DropdownBaseComponent.prototype, "value", {
get: function () {
return this._value;
},
set: function (v) {
if (v !== this._value) {
this._value = v;
this.onChange(v);
}
},
enumerable: true,
configurable: true
});
;
// Send the value to input. Formatter: Ctrl --> View
DropdownBaseComponent.prototype.writeValue = function (value) {
if (this.value !== value) {
this.value = value;
}
};
Object.defineProperty(DropdownBaseComponent.prototype, "popupVisible", {
get: function () {
if (this.popup) {
return this.popup.visible;
}
return false;
},
enumerable: true,
configurable: true
});
DropdownBaseComponent.prototype.focusPopup = function () {
//
};
DropdownBaseComponent.prototype.processKey = function (e) {
return false;
};
DropdownBaseComponent.prototype.showByTarget = function () {
if (!this.usePopup) {
return;
}
this.popup.showByTarget(this.input.nativeElement);
};
DropdownBaseComponent.prototype.closePopup = function () {
this.popup.closePopup();
};
/**
* User's input
* @param e Input event
*/
DropdownBaseComponent.prototype.inputInput = function (e) {
if (e === void 0) { e = null; }
//
};
DropdownBaseComponent.prototype.inputKeyDown = function (e) {
var _this = this;
if (e.keyCode === Keys.ESCAPE && this.popup.visible) {
this.closePopup();
e.stopPropagation();
e.preventDefault();
return;
}
if (e.keyCode === Keys.DOWN && (e.altKey || !this.useAltDown) && !this.popup.visible) {
this.shownByKey = true;
this.showByTarget();
setTimeout(function () { return _this.focusPopup(); });
e.preventDefault();
e.stopPropagation();
return;
}
if (!this.processKey(e)) {
this.keydown.emit(e);
}
};
DropdownBaseComponent.prototype.focus = function () {
this.input.nativeElement.focus();
};
DropdownBaseComponent.prototype.popupClose = function (e) {
var _this = this;
// Можем пропустить это мероприятие, если мы закрываем выпадающую панель,
// находясь в контроле
// Skip setting the focus if dropdown is closed.
if (this._skipFocusOnPopupClose) {
this._skipFocusOnPopupClose = false;
return;
}
if (!Utils.detectMobile()) {
// We allow the user to set the focus on input.
this.input.nativeElement.focus();
setTimeout(function () {
var txt = _this.input.nativeElement.value;
if (txt !== undefined && !_this.disableTextEditor && _this._renderer) {
_this._renderer.setProperty(_this.input.nativeElement, 'selectionStart', 0);
_this._renderer.setProperty(_this.input.nativeElement, 'selectionEnd', txt.length);
}
});
}
};
DropdownBaseComponent.prototype.inputFocus = function (e) {
if (this.disableTextEditor) {
this._renderer.setProperty(this.input.nativeElement, 'selectionStart', 0);
this._renderer.setProperty(this.input.nativeElement, 'selectionEnd', 0);
}
else {
var txt = this.input.nativeElement.value;
this._renderer.setProperty(this.input.nativeElement, 'selectionStart', 0);
this._renderer.setProperty(this.input.nativeElement, 'selectionEnd', txt.length);
}
};
DropdownBaseComponent.prototype.togglePopup = function () {
var _this = this;
if (this.disabled) {
return;
}
this.popup.toggle(this.input.nativeElement, '');
setTimeout(function () {
if (_this.popupVisible) {
_this.focusPopup();
}
});
};
DropdownBaseComponent.prototype.btnClick = function (e) {
this.togglePopup();
};
DropdownBaseComponent.prototype.setValueFromDisplayed = function () {
//
};
DropdownBaseComponent.prototype.ngAfterViewInit = function () {
this.popup.position = this.currentPopupPosition;
};
DropdownBaseComponent.prototype.ngOnDestroy = function () {
if (this.popupVisible) {
this.popup.closePopup();
}
};
tslib_1.__decorate([
ViewChild('popup', { static: false }),
tslib_1.__metadata("design:type", PopupComponent)
], DropdownBaseComponent.prototype, "popup", void 0);
tslib_1.__decorate([
ViewChild('input', { static: true }),
tslib_1.__metadata("design:type", Object)
], DropdownBaseComponent.prototype, "input", void 0);
tslib_1.__decorate([
Input('disableTextEditor'),
tslib_1.__metadata("design:type", Object)
], DropdownBaseComponent.prototype, "disableTextEditor", void 0);
tslib_1.__decorate([
Input('disabled'),
tslib_1.__metadata("design:type", Boolean)
], DropdownBaseComponent.prototype, "disabled", void 0);
tslib_1.__decorate([
Input('maxDropDownHeight'),
tslib_1.__metadata("design:type", Object)
], DropdownBaseComponent.prototype, "maxDropDownHeight", void 0);
tslib_1.__decorate([
Input('popupPosition'),
tslib_1.__metadata("design:type", String),
tslib_1.__metadata("design:paramtypes", [String])
], DropdownBaseComponent.prototype, "popupPosition", null);
tslib_1.__decorate([
Output('blur'),
tslib_1.__metadata("design:type", EventEmitter)
], DropdownBaseComponent.prototype, "blur", void 0);
tslib_1.__decorate([
Output('keydown'),
tslib_1.__metadata("design:type", EventEmitter)
], DropdownBaseComponent.prototype, "keydown", void 0);
tslib_1.__decorate([
Input('useAltDown'),
tslib_1.__metadata("design:type", Boolean),
tslib_1.__metadata("design:paramtypes", [Boolean])
], DropdownBaseComponent.prototype, "useAltDown", null);
DropdownBaseComponent = tslib_1.__decorate([
Component({
selector: 'true-drop-down-base',
template: "",
styles: [""]
}),
tslib_1.__metadata("design:paramtypes", [ElementRef,
Renderer2])
], DropdownBaseComponent);
return DropdownBaseComponent;
}());
export { DropdownBaseComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdHJ1ZS1kaXJlY3RpdmUvZ3JpZC8iLCJzb3VyY2VzIjpbInNyYy9jb250cm9scy9kcm9wZG93bi1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFDN0QsU0FBUyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUduRDs7R0FFRztBQU1IO0lBbVNFLCtCQUNZLFdBQXVCLEVBQ3ZCLFNBQW9CO1FBRHBCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFuU2hDLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFFekIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBUzVCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUcxQixhQUFRLEdBQVksSUFBSSxDQUFDO1FBR3pCLHNCQUFpQixHQUFHLE9BQU8sQ0FBQztRQWU1QixTQUFJLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHbEQsWUFBTyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTNDLGFBQVEsR0FBRyxVQUFDLENBQU0sSUFBTSxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFHLGNBQU8sQ0FBQyxDQUFDO1FBS3JCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFhbkIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQXlEckIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQTRHekIsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO0lB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QUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbEQsQ0FBQztJQUVELDJDQUFXLEdBQVg7UUFDRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUExUkQ7UUFEQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxDQUFDOzBDQUM3QixjQUFjO3dEQUFDO0lBR3RCO1FBREMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQzs7d0RBQ3hCO0lBR1g7UUFEQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7O29FQUNEO0lBRzFCO1FBREMsS0FBSyxDQUFDLFVBQVUsQ0FBQzs7MkRBQ087SUFHekI7UUFEQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7O29FQUNDO0lBRzVCO1FBREMsS0FBSyxDQUFDLGVBQWUsQ0FBQzs7OzhEQUd0QjtJQVVEO1FBREMsTUFBTSxDQUFDLE1BQU0sQ0FBQzswQ0FDVCxZQUFZO3VEQUFnQztJQUdsRDtRQURDLE1BQU0sQ0FBQyxTQUFTLENBQUM7MENBQ1QsWUFBWTswREFBZ0M7SUFjckQ7UUFEQyxLQUFLLENBQUMsWUFBWSxDQUFDOzs7MkRBR25CO0lBckRVLHFCQUFxQjtRQUxqQyxTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUscUJBQXFCO1lBQy9CLFFBQVEsRUFBQyxFQUFFO3FCQUNGLEVBQUU7U0FDWixDQUFDO2lEQXFTeUIsVUFBVTtZQUNaLFNBQVM7T0FyU3JCLHFCQUFxQixDQXNTakM7SUFBRCw0QkFBQztDQUFBLEFBdFNELElBc1NDO1NBdFNZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBBbGVrc2V5IE1lbG5pa292LCBUcnVlIERpcmVjdGl2ZSBDb21wYW55LlxyXG4gKiBAbGluayBodHRwczovL3RydWVkaXJlY3RpdmUuY29tL1xyXG4gKiBAbGljZW5zZSBNSVRcclxuKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFJlbmRlcmVyMiwgRWxlbWVudFJlZixcclxuICAgICAgICAgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi9wb3B1cC5jb21wb25lbnQnO1xyXG5cclxuaW1wb3J0IHsgS2V5cywgVXRpbHMgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcbmltcG9ydCB7IERhdGFRdWVyeSB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuXHJcbi8qKlxyXG4gKiBEcm9wZG93biBiYXNlIGNvbXBvbmVudC5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHJ1ZS1kcm9wLWRvd24tYmFzZScsXHJcbiAgdGVtcGxhdGU6YGAsXHJcbiAgc3R5bGVzOiBbYGBdIFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25CYXNlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSB7XHJcblxyXG4gIHVzZVBvcHVwOiBib29sZWFuID0gdHJ1ZTtcclxuICBjdXJyZW50UG9wdXBQb3NpdGlvbjogJ1JFTEFUSVZFJyB8ICdBQlNPTFVURScgfCAnTU9EQUwnIHwgJ1NOQUNLJztcclxuICBjdXJyZW50UG9wdXBWaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3BvcHVwJywge3N0YXRpYzogZmFsc2V9KVxyXG4gIHBvcHVwOiBQb3B1cENvbXBvbmVudDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7c3RhdGljOiB0cnVlfSlcclxuICBpbnB1dDogYW55O1xyXG5cclxuICBASW5wdXQoJ2Rpc2FibGVUZXh0RWRpdG9yJylcclxuICBkaXNhYmxlVGV4dEVkaXRvciA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoJ2Rpc2FibGVkJylcclxuICBkaXNhYmxlZDogYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgnbWF4RHJvcERvd25IZWlnaHQnKVxyXG4gIG1heERyb3BEb3duSGVpZ2h0ID0gJzMwMHB4JztcclxuXHJcbiAgQElucHV0KCdwb3B1cFBvc2l0aW9uJylcclxuICBwdWJsaWMgZ2V0IHBvcHVwUG9zaXRpb24oKTogJ1JFTEFUSVZFJyB8ICdBQlNPTFVURScgfCAnTU9EQUwnIHwgJ1NOQUNLJyB7XHJcbiAgICByZXR1cm4gdGhpcy5wb3B1cC5wb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgcG9wdXBQb3NpdGlvbihwb3M6ICdSRUxBVElWRScgfCAnQUJTT0xVVEUnIHwgJ01PREFMJyB8ICdTTkFDSycpIHtcclxuICAgIHRoaXMuY3VycmVudFBvcHVwUG9zaXRpb24gPSBwb3M7XHJcbiAgICBpZiAodGhpcy5wb3B1cCkge1xyXG4gICAgICB0aGlzLnBvcHVwLnBvc2l0aW9uID0gcG9zO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgnYmx1cicpXHJcbiAgYmx1cjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgna2V5ZG93bicpXHJcbiAga2V5ZG93bjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XHJcbiAgcHJvdGVjdGVkIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogYW55KSA9PiB2b2lkKTogdm9pZCB7IHRoaXMub25DaGFuZ2UgPSBmbjsgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7IHRoaXMub25Ub3VjaGVkID0gZm47IH1cclxuXHJcbiAgcHJvdGVjdGVkIF92YWxpZEJsdXIgPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX3VzZUFsdERvd24gPSB0cnVlO1xyXG5cclxuICBwdWJsaWMgZGlzcGxheVZhbHVlOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgndXNlQWx0RG93bicpXHJcbiAgcHVibGljIHNldCB1c2VBbHREb3duKHY6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3VzZUFsdERvd24gPSB2O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB1c2VBbHREb3duKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VzZUFsdERvd247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2hvd25CeUtleSA9IGZhbHNlO1xyXG5cclxuICBmZXRjaERhdGEoZGF0YVF1ZXJ5OiBEYXRhUXVlcnksIGRhdGE6IEFycmF5PGFueT4pIHtcclxuICAgIC8vXHJcbiAgfVxyXG5cclxuICBpbnB1dEJsdXIoZTogRm9jdXNFdmVudCkge1xyXG5cclxuICAgIC8vIFRoaXMgdG91Y2ggd2FzIGFjY2VwdGVkXHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG5cclxuICAgIC8vIFdlIHNob3VsZG4ndCBjbG9zZSB3aW5kb3cgaWYgdGhlIGZvY3VzIGlzIG1vdmVkIHRvIGEgcG9wdXAgd2luZG93XHJcbiAgICBsZXQgbCA9IGUucmVsYXRlZFRhcmdldDtcclxuICAgIGlmIChsID09PSBudWxsIHx8IFV0aWxzLmlzQW5jZXN0b3IodGhpcy5wb3B1cC5wb3B1cC5uYXRpdmVFbGVtZW50LCBsKSkge1xyXG5cclxuICAgICAgLy8gbCA9IG51bGwgaWYgdGhlIGZvY3VzIGlzIG1vdmVkIHRvIGEgZ3JpZCBiZWNhdXNlIHRhYkluZGV4ID0gLTFcclxuICAgICAgLy8gSWYgdGhlIGZvY3VzIGlzIG1vdmVkIHRvIGFub3RoZXIgZWxlbWVudCwgdGhlbiBsICE9IG51bGxcclxuICAgICAgLy8gSWYgdGhlIGZvY3VzIGlzIG1vdmVkIGJ5IG1vdXNlIGNsaWNrLCB0aGVuIGRvY3VtZW50Y2xpY2sgZXZlbnQgb2NjdXJzXHJcbiAgICAgIC8vIGFuZCBwb3B1cCB3aWxsIGJlIGNsb3NlZC5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChsID09PSBudWxsIHx8IFV0aWxzLmlzQW5jZXN0b3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBsKSkge1xyXG4gICAgICAvLyBXaW5kb3cgaXNuJ3QgY2xvc2VkIGlmIHRoZSBmb2N1cyBtb3ZlZCB0byBvbmUgb2YgY2hpbGQgZWxlbWVudHNcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsb3NlIHRoZSBwb3B1cCB3aW5kb3dcclxuICAgIGlmICh0aGlzLnBvcHVwLnZpc2libGUgJiYgIXRoaXMuX3ZhbGlkQmx1cikge1xyXG4gICAgICB0aGlzLl9za2lwRm9jdXNPblBvcHVwQ2xvc2UgPSB0cnVlO1xyXG4gICAgICB0aGlzLnBvcHVwLmNsb3NlUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXNldCB0aGUgZmxhZ1xyXG4gICAgdGhpcy5fdmFsaWRCbHVyID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5ibHVyLmVtaXQoZSk7XHJcbiAgfVxyXG5cclxuICBpbnB1dENsaWNrKGU6IGFueSkge1xyXG5cclxuICAgIC8vIFByZXZlbnQgcG9wdXAgZnJvbSBkaXNhYmxlZCBpbnB1dFxyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRpc2FibGVUZXh0RWRpdG9yKSB7XHJcbiAgICAgIGlmICh0aGlzLnBvcHVwVmlzaWJsZSkge1xyXG4gICAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2hvd0J5VGFyZ2V0KCk7XHJcbiAgICAgIH1cclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdG91Y2hlZCA9IGZhbHNlO1xyXG4gIGlucHV0VG91Y2hTdGFydChlOiBhbnkpIHtcclxuICAgIHRoaXMuX3RvdWNoZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLmRpc2FibGVUZXh0RWRpdG9yKSB7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlucHV0VG91Y2hNb3ZlKGU6IGFueSkge1xyXG4gICAgdGhpcy5fdG91Y2hlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaW5wdXRUb3VjaEVuZChlOiBhbnkpIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5kaXNhYmxlVGV4dEVkaXRvcikge1xyXG4gICAgICBpZiAoIXRoaXMucG9wdXBWaXNpYmxlICYmIHRoaXMuX3RvdWNoZWQpIHtcclxuICAgICAgICAvLyBTaG93IHRoZSBwb3B1cCB3aW5kb3cgYnkgdG91Y2hlbmQgZXZlbnRcclxuICAgICAgICB0aGlzLnNob3dCeVRhcmdldCgpO1xyXG4gICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfdmFsdWU6IGFueTtcclxuXHJcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fdmFsdWUpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU2VuZCB0aGUgdmFsdWUgdG8gaW5wdXQuIEZvcm1hdHRlcjogQ3RybCAtLT4gVmlld1xyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBwb3B1cFZpc2libGUoKTogYm9vbGVhbiB7ICAgIFxyXG4gICAgaWYgKHRoaXMucG9wdXApIHtcclxuICAgICAgcmV0dXJuIHRoaXMucG9wdXAudmlzaWJsZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c1BvcHVwKCkge1xyXG4gICAgLy9cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBwcm9jZXNzS2V5KGU6IGFueSkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dCeVRhcmdldCgpIHtcclxuICAgIGlmICghdGhpcy51c2VQb3B1cCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvcHVwLnNob3dCeVRhcmdldCh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlUG9wdXAoKSB7XHJcbiAgICB0aGlzLnBvcHVwLmNsb3NlUG9wdXAoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZXIncyBpbnB1dFxyXG4gICAqIEBwYXJhbSAgZSBJbnB1dCBldmVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBpbnB1dElucHV0KGU6IGFueSA9IG51bGwpIHtcclxuICAgIC8vXHJcbiAgfVxyXG5cclxuICBpbnB1dEtleURvd24oZTogYW55KSB7XHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkVTQ0FQRSAmJiB0aGlzLnBvcHVwLnZpc2libGUpIHtcclxuICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuRE9XTiAmJiAoZS5hbHRLZXkgfHwgIXRoaXMudXNlQWx0RG93bikgJiYgIXRoaXMucG9wdXAudmlzaWJsZSkge1xyXG4gICAgICB0aGlzLnNob3duQnlLZXkgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNob3dCeVRhcmdldCgpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNQb3B1cCgpKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnByb2Nlc3NLZXkoZSkpIHtcclxuICAgICAgdGhpcy5rZXlkb3duLmVtaXQoZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb2N1cygpIHtcclxuICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgX3NraXBGb2N1c09uUG9wdXBDbG9zZSA9IGZhbHNlO1xyXG4gIHBvcHVwQ2xvc2UoZTogYW55KSB7XHJcblxyXG4gICAgLy8g0JzQvtC20LXQvCDQv9GA0L7Qv9GD0YHRgtC40YLRjCDRjdGC0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSwg0LXRgdC70Lgg0LzRiyDQt9Cw0LrRgNGL0LLQsNC10Lwg0LLRi9C/0LDQtNCw0Y7RidGD0Y4g0L/QsNC90LXQu9GMLFxyXG4gICAgLy8g0L3QsNGF0L7QtNGP0YHRjCDQsiDQutC+0L3RgtGA0L7Qu9C1XHJcbiAgICAvLyBTa2lwIHNldHRpbmcgdGhlIGZvY3VzIGlmIGRyb3Bkb3duIGlzIGNsb3NlZC5cclxuICAgIGlmICh0aGlzLl9za2lwRm9jdXNPblBvcHVwQ2xvc2UpIHtcclxuICAgICAgdGhpcy5fc2tpcEZvY3VzT25Qb3B1cENsb3NlID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIVV0aWxzLmRldGVjdE1vYmlsZSgpKSB7XHJcbiAgICAgIC8vIFdlIGFsbG93IHRoZSB1c2VyIHRvIHNldCB0aGUgZm9jdXMgb24gaW5wdXQuXHJcbiAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCB0eHQgPSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcbiAgICAgICAgaWYgKHR4dCAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmRpc2FibGVUZXh0RWRpdG9yICYmIHRoaXMuX3JlbmRlcmVyKSB7XHJcbiAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdzZWxlY3Rpb25TdGFydCcsIDApO1xyXG4gICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uRW5kJywgdHh0Lmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlucHV0Rm9jdXMoZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlVGV4dEVkaXRvcikge1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdzZWxlY3Rpb25TdGFydCcsIDApO1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdzZWxlY3Rpb25FbmQnLCAwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHR4dCA9IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uU3RhcnQnLCAwKTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uRW5kJywgdHh0Lmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQb3B1cCgpIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBvcHVwLnRvZ2dsZSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICcnKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMucG9wdXBWaXNpYmxlKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c1BvcHVwKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYnRuQ2xpY2soZTogYW55KSB7XHJcbiAgICB0aGlzLnRvZ2dsZVBvcHVwKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmFsdWVGcm9tRGlzcGxheWVkKCkge1xyXG4gICAgLy9cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMucG9wdXAucG9zaXRpb24gPSB0aGlzLmN1cnJlbnRQb3B1cFBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5wb3B1cFZpc2libGUpIHtcclxuICAgICAgdGhpcy5wb3B1cC5jbG9zZVBvcHVwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByb3RlY3RlZCBfcmVuZGVyZXI6IFJlbmRlcmVyMikgeyB9XHJcbn1cclxuIl19