@taiga-ui/kit
Version:
Taiga UI Angular main components kit
214 lines • 31.1 kB
JavaScript
import { __decorate, __param } from "tslib";
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Inject, Input, Output, } from '@angular/core';
import { ALWAYS_FALSE_HANDLER, nullableSame, TUI_FIRST_DAY, TUI_LAST_DAY, TuiDay, tuiDefaultProp, TuiMonth, TuiMonthRange, tuiPure, } from '@taiga-ui/cdk';
import { TUI_CALENDAR_MONTHS } from '@taiga-ui/kit/tokens';
import { Observable } from 'rxjs';
var TODAY = TuiDay.currentLocal();
// @dynamic
var TuiCalendarMonthComponent = /** @class */ (function () {
function TuiCalendarMonthComponent(months$) {
this.months$ = months$;
this.value = null;
this.year = TODAY;
this.disabledItemHandler = ALWAYS_FALSE_HANDLER;
this.min = TUI_FIRST_DAY;
this.max = TUI_LAST_DAY;
this.monthClick = new EventEmitter();
this.hoveredItemChange = new EventEmitter();
this.yearChange = new EventEmitter();
this.isYearPickerShown = false;
this.hoveredItem = null;
this.pressedItem = null;
}
Object.defineProperty(TuiCalendarMonthComponent.prototype, "isSingle", {
get: function () {
return (this.value !== null &&
(this.value instanceof TuiMonth || this.value.isSingleMonth));
},
enumerable: true,
configurable: true
});
Object.defineProperty(TuiCalendarMonthComponent.prototype, "previousYearDisabled", {
get: function () {
return this.year.yearSameOrBefore(this.min);
},
enumerable: true,
configurable: true
});
Object.defineProperty(TuiCalendarMonthComponent.prototype, "nextYearDisabled", {
get: function () {
return this.year.yearSameOrAfter(this.max);
},
enumerable: true,
configurable: true
});
TuiCalendarMonthComponent.prototype.getItemState = function (item) {
var _a = this, disabledItemHandlerWithMinMax = _a.disabledItemHandlerWithMinMax, pressedItem = _a.pressedItem, hoveredItem = _a.hoveredItem;
if (disabledItemHandlerWithMinMax(item)) {
return "disabled" /* Disabled */;
}
if (pressedItem !== null && pressedItem.monthSame(item)) {
return "pressed" /* Pressed */;
}
if (hoveredItem !== null && hoveredItem.monthSame(item)) {
return "hovered" /* Hovered */;
}
return null;
};
TuiCalendarMonthComponent.prototype.getItemRange = function (item) {
var _a = this, value = _a.value, hoveredItem = _a.hoveredItem;
if (value === null) {
return null;
}
if (value instanceof TuiMonth) {
return value.monthSame(item) ? "single" /* Single */ : null;
}
var theFirstOfRange = value.from.monthSame(item) && !value.isSingleMonth;
var hoveredItemAfterFrom = hoveredItem !== null &&
hoveredItem.monthAfter(value.from) &&
value.from.monthSame(item) &&
value.isSingleMonth;
var hoveredItemIsCandidatToBeFrom = hoveredItem !== null &&
hoveredItem.monthSame(item) &&
hoveredItem.monthBefore(value.from) &&
value.isSingleMonth;
if (theFirstOfRange || hoveredItemAfterFrom || hoveredItemIsCandidatToBeFrom) {
return "start" /* Start */;
}
var theLastOfRange = value.to.monthSame(item) && !value.isSingleMonth;
var hoveredItemBeforeTo = value.to.monthSame(item) && !value.isSingleMonth;
var hoveredItemIsCandidatToBeTo = hoveredItem !== null &&
hoveredItem.monthSame(item) &&
hoveredItem.monthAfter(value.from) &&
value.isSingleMonth;
if (theLastOfRange || hoveredItemBeforeTo || hoveredItemIsCandidatToBeTo) {
return "end" /* End */;
}
return value.isSingleMonth && value.from.monthSame(item)
? "single" /* Single */
: null;
};
TuiCalendarMonthComponent.prototype.getTuiMonth = function (monthNumber, yearNumber) {
return new TuiMonth(yearNumber, monthNumber);
};
TuiCalendarMonthComponent.prototype.isItemToday = function (item) {
return TODAY.monthSame(item);
};
TuiCalendarMonthComponent.prototype.isItemInsideRange = function (month) {
var _a = this, value = _a.value, hoveredItem = _a.hoveredItem;
if (value === null || value instanceof TuiMonth) {
return false;
}
if (!value.isSingleMonth) {
return value.from.monthSameOrBefore(month) && value.to.monthAfter(month);
}
if (hoveredItem === null) {
return false;
}
var range = TuiMonthRange.sort(value.from, hoveredItem);
return range.from.monthSameOrBefore(month) && range.to.monthAfter(month);
};
TuiCalendarMonthComponent.prototype.onPickerYearClick = function (year) {
this.isYearPickerShown = false;
if (this.year.yearSame(year)) {
return;
}
this.year = year;
this.yearChange.emit(year);
};
TuiCalendarMonthComponent.prototype.onItemClick = function (month) {
if (this.disabledItemHandlerWithMinMax(month)) {
return;
}
this.monthClick.emit(month);
};
TuiCalendarMonthComponent.prototype.onYearClick = function () {
this.isYearPickerShown = true;
};
TuiCalendarMonthComponent.prototype.onNextYear = function () {
this.year = this.year.append({ year: 1 });
};
TuiCalendarMonthComponent.prototype.onPreviousYear = function () {
this.year = this.year.append({ year: -1 });
};
TuiCalendarMonthComponent.prototype.onItemHovered = function (hovered, item) {
this.updateHoveredItem(hovered ? item : null);
};
TuiCalendarMonthComponent.prototype.onItemPressed = function (pressed, item) {
this.updatePressedItem(pressed ? item : null);
};
Object.defineProperty(TuiCalendarMonthComponent.prototype, "disabledItemHandlerWithMinMax", {
get: function () {
return this.calculateDisabledItemHandlerWithMinMax(this.disabledItemHandler, this.value, this.min, this.max);
},
enumerable: true,
configurable: true
});
TuiCalendarMonthComponent.prototype.updateHoveredItem = function (month) {
if (nullableSame(this.hoveredItem, month, function (a, b) { return a.monthSame(b); })) {
return;
}
this.hoveredItem = month;
this.hoveredItemChange.emit(month);
};
TuiCalendarMonthComponent.prototype.updatePressedItem = function (item) {
this.pressedItem = item;
};
TuiCalendarMonthComponent.prototype.calculateDisabledItemHandlerWithMinMax = function (disabledItemHandler, value, min, max) {
return function (item) {
return item.monthBefore(min) ||
item.monthAfter(max) ||
disabledItemHandler(item, { value: value });
};
};
TuiCalendarMonthComponent.ctorParameters = function () { return [
{ type: Observable, decorators: [{ type: Inject, args: [TUI_CALENDAR_MONTHS,] }] }
]; };
__decorate([
Input(),
tuiDefaultProp()
], TuiCalendarMonthComponent.prototype, "value", void 0);
__decorate([
Input(),
tuiDefaultProp()
], TuiCalendarMonthComponent.prototype, "year", void 0);
__decorate([
Input(),
tuiDefaultProp()
], TuiCalendarMonthComponent.prototype, "disabledItemHandler", void 0);
__decorate([
Input(),
tuiDefaultProp()
], TuiCalendarMonthComponent.prototype, "min", void 0);
__decorate([
Input(),
tuiDefaultProp()
], TuiCalendarMonthComponent.prototype, "max", void 0);
__decorate([
Output()
], TuiCalendarMonthComponent.prototype, "monthClick", void 0);
__decorate([
Output()
], TuiCalendarMonthComponent.prototype, "hoveredItemChange", void 0);
__decorate([
Output()
], TuiCalendarMonthComponent.prototype, "yearChange", void 0);
__decorate([
HostBinding('class._single')
], TuiCalendarMonthComponent.prototype, "isSingle", null);
__decorate([
tuiPure
], TuiCalendarMonthComponent.prototype, "calculateDisabledItemHandlerWithMinMax", null);
TuiCalendarMonthComponent = __decorate([
Component({
selector: 'tui-calendar-month',
template: "<tui-scrollbar *ngIf=\"isYearPickerShown; else monthSelect\" class=\"scrollbar\">\n <tui-primitive-year-picker\n [min]=\"min\"\n [max]=\"max\"\n [initialItem]=\"year\"\n [value]=\"value\"\n (yearClick)=\"onPickerYearClick($event)\"\n ></tui-primitive-year-picker>\n</tui-scrollbar>\n<ng-template #monthSelect>\n <tui-primitive-spin-button\n [focusable]=\"false\"\n [leftDisabled]=\"previousYearDisabled\"\n [rightDisabled]=\"nextYearDisabled\"\n (leftClick)=\"onPreviousYear()\"\n (rightClick)=\"onNextYear()\"\n >\n <button tuiLink [tuiFocusable]=\"false\" (click)=\"onYearClick()\">\n {{year.formattedYear}}\n </button>\n </tui-primitive-spin-button>\n <div class=\"row\">\n <ng-container\n *ngFor=\"let month of (months$ | async); let index = index\"\n >\n <div\n *tuiLet=\"getTuiMonth(index, year.year) as item\"\n class=\"cell\"\n [class.cell_today]=\"isItemToday(item)\"\n [class.cell_interval]=\"isItemInsideRange(item)\"\n [attr.data-tui-element-range]=\"getItemRange(item)\"\n [attr.data-tui-element-state]=\"getItemState(item)\"\n (tuiHoveredChange)=\"onItemHovered($event, item)\"\n (tuiPressedChange)=\"onItemHovered($event, item)\"\n (click)=\"onItemClick(item)\"\n >\n <div class=\"item\">{{month}}</div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [":host{font:var(--tui-font-text-m)}.row{position:relative;z-index:0;display:flex;justify-content:space-between;height:36px}.item{position:relative;flex:1;line-height:32px;border-radius:var(--tui-radius-m)}.item:after,.item:before{content:'';position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1;border-radius:var(--tui-radius-m)}.cell{position:relative;display:flex;align-items:center;justify-content:center;width:59px;text-align:center;outline:0;cursor:pointer;background-clip:content-box;box-sizing:border-box;border:2px solid transparent;box-sizing:content-box}.cell:before{content:'';position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1;border-radius:var(--tui-radius-m)}.cell_today:after{position:absolute;left:50%;transform:translate(-50%,0);content:'';bottom:5px;height:2px;width:12px;border-radius:6px;background-color:var(--tui-text-02)}.cell_interval:before{background:var(--tui-base-02)}:host._single .cell_interval:before{background:var(--tui-secondary-hover)}.cell_interval:not(:last-child):before{right:-59px}.cell_interval:last-child:first-child:before{right:0}.cell_interval:first-child>.item{border-top-left-radius:var(--tui-radius-m);border-bottom-left-radius:var(--tui-radius-m)}.cell_interval:last-child>.item{border-top-right-radius:var(--tui-radius-m);border-bottom-right-radius:var(--tui-radius-m)}.cell_interval>.item{border-radius:0}.cell[data-tui-element-range]:after{background-color:var(--tui-primary-text)}.cell[data-tui-element-range]>.item{color:var(--tui-primary-text)}.cell[data-tui-element-range]>.item:after,.cell[data-tui-element-range]>.item:before{background-color:var(--tui-primary)}.cell[data-tui-element-range][data-tui-element-state=hovered]>.item:after,.cell[data-tui-element-range][data-tui-element-state=hovered]>.item:before{background-color:var(--tui-primary-hover)}.cell[data-tui-element-range][data-tui-element-state=pressed]>.item:after,.cell[data-tui-element-range][data-tui-element-state=pressed]>.item:before{background-color:var(--tui-primary-active)}.cell[data-tui-element-range=end]>.item:before{left:4px}.cell[data-tui-element-range=end]>.item:after{left:-32px;right:100%;transform:translateX(23px) scaleY(.6) scaleX(.4) rotate(45deg)}.cell[data-tui-element-range=start]>.item:before{right:4px}.cell[data-tui-element-range=start]>.item:after{left:100%;right:-32px;transform:translateX(-23px) scaleY(.6) scaleX(.4) rotate(45deg)}.cell[data-tui-element-state=disabled]{pointer-events:none}.cell[data-tui-element-state=disabled]>.item{opacity:.36}.cell[data-tui-element-state=hovered]:hover:not([data-tui-element-range])>.item{background-color:var(--tui-secondary-hover)}.cell[data-tui-element-state=pressed]:hover:not([data-tui-element-range])>.item{background-color:var(--tui-secondary-active)}:host{display:block;height:218px;width:252px;padding:18px;box-sizing:content-box}.row{flex-wrap:wrap;margin-top:23px}.cell:nth-child(n+5){margin-top:28px}.cell_interval:nth-child(4n):before{right:0}.scrollbar{height:inherit;width:inherit}"]
}),
__param(0, Inject(TUI_CALENDAR_MONTHS))
], TuiCalendarMonthComponent);
return TuiCalendarMonthComponent;
}());
export { TuiCalendarMonthComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL2NhbGVuZGFyLW1vbnRoLyIsInNvdXJjZXMiOlsiY2FsZW5kYXItbW9udGguY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxvQkFBb0IsRUFDcEIsWUFBWSxFQUNaLGFBQWEsRUFDYixZQUFZLEVBRVosTUFBTSxFQUNOLGNBQWMsRUFDZCxRQUFRLEVBQ1IsYUFBYSxFQUNiLE9BQU8sR0FFVixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWhDLElBQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUVwQyxXQUFXO0FBT1g7SUFzQ0ksbUNBQzBDLE9BQXNDO1FBQXRDLFlBQU8sR0FBUCxPQUFPLENBQStCO1FBcENoRixVQUFLLEdBQW9DLElBQUksQ0FBQztRQUk5QyxTQUFJLEdBQVksS0FBSyxDQUFDO1FBSXRCLHdCQUFtQixHQUdmLG9CQUFvQixDQUFDO1FBSXpCLFFBQUcsR0FBYSxhQUFhLENBQUM7UUFJOUIsUUFBRyxHQUFhLFlBQVksQ0FBQztRQUdwQixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUcxQyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUd4RCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVsRCxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFMUIsZ0JBQVcsR0FBb0IsSUFBSSxDQUFD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QUssRUFBRTtRQUNQLGNBQWMsRUFBRTsyREFDSztJQUl0QjtRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTswRUFJUTtJQUl6QjtRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTswREFDYTtJQUk5QjtRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTswREFDWTtJQUc3QjtRQURDLE1BQU0sRUFBRTtpRUFDMEM7SUFHbkQ7UUFEQyxNQUFNLEVBQUU7d0VBQ3dEO0lBR2pFO1FBREMsTUFBTSxFQUFFO2lFQUN5QztJQVlsRDtRQURDLFdBQVcsQ0FBQyxlQUFlLENBQUM7NkRBTTVCO0lBa0tEO1FBREMsT0FBTzsyRkFXUDtJQTVOUSx5QkFBeUI7UUFOckMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLG9CQUFvQjtZQUM5Qiwra0RBQTZDO1lBRTdDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOztTQUNsRCxDQUFDO1FBd0NPLFdBQUEsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUE7T0F2Q3ZCLHlCQUF5QixDQTZOckM7SUFBRCxnQ0FBQztDQUFBLEFBN05ELElBNk5DO1NBN05ZLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQUxXQVlTX0ZBTFNFX0hBTkRMRVIsXG4gICAgbnVsbGFibGVTYW1lLFxuICAgIFRVSV9GSVJTVF9EQVksXG4gICAgVFVJX0xBU1RfREFZLFxuICAgIFR1aUJvb2xlYW5IYW5kbGVyLFxuICAgIFR1aURheSxcbiAgICB0dWlEZWZhdWx0UHJvcCxcbiAgICBUdWlNb250aCxcbiAgICBUdWlNb250aFJhbmdlLFxuICAgIHR1aVB1cmUsXG4gICAgVHVpWWVhcixcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQge1R1aUludGVyYWN0aXZlU3RhdGUsIFR1aVJhbmdlU3RhdGUsIFR1aVdpdGhPcHRpb25hbE1pbk1heH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHtUdWlNb250aENvbnRleHR9IGZyb20gJ0B0YWlnYS11aS9raXQvaW50ZXJmYWNlcyc7XG5pbXBvcnQge1RVSV9DQUxFTkRBUl9NT05USFN9IGZyb20gJ0B0YWlnYS11aS9raXQvdG9rZW5zJztcbmltcG9ydCB7VHVpQm9vbGVhbkhhbmRsZXJXaXRoQ29udGV4dH0gZnJvbSAnQHRhaWdhLXVpL2tpdC90eXBlcyc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuXG5jb25zdCBUT0RBWSA9IFR1aURheS5jdXJyZW50TG9jYWwoKTtcblxuLy8gQGR5bmFtaWNcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndHVpLWNhbGVuZGFyLW1vbnRoJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItbW9udGgudGVtcGxhdGUuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXItbW9udGguc3R5bGUubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlDYWxlbmRhck1vbnRoQ29tcG9uZW50IGltcGxlbWVudHMgVHVpV2l0aE9wdGlvbmFsTWluTWF4PFR1aU1vbnRoPiB7XG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIHZhbHVlOiBUdWlNb250aFJhbmdlIHwgVHVpTW9udGggfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICB5ZWFyOiBUdWlZZWFyID0gVE9EQVk7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgZGlzYWJsZWRJdGVtSGFuZGxlcjogVHVpQm9vbGVhbkhhbmRsZXJXaXRoQ29udGV4dDxcbiAgICAgICAgVHVpTW9udGgsXG4gICAgICAgIFR1aU1vbnRoQ29udGV4dFxuICAgID4gPSBBTFdBWVNfRkFMU0VfSEFORExFUjtcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBtaW46IFR1aU1vbnRoID0gVFVJX0ZJUlNUX0RBWTtcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBtYXg6IFR1aU1vbnRoID0gVFVJX0xBU1RfREFZO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgbW9udGhDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VHVpTW9udGg+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBob3ZlcmVkSXRlbUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VHVpTW9udGggfCBudWxsPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgeWVhckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VHVpWWVhcj4oKTtcblxuICAgIGlzWWVhclBpY2tlclNob3duID0gZmFsc2U7XG5cbiAgICBob3ZlcmVkSXRlbTogVHVpTW9udGggfCBudWxsID0gbnVsbDtcbiAgICBwcmVzc2VkSXRlbTogVHVpTW9udGggfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFRVSV9DQUxFTkRBUl9NT05USFMpIHJlYWRvbmx5IG1vbnRocyQ6IE9ic2VydmFibGU8cmVhZG9ubHkgc3RyaW5nW10+LFxuICAgICkge31cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuX3NpbmdsZScpXG4gICAgZ2V0IGlzU2luZ2xlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy52YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBUdWlNb250aCB8fCB0aGlzLnZhbHVlLmlzU2luZ2xlTW9udGgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0IHByZXZpb3VzWWVhckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy55ZWFyLnllYXJTYW1lT3JCZWZvcmUodGhpcy5taW4pO1xuICAgIH1cblxuICAgIGdldCBuZXh0WWVhckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy55ZWFyLnllYXJTYW1lT3JBZnRlcih0aGlzLm1heCk7XG4gICAgfVxuXG4gICAgZ2V0SXRlbVN0YXRlKGl0ZW06IFR1aU1vbnRoKTogVHVpSW50ZXJhY3RpdmVTdGF0ZSB8IG51bGwge1xuICAgICAgICBjb25zdCB7ZGlzYWJsZWRJdGVtSGFuZGxlcldpdGhNaW5NYXgsIHByZXNzZWRJdGVtLCBob3ZlcmVkSXRlbX0gPSB0aGlzO1xuXG4gICAgICAgIGlmIChkaXNhYmxlZEl0ZW1IYW5kbGVyV2l0aE1pbk1heChpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIFR1aUludGVyYWN0aXZlU3RhdGUuRGlzYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJlc3NlZEl0ZW0gIT09IG51bGwgJiYgcHJlc3NlZEl0ZW0ubW9udGhTYW1lKGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gVHVpSW50ZXJhY3RpdmVTdGF0ZS5QcmVzc2VkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvdmVyZWRJdGVtICE9PSBudWxsICYmIGhvdmVyZWRJdGVtLm1vbnRoU2FtZShpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIFR1aUludGVyYWN0aXZlU3RhdGUuSG92ZXJlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldEl0ZW1SYW5nZShpdGVtOiBUdWlNb250aCk6IFR1aVJhbmdlU3RhdGUgfCBudWxsIHtcbiAgICAgICAgY29uc3Qge3ZhbHVlLCBob3ZlcmVkSXRlbX0gPSB0aGlzO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUdWlNb250aCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1vbnRoU2FtZShpdGVtKSA/IFR1aVJhbmdlU3RhdGUuU2luZ2xlIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRoZUZpcnN0T2ZSYW5nZSA9IHZhbHVlLmZyb20ubW9udGhTYW1lKGl0ZW0pICYmICF2YWx1ZS5pc1NpbmdsZU1vbnRoO1xuICAgICAgICBjb25zdCBob3ZlcmVkSXRlbUFmdGVyRnJvbSA9XG4gICAgICAgICAgICBob3ZlcmVkSXRlbSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgaG92ZXJlZEl0ZW0ubW9udGhBZnRlcih2YWx1ZS5mcm9tKSAmJlxuICAgICAgICAgICAgdmFsdWUuZnJvbS5tb250aFNhbWUoaXRlbSkgJiZcbiAgICAgICAgICAgIHZhbHVlLmlzU2luZ2xlTW9udGg7XG4gICAgICAgIGNvbnN0IGhvdmVyZWRJdGVtSXNDYW5kaWRhdFRvQmVGcm9tID1cbiAgICAgICAgICAgIGhvdmVyZWRJdGVtICE9PSBudWxsICYmXG4gICAgICAgICAgICBob3ZlcmVkSXRlbS5tb250aFNhbWUoaXRlbSkgJiZcbiAgICAgICAgICAgIGhvdmVyZWRJdGVtLm1vbnRoQmVmb3JlKHZhbHVlLmZyb20pICYmXG4gICAgICAgICAgICB2YWx1ZS5pc1NpbmdsZU1vbnRoO1xuXG4gICAgICAgIGlmICh0aGVGaXJzdE9mUmFuZ2UgfHwgaG92ZXJlZEl0ZW1BZnRlckZyb20gfHwgaG92ZXJlZEl0ZW1Jc0NhbmRpZGF0VG9CZUZyb20pIHtcbiAgICAgICAgICAgIHJldHVybiBUdWlSYW5nZVN0YXRlLlN0YXJ0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhlTGFzdE9mUmFuZ2UgPSB2YWx1ZS50by5tb250aFNhbWUoaXRlbSkgJiYgIXZhbHVlLmlzU2luZ2xlTW9udGg7XG4gICAgICAgIGNvbnN0IGhvdmVyZWRJdGVtQmVmb3JlVG8gPSB2YWx1ZS50by5tb250aFNhbWUoaXRlbSkgJiYgIXZhbHVlLmlzU2luZ2xlTW9udGg7XG4gICAgICAgIGNvbnN0IGhvdmVyZWRJdGVtSXNDYW5kaWRhdFRvQmVUbyA9XG4gICAgICAgICAgICBob3ZlcmVkSXRlbSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgaG92ZXJlZEl0ZW0ubW9udGhTYW1lKGl0ZW0pICYmXG4gICAgICAgICAgICBob3ZlcmVkSXRlbS5tb250aEFmdGVyKHZhbHVlLmZyb20pICYmXG4gICAgICAgICAgICB2YWx1ZS5pc1NpbmdsZU1vbnRoO1xuXG4gICAgICAgIGlmICh0aGVMYXN0T2ZSYW5nZSB8fCBob3ZlcmVkSXRlbUJlZm9yZVRvIHx8IGhvdmVyZWRJdGVtSXNDYW5kaWRhdFRvQmVUbykge1xuICAgICAgICAgICAgcmV0dXJuIFR1aVJhbmdlU3RhdGUuRW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlLmlzU2luZ2xlTW9udGggJiYgdmFsdWUuZnJvbS5tb250aFNhbWUoaXRlbSlcbiAgICAgICAgICAgID8gVHVpUmFuZ2VTdGF0ZS5TaW5nbGVcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXRUdWlNb250aChtb250aE51bWJlcjogbnVtYmVyLCB5ZWFyTnVtYmVyOiBudW1iZXIpOiBUdWlNb250aCB7XG4gICAgICAgIHJldHVybiBuZXcgVHVpTW9udGgoeWVhck51bWJlciwgbW9udGhOdW1iZXIpO1xuICAgIH1cblxuICAgIGlzSXRlbVRvZGF5KGl0ZW06IFR1aU1vbnRoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBUT0RBWS5tb250aFNhbWUoaXRlbSk7XG4gICAgfVxuXG4gICAgaXNJdGVtSW5zaWRlUmFuZ2UobW9udGg6IFR1aU1vbnRoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHt2YWx1ZSwgaG92ZXJlZEl0ZW19ID0gdGhpcztcblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgaW5zdGFuY2VvZiBUdWlNb250aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWx1ZS5pc1NpbmdsZU1vbnRoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuZnJvbS5tb250aFNhbWVPckJlZm9yZShtb250aCkgJiYgdmFsdWUudG8ubW9udGhBZnRlcihtb250aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaG92ZXJlZEl0ZW0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhbmdlID0gVHVpTW9udGhSYW5nZS5zb3J0KHZhbHVlLmZyb20sIGhvdmVyZWRJdGVtKTtcblxuICAgICAgICByZXR1cm4gcmFuZ2UuZnJvbS5tb250aFNhbWVPckJlZm9yZShtb250aCkgJiYgcmFuZ2UudG8ubW9udGhBZnRlcihtb250aCk7XG4gICAgfVxuXG4gICAgb25QaWNrZXJZZWFyQ2xpY2soeWVhcjogVHVpWWVhcikge1xuICAgICAgICB0aGlzLmlzWWVhclBpY2tlclNob3duID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMueWVhci55ZWFyU2FtZSh5ZWFyKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy55ZWFyID0geWVhcjtcbiAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeWVhcik7XG4gICAgfVxuXG4gICAgb25JdGVtQ2xpY2sobW9udGg6IFR1aU1vbnRoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkSXRlbUhhbmRsZXJXaXRoTWluTWF4KG1vbnRoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb250aENsaWNrLmVtaXQobW9udGgpO1xuICAgIH1cblxuICAgIG9uWWVhckNsaWNrKCkge1xuICAgICAgICB0aGlzLmlzWWVhclBpY2tlclNob3duID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBvbk5leHRZZWFyKCkge1xuICAgICAgICB0aGlzLnllYXIgPSB0aGlzLnllYXIuYXBwZW5kKHt5ZWFyOiAxfSk7XG4gICAgfVxuXG4gICAgb25QcmV2aW91c1llYXIoKSB7XG4gICAgICAgIHRoaXMueWVhciA9IHRoaXMueWVhci5hcHBlbmQoe3llYXI6IC0xfSk7XG4gICAgfVxuXG4gICAgb25JdGVtSG92ZXJlZChob3ZlcmVkOiBib29sZWFuLCBpdGVtOiBUdWlNb250aCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUhvdmVyZWRJdGVtKGhvdmVyZWQgPyBpdGVtIDogbnVsbCk7XG4gICAgfVxuXG4gICAgb25JdGVtUHJlc3NlZChwcmVzc2VkOiBib29sZWFuLCBpdGVtOiBUdWlNb250aCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVByZXNzZWRJdGVtKHByZXNzZWQgPyBpdGVtIDogbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZGlzYWJsZWRJdGVtSGFuZGxlcldpdGhNaW5NYXgoKTogVHVpQm9vbGVhbkhhbmRsZXI8VHVpTW9udGg+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcldpdGhNaW5NYXgoXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkSXRlbUhhbmRsZXIsXG4gICAgICAgICAgICB0aGlzLnZhbHVlLFxuICAgICAgICAgICAgdGhpcy5taW4sXG4gICAgICAgICAgICB0aGlzLm1heCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUhvdmVyZWRJdGVtKG1vbnRoOiBUdWlNb250aCB8IG51bGwpIHtcbiAgICAgICAgaWYgKG51bGxhYmxlU2FtZSh0aGlzLmhvdmVyZWRJdGVtLCBtb250aCwgKGEsIGIpID0+IGEubW9udGhTYW1lKGIpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ob3ZlcmVkSXRlbSA9IG1vbnRoO1xuICAgICAgICB0aGlzLmhvdmVyZWRJdGVtQ2hhbmdlLmVtaXQobW9udGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUHJlc3NlZEl0ZW0oaXRlbTogVHVpTW9udGggfCBudWxsKSB7XG4gICAgICAgIHRoaXMucHJlc3NlZEl0ZW0gPSBpdGVtO1xuICAgIH1cblxuICAgIEB0dWlQdXJlXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVEaXNhYmxlZEl0ZW1IYW5kbGVyV2l0aE1pbk1heChcbiAgICAgICAgZGlzYWJsZWRJdGVtSGFuZGxlcjogVHVpQm9vbGVhbkhhbmRsZXJXaXRoQ29udGV4dDxUdWlNb250aCwgVHVpTW9udGhDb250ZXh0PixcbiAgICAgICAgdmFsdWU6IFR1aU1vbnRoIHwgVHVpTW9udGhSYW5nZSB8IG51bGwsXG4gICAgICAgIG1pbjogVHVpTW9udGgsXG4gICAgICAgIG1heDogVHVpTW9udGgsXG4gICAgKTogVHVpQm9vbGVhbkhhbmRsZXI8VHVpTW9udGg+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gPT5cbiAgICAgICAgICAgIGl0ZW0ubW9udGhCZWZvcmUobWluKSB8fFxuICAgICAgICAgICAgaXRlbS5tb250aEFmdGVyKG1heCkgfHxcbiAgICAgICAgICAgIGRpc2FibGVkSXRlbUhhbmRsZXIoaXRlbSwge3ZhbHVlfSk7XG4gICAgfVxufVxuIl19