barsa-calendar 2.2.2 → 2.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/esm2022/barsa-calendar.mjs +5 -0
  2. package/esm2022/lib/barsa-calendar.module.mjs +117 -0
  3. package/esm2022/lib/calendar-container/calendar-container.component.mjs +221 -0
  4. package/esm2022/lib/calendar-header/calendar-header.component.mjs +66 -0
  5. package/esm2022/lib/calendar-list/calendar-list.component.mjs +18 -0
  6. package/esm2022/lib/calendar-list-container/calendar-list-container.component.mjs +29 -0
  7. package/esm2022/lib/calendar-list-item/calendar-list-item.component.mjs +14 -0
  8. package/esm2022/lib/calendar-month/calendar-month.component.mjs +249 -0
  9. package/esm2022/lib/calendar-selection-days/calendar-selection-days.component.mjs +196 -0
  10. package/esm2022/lib/calendar-week/calendar-week.component.mjs +255 -0
  11. package/esm2022/lib/constants.mjs +4 -0
  12. package/esm2022/lib/date-time-picker/date-time-picker.component.mjs +457 -0
  13. package/esm2022/lib/day-event-list/day-event-list.component.mjs +58 -0
  14. package/esm2022/lib/day-number-box/day-number-box.component.mjs +105 -0
  15. package/esm2022/lib/days-in-week.pipe.mjs +18 -0
  16. package/esm2022/lib/equal-date.pipe.mjs +24 -0
  17. package/esm2022/lib/event-button/event-button.component.mjs +100 -0
  18. package/esm2022/lib/event-button-end-arrow/event-button-end-arrow.component.mjs +29 -0
  19. package/esm2022/lib/event-button-start-arrow/event-button-start-arrow.component.mjs +29 -0
  20. package/esm2022/lib/event-date.pipe.mjs +25 -0
  21. package/esm2022/lib/event-preview/event-preview.component.mjs +81 -0
  22. package/esm2022/lib/event-time.pipe.mjs +23 -0
  23. package/esm2022/lib/from-to-time.pipe.mjs +24 -0
  24. package/esm2022/lib/models.mjs +14 -0
  25. package/esm2022/lib/month-days/month-days.component.mjs +222 -0
  26. package/esm2022/lib/services/calendar.service.mjs +645 -0
  27. package/esm2022/public-api.mjs +23 -0
  28. package/package.json +3 -1
