@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
177 lines • 28.7 kB
JavaScript
import { WeekDay } from '@angular/common';
import { inject, Injectable } from '@angular/core';
import { BehaviorSubject, Subject } from 'rxjs';
import { DateRangeOptions } from '../date-range-picker/date-range-picker.directive';
import { DateRangeService } from '../date-range-picker/date-range.service';
import { DateTimePickerConfig } from './date-time-picker.config';
import { dateComparator, meridians, months, monthsShort, timezones, weekdaysShort } from './date-time-picker.utils';
import * as i0 from "@angular/core";
export class DateTimePickerService {
constructor() {
this._config = inject(DateTimePickerConfig, { optional: true });
this.rangeService = inject(DateRangeService, { optional: true });
this.rangeOptions = inject(DateRangeOptions, { optional: true });
this.mode$ = new BehaviorSubject(DatePickerMode.Day);
this.date$ = new BehaviorSubject(new Date());
this.timezone$ = new BehaviorSubject(null);
this.selected$ = new BehaviorSubject(new Date());
// the month and year to display in the viewport
this.month$ = new BehaviorSubject(new Date().getMonth());
this.year$ = new BehaviorSubject(new Date().getFullYear());
this.showDate$ = new BehaviorSubject(this._config ? this._config.showDate : true);
this.showTime$ = new BehaviorSubject(this._config ? this._config.showTime : true);
this.showTimezone$ = new BehaviorSubject(this._config ? this._config.showTimezone : true);
this.showSeconds$ = new BehaviorSubject(this._config ? this._config.showSeconds : false);
this.showMeridian$ = new BehaviorSubject(this._config ? this._config.showMeridian : true);
this.showSpinners$ = new BehaviorSubject(this._config ? this._config.showSpinners : true);
this.showNowBtn$ = new BehaviorSubject(this._config ? this._config.showNowBtn : true);
this.weekdays$ = new BehaviorSubject(this._config ? this._config.weekdays : weekdaysShort);
this.nowBtnText$ = new BehaviorSubject(this._config ? this._config.nowBtnText : 'Today');
this.timezones$ = new BehaviorSubject(this._config ? this._config.timezones : timezones);
this.min$ = new BehaviorSubject(this._config ? this._config.min : null);
this.max$ = new BehaviorSubject(this._config ? this._config.max : null);
this.header$ = new BehaviorSubject(null);
this.headerEvent$ = new Subject();
this.modeDirection = ModeDirection.None;
this.startOfWeek$ = new BehaviorSubject(WeekDay.Sunday);
this.months = this._config ? this._config.months : months;
this.monthsShort = this._config ? this._config.monthsShort : monthsShort;
this.meridians = this._config ? this._config.meridians : meridians;
/**
* Store whether or not the component has fully initialised or not. We use this to prevent initial
* focus on the end date range picker when the popover is first opened
*/
this.initialised = false;
// when the active date changes set the currently selected date
this._subscription = this.selected$.subscribe(date => {
// the month and year displayed in the viewport should reflect the newly selected items
if (date instanceof Date) {
this.setViewportMonth(date.getMonth());
this.setViewportYear(date.getFullYear());
}
// emit the new date to the component host but only if they are different
if (!dateComparator(date, this.date$.value)) {
if (this.rangeService) {
if (this.rangeOptions.picker === 'start') {
this.rangeService.setStartDate(date);
}
else {
this.rangeService.setEndDate(date);
}
}
else {
this.date$.next(date);
}
}
});
}
ngOnDestroy() {
this._subscription.unsubscribe();
}
setViewportMonth(month) {
if (month < 0) {
this.month$.next(11);
this.year$.next(this.year$.value - 1);
}
else if (month > 11) {
this.month$.next(0);
this.year$.next(this.year$.value + 1);
}
else {
this.month$.next(month);
}
}
setViewportYear(year) {
this.year$.next(year);
}
setDate(day, month, year, hours, minutes, seconds) {
const date = new Date(this.selected$.value);
date.setFullYear(year);
date.setMonth(month, day);
if (hours !== undefined) {
date.setHours(hours);
}
if (minutes !== undefined) {
date.setMinutes(minutes);
}
if (seconds !== undefined) {
date.setSeconds(seconds);
}
if (this.isInRange(date)) {
this.selected$.next(date);
}
}
setDateToNow() {
const now = new Date();
if (this.isInRange(now)) {
this.selected$.next(now);
}
}
setViewportMode(mode) {
this.mode$.next(mode);
}
goToChildMode() {
this.modeDirection = ModeDirection.Descend;
switch (this.mode$.value) {
case DatePickerMode.Year:
return this.setViewportMode(DatePickerMode.Month);
case DatePickerMode.Month:
return this.setViewportMode(DatePickerMode.Day);
}
}
goToParentMode() {
this.modeDirection = ModeDirection.Ascend;
switch (this.mode$.value) {
case DatePickerMode.Day:
return this.setViewportMode(DatePickerMode.Month);
case DatePickerMode.Month:
return this.setViewportMode(DatePickerMode.Year);
}
}
goToNext() {
this.headerEvent$.next(DatePickerHeaderEvent.Next);
}
goToPrevious() {
this.headerEvent$.next(DatePickerHeaderEvent.Previous);
}
setHeader(header) {
this.header$.next(header);
}
isTimezoneAvailable(timezone) {
if (!timezone || !this.timezones$.value) {
return false;
}
return this.timezones$.value.findIndex(_timezone => _timezone.offset === timezone.offset && _timezone.name === timezone.name) !== -1;
}
getDefaultTimezone() {
const offset = new Date().getTimezoneOffset();
const matchingZone = this.timezones$.value.find(_timezone => _timezone.offset === offset);
return matchingZone || this.timezones$.value.find(_timezone => _timezone.offset === 0) || { name: 'GMT', offset: 0 };
}
isInRange(date) {
return (!this.min$.value || date >= this.min$.value) && (!this.max$.value || date <= this.max$.value);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: DateTimePickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: DateTimePickerService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: DateTimePickerService, decorators: [{
type: Injectable
}], ctorParameters: () => [] });
export var DatePickerMode;
(function (DatePickerMode) {
DatePickerMode[DatePickerMode["Day"] = 0] = "Day";
DatePickerMode[DatePickerMode["Month"] = 1] = "Month";
DatePickerMode[DatePickerMode["Year"] = 2] = "Year";
})(DatePickerMode || (DatePickerMode = {}));
export var ModeDirection;
(function (ModeDirection) {
ModeDirection[ModeDirection["None"] = 0] = "None";
ModeDirection[ModeDirection["Ascend"] = 1] = "Ascend";
ModeDirection[ModeDirection["Descend"] = 2] = "Descend";
})(ModeDirection || (ModeDirection = {}));
export var DatePickerHeaderEvent;
(function (DatePickerHeaderEvent) {
DatePickerHeaderEvent[DatePickerHeaderEvent["Previous"] = 0] = "Previous";
DatePickerHeaderEvent[DatePickerHeaderEvent["Next"] = 1] = "Next";
})(DatePickerHeaderEvent || (DatePickerHeaderEvent = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZGF0ZS10aW1lLXBpY2tlci9kYXRlLXRpbWUtcGlja2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUEwQixTQUFTLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBRzVJLE1BQU0sT0FBTyxxQkFBcUI7SUFxRDlCO1FBbkRpQixZQUFPLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFbkUsaUJBQVksR0FBRyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU1RCxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXJFLFVBQUssR0FBb0MsSUFBSSxlQUFlLENBQWlCLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRyxVQUFLLEdBQTBCLElBQUksZUFBZSxDQUFPLElBQUks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QUksQ0FBQTtJQUNKLHFEQUFNLENBQUE7SUFDTix1REFBTyxDQUFBO0FBQ1gsQ0FBQyxFQUpXLGFBQWEsS0FBYixhQUFhLFFBSXhCO0FBRUQsTUFBTSxDQUFOLElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUM3Qix5RUFBUSxDQUFBO0lBQ1IsaUVBQUksQ0FBQTtBQUNSLENBQUMsRUFIVyxxQkFBcUIsS0FBckIscUJBQXFCLFFBR2hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2Vla0RheSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERhdGVSYW5nZU9wdGlvbnMgfSBmcm9tICcuLi9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlU2VydmljZSB9IGZyb20gJy4uL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlVGltZVBpY2tlckNvbmZpZyB9IGZyb20gJy4vZGF0ZS10aW1lLXBpY2tlci5jb25maWcnO1xuaW1wb3J0IHsgZGF0ZUNvbXBhcmF0b3IsIERhdGVUaW1lUGlja2VyVGltZXpvbmUsIG1lcmlkaWFucywgbW9udGhzLCBtb250aHNTaG9ydCwgdGltZXpvbmVzLCB3ZWVrZGF5c1Nob3J0IH0gZnJvbSAnLi9kYXRlLXRpbWUtcGlja2VyLnV0aWxzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERhdGVUaW1lUGlja2VyU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWcgPSBpbmplY3QoRGF0ZVRpbWVQaWNrZXJDb25maWcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgICByZWFkb25seSByYW5nZVNlcnZpY2UgPSBpbmplY3QoRGF0ZVJhbmdlU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAgIHJlYWRvbmx5IHJhbmdlT3B0aW9ucyA9IGluamVjdChEYXRlUmFuZ2VPcHRpb25zLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgbW9kZSQ6IEJlaGF2aW9yU3ViamVjdDxEYXRlUGlja2VyTW9kZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGVQaWNrZXJNb2RlPihEYXRlUGlja2VyTW9kZS5EYXkpO1xuICAgIGRhdGUkOiBCZWhhdmlvclN1YmplY3Q8RGF0ZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGU+KG5ldyBEYXRlKCkpO1xuICAgIHRpbWV6b25lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0ZVRpbWVQaWNrZXJUaW1lem9uZT4obnVsbCk7XG4gICAgc2VsZWN0ZWQkOiBCZWhhdmlvclN1YmplY3Q8RGF0ZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGU+KG5ldyBEYXRlKCkpO1xuXG4gICAgLy8gdGhlIG1vbnRoIGFuZCB5ZWFyIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdwb3J0XG4gICAgbW9udGgkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihuZXcgRGF0ZSgpLmdldE1vbnRoKCkpO1xuICAgIHllYXIkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkpO1xuXG4gICAgc2hvd0RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0aGlzLl9jb25maWcgPyB0aGlzLl9jb25maWcuc2hvd0RhdGUgOiB0cnVlKTtcbiAgICBzaG93VGltZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRoaXMuX2NvbmZpZyA/IHRoaXMuX2NvbmZpZy5zaG93VGltZSA6IHRydWUpO1xuICAgIHNob3dUaW1lem9uZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRoaXMuX2NvbmZpZyA/IHRoaXMuX2NvbmZpZy5zaG93VGltZXpvbmUgOiB0cnVlKTtcbiAgICBzaG93U2Vjb25kcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRoaXMuX2NvbmZpZyA/IHRoaXMuX2NvbmZpZy5zaG93U2Vjb25kcyA6IGZhbHNlKTtcbiAgICBzaG93TWVyaWRpYW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0aGlzLl9jb25maWcgPyB0aGlzLl9jb25maWcuc2hvd01lcmlkaWFuIDogdHJ1ZSk7XG4gICAgc2hvd1NwaW5uZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odGhpcy5fY29uZmlnID8gdGhpcy5fY29uZmlnLnNob3dTcGlubmVycyA6IHRydWUpO1xuICAgIHNob3dOb3dCdG4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0aGlzLl9jb25maWcgPyB0aGlzLl9jb25maWcuc2hvd05vd0J0biA6IHRydWUpO1xuICAgIHdlZWtkYXlzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KHRoaXMuX2NvbmZpZyA/IHRoaXMuX2NvbmZpZy53ZWVrZGF5cyA6IHdlZWtkYXlzU2hvcnQpO1xuICAgIG5vd0J0blRleHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KHRoaXMuX2NvbmZpZyA/IHRoaXMuX2NvbmZpZy5ub3dCdG5UZXh0IDogJ1RvZGF5Jyk7XG4gICAgdGltZXpvbmVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0ZVRpbWVQaWNrZXJUaW1lem9uZVtdPih0aGlzLl9jb25maWcgPyB0aGlzLl9jb25maWcudGltZXpvbmVzIDogdGltZXpvbmVzKTtcbiAgICBtaW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRlPih0aGlzLl9jb25maWcgPyB0aGlzLl9jb25maWcubWluIDogbnVsbCk7XG4gICAgbWF4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0ZT4odGhpcy5fY29uZmlnID8gdGhpcy5fY29uZmlnLm1heCA6IG51bGwpO1xuXG4gICAgaGVhZGVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihudWxsKTtcbiAgICBoZWFkZXJFdmVudCQgPSBuZXcgU3ViamVjdDxEYXRlUGlja2VySGVhZGVyRXZlbnQ+KCk7XG4gICAgbW9kZURpcmVjdGlvbjogTW9kZURpcmVjdGlvbiA9IE1vZGVEaXJlY3Rpb24uTm9uZTtcbiAgICBzdGFydE9mV2VlayQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFdlZWtEYXk+KFdlZWtEYXkuU3VuZGF5KTtcblxuICAgIG1vbnRoczogc3RyaW5nW10gPSB0aGlzLl9jb25maWcgPyB0aGlzLl9jb25maWcubW9udGhzIDogbW9udGhzO1xuICAgIG1vbnRoc1Nob3J0OiBzdHJpbmdbXSA9IHRoaXMuX2NvbmZpZyA/IHRoaXMuX2NvbmZpZy5tb250aHNTaG9ydCA6IG1vbnRoc1Nob3J0O1xuICAgIG1lcmlkaWFuczogc3RyaW5nW10gPSB0aGlzLl9jb25maWcgPyB0aGlzLl9jb25maWcubWVyaWRpYW5zIDogbWVyaWRpYW5zO1xuXG4gICAgaG91cnM6IG51bWJlcjtcbiAgICBtaW51dGVzOiBudW1iZXI7XG4gICAgc2Vjb25kczogbnVtYmVyO1xuXG4gICAgeWVhclJhbmdlOiBZZWFyUmFuZ2U7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSB3aGV0aGVyIG9yIG5vdCB0aGUgY29tcG9uZW50IGhhcyBmdWxseSBpbml0aWFsaXNlZCBvciBub3QuIFdlIHVzZSB0aGlzIHRvIHByZXZlbnQgaW5pdGlhbFxuICAgICAqIGZvY3VzIG9uIHRoZSBlbmQgZGF0ZSByYW5nZSBwaWNrZXIgd2hlbiB0aGUgcG9wb3ZlciBpcyBmaXJzdCBvcGVuZWRcbiAgICAgKi9cbiAgICBpbml0aWFsaXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcblxuICAgICAgICAvLyB3aGVuIHRoZSBhY3RpdmUgZGF0ZSBjaGFuZ2VzIHNldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGVcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gdGhpcy5zZWxlY3RlZCQuc3Vic2NyaWJlKGRhdGUgPT4ge1xuICAgICAgICAgICAgLy8gdGhlIG1vbnRoIGFuZCB5ZWFyIGRpc3BsYXllZCBpbiB0aGUgdmlld3BvcnQgc2hvdWxkIHJlZmxlY3QgdGhlIG5ld2x5IHNlbGVjdGVkIGl0ZW1zXG4gICAgICAgICAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpZXdwb3J0TW9udGgoZGF0ZS5nZXRNb250aCgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpZXdwb3J0WWVhcihkYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlbWl0IHRoZSBuZXcgZGF0ZSB0byB0aGUgY29tcG9uZW50IGhvc3QgYnV0IG9ubHkgaWYgdGhleSBhcmUgZGlmZmVyZW50XG4gICAgICAgICAgICBpZiAoIWRhdGVDb21wYXJhdG9yKGRhdGUsIHRoaXMuZGF0ZSQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmFuZ2VTZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlT3B0aW9ucy5waWNrZXIgPT09ICdzdGFydCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VTZXJ2aWNlLnNldFN0YXJ0RGF0ZShkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VTZXJ2aWNlLnNldEVuZERhdGUoZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUkLm5leHQoZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgc2V0Vmlld3BvcnRNb250aChtb250aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChtb250aCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMubW9udGgkLm5leHQoMTEpO1xuICAgICAgICAgICAgdGhpcy55ZWFyJC5uZXh0KHRoaXMueWVhciQudmFsdWUgLSAxKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb250aCA+IDExKSB7XG4gICAgICAgICAgICB0aGlzLm1vbnRoJC5uZXh0KDApO1xuICAgICAgICAgICAgdGhpcy55ZWFyJC5uZXh0KHRoaXMueWVhciQudmFsdWUgKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubW9udGgkLm5leHQobW9udGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0Vmlld3BvcnRZZWFyKHllYXI6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnllYXIkLm5leHQoeWVhcik7XG4gICAgfVxuXG4gICAgc2V0RGF0ZShkYXk6IG51bWJlciwgbW9udGg6IG51bWJlciwgeWVhcjogbnVtYmVyLCBob3Vycz86IG51bWJlciwgbWludXRlcz86IG51bWJlciwgc2Vjb25kcz86IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZCQudmFsdWUpO1xuXG4gICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeWVhcik7XG4gICAgICAgIGRhdGUuc2V0TW9udGgobW9udGgsIGRheSk7XG5cbiAgICAgICAgaWYgKGhvdXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRhdGUuc2V0SG91cnMoaG91cnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pbnV0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0ZS5zZXRNaW51dGVzKG1pbnV0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlY29uZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0ZS5zZXRTZWNvbmRzKHNlY29uZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNJblJhbmdlKGRhdGUpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkJC5uZXh0KGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RGF0ZVRvTm93KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5pc0luUmFuZ2Uobm93KSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCQubmV4dChub3cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0Vmlld3BvcnRNb2RlKG1vZGU6IERhdGVQaWNrZXJNb2RlKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9kZSQubmV4dChtb2RlKTtcbiAgICB9XG5cbiAgICBnb1RvQ2hpbGRNb2RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZGVEaXJlY3Rpb24gPSBNb2RlRGlyZWN0aW9uLkRlc2NlbmQ7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLm1vZGUkLnZhbHVlKSB7XG5cbiAgICAgICAgICAgIGNhc2UgRGF0ZVBpY2tlck1vZGUuWWVhcjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRWaWV3cG9ydE1vZGUoRGF0ZVBpY2tlck1vZGUuTW9udGgpO1xuXG4gICAgICAgICAgICBjYXNlIERhdGVQaWNrZXJNb2RlLk1vbnRoOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFZpZXdwb3J0TW9kZShEYXRlUGlja2VyTW9kZS5EYXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ29Ub1BhcmVudE1vZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9kZURpcmVjdGlvbiA9IE1vZGVEaXJlY3Rpb24uQXNjZW5kO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5tb2RlJC52YWx1ZSkge1xuXG4gICAgICAgICAgICBjYXNlIERhdGVQaWNrZXJNb2RlLkRheTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRWaWV3cG9ydE1vZGUoRGF0ZVBpY2tlck1vZGUuTW9udGgpO1xuXG4gICAgICAgICAgICBjYXNlIERhdGVQaWNrZXJNb2RlLk1vbnRoOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFZpZXdwb3J0TW9kZShEYXRlUGlja2VyTW9kZS5ZZWFyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdvVG9OZXh0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhlYWRlckV2ZW50JC5uZXh0KERhdGVQaWNrZXJIZWFkZXJFdmVudC5OZXh0KTtcbiAgICB9XG5cbiAgICBnb1RvUHJldmlvdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGVhZGVyRXZlbnQkLm5leHQoRGF0ZVBpY2tlckhlYWRlckV2ZW50LlByZXZpb3VzKTtcbiAgICB9XG5cbiAgICBzZXRIZWFkZXIoaGVhZGVyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oZWFkZXIkLm5leHQoaGVhZGVyKTtcbiAgICB9XG5cbiAgICBpc1RpbWV6b25lQXZhaWxhYmxlKHRpbWV6b25lOiBEYXRlVGltZVBpY2tlclRpbWV6b25lKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGltZXpvbmUgfHwgIXRoaXMudGltZXpvbmVzJC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGltZXpvbmVzJC52YWx1ZS5maW5kSW5kZXgoX3RpbWV6b25lID0+IF90aW1lem9uZS5vZmZzZXQgPT09IHRpbWV6b25lLm9mZnNldCAmJiBfdGltZXpvbmUubmFtZSA9PT0gdGltZXpvbmUubmFtZSkgIT09IC0xO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRUaW1lem9uZSgpOiBEYXRlVGltZVBpY2tlclRpbWV6b25lIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgICAgICBjb25zdCBtYXRjaGluZ1pvbmUgPSB0aGlzLnRpbWV6b25lcyQudmFsdWUuZmluZChfdGltZXpvbmUgPT4gX3RpbWV6b25lLm9mZnNldCA9PT0gb2Zmc2V0KTtcblxuICAgICAgICByZXR1cm4gbWF0Y2hpbmdab25lIHx8IHRoaXMudGltZXpvbmVzJC52YWx1ZS5maW5kKF90aW1lem9uZSA9PiBfdGltZXpvbmUub2Zmc2V0ID09PSAwKSB8fCB7IG5hbWU6ICdHTVQnLCBvZmZzZXQ6IDAgfTtcbiAgICB9XG5cbiAgICBpc0luUmFuZ2UoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKCF0aGlzLm1pbiQudmFsdWUgfHwgZGF0ZSA+PSB0aGlzLm1pbiQudmFsdWUpICYmICghdGhpcy5tYXgkLnZhbHVlIHx8IGRhdGUgPD0gdGhpcy5tYXgkLnZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBlbnVtIERhdGVQaWNrZXJNb2RlIHtcbiAgICBEYXksXG4gICAgTW9udGgsXG4gICAgWWVhclxufVxuXG5leHBvcnQgZW51bSBNb2RlRGlyZWN0aW9uIHtcbiAgICBOb25lLFxuICAgIEFzY2VuZCxcbiAgICBEZXNjZW5kXG59XG5cbmV4cG9ydCBlbnVtIERhdGVQaWNrZXJIZWFkZXJFdmVudCB7XG4gICAgUHJldmlvdXMsXG4gICAgTmV4dFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFllYXJSYW5nZSB7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbiAgICByYW5nZTogbnVtYmVyW107XG59XG4iXX0=