nxt-pick-datetime 18.0.0 → 19.0.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.
- package/fesm2022/nxt-pick-datetime-moment-adapter.mjs +23 -26
- package/fesm2022/nxt-pick-datetime-moment-adapter.mjs.map +1 -1
- package/fesm2022/nxt-pick-datetime-native-adapter.mjs +22 -24
- package/fesm2022/nxt-pick-datetime-native-adapter.mjs.map +1 -1
- package/fesm2022/nxt-pick-datetime.mjs +76 -74
- package/fesm2022/nxt-pick-datetime.mjs.map +1 -1
- package/lib/class/date-time.class.d.ts +1 -1
- package/moment-adapter/moment-adapter.module.d.ts +2 -0
- package/moment-adapter/public-api.d.ts +1 -1
- package/native-adapter/native-adapter.module.d.ts +2 -0
- package/native-adapter/public-api.d.ts +1 -1
- package/package.json +9 -14
- package/esm2022/lib/class/date-time-adapter.class.mjs +0 -97
- package/esm2022/lib/class/date-time-format.class.mjs +0 -4
- package/esm2022/lib/class/date-time.class.mjs +0 -95
- package/esm2022/lib/class/dialog-config.class.mjs +0 -47
- package/esm2022/lib/class/dialog-ref.class.mjs +0 -119
- package/esm2022/lib/date-time/calendar/calendar.component.mjs +0 -346
- package/esm2022/lib/date-time/calendar-body/calendar-body.component.mjs +0 -151
- package/esm2022/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +0 -429
- package/esm2022/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -358
- package/esm2022/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +0 -362
- package/esm2022/lib/date-time/date-time-inline/date-time-inline.component.mjs +0 -275
- package/esm2022/lib/date-time/date-time-picker/date-time-picker.component.mjs +0 -541
- package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs +0 -19
- package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +0 -389
- package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +0 -618
- package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +0 -61
- package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
- package/esm2022/lib/date-time/date-time.module.mjs +0 -96
- package/esm2022/lib/date-time/number-fixed-len.pipe.mjs +0 -22
- package/esm2022/lib/date-time/timer/timer.component.mjs +0 -299
- package/esm2022/lib/date-time/timer-box/timer-box.component.mjs +0 -95
- package/esm2022/lib/dialog/dialog-container/dialog-container.component.mjs +0 -248
- package/esm2022/lib/dialog/dialog.module.mjs +0 -42
- package/esm2022/lib/dialog/dialog.service.mjs +0 -251
- package/esm2022/lib/utils/object.mjs +0 -24
- package/esm2022/moment-adapter/date-time-adapter.class.mjs +0 -220
- package/esm2022/moment-adapter/date-time-format.class.mjs +0 -13
- package/esm2022/moment-adapter/moment-adapter.module.mjs +0 -37
- package/esm2022/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +0 -5
- package/esm2022/moment-adapter/public-api.mjs +0 -3
- package/esm2022/native-adapter/date-time-adapter.class.mjs +0 -366
- package/esm2022/native-adapter/date-time-format.class.mjs +0 -13
- package/esm2022/native-adapter/native-adapter.module.mjs +0 -37
- package/esm2022/native-adapter/nxt-pick-datetime-native-adapter.mjs +0 -5
- package/esm2022/native-adapter/public-api.mjs +0 -2
- package/esm2022/nxt-pick-datetime.mjs +0 -5
- package/esm2022/public-api.mjs +0 -14
|
@@ -1,362 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Inject, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
-
import { NXT_DATE_TIME_FORMATS } from '../../class/date-time-format.class';
|
|
3
|
-
import { CalendarCell, CalendarBodyComponent } from '../calendar-body/calendar-body.component';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "../../class/date-time-adapter.class";
|
|
6
|
-
import * as i2 from "../calendar-body/calendar-body.component";
|
|
7
|
-
/** @internal */
|
|
8
|
-
const MONTHS_PER_YEAR = 12;
|
|
9
|
-
/** @internal */
|
|
10
|
-
const MONTHS_PER_ROW = 3;
|
|
11
|
-
export class YearViewComponent {
|
|
12
|
-
get selectMode() {
|
|
13
|
-
return this._selectMode;
|
|
14
|
-
}
|
|
15
|
-
set selectMode(val) {
|
|
16
|
-
this._selectMode = val;
|
|
17
|
-
if (this.initiated) {
|
|
18
|
-
this.generateMonthList();
|
|
19
|
-
this.cdRef.markForCheck();
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
get selected() {
|
|
23
|
-
return this._selected;
|
|
24
|
-
}
|
|
25
|
-
set selected(value) {
|
|
26
|
-
value = this.dateTimeAdapter.deserialize(value);
|
|
27
|
-
this._selected = this.getValidDate(value);
|
|
28
|
-
this.setSelectedMonths();
|
|
29
|
-
}
|
|
30
|
-
get selecteds() {
|
|
31
|
-
return this._selecteds;
|
|
32
|
-
}
|
|
33
|
-
set selecteds(values) {
|
|
34
|
-
this._selecteds = [];
|
|
35
|
-
values.forEach(val => {
|
|
36
|
-
const value = this.dateTimeAdapter.deserialize(val);
|
|
37
|
-
this._selecteds.push(this.getValidDate(value));
|
|
38
|
-
});
|
|
39
|
-
this.setSelectedMonths();
|
|
40
|
-
}
|
|
41
|
-
get pickerMoment() {
|
|
42
|
-
return this._pickerMoment;
|
|
43
|
-
}
|
|
44
|
-
set pickerMoment(value) {
|
|
45
|
-
const oldMoment = this._pickerMoment;
|
|
46
|
-
value = this.dateTimeAdapter.deserialize(value);
|
|
47
|
-
this._pickerMoment =
|
|
48
|
-
this.getValidDate(value) || this.dateTimeAdapter.now();
|
|
49
|
-
if (!this.hasSameYear(oldMoment, this._pickerMoment) &&
|
|
50
|
-
this.initiated) {
|
|
51
|
-
this.generateMonthList();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
get dateTimeFilter() {
|
|
55
|
-
return this._dateTimeFilter;
|
|
56
|
-
}
|
|
57
|
-
set dateTimeFilter(filter) {
|
|
58
|
-
this._dateTimeFilter = filter;
|
|
59
|
-
if (this.initiated) {
|
|
60
|
-
this.generateMonthList();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
get min() {
|
|
64
|
-
return this._minDate;
|
|
65
|
-
}
|
|
66
|
-
set min(value) {
|
|
67
|
-
value = this.dateTimeAdapter.deserialize(value);
|
|
68
|
-
this._minDate = this.getValidDate(value);
|
|
69
|
-
if (this.initiated) {
|
|
70
|
-
this.generateMonthList();
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
get max() {
|
|
74
|
-
return this._maxDate;
|
|
75
|
-
}
|
|
76
|
-
set max(value) {
|
|
77
|
-
value = this.dateTimeAdapter.deserialize(value);
|
|
78
|
-
this._maxDate = this.getValidDate(value);
|
|
79
|
-
if (this.initiated) {
|
|
80
|
-
this.generateMonthList();
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
get months() {
|
|
84
|
-
return this._months;
|
|
85
|
-
}
|
|
86
|
-
get activeCell() {
|
|
87
|
-
if (this._pickerMoment) {
|
|
88
|
-
return this.dateTimeAdapter.getMonth(this._pickerMoment);
|
|
89
|
-
}
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
get isInSingleMode() {
|
|
93
|
-
return this.selectMode === 'single';
|
|
94
|
-
}
|
|
95
|
-
get isInRangeMode() {
|
|
96
|
-
return (this.selectMode === 'range' ||
|
|
97
|
-
this.selectMode === 'rangeFrom' ||
|
|
98
|
-
this.selectMode === 'rangeTo');
|
|
99
|
-
}
|
|
100
|
-
/** @internal */
|
|
101
|
-
get calendarView() {
|
|
102
|
-
return true;
|
|
103
|
-
}
|
|
104
|
-
constructor(cdRef, dateTimeAdapter, dateTimeFormats) {
|
|
105
|
-
this.cdRef = cdRef;
|
|
106
|
-
this.dateTimeAdapter = dateTimeAdapter;
|
|
107
|
-
this.dateTimeFormats = dateTimeFormats;
|
|
108
|
-
/**
|
|
109
|
-
* The select mode of the picker;
|
|
110
|
-
*/
|
|
111
|
-
this._selectMode = 'single';
|
|
112
|
-
this._selecteds = new Array();
|
|
113
|
-
this.initiated = false;
|
|
114
|
-
/**
|
|
115
|
-
* Callback to invoke when a new month is selected
|
|
116
|
-
*/
|
|
117
|
-
this.change = new EventEmitter();
|
|
118
|
-
/**
|
|
119
|
-
* Emits the selected year
|
|
120
|
-
*
|
|
121
|
-
* This doesn't imply a change on the selected date.
|
|
122
|
-
*/
|
|
123
|
-
this.monthSelected = new EventEmitter();
|
|
124
|
-
/** Emits when any date is activated */
|
|
125
|
-
this.pickerMomentChange = new EventEmitter();
|
|
126
|
-
/** Emits when use keyboard enter to select a calendar cell */
|
|
127
|
-
this.keyboardEnter = new EventEmitter();
|
|
128
|
-
this.monthNames = this.dateTimeAdapter.getMonthNames('short');
|
|
129
|
-
}
|
|
130
|
-
ngOnInit() {
|
|
131
|
-
this.localeSub = this.dateTimeAdapter.localeChanges.subscribe(() => {
|
|
132
|
-
this.generateMonthList();
|
|
133
|
-
this.cdRef.markForCheck();
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
ngAfterContentInit() {
|
|
137
|
-
this.generateMonthList();
|
|
138
|
-
this.initiated = true;
|
|
139
|
-
}
|
|
140
|
-
ngOnDestroy() {
|
|
141
|
-
this.localeSub?.unsubscribe();
|
|
142
|
-
this.localeSub = undefined;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Handle a calendarCell selected
|
|
146
|
-
*/
|
|
147
|
-
selectCalendarCell(cell) {
|
|
148
|
-
this.selectMonth(cell.value);
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Handle a new month selected
|
|
152
|
-
*/
|
|
153
|
-
selectMonth(month) {
|
|
154
|
-
const firstDateOfMonth = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(this.pickerMoment), month, 1);
|
|
155
|
-
this.monthSelected.emit(firstDateOfMonth);
|
|
156
|
-
const daysInMonth = this.dateTimeAdapter.getNumDaysInMonth(firstDateOfMonth);
|
|
157
|
-
const result = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(this.pickerMoment), month, Math.min(daysInMonth, this.dateTimeAdapter.getDate(this.pickerMoment)), this.dateTimeAdapter.getHours(this.pickerMoment), this.dateTimeAdapter.getMinutes(this.pickerMoment), this.dateTimeAdapter.getSeconds(this.pickerMoment));
|
|
158
|
-
this.change.emit(result);
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Handle keydown event on calendar body
|
|
162
|
-
*/
|
|
163
|
-
handleCalendarKeydown(event) {
|
|
164
|
-
let moment;
|
|
165
|
-
switch (event.code.toLowerCase()) {
|
|
166
|
-
// minus 1 month
|
|
167
|
-
case 'arrowleft':
|
|
168
|
-
moment = this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, -1);
|
|
169
|
-
this.pickerMomentChange.emit(moment);
|
|
170
|
-
break;
|
|
171
|
-
// add 1 month
|
|
172
|
-
case 'arrowright':
|
|
173
|
-
moment = this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, 1);
|
|
174
|
-
this.pickerMomentChange.emit(moment);
|
|
175
|
-
break;
|
|
176
|
-
// minus 3 months
|
|
177
|
-
case 'arrowup':
|
|
178
|
-
moment = this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, -3);
|
|
179
|
-
this.pickerMomentChange.emit(moment);
|
|
180
|
-
break;
|
|
181
|
-
// add 3 months
|
|
182
|
-
case 'arrowdown':
|
|
183
|
-
moment = this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, 3);
|
|
184
|
-
this.pickerMomentChange.emit(moment);
|
|
185
|
-
break;
|
|
186
|
-
// move to first month of current year
|
|
187
|
-
case 'home':
|
|
188
|
-
moment = this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, -this.dateTimeAdapter.getMonth(this.pickerMoment));
|
|
189
|
-
this.pickerMomentChange.emit(moment);
|
|
190
|
-
break;
|
|
191
|
-
// move to last month of current year
|
|
192
|
-
case 'end':
|
|
193
|
-
moment = this.dateTimeAdapter.addCalendarMonths(this.pickerMoment, 11 - this.dateTimeAdapter.getMonth(this.pickerMoment));
|
|
194
|
-
this.pickerMomentChange.emit(moment);
|
|
195
|
-
break;
|
|
196
|
-
// minus 1 year (or 10 year)
|
|
197
|
-
case 'pageup':
|
|
198
|
-
moment = this.dateTimeAdapter.addCalendarYears(this.pickerMoment, event.altKey ? -10 : -1);
|
|
199
|
-
this.pickerMomentChange.emit(moment);
|
|
200
|
-
break;
|
|
201
|
-
// add 1 year (or 10 year)
|
|
202
|
-
case 'pagedown':
|
|
203
|
-
moment = this.dateTimeAdapter.addCalendarYears(this.pickerMoment, event.altKey ? 10 : 1);
|
|
204
|
-
this.pickerMomentChange.emit(moment);
|
|
205
|
-
break;
|
|
206
|
-
// Select current month
|
|
207
|
-
case 'enter':
|
|
208
|
-
this.selectMonth(this.dateTimeAdapter.getMonth(this.pickerMoment));
|
|
209
|
-
this.keyboardEnter.emit();
|
|
210
|
-
break;
|
|
211
|
-
default:
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
this.focusActiveCell();
|
|
215
|
-
event.preventDefault();
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Generate the calendar month list
|
|
219
|
-
*/
|
|
220
|
-
generateMonthList() {
|
|
221
|
-
if (!this.pickerMoment) {
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
this.setSelectedMonths();
|
|
225
|
-
this.todayMonth = this.getMonthInCurrentYear(this.dateTimeAdapter.now());
|
|
226
|
-
this._months = [];
|
|
227
|
-
for (let i = 0; i < MONTHS_PER_YEAR / MONTHS_PER_ROW; i++) {
|
|
228
|
-
const row = [];
|
|
229
|
-
for (let j = 0; j < MONTHS_PER_ROW; j++) {
|
|
230
|
-
const month = j + i * MONTHS_PER_ROW;
|
|
231
|
-
const monthCell = this.createMonthCell(month);
|
|
232
|
-
row.push(monthCell);
|
|
233
|
-
}
|
|
234
|
-
this._months.push(row);
|
|
235
|
-
}
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Creates an CalendarCell for the given month.
|
|
240
|
-
*/
|
|
241
|
-
createMonthCell(month) {
|
|
242
|
-
const startDateOfMonth = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(this.pickerMoment), month, 1);
|
|
243
|
-
const ariaLabel = this.dateTimeAdapter.format(startDateOfMonth, this.dateTimeFormats.monthYearA11yLabel);
|
|
244
|
-
const cellClass = 'nxt-dt-month-' + month;
|
|
245
|
-
return new CalendarCell(month, this.monthNames[month], ariaLabel, this.isMonthEnabled(month), false, cellClass);
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Check if the given month is enable
|
|
249
|
-
*/
|
|
250
|
-
isMonthEnabled(month) {
|
|
251
|
-
const firstDateOfMonth = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(this.pickerMoment), month, 1);
|
|
252
|
-
// If any date in the month is selectable,
|
|
253
|
-
// we count the month as enable
|
|
254
|
-
for (let date = firstDateOfMonth; this.dateTimeAdapter.getMonth(date) === month; date = this.dateTimeAdapter.addCalendarDays(date, 1)) {
|
|
255
|
-
if (!!date &&
|
|
256
|
-
(!this.dateTimeFilter || this.dateTimeFilter(date, 'month')) &&
|
|
257
|
-
(!this.min ||
|
|
258
|
-
this.dateTimeAdapter.compare(date, this.min) >= 0) &&
|
|
259
|
-
(!this.max ||
|
|
260
|
-
this.dateTimeAdapter.compare(date, this.max) <= 0)) {
|
|
261
|
-
return true;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
return false;
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Gets the month in this year that the given Date falls on.
|
|
268
|
-
* Returns undefined if the given Date is in another year.
|
|
269
|
-
*/
|
|
270
|
-
getMonthInCurrentYear(date) {
|
|
271
|
-
if (this.getValidDate(date) && this.getValidDate(this._pickerMoment)) {
|
|
272
|
-
const result = this.dateTimeAdapter.compareYear(date, this._pickerMoment);
|
|
273
|
-
// < 0 : the given date's year is before pickerMoment's year, we return -1 as selected month value.
|
|
274
|
-
// > 0 : the given date's year is after pickerMoment's year, we return 12 as selected month value.
|
|
275
|
-
// 0 : the give date's year is same as the pickerMoment's year, we return the actual month value.
|
|
276
|
-
if (result < 0) {
|
|
277
|
-
return -1;
|
|
278
|
-
}
|
|
279
|
-
else if (result > 0) {
|
|
280
|
-
return 12;
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
return this.dateTimeAdapter.getMonth(date);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Set the selectedMonths value
|
|
290
|
-
* In single mode, it has only one value which represent the month the selected date in
|
|
291
|
-
* In range mode, it would has two values, one for the month the fromValue in and the other for the month the toValue in
|
|
292
|
-
*/
|
|
293
|
-
setSelectedMonths() {
|
|
294
|
-
this.selectedMonths = [];
|
|
295
|
-
if (this.isInSingleMode && this.selected) {
|
|
296
|
-
this.selectedMonths[0] = this.getMonthInCurrentYear(this.selected);
|
|
297
|
-
}
|
|
298
|
-
if (this.isInRangeMode && this.selecteds) {
|
|
299
|
-
this.selectedMonths[0] = this.getMonthInCurrentYear(this.selecteds[0]);
|
|
300
|
-
this.selectedMonths[1] = this.getMonthInCurrentYear(this.selecteds[1]);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Check the given dates are in the same year
|
|
305
|
-
*/
|
|
306
|
-
hasSameYear(dateLeft, dateRight) {
|
|
307
|
-
return !!(dateLeft &&
|
|
308
|
-
dateRight &&
|
|
309
|
-
this.dateTimeAdapter.getYear(dateLeft) ===
|
|
310
|
-
this.dateTimeAdapter.getYear(dateRight));
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Get a valid date object
|
|
314
|
-
*/
|
|
315
|
-
getValidDate(obj) {
|
|
316
|
-
return this.dateTimeAdapter.isDateInstance(obj) &&
|
|
317
|
-
this.dateTimeAdapter.isValid(obj)
|
|
318
|
-
? obj
|
|
319
|
-
: undefined;
|
|
320
|
-
}
|
|
321
|
-
focusActiveCell() {
|
|
322
|
-
this.calendarBodyElm?.focusActiveCell();
|
|
323
|
-
}
|
|
324
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: YearViewComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DateTimeAdapter }, { token: NXT_DATE_TIME_FORMATS }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
325
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: YearViewComponent, selector: "nxt-date-time-year-view", inputs: { selectMode: "selectMode", selected: "selected", selecteds: "selecteds", pickerMoment: "pickerMoment", dateTimeFilter: "dateTimeFilter", min: "min", max: "max" }, outputs: { change: "change", monthSelected: "monthSelected", pickerMomentChange: "pickerMomentChange", keyboardEnter: "keyboardEnter" }, host: { properties: { "class.nxt-dt-calendar-view": "this.calendarView" } }, viewQueries: [{ propertyName: "calendarBodyElm", first: true, predicate: CalendarBodyComponent, descendants: true, static: true }], ngImport: i0, template: "<table class=\"nxt-dt-calendar-table nxt-dt-calendar-year-table\">\r\n <thead class=\"nxt-dt-calendar-header\">\r\n <tr>\r\n <th class=\"nxt-dt-calendar-table-divider\"\r\n aria-hidden=\"true\"\r\n colspan=\"3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody nxtDateTimeCalendarBody\r\n role=\"grid\"\r\n [rows]=\"months\"\r\n [numCols]=\"3\"\r\n [cellRatio]=\"3 / 7\"\r\n [activeCell]=\"activeCell ?? 0\"\r\n [todayValue]=\"todayMonth??undefined\"\r\n [selectedValues]=\"selectedMonths\"\r\n [selectMode]=\"selectMode\"\r\n (keydown)=\"handleCalendarKeydown($event)\"\r\n (select)=\"selectCalendarCell($event)\">\r\n </tbody>\r\n</table>\r\n", styles: [""], dependencies: [{ kind: "component", type: i2.CalendarBodyComponent, selector: "[nxtDateTimeCalendarBody]", inputs: ["activeCell", "rows", "numCols", "cellRatio", "todayValue", "selectedValues", "selectMode"], outputs: ["select"], exportAs: ["nxtDateTimeCalendarBody"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
326
|
-
}
|
|
327
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: YearViewComponent, decorators: [{
|
|
328
|
-
type: Component,
|
|
329
|
-
args: [{ selector: 'nxt-date-time-year-view', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"nxt-dt-calendar-table nxt-dt-calendar-year-table\">\r\n <thead class=\"nxt-dt-calendar-header\">\r\n <tr>\r\n <th class=\"nxt-dt-calendar-table-divider\"\r\n aria-hidden=\"true\"\r\n colspan=\"3\"></th>\r\n </tr>\r\n </thead>\r\n <tbody nxtDateTimeCalendarBody\r\n role=\"grid\"\r\n [rows]=\"months\"\r\n [numCols]=\"3\"\r\n [cellRatio]=\"3 / 7\"\r\n [activeCell]=\"activeCell ?? 0\"\r\n [todayValue]=\"todayMonth??undefined\"\r\n [selectedValues]=\"selectedMonths\"\r\n [selectMode]=\"selectMode\"\r\n (keydown)=\"handleCalendarKeydown($event)\"\r\n (select)=\"selectCalendarCell($event)\">\r\n </tbody>\r\n</table>\r\n" }]
|
|
330
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.DateTimeAdapter }, { type: undefined, decorators: [{
|
|
331
|
-
type: Inject,
|
|
332
|
-
args: [NXT_DATE_TIME_FORMATS]
|
|
333
|
-
}] }], propDecorators: { selectMode: [{
|
|
334
|
-
type: Input
|
|
335
|
-
}], selected: [{
|
|
336
|
-
type: Input
|
|
337
|
-
}], selecteds: [{
|
|
338
|
-
type: Input
|
|
339
|
-
}], pickerMoment: [{
|
|
340
|
-
type: Input
|
|
341
|
-
}], dateTimeFilter: [{
|
|
342
|
-
type: Input
|
|
343
|
-
}], min: [{
|
|
344
|
-
type: Input
|
|
345
|
-
}], max: [{
|
|
346
|
-
type: Input
|
|
347
|
-
}], change: [{
|
|
348
|
-
type: Output
|
|
349
|
-
}], monthSelected: [{
|
|
350
|
-
type: Output
|
|
351
|
-
}], pickerMomentChange: [{
|
|
352
|
-
type: Output
|
|
353
|
-
}], keyboardEnter: [{
|
|
354
|
-
type: Output
|
|
355
|
-
}], calendarBodyElm: [{
|
|
356
|
-
type: ViewChild,
|
|
357
|
-
args: [CalendarBodyComponent, { static: true }]
|
|
358
|
-
}], calendarView: [{
|
|
359
|
-
type: HostBinding,
|
|
360
|
-
args: ['class.nxt-dt-calendar-view']
|
|
361
|
-
}] } });
|
|
362
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIteWVhci12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3BpY2stZGF0ZXRpbWUvc3JjL2xpYi9kYXRlLXRpbWUvY2FsZW5kYXIteWVhci12aWV3L2NhbGVuZGFyLXllYXItdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2NhbGVuZGFyLXllYXItdmlldy9jYWxlbmRhci15ZWFyLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQix1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUd2TCxPQUFPLEVBQW1CLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFFM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFBOzs7O0FBRTlGLGdCQUFnQjtBQUNoQixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUE7QUFFMUIsZ0JBQWdCO0FBQ2hCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQTtBQVN4QixNQUFNLE9BQU8saUJBQWlCO0lBSzFCLElBQ0ksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQTtJQUMzQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsR0FBZTtRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQTtRQUN0QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQzdCLENBQUM7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O2dCQUs5QyxZQUFZO3NCQURmLFdBQVc7dUJBQUMsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IERhdGVUaW1lQWRhcHRlciB9IGZyb20gJy4uLy4uL2NsYXNzL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJ1xyXG5pbXBvcnQgeyBEYXRlVGltZUZvcm1hdHMsIE5YVF9EQVRFX1RJTUVfRk9STUFUUyB9IGZyb20gJy4uLy4uL2NsYXNzL2RhdGUtdGltZS1mb3JtYXQuY2xhc3MnXHJcbmltcG9ydCB7IERhdGVGaWx0ZXIsIFNlbGVjdE1vZGUgfSBmcm9tICcuLi8uLi9jbGFzcy9kYXRlLXRpbWUuY2xhc3MnXHJcbmltcG9ydCB7IENhbGVuZGFyQ2VsbCwgQ2FsZW5kYXJCb2R5Q29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXItYm9keS9jYWxlbmRhci1ib2R5LmNvbXBvbmVudCdcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY29uc3QgTU9OVEhTX1BFUl9ZRUFSID0gMTJcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY29uc3QgTU9OVEhTX1BFUl9ST1cgPSAzXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbnh0LWRhdGUtdGltZS15ZWFyLXZpZXcnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLXllYXItdmlldy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci15ZWFyLXZpZXcuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFllYXJWaWV3Q29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc2VsZWN0IG1vZGUgb2YgdGhlIHBpY2tlcjtcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0TW9kZTogU2VsZWN0TW9kZSA9ICdzaW5nbGUnXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHNlbGVjdE1vZGUoKTogU2VsZWN0TW9kZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdE1vZGVcclxuICAgIH1cclxuXHJcbiAgICBzZXQgc2VsZWN0TW9kZSh2YWw6IFNlbGVjdE1vZGUpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RNb2RlID0gdmFsXHJcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNb250aExpc3QoKVxyXG4gICAgICAgICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGUgKi9cclxuICAgIHByaXZhdGUgX3NlbGVjdGVkPzogVFxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBzZWxlY3RlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRcclxuICAgIH1cclxuXHJcbiAgICBzZXQgc2VsZWN0ZWQodmFsdWU6IFQgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpXHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZE1vbnRocygpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRzID0gbmV3IEFycmF5PFQgfCB1bmRlZmluZWQ+KClcclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgc2VsZWN0ZWRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZHNcclxuICAgIH1cclxuXHJcbiAgICBzZXQgc2VsZWN0ZWRzKHZhbHVlczogQXJyYXk8VCB8IHVuZGVmaW5lZD4pIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZHMgPSBbXVxyXG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsKVxyXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZHMhLnB1c2godGhpcy5nZXRWYWxpZERhdGUodmFsdWUpKVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRNb250aHMoKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3BpY2tlck1vbWVudD86IFRcclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgcGlja2VyTW9tZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9waWNrZXJNb21lbnRcclxuICAgIH1cclxuXHJcbiAgICBzZXQgcGlja2VyTW9tZW50KHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3Qgb2xkTW9tZW50ID0gdGhpcy5fcGlja2VyTW9tZW50XHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSlcclxuICAgICAgICB0aGlzLl9waWNrZXJNb21lbnQgPVxyXG4gICAgICAgICAgICB0aGlzLmdldFZhbGlkRGF0ZSh2YWx1ZSkgfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIubm93KClcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhdGhpcy5oYXNTYW1lWWVhcihvbGRNb21lbnQsIHRoaXMuX3BpY2tlck1vbWVudCkgJiZcclxuICAgICAgICAgICAgdGhpcy5pbml0aWF0ZWRcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZU1vbnRoTGlzdCgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBmdW5jdGlvbiB1c2VkIHRvIGZpbHRlciB3aGljaCBkYXRlcyBhcmUgc2VsZWN0YWJsZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9kYXRlVGltZUZpbHRlcj86IERhdGVGaWx0ZXI8VD5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgZGF0ZVRpbWVGaWx0ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVUaW1lRmlsdGVyXHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGRhdGVUaW1lRmlsdGVyKGZpbHRlcjogRGF0ZUZpbHRlcjxUPiB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuX2RhdGVUaW1lRmlsdGVyID0gZmlsdGVyXHJcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNb250aExpc3QoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIG1pbmltdW0gc2VsZWN0YWJsZSBkYXRlICovXHJcbiAgICBwcml2YXRlIF9taW5EYXRlPzogVFxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBtaW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbkRhdGVcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbWluKHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSlcclxuICAgICAgICB0aGlzLl9taW5EYXRlID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpXHJcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNb250aExpc3QoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogVGhlIG1heGltdW0gc2VsZWN0YWJsZSBkYXRlICovXHJcbiAgICBwcml2YXRlIF9tYXhEYXRlPzogVFxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBtYXgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21heERhdGVcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbWF4KHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSlcclxuICAgICAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpXHJcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNb250aExpc3QoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vbnRoTmFtZXM6IHN0cmluZ1tdXHJcblxyXG4gICAgcHJpdmF0ZSBfbW9udGhzPzogQ2FsZW5kYXJDZWxsW11bXVxyXG4gICAgZ2V0IG1vbnRocygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGFjdGl2ZUNlbGwoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fcGlja2VyTW9tZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aCh0aGlzLl9waWNrZXJNb21lbnQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0luU2luZ2xlTW9kZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RNb2RlID09PSAnc2luZ2xlJ1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0luUmFuZ2VNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9jYWxlU3ViPzogU3Vic2NyaXB0aW9uXHJcblxyXG4gICAgcHJpdmF0ZSBpbml0aWF0ZWQgPSBmYWxzZVxyXG5cclxuICAgIHRvZGF5TW9udGg/OiBudW1iZXJcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IHRvIGhvbGQgYWxsIHNlbGVjdGVkRGF0ZXMnIG1vbnRoIHZhbHVlXHJcbiAgICAgKiB0aGUgdmFsdWUgaXMgdGhlIG1vbnRoIG51bWJlciBpbiBjdXJyZW50IHllYXJcclxuICAgICAqL1xyXG4gICAgc2VsZWN0ZWRNb250aHM/OiBBcnJheTxudW1iZXIgfCB1bmRlZmluZWQ+XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIG5ldyBtb250aCBpcyBzZWxlY3RlZFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxyXG4gICAgcmVhZG9ubHkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0cyB0aGUgc2VsZWN0ZWQgeWVhclxyXG4gICAgICpcclxuICAgICAqIFRoaXMgZG9lc24ndCBpbXBseSBhIGNoYW5nZSBvbiB0aGUgc2VsZWN0ZWQgZGF0ZS5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICByZWFkb25seSBtb250aFNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpXHJcblxyXG4gICAgLyoqIEVtaXRzIHdoZW4gYW55IGRhdGUgaXMgYWN0aXZhdGVkICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHJlYWRvbmx5IHBpY2tlck1vbWVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKVxyXG5cclxuICAgIC8qKiBFbWl0cyB3aGVuIHVzZSBrZXlib2FyZCBlbnRlciB0byBzZWxlY3QgYSBjYWxlbmRhciBjZWxsICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHJlYWRvbmx5IGtleWJvYXJkRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KClcclxuXHJcbiAgICAvKiogVGhlIGJvZHkgb2YgY2FsZW5kYXIgdGFibGUgKi9cclxuICAgIEBWaWV3Q2hpbGQoQ2FsZW5kYXJCb2R5Q29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgcHJpdmF0ZSBjYWxlbmRhckJvZHlFbG0/OiBDYWxlbmRhckJvZHlDb21wb25lbnRcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm54dC1kdC1jYWxlbmRhci12aWV3JylcclxuICAgIGdldCBjYWxlbmRhclZpZXcoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVUaW1lQWRhcHRlcjogRGF0ZVRpbWVBZGFwdGVyPFQ+LFxyXG4gICAgICAgIEBJbmplY3QoTlhUX0RBVEVfVElNRV9GT1JNQVRTKVxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVRpbWVGb3JtYXRzOiBEYXRlVGltZUZvcm1hdHNcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMubW9udGhOYW1lcyA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoTmFtZXMoJ3Nob3J0JylcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmxvY2FsZVN1YiA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmxvY2FsZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZU1vbnRoTGlzdCgpXHJcbiAgICAgICAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKClcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlTW9udGhMaXN0KClcclxuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWVcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvY2FsZVN1Yj8udW5zdWJzY3JpYmUoKVxyXG4gICAgICAgIHRoaXMubG9jYWxlU3ViID0gdW5kZWZpbmVkXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgYSBjYWxlbmRhckNlbGwgc2VsZWN0ZWRcclxuICAgICAqL1xyXG4gICAgc2VsZWN0Q2FsZW5kYXJDZWxsKGNlbGw6IENhbGVuZGFyQ2VsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0TW9udGgoY2VsbC52YWx1ZSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZSBhIG5ldyBtb250aCBzZWxlY3RlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNlbGVjdE1vbnRoKG1vbnRoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBmaXJzdERhdGVPZk1vbnRoID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZShcclxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLnBpY2tlck1vbWVudCksXHJcbiAgICAgICAgICAgIG1vbnRoLFxyXG4gICAgICAgICAgICAxXHJcbiAgICAgICAgKVxyXG5cclxuICAgICAgICB0aGlzLm1vbnRoU2VsZWN0ZWQuZW1pdChmaXJzdERhdGVPZk1vbnRoKVxyXG5cclxuICAgICAgICBjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKFxyXG4gICAgICAgICAgICBmaXJzdERhdGVPZk1vbnRoXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5waWNrZXJNb21lbnQpLFxyXG4gICAgICAgICAgICBtb250aCxcclxuICAgICAgICAgICAgTWF0aC5taW4oXHJcbiAgICAgICAgICAgICAgICBkYXlzSW5Nb250aCxcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldERhdGUodGhpcy5waWNrZXJNb21lbnQpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldEhvdXJzKHRoaXMucGlja2VyTW9tZW50KSxcclxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TWludXRlcyh0aGlzLnBpY2tlck1vbWVudCksXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFNlY29uZHModGhpcy5waWNrZXJNb21lbnQpXHJcbiAgICAgICAgKVxyXG5cclxuICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHJlc3VsdClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZSBrZXlkb3duIGV2ZW50IG9uIGNhbGVuZGFyIGJvZHlcclxuICAgICAqL1xyXG4gICAgaGFuZGxlQ2FsZW5kYXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgbGV0IG1vbWVudFxyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY29kZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIC8vIG1pbnVzIDEgbW9udGhcclxuICAgICAgICAgICAgY2FzZSAnYXJyb3dsZWZ0JzpcclxuICAgICAgICAgICAgICAgIG1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIC0xXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgICAgICAvLyBhZGQgMSBtb250aFxyXG4gICAgICAgICAgICBjYXNlICdhcnJvd3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIG1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxyXG4gICAgICAgICAgICAgICAgICAgIDFcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgICAgIC8vIG1pbnVzIDMgbW9udGhzXHJcbiAgICAgICAgICAgIGNhc2UgJ2Fycm93dXAnOlxyXG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHMoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgLTNcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgICAgIC8vIGFkZCAzIG1vbnRoc1xyXG4gICAgICAgICAgICBjYXNlICdhcnJvd2Rvd24nOlxyXG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHMoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgM1xyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICAgICAgLy8gbW92ZSB0byBmaXJzdCBtb250aCBvZiBjdXJyZW50IHllYXJcclxuICAgICAgICAgICAgY2FzZSAnaG9tZSc6XHJcbiAgICAgICAgICAgICAgICBtb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAtdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5waWNrZXJNb21lbnQpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgICAgICAvLyBtb3ZlIHRvIGxhc3QgbW9udGggb2YgY3VycmVudCB5ZWFyXHJcbiAgICAgICAgICAgIGNhc2UgJ2VuZCc6XHJcbiAgICAgICAgICAgICAgICBtb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAxMSAtIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKHRoaXMucGlja2VyTW9tZW50KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICAgICAgLy8gbWludXMgMSB5ZWFyIChvciAxMCB5ZWFyKVxyXG4gICAgICAgICAgICBjYXNlICdwYWdldXAnOlxyXG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudCxcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5hbHRLZXkgPyAtMTAgOiAtMVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICAgICAgLy8gYWRkIDEgeWVhciAob3IgMTAgeWVhcilcclxuICAgICAgICAgICAgY2FzZSAncGFnZWRvd24nOlxyXG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudCxcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5hbHRLZXkgPyAxMCA6IDFcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgICAgIC8vIFNlbGVjdCBjdXJyZW50IG1vbnRoXHJcbiAgICAgICAgICAgIGNhc2UgJ2VudGVyJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9udGgoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5waWNrZXJNb21lbnQpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleWJvYXJkRW50ZXIuZW1pdCgpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZvY3VzQWN0aXZlQ2VsbCgpXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGUgdGhlIGNhbGVuZGFyIG1vbnRoIGxpc3RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZU1vbnRoTGlzdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucGlja2VyTW9tZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZE1vbnRocygpXHJcbiAgICAgICAgdGhpcy50b2RheU1vbnRoID0gdGhpcy5nZXRNb250aEluQ3VycmVudFllYXIoXHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLm5vdygpXHJcbiAgICAgICAgKVxyXG5cclxuICAgICAgICB0aGlzLl9tb250aHMgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTU9OVEhTX1BFUl9ZRUFSIC8gTU9OVEhTX1BFUl9ST1c7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByb3cgPSBbXVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBNT05USFNfUEVSX1JPVzsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb250aCA9IGogKyBpICogTU9OVEhTX1BFUl9ST1dcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vbnRoQ2VsbCA9IHRoaXMuY3JlYXRlTW9udGhDZWxsKG1vbnRoKVxyXG4gICAgICAgICAgICAgICAgcm93LnB1c2gobW9udGhDZWxsKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9tb250aHMucHVzaChyb3cpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gQ2FsZW5kYXJDZWxsIGZvciB0aGUgZ2l2ZW4gbW9udGguXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlTW9udGhDZWxsKG1vbnRoOiBudW1iZXIpOiBDYWxlbmRhckNlbGwge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZU9mTW9udGggPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKFxyXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHRoaXMucGlja2VyTW9tZW50KSxcclxuICAgICAgICAgICAgbW9udGgsXHJcbiAgICAgICAgICAgIDFcclxuICAgICAgICApXHJcbiAgICAgICAgY29uc3QgYXJpYUxhYmVsID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KFxyXG4gICAgICAgICAgICBzdGFydERhdGVPZk1vbnRoLFxyXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0cy5tb250aFllYXJBMTF5TGFiZWxcclxuICAgICAgICApXHJcbiAgICAgICAgY29uc3QgY2VsbENsYXNzID0gJ254dC1kdC1tb250aC0nICsgbW9udGhcclxuICAgICAgICByZXR1cm4gbmV3IENhbGVuZGFyQ2VsbChcclxuICAgICAgICAgICAgbW9udGgsXHJcbiAgICAgICAgICAgIHRoaXMubW9udGhOYW1lc1ttb250aF0sXHJcbiAgICAgICAgICAgIGFyaWFMYWJlbCxcclxuICAgICAgICAgICAgdGhpcy5pc01vbnRoRW5hYmxlZChtb250aCksXHJcbiAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICBjZWxsQ2xhc3NcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbW9udGggaXMgZW5hYmxlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaXNNb250aEVuYWJsZWQobW9udGg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0RGF0ZU9mTW9udGggPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKFxyXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHRoaXMucGlja2VyTW9tZW50KSxcclxuICAgICAgICAgICAgbW9udGgsXHJcbiAgICAgICAgICAgIDFcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIC8vIElmIGFueSBkYXRlIGluIHRoZSBtb250aCBpcyBzZWxlY3RhYmxlLFxyXG4gICAgICAgIC8vIHdlIGNvdW50IHRoZSBtb250aCBhcyBlbmFibGVcclxuICAgICAgICBmb3IgKFxyXG4gICAgICAgICAgICBsZXQgZGF0ZSA9IGZpcnN0RGF0ZU9mTW9udGg7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKGRhdGUpID09PSBtb250aDtcclxuICAgICAgICAgICAgZGF0ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyhkYXRlLCAxKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAhIWRhdGUgJiZcclxuICAgICAgICAgICAgICAgICghdGhpcy5kYXRlVGltZUZpbHRlciB8fCB0aGlzLmRhdGVUaW1lRmlsdGVyKGRhdGUsICdtb250aCcpKSAmJlxyXG4gICAgICAgICAgICAgICAgKCF0aGlzLm1pbiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUoZGF0ZSwgdGhpcy5taW4pID49IDApICYmXHJcbiAgICAgICAgICAgICAgICAoIXRoaXMubWF4IHx8XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShkYXRlLCB0aGlzLm1heCkgPD0gMClcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG1vbnRoIGluIHRoaXMgeWVhciB0aGF0IHRoZSBnaXZlbiBEYXRlIGZhbGxzIG9uLlxyXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGdpdmVuIERhdGUgaXMgaW4gYW5vdGhlciB5ZWFyLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldE1vbnRoSW5DdXJyZW50WWVhcihkYXRlPzogVCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0VmFsaWREYXRlKGRhdGUpICYmIHRoaXMuZ2V0VmFsaWREYXRlKHRoaXMuX3BpY2tlck1vbWVudCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZVllYXIoXHJcbiAgICAgICAgICAgICAgICBkYXRlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcGlja2VyTW9tZW50XHJcbiAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgICAgIC8vIDwgMCA6IHRoZSBnaXZlbiBkYXRlJ3MgeWVhciBpcyBiZWZvcmUgcGlja2VyTW9tZW50J3MgeWVhciwgd2UgcmV0dXJuIC0xIGFzIHNlbGVjdGVkIG1vbnRoIHZhbHVlLlxyXG4gICAgICAgICAgICAvLyA+IDAgOiB0aGUgZ2l2ZW4gZGF0ZSdzIHllYXIgaXMgYWZ0ZXIgcGlja2VyTW9tZW50J3MgeWVhciwgd2UgcmV0dXJuIDEyIGFzIHNlbGVjdGVkIG1vbnRoIHZhbHVlLlxyXG4gICAgICAgICAgICAvLyAwIDogdGhlIGdpdmUgZGF0ZSdzIHllYXIgaXMgc2FtZSBhcyB0aGUgcGlja2VyTW9tZW50J3MgeWVhciwgd2UgcmV0dXJuIHRoZSBhY3R1YWwgbW9udGggdmFsdWUuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTFcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTJcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aChkYXRlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzZWxlY3RlZE1vbnRocyB2YWx1ZVxyXG4gICAgICogSW4gc2luZ2xlIG1vZGUsIGl0IGhhcyBvbmx5IG9uZSB2YWx1ZSB3aGljaCByZXByZXNlbnQgdGhlIG1vbnRoIHRoZSBzZWxlY3RlZCBkYXRlIGluXHJcbiAgICAgKiBJbiByYW5nZSBtb2RlLCBpdCB3b3VsZCBoYXMgdHdvIHZhbHVlcywgb25lIGZvciB0aGUgbW9udGggdGhlIGZyb21WYWx1ZSBpbiBhbmQgdGhlIG90aGVyIGZvciB0aGUgbW9udGggdGhlIHRvVmFsdWUgaW5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRTZWxlY3RlZE1vbnRocygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTW9udGhzID0gW11cclxuICAgICAgICBpZiAodGhpcy5pc0luU2luZ2xlTW9kZSAmJiB0aGlzLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNb250aHNbMF0gPSB0aGlzLmdldE1vbnRoSW5DdXJyZW50WWVhcih0aGlzLnNlbGVjdGVkKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNJblJhbmdlTW9kZSAmJiB0aGlzLnNlbGVjdGVkcykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTW9udGhzWzBdID0gdGhpcy5nZXRNb250aEluQ3VycmVudFllYXIoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkc1swXVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNb250aHNbMV0gPSB0aGlzLmdldE1vbnRoSW5DdXJyZW50WWVhcihcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRzWzFdXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayB0aGUgZ2l2ZW4gZGF0ZXMgYXJlIGluIHRoZSBzYW1lIHllYXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYXNTYW1lWWVhcihkYXRlTGVmdD86IFQsIGRhdGVSaWdodD86IFQpIHtcclxuICAgICAgICByZXR1cm4gISEoXHJcbiAgICAgICAgICAgIGRhdGVMZWZ0ICYmXHJcbiAgICAgICAgICAgIGRhdGVSaWdodCAmJlxyXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKGRhdGVMZWZ0KSA9PT1cclxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcihkYXRlUmlnaHQpXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgdmFsaWQgZGF0ZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRWYWxpZERhdGUob2JqOiBhbnkpOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNEYXRlSW5zdGFuY2Uob2JqKSAmJlxyXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKG9iailcclxuICAgICAgICAgICAgPyBvYmpcclxuICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZvY3VzQWN0aXZlQ2VsbCgpIHtcclxuICAgICAgICB0aGlzLmNhbGVuZGFyQm9keUVsbT8uZm9jdXNBY3RpdmVDZWxsKClcclxuICAgIH1cclxufVxyXG4iLCI8dGFibGUgY2xhc3M9XCJueHQtZHQtY2FsZW5kYXItdGFibGUgbnh0LWR0LWNhbGVuZGFyLXllYXItdGFibGVcIj5cclxuICAgIDx0aGVhZCBjbGFzcz1cIm54dC1kdC1jYWxlbmRhci1oZWFkZXJcIj5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cIm54dC1kdC1jYWxlbmRhci10YWJsZS1kaXZpZGVyXCJcclxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBjb2xzcGFuPVwiM1wiPjwvdGg+XHJcbiAgICAgICAgPC90cj5cclxuICAgIDwvdGhlYWQ+XHJcbiAgICA8dGJvZHkgbnh0RGF0ZVRpbWVDYWxlbmRhckJvZHlcclxuICAgICAgICByb2xlPVwiZ3JpZFwiXHJcbiAgICAgICAgW3Jvd3NdPVwibW9udGhzXCJcclxuICAgICAgICBbbnVtQ29sc109XCIzXCJcclxuICAgICAgICBbY2VsbFJhdGlvXT1cIjMgLyA3XCJcclxuICAgICAgICBbYWN0aXZlQ2VsbF09XCJhY3RpdmVDZWxsID8/IDBcIlxyXG4gICAgICAgIFt0b2RheVZhbHVlXT1cInRvZGF5TW9udGg/P3VuZGVmaW5lZFwiXHJcbiAgICAgICAgW3NlbGVjdGVkVmFsdWVzXT1cInNlbGVjdGVkTW9udGhzXCJcclxuICAgICAgICBbc2VsZWN0TW9kZV09XCJzZWxlY3RNb2RlXCJcclxuICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVDYWxlbmRhcktleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgKHNlbGVjdCk9XCJzZWxlY3RDYWxlbmRhckNlbGwoJGV2ZW50KVwiPlxyXG4gICAgPC90Ym9keT5cclxuPC90YWJsZT5cclxuIl19
|