@idea-ionic/uncommon 8.5.13 → 8.6.0

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 (57) hide show
  1. package/fesm2022/idea-ionic-uncommon.mjs +85 -85
  2. package/fesm2022/idea-ionic-uncommon.mjs.map +1 -1
  3. package/index.d.ts +1405 -3
  4. package/package.json +11 -12
  5. package/esm2022/idea-ionic-uncommon.mjs +0 -5
  6. package/esm2022/public-api.mjs +0 -26
  7. package/esm2022/src/AWSAPI.service.mjs +0 -431
  8. package/esm2022/src/AWSAPISocket.service.mjs +0 -188
  9. package/esm2022/src/address/address.component.mjs +0 -409
  10. package/esm2022/src/announcement/announcement.component.mjs +0 -72
  11. package/esm2022/src/cachedResources.service.mjs +0 -55
  12. package/esm2022/src/colors/colorPicker.component.mjs +0 -191
  13. package/esm2022/src/contacts/contacts.component.mjs +0 -188
  14. package/esm2022/src/dateTime/calendarPicker.component.mjs +0 -213
  15. package/esm2022/src/dateTime/dateTime.component.mjs +0 -217
  16. package/esm2022/src/duration/duration.component.mjs +0 -195
  17. package/esm2022/src/echo/echo.page.mjs +0 -233
  18. package/esm2022/src/echo/echo.routes.mjs +0 -6
  19. package/esm2022/src/errorReporting.service.mjs +0 -69
  20. package/esm2022/src/mde/mde.component.mjs +0 -143
  21. package/esm2022/src/mde/mdeToolbar.component.mjs +0 -25
  22. package/esm2022/src/offline/cacheableResource.component.mjs +0 -56
  23. package/esm2022/src/offline/offline.service.mjs +0 -63
  24. package/esm2022/src/offline/offlineData.service.mjs +0 -480
  25. package/esm2022/src/offline/offlineIndicator.component.mjs +0 -105
  26. package/esm2022/src/offline/offlineManager.component.mjs +0 -101
  27. package/esm2022/src/pushNotifications.service.mjs +0 -57
  28. package/esm2022/src/sentiment/sentiment.component.mjs +0 -112
  29. package/esm2022/src/timeInterval/fromTimeToTime.component.mjs +0 -171
  30. package/esm2022/src/timeInterval/timeInterval.component.mjs +0 -206
  31. package/esm2022/src/tinCan.service.mjs +0 -49
  32. package/public-api.d.ts +0 -25
  33. package/src/AWSAPI.service.d.ts +0 -178
  34. package/src/AWSAPISocket.service.d.ts +0 -129
  35. package/src/address/address.component.d.ts +0 -64
  36. package/src/announcement/announcement.component.d.ts +0 -23
  37. package/src/cachedResources.service.d.ts +0 -34
  38. package/src/colors/colorPicker.component.d.ts +0 -78
  39. package/src/contacts/contacts.component.d.ts +0 -31
  40. package/src/dateTime/calendarPicker.component.d.ts +0 -45
  41. package/src/dateTime/dateTime.component.d.ts +0 -81
  42. package/src/duration/duration.component.d.ts +0 -68
  43. package/src/echo/echo.page.d.ts +0 -34
  44. package/src/echo/echo.routes.d.ts +0 -2
  45. package/src/errorReporting.service.d.ts +0 -26
  46. package/src/mde/mde.component.d.ts +0 -39
  47. package/src/mde/mdeToolbar.component.d.ts +0 -5
  48. package/src/offline/cacheableResource.component.d.ts +0 -11
  49. package/src/offline/offline.service.d.ts +0 -39
  50. package/src/offline/offlineData.service.d.ts +0 -281
  51. package/src/offline/offlineIndicator.component.d.ts +0 -25
  52. package/src/offline/offlineManager.component.d.ts +0 -17
  53. package/src/pushNotifications.service.d.ts +0 -26
  54. package/src/sentiment/sentiment.component.d.ts +0 -35
  55. package/src/timeInterval/fromTimeToTime.component.d.ts +0 -61
  56. package/src/timeInterval/timeInterval.component.d.ts +0 -84
  57. package/src/tinCan.service.d.ts +0 -31
