UNPKG

ng-devui

Version:

DevUI components based on Angular

274 lines 45.6 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { fromEvent } from 'rxjs'; import { distinctUntilChanged, map, pluck, takeUntil, tap } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "ng-devui/popover"; const SLIDER_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SliderComponent), multi: true }; export class SliderComponent { 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.afterChange = new EventEmitter(); this.tipsRenderer = (value) => `${value}`; this.onTouchedCallback = () => { }; this.onChangeCallback = (v) => { }; } ngOnInit() { this.checkRangeValues(this.min, this.max); this.checkStepValue(); this.toggleDisabled(this.disabled); if (this.value === null) { this.setValue(this.ensureValueInRange(null)); } } ngOnChanges(changes) { if (Object.prototype.hasOwnProperty.call(changes, 'min') || Object.prototype.hasOwnProperty.call(changes, 'max') || Object.prototype.hasOwnProperty.call(changes, 'step')) { this.checkRangeValues(this.min, this.max); this.checkStepValue(); } } ngAfterViewInit() { this.registerMouseEventsListeners(); this.registerHandleHoverPopoverListener(); this.toggleDisabled(this.disabled); } registerOnChange(fn) { this.onChangeCallback = fn; } registerOnTouched(fn) { this.onTouchedCallback = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; this.toggleDisabled(isDisabled); } writeValue(newValue) { this.setValue(this.ensureValueInRange(newValue), false); } checkRangeValues(minValue, maxValue) { if (maxValue <= minValue) { throw new Error(`max value must be greater than min value`); } } 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.'); } } ratioToValue(ratio, min, max, step) { let value = (max - min) * ratio + min; if (step > 0) { value = Math.round(value / step) * step; } return this.clamp(min, value, max); } convertHandlePositionToRatio(handleX, startX, totalLength) { return this.clamp(0, (handleX - startX) / totalLength, 1); } clamp(min, n, max) { return Math.max(min, Math.min(n, max)); } updateStyle(percentage) { percentage = Math.min(1, Math.max(0, percentage)); this.sliderTrack.nativeElement.style.width = `${percentage * 100}%`; this.sliderHandle.nativeElement.style.left = `calc(${percentage * 100}% - 7px)`; } registerMouseEventsListeners() { this.dragStartListener = fromEvent(this.slider.nativeElement, 'mousedown').pipe(tap((e) => { e.stopPropagation(); e.preventDefault(); }), pluck('pageX'), map((position) => this.mousePositionToAdaptiveValue(position))); this.dragEndListener = fromEvent(document, 'mouseup'); this.dragMoveListener = fromEvent(document, 'mousemove').pipe(tap((e) => { e.stopPropagation(); e.preventDefault(); }), pluck('pageX'), distinctUntilChanged(), map((position) => this.mousePositionToAdaptiveValue(position)), distinctUntilChanged(), takeUntil(this.dragEndListener)); } getSliderPagePosition() { const rect = this.slider.nativeElement.getBoundingClientRect(); const window = this.slider.nativeElement.ownerDocument.defaultView; return rect.left + window.pageXOffset; } getRailLength() { return this.sliderRail.nativeElement.clientWidth; } mousePositionToAdaptiveValue(handleX) { const sliderStartX = this.getSliderPagePosition(); const sliderLength = this.getRailLength(); const ratio = this.convertHandlePositionToRatio(handleX, sliderStartX, sliderLength); const value = this.ratioToValue(ratio, this.min, this.max, this.step); return parseFloat(value.toFixed(this.getDecimals(this.step))); } getDecimals(value) { const valueString = value.toString(); const integerLength = valueString.indexOf('.') + 1; return integerLength >= 0 ? valueString.length - integerLength : 0; } mouseStartMoving(value) { this.handleController(true); this.setValue(value); } mouseMoving(value) { this.setValue(value); this.cdr.markForCheck(); } mouseStopMoving() { this.afterChange.emit(this.value); this.handleController(false); this.onTouchedCallback(); this.cdr.markForCheck(); } 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)); } } 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; } } 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']); } } toggleDisabled(disabled) { if (disabled) { this.unsubscribeMouseActions(); } else { this.subscribeMouseActions(['start']); } } setValue(value, triggerOnChanges = true) { if (this.value !== value) { this.value = value; this.updateTrackAndHandle(); } if (triggerOnChanges) { this.onChangeCallback(this.value); } } ensureValueInRange(value) { let safeValue; if (!this.valueMustBeValid(value)) { safeValue = this.min; } else { safeValue = this.clamp(this.min, value, this.max); } return safeValue; } updateTrackAndHandle() { const value = this.value; const offset = this.valueToOffset(value); this.updateStyle(offset / 100); this.cdr.markForCheck(); } valueMustBeValid(value) { return !isNaN(typeof value !== 'number' ? parseFloat(value) : value); } valueToOffset(value) { return ((value - this.min) / (this.max - this.min)) * 100; } registerHandleHoverPopoverListener() { const mouseOverListener = fromEvent(this.sliderHandle.nativeElement, 'mouseover'); const mouseLeaveListener = fromEvent(this.sliderHandle.nativeElement, 'mouseout'); this.mouseOverHandler = mouseOverListener.subscribe(this.sliderHandlePopoverOnMouseHover.bind(this)); this.mouseLeaveHandler = mouseLeaveListener.subscribe(this.sliderHandlePopoverOnMouseLeave.bind(this)); } sliderHandlePopoverOnMouseHover() { this.isHovering = true; this.showValuePopover = this.showValuePopoverController(); this.cdr.markForCheck(); } sliderHandlePopoverOnMouseLeave() { this.isHovering = false; this.showValuePopover = this.showValuePopoverController(); this.cdr.markForCheck(); } unregisterHandleHoverTooltip() { this.mouseOverHandler.unsubscribe(); this.mouseLeaveHandler.unsubscribe(); } showValuePopoverController() { return this.isDragging || this.isHovering; } ngOnDestroy() { this.unsubscribeMouseActions(); this.unregisterHandleHoverTooltip(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SliderComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SliderComponent, selector: "d-slider", inputs: { max: "max", min: "min", step: "step", disabled: "disabled", tipsRenderer: "tipsRenderer" }, outputs: { afterChange: "afterChange" }, providers: [SLIDER_CONTROL_VALUE_ACCESSOR], viewQueries: [{ propertyName: "slider", first: true, predicate: ["slider"], descendants: true, static: true }, { propertyName: "sliderHandle", first: true, predicate: ["sliderHandle"], descendants: true, static: true }, { propertyName: "sliderTrack", first: true, predicate: ["sliderTrack"], descendants: true, static: true }, { propertyName: "sliderRail", first: true, predicate: ["sliderRail"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"devui-slider\" #slider [ngClass]=\"{ disabled: disabled }\">\n <div class=\"devui-slider-rail\" #sliderRail [ngClass]=\"{ disabled: disabled }\"></div>\n <div class=\"devui-slider-track\" #sliderTrack [ngClass]=\"{ disabled: disabled }\"></div>\n <div\n class=\"devui-slider-handle\"\n #sliderHandle\n [ngClass]=\"{ disabled: disabled }\"\n dPopover\n position=\"top\"\n [content]=\"showValuePopover && tipsRenderer ? tipsRenderer(value) : ''\"\n [showAnimation]=\"false\"\n [visible]=\"tipsRenderer && showValuePopover\"\n ></div>\n</div>\n", styles: [":host{display:block}.devui-slider{position:relative;width:100%;padding:4px 0;margin:4px 0;cursor:pointer;box-sizing:border-box;height:14px;display:flex;align-items:center}.devui-slider .devui-slider-rail{position:absolute;background-color:var(--devui-area, #f3f3f3);height:5px;width:100%;transition:background-color var(--devui-animation-duration-base, .2s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1));border-radius:var(--devui-border-radius-full, 100px)}.devui-slider .devui-slider-rail.disabled{background-color:var(--devui-area, #f3f3f3)}.devui-slider:hover .devui-slider-rail:not(.disabled){background-color:var(--devui-area, #f3f3f3)}.devui-slider:hover .devui-slider-track:not(.disabled){background-color:var(--devui-brand-hover, #3979f9)}.devui-slider:hover .devui-slider-handle:not(.disabled){border-color:var(--devui-brand-hover, #3979f9)}.devui-slider .devui-slider-track{position:absolute;background-color:var(--devui-brand, #0a59f7);height:5px;width:0;border-radius:var(--devui-border-radius-full, 100px)}.devui-slider .devui-slider-handle{position:absolute;background-color:var(--devui-base-bg, #ffffff);width:14px;height:14px;border-radius:50%;left:0;transition:transform .2s ease-in-out;border:2px solid var(--devui-brand, #0a59f7)}.devui-slider .devui-slider-handle:not(.disabled):hover,.devui-slider .devui-slider-handle:not(.disabled):active{transform:scale(1.3)}.devui-slider.disabled{cursor:not-allowed}.devui-slider.disabled .devui-slider-rail{background-color:var(--devui-disabled-bg, #f3f3f3)}.devui-slider.disabled .devui-slider-track{background-color:var(--devui-disabled-line, #e6e6e6)}.devui-slider.disabled .devui-slider-handle{border-color:var(--devui-disabled-line, #e6e6e6)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.PopoverDirective, selector: "[dPopover]", inputs: ["content", "controlled", "position", "showAnimation", "showAnimate", "scrollElement", "autoHideCoefficient", "appendToBody", "zIndex", "popType", "popMaxWidth", "trigger", "hoverToContent", "hoverDelayTime", "popoverStyle", "mouseEnterDelay", "mouseLeaveDelay", "visible"], exportAs: ["dPopover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SliderComponent, decorators: [{ type: Component, args: [{ selector: 'd-slider', providers: [SLIDER_CONTROL_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: "<div class=\"devui-slider\" #slider [ngClass]=\"{ disabled: disabled }\">\n <div class=\"devui-slider-rail\" #sliderRail [ngClass]=\"{ disabled: disabled }\"></div>\n <div class=\"devui-slider-track\" #sliderTrack [ngClass]=\"{ disabled: disabled }\"></div>\n <div\n class=\"devui-slider-handle\"\n #sliderHandle\n [ngClass]=\"{ disabled: disabled }\"\n dPopover\n position=\"top\"\n [content]=\"showValuePopover && tipsRenderer ? tipsRenderer(value) : ''\"\n [showAnimation]=\"false\"\n [visible]=\"tipsRenderer && showValuePopover\"\n ></div>\n</div>\n", styles: [":host{display:block}.devui-slider{position:relative;width:100%;padding:4px 0;margin:4px 0;cursor:pointer;box-sizing:border-box;height:14px;display:flex;align-items:center}.devui-slider .devui-slider-rail{position:absolute;background-color:var(--devui-area, #f3f3f3);height:5px;width:100%;transition:background-color var(--devui-animation-duration-base, .2s) var(--devui-animation-ease-in-out-smooth, cubic-bezier(.645, .045, .355, 1));border-radius:var(--devui-border-radius-full, 100px)}.devui-slider .devui-slider-rail.disabled{background-color:var(--devui-area, #f3f3f3)}.devui-slider:hover .devui-slider-rail:not(.disabled){background-color:var(--devui-area, #f3f3f3)}.devui-slider:hover .devui-slider-track:not(.disabled){background-color:var(--devui-brand-hover, #3979f9)}.devui-slider:hover .devui-slider-handle:not(.disabled){border-color:var(--devui-brand-hover, #3979f9)}.devui-slider .devui-slider-track{position:absolute;background-color:var(--devui-brand, #0a59f7);height:5px;width:0;border-radius:var(--devui-border-radius-full, 100px)}.devui-slider .devui-slider-handle{position:absolute;background-color:var(--devui-base-bg, #ffffff);width:14px;height:14px;border-radius:50%;left:0;transition:transform .2s ease-in-out;border:2px solid var(--devui-brand, #0a59f7)}.devui-slider .devui-slider-handle:not(.disabled):hover,.devui-slider .devui-slider-handle:not(.disabled):active{transform:scale(1.3)}.devui-slider.disabled{cursor:not-allowed}.devui-slider.disabled .devui-slider-rail{background-color:var(--devui-disabled-bg, #f3f3f3)}.devui-slider.disabled .devui-slider-track{background-color:var(--devui-disabled-line, #e6e6e6)}.devui-slider.disabled .devui-slider-handle{border-color:var(--devui-disabled-line, #e6e6e6)}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], 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 }], afterChange: [{ type: Output }], tipsRenderer: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL3NsaWRlci9zbGlkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvc2xpZGVyL3NsaWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUVsRixNQUFNLDZCQUE2QixHQUFRO0lBQ3pDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDOUMsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBV0YsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFRbEMsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRXBCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQVF2QixRQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ1YsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUNSLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMx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QUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDQyxXQUFXO3NCQUF0RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0MsVUFBVTtzQkFBcEQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNoQyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0UsWUFBWTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBwbHVjaywgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmNvbnN0IFNMSURFUl9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTbGlkZXJDb21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZC1zbGlkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc2xpZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2xpZGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1NMSURFUl9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxufSlcblxuZXhwb3J0IGNsYXNzIFNsaWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnU3RhcnRMaXN0ZW5lcjogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBwcml2YXRlIGRyYWdNb3ZlTGlzdGVuZXI6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgcHJpdmF0ZSBkcmFnRW5kTGlzdGVuZXI6IE9ic2VydmFibGU8RXZlbnQ+O1xuICBwcml2YXRlIGRyYWdTdGFydEhhbmRsZXI6IFN1YnNjcmlwdGlvbiB8IG51bGw7XG4gIHByaXZhdGUgZHJhZ01vdmVIYW5kbGVyOiBTdWJzY3JpcHRpb24gfCBudWxsO1xuICBwcml2YXRlIGRyYWdFbmRIYW5kbGVyOiBTdWJzY3JpcHRpb24gfCBudWxsO1xuICBwcml2YXRlIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0hvdmVyaW5nID0gZmFsc2U7XG4gIHB1YmxpYyB2YWx1ZTtcbiAgcHVibGljIHNob3dWYWx1ZVBvcG92ZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtb3VzZU92ZXJIYW5kbGVyOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgbW91c2VMZWF2ZUhhbmRsZXI6IFN1YnNjcmlwdGlvbjtcblxuICBAVmlld0NoaWxkKCdzbGlkZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbGlkZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3NsaWRlckhhbmRsZScsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlckhhbmRsZTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyVHJhY2snLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbGlkZXJUcmFjazogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyUmFpbCcsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlclJhaWw6IEVsZW1lbnRSZWY7XG4gIEBJbnB1dCgpIG1heCA9IDEwMDtcbiAgQElucHV0KCkgbWluID0gMDtcbiAgQElucHV0KCkgc3RlcCA9IDE7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBhZnRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBASW5wdXQoKSB0aXBzUmVuZGVyZXI6ICh2YWx1ZTogbnVtYmVyKSA9PiBzdHJpbmcgPSAodmFsdWUpID0+IGAke3ZhbHVlfWA7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jaGVja1JhbmdlVmFsdWVzKHRoaXMubWluLCB0aGlzLm1heCk7XG4gICAgdGhpcy5jaGVja1N0ZXBWYWx1ZSgpO1xuICAgIHRoaXMudG9nZ2xlRGlzYWJsZWQodGhpcy5kaXNhYmxlZCk7XG4gICAgaWYgKHRoaXMudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbnN1cmVWYWx1ZUluUmFuZ2UobnVsbCkpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNoYW5nZXMsICdtaW4nKVxuICAgICAgfHwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNoYW5nZXMsICdtYXgnKVxuICAgICAgfHwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNoYW5nZXMsICdzdGVwJykpIHtcbiAgICAgIHRoaXMuY2hlY2tSYW5nZVZhbHVlcyh0aGlzLm1pbiwgdGhpcy5tYXgpO1xuICAgICAgdGhpcy5jaGVja1N0ZXBWYWx1ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJlZ2lzdGVyTW91c2VFdmVudHNMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnJlZ2lzdGVySGFuZGxlSG92ZXJQb3BvdmVyTGlzdGVuZXIoKTtcbiAgICB0aGlzLnRvZ2dsZURpc2FibGVkKHRoaXMuZGlzYWJsZWQpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy50b2dnbGVEaXNhYmxlZChpc0Rpc2FibGVkKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUobmV3VmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbnN1cmVWYWx1ZUluUmFuZ2UobmV3VmFsdWUpLCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrID0gKCkgPT4ge1xuICB9O1xuXG4gIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjayA9ICh2OiBhbnkpID0+IHtcbiAgfTtcblxuICBwcml2YXRlIGNoZWNrUmFuZ2VWYWx1ZXMobWluVmFsdWUsIG1heFZhbHVlKSB7XG4gICAgaWYgKG1heFZhbHVlIDw9IG1pblZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG1heCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBtaW4gdmFsdWVgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrU3RlcFZhbHVlKCkge1xuICAgIGlmICh0aGlzLnN0ZXAgPCAwIHx8ICF0aGlzLnN0ZXApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc3RlcCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLicpO1xuICAgIH0gZWxzZSBpZiAoKHRoaXMubWF4IC0gdGhpcy5taW4pICUgdGhpcy5zdGVwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJyhtYXggLSBtaW4pIG11c3QgYmUgZGl2aXNpYmxlIGJ5IHN0ZXAuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByYXRpb1RvVmFsdWUoXG4gICAgcmF0aW86IG51bWJlcixcbiAgICBtaW46IG51bWJlcixcbiAgICBtYXg6IG51bWJlcixcbiAgICBzdGVwOiBudW1iZXJcbiAgKTogbnVtYmVyIHtcbiAgICBsZXQgdmFsdWUgPSAobWF4IC0gbWluKSAqIHJhdGlvICsgbWluO1xuICAgIGlmIChzdGVwID4gMCkge1xuICAgICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gc3RlcCkgKiBzdGVwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbGFtcChtaW4sIHZhbHVlLCBtYXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGFuZGxlUG9zaXRpb25Ub1JhdGlvKGhhbmRsZVg6IG51bWJlciwgc3RhcnRYOiBudW1iZXIsIHRvdGFsTGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNsYW1wKDAsIChoYW5kbGVYIC0gc3RhcnRYKSAvIHRvdGFsTGVuZ3RoLCAxKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xhbXAobWluOiBudW1iZXIsIG46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihuLCBtYXgpKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3R5bGUocGVyY2VudGFnZSkge1xuICAgIHBlcmNlbnRhZ2UgPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBwZXJjZW50YWdlKSk7XG4gICAgdGhpcy5zbGlkZXJUcmFjay5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cGVyY2VudGFnZSAqIDEwMH0lYDtcbiAgICB0aGlzLnNsaWRlckhhbmRsZS5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBgY2FsYygke3BlcmNlbnRhZ2UgKiAxMDB9JSAtIDdweClgO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck1vdXNlRXZlbnRzTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZ1N0YXJ0TGlzdGVuZXIgPSBmcm9tRXZlbnQodGhpcy5zbGlkZXIubmF0aXZlRWxlbWVudCwgJ21vdXNlZG93bicpLnBpcGUoXG4gICAgICB0YXAoKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0pLFxuICAgICAgcGx1Y2s8TW91c2VFdmVudCwgJ3BhZ2VYJz4oJ3BhZ2VYJyksXG4gICAgICBtYXAoKHBvc2l0aW9uOiBudW1iZXIpID0+IHRoaXMubW91c2VQb3NpdGlvblRvQWRhcHRpdmVWYWx1ZShwb3NpdGlvbikpXG4gICAgKTtcbiAgICB0aGlzLmRyYWdFbmRMaXN0ZW5lciA9IGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNldXAnKTtcbiAgICB0aGlzLmRyYWdNb3ZlTGlzdGVuZXIgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdtb3VzZW1vdmUnKS5waXBlKFxuICAgICAgdGFwKChlOiBFdmVudCkgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9KSxcbiAgICAgIHBsdWNrPE1vdXNlRXZlbnQsICdwYWdlWCc+KCdwYWdlWCcpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1hcCgocG9zaXRpb246IG51bWJlcikgPT4gdGhpcy5tb3VzZVBvc2l0aW9uVG9BZGFwdGl2ZVZhbHVlKHBvc2l0aW9uKSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZHJhZ0VuZExpc3RlbmVyKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFNsaWRlclBhZ2VQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnNsaWRlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuc2xpZGVyLm5hdGl2ZUVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICByZXR1cm4gcmVjdC5sZWZ0ICsgd2luZG93LnBhZ2VYT2Zmc2V0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSYWlsTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2xpZGVyUmFpbC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3VzZVBvc2l0aW9uVG9BZGFwdGl2ZVZhbHVlKGhhbmRsZVg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc2xpZGVyU3RhcnRYID0gdGhpcy5nZXRTbGlkZXJQYWdlUG9zaXRpb24oKTtcbiAgICBjb25zdCBzbGlkZXJMZW5ndGggPSB0aGlzLmdldFJhaWxMZW5ndGgoKTtcbiAgICBjb25zdCByYXRpbyA9IHRoaXMuY29udmVydEhhbmRsZVBvc2l0aW9uVG9SYXRpbyhoYW5kbGVYLCBzbGlkZXJTdGFydFgsIHNsaWRlckxlbmd0aCk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJhdGlvVG9WYWx1ZShyYXRpbywgdGhpcy5taW4sIHRoaXMubWF4LCB0aGlzLnN0ZXApO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlLnRvRml4ZWQodGhpcy5nZXREZWNpbWFscyh0aGlzLnN0ZXApKSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlY2ltYWxzKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICBjb25zdCBpbnRlZ2VyTGVuZ3RoID0gdmFsdWVTdHJpbmcuaW5kZXhPZignLicpICsgMTtcbiAgICByZXR1cm4gaW50ZWdlckxlbmd0aCA+PSAwID8gdmFsdWVTdHJpbmcubGVuZ3RoIC0gaW50ZWdlckxlbmd0aCA6IDA7XG4gIH1cblxuICBwcml2YXRlIG1vdXNlU3RhcnRNb3ZpbmcodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlQ29udHJvbGxlcih0cnVlKTtcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgbW91c2VNb3ZpbmcodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3VzZVN0b3BNb3ZpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5hZnRlckNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICAgIHRoaXMuaGFuZGxlQ29udHJvbGxlcihmYWxzZSk7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVNb3VzZUFjdGlvbnMobW91c2VBY3Rpb25zOiBzdHJpbmdbXSA9IFsnc3RhcnQnLCAnbW92ZScsICdlbmQnXSk6IHZvaWQge1xuICAgIGlmIChtb3VzZUFjdGlvbnMuaW5kZXhPZignc3RhcnQnKSAhPT0gLTEgJiYgdGhpcy5kcmFnU3RhcnRMaXN0ZW5lciAmJiAhdGhpcy5kcmFnU3RhcnRIYW5kbGVyKSB7XG4gICAgICB0aGlzLmRyYWdTdGFydEhhbmRsZXIgPSB0aGlzLmRyYWdTdGFydExpc3RlbmVyLnN1YnNjcmliZSh0aGlzLm1vdXNlU3RhcnRNb3ZpbmcuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgaWYgKG1vdXNlQWN0aW9ucy5pbmRleE9mKCdtb3ZlJykgIT09IC0xICYmIHRoaXMuZHJhZ01vdmVMaXN0ZW5lciAmJiAhdGhpcy5kcmFnTW92ZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMuZHJhZ01vdmVIYW5kbGVyID0gdGhpcy5kcmFnTW92ZUxpc3RlbmVyLnN1YnNjcmliZSh0aGlzLm1vdXNlTW92aW5nLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGlmIChtb3VzZUFjdGlvbnMuaW5kZXhPZignZW5kJykgIT09IC0xICYmIHRoaXMuZHJhZ0VuZExpc3RlbmVyICYmICF0aGlzLmRyYWdFbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLmRyYWdFbmRIYW5kbGVyID0gdGhpcy5kcmFnRW5kTGlzdGVuZXIuc3Vic2NyaWJlKHRoaXMubW91c2VTdG9wTW92aW5nLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVNb3VzZUFjdGlvbnMoZHJhZ1N0YWdlczogc3RyaW5nW10gPSBbJ3N0YXJ0JywgJ21vdmUnLCAnZW5kJ10pOiB2b2lkIHtcbiAgICBpZiAoZHJhZ1N0YWdlcy5pbmRleE9mKCdzdGFydCcpICE9PSAtMSAmJiB0aGlzLmRyYWdTdGFydEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0SGFuZGxlci51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5kcmFnU3RhcnRIYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZHJhZ1N0YWdlcy5pbmRleE9mKCdtb3ZlJykgIT09IC0xICYmIHRoaXMuZHJhZ01vdmVIYW5kbGVyKSB7XG4gICAgICB0aGlzLmRyYWdNb3ZlSGFuZGxlci51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5kcmFnTW92ZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChkcmFnU3RhZ2VzLmluZGV4T2YoJ2VuZCcpICE9PSAtMSAmJiB0aGlzLmRyYWdFbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLmRyYWdFbmRIYW5kbGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmRyYWdFbmRIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbnRyb2xsZXIobW92YWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChtb3ZhYmxlKSB7XG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93VmFsdWVQb3BvdmVyID0gdGhpcy5zaG93VmFsdWVQb3BvdmVyQ29udHJvbGxlcigpO1xuICAgICAgdGhpcy5zdWJzY3JpYmVNb3VzZUFjdGlvbnMoWydtb3ZlJywgJ2VuZCddKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dWYWx1ZVBvcG92ZXIgPSB0aGlzLnNob3dWYWx1ZVBvcG92ZXJDb250cm9sbGVyKCk7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlTW91c2VBY3Rpb25zKFsnbW92ZScsICdlbmQnXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVEaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgdGhpcy51bnN1YnNjcmliZU1vdXNlQWN0aW9ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YnNjcmliZU1vdXNlQWN0aW9ucyhbJ3N0YXJ0J10pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsdWUodmFsdWU6IG51bWJlciB8IG51bGwsIHRyaWdnZXJPbkNoYW5nZXMgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLnVwZGF0ZVRyYWNrQW5kSGFuZGxlKCk7XG4gICAgfVxuICAgIGlmICh0cmlnZ2VyT25DaGFuZ2VzKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodGhpcy52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVWYWx1ZUluUmFuZ2UodmFsdWU6IG51bWJlciB8IG51bGwpOiBudW1iZXIge1xuICAgIGxldCBzYWZlVmFsdWU7XG4gICAgaWYgKCF0aGlzLnZhbHVlTXVzdEJlVmFsaWQodmFsdWUpKSB7XG4gICAgICBzYWZlVmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9IGVsc2Uge1xuICAgICAgc2FmZVZhbHVlID0gdGhpcy5jbGFtcCh0aGlzLm1pbiwgdmFsdWUgYXMgbnVtYmVyLCB0aGlzLm1heCk7XG4gICAgfVxuICAgIHJldHVybiBzYWZlVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRyYWNrQW5kSGFuZGxlKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLnZhbHVlVG9PZmZzZXQodmFsdWUpO1xuICAgIHRoaXMudXBkYXRlU3R5bGUob2Zmc2V0IC8gMTAwKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsdWVNdXN0QmVWYWxpZCh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFpc05hTih0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHZhbHVlVG9PZmZzZXQodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuICgodmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpICogMTAwO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckhhbmRsZUhvdmVyUG9wb3Zlckxpc3RlbmVyKCkge1xuICAgIGNvbnN0IG1vdXNlT3Zlckxpc3RlbmVyID0gZnJvbUV2ZW50KHRoaXMuc2xpZGVySGFuZGxlLm5hdGl2ZUVsZW1lbnQsICdtb3VzZW92ZXInKTtcbiAgICBjb25zdCBtb3VzZUxlYXZlTGlzdGVuZXIgPSBmcm9tRXZlbnQodGhpcy5zbGlkZXJIYW5kbGUubmF0aXZlRWxlbWVudCwgJ21vdXNlb3V0Jyk7XG4gICAgdGhpcy5tb3VzZU92ZXJIYW5kbGVyID0gbW91c2VPdmVyTGlzdGVuZXIuc3Vic2NyaWJlKHRoaXMuc2xpZGVySGFuZGxlUG9wb3Zlck9uTW91c2VIb3Zlci5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLm1vdXNlTGVhdmVIYW5kbGVyID0gbW91c2VMZWF2ZUxpc3RlbmVyLnN1YnNjcmliZSh0aGlzLnNsaWRlckhhbmRsZVBvcG92ZXJPbk1vdXNlTGVhdmUuYmluZCh0aGlzKSk7XG4gIH1cblxuICBwcml2YXRlIHNsaWRlckhhbmRsZVBvcG92ZXJPbk1vdXNlSG92ZXIoKSB7XG4gICAgdGhpcy5pc0hvdmVyaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNob3dWYWx1ZVBvcG92ZXIgPSB0aGlzLnNob3dWYWx1ZVBvcG92ZXJDb250cm9sbGVyKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHNsaWRlckhhbmRsZVBvcG92ZXJPbk1vdXNlTGVhdmUoKSB7XG4gICAgdGhpcy5pc0hvdmVyaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zaG93VmFsdWVQb3BvdmVyID0gdGhpcy5zaG93VmFsdWVQb3BvdmVyQ29udHJvbGxlcigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bnJlZ2lzdGVySGFuZGxlSG92ZXJUb29sdGlwKCkge1xuICAgIHRoaXMubW91c2VPdmVySGFuZGxlci51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubW91c2VMZWF2ZUhhbmRsZXIudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1ZhbHVlUG9wb3ZlckNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNEcmFnZ2luZyB8fCB0aGlzLmlzSG92ZXJpbmc7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlTW91c2VBY3Rpb25zKCk7XG4gICAgdGhpcy51bnJlZ2lzdGVySGFuZGxlSG92ZXJUb29sdGlwKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkZXZ1aS1zbGlkZXJcIiAjc2xpZGVyIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IGRpc2FibGVkIH1cIj5cbiAgPGRpdiBjbGFzcz1cImRldnVpLXNsaWRlci1yYWlsXCIgI3NsaWRlclJhaWwgW25nQ2xhc3NdPVwieyBkaXNhYmxlZDogZGlzYWJsZWQgfVwiPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZGV2dWktc2xpZGVyLXRyYWNrXCIgI3NsaWRlclRyYWNrIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IGRpc2FibGVkIH1cIj48L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZGV2dWktc2xpZGVyLWhhbmRsZVwiXG4gICAgI3NsaWRlckhhbmRsZVxuICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IGRpc2FibGVkIH1cIlxuICAgIGRQb3BvdmVyXG4gICAgcG9zaXRpb249XCJ0b3BcIlxuICAgIFtjb250ZW50XT1cInNob3dWYWx1ZVBvcG92ZXIgJiYgdGlwc1JlbmRlcmVyID8gdGlwc1JlbmRlcmVyKHZhbHVlKSA6ICcnXCJcbiAgICBbc2hvd0FuaW1hdGlvbl09XCJmYWxzZVwiXG4gICAgW3Zpc2libGVdPVwidGlwc1JlbmRlcmVyICYmIHNob3dWYWx1ZVBvcG92ZXJcIlxuICA+PC9kaXY+XG48L2Rpdj5cbiJdfQ==