UNPKG

@danielmoncada/angular-datetime-picker

Version:
215 lines 30 kB
/** * moment-date-time-adapter.class */ import { Inject, Injectable, Optional, InjectionToken } from '@angular/core'; import * as _moment from 'moment'; import { DateTimeAdapter, OWL_DATE_TIME_LOCALE } from '../date-time-adapter.class'; const moment = _moment.default ? _moment.default : _moment; /** InjectionToken for moment date adapter to configure options. */ export const OWL_MOMENT_DATE_TIME_ADAPTER_OPTIONS = new InjectionToken('OWL_MOMENT_DATE_TIME_ADAPTER_OPTIONS', { providedIn: 'root', factory: OWL_MOMENT_DATE_TIME_ADAPTER_OPTIONS_FACTORY }); /** @docs-private */ export function OWL_MOMENT_DATE_TIME_ADAPTER_OPTIONS_FACTORY() { return { useUtc: false, parseStrict: false }; } /** Creates an array and fills it with values. */ function range(length, valueFunction) { const valuesArray = Array(length); for (let i = 0; i < length; i++) { valuesArray[i] = valueFunction(i); } return valuesArray; } export class MomentDateTimeAdapter extends DateTimeAdapter { constructor(owlDateTimeLocale, options) { super(); this.owlDateTimeLocale = owlDateTimeLocale; this.options = options; this.setLocale(owlDateTimeLocale || moment.locale()); } setLocale(locale) { super.setLocale(locale); const momentLocaleData = moment.localeData(locale); this._localeData = { longMonths: momentLocaleData.months(), shortMonths: momentLocaleData.monthsShort(), longDaysOfWeek: momentLocaleData.weekdays(), shortDaysOfWeek: momentLocaleData.weekdaysShort(), narrowDaysOfWeek: momentLocaleData.weekdaysMin(), dates: range(31, (i) => this.createDate(2017, 0, i + 1).format('D')), }; } getYear(date) { return this.clone(date).year(); } getMonth(date) { return this.clone(date).month(); } getDay(date) { return this.clone(date).day(); } getDate(date) { return this.clone(date).date(); } getHours(date) { return this.clone(date).hours(); } getMinutes(date) { return this.clone(date).minutes(); } getSeconds(date) { return this.clone(date).seconds(); } getTime(date) { return this.clone(date).valueOf(); } getNumDaysInMonth(date) { return this.clone(date).daysInMonth(); } differenceInCalendarDays(dateLeft, dateRight) { return this.clone(dateLeft).diff(dateRight, 'days'); } getYearName(date) { return this.clone(date).format('YYYY'); } getMonthNames(style) { return style === 'long' ? this._localeData.longMonths : this._localeData.shortMonths; } getDayOfWeekNames(style) { if (style === 'long') { return this._localeData.longDaysOfWeek; } if (style === 'short') { return this._localeData.shortDaysOfWeek; } return this._localeData.narrowDaysOfWeek; } getDateNames() { return this._localeData.dates; } toIso8601(date) { return this.clone(date).format(); } isEqual(dateLeft, dateRight) { if (dateLeft && dateRight) { return this.clone(dateLeft).isSame(this.clone(dateRight)); } return dateLeft === dateRight; } isSameDay(dateLeft, dateRight) { if (dateLeft && dateRight) { return this.clone(dateLeft).isSame(this.clone(dateRight), 'day'); } return dateLeft === dateRight; } isValid(date) { return this.clone(date).isValid(); } invalid() { return moment.invalid(); } isDateInstance(obj) { return moment.isMoment(obj); } addCalendarYears(date, amount) { return this.clone(date).add({ years: amount }); } addCalendarMonths(date, amount) { return this.clone(date).add({ months: amount }); } addCalendarDays(date, amount) { return this.clone(date).add({ days: amount }); } setHours(date, amount) { return this.clone(date).hours(amount); } setMinutes(date, amount) { return this.clone(date).minutes(amount); } setSeconds(date, amount) { return this.clone(date).seconds(amount); } createDate(year, month, date, hours = 0, minutes = 0, seconds = 0) { if (month < 0 || month > 11) { throw Error(`Invalid month index "${month}". Month index has to be between 0 and 11.`); } if (date < 1) { throw Error(`Invalid date "${date}". Date has to be greater than 0.`); } if (hours < 0 || hours > 23) { throw Error(`Invalid hours "${hours}". Hours has to be between 0 and 23.`); } if (minutes < 0 || minutes > 59) { throw Error(`Invalid minutes "${minutes}". Minutes has to between 0 and 59.`); } if (seconds < 0 || seconds > 59) { throw Error(`Invalid seconds "${seconds}". Seconds has to be between 0 and 59.`); } const result = this.createMoment({ year, month, date, hours, minutes, seconds }).locale(this.getLocale()); // If the result isn't valid, the date must have been out of bounds for this month. if (!result.isValid()) { throw Error(`Invalid date "${date}" for month with index "${month}".`); } return result; } clone(date) { return this.createMoment(date).clone().locale(this.getLocale()); } now() { return this.createMoment().locale(this.getLocale()); } format(date, displayFormat) { date = this.clone(date); if (!this.isValid(date)) { throw Error('MomentDateTimeAdapter: Cannot format invalid date.'); } return date.format(displayFormat); } parse(value, parseFormat) { if (value && typeof value === 'string') { return this.createMoment(value, parseFormat, this.getLocale(), this.parseStrict); } return value ? this.createMoment(value).locale(this.getLocale()) : null; } get parseStrict() { return this.options && this.options.parseStrict; } /** * Returns the given value if given a valid Moment or null. Deserializes valid ISO 8601 strings * (https://www.ietf.org/rfc/rfc3339.txt) and valid Date objects into valid Moments and empty * string into null. Returns an invalid date for all other values. */ deserialize(value) { let date; if (value instanceof Date) { date = this.createMoment(value); } if (typeof value === 'string') { if (!value) { return null; } date = this.createMoment(value, moment.ISO_8601, this.parseStrict).locale(this.getLocale()); } if (date && this.isValid(date)) { return date; } return super.deserialize(value); } /** Creates a Moment instance while respecting the current UTC settings. */ createMoment(...args) { return (this.options && this.options.useUtc) ? moment.utc(...args) : moment(...args); } } MomentDateTimeAdapter.decorators = [ { type: Injectable } ]; MomentDateTimeAdapter.ctorParameters = () => [ { type: String, decorators: [{ type: Optional }, { type: Inject, args: [OWL_DATE_TIME_LOCALE,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [OWL_MOMENT_DATE_TIME_ADAPTER_OPTIONS,] }] } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9tZW50LWRhdGUtdGltZS1hZGFwdGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGlja2VyL3NyYy9saWIvZGF0ZS10aW1lL2FkYXB0ZXIvbW9tZW50LWFkYXB0ZXIvbW9tZW50LWRhdGUtdGltZS1hZGFwdGVyLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUVsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbkYsTUFBTSxNQUFNLEdBQUksT0FBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUUsT0FBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBbUI3RSxtRUFBbUU7QUFDbkUsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQUcsSUFBSSxjQUFjLENBQ2xFLHNDQUFzQyxFQUFFO0lBQ3BDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSw0Q0FBNEM7Q0FDeEQsQ0FBQyxDQUFDO0FBRVAsb0JBQW9CO0FBQ3BCLE1BQU0sVUFBVSw0Q0FBNEM7SUFDeEQsT0FBTztRQUNILE1BQU0sRUFBRSxLQUFLO1FBQ2IsV0FBVyxFQUFFLEtBQUs7S0FDckIsQ0FBQztBQUNOLENBQUM7QUFFRCxpREFBaUQ7QUFDakQsU0FBUyxLQUFLLENBQUksTUFBYyxFQUFFLGFBQW1DO0lBQ2pFLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzdCLFdB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QUFDLG9CQUFvQjs0Q0FDdkMsUUFBUSxZQUFJLE1BQU0sU0FBQyxvQ0FBb0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG1vbWVudC1kYXRlLXRpbWUtYWRhcHRlci5jbGFzc1xuICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBfbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgRGF0ZVRpbWVBZGFwdGVyLCBPV0xfREFURV9USU1FX0xPQ0FMRSB9IGZyb20gJy4uL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJztcblxuY29uc3QgbW9tZW50ID0gKF9tb21lbnQgYXMgYW55KS5kZWZhdWx0ID8gKF9tb21lbnQgYXMgYW55KS5kZWZhdWx0IDogX21vbWVudDtcblxuLyoqIENvbmZpZ3VyYWJsZSBvcHRpb25zIGZvciB7QHNlZSBNb21lbnREYXRlQWRhcHRlcn0uICovXG5leHBvcnQgaW50ZXJmYWNlIE93bE1vbWVudERhdGVUaW1lQWRhcHRlck9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFR1cm5zIHRoZSB1c2Ugb2YgdXRjIGRhdGVzIG9uIG9yIG9mZi5cbiAgICAgKiBDaGFuZ2luZyB0aGlzIHdpbGwgY2hhbmdlIGhvdyB0aGUgRGF0ZVRpbWVQaWNrZXIgb3V0cHV0IHZhbHVlLlxuICAgICAqIHtAZGVmYXVsdCBmYWxzZX1cbiAgICAgKi9cbiAgICB1c2VVdGM6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBUdXJucyB0aGUgdXNlIG9mIHN0cmljdCBzdHJpbmcgcGFyc2luZyBpbiBtb21lbnQuXG4gICAgICogQ2hhbmdpbmcgdGhpcyB3aWxsIGNoYW5nZSBob3cgdGhlIERhdGVUaW1lUGlja2VyIGludGVycHJldHMgaW5wdXQuXG4gICAgICoge0BkZWZhdWx0IGZhbHNlfVxuICAgICAqL1xuICAgIHBhcnNlU3RyaWN0OiBib29sZWFuO1xufVxuXG4vKiogSW5qZWN0aW9uVG9rZW4gZm9yIG1vbWVudCBkYXRlIGFkYXB0ZXIgdG8gY29uZmlndXJlIG9wdGlvbnMuICovXG5leHBvcnQgY29uc3QgT1dMX01PTUVOVF9EQVRFX1RJTUVfQURBUFRFUl9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuPE93bE1vbWVudERhdGVUaW1lQWRhcHRlck9wdGlvbnM+KFxuICAgICdPV0xfTU9NRU5UX0RBVEVfVElNRV9BREFQVEVSX09QVElPTlMnLCB7XG4gICAgICAgIHByb3ZpZGVkSW46ICdyb290JyxcbiAgICAgICAgZmFjdG9yeTogT1dMX01PTUVOVF9EQVRFX1RJTUVfQURBUFRFUl9PUFRJT05TX0ZBQ1RPUllcbiAgICB9KTtcblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBPV0xfTU9NRU5UX0RBVEVfVElNRV9BREFQVEVSX09QVElPTlNfRkFDVE9SWSgpOiBPd2xNb21lbnREYXRlVGltZUFkYXB0ZXJPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB1c2VVdGM6IGZhbHNlLFxuICAgICAgICBwYXJzZVN0cmljdDogZmFsc2VcbiAgICB9O1xufVxuXG4vKiogQ3JlYXRlcyBhbiBhcnJheSBhbmQgZmlsbHMgaXQgd2l0aCB2YWx1ZXMuICovXG5mdW5jdGlvbiByYW5nZTxUPihsZW5ndGg6IG51bWJlciwgdmFsdWVGdW5jdGlvbjogKGluZGV4OiBudW1iZXIpID0+IFQpOiBUW10ge1xuICAgIGNvbnN0IHZhbHVlc0FycmF5ID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlc0FycmF5W2ldID0gdmFsdWVGdW5jdGlvbihpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlc0FycmF5O1xufVxuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb21lbnREYXRlVGltZUFkYXB0ZXIgZXh0ZW5kcyBEYXRlVGltZUFkYXB0ZXI8TW9tZW50PiB7XG5cbiAgICBwcml2YXRlIF9sb2NhbGVEYXRhOiB7XG4gICAgICAgIGxvbmdNb250aHM6IHN0cmluZ1tdLFxuICAgICAgICBzaG9ydE1vbnRoczogc3RyaW5nW10sXG4gICAgICAgIGxvbmdEYXlzT2ZXZWVrOiBzdHJpbmdbXSxcbiAgICAgICAgc2hvcnREYXlzT2ZXZWVrOiBzdHJpbmdbXSxcbiAgICAgICAgbmFycm93RGF5c09mV2Vlazogc3RyaW5nW10sXG4gICAgICAgIGRhdGVzOiBzdHJpbmdbXSxcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoIEBPcHRpb25hbCgpIEBJbmplY3QoT1dMX0RBVEVfVElNRV9MT0NBTEUpIHByaXZhdGUgb3dsRGF0ZVRpbWVMb2NhbGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChPV0xfTU9NRU5UX0RBVEVfVElNRV9BREFQVEVSX09QVElPTlMpIHByaXZhdGUgb3B0aW9ucz86IE93bE1vbWVudERhdGVUaW1lQWRhcHRlck9wdGlvbnMgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2V0TG9jYWxlKG93bERhdGVUaW1lTG9jYWxlIHx8IG1vbWVudC5sb2NhbGUoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldExvY2FsZSggbG9jYWxlOiBzdHJpbmcgKSB7XG4gICAgICAgIHN1cGVyLnNldExvY2FsZShsb2NhbGUpO1xuXG4gICAgICAgIGNvbnN0IG1vbWVudExvY2FsZURhdGEgPSBtb21lbnQubG9jYWxlRGF0YShsb2NhbGUpO1xuICAgICAgICB0aGlzLl9sb2NhbGVEYXRhID0ge1xuICAgICAgICAgICAgbG9uZ01vbnRoczogbW9tZW50TG9jYWxlRGF0YS5tb250aHMoKSxcbiAgICAgICAgICAgIHNob3J0TW9udGhzOiBtb21lbnRMb2NhbGVEYXRhLm1vbnRoc1Nob3J0KCksXG4gICAgICAgICAgICBsb25nRGF5c09mV2VlazogbW9tZW50TG9jYWxlRGF0YS53ZWVrZGF5cygpLFxuICAgICAgICAgICAgc2hvcnREYXlzT2ZXZWVrOiBtb21lbnRMb2NhbGVEYXRhLndlZWtkYXlzU2hvcnQoKSxcbiAgICAgICAgICAgIG5hcnJvd0RheXNPZldlZWs6IG1vbWVudExvY2FsZURhdGEud2Vla2RheXNNaW4oKSxcbiAgICAgICAgICAgIGRhdGVzOiByYW5nZSgzMSwgKGkpID0+IHRoaXMuY3JlYXRlRGF0ZSgyMDE3LCAwLCBpICsgMSkuZm9ybWF0KCdEJykpLFxuICAgICAgICB9O1xuICAgIH1cblxuXG4gICAgcHVibGljIGdldFllYXIoIGRhdGU6IE1vbWVudCApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZShkYXRlKS55ZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vbnRoKCBkYXRlOiBNb21lbnQgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoZGF0ZSkubW9udGgoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF5KCBkYXRlOiBNb21lbnQgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoZGF0ZSkuZGF5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERhdGUoIGRhdGU6IE1vbWVudCApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZShkYXRlKS5kYXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEhvdXJzKCBkYXRlOiBNb21lbnQgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoZGF0ZSkuaG91cnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWludXRlcyggZGF0ZTogTW9tZW50ICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKGRhdGUpLm1pbnV0ZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2Vjb25kcyggZGF0ZTogTW9tZW50ICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKGRhdGUpLnNlY29uZHMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGltZSggZGF0ZTogTW9tZW50ICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKGRhdGUpLnZhbHVlT2YoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TnVtRGF5c0luTW9udGgoIGRhdGU6IE1vbWVudCApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZShkYXRlKS5kYXlzSW5Nb250aCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoIGRhdGVMZWZ0OiBNb21lbnQsIGRhdGVSaWdodDogTW9tZW50ICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKGRhdGVMZWZ0KS5kaWZmKGRhdGVSaWdodCwgJ2RheXMnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0WWVhck5hbWUoIGRhdGU6IE1vbWVudCApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZShkYXRlKS5mb3JtYXQoJ1lZWVknKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9udGhOYW1lcyggc3R5bGU6ICdsb25nJyB8ICdzaG9ydCcgfCAnbmFycm93JyApOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBzdHlsZSA9PT0gJ2xvbmcnID8gdGhpcy5fbG9jYWxlRGF0YS5sb25nTW9udGhzIDogdGhpcy5fbG9jYWxlRGF0YS5zaG9ydE1vbnRocztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF5T2ZXZWVrTmFtZXMoIHN0eWxlOiAnbG9uZycgfCAnc2hvcnQnIHwgJ25hcnJvdycgKTogc3RyaW5nW10ge1xuICAgICAgICBpZiAoc3R5bGUgPT09ICdsb25nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZURhdGEubG9uZ0RheXNPZldlZWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0eWxlID09PSAnc2hvcnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlRGF0YS5zaG9ydERheXNPZldlZWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZURhdGEubmFycm93RGF5c09mV2VlaztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF0ZU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZURhdGEuZGF0ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSXNvODYwMSggZGF0ZTogTW9tZW50ICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKGRhdGUpLmZvcm1hdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFsKCBkYXRlTGVmdDogTW9tZW50LCBkYXRlUmlnaHQ6IE1vbWVudCApOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoZGF0ZUxlZnQgJiYgZGF0ZVJpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZShkYXRlTGVmdCkuaXNTYW1lKHRoaXMuY2xvbmUoZGF0ZVJpZ2h0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0ZUxlZnQgPT09IGRhdGVSaWdodDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTYW1lRGF5KCBkYXRlTGVmdDogTW9tZW50LCBkYXRlUmlnaHQ6IE1vbWVudCApOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoZGF0ZUxlZnQgJiYgZGF0ZVJpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZShkYXRlTGVmdCkuaXNTYW1lKHRoaXMuY2xvbmUoZGF0ZVJpZ2h0KSwgJ2RheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGVMZWZ0ID09PSBkYXRlUmlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQoIGRhdGU6IE1vbWVudCApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoZGF0ZSkuaXNWYWxpZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbnZhbGlkKCk6IE1vbWVudCB7XG4gICAgICAgIHJldHVybiBtb21lbnQuaW52YWxpZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0RhdGVJbnN0YW5jZSggb2JqOiBhbnkgKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtb21lbnQuaXNNb21lbnQob2JqKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ2FsZW5kYXJZZWFycyggZGF0ZTogTW9tZW50LCBhbW91bnQ6IG51bWJlciApOiBNb21lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZShkYXRlKS5hZGQoe3llYXJzOiBhbW91bnR9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ2FsZW5kYXJNb250aHMoIGRhdGU6IE1vbWVudCwgYW1vdW50OiBudW1iZXIgKTogTW9tZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoZGF0ZSkuYWRkKHttb250aHM6IGFtb3VudH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDYWxlbmRhckRheXMoIGRhdGU6IE1vbWVudCwgYW1vdW50OiBudW1iZXIgKTogTW9tZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoZGF0ZSkuYWRkKHtkYXlzOiBhbW91bnR9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SG91cnMoIGRhdGU6IE1vbWVudCwgYW1vdW50OiBudW1iZXIgKTogTW9tZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoZGF0ZSkuaG91cnMoYW1vdW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TWludXRlcyggZGF0ZTogTW9tZW50LCBhbW91bnQ6IG51bWJlciApOiBNb21lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZShkYXRlKS5taW51dGVzKGFtb3VudCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFNlY29uZHMoIGRhdGU6IE1vbWVudCwgYW1vdW50OiBudW1iZXIgKTogTW9tZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoZGF0ZSkuc2Vjb25kcyhhbW91bnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVEYXRlKCB5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRhdGU6IG51bWJlciApOiBNb21lbnQ7XG4gICAgcHVibGljIGNyZWF0ZURhdGUoIHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF0ZTogbnVtYmVyLCBob3VyczogbnVtYmVyID0gMCwgbWludXRlczogbnVtYmVyID0gMCwgc2Vjb25kczogbnVtYmVyID0gMCApOiBNb21lbnQge1xuICAgICAgICBpZiAobW9udGggPCAwIHx8IG1vbnRoID4gMTEpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG1vbnRoIGluZGV4IFwiJHttb250aH1cIi4gTW9udGggaW5kZXggaGFzIHRvIGJlIGJldHdlZW4gMCBhbmQgMTEuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0ZSA8IDEpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGRhdGUgXCIke2RhdGV9XCIuIERhdGUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiAwLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvdXJzIDwgMCB8fCBob3VycyA+IDIzKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBob3VycyBcIiR7aG91cnN9XCIuIEhvdXJzIGhhcyB0byBiZSBiZXR3ZWVuIDAgYW5kIDIzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pbnV0ZXMgPCAwIHx8IG1pbnV0ZXMgPiA1OSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgbWludXRlcyBcIiR7bWludXRlc31cIi4gTWludXRlcyBoYXMgdG8gYmV0d2VlbiAwIGFuZCA1OS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWNvbmRzIDwgMCB8fCBzZWNvbmRzID4gNTkpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIHNlY29uZHMgXCIke3NlY29uZHN9XCIuIFNlY29uZHMgaGFzIHRvIGJlIGJldHdlZW4gMCBhbmQgNTkuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNyZWF0ZU1vbWVudCh7eWVhciwgbW9udGgsIGRhdGUsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzfSkubG9jYWxlKHRoaXMuZ2V0TG9jYWxlKCkpO1xuXG4gICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXNuJ3QgdmFsaWQsIHRoZSBkYXRlIG11c3QgaGF2ZSBiZWVuIG91dCBvZiBib3VuZHMgZm9yIHRoaXMgbW9udGguXG4gICAgICAgIGlmICghcmVzdWx0LmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgZGF0ZSBcIiR7ZGF0ZX1cIiBmb3IgbW9udGggd2l0aCBpbmRleCBcIiR7bW9udGh9XCIuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9uZSggZGF0ZTogTW9tZW50ICk6IE1vbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU1vbWVudChkYXRlKS5jbG9uZSgpLmxvY2FsZSh0aGlzLmdldExvY2FsZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbm93KCk6IE1vbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU1vbWVudCgpLmxvY2FsZSh0aGlzLmdldExvY2FsZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0KCBkYXRlOiBNb21lbnQsIGRpc3BsYXlGb3JtYXQ6IGFueSApOiBzdHJpbmcge1xuICAgICAgICBkYXRlID0gdGhpcy5jbG9uZShkYXRlKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoZGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNb21lbnREYXRlVGltZUFkYXB0ZXI6IENhbm5vdCBmb3JtYXQgaW52YWxpZCBkYXRlLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlLmZvcm1hdChkaXNwbGF5Rm9ybWF0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UoIHZhbHVlOiBhbnksIHBhcnNlRm9ybWF0OiBhbnkgKTogTW9tZW50IHwgbnVsbCB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVNb21lbnQodmFsdWUsIHBhcnNlRm9ybWF0LCB0aGlzLmdldExvY2FsZSgpLCB0aGlzLnBhcnNlU3RyaWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgPyB0aGlzLmNyZWF0ZU1vbWVudCh2YWx1ZSkubG9jYWxlKHRoaXMuZ2V0TG9jYWxlKCkpIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgcGFyc2VTdHJpY3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnBhcnNlU3RyaWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdpdmVuIHZhbHVlIGlmIGdpdmVuIGEgdmFsaWQgTW9tZW50IG9yIG51bGwuIERlc2VyaWFsaXplcyB2YWxpZCBJU08gODYwMSBzdHJpbmdzXG4gICAgICogKGh0dHBzOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzMzM5LnR4dCkgYW5kIHZhbGlkIERhdGUgb2JqZWN0cyBpbnRvIHZhbGlkIE1vbWVudHMgYW5kIGVtcHR5XG4gICAgICogc3RyaW5nIGludG8gbnVsbC4gUmV0dXJucyBhbiBpbnZhbGlkIGRhdGUgZm9yIGFsbCBvdGhlciB2YWx1ZXMuXG4gICAgICovXG4gICAgZGVzZXJpYWxpemUoIHZhbHVlOiBhbnkgKTogTW9tZW50IHwgbnVsbCB7XG4gICAgICAgIGxldCBkYXRlO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBkYXRlID0gdGhpcy5jcmVhdGVNb21lbnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRlID0gdGhpcy5jcmVhdGVNb21lbnQodmFsdWUsIG1vbWVudC5JU09fODYwMSwgdGhpcy5wYXJzZVN0cmljdCkubG9jYWxlKHRoaXMuZ2V0TG9jYWxlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlICYmIHRoaXMuaXNWYWxpZChkYXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLmRlc2VyaWFsaXplKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogQ3JlYXRlcyBhIE1vbWVudCBpbnN0YW5jZSB3aGlsZSByZXNwZWN0aW5nIHRoZSBjdXJyZW50IFVUQyBzZXR0aW5ncy4gKi9cbiAgICBwcml2YXRlIGNyZWF0ZU1vbWVudCguLi5hcmdzOiBhbnlbXSk6IE1vbWVudCB7XG4gICAgICAgIHJldHVybiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy51c2VVdGMpID8gbW9tZW50LnV0YyguLi5hcmdzKSA6IG1vbWVudCguLi5hcmdzKTtcbiAgICB9XG59XG4iXX0=