@@ -0,0 +1,196 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, Self } from '@angular/core';
2
+ import { distinctUntilChanged, map } from 'rxjs/operators';
3
+ import { BaseComponent, DateService, getDateService } from 'barsa-novin-ray-core';
4
+ import { CalendarService } from '../services/calendar.service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../services/calendar.service";
7
+ import * as i2 from "barsa-novin-ray-core";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "@fundamental-ngx/core/button";
10
+ import * as i5 from "@fundamental-ngx/core/title";
11
+ import * as i6 from "@fundamental-ngx/core/popover";
12
+ import * as i7 from "@fundamental-ngx/core/toolbar";
13
+ import * as i8 from "../calendar-month/calendar-month.component";
14
+ export class CalendarSelectionDaysComponent extends BaseComponent {
15
+ constructor(_calendarService, _portalService) {
16
+ super();
17
+ this._calendarService = _calendarService;
18
+ this.rangeChange = new EventEmitter();
19
+ this.selectionMode = 'day';
20
+ this.months = [];
21
+ this._isMouseDown = false;
22
+ this.rtl$ = _portalService.rtl$;
23
+ this.width$ = _portalService.deviceSize$.pipe(distinctUntilChanged(), map((deviceSize) => {
24
+ switch (deviceSize) {
25
+ case 'l':
26
+ case 'xl':
27
+ return 480;
28
+ case 's':
29
+ return 320;
30
+ default:
31
+ return 480;
32
+ }
33
+ }));
34
+ this.weekDaysMin = this._calendarService.weekDaysMin();
35
+ this._calendarService.setMode('month');
36
+ this.weekDays = this._calendarService.weekDays();
37
+ this.selectedMonth$ = this._calendarService.selected$;
38
+ this.today = this._calendarService.today;
39
+ this.months = this._calendarService.Months;
40
+ this._prepareYear(this._calendarService.selectedMonth.dateInfo.year);
41
+ }
42
+ ngOnChanges(changes) {
43
+ super.ngOnChanges(changes);
44
+ const { monthInfo } = changes;
45
+ if (monthInfo) {
46
+ this._calendarService.loadCalendarMonthInfo(monthInfo.currentValue);
47
+ }
48
+ }
49
+ onMonthSelected(monthName, index) {
50
+ this._calendarService.gotoMonth(monthName, index);
51
+ }
52
+ onYearSelected(year) {
53
+ this._calendarService.gotoYear(+year);
54
+ }
55
+ onPrevTap() {
56
+ if (this.selectionMode === 'day') {
57
+ this._calendarService.loadPrevious();
58
+ }
59
+ else if (this.selectionMode === 'month') {
60
+ this._calendarService.loadPrevYear();
61
+ }
62
+ else if (this.selectionMode === 'year') {
63
+ this._prepareYear(Number(this.years[0]) - 20);
64
+ }
65
+ }
66
+ onNextTap() {
67
+ if (this.selectionMode === 'day') {
68
+ this._calendarService.loadNext();
69
+ }
70
+ else if (this.selectionMode === 'month') {
71
+ this._calendarService.loadNextYear();
72
+ }
73
+ else if (this.selectionMode === 'year') {
74
+ this._prepareYear(Number(this.years[this.years.length - 1]) + 1);
75
+ }
76
+ }
77
+ onToday() {
78
+ this._calendarService.gotoToday();
79
+ }
80
+ onDayMouseMove(day, monthInfo) {
81
+ if (this._isMouseDown) {
82
+ const { endDay, startDay } = this.getStartAndEndDay(monthInfo, day);
83
+ this.startSelectedDayIndex = startDay?.index;
84
+ this.endSelectedDayIndex = endDay?.index;
85
+ // console.log('-move-', this.startSelectedDay?.index, this.endSelectedDay?.index);
86
+ }
87
+ }
88
+ onDayMouseDown(day) {
89
+ this._isMouseDown = true;
90
+ this.startSelectedDay = null;
91
+ this.endSelectedDay = null;
92
+ this.startSelectedDay = day;
93
+ this.startSelectedDayIndex = day.index;
94
+ }
95
+ onDayMouseUp(day, monthInfo, popover) {
96
+ this._isMouseDown = false;
97
+ const { endDay, startDay } = this.getStartAndEndDay(monthInfo, day);
98
+ this.startSelectedDay = startDay;
99
+ this.endSelectedDay = endDay;
100
+ this._setFirstAndEndDay(monthInfo, popover);
101
+ }
102
+ onDayClick(day, monthInfo, popover) {
103
+ this.startSelectedDay = this.endSelectedDay = day;
104
+ this._setFirstAndEndDay(monthInfo, popover);
105
+ }
106
+ _prepareYear(from) {
107
+ const years = [];
108
+ for (let i = 0; i < 20; i++) {
109
+ years.push(`${from + i}`);
110
+ }
111
+ this.years = years;
112
+ }
113
+ getStartAndEndDay(monthInfo, day) {
114
+ let startDay = null;
115
+ let endDay = null;
116
+ if (this.startSelectedDay && !this.endSelectedDay) {
117
+ if (day && this.startSelectedDay.date > day.date) {
118
+ startDay = day;
119
+ endDay = this.startSelectedDay;
120
+ }
121
+ else {
122
+ startDay = this.startSelectedDay;
123
+ endDay = day;
124
+ }
125
+ }
126
+ else if (this.startSelectedDay && this.endSelectedDay) {
127
+ if (day && this.startSelectedDay.date < day.date) {
128
+ startDay = this.startSelectedDay;
129
+ endDay = day;
130
+ }
131
+ else {
132
+ startDay = day;
133
+ endDay = this.endSelectedDay;
134
+ }
135
+ }
136
+ // console.log('-2-', startDay, endDay);
137
+ if (startDay && endDay) {
138
+ const diff = Math.abs(startDay.momentOfDate.diff(endDay.momentOfDate, 'day'));
139
+ if (diff > 6) {
140
+ startDay = monthInfo.days[Math.floor(startDay.index / 7) * 7];
141
+ // const end = endDay.index % 7;
142
+ const indexEnd = Math.ceil((endDay.index + 1) / 7);
143
+ // if (end > 0) {
144
+ // indexEnd++;
145
+ // }
146
+ endDay = monthInfo.days[indexEnd * 7 - 1];
147
+ // console.log('-3-', startDay, endDay);
148
+ }
149
+ }
150
+ return { endDay, startDay };
151
+ }
152
+ _setFirstAndEndDay(monthInfo, popover) {
153
+ // console.log('-finish-', this.startSelectedDay, this.endSelectedDay);
154
+ if (this.startSelectedDay && this.endSelectedDay) {
155
+ if (popover) {
156
+ popover.close();
157
+ }
158
+ this.rangeChange.emit({
159
+ startDay: this.startSelectedDay,
160
+ endDay: this.endSelectedDay,
161
+ monthInfo
162
+ });
163
+ }
164
+ }
165
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalendarSelectionDaysComponent, deps: [{ token: i1.CalendarService, self: true }, { token: i2.PortalService }], target: i0.ɵɵFactoryTarget.Component }); }
166
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CalendarSelectionDaysComponent, selector: "bc-calendar-selection-days", inputs: { startSelectedDayIndex: "startSelectedDayIndex", endSelectedDayIndex: "endSelectedDayIndex", monthInfo: "monthInfo", inline: "inline" }, outputs: { rangeChange: "rangeChange" }, providers: [
167
+ {
168
+ provide: DateService,
169
+ useFactory: getDateService
170
+ },
171
+ CalendarService
172
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (inline) {\r\n<ng-container\r\n *ngTemplateOutlet=\"\r\n month;\r\n context: {\r\n $implicit: selectedMonth$ | async,\r\n width: width$ | async,\r\n height: height,\r\n rtl: rtl$ | async,\r\n weekDays: weekDays,\r\n weekDaysMin: weekDaysMin,\r\n today: today,\r\n deviceSize: deviceSize$ | async,\r\n popover: popover\r\n }\r\n \"\r\n>\r\n</ng-container>\r\n} @else {\r\n<button fd-button glyph=\"calendar\" fdType=\"transparent\" [fdPopoverTrigger]=\"popover\"></button>\r\n}\r\n<fd-popover #popover [focusTrapped]=\"true\" [focusAutoCapture]=\"true\" [mobile]=\"(deviceSize$ | async) === 's'\">\r\n <fd-popover-body [style.width.px]=\"width$ | async\" class=\"popover-selection-day\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n month;\r\n context: {\r\n $implicit: selectedMonth$ | async,\r\n width: width$ | async,\r\n height: height,\r\n rtl: rtl$ | async,\r\n weekDays: weekDays,\r\n weekDaysMin: weekDaysMin,\r\n today: today,\r\n deviceSize: deviceSize$ | async,\r\n popover: popover\r\n }\r\n \"\r\n >\r\n </ng-container>\r\n </fd-popover-body>\r\n</fd-popover>\r\n\r\n<ng-template\r\n #month\r\n let-selectedMonth\r\n let-width=\"width\"\r\n let-height=\"height\"\r\n let-rtl=\"rtl\"\r\n let-today=\"today\"\r\n let-showEvents=\"showEvents\"\r\n let-deviceSize=\"deviceSize\"\r\n let-popover=\"popover\"\r\n>\r\n <fd-toolbar [fdType]=\"'transparent'\">\r\n <button fd-button fd-toolbar-item [label]=\"'DateR_Today' | bbbTranslate\" (click)=\"onToday()\"></button>\r\n <button\r\n fd-button\r\n fdType=\"transparent\"\r\n fd-toolbar-item\r\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\r\n (click)=\"onPrevTap()\"\r\n ></button>\r\n <button\r\n fd-button\r\n fdType=\"transparent\"\r\n fd-toolbar-item\r\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\r\n (click)=\"onNextTap()\"\r\n ></button>\r\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\r\n @if (selectionMode === 'day' || selectionMode === 'month') {\r\n <button\r\n fd-button\r\n [fdType]=\"'transparent'\"\r\n [label]=\"selectedMonth.dateInfo.monthName\"\r\n (click)=\"selectionMode = 'month'\"\r\n ></button>\r\n }\r\n <button\r\n fd-button\r\n [fdType]=\"'transparent'\"\r\n [label]=\"selectedMonth.dateInfo.year\"\r\n (click)=\"selectionMode = 'year'\"\r\n ></button>\r\n </div>\r\n </fd-toolbar>\r\n @switch (selectionMode) { @case ('month') {\r\n <div class=\"month-year-selection-wrapper\">\r\n @for (month of months; track month; let i = $index) {\r\n <button\r\n style=\"flex-grow: 1; width: 33%\"\r\n fd-button\r\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\r\n [label]=\"month\"\r\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\r\n ></button>\r\n }\r\n </div>\r\n } @case ('year') {\r\n <div class=\"month-year-selection-wrapper\">\r\n @for (year of years; track year) {\r\n <button\r\n style=\"flex-grow: 1; width: 25%\"\r\n fd-button\r\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\r\n [label]=\"year\"\r\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\r\n ></button>\r\n }\r\n </div>\r\n } @default {\r\n <bc-calendar-month\r\n [style.width]=\"width\"\r\n [containerHeight]=\"height\"\r\n [containerWidth]=\"width\"\r\n [rtl]=\"rtl\"\r\n [monthWeeksCount]=\"6\"\r\n [weekDays]=\"weekDays\"\r\n [weekDaysMin]=\"weekDaysMin\"\r\n [today]=\"today\"\r\n [datePicker]=\"true\"\r\n [dateRange]=\"true\"\r\n [days]=\"selectedMonth.days\"\r\n [deviceSize]=\"deviceSize\"\r\n (dayClick)=\"onDayClick($event, selectedMonth, popover)\"\r\n (dayMouseMove)=\"onDayMouseMove($event, selectedMonth)\"\r\n (dayMouseUp)=\"onDayMouseUp($event, selectedMonth, popover)\"\r\n (dayMouseDown)=\"onDayMouseDown($event)\"\r\n [startSelectedDayIndex]=\"startSelectedDayIndex\"\r\n [endSelectedDayIndex]=\"endSelectedDayIndex\"\r\n ></bc-calendar-month>\r\n } }\r\n</ng-template>\r\n", styles: [":host ::ng-deep .fd-toolbar{background-color:var(--sapBaseColor);height:2.8rem}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.MobileDirective, selector: "[mobile]" }, { kind: "component", type: i4.ButtonComponent, selector: "button[fd-button], a[fd-button], span[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i5.TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: i6.PopoverBodyComponent, selector: "fd-popover-body", inputs: ["minWidth", "maxWidth", "minHeight", "maxHeight"] }, { kind: "component", type: i6.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "directive", type: i6.PopoverTriggerDirective, selector: "[fdPopoverTrigger], [fd-popover-trigger]", inputs: ["fdPopoverTrigger"] }, { kind: "component", type: i7.ToolbarComponent, selector: "fd-toolbar", inputs: ["titleId", "class", "shouldOverflow", "fdType", "title", "active", "clearBorder", "forceOverflow", "tabindex", "headingLevel", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i7.ToolbarItemDirective, selector: "[fd-toolbar-item], [fdOverflowGroup], [fdOverflowPriority]", inputs: ["fdOverflowPriority", "fdOverflowGroup"] }, { kind: "component", type: i8.CalendarMonthComponent, selector: "bc-calendar-month", inputs: ["monthWeeksCount", "weekDays", "weekDaysMin", "today", "containerHeight", "days", "calendarFields", "rtl", "deviceSize", "moDataList", "datePicker", "rangePicker", "canDelete", "canAdd", "canEdit", "canView", "selectedDate", "startSelectedDayIndex", "endSelectedDayIndex"], outputs: ["editEvent", "deleteEvent", "daySelect", "dayClick", "dayMouseMove", "dayMouseUp", "dayMouseDown", "showEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
173
+ }
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalendarSelectionDaysComponent, decorators: [{
175
+ type: Component,
176
+ args: [{ selector: 'bc-calendar-selection-days', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
177
+ {
178
+ provide: DateService,
179
+ useFactory: getDateService
180
+ },
181
+ CalendarService
182
+ ], standalone: false, template: "@if (inline) {\r\n<ng-container\r\n *ngTemplateOutlet=\"\r\n month;\r\n context: {\r\n $implicit: selectedMonth$ | async,\r\n width: width$ | async,\r\n height: height,\r\n rtl: rtl$ | async,\r\n weekDays: weekDays,\r\n weekDaysMin: weekDaysMin,\r\n today: today,\r\n deviceSize: deviceSize$ | async,\r\n popover: popover\r\n }\r\n \"\r\n>\r\n</ng-container>\r\n} @else {\r\n<button fd-button glyph=\"calendar\" fdType=\"transparent\" [fdPopoverTrigger]=\"popover\"></button>\r\n}\r\n<fd-popover #popover [focusTrapped]=\"true\" [focusAutoCapture]=\"true\" [mobile]=\"(deviceSize$ | async) === 's'\">\r\n <fd-popover-body [style.width.px]=\"width$ | async\" class=\"popover-selection-day\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n month;\r\n context: {\r\n $implicit: selectedMonth$ | async,\r\n width: width$ | async,\r\n height: height,\r\n rtl: rtl$ | async,\r\n weekDays: weekDays,\r\n weekDaysMin: weekDaysMin,\r\n today: today,\r\n deviceSize: deviceSize$ | async,\r\n popover: popover\r\n }\r\n \"\r\n >\r\n </ng-container>\r\n </fd-popover-body>\r\n</fd-popover>\r\n\r\n<ng-template\r\n #month\r\n let-selectedMonth\r\n let-width=\"width\"\r\n let-height=\"height\"\r\n let-rtl=\"rtl\"\r\n let-today=\"today\"\r\n let-showEvents=\"showEvents\"\r\n let-deviceSize=\"deviceSize\"\r\n let-popover=\"popover\"\r\n>\r\n <fd-toolbar [fdType]=\"'transparent'\">\r\n <button fd-button fd-toolbar-item [label]=\"'DateR_Today' | bbbTranslate\" (click)=\"onToday()\"></button>\r\n <button\r\n fd-button\r\n fdType=\"transparent\"\r\n fd-toolbar-item\r\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\r\n (click)=\"onPrevTap()\"\r\n ></button>\r\n <button\r\n fd-button\r\n fdType=\"transparent\"\r\n fd-toolbar-item\r\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\r\n (click)=\"onNextTap()\"\r\n ></button>\r\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\r\n @if (selectionMode === 'day' || selectionMode === 'month') {\r\n <button\r\n fd-button\r\n [fdType]=\"'transparent'\"\r\n [label]=\"selectedMonth.dateInfo.monthName\"\r\n (click)=\"selectionMode = 'month'\"\r\n ></button>\r\n }\r\n <button\r\n fd-button\r\n [fdType]=\"'transparent'\"\r\n [label]=\"selectedMonth.dateInfo.year\"\r\n (click)=\"selectionMode = 'year'\"\r\n ></button>\r\n </div>\r\n </fd-toolbar>\r\n @switch (selectionMode) { @case ('month') {\r\n <div class=\"month-year-selection-wrapper\">\r\n @for (month of months; track month; let i = $index) {\r\n <button\r\n style=\"flex-grow: 1; width: 33%\"\r\n fd-button\r\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\r\n [label]=\"month\"\r\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\r\n ></button>\r\n }\r\n </div>\r\n } @case ('year') {\r\n <div class=\"month-year-selection-wrapper\">\r\n @for (year of years; track year) {\r\n <button\r\n style=\"flex-grow: 1; width: 25%\"\r\n fd-button\r\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\r\n [label]=\"year\"\r\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\r\n ></button>\r\n }\r\n </div>\r\n } @default {\r\n <bc-calendar-month\r\n [style.width]=\"width\"\r\n [containerHeight]=\"height\"\r\n [containerWidth]=\"width\"\r\n [rtl]=\"rtl\"\r\n [monthWeeksCount]=\"6\"\r\n [weekDays]=\"weekDays\"\r\n [weekDaysMin]=\"weekDaysMin\"\r\n [today]=\"today\"\r\n [datePicker]=\"true\"\r\n [dateRange]=\"true\"\r\n [days]=\"selectedMonth.days\"\r\n [deviceSize]=\"deviceSize\"\r\n (dayClick)=\"onDayClick($event, selectedMonth, popover)\"\r\n (dayMouseMove)=\"onDayMouseMove($event, selectedMonth)\"\r\n (dayMouseUp)=\"onDayMouseUp($event, selectedMonth, popover)\"\r\n (dayMouseDown)=\"onDayMouseDown($event)\"\r\n [startSelectedDayIndex]=\"startSelectedDayIndex\"\r\n [endSelectedDayIndex]=\"endSelectedDayIndex\"\r\n ></bc-calendar-month>\r\n } }\r\n</ng-template>\r\n", styles: [":host ::ng-deep .fd-toolbar{background-color:var(--sapBaseColor);height:2.8rem}\n"] }]
183
+ }], ctorParameters: () => [{ type: i1.CalendarService, decorators: [{
184
+ type: Self
185
+ }] }, { type: i2.PortalService }], propDecorators: { startSelectedDayIndex: [{
186
+ type: Input
187
+ }], endSelectedDayIndex: [{
188
+ type: Input
189
+ }], monthInfo: [{
190
+ type: Input
191
+ }], inline: [{
192
+ type: Input
193
+ }], rangeChange: [{
194
+ type: Output
195
+ }] } });
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItc2VsZWN0aW9uLWRheXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci1zZWxlY3Rpb24tZGF5cy9jYWxlbmRhci1zZWxlY3Rpb24tZGF5cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2NhbGVuZGFyLXNlbGVjdGlvbi1kYXlzL2NhbGVuZGFyLXNlbGVjdGlvbi1kYXlzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLElBQUksRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFpQixNQUFNLHNCQUFzQixDQUFDO0FBRWpHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7OztBQWUvRCxNQUFNLE9BQU8sOEJBQStCLFNBQVEsYUFBYTtJQXlCN0QsWUFBNEIsZ0JBQWlDLEVBQUUsY0FBNkI7UUFDeEYsS0FBSyxFQUFFLENBQUM7UUFEZ0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQXBCbkQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFJcEMsQ0FBQztRQUNMLGtCQUFhLEdBQTZCLEtBQUssQ0FBQztRQVloRCxXQUFNLEdBQWEsRUFBRSxDQUFDO1FBRWQsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFHekIsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdB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LENBQUMsU0FBUyxFQUFFLE9BQU87UUFDekMsdUVBQXVFO1FBQ3ZFLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixDQUFDO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO2dCQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQzNCLFNBQVM7YUFDWixDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQzsrR0EvS1EsOEJBQThCO21HQUE5Qiw4QkFBOEIsZ1BBVDVCO1lBQ1A7Z0JBQ0ksT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLFVBQVUsRUFBRSxjQUFjO2FBQzdCO1lBQ0QsZUFBZTtTQUNsQixzRUMxQkwsbTVKQXNJQTs7NEZEekdhLDhCQUE4QjtrQkFkMUMsU0FBUzsrQkFDSSw0QkFBNEIsbUJBR3JCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLFdBQVc7NEJBQ3BCLFVBQVUsRUFBRSxjQUFjO3lCQUM3Qjt3QkFDRCxlQUFlO3FCQUNsQixjQUNXLEtBQUs7OzBCQTJCSixJQUFJO3FFQXhCUixxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIE91dHB1dCxcclxuICAgIFNlbGYsXHJcbiAgICBTaW1wbGVDaGFuZ2VzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCwgRGF0ZVNlcnZpY2UsIGdldERhdGVTZXJ2aWNlLCBQb3J0YWxTZXJ2aWNlIH0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xyXG5pbXBvcnQgeyBDYWxlbmRhck1vbnRoSW5mbywgRGF5IH0gZnJvbSAnLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgQ2FsZW5kYXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2FsZW5kYXIuc2VydmljZSc7XHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdiYy1jYWxlbmRhci1zZWxlY3Rpb24tZGF5cycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItc2VsZWN0aW9uLWRheXMuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXItc2VsZWN0aW9uLWRheXMuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm92aWRlOiBEYXRlU2VydmljZSxcclxuICAgICAgICAgICAgdXNlRmFjdG9yeTogZ2V0RGF0ZVNlcnZpY2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIENhbGVuZGFyU2VydmljZVxyXG4gICAgXSxcclxuICAgIHN0YW5kYWxvbmU6IGZhbHNlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYWxlbmRhclNlbGVjdGlvbkRheXNDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICAgIEBJbnB1dCgpIHN0YXJ0U2VsZWN0ZWREYXlJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgQElucHV0KCkgZW5kU2VsZWN0ZWREYXlJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgQElucHV0KCkgbW9udGhJbmZvOiBDYWxlbmRhck1vbnRoSW5mbztcclxuICAgIEBJbnB1dCgpIGlubGluZTogYm9vbGVhbjtcclxuICAgIEBPdXRwdXQoKSByYW5nZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgICAgIHN0YXJ0RGF5OiBEYXk7XHJcbiAgICAgICAgZW5kRGF5OiBEYXk7XHJcbiAgICAgICAgbW9udGhJbmZvOiBDYWxlbmRhck1vbnRoSW5mbztcclxuICAgIH0+KCk7XHJcbiAgICBzZWxlY3Rpb25Nb2RlOiAnZGF5JyB8ICdtb250aCcgfCAneWVhcicgPSAnZGF5JztcclxuXHJcbiAgICBlbmRTZWxlY3RlZERheTogRGF5IHwgbnVsbDtcclxuICAgIHN0YXJ0U2VsZWN0ZWREYXk6IERheSB8IG51bGw7XHJcbiAgICB3aWR0aCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcclxuICAgIGhlaWdodDogbnVtYmVyO1xyXG4gICAgc2VsZWN0ZWRNb250aCQ6IE9ic2VydmFibGU8Q2FsZW5kYXJNb250aEluZm8+O1xyXG4gICAgcnRsJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIHRvZGF5OiBEYXRlO1xyXG4gICAgd2Vla0RheXNNaW46IHN0cmluZ1tdO1xyXG4gICAgd2Vla0RheXM6IHN0cmluZ1tdO1xyXG4gICAgZGV2aWNlU2l6ZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuICAgIG1vbnRoczogc3RyaW5nW10gPSBbXTtcclxuICAgIHllYXJzOiBzdHJpbmdbXTtcclxuICAgIHByaXZhdGUgX2lzTW91c2VEb3duID0gZmFsc2U7XHJcbiAgICBjb25zdHJ1Y3RvcihAU2VsZigpIHByaXZhdGUgX2NhbGVuZGFyU2VydmljZTogQ2FsZW5kYXJTZXJ2aWNlLCBfcG9ydGFsU2VydmljZTogUG9ydGFsU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5ydGwkID0gX3BvcnRhbFNlcnZpY2UucnRsJDtcclxuICAgICAgICB0aGlzLndpZHRoJCA9IF9wb3J0YWxTZXJ2aWNlLmRldmljZVNpemUkLnBpcGUoXHJcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICAgIG1hcCgoZGV2aWNlU2l6ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChkZXZpY2VTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneGwnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDgwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzIwO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0ODA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLndlZWtEYXlzTWluID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLndlZWtEYXlzTWluKCk7XHJcbiAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnNldE1vZGUoJ21vbnRoJyk7XHJcbiAgICAgICAgdGhpcy53ZWVrRGF5cyA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS53ZWVrRGF5cygpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb250aCQgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc2VsZWN0ZWQkO1xyXG4gICAgICAgIHRoaXMudG9kYXkgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UudG9kYXk7XHJcbiAgICAgICAgdGhpcy5tb250aHMgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UuTW9udGhzO1xyXG4gICAgICAgIHRoaXMuX3ByZXBhcmVZZWFyKHRoaXMuX2NhbGVuZGFyU2VydmljZS5zZWxlY3RlZE1vbnRoLmRhdGVJbmZvLnllYXIpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcclxuICAgICAgICBjb25zdCB7IG1vbnRoSW5mbyB9ID0gY2hhbmdlcztcclxuICAgICAgICBpZiAobW9udGhJbmZvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkQ2FsZW5kYXJNb250aEluZm8obW9udGhJbmZvLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgb25Nb250aFNlbGVjdGVkKG1vbnRoTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmdvdG9Nb250aChtb250aE5hbWUsIGluZGV4KTtcclxuICAgIH1cclxuICAgIG9uWWVhclNlbGVjdGVkKHllYXI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5nb3RvWWVhcigreWVhcik7XHJcbiAgICB9XHJcblxyXG4gICAgb25QcmV2VGFwKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdkYXknKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkUHJldmlvdXMoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJykge1xyXG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZZZWFyKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICd5ZWFyJykge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlWWVhcihOdW1iZXIodGhpcy55ZWFyc1swXSkgLSAyMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uTmV4dFRhcCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnZGF5Jykge1xyXG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZE5leHQoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJykge1xyXG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZE5leHRZZWFyKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICd5ZWFyJykge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlWWVhcihOdW1iZXIodGhpcy55ZWFyc1t0aGlzLnllYXJzLmxlbmd0aCAtIDFdKSArIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblRvZGF5KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5nb3RvVG9kYXkoKTtcclxuICAgIH1cclxuICAgIG9uRGF5TW91c2VNb3ZlKGRheTogRGF5LCBtb250aEluZm86IENhbGVuZGFyTW9udGhJbmZvKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzTW91c2VEb3duKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZW5kRGF5LCBzdGFydERheSB9ID0gdGhpcy5nZXRTdGFydEFuZEVuZERheShtb250aEluZm8sIGRheSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheUluZGV4ID0gc3RhcnREYXk/LmluZGV4O1xyXG4gICAgICAgICAgICB0aGlzLmVuZFNlbGVjdGVkRGF5SW5kZXggPSBlbmREYXk/LmluZGV4O1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnLW1vdmUtJywgdGhpcy5zdGFydFNlbGVjdGVkRGF5Py5pbmRleCwgdGhpcy5lbmRTZWxlY3RlZERheT8uaW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkRheU1vdXNlRG93bihkYXk6IERheSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2lzTW91c2VEb3duID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IGRheTtcclxuICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXlJbmRleCA9IGRheS5pbmRleDtcclxuICAgIH1cclxuICAgIG9uRGF5TW91c2VVcChkYXk6IERheSwgbW9udGhJbmZvLCBwb3BvdmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faXNNb3VzZURvd24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBlbmREYXksIHN0YXJ0RGF5IH0gPSB0aGlzLmdldFN0YXJ0QW5kRW5kRGF5KG1vbnRoSW5mbywgZGF5KTtcclxuICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgPSBzdGFydERheTtcclxuICAgICAgICB0aGlzLmVuZFNlbGVjdGVkRGF5ID0gZW5kRGF5O1xyXG4gICAgICAgIHRoaXMuX3NldEZpcnN0QW5kRW5kRGF5KG1vbnRoSW5mbywgcG9wb3Zlcik7XHJcbiAgICB9XHJcbiAgICBvbkRheUNsaWNrKGRheTogRGF5LCBtb250aEluZm8sIHBvcG92ZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgPSB0aGlzLmVuZFNlbGVjdGVkRGF5ID0gZGF5O1xyXG4gICAgICAgIHRoaXMuX3NldEZpcnN0QW5kRW5kRGF5KG1vbnRoSW5mbywgcG9wb3Zlcik7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9wcmVwYXJlWWVhcihmcm9tOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB5ZWFyczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwOyBpKyspIHtcclxuICAgICAgICAgICAgeWVhcnMucHVzaChgJHtmcm9tICsgaX1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy55ZWFycyA9IHllYXJzO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBnZXRTdGFydEFuZEVuZERheShcclxuICAgICAgICBtb250aEluZm86IENhbGVuZGFyTW9udGhJbmZvLFxyXG4gICAgICAgIGRheTogRGF5IHwgbnVsbFxyXG4gICAgKTogeyBlbmREYXk6IERheSB8IG51bGw7IHN0YXJ0RGF5OiBEYXkgfCBudWxsIH0ge1xyXG4gICAgICAgIGxldCBzdGFydERheTogRGF5IHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGVuZERheTogRGF5IHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRTZWxlY3RlZERheSAmJiAhdGhpcy5lbmRTZWxlY3RlZERheSkge1xyXG4gICAgICAgICAgICBpZiAoZGF5ICYmIHRoaXMuc3RhcnRTZWxlY3RlZERheS5kYXRlID4gZGF5LmRhdGUpIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gZGF5O1xyXG4gICAgICAgICAgICAgICAgZW5kRGF5ID0gdGhpcy5zdGFydFNlbGVjdGVkRGF5O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RhcnREYXkgPSB0aGlzLnN0YXJ0U2VsZWN0ZWREYXk7XHJcbiAgICAgICAgICAgICAgICBlbmREYXkgPSBkYXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhcnRTZWxlY3RlZERheSAmJiB0aGlzLmVuZFNlbGVjdGVkRGF5KSB7XHJcbiAgICAgICAgICAgIGlmIChkYXkgJiYgdGhpcy5zdGFydFNlbGVjdGVkRGF5LmRhdGUgPCBkYXkuZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnREYXkgPSB0aGlzLnN0YXJ0U2VsZWN0ZWREYXk7XHJcbiAgICAgICAgICAgICAgICBlbmREYXkgPSBkYXk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydERheSA9IGRheTtcclxuICAgICAgICAgICAgICAgIGVuZERheSA9IHRoaXMuZW5kU2VsZWN0ZWREYXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJy0yLScsIHN0YXJ0RGF5LCBlbmREYXkpO1xyXG4gICAgICAgIGlmIChzdGFydERheSAmJiBlbmREYXkpIHtcclxuICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKHN0YXJ0RGF5Lm1vbWVudE9mRGF0ZS5kaWZmKGVuZERheS5tb21lbnRPZkRhdGUsICdkYXknKSk7XHJcbiAgICAgICAgICAgIGlmIChkaWZmID4gNikge1xyXG4gICAgICAgICAgICAgICAgc3RhcnREYXkgPSBtb250aEluZm8uZGF5c1tNYXRoLmZsb29yKHN0YXJ0RGF5LmluZGV4IC8gNykgKiA3XTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGVuZCA9IGVuZERheS5pbmRleCAlIDc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleEVuZCA9IE1hdGguY2VpbCgoZW5kRGF5LmluZGV4ICsgMSkgLyA3KTtcclxuICAgICAgICAgICAgICAgIC8vIGlmIChlbmQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgaW5kZXhFbmQrKztcclxuICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgIGVuZERheSA9IG1vbnRoSW5mby5kYXlzW2luZGV4RW5kICogNyAtIDFdO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJy0zLScsIHN0YXJ0RGF5LCBlbmREYXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IGVuZERheSwgc3RhcnREYXkgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9zZXRGaXJzdEFuZEVuZERheShtb250aEluZm8sIHBvcG92ZXIpOiB2b2lkIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnLWZpbmlzaC0nLCB0aGlzLnN0YXJ0U2VsZWN0ZWREYXksIHRoaXMuZW5kU2VsZWN0ZWREYXkpO1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgJiYgdGhpcy5lbmRTZWxlY3RlZERheSkge1xyXG4gICAgICAgICAgICBpZiAocG9wb3Zlcikge1xyXG4gICAgICAgICAgICAgICAgcG9wb3Zlci5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2VDaGFuZ2UuZW1pdCh7XHJcbiAgICAgICAgICAgICAgICBzdGFydERheTogdGhpcy5zdGFydFNlbGVjdGVkRGF5LFxyXG4gICAgICAgICAgICAgICAgZW5kRGF5OiB0aGlzLmVuZFNlbGVjdGVkRGF5LFxyXG4gICAgICAgICAgICAgICAgbW9udGhJbmZvXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJAaWYgKGlubGluZSkge1xyXG48bmctY29udGFpbmVyXHJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgIG1vbnRoO1xyXG4gICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxyXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgkIHwgYXN5bmMsXHJcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgICAgICBydGw6IHJ0bCQgfCBhc3luYyxcclxuICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzLFxyXG4gICAgICAgICAgICB3ZWVrRGF5c01pbjogd2Vla0RheXNNaW4sXHJcbiAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcclxuICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSQgfCBhc3luYyxcclxuICAgICAgICAgICAgcG9wb3ZlcjogcG9wb3ZlclxyXG4gICAgICAgIH1cclxuICAgIFwiXHJcbj5cclxuPC9uZy1jb250YWluZXI+XHJcbn0gQGVsc2Uge1xyXG48YnV0dG9uIGZkLWJ1dHRvbiBnbHlwaD1cImNhbGVuZGFyXCIgZmRUeXBlPVwidHJhbnNwYXJlbnRcIiBbZmRQb3BvdmVyVHJpZ2dlcl09XCJwb3BvdmVyXCI+PC9idXR0b24+XHJcbn1cclxuPGZkLXBvcG92ZXIgI3BvcG92ZXIgW2ZvY3VzVHJhcHBlZF09XCJ0cnVlXCIgW2ZvY3VzQXV0b0NhcHR1cmVdPVwidHJ1ZVwiIFttb2JpbGVdPVwiKGRldmljZVNpemUkIHwgYXN5bmMpID09PSAncydcIj5cclxuICAgIDxmZC1wb3BvdmVyLWJvZHkgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoJCB8IGFzeW5jXCIgY2xhc3M9XCJwb3BvdmVyLXNlbGVjdGlvbi1kYXlcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXHJcbiAgICAgICAgICAgICAgICBtb250aDtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHNlbGVjdGVkTW9udGgkIHwgYXN5bmMsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoJCB8IGFzeW5jLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHJ0bDogcnRsJCB8IGFzeW5jLFxyXG4gICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzOiB3ZWVrRGF5cyxcclxuICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5c01pbjogd2Vla0RheXNNaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgdG9kYXk6IHRvZGF5LFxyXG4gICAgICAgICAgICAgICAgICAgIGRldmljZVNpemU6IGRldmljZVNpemUkIHwgYXN5bmMsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9wb3ZlcjogcG9wb3ZlclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZmQtcG9wb3Zlci1ib2R5PlxyXG48L2ZkLXBvcG92ZXI+XHJcblxyXG48bmctdGVtcGxhdGVcclxuICAgICNtb250aFxyXG4gICAgbGV0LXNlbGVjdGVkTW9udGhcclxuICAgIGxldC13aWR0aD1cIndpZHRoXCJcclxuICAgIGxldC1oZWlnaHQ9XCJoZWlnaHRcIlxyXG4gICAgbGV0LXJ0bD1cInJ0bFwiXHJcbiAgICBsZXQtdG9kYXk9XCJ0b2RheVwiXHJcbiAgICBsZXQtc2hvd0V2ZW50cz1cInNob3dFdmVudHNcIlxyXG4gICAgbGV0LWRldmljZVNpemU9XCJkZXZpY2VTaXplXCJcclxuICAgIGxldC1wb3BvdmVyPVwicG9wb3ZlclwiXHJcbj5cclxuICAgIDxmZC10b29sYmFyIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiPlxyXG4gICAgICAgIDxidXR0b24gZmQtYnV0dG9uIGZkLXRvb2xiYXItaXRlbSBbbGFiZWxdPVwiJ0RhdGVSX1RvZGF5JyB8IGJiYlRyYW5zbGF0ZVwiIChjbGljayk9XCJvblRvZGF5KClcIj48L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGZkLWJ1dHRvblxyXG4gICAgICAgICAgICBmZFR5cGU9XCJ0cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgIGZkLXRvb2xiYXItaXRlbVxyXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnIDogJ25hdmlnYXRpb24tbGVmdC1hcnJvdydcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25QcmV2VGFwKClcIlxyXG4gICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGZkLWJ1dHRvblxyXG4gICAgICAgICAgICBmZFR5cGU9XCJ0cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgIGZkLXRvb2xiYXItaXRlbVxyXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tbGVmdC1hcnJvdycgOiAnbmF2aWdhdGlvbi1yaWdodC1hcnJvdydcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25OZXh0VGFwKClcIlxyXG4gICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgteWVhcnMtd3JhcHBlclwiIGZkLXRpdGxlIGZkLXRvb2xiYXItaXRlbT5cclxuICAgICAgICAgICAgQGlmIChzZWxlY3Rpb25Nb2RlID09PSAnZGF5JyB8fCBzZWxlY3Rpb25Nb2RlID09PSAnbW9udGgnKSB7XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgW2ZkVHlwZV09XCIndHJhbnNwYXJlbnQnXCJcclxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzZWxlY3RlZE1vbnRoLmRhdGVJbmZvLm1vbnRoTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0aW9uTW9kZSA9ICdtb250aCdcIlxyXG4gICAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxyXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cInNlbGVjdGVkTW9udGguZGF0ZUluZm8ueWVhclwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0aW9uTW9kZSA9ICd5ZWFyJ1wiXHJcbiAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZmQtdG9vbGJhcj5cclxuICAgIEBzd2l0Y2ggKHNlbGVjdGlvbk1vZGUpIHsgQGNhc2UgKCdtb250aCcpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJtb250aC15ZWFyLXNlbGVjdGlvbi13cmFwcGVyXCI+XHJcbiAgICAgICAgQGZvciAobW9udGggb2YgbW9udGhzOyB0cmFjayBtb250aDsgbGV0IGkgPSAkaW5kZXgpIHtcclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHN0eWxlPVwiZmxleC1ncm93OiAxOyB3aWR0aDogMzMlXCJcclxuICAgICAgICAgICAgZmQtYnV0dG9uXHJcbiAgICAgICAgICAgIFtmZFR5cGVdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby5tb250aE5hbWUgPT09IG1vbnRoID8gJ2VtcGhhc2l6ZWQnIDogJ3RyYW5zcGFyZW50J1wiXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCJtb250aFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Rpb25Nb2RlID0gJ2RheSc7IG9uTW9udGhTZWxlY3RlZChtb250aCwgaSlcIlxyXG4gICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIH0gQGNhc2UgKCd5ZWFyJykge1xyXG4gICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0aW9uLXdyYXBwZXJcIj5cclxuICAgICAgICBAZm9yICh5ZWFyIG9mIHllYXJzOyB0cmFjayB5ZWFyKSB7XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBzdHlsZT1cImZsZXgtZ3JvdzogMTsgd2lkdGg6IDI1JVwiXHJcbiAgICAgICAgICAgIGZkLWJ1dHRvblxyXG4gICAgICAgICAgICBbZmRUeXBlXT1cInNlbGVjdGVkTW9udGguZGF0ZUluZm8ueWVhciA9PT0gK3llYXIgPyAnZW1waGFzaXplZCcgOiAndHJhbnNwYXJlbnQnXCJcclxuICAgICAgICAgICAgW2xhYmVsXT1cInllYXJcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0aW9uTW9kZSA9ICdkYXknOyBvblllYXJTZWxlY3RlZCh5ZWFyKVwiXHJcbiAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gICAgfSBAZGVmYXVsdCB7XHJcbiAgICA8YmMtY2FsZW5kYXItbW9udGhcclxuICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxyXG4gICAgICAgIFtjb250YWluZXJIZWlnaHRdPVwiaGVpZ2h0XCJcclxuICAgICAgICBbY29udGFpbmVyV2lkdGhdPVwid2lkdGhcIlxyXG4gICAgICAgIFtydGxdPVwicnRsXCJcclxuICAgICAgICBbbW9udGhXZWVrc0NvdW50XT1cIjZcIlxyXG4gICAgICAgIFt3ZWVrRGF5c109XCJ3ZWVrRGF5c1wiXHJcbiAgICAgICAgW3dlZWtEYXlzTWluXT1cIndlZWtEYXlzTWluXCJcclxuICAgICAgICBbdG9kYXldPVwidG9kYXlcIlxyXG4gICAgICAgIFtkYXRlUGlja2VyXT1cInRydWVcIlxyXG4gICAgICAgIFtkYXRlUmFuZ2VdPVwidHJ1ZVwiXHJcbiAgICAgICAgW2RheXNdPVwic2VsZWN0ZWRNb250aC5kYXlzXCJcclxuICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcclxuICAgICAgICAoZGF5Q2xpY2spPVwib25EYXlDbGljaygkZXZlbnQsIHNlbGVjdGVkTW9udGgsIHBvcG92ZXIpXCJcclxuICAgICAgICAoZGF5TW91c2VNb3ZlKT1cIm9uRGF5TW91c2VNb3ZlKCRldmVudCwgc2VsZWN0ZWRNb250aClcIlxyXG4gICAgICAgIChkYXlNb3VzZVVwKT1cIm9uRGF5TW91c2VVcCgkZXZlbnQsIHNlbGVjdGVkTW9udGgsIHBvcG92ZXIpXCJcclxuICAgICAgICAoZGF5TW91c2VEb3duKT1cIm9uRGF5TW91c2VEb3duKCRldmVudClcIlxyXG4gICAgICAgIFtzdGFydFNlbGVjdGVkRGF5SW5kZXhdPVwic3RhcnRTZWxlY3RlZERheUluZGV4XCJcclxuICAgICAgICBbZW5kU2VsZWN0ZWREYXlJbmRleF09XCJlbmRTZWxlY3RlZERheUluZGV4XCJcclxuICAgID48L2JjLWNhbGVuZGFyLW1vbnRoPlxyXG4gICAgfSB9XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==