angular-resize-element
Version:
An angular 4.0+ directive that allows an element to be resized
204 lines • 29.3 kB
JavaScript
import { Directive, ElementRef, EventEmitter, HostBinding, Input, Output, Renderer2 } from '@angular/core';
import { AngularResizeElementDirection } from './angular-resize-element.enum';
export class AngularResizeElementDirective {
constructor(elementRef, renderer2) {
this.elementRef = elementRef;
this.renderer2 = renderer2;
this.applyClass = 'resizing';
this.resizeStart = new EventEmitter();
this.resize = new EventEmitter();
this.resizeEnd = new EventEmitter();
this.listenMouseDownEvent();
}
ngOnChanges(changes) {
if (changes.useDrag) {
this.listenMouseDownEvent();
}
}
ngOnDestroy() {
if (this.mouseClickListener) {
this.mouseClickListener();
}
if (this.mouseUpListener) {
this.mouseUpListener();
}
if (this.mouseMoveListener) {
this.mouseMoveListener();
}
}
listenMouseDownEvent() {
if (this.mouseClickListener) {
this.mouseClickListener();
}
const event = this.useDrag ? 'dragstart' : 'mousedown';
this.mouseClickListener = this.renderer2.listen(this.elementRef.nativeElement, event, evt => this.onMouseDown(evt));
}
onMouseDown(evt) {
evt.preventDefault();
this.setOriginalData(evt);
this.resizeStart.emit(this.generateValuesForEvent(evt));
this.mouseUpListener = this.renderer2.listen('document', 'mouseup', event => this.onMouseUp(event));
this.mouseMoveListener = this.renderer2.listen('document', 'mousemove', event => this.onMouseMove(event));
this.renderer2.addClass(this.targetNativeElement, this.applyClass);
}
onMouseUp(evt) {
const eventValues = this.generateValuesForEvent(evt);
this.resize.emit(eventValues);
this.mouseMoveListener();
this.mouseUpListener();
this.renderer2.removeClass(this.targetNativeElement, this.applyClass);
this.resizeEnd.emit(eventValues);
}
onMouseMove(evt) {
this.resize.emit(this.generateValuesForEvent(evt));
}
setOriginalData(originalEvent) {
this.originalEvent = originalEvent;
if (this.targetElement) {
const dataSource = this.targetNativeElement;
this.targetElementWidthValue = dataSource.offsetWidth;
this.targetElementHeightValue = dataSource.offsetHeight;
this.targetElementTopValue = dataSource.offsetTop;
this.targetElementLeftValue = dataSource.offsetLeft;
}
else {
this.targetElementWidthValue = 0;
this.targetElementHeightValue = 0;
this.targetElementTopValue = 0;
this.targetElementLeftValue = 0;
}
}
get targetNativeElement() {
return this.targetElement instanceof ElementRef ? this.targetElement.nativeElement : this.targetElement;
}
generateValuesForEvent(evt) {
const originalXValue = this.originalEvent.clientX;
const originalYValue = this.originalEvent.clientY;
let diffWidthValue = evt.clientX - originalXValue;
let diffHeightValue = evt.clientY - originalYValue;
let diffTopValue = diffHeightValue;
let diffLeftValue = diffWidthValue;
switch (this.direction) {
case AngularResizeElementDirection.TOP: {
diffHeightValue *= -1;
diffWidthValue = 0;
diffLeftValue = 0;
break;
}
case AngularResizeElementDirection.TOP_RIGHT: {
diffHeightValue *= -1;
diffLeftValue = 0;
break;
}
case AngularResizeElementDirection.RIGHT: {
diffHeightValue = 0;
diffTopValue = 0;
diffLeftValue = 0;
break;
}
case AngularResizeElementDirection.BOTTOM_RIGHT: {
diffTopValue = 0;
diffLeftValue = 0;
break;
}
case AngularResizeElementDirection.BOTTOM: {
diffWidthValue = 0;
diffLeftValue = 0;
diffTopValue = 0;
break;
}
case AngularResizeElementDirection.BOTTOM_LEFT: {
diffWidthValue *= -1;
diffTopValue = 0;
break;
}
case AngularResizeElementDirection.LEFT: {
diffWidthValue *= -1;
diffHeightValue = 0;
diffTopValue = 0;
break;
}
case AngularResizeElementDirection.TOP_LEFT: {
diffHeightValue *= -1;
diffWidthValue *= -1;
}
}
let currentWidthValue = this.targetElementWidthValue + diffWidthValue;
let currentHeightValue = this.targetElementHeightValue + diffHeightValue;
if (this.proportionalResize) {
if (currentWidthValue > currentHeightValue) {
currentWidthValue = currentHeightValue;
}
else {
currentHeightValue = currentWidthValue;
}
}
if (currentHeightValue <= 1) {
diffTopValue += currentHeightValue;
}
if (currentWidthValue <= 1) {
diffLeftValue += currentWidthValue;
}
if (currentWidthValue <= 0) {
currentWidthValue = 0;
}
if (currentHeightValue <= 0) {
currentHeightValue = 0;
}
let currentTopValue = this.targetElementTopValue + diffTopValue;
let currentLeftValue = this.targetElementLeftValue + diffLeftValue;
if (this.rect) {
if (currentTopValue < this.rect.top) {
currentHeightValue = this.targetElementHeightValue + this.targetElementTopValue - this.rect.top;
currentTopValue = this.rect.top;
}
if (currentHeightValue + currentTopValue > this.rect.height) {
currentHeightValue = this.rect.height - currentTopValue;
}
if (currentLeftValue < this.rect.left) {
currentWidthValue = this.targetElementWidthValue + this.targetElementLeftValue - this.rect.left;
currentLeftValue = this.rect.left;
}
if (currentWidthValue + currentLeftValue > this.rect.width) {
currentWidthValue = this.rect.width - currentLeftValue;
}
}
return {
originalEvent: this.originalEvent,
currentWidthValue,
currentHeightValue,
currentTopValue,
currentLeftValue,
originalWidthValue: this.targetElementWidthValue,
originalHeightValue: this.targetElementHeightValue,
originalTopValue: this.targetElementTopValue,
originalLeftValue: this.targetElementLeftValue,
differenceWidthValue: currentWidthValue - this.targetElementWidthValue,
differenceHeightValue: currentHeightValue - this.targetElementHeightValue,
differenceTopValue: currentTopValue - this.targetElementTopValue,
differenceLeftValue: currentLeftValue - this.targetElementLeftValue,
direction: this.direction,
};
}
}
AngularResizeElementDirective.decorators = [
{ type: Directive, args: [{
selector: '[resize], [resizeStart], [resizeEnd]'
},] }
];
AngularResizeElementDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 }
];
AngularResizeElementDirective.propDecorators = {
targetElement: [{ type: Input }],
direction: [{ type: Input }],
proportionalResize: [{ type: Input }],
rect: [{ type: Input }],
applyClass: [{ type: Input }],
resizeStart: [{ type: Output }],
resize: [{ type: Output }],
resizeEnd: [{ type: Output }],
useDrag: [{ type: Input }, { type: HostBinding, args: ['attr.draggable',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1yZXNpemUtZWxlbWVudC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiRDovYW5ndWxhci1saWJzL3Byb2plY3RzL2FuZ3VsYXItcmVzaXplLWVsZW1lbnQvc3JjLyIsInNvdXJjZXMiOlsibGliL2FuZ3VsYXItcmVzaXplLWVsZW1lbnQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVosTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFLNUUsTUFBTSxPQUFPLDZCQUE2QjtJQXlDdEMsWUFBNkIsVUFBc0IsRUFDdEIsU0FBb0I7UUFEcEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBaEIxQyxlQUFVLEdBQUcsVUFBVSxDQUFDO1FBR2YsZ0JBQVcsR0FBNEMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUcxRSxXQUFNLEdBQTRDLElBQUksWUFBWSxFQUFFLENBQUM7UUFHckUsY0FBUyxHQUE0QyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBU3BGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDckMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1NBQy9CO0lBQ0wsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN6QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUM3QjtRQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLElBQUks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SUFBSSxDQUFDLElBQUksQ0FBQzthQUNyQztZQUNELElBQUksaUJBQWlCLEdBQUcsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3hELGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLGdCQUFnQixDQUFDO2FBQzFEO1NBQ0o7UUFFRCxPQUFPO1lBQ0gsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLGlCQUFpQjtZQUNqQixrQkFBa0I7WUFDbEIsZUFBZTtZQUNmLGdCQUFnQjtZQUNoQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsdUJBQXVCO1lBQ2hELG1CQUFtQixFQUFFLElBQUksQ0FBQyx3QkFBd0I7WUFDbEQsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtZQUM1QyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1lBQzlDLG9CQUFvQixFQUFFLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUI7WUFDdEUscUJBQXFCLEVBQUUsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QjtZQUN6RSxrQkFBa0IsRUFBRSxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQjtZQUNoRSxtQkFBbUIsRUFBRSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCO1lBQ25FLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztTQUM1QixDQUFDO0lBQ04sQ0FBQzs7O1lBdFBKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsc0NBQXNDO2FBQ25EOzs7WUFmRyxVQUFVO1lBT1YsU0FBUzs7OzRCQXNCUixLQUFLO3dCQUdMLEtBQUs7aUNBR0wsS0FBSzttQkFHTCxLQUFLO3lCQUdMLEtBQUs7MEJBR0wsTUFBTTtxQkFHTixNQUFNO3dCQUdOLE1BQU07c0JBR04sS0FBSyxZQUNMLFdBQVcsU0FBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgRGlyZWN0aXZlLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEhvc3RCaW5kaW5nLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPdXRwdXQsXHJcbiAgICBSZW5kZXJlcjIsXHJcbiAgICBTaW1wbGVDaGFuZ2VzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7QW5ndWxhclJlc2l6ZUVsZW1lbnRFdmVudCwgUG9zaXRpb259IGZyb20gJy4vYW5ndWxhci1yZXNpemUtZWxlbWVudC1ldmVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0FuZ3VsYXJSZXNpemVFbGVtZW50RGlyZWN0aW9ufSBmcm9tICcuL2FuZ3VsYXItcmVzaXplLWVsZW1lbnQuZW51bSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW3Jlc2l6ZV0sIFtyZXNpemVTdGFydF0sIFtyZXNpemVFbmRdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhclJlc2l6ZUVsZW1lbnREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgICBwcml2YXRlIG1vdXNlQ2xpY2tMaXN0ZW5lcjogKCkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgbW91c2VVcExpc3RlbmVyOiAoKSA9PiB2b2lkO1xyXG4gICAgcHJpdmF0ZSBtb3VzZU1vdmVMaXN0ZW5lcjogKCkgPT4gdm9pZDtcclxuXHJcbiAgICBwcml2YXRlIHRhcmdldEVsZW1lbnRXaWR0aFZhbHVlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRhcmdldEVsZW1lbnRIZWlnaHRWYWx1ZTogbnVtYmVyO1xyXG5cclxuICAgIHByaXZhdGUgdGFyZ2V0RWxlbWVudFRvcFZhbHVlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRhcmdldEVsZW1lbnRMZWZ0VmFsdWU6IG51bWJlcjtcclxuXHJcbiAgICBwcml2YXRlIG9yaWdpbmFsRXZlbnQ6IE1vdXNlRXZlbnQ7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkaXJlY3Rpb246IEFuZ3VsYXJSZXNpemVFbGVtZW50RGlyZWN0aW9uO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcHJvcG9ydGlvbmFsUmVzaXplOiBib29sZWFuO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcmVjdDogUG9zaXRpb247XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBhcHBseUNsYXNzID0gJ3Jlc2l6aW5nJztcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyByZWFkb25seSByZXNpemVTdGFydDogRXZlbnRFbWl0dGVyPEFuZ3VsYXJSZXNpemVFbGVtZW50RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc2l6ZTogRXZlbnRFbWl0dGVyPEFuZ3VsYXJSZXNpemVFbGVtZW50RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc2l6ZUVuZDogRXZlbnRFbWl0dGVyPEFuZ3VsYXJSZXNpemVFbGVtZW50RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZHJhZ2dhYmxlJylcclxuICAgIHB1YmxpYyB1c2VEcmFnO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIyOiBSZW5kZXJlcjJcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMubGlzdGVuTW91c2VEb3duRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLnVzZURyYWcpIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5Nb3VzZURvd25FdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW91c2VDbGlja0xpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW91c2VDbGlja0xpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1vdXNlVXBMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLm1vdXNlVXBMaXN0ZW5lcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5tb3VzZU1vdmVMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLm1vdXNlTW92ZUxpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBsaXN0ZW5Nb3VzZURvd25FdmVudCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5tb3VzZUNsaWNrTGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5tb3VzZUNsaWNrTGlzdGVuZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy51c2VEcmFnID8gJ2RyYWdzdGFydCcgOiAnbW91c2Vkb3duJztcclxuICAgICAgICB0aGlzLm1vdXNlQ2xpY2tMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIyLmxpc3Rlbih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgZXZlbnQsIGV2dCA9PiB0aGlzLm9uTW91c2VEb3duKGV2dCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbk1vdXNlRG93bihldnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRPcmlnaW5hbERhdGEoZXZ0KTtcclxuXHJcbiAgICAgICAgdGhpcy5yZXNpemVTdGFydC5lbWl0KHRoaXMuZ2VuZXJhdGVWYWx1ZXNGb3JFdmVudChldnQpKTtcclxuXHJcbiAgICAgICAgdGhpcy5tb3VzZVVwTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyMi5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNldXAnLCBldmVudCA9PiB0aGlzLm9uTW91c2VVcChldmVudCkpO1xyXG4gICAgICAgIHRoaXMubW91c2VNb3ZlTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyMi5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNlbW92ZScsIGV2ZW50ID0+IHRoaXMub25Nb3VzZU1vdmUoZXZlbnQpKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyh0aGlzLnRhcmdldE5hdGl2ZUVsZW1lbnQsIHRoaXMuYXBwbHlDbGFzcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgb25Nb3VzZVVwKGV2dDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50VmFsdWVzID0gdGhpcy5nZW5lcmF0ZVZhbHVlc0ZvckV2ZW50KGV2dCk7XHJcbiAgICAgICAgdGhpcy5yZXNpemUuZW1pdChldmVudFZhbHVlcyk7XHJcbiAgICAgICAgdGhpcy5tb3VzZU1vdmVMaXN0ZW5lcigpO1xyXG4gICAgICAgIHRoaXMubW91c2VVcExpc3RlbmVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnJlbW92ZUNsYXNzKHRoaXMudGFyZ2V0TmF0aXZlRWxlbWVudCwgdGhpcy5hcHBseUNsYXNzKTtcclxuICAgICAgICB0aGlzLnJlc2l6ZUVuZC5lbWl0KGV2ZW50VmFsdWVzKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBvbk1vdXNlTW92ZShldnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZS5lbWl0KHRoaXMuZ2VuZXJhdGVWYWx1ZXNGb3JFdmVudChldnQpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBzZXRPcmlnaW5hbERhdGEob3JpZ2luYWxFdmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IG9yaWdpbmFsRXZlbnQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRhcmdldEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHRoaXMudGFyZ2V0TmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgdGhpcy50YXJnZXRFbGVtZW50V2lkdGhWYWx1ZSA9IGRhdGFTb3VyY2Uub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudEhlaWdodFZhbHVlID0gZGF0YVNvdXJjZS5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudFRvcFZhbHVlID0gZGF0YVNvdXJjZS5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudExlZnRWYWx1ZSA9IGRhdGFTb3VyY2Uub2Zmc2V0TGVmdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldEVsZW1lbnRXaWR0aFZhbHVlID0gMDtcclxuICAgICAgICAgICAgdGhpcy50YXJnZXRFbGVtZW50SGVpZ2h0VmFsdWUgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldEVsZW1lbnRUb3BWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudExlZnRWYWx1ZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0IHRhcmdldE5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50UmVmID8gdGhpcy50YXJnZXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiB0aGlzLnRhcmdldEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVZhbHVlc0ZvckV2ZW50KGV2dDogTW91c2VFdmVudCk6IEFuZ3VsYXJSZXNpemVFbGVtZW50RXZlbnQge1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsWFZhbHVlID0gdGhpcy5vcmlnaW5hbEV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxZVmFsdWUgPSB0aGlzLm9yaWdpbmFsRXZlbnQuY2xpZW50WTtcclxuXHJcbiAgICAgICAgbGV0IGRpZmZXaWR0aFZhbHVlID0gZXZ0LmNsaWVudFggLSBvcmlnaW5hbFhWYWx1ZTtcclxuICAgICAgICBsZXQgZGlmZkhlaWdodFZhbHVlID0gZXZ0LmNsaWVudFkgLSBvcmlnaW5hbFlWYWx1ZTtcclxuICAgICAgICBsZXQgZGlmZlRvcFZhbHVlID0gZGlmZkhlaWdodFZhbHVlO1xyXG4gICAgICAgIGxldCBkaWZmTGVmdFZhbHVlID0gZGlmZldpZHRoVmFsdWU7XHJcblxyXG4gICAgICAgIHN3aXRjaCAodGhpcy5kaXJlY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5UT1A6IHtcclxuICAgICAgICAgICAgICAgIGRpZmZIZWlnaHRWYWx1ZSAqPSAtMTtcclxuICAgICAgICAgICAgICAgIGRpZmZXaWR0aFZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgIGRpZmZMZWZ0VmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5UT1BfUklHSFQ6IHtcclxuICAgICAgICAgICAgICAgIGRpZmZIZWlnaHRWYWx1ZSAqPSAtMTtcclxuICAgICAgICAgICAgICAgIGRpZmZMZWZ0VmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5SSUdIVDoge1xyXG4gICAgICAgICAgICAgICAgZGlmZkhlaWdodFZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgIGRpZmZUb3BWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBkaWZmTGVmdFZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgQW5ndWxhclJlc2l6ZUVsZW1lbnREaXJlY3Rpb24uQk9UVE9NX1JJR0hUOiB7XHJcbiAgICAgICAgICAgICAgICBkaWZmVG9wVmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgZGlmZkxlZnRWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEFuZ3VsYXJSZXNpemVFbGVtZW50RGlyZWN0aW9uLkJPVFRPTToge1xyXG4gICAgICAgICAgICAgICAgZGlmZldpZHRoVmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgZGlmZkxlZnRWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBkaWZmVG9wVmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5CT1RUT01fTEVGVDoge1xyXG4gICAgICAgICAgICAgICAgZGlmZldpZHRoVmFsdWUgKj0gLTE7XHJcbiAgICAgICAgICAgICAgICBkaWZmVG9wVmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5MRUZUOiB7XHJcbiAgICAgICAgICAgICAgICBkaWZmV2lkdGhWYWx1ZSAqPSAtMTtcclxuICAgICAgICAgICAgICAgIGRpZmZIZWlnaHRWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBkaWZmVG9wVmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5UT1BfTEVGVDoge1xyXG4gICAgICAgICAgICAgICAgZGlmZkhlaWdodFZhbHVlICo9IC0xO1xyXG4gICAgICAgICAgICAgICAgZGlmZldpZHRoVmFsdWUgKj0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50V2lkdGhWYWx1ZSA9IHRoaXMudGFyZ2V0RWxlbWVudFdpZHRoVmFsdWUgKyBkaWZmV2lkdGhWYWx1ZTtcclxuICAgICAgICBsZXQgY3VycmVudEhlaWdodFZhbHVlID0gdGhpcy50YXJnZXRFbGVtZW50SGVpZ2h0VmFsdWUgKyBkaWZmSGVpZ2h0VmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BvcnRpb25hbFJlc2l6ZSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFdpZHRoVmFsdWUgPiBjdXJyZW50SGVpZ2h0VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRXaWR0aFZhbHVlID0gY3VycmVudEhlaWdodFZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodFZhbHVlID0gY3VycmVudFdpZHRoVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50SGVpZ2h0VmFsdWUgPD0gMSkge1xyXG4gICAgICAgICAgICBkaWZmVG9wVmFsdWUgKz0gY3VycmVudEhlaWdodFZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRXaWR0aFZhbHVlIDw9IDEpIHtcclxuICAgICAgICAgICAgZGlmZkxlZnRWYWx1ZSArPSBjdXJyZW50V2lkdGhWYWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50V2lkdGhWYWx1ZSA8PSAwKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRXaWR0aFZhbHVlID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50SGVpZ2h0VmFsdWUgPD0gMCkge1xyXG4gICAgICAgICAgICBjdXJyZW50SGVpZ2h0VmFsdWUgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRUb3BWYWx1ZSA9IHRoaXMudGFyZ2V0RWxlbWVudFRvcFZhbHVlICsgZGlmZlRvcFZhbHVlO1xyXG4gICAgICAgIGxldCBjdXJyZW50TGVmdFZhbHVlID0gdGhpcy50YXJnZXRFbGVtZW50TGVmdFZhbHVlICsgZGlmZkxlZnRWYWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVjdCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFRvcFZhbHVlIDwgdGhpcy5yZWN0LnRvcCkge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodFZhbHVlID0gdGhpcy50YXJnZXRFbGVtZW50SGVpZ2h0VmFsdWUgKyB0aGlzLnRhcmdldEVsZW1lbnRUb3BWYWx1ZSAtIHRoaXMucmVjdC50b3A7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50VG9wVmFsdWUgPSB0aGlzLnJlY3QudG9wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50SGVpZ2h0VmFsdWUgKyBjdXJyZW50VG9wVmFsdWUgPiB0aGlzLnJlY3QuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50SGVpZ2h0VmFsdWUgPSB0aGlzLnJlY3QuaGVpZ2h0IC0gY3VycmVudFRvcFZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudExlZnRWYWx1ZSA8IHRoaXMucmVjdC5sZWZ0KSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGhWYWx1ZSA9IHRoaXMudGFyZ2V0RWxlbWVudFdpZHRoVmFsdWUgKyB0aGlzLnRhcmdldEVsZW1lbnRMZWZ0VmFsdWUgLSB0aGlzLnJlY3QubGVmdDtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRMZWZ0VmFsdWUgPSB0aGlzLnJlY3QubGVmdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFdpZHRoVmFsdWUgKyBjdXJyZW50TGVmdFZhbHVlID4gdGhpcy5yZWN0LndpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGhWYWx1ZSA9IHRoaXMucmVjdC53aWR0aCAtIGN1cnJlbnRMZWZ0VmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRoaXMub3JpZ2luYWxFdmVudCxcclxuICAgICAgICAgICAgY3VycmVudFdpZHRoVmFsdWUsXHJcbiAgICAgICAgICAgIGN1cnJlbnRIZWlnaHRWYWx1ZSxcclxuICAgICAgICAgICAgY3VycmVudFRvcFZhbHVlLFxyXG4gICAgICAgICAgICBjdXJyZW50TGVmdFZhbHVlLFxyXG4gICAgICAgICAgICBvcmlnaW5hbFdpZHRoVmFsdWU6IHRoaXMudGFyZ2V0RWxlbWVudFdpZHRoVmFsdWUsXHJcbiAgICAgICAgICAgIG9yaWdpbmFsSGVpZ2h0VmFsdWU6IHRoaXMudGFyZ2V0RWxlbWVudEhlaWdodFZhbHVlLFxyXG4gICAgICAgICAgICBvcmlnaW5hbFRvcFZhbHVlOiB0aGlzLnRhcmdldEVsZW1lbnRUb3BWYWx1ZSxcclxuICAgICAgICAgICAgb3JpZ2luYWxMZWZ0VmFsdWU6IHRoaXMudGFyZ2V0RWxlbWVudExlZnRWYWx1ZSxcclxuICAgICAgICAgICAgZGlmZmVyZW5jZVdpZHRoVmFsdWU6IGN1cnJlbnRXaWR0aFZhbHVlIC0gdGhpcy50YXJnZXRFbGVtZW50V2lkdGhWYWx1ZSxcclxuICAgICAgICAgICAgZGlmZmVyZW5jZUhlaWdodFZhbHVlOiBjdXJyZW50SGVpZ2h0VmFsdWUgLSB0aGlzLnRhcmdldEVsZW1lbnRIZWlnaHRWYWx1ZSxcclxuICAgICAgICAgICAgZGlmZmVyZW5jZVRvcFZhbHVlOiBjdXJyZW50VG9wVmFsdWUgLSB0aGlzLnRhcmdldEVsZW1lbnRUb3BWYWx1ZSxcclxuICAgICAgICAgICAgZGlmZmVyZW5jZUxlZnRWYWx1ZTogY3VycmVudExlZnRWYWx1ZSAtIHRoaXMudGFyZ2V0RWxlbWVudExlZnRWYWx1ZSxcclxuICAgICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLmRpcmVjdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcblxyXG4iXX0=