@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
736 lines • 50.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: slider.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, forwardRef, Input, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { fromEvent } from 'rxjs';
import { distinctUntilChanged, map, pluck, takeUntil, tap } from 'rxjs/operators';
/** @type {?} */
var SLIDER_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
// tslint:disable-next-line
useExisting: forwardRef((/**
* @return {?}
*/
function () { return SliderComponent; })),
multi: true
};
var SliderComponent = /** @class */ (function () {
function SliderComponent(cdr) {
this.cdr = cdr;
this.isDragging = false;
this.isHovering = false;
this.showValuePopover = false;
this.max = 100;
this.min = 0;
this.step = 1;
this.disabled = false;
this.tipsRenderer = (/**
* @param {?} value
* @return {?}
*/
function (value) { return "" + value; });
this.onTouchedCallback = (/**
* @param {?} v
* @return {?}
*/
function (v) {
});
this.onChangeCallback = (/**
* @param {?} v
* @return {?}
*/
function (v) {
});
}
/**
* @return {?}
*/
SliderComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.checkRangeValues(this.min, this.max);
this.checkStepValue();
this.toggleDisabled(this.disabled);
if (this.value === null) {
this.setValue(this.ensureValueInRange(null));
}
};
/**
* @param {?} changes
* @return {?}
*/
SliderComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.hasOwnProperty('min') || changes.hasOwnProperty('max') || changes.hasOwnProperty('step')) {
this.checkRangeValues(this.min, this.max);
this.checkStepValue();
}
};
/**
* @return {?}
*/
SliderComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.registerMouseEventsListeners();
this.registerHandleHoverPopoverListener();
this.toggleDisabled(this.disabled);
};
/**
* @param {?} fn
* @return {?}
*/
SliderComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChangeCallback = fn;
};
/**
* @param {?} fn
* @return {?}
*/
SliderComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouchedCallback = fn;
};
/**
* @param {?} isDisabled
* @return {?}
*/
SliderComponent.prototype.setDisabledState = /**
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
this.toggleDisabled(isDisabled);
};
/**
* @param {?} newValue
* @return {?}
*/
SliderComponent.prototype.writeValue = /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
this.setValue(this.ensureValueInRange(newValue));
};
/**
* @private
* @param {?} minValue
* @param {?} maxValue
* @return {?}
*/
SliderComponent.prototype.checkRangeValues = /**
* @private
* @param {?} minValue
* @param {?} maxValue
* @return {?}
*/
function (minValue, maxValue) {
if (maxValue <= minValue) {
throw new Error("max value must be greater than min value");
}
};
/**
* @private
* @return {?}
*/
SliderComponent.prototype.checkStepValue = /**
* @private
* @return {?}
*/
function () {
if (this.step < 0 || !!!this.step) {
throw new Error('step value must be greater than 0.');
}
else if ((this.max - this.min) % this.step) {
throw new Error('(max - min) must be divisible by step.');
}
};
/**
* @private
* @param {?} ratio
* @param {?} min
* @param {?} max
* @param {?} step
* @return {?}
*/
SliderComponent.prototype.ratioToValue = /**
* @private
* @param {?} ratio
* @param {?} min
* @param {?} max
* @param {?} step
* @return {?}
*/
function (ratio, min, max, step) {
/** @type {?} */
var value = (max - min) * ratio + min;
if (step > 0) {
value = Math.round(value / step) * step;
}
return this.clamp(min, value, max);
};
/**
* @private
* @param {?} handleX
* @param {?} startX
* @param {?} totalLength
* @return {?}
*/
SliderComponent.prototype.convertHandlePositionToRatio = /**
* @private
* @param {?} handleX
* @param {?} startX
* @param {?} totalLength
* @return {?}
*/
function (handleX, startX, totalLength) {
return this.clamp(0, (handleX - startX) / totalLength, 1);
};
/**
* @private
* @param {?} min
* @param {?} n
* @param {?} max
* @return {?}
*/
SliderComponent.prototype.clamp = /**
* @private
* @param {?} min
* @param {?} n
* @param {?} max
* @return {?}
*/
function (min, n, max) {
return Math.max(min, Math.min(n, max));
};
/**
* @private
* @param {?} percentage
* @return {?}
*/
SliderComponent.prototype.updateStyle = /**
* @private
* @param {?} percentage
* @return {?}
*/
function (percentage) {
percentage = Math.min(1, Math.max(0, percentage));
this.sliderTrack.nativeElement.style.width = percentage * 100 + "%";
this.sliderHandle.nativeElement.style.left = percentage * 100 + "%";
};
/**
* @private
* @return {?}
*/
SliderComponent.prototype.registerMouseEventsListeners = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.dragStartListener = fromEvent(this.slider.nativeElement, 'mousedown').pipe(tap((/**
* @param {?} e
* @return {?}
*/
function (e) {
e.stopPropagation();
e.preventDefault();
})), pluck('pageX'), map((/**
* @param {?} position
* @return {?}
*/
function (position) { return _this.mousePositionToAdaptiveValue(position); })));
this.dragEndListener = fromEvent(document, 'mouseup');
this.dragMoveListener = fromEvent(document, 'mousemove').pipe(tap((/**
* @param {?} e
* @return {?}
*/
function (e) {
e.stopPropagation();
e.preventDefault();
})), pluck('pageX'), distinctUntilChanged(), map((/**
* @param {?} position
* @return {?}
*/
function (position) { return _this.mousePositionToAdaptiveValue(position); })), distinctUntilChanged(), takeUntil(this.dragEndListener));
};
/**
* @private
* @return {?}
*/
SliderComponent.prototype.getSliderPagePosition = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var rect = this.slider.nativeElement.getBoundingClientRect();
/** @type {?} */
var window = this.slider.nativeElement.ownerDocument.defaultView;
return rect.left + window.pageXOffset;
};
/**
* @private
* @return {?}
*/
SliderComponent.prototype.getRailLength = /**
* @private
* @return {?}
*/
function () {
return this.sliderRail.nativeElement.clientWidth;
};
/**
* @private
* @param {?} handleX
* @return {?}
*/
SliderComponent.prototype.mousePositionToAdaptiveValue = /**
* @private
* @param {?} handleX
* @return {?}
*/
function (handleX) {
/** @type {?} */
var sliderStartX = this.getSliderPagePosition();
/** @type {?} */
var sliderLength = this.getRailLength();
/** @type {?} */
var ratio = this.convertHandlePositionToRatio(handleX, sliderStartX, sliderLength);
/** @type {?} */
var value = this.ratioToValue(ratio, this.min, this.max, this.step);
return parseFloat(value.toFixed(this.getDecimals(this.step)));
};
/**
* @private
* @param {?} value
* @return {?}
*/
SliderComponent.prototype.getDecimals = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var valueString = value.toString();
/** @type {?} */
var integerLength = valueString.indexOf('.') + 1;
return integerLength >= 0 ? valueString.length - integerLength : 0;
};
/**
* @private
* @param {?} value
* @return {?}
*/
SliderComponent.prototype.mouseStartMoving = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
this.handleController(true);
this.setValue(value);
};
/**
* @private
* @param {?} value
* @return {?}
*/
SliderComponent.prototype.mouseMoving = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
this.setValue(value);
this.cdr.markForCheck();
};
/**
* @private
* @return {?}
*/
SliderComponent.prototype.mouseStopMoving = /**
* @private
* @return {?}
*/
function () {
this.handleController(false);
this.cdr.markForCheck();
};
/**
* @private
* @param {?=} mouseActions
* @return {?}
*/
SliderComponent.prototype.subscribeMouseActions = /**
* @private
* @param {?=} mouseActions
* @return {?}
*/
function (mouseActions) {
if (mouseActions === void 0) { mouseActions = ['start', 'move', 'end']; }
if (mouseActions.indexOf('start') !== -1 && this.dragStartListener && !this.dragStartHandler) {
this.dragStartHandler = this.dragStartListener.subscribe(this.mouseStartMoving.bind(this));
}
if (mouseActions.indexOf('move') !== -1 && this.dragMoveListener && !this.dragMoveHandler) {
this.dragMoveHandler = this.dragMoveListener.subscribe(this.mouseMoving.bind(this));
}
if (mouseActions.indexOf('end') !== -1 && this.dragEndListener && !this.dragEndHandler) {
this.dragEndHandler = this.dragEndListener.subscribe(this.mouseStopMoving.bind(this));
}
};
/**
* @private
* @param {?=} dragStages
* @return {?}
*/
SliderComponent.prototype.unsubscribeMouseActions = /**
* @private
* @param {?=} dragStages
* @return {?}
*/
function (dragStages) {
if (dragStages === void 0) { dragStages = ['start', 'move', 'end']; }
if (dragStages.indexOf('start') !== -1 && this.dragStartHandler) {
this.dragStartHandler.unsubscribe();
this.dragStartHandler = null;
}
if (dragStages.indexOf('move') !== -1 && this.dragMoveHandler) {
this.dragMoveHandler.unsubscribe();
this.dragMoveHandler = null;
}
if (dragStages.indexOf('end') !== -1 && this.dragEndHandler) {
this.dragEndHandler.unsubscribe();
this.dragEndHandler = null;
}
};
/**
* @private
* @param {?} movable
* @return {?}
*/
SliderComponent.prototype.handleController = /**
* @private
* @param {?} movable
* @return {?}
*/
function (movable) {
if (movable) {
this.isDragging = true;
this.showValuePopover = this.showValuePopoverController();
this.subscribeMouseActions(['move', 'end']);
}
else {
this.isDragging = false;
this.showValuePopover = this.showValuePopoverController();
this.unsubscribeMouseActions(['move', 'end']);
}
};
/**
* @private
* @param {?} disabled
* @return {?}
*/
SliderComponent.prototype.toggleDisabled = /**
* @private
* @param {?} disabled
* @return {?}
*/
function (disabled) {
if (disabled) {
this.unsubscribeMouseActions();
}
else {
this.subscribeMouseActions(['start']);
}
};
/**
* @private
* @param {?} value
* @return {?}
*/
SliderComponent.prototype.setValue = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
if (this.value !== value) {
this.value = value;
this.updateTrackAndHandle();
}
this.onChangeCallback(this.value);
};
/**
* @private
* @param {?} value
* @return {?}
*/
SliderComponent.prototype.ensureValueInRange = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var safeValue;
if (!this.valueMustBeValid(value)) {
safeValue = this.min;
}
else {
safeValue = this.clamp(this.min, (/** @type {?} */ (value)), this.max);
}
return safeValue;
};
/**
* @private
* @return {?}
*/
SliderComponent.prototype.updateTrackAndHandle = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var value = this.value;
/** @type {?} */
var offset = this.valueToOffset(value);
this.updateStyle(offset / 100);
this.cdr.markForCheck();
};
/**
* @private
* @param {?} value
* @return {?}
*/
SliderComponent.prototype.valueMustBeValid = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
return !isNaN(typeof value !== 'number' ? parseFloat(value) : value);
};
/**
* @private
* @param {?} value
* @return {?}
*/
SliderComponent.prototype.valueToOffset = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
return ((value - this.min) / (this.max - this.min)) * 100;
};
/**
* @private
* @return {?}
*/
SliderComponent.prototype.registerHandleHoverPopoverListener = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var mouseOverListener = fromEvent(this.sliderHandle.nativeElement, 'mouseover');
/** @type {?} */
var mouseLeaveListener = fromEvent(this.sliderHandle.nativeElement, 'mouseout');
this.mouseOverHandler = mouseOverListener.subscribe(this.sliderHandlePopoverOnMouseHover.bind(this));
this.mouseLeaveHandler = mouseLeaveListener.subscribe(this.sliderHandlePopoverOnMouseLeave.bind(this));
};
/**
* @private
* @return {?}
*/
SliderComponent.prototype.sliderHandlePopoverOnMouseHover = /**
* @private
* @return {?}
*/
function () {
this.isHovering = true;
this.showValuePopover = this.showValuePopoverController();
this.cdr.markForCheck();
};
/**
* @private
* @return {?}
*/
SliderComponent.prototype.sliderHandlePopoverOnMouseLeave = /**
* @private
* @return {?}
*/
function () {
this.isHovering = false;
this.showValuePopover = this.showValuePopoverController();
this.cdr.markForCheck();
};
/**
* @private
* @return {?}
*/
SliderComponent.prototype.unregisterHandleHoverTooltip = /**
* @private
* @return {?}
*/
function () {
this.mouseOverHandler.unsubscribe();
this.mouseLeaveHandler.unsubscribe();
};
/**
* @private
* @return {?}
*/
SliderComponent.prototype.showValuePopoverController = /**
* @private
* @return {?}
*/
function () {
return this.isDragging || this.isHovering;
};
/**
* @return {?}
*/
SliderComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.unsubscribeMouseActions();
this.unregisterHandleHoverTooltip();
};
SliderComponent.decorators = [
{ type: Component, args: [{
selector: 'd-slider',
template: "<div class=\"devui-slider\" #slider [ngClass]=\"{ disabled: disabled }\">\r\n <div class=\"devui-slider-rail\" #sliderRail [ngClass]=\"{ disabled: disabled }\"></div>\r\n <div class=\"devui-slider-track\" #sliderTrack [ngClass]=\"{ disabled: disabled }\"></div>\r\n <div\r\n class=\"devui-slider-handle\"\r\n #sliderHandle\r\n [ngClass]=\"{ disabled: disabled }\"\r\n dPopover\r\n position=\"top\"\r\n [content]=\"showValuePopover && tipsRenderer ? tipsRenderer(value) : ''\"\r\n [showAnimate]=\"false\"\r\n [visible]=\"tipsRenderer && showValuePopover\"\r\n ></div>\r\n</div>\r\n",
providers: [SLIDER_CONTROL_VALUE_ACCESSOR],
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [":host{display:block}.devui-slider{position:relative;width:100%;padding:5px 0;margin:5px 0;cursor:pointer;box-sizing:border-box;height:15px}.devui-slider .devui-slider-rail{position:absolute;background-color:#f8f8f8;height:5px;width:100%;-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.devui-slider .devui-slider-rail.disabled,.devui-slider:hover .devui-slider-rail:not(.disabled){background-color:#f8f8f8}.devui-slider:hover .devui-slider-track:not(.disabled){background-color:#344899}.devui-slider:hover .devui-slider-handle:not(.disabled){border-color:#344899}.devui-slider .devui-slider-track{position:absolute;background-color:#5e7ce0;height:5px;width:0}.devui-slider .devui-slider-handle{position:absolute;background-color:#fff;width:14px;height:14px;border-radius:50%;margin-left:-7px;margin-top:-5px;left:0;-webkit-transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;border:2px solid #5e7ce0}.devui-slider .devui-slider-handle:not(.disabled):active,.devui-slider .devui-slider-handle:not(.disabled):hover{-webkit-transform:scale(1.3);transform:scale(1.3)}.devui-slider.disabled{cursor:not-allowed;opacity:.3}"]
}] }
];
/** @nocollapse */
SliderComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef }
]; };
SliderComponent.propDecorators = {
slider: [{ type: ViewChild, args: ['slider', { static: true },] }],
sliderHandle: [{ type: ViewChild, args: ['sliderHandle', { static: true },] }],
sliderTrack: [{ type: ViewChild, args: ['sliderTrack', { static: true },] }],
sliderRail: [{ type: ViewChild, args: ['sliderRail', { static: true },] }],
max: [{ type: Input }],
min: [{ type: Input }],
step: [{ type: Input }],
disabled: [{ type: Input }],
tipsRenderer: [{ type: Input }]
};
return SliderComponent;
}());
export { SliderComponent };
if (false) {
/**
* @type {?}
* @private
*/
SliderComponent.prototype.dragStartListener;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.dragMoveListener;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.dragEndListener;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.dragStartHandler;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.dragMoveHandler;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.dragEndHandler;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.isDragging;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.isHovering;
/** @type {?} */
SliderComponent.prototype.value;
/** @type {?} */
SliderComponent.prototype.showValuePopover;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.mouseOverHandler;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.mouseLeaveHandler;
/** @type {?} */
SliderComponent.prototype.slider;
/** @type {?} */
SliderComponent.prototype.sliderHandle;
/** @type {?} */
SliderComponent.prototype.sliderTrack;
/** @type {?} */
SliderComponent.prototype.sliderRail;
/** @type {?} */
SliderComponent.prototype.max;
/** @type {?} */
SliderComponent.prototype.min;
/** @type {?} */
SliderComponent.prototype.step;
/** @type {?} */
SliderComponent.prototype.disabled;
/** @type {?} */
SliderComponent.prototype.tipsRenderer;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.onTouchedCallback;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.onChangeCallback;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.cdr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL3NsaWRlci8iLCJzb3VyY2VzIjpbInNsaWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixLQUFLLEVBS0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0lBRTVFLDZCQUE2QixHQUFRO0lBQ3pDLE9BQU8sRUFBRSxpQkFBaUI7O0lBRTFCLFdBQVcsRUFBRSxVQUFVOzs7SUFBQyxjQUFNLE9BQUEsZUFBZSxFQUFmLENBQWUsRUFBQztJQUM5QyxLQUFLLEVBQUUsSUFBSTtDQUNaO0FBRUQ7SUFTRSx5QkFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFRbEMsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRXBCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQVF2QixRQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ1YsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUNSLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGlCQUFZOzs7O1FBQThCLFVBQUMsS0FBSyxJQUFLLE9BQUEsS0FBRyxLQUFPLEVBQVYsQ0FBVSxFQUFDO1FBeUNqRSxzQkFBaUI7Ozs7UUFBRyxVQUFDLENBQU07UUFDbkMsQ0FBQyxFQUFBO1FBRU8scUJB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O3NCQUN4QyxLQUFLO3NCQUNMLEtBQUs7dUJBQ0wsS0FBSzsyQkFDTCxLQUFLOytCQUNMLEtBQUs7O0lBMFFSLHNCQUFDO0NBQUEsQUExU0QsSUEwU0M7U0FsU1ksZUFBZTs7Ozs7O0lBRzFCLDRDQUE4Qzs7Ozs7SUFDOUMsMkNBQTZDOzs7OztJQUM3QywwQ0FBMkM7Ozs7O0lBQzNDLDJDQUE4Qzs7Ozs7SUFDOUMsMENBQTZDOzs7OztJQUM3Qyx5Q0FBNEM7Ozs7O0lBQzVDLHFDQUEyQjs7Ozs7SUFDM0IscUNBQTJCOztJQUMzQixnQ0FBYTs7SUFDYiwyQ0FBZ0M7Ozs7O0lBQ2hDLDJDQUF1Qzs7Ozs7SUFDdkMsNENBQXdDOztJQUV4QyxpQ0FBMEQ7O0lBQzFELHVDQUFzRTs7SUFDdEUsc0NBQW9FOztJQUNwRSxxQ0FBa0U7O0lBQ2xFLDhCQUFtQjs7SUFDbkIsOEJBQWlCOztJQUNqQiwrQkFBa0I7O0lBQ2xCLG1DQUEwQjs7SUFDMUIsdUNBQXlFOzs7OztJQXlDekUsNENBQ0M7Ozs7O0lBRUQsMkNBQ0M7Ozs7O0lBcEVXLDhCQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBmb3J3YXJkUmVmLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgcGx1Y2ssIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuY29uc3QgU0xJREVSX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTbGlkZXJDb21wb25lbnQpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Qtc2xpZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2xpZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zbGlkZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtTTElERVJfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgU2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gIH1cclxuICBwcml2YXRlIGRyYWdTdGFydExpc3RlbmVyOiBPYnNlcnZhYmxlPG51bWJlcj47XHJcbiAgcHJpdmF0ZSBkcmFnTW92ZUxpc3RlbmVyOiBPYnNlcnZhYmxlPG51bWJlcj47XHJcbiAgcHJpdmF0ZSBkcmFnRW5kTGlzdGVuZXI6IE9ic2VydmFibGU8RXZlbnQ+O1xyXG4gIHByaXZhdGUgZHJhZ1N0YXJ0SGFuZGxlcjogU3Vic2NyaXB0aW9uIHwgbnVsbDtcclxuICBwcml2YXRlIGRyYWdNb3ZlSGFuZGxlcjogU3Vic2NyaXB0aW9uIHwgbnVsbDtcclxuICBwcml2YXRlIGRyYWdFbmRIYW5kbGVyOiBTdWJzY3JpcHRpb24gfCBudWxsO1xyXG4gIHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaXNIb3ZlcmluZyA9IGZhbHNlO1xyXG4gIHB1YmxpYyB2YWx1ZTtcclxuICBwdWJsaWMgc2hvd1ZhbHVlUG9wb3ZlciA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbW91c2VPdmVySGFuZGxlcjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgbW91c2VMZWF2ZUhhbmRsZXI6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnc2xpZGVyJywgeyBzdGF0aWM6IHRydWUgfSkgc2xpZGVyOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3NsaWRlckhhbmRsZScsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlckhhbmRsZTogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdzbGlkZXJUcmFjaycsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlclRyYWNrOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3NsaWRlclJhaWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbGlkZXJSYWlsOiBFbGVtZW50UmVmO1xyXG4gIEBJbnB1dCgpIG1heCA9IDEwMDtcclxuICBASW5wdXQoKSBtaW4gPSAwO1xyXG4gIEBJbnB1dCgpIHN0ZXAgPSAxO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdGlwc1JlbmRlcmVyOiAodmFsdWU6IG51bWJlcikgPT4gc3RyaW5nID0gKHZhbHVlKSA9PiBgJHt2YWx1ZX1gO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY2hlY2tSYW5nZVZhbHVlcyh0aGlzLm1pbiwgdGhpcy5tYXgpO1xyXG4gICAgdGhpcy5jaGVja1N0ZXBWYWx1ZSgpO1xyXG4gICAgdGhpcy50b2dnbGVEaXNhYmxlZCh0aGlzLmRpc2FibGVkKTtcclxuICAgIGlmICh0aGlzLnZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbnN1cmVWYWx1ZUluUmFuZ2UobnVsbCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ21pbicpIHx8IGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ21heCcpIHx8IGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3N0ZXAnKSkge1xyXG4gICAgICB0aGlzLmNoZWNrUmFuZ2VWYWx1ZXModGhpcy5taW4sIHRoaXMubWF4KTtcclxuICAgICAgdGhpcy5jaGVja1N0ZXBWYWx1ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5yZWdpc3Rlck1vdXNlRXZlbnRzTGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLnJlZ2lzdGVySGFuZGxlSG92ZXJQb3BvdmVyTGlzdGVuZXIoKTtcclxuICAgIHRoaXMudG9nZ2xlRGlzYWJsZWQodGhpcy5kaXNhYmxlZCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICAgIHRoaXMudG9nZ2xlRGlzYWJsZWQoaXNEaXNhYmxlZCk7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKG5ld1ZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbnN1cmVWYWx1ZUluUmFuZ2UobmV3VmFsdWUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Ub3VjaGVkQ2FsbGJhY2sgPSAodjogYW55KSA9PiB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uQ2hhbmdlQ2FsbGJhY2sgPSAodjogYW55KSA9PiB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrUmFuZ2VWYWx1ZXMobWluVmFsdWUsIG1heFZhbHVlKSB7XHJcbiAgICBpZiAobWF4VmFsdWUgPD0gbWluVmFsdWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtYXggdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluIHZhbHVlYCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrU3RlcFZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMuc3RlcCA8IDAgfHwgISEhdGhpcy5zdGVwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignc3RlcCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLicpO1xyXG4gICAgfSBlbHNlIGlmICgodGhpcy5tYXggLSB0aGlzLm1pbikgJSB0aGlzLnN0ZXApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCcobWF4IC0gbWluKSBtdXN0IGJlIGRpdmlzaWJsZSBieSBzdGVwLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByYXRpb1RvVmFsdWUoXHJcbiAgICByYXRpbzogbnVtYmVyLFxyXG4gICAgbWluOiBudW1iZXIsXHJcbiAgICBtYXg6IG51bWJlcixcclxuICAgIHN0ZXA6IG51bWJlclxyXG4gICk6IG51bWJlciB7XHJcbiAgICBsZXQgdmFsdWUgPSAobWF4IC0gbWluKSAqIHJhdGlvICsgbWluO1xyXG4gICAgaWYgKHN0ZXAgPiAwKSB7XHJcbiAgICAgIHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAvIHN0ZXApICogc3RlcDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNsYW1wKG1pbiwgdmFsdWUsIG1heCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnZlcnRIYW5kbGVQb3NpdGlvblRvUmF0aW8oaGFuZGxlWDogbnVtYmVyLCBzdGFydFg6IG51bWJlciwgdG90YWxMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jbGFtcCgwLCAoaGFuZGxlWCAtIHN0YXJ0WCkgLyB0b3RhbExlbmd0aCwgMSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsYW1wKG1pbjogbnVtYmVyLCBuOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihuLCBtYXgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU3R5bGUocGVyY2VudGFnZSkge1xyXG4gICAgcGVyY2VudGFnZSA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIHBlcmNlbnRhZ2UpKTtcclxuICAgIHRoaXMuc2xpZGVyVHJhY2submF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3BlcmNlbnRhZ2UgKiAxMDB9JWA7XHJcbiAgICB0aGlzLnNsaWRlckhhbmRsZS5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtwZXJjZW50YWdlICogMTAwfSVgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWdpc3Rlck1vdXNlRXZlbnRzTGlzdGVuZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kcmFnU3RhcnRMaXN0ZW5lciA9IGZyb21FdmVudCh0aGlzLnNsaWRlci5uYXRpdmVFbGVtZW50LCAnbW91c2Vkb3duJykucGlwZShcclxuICAgICAgdGFwKChlOiBFdmVudCkgPT4ge1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9KSxcclxuICAgICAgcGx1Y2s8RXZlbnQsIG51bWJlcj4oJ3BhZ2VYJyksXHJcbiAgICAgIG1hcCgocG9zaXRpb246IG51bWJlcikgPT4gdGhpcy5tb3VzZVBvc2l0aW9uVG9BZGFwdGl2ZVZhbHVlKHBvc2l0aW9uKSlcclxuICAgICk7XHJcbiAgICB0aGlzLmRyYWdFbmRMaXN0ZW5lciA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNldXAnKTtcclxuICAgIHRoaXMuZHJhZ01vdmVMaXN0ZW5lciA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNlbW92ZScpLnBpcGUoXHJcbiAgICAgIHRhcCgoZTogRXZlbnQpID0+IHtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSksXHJcbiAgICAgIHBsdWNrPEV2ZW50LCBudW1iZXI+KCdwYWdlWCcpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICBtYXAoKHBvc2l0aW9uOiBudW1iZXIpID0+IHRoaXMubW91c2VQb3NpdGlvblRvQWRhcHRpdmVWYWx1ZShwb3NpdGlvbikpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kcmFnRW5kTGlzdGVuZXIpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTbGlkZXJQYWdlUG9zaXRpb24oKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnNsaWRlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3Qgd2luZG93ID0gdGhpcy5zbGlkZXIubmF0aXZlRWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xyXG4gICAgcmV0dXJuIHJlY3QubGVmdCArIHdpbmRvdy5wYWdlWE9mZnNldDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UmFpbExlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2xpZGVyUmFpbC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtb3VzZVBvc2l0aW9uVG9BZGFwdGl2ZVZhbHVlKGhhbmRsZVg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBzbGlkZXJTdGFydFggPSB0aGlzLmdldFNsaWRlclBhZ2VQb3NpdGlvbigpO1xyXG4gICAgY29uc3Qgc2xpZGVyTGVuZ3RoID0gdGhpcy5nZXRSYWlsTGVuZ3RoKCk7XHJcbiAgICBjb25zdCByYXRpbyA9IHRoaXMuY29udmVydEhhbmRsZVBvc2l0aW9uVG9SYXRpbyhoYW5kbGVYLCBzbGlkZXJTdGFydFgsIHNsaWRlckxlbmd0aCk7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmF0aW9Ub1ZhbHVlKHJhdGlvLCB0aGlzLm1pbiwgdGhpcy5tYXgsIHRoaXMuc3RlcCk7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZS50b0ZpeGVkKHRoaXMuZ2V0RGVjaW1hbHModGhpcy5zdGVwKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREZWNpbWFscyh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIGNvbnN0IGludGVnZXJMZW5ndGggPSB2YWx1ZVN0cmluZy5pbmRleE9mKCcuJykgKyAxO1xyXG4gICAgcmV0dXJuIGludGVnZXJMZW5ndGggPj0gMCA/IHZhbHVlU3RyaW5nLmxlbmd0aCAtIGludGVnZXJMZW5ndGggOiAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtb3VzZVN0YXJ0TW92aW5nKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlQ29udHJvbGxlcih0cnVlKTtcclxuICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtb3VzZU1vdmluZyh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtb3VzZVN0b3BNb3ZpbmcoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhhbmRsZUNvbnRyb2xsZXIoZmFsc2UpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZU1vdXNlQWN0aW9ucyhtb3VzZUFjdGlvbnM6IHN0cmluZ1tdID0gWydzdGFydCcsICdtb3ZlJywgJ2VuZCddKTogdm9pZCB7XHJcbiAgICBpZiAobW91c2VBY3Rpb25zLmluZGV4T2YoJ3N0YXJ0JykgIT09IC0xICYmIHRoaXMuZHJhZ1N0YXJ0TGlzdGVuZXIgJiYgIXRoaXMuZHJhZ1N0YXJ0SGFuZGxlcikge1xyXG4gICAgICB0aGlzLmRyYWdTdGFydEhhbmRsZXIgPSB0aGlzLmRyYWdTdGFydExpc3RlbmVyLnN1YnNjcmliZSh0aGlzLm1vdXNlU3RhcnRNb3ZpbmcuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1vdXNlQWN0aW9ucy5pbmRleE9mKCdtb3ZlJykgIT09IC0xICYmIHRoaXMuZHJhZ01vdmVMaXN0ZW5lciAmJiAhdGhpcy5kcmFnTW92ZUhhbmRsZXIpIHtcclxuICAgICAgdGhpcy5kcmFnTW92ZUhhbmRsZXIgPSB0aGlzLmRyYWdNb3ZlTGlzdGVuZXIuc3Vic2NyaWJlKHRoaXMubW91c2VNb3ZpbmcuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1vdXNlQWN0aW9ucy5pbmRleE9mKCdlbmQnKSAhPT0gLTEgJiYgdGhpcy5kcmFnRW5kTGlzdGVuZXIgJiYgIXRoaXMuZHJhZ0VuZEhhbmRsZXIpIHtcclxuICAgICAgdGhpcy5kcmFnRW5kSGFuZGxlciA9IHRoaXMuZHJhZ0VuZExpc3RlbmVyLnN1YnNjcmliZSh0aGlzLm1vdXNlU3RvcE1vdmluZy5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVNb3VzZUFjdGlvbnMoZHJhZ1N0YWdlczogc3RyaW5nW10gPSBbJ3N0YXJ0JywgJ21vdmUnLCAnZW5kJ10pOiB2b2lkIHtcclxuICAgIGlmIChkcmFnU3RhZ2VzLmluZGV4T2YoJ3N0YXJ0JykgIT09IC0xICYmIHRoaXMuZHJhZ1N0YXJ0SGFuZGxlcikge1xyXG4gICAgICB0aGlzLmRyYWdTdGFydEhhbmRsZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5kcmFnU3RhcnRIYW5kbGVyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZHJhZ1N0YWdlcy5pbmRleE9mKCdtb3ZlJykgIT09IC0xICYmIHRoaXMuZHJhZ01vdmVIYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZHJhZ01vdmVIYW5kbGVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuZHJhZ01vdmVIYW5kbGVyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZHJhZ1N0YWdlcy5pbmRleE9mKCdlbmQnKSAhPT0gLTEgJiYgdGhpcy5kcmFnRW5kSGFuZGxlcikge1xyXG4gICAgICB0aGlzLmRyYWdFbmRIYW5kbGVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuZHJhZ0VuZEhhbmRsZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVDb250cm9sbGVyKG1vdmFibGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChtb3ZhYmxlKSB7XHJcbiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2hvd1ZhbHVlUG9wb3ZlciA9IHRoaXMuc2hvd1ZhbHVlUG9wb3ZlckNvbnRyb2xsZXIoKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVNb3VzZUFjdGlvbnMoWydtb3ZlJywgJ2VuZCddKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3dWYWx1ZVBvcG92ZXIgPSB0aGlzLnNob3dWYWx1ZVBvcG92ZXJDb250cm9sbGVyKCk7XHJcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVNb3VzZUFjdGlvbnMoWydtb3ZlJywgJ2VuZCddKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9nZ2xlRGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLnVuc3Vic2NyaWJlTW91c2VBY3Rpb25zKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN1YnNjcmliZU1vdXNlQWN0aW9ucyhbJ3N0YXJ0J10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVUcmFja0FuZEhhbmRsZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHRoaXMudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbnN1cmVWYWx1ZUluUmFuZ2UodmFsdWU6IG51bWJlciB8IG51bGwpOiBudW1iZXIge1xyXG4gICAgbGV0IHNhZmVWYWx1ZTtcclxuICAgIGlmICghdGhpcy52YWx1ZU11c3RCZVZhbGlkKHZhbHVlKSkge1xyXG4gICAgICBzYWZlVmFsdWUgPSB0aGlzLm1pbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNhZmVWYWx1ZSA9IHRoaXMuY2xhbXAodGhpcy5taW4sIHZhbHVlIGFzIG51bWJlciwgdGhpcy5tYXgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNhZmVWYWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVHJhY2tBbmRIYW5kbGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWU7XHJcbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLnZhbHVlVG9PZmZzZXQodmFsdWUpO1xyXG4gICAgdGhpcy51cGRhdGVTdHlsZShvZmZzZXQgLyAxMDApO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbHVlTXVzdEJlVmFsaWQodmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICFpc05hTih0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbHVlVG9PZmZzZXQodmFsdWU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKCh2YWx1ZSAtIHRoaXMubWluKSAvICh0aGlzLm1heCAtIHRoaXMubWluKSkgKiAxMDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZ2lzdGVySGFuZGxlSG92ZXJQb3BvdmVyTGlzdGVuZXIoKSB7XHJcbiAgICBjb25zdCBtb3VzZU92ZXJMaXN0ZW5lciA9IGZyb21FdmVudCh0aGlzLnNsaWRlckhhbmRsZS5uYXRpdmVFbGVtZW50LCAnbW91c2VvdmVyJyk7XHJcbiAgICBjb25zdCBtb3VzZUxlYXZlTGlzdGVuZXIgPSBmcm9tRXZlbnQodGhpcy5zbGlkZXJIYW5kbGUubmF0aXZlRWxlbWVudCwgJ21vdXNlb3V0Jyk7XHJcbiAgICB0aGlzLm1vdXNlT3ZlckhhbmRsZXIgPSBtb3VzZU92ZXJMaXN0ZW5lci5zdWJzY3JpYmUodGhpcy5zbGlkZXJIYW5kbGVQb3BvdmVyT25Nb3VzZUhvdmVyLmJpbmQodGhpcykpO1xyXG4gICAgdGhpcy5tb3VzZUxlYXZlSGFuZGxlciA9IG1vdXNlTGVhdmVMaXN0ZW5lci5zdWJzY3JpYmUodGhpcy5zbGlkZXJIYW5kbGVQb3BvdmVyT25Nb3VzZUxlYXZlLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzbGlkZXJIYW5kbGVQb3BvdmVyT25Nb3VzZUhvdmVyKCkge1xyXG4gICAgdGhpcy5pc0hvdmVy