UNPKG

gentics-ui-core

Version:

This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.

192 lines 22.9 kB
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { coerceToBoolean } from '../../common/coerce-to-boolean'; import * as i0 from "@angular/core"; const GTX_RANGE_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Range), multi: true }; /** * The Range wraps the native `<input type="range">` form element. * * ```html * <gtx-range [(ngModel)]="latitude" step="5" min="-180" max="180"></gtx-range> * ``` */ export class Range { constructor(elementRef, changeDetector) { this.elementRef = elementRef; this.changeDetector = changeDetector; /** * Sets the input field to be auto-focused. Handled by `AutofocusDirective`. */ this.autofocus = false; /** * Sets the disabled state of the input. */ this.disabled = false; /** * Sets a label for the slider. */ this.label = ''; /** * Sets the required state. */ this.required = false; /** * Blur event */ this.blur = new EventEmitter(); /** * Focus event */ this.focus = new EventEmitter(); /** * Change event */ this.change = new EventEmitter(); this.active = false; this.thumbLeft = ''; this.showThumbLabel = true; // ValueAccessor members this.onChange = (value) => { }; this.onTouched = () => { }; } /** * Set to false to not show the thumb label. Defaults to true. */ get thumbLabel() { return this.showThumbLabel; } set thumbLabel(value) { this.showThumbLabel = coerceToBoolean(value); } get canModify() { return !this.disabled; } ngOnInit() { this.writeValue(this.value); } onBlur(e) { e.stopPropagation(); const value = this.getValueFromEvent(e); this.blur.emit(value); this.change.emit(value); } /** * IE11 only fires the 'change' event rather than the 'input' event as the range input value is changed. */ onChangeEvent(e) { e.stopPropagation(); if (this.canModify) { const value = this.currentValue = this.getValueFromEvent(e); this.onChange(value); this.change.emit(value); } } onFocus(e) { e.stopPropagation(); this.focus.emit(this.value); } /** * Browsers other than IE11 fire 'input' continuously as the range value is changed, and fires 'change' on mouseup. */ onInput(e) { e.stopPropagation(); if (this.canModify) { const value = this.currentValue = this.getValueFromEvent(e); this.onChange(value); this.change.emit(value); } } onMousedown(e) { if (this.canModify) { this.active = true; this.setThumbPosition(e); } } onMouseup() { this.active = false; } onMousemove(e) { if (this.canModify) { if (this.active) { this.setThumbPosition(e); } } } writeValue(value) { if (value !== this.currentValue) { this.currentValue = value; this.inputElement.nativeElement.value = this.currentValue; } } registerOnChange(fn) { this.onChange = (value) => fn(Number(value)); } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(disabled) { this.disabled = disabled; this.changeDetector.markForCheck(); } getValueFromEvent(e) { const target = e.target; return Number(target.value); } setThumbPosition(e) { const endMargin = 8; const rangeWrapper = this.elementRef.nativeElement.querySelector('.range-field'); const boundingRect = rangeWrapper.getBoundingClientRect(); const wrapperLeft = boundingRect.left; const wrapperWidth = boundingRect.width; let left = e.pageX - wrapperLeft; if (left < endMargin) { left = endMargin; } else if (left > wrapperWidth - endMargin) { left = wrapperWidth - endMargin; } this.thumbLeft = left + 'px'; } } /** @nocollapse */ Range.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Range, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ Range.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: Range, selector: "gtx-range", inputs: { autofocus: "autofocus", disabled: "disabled", label: "label", max: "max", min: "min", name: "name", required: "required", step: "step", value: "value", id: "id", thumbLabel: "thumbLabel" }, outputs: { blur: "blur", focus: "focus", change: "change" }, providers: [GTX_RANGE_VALUE_ACCESSOR], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["input"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"range-field\">\n <input type=\"range\"\n [disabled]=\"disabled\"\n [attr.max]=\"max\"\n [attr.min]=\"min\"\n [attr.name]=\"name\"\n [required]=\"required\"\n [attr.step]=\"step\"\n\n [attr.id]=\"id\"\n\n (blur)=\"onBlur($event)\"\n (change)=\"onChangeEvent($event)\"\n (focus)=\"onFocus($event)\"\n (input)=\"onInput($event)\"\n (mousedown)=\"onMousedown($event)\"\n (mouseup)=\"onMouseup()\"\n (mousemove)=\"onMousemove($event)\"\n\n #input\n >\n <span class=\"thumb\"\n [class.hidden]=\"!thumbLabel\"\n [class.active]=\"active\"\n [style.left]=\"thumbLeft\">\n <span class=\"value\">{{ currentValue }}</span>\n </span>\n</div>\n<label [attr.for]=\"id\">{{ label }}</label>\n" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Range, decorators: [{ type: Component, args: [{ selector: 'gtx-range', providers: [GTX_RANGE_VALUE_ACCESSOR], template: "<div class=\"range-field\">\n <input type=\"range\"\n [disabled]=\"disabled\"\n [attr.max]=\"max\"\n [attr.min]=\"min\"\n [attr.name]=\"name\"\n [required]=\"required\"\n [attr.step]=\"step\"\n\n [attr.id]=\"id\"\n\n (blur)=\"onBlur($event)\"\n (change)=\"onChangeEvent($event)\"\n (focus)=\"onFocus($event)\"\n (input)=\"onInput($event)\"\n (mousedown)=\"onMousedown($event)\"\n (mouseup)=\"onMouseup()\"\n (mousemove)=\"onMousemove($event)\"\n\n #input\n >\n <span class=\"thumb\"\n [class.hidden]=\"!thumbLabel\"\n [class.active]=\"active\"\n [style.left]=\"thumbLeft\">\n <span class=\"value\">{{ currentValue }}</span>\n </span>\n</div>\n<label [attr.for]=\"id\">{{ label }}</label>\n" }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { autofocus: [{ type: Input }], disabled: [{ type: Input }], label: [{ type: Input }], max: [{ type: Input }], min: [{ type: Input }], name: [{ type: Input }], required: [{ type: Input }], step: [{ type: Input }], value: [{ type: Input }], id: [{ type: Input }], thumbLabel: [{ type: Input }], blur: [{ type: Output }], focus: [{ type: Output }], change: [{ type: Output }], inputElement: [{ type: ViewChild, args: ['input', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcmFuZ2UvcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcmFuZ2UvcmFuZ2UudHBsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMzSCxPQUFPLEVBQXVCLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGdDQUFnQyxDQUFDOztBQUUvRCxNQUFNLHdCQUF3QixHQUFHO0lBQzdCLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDcEMsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBTUgsTUFBTSxPQUFPLEtBQUs7SUE4RmQsWUFBb0IsVUFBc0IsRUFDdEIsY0FBaUM7UUFEakMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUE5RnJEOztXQUVHO1FBQ00sY0FBUyxHQUFZLEtBQUssQ0FBQztRQUVwQzs7V0FFRztRQUNNLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFbkM7O1dBRUc7UUFDTSxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBaUI1Qjs7V0FFRztRQUNNLGFBQVEsR0FBWSxLQUFLLENBQUM7UUE0Qm5DOztXQUVHO1FBQ08sU0FBSSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFNUM7O1dBRUc7UUFDTyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUU3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QUFJLElBQUksR0FBRyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxHQUFHLFNBQVMsQ0FBQztTQUNwQjthQUFNLElBQUksSUFBSSxHQUFHLFlBQVksR0FBRyxTQUFTLEVBQUU7WUFDeEMsSUFBSSxHQUFHLFlBQVksR0FBRyxTQUFTLENBQUM7U0FDbkM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7SUFDakMsQ0FBQzs7cUhBbk1RLEtBQUs7eUdBQUwsS0FBSyx5U0FGSCxDQUFDLHdCQUF3QixDQUFDLCtJQ3BCekMsdTNCQTZCQTsyRkRQYSxLQUFLO2tCQUxqQixTQUFTOytCQUNJLFdBQVcsYUFFVixDQUFDLHdCQUF3QixDQUFDO2lJQU01QixTQUFTO3NCQUFqQixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUtHLEdBQUc7c0JBQVgsS0FBSztnQkFLRyxHQUFHO3NCQUFYLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxFQUFFO3NCQUFWLEtBQUs7Z0JBTUYsVUFBVTtzQkFEYixLQUFLO2dCQVdJLElBQUk7c0JBQWIsTUFBTTtnQkFLRyxLQUFLO3NCQUFkLE1BQU07Z0JBS0csTUFBTTtzQkFBZixNQUFNO2dCQVN1QyxZQUFZO3NCQUF6RCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2NvZXJjZVRvQm9vbGVhbn0gZnJvbSAnLi4vLi4vY29tbW9uL2NvZXJjZS10by1ib29sZWFuJztcblxuY29uc3QgR1RYX1JBTkdFX1ZBTFVFX0FDQ0VTU09SID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhbmdlKSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBUaGUgUmFuZ2Ugd3JhcHMgdGhlIG5hdGl2ZSBgPGlucHV0IHR5cGU9XCJyYW5nZVwiPmAgZm9ybSBlbGVtZW50LlxuICpcbiAqIGBgYGh0bWxcbiAqIDxndHgtcmFuZ2UgWyhuZ01vZGVsKV09XCJsYXRpdHVkZVwiIHN0ZXA9XCI1XCIgbWluPVwiLTE4MFwiIG1heD1cIjE4MFwiPjwvZ3R4LXJhbmdlPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ3R4LXJhbmdlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmFuZ2UudHBsLmh0bWwnLFxuICAgIHByb3ZpZGVyczogW0dUWF9SQU5HRV9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgUmFuZ2UgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaW5wdXQgZmllbGQgdG8gYmUgYXV0by1mb2N1c2VkLiBIYW5kbGVkIGJ5IGBBdXRvZm9jdXNEaXJlY3RpdmVgLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGF1dG9mb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgb2YgdGhlIGlucHV0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbGFiZWwgZm9yIHRoZSBzbGlkZXIuXG4gICAgICovXG4gICAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogTWF4aW11bSBhbGxvd2VkIHZhbHVlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIG1heDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogTWluaW11bSBhbGxvd2VkIHZhbHVlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIG1pbjogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVxdWlyZWQgc3RhdGUuXG4gICAgICovXG4gICAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFtb3VudCB0byBpbmNyZW1lbnQgYnkgd2hlbiBzbGlkaW5nLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHN0ZXA6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzbGlkZXIuXG4gICAgICovXG4gICAgQElucHV0KCkgdmFsdWU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFNldHMgYW4gaWQgZm9yIHRoZSBzbGlkZXIuXG4gICAgICovXG4gICAgQElucHV0KCkgaWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNldCB0byBmYWxzZSB0byBub3Qgc2hvdyB0aGUgdGh1bWIgbGFiZWwuIERlZmF1bHRzIHRvIHRydWUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnZXQgdGh1bWJMYWJlbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1RodW1iTGFiZWw7XG4gICAgfVxuICAgIHNldCB0aHVtYkxhYmVsKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2hvd1RodW1iTGFiZWwgPSBjb2VyY2VUb0Jvb2xlYW4odmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJsdXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgYmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgLyoqXG4gICAgICogRm9jdXMgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIENoYW5nZSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuXG4gICAgYWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG4gICAgdGh1bWJMZWZ0OiBzdHJpbmcgPSAnJztcbiAgICBjdXJyZW50VmFsdWU6IG51bWJlcjtcbiAgICBwcml2YXRlIHNob3dUaHVtYkxhYmVsOiBib29sZWFuID0gdHJ1ZTtcblxuXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGlucHV0RWxlbWVudDogRWxlbWVudFJlZjtcblxuICAgIHByaXZhdGUgZ2V0IGNhbk1vZGlmeSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRpc2FibGVkO1xuICAgIH1cblxuICAgIC8vIFZhbHVlQWNjZXNzb3IgbWVtYmVyc1xuICAgIG9uQ2hhbmdlID0gKHZhbHVlOiBhbnkpOiB2b2lkID0+IHsgfTtcbiAgICBvblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7IH07XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIG9uQmx1cihlOiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21FdmVudChlKTtcbiAgICAgICAgdGhpcy5ibHVyLmVtaXQodmFsdWUpO1xuICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJRTExIG9ubHkgZmlyZXMgdGhlICdjaGFuZ2UnIGV2ZW50IHJhdGhlciB0aGFuIHRoZSAnaW5wdXQnIGV2ZW50IGFzIHRoZSByYW5nZSBpbnB1dCB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgICAqL1xuICAgIG9uQ2hhbmdlRXZlbnQoZTogRXZlbnQpOiB2b2lkIHwgYm9vbGVhbiB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmNhbk1vZGlmeSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tRXZlbnQoZSk7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Gb2N1cyhlOiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuZm9jdXMuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCcm93c2VycyBvdGhlciB0aGFuIElFMTEgZmlyZSAnaW5wdXQnIGNvbnRpbnVvdXNseSBhcyB0aGUgcmFuZ2UgdmFsdWUgaXMgY2hhbmdlZCwgYW5kIGZpcmVzICdjaGFuZ2UnIG9uIG1vdXNldXAuXG4gICAgICovXG4gICAgb25JbnB1dChlOiBFdmVudCk6IHZvaWQge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5jYW5Nb2RpZnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jdXJyZW50VmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbUV2ZW50KGUpO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTW91c2Vkb3duKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuTW9kaWZ5KSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNldFRodW1iUG9zaXRpb24oZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1vdXNldXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cbiAgICB9XG5cbiAgICBvbk1vdXNlbW92ZShlOiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNhbk1vZGlmeSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUaHVtYlBvc2l0aW9uKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAobmV3VmFsdWU6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IGZuKE51bWJlcih2YWx1ZSkpO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWYWx1ZUZyb21FdmVudChlOiBFdmVudCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRhcmdldDogSFRNTElucHV0RWxlbWVudCA9IDxIVE1MSW5wdXRFbGVtZW50PiBlLnRhcmdldDtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0YXJnZXQudmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VGh1bWJQb3NpdGlvbihlOiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVuZE1hcmdpbiA9IDg7XG4gICAgICAgIGNvbnN0IHJhbmdlV3JhcHBlciA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yYW5nZS1maWVsZCcpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBjb25zdCBib3VuZGluZ1JlY3QgPSByYW5nZVdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHdyYXBwZXJMZWZ0ID0gYm91bmRpbmdSZWN0LmxlZnQ7XG4gICAgICAgIGNvbnN0IHdyYXBwZXJXaWR0aCA9IGJvdW5kaW5nUmVjdC53aWR0aDtcbiAgICAgICAgbGV0IGxlZnQgPSBlLnBhZ2VYIC0gd3JhcHBlckxlZnQ7XG4gICAgICAgIGlmIChsZWZ0IDwgZW5kTWFyZ2luKSB7XG4gICAgICAgICAgICBsZWZ0ID0gZW5kTWFyZ2luO1xuICAgICAgICB9IGVsc2UgaWYgKGxlZnQgPiB3cmFwcGVyV2lkdGggLSBlbmRNYXJnaW4pIHtcbiAgICAgICAgICAgIGxlZnQgPSB3cmFwcGVyV2lkdGggLSBlbmRNYXJnaW47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aHVtYkxlZnQgPSBsZWZ0ICsgJ3B4JztcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicmFuZ2UtZmllbGRcIj5cbiAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgW2F0dHIubWF4XT1cIm1heFwiXG4gICAgICAgICAgIFthdHRyLm1pbl09XCJtaW5cIlxuICAgICAgICAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICBbYXR0ci5zdGVwXT1cInN0ZXBcIlxuXG4gICAgICAgICAgIFthdHRyLmlkXT1cImlkXCJcblxuICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxuICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uTW91c2Vkb3duKCRldmVudClcIlxuICAgICAgICAgICAobW91c2V1cCk9XCJvbk1vdXNldXAoKVwiXG4gICAgICAgICAgIChtb3VzZW1vdmUpPVwib25Nb3VzZW1vdmUoJGV2ZW50KVwiXG5cbiAgICAgICAgICAgI2lucHV0XG4gICAgPlxuICAgIDxzcGFuIGNsYXNzPVwidGh1bWJcIlxuICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiIXRodW1iTGFiZWxcIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlXCJcbiAgICAgICAgICBbc3R5bGUubGVmdF09XCJ0aHVtYkxlZnRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiPnt7IGN1cnJlbnRWYWx1ZSB9fTwvc3Bhbj5cbiAgICA8L3NwYW4+XG48L2Rpdj5cbjxsYWJlbCBbYXR0ci5mb3JdPVwiaWRcIj57eyBsYWJlbCB9fTwvbGFiZWw+XG4iXX0=