UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

285 lines 40.7 kB
import { DateModels } from '../date/DataTypes'; import { formatDate } from '../util'; import { zh_CN } from 'ng-zorro-antd-mobile/locale-provider'; export class CalendarDatePickerBaseComponent { constructor() { this.props = { prefixCls: 'rmc-calendar', infinite: false, infiniteOpt: false, defaultDate: new Date(), initalMonths: 6, locale: zh_CN.Calendar }; this.state = { months: [] }; this.visibleMonth = []; this.getDateWithoutTime = (date) => { if (!date) { return 0; } return +new Date(date.getFullYear(), date.getMonth(), date.getDate()); }; this.genWeekData = (firstDate) => { const minDateTime = this.getDateWithoutTime(this.props.minDate); const maxDateTime = this.getDateWithoutTime(this.props.maxDate) || Number.POSITIVE_INFINITY; const weeks = []; const nextMonth = this.getMonthDate(firstDate, 1).firstDate; let currentDay = firstDate; let currentWeek = []; weeks.push(currentWeek); let startWeekday = currentDay.getDay(); if (startWeekday > 0) { for (let i = 0; i < startWeekday; i++) { currentWeek.push({}); } } while (currentDay < nextMonth) { if (currentWeek.length === 7) { currentWeek = []; weeks.push(currentWeek); } const dayOfMonth = currentDay.getDate(); const tick = +currentDay; currentWeek.push({ tick, dayOfMonth, selected: DateModels.SelectType.None, isFirstOfMonth: dayOfMonth === 1, isLastOfMonth: false, outOfDate: tick < minDateTime || tick > maxDateTime }); const year = currentDay.getFullYear(); const month = currentDay.getMonth(); const date = currentDay.getDate(); currentDay = new Date(year, month, date + 1); } currentWeek[currentWeek.length - 1].isLastOfMonth = true; return weeks; }; this.selectDateRange = (startDate, endDate, clear = false) => { const { getDateExtra, type, onSelectHasDisableDate } = this.props; if (type === 'one') { endDate = undefined; } const time1 = this.getDateWithoutTime(startDate), time2 = this.getDateWithoutTime(endDate); const startDateTick = !time2 || time1 < time2 ? time1 : time2; const endDateTick = time2 && time1 > time2 ? time1 : time2; const startMonthDate = this.getMonthDate(new Date(startDateTick)).firstDate; const endMonthDate = endDateTick ? new Date(endDateTick) : this.getMonthDate(new Date(startDateTick)).lastDate; let unuseable = [], needUpdate = false; this.state.months .filter(m => { return m.firstDate >= startMonthDate && m.firstDate <= endMonthDate; }) .forEach(m => { m.weeks.forEach(w => w .filter(d => { if (!endDateTick) { return d.tick && this.inDate(startDateTick, d.tick); } else { return d.tick && d.tick >= startDateTick && d.tick <= endDateTick; } }) .forEach(d => { const oldValue = d.selected; if (clear) { d.selected = DateModels.SelectType.None; } else { const info = (getDateExtra && getDateExtra(new Date(d.tick))) || {}; if (d.outOfDate || info.disable) { unuseable.push(d.tick); } if (this.inDate(startDateTick, d.tick)) { if (type === 'one') { d.selected = DateModels.SelectType.Single; } else if (!endDateTick) { d.selected = DateModels.SelectType.Only; } else if (startDateTick !== endDateTick) { d.selected = DateModels.SelectType.Start; } else { d.selected = DateModels.SelectType.All; } } else if (this.inDate(endDateTick, d.tick)) { d.selected = DateModels.SelectType.End; } else { d.selected = DateModels.SelectType.Middle; } } needUpdate = needUpdate || d.selected !== oldValue; })); if (needUpdate && m.componentRef) { m.componentRef.updateWeeks(); } }); if (unuseable.length > 0) { if (onSelectHasDisableDate) { onSelectHasDisableDate(unuseable.map(tick => new Date(tick))); } else { console.warn('Unusable date. You can handle by onSelectHasDisableDate.', unuseable); } } }; this.computeVisible = (clientHeight, scrollTop) => { let needUpdate = false; const MAX_VIEW_PORT = clientHeight * 2; const MIN_VIEW_PORT = clientHeight; // 大缓冲区外过滤规则 const filterFunc = (vm) => vm.y && vm.height && vm.y + vm.height > scrollTop - MAX_VIEW_PORT && vm.y < scrollTop + clientHeight + MAX_VIEW_PORT; if (this.props.infiniteOpt && this.visibleMonth.length > 12) { this.visibleMonth = this.visibleMonth.filter(filterFunc).sort((a, b) => +a.firstDate - +b.firstDate); } // 当小缓冲区不满时填充 if (this.visibleMonth.length > 0) { const last = this.visibleMonth[this.visibleMonth.length - 1]; if (last.y !== undefined && last.height && last.y + last.height < scrollTop + clientHeight + MIN_VIEW_PORT) { const lastIndex = this.state.months.indexOf(last); for (let i = 1; i <= 2; i++) { const index = lastIndex + i; if (index < this.state.months.length && this.visibleMonth.indexOf(this.state.months[index]) < 0) { this.visibleMonth.push(this.state.months[index]); } else { if (this.canLoadNext()) { this.genMonthData(undefined, 1); } } } needUpdate = true; } const first = this.visibleMonth[0]; if (first.y !== undefined && first.height && first.y > scrollTop - MIN_VIEW_PORT) { const firstIndex = this.state.months.indexOf(first); for (let i = 1; i <= 2; i++) { const index = firstIndex - i; if (index >= 0 && this.visibleMonth.indexOf(this.state.months[index]) < 0) { this.visibleMonth.unshift(this.state.months[index]); needUpdate = true; } } } } else if (this.state.months.length > 0) { this.visibleMonth = this.state.months.filter(filterFunc); needUpdate = true; } return needUpdate; }; this.createOnScroll = () => { // let timer: any; let clientHeight = 0, scrollTop = 0; return (data) => { const { client, top } = data; clientHeight = client; scrollTop = top; this.computeVisible(clientHeight, scrollTop); // 以上方法目前无问题,如果后续有性能问题,改用如下方法,但以下方法会导致刷新稍微延迟现象 // if (timer) { // return; // } // // timer = setTimeout(() => { // timer = undefined; // // if (this.computeVisible(clientHeight, scrollTop)) { // console.log('update dom'); // } // }, 50); }; }; this.baseOnCellClick = (day) => { if (!day.tick) { return; } if (this.props.onCellClick) { this.props.onCellClick(new Date(day.tick)); } }; } init() { const { initalMonths = 6, defaultDate } = this.props; for (let i = 0; i < initalMonths; i++) { if (this.canLoadNext()) { this.genMonthData(defaultDate, i); } } this.visibleMonth = [...this.state.months]; } receiveProps(oldValue, newValue) { if (oldValue && newValue) { if (oldValue.startDate !== newValue.startDate || oldValue.endDate !== newValue.endDate) { if (oldValue.startDate) { this.selectDateRange(oldValue.startDate, oldValue.endDate, true); } if (newValue.startDate) { this.selectDateRange(newValue.startDate, newValue.endDate); } } } } getMonthDate(date = new Date(), addMonth = 0) { const y = date.getFullYear(), m = date.getMonth(); return { firstDate: new Date(y, m + addMonth, 1), lastDate: new Date(y, m + 1 + addMonth, 0) }; } canLoadPrev() { const { minDate } = this.props; return (!minDate || this.state.months.length <= 0 || +this.getMonthDate(minDate).firstDate < +this.state.months[0].firstDate); } canLoadNext() { const { maxDate } = this.props; return (!maxDate || this.state.months.length <= 0 || +this.getMonthDate(maxDate).firstDate > +this.state.months[this.state.months.length - 1].firstDate); } genMonthData(date, addMonth = 0) { if (!date) { date = addMonth >= 0 ? this.state.months[this.state.months.length - 1].firstDate : this.state.months[0].firstDate; } if (!date) { date = new Date(); } const { locale } = this.props; const { firstDate, lastDate } = this.getMonthDate(date, addMonth); const weeks = this.genWeekData(firstDate); const title = formatDate(firstDate, locale ? locale.monthTitle : 'yyyy/MM', this.props.locale); const data = { title, firstDate, lastDate, weeks }; data.component = this.genMonthComponent(data); if (addMonth >= 0) { this.state.months.push(data); } else { this.state.months.unshift(data); } const { startDate, endDate } = this.props; if (startDate) { this.selectDateRange(startDate, endDate); } return data; } inDate(date, tick) { return date <= tick && tick < date + 24 * 3600000; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvbXBvbmVudHMvY2FsZW5kYXIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQU03RCxNQUFNLE9BQU8sK0JBQStCO0lBaUIxQztRQWhCQSxVQUFLLEdBQUc7WUFDTixTQUFTLEVBQUUsY0FBYztZQUN6QixRQUFRLEVBQUUsS0FBSztZQUNmLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtZQUN2QixZQUFZLEVBQUUsQ0FBQztZQUNmLE1BQU0sRUFBRSxLQUFLLENBQUMsUUFBUTtTQUNBLENBQUM7UUFFekIsVUFBSyxHQUFRO1lBQ1gsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDO1FBRUYsaUJBQVksR0FBMkIsRUFBRSxDQUFDO1FBdUQxQyx1QkFBa0IsR0FBRyxDQUFDLElBQVcsRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLENBQUM7YUFDVjtZQUNELE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQztRQUVGLGdCQUFXLEdBQUcsQ0FBQyxTQUFlLEVBQUUsRUFBRTtZQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMs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QUksR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ3BELENBQUM7Q0FpS0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlTW9kZWxzIH0gZnJvbSAnLi4vZGF0ZS9EYXRhVHlwZXMnO1xuaW1wb3J0IHsgRGF0ZXBpY2tlclByb3BzVHlwZSB9IGZyb20gJy4vZGF0ZXBpY2tlci5wcm9wcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgemhfQ04gfSBmcm9tICduZy16b3Jyby1hbnRkLW1vYmlsZS9sb2NhbGUtcHJvdmlkZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVwaWNrZXJTdGF0ZVR5cGUge1xuICBtb250aHM6IERhdGVNb2RlbHMuTW9udGhEYXRhW107XG59XG5cbmV4cG9ydCBjbGFzcyBDYWxlbmRhckRhdGVQaWNrZXJCYXNlQ29tcG9uZW50IHtcbiAgcHJvcHMgPSB7XG4gICAgcHJlZml4Q2xzOiAncm1jLWNhbGVuZGFyJyxcbiAgICBpbmZpbml0ZTogZmFsc2UsXG4gICAgaW5maW5pdGVPcHQ6IGZhbHNlLFxuICAgIGRlZmF1bHREYXRlOiBuZXcgRGF0ZSgpLFxuICAgIGluaXRhbE1vbnRoczogNixcbiAgICBsb2NhbGU6IHpoX0NOLkNhbGVuZGFyXG4gIH0gYXMgRGF0ZXBpY2tlclByb3BzVHlwZTtcblxuICBzdGF0ZTogYW55ID0ge1xuICAgIG1vbnRoczogW11cbiAgfTtcblxuICB2aXNpYmxlTW9udGg6IERhdGVNb2RlbHMuTW9udGhEYXRhW10gPSBbXTtcbiAgZ2VuTW9udGhDb21wb25lbnQ6IChkYXRhKSA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgaW5pdCgpIHtcbiAgICBjb25zdCB7IGluaXRhbE1vbnRocyA9IDYsIGRlZmF1bHREYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5pdGFsTW9udGhzOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNhbkxvYWROZXh0KCkpIHtcbiAgICAgICAgdGhpcy5nZW5Nb250aERhdGEoZGVmYXVsdERhdGUsIGkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnZpc2libGVNb250aCA9IFsuLi50aGlzLnN0YXRlLm1vbnRoc107XG4gIH1cblxuICByZWNlaXZlUHJvcHMob2xkVmFsdWU6IERhdGVwaWNrZXJQcm9wc1R5cGUsIG5ld1ZhbHVlOiBEYXRlcGlja2VyUHJvcHNUeXBlKSB7XG4gICAgaWYgKG9sZFZhbHVlICYmIG5ld1ZhbHVlKSB7XG4gICAgICBpZiAob2xkVmFsdWUuc3RhcnREYXRlICE9PSBuZXdWYWx1ZS5zdGFydERhdGUgfHwgb2xkVmFsdWUuZW5kRGF0ZSAhPT0gbmV3VmFsdWUuZW5kRGF0ZSkge1xuICAgICAgICBpZiAob2xkVmFsdWUuc3RhcnREYXRlKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3REYXRlUmFuZ2Uob2xkVmFsdWUuc3RhcnREYXRlLCBvbGRWYWx1ZS5lbmREYXRlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3VmFsdWUuc3RhcnREYXRlKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3REYXRlUmFuZ2UobmV3VmFsdWUuc3RhcnREYXRlLCBuZXdWYWx1ZS5lbmREYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldE1vbnRoRGF0ZShkYXRlID0gbmV3IERhdGUoKSwgYWRkTW9udGggPSAwKSB7XG4gICAgY29uc3QgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIG0gPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpcnN0RGF0ZTogbmV3IERhdGUoeSwgbSArIGFkZE1vbnRoLCAxKSxcbiAgICAgIGxhc3REYXRlOiBuZXcgRGF0ZSh5LCBtICsgMSArIGFkZE1vbnRoLCAwKVxuICAgIH07XG4gIH1cblxuICBjYW5Mb2FkUHJldigpIHtcbiAgICBjb25zdCB7IG1pbkRhdGUgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgICFtaW5EYXRlIHx8XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy5sZW5ndGggPD0gMCB8fFxuICAgICAgK3RoaXMuZ2V0TW9udGhEYXRlKG1pbkRhdGUpLmZpcnN0RGF0ZSA8ICt0aGlzLnN0YXRlLm1vbnRoc1swXS5maXJzdERhdGVcbiAgICApO1xuICB9XG5cbiAgY2FuTG9hZE5leHQoKSB7XG4gICAgY29uc3QgeyBtYXhEYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICAhbWF4RGF0ZSB8fFxuICAgICAgdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoIDw9IDAgfHxcbiAgICAgICt0aGlzLmdldE1vbnRoRGF0ZShtYXhEYXRlKS5maXJzdERhdGUgPiArdGhpcy5zdGF0ZS5tb250aHNbdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoIC0gMV0uZmlyc3REYXRlXG4gICAgKTtcbiAgfVxuXG4gIGdldERhdGVXaXRob3V0VGltZSA9IChkYXRlPzogRGF0ZSkgPT4ge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiArbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcbiAgfTtcblxuICBnZW5XZWVrRGF0YSA9IChmaXJzdERhdGU6IERhdGUpID0+IHtcbiAgICBjb25zdCBtaW5EYXRlVGltZSA9IHRoaXMuZ2V0RGF0ZVdpdGhvdXRUaW1lKHRoaXMucHJvcHMubWluRGF0ZSk7XG4gICAgY29uc3QgbWF4RGF0ZVRpbWUgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZSh0aGlzLnByb3BzLm1heERhdGUpIHx8IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgIGNvbnN0IHdlZWtzOiBEYXRlTW9kZWxzLkNlbGxEYXRhW11bXSA9IFtdO1xuICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0TW9udGhEYXRlKGZpcnN0RGF0ZSwgMSkuZmlyc3REYXRlO1xuICAgIGxldCBjdXJyZW50RGF5ID0gZmlyc3REYXRlO1xuICAgIGxldCBjdXJyZW50V2VlazogRGF0ZU1vZGVscy5DZWxsRGF0YVtdID0gW107XG4gICAgd2Vla3MucHVzaChjdXJyZW50V2Vlayk7XG5cbiAgICBsZXQgc3RhcnRXZWVrZGF5ID0gY3VycmVudERheS5nZXREYXkoKTtcbiAgICBpZiAoc3RhcnRXZWVrZGF5ID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydFdlZWtkYXk7IGkrKykge1xuICAgICAgICBjdXJyZW50V2Vlay5wdXNoKHt9IGFzIERhdGVNb2RlbHMuQ2VsbERhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoY3VycmVudERheSA8IG5leHRNb250aCkge1xuICAgICAgaWYgKGN1cnJlbnRXZWVrLmxlbmd0aCA9PT0gNykge1xuICAgICAgICBjdXJyZW50V2VlayA9IFtdO1xuICAgICAgICB3ZWVrcy5wdXNoKGN1cnJlbnRXZWVrKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRheU9mTW9udGggPSBjdXJyZW50RGF5LmdldERhdGUoKTtcbiAgICAgIGNvbnN0IHRpY2sgPSArY3VycmVudERheTtcbiAgICAgIGN1cnJlbnRXZWVrLnB1c2goe1xuICAgICAgICB0aWNrLFxuICAgICAgICBkYXlPZk1vbnRoLFxuICAgICAgICBzZWxlY3RlZDogRGF0ZU1vZGVscy5TZWxlY3RUeXBlLk5vbmUsXG4gICAgICAgIGlzRmlyc3RPZk1vbnRoOiBkYXlPZk1vbnRoID09PSAxLFxuICAgICAgICBpc0xhc3RPZk1vbnRoOiBmYWxzZSxcbiAgICAgICAgb3V0T2ZEYXRlOiB0aWNrIDwgbWluRGF0ZVRpbWUgfHwgdGljayA+IG1heERhdGVUaW1lXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHllYXIgPSBjdXJyZW50RGF5LmdldEZ1bGxZZWFyKCk7XG4gICAgICBjb25zdCBtb250aCA9IGN1cnJlbnREYXkuZ2V0TW9udGgoKTtcbiAgICAgIGNvbnN0IGRhdGUgPSBjdXJyZW50RGF5LmdldERhdGUoKTtcbiAgICAgIGN1cnJlbnREYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSArIDEpO1xuICAgIH1cbiAgICBjdXJyZW50V2Vla1tjdXJyZW50V2Vlay5sZW5ndGggLSAxXS5pc0xhc3RPZk1vbnRoID0gdHJ1ZTtcbiAgICByZXR1cm4gd2Vla3M7XG4gIH07XG5cbiAgZ2VuTW9udGhEYXRhKGRhdGU/OiBEYXRlLCBhZGRNb250aDogbnVtYmVyID0gMCkge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgZGF0ZSA9IGFkZE1vbnRoID49IDAgPyB0aGlzLnN0YXRlLm1vbnRoc1t0aGlzLnN0YXRlLm1vbnRocy5sZW5ndGggLSAxXS5maXJzdERhdGUgOiB0aGlzLnN0YXRlLm1vbnRoc1swXS5maXJzdERhdGU7XG4gICAgfVxuICAgIGlmICghZGF0ZSkge1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxuICAgIGNvbnN0IHsgbG9jYWxlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgZmlyc3REYXRlLCBsYXN0RGF0ZSB9ID0gdGhpcy5nZXRNb250aERhdGUoZGF0ZSwgYWRkTW9udGgpO1xuICAgIGNvbnN0IHdlZWtzID0gdGhpcy5nZW5XZWVrRGF0YShmaXJzdERhdGUpO1xuICAgIGNvbnN0IHRpdGxlID0gZm9ybWF0RGF0ZShmaXJzdERhdGUsIGxvY2FsZSA/IGxvY2FsZS5tb250aFRpdGxlIDogJ3l5eXkvTU0nLCB0aGlzLnByb3BzLmxvY2FsZSk7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHRpdGxlLFxuICAgICAgZmlyc3REYXRlLFxuICAgICAgbGFzdERhdGUsXG4gICAgICB3ZWVrc1xuICAgIH0gYXMgRGF0ZU1vZGVscy5Nb250aERhdGE7XG4gICAgZGF0YS5jb21wb25lbnQgPSB0aGlzLmdlbk1vbnRoQ29tcG9uZW50KGRhdGEpO1xuICAgIGlmIChhZGRNb250aCA+PSAwKSB7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy5wdXNoKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRocy51bnNoaWZ0KGRhdGEpO1xuICAgIH1cbiAgICBjb25zdCB7IHN0YXJ0RGF0ZSwgZW5kRGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdERhdGVSYW5nZShzdGFydERhdGUsIGVuZERhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGluRGF0ZShkYXRlOiBudW1iZXIsIHRpY2s6IG51bWJlcikge1xuICAgIHJldHVybiBkYXRlIDw9IHRpY2sgJiYgdGljayA8IGRhdGUgKyAyNCAqIDM2MDAwMDA7XG4gIH1cblxuICBzZWxlY3REYXRlUmFuZ2UgPSAoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlPzogRGF0ZSwgY2xlYXIgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0RGF0ZUV4dHJhLCB0eXBlLCBvblNlbGVjdEhhc0Rpc2FibGVEYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmICh0eXBlID09PSAnb25lJykge1xuICAgICAgZW5kRGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgdGltZTEgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZShzdGFydERhdGUpLFxuICAgICAgdGltZTIgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZShlbmREYXRlKTtcbiAgICBjb25zdCBzdGFydERhdGVUaWNrID0gIXRpbWUyIHx8IHRpbWUxIDwgdGltZTIgPyB0aW1lMSA6IHRpbWUyO1xuICAgIGNvbnN0IGVuZERhdGVUaWNrID0gdGltZTIgJiYgdGltZTEgPiB0aW1lMiA/IHRpbWUxIDogdGltZTI7XG5cbiAgICBjb25zdCBzdGFydE1vbnRoRGF0ZSA9IHRoaXMuZ2V0TW9udGhEYXRlKG5ldyBEYXRlKHN0YXJ0RGF0ZVRpY2spKS5maXJzdERhdGU7XG4gICAgY29uc3QgZW5kTW9udGhEYXRlID0gZW5kRGF0ZVRpY2sgPyBuZXcgRGF0ZShlbmREYXRlVGljaykgOiB0aGlzLmdldE1vbnRoRGF0ZShuZXcgRGF0ZShzdGFydERhdGVUaWNrKSkubGFzdERhdGU7XG5cbiAgICBsZXQgdW51c2VhYmxlOiBudW1iZXJbXSA9IFtdLFxuICAgICAgbmVlZFVwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUubW9udGhzXG4gICAgICAuZmlsdGVyKG0gPT4ge1xuICAgICAgICByZXR1cm4gbS5maXJzdERhdGUgPj0gc3RhcnRNb250aERhdGUgJiYgbS5maXJzdERhdGUgPD0gZW5kTW9udGhEYXRlO1xuICAgICAgfSlcbiAgICAgIC5mb3JFYWNoKG0gPT4ge1xuICAgICAgICBtLndlZWtzLmZvckVhY2godyA9PlxuICAgICAgICAgIHdcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiB7XG4gICAgICAgICAgICAgIGlmICghZW5kRGF0ZVRpY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZC50aWNrICYmIHRoaXMuaW5EYXRlKHN0YXJ0RGF0ZVRpY2ssIGQudGljayk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQudGljayAmJiBkLnRpY2sgPj0gc3RhcnREYXRlVGljayAmJiBkLnRpY2sgPD0gZW5kRGF0ZVRpY2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZm9yRWFjaChkID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBkLnNlbGVjdGVkO1xuICAgICAgICAgICAgICBpZiAoY2xlYXIpIHtcbiAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gRGF0ZU1vZGVscy5TZWxlY3RUeXBlLk5vbmU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IChnZXREYXRlRXh0cmEgJiYgZ2V0RGF0ZUV4dHJhKG5ldyBEYXRlKGQudGljaykpKSB8fCB7fTtcbiAgICAgICAgICAgICAgICBpZiAoZC5vdXRPZkRhdGUgfHwgaW5mby5kaXNhYmxlKSB7XG4gICAgICAgICAgICAgICAgICB1bnVzZWFibGUucHVzaChkLnRpY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbkRhdGUoc3RhcnREYXRlVGljaywgZC50aWNrKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBEYXRlTW9kZWxzLlNlbGVjdFR5cGUuU2luZ2xlO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZW5kRGF0ZVRpY2spIHtcbiAgICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5Pbmx5O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydERhdGVUaWNrICE9PSBlbmREYXRlVGljaykge1xuICAgICAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gRGF0ZU1vZGVscy5TZWxlY3RUeXBlLlN0YXJ0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5BbGw7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluRGF0ZShlbmREYXRlVGljaywgZC50aWNrKSkge1xuICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5FbmQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBEYXRlTW9kZWxzLlNlbGVjdFR5cGUuTWlkZGxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBuZWVkVXBkYXRlID0gbmVlZFVwZGF0ZSB8fCBkLnNlbGVjdGVkICE9PSBvbGRWYWx1ZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmIChuZWVkVXBkYXRlICYmIG0uY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgbS5jb21wb25lbnRSZWYudXBkYXRlV2Vla3MoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgaWYgKHVudXNlYWJsZS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAob25TZWxlY3RIYXNEaXNhYmxlRGF0ZSkge1xuICAgICAgICBvblNlbGVjdEhhc0Rpc2FibGVEYXRlKHVudXNlYWJsZS5tYXAodGljayA9PiBuZXcgRGF0ZSh0aWNrKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdVbnVzYWJsZSBkYXRlLiBZb3UgY2FuIGhhbmRsZSBieSBvblNlbGVjdEhhc0Rpc2FibGVEYXRlLicsIHVudXNlYWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbXB1dGVWaXNpYmxlID0gKGNsaWVudEhlaWdodDogbnVtYmVyLCBzY3JvbGxUb3A6IG51bWJlcikgPT4ge1xuICAgIGxldCBuZWVkVXBkYXRlID0gZmFsc2U7XG4gICAgY29uc3QgTUFYX1ZJRVdfUE9SVCA9IGNsaWVudEhlaWdodCAqIDI7XG4gICAgY29uc3QgTUlOX1ZJRVdfUE9SVCA9IGNsaWVudEhlaWdodDtcblxuICAgIC8vIOWkp+e8k+WGsuWMuuWklui/h+a7pOinhOWImVxuICAgIGNvbnN0IGZpbHRlckZ1bmMgPSAodm06IERhdGVNb2RlbHMuTW9udGhEYXRhKSA9PlxuICAgICAgdm0ueSAmJlxuICAgICAgdm0uaGVpZ2h0ICYmXG4gICAgICB2bS55ICsgdm0uaGVpZ2h0ID4gc2Nyb2xsVG9wIC0gTUFYX1ZJRVdfUE9SVCAmJlxuICAgICAgdm0ueSA8IHNjcm9sbFRvcCArIGNsaWVudEhlaWdodCArIE1BWF9WSUVXX1BPUlQ7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5pbmZpbml0ZU9wdCAmJiB0aGlzLnZpc2libGVNb250aC5sZW5ndGggPiAxMikge1xuICAgICAgdGhpcy52aXNpYmxlTW9udGggPSB0aGlzLnZpc2libGVNb250aC5maWx0ZXIoZmlsdGVyRnVuYykuc29ydCgoYSwgYikgPT4gK2EuZmlyc3REYXRlIC0gK2IuZmlyc3REYXRlKTtcbiAgICB9XG5cbiAgICAvLyDlvZPlsI/nvJPlhrLljLrkuI3mu6Hml7bloavlhYVcbiAgICBpZiAodGhpcy52aXNpYmxlTW9udGgubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFzdCA9IHRoaXMudmlzaWJsZU1vbnRoW3RoaXMudmlzaWJsZU1vbnRoLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGxhc3QueSAhPT0gdW5kZWZpbmVkICYmIGxhc3QuaGVpZ2h0ICYmIGxhc3QueSArIGxhc3QuaGVpZ2h0IDwgc2Nyb2xsVG9wICsgY2xpZW50SGVpZ2h0ICsgTUlOX1ZJRVdfUE9SVCkge1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSB0aGlzLnN0YXRlLm1vbnRocy5pbmRleE9mKGxhc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAyOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGxhc3RJbmRleCArIGk7XG4gICAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoICYmIHRoaXMudmlzaWJsZU1vbnRoLmluZGV4T2YodGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZU1vbnRoLnB1c2godGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FuTG9hZE5leHQoKSkge1xuICAgICAgICAgICAgICB0aGlzLmdlbk1vbnRoRGF0YSh1bmRlZmluZWQsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3QgPSB0aGlzLnZpc2libGVNb250aFswXTtcbiAgICAgIGlmIChmaXJzdC55ICE9PSB1bmRlZmluZWQgJiYgZmlyc3QuaGVpZ2h0ICYmIGZpcnN0LnkgPiBzY3JvbGxUb3AgLSBNSU5fVklFV19QT1JUKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSB0aGlzLnN0YXRlLm1vbnRocy5pbmRleE9mKGZpcnN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMjsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBmaXJzdEluZGV4IC0gaTtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiB0aGlzLnZpc2libGVNb250aC5pbmRleE9mKHRoaXMuc3RhdGUubW9udGhzW2luZGV4XSkgPCAwKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGVNb250aC51bnNoaWZ0KHRoaXMuc3RhdGUubW9udGhzW2luZGV4XSk7XG4gICAgICAgICAgICBuZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUubW9udGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmlzaWJsZU1vbnRoID0gdGhpcy5zdGF0ZS5tb250aHMuZmlsdGVyKGZpbHRlckZ1bmMpO1xuICAgICAgbmVlZFVwZGF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5lZWRVcGRhdGU7XG4gIH07XG5cbiAgY3JlYXRlT25TY3JvbGwgPSAoKSA9PiB7XG4gICAgLy8gbGV0IHRpbWVyOiBhbnk7XG4gICAgbGV0IGNsaWVudEhlaWdodCA9IDAsXG4gICAgICBzY3JvbGxUb3AgPSAwO1xuXG4gICAgcmV0dXJuIChkYXRhOiB7IGZ1bGw6IG51bWJlcjsgY2xpZW50OiBudW1iZXI7IHRvcDogbnVtYmVyIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgY2xpZW50LCB0b3AgfSA9IGRhdGE7XG4gICAgICBjbGllbnRIZWlnaHQgPSBjbGllbnQ7XG4gICAgICBzY3JvbGxUb3AgPSB0b3A7XG5cbiAgICAgIHRoaXMuY29tcHV0ZVZpc2libGUoY2xpZW50SGVpZ2h0LCBzY3JvbGxUb3ApO1xuXG4gICAgICAvLyDku6XkuIrmlrnms5Xnm67liY3ml6Dpl67popjvvIzlpoLmnpzlkI7nu63mnInmgKfog73pl67popjvvIzmlLnnlKjlpoLkuIvmlrnms5XvvIzkvYbku6XkuIvmlrnms5XkvJrlr7zoh7TliLfmlrDnqI3lvq7lu7bov5/njrDosaFcblxuICAgICAgLy8gaWYgKHRpbWVyKSB7XG4gICAgICAvLyAgIHJldHVybjtcbiAgICAgIC8vIH1cbiAgICAgIC8vXG4gICAgICAvLyB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgIC8vXG4gICAgICAvLyAgIGlmICh0aGlzLmNvbXB1dGVWaXNpYmxlKGNsaWVudEhlaWdodCwgc2Nyb2xsVG9wKSkge1xuICAgICAgLy8gICAgIGNvbnNvbGUubG9nKCd1cGRhdGUgZG9tJyk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH0sIDUwKTtcbiAgICB9O1xuICB9O1xuXG4gIGJhc2VPbkNlbGxDbGljayA9IChkYXk6IERhdGVNb2RlbHMuQ2VsbERhdGEpID0+IHtcbiAgICBpZiAoIWRheS50aWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLm9uQ2VsbENsaWNrKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2VsbENsaWNrKG5ldyBEYXRlKGRheS50aWNrKSk7XG4gICAgfVxuICB9O1xufVxuIl19