@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
568 lines • 46 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 {?} */
const SLIDER_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
// tslint:disable-next-line
useExisting: forwardRef((/**
* @return {?}
*/
() => SliderComponent)),
multi: true
};
export class SliderComponent {
/**
* @param {?} cdr
*/
constructor(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 {?}
*/
(value) => `${value}`);
this.onTouchedCallback = (/**
* @param {?} v
* @return {?}
*/
(v) => {
});
this.onChangeCallback = (/**
* @param {?} v
* @return {?}
*/
(v) => {
});
}
/**
* @return {?}
*/
ngOnInit() {
this.checkRangeValues(this.min, this.max);
this.checkStepValue();
this.toggleDisabled(this.disabled);
if (this.value === null) {
this.setValue(this.ensureValueInRange(null));
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.hasOwnProperty('min') || changes.hasOwnProperty('max') || changes.hasOwnProperty('step')) {
this.checkRangeValues(this.min, this.max);
this.checkStepValue();
}
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.registerMouseEventsListeners();
this.registerHandleHoverPopoverListener();
this.toggleDisabled(this.disabled);
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChangeCallback = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouchedCallback = fn;
}
/**
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
this.toggleDisabled(isDisabled);
}
/**
* @param {?} newValue
* @return {?}
*/
writeValue(newValue) {
this.setValue(this.ensureValueInRange(newValue));
}
/**
* @private
* @param {?} minValue
* @param {?} maxValue
* @return {?}
*/
checkRangeValues(minValue, maxValue) {
if (maxValue <= minValue) {
throw new Error(`max value must be greater than min value`);
}
}
/**
* @private
* @return {?}
*/
checkStepValue() {
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 {?}
*/
ratioToValue(ratio, min, max, step) {
/** @type {?} */
let 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 {?}
*/
convertHandlePositionToRatio(handleX, startX, totalLength) {
return this.clamp(0, (handleX - startX) / totalLength, 1);
}
/**
* @private
* @param {?} min
* @param {?} n
* @param {?} max
* @return {?}
*/
clamp(min, n, max) {
return Math.max(min, Math.min(n, max));
}
/**
* @private
* @param {?} percentage
* @return {?}
*/
updateStyle(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 {?}
*/
registerMouseEventsListeners() {
this.dragStartListener = fromEvent(this.slider.nativeElement, 'mousedown').pipe(tap((/**
* @param {?} e
* @return {?}
*/
(e) => {
e.stopPropagation();
e.preventDefault();
})), pluck('pageX'), map((/**
* @param {?} position
* @return {?}
*/
(position) => this.mousePositionToAdaptiveValue(position))));
this.dragEndListener = fromEvent(document, 'mouseup');
this.dragMoveListener = fromEvent(document, 'mousemove').pipe(tap((/**
* @param {?} e
* @return {?}
*/
(e) => {
e.stopPropagation();
e.preventDefault();
})), pluck('pageX'), distinctUntilChanged(), map((/**
* @param {?} position
* @return {?}
*/
(position) => this.mousePositionToAdaptiveValue(position))), distinctUntilChanged(), takeUntil(this.dragEndListener));
}
/**
* @private
* @return {?}
*/
getSliderPagePosition() {
/** @type {?} */
const rect = this.slider.nativeElement.getBoundingClientRect();
/** @type {?} */
const window = this.slider.nativeElement.ownerDocument.defaultView;
return rect.left + window.pageXOffset;
}
/**
* @private
* @return {?}
*/
getRailLength() {
return this.sliderRail.nativeElement.clientWidth;
}
/**
* @private
* @param {?} handleX
* @return {?}
*/
mousePositionToAdaptiveValue(handleX) {
/** @type {?} */
const sliderStartX = this.getSliderPagePosition();
/** @type {?} */
const sliderLength = this.getRailLength();
/** @type {?} */
const ratio = this.convertHandlePositionToRatio(handleX, sliderStartX, sliderLength);
/** @type {?} */
const value = this.ratioToValue(ratio, this.min, this.max, this.step);
return parseFloat(value.toFixed(this.getDecimals(this.step)));
}
/**
* @private
* @param {?} value
* @return {?}
*/
getDecimals(value) {
/** @type {?} */
const valueString = value.toString();
/** @type {?} */
const integerLength = valueString.indexOf('.') + 1;
return integerLength >= 0 ? valueString.length - integerLength : 0;
}
/**
* @private
* @param {?} value
* @return {?}
*/
mouseStartMoving(value) {
this.handleController(true);
this.setValue(value);
}
/**
* @private
* @param {?} value
* @return {?}
*/
mouseMoving(value) {
this.setValue(value);
this.cdr.markForCheck();
}
/**
* @private
* @return {?}
*/
mouseStopMoving() {
this.handleController(false);
this.cdr.markForCheck();
}
/**
* @private
* @param {?=} mouseActions
* @return {?}
*/
subscribeMouseActions(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 {?}
*/
unsubscribeMouseActions(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 {?}
*/
handleController(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 {?}
*/
toggleDisabled(disabled) {
if (disabled) {
this.unsubscribeMouseActions();
}
else {
this.subscribeMouseActions(['start']);
}
}
/**
* @private
* @param {?} value
* @return {?}
*/
setValue(value) {
if (this.value !== value) {
this.value = value;
this.updateTrackAndHandle();
}
this.onChangeCallback(this.value);
}
/**
* @private
* @param {?} value
* @return {?}
*/
ensureValueInRange(value) {
/** @type {?} */
let safeValue;
if (!this.valueMustBeValid(value)) {
safeValue = this.min;
}
else {
safeValue = this.clamp(this.min, (/** @type {?} */ (value)), this.max);
}
return safeValue;
}
/**
* @private
* @return {?}
*/
updateTrackAndHandle() {
/** @type {?} */
const value = this.value;
/** @type {?} */
const offset = this.valueToOffset(value);
this.updateStyle(offset / 100);
this.cdr.markForCheck();
}
/**
* @private
* @param {?} value
* @return {?}
*/
valueMustBeValid(value) {
return !isNaN(typeof value !== 'number' ? parseFloat(value) : value);
}
/**
* @private
* @param {?} value
* @return {?}
*/
valueToOffset(value) {
return ((value - this.min) / (this.max - this.min)) * 100;
}
/**
* @private
* @return {?}
*/
registerHandleHoverPopoverListener() {
/** @type {?} */
const mouseOverListener = fromEvent(this.sliderHandle.nativeElement, 'mouseover');
/** @type {?} */
const mouseLeaveListener = fromEvent(this.sliderHandle.nativeElement, 'mouseout');
this.mouseOverHandler = mouseOverListener.subscribe(this.sliderHandlePopoverOnMouseHover.bind(this));
this.mouseLeaveHandler = mouseLeaveListener.subscribe(this.sliderHandlePopoverOnMouseLeave.bind(this));
}
/**
* @private
* @return {?}
*/
sliderHandlePopoverOnMouseHover() {
this.isHovering = true;
this.showValuePopover = this.showValuePopoverController();
this.cdr.markForCheck();
}
/**
* @private
* @return {?}
*/
sliderHandlePopoverOnMouseLeave() {
this.isHovering = false;
this.showValuePopover = this.showValuePopoverController();
this.cdr.markForCheck();
}
/**
* @private
* @return {?}
*/
unregisterHandleHoverTooltip() {
this.mouseOverHandler.unsubscribe();
this.mouseLeaveHandler.unsubscribe();
}
/**
* @private
* @return {?}
*/
showValuePopoverController() {
return this.isDragging || this.isHovering;
}
/**
* @return {?}
*/
ngOnDestroy() {
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 = () => [
{ 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 }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL3NsaWRlci8iLCJzb3VyY2VzIjpbInNsaWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixLQUFLLEVBS0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O01BRTVFLDZCQUE2QixHQUFRO0lBQ3pDLE9BQU8sRUFBRSxpQkFBaUI7O0lBRTFCLFdBQVcsRUFBRSxVQUFVOzs7SUFBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLEVBQUM7SUFDOUMsS0FBSyxFQUFFLElBQUk7Q0FDWjtBQVVELE1BQU0sT0FBTyxlQUFlOzs7O0lBQzFCLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBUWxDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVwQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFRdkIsUUFBRyxHQUFHLEdBQUcsQ0FBQztRQUNWLFFBQUcsR0FBRyxDQUFDLENBQUM7UUFDUixTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixpQkFBWTs7OztRQUE4QixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsRUFBQztRQXlDakUsc0JBQWlCOzs7O1FBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRTtR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Qjs7SUFDMUIsdUNBQXlFOzs7OztJQXlDekUsNENBQ0M7Ozs7O0lBRUQsMkNBQ0M7Ozs7O0lBcEVXLDhCQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBmb3J3YXJkUmVmLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgcGx1Y2ssIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuY29uc3QgU0xJREVSX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTbGlkZXJDb21wb25lbnQpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Qtc2xpZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2xpZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zbGlkZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtTTElERVJfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgU2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gIH1cclxuICBwcml2YXRlIGRyYWdTdGFydExpc3RlbmVyOiBPYnNlcnZhYmxlPG51bWJlcj47XHJcbiAgcHJpdmF0ZSBkcmFnTW92ZUxpc3RlbmVyOiBPYnNlcnZhYmxlPG51bWJlcj47XHJcbiAgcHJpdmF0ZSBkcmFnRW5kTGlzdGVuZXI6IE9ic2VydmFibGU8RXZlbnQ+O1xyXG4gIHByaXZhdGUgZHJhZ1N0YXJ0SGFuZGxlcjogU3Vic2NyaXB0aW9uIHwgbnVsbDtcclxuICBwcml2YXRlIGRyYWdNb3ZlSGFuZGxlcjogU3Vic2NyaXB0aW9uIHwgbnVsbDtcclxuICBwcml2YXRlIGRyYWdFbmRIYW5kbGVyOiBTdWJzY3JpcHRpb24gfCBudWxsO1xyXG4gIHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaXNIb3ZlcmluZyA9IGZhbHNlO1xyXG4gIHB1YmxpYyB2YWx1ZTtcclxuICBwdWJsaWMgc2hvd1ZhbHVlUG9wb3ZlciA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbW91c2VPdmVySGFuZGxlcjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgbW91c2VMZWF2ZUhhbmRsZXI6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnc2xpZGVyJywgeyBzdGF0aWM6IHRydWUgfSkgc2xpZGVyOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3NsaWRlckhhbmRsZScsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlckhhbmRsZTogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdzbGlkZXJUcmFjaycsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlclRyYWNrOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3NsaWRlclJhaWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbGlkZXJSYWlsOiBFbGVtZW50UmVmO1xyXG4gIEBJbnB1dCgpIG1heCA9IDEwMDtcclxuICBASW5wdXQoKSBtaW4gPSAwO1xyXG4gIEBJbnB1dCgpIHN0ZXAgPSAxO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdGlwc1JlbmRlcmVyOiAodmFsdWU6IG51bWJlcikgPT4gc3RyaW5nID0gKHZhbHVlKSA9PiBgJHt2YWx1ZX1gO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY2hlY2tSYW5nZVZhbHVlcyh0aGlzLm1pbiwgdGhpcy5tYXgpO1xyXG4gICAgdGhpcy5jaGVja1N0ZXBWYWx1ZSgpO1xyXG4gICAgdGhpcy50b2dnbGVEaXNhYmxlZCh0aGlzLmRpc2FibGVkKTtcclxuICAgIGlmICh0aGlzLnZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbnN1cmVWYWx1ZUluUmFuZ2UobnVsbCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ21pbicpIHx8IGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ21heCcpIHx8IGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3N0ZXAnKSkge1xyXG4gICAgICB0aGlzLmNoZWNrUmFuZ2VWYWx1ZXModGhpcy5taW4sIHRoaXMubWF4KTtcclxuICAgICAgdGhpcy5jaGVja1N0ZXBWYWx1ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5yZWdpc3Rlck1vdXNlRXZlbnRzTGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLnJlZ2lzdGVySGFuZGxlSG92ZXJQb3BvdmVyTGlzdGVuZXIoKTtcclxuICAgIHRoaXMudG9nZ2xlRGlzYWJsZWQodGhpcy5kaXNhYmxlZCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICAgIHRoaXMudG9nZ2xlRGlzYWJsZWQoaXNEaXNhYmxlZCk7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKG5ld1ZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbnN1cmVWYWx1ZUluUmFuZ2UobmV3VmFsdWUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Ub3VjaGVkQ2FsbGJhY2sgPSAodjogYW55KSA9PiB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uQ2hhbmdlQ2FsbGJhY2sgPSAodjogYW55KSA9PiB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrUmFuZ2VWYWx1ZXMobWluVmFsdWUsIG1heFZhbHVlKSB7XHJcbiAgICBpZiAobWF4VmFsdWUgPD0gbWluVmFsdWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtYXggdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluIHZhbHVlYCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrU3RlcFZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMuc3RlcCA8IDAgfHwgISEhdGhpcy5zdGVwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignc3RlcCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLicpO1xyXG4gICAgfSBlbHNlIGlmICgodGhpcy5tYXggLSB0aGlzLm1pbikgJSB0aGlzLnN0ZXApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCcobWF4IC0gbWluKSBtdXN0IGJlIGRpdmlzaWJsZSBieSBzdGVwLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByYXRpb1RvVmFsdWUoXHJcbiAgICByYXRpbzogbnVtYmVyLFxyXG4gICAgbWluOiBudW1iZXIsXHJcbiAgICBtYXg6IG51bWJlcixcclxuICAgIHN0ZXA6IG51bWJlclxyXG4gICk6IG51bWJlciB7XHJcbiAgICBsZXQgdmFsdWUgPSAobWF4IC0gbWluKSAqIHJhdGlvICsgbWluO1xyXG4gICAgaWYgKHN0ZXAgPiAwKSB7XHJcbiAgICAgIHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAvIHN0ZXApICogc3RlcDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNsYW1wKG1pbiwgdmFsdWUsIG1heCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnZlcnRIYW5kbGVQb3NpdGlvblRvUmF0aW8oaGFuZGxlWDogbnVtYmVyLCBzdGFydFg6IG51bWJlciwgdG90YWxMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jbGFtcCgwLCAoaGFuZGxlWCAtIHN0YXJ0WCkgLyB0b3RhbExlbmd0aCwgMSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsYW1wKG1pbjogbnVtYmVyLCBuOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihuLCBtYXgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU3R5bGUocGVyY2VudGFnZSkge1xyXG4gICAgcGVyY2VudGFnZSA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIHBlcmNlbnRhZ2UpKTtcclxuICAgIHRoaXMuc2xpZGVyVHJhY2submF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3BlcmNlbnRhZ2UgKiAxMDB9JWA7XHJcbiAgICB0aGlzLnNsaWRlckhhbmRsZS5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtwZXJjZW50YWdlICogMTAwfSVgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWdpc3Rlck1vdXNlRXZlbnRzTGlzdGVuZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kcmFnU3RhcnRMaXN0ZW5lciA9IGZyb21FdmVudCh0aGlzLnNsaWRlci5uYXRpdmVFbGVtZW50LCAnbW91c2Vkb3duJykucGlwZShcclxuICAgICAgdGFwKChlOiBFdmVudCkgPT4ge1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9KSxcclxuICAgICAgcGx1Y2s8RXZlbnQsIG51bWJlcj4oJ3BhZ2VYJyksXHJcbiAgICAgIG1hcCgocG9zaXRpb246IG51bWJlcikgPT4gdGhpcy5tb3VzZVBvc2l0aW9uVG9BZGFwdGl2ZVZhbHVlKHBvc2l0aW9uKSlcclxuICAgICk7XHJcbiAgICB0aGlzLmRyYWdFbmRMaXN0ZW5lciA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNldXAnKTtcclxuICAgIHRoaXMuZHJhZ01vdmVMaXN0ZW5lciA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNlbW92ZScpLnBpcGUoXHJcbiAgICAgIHRhcCgoZTogRXZlbnQpID0+IHtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSksXHJcbiAgICAgIHBsdWNrPEV2ZW50LCBudW1iZXI+KCdwYWdlWCcpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICBtYXAoKHBvc2l0aW9uOiBudW1iZXIpID0+IHRoaXMubW91c2VQb3NpdGlvblRvQWRhcHRpdmVWYWx1ZShwb3NpdGlvbikpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kcmFnRW5kTGlzdGVuZXIpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTbGlkZXJQYWdlUG9zaXRpb24oKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnNsaWRlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3Qgd2luZG93ID0gdGhpcy5zbGlkZXIubmF0aXZlRWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xyXG4gICAgcmV0dXJuIHJlY3QubGVmdCArIHdpbmRvdy5wYWdlWE9mZnNldDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UmFpbExlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2xpZGVyUmFpbC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtb3VzZVBvc2l0aW9uVG9BZGFwdGl2ZVZhbHVlKGhhbmRsZVg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBzbGlkZXJTdGFydFggPSB0aGlzLmdldFNsaWRlclBhZ2VQb3NpdGlvbigpO1xyXG4gICAgY29uc3Qgc2xpZGVyTGVuZ3RoID0gdGhpcy5nZXRSYWlsTGVuZ3RoKCk7XHJcbiAgICBjb25zdCByYXRpbyA9IHRoaXMuY29udmVydEhhbmRsZVBvc2l0aW9uVG9SYXRpbyhoYW5kbGVYLCBzbGlkZXJTdGFydFgsIHNsaWRlckxlbmd0aCk7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmF0aW9Ub1ZhbHVlKHJhdGlvLCB0aGlzLm1pbiwgdGhpcy5tYXgsIHRoaXMuc3RlcCk7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZS50b0ZpeGVkKHRoaXMuZ2V0RGVjaW1hbHModGhpcy5zdGVwKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREZWNpbWFscyh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIGNvbnN0IGludGVnZXJMZW5ndGggPSB2YWx1ZVN0cmluZy5pbmRleE9mKCcuJykgKyAxO1xyXG4gICAgcmV0dXJuIGludGVnZXJMZW5ndGggPj0gMCA/IHZhbHVlU3RyaW5nLmxlbmd0aCAtIGludGVnZXJMZW5ndGggOiAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtb3VzZVN0YXJ0TW92aW5nKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlQ29udHJvbGxlcih0cnVlKTtcclxuICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtb3VzZU1vdmluZyh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtb3VzZVN0b3BNb3ZpbmcoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhhbmRsZUNvbnRyb2xsZXIoZmFsc2UpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZU1vdXNlQWN0aW9ucyhtb3VzZUFjdGlvbnM6IHN0cmluZ1tdID0gWydzdGFydCcsICdtb3ZlJywgJ2VuZCddKTogdm9pZCB7XHJcbiAgICBpZiAobW91c2VBY3Rpb25zLmluZGV4T2YoJ3N0YXJ0JykgIT09IC0xICYmIHRoaXMuZHJhZ1N0YXJ0TGlzdGVuZXIgJiYgIXRoaXMuZHJhZ1N0YXJ0SGFuZGxlcikge1xyXG4gICAgICB0aGlzLmRyYWdTdGFydEhhbmRsZXIgPSB0aGlzLmRyYWdTdGFydExpc3RlbmVyLnN1YnNjcmliZSh0aGlzLm1vdXNlU3RhcnRNb3ZpbmcuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1vdXNlQWN0aW9ucy5pbmRleE9mKCdtb3ZlJykgIT09IC0xICYmIHRoaXMuZHJhZ01vdmVMaXN0ZW5lciAmJiAhdGhpcy5kcmFnTW92ZUhhbmRsZXIpIHtcclxuICAgICAgdGhpcy5kcmFnTW92ZUhhbmRsZXIgPSB0aGlzLmRyYWdNb3ZlTGlzdGVuZXIuc3Vic2NyaWJlKHRoaXMubW91c2VNb3ZpbmcuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1vdXNlQWN0aW9ucy5pbmRleE9mKCdlbmQnKSAhPT0gLTEgJiYgdGhpcy5kcmFnRW5kTGlzdGVuZXIgJiYgIXRoaXMuZHJhZ0VuZEhhbmRsZXIpIHtcclxuICAgICAgdGhpcy5kcmFnRW5kSGFuZGxlciA9IHRoaXMuZHJhZ0VuZExpc3RlbmVyLnN1YnNjcmliZSh0aGlzLm1vdXNlU3RvcE1vdmluZy5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVNb3VzZUFjdGlvbnMoZHJhZ1N0YWdlczogc3RyaW5nW10gPSBbJ3N0YXJ0JywgJ21vdmUnLCAnZW5kJ10pOiB2b2lkIHtcclxuICAgIGlmIChkcmFnU3RhZ2VzLmluZGV4T2YoJ3N0YXJ0JykgIT09IC0xICYmIHRoaXMuZHJhZ1N0YXJ0SGFuZGxlcikge1xyXG4gICAgICB0aGlzLmRyYWdTdGFydEhhbmRsZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5kcmFnU3RhcnRIYW5kbGVyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZHJhZ1N0YWdlcy5pbmRleE9mKCdtb3ZlJykgIT09IC0xICYmIHRoaXMuZHJhZ01vdmVIYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZHJhZ01vdmVIYW5kbGVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuZHJhZ01vdmVIYW5kbGVyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZHJhZ1N0YWdlcy5pbmRleE9mKCdlbmQnKSAhPT0gLTEgJiYgdGhpcy5kcmFnRW5kSGFuZGxlcikge1xyXG4gICAgICB0aGlzLmRyYWdFbmRIYW5kbGVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuZHJhZ0VuZEhhbmRsZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVDb250cm9sbGVyKG1vdmFibGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChtb3ZhYmxlKSB7XHJcbiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2hvd1ZhbHVlUG9wb3ZlciA9IHRoaXMuc2hvd1ZhbHVlUG9wb3ZlckNvbnRyb2xsZXIoKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVNb3VzZUFjdGlvbnMoWydtb3ZlJywgJ2VuZCddKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3dWYWx1ZVBvcG92ZXIgPSB0aGlzLnNob3dWYWx1ZVBvcG92ZXJDb250cm9sbGVyKCk7XHJcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVNb3VzZUFjdGlvbnMoWydtb3ZlJywgJ2VuZCddKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9nZ2xlRGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLnVuc3Vic2NyaWJlTW91c2VBY3Rpb25zKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN1YnNjcmliZU1vdXNlQWN0aW9ucyhbJ3N0YXJ0J10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVUcmFja0FuZEhhbmRsZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHRoaXMudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbnN1cmVWYWx1ZUluUmFuZ2UodmFsdWU6IG51bWJlciB8IG51bGwpOiBudW1iZXIge1xyXG4gICAgbGV0IHNhZmVWYWx1ZTtcclxuICAgIGlmICghdGhpcy52YWx1ZU11c3RCZVZhbGlkKHZhbHVlKSkge1xyXG4gICAgICBzYWZlVmFsdWUgPSB0aGlzLm1pbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNhZmVWYWx1ZSA9IHRoaXMuY2xhbXAodGhpcy5taW4sIHZhbHVlIGFzIG51bWJlciwgdGhpcy5tYXgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNhZmVWYWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVHJhY2tBbmRIYW5kbGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWU7XHJcbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLnZhbHVlVG9PZmZzZXQodmFsdWUpO1xyXG4gICAgdGhpcy51cGRhdGVTdHlsZShvZmZzZXQgLyAxMDApO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbHVlTXVzdEJlVmFsaWQodmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICFpc05hTih0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbHVlVG9PZmZzZXQodmFsdWU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKCh2YWx1ZSAtIHRoaXMubWluKSAvICh0aGlzLm1heCAtIHRoaXMubWluKSkgKiAxMDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZ2lzdGVySGFuZGxlSG92ZXJQb3BvdmVyTGlzdGVuZXIoKSB7XHJcbiAgICBjb25zdCBtb3VzZU92ZXJMaXN0ZW5lciA9IGZyb21FdmVudCh0aGlzLnNsaWRlckhhbmRsZS5uYXRpdmVFbGVtZW50LCAnbW91c2VvdmVyJyk7XHJcbiAgICBjb25zdCBtb3VzZUxlYXZlTGlzdGVuZXIgPSBmcm9tRXZlbnQodGhpcy5zbGlkZXJIYW5kbGUubmF0aXZlRWxlbWVudCwgJ21vdXNlb3V0Jyk7XHJcbiAgICB0aGlzLm1vdXNlT3ZlckhhbmRsZXIgPSBtb3VzZU92ZXJMaXN0ZW5lci5zdWJzY3JpYmUodGhpcy5zbGlkZXJIYW5kbGVQb3BvdmVyT25Nb3VzZUhvdmVyLmJpbmQodGhpcykpO1xyXG4gICAgdGhpcy5tb3VzZUxlYXZlSGFuZGxlciA9IG1vdXNlTGVhdmVMaXN0ZW5lci5zdWJzY3JpYmUodGhpcy5zbGlkZXJIYW5kbGVQb3BvdmVyT25Nb3VzZUxlYXZlLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzbGlkZXJIYW5kbGVQb3BvdmVyT25Nb3VzZUhvdmVyKCkge1xyXG4gICAgdGhpcy5pc0hvdmVyaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuc2hvd1ZhbHVlUG9wb3ZlciA9IHRoaXMuc2hvd1ZhbHVlUG9wb3ZlckNvbnRyb2xsZXIoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzbGlkZXJIYW5kbGVQb3BvdmVyT25Nb3VzZUxlYXZlKCkge1xyXG4gICAgdGhpcy5pc0hvdmVyaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dWYWx1ZVBvcG92ZXIgPSB0aGlzLnNob3dWYWx1ZVBvcG92ZXJDb250cm9sbGVyKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5yZWdpc3RlckhhbmRsZUhvdmVyVG9vbHRpcCgpIHtcclxuICAgIHRoaXMubW91c2VPdmVySGFuZGxlci51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5tb3VzZUxlYXZlSGFuZGxlci51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzaG93VmFsdWVQb3BvdmVyQ29udHJvbGxlcigpIHtcclxuICAgIHJldHVybiB0aGlzLmlzRHJhZ2dpbmcgfHwgdGhpcy5pc0hvdmVyaW5nO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlTW91c2VBY3Rpb25zKCk7XHJcbiAgICB0aGlzLnVucmVnaXN0ZXJIYW5kbGVIb3ZlclRvb2x0aXAoKTtcclxuICB9XHJcbn1cclxuIl19