UNPKG

@universal-material/angular

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.1.0.

280 lines 37.1 kB
import { Directive, EventEmitter, Inject, Input, LOCALE_ID, Optional, Output } from '@angular/core'; import { getLocaleFirstDayOfWeek, WeekDay } from '@angular/common'; import { DATEPICKER_DEFAULT_OPTIONS, DefaultDatepickerConfig } from './datepicker-config.model'; import { DatepickerAdapter } from './datepicker-adapter'; import * as i0 from "@angular/core"; import * as i1 from "./default-datepicker-adapter"; import * as i2 from "./datepicker-adapter"; export class DatepickerBaseComponent { get min() { return this._min; } set min(value) { this._min = value; this._minYear = value && value.getUTCFullYear(); this._minMonth = value && value.getUTCMonth(); this._setYearsDisabled(); this._setMonthsDisabled(); this._setDaysDisabled(); } get max() { return this._max; } set max(value) { this._max = value; this._maxYear = value && value.getUTCFullYear(); this._maxMonth = value && value.getUTCMonth(); this._setYearsDisabled(); this._setMonthsDisabled(); this._setDaysDisabled(); } constructor(_locale, _defaultConfig, datepickerAdapter, defaultDatepickerAdapter) { this._locale = _locale; this._defaultConfig = _defaultConfig; this.datepickerAdapter = datepickerAdapter; this._totalDaysOfWeek = 7; this._yearsGroupsCount = 6; this._yearsPerGroup = 4; this.totalVisibleYears = this._yearsGroupsCount * this._yearsPerGroup; this.monthsPerGroup = 4; this._minYear = null; this._minMonth = null; this._maxYear = null; this._maxMonth = null; this.weeks = []; this.yearGroups = []; this.monthGroups = []; this.dayTemplate = null; this.datepickerTitle = 'Select date'; this.hideHeader = false; this.hideClear = false; this.clearLabel = null; this.currentMonthChange = new EventEmitter(); this._min = null; this._max = null; this.date = null; this.dateChange = new EventEmitter(); this.formattedDate = null; this._setInnerConfig(); this.datepickerAdapter = this.datepickerAdapter || defaultDatepickerAdapter; this.weekDayNames = this.datepickerAdapter.getWeekDaysNames(this.firstDayOfWeek); this._setDate(null); this.setYearGroups(this.currentMonth.utcYear - 2); this._setMonthGroups(); } setYearGroups(baseYear) { this.baseYear = baseYear; this.yearGroups.length = 0; for (let g = 0; g < this._yearsGroupsCount; g++) { const yearGroup = []; this.yearGroups.push(yearGroup); for (let y = 0; y < this._yearsPerGroup; y++) { yearGroup.push({ year: baseYear, disabled: this._isYearDisabled(baseYear) }); baseYear++; } } } _setInnerConfig() { const config = { ...DefaultDatepickerConfig, firstDayOfWeek: getLocaleFirstDayOfWeek(this._locale), ...this._defaultConfig }; this.clearLabel = config.clearLabel ?? null; this.hideClear = config.hideClear ?? false; this.firstDayOfWeek = config.firstDayOfWeek; } _setMonthGroups() { let m = 0; while (m < 12) { const monthGroup = []; this.monthGroups.push(monthGroup); for (let i = 0; i < this.monthsPerGroup; i++) { monthGroup.push(this.getMonth(new Date(this.baseYear, m))); m++; } } } setYear(year) { this._setCurrentMonth(new Date(year, this.currentMonth.utcMonth)); } setMonth(month) { this._setCurrentMonth(new Date(this.currentMonth.utcYear, month.utcMonth)); } _setDate(date) { this.date = date; this.formattedDate = this.datepickerAdapter.formatDate(date); date = date || new Date(); this._setCurrentMonth(new Date(date.getUTCFullYear(), date.getUTCMonth())); } getMonth(date) { const month = { date: date, utcYear: date.getUTCFullYear(), utcMonth: date.getUTCMonth(), name: this.datepickerAdapter.getMonthName(date), nameWithYear: this.datepickerAdapter.getMonthWithYear(date), formattedYear: this.datepickerAdapter.getYear(date), disabled: false }; month.disabled = this._isMonthDisabled(month); return month; } _addToCurrentMonth(value) { this._setCurrentMonth(new Date(this.currentMonth.utcYear, this.currentMonth.utcMonth + value)); } _getCurrentMonthInitialDate() { return new Date(this.currentMonth.utcYear, this.currentMonth.utcMonth); } _getInitialDateForCurrentMonth() { const currentMonthInitialDate = this._getCurrentMonthInitialDate(); if (currentMonthInitialDate.getDay() === this.firstDayOfWeek) { return currentMonthInitialDate; } if (currentMonthInitialDate.getDay() > this.firstDayOfWeek) { currentMonthInitialDate .setDate(currentMonthInitialDate.getDate() - (currentMonthInitialDate.getDay() - this.firstDayOfWeek)); } else { currentMonthInitialDate .setDate(currentMonthInitialDate.getDate() - (WeekDay.Saturday - (this.firstDayOfWeek - currentMonthInitialDate.getDay() - 1))); } return currentMonthInitialDate; } _setCurrentMonth(date) { const previousMonth = this.currentMonth; const newMonth = this.getMonth(date); if (previousMonth && previousMonth.date.getTime() === newMonth.date.getTime()) { return; } this.currentMonth = newMonth; this.currentMonthChange.emit(this.currentMonth); this.weeks.length = 0; const processDate = new Date(this._getInitialDateForCurrentMonth()); do { const currentWeek = { baseDate: new Date(processDate), days: [] }; this.weeks.push(currentWeek); for (let i = 0; i < this._totalDaysOfWeek; i++) { const dayDate = new Date(processDate); currentWeek.days.push({ date: dayDate, outsideMonth: processDate.getMonth() !== this.currentMonth.utcMonth, disabled: this._isDayDisabled(dayDate) }); processDate.setDate(processDate.getDate() + 1); } } while (processDate.getUTCMonth() === this.currentMonth.utcMonth); this._setMonthsDisabled(); } showNextMonth() { this._addToCurrentMonth(1); } showPreviousMonth() { this._addToCurrentMonth(-1); } _isDayDisabled(date) { return !!this.min && date < this.min || !!this.max && date > this.max; } _setDaysDisabled() { for (const week of this.weeks) { for (const day of week.days) { day.disabled = this._isDayDisabled(day.date); } } } _isMonthDisabled(month) { return this.currentMonth && (this._isYearDisabled(this.currentMonth.utcYear) || (this.currentMonth.utcYear === this._minYear && month.utcMonth < this._minMonth) || (this.currentMonth.utcYear === this._maxYear && month.utcMonth > this._maxMonth)); } _setMonthsDisabled() { for (const monthGroup of this.monthGroups) { for (const month of monthGroup) { month.disabled = this._isMonthDisabled(month); } } } _isYearDisabled(year) { return !!this._minYear && year < this._minYear || !!this._maxYear && year > this._maxYear; } _setYearsDisabled() { for (const yearGroup of this.yearGroups) { for (const year of yearGroup) { year.disabled = this._isYearDisabled(year.year); } } } selectDate(date) { this._setDate(date); this.dateChange.emit(date); } _datesAreEqual(dateA, dateB) { return dateA.getUTCMonth() === dateB.getUTCMonth() && dateA.getUTCFullYear() === dateB.getUTCFullYear() && dateA.getDate() === dateB.getDate(); } isEqualToSelectedDate(date) { return this.date && this._datesAreEqual(this.date, date); } isEqualToTodayDate(date) { return this._datesAreEqual(new Date(), date); } trackByWeek(index, week) { return week.baseDate.getTime(); } trackByDay(index, day) { return day.date.getTime(); } ngOnChanges(changes) { let dateChange = changes['date']; if (dateChange && dateChange.currentValue && dateChange.currentValue !== dateChange.previousValue) { this._setDate(dateChange.currentValue); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatepickerBaseComponent, deps: [{ token: LOCALE_ID }, { token: DATEPICKER_DEFAULT_OPTIONS, optional: true }, { token: DatepickerAdapter, optional: true }, { token: i1.DefaultDatepickerAdapter }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: DatepickerBaseComponent, inputs: { dayTemplate: "dayTemplate", datepickerTitle: "datepickerTitle", hideHeader: "hideHeader", hideClear: "hideClear", clearLabel: "clearLabel", min: "min", max: "max", date: "date" }, outputs: { currentMonthChange: "currentMonthChange", dateChange: "dateChange" }, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatepickerBaseComponent, decorators: [{ type: Directive }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [LOCALE_ID] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DATEPICKER_DEFAULT_OPTIONS] }] }, { type: i2.DatepickerAdapter, decorators: [{ type: Optional }, { type: Inject, args: [DatepickerAdapter] }] }, { type: i1.DefaultDatepickerAdapter }]; }, propDecorators: { dayTemplate: [{ type: Input }], datepickerTitle: [{ type: Input }], hideHeader: [{ type: Input }], hideClear: [{ type: Input }], clearLabel: [{ type: Input }], currentMonthChange: [{ type: Output }], min: [{ type: Input }], max: [{ type: Input }], date: [{ type: Input }], dateChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRlcGlja2VyL2RhdGVwaWNrZXItYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJbkUsT0FBTyxFQUFFLDBCQUEwQixFQUFvQix1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7O0FBTXpELE1BQU0sT0FBZ0IsdUJBQXVCO0lBaUMzQyxJQUNJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLEtBQWtCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQ0ksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsS0FBa0I7UUFDeEIsSUFBSSxDQUFDLElB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O3NCQUROLEtBQUs7Z0JBY0YsR0FBRztzQkFETixLQUFLO2dCQWFHLElBQUk7c0JBQVosS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBEaXJlY3RpdmUsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBMT0NBTEVfSUQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVGVtcGxhdGVSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZ2V0TG9jYWxlRmlyc3REYXlPZldlZWssIFdlZWtEYXkgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0IHsgV2VlayB9IGZyb20gJy4vd2Vlay5tb2RlbCc7XHJcbmltcG9ydCB7IERheU9mV2VlayB9IGZyb20gJy4vZGF5LW9mLXdlZWsubW9kZWwnO1xyXG5pbXBvcnQgeyBEQVRFUElDS0VSX0RFRkFVTFRfT1BUSU9OUywgRGF0ZXBpY2tlckNvbmZpZywgRGVmYXVsdERhdGVwaWNrZXJDb25maWcgfSBmcm9tICcuL2RhdGVwaWNrZXItY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0ZXBpY2tlckFkYXB0ZXIgfSBmcm9tICcuL2RhdGVwaWNrZXItYWRhcHRlcic7XHJcbmltcG9ydCB7IERlZmF1bHREYXRlcGlja2VyQWRhcHRlciB9IGZyb20gJy4vZGVmYXVsdC1kYXRlcGlja2VyLWFkYXB0ZXInO1xyXG5pbXBvcnQgeyBNb250aCB9IGZyb20gJy4vbW9udGgubW9kZWwnO1xyXG5pbXBvcnQgeyBZZWFyIH0gZnJvbSAnLi95ZWFyLm1vZGVsJztcclxuXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGF0ZXBpY2tlckJhc2VDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RvdGFsRGF5c09mV2VlayA9IDc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfeWVhcnNHcm91cHNDb3VudCA9IDY7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfeWVhcnNQZXJHcm91cCA9IDQ7XHJcblxyXG4gIHJlYWRvbmx5IHdlZWtEYXlOYW1lczogc3RyaW5nW107XHJcbiAgcmVhZG9ubHkgdG90YWxWaXNpYmxlWWVhcnMgPSB0aGlzLl95ZWFyc0dyb3Vwc0NvdW50ICogdGhpcy5feWVhcnNQZXJHcm91cDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBtb250aHNQZXJHcm91cCA9IDQ7XHJcblxyXG4gIHByaXZhdGUgX21pblllYXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX21pbk1vbnRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9tYXhZZWFyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9tYXhNb250aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHdlZWtzOiBXZWVrW10gPSBbXTtcclxuICB5ZWFyR3JvdXBzOiBZZWFyW11bXSA9IFtdO1xyXG4gIG1vbnRoR3JvdXBzOiBNb250aFtdW10gPSBbXTtcclxuICBjdXJyZW50TW9udGghOiBNb250aDtcclxuICBiYXNlWWVhciE6IG51bWJlcjtcclxuICBmaXJzdERheU9mV2VlayE6IG51bWJlcjtcclxuXHJcbiAgQElucHV0KCkgZGF5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPERheU9mV2Vlaz4gfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBkYXRlcGlja2VyVGl0bGU6IHN0cmluZyA9ICdTZWxlY3QgZGF0ZSc7XHJcbiAgQElucHV0KCkgaGlkZUhlYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGhpZGVDbGVhcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNsZWFyTGFiZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBAT3V0cHV0KCkgY3VycmVudE1vbnRoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNb250aD4oKTtcclxuXHJcbiAgX21pbjogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gIF9tYXg6IERhdGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgbWluKCk6IERhdGUgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9taW47XHJcbiAgfVxyXG4gIHNldCBtaW4odmFsdWU6IERhdGUgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcclxuICAgIHRoaXMuX21pblllYXIgPSB2YWx1ZSAmJiB2YWx1ZS5nZXRVVENGdWxsWWVhcigpO1xyXG4gICAgdGhpcy5fbWluTW9udGggPSB2YWx1ZSAmJiB2YWx1ZS5nZXRVVENNb250aCgpO1xyXG4gICAgdGhpcy5fc2V0WWVhcnNEaXNhYmxlZCgpO1xyXG4gICAgdGhpcy5fc2V0TW9udGhzRGlzYWJsZWQoKTtcclxuICAgIHRoaXMuX3NldERheXNEaXNhYmxlZCgpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgbWF4KCk6IERhdGUgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXg7XHJcbiAgfVxyXG4gIHNldCBtYXgodmFsdWU6IERhdGUgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcclxuICAgIHRoaXMuX21heFllYXIgPSB2YWx1ZSAmJiB2YWx1ZS5nZXRVVENGdWxsWWVhcigpO1xyXG4gICAgdGhpcy5fbWF4TW9udGggPSB2YWx1ZSAmJiB2YWx1ZS5nZXRVVENNb250aCgpO1xyXG4gICAgdGhpcy5fc2V0WWVhcnNEaXNhYmxlZCgpO1xyXG4gICAgdGhpcy5fc2V0TW9udGhzRGlzYWJsZWQoKTtcclxuICAgIHRoaXMuX3NldERheXNEaXNhYmxlZCgpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgZGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIGZvcm1hdHRlZERhdGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSByZWFkb25seSBfbG9jYWxlOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEQVRFUElDS0VSX0RFRkFVTFRfT1BUSU9OUykgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdENvbmZpZzogRGF0ZXBpY2tlckNvbmZpZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERhdGVwaWNrZXJBZGFwdGVyKSBwcml2YXRlIHJlYWRvbmx5IGRhdGVwaWNrZXJBZGFwdGVyOiBEYXRlcGlja2VyQWRhcHRlcixcclxuICAgICAgICAgICAgICBkZWZhdWx0RGF0ZXBpY2tlckFkYXB0ZXI6IERlZmF1bHREYXRlcGlja2VyQWRhcHRlcikge1xyXG4gICAgdGhpcy5fc2V0SW5uZXJDb25maWcoKTtcclxuICAgIHRoaXMuZGF0ZXBpY2tlckFkYXB0ZXIgPSB0aGlzLmRhdGVwaWNrZXJBZGFwdGVyIHx8IGRlZmF1bHREYXRlcGlja2VyQWRhcHRlcjtcclxuXHJcbiAgICB0aGlzLndlZWtEYXlOYW1lcyA9IHRoaXMuZGF0ZXBpY2tlckFkYXB0ZXIuZ2V0V2Vla0RheXNOYW1lcyh0aGlzLmZpcnN0RGF5T2ZXZWVrKTtcclxuXHJcbiAgICB0aGlzLl9zZXREYXRlKG51bGwpO1xyXG4gICAgdGhpcy5zZXRZZWFyR3JvdXBzKHRoaXMuY3VycmVudE1vbnRoLnV0Y1llYXIgLSAyKTtcclxuICAgIHRoaXMuX3NldE1vbnRoR3JvdXBzKCk7XHJcbiAgfVxyXG5cclxuICBzZXRZZWFyR3JvdXBzKGJhc2VZZWFyOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYmFzZVllYXIgPSBiYXNlWWVhcjtcclxuICAgIHRoaXMueWVhckdyb3Vwcy5sZW5ndGggPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGcgPSAwOyBnIDwgdGhpcy5feWVhcnNHcm91cHNDb3VudDsgZysrKSB7XHJcbiAgICAgIGNvbnN0IHllYXJHcm91cDogWWVhcltdID0gW107XHJcblxyXG4gICAgICB0aGlzLnllYXJHcm91cHMucHVzaCh5ZWFyR3JvdXApO1xyXG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuX3llYXJzUGVyR3JvdXA7IHkrKykge1xyXG4gICAgICAgIHllYXJHcm91cC5wdXNoKHtcclxuICAgICAgICAgIHllYXI6IGJhc2VZZWFyLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuX2lzWWVhckRpc2FibGVkKGJhc2VZZWFyKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJhc2VZZWFyKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldElubmVyQ29uZmlnKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29uZmlnOiBEYXRlcGlja2VyQ29uZmlnID0ge1xyXG4gICAgICAuLi5EZWZhdWx0RGF0ZXBpY2tlckNvbmZpZyxcclxuICAgICAgZmlyc3REYXlPZldlZWs6IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrKHRoaXMuX2xvY2FsZSksXHJcbiAgICAgIC4uLnRoaXMuX2RlZmF1bHRDb25maWdcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5jbGVhckxhYmVsID0gY29uZmlnLmNsZWFyTGFiZWwgPz8gbnVsbDtcclxuICAgIHRoaXMuaGlkZUNsZWFyID0gY29uZmlnLmhpZGVDbGVhciA/PyBmYWxzZTtcclxuICAgIHRoaXMuZmlyc3REYXlPZldlZWsgPSBjb25maWcuZmlyc3REYXlPZldlZWshO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0TW9udGhHcm91cHMoKSB7XHJcbiAgICBsZXQgbSA9IDA7XHJcblxyXG4gICAgd2hpbGUgKG0gPCAxMikge1xyXG4gICAgICBjb25zdCBtb250aEdyb3VwOiBNb250aFtdID0gW107XHJcbiAgICAgIHRoaXMubW9udGhHcm91cHMucHVzaChtb250aEdyb3VwKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tb250aHNQZXJHcm91cDsgaSsrKSB7XHJcbiAgICAgICAgbW9udGhHcm91cC5wdXNoKHRoaXMuZ2V0TW9udGgobmV3IERhdGUodGhpcy5iYXNlWWVhciwgbSkpKTtcclxuICAgICAgICBtKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldFllYXIoeWVhcjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9zZXRDdXJyZW50TW9udGgobmV3IERhdGUoeWVhciwgdGhpcy5jdXJyZW50TW9udGgudXRjTW9udGgpKTtcclxuICB9XHJcblxyXG4gIHNldE1vbnRoKG1vbnRoOiBNb250aCkge1xyXG4gICAgdGhpcy5fc2V0Q3VycmVudE1vbnRoKG5ldyBEYXRlKHRoaXMuY3VycmVudE1vbnRoLnV0Y1llYXIsIG1vbnRoLnV0Y01vbnRoKSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX3NldERhdGUoZGF0ZTogRGF0ZSB8IG51bGwpIHtcclxuICAgIHRoaXMuZGF0ZSA9IGRhdGU7XHJcbiAgICB0aGlzLmZvcm1hdHRlZERhdGUgPSB0aGlzLmRhdGVwaWNrZXJBZGFwdGVyLmZvcm1hdERhdGUoZGF0ZSk7XHJcblxyXG4gICAgZGF0ZSA9IGRhdGUgfHwgbmV3IERhdGUoKTtcclxuICAgIHRoaXMuX3NldEN1cnJlbnRNb250aChuZXcgRGF0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIGRhdGUuZ2V0VVRDTW9udGgoKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRNb250aChkYXRlOiBEYXRlKTogTW9udGgge1xyXG4gICAgY29uc3QgbW9udGggPSB7XHJcbiAgICAgIGRhdGU6IGRhdGUsXHJcbiAgICAgIHV0Y1llYXI6IGRhdGUuZ2V0VVRDRnVsbFllYXIoKSxcclxuICAgICAgdXRjTW9udGg6IGRhdGUuZ2V0VVRDTW9udGgoKSxcclxuICAgICAgbmFtZTogdGhpcy5kYXRlcGlja2VyQWRhcHRlci5nZXRNb250aE5hbWUoZGF0ZSksXHJcbiAgICAgIG5hbWVXaXRoWWVhcjogdGhpcy5kYXRlcGlja2VyQWRhcHRlci5nZXRNb250aFdpdGhZZWFyKGRhdGUpLFxyXG4gICAgICBmb3JtYXR0ZWRZZWFyOiB0aGlzLmRhdGVwaWNrZXJBZGFwdGVyLmdldFllYXIoZGF0ZSksXHJcbiAgICAgIGRpc2FibGVkOiBmYWxzZVxyXG4gICAgfTtcclxuXHJcbiAgICBtb250aC5kaXNhYmxlZCA9IHRoaXMuX2lzTW9udGhEaXNhYmxlZChtb250aCk7XHJcblxyXG4gICAgcmV0dXJuIG1vbnRoO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWRkVG9DdXJyZW50TW9udGgodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fc2V0Q3VycmVudE1vbnRoKG5ldyBEYXRlKHRoaXMuY3VycmVudE1vbnRoLnV0Y1llYXIsIHRoaXMuY3VycmVudE1vbnRoLnV0Y01vbnRoICsgdmFsdWUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEN1cnJlbnRNb250aEluaXRpYWxEYXRlKCk6IERhdGUge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuY3VycmVudE1vbnRoLnV0Y1llYXIsIHRoaXMuY3VycmVudE1vbnRoLnV0Y01vbnRoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEluaXRpYWxEYXRlRm9yQ3VycmVudE1vbnRoKCk6IERhdGUge1xyXG4gICAgY29uc3QgY3VycmVudE1vbnRoSW5pdGlhbERhdGUgPSB0aGlzLl9nZXRDdXJyZW50TW9udGhJbml0aWFsRGF0ZSgpO1xyXG5cclxuICAgIGlmIChjdXJyZW50TW9udGhJbml0aWFsRGF0ZS5nZXREYXkoKSA9PT0gdGhpcy5maXJzdERheU9mV2Vlaykge1xyXG4gICAgICByZXR1cm4gY3VycmVudE1vbnRoSW5pdGlhbERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGN1cnJlbnRNb250aEluaXRpYWxEYXRlLmdldERheSgpID4gdGhpcy5maXJzdERheU9mV2VlayEpIHtcclxuICAgICAgY3VycmVudE1vbnRoSW5pdGlhbERhdGVcclxuICAgICAgICAuc2V0RGF0ZShjdXJyZW50TW9udGhJbml0aWFsRGF0ZS5nZXREYXRlKCkgLSAoY3VycmVudE1vbnRoSW5pdGlhbERhdGUuZ2V0RGF5KCkgLSB0aGlzLmZpcnN0RGF5T2ZXZWVrISkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3VycmVudE1vbnRoSW5pdGlhbERhdGVcclxuICAgICAgICAuc2V0RGF0ZShjdXJyZW50TW9udGhJbml0aWFsRGF0ZS5nZXREYXRlKCkgLSAoV2Vla0RheS5TYXR1cmRheSAtICh0aGlzLmZpcnN0RGF5T2ZXZWVrISAtIGN1cnJlbnRNb250aEluaXRpYWxEYXRlLmdldERheSgpIC0gMSkpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3VycmVudE1vbnRoSW5pdGlhbERhdGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRDdXJyZW50TW9udGgoZGF0ZTogRGF0ZSkge1xyXG4gICAgY29uc3QgcHJldmlvdXNNb250aCA9IHRoaXMuY3VycmVudE1vbnRoO1xyXG4gICAgY29uc3QgbmV3TW9udGggPSB0aGlzLmdldE1vbnRoKGRhdGUpO1xyXG5cclxuICAgIGlmIChwcmV2aW91c01vbnRoICYmIHByZXZpb3VzTW9udGguZGF0ZS5nZXRUaW1lKCkgPT09IG5ld01vbnRoLmRhdGUuZ2V0VGltZSgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ld01vbnRoO1xyXG4gICAgdGhpcy5jdXJyZW50TW9udGhDaGFuZ2UuZW1pdCh0aGlzLmN1cnJlbnRNb250aCk7XHJcblxyXG4gICAgdGhpcy53ZWVrcy5sZW5ndGggPSAwO1xyXG4gICAgY29uc3QgcHJvY2Vzc0RhdGUgPSBuZXcgRGF0ZSh0aGlzLl9nZXRJbml0aWFsRGF0ZUZvckN1cnJlbnRNb250aCgpKTtcclxuXHJcbiAgICBkbyB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRXZWVrOiBXZWVrID0ge1xyXG4gICAgICAgIGJhc2VEYXRlOiBuZXcgRGF0ZShwcm9jZXNzRGF0ZSksXHJcbiAgICAgICAgZGF5czogW11cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMud2Vla3MucHVzaChjdXJyZW50V2Vlayk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RvdGFsRGF5c09mV2VlazsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZGF5RGF0ZSA9IG5ldyBEYXRlKHByb2Nlc3NEYXRlKTtcclxuICAgICAgICBjdXJyZW50V2Vlay5kYXlzLnB1c2goe1xyXG4gICAgICAgICAgZGF0ZTogZGF5RGF0ZSxcclxuICAgICAgICAgIG91dHNpZGVNb250aDogcHJvY2Vzc0RhdGUuZ2V0TW9udGgoKSAhPT0gdGhpcy5jdXJyZW50TW9udGgudXRjTW9udGgsXHJcbiAgICAgICAgICBkaXNhYmxlZDogdGhpcy5faXNEYXlEaXNhYmxlZChkYXlEYXRlKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwcm9jZXNzRGF0ZS5zZXREYXRlKHByb2Nlc3NEYXRlLmdldERhdGUoKSArIDEpO1xyXG4gICAgICB9XHJcbiAgICB9IHdoaWxlIChwcm9jZXNzRGF0ZS5nZXRVVENNb250aCgpID09PSB0aGlzLmN1cnJlbnRNb250aC51dGNNb250aCk7XHJcblxyXG4gICAgdGhpcy5fc2V0TW9udGhzRGlzYWJsZWQoKTtcclxuICB9XHJcblxyXG4gIHNob3dOZXh0TW9udGgoKSB7XHJcbiAgICB0aGlzLl9hZGRUb0N1cnJlbnRNb250aCgxKTtcclxuICB9XHJcblxyXG4gIHNob3dQcmV2aW91c01vbnRoKCkge1xyXG4gICAgdGhpcy5fYWRkVG9DdXJyZW50TW9udGgoLTEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNEYXlEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLm1pbiAmJiBkYXRlIDwgdGhpcy5taW4gfHwgISF0aGlzLm1heCAmJiBkYXRlID4gdGhpcy5tYXg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXREYXlzRGlzYWJsZWQoKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IHdlZWsgb2YgdGhpcy53ZWVrcykge1xyXG4gICAgICBmb3IgKGNvbnN0IGRheSBvZiB3ZWVrLmRheXMpIHtcclxuICAgICAgICBkYXkuZGlzYWJsZWQgPSB0aGlzLl9pc0RheURpc2FibGVkKGRheS5kYXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNNb250aERpc2FibGVkKG1vbnRoOiBNb250aCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudE1vbnRoXHJcbiAgICAgICYmICh0aGlzLl9pc1llYXJEaXNhYmxlZCh0aGlzLmN1cnJlbnRNb250aC51dGNZZWFyKVxyXG4gICAgICAgIHx8ICh0aGlzLmN1cnJlbnRNb250aC51dGNZZWFyID09PSB0aGlzLl9taW5ZZWFyICYmIG1vbnRoLnV0Y01vbnRoIDwgdGhpcy5fbWluTW9udGghKVxyXG4gICAgICAgIHx8ICh0aGlzLmN1cnJlbnRNb250aC51dGNZZWFyID09PSB0aGlzLl9tYXhZZWFyICYmIG1vbnRoLnV0Y01vbnRoID4gdGhpcy5fbWF4TW9udGghKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRNb250aHNEaXNhYmxlZCgpOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3QgbW9udGhHcm91cCBvZiB0aGlzLm1vbnRoR3JvdXBzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgbW9udGggb2YgbW9udGhHcm91cCkge1xyXG4gICAgICAgIG1vbnRoLmRpc2FibGVkID0gdGhpcy5faXNNb250aERpc2FibGVkKG1vbnRoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNZZWFyRGlzYWJsZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLl9taW5ZZWFyICYmIHllYXIgPCB0aGlzLl9taW5ZZWFyIHx8ICEhdGhpcy5fbWF4WWVhciAmJiB5ZWFyID4gdGhpcy5fbWF4WWVhcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldFllYXJzRGlzYWJsZWQoKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IHllYXJHcm91cCBvZiB0aGlzLnllYXJHcm91cHMpIHtcclxuICAgICAgZm9yIChjb25zdCB5ZWFyIG9mIHllYXJHcm91cCkge1xyXG4gICAgICAgIHllYXIuZGlzYWJsZWQgPSB0aGlzLl9pc1llYXJEaXNhYmxlZCh5ZWFyLnllYXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3REYXRlKGRhdGU6IERhdGUgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXREYXRlKGRhdGUpO1xyXG4gICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kYXRlc0FyZUVxdWFsKGRhdGVBOiBEYXRlLCBkYXRlQjogRGF0ZSkge1xyXG4gICAgcmV0dXJuIGRhdGVBLmdldFVUQ01vbnRoKCkgPT09IGRhdGVCLmdldFVUQ01vbnRoKClcclxuICAgICAgJiYgZGF0ZUEuZ2V0VVRDRnVsbFllYXIoKSA9PT0gZGF0ZUIuZ2V0VVRDRnVsbFllYXIoKVxyXG4gICAgICAmJiBkYXRlQS5nZXREYXRlKCkgPT09IGRhdGVCLmdldERhdGUoKTtcclxuICB9XHJcblxyXG4gIGlzRXF1YWxUb1NlbGVjdGVkRGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRlICYmIHRoaXMuX2RhdGVzQXJlRXF1YWwodGhpcy5kYXRlLCBkYXRlKTtcclxuICB9XHJcblxyXG4gIGlzRXF1YWxUb1RvZGF5RGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0ZXNBcmVFcXVhbChuZXcgRGF0ZSgpLCBkYXRlKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlXZWVrKGluZGV4OiBudW1iZXIsIHdlZWs6IFdlZWspIHtcclxuICAgIHJldHVybiB3ZWVrLmJhc2VEYXRlLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlEYXkoaW5kZXg6IG51bWJlciwgZGF5OiBEYXlPZldlZWspIHtcclxuICAgIHJldHVybiBkYXkuZGF0ZS5nZXRUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBsZXQgZGF0ZUNoYW5nZSA9IGNoYW5nZXNbJ2RhdGUnXTtcclxuXHJcbiAgICBpZiAoZGF0ZUNoYW5nZSAmJiBkYXRlQ2hhbmdlLmN1cnJlbnRWYWx1ZSAmJiBkYXRlQ2hhbmdlLmN1cnJlbnRWYWx1ZSAhPT0gZGF0ZUNoYW5nZS5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX3NldERhdGUoZGF0ZUNoYW5nZS5jdXJyZW50VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=