UNPKG

mat-daterangepicker

Version:

Angular material date picker extension to support range selection.

168 lines 22.8 kB
/* RANGE: Most of the code is redundant and hera as inheritance boilerplate. The added/edited code adds logic for handling range / non range mode. Additionaly, in range mode it will apply logic to mark the dates within the active month that are within the range. There are 3 range states for a month view, set by the combination of "_rangable" and "_allInRange": - Not rangable (single value datepicker OR active month not in range) - _rangable = False - Rangable but not all (active month is partially in range) - _rangable = True - All In Range (active month is in range, start/end dates before/after this month) - _rangable = True & _allInRange = True */ import { __awaiter, __decorate } from "tslib"; import { Component, ChangeDetectionStrategy, ViewEncapsulation, Input, Output, EventEmitter } from '@angular/core'; import { MatMonthView } from '@angular/material/datepicker'; let MatDaterangeMonthView = class MatDaterangeMonthView extends MatMonthView { constructor() { super(...arguments); this.selectedRangeEndChange = new EventEmitter(); this._createDate = (date) => { const selectedYear = this._dateAdapter.getYear(this.activeDate); const selectedMonth = this._dateAdapter.getMonth(this.activeDate); return new Date(selectedYear, selectedMonth, date); }; } get selectedRangeEnd() { return this._selectedRangeEnd; } set selectedRangeEnd(value) { this._selectedRangeEnd = this._getValidDateOrNull(this._dateAdapter.deserialize(value)); this._selectedRangeEndDate = this._getDateInCurrentMonth(this._selectedRangeEnd); } get _allInRange() { if (!this.range || !this.activeDate || !this.selectedRangeEnd || !this.selected) { return false; } else { const daysInMonth = this._dateAdapter.getNumDaysInMonth(this.activeDate); const startDate = this.createDate(1); const endDate = this.createDate(daysInMonth); return this._dateAdapter.compareDate(this.selected, startDate) < 0 && this._dateAdapter.compareDate(this.selectedRangeEnd, endDate) > 0; } } get _rangable() { if (!this.range || !this._weeks) { return false; } else { const daysInMonth = this._dateAdapter.getNumDaysInMonth(this.activeDate); const startDate = this.createDate(1); const endDate = this.createDate(daysInMonth); if (this.selectedRangeEnd < startDate) { return false; } if (this.selected > endDate) { return false; } return true; } } _init() { this._selectedRangeEndDate = this._getDateInCurrentMonth(this.selectedRangeEnd); super._init(); } _dateSelected(date) { const _super = Object.create(null, { _dateSelected: { get: () => super._dateSelected } }); return __awaiter(this, void 0, void 0, function* () { if (!this.range) { _super._dateSelected.call(this, date); } else { if (!this.selected || this.selectedRangeEnd) { if (this._selectedRangeEnd) { this._dateSelectedRangeEnd(null); } _super._dateSelected.call(this, date); } else { if (date === null) { this._dateSelectedRangeEnd(null); } else { const selectedDate = this.createDate(date); if (selectedDate < this.selected) { // const swap = this._selectedDate; const year = this._dateAdapter.getYear(this.selected); const month = this._dateAdapter.getMonth(this.selected); const swap = this._dateAdapter.getDate(this.selected); _super._dateSelected.call(this, date); this._dateSelectedRangeEnd(swap, year, month); } else { this._dateSelectedRangeEnd(date); } } } } }); } _dateSelectedRangeEnd(date, year, month) { if (date === null) { this.selectedRangeEndChange.emit(null); } else if (this._selectedRangeEndDate != date) { let selectedDate; if (year && month) { selectedDate = this._dateAdapter.createDate(year, month, date); } else { selectedDate = this.createDate(date); } this.selectedRangeEndChange.emit(selectedDate); this._userSelection.emit(); } } createDate(date) { const selectedYear = this._dateAdapter.getYear(this.activeDate); const selectedMonth = this._dateAdapter.getMonth(this.activeDate); return this._dateAdapter.createDate(selectedYear, selectedMonth, date); } getSelectedDate() { if (!this.selected) return null; const selectedYear = this._dateAdapter.getYear(this.selected); const selectedMonth = this._dateAdapter.getMonth(this.selected); const selectedDate = this._dateAdapter.getDate(this.selected); return new Date(selectedYear, selectedMonth, selectedDate); } getSelectedRangeEndDate() { if (!this.selectedRangeEnd) return null; const selectedYear = this._dateAdapter.getYear(this.selectedRangeEnd); const selectedMonth = this._dateAdapter.getMonth(this.selectedRangeEnd); const selectedDate = this._dateAdapter.getDate(this.selectedRangeEnd); return new Date(selectedYear, selectedMonth, selectedDate); } }; __decorate([ Input() ], MatDaterangeMonthView.prototype, "range", void 0); __decorate([ Input() ], MatDaterangeMonthView.prototype, "view", void 0); __decorate([ Input() ], MatDaterangeMonthView.prototype, "setHoverCells", void 0); __decorate([ Input() ], MatDaterangeMonthView.prototype, "clearBody", void 0); __decorate([ Input() ], MatDaterangeMonthView.prototype, "selectedRangeEnd", null); __decorate([ Output() ], MatDaterangeMonthView.prototype, "selectedRangeEndChange", void 0); MatDaterangeMonthView = __decorate([ Component({ selector: 'mat-daterange-month-view', template: "<!-- \n RANGE: Most of the code is redundant and hera as inheritance boilerplate.\n \n The 3 attributes in the middle are the additional bindings to the template.\n They notify the body:\n - Are we in range mode ([range])\n - Are all the dates in range ([allInRange])\n this happens when the start date is before the current month and the end is after it.\n - The value marking the end of the range ([selectedRangeEndValue])\n\n ADDED LOC ~3\n -->\n\n<table class=\"mat-calendar-table\">\n <thead class=\"mat-calendar-table-header\">\n <tr><th *ngFor=\"let day of _weekdays\" [attr.aria-label]=\"day.long\">{{day.narrow}}</th></tr>\n <tr><th class=\"mat-calendar-table-header-divider\" colspan=\"7\" aria-hidden=\"true\"></th></tr>\n </thead>\n <tbody mat-daterange-calendar-body\n [view]=\"view\"\n [label]=\"_monthLabel\"\n [rows]=\"_weeks\"\n [todayValue]=\"_todayDate\"\n [selectedValue]=\"_selectedDate\"\n\n [selectedRangeEndValue]=\"_selectedRangeEndDate\"\n [allInRange]=\"_allInRange\"\n [range]=\"_rangable\"\n [createDate]=\"_createDate\"\n [dateAdapter]=\"_dateAdapter\"\n [selected]=\"getSelectedDate()\"\n [selectedRangeEnd]=\"getSelectedRangeEndDate()\"\n [setHoverCells]=\"setHoverCells\"\n [clearBody]=\"clearBody\"\n [labelMinRequiredCells]=\"3\"\n [activeCell]=\"_dateAdapter.getDate(activeDate) - 1\"\n (selectedValueChange)=\"_dateSelected($event)\" \n (keydown)=\"_handleCalendarBodyKeydown($event)\">\n </tbody>\n</table>\n", exportAs: 'matMonthView', encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush }) ], MatDaterangeMonthView); export { MatDaterangeMonthView }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udGgtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tYXQtZGF0ZXJhbmdlcGlja2VyLyIsInNvdXJjZXMiOlsibGliL21vbnRoLXZpZXcvbW9udGgtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztFQVNFOztBQUdGLE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBVzVELElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXlCLFNBQVEsWUFBZTtJQUE3RDs7UUFvRG9CLDJCQUFzQixHQUFvQixJQUFJLFlBQVksRUFBSyxDQUFDO1FBMERuRixnQkFBVyxHQUFHLENBQUMsSUFBWSxFQUFRLEVBQUU7WUFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRSxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFBO0lBaUJGLENBQUM7SUExSFMsSUFBSSxnQkFBZ0I7UUFDNUIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksZ0JBQWdCLENBQUMsS0FBZTtRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQVUsSUFBSyxDQUFDLG1CQUFtQixDQUFRLElBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLHFCQUFx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S0FBSyxFQUFFO29EQUFnQjtBQUNmO0lBQVIsS0FBSyxFQUFFO21EQUFhO0FBQ1o7SUFBUixLQUFLLEVBQUU7NERBQW9DO0FBQ25DO0lBQVIsS0FBSyxFQUFFO3dEQUFnQztBQUUvQjtJQUFSLEtBQUssRUFBRTs2REFFUDtBQXlDUztJQUFULE1BQU0sRUFBRTtxRUFBMEU7QUFwRHZFLHFCQUFxQjtJQVJqQyxTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsMEJBQTBCO1FBQ3BDLG9uREFBMEM7UUFDMUMsUUFBUSxFQUFFLGNBQWM7UUFDeEIsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7UUFDckMsbUJBQW1CLEVBQUUsS0FBSztRQUMxQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtLQUNoRCxDQUFDO0dBQ1cscUJBQXFCLENBbUlqQztTQW5JWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICAgIFJBTkdFOiBNb3N0IG9mIHRoZSBjb2RlIGlzIHJlZHVuZGFudCBhbmQgaGVyYSBhcyBpbmhlcml0YW5jZSBib2lsZXJwbGF0ZS5cbiAgICBUaGUgYWRkZWQvZWRpdGVkIGNvZGUgYWRkcyBsb2dpYyBmb3IgaGFuZGxpbmcgcmFuZ2UgLyBub24gcmFuZ2UgbW9kZS5cbiAgICBBZGRpdGlvbmFseSwgaW4gcmFuZ2UgbW9kZSBpdCB3aWxsIGFwcGx5IGxvZ2ljIHRvIG1hcmsgdGhlIGRhdGVzIHdpdGhpbiB0aGUgYWN0aXZlIG1vbnRoXG4gICAgdGhhdCBhcmUgd2l0aGluIHRoZSByYW5nZS5cbiAgICBUaGVyZSBhcmUgMyByYW5nZSBzdGF0ZXMgZm9yIGEgbW9udGggdmlldywgc2V0IGJ5IHRoZSBjb21iaW5hdGlvbiBvZiBcIl9yYW5nYWJsZVwiIGFuZCBcIl9hbGxJblJhbmdlXCI6XG4gICAgICAtIE5vdCByYW5nYWJsZSAoc2luZ2xlIHZhbHVlIGRhdGVwaWNrZXIgT1IgYWN0aXZlIG1vbnRoIG5vdCBpbiByYW5nZSkgLSBfcmFuZ2FibGUgPSBGYWxzZVxuICAgICAgLSBSYW5nYWJsZSBidXQgbm90IGFsbCAoYWN0aXZlIG1vbnRoIGlzIHBhcnRpYWxseSBpbiByYW5nZSkgLSBfcmFuZ2FibGUgPSBUcnVlXG4gICAgICAtIEFsbCBJbiBSYW5nZSAoYWN0aXZlIG1vbnRoIGlzIGluIHJhbmdlLCBzdGFydC9lbmQgZGF0ZXMgYmVmb3JlL2FmdGVyIHRoaXMgbW9udGgpIC0gX3JhbmdhYmxlID0gVHJ1ZSAmIF9hbGxJblJhbmdlID0gVHJ1ZVxuKi9cblxuXG5pbXBvcnQgeyBDb21wb25lbnQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE1hdE1vbnRoVmlldyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1kYXRlcmFuZ2UtbW9udGgtdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb250aC12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgZXhwb3J0QXM6ICdtYXRNb250aFZpZXcnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdERhdGVyYW5nZU1vbnRoVmlldzxEPiBleHRlbmRzIE1hdE1vbnRoVmlldzxEPiB7XG5cblx0X3NlbGVjdGVkUmFuZ2VFbmREYXRlOiBudW1iZXIgfCBudWxsO1xuXG5cdEBJbnB1dCgpIHJhbmdlOiBib29sZWFuO1xuXHRASW5wdXQoKSB2aWV3OiBudW1iZXJcblx0QElucHV0KCkgc2V0SG92ZXJDZWxsczogQmVoYXZpb3JTdWJqZWN0PGFueT5cblx0QElucHV0KCkgY2xlYXJCb2R5OiBCZWhhdmlvclN1YmplY3Q8YW55PlxuXG5cdEBJbnB1dCgpIGdldCBzZWxlY3RlZFJhbmdlRW5kKCk6IEQgfCBudWxsIHtcblx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0ZWRSYW5nZUVuZDtcblx0fVxuXHRzZXQgc2VsZWN0ZWRSYW5nZUVuZCh2YWx1ZTogRCB8IG51bGwpIHtcblx0XHR0aGlzLl9zZWxlY3RlZFJhbmdlRW5kID0gKDxhbnk+IHRoaXMpLl9nZXRWYWxpZERhdGVPck51bGwoKDxhbnk+IHRoaXMpLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuXHRcdHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmREYXRlID0gKDxhbnk+IHRoaXMpLl9nZXREYXRlSW5DdXJyZW50TW9udGgoKDxhbnk+IHRoaXMpLl9zZWxlY3RlZFJhbmdlRW5kKTtcblx0fVxuXG5cdGdldCBfYWxsSW5SYW5nZSgpOiBib29sZWFuIHtcblx0XHRpZiAoIXRoaXMucmFuZ2UgfHwgIXRoaXMuYWN0aXZlRGF0ZSB8fCAhdGhpcy5zZWxlY3RlZFJhbmdlRW5kIHx8ICF0aGlzLnNlbGVjdGVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGRheXNJbk1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgodGhpcy5hY3RpdmVEYXRlKTtcblx0XHRcdGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuY3JlYXRlRGF0ZSgxKTtcblx0XHRcdGNvbnN0IGVuZERhdGUgPSB0aGlzLmNyZWF0ZURhdGUoZGF5c0luTW9udGgpO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5zZWxlY3RlZCwgc3RhcnREYXRlKSA8IDAgJiZcblx0XHRcdFx0dGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5zZWxlY3RlZFJhbmdlRW5kLCBlbmREYXRlKSA+IDA7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IF9yYW5nYWJsZSgpOiBib29sZWFuIHtcblx0XHRpZiAoIXRoaXMucmFuZ2UgfHwgIXRoaXMuX3dlZWtzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGRheXNJbk1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgodGhpcy5hY3RpdmVEYXRlKTtcblx0XHRcdGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuY3JlYXRlRGF0ZSgxKTtcblx0XHRcdGNvbnN0IGVuZERhdGUgPSB0aGlzLmNyZWF0ZURhdGUoZGF5c0luTW9udGgpO1xuXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZFJhbmdlRW5kIDwgc3RhcnREYXRlKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWQgPiBlbmREYXRlKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfc2VsZWN0ZWRSYW5nZUVuZDogRCB8IG51bGw7XG5cblx0QE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkUmFuZ2VFbmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEPiA9IG5ldyBFdmVudEVtaXR0ZXI8RD4oKTtcblxuXHRfaW5pdCgpIHtcblx0XHR0aGlzLl9zZWxlY3RlZFJhbmdlRW5kRGF0ZSA9ICg8YW55PiB0aGlzKS5fZ2V0RGF0ZUluQ3VycmVudE1vbnRoKHRoaXMuc2VsZWN0ZWRSYW5nZUVuZCk7XG5cdFx0c3VwZXIuX2luaXQoKTtcblx0fVxuXG5cdGFzeW5jIF9kYXRlU2VsZWN0ZWQoZGF0ZTogbnVtYmVyKSB7XG5cdFx0aWYgKCAhdGhpcy5yYW5nZSApIHtcblx0XHRcdHN1cGVyLl9kYXRlU2VsZWN0ZWQoZGF0ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggIXRoaXMuc2VsZWN0ZWQgfHwgdGhpcy5zZWxlY3RlZFJhbmdlRW5kICkge1xuXHRcdFx0XHRpZiAoIHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmQgKSB7XG5cdFx0XHRcdFx0dGhpcy5fZGF0ZVNlbGVjdGVkUmFuZ2VFbmQobnVsbCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3VwZXIuX2RhdGVTZWxlY3RlZChkYXRlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChkYXRlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0dGhpcy5fZGF0ZVNlbGVjdGVkUmFuZ2VFbmQobnVsbCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2VsZWN0ZWREYXRlID0gdGhpcy5jcmVhdGVEYXRlKGRhdGUpO1xuXHRcdFx0XHRcdGlmIChzZWxlY3RlZERhdGUgPCB0aGlzLnNlbGVjdGVkKSB7XG5cdFx0XHRcdFx0XHQvLyBjb25zdCBzd2FwID0gdGhpcy5fc2VsZWN0ZWREYXRlO1xuXHRcdFx0XHRcdFx0Y29uc3QgeWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5zZWxlY3RlZCk7XG5cdFx0XHRcdFx0XHRjb25zdCBtb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuc2VsZWN0ZWQpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc3dhcCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5zZWxlY3RlZCk7XG5cdFx0XHRcdFx0XHRzdXBlci5fZGF0ZVNlbGVjdGVkKGRhdGUpO1xuXHRcdFx0XHRcdFx0dGhpcy5fZGF0ZVNlbGVjdGVkUmFuZ2VFbmQoc3dhcCwgeWVhciwgbW9udGgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9kYXRlU2VsZWN0ZWRSYW5nZUVuZChkYXRlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIF9kYXRlU2VsZWN0ZWRSYW5nZUVuZChkYXRlOiBudW1iZXIgfCBudWxsLCB5ZWFyPywgbW9udGg/KSB7XG5cdFx0aWYgKGRhdGUgPT09IG51bGwpIHtcblx0XHRcdHRoaXMuc2VsZWN0ZWRSYW5nZUVuZENoYW5nZS5lbWl0KG51bGwpO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmREYXRlICE9IGRhdGUgKSB7XG5cdFx0XHRsZXQgc2VsZWN0ZWREYXRlXG5cdFx0XHRpZih5ZWFyICYmIG1vbnRoKXtcblx0XHRcdFx0c2VsZWN0ZWREYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSk7XG5cdFx0XHR9ZWxzZXtcblx0XHRcdFx0c2VsZWN0ZWREYXRlID0gdGhpcy5jcmVhdGVEYXRlKGRhdGUpXG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdHRoaXMuc2VsZWN0ZWRSYW5nZUVuZENoYW5nZS5lbWl0KHNlbGVjdGVkRGF0ZSk7XG5cdFx0XHR0aGlzLl91c2VyU2VsZWN0aW9uLmVtaXQoKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZURhdGUoZGF0ZTogbnVtYmVyKTogRCB7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLmFjdGl2ZURhdGUpO1xuXHRcdGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUpO1xuXHRcdHJldHVybiB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHNlbGVjdGVkWWVhciwgc2VsZWN0ZWRNb250aCwgZGF0ZSk7XG5cdH1cblxuXHRfY3JlYXRlRGF0ZSA9IChkYXRlOiBudW1iZXIpOiBEYXRlID0+IHtcblx0XHRjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuYWN0aXZlRGF0ZSk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuYWN0aXZlRGF0ZSk7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKHNlbGVjdGVkWWVhciwgc2VsZWN0ZWRNb250aCwgZGF0ZSk7XG5cdH1cblxuXHRnZXRTZWxlY3RlZERhdGUoKXtcblx0XHRpZighdGhpcy5zZWxlY3RlZCkgcmV0dXJuIG51bGxcblx0XHRjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuc2VsZWN0ZWQpO1xuXHRcdGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLnNlbGVjdGVkKTtcblx0XHRjb25zdCBzZWxlY3RlZERhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuc2VsZWN0ZWQpO1xuXHRcdHJldHVybiBuZXcgRGF0ZShzZWxlY3RlZFllYXIsIHNlbGVjdGVkTW9udGgsIHNlbGVjdGVkRGF0ZSk7XG5cdH1cblxuXHRnZXRTZWxlY3RlZFJhbmdlRW5kRGF0ZSgpe1xuXHRcdGlmKCF0aGlzLnNlbGVjdGVkUmFuZ2VFbmQpIHJldHVybiBudWxsXG5cdFx0Y29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLnNlbGVjdGVkUmFuZ2VFbmQpO1xuXHRcdGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLnNlbGVjdGVkUmFuZ2VFbmQpO1xuXHRcdGNvbnN0IHNlbGVjdGVkRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5zZWxlY3RlZFJhbmdlRW5kKTtcblx0XHRyZXR1cm4gbmV3IERhdGUoc2VsZWN0ZWRZZWFyLCBzZWxlY3RlZE1vbnRoLCBzZWxlY3RlZERhdGUpO1xuXHR9XG59XG5cbiJdfQ==