UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

175 lines 25.4 kB
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, Input, Output } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Subject } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "../i18n/c8y-translate.pipe"; export class TimePickerComponent { constructor(cdRef) { this.cdRef = cdRef; this.lastValidHours = '00'; this.lastValidMinutes = '00'; this.dayForward = new EventEmitter(); this.dayBackward = new EventEmitter(); this.disabled = false; this.date = new Date(); this.touched = false; this.destroy$ = new Subject(); this.simulatedWheelUpEvent = { wheelDeltaY: 1, preventDefault: () => null }; this.simulatedWheelDownEvent = { wheelDeltaY: -1, preventDefault: () => null }; } parseValue(target, lastValid, limit) { this.cdRef.detectChanges(); if (this[target].length > 0 && !/^\d+$/.test(this[target])) { this[target] = this[lastValid]; return; } if (this[target].length <= 1) { this[target] = this[target].padStart(2, '0'); } if (this[target].length > 2 && this[target].startsWith('0')) { this[target] = this[target].slice(1, 3); } if (this[target].length > 2) { this[target] = this[lastValid]; return; } if (Number(this[target]) > limit) { this[target] = limit; } this[lastValid] = this[target]; } initializeMinutes() { if (!this.hasValue(this.minutes)) { this.minutes = '00'; } } initializeHours() { if (!this.hasValue(this.hours)) { this.hours = '00'; } } handleHourScroll(ev) { // up ev.preventDefault(); if (ev.wheelDeltaY > 0) { if (Number(this.hours) === 23) { this.writeValue({ hour: 0, minute: Number(this.minutes) }); this.dayForward.emit(); } else { this.writeValue({ hour: Number(this.hours) + 1, minute: Number(this.minutes) }); } this.emitValue(); } // down if (ev.wheelDeltaY < 0) { if (Number(this.hours) === 0) { this.writeValue({ hour: 23, minute: Number(this.minutes) }); this.dayBackward.emit(); } else { this.writeValue({ hour: Number(this.hours) - 1, minute: Number(this.minutes) }); } this.emitValue(); } } handleMinuteScroll(ev) { // up ev.preventDefault(); if (ev.wheelDeltaY > 0) { if (Number(this.minutes) === 59) { this.writeValue({ hour: Number(this.hours), minute: 0 }); this.handleHourScroll(this.simulatedWheelUpEvent); } else { this.writeValue({ hour: Number(this.hours), minute: Number(this.minutes) + 1 }); } } // down if (ev.wheelDeltaY < 0) { if (Number(this.minutes) === 0) { this.writeValue({ hour: Number(this.hours), minute: 59 }); this.handleHourScroll(this.simulatedWheelDownEvent); } else { this.writeValue({ hour: Number(this.hours), minute: Number(this.minutes) - 1 }); } } this.emitValue(); } emitValue() { if (this.hasValue(this.hours) && this.hasValue(this.minutes)) { this.onChange({ hour: Number(this.hours), minute: Number(this.minutes) }); } } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } /** * Control Value Accessor - If form value changes by external factor, update date property and internal form with new value. */ writeValue(value) { if (this.hasValue(value?.hour) && this.hasValue(value?.minute)) { this.hours = value.hour.toString(); this.minutes = value.minute.toString(); this.parseValue('hours', 'lastValidHours', 23); this.parseValue('minutes', 'lastValidMinutes', 59); } else { this.hours = undefined; this.minutes = undefined; } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(onTouched) { this.onTouched = onTouched; } markAsTouched() { if (!this.touched) { this.onTouched(); this.touched = true; } } setDisabledState(disabled) { this.disabled = disabled; } hasValue(value) { return typeof value !== 'undefined'; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimePickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TimePickerComponent, selector: "c8y-time-picker", inputs: { minDate: "minDate", maxDate: "maxDate", placeholder: "placeholder" }, outputs: { dayForward: "dayForward", dayBackward: "dayBackward" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TimePickerComponent), multi: true } ], ngImport: i0, template: "<table>\n <tbody>\n <tr>\n <td class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-control text-center bs-timepicker-field\"\n [disabled]=\"disabled\"\n [placeholder]=\"'HH`HOURS`' | translate\"\n [(ngModel)]=\"hours\"\n (input)=\"parseValue('hours', 'lastValidHours', 23); initializeMinutes()\"\n (change)=\"emitValue()\"\n (wheel)=\"handleHourScroll($event)\"\n (focus)=\"markAsTouched()\"\n />\n </td>\n <td>&nbsp;:&nbsp;</td>\n <td class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-control text-center bs-timepicker-field\"\n [disabled]=\"disabled\"\n [placeholder]=\"'MM`MINUTES`' | translate\"\n [(ngModel)]=\"minutes\"\n (input)=\"parseValue('minutes', 'lastValidMinutes', 59); initializeHours()\"\n (change)=\"emitValue()\"\n (wheel)=\"handleMinuteScroll($event)\"\n (focus)=\"markAsTouched()\"\n />\n </td>\n </tr>\n </tbody>\n</table>\n", dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimePickerComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-time-picker', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TimePickerComponent), multi: true } ], template: "<table>\n <tbody>\n <tr>\n <td class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-control text-center bs-timepicker-field\"\n [disabled]=\"disabled\"\n [placeholder]=\"'HH`HOURS`' | translate\"\n [(ngModel)]=\"hours\"\n (input)=\"parseValue('hours', 'lastValidHours', 23); initializeMinutes()\"\n (change)=\"emitValue()\"\n (wheel)=\"handleHourScroll($event)\"\n (focus)=\"markAsTouched()\"\n />\n </td>\n <td>&nbsp;:&nbsp;</td>\n <td class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-control text-center bs-timepicker-field\"\n [disabled]=\"disabled\"\n [placeholder]=\"'MM`MINUTES`' | translate\"\n [(ngModel)]=\"minutes\"\n (input)=\"parseValue('minutes', 'lastValidMinutes', 59); initializeHours()\"\n (change)=\"emitValue()\"\n (wheel)=\"handleMinuteScroll($event)\"\n (focus)=\"markAsTouched()\"\n />\n </td>\n </tr>\n </tbody>\n</table>\n" }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { minDate: [{ type: Input }], maxDate: [{ type: Input }], placeholder: [{ type: Input }], dayForward: [{ type: Output }], dayBackward: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUVMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWEvQixNQUFNLE9BQU8sbUJBQW1CO0lBaUM5QixZQUFvQixLQUF3QjtRQUF4QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQTdCNUMsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBWXhCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBR2hDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVqQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFNBQUksR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBSWhCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsYUFBUSxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRXhDLDBCQUFxQixHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkUsNEJBQXVCLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0lBRW5DLENBQUM7SUFFaEQsVUFBVSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0IsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENB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TyxRQUFRLENBQUMsS0FBVTtRQUN6QixPQUFPLE9BQU8sS0FBSyxLQUFLLFdBQVcsQ0FBQztJQUN0QyxDQUFDOytHQWhMVSxtQkFBbUI7bUdBQW5CLG1CQUFtQiw2TEFSbkI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDO2dCQUNsRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsMEJDckJILHFrQ0FpQ0E7OzRGRFZhLG1CQUFtQjtrQkFYL0IsU0FBUzsrQkFDRSxpQkFBaUIsYUFFaEI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO3NGQVVELE9BQU87c0JBRE4sS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsTUFBTTtnQkFJUCxXQUFXO3NCQURWLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXRpbWUtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUaW1lUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcbiAgaG91cnM6IHN0cmluZztcbiAgbWludXRlczogc3RyaW5nO1xuXG4gIGxhc3RWYWxpZEhvdXJzID0gJzAwJztcbiAgbGFzdFZhbGlkTWludXRlcyA9ICcwMCc7XG5cbiAgQElucHV0KClcbiAgbWluRGF0ZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIG1heERhdGU6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIEBPdXRwdXQoKVxuICBkYXlGb3J3YXJkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBkYXlCYWNrd2FyZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBkaXNhYmxlZCA9IGZhbHNlO1xuICBkYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcblxuICBvbkNoYW5nZTogKHZhbHVlOiB7IGhvdXI6IG51bWJlcjsgbWludXRlOiBudW1iZXIgfSkgPT4gdm9pZDtcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHRvdWNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBzaW11bGF0ZWRXaGVlbFVwRXZlbnQgPSB7IHdoZWVsRGVsdGFZOiAxLCBwcmV2ZW50RGVmYXVsdDogKCkgPT4gbnVsbCB9O1xuICBwcml2YXRlIHNpbXVsYXRlZFdoZWVsRG93bkV2ZW50ID0geyB3aGVlbERlbHRhWTogLTEsIHByZXZlbnREZWZhdWx0OiAoKSA9PiBudWxsIH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgcGFyc2VWYWx1ZSh0YXJnZXQsIGxhc3RWYWxpZCwgbGltaXQpIHtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGlmICh0aGlzW3RhcmdldF0ubGVuZ3RoID4gMCAmJiAhL15cXGQrJC8udGVzdCh0aGlzW3RhcmdldF0pKSB7XG4gICAgICB0aGlzW3RhcmdldF0gPSB0aGlzW2xhc3RWYWxpZF07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXNbdGFyZ2V0XS5sZW5ndGggPD0gMSkge1xuICAgICAgdGhpc1t0YXJnZXRdID0gdGhpc1t0YXJnZXRdLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXNbdGFyZ2V0XS5sZW5ndGggPiAyICYmIHRoaXNbdGFyZ2V0XS5zdGFydHNXaXRoKCcwJykpIHtcbiAgICAgIHRoaXNbdGFyZ2V0XSA9IHRoaXNbdGFyZ2V0XS5zbGljZSgxLCAzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpc1t0YXJnZXRdLmxlbmd0aCA+IDIpIHtcbiAgICAgIHRoaXNbdGFyZ2V0XSA9IHRoaXNbbGFzdFZhbGlkXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyKHRoaXNbdGFyZ2V0XSkgPiBsaW1pdCkge1xuICAgICAgdGhpc1t0YXJnZXRdID0gbGltaXQ7XG4gICAgfVxuXG4gICAgdGhpc1tsYXN0VmFsaWRdID0gdGhpc1t0YXJnZXRdO1xuICB9XG5cbiAgaW5pdGlhbGl6ZU1pbnV0ZXMoKSB7XG4gICAgaWYgKCF0aGlzLmhhc1ZhbHVlKHRoaXMubWludXRlcykpIHtcbiAgICAgIHRoaXMubWludXRlcyA9ICcwMCc7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZUhvdXJzKCkge1xuICAgIGlmICghdGhpcy5oYXNWYWx1ZSh0aGlzLmhvdXJzKSkge1xuICAgICAgdGhpcy5ob3VycyA9ICcwMCc7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlSG91clNjcm9sbChldikge1xuICAgIC8vIHVwXG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZXYud2hlZWxEZWx0YVkgPiAwKSB7XG4gICAgICBpZiAoTnVtYmVyKHRoaXMuaG91cnMpID09PSAyMykge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUoeyBob3VyOiAwLCBtaW51dGU6IE51bWJlcih0aGlzLm1pbnV0ZXMpIH0pO1xuICAgICAgICB0aGlzLmRheUZvcndhcmQuZW1pdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHsgaG91cjogTnVtYmVyKHRoaXMuaG91cnMpICsgMSwgbWludXRlOiBOdW1iZXIodGhpcy5taW51dGVzKSB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gICAgfVxuXG4gICAgLy8gZG93blxuICAgIGlmIChldi53aGVlbERlbHRhWSA8IDApIHtcbiAgICAgIGlmIChOdW1iZXIodGhpcy5ob3VycykgPT09IDApIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHsgaG91cjogMjMsIG1pbnV0ZTogTnVtYmVyKHRoaXMubWludXRlcykgfSk7XG4gICAgICAgIHRoaXMuZGF5QmFja3dhcmQuZW1pdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHsgaG91cjogTnVtYmVyKHRoaXMuaG91cnMpIC0gMSwgbWludXRlOiBOdW1iZXIodGhpcy5taW51dGVzKSB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTWludXRlU2Nyb2xsKGV2KSB7XG4gICAgLy8gdXBcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChldi53aGVlbERlbHRhWSA+IDApIHtcbiAgICAgIGlmIChOdW1iZXIodGhpcy5taW51dGVzKSA9PT0gNTkpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHsgaG91cjogTnVtYmVyKHRoaXMuaG91cnMpLCBtaW51dGU6IDAgfSk7XG4gICAgICAgIHRoaXMuaGFuZGxlSG91clNjcm9sbCh0aGlzLnNpbXVsYXRlZFdoZWVsVXBFdmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUoeyBob3VyOiBOdW1iZXIodGhpcy5ob3VycyksIG1pbnV0ZTogTnVtYmVyKHRoaXMubWludXRlcykgKyAxIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRvd25cbiAgICBpZiAoZXYud2hlZWxEZWx0YVkgPCAwKSB7XG4gICAgICBpZiAoTnVtYmVyKHRoaXMubWludXRlcykgPT09IDApIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHsgaG91cjogTnVtYmVyKHRoaXMuaG91cnMpLCBtaW51dGU6IDU5IH0pO1xuICAgICAgICB0aGlzLmhhbmRsZUhvdXJTY3JvbGwodGhpcy5zaW11bGF0ZWRXaGVlbERvd25FdmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUoeyBob3VyOiBOdW1iZXIodGhpcy5ob3VycyksIG1pbnV0ZTogTnVtYmVyKHRoaXMubWludXRlcykgLSAxIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gIH1cblxuICBlbWl0VmFsdWUoKSB7XG4gICAgaWYgKHRoaXMuaGFzVmFsdWUodGhpcy5ob3VycykgJiYgdGhpcy5oYXNWYWx1ZSh0aGlzLm1pbnV0ZXMpKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHtcbiAgICAgICAgaG91cjogTnVtYmVyKHRoaXMuaG91cnMpLFxuICAgICAgICBtaW51dGU6IE51bWJlcih0aGlzLm1pbnV0ZXMpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbCBWYWx1ZSBBY2Nlc3NvciAtIElmIGZvcm0gdmFsdWUgY2hhbmdlcyBieSBleHRlcm5hbCBmYWN0b3IsIHVwZGF0ZSBkYXRlIHByb3BlcnR5IGFuZCBpbnRlcm5hbCBmb3JtIHdpdGggbmV3IHZhbHVlLlxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogeyBob3VyOiBudW1iZXI7IG1pbnV0ZTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNWYWx1ZSh2YWx1ZT8uaG91cikgJiYgdGhpcy5oYXNWYWx1ZSh2YWx1ZT8ubWludXRlKSkge1xuICAgICAgdGhpcy5ob3VycyA9IHZhbHVlLmhvdXIudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMubWludXRlcyA9IHZhbHVlLm1pbnV0ZS50b1N0cmluZygpO1xuXG4gICAgICB0aGlzLnBhcnNlVmFsdWUoJ2hvdXJzJywgJ2xhc3RWYWxpZEhvdXJzJywgMjMpO1xuICAgICAgdGhpcy5wYXJzZVZhbHVlKCdtaW51dGVzJywgJ2xhc3RWYWxpZE1pbnV0ZXMnLCA1OSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaG91cnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm1pbnV0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgfVxuXG4gIG1hcmtBc1RvdWNoZWQoKSB7XG4gICAgaWYgKCF0aGlzLnRvdWNoZWQpIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIGhhc1ZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbiAgfVxufVxuIiwiPHRhYmxlPlxuICA8dGJvZHk+XG4gICAgPHRyPlxuICAgICAgPHRkIGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIgYnMtdGltZXBpY2tlci1maWVsZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0hIYEhPVVJTYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiaG91cnNcIlxuICAgICAgICAgIChpbnB1dCk9XCJwYXJzZVZhbHVlKCdob3VycycsICdsYXN0VmFsaWRIb3VycycsIDIzKTsgaW5pdGlhbGl6ZU1pbnV0ZXMoKVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJlbWl0VmFsdWUoKVwiXG4gICAgICAgICAgKHdoZWVsKT1cImhhbmRsZUhvdXJTY3JvbGwoJGV2ZW50KVwiXG4gICAgICAgICAgKGZvY3VzKT1cIm1hcmtBc1RvdWNoZWQoKVwiXG4gICAgICAgIC8+XG4gICAgICA8L3RkPlxuICAgICAgPHRkPiZuYnNwOzombmJzcDs8L3RkPlxuICAgICAgPHRkIGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIgYnMtdGltZXBpY2tlci1maWVsZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ01NYE1JTlVURVNgJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJtaW51dGVzXCJcbiAgICAgICAgICAoaW5wdXQpPVwicGFyc2VWYWx1ZSgnbWludXRlcycsICdsYXN0VmFsaWRNaW51dGVzJywgNTkpOyBpbml0aWFsaXplSG91cnMoKVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJlbWl0VmFsdWUoKVwiXG4gICAgICAgICAgKHdoZWVsKT1cImhhbmRsZU1pbnV0ZVNjcm9sbCgkZXZlbnQpXCJcbiAgICAgICAgICAoZm9jdXMpPVwibWFya0FzVG91Y2hlZCgpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvdGFibGU+XG4iXX0=