adb-shared 6.0.2 → 6.0.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 (97) hide show
  1. package/esm2022/adb-shared.mjs +4 -4
  2. package/esm2022/lib/components/adb-artportalen-nav/adb-artportalen-footer.component.mjs +48 -48
  3. package/esm2022/lib/components/adb-artportalen-nav/adb-artportalen-nav.component.mjs +112 -112
  4. package/esm2022/lib/components/adb-artportalen-nav/adb-artportalen-nav.module.mjs +58 -66
  5. package/esm2022/lib/components/adb-artportalen-nav/environment.service.mjs +16 -16
  6. package/esm2022/lib/components/adb-artportalen-nav/navigation.model.mjs +1 -1
  7. package/esm2022/lib/components/adb-buttons/adb-buttons.module.mjs +19 -19
  8. package/esm2022/lib/components/adb-buttons/help-button.component.mjs +35 -35
  9. package/esm2022/lib/components/adb-confirm-modal/adb-confirm-modal.mjs +29 -29
  10. package/esm2022/lib/components/adb-confirm-modal/adb-modal.module.mjs +23 -23
  11. package/esm2022/lib/components/adb-confirm-modal/adb-modal.service.mjs +46 -46
  12. package/esm2022/lib/components/adb-dropdown/adb-dropdown.directive.mjs +100 -100
  13. package/esm2022/lib/components/adb-dropdown/adb-dropdown.module.mjs +24 -24
  14. package/esm2022/lib/components/adb-dropdown/adb-dropdown.service.mjs +10 -10
  15. package/esm2022/lib/components/adb-dropdown/adb-dropdown2.directive.mjs +119 -119
  16. package/esm2022/lib/components/adb-header/adb-header.module.mjs +49 -57
  17. package/esm2022/lib/components/adb-header/adb-nav.component.mjs +115 -115
  18. package/esm2022/lib/components/adb-header/environment.service.mjs +16 -16
  19. package/esm2022/lib/components/adb-header/navigation.model.mjs +1 -1
  20. package/esm2022/lib/components/adb-rich-editor/adb-rich-editor.component.mjs +84 -65
  21. package/esm2022/lib/components/adb-rich-editor/adb-rich-editor.module.mjs +19 -19
  22. package/esm2022/lib/components/adb-toast/adb-toast.mjs +25 -25
  23. package/esm2022/lib/components/adb-toast/adb-toast.module.mjs +23 -23
  24. package/esm2022/lib/components/adb-toast/adb-toast.service.mjs +55 -55
  25. package/esm2022/lib/components/date-picker/adb-date-picker.component.mjs +177 -177
  26. package/esm2022/lib/components/date-picker/adb-date-picker.directive.mjs +220 -220
  27. package/esm2022/lib/components/date-picker/adb-date-picker.module.mjs +25 -25
  28. package/esm2022/lib/components/date-picker/adb-date-picker.service.mjs +10 -10
  29. package/esm2022/lib/components/pagers/infinite-scroll.component.mjs +47 -47
  30. package/esm2022/lib/components/pagers/pager-base.directive.mjs +57 -57
  31. package/esm2022/lib/components/pagers/pager-inline.mjs +49 -49
  32. package/esm2022/lib/components/pagers/pager.mjs +53 -53
  33. package/esm2022/lib/components/pagers/pagers.module.mjs +26 -26
  34. package/esm2022/lib/directives/click-outside.directive.mjs +28 -28
  35. package/esm2022/lib/directives/directives.module.mjs +21 -21
  36. package/esm2022/lib/directives/file-upload.directive.mjs +36 -36
  37. package/esm2022/lib/directives/focus.directive.mjs +34 -34
  38. package/esm2022/lib/directives/redlist-badge-class.directive.mjs +44 -44
  39. package/esm2022/lib/directives/risk-class.directive.mjs +37 -37
  40. package/esm2022/lib/pipes/date.pipe.mjs +22 -22
  41. package/esm2022/lib/pipes/emptyValue.pipe.mjs +22 -22
  42. package/esm2022/lib/pipes/highlight-html.pipe.mjs +46 -46
  43. package/esm2022/lib/pipes/highlight.pipe.mjs +46 -46
  44. package/esm2022/lib/pipes/number-spacing.pipe.mjs +21 -21
  45. package/esm2022/lib/pipes/pipes.module.mjs +22 -22
  46. package/esm2022/lib/pipes/rich.pipe.mjs +36 -36
  47. package/esm2022/public-api.mjs +41 -41
  48. package/fesm2022/adb-shared.mjs +1817 -1815
  49. package/fesm2022/adb-shared.mjs.map +1 -1
  50. package/index.d.ts +5 -5
  51. package/lib/components/adb-artportalen-nav/adb-artportalen-footer.component.d.ts +23 -23
  52. package/lib/components/adb-artportalen-nav/adb-artportalen-nav.component.d.ts +41 -41
  53. package/lib/components/adb-artportalen-nav/adb-artportalen-nav.module.d.ts +16 -17
  54. package/lib/components/adb-artportalen-nav/environment.service.d.ts +7 -7
  55. package/lib/components/adb-artportalen-nav/navigation.model.d.ts +18 -18
  56. package/lib/components/adb-buttons/adb-buttons.module.d.ts +9 -9
  57. package/lib/components/adb-buttons/help-button.component.d.ts +13 -13
  58. package/lib/components/adb-confirm-modal/adb-confirm-modal.d.ts +20 -20
  59. package/lib/components/adb-confirm-modal/adb-modal.module.d.ts +10 -10
  60. package/lib/components/adb-confirm-modal/adb-modal.service.d.ts +18 -18
  61. package/lib/components/adb-dropdown/adb-dropdown.directive.d.ts +21 -21
  62. package/lib/components/adb-dropdown/adb-dropdown.module.d.ts +11 -11
  63. package/lib/components/adb-dropdown/adb-dropdown.service.d.ts +7 -7
  64. package/lib/components/adb-dropdown/adb-dropdown2.directive.d.ts +23 -23
  65. package/lib/components/adb-header/adb-header.module.d.ts +15 -16
  66. package/lib/components/adb-header/adb-nav.component.d.ts +41 -41
  67. package/lib/components/adb-header/environment.service.d.ts +7 -7
  68. package/lib/components/adb-header/navigation.model.d.ts +29 -29
  69. package/lib/components/adb-rich-editor/adb-rich-editor.component.d.ts +24 -22
  70. package/lib/components/adb-rich-editor/adb-rich-editor.module.d.ts +9 -9
  71. package/lib/components/adb-toast/adb-toast.d.ts +11 -11
  72. package/lib/components/adb-toast/adb-toast.module.d.ts +10 -10
  73. package/lib/components/adb-toast/adb-toast.service.d.ts +36 -36
  74. package/lib/components/date-picker/adb-date-picker.component.d.ts +64 -64
  75. package/lib/components/date-picker/adb-date-picker.directive.d.ts +47 -47
  76. package/lib/components/date-picker/adb-date-picker.module.d.ts +12 -12
  77. package/lib/components/date-picker/adb-date-picker.service.d.ts +8 -8
  78. package/lib/components/pagers/infinite-scroll.component.d.ts +15 -15
  79. package/lib/components/pagers/pager-base.directive.d.ts +16 -16
  80. package/lib/components/pagers/pager-inline.d.ts +16 -16
  81. package/lib/components/pagers/pager.d.ts +22 -22
  82. package/lib/components/pagers/pagers.module.d.ts +11 -11
  83. package/lib/directives/click-outside.directive.d.ts +10 -10
  84. package/lib/directives/directives.module.d.ts +11 -11
  85. package/lib/directives/file-upload.directive.d.ts +12 -12
  86. package/lib/directives/focus.directive.d.ts +11 -11
  87. package/lib/directives/redlist-badge-class.directive.d.ts +7 -7
  88. package/lib/directives/risk-class.directive.d.ts +7 -7
  89. package/lib/pipes/date.pipe.d.ts +10 -10
  90. package/lib/pipes/emptyValue.pipe.d.ts +7 -7
  91. package/lib/pipes/highlight-html.pipe.d.ts +10 -10
  92. package/lib/pipes/highlight.pipe.d.ts +9 -9
  93. package/lib/pipes/number-spacing.pipe.d.ts +7 -7
  94. package/lib/pipes/pipes.module.d.ts +12 -12
  95. package/lib/pipes/rich.pipe.d.ts +11 -11
  96. package/package.json +5 -5
  97. package/public-api.d.ts +38 -38
