UNPKG

mat-daterangepicker

Version:

Angular material date picker extension to support range selection.

128 lines 19.7 kB
/* RANGE: Most of the code is redundant and hera as inheritance boilerplate. The relevant code is marked with a comment. */ import { __decorate } from "tslib"; import { ChangeDetectionStrategy, Component, ViewEncapsulation, ViewChild, EventEmitter, ViewChildren } from '@angular/core'; import { MatDatepickerContent, matDatepickerAnimations } from '@angular/material/datepicker'; import { MatDaterangeCalendar } from '../calendar/calendar.component'; import { BehaviorSubject } from 'rxjs'; let MatDaterangepickerContent = class MatDaterangepickerContent extends MatDatepickerContent { constructor() { super(...arguments); this._onApplyRange = new EventEmitter(); this.setHoverCells = new BehaviorSubject(null); this.clearBody = new BehaviorSubject(null); } get drDatepicker() { return this.datepicker; } ngOnInit() { } ngAfterViewInit() { } // THIS IS THE ONLY ADDITION onUserSelection(view) { this.drDatepicker._userSelection(); } applyRange() { if (this.drDatepicker.applyButton) { this.drDatepicker.applyRange(); } } clearRange() { this.drDatepicker.clearRange(); this.clearBody.next(true); this.datepicker._selected = null; this.drDatepicker._selectedRangeEnd = null; } setCustomRange(range) { if (!range.startDate || !range.endDate) return; this.datepicker._selected = range.startDate; this.drDatepicker._selectedRangeEnd = range.endDate; this.datepicker._selectedChanged.next(range.startDate); this.drDatepicker._selectedChangedRangeEnd.next(range.endDate); this.setActiveDate(range.startDate, range.endDate); } isSameRange(range) { if (!this.datepicker._selected || !this.drDatepicker._selectedRangeEnd || !range.startDate || !range.endDate) return; return this.drDatepicker._drDateAdapter.compareDate(range.startDate, this.datepicker._selected) == 0 && this.drDatepicker._drDateAdapter.compareDate(range.endDate, this.drDatepicker._selectedRangeEnd) == 0; } isSomeRange() { if (!this.datepicker._selected || !this.drDatepicker._selectedRangeEnd) return false; return this.drDatepicker.customRanges.some(range => this.isSameRange(range)); } getWidthDateRangePicker() { if (this.drDatepicker.dualView) { if (this.drDatepicker.showCustomRanges && this.drDatepicker.customRanges.length) { return '655px'; } return '600px'; } if (this.drDatepicker.showCustomRanges && this.drDatepicker.customRanges.length) { return '450px'; } } setActiveDate(from, to) { const fromMonth = this.drDatepicker._drDateAdapter.getMonth(from); const toMonth = this.drDatepicker._drDateAdapter.getMonth(to); const toYear = this.drDatepicker._drDateAdapter.getYear(to); const toDate = this.drDatepicker._drDateAdapter.getDate(to); let y, m; if (toMonth === 11) { m = 0; y = toYear + 1; } else { m = toMonth + 1, y = toYear; } const endDate = this.drDatepicker._drDateAdapter.createDate(y, m, 1); this.calendars.forEach((calendar, i) => { if (i === 0) { calendar.activeDate = from; } else { if (fromMonth !== toMonth) { // if start month & end month are differents calendar.activeDate = to; } else { calendar.activeDate = endDate; } } }); } }; __decorate([ ViewChild(MatDaterangeCalendar, { static: true }) ], MatDaterangepickerContent.prototype, "_calendar", void 0); __decorate([ ViewChildren(MatDaterangeCalendar) ], MatDaterangepickerContent.prototype, "calendars", void 0); MatDaterangepickerContent = __decorate([ Component({ selector: 'mat-daterangepicker-content', template: "<div>\n\t<!-- \n\t\tRANGE: Most of the code is redundant and hera as inheritance boilerplate.\n\t\tThe relevant code is marked with a comment.\n\t\tADDED LOC ~3\n\t-->\n\t<div class=\"mat-daterange-calendars\" [ngStyle]=\"{'width': getWidthDateRangePicker()}\">\n\t\t<div *ngIf=\"drDatepicker.showCustomRanges && drDatepicker.customRanges.length\" class=\"mat-daterange-custom-ranges\">\n\t\t\t<button *ngFor=\"let range of drDatepicker.customRanges\" mat-flat-button [color]=\"isSameRange(range) ? 'primary' : ''\" (click)=\"setCustomRange(range)\" class=\"mat-daterange-calendar-button-action\">{{range.name}}</button>\n\t\t\t<button mat-flat-button [color]=\"!isSomeRange() ? 'primary' : ''\" class=\"mat-daterange-custom-range mat-daterange-calendar-button-action\">Custom Range</button>\n\t\t</div>\n\t\t<mat-daterange-calendar *ngFor=\"let view of drDatepicker._getViews()\" #Calendar cdkTrapFocus\n\t\t\t\t\t[id]=\"datepicker.id\"\n\t\t\t\t\t[ngClass]=\"datepicker.panelClass\"\n\t\t\t\t\tclass=\"mat-daterange-calendar\"\n\t\t\t\t\t[view]=\"view\"\n\t\t\t\t\t[setHoverCells]=\"setHoverCells\"\n\t\t\t\t\t[clearBody]=\"clearBody\"\n\t\t\t\t\t\n\t\t\t\t\t[startAt]=\"datepicker.startAt\"\n\t\t\t\t\t[startView]=\"datepicker.startView\"\n\t\t\t\t\t[minDate]=\"datepicker._minDate\"\n\t\t\t\t\t[maxDate]=\"datepicker._maxDate\"\n\t\t\t\t\t[dateFilter]=\"datepicker._dateFilter\"\n\t\t\t\t\t[headerComponent]=\"datepicker.calendarHeaderComponent\"\n\t\t\t\t\t[selected]=\"datepicker._selected\"\n\t\t\t\t\t[@fadeInCalendar]=\"'enter'\"\n\t\t\t\t\t(selectedChange)=\"datepicker.select($event)\"\n\t\t\t\t\t(yearSelected)=\"datepicker._selectYear($event)\"\n\t\t\t\t\t(monthSelected)=\"datepicker._selectMonth($event)\"\n\n\t\t\t\t\t[range]=\"!!drDatepicker._datepickerInputRangeEnd\"\n\t\t\t\t\t[selectedRangeEnd]=\"drDatepicker._selectedRangeEnd\"\n\t\t\t\t\t(selectedRangeEndChange)=\"drDatepicker.selectRangeEnd($event)\"\n\t\t\t\t\t(_userSelection)=\"onUserSelection(view)\">\n\t\t\t\t\t<!-- \n\t\t\t\t\t\t\tTHE 3 LINES ABOVE ARE THE ONLY ADDITION\n\t\t\t\t\t\t\tThe _userSelection will pass logic handling to the datepicker component\n\t\t\t\t\t\t\tinstead of closing the dialog/popup, this is because range logic is handled there.\n\n\t\t\t\t\t\t\tThe other attributes are passing on the additional date (Range end) bindings\n\t\t\t\t\t\t\tand a flag that sets range on/off based on the input range.\n\t\t\t\t\t\t\tThis means that an *ngIf on that input by the user can toggle range on/off without\n\t\t\t\t\t\t\ta special flag.\n\t\t\t\t\t-->\n\n\t\t</mat-daterange-calendar>\n\t</div>\n\n\t<div *ngIf=\"drDatepicker.applyButton\" class=\"mat-daterange-calendar-actions\">\n\t\t<button mat-button color=\"primary\" (click)=\"clearRange()\">Clear</button>&nbsp;&nbsp;\n\t\t<button mat-flat-button color=\"primary\" (click)=\"applyRange()\">Apply</button>\n\t</div>\n</div>", host: { 'class': 'mat-datepicker-content', '[@transformPanel]': '"enter"', '[class.mat-datepicker-content-touch]': 'datepicker.touchUi', '[class.mat-datepicker-content-above]': '_isAbove', }, animations: [ matDatepickerAnimations.transformPanel, matDatepickerAnimations.fadeInCalendar, ], exportAs: 'matDaterangepickerContent', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, inputs: ['color'], styles: [".mat-daterange-calendar-body-in-range{background-color:rgba(63,81,181,.15)}.mat-daterange-calendar-body-in-range.mat-daterange-calendar-body-range-start{border-radius:100% 0 0 100%}.mat-daterange-calendar-body-in-range.mat-daterange-calendar-body-range-end{border-radius:0 100% 100% 0}.mat-daterange-calendars{display:flex}.mat-daterange-calendar{flex-grow:1}.mat-daterange-calendar-actions{padding:15px;text-align:right}.mat-daterange-custom-ranges{display:flex;flex-flow:column;width:130px;padding:8px}.mat-daterange-custom-ranges button{text-align:left;font-size:12px;line-height:32px;font-weight:400!important}.mat-daterange-calendar-button-action{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}"] }) ], MatDaterangepickerContent); export { MatDaterangepickerContent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdC1kYXRlcmFuZ2VwaWNrZXIvIiwic291cmNlcyI6WyJsaWIvZGF0ZXBpY2tlci1jb250ZW50L2RhdGVwaWNrZXItY29udGVudC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztFQUdFOztBQUVGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFVLFlBQVksRUFBRSxZQUFZLEVBQWdELE1BQU0sZUFBZSxDQUFDO0FBQ25MLE9BQU8sRUFBRSxvQkFBb0IsRUFBZSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRzFHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFzQnZDLElBQWEseUJBQXlCLEdBQXRDLE1BQWEseUJBQTZCLFNBQVEsb0JBQXVCO0lBQXpFOztRQUVDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUtsQyxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFBO1FBQzlDLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQTtJQXlGL0MsQ0FBQztJQTlGQSxJQUFJLFlBQVk7UUFDZixPQUFhLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDOUIsQ0FBQztJQU9ELFFBQVE7SUFDUixDQUFDO0lBRUQsZUFBZTtJQUNmLENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsZUFBZSxDQUFDLElBQUk7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsVUFBVTtRQUNULElBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUM7WUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVB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QUN2Qyw0MEZBQWtEO1FBRWxELElBQUksRUFBRTtZQUNKLE9BQU8sRUFBRSx3QkFBd0I7WUFDakMsbUJBQW1CLEVBQUUsU0FBUztZQUM5QixzQ0FBc0MsRUFBRSxvQkFBb0I7WUFDNUQsc0NBQXNDLEVBQUUsVUFBVTtTQUVuRDtRQUNELFVBQVUsRUFBRTtZQUNWLHVCQUF1QixDQUFDLGNBQWM7WUFDdEMsdUJBQXVCLENBQUMsY0FBYztTQUN2QztRQUNELFFBQVEsRUFBRSwyQkFBMkI7UUFDckMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7UUFDckMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07UUFDL0MsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDOztLQUNsQixDQUFDO0dBQ1cseUJBQXlCLENBaUdyQztTQWpHWSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICAgIFJBTkdFOiBNb3N0IG9mIHRoZSBjb2RlIGlzIHJlZHVuZGFudCBhbmQgaGVyYSBhcyBpbmhlcml0YW5jZSBib2lsZXJwbGF0ZS5cbiAgICBUaGUgcmVsZXZhbnQgY29kZSBpcyBtYXJrZWQgd2l0aCBhIGNvbW1lbnQuXG4qL1xuXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgVmlld0NoaWxkLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGF0ZXBpY2tlckNvbnRlbnQsIE1hdENhbGVuZGFyLCBtYXREYXRlcGlja2VyQW5pbWF0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuXG5pbXBvcnQgeyBNYXREYXRlcmFuZ2VwaWNrZXIgfSBmcm9tICcuLi9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdERhdGVyYW5nZUNhbGVuZGFyIH0gZnJvbSAnLi4vY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtZGF0ZXJhbmdlcGlja2VyLWNvbnRlbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci1jb250ZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZXBpY2tlci1jb250ZW50LmNvbXBvbmVudC5zY3NzJ10sXG4gIGhvc3Q6IHtcbiAgICAnY2xhc3MnOiAnbWF0LWRhdGVwaWNrZXItY29udGVudCcsXG4gICAgJ1tAdHJhbnNmb3JtUGFuZWxdJzogJ1wiZW50ZXJcIicsXG4gICAgJ1tjbGFzcy5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoXSc6ICdkYXRlcGlja2VyLnRvdWNoVWknLFxuICAgICdbY2xhc3MubWF0LWRhdGVwaWNrZXItY29udGVudC1hYm92ZV0nOiAnX2lzQWJvdmUnLFxuICAgIC8vICdbY2xhc3MubWF0LWRhdGVwaWNrZXItcmFuZ2VdJzogJ2RhdGVwaWNrZXIuX3JhbmdlJ1xuICB9LFxuICBhbmltYXRpb25zOiBbXG4gICAgbWF0RGF0ZXBpY2tlckFuaW1hdGlvbnMudHJhbnNmb3JtUGFuZWwsXG4gICAgbWF0RGF0ZXBpY2tlckFuaW1hdGlvbnMuZmFkZUluQ2FsZW5kYXIsXG4gIF0sXG4gIGV4cG9ydEFzOiAnbWF0RGF0ZXJhbmdlcGlja2VyQ29udGVudCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbnB1dHM6IFsnY29sb3InXVxufSlcbmV4cG9ydCBjbGFzcyBNYXREYXRlcmFuZ2VwaWNrZXJDb250ZW50PEQ+IGV4dGVuZHMgTWF0RGF0ZXBpY2tlckNvbnRlbnQ8RD4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXHRAVmlld0NoaWxkKE1hdERhdGVyYW5nZUNhbGVuZGFyLCB7IHN0YXRpYzogdHJ1ZSB9KSBfY2FsZW5kYXI6IE1hdENhbGVuZGFyPEQ+O1xuXHRfb25BcHBseVJhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cdGdldCBkckRhdGVwaWNrZXIoKSA6IE1hdERhdGVyYW5nZXBpY2tlcjxEPiB7XG5cdFx0cmV0dXJuIDxhbnk+IHRoaXMuZGF0ZXBpY2tlcjtcblx0fVxuXG5cdHNldEhvdmVyQ2VsbHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbClcblx0Y2xlYXJCb2R5ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihudWxsKVxuXHRcblx0QFZpZXdDaGlsZHJlbihNYXREYXRlcmFuZ2VDYWxlbmRhcikgY2FsZW5kYXJzOiBRdWVyeUxpc3Q8TWF0RGF0ZXJhbmdlQ2FsZW5kYXI8RD4+XG5cblx0bmdPbkluaXQoKXtcblx0fVxuXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpe1xuXHR9XG5cblx0Ly8gVEhJUyBJUyBUSEUgT05MWSBBRERJVElPTlxuXHRvblVzZXJTZWxlY3Rpb24odmlldyk6IHZvaWQge1xuXHRcdHRoaXMuZHJEYXRlcGlja2VyLl91c2VyU2VsZWN0aW9uKCk7XG5cdH1cblxuXHRhcHBseVJhbmdlKCk6IHZvaWQge1xuXHRcdGlmKHRoaXMuZHJEYXRlcGlja2VyLmFwcGx5QnV0dG9uKXtcblx0XHRcdHRoaXMuZHJEYXRlcGlja2VyLmFwcGx5UmFuZ2UoKTtcblx0XHR9XG5cdH1cblxuXHRjbGVhclJhbmdlKCl7XG5cdFx0dGhpcy5kckRhdGVwaWNrZXIuY2xlYXJSYW5nZSgpO1xuXHRcdHRoaXMuY2xlYXJCb2R5Lm5leHQodHJ1ZSlcblx0XHR0aGlzLmRhdGVwaWNrZXIuX3NlbGVjdGVkID0gbnVsbFxuXHRcdHRoaXMuZHJEYXRlcGlja2VyLl9zZWxlY3RlZFJhbmdlRW5kID0gbnVsbFxuXHR9XG5cblx0c2V0Q3VzdG9tUmFuZ2UocmFuZ2Upe1xuXHRcdGlmKCFyYW5nZS5zdGFydERhdGUgfHwgIXJhbmdlLmVuZERhdGUpIHJldHVybjtcblx0XHR0aGlzLmRhdGVwaWNrZXIuX3NlbGVjdGVkID0gcmFuZ2Uuc3RhcnREYXRlXG5cdFx0dGhpcy5kckRhdGVwaWNrZXIuX3NlbGVjdGVkUmFuZ2VFbmQgPSByYW5nZS5lbmREYXRlXG5cdFx0dGhpcy5kYXRlcGlja2VyLl9zZWxlY3RlZENoYW5nZWQubmV4dChyYW5nZS5zdGFydERhdGUpXG5cdFx0dGhpcy5kckRhdGVwaWNrZXIuX3NlbGVjdGVkQ2hhbmdlZFJhbmdlRW5kLm5leHQocmFuZ2UuZW5kRGF0ZSlcblx0XHR0aGlzLnNldEFjdGl2ZURhdGUocmFuZ2Uuc3RhcnREYXRlLCByYW5nZS5lbmREYXRlKVxuXHR9XG5cblx0aXNTYW1lUmFuZ2UocmFuZ2Upe1xuXHRcdGlmKCF0aGlzLmRhdGVwaWNrZXIuX3NlbGVjdGVkIHx8ICF0aGlzLmRyRGF0ZXBpY2tlci5fc2VsZWN0ZWRSYW5nZUVuZCB8fCAhcmFuZ2Uuc3RhcnREYXRlIHx8ICFyYW5nZS5lbmREYXRlKSByZXR1cm47XG5cdFx0cmV0dXJuIHRoaXMuZHJEYXRlcGlja2VyLl9kckRhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHJhbmdlLnN0YXJ0RGF0ZSwgdGhpcy5kYXRlcGlja2VyLl9zZWxlY3RlZCkgPT0gMCAgJiYgXG5cdFx0dGhpcy5kckRhdGVwaWNrZXIuX2RyRGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUocmFuZ2UuZW5kRGF0ZSwgdGhpcy5kckRhdGVwaWNrZXIuX3NlbGVjdGVkUmFuZ2VFbmQpID09IDBcblx0fVxuXG5cdGlzU29tZVJhbmdlKCl7XG5cdFx0aWYoIXRoaXMuZGF0ZXBpY2tlci5fc2VsZWN0ZWQgfHwgIXRoaXMuZHJEYXRlcGlja2VyLl9zZWxlY3RlZFJhbmdlRW5kKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIHRoaXMuZHJEYXRlcGlja2VyLmN1c3RvbVJhbmdlcy5zb21lKHJhbmdlID0+IHRoaXMuaXNTYW1lUmFuZ2UocmFuZ2UpKVxuXHR9XG5cblx0Z2V0V2lkdGhEYXRlUmFuZ2VQaWNrZXIoKXtcblx0XHRpZih0aGlzLmRyRGF0ZXBpY2tlci5kdWFsVmlldyl7XG5cdFx0XHRpZih0aGlzLmRyRGF0ZXBpY2tlci5zaG93Q3VzdG9tUmFuZ2VzICYmIHRoaXMuZHJEYXRlcGlja2VyLmN1c3RvbVJhbmdlcy5sZW5ndGgpe1xuXHRcdFx0XHRyZXR1cm4gJzY1NXB4J1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICc2MDBweCdcblx0XHR9XG5cdFx0aWYodGhpcy5kckRhdGVwaWNrZXIuc2hvd0N1c3RvbVJhbmdlcyAmJiB0aGlzLmRyRGF0ZXBpY2tlci5jdXN0b21SYW5nZXMubGVuZ3RoKXtcblx0XHRcdHJldHVybiAnNDUwcHgnXG5cdFx0fVxuXHR9XG5cblx0c2V0QWN0aXZlRGF0ZShmcm9tOiBELCB0bzogRCl7XG5cdFx0Y29uc3QgZnJvbU1vbnRoID0gdGhpcy5kckRhdGVwaWNrZXIuX2RyRGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZnJvbSlcblx0XHRjb25zdCB0b01vbnRoID0gdGhpcy5kckRhdGVwaWNrZXIuX2RyRGF0ZUFkYXB0ZXIuZ2V0TW9udGgodG8pXG5cblx0XHRjb25zdCB0b1llYXIgPSB0aGlzLmRyRGF0ZXBpY2tlci5fZHJEYXRlQWRhcHRlci5nZXRZZWFyKHRvKVxuXHRcdGNvbnN0IHRvRGF0ZSA9IHRoaXMuZHJEYXRlcGlja2VyLl9kckRhdGVBZGFwdGVyLmdldERhdGUodG8pXG5cblx0XHRsZXQgeSwgbVxuXHRcdGlmKHRvTW9udGggPT09IDExKXtcblx0XHRcdG0gPSAwXG5cdFx0XHR5ID0gdG9ZZWFyICsgMVxuXHRcdH1lbHNle1xuXHRcdFx0bSA9IHRvTW9udGggKyAxLFxuXHRcdFx0eSA9IHRvWWVhclxuXHRcdH1cblx0XHRjb25zdCBlbmREYXRlID0gdGhpcy5kckRhdGVwaWNrZXIuX2RyRGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5LCBtLCAxKVxuXG5cdFx0dGhpcy5jYWxlbmRhcnMuZm9yRWFjaCgoY2FsZW5kYXIsIGkpID0+IHtcblx0XHRcdGlmKGkgPT09IDApe1xuXHRcdFx0XHRjYWxlbmRhci5hY3RpdmVEYXRlID0gZnJvbVxuXHRcdFx0fWVsc2V7XG5cdFx0XHRcdGlmKGZyb21Nb250aCAhPT0gdG9Nb250aCl7IC8vIGlmIHN0YXJ0IG1vbnRoICYgZW5kIG1vbnRoIGFyZSBkaWZmZXJlbnRzXG5cdFx0XHRcdFx0Y2FsZW5kYXIuYWN0aXZlRGF0ZSA9IHRvXG5cdFx0XHRcdH1lbHNle1xuXHRcdFx0XHRcdGNhbGVuZGFyLmFjdGl2ZURhdGUgPSBlbmREYXRlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KVxuXHR9XG59XG4iXX0=