@taiga-ui/core
Version:
Core library for creating Angular components and applications using Taiga UI
147 lines • 25.5 kB
JavaScript
import { NgIf } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, inject, Input, Output, } from '@angular/core';
import { TUI_FIRST_DAY, TUI_LAST_DAY, TUI_LAST_DISPLAYED_DAY, TuiDay, TuiMonth, } from '@taiga-ui/cdk/date-time';
import { TuiMapperPipe } from '@taiga-ui/cdk/pipes/mapper';
import { tuiNullableSame } from '@taiga-ui/cdk/utils/miscellaneous';
import { TuiScrollbar } from '@taiga-ui/core/components/scrollbar';
import { TUI_ITEMS_HANDLERS } from '@taiga-ui/core/directives';
import { tuiAsAuxiliary } from '@taiga-ui/core/tokens';
import { Subject } from 'rxjs';
import { TuiCalendarSheet } from './calendar-sheet.component';
import { TUI_CALENDAR_SHEET_OPTIONS } from './calendar-sheet.options';
import { TuiCalendarSpin } from './calendar-spin.component';
import { TuiCalendarYear } from './calendar-year.component';
import * as i0 from "@angular/core";
class TuiCalendar {
constructor() {
this.cdr = inject(ChangeDetectorRef);
this.day = null;
this.view = 'month';
this.options = inject(TUI_CALENDAR_SHEET_OPTIONS);
this.month = TuiMonth.currentLocal();
this.disabledItemHandler = inject(TUI_ITEMS_HANDLERS).disabledItemHandler();
this.min = TUI_FIRST_DAY;
this.max = TUI_LAST_DAY;
this.minViewedMonth = TUI_FIRST_DAY;
this.maxViewedMonth = TUI_LAST_DAY;
this.hoveredItem = null;
this.showAdjacent = true;
this.markerHandler = null;
this.dayClick = new EventEmitter();
this.monthChange = new EventEmitter();
this.hoveredItemChange = new EventEmitter();
/** @deprecated for private use only until Calendars are refactored */
this.valueChange = new Subject();
this.disabledItemHandlerMapper = (disabledItemHandler, min, max) => (item) => item.dayBefore(min) || item.dayAfter(max) || disabledItemHandler(item);
}
set value(value) {
this.cdr.markForCheck();
this.day = value;
if (this.showAdjacent &&
value instanceof TuiDay &&
value.daySameOrBefore(TUI_LAST_DISPLAYED_DAY)) {
this.month = value;
}
}
set initialView(view) {
this.view = view;
}
get value() {
return this.day;
}
onPaginationValueChange(month) {
this.updateViewedMonth(month);
}
onDayClick(day) {
this.dayClick.emit(day);
this.valueChange.next(day);
}
onHoveredItemChange(day) {
this.updateHoveredDay(day);
}
get computedMin() {
return this.min ?? TUI_FIRST_DAY;
}
get computedMax() {
return this.max ?? TUI_LAST_DAY;
}
get computedMinViewedMonth() {
const min = this.computedMin;
const minViewed = this.minViewedMonth ?? TUI_FIRST_DAY;
return minViewed.monthSameOrAfter(min) ? minViewed : min;
}
get computedMaxViewedMonth() {
const max = this.computedMax;
const maxViewed = this.maxViewedMonth ?? TUI_LAST_DAY;
return maxViewed.monthSameOrBefore(max) ? maxViewed : max;
}
get isInYearView() {
return this.view === 'year';
}
onPaginationYearClick() {
this.view = 'year';
}
onPickerYearClick(year) {
this.view = 'month';
this.updateViewedMonth(new TuiMonth(year, this.month.month));
}
updateViewedMonth(month) {
if (this.month.monthSame(month)) {
return;
}
this.month = month;
this.monthChange.emit(month);
}
updateHoveredDay(day) {
if (tuiNullableSame(this.hoveredItem, day, (a, b) => a.daySame(b))) {
return;
}
this.hoveredItem = day;
this.hoveredItemChange.emit(day);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiCalendar, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiCalendar, isStandalone: true, selector: "tui-calendar", inputs: { month: "month", disabledItemHandler: "disabledItemHandler", min: "min", max: "max", minViewedMonth: "minViewedMonth", maxViewedMonth: "maxViewedMonth", hoveredItem: "hoveredItem", showAdjacent: "showAdjacent", markerHandler: "markerHandler", value: "value", initialView: "initialView" }, outputs: { dayClick: "dayClick", monthChange: "monthChange", hoveredItemChange: "hoveredItemChange" }, host: { listeners: { "pointerdown.prevent.zoneless": "0" } }, providers: [tuiAsAuxiliary(TuiCalendar)], ngImport: i0, template: "<tui-scrollbar\n *ngIf=\"isInYearView; else calendar\"\n automation-id=\"tui-calendar__scrollbar\"\n class=\"t-scrollbar\"\n>\n <tui-calendar-year\n automation-id=\"tui-calendar__year\"\n [initialItem]=\"month.year\"\n [max]=\"computedMax.year\"\n [min]=\"computedMin.year\"\n [rangeMode]=\"options.rangeMode\"\n [value]=\"value\"\n (yearClick)=\"onPickerYearClick($event)\"\n />\n</tui-scrollbar>\n<ng-template #calendar>\n <tui-calendar-spin\n automation-id=\"tui-calendar__pagination\"\n class=\"t-pagination\"\n [max]=\"computedMaxViewedMonth\"\n [min]=\"computedMinViewedMonth\"\n [value]=\"month\"\n (valueChange)=\"onPaginationValueChange($event)\"\n (yearClick)=\"onPaginationYearClick()\"\n />\n <tui-calendar-sheet\n automation-id=\"tui-calendar__calendar\"\n [disabledItemHandler]=\"disabledItemHandler | tuiMapper: disabledItemHandlerMapper : computedMin : computedMax\"\n [hoveredItem]=\"hoveredItem\"\n [markerHandler]=\"markerHandler\"\n [month]=\"month\"\n [showAdjacent]=\"showAdjacent\"\n [value]=\"value\"\n (dayClick)=\"onDayClick($event)\"\n (hoveredItemChange)=\"onHoveredItemChange($event)\"\n />\n</ng-template>\n", styles: [":host{display:block;min-block-size:20.25rem;inline-size:18rem;padding:1rem 1.125rem;box-sizing:border-box;flex-shrink:0}:host-context(tui-dropdown-mobile){inline-size:100%}tui-calendar-year{padding:0}.t-scrollbar{block-size:18.25rem;inline-size:calc(100% + 1rem)}.t-pagination{margin-block-end:1rem}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TuiCalendarSheet, selector: "tui-calendar-sheet", inputs: ["month", "disabledItemHandler", "markerHandler", "value", "hoveredItem", "showAdjacent", "single"], outputs: ["hoveredItemChange", "dayClick"] }, { kind: "component", type: TuiCalendarSpin, selector: "tui-calendar-spin", inputs: ["value", "min", "max"], outputs: ["valueChange", "yearClick"] }, { kind: "component", type: TuiCalendarYear, selector: "tui-calendar-year", inputs: ["rangeMode", "disabledItemHandler", "initialItem", "min", "max", "value"], outputs: ["yearClick"] }, { kind: "pipe", type: TuiMapperPipe, name: "tuiMapper" }, { kind: "component", type: TuiScrollbar, selector: "tui-scrollbar", inputs: ["hidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiCalendar };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiCalendar, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'tui-calendar', imports: [
NgIf,
TuiCalendarSheet,
TuiCalendarSpin,
TuiCalendarYear,
TuiMapperPipe,
TuiScrollbar,
], changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiAsAuxiliary(TuiCalendar)], host: {
'(pointerdown.prevent.zoneless)': '0',
}, template: "<tui-scrollbar\n *ngIf=\"isInYearView; else calendar\"\n automation-id=\"tui-calendar__scrollbar\"\n class=\"t-scrollbar\"\n>\n <tui-calendar-year\n automation-id=\"tui-calendar__year\"\n [initialItem]=\"month.year\"\n [max]=\"computedMax.year\"\n [min]=\"computedMin.year\"\n [rangeMode]=\"options.rangeMode\"\n [value]=\"value\"\n (yearClick)=\"onPickerYearClick($event)\"\n />\n</tui-scrollbar>\n<ng-template #calendar>\n <tui-calendar-spin\n automation-id=\"tui-calendar__pagination\"\n class=\"t-pagination\"\n [max]=\"computedMaxViewedMonth\"\n [min]=\"computedMinViewedMonth\"\n [value]=\"month\"\n (valueChange)=\"onPaginationValueChange($event)\"\n (yearClick)=\"onPaginationYearClick()\"\n />\n <tui-calendar-sheet\n automation-id=\"tui-calendar__calendar\"\n [disabledItemHandler]=\"disabledItemHandler | tuiMapper: disabledItemHandlerMapper : computedMin : computedMax\"\n [hoveredItem]=\"hoveredItem\"\n [markerHandler]=\"markerHandler\"\n [month]=\"month\"\n [showAdjacent]=\"showAdjacent\"\n [value]=\"value\"\n (dayClick)=\"onDayClick($event)\"\n (hoveredItemChange)=\"onHoveredItemChange($event)\"\n />\n</ng-template>\n", styles: [":host{display:block;min-block-size:20.25rem;inline-size:18rem;padding:1rem 1.125rem;box-sizing:border-box;flex-shrink:0}:host-context(tui-dropdown-mobile){inline-size:100%}tui-calendar-year{padding:0}.t-scrollbar{block-size:18.25rem;inline-size:calc(100% + 1rem)}.t-pagination{margin-block-end:1rem}\n"] }]
}], propDecorators: { month: [{
type: Input
}], disabledItemHandler: [{
type: Input
}], min: [{
type: Input
}], max: [{
type: Input
}], minViewedMonth: [{
type: Input
}], maxViewedMonth: [{
type: Input
}], hoveredItem: [{
type: Input
}], showAdjacent: [{
type: Input
}], markerHandler: [{
type: Input
}], dayClick: [{
type: Output
}], monthChange: [{
type: Output
}], hoveredItemChange: [{
type: Output
}], value: [{
type: Input
}], initialView: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9jb21wb25lbnRzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvY29tcG9uZW50cy9jYWxlbmRhci9jYWxlbmRhci50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNyQyxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxhQUFhLEVBQ2IsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixNQUFNLEVBRU4sUUFBUSxHQUNYLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFDLGdCQUFnQixFQUF3QixNQUFNLDRCQUE0QixDQUFDO0FBQ25GLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0s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QUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDOytHQTNJUSxXQUFXO21HQUFYLFdBQVcsMGdCQUxULENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLDBCQzdDNUMsK3lDQXFDQSx1V0RGUSxJQUFJLDZGQUNKLGdCQUFnQix3TkFDaEIsZUFBZSxzSUFDZixlQUFlLHFLQUNmLGFBQWEsa0RBQ2IsWUFBWTs7U0FVUCxXQUFXOzRGQUFYLFdBQVc7a0JBbkJ2QixTQUFTO2lDQUNNLElBQUksWUFDTixjQUFjLFdBQ2Y7d0JBQ0wsSUFBSTt3QkFDSixnQkFBZ0I7d0JBQ2hCLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixhQUFhO3dCQUNiLFlBQVk7cUJBQ2YsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEMsQ0FBQyxjQUFjLGFBQWEsQ0FBQyxRQUNsQzt3QkFDRixnQ0FBZ0MsRUFBRSxHQUFHO3FCQUN4Qzs4QkFTTSxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQUtDLEdBQUc7c0JBRFQsS0FBSztnQkFJQyxHQUFHO3NCQURULEtBQUs7Z0JBSUMsY0FBYztzQkFEcEIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLFdBQVc7c0JBRGpCLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlVLFFBQVE7c0JBRHZCLE1BQU07Z0JBSVMsV0FBVztzQkFEMUIsTUFBTTtnQkFJUyxpQkFBaUI7c0JBRGhDLE1BQU07Z0JBT0ksS0FBSztzQkFEZixLQUFLO2dCQWVLLFdBQVc7c0JBRHJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05nSWZ9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIFRVSV9GSVJTVF9EQVksXG4gICAgVFVJX0xBU1RfREFZLFxuICAgIFRVSV9MQVNUX0RJU1BMQVlFRF9EQVksXG4gICAgVHVpRGF5LFxuICAgIHR5cGUgVHVpRGF5UmFuZ2UsXG4gICAgVHVpTW9udGgsXG59IGZyb20gJ0B0YWlnYS11aS9jZGsvZGF0ZS10aW1lJztcbmltcG9ydCB7VHVpTWFwcGVyUGlwZX0gZnJvbSAnQHRhaWdhLXVpL2Nkay9waXBlcy9tYXBwZXInO1xuaW1wb3J0IHt0eXBlIFR1aUJvb2xlYW5IYW5kbGVyLCB0eXBlIFR1aU1hcHBlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay90eXBlcyc7XG5pbXBvcnQge3R1aU51bGxhYmxlU2FtZX0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9taXNjZWxsYW5lb3VzJztcbmltcG9ydCB7VHVpU2Nyb2xsYmFyfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL3Njcm9sbGJhcic7XG5pbXBvcnQge1RVSV9JVEVNU19IQU5ETEVSU30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcyc7XG5pbXBvcnQge3R1aUFzQXV4aWxpYXJ5fSBmcm9tICdAdGFpZ2EtdWkvY29yZS90b2tlbnMnO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtUdWlDYWxlbmRhclNoZWV0LCB0eXBlIFR1aU1hcmtlckhhbmRsZXJ9IGZyb20gJy4vY2FsZW5kYXItc2hlZXQuY29tcG9uZW50JztcbmltcG9ydCB7VFVJX0NBTEVOREFSX1NIRUVUX09QVElPTlN9IGZyb20gJy4vY2FsZW5kYXItc2hlZXQub3B0aW9ucyc7XG5pbXBvcnQge1R1aUNhbGVuZGFyU3Bpbn0gZnJvbSAnLi9jYWxlbmRhci1zcGluLmNvbXBvbmVudCc7XG5pbXBvcnQge1R1aUNhbGVuZGFyWWVhcn0gZnJvbSAnLi9jYWxlbmRhci15ZWFyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICd0dWktY2FsZW5kYXInLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTmdJZixcbiAgICAgICAgVHVpQ2FsZW5kYXJTaGVldCxcbiAgICAgICAgVHVpQ2FsZW5kYXJTcGluLFxuICAgICAgICBUdWlDYWxlbmRhclllYXIsXG4gICAgICAgIFR1aU1hcHBlclBpcGUsXG4gICAgICAgIFR1aVNjcm9sbGJhcixcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbdHVpQXNBdXhpbGlhcnkoVHVpQ2FsZW5kYXIpXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcocG9pbnRlcmRvd24ucHJldmVudC56b25lbGVzcyknOiAnMCcsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpQ2FsZW5kYXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcml2YXRlIGRheTogVHVpRGF5IHwgVHVpRGF5UmFuZ2UgfCByZWFkb25seSBUdWlEYXlbXSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgdmlldzogJ21vbnRoJyB8ICd5ZWFyJyA9ICdtb250aCc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wdGlvbnMgPSBpbmplY3QoVFVJX0NBTEVOREFSX1NIRUVUX09QVElPTlMpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbW9udGg6IFR1aU1vbnRoID0gVHVpTW9udGguY3VycmVudExvY2FsKCk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlZEl0ZW1IYW5kbGVyOiBUdWlCb29sZWFuSGFuZGxlcjxUdWlEYXk+ID1cbiAgICAgICAgaW5qZWN0KFRVSV9JVEVNU19IQU5ETEVSUykuZGlzYWJsZWRJdGVtSGFuZGxlcigpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluOiBUdWlEYXkgfCBudWxsID0gVFVJX0ZJUlNUX0RBWTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heDogVHVpRGF5IHwgbnVsbCA9IFRVSV9MQVNUX0RBWTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1pblZpZXdlZE1vbnRoOiBUdWlNb250aCB8IG51bGwgPSBUVUlfRklSU1RfREFZO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4Vmlld2VkTW9udGg6IFR1aU1vbnRoIHwgbnVsbCA9IFRVSV9MQVNUX0RBWTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhvdmVyZWRJdGVtOiBUdWlEYXkgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dBZGphY2VudCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYXJrZXJIYW5kbGVyOiBUdWlNYXJrZXJIYW5kbGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGF5Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFR1aURheT4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBtb250aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VHVpTW9udGg+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgaG92ZXJlZEl0ZW1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFR1aURheSB8IG51bGw+KCk7XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgZm9yIHByaXZhdGUgdXNlIG9ubHkgdW50aWwgQ2FsZW5kYXJzIGFyZSByZWZhY3RvcmVkICovXG4gICAgcHVibGljIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gbmV3IFN1YmplY3Q8VHVpRGF5PigpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBUdWlEYXkgfCBUdWlEYXlSYW5nZSB8IHJlYWRvbmx5IFR1aURheVtdIHwgbnVsbCkge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5kYXkgPSB2YWx1ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNob3dBZGphY2VudCAmJlxuICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBUdWlEYXkgJiZcbiAgICAgICAgICAgIHZhbHVlLmRheVNhbWVPckJlZm9yZShUVUlfTEFTVF9ESVNQTEFZRURfREFZKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMubW9udGggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBpbml0aWFsVmlldyh2aWV3OiAnbW9udGgnIHwgJ3llYXInKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBUdWlEYXkgfCBUdWlEYXlSYW5nZSB8IHJlYWRvbmx5IFR1aURheVtdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRheTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25QYWdpbmF0aW9uVmFsdWVDaGFuZ2UobW9udGg6IFR1aU1vbnRoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld2VkTW9udGgobW9udGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkRheUNsaWNrKGRheTogVHVpRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF5Q2xpY2suZW1pdChkYXkpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLm5leHQoZGF5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Ib3ZlcmVkSXRlbUNoYW5nZShkYXk6IFR1aURheSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVIb3ZlcmVkRGF5KGRheSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBjb21wdXRlZE1pbigpOiBUdWlEYXkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4gPz8gVFVJX0ZJUlNUX0RBWTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGNvbXB1dGVkTWF4KCk6IFR1aURheSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heCA/PyBUVUlfTEFTVF9EQVk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBjb21wdXRlZE1pblZpZXdlZE1vbnRoKCk6IFR1aU1vbnRoIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5jb21wdXRlZE1pbjtcbiAgICAgICAgY29uc3QgbWluVmlld2VkID0gdGhpcy5taW5WaWV3ZWRNb250aCA/PyBUVUlfRklSU1RfREFZO1xuXG4gICAgICAgIHJldHVybiBtaW5WaWV3ZWQubW9udGhTYW1lT3JBZnRlcihtaW4pID8gbWluVmlld2VkIDogbWluO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgY29tcHV0ZWRNYXhWaWV3ZWRNb250aCgpOiBUdWlNb250aCB7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMuY29tcHV0ZWRNYXg7XG4gICAgICAgIGNvbnN0IG1heFZpZXdlZCA9IHRoaXMubWF4Vmlld2VkTW9udGggPz8gVFVJX0xBU1RfREFZO1xuXG4gICAgICAgIHJldHVybiBtYXhWaWV3ZWQubW9udGhTYW1lT3JCZWZvcmUobWF4KSA/IG1heFZpZXdlZCA6IG1heDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGlzSW5ZZWFyVmlldygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldyA9PT0gJ3llYXInO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNhYmxlZEl0ZW1IYW5kbGVyTWFwcGVyOiBUdWlNYXBwZXI8XG4gICAgICAgIFtUdWlCb29sZWFuSGFuZGxlcjxUdWlEYXk+LCBUdWlEYXksIFR1aURheV0sXG4gICAgICAgIFR1aUJvb2xlYW5IYW5kbGVyPFR1aURheT5cbiAgICA+ID0gKGRpc2FibGVkSXRlbUhhbmRsZXIsIG1pbiwgbWF4KSA9PiAoaXRlbSkgPT5cbiAgICAgICAgaXRlbS5kYXlCZWZvcmUobWluKSB8fCBpdGVtLmRheUFmdGVyKG1heCkgfHwgZGlzYWJsZWRJdGVtSGFuZGxlcihpdGVtKTtcblxuICAgIHByb3RlY3RlZCBvblBhZ2luYXRpb25ZZWFyQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmlldyA9ICd5ZWFyJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25QaWNrZXJZZWFyQ2xpY2soeWVhcjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmlldyA9ICdtb250aCc7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld2VkTW9udGgobmV3IFR1aU1vbnRoKHllYXIsIHRoaXMubW9udGgubW9udGgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVZpZXdlZE1vbnRoKG1vbnRoOiBUdWlNb250aCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb250aC5tb250aFNhbWUobW9udGgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vbnRoID0gbW9udGg7XG4gICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdChtb250aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVIb3ZlcmVkRGF5KGRheTogVHVpRGF5IHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodHVpTnVsbGFibGVTYW1lKHRoaXMuaG92ZXJlZEl0ZW0sIGRheSwgKGEsIGIpID0+IGEuZGF5U2FtZShiKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaG92ZXJlZEl0ZW0gPSBkYXk7XG4gICAgICAgIHRoaXMuaG92ZXJlZEl0ZW1DaGFuZ2UuZW1pdChkYXkpO1xuICAgIH1cbn1cbiIsIjx0dWktc2Nyb2xsYmFyXG4gICAgKm5nSWY9XCJpc0luWWVhclZpZXc7IGVsc2UgY2FsZW5kYXJcIlxuICAgIGF1dG9tYXRpb24taWQ9XCJ0dWktY2FsZW5kYXJfX3Njcm9sbGJhclwiXG4gICAgY2xhc3M9XCJ0LXNjcm9sbGJhclwiXG4+XG4gICAgPHR1aS1jYWxlbmRhci15ZWFyXG4gICAgICAgIGF1dG9tYXRpb24taWQ9XCJ0dWktY2FsZW5kYXJfX3llYXJcIlxuICAgICAgICBbaW5pdGlhbEl0ZW1dPVwibW9udGgueWVhclwiXG4gICAgICAgIFttYXhdPVwiY29tcHV0ZWRNYXgueWVhclwiXG4gICAgICAgIFttaW5dPVwiY29tcHV0ZWRNaW4ueWVhclwiXG4gICAgICAgIFtyYW5nZU1vZGVdPVwib3B0aW9ucy5yYW5nZU1vZGVcIlxuICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAoeWVhckNsaWNrKT1cIm9uUGlja2VyWWVhckNsaWNrKCRldmVudClcIlxuICAgIC8+XG48L3R1aS1zY3JvbGxiYXI+XG48bmctdGVtcGxhdGUgI2NhbGVuZGFyPlxuICAgIDx0dWktY2FsZW5kYXItc3BpblxuICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWNhbGVuZGFyX19wYWdpbmF0aW9uXCJcbiAgICAgICAgY2xhc3M9XCJ0LXBhZ2luYXRpb25cIlxuICAgICAgICBbbWF4XT1cImNvbXB1dGVkTWF4Vmlld2VkTW9udGhcIlxuICAgICAgICBbbWluXT1cImNvbXB1dGVkTWluVmlld2VkTW9udGhcIlxuICAgICAgICBbdmFsdWVdPVwibW9udGhcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25QYWdpbmF0aW9uVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICh5ZWFyQ2xpY2spPVwib25QYWdpbmF0aW9uWWVhckNsaWNrKClcIlxuICAgIC8+XG4gICAgPHR1aS1jYWxlbmRhci1zaGVldFxuICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWNhbGVuZGFyX19jYWxlbmRhclwiXG4gICAgICAgIFtkaXNhYmxlZEl0ZW1IYW5kbGVyXT1cImRpc2FibGVkSXRlbUhhbmRsZXIgfCB0dWlNYXBwZXI6IGRpc2FibGVkSXRlbUhhbmRsZXJNYXBwZXIgOiBjb21wdXRlZE1pbiA6IGNvbXB1dGVkTWF4XCJcbiAgICAgICAgW2hvdmVyZWRJdGVtXT1cImhvdmVyZWRJdGVtXCJcbiAgICAgICAgW21hcmtlckhhbmRsZXJdPVwibWFya2VySGFuZGxlclwiXG4gICAgICAgIFttb250aF09XCJtb250aFwiXG4gICAgICAgIFtzaG93QWRqYWNlbnRdPVwic2hvd0FkamFjZW50XCJcbiAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgKGRheUNsaWNrKT1cIm9uRGF5Q2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChob3ZlcmVkSXRlbUNoYW5nZSk9XCJvbkhvdmVyZWRJdGVtQ2hhbmdlKCRldmVudClcIlxuICAgIC8+XG48L25nLXRlbXBsYXRlPlxuIl19