@@ -1,213 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, Input, inject } from '@angular/core';
3
- import { FormsModule } from '@angular/forms';
4
- import { AlertController, ModalController, IonHeader, IonToolbar, IonTitle, IonButtons, IonButton, IonIcon, IonGrid, IonContent, IonRow, IonCol, IonInput, IonFooter } from '@ionic/angular/standalone';
5
- import { IDEALocalizedDatePipe, IDEATranslatePipe, IDEATranslationsService } from '@idea-ionic/common';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/common";
8
- /**
9
- * A random sunday, used as reference to calculate the week days.
10
- */
11
- const SUNDAY = 259200000;
12
- export class IDEACalendarPickerComponent {
13
- constructor() {
14
- this._modal = inject(ModalController);
15
- this._alert = inject(AlertController);
16
- this._translate = inject(IDEATranslationsService);
17
- this.timePicker = false;
18
- this.manualTimePicker = false;
19
- this.hideClearButton = false;
20
- }
21
- ngOnInit() {
22
- this.today = new Date();
23
- this.refDate = this.inputDate ? new Date(this.inputDate) : new Date(this.today);
24
- this.selectedDate = new Date(this.refDate);
25
- this.hour = 12; // to endure timezones
26
- this.minute = 0;
27
- if (this.timePicker || this.manualTimePicker) {
28
- this.hour = this.selectedDate.getHours();
29
- if (this.manualTimePicker)
30
- this.minute = this.selectedDate.getMinutes();
31
- else {
32
- // round the minutes a multiple of 5
33
- this.minute = Math.ceil(this.selectedDate.getMinutes() / 5) * 5;
34
- this.selectedDate.setMinutes(this.minute);
35
- }
36
- }
37
- this.buildCalendarGrid(this.refDate);
38
- this.hours = Array.from(Array(24).keys()).map(i => '0'.concat(i.toString()).slice(-2));
39
- this.minutes = Array.from(Array(12).keys()).map(i => '0'.concat((i * 5).toString()).slice(-2));
40
- // build the weekdays based on the current locale
41
- this.weekDays = new Array();
42
- const refDateForWeekDays = new Date(SUNDAY);
43
- refDateForWeekDays.setDate(refDateForWeekDays.getDate() - this.getLocalisedDay(refDateForWeekDays));
44
- for (let i = 0; i < 7; i++) {
45
- this.weekDays.push(refDateForWeekDays.toLocaleDateString(this._translate.getCurrentLang(), { weekday: 'short' }));
46
- refDateForWeekDays.setDate(refDateForWeekDays.getDate() + 1);
47
- }
48
- if (this.min)
49
- this.dateMin = new Date(this.min);
50
- if (this.max)
51
- this.dateMax = new Date(this.max);
52
- }
53
- getLocalisedDay(date) {
54
- let n = date.getDay();
55
- switch (this._translate.getCurrentLang()) {
56
- case 'it':
57
- n = --n < 0 ? 6 : n;
58
- break;
59
- }
60
- return n;
61
- }
62
- buildCalendarGrid(refDate) {
63
- // find the first day in the month: the important data here is the day of the week
64
- const firstDateOfMonth = new Date(refDate.getFullYear(), refDate.getMonth(), 1);
65
- // the following flag is used to divide the logic so I can fill the calendar
66
- // also with the dates from the previous month, until there's space in the grid
67
- let haventFoundFirstDay = true;
68
- // index used to build the dates of the month, starting from the first one
69
- let index = 1;
70
- this.calendarGrid = new Array();
71
- for (let i = 0; i < 6; i++) {
72
- this.calendarGrid[i] = new Array();
73
- for (let j = 0; j < 7; j++) {
74
- if (haventFoundFirstDay) {
75
- if (this.getLocalisedDay(firstDateOfMonth) === j) {
76
- // note: considers Sunday
77
- haventFoundFirstDay = false;
78
- this.calendarGrid[i][j] = new Date(firstDateOfMonth);
79
- // now the I've found the first date of the month I can fill the calendar
80
- // the dates fromt the previous month, until there's space in the grid
81
- for (let y = this.getLocalisedDay(firstDateOfMonth); y >= 0; y--) {
82
- const d = new Date(firstDateOfMonth);
83
- d.setDate(firstDateOfMonth.getDate() - y);
84
- this.calendarGrid[i][this.getLocalisedDay(firstDateOfMonth) - y] = d;
85
- }
86
- }
87
- }
88
- else {
89
- // fill the following dates until there's space in the grid
90
- const d = new Date(firstDateOfMonth);
91
- d.setDate(firstDateOfMonth.getDate() + index++);
92
- this.calendarGrid[i][j] = d;
93
- }
94
- }
95
- }
96
- }
97
- addYears(offset) {
98
- this.refDate.setFullYear(this.refDate.getFullYear() + offset);
99
- this.buildCalendarGrid(this.refDate);
100
- }
101
- setYear(year) {
102
- if (!year)
103
- return;
104
- this.refDate.setFullYear(Number(year));
105
- this.buildCalendarGrid(this.refDate);
106
- }
107
- addMonths(offset) {
108
- this.refDate.setMonth(this.refDate.getMonth() + offset);
109
- this.buildCalendarGrid(this.refDate);
110
- }
111
- async showMonths() {
112
- const buttons = [];
113
- const inputs = [];
114
- const month = new Date(0);
115
- for (let i = 1; i <= 12; i++) {
116
- inputs.push({
117
- type: 'radio',
118
- label: month.toLocaleDateString(this._translate.getCurrentLang(), { month: 'long' }),
119
- value: i.toString(),
120
- checked: i === this.refDate.getMonth() + 1
121
- });
122
- month.setMonth(month.getMonth() + 1);
123
- }
124
- buttons.push({ text: this._translate._('COMMON.CANCEL'), role: 'cancel' });
125
- buttons.push({
126
- text: this._translate._('COMMON.SELECT'),
127
- handler: (m) => {
128
- this.refDate.setMonth(parseInt(m, 10) - 1);
129
- this.buildCalendarGrid(this.refDate);
130
- }
131
- });
132
- const alert = await this._alert.create({
133
- header: this._translate._('IDEA_UNCOMMON.CALENDAR.MONTH'),
134
- buttons,
135
- inputs
136
- });
137
- alert.present();
138
- }
139
- isDateSelectable(date) {
140
- if (this.dateMin && date < this.dateMin)
141
- return false;
142
- if (this.dateMax && date > this.dateMax)
143
- return false;
144
- return true;
145
- }
146
- selectDate(date) {
147
- this.selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), this.hour, this.minute);
148
- }
149
- selectHour(hour) {
150
- this.hour = Number(hour);
151
- this.selectedDate.setHours(this.hour);
152
- }
153
- selectMinute(minute) {
154
- this.minute = Number(minute);
155
- this.selectedDate.setMinutes(this.minute);
156
- }
157
- isSameDay(a, b) {
158
- return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
159
- }
160
- isSameMonth(a, b) {
161
- return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
162
- }
163
- isSameHour(hour) {
164
- return this.selectedDate.getHours() === Number(hour);
165
- }
166
- isSameMinute(minute) {
167
- return this.selectedDate.getMinutes() === Number(minute);
168
- }
169
- save(reset) {
170
- this._modal.dismiss(reset ? '' : this.selectedDate);
171
- }
172
- close() {
173
- this._modal.dismiss();
174
- }
175
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
176
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEACalendarPickerComponent, isStandalone: true, selector: "idea-calendar-picker", inputs: { inputDate: "inputDate", timePicker: "timePicker", manualTimePicker: "manualTimePicker", title: "title", hideClearButton: "hideClearButton", min: "min", max: "max" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n @if (!hideClearButton) {\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.RESET' | translate\" (click)=\"save(true)\">\n <ion-icon slot=\"icon-only\" name=\"arrow-undo\" />\n </ion-button>\n }\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon slot=\"icon-only\" name=\"close\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid fixed class=\"ion-no-padding\">\n <ion-row>\n <h1 class=\"headerLabel\">{{ 'IDEA_UNCOMMON.CALENDAR.SET_DATE' | translate }}</h1>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\">\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"5\">\n <ion-row class=\"ion-align-items-center ion-justify-content-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\">\n <ion-input\n type=\"text\"\n [placeholder]=\"'IDEA_UNCOMMON.CALENDAR.YEAR' | translate\"\n [value]=\"refDate.getFullYear()\"\n (ionFocus)=\"$event.target.value = ''\"\n (ionChange)=\"setYear($event?.target?.value)\"\n >\n </ion-input>\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"7\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\" (click)=\"showMonths()\">\n {{ refDate | dateLocale: 'MMMM' }}\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\" class=\"headerLabel\">\n @for (ddd of weekDays; track ddd) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n {{ ddd }}\n </ion-col>\n }\n </ion-row>\n @for (row of calendarGrid; track row; let i = $index) {\n <ion-row class=\"ion-align-items-center\">\n @for (col of row; track col; let j = $index) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"\n isSameDay(calendarGrid[i][j], today) || isSameDay(calendarGrid[i][j], selectedDate)\n ? 'primary'\n : isSameMonth(calendarGrid[i][j], refDate)\n ? 'dark'\n : 'medium'\n \"\n [fill]=\"\n isSameDay(calendarGrid[i][j], selectedDate)\n ? 'solid'\n : isSameDay(calendarGrid[i][j], today)\n ? 'outline'\n : 'clear'\n \"\n [disabled]=\"!isDateSelectable(calendarGrid[i][j])\"\n (click)=\"selectDate(calendarGrid[i][j])\"\n >\n {{ calendarGrid[i][j] | date: 'd' }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n }\n @if (timePicker || manualTimePicker) {\n <ion-row>\n <h1 class=\"headerLabel\">\n {{ 'IDEA_UNCOMMON.CALENDAR.SET_TIME' | translate }}\n </h1>\n </ion-row>\n }\n @if (timePicker) {\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-no-padding\" [size]=\"7\">\n <ion-row>\n @for (hour of hours; track hour) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"2\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameHour(hour) ? 'primary' : 'dark'\"\n [fill]=\"isSameHour(hour) ? 'solid' : 'clear'\"\n (click)=\"selectHour(hour)\"\n >\n {{ hour }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"1\"> : </ion-col>\n <ion-col class=\"ion-no-padding\" [size]=\"4\">\n <ion-row>\n @for (minute of minutes; track minute) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"4\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameMinute(minute) ? 'primary' : 'dark'\"\n [fill]=\"isSameMinute(minute) ? 'solid' : 'clear'\"\n (click)=\"selectMinute(minute)\"\n >\n {{ minute }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n </ion-row>\n }\n @if (manualTimePicker) {\n <ion-row class=\"ion-align-items-center manualTimePicker\">\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <input type=\"number\" min=\"0\" max=\"23\" [value]=\"hour\" (change)=\"selectHour($event.target.value)\" />\n <span>:</span>\n <input type=\"number\" min=\"0\" max=\"59\" [value]=\"minute\" (change)=\"selectMinute($event.target.value)\" />\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-content>\n<ion-footer>\n <ion-toolbar color=\"ideaToolbar\" class=\"tappable\" (click)=\"save()\">\n <ion-title class=\"ion-text-center\">\n <ion-icon name=\"checkmark\" />\n </ion-title>\n </ion-toolbar>\n</ion-footer>\n", styles: ["ion-content{--background: var(--ion-color-white)}h1{margin:10px}.headerLabel{font-size:.7em;font-weight:700;text-transform:uppercase}ion-col,ion-button{font-size:.95em}ion-button{margin:3px 0}ion-footer ion-toolbar{--min-height: 40px}.tappable{cursor:pointer}.manualTimePicker{padding:20px}.manualTimePicker input[type=number],.manualTimePicker span{font-size:2.5em}.manualTimePicker input[type=number]{border:none;border-bottom:2px solid var(--ion-color-dark);text-align:center}.manualTimePicker span{padding-left:4px;padding-right:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: IDEATranslatePipe, name: "translate" }, { kind: "pipe", type: IDEALocalizedDatePipe, name: "dateLocale" }, { kind: "component", type: IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: IonRow, selector: "ion-row" }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }] }); }
177
- }
178
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEACalendarPickerComponent, decorators: [{
179
- type: Component,
180
- args: [{ selector: 'idea-calendar-picker', standalone: true, imports: [
181
- CommonModule,
182
- FormsModule,
183
- IDEATranslatePipe,
184
- IDEALocalizedDatePipe,
185
- IonFooter,
186
- IonInput,
187
- IonCol,
188
- IonRow,
189
- IonContent,
190
- IonGrid,
191
- IonIcon,
192
- IonButton,
193
- IonButtons,
194
- IonTitle,
195
- IonToolbar,
196
- IonHeader
197
- ], template: "<ion-header>\n <ion-toolbar color=\"ideaToolbar\">\n <ion-title>{{ title }}</ion-title>\n <ion-buttons slot=\"end\">\n @if (!hideClearButton) {\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.RESET' | translate\" (click)=\"save(true)\">\n <ion-icon slot=\"icon-only\" name=\"arrow-undo\" />\n </ion-button>\n }\n <ion-button [title]=\"'IDEA_UNCOMMON.CALENDAR.CLOSE_WITHOUT_SAVING' | translate\" (click)=\"close()\">\n <ion-icon slot=\"icon-only\" name=\"close\" />\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<ion-content>\n <ion-grid fixed class=\"ion-no-padding\">\n <ion-row>\n <h1 class=\"headerLabel\">{{ 'IDEA_UNCOMMON.CALENDAR.SET_DATE' | translate }}</h1>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\">\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"5\">\n <ion-row class=\"ion-align-items-center ion-justify-content-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\">\n <ion-input\n type=\"text\"\n [placeholder]=\"'IDEA_UNCOMMON.CALENDAR.YEAR' | translate\"\n [value]=\"refDate.getFullYear()\"\n (ionFocus)=\"$event.target.value = ''\"\n (ionChange)=\"setYear($event?.target?.value)\"\n >\n </ion-input>\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addYears(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"7\">\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-text-right ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(-1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-back\" />\n </ion-button>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding tappable\" [size]=\"6\" (click)=\"showMonths()\">\n {{ refDate | dateLocale: 'MMMM' }}\n </ion-col>\n <ion-col class=\"ion-text-left ion-no-padding\" [size]=\"3\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"addMonths(+1)\">\n <ion-icon slot=\"icon-only\" name=\"chevron-forward\" />\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-col>\n </ion-row>\n <ion-row style=\"margin-bottom: 8px\" class=\"headerLabel\">\n @for (ddd of weekDays; track ddd) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n {{ ddd }}\n </ion-col>\n }\n </ion-row>\n @for (row of calendarGrid; track row; let i = $index) {\n <ion-row class=\"ion-align-items-center\">\n @for (col of row; track col; let j = $index) {\n <ion-col class=\"ion-text-center ion-no-padding\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"\n isSameDay(calendarGrid[i][j], today) || isSameDay(calendarGrid[i][j], selectedDate)\n ? 'primary'\n : isSameMonth(calendarGrid[i][j], refDate)\n ? 'dark'\n : 'medium'\n \"\n [fill]=\"\n isSameDay(calendarGrid[i][j], selectedDate)\n ? 'solid'\n : isSameDay(calendarGrid[i][j], today)\n ? 'outline'\n : 'clear'\n \"\n [disabled]=\"!isDateSelectable(calendarGrid[i][j])\"\n (click)=\"selectDate(calendarGrid[i][j])\"\n >\n {{ calendarGrid[i][j] | date: 'd' }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n }\n @if (timePicker || manualTimePicker) {\n <ion-row>\n <h1 class=\"headerLabel\">\n {{ 'IDEA_UNCOMMON.CALENDAR.SET_TIME' | translate }}\n </h1>\n </ion-row>\n }\n @if (timePicker) {\n <ion-row class=\"ion-align-items-center\">\n <ion-col class=\"ion-no-padding\" [size]=\"7\">\n <ion-row>\n @for (hour of hours; track hour) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"2\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameHour(hour) ? 'primary' : 'dark'\"\n [fill]=\"isSameHour(hour) ? 'solid' : 'clear'\"\n (click)=\"selectHour(hour)\"\n >\n {{ hour }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"1\"> : </ion-col>\n <ion-col class=\"ion-no-padding\" [size]=\"4\">\n <ion-row>\n @for (minute of minutes; track minute) {\n <ion-col class=\"ion-text-center ion-no-padding\" [size]=\"4\">\n <ion-button\n size=\"small\"\n shape=\"round\"\n [color]=\"isSameMinute(minute) ? 'primary' : 'dark'\"\n [fill]=\"isSameMinute(minute) ? 'solid' : 'clear'\"\n (click)=\"selectMinute(minute)\"\n >\n {{ minute }}\n </ion-button>\n </ion-col>\n }\n </ion-row>\n </ion-col>\n </ion-row>\n }\n @if (manualTimePicker) {\n <ion-row class=\"ion-align-items-center manualTimePicker\">\n <ion-col class=\"ion-text-center\" [size]=\"12\">\n <input type=\"number\" min=\"0\" max=\"23\" [value]=\"hour\" (change)=\"selectHour($event.target.value)\" />\n <span>:</span>\n <input type=\"number\" min=\"0\" max=\"59\" [value]=\"minute\" (change)=\"selectMinute($event.target.value)\" />\n </ion-col>\n </ion-row>\n }\n </ion-grid>\n</ion-content>\n<ion-footer>\n <ion-toolbar color=\"ideaToolbar\" class=\"tappable\" (click)=\"save()\">\n <ion-title class=\"ion-text-center\">\n <ion-icon name=\"checkmark\" />\n </ion-title>\n </ion-toolbar>\n</ion-footer>\n", styles: ["ion-content{--background: var(--ion-color-white)}h1{margin:10px}.headerLabel{font-size:.7em;font-weight:700;text-transform:uppercase}ion-col,ion-button{font-size:.95em}ion-button{margin:3px 0}ion-footer ion-toolbar{--min-height: 40px}.tappable{cursor:pointer}.manualTimePicker{padding:20px}.manualTimePicker input[type=number],.manualTimePicker span{font-size:2.5em}.manualTimePicker input[type=number]{border:none;border-bottom:2px solid var(--ion-color-dark);text-align:center}.manualTimePicker span{padding-left:4px;padding-right:4px}\n"] }]
198
- }], propDecorators: { inputDate: [{
199
- type: Input
200
- }], timePicker: [{
201
- type: Input
202
- }], manualTimePicker: [{
203
- type: Input
204
- }], title: [{
205
- type: Input
206
- }], hideClearButton: [{
207
- type: Input
208
- }], min: [{
209
- type: Input
210
- }], max: [{
211
- type: Input
212
- }] } });
213
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvZGF0ZVRpbWUvY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvZGF0ZVRpbWUvY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsRUFDZixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixRQUFRLEVBQ1IsVUFBVSxFQUNWLFNBQVMsRUFDVCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1YsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7O0FBRXZHOztHQUVHO0FBQ0gsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBMEJ6QixNQUFNLE9BQU8sMkJBQTJCO0lBeEJ4QztRQXlCVSxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsZUFBVSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBRzVDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpC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USxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQWxlcnRDb250cm9sbGVyLFxuICBNb2RhbENvbnRyb2xsZXIsXG4gIElvbkhlYWRlcixcbiAgSW9uVG9vbGJhcixcbiAgSW9uVGl0bGUsXG4gIElvbkJ1dHRvbnMsXG4gIElvbkJ1dHRvbixcbiAgSW9uSWNvbixcbiAgSW9uR3JpZCxcbiAgSW9uQ29udGVudCxcbiAgSW9uUm93LFxuICBJb25Db2wsXG4gIElvbklucHV0LFxuICBJb25Gb290ZXJcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBlcG9jaERhdGVUaW1lLCBlcG9jaElTT1N0cmluZyB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5pbXBvcnQgeyBJREVBTG9jYWxpemVkRGF0ZVBpcGUsIElERUFUcmFuc2xhdGVQaXBlLCBJREVBVHJhbnNsYXRpb25zU2VydmljZSB9IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5cbi8qKlxuICogQSByYW5kb20gc3VuZGF5LCB1c2VkIGFzIHJlZmVyZW5jZSB0byBjYWxjdWxhdGUgdGhlIHdlZWsgZGF5cy5cbiAqL1xuY29uc3QgU1VOREFZID0gMjU5MjAwMDAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWNhbGVuZGFyLXBpY2tlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgSURFQVRyYW5zbGF0ZVBpcGUsXG4gICAgSURFQUxvY2FsaXplZERhdGVQaXBlLFxuICAgIElvbkZvb3RlcixcbiAgICBJb25JbnB1dCxcbiAgICBJb25Db2wsXG4gICAgSW9uUm93LFxuICAgIElvbkNvbnRlbnQsXG4gICAgSW9uR3JpZCxcbiAgICBJb25JY29uLFxuICAgIElvbkJ1dHRvbixcbiAgICBJb25CdXR0b25zLFxuICAgIElvblRpdGxlLFxuICAgIElvblRvb2xiYXIsXG4gICAgSW9uSGVhZGVyXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnY2FsZW5kYXJQaWNrZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBQ2FsZW5kYXJQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIF9tb2RhbCA9IGluamVjdChNb2RhbENvbnRyb2xsZXIpO1xuICBwcml2YXRlIF9hbGVydCA9IGluamVjdChBbGVydENvbnRyb2xsZXIpO1xuICBwcml2YXRlIF90cmFuc2xhdGUgPSBpbmplY3QoSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UpO1xuXG4gIEBJbnB1dCgpIGlucHV0RGF0ZTogZXBvY2hEYXRlVGltZSB8IGVwb2NoSVNPU3RyaW5nO1xuICBASW5wdXQoKSB0aW1lUGlja2VyID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hbnVhbFRpbWVQaWNrZXIgPSBmYWxzZTtcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgaGlkZUNsZWFyQnV0dG9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1pbjogZXBvY2hEYXRlVGltZSB8IGVwb2NoSVNPU3RyaW5nO1xuICBASW5wdXQoKSBtYXg6IGVwb2NoRGF0ZVRpbWUgfCBlcG9jaElTT1N0cmluZztcblxuICByZWZEYXRlOiBEYXRlO1xuICBzZWxlY3RlZERhdGU6IERhdGU7XG4gIHRvZGF5OiBEYXRlO1xuICBjYWxlbmRhckdyaWQ6IERhdGVbXVtdO1xuICBob3VyOiBudW1iZXI7XG4gIG1pbnV0ZTogbnVtYmVyO1xuICBob3Vyczogc3RyaW5nW107XG4gIG1pbnV0ZXM6IHN0cmluZ1tdO1xuICB3ZWVrRGF5czogc3RyaW5nW107XG4gIGRhdGVNaW46IERhdGU7XG4gIGRhdGVNYXg6IERhdGU7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy50b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5yZWZEYXRlID0gdGhpcy5pbnB1dERhdGUgPyBuZXcgRGF0ZSh0aGlzLmlucHV0RGF0ZSkgOiBuZXcgRGF0ZSh0aGlzLnRvZGF5KTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMucmVmRGF0ZSk7XG4gICAgdGhpcy5ob3VyID0gMTI7IC8vIHRvIGVuZHVyZSB0aW1lem9uZXNcbiAgICB0aGlzLm1pbnV0ZSA9IDA7XG4gICAgaWYgKHRoaXMudGltZVBpY2tlciB8fCB0aGlzLm1hbnVhbFRpbWVQaWNrZXIpIHtcbiAgICAgIHRoaXMuaG91ciA9IHRoaXMuc2VsZWN0ZWREYXRlLmdldEhvdXJzKCk7XG4gICAgICBpZiAodGhpcy5tYW51YWxUaW1lUGlja2VyKSB0aGlzLm1pbnV0ZSA9IHRoaXMuc2VsZWN0ZWREYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyByb3VuZCB0aGUgbWludXRlcyBhIG11bHRpcGxlIG9mIDVcbiAgICAgICAgdGhpcy5taW51dGUgPSBNYXRoLmNlaWwodGhpcy5zZWxlY3RlZERhdGUuZ2V0TWludXRlcygpIC8gNSkgKiA1O1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZS5zZXRNaW51dGVzKHRoaXMubWludXRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5idWlsZENhbGVuZGFyR3JpZCh0aGlzLnJlZkRhdGUpO1xuICAgIHRoaXMuaG91cnMgPSBBcnJheS5mcm9tKEFycmF5KDI0KS5rZXlzKCkpLm1hcChpID0+ICcwJy5jb25jYXQoaS50b1N0cmluZygpKS5zbGljZSgtMikpO1xuICAgIHRoaXMubWludXRlcyA9IEFycmF5LmZyb20oQXJyYXkoMTIpLmtleXMoKSkubWFwKGkgPT4gJzAnLmNvbmNhdCgoaSAqIDUpLnRvU3RyaW5nKCkpLnNsaWNlKC0yKSk7XG4gICAgLy8gYnVpbGQgdGhlIHdlZWtkYXlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGxvY2FsZVxuICAgIHRoaXMud2Vla0RheXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGNvbnN0IHJlZkRhdGVGb3JXZWVrRGF5cyA9IG5ldyBEYXRlKFNVTkRBWSk7XG4gICAgcmVmRGF0ZUZvcldlZWtEYXlzLnNldERhdGUocmVmRGF0ZUZvcldlZWtEYXlzLmdldERhdGUoKSAtIHRoaXMuZ2V0TG9jYWxpc2VkRGF5KHJlZkRhdGVGb3JXZWVrRGF5cykpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICB0aGlzLndlZWtEYXlzLnB1c2gocmVmRGF0ZUZvcldlZWtEYXlzLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLl90cmFuc2xhdGUuZ2V0Q3VycmVudExhbmcoKSwgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pKTtcbiAgICAgIHJlZkRhdGVGb3JXZWVrRGF5cy5zZXREYXRlKHJlZkRhdGVGb3JXZWVrRGF5cy5nZXREYXRlKCkgKyAxKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWluKSB0aGlzLmRhdGVNaW4gPSBuZXcgRGF0ZSh0aGlzLm1pbik7XG4gICAgaWYgKHRoaXMubWF4KSB0aGlzLmRhdGVNYXggPSBuZXcgRGF0ZSh0aGlzLm1heCk7XG4gIH1cblxuICBnZXRMb2NhbGlzZWREYXkoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgbGV0IG4gPSBkYXRlLmdldERheSgpO1xuICAgIHN3aXRjaCAodGhpcy5fdHJhbnNsYXRlLmdldEN1cnJlbnRMYW5nKCkpIHtcbiAgICAgIGNhc2UgJ2l0JzpcbiAgICAgICAgbiA9IC0tbiA8IDAgPyA2IDogbjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG5cbiAgYnVpbGRDYWxlbmRhckdyaWQocmVmRGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGRheSBpbiB0aGUgbW9udGg6IHRoZSBpbXBvcnRhbnQgZGF0YSBoZXJlIGlzIHRoZSBkYXkgb2YgdGhlIHdlZWtcbiAgICBjb25zdCBmaXJzdERhdGVPZk1vbnRoID0gbmV3IERhdGUocmVmRGF0ZS5nZXRGdWxsWWVhcigpLCByZWZEYXRlLmdldE1vbnRoKCksIDEpO1xuICAgIC8vIHRoZSBmb2xsb3dpbmcgZmxhZyBpcyB1c2VkIHRvIGRpdmlkZSB0aGUgbG9naWMgc28gSSBjYW4gZmlsbCB0aGUgY2FsZW5kYXJcbiAgICAvLyBhbHNvIHdpdGggdGhlIGRhdGVzIGZyb20gdGhlIHByZXZpb3VzIG1vbnRoLCB1bnRpbCB0aGVyZSdzIHNwYWNlIGluIHRoZSBncmlkXG4gICAgbGV0IGhhdmVudEZvdW5kRmlyc3REYXkgPSB0cnVlO1xuICAgIC8vIGluZGV4IHVzZWQgdG8gYnVpbGQgdGhlIGRhdGVzIG9mIHRoZSBtb250aCwgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3Qgb25lXG4gICAgbGV0IGluZGV4ID0gMTtcbiAgICB0aGlzLmNhbGVuZGFyR3JpZCA9IG5ldyBBcnJheTxEYXRlW10+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJHcmlkW2ldID0gbmV3IEFycmF5PERhdGU+KCk7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDc7IGorKykge1xuICAgICAgICBpZiAoaGF2ZW50Rm91bmRGaXJzdERheSkge1xuICAgICAgICAgIGlmICh0aGlzLmdldExvY2FsaXNlZERheShmaXJzdERhdGVPZk1vbnRoKSA9PT0gaikge1xuICAgICAgICAgICAgLy8gbm90ZTogY29uc2lkZXJzIFN1bmRheVxuICAgICAgICAgICAgaGF2ZW50Rm91bmRGaXJzdERheSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhckdyaWRbaV1bal0gPSBuZXcgRGF0ZShmaXJzdERhdGVPZk1vbnRoKTtcbiAgICAgICAgICAgIC8vIG5vdyB0aGUgSSd2ZSBmb3VuZCB0aGUgZmlyc3QgZGF0ZSBvZiB0aGUgbW9udGggSSBjYW4gZmlsbCB0aGUgY2FsZW5kYXJcbiAgICAgICAgICAgIC8vIHRoZSBkYXRlcyBmcm9tdCB0aGUgcHJldmlvdXMgbW9udGgsIHVudGlsIHRoZXJlJ3Mgc3BhY2UgaW4gdGhlIGdyaWRcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSB0aGlzLmdldExvY2FsaXNlZERheShmaXJzdERhdGVPZk1vbnRoKTsgeSA+PSAwOyB5LS0pIHtcbiAgICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGZpcnN0RGF0ZU9mTW9udGgpO1xuICAgICAgICAgICAgICBkLnNldERhdGUoZmlyc3REYXRlT2ZNb250aC5nZXREYXRlKCkgLSB5KTtcbiAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhckdyaWRbaV1bdGhpcy5nZXRMb2NhbGlzZWREYXkoZmlyc3REYXRlT2ZNb250aCkgLSB5XSA9IGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGZpbGwgdGhlIGZvbGxvd2luZyBkYXRlcyB1bnRpbCB0aGVyZSdzIHNwYWNlIGluIHRoZSBncmlkXG4gICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGZpcnN0RGF0ZU9mTW9udGgpO1xuICAgICAgICAgIGQuc2V0RGF0ZShmaXJzdERhdGVPZk1vbnRoLmdldERhdGUoKSArIGluZGV4KyspO1xuICAgICAgICAgIHRoaXMuY2FsZW5kYXJHcmlkW2ldW2pdID0gZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFllYXJzKG9mZnNldDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZWZEYXRlLnNldEZ1bGxZZWFyKHRoaXMucmVmRGF0ZS5nZXRGdWxsWWVhcigpICsgb2Zmc2V0KTtcbiAgICB0aGlzLmJ1aWxkQ2FsZW5kYXJHcmlkKHRoaXMucmVmRGF0ZSk7XG4gIH1cbiAgc2V0WWVhcih5ZWFyOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXllYXIpIHJldHVybjtcblxuICAgIHRoaXMucmVmRGF0ZS5zZXRGdWxsWWVhcihOdW1iZXIoeWVhcikpO1xuICAgIHRoaXMuYnVpbGRDYWxlbmRhckdyaWQodGhpcy5yZWZEYXRlKTtcbiAgfVxuICBhZGRNb250aHMob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZkRhdGUuc2V0TW9udGgodGhpcy5yZWZEYXRlLmdldE1vbnRoKCkgKyBvZmZzZXQpO1xuICAgIHRoaXMuYnVpbGRDYWxlbmRhckdyaWQodGhpcy5yZWZEYXRlKTtcbiAgfVxuICBhc3luYyBzaG93TW9udGhzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJ1dHRvbnMgPSBbXTtcbiAgICBjb25zdCBpbnB1dHM6IGFueVtdID0gW107XG4gICAgY29uc3QgbW9udGggPSBuZXcgRGF0ZSgwKTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgIHR5cGU6ICdyYWRpbycsXG4gICAgICAgIGxhYmVsOiBtb250aC50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5fdHJhbnNsYXRlLmdldEN1cnJlbnRMYW5nKCksIHsgbW9udGg6ICdsb25nJyB9KSxcbiAgICAgICAgdmFsdWU6IGkudG9TdHJpbmcoKSxcbiAgICAgICAgY2hlY2tlZDogaSA9PT0gdGhpcy5yZWZEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgICB9KTtcbiAgICAgIG1vbnRoLnNldE1vbnRoKG1vbnRoLmdldE1vbnRoKCkgKyAxKTtcbiAgICB9XG4gICAgYnV0dG9ucy5wdXNoKHsgdGV4dDogdGhpcy5fdHJhbnNsYXRlLl8oJ0NPTU1PTi5DQU5DRUwnKSwgcm9sZTogJ2NhbmNlbCcgfSk7XG4gICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgIHRleHQ6IHRoaXMuX3RyYW5zbGF0ZS5fKCdDT01NT04uU0VMRUNUJyksXG4gICAgICBoYW5kbGVyOiAobTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVmRGF0ZS5zZXRNb250aChwYXJzZUludChtLCAxMCkgLSAxKTtcbiAgICAgICAgdGhpcy5idWlsZENhbGVuZGFyR3JpZCh0aGlzLnJlZkRhdGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLl9hbGVydC5jcmVhdGUoe1xuICAgICAgaGVhZGVyOiB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9VTkNPTU1PTi5DQUxFTkRBUi5NT05USCcpLFxuICAgICAgYnV0dG9ucyxcbiAgICAgIGlucHV0c1xuICAgIH0pO1xuICAgIGFsZXJ0LnByZXNlbnQoKTtcbiAgfVxuXG4gIGlzRGF0ZVNlbGVjdGFibGUoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmRhdGVNaW4gJiYgZGF0ZSA8IHRoaXMuZGF0ZU1pbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmRhdGVNYXggJiYgZGF0ZSA+IHRoaXMuZGF0ZU1heCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2VsZWN0RGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCksIHRoaXMuaG91ciwgdGhpcy5taW51dGUpO1xuICB9XG5cbiAgc2VsZWN0SG91cihob3VyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmhvdXIgPSBOdW1iZXIoaG91cik7XG4gICAgdGhpcy5zZWxlY3RlZERhdGUuc2V0SG91cnModGhpcy5ob3VyKTtcbiAgfVxuICBzZWxlY3RNaW51dGUobWludXRlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1pbnV0ZSA9IE51bWJlcihtaW51dGUpO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlLnNldE1pbnV0ZXModGhpcy5taW51dGUpO1xuICB9XG5cbiAgaXNTYW1lRGF5KGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYS5nZXRGdWxsWWVhcigpID09PSBiLmdldEZ1bGxZZWFyKCkgJiYgYS5nZXRNb250aCgpID09PSBiLmdldE1vbnRoKCkgJiYgYS5nZXREYXRlKCkgPT09IGIuZ2V0RGF0ZSgpO1xuICB9XG4gIGlzU2FtZU1vbnRoKGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYS5nZXRGdWxsWWVhcigpID09PSBiLmdldEZ1bGxZZWFyKCkgJiYgYS5nZXRNb250aCgpID09PSBiLmdldE1vbnRoKCk7XG4gIH1cblxuICBpc1NhbWVIb3VyKGhvdXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRIb3VycygpID09PSBOdW1iZXIoaG91cik7XG4gIH1cbiAgaXNTYW1lTWludXRlKG1pbnV0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRlLmdldE1pbnV0ZXMoKSA9PT0gTnVtYmVyKG1pbnV0ZSk7XG4gIH1cblxuICBzYXZlKHJlc2V0PzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsLmRpc21pc3MocmVzZXQgPyAnJyA6IHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgfVxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RhbC5kaXNtaXNzKCk7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJpZGVhVG9vbGJhclwiPlxuICAgIDxpb24tdGl0bGU+e3sgdGl0bGUgfX08L2lvbi10aXRsZT5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgQGlmICghaGlkZUNsZWFyQnV0dG9uKSB7XG4gICAgICAgIDxpb24tYnV0dG9uIFt0aXRsZV09XCInSURFQV9VTkNPTU1PTi5DQUxFTkRBUi5SRVNFVCcgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwic2F2ZSh0cnVlKVwiPlxuICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImFycm93LXVuZG9cIiAvPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICB9XG4gICAgICA8aW9uLWJ1dHRvbiBbdGl0bGVdPVwiJ0lERUFfVU5DT01NT04uQ0FMRU5EQVIuQ0xPU0VfV0lUSE9VVF9TQVZJTkcnIHwgdHJhbnNsYXRlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2xvc2VcIiAvPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1oZWFkZXI+XG48aW9uLWNvbnRlbnQ+XG4gIDxpb24tZ3JpZCBmaXhlZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgPGlvbi1yb3c+XG4gICAgICA8aDEgY2xhc3M9XCJoZWFkZXJMYWJlbFwiPnt7ICdJREVBX1VOQ09NTU9OLkNBTEVOREFSLlNFVF9EQVRFJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgPC9pb24tcm93PlxuICAgIDxpb24tcm93IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogOHB4XCI+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjVcIj5cbiAgICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tYWxpZ24taXRlbXMtY2VudGVyIGlvbi1qdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1yaWdodCBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjNcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJhZGRZZWFycygtMSlcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2hldnJvbi1iYWNrXCIgLz5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmcgdGFwcGFibGVcIiBbc2l6ZV09XCI2XCI+XG4gICAgICAgICAgICA8aW9uLWlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidJREVBX1VOQ09NTU9OLkNBTEVOREFSLllFQVInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInJlZkRhdGUuZ2V0RnVsbFllYXIoKVwiXG4gICAgICAgICAgICAgIChpb25Gb2N1cyk9XCIkZXZlbnQudGFyZ2V0LnZhbHVlID0gJydcIlxuICAgICAgICAgICAgICAoaW9uQ2hhbmdlKT1cInNldFllYXIoJGV2ZW50Py50YXJnZXQ/LnZhbHVlKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2lvbi1pbnB1dD5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1sZWZ0IGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiM1wiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImFkZFllYXJzKCsxKVwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJjaGV2cm9uLWZvcndhcmRcIiAvPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCI3XCI+XG4gICAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtcmlnaHQgaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCIzXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiYWRkTW9udGhzKC0xKVwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJjaGV2cm9uLWJhY2tcIiAvPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZyB0YXBwYWJsZVwiIFtzaXplXT1cIjZcIiAoY2xpY2spPVwic2hvd01vbnRocygpXCI+XG4gICAgICAgICAgICB7eyByZWZEYXRlIHwgZGF0ZUxvY2FsZTogJ01NTU0nIH19XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtbGVmdCBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjNcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJhZGRNb250aHMoKzEpXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImNoZXZyb24tZm9yd2FyZFwiIC8+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICAgIDxpb24tcm93IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogOHB4XCIgY2xhc3M9XCJoZWFkZXJMYWJlbFwiPlxuICAgICAgQGZvciAoZGRkIG9mIHdlZWtEYXlzOyB0cmFjayBkZGQpIHtcbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICB7eyBkZGQgfX1cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgfVxuICAgIDwvaW9uLXJvdz5cbiAgICBAZm9yIChyb3cgb2YgY2FsZW5kYXJHcmlkOyB0cmFjayByb3c7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgQGZvciAoY29sIG9mIHJvdzsgdHJhY2sgY29sOyBsZXQgaiA9ICRpbmRleCkge1xuICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIlxuICAgICAgICAgICAgICAgIGlzU2FtZURheShjYWxlbmRhckdyaWRbaV1bal0sIHRvZGF5KSB8fCBpc1NhbWVEYXkoY2FsZW5kYXJHcmlkW2ldW2pdLCBzZWxlY3RlZERhdGUpXG4gICAgICAgICAgICAgICAgICA/ICdwcmltYXJ5J1xuICAgICAgICAgICAgICAgICAgOiBpc1NhbWVNb250aChjYWxlbmRhckdyaWRbaV1bal0sIHJlZkRhdGUpXG4gICAgICAgICAgICAgICAgICAgID8gJ2RhcmsnXG4gICAgICAgICAgICAgICAgICAgIDogJ21lZGl1bSdcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2ZpbGxdPVwiXG4gICAgICAgICAgICAgICAgaXNTYW1lRGF5KGNhbGVuZGFyR3JpZFtpXVtqXSwgc2VsZWN0ZWREYXRlKVxuICAgICAgICAgICAgICAgICAgPyAnc29saWQnXG4gICAgICAgICAgICAgICAgICA6IGlzU2FtZURheShjYWxlbmRhckdyaWRbaV1bal0sIHRvZGF5KVxuICAgICAgICAgICAgICAgICAgICA/ICdvdXRsaW5lJ1xuICAgICAgICAgICAgICAgICAgICA6ICdjbGVhcidcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0RhdGVTZWxlY3RhYmxlKGNhbGVuZGFyR3JpZFtpXVtqXSlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShjYWxlbmRhckdyaWRbaV1bal0pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgY2FsZW5kYXJHcmlkW2ldW2pdIHwgZGF0ZTogJ2QnIH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICB9XG4gICAgICA8L2lvbi1yb3c+XG4gICAgfVxuICAgIEBpZiAodGltZVBpY2tlciB8fCBtYW51YWxUaW1lUGlja2VyKSB7XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGgxIGNsYXNzPVwiaGVhZGVyTGFiZWxcIj5cbiAgICAgICAgICB7eyAnSURFQV9VTkNPTU1PTi5DQUxFTkRBUi5TRVRfVElNRScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9oMT5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICB9XG4gICAgQGlmICh0aW1lUGlja2VyKSB7XG4gICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjdcIj5cbiAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgIEBmb3IgKGhvdXIgb2YgaG91cnM7IHRyYWNrIGhvdXIpIHtcbiAgICAgICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXIgaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCIyXCI+XG4gICAgICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJpc1NhbWVIb3VyKGhvdXIpID8gJ3ByaW1hcnknIDogJ2RhcmsnXCJcbiAgICAgICAgICAgICAgICAgIFtmaWxsXT1cImlzU2FtZUhvdXIoaG91cikgPyAnc29saWQnIDogJ2NsZWFyJ1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SG91cihob3VyKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgaG91ciB9fVxuICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlciBpb24tbm8tcGFkZGluZ1wiIFtzaXplXT1cIjFcIj4gOiA8L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiBbc2l6ZV09XCI0XCI+XG4gICAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgICBAZm9yIChtaW51dGUgb2YgbWludXRlczsgdHJhY2sgbWludXRlKSB7XG4gICAgICAgICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyIGlvbi1uby1wYWRkaW5nXCIgW3NpemVdPVwiNFwiPlxuICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICBbY29sb3JdPVwiaXNTYW1lTWludXRlKG1pbnV0ZSkgPyAncHJpbWFyeScgOiAnZGFyaydcIlxuICAgICAgICAgICAgICAgICAgW2ZpbGxdPVwiaXNTYW1lTWludXRlKG1pbnV0ZSkgPyAnc29saWQnIDogJ2NsZWFyJ1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TWludXRlKG1pbnV0ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IG1pbnV0ZSB9fVxuICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIH1cbiAgICBAaWYgKG1hbnVhbFRpbWVQaWNrZXIpIHtcbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLWFsaWduLWl0ZW1zLWNlbnRlciBtYW51YWxUaW1lUGlja2VyXCI+XG4gICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCIgW3NpemVdPVwiMTJcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBtYXg9XCIyM1wiIFt2YWx1ZV09XCJob3VyXCIgKGNoYW5nZSk9XCJzZWxlY3RIb3VyKCRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgICA8c3Bhbj46PC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjU5XCIgW3ZhbHVlXT1cIm1pbnV0ZVwiIChjaGFuZ2UpPVwic2VsZWN0TWludXRlKCRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIH1cbiAgPC9pb24tZ3JpZD5cbjwvaW9uLWNvbnRlbnQ+XG48aW9uLWZvb3Rlcj5cbiAgPGlvbi10b29sYmFyIGNvbG9yPVwiaWRlYVRvb2xiYXJcIiBjbGFzcz1cInRhcHBhYmxlXCIgKGNsaWNrKT1cInNhdmUoKVwiPlxuICAgIDxpb24tdGl0bGUgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hlY2ttYXJrXCIgLz5cbiAgICA8L2lvbi10aXRsZT5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWZvb3Rlcj5cbiJdfQ==
@@ -1,217 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, Input, Output, EventEmitter, inject } from '@angular/core';
3
- import { ModalController, IonItem, IonButton, IonIcon, IonLabel, IonText } from '@ionic/angular/standalone';
4
- import { IDEATranslationsService } from '@idea-ionic/common';
5
- import { IDEACalendarPickerComponent } from './calendarPicker.component';
6
- import * as i0 from "@angular/core";
7
- export class IDEADateTimeComponent {
8
- constructor() {
9
- this._modal = inject(ModalController);
10
- this._translate = inject(IDEATranslationsService);
11
- /**
12
- * Whether to show the time picker (datetime) or not (date).
13
- */
14
- this.timePicker = false;
15
- /**
16
- * Whether to show the MANUAL time picker (datetime) or not (date).
17
- */
18
- this.manualTimePicker = false;
19
- /**
20
- * Whether to use the `epochISOString` format instead of `epochDateTime`.
21
- */
22
- this.useISOFormat = false;
23
- /**
24
- * If true, the component is disabled.
25
- */
26
- this.disabled = false;
27
- /**
28
- * If true, the obligatory dot is shown.
29
- */
30
- this.obligatory = false;
31
- /**
32
- * If true, hidew the clear button in the header.
33
- */
34
- this.hideClearButton = false;
35
- this.dateChange = new EventEmitter();
36
- this.iconSelect = new EventEmitter();
37
- this.isOpening = false;
38
- }
39
- ngOnInit() {
40
- this.langChangeSubscription = this._translate.onLangChange.subscribe(() => {
41
- this.valueToDisplay = this.getValueToDisplay(this.date);
42
- });
43
- }
44
- ngOnDestroy() {
45
- if (this.langChangeSubscription)
46
- this.langChangeSubscription.unsubscribe();
47
- }
48
- ngOnChanges(changes) {
49
- if (changes.date || changes.timePicker)
50
- this.valueToDisplay = this.getValueToDisplay(this.date);
51
- }
52
- async openCalendarPicker() {
53
- if (this.disabled || this.isOpening)
54
- return;
55
- this.isOpening = true;
56
- const modal = await this._modal.create({
57
- component: IDEACalendarPickerComponent,
58
- componentProps: {
59
- inputDate: this.date,
60
- title: this.label,
61
- timePicker: this.timePicker,
62
- manualTimePicker: this.manualTimePicker,
63
- hideClearButton: this.hideClearButton,
64
- min: this.min,
65
- max: this.max
66
- }
67
- });
68
- modal.onDidDismiss().then(({ data }) => {
69
- if (data !== undefined && data !== null) {
70
- if (data === '')
71
- this.doSelect(null);
72
- else
73
- this.doSelect(data);
74
- }
75
- });
76
- modal.present();
77
- this.isOpening = false;
78
- }
79
- getValueToDisplay(date) {
80
- return !date
81
- ? ''
82
- : this._translate.formatDate(date, this.timePicker || this.manualTimePicker ? 'd MMM yyyy, HH:mm' : 'mediumDate');
83
- }
84
- doSelect(date) {
85
- this.dateChange.emit(date ? (this.useISOFormat ? date.toISOString() : date.valueOf()) : null);
86
- }
87
- doIconSelect(event) {
88
- if (event)
89
- event.stopPropagation();
90
- this.iconSelect.emit();
91
- }
92
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEADateTimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
93
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEADateTimeComponent, isStandalone: true, selector: "idea-date-time", inputs: { date: "date", timePicker: "timePicker", manualTimePicker: "manualTimePicker", useISOFormat: "useISOFormat", label: "label", icon: "icon", iconColor: "iconColor", lines: "lines", color: "color", placeholder: "placeholder", disabled: "disabled", obligatory: "obligatory", hideClearButton: "hideClearButton", min: "min", max: "max" }, outputs: { dateChange: "dateChange", iconSelect: "iconSelect" }, usesOnChanges: true, ngImport: i0, template: `
94
- <ion-item
95
- class="dateTimeItem"
96
- [color]="color"
97
- [lines]="lines"
98
- [title]="placeholder || label || ''"
99
- [button]="!disabled"
100
- [disabled]="isOpening"
101
- [class.withLabel]="label"
102
- (click)="openCalendarPicker()"
103
- >
104
- @if (icon) {
105
- <ion-button
106
- fill="clear"
107
- slot="start"
108
- [color]="iconColor"
109
- [class.marginTop]="label"
110
- (click)="doIconSelect($event)"
111
- >
112
- <ion-icon [icon]="icon" slot="icon-only" />
113
- </ion-button>
114
- }
115
- @if (label) {
116
- <ion-label position="stacked" [class.selectable]="!disabled">
117
- {{ label }}
118
- @if (obligatory && !disabled) {
119
- <ion-text class="obligatoryDot" />
120
- }
121
- </ion-label>
122
- }
123
- <ion-label class="value" [class.selectable]="!disabled">
124
- @if (!valueToDisplay && !disabled) {
125
- <ion-text class="placeholder" [class.selectable]="!disabled">
126
- {{ placeholder }}
127
- </ion-text>
128
- }
129
- {{ valueToDisplay }}
130
- </ion-label>
131
- @if (!disabled) {
132
- <ion-icon slot="end" icon="caret-down" class="selectIcon" [class.selectable]="!disabled" />
133
- }
134
- </ion-item>
135
- `, isInline: true, styles: [".dateTimeItem{min-height:48px;height:auto}.dateTimeItem .description{margin:10px 0;height:20px;line-height:20px;width:100%}.dateTimeItem .placeholder{color:var(--ion-color-medium)}.dateTimeItem .value{white-space:nowrap}.dateTimeItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.dateTimeItem.withLabel{min-height:58px;height:auto}.dateTimeItem.withLabel .selectIcon{padding-top:25px}.dateTimeItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }] }); }
136
- }
137
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEADateTimeComponent, decorators: [{
138
- type: Component,
139
- args: [{ selector: 'idea-date-time', standalone: true, imports: [CommonModule, IonText, IonLabel, IonIcon, IonButton, IonItem], template: `
140
- <ion-item
141
- class="dateTimeItem"
142
- [color]="color"
143
- [lines]="lines"
144
- [title]="placeholder || label || ''"
145
- [button]="!disabled"
146
- [disabled]="isOpening"
147
- [class.withLabel]="label"
148
- (click)="openCalendarPicker()"
149
- >
150
- @if (icon) {
151
- <ion-button
152
- fill="clear"
153
- slot="start"
154
- [color]="iconColor"
155
- [class.marginTop]="label"
156
- (click)="doIconSelect($event)"
157
- >
158
- <ion-icon [icon]="icon" slot="icon-only" />
159
- </ion-button>
160
- }
161
- @if (label) {
162
- <ion-label position="stacked" [class.selectable]="!disabled">
163
- {{ label }}
164
- @if (obligatory && !disabled) {
165
- <ion-text class="obligatoryDot" />
166
- }
167
- </ion-label>
168
- }
169
- <ion-label class="value" [class.selectable]="!disabled">
170
- @if (!valueToDisplay && !disabled) {
171
- <ion-text class="placeholder" [class.selectable]="!disabled">
172
- {{ placeholder }}
173
- </ion-text>
174
- }
175
- {{ valueToDisplay }}
176
- </ion-label>
177
- @if (!disabled) {
178
- <ion-icon slot="end" icon="caret-down" class="selectIcon" [class.selectable]="!disabled" />
179
- }
180
- </ion-item>
181
- `, styles: [".dateTimeItem{min-height:48px;height:auto}.dateTimeItem .description{margin:10px 0;height:20px;line-height:20px;width:100%}.dateTimeItem .placeholder{color:var(--ion-color-medium)}.dateTimeItem .value{white-space:nowrap}.dateTimeItem .selectIcon{margin:0;padding-left:4px;font-size:.8em;color:var(--ion-color-medium)}.dateTimeItem.withLabel{min-height:58px;height:auto}.dateTimeItem.withLabel .selectIcon{padding-top:25px}.dateTimeItem.withLabel ion-button[slot=start]{margin-top:16px}.selectable{cursor:pointer}\n"] }]
182
- }], propDecorators: { date: [{
183
- type: Input
184
- }], timePicker: [{
185
- type: Input
186
- }], manualTimePicker: [{
187
- type: Input
188
- }], useISOFormat: [{
189
- type: Input
190
- }], label: [{
191
- type: Input
192
- }], icon: [{
193
- type: Input
194
- }], iconColor: [{
195
- type: Input
196
- }], lines: [{
197
- type: Input
198
- }], color: [{
199
- type: Input
200
- }], placeholder: [{
201
- type: Input
202
- }], disabled: [{
203
- type: Input
204
- }], obligatory: [{
205
- type: Input
206
- }], hideClearButton: [{
207
- type: Input
208
- }], min: [{
209
- type: Input
210
- }], max: [{
211
- type: Input
212
- }], dateChange: [{
213
- type: Output
214
- }], iconSelect: [{
215
- type: Output
216
- }] } });
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZVRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy91bmNvbW1vbi9zcmMvZGF0ZVRpbWUvZGF0ZVRpbWUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUtaLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUc1RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUF5RnpFLE1BQU0sT0FBTyxxQkFBcUI7SUF2RmxDO1FBd0ZVLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsZUFBVSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBTXJEOztXQUVHO1FBQ00sZUFBVSxHQUFHLEtBQUssQ0FBQztRQUM1Qjs7V0FFRztRQUNNLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUNsQzs7V0FFRztRQUNNLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBeUI5Qjs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDMUI7O1dBRUc7UUFDTSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzVCOztXQUVHO1FBQ00sb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFVdkIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUErQyxDQUFDO1FBQzdFLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBS2hELGNBQVMsR0FB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OEdBMUhVLHFCQUFxQjtrR0FBckIscUJBQXFCLHNmQW5GdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDVCwya0JBM0NTLFlBQVksK0JBQUUsT0FBTyxnRkFBRSxRQUFRLDZGQUFFLE9BQU8sMkpBQUUsU0FBUyxvUEFBRSxPQUFPOzsyRkFvRjNELHFCQUFxQjtrQkF2RmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsWUFDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDVDs4QkFnRFEsSUFBSTtzQkFBWixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBSUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsS0FBSztzQkFBYixLQUFLO2dCQUlHLElBQUk7c0JBQVosS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlHLEtBQUs7c0JBQWIsS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBSUcsZUFBZTtzQkFBdkIsS0FBSztnQkFJRyxHQUFHO3NCQUFYLEtBQUs7Z0JBSUcsR0FBRztzQkFBWCxLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIE9uQ2hhbmdlcyxcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBJb25JdGVtLCBJb25CdXR0b24sIElvbkljb24sIElvbkxhYmVsLCBJb25UZXh0IH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGVwb2NoRGF0ZVRpbWUsIGVwb2NoSVNPU3RyaW5nIH0gZnJvbSAnaWRlYS10b29sYm94JztcbmltcG9ydCB7IElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgSURFQUNhbGVuZGFyUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9jYWxlbmRhclBpY2tlci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLWRhdGUtdGltZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIElvblRleHQsIElvbkxhYmVsLCBJb25JY29uLCBJb25CdXR0b24sIElvbkl0ZW1dLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpb24taXRlbVxuICAgICAgY2xhc3M9XCJkYXRlVGltZUl0ZW1cIlxuICAgICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICAgIFtsaW5lc109XCJsaW5lc1wiXG4gICAgICBbdGl0bGVdPVwicGxhY2Vob2xkZXIgfHwgbGFiZWwgfHwgJydcIlxuICAgICAgW2J1dHRvbl09XCIhZGlzYWJsZWRcIlxuICAgICAgW2Rpc2FibGVkXT1cImlzT3BlbmluZ1wiXG4gICAgICBbY2xhc3Mud2l0aExhYmVsXT1cImxhYmVsXCJcbiAgICAgIChjbGljayk9XCJvcGVuQ2FsZW5kYXJQaWNrZXIoKVwiXG4gICAgPlxuICAgICAgQGlmIChpY29uKSB7XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICBzbG90PVwic3RhcnRcIlxuICAgICAgICAgIFtjb2xvcl09XCJpY29uQ29sb3JcIlxuICAgICAgICAgIFtjbGFzcy5tYXJnaW5Ub3BdPVwibGFiZWxcIlxuICAgICAgICAgIChjbGljayk9XCJkb0ljb25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW9uLWljb24gW2ljb25dPVwiaWNvblwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKGxhYmVsKSB7XG4gICAgICAgIDxpb24tbGFiZWwgcG9zaXRpb249XCJzdGFja2VkXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkXCI+XG4gICAgICAgICAge3sgbGFiZWwgfX1cbiAgICAgICAgICBAaWYgKG9ibGlnYXRvcnkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJvYmxpZ2F0b3J5RG90XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgfVxuICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cInZhbHVlXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkXCI+XG4gICAgICAgIEBpZiAoIXZhbHVlVG9EaXNwbGF5ICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cInBsYWNlaG9sZGVyXCIgW2NsYXNzLnNlbGVjdGFibGVdPVwiIWRpc2FibGVkXCI+XG4gICAgICAgICAgICB7eyBwbGFjZWhvbGRlciB9fVxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIH1cbiAgICAgICAge3sgdmFsdWVUb0Rpc3BsYXkgfX1cbiAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgQGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBpY29uPVwiY2FyZXQtZG93blwiIGNsYXNzPVwic2VsZWN0SWNvblwiIFtjbGFzcy5zZWxlY3RhYmxlXT1cIiFkaXNhYmxlZFwiIC8+XG4gICAgICB9XG4gICAgPC9pb24taXRlbT5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmRhdGVUaW1lSXRlbSB7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgLmRlc2NyaXB0aW9uIHtcbiAgICAgICAgICBtYXJnaW46IDEwcHggMDtcbiAgICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cbiAgICAgICAgLnBsYWNlaG9sZGVyIHtcbiAgICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICAgIH1cbiAgICAgICAgLnZhbHVlIHtcbiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICB9XG4gICAgICAgIC5zZWxlY3RJY29uIHtcbiAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gICAgICAgICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC5kYXRlVGltZUl0ZW0ud2l0aExhYmVsIHtcbiAgICAgICAgbWluLWhlaWdodDogNThweDtcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAuc2VsZWN0SWNvbiB7XG4gICAgICAgICAgcGFkZGluZy10b3A6IDI1cHg7XG4gICAgICAgIH1cbiAgICAgICAgaW9uLWJ1dHRvbltzbG90PSdzdGFydCddIHtcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxNnB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAuc2VsZWN0YWJsZSB7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICBgXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgSURFQURhdGVUaW1lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgX21vZGFsID0gaW5qZWN0KE1vZGFsQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX3RyYW5zbGF0ZSA9IGluamVjdChJREVBVHJhbnNsYXRpb25zU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRlIHRvIHNob3cvcGljay5cbiAgICovXG4gIEBJbnB1dCgpIGRhdGU6IGVwb2NoRGF0ZVRpbWUgfCBlcG9jaElTT1N0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgdGltZSBwaWNrZXIgKGRhdGV0aW1lKSBvciBub3QgKGRhdGUpLlxuICAgKi9cbiAgQElucHV0KCkgdGltZVBpY2tlciA9IGZhbHNlO1xuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBNQU5VQUwgdGltZSBwaWNrZXIgKGRhdGV0aW1lKSBvciBub3QgKGRhdGUpLlxuICAgKi9cbiAgQElucHV0KCkgbWFudWFsVGltZVBpY2tlciA9IGZhbHNlO1xuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgdGhlIGBlcG9jaElTT1N0cmluZ2AgZm9ybWF0IGluc3RlYWQgb2YgYGVwb2NoRGF0ZVRpbWVgLlxuICAgKi9cbiAgQElucHV0KCkgdXNlSVNPRm9ybWF0ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgbGFiZWwgZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaWNvbiBmb3IgdGhlIGZpZWxkLlxuICAgKi9cbiAgQElucHV0KCkgaWNvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbG9yIG9mIHRoZSBpY29uLlxuICAgKi9cbiAgQElucHV0KCkgaWNvbkNvbG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMaW5lcyBwcmVmZXJlbmNlcyBmb3IgdGhlIGl0ZW0uXG4gICAqL1xuICBASW5wdXQoKSBsaW5lczogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbG9yIGZvciB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgY29sb3I6IHN0cmluZztcbiAgLyoqXG4gICAqIEEgcGxhY2Vob2xkZXIgZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkLlxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZSBvYmxpZ2F0b3J5IGRvdCBpcyBzaG93bi5cbiAgICovXG4gIEBJbnB1dCgpIG9ibGlnYXRvcnkgPSBmYWxzZTtcbiAgLyoqXG4gICAqIElmIHRydWUsIGhpZGV3IHRoZSBjbGVhciBidXR0b24gaW4gdGhlIGhlYWRlci5cbiAgICovXG4gIEBJbnB1dCgpIGhpZGVDbGVhckJ1dHRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogSWYgc2V0LCBpcyB0aGUgbWluaW11bSBkYXRlIHNlbGVjdGFibGUuXG4gICAqL1xuICBASW5wdXQoKSBtaW46IGVwb2NoRGF0ZVRpbWUgfCBlcG9jaElTT1N0cmluZztcbiAgLyoqXG4gICAqIElmIHNldCwgaXMgdGhlIG1heGltdW0gZGF0ZSBzZWxlY3RhYmxlLlxuICAgKi9cbiAgQElucHV0KCkgbWF4OiBlcG9jaERhdGVUaW1lIHwgZXBvY2hJU09TdHJpbmc7XG5cbiAgQE91dHB1dCgpIGRhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGVwb2NoRGF0ZVRpbWUgfCBlcG9jaElTT1N0cmluZyB8IG51bGwgfCBhbnk+KCk7XG4gIEBPdXRwdXQoKSBpY29uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHZhbHVlVG9EaXNwbGF5OiBzdHJpbmc7XG4gIHByaXZhdGUgbGFuZ0NoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGlzT3BlbmluZyA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubGFuZ0NoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuX3RyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMudmFsdWVUb0Rpc3BsYXkgPSB0aGlzLmdldFZhbHVlVG9EaXNwbGF5KHRoaXMuZGF0ZSk7XG4gICAgfSk7XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGFuZ0NoYW5nZVN1YnNjcmlwdGlvbikgdGhpcy5sYW5nQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmRhdGUgfHwgY2hhbmdlcy50aW1lUGlja2VyKSB0aGlzLnZhbHVlVG9EaXNwbGF5ID0gdGhpcy5nZXRWYWx1ZVRvRGlzcGxheSh0aGlzLmRhdGUpO1xuICB9XG5cbiAgYXN5bmMgb3BlbkNhbGVuZGFyUGlja2VyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMuaXNPcGVuaW5nKSByZXR1cm47XG4gICAgdGhpcy5pc09wZW5pbmcgPSB0cnVlO1xuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5fbW9kYWwuY3JlYXRlKHtcbiAgICAgIGNvbXBvbmVudDogSURFQUNhbGVuZGFyUGlja2VyQ29tcG9uZW50LFxuICAgICAgY29tcG9uZW50UHJvcHM6IHtcbiAgICAgICAgaW5wdXREYXRlOiB0aGlzLmRhdGUsXG4gICAgICAgIHRpdGxlOiB0aGlzLmxhYmVsLFxuICAgICAgICB0aW1lUGlja2VyOiB0aGlzLnRpbWVQaWNrZXIsXG4gICAgICAgIG1hbnVhbFRpbWVQaWNrZXI6IHRoaXMubWFudWFsVGltZVBpY2tlcixcbiAgICAgICAgaGlkZUNsZWFyQnV0dG9uOiB0aGlzLmhpZGVDbGVhckJ1dHRvbixcbiAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgbWF4OiB0aGlzLm1heFxuICAgICAgfVxuICAgIH0pO1xuICAgIG1vZGFsLm9uRGlkRGlzbWlzcygpLnRoZW4oKHsgZGF0YSB9KTogdm9pZCA9PiB7XG4gICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGRhdGEgPT09ICcnKSB0aGlzLmRvU2VsZWN0KG51bGwpO1xuICAgICAgICBlbHNlIHRoaXMuZG9TZWxlY3QoZGF0YSBhcyBEYXRlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBtb2RhbC5wcmVzZW50KCk7XG4gICAgdGhpcy5pc09wZW5pbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVUb0Rpc3BsYXkoZGF0ZTogZXBvY2hEYXRlVGltZSB8IGVwb2NoSVNPU3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gIWRhdGVcbiAgICAgID8gJydcbiAgICAgIDogdGhpcy5fdHJhbnNsYXRlLmZvcm1hdERhdGUoZGF0ZSwgdGhpcy50aW1lUGlja2VyIHx8IHRoaXMubWFudWFsVGltZVBpY2tlciA/ICdkIE1NTSB5eXl5LCBISDptbScgOiAnbWVkaXVtRGF0ZScpO1xuICB9XG5cbiAgZG9TZWxlY3QoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KGRhdGUgPyAodGhpcy51c2VJU09Gb3JtYXQgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBkYXRlLnZhbHVlT2YoKSkgOiBudWxsKTtcbiAgfVxuICBkb0ljb25TZWxlY3QoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmljb25TZWxlY3QuZW1pdCgpO1xuICB9XG59XG4iXX0=