@@ -1,177 +1,177 @@
1
- import { Component, EventEmitter, HostBinding, Input, Output } from "@angular/core";
2
- import { addDays, addMonths, addYears, eachDayOfInterval, eachWeekOfInterval, endOfDay, endOfMonth, getHours, getISOWeek, getMinutes, getMonth, isSameDay, isSameMonth, isSameYear, isValid, isWithinInterval, parseISO, startOfDay, startOfMonth, subMonths, subYears } from "date-fns";
3
- import { Subscription } from "rxjs";
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@ngx-translate/core";
6
- import * as i2 from "@angular/common";
7
- import * as i3 from "../../pipes/date.pipe";
8
- export class AdbDatePickerComponent {
9
- static { this.MONTHS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; }
10
- static { this.WEEK_DAYS = ['1', '2', '3', '4', '5', '6', '7']; }
11
- static { this.YEAR_INTERVALL = 8; }
12
- ;
13
- constructor(elementRef, translate) {
14
- this.elementRef = elementRef;
15
- this.translate = translate;
16
- this.subscriptions = new Subscription();
17
- this.currentdDate = new Date();
18
- this.selectedDate = new Date();
19
- this.weekDays = AdbDatePickerComponent.WEEK_DAYS;
20
- this.noYearMode = false;
21
- this.selectDate = new EventEmitter();
22
- }
23
- ngOnInit() {
24
- if (this.settings) {
25
- if (this.settings?.minDate || this.settings?.maxDate) {
26
- const minDate = AdbDatePickerComponent.parseDate(this.settings.minDate);
27
- const maxDate = AdbDatePickerComponent.parseDate(this.settings.maxDate);
28
- this.range = {
29
- start: minDate ? startOfDay(minDate) : subYears(new Date(), 1000),
30
- end: maxDate ? endOfDay(maxDate) : addYears(new Date(), 1000)
31
- };
32
- }
33
- if (this.settings.noYear) {
34
- this.noYearMode = this.settings.noYear;
35
- }
36
- }
37
- this.selectedDate = this.currentdDate = this.initialDate ?? new Date();
38
- this.currentMonth = getMonth(this.selectedDate);
39
- this.createCalendar();
40
- }
41
- onShowYear() {
42
- this.months = null;
43
- this.loadYearsInterval();
44
- }
45
- onShowMonth() {
46
- this.years = null;
47
- this.loadMonths();
48
- }
49
- onSelectYear(inYear) {
50
- this.selectedDate.setFullYear(inYear.getFullYear());
51
- this.loadMonths();
52
- this.years = null;
53
- }
54
- onSelectMonth(inMonth) {
55
- this.selectedDate.setMonth(inMonth);
56
- this.currentMonth = getMonth(this.selectedDate);
57
- this.createCalendar();
58
- this.years = null;
59
- this.months = null;
60
- }
61
- onPrev() {
62
- if (this.years) {
63
- this.selectedDate = subYears(this.selectedDate, AdbDatePickerComponent.YEAR_INTERVALL);
64
- this.loadYearsInterval();
65
- }
66
- else if (this.months) {
67
- this.selectedDate = subYears(this.selectedDate, 1);
68
- this.loadMonths();
69
- }
70
- else {
71
- this.selectedDate = subMonths(this.selectedDate, 1);
72
- this.createCalendar();
73
- }
74
- this.currentMonth = getMonth(this.selectedDate);
75
- }
76
- onNext() {
77
- if (this.years) {
78
- this.selectedDate = addYears(this.selectedDate, AdbDatePickerComponent.YEAR_INTERVALL);
79
- this.loadYearsInterval();
80
- }
81
- else if (this.months) {
82
- this.selectedDate = addYears(this.selectedDate, 1);
83
- this.loadMonths();
84
- }
85
- else {
86
- this.selectedDate = addMonths(this.selectedDate, 1);
87
- this.createCalendar();
88
- }
89
- this.currentMonth = getMonth(this.selectedDate);
90
- }
91
- ngOnDestroy() {
92
- this.subscriptions.unsubscribe();
93
- }
94
- loadMonths() {
95
- this.months = AdbDatePickerComponent.MONTHS.map(x => {
96
- return {
97
- value: x,
98
- isThisMonth: getMonth(this.selectedDate) === x && isSameYear(this.currentdDate, this.selectedDate)
99
- };
100
- });
101
- }
102
- loadYearsInterval() {
103
- let year = subYears(this.selectedDate, AdbDatePickerComponent.YEAR_INTERVALL);
104
- const years = [];
105
- for (let i = 0; i < 16; i++) {
106
- years.push({
107
- value: year,
108
- title: year.getFullYear(),
109
- isThisYear: isSameYear(year, this.currentdDate)
110
- });
111
- year = addYears(year, 1);
112
- }
113
- this.years = years;
114
- }
115
- onSelectDate(day) {
116
- this.selectDate.emit(day.value);
117
- }
118
- createCalendar() {
119
- const weeks = [];
120
- const monthInterval = { start: startOfMonth(this.selectedDate), end: endOfMonth(this.selectedDate) };
121
- var fnsWweeks = eachWeekOfInterval(monthInterval, { weekStartsOn: this.translate.currentLang === 'sv' || this.translate.currentLang === 'sv-SE' ? 1 : 0 });
122
- for (const fnsWeek of fnsWweeks) {
123
- const week = { weekNumber: 0, days: [] };
124
- week.weekNumber = getISOWeek(new Date(fnsWeek));
125
- const weekInterval = { start: new Date(fnsWeek), end: addDays(new Date(fnsWeek), 6) };
126
- week.days = eachDayOfInterval(weekInterval).map(day => {
127
- day.setHours(getHours(new Date()));
128
- day.setMinutes(getMinutes(new Date()));
129
- return {
130
- value: day,
131
- isSelected: isSameYear(day, this.initialDate) && isSameDay(day, this.initialDate) && isSameMonth(day, this.initialDate),
132
- isInRange: this.range ? isWithinInterval(day, this.range) : true,
133
- isToday: isSameDay(day, new Date()),
134
- inMonth: monthInterval.start.getMonth() === day.getMonth()
135
- };
136
- });
137
- weeks.push(week);
138
- }
139
- this.weeks = weeks;
140
- }
141
- static parseDate(value) {
142
- if (typeof value === 'string') {
143
- if (isValid(parseISO(value))) {
144
- return parseISO(value);
145
- }
146
- else {
147
- return null;
148
- }
149
- }
150
- else if (value instanceof Date) {
151
- return value;
152
- }
153
- else {
154
- return null;
155
- }
156
- }
157
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AdbDatePickerComponent, deps: [{ token: i0.ElementRef }, { token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
158
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AdbDatePickerComponent, selector: "adb-date-picker", inputs: { initialDate: "initialDate", settings: "settings", toLeft: "toLeft", id: "id" }, outputs: { selectDate: "selectDate" }, host: { properties: { "id": "this.id" } }, ngImport: i0, template: "<div class=\"position-relative\" [class.to-left]=\"toLeft\">\r\n <nav class=\"bg-white shadow rounded position-absolute\" style=\"width:350px\">\r\n <header class=\"bg-primary p-2 rounded-top d-flex justify-content-between align-items-center gap-1\">\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onPrev()\" [disabled]=\"noYearMode&&currentMonth===0\"><span class=\"fa fa-chevron-left\"></span></button>\r\n <ng-container *ngIf=\"!years&&!months\">\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowMonth();$event.stopPropagation()\">{{selectedDate|adbLocaleDate:'MMM'}}</button>\r\n <button *ngIf=\"!noYearMode\" tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowYear();$event.stopPropagation()\">{{selectedDate|date:'yyyy'}}</button>\r\n </ng-container>\r\n <button tabIndex=\"-1\" *ngIf=\"years\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"years=null;$event.stopPropagation()\">{{years[0].title}} - {{years[years.length-1].title}}</button>\r\n <button tabIndex=\"-1\" *ngIf=\"months\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowYear();$event.stopPropagation()\">{{selectedDate|date:'yyyy'}}</button>\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onNext()\" [disabled]=\"noYearMode&&currentMonth===11\"><span class=\"fa fa-chevron-right\"></span></button>\r\n </header>\r\n <div class=\"p-0 border calendar\">\r\n <ul class=\"list-unstyled row\" *ngIf=\"years\">\r\n <li class=\"col-3 text-center px-2 py-3\" *ngFor=\"let year of years\">\r\n <button type=\"button\" tabIndex=\"-1\" class=\"btn btn-sm btn-outline-secondary rounded-pill\" (click)=\"onSelectYear(year.value);$event.stopPropagation()\" [class.active]=\"year.hasObservation\" [ngClass]=\"{'border border-secondary':year.isThisYear}\">{{year.title}}</button>\r\n </li>\r\n </ul>\r\n <ul class=\"list-unstyled row\" *ngIf=\"months\">\r\n <li class=\"col-4 text-center px-2 py-3\" *ngFor=\"let month of months\">\r\n <button type=\"button\" tabIndex=\"-1\" class=\"btn btn-sm btn-outline-secondary rounded-pill\" (click)=\"onSelectMonth(month.value);$event.stopPropagation()\" [class.active]=\"month.observation\" [ngClass]=\"{'border border-secondary':month.isThisMonth}\">\r\n {{'MONTHS.'+(month.value+1)|translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n <div class=\"days\" *ngIf=\"!years&&!months\">\r\n <div class=\"text-center border-bottom py-2 text-muted\" *ngFor=\"let weekDay of weekDays\">{{'WEEK_DAYS.'+weekDay|translate}}</div>\r\n <ng-container *ngFor=\"let week of weeks\">\r\n <button tabIndex=\"-1\" class=\"btn rounded-circle p-0 m-2\" *ngFor=\"let day of week.days\" (click)=\"onSelectDate(day)\" type=\"button\" \r\n [class.border]=\"day.isToday\" [class.bg-primary]=\"day.isSelected\" [class.text-white]=\"day.isSelected\" [ngClass]=\"{'pe-none text-muted opacity-50':!day.inMonth||!day.isInRange}\">\r\n <small>{{day.value|date:'d'}}</small>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </nav>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i3.LocaleDatePipe, name: "adbLocaleDate" }] }); }
159
- }
160
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AdbDatePickerComponent, decorators: [{
161
- type: Component,
162
- args: [{ selector: 'adb-date-picker', template: "<div class=\"position-relative\" [class.to-left]=\"toLeft\">\r\n <nav class=\"bg-white shadow rounded position-absolute\" style=\"width:350px\">\r\n <header class=\"bg-primary p-2 rounded-top d-flex justify-content-between align-items-center gap-1\">\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onPrev()\" [disabled]=\"noYearMode&&currentMonth===0\"><span class=\"fa fa-chevron-left\"></span></button>\r\n <ng-container *ngIf=\"!years&&!months\">\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowMonth();$event.stopPropagation()\">{{selectedDate|adbLocaleDate:'MMM'}}</button>\r\n <button *ngIf=\"!noYearMode\" tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowYear();$event.stopPropagation()\">{{selectedDate|date:'yyyy'}}</button>\r\n </ng-container>\r\n <button tabIndex=\"-1\" *ngIf=\"years\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"years=null;$event.stopPropagation()\">{{years[0].title}} - {{years[years.length-1].title}}</button>\r\n <button tabIndex=\"-1\" *ngIf=\"months\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowYear();$event.stopPropagation()\">{{selectedDate|date:'yyyy'}}</button>\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onNext()\" [disabled]=\"noYearMode&&currentMonth===11\"><span class=\"fa fa-chevron-right\"></span></button>\r\n </header>\r\n <div class=\"p-0 border calendar\">\r\n <ul class=\"list-unstyled row\" *ngIf=\"years\">\r\n <li class=\"col-3 text-center px-2 py-3\" *ngFor=\"let year of years\">\r\n <button type=\"button\" tabIndex=\"-1\" class=\"btn btn-sm btn-outline-secondary rounded-pill\" (click)=\"onSelectYear(year.value);$event.stopPropagation()\" [class.active]=\"year.hasObservation\" [ngClass]=\"{'border border-secondary':year.isThisYear}\">{{year.title}}</button>\r\n </li>\r\n </ul>\r\n <ul class=\"list-unstyled row\" *ngIf=\"months\">\r\n <li class=\"col-4 text-center px-2 py-3\" *ngFor=\"let month of months\">\r\n <button type=\"button\" tabIndex=\"-1\" class=\"btn btn-sm btn-outline-secondary rounded-pill\" (click)=\"onSelectMonth(month.value);$event.stopPropagation()\" [class.active]=\"month.observation\" [ngClass]=\"{'border border-secondary':month.isThisMonth}\">\r\n {{'MONTHS.'+(month.value+1)|translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n <div class=\"days\" *ngIf=\"!years&&!months\">\r\n <div class=\"text-center border-bottom py-2 text-muted\" *ngFor=\"let weekDay of weekDays\">{{'WEEK_DAYS.'+weekDay|translate}}</div>\r\n <ng-container *ngFor=\"let week of weeks\">\r\n <button tabIndex=\"-1\" class=\"btn rounded-circle p-0 m-2\" *ngFor=\"let day of week.days\" (click)=\"onSelectDate(day)\" type=\"button\" \r\n [class.border]=\"day.isToday\" [class.bg-primary]=\"day.isSelected\" [class.text-white]=\"day.isSelected\" [ngClass]=\"{'pe-none text-muted opacity-50':!day.inMonth||!day.isInRange}\">\r\n <small>{{day.value|date:'d'}}</small>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </nav>\r\n</div>\r\n" }]
163
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TranslateService }]; }, propDecorators: { initialDate: [{
164
- type: Input
165
- }], settings: [{
166
- type: Input
167
- }], toLeft: [{
168
- type: Input
169
- }], id: [{
170
- type: HostBinding,
171
- args: ['id']
172
- }, {
173
- type: Input
174
- }], selectDate: [{
175
- type: Output
176
- }] } });
177
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRiLWRhdGUtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FydGRhdGEtc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9kYXRlLXBpY2tlci9hZGItZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJ0ZGF0YS1zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2RhdGUtcGlja2VyL2FkYi1kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkgsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pSLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBTXBDLE1BQU0sT0FBTyxzQkFBc0I7YUFFeEIsV0FBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNoRCxjQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcs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NUJhLHNCQUFzQjtrQkFKbEMsU0FBUzsrQkFDSSxpQkFBaUI7Z0lBbUJsQixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLEVBQUU7c0JBRFYsV0FBVzt1QkFBQyxJQUFJOztzQkFDaEIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQgeyBhZGREYXlzLCBhZGRNb250aHMsIGFkZFllYXJzLCBlYWNoRGF5T2ZJbnRlcnZhbCwgZWFjaFdlZWtPZkludGVydmFsLCBlbmRPZkRheSwgZW5kT2ZNb250aCwgZ2V0SG91cnMsIGdldElTT1dlZWssIGdldE1pbnV0ZXMsIGdldE1vbnRoLCBpc1NhbWVEYXksIGlzU2FtZU1vbnRoLCBpc1NhbWVZZWFyLCBpc1ZhbGlkLCBpc1dpdGhpbkludGVydmFsLCBwYXJzZUlTTywgc3RhcnRPZkRheSwgc3RhcnRPZk1vbnRoLCBzdWJNb250aHMsIHN1YlllYXJzIH0gZnJvbSBcImRhdGUtZm5zXCI7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYWRiLWRhdGUtcGlja2VyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9hZGItZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZGJEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gICAgc3RhdGljIE1PTlRIUyA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTFdO1xyXG4gICAgc3RhdGljIFdFRUtfREFZUyA9IFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNyddO1xyXG4gICAgc3RhdGljIFlFQVJfSU5URVJWQUxMID0gODtcclxuICAgIGN1cnJlbnRkRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBjdXJyZW50TW9udGg6IG51bWJlcjtcclxuXHJcbiAgICBzZWxlY3RlZERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgeWVhcnM6IHsgdmFsdWU6IERhdGUsIHRpdGxlOiBzdHJpbmcsIGlzVGhpc1llYXI6IGJvb2xlYW4gfVtdO1xyXG4gICAgbW9udGhzOiB7IHZhbHVlOiBudW1iZXIsIGlzVGhpc01vbnRoOiBib29sZWFuIH1bXTtcclxuICAgIHdlZWtEYXlzID0gQWRiRGF0ZVBpY2tlckNvbXBvbmVudC5XRUVLX0RBWVM7XHJcbiAgICB3ZWVrczogUGlja2VyV2Vla1tdO1xyXG4gICAgcmFuZ2U6IHsgc3RhcnQ6IGFueTsgZW5kOiBhbnk7IH07XHJcbiAgICBub1llYXJNb2RlID0gZmFsc2U7O1xyXG5cclxuICAgIEBJbnB1dCgpIGluaXRpYWxEYXRlOiBEYXRlO1xyXG4gICAgQElucHV0KCkgc2V0dGluZ3M6IGFueTtcclxuICAgIEBJbnB1dCgpIHRvTGVmdDogYm9vbGVhbjtcclxuXHJcbiAgICBASG9zdEJpbmRpbmcoJ2lkJylcclxuICAgIEBJbnB1dCgpIGlkOiBzdHJpbmc7XHJcblxyXG4gICAgQE91dHB1dCgpIHNlbGVjdERhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3M/Lm1pbkRhdGUgfHwgdGhpcy5zZXR0aW5ncz8ubWF4RGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWluRGF0ZSA9IEFkYkRhdGVQaWNrZXJDb21wb25lbnQucGFyc2VEYXRlKHRoaXMuc2V0dGluZ3MubWluRGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhEYXRlID0gQWRiRGF0ZVBpY2tlckNvbXBvbmVudC5wYXJzZURhdGUodGhpcy5zZXR0aW5ncy5tYXhEYXRlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG1pbkRhdGUgPyBzdGFydE9mRGF5KG1pbkRhdGUpIDogc3ViWWVhcnMobmV3IERhdGUoKSwgMTAwMCksXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBtYXhEYXRlID8gZW5kT2ZEYXkobWF4RGF0ZSkgOiBhZGRZZWFycyhuZXcgRGF0ZSgpLCAxMDAwKVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aGlzLnNldHRpbmdzLm5vWWVhcil7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vWWVhck1vZGUgPSB0aGlzLnNldHRpbmdzLm5vWWVhcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHRoaXMuY3VycmVudGREYXRlID0gdGhpcy5pbml0aWFsRGF0ZSA/PyBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gZ2V0TW9udGgodGhpcy5zZWxlY3RlZERhdGUpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlQ2FsZW5kYXIoKVxyXG4gICAgfVxyXG5cclxuICAgIG9uU2hvd1llYXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tb250aHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubG9hZFllYXJzSW50ZXJ2YWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBvblNob3dNb250aCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnllYXJzID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxvYWRNb250aHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdFllYXIoaW5ZZWFyPzogRGF0ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLnNldEZ1bGxZZWFyKGluWWVhci5nZXRGdWxsWWVhcigpKTtcclxuICAgICAgICB0aGlzLmxvYWRNb250aHMoKTtcclxuICAgICAgICB0aGlzLnllYXJzID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdE1vbnRoKGluTW9udGg/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZS5zZXRNb250aChpbk1vbnRoKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRNb250aCA9IGdldE1vbnRoKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUNhbGVuZGFyKCk7XHJcbiAgICAgICAgdGhpcy55ZWFycyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5tb250aHMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUHJldigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy55ZWFycykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHN1YlllYXJzKHRoaXMuc2VsZWN0ZWREYXRlLCBBZGJEYXRlUGlja2VyQ29tcG9uZW50LllFQVJfSU5URVJWQUxMKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkWWVhcnNJbnRlcnZhbCgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb250aHMpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBzdWJZZWFycyh0aGlzLnNlbGVjdGVkRGF0ZSwgMSk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZE1vbnRocygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gc3ViTW9udGhzKHRoaXMuc2VsZWN0ZWREYXRlLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVDYWxlbmRhcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRNb250aCA9IGdldE1vbnRoKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBvbk5leHQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMueWVhcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBhZGRZZWFycyh0aGlzLnNlbGVjdGVkRGF0ZSwgQWRiRGF0ZVBpY2tlckNvbXBvbmVudC5ZRUFSX0lOVEVSVkFMTCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFllYXJzSW50ZXJ2YWwoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9udGhzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gYWRkWWVhcnModGhpcy5zZWxlY3RlZERhdGUsIDEpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRNb250aHMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGFkZE1vbnRocyh0aGlzLnNlbGVjdGVkRGF0ZSwgMSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2FsZW5kYXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBnZXRNb250aCh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZE1vbnRocygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1vbnRocyA9IEFkYkRhdGVQaWNrZXJDb21wb25lbnQuTU9OVEhTLm1hcCh4ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB4LFxyXG4gICAgICAgICAgICAgICAgaXNUaGlzTW9udGg6IGdldE1vbnRoKHRoaXMuc2VsZWN0ZWREYXRlKSA9PT0geCAmJiBpc1NhbWVZZWFyKHRoaXMuY3VycmVudGREYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZFllYXJzSW50ZXJ2YWwoKSB7XHJcbiAgICAgICAgbGV0IHllYXIgPSBzdWJZZWFycyh0aGlzLnNlbGVjdGVkRGF0ZSwgQWRiRGF0ZVBpY2tlckNvbXBvbmVudC5ZRUFSX0lOVEVSVkFMTCk7XHJcbiAgICAgICAgY29uc3QgeWVhcnMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcclxuICAgICAgICAgICAgeWVhcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogeWVhcixcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB5ZWFyLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgICAgICAgICAgICBpc1RoaXNZZWFyOiBpc1NhbWVZZWFyKHllYXIsIHRoaXMuY3VycmVudGREYXRlKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgeWVhciA9IGFkZFllYXJzKHllYXIsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnllYXJzID0geWVhcnM7XHJcbiAgICB9XHJcblxyXG4gICAgb25TZWxlY3REYXRlKGRheTogUGlja2VyRGF5KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3REYXRlLmVtaXQoZGF5LnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNhbGVuZGFyKCkge1xyXG4gICAgICAgIGNvbnN0IHdlZWtzID0gW107XHJcbiAgICAgICAgY29uc3QgbW9udGhJbnRlcnZhbCA9IHsgc3RhcnQ6IHN0YXJ0T2ZNb250aCh0aGlzLnNlbGVjdGVkRGF0ZSksIGVuZDogZW5kT2ZNb250aCh0aGlzLnNlbGVjdGVkRGF0ZSkgfTtcclxuICAgICAgICB2YXIgZm5zV3dlZWtzID0gZWFjaFdlZWtPZkludGVydmFsKG1vbnRoSW50ZXJ2YWwsIHsgd2Vla1N0YXJ0c09uOiB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZyA9PT0gJ3N2JyB8fCB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZyA9PT0gJ3N2LVNFJyA/IDEgOiAwIH0pO1xyXG4gICAgICAgIGZvciAoY29uc3QgZm5zV2VlayBvZiBmbnNXd2Vla3MpIHtcclxuICAgICAgICAgICAgY29uc3Qgd2VlayA9IHsgd2Vla051bWJlcjogMCwgZGF5czogW10gfTtcclxuICAgICAgICAgICAgd2Vlay53ZWVrTnVtYmVyID0gZ2V0SVNPV2VlayhuZXcgRGF0ZShmbnNXZWVrKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHdlZWtJbnRlcnZhbCA9IHsgc3RhcnQ6IG5ldyBEYXRlKGZuc1dlZWspLCBlbmQ6IGFkZERheXMobmV3IERhdGUoZm5zV2VlayksIDYpIH07XHJcbiAgICAgICAgICAgIHdlZWsuZGF5cyA9IGVhY2hEYXlPZkludGVydmFsKHdlZWtJbnRlcnZhbCkubWFwKGRheSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkYXkuc2V0SG91cnMoZ2V0SG91cnMobmV3IERhdGUoKSkpO1xyXG4gICAgICAgICAgICAgICAgZGF5LnNldE1pbnV0ZXMoZ2V0TWludXRlcyhuZXcgRGF0ZSgpKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkYXksXHJcbiAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogaXNTYW1lWWVhcihkYXksIHRoaXMuaW5pdGlhbERhdGUpICYmIGlzU2FtZURheShkYXksIHRoaXMuaW5pdGlhbERhdGUpICYmIGlzU2FtZU1vbnRoKGRheSwgdGhpcy5pbml0aWFsRGF0ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgaXNJblJhbmdlOiB0aGlzLnJhbmdlID8gaXNXaXRoaW5JbnRlcnZhbChkYXksIHRoaXMucmFuZ2UpIDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBpc1RvZGF5OiBpc1NhbWVEYXkoZGF5LCBuZXcgRGF0ZSgpKSxcclxuICAgICAgICAgICAgICAgICAgICBpbk1vbnRoOiBtb250aEludGVydmFsLnN0YXJ0LmdldE1vbnRoKCkgPT09IGRheS5nZXRNb250aCgpXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgd2Vla3MucHVzaCh3ZWVrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy53ZWVrcyA9IHdlZWtzO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBwYXJzZURhdGUodmFsdWU6IERhdGUgfCBzdHJpbmcpOiBEYXRlIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoaXNWYWxpZChwYXJzZUlTTyh2YWx1ZSkpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJU08odmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tlcldlZWsge1xyXG4gICAgd2Vla3M6IHtcclxuICAgICAgICB3ZWVrTnVtYmVyOiBudW1iZXI7XHJcbiAgICAgICAgZGF5czogUGlja2VyRGF5W11cclxuICAgIH1bXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQaWNrZXJEYXkge1xyXG4gICAgdmFsdWU6IERhdGUsXHJcbiAgICBpc1RvZGF5OiBib29sZWFuLFxyXG4gICAgaXNJblJhbmdlOiBib29sZWFuLFxyXG4gICAgaW5Nb250aDogYm9vbGVhbixcclxuICAgIGlzU2VsZWN0ZWQ6IGJvb2xlYW5cclxufSIsIjxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiIFtjbGFzcy50by1sZWZ0XT1cInRvTGVmdFwiPlxyXG4gICAgPG5hdiBjbGFzcz1cImJnLXdoaXRlIHNoYWRvdyByb3VuZGVkIHBvc2l0aW9uLWFic29sdXRlXCIgc3R5bGU9XCJ3aWR0aDozNTBweFwiPlxyXG4gICAgICAgIDxoZWFkZXIgY2xhc3M9XCJiZy1wcmltYXJ5IHAtMiByb3VuZGVkLXRvcCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdGFiSW5kZXg9XCItMVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtd2hpdGUgIHJvdW5kZWQtcGlsbFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25QcmV2KClcIiBbZGlzYWJsZWRdPVwibm9ZZWFyTW9kZSYmY3VycmVudE1vbnRoPT09MFwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1sZWZ0XCI+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXllYXJzJiYhbW9udGhzXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHRhYkluZGV4PVwiLTFcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LXdoaXRlIHJvdW5kZWQtcGlsbFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25TaG93TW9udGgoKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj57e3NlbGVjdGVkRGF0ZXxhZGJMb2NhbGVEYXRlOidNTU0nfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhbm9ZZWFyTW9kZVwiIHRhYkluZGV4PVwiLTFcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LXdoaXRlIHJvdW5kZWQtcGlsbFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25TaG93WWVhcigpOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPnt7c2VsZWN0ZWREYXRlfGRhdGU6J3l5eXknfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdGFiSW5kZXg9XCItMVwiICpuZ0lmPVwieWVhcnNcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LXdoaXRlIHJvdW5kZWQtcGlsbFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwieWVhcnM9bnVsbDskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj57e3llYXJzWzBdLnRpdGxlfX0gLSB7e3llYXJzW3llYXJzLmxlbmd0aC0xXS50aXRsZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdGFiSW5kZXg9XCItMVwiICpuZ0lmPVwibW9udGhzXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGV4dC13aGl0ZSByb3VuZGVkLXBpbGxcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uU2hvd1llYXIoKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj57e3NlbGVjdGVkRGF0ZXxkYXRlOid5eXl5J319PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdGFiSW5kZXg9XCItMVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtd2hpdGUgcm91bmRlZC1waWxsXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbk5leHQoKVwiIFtkaXNhYmxlZF09XCJub1llYXJNb2RlJiZjdXJyZW50TW9udGg9PT0xMVwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodFwiPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicC0wIGJvcmRlciBjYWxlbmRhclwiPlxyXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIHJvd1wiICpuZ0lmPVwieWVhcnNcIj5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImNvbC0zIHRleHQtY2VudGVyIHB4LTIgcHktM1wiICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiSW5kZXg9XCItMVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkgcm91bmRlZC1waWxsXCIgKGNsaWNrKT1cIm9uU2VsZWN0WWVhcih5ZWFyLnZhbHVlKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiBbY2xhc3MuYWN0aXZlXT1cInllYXIuaGFzT2JzZXJ2YXRpb25cIiBbbmdDbGFzc109XCJ7J2JvcmRlciBib3JkZXItc2Vjb25kYXJ5Jzp5ZWFyLmlzVGhpc1llYXJ9XCI+e3t5ZWFyLnRpdGxlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgcm93XCIgKm5nSWY9XCJtb250aHNcIj5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImNvbC00IHRleHQtY2VudGVyIHB4LTIgcHktM1wiICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0YWJJbmRleD1cIi0xXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25TZWxlY3RNb250aChtb250aC52YWx1ZSk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgW2NsYXNzLmFjdGl2ZV09XCJtb250aC5vYnNlcnZhdGlvblwiIFtuZ0NsYXNzXT1cInsnYm9yZGVyIGJvcmRlci1zZWNvbmRhcnknOm1vbnRoLmlzVGhpc01vbnRofVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydNT05USFMuJysobW9udGgudmFsdWUrMSl8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXlzXCIgKm5nSWY9XCIheWVhcnMmJiFtb250aHNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBib3JkZXItYm90dG9tIHB5LTIgdGV4dC1tdXRlZFwiICpuZ0Zvcj1cImxldCB3ZWVrRGF5IG9mIHdlZWtEYXlzXCI+e3snV0VFS19EQVlTLicrd2Vla0RheXx0cmFuc2xhdGV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgd2VlayBvZiB3ZWVrc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdGFiSW5kZXg9XCItMVwiIGNsYXNzPVwiYnRuIHJvdW5kZWQtY2lyY2xlIHAtMCBtLTJcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWsuZGF5c1wiIChjbGljayk9XCJvblNlbGVjdERhdGUoZGF5KVwiIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlcl09XCJkYXkuaXNUb2RheVwiIFtjbGFzcy5iZy1wcmltYXJ5XT1cImRheS5pc1NlbGVjdGVkXCIgW2NsYXNzLnRleHQtd2hpdGVdPVwiZGF5LmlzU2VsZWN0ZWRcIiBbbmdDbGFzc109XCJ7J3BlLW5vbmUgdGV4dC1tdXRlZCBvcGFjaXR5LTUwJzohZGF5LmluTW9udGh8fCFkYXkuaXNJblJhbmdlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGw+e3tkYXkudmFsdWV8ZGF0ZTonZCd9fTwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25hdj5cclxuPC9kaXY+XHJcbiJdfQ==
1
+ import { Component, EventEmitter, HostBinding, Input, Output } from "@angular/core";
2
+ import { addDays, addMonths, addYears, eachDayOfInterval, eachWeekOfInterval, endOfDay, endOfMonth, getHours, getISOWeek, getMinutes, getMonth, isSameDay, isSameMonth, isSameYear, isValid, isWithinInterval, parseISO, startOfDay, startOfMonth, subMonths, subYears } from "date-fns";
3
+ import { Subscription } from "rxjs";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@ngx-translate/core";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "../../pipes/date.pipe";
8
+ export class AdbDatePickerComponent {
9
+ static { this.MONTHS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; }
10
+ static { this.WEEK_DAYS = ['1', '2', '3', '4', '5', '6', '7']; }
11
+ static { this.YEAR_INTERVALL = 8; }
12
+ ;
13
+ constructor(elementRef, translate) {
14
+ this.elementRef = elementRef;
15
+ this.translate = translate;
16
+ this.subscriptions = new Subscription();
17
+ this.currentdDate = new Date();
18
+ this.selectedDate = new Date();
19
+ this.weekDays = AdbDatePickerComponent.WEEK_DAYS;
20
+ this.noYearMode = false;
21
+ this.selectDate = new EventEmitter();
22
+ }
23
+ ngOnInit() {
24
+ if (this.settings) {
25
+ if (this.settings?.minDate || this.settings?.maxDate) {
26
+ const minDate = AdbDatePickerComponent.parseDate(this.settings.minDate);
27
+ const maxDate = AdbDatePickerComponent.parseDate(this.settings.maxDate);
28
+ this.range = {
29
+ start: minDate ? startOfDay(minDate) : subYears(new Date(), 1000),
30
+ end: maxDate ? endOfDay(maxDate) : addYears(new Date(), 1000)
31
+ };
32
+ }
33
+ if (this.settings.noYear) {
34
+ this.noYearMode = this.settings.noYear;
35
+ }
36
+ }
37
+ this.selectedDate = this.currentdDate = this.initialDate ?? new Date();
38
+ this.currentMonth = getMonth(this.selectedDate);
39
+ this.createCalendar();
40
+ }
41
+ onShowYear() {
42
+ this.months = null;
43
+ this.loadYearsInterval();
44
+ }
45
+ onShowMonth() {
46
+ this.years = null;
47
+ this.loadMonths();
48
+ }
49
+ onSelectYear(inYear) {
50
+ this.selectedDate.setFullYear(inYear.getFullYear());
51
+ this.loadMonths();
52
+ this.years = null;
53
+ }
54
+ onSelectMonth(inMonth) {
55
+ this.selectedDate.setMonth(inMonth);
56
+ this.currentMonth = getMonth(this.selectedDate);
57
+ this.createCalendar();
58
+ this.years = null;
59
+ this.months = null;
60
+ }
61
+ onPrev() {
62
+ if (this.years) {
63
+ this.selectedDate = subYears(this.selectedDate, AdbDatePickerComponent.YEAR_INTERVALL);
64
+ this.loadYearsInterval();
65
+ }
66
+ else if (this.months) {
67
+ this.selectedDate = subYears(this.selectedDate, 1);
68
+ this.loadMonths();
69
+ }
70
+ else {
71
+ this.selectedDate = subMonths(this.selectedDate, 1);
72
+ this.createCalendar();
73
+ }
74
+ this.currentMonth = getMonth(this.selectedDate);
75
+ }
76
+ onNext() {
77
+ if (this.years) {
78
+ this.selectedDate = addYears(this.selectedDate, AdbDatePickerComponent.YEAR_INTERVALL);
79
+ this.loadYearsInterval();
80
+ }
81
+ else if (this.months) {
82
+ this.selectedDate = addYears(this.selectedDate, 1);
83
+ this.loadMonths();
84
+ }
85
+ else {
86
+ this.selectedDate = addMonths(this.selectedDate, 1);
87
+ this.createCalendar();
88
+ }
89
+ this.currentMonth = getMonth(this.selectedDate);
90
+ }
91
+ ngOnDestroy() {
92
+ this.subscriptions.unsubscribe();
93
+ }
94
+ loadMonths() {
95
+ this.months = AdbDatePickerComponent.MONTHS.map(x => {
96
+ return {
97
+ value: x,
98
+ isThisMonth: getMonth(this.selectedDate) === x && isSameYear(this.currentdDate, this.selectedDate)
99
+ };
100
+ });
101
+ }
102
+ loadYearsInterval() {
103
+ let year = subYears(this.selectedDate, AdbDatePickerComponent.YEAR_INTERVALL);
104
+ const years = [];
105
+ for (let i = 0; i < 16; i++) {
106
+ years.push({
107
+ value: year,
108
+ title: year.getFullYear(),
109
+ isThisYear: isSameYear(year, this.currentdDate)
110
+ });
111
+ year = addYears(year, 1);
112
+ }
113
+ this.years = years;
114
+ }
115
+ onSelectDate(day) {
116
+ this.selectDate.emit(day.value);
117
+ }
118
+ createCalendar() {
119
+ const weeks = [];
120
+ const monthInterval = { start: startOfMonth(this.selectedDate), end: endOfMonth(this.selectedDate) };
121
+ var fnsWweeks = eachWeekOfInterval(monthInterval, { weekStartsOn: this.translate.currentLang === 'sv' || this.translate.currentLang === 'sv-SE' ? 1 : 0 });
122
+ for (const fnsWeek of fnsWweeks) {
123
+ const week = { weekNumber: 0, days: [] };
124
+ week.weekNumber = getISOWeek(new Date(fnsWeek));
125
+ const weekInterval = { start: new Date(fnsWeek), end: addDays(new Date(fnsWeek), 6) };
126
+ week.days = eachDayOfInterval(weekInterval).map(day => {
127
+ day.setHours(getHours(new Date()));
128
+ day.setMinutes(getMinutes(new Date()));
129
+ return {
130
+ value: day,
131
+ isSelected: isSameYear(day, this.initialDate) && isSameDay(day, this.initialDate) && isSameMonth(day, this.initialDate),
132
+ isInRange: this.range ? isWithinInterval(day, this.range) : true,
133
+ isToday: isSameDay(day, new Date()),
134
+ inMonth: monthInterval.start.getMonth() === day.getMonth()
135
+ };
136
+ });
137
+ weeks.push(week);
138
+ }
139
+ this.weeks = weeks;
140
+ }
141
+ static parseDate(value) {
142
+ if (typeof value === 'string') {
143
+ if (isValid(parseISO(value))) {
144
+ return parseISO(value);
145
+ }
146
+ else {
147
+ return null;
148
+ }
149
+ }
150
+ else if (value instanceof Date) {
151
+ return value;
152
+ }
153
+ else {
154
+ return null;
155
+ }
156
+ }
157
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AdbDatePickerComponent, deps: [{ token: i0.ElementRef }, { token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
158
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: AdbDatePickerComponent, selector: "adb-date-picker", inputs: { initialDate: "initialDate", settings: "settings", toLeft: "toLeft", id: "id" }, outputs: { selectDate: "selectDate" }, host: { properties: { "id": "this.id" } }, ngImport: i0, template: "<div class=\"position-relative\" [class.to-left]=\"toLeft\">\r\n <nav class=\"bg-white shadow rounded position-absolute\" style=\"width:350px\">\r\n <header class=\"bg-primary p-2 rounded-top d-flex justify-content-between align-items-center gap-1\">\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onPrev()\" [disabled]=\"noYearMode&&currentMonth===0\"><span class=\"fa fa-chevron-left\"></span></button>\r\n <ng-container *ngIf=\"!years&&!months\">\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowMonth();$event.stopPropagation()\">{{selectedDate|adbLocaleDate:'MMM'}}</button>\r\n <button *ngIf=\"!noYearMode\" tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowYear();$event.stopPropagation()\">{{selectedDate|date:'yyyy'}}</button>\r\n </ng-container>\r\n <button tabIndex=\"-1\" *ngIf=\"years\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"years=null;$event.stopPropagation()\">{{years[0].title}} - {{years[years.length-1].title}}</button>\r\n <button tabIndex=\"-1\" *ngIf=\"months\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowYear();$event.stopPropagation()\">{{selectedDate|date:'yyyy'}}</button>\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onNext()\" [disabled]=\"noYearMode&&currentMonth===11\"><span class=\"fa fa-chevron-right\"></span></button>\r\n </header>\r\n <div class=\"p-0 border calendar\">\r\n <ul class=\"list-unstyled row\" *ngIf=\"years\">\r\n <li class=\"col-3 text-center px-2 py-3\" *ngFor=\"let year of years\">\r\n <button type=\"button\" tabIndex=\"-1\" class=\"btn btn-sm btn-outline-secondary rounded-pill\" (click)=\"onSelectYear(year.value);$event.stopPropagation()\" [class.active]=\"year.hasObservation\" [ngClass]=\"{'border border-secondary':year.isThisYear}\">{{year.title}}</button>\r\n </li>\r\n </ul>\r\n <ul class=\"list-unstyled row\" *ngIf=\"months\">\r\n <li class=\"col-4 text-center px-2 py-3\" *ngFor=\"let month of months\">\r\n <button type=\"button\" tabIndex=\"-1\" class=\"btn btn-sm btn-outline-secondary rounded-pill\" (click)=\"onSelectMonth(month.value);$event.stopPropagation()\" [class.active]=\"month.observation\" [ngClass]=\"{'border border-secondary':month.isThisMonth}\">\r\n {{'MONTHS.'+(month.value+1)|translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n <div class=\"days\" *ngIf=\"!years&&!months\">\r\n <div class=\"text-center border-bottom py-2 text-muted\" *ngFor=\"let weekDay of weekDays\">{{'WEEK_DAYS.'+weekDay|translate}}</div>\r\n <ng-container *ngFor=\"let week of weeks\">\r\n <button tabIndex=\"-1\" class=\"btn rounded-circle p-0 m-2\" *ngFor=\"let day of week.days\" (click)=\"onSelectDate(day)\" type=\"button\" \r\n [class.border]=\"day.isToday\" [class.bg-primary]=\"day.isSelected\" [class.text-white]=\"day.isSelected\" [ngClass]=\"{'pe-none text-muted opacity-50':!day.inMonth||!day.isInRange}\">\r\n <small>{{day.value|date:'d'}}</small>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </nav>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i3.LocaleDatePipe, name: "adbLocaleDate" }] }); }
159
+ }
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AdbDatePickerComponent, decorators: [{
161
+ type: Component,
162
+ args: [{ selector: 'adb-date-picker', template: "<div class=\"position-relative\" [class.to-left]=\"toLeft\">\r\n <nav class=\"bg-white shadow rounded position-absolute\" style=\"width:350px\">\r\n <header class=\"bg-primary p-2 rounded-top d-flex justify-content-between align-items-center gap-1\">\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onPrev()\" [disabled]=\"noYearMode&&currentMonth===0\"><span class=\"fa fa-chevron-left\"></span></button>\r\n <ng-container *ngIf=\"!years&&!months\">\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowMonth();$event.stopPropagation()\">{{selectedDate|adbLocaleDate:'MMM'}}</button>\r\n <button *ngIf=\"!noYearMode\" tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowYear();$event.stopPropagation()\">{{selectedDate|date:'yyyy'}}</button>\r\n </ng-container>\r\n <button tabIndex=\"-1\" *ngIf=\"years\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"years=null;$event.stopPropagation()\">{{years[0].title}} - {{years[years.length-1].title}}</button>\r\n <button tabIndex=\"-1\" *ngIf=\"months\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onShowYear();$event.stopPropagation()\">{{selectedDate|date:'yyyy'}}</button>\r\n <button tabIndex=\"-1\" class=\"btn btn-primary text-white rounded-pill\" type=\"button\" (click)=\"onNext()\" [disabled]=\"noYearMode&&currentMonth===11\"><span class=\"fa fa-chevron-right\"></span></button>\r\n </header>\r\n <div class=\"p-0 border calendar\">\r\n <ul class=\"list-unstyled row\" *ngIf=\"years\">\r\n <li class=\"col-3 text-center px-2 py-3\" *ngFor=\"let year of years\">\r\n <button type=\"button\" tabIndex=\"-1\" class=\"btn btn-sm btn-outline-secondary rounded-pill\" (click)=\"onSelectYear(year.value);$event.stopPropagation()\" [class.active]=\"year.hasObservation\" [ngClass]=\"{'border border-secondary':year.isThisYear}\">{{year.title}}</button>\r\n </li>\r\n </ul>\r\n <ul class=\"list-unstyled row\" *ngIf=\"months\">\r\n <li class=\"col-4 text-center px-2 py-3\" *ngFor=\"let month of months\">\r\n <button type=\"button\" tabIndex=\"-1\" class=\"btn btn-sm btn-outline-secondary rounded-pill\" (click)=\"onSelectMonth(month.value);$event.stopPropagation()\" [class.active]=\"month.observation\" [ngClass]=\"{'border border-secondary':month.isThisMonth}\">\r\n {{'MONTHS.'+(month.value+1)|translate}}\r\n </button>\r\n </li>\r\n </ul>\r\n <div class=\"days\" *ngIf=\"!years&&!months\">\r\n <div class=\"text-center border-bottom py-2 text-muted\" *ngFor=\"let weekDay of weekDays\">{{'WEEK_DAYS.'+weekDay|translate}}</div>\r\n <ng-container *ngFor=\"let week of weeks\">\r\n <button tabIndex=\"-1\" class=\"btn rounded-circle p-0 m-2\" *ngFor=\"let day of week.days\" (click)=\"onSelectDate(day)\" type=\"button\" \r\n [class.border]=\"day.isToday\" [class.bg-primary]=\"day.isSelected\" [class.text-white]=\"day.isSelected\" [ngClass]=\"{'pe-none text-muted opacity-50':!day.inMonth||!day.isInRange}\">\r\n <small>{{day.value|date:'d'}}</small>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </nav>\r\n</div>\r\n" }]
163
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.TranslateService }], propDecorators: { initialDate: [{
164
+ type: Input
165
+ }], settings: [{
166
+ type: Input
167
+ }], toLeft: [{
168
+ type: Input
169
+ }], id: [{
170
+ type: HostBinding,
171
+ args: ['id']
172
+ }, {
173
+ type: Input
174
+ }], selectDate: [{
175
+ type: Output
176
+ }] } });
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRiLWRhdGUtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FydGRhdGEtc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9kYXRlLXBpY2tlci9hZGItZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJ0ZGF0YS1zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2RhdGUtcGlja2VyL2FkYi1kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkgsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pSLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBTXBDLE1BQU0sT0FBTyxzQkFBc0I7YUFFeEIsV0FBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQUFBekMsQ0FBMEM7YUFDaEQsY0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFB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QixDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ0osT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7aUlBdktRLHNCQUFzQjtxSEFBdEIsc0JBQXNCLG1PQ1RuQyx1bEhBcUNBOzsyRkQ1QmEsc0JBQXNCO2tCQUpsQyxTQUFTOytCQUNJLGlCQUFpQjs4R0FtQmxCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csRUFBRTtzQkFEVixXQUFXO3VCQUFDLElBQUk7O3NCQUNoQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7IGFkZERheXMsIGFkZE1vbnRocywgYWRkWWVhcnMsIGVhY2hEYXlPZkludGVydmFsLCBlYWNoV2Vla09mSW50ZXJ2YWwsIGVuZE9mRGF5LCBlbmRPZk1vbnRoLCBnZXRIb3VycywgZ2V0SVNPV2VlaywgZ2V0TWludXRlcywgZ2V0TW9udGgsIGlzU2FtZURheSwgaXNTYW1lTW9udGgsIGlzU2FtZVllYXIsIGlzVmFsaWQsIGlzV2l0aGluSW50ZXJ2YWwsIHBhcnNlSVNPLCBzdGFydE9mRGF5LCBzdGFydE9mTW9udGgsIHN1Yk1vbnRocywgc3ViWWVhcnMgfSBmcm9tIFwiZGF0ZS1mbnNcIjtcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdhZGItZGF0ZS1waWNrZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FkYi1kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkYkRhdGVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgICBzdGF0aWMgTU9OVEhTID0gWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMV07XHJcbiAgICBzdGF0aWMgV0VFS19EQVlTID0gWycxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3J107XHJcbiAgICBzdGF0aWMgWUVBUl9JTlRFUlZBTEwgPSA4O1xyXG4gICAgY3VycmVudGREYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcclxuICAgIGN1cnJlbnRNb250aDogbnVtYmVyO1xyXG5cclxuICAgIHNlbGVjdGVkRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICB5ZWFyczogeyB2YWx1ZTogRGF0ZSwgdGl0bGU6IHN0cmluZywgaXNUaGlzWWVhcjogYm9vbGVhbiB9W107XHJcbiAgICBtb250aHM6IHsgdmFsdWU6IG51bWJlciwgaXNUaGlzTW9udGg6IGJvb2xlYW4gfVtdO1xyXG4gICAgd2Vla0RheXMgPSBBZGJEYXRlUGlja2VyQ29tcG9uZW50LldFRUtfREFZUztcclxuICAgIHdlZWtzOiBQaWNrZXJXZWVrW107XHJcbiAgICByYW5nZTogeyBzdGFydDogYW55OyBlbmQ6IGFueTsgfTtcclxuICAgIG5vWWVhck1vZGUgPSBmYWxzZTs7XHJcblxyXG4gICAgQElucHV0KCkgaW5pdGlhbERhdGU6IERhdGU7XHJcbiAgICBASW5wdXQoKSBzZXR0aW5nczogYW55O1xyXG4gICAgQElucHV0KCkgdG9MZWZ0OiBib29sZWFuO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnaWQnKVxyXG4gICAgQElucHV0KCkgaWQ6IHN0cmluZztcclxuXHJcbiAgICBAT3V0cHV0KCkgc2VsZWN0RGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UpIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncz8ubWluRGF0ZSB8fCB0aGlzLnNldHRpbmdzPy5tYXhEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtaW5EYXRlID0gQWRiRGF0ZVBpY2tlckNvbXBvbmVudC5wYXJzZURhdGUodGhpcy5zZXR0aW5ncy5taW5EYXRlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1heERhdGUgPSBBZGJEYXRlUGlja2VyQ29tcG9uZW50LnBhcnNlRGF0ZSh0aGlzLnNldHRpbmdzLm1heERhdGUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydDogbWluRGF0ZSA/IHN0YXJ0T2ZEYXkobWluRGF0ZSkgOiBzdWJZZWFycyhuZXcgRGF0ZSgpLCAxMDAwKSxcclxuICAgICAgICAgICAgICAgICAgICBlbmQ6IG1heERhdGUgPyBlbmRPZkRheShtYXhEYXRlKSA6IGFkZFllYXJzKG5ldyBEYXRlKCksIDEwMDApXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRoaXMuc2V0dGluZ3Mubm9ZZWFyKXtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9ZZWFyTW9kZSA9IHRoaXMuc2V0dGluZ3Mubm9ZZWFyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gdGhpcy5jdXJyZW50ZERhdGUgPSB0aGlzLmluaXRpYWxEYXRlID8/IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBnZXRNb250aCh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVDYWxlbmRhcigpXHJcbiAgICB9XHJcblxyXG4gICAgb25TaG93WWVhcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1vbnRocyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sb2FkWWVhcnNJbnRlcnZhbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU2hvd01vbnRoKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMueWVhcnMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubG9hZE1vbnRocygpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU2VsZWN0WWVhcihpblllYXI/OiBEYXRlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUuc2V0RnVsbFllYXIoaW5ZZWFyLmdldEZ1bGxZZWFyKCkpO1xyXG4gICAgICAgIHRoaXMubG9hZE1vbnRocygpO1xyXG4gICAgICAgIHRoaXMueWVhcnMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU2VsZWN0TW9udGgoaW5Nb250aD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLnNldE1vbnRoKGluTW9udGgpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gZ2V0TW9udGgodGhpcy5zZWxlY3RlZERhdGUpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlQ2FsZW5kYXIoKTtcclxuICAgICAgICB0aGlzLnllYXJzID0gbnVsbDtcclxuICAgICAgICB0aGlzLm1vbnRocyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgb25QcmV2KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnllYXJzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gc3ViWWVhcnModGhpcy5zZWxlY3RlZERhdGUsIEFkYkRhdGVQaWNrZXJDb21wb25lbnQuWUVBUl9JTlRFUlZBTEwpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRZZWFyc0ludGVydmFsKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vbnRocykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHN1YlllYXJzKHRoaXMuc2VsZWN0ZWREYXRlLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkTW9udGhzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBzdWJNb250aHModGhpcy5zZWxlY3RlZERhdGUsIDEpO1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNhbGVuZGFyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gZ2V0TW9udGgodGhpcy5zZWxlY3RlZERhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTmV4dCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy55ZWFycykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGFkZFllYXJzKHRoaXMuc2VsZWN0ZWREYXRlLCBBZGJEYXRlUGlja2VyQ29tcG9uZW50LllFQVJfSU5URVJWQUxMKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkWWVhcnNJbnRlcnZhbCgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb250aHMpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBhZGRZZWFycyh0aGlzLnNlbGVjdGVkRGF0ZSwgMSk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZE1vbnRocygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gYWRkTW9udGhzKHRoaXMuc2VsZWN0ZWREYXRlLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVDYWxlbmRhcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRNb250aCA9IGdldE1vbnRoKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkTW9udGhzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubW9udGhzID0gQWRiRGF0ZVBpY2tlckNvbXBvbmVudC5NT05USFMubWFwKHggPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHgsXHJcbiAgICAgICAgICAgICAgICBpc1RoaXNNb250aDogZ2V0TW9udGgodGhpcy5zZWxlY3RlZERhdGUpID09PSB4ICYmIGlzU2FtZVllYXIodGhpcy5jdXJyZW50ZERhdGUsIHRoaXMuc2VsZWN0ZWREYXRlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkWWVhcnNJbnRlcnZhbCgpIHtcclxuICAgICAgICBsZXQgeWVhciA9IHN1YlllYXJzKHRoaXMuc2VsZWN0ZWREYXRlLCBBZGJEYXRlUGlja2VyQ29tcG9uZW50LllFQVJfSU5URVJWQUxMKTtcclxuICAgICAgICBjb25zdCB5ZWFycyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xyXG4gICAgICAgICAgICB5ZWFycy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB5ZWFyLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IHllYXIuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgICAgICAgICAgIGlzVGhpc1llYXI6IGlzU2FtZVllYXIoeWVhciwgdGhpcy5jdXJyZW50ZERhdGUpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB5ZWFyID0gYWRkWWVhcnMoeWVhciwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMueWVhcnMgPSB5ZWFycztcclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdERhdGUoZGF5OiBQaWNrZXJEYXkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdERhdGUuZW1pdChkYXkudmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlQ2FsZW5kYXIoKSB7XHJcbiAgICAgICAgY29uc3Qgd2Vla3MgPSBbXTtcclxuICAgICAgICBjb25zdCBtb250aEludGVydmFsID0geyBzdGFydDogc3RhcnRPZk1vbnRoKHRoaXMuc2VsZWN0ZWREYXRlKSwgZW5kOiBlbmRPZk1vbnRoKHRoaXMuc2VsZWN0ZWREYXRlKSB9O1xyXG4gICAgICAgIHZhciBmbnNXd2Vla3MgPSBlYWNoV2Vla09mSW50ZXJ2YWwobW9udGhJbnRlcnZhbCwgeyB3ZWVrU3RhcnRzT246IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nID09PSAnc3YnIHx8IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nID09PSAnc3YtU0UnID8gMSA6IDAgfSk7XHJcbiAgICAgICAgZm9yIChjb25zdCBmbnNXZWVrIG9mIGZuc1d3ZWVrcykge1xyXG4gICAgICAgICAgICBjb25zdCB3ZWVrID0geyB3ZWVrTnVtYmVyOiAwLCBkYXlzOiBbXSB9O1xyXG4gICAgICAgICAgICB3ZWVrLndlZWtOdW1iZXIgPSBnZXRJU09XZWVrKG5ldyBEYXRlKGZuc1dlZWspKTtcclxuICAgICAgICAgICAgY29uc3Qgd2Vla0ludGVydmFsID0geyBzdGFydDogbmV3IERhdGUoZm5zV2VlayksIGVuZDogYWRkRGF5cyhuZXcgRGF0ZShmbnNXZWVrKSwgNikgfTtcclxuICAgICAgICAgICAgd2Vlay5kYXlzID0gZWFjaERheU9mSW50ZXJ2YWwod2Vla0ludGVydmFsKS5tYXAoZGF5ID0+IHtcclxuICAgICAgICAgICAgICAgIGRheS5zZXRIb3VycyhnZXRIb3VycyhuZXcgRGF0ZSgpKSk7XHJcbiAgICAgICAgICAgICAgICBkYXkuc2V0TWludXRlcyhnZXRNaW51dGVzKG5ldyBEYXRlKCkpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGRheSxcclxuICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBpc1NhbWVZZWFyKGRheSwgdGhpcy5pbml0aWFsRGF0ZSkgJiYgaXNTYW1lRGF5KGRheSwgdGhpcy5pbml0aWFsRGF0ZSkgJiYgaXNTYW1lTW9udGgoZGF5LCB0aGlzLmluaXRpYWxEYXRlKSxcclxuICAgICAgICAgICAgICAgICAgICBpc0luUmFuZ2U6IHRoaXMucmFuZ2UgPyBpc1dpdGhpbkludGVydmFsKGRheSwgdGhpcy5yYW5nZSkgOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzVG9kYXk6IGlzU2FtZURheShkYXksIG5ldyBEYXRlKCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIGluTW9udGg6IG1vbnRoSW50ZXJ2YWwuc3RhcnQuZ2V0TW9udGgoKSA9PT0gZGF5LmdldE1vbnRoKClcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB3ZWVrcy5wdXNoKHdlZWspO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLndlZWtzID0gd2Vla3M7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHBhcnNlRGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyk6IERhdGUge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKHBhcnNlSVNPKHZhbHVlKSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUlTTyh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGlja2VyV2VlayB7XHJcbiAgICB3ZWVrczoge1xyXG4gICAgICAgIHdlZWtOdW1iZXI6IG51bWJlcjtcclxuICAgICAgICBkYXlzOiBQaWNrZXJEYXlbXVxyXG4gICAgfVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tlckRheSB7XHJcbiAgICB2YWx1ZTogRGF0ZSxcclxuICAgIGlzVG9kYXk6IGJvb2xlYW4sXHJcbiAgICBpc0luUmFuZ2U6IGJvb2xlYW4sXHJcbiAgICBpbk1vbnRoOiBib29sZWFuLFxyXG4gICAgaXNTZWxlY3RlZDogYm9vbGVhblxyXG59IiwiPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCIgW2NsYXNzLnRvLWxlZnRdPVwidG9MZWZ0XCI+XHJcbiAgICA8bmF2IGNsYXNzPVwiYmctd2hpdGUgc2hhZG93IHJvdW5kZWQgcG9zaXRpb24tYWJzb2x1dGVcIiBzdHlsZT1cIndpZHRoOjM1MHB4XCI+XHJcbiAgICAgICAgPGhlYWRlciBjbGFzcz1cImJnLXByaW1hcnkgcC0yIHJvdW5kZWQtdG9wIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTFcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0YWJJbmRleD1cIi0xXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGV4dC13aGl0ZSAgcm91bmRlZC1waWxsXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblByZXYoKVwiIFtkaXNhYmxlZF09XCJub1llYXJNb2RlJiZjdXJyZW50TW9udGg9PT0wXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWxlZnRcIj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIheWVhcnMmJiFtb250aHNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdGFiSW5kZXg9XCItMVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtd2hpdGUgcm91bmRlZC1waWxsXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblNob3dNb250aCgpOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPnt7c2VsZWN0ZWREYXRlfGFkYkxvY2FsZURhdGU6J01NTSd9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFub1llYXJNb2RlXCIgdGFiSW5kZXg9XCItMVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtd2hpdGUgcm91bmRlZC1waWxsXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblNob3dZZWFyKCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+e3tzZWxlY3RlZERhdGV8ZGF0ZToneXl5eSd9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0YWJJbmRleD1cIi0xXCIgKm5nSWY9XCJ5ZWFyc1wiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtd2hpdGUgcm91bmRlZC1waWxsXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ5ZWFycz1udWxsOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPnt7eWVhcnNbMF0udGl0bGV9fSAtIHt7eWVhcnNbeWVhcnMubGVuZ3RoLTFdLnRpdGxlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0YWJJbmRleD1cIi0xXCIgKm5nSWY9XCJtb250aHNcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LXdoaXRlIHJvdW5kZWQtcGlsbFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25TaG93WWVhcigpOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPnt7c2VsZWN0ZWREYXRlfGRhdGU6J3l5eXknfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0YWJJbmRleD1cIi0xXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGV4dC13aGl0ZSByb3VuZGVkLXBpbGxcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uTmV4dCgpXCIgW2Rpc2FibGVkXT1cIm5vWWVhck1vZGUmJmN1cnJlbnRNb250aD09PTExXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0XCI+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvaGVhZGVyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLTAgYm9yZGVyIGNhbGVuZGFyXCI+XHJcbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgcm93XCIgKm5nSWY9XCJ5ZWFyc1wiPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiY29sLTMgdGV4dC1jZW50ZXIgcHgtMiBweS0zXCIgKm5nRm9yPVwibGV0IHllYXIgb2YgeWVhcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0YWJJbmRleD1cIi0xXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25TZWxlY3RZZWFyKHllYXIudmFsdWUpOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFtjbGFzcy5hY3RpdmVdPVwieWVhci5oYXNPYnNlcnZhdGlvblwiIFtuZ0NsYXNzXT1cInsnYm9yZGVyIGJvcmRlci1zZWNvbmRhcnknOnllYXIuaXNUaGlzWWVhcn1cIj57e3llYXIudGl0bGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZCByb3dcIiAqbmdJZj1cIm1vbnRoc1wiPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiY29sLTQgdGV4dC1jZW50ZXIgcHgtMiBweS0zXCIgKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYkluZGV4PVwiLTFcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IHJvdW5kZWQtcGlsbFwiIChjbGljayk9XCJvblNlbGVjdE1vbnRoKG1vbnRoLnZhbHVlKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiBbY2xhc3MuYWN0aXZlXT1cIm1vbnRoLm9ic2VydmF0aW9uXCIgW25nQ2xhc3NdPVwieydib3JkZXIgYm9yZGVyLXNlY29uZGFyeSc6bW9udGguaXNUaGlzTW9udGh9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J01PTlRIUy4nKyhtb250aC52YWx1ZSsxKXx0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheXNcIiAqbmdJZj1cIiF5ZWFycyYmIW1vbnRoc1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIGJvcmRlci1ib3R0b20gcHktMiB0ZXh0LW11dGVkXCIgKm5nRm9yPVwibGV0IHdlZWtEYXkgb2Ygd2Vla0RheXNcIj57eydXRUVLX0RBWVMuJyt3ZWVrRGF5fHRyYW5zbGF0ZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3ZWVrIG9mIHdlZWtzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJJbmRleD1cIi0xXCIgY2xhc3M9XCJidG4gcm91bmRlZC1jaXJjbGUgcC0wIG0tMlwiICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vlay5kYXlzXCIgKGNsaWNrKT1cIm9uU2VsZWN0RGF0ZShkYXkpXCIgdHlwZT1cImJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyXT1cImRheS5pc1RvZGF5XCIgW2NsYXNzLmJnLXByaW1hcnldPVwiZGF5LmlzU2VsZWN0ZWRcIiBbY2xhc3MudGV4dC13aGl0ZV09XCJkYXkuaXNTZWxlY3RlZFwiIFtuZ0NsYXNzXT1cInsncGUtbm9uZSB0ZXh0LW11dGVkIG9wYWNpdHktNTAnOiFkYXkuaW5Nb250aHx8IWRheS5pc0luUmFuZ2V9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbD57e2RheS52YWx1ZXxkYXRlOidkJ319PC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmF2PlxyXG48L2Rpdj5cclxuIl19