nxt-pick-datetime 16.0.0-alpha.6 → 16.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.
Files changed (111) hide show
  1. package/{esm2020 → esm2022}/lib/class/date-time-adapter.class.mjs +96 -96
  2. package/{esm2020 → esm2022}/lib/class/date-time-format.class.mjs +3 -3
  3. package/esm2022/lib/class/date-time.class.mjs +96 -0
  4. package/{esm2020 → esm2022}/lib/class/dialog-config.class.mjs +46 -46
  5. package/{esm2020 → esm2022}/lib/class/dialog-ref.class.mjs +118 -118
  6. package/esm2022/lib/date-time/calendar/calendar.component.mjs +347 -0
  7. package/esm2022/lib/date-time/calendar-body/calendar-body.component.mjs +152 -0
  8. package/esm2022/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +430 -0
  9. package/esm2022/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +359 -0
  10. package/esm2022/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +363 -0
  11. package/esm2022/lib/date-time/date-time-inline/date-time-inline.component.mjs +276 -0
  12. package/esm2022/lib/date-time/date-time-picker/date-time-picker.component.mjs +542 -0
  13. package/{esm2020 → esm2022}/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs +18 -18
  14. package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +390 -0
  15. package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +619 -0
  16. package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +62 -0
  17. package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +71 -0
  18. package/esm2022/lib/date-time/date-time.module.mjs +97 -0
  19. package/esm2022/lib/date-time/number-fixed-len.pipe.mjs +23 -0
  20. package/esm2022/lib/date-time/timer/timer.component.mjs +300 -0
  21. package/esm2022/lib/date-time/timer-box/timer-box.component.mjs +96 -0
  22. package/esm2022/lib/dialog/dialog-container/dialog-container.component.mjs +249 -0
  23. package/esm2022/lib/dialog/dialog.module.mjs +43 -0
  24. package/esm2022/lib/dialog/dialog.service.mjs +252 -0
  25. package/esm2022/lib/utils/object.mjs +24 -0
  26. package/esm2022/moment-adapter/date-time-adapter.class.mjs +221 -0
  27. package/{esm2020 → esm2022}/moment-adapter/date-time-format.class.mjs +12 -12
  28. package/esm2022/moment-adapter/moment-adapter.module.mjs +38 -0
  29. package/{esm2020 → esm2022}/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +4 -4
  30. package/{esm2020 → esm2022}/moment-adapter/public-api.mjs +2 -2
  31. package/esm2022/native-adapter/date-time-adapter.class.mjs +367 -0
  32. package/{esm2020 → esm2022}/native-adapter/date-time-format.class.mjs +12 -12
  33. package/esm2022/native-adapter/native-adapter.module.mjs +38 -0
  34. package/{esm2020 → esm2022}/native-adapter/nxt-pick-datetime-native-adapter.mjs +4 -4
  35. package/{esm2020 → esm2022}/native-adapter/public-api.mjs +1 -1
  36. package/{esm2020 → esm2022}/nxt-pick-datetime.mjs +4 -4
  37. package/{esm2020 → esm2022}/public-api.mjs +13 -13
  38. package/{fesm2020 → fesm2022}/nxt-pick-datetime-moment-adapter.mjs +257 -257
  39. package/{fesm2020 → fesm2022}/nxt-pick-datetime-moment-adapter.mjs.map +1 -1
  40. package/{fesm2020 → fesm2022}/nxt-pick-datetime-native-adapter.mjs +402 -402
  41. package/{fesm2020 → fesm2022}/nxt-pick-datetime-native-adapter.mjs.map +1 -1
  42. package/{fesm2020 → fesm2022}/nxt-pick-datetime.mjs +4858 -4860
  43. package/{fesm2020 → fesm2022}/nxt-pick-datetime.mjs.map +1 -1
  44. package/index.d.ts +5 -5
  45. package/lib/class/date-time-adapter.class.d.ts +176 -176
  46. package/lib/class/date-time-format.class.d.ts +12 -12
  47. package/lib/class/date-time.class.d.ts +76 -76
  48. package/lib/class/dialog-config.class.d.ts +90 -90
  49. package/lib/class/dialog-ref.class.d.ts +50 -50
  50. package/lib/date-time/calendar/calendar.component.d.ts +147 -147
  51. package/lib/date-time/calendar-body/calendar-body.component.d.ts +79 -79
  52. package/lib/date-time/calendar-month-view/calendar-month-view.component.d.ts +139 -139
  53. package/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +115 -115
  54. package/lib/date-time/calendar-year-view/calendar-year-view.component.d.ts +123 -123
  55. package/lib/date-time/date-time-inline/date-time-inline.component.d.ts +106 -106
  56. package/lib/date-time/date-time-picker/date-time-picker.component.d.ts +172 -172
  57. package/lib/date-time/date-time-picker-container/date-time-picker-container.animations.d.ts +6 -6
  58. package/lib/date-time/date-time-picker-container/date-time-picker-container.component.d.ts +129 -129
  59. package/lib/date-time/date-time-picker-input.directive.d.ts +167 -167
  60. package/lib/date-time/date-time-picker-intl.service.d.ts +51 -51
  61. package/lib/date-time/date-time-picker-trigger.directive.d.ts +22 -22
  62. package/lib/date-time/date-time.module.d.ts +23 -23
  63. package/lib/date-time/number-fixed-len.pipe.d.ts +8 -8
  64. package/lib/date-time/timer/timer.component.d.ts +131 -131
  65. package/lib/date-time/timer-box/timer-box.component.d.ts +37 -37
  66. package/lib/dialog/dialog-container/dialog-container.component.d.ts +69 -69
  67. package/lib/dialog/dialog.module.d.ts +12 -12
  68. package/lib/dialog/dialog.service.d.ts +78 -78
  69. package/lib/utils/object.d.ts +9 -10
  70. package/moment-adapter/date-time-adapter.class.d.ts +64 -64
  71. package/moment-adapter/date-time-format.class.d.ts +5 -5
  72. package/moment-adapter/index.d.ts +5 -5
  73. package/moment-adapter/moment-adapter.module.d.ts +6 -6
  74. package/moment-adapter/public-api.d.ts +2 -2
  75. package/native-adapter/date-time-adapter.class.d.ts +72 -72
  76. package/native-adapter/date-time-format.class.d.ts +5 -5
  77. package/native-adapter/index.d.ts +5 -5
  78. package/native-adapter/native-adapter.module.d.ts +7 -7
  79. package/native-adapter/public-api.d.ts +1 -1
  80. package/package.json +18 -28
  81. package/public-api.d.ts +14 -14
  82. package/esm2020/lib/class/date-time.class.mjs +0 -95
  83. package/esm2020/lib/date-time/calendar/calendar.component.mjs +0 -346
  84. package/esm2020/lib/date-time/calendar-body/calendar-body.component.mjs +0 -151
  85. package/esm2020/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +0 -429
  86. package/esm2020/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -358
  87. package/esm2020/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +0 -362
  88. package/esm2020/lib/date-time/date-time-inline/date-time-inline.component.mjs +0 -275
  89. package/esm2020/lib/date-time/date-time-picker/date-time-picker.component.mjs +0 -541
  90. package/esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +0 -389
  91. package/esm2020/lib/date-time/date-time-picker-input.directive.mjs +0 -618
  92. package/esm2020/lib/date-time/date-time-picker-intl.service.mjs +0 -61
  93. package/esm2020/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
  94. package/esm2020/lib/date-time/date-time.module.mjs +0 -96
  95. package/esm2020/lib/date-time/number-fixed-len.pipe.mjs +0 -22
  96. package/esm2020/lib/date-time/timer/timer.component.mjs +0 -299
  97. package/esm2020/lib/date-time/timer-box/timer-box.component.mjs +0 -95
  98. package/esm2020/lib/dialog/dialog-container/dialog-container.component.mjs +0 -248
  99. package/esm2020/lib/dialog/dialog.module.mjs +0 -42
  100. package/esm2020/lib/dialog/dialog.service.mjs +0 -252
  101. package/esm2020/lib/utils/object.mjs +0 -25
  102. package/esm2020/moment-adapter/date-time-adapter.class.mjs +0 -220
  103. package/esm2020/moment-adapter/moment-adapter.module.mjs +0 -37
  104. package/esm2020/native-adapter/date-time-adapter.class.mjs +0 -366
  105. package/esm2020/native-adapter/native-adapter.module.mjs +0 -37
  106. package/fesm2015/nxt-pick-datetime-moment-adapter.mjs +0 -274
  107. package/fesm2015/nxt-pick-datetime-moment-adapter.mjs.map +0 -1
  108. package/fesm2015/nxt-pick-datetime-native-adapter.mjs +0 -420
  109. package/fesm2015/nxt-pick-datetime-native-adapter.mjs.map +0 -1
  110. package/fesm2015/nxt-pick-datetime.mjs +0 -5014
  111. package/fesm2015/nxt-pick-datetime.mjs.map +0 -1
@@ -0,0 +1,363 @@
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
+ 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: "16.0.0", 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: "16.0.0", 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\">\n <thead class=\"nxt-dt-calendar-header\">\n <tr>\n <th class=\"nxt-dt-calendar-table-divider\"\n aria-hidden=\"true\"\n colspan=\"3\"></th>\n </tr>\n </thead>\n <tbody nxtDateTimeCalendarBody\n role=\"grid\"\n [rows]=\"months\"\n [numCols]=\"3\"\n [cellRatio]=\"3 / 7\"\n [activeCell]=\"activeCell ?? 0\"\n [todayValue]=\"todayMonth??undefined\"\n [selectedValues]=\"selectedMonths\"\n [selectMode]=\"selectMode\"\n (keydown)=\"handleCalendarKeydown($event)\"\n (select)=\"selectCalendarCell($event)\">\n </tbody>\n</table>\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
+ export { YearViewComponent };
328
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: YearViewComponent, decorators: [{
329
+ type: Component,
330
+ args: [{ selector: 'nxt-date-time-year-view', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"nxt-dt-calendar-table nxt-dt-calendar-year-table\">\n <thead class=\"nxt-dt-calendar-header\">\n <tr>\n <th class=\"nxt-dt-calendar-table-divider\"\n aria-hidden=\"true\"\n colspan=\"3\"></th>\n </tr>\n </thead>\n <tbody nxtDateTimeCalendarBody\n role=\"grid\"\n [rows]=\"months\"\n [numCols]=\"3\"\n [cellRatio]=\"3 / 7\"\n [activeCell]=\"activeCell ?? 0\"\n [todayValue]=\"todayMonth??undefined\"\n [selectedValues]=\"selectedMonths\"\n [selectMode]=\"selectMode\"\n (keydown)=\"handleCalendarKeydown($event)\"\n (select)=\"selectCalendarCell($event)\">\n </tbody>\n</table>\n" }]
331
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DateTimeAdapter }, { type: undefined, decorators: [{
332
+ type: Inject,
333
+ args: [NXT_DATE_TIME_FORMATS]
334
+ }] }]; }, propDecorators: { selectMode: [{
335
+ type: Input
336
+ }], selected: [{
337
+ type: Input
338
+ }], selecteds: [{
339
+ type: Input
340
+ }], pickerMoment: [{
341
+ type: Input
342
+ }], dateTimeFilter: [{
343
+ type: Input
344
+ }], min: [{
345
+ type: Input
346
+ }], max: [{
347
+ type: Input
348
+ }], change: [{
349
+ type: Output
350
+ }], monthSelected: [{
351
+ type: Output
352
+ }], pickerMomentChange: [{
353
+ type: Output
354
+ }], keyboardEnter: [{
355
+ type: Output
356
+ }], calendarBodyElm: [{
357
+ type: ViewChild,
358
+ args: [CalendarBodyComponent, { static: true }]
359
+ }], calendarView: [{
360
+ type: HostBinding,
361
+ args: ['class.nxt-dt-calendar-view']
362
+ }] } });
363
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIteWVhci12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3BpY2stZGF0ZXRpbWUvc3JjL2xpYi9kYXRlLXRpbWUvY2FsZW5kYXIteWVhci12aWV3L2NhbGVuZGFyLXllYXItdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2NhbGVuZGFyLXllYXItdmlldy9jYWxlbmRhci15ZWFyLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQix1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUd2TCxPQUFPLEVBQW1CLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFFM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFBOzs7O0FBRTlGLGdCQUFnQjtBQUNoQixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUE7QUFFMUIsZ0JBQWdCO0FBQ2hCLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQTtBQUV4QixNQU9hLGlCQUFpQjtJQUsxQixJQUNJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUE7SUFDM0IsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLEdBQWU7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUE7UUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUE7U0FDNUI7SUFDTCxDQUFDO0lBSUQs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LEdBQVE7UUFDekIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7WUFDM0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxHQUFHO1lBQ0wsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNuQixDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxDQUFBO0lBQzNDLENBQUM7OEdBL2VRLGlCQUFpQixrRkEyTGQscUJBQXFCO2tHQTNMeEIsaUJBQWlCLGtmQStLZixxQkFBcUIsOERDbk1wQyw0dEJBcUJBOztTRERhLGlCQUFpQjsyRkFBakIsaUJBQWlCO2tCQVA3QixTQUFTOytCQUNJLHlCQUF5Qix1QkFHZCxLQUFLLG1CQUNULHVCQUF1QixDQUFDLE1BQU07OzBCQTZMMUMsTUFBTTsyQkFBQyxxQkFBcUI7NENBckw3QixVQUFVO3NCQURiLEtBQUs7Z0JBZ0JGLFFBQVE7c0JBRFgsS0FBSztnQkFhRixTQUFTO3NCQURaLEtBQUs7Z0JBaUJGLFlBQVk7c0JBRGYsS0FBSztnQkF3QkYsY0FBYztzQkFEakIsS0FBSztnQkFlRixHQUFHO3NCQUROLEtBQUs7Z0JBZ0JGLEdBQUc7c0JBRE4sS0FBSztnQkF3REcsTUFBTTtzQkFGZCxNQUFNO2dCQVVFLGFBQWE7c0JBRHJCLE1BQU07Z0JBS0Usa0JBQWtCO3NCQUQxQixNQUFNO2dCQUtFLGFBQWE7c0JBRHJCLE1BQU07Z0JBS0MsZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSzlDLFlBQVk7c0JBRGYsV0FBVzt1QkFBQyw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBEYXRlVGltZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9jbGFzcy9kYXRlLXRpbWUtYWRhcHRlci5jbGFzcydcbmltcG9ydCB7IERhdGVUaW1lRm9ybWF0cywgTlhUX0RBVEVfVElNRV9GT1JNQVRTIH0gZnJvbSAnLi4vLi4vY2xhc3MvZGF0ZS10aW1lLWZvcm1hdC5jbGFzcydcbmltcG9ydCB7IERhdGVGaWx0ZXIsIFNlbGVjdE1vZGUgfSBmcm9tICcuLi8uLi9jbGFzcy9kYXRlLXRpbWUuY2xhc3MnXG5pbXBvcnQgeyBDYWxlbmRhckNlbGwsIENhbGVuZGFyQm9keUNvbXBvbmVudCB9IGZyb20gJy4uL2NhbGVuZGFyLWJvZHkvY2FsZW5kYXItYm9keS5jb21wb25lbnQnXG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNvbnN0IE1PTlRIU19QRVJfWUVBUiA9IDEyXG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNvbnN0IE1PTlRIU19QRVJfUk9XID0gM1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ254dC1kYXRlLXRpbWUteWVhci12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIteWVhci12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci15ZWFyLXZpZXcuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBZZWFyVmlld0NvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VsZWN0IG1vZGUgb2YgdGhlIHBpY2tlcjtcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZWxlY3RNb2RlOiBTZWxlY3RNb2RlID0gJ3NpbmdsZSdcbiAgICBASW5wdXQoKVxuICAgIGdldCBzZWxlY3RNb2RlKCk6IFNlbGVjdE1vZGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0TW9kZVxuICAgIH1cblxuICAgIHNldCBzZWxlY3RNb2RlKHZhbDogU2VsZWN0TW9kZSkge1xuICAgICAgICB0aGlzLl9zZWxlY3RNb2RlID0gdmFsXG4gICAgICAgIGlmICh0aGlzLmluaXRpYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZU1vbnRoTGlzdCgpXG4gICAgICAgICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkYXRlICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWQ/OiBUXG4gICAgQElucHV0KClcbiAgICBnZXQgc2VsZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFxuICAgIH1cblxuICAgIHNldCBzZWxlY3RlZCh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuZ2V0VmFsaWREYXRlKHZhbHVlKVxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkTW9udGhzKClcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZWxlY3RlZHMgPSBuZXcgQXJyYXk8VCB8IHVuZGVmaW5lZD4oKVxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlbGVjdGVkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkc1xuICAgIH1cblxuICAgIHNldCBzZWxlY3RlZHModmFsdWVzOiBBcnJheTxUIHwgdW5kZWZpbmVkPikge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZHMgPSBbXVxuICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWwpXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZHMhLnB1c2godGhpcy5nZXRWYWxpZERhdGUodmFsdWUpKVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRNb250aHMoKVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BpY2tlck1vbWVudD86IFRcbiAgICBASW5wdXQoKVxuICAgIGdldCBwaWNrZXJNb21lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waWNrZXJNb21lbnRcbiAgICB9XG5cbiAgICBzZXQgcGlja2VyTW9tZW50KHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG9sZE1vbWVudCA9IHRoaXMuX3BpY2tlck1vbWVudFxuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxuICAgICAgICB0aGlzLl9waWNrZXJNb21lbnQgPVxuICAgICAgICAgICAgdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpIHx8IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLm5vdygpXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuaGFzU2FtZVllYXIob2xkTW9tZW50LCB0aGlzLl9waWNrZXJNb21lbnQpICYmXG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNb250aExpc3QoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiB1c2VkIHRvIGZpbHRlciB3aGljaCBkYXRlcyBhcmUgc2VsZWN0YWJsZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2RhdGVUaW1lRmlsdGVyPzogRGF0ZUZpbHRlcjxUPlxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGRhdGVUaW1lRmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVRpbWVGaWx0ZXJcbiAgICB9XG5cbiAgICBzZXQgZGF0ZVRpbWVGaWx0ZXIoZmlsdGVyOiBEYXRlRmlsdGVyPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2RhdGVUaW1lRmlsdGVyID0gZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmluaXRpYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZU1vbnRoTGlzdCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIG1pbmltdW0gc2VsZWN0YWJsZSBkYXRlICovXG4gICAgcHJpdmF0ZSBfbWluRGF0ZT86IFRcbiAgICBASW5wdXQoKVxuICAgIGdldCBtaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5EYXRlXG4gICAgfVxuXG4gICAgc2V0IG1pbih2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxuICAgICAgICB0aGlzLl9taW5EYXRlID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpXG4gICAgICAgIGlmICh0aGlzLmluaXRpYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZU1vbnRoTGlzdCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIG1heGltdW0gc2VsZWN0YWJsZSBkYXRlICovXG4gICAgcHJpdmF0ZSBfbWF4RGF0ZT86IFRcbiAgICBASW5wdXQoKVxuICAgIGdldCBtYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhEYXRlXG4gICAgfVxuXG4gICAgc2V0IG1heCh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxuICAgICAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpXG4gICAgICAgIGlmICh0aGlzLmluaXRpYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZU1vbnRoTGlzdCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vbnRoTmFtZXM6IHN0cmluZ1tdXG5cbiAgICBwcml2YXRlIF9tb250aHM/OiBDYWxlbmRhckNlbGxbXVtdXG4gICAgZ2V0IG1vbnRocygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1xuICAgIH1cblxuICAgIGdldCBhY3RpdmVDZWxsKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLl9waWNrZXJNb21lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aCh0aGlzLl9waWNrZXJNb21lbnQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZ2V0IGlzSW5TaW5nbGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RNb2RlID09PSAnc2luZ2xlJ1xuICAgIH1cblxuICAgIGdldCBpc0luUmFuZ2VNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2UnIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZVRvJ1xuICAgICAgICApXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2NhbGVTdWI/OiBTdWJzY3JpcHRpb25cblxuICAgIHByaXZhdGUgaW5pdGlhdGVkID0gZmFsc2VcblxuICAgIHRvZGF5TW9udGg/OiBudW1iZXJcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IHRvIGhvbGQgYWxsIHNlbGVjdGVkRGF0ZXMnIG1vbnRoIHZhbHVlXG4gICAgICogdGhlIHZhbHVlIGlzIHRoZSBtb250aCBudW1iZXIgaW4gY3VycmVudCB5ZWFyXG4gICAgICovXG4gICAgc2VsZWN0ZWRNb250aHM/OiBBcnJheTxudW1iZXIgfCB1bmRlZmluZWQ+XG5cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIG5ldyBtb250aCBpcyBzZWxlY3RlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICAgIHJlYWRvbmx5IGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgdGhlIHNlbGVjdGVkIHllYXJcbiAgICAgKlxuICAgICAqIFRoaXMgZG9lc24ndCBpbXBseSBhIGNoYW5nZSBvbiB0aGUgc2VsZWN0ZWQgZGF0ZS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBtb250aFNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpXG5cbiAgICAvKiogRW1pdHMgd2hlbiBhbnkgZGF0ZSBpcyBhY3RpdmF0ZWQgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBwaWNrZXJNb21lbnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KClcblxuICAgIC8qKiBFbWl0cyB3aGVuIHVzZSBrZXlib2FyZCBlbnRlciB0byBzZWxlY3QgYSBjYWxlbmRhciBjZWxsICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkga2V5Ym9hcmRFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKVxuXG4gICAgLyoqIFRoZSBib2R5IG9mIGNhbGVuZGFyIHRhYmxlICovXG4gICAgQFZpZXdDaGlsZChDYWxlbmRhckJvZHlDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBjYWxlbmRhckJvZHlFbG0/OiBDYWxlbmRhckJvZHlDb21wb25lbnRcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm54dC1kdC1jYWxlbmRhci12aWV3JylcbiAgICBnZXQgY2FsZW5kYXJWaWV3KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkYXRlVGltZUFkYXB0ZXI6IERhdGVUaW1lQWRhcHRlcjxUPixcbiAgICAgICAgQEluamVjdChOWFRfREFURV9USU1FX0ZPUk1BVFMpXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVRpbWVGb3JtYXRzOiBEYXRlVGltZUZvcm1hdHNcbiAgICApIHtcbiAgICAgICAgdGhpcy5tb250aE5hbWVzID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGhOYW1lcygnc2hvcnQnKVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmxvY2FsZVN1YiA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmxvY2FsZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNb250aExpc3QoKVxuICAgICAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZU1vbnRoTGlzdCgpXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkID0gdHJ1ZVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvY2FsZVN1Yj8udW5zdWJzY3JpYmUoKVxuICAgICAgICB0aGlzLmxvY2FsZVN1YiA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBhIGNhbGVuZGFyQ2VsbCBzZWxlY3RlZFxuICAgICAqL1xuICAgIHNlbGVjdENhbGVuZGFyQ2VsbChjZWxsOiBDYWxlbmRhckNlbGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RNb250aChjZWxsLnZhbHVlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBhIG5ldyBtb250aCBzZWxlY3RlZFxuICAgICAqL1xuICAgIHByaXZhdGUgc2VsZWN0TW9udGgobW9udGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBmaXJzdERhdGVPZk1vbnRoID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5waWNrZXJNb21lbnQpLFxuICAgICAgICAgICAgbW9udGgsXG4gICAgICAgICAgICAxXG4gICAgICAgIClcblxuICAgICAgICB0aGlzLm1vbnRoU2VsZWN0ZWQuZW1pdChmaXJzdERhdGVPZk1vbnRoKVxuXG4gICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoXG4gICAgICAgICAgICBmaXJzdERhdGVPZk1vbnRoXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5waWNrZXJNb21lbnQpLFxuICAgICAgICAgICAgbW9udGgsXG4gICAgICAgICAgICBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICBkYXlzSW5Nb250aCxcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXREYXRlKHRoaXMucGlja2VyTW9tZW50KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldEhvdXJzKHRoaXMucGlja2VyTW9tZW50KSxcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1pbnV0ZXModGhpcy5waWNrZXJNb21lbnQpLFxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0U2Vjb25kcyh0aGlzLnBpY2tlck1vbWVudClcbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuY2hhbmdlLmVtaXQocmVzdWx0KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBrZXlkb3duIGV2ZW50IG9uIGNhbGVuZGFyIGJvZHlcbiAgICAgKi9cbiAgICBoYW5kbGVDYWxlbmRhcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgbGV0IG1vbWVudFxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmNvZGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgLy8gbWludXMgMSBtb250aFxuICAgICAgICAgICAgY2FzZSAnYXJyb3dsZWZ0JzpcbiAgICAgICAgICAgICAgICBtb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXG4gICAgICAgICAgICAgICAgICAgIC0xXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KVxuICAgICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIC8vIGFkZCAxIG1vbnRoXG4gICAgICAgICAgICBjYXNlICdhcnJvd3JpZ2h0JzpcbiAgICAgICAgICAgICAgICBtb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpXG4gICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgLy8gbWludXMgMyBtb250aHNcbiAgICAgICAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICAgICAgICAgIG1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudCxcbiAgICAgICAgICAgICAgICAgICAgLTNcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpXG4gICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgLy8gYWRkIDMgbW9udGhzXG4gICAgICAgICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICAgICAgICAgIG1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudCxcbiAgICAgICAgICAgICAgICAgICAgM1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcbiAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICAvLyBtb3ZlIHRvIGZpcnN0IG1vbnRoIG9mIGN1cnJlbnQgeWVhclxuICAgICAgICAgICAgY2FzZSAnaG9tZSc6XG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxuICAgICAgICAgICAgICAgICAgICAtdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5waWNrZXJNb21lbnQpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KVxuICAgICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIC8vIG1vdmUgdG8gbGFzdCBtb250aCBvZiBjdXJyZW50IHllYXJcbiAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxuICAgICAgICAgICAgICAgICAgICAxMSAtIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKHRoaXMucGlja2VyTW9tZW50KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcbiAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICAvLyBtaW51cyAxIHllYXIgKG9yIDEwIHllYXIpXG4gICAgICAgICAgICBjYXNlICdwYWdldXAnOlxuICAgICAgICAgICAgICAgIG1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyWWVhcnMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxuICAgICAgICAgICAgICAgICAgICBldmVudC5hbHRLZXkgPyAtMTAgOiAtMVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcbiAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICAvLyBhZGQgMSB5ZWFyIChvciAxMCB5ZWFyKVxuICAgICAgICAgICAgY2FzZSAncGFnZWRvd24nOlxuICAgICAgICAgICAgICAgIG1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyWWVhcnMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50LFxuICAgICAgICAgICAgICAgICAgICBldmVudC5hbHRLZXkgPyAxMCA6IDFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpXG4gICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgLy8gU2VsZWN0IGN1cnJlbnQgbW9udGhcbiAgICAgICAgICAgIGNhc2UgJ2VudGVyJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdE1vbnRoKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aCh0aGlzLnBpY2tlck1vbWVudClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgdGhpcy5rZXlib2FyZEVudGVyLmVtaXQoKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c0FjdGl2ZUNlbGwoKVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGNhbGVuZGFyIG1vbnRoIGxpc3RcbiAgICAgKi9cbiAgICBwcml2YXRlIGdlbmVyYXRlTW9udGhMaXN0KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucGlja2VyTW9tZW50KSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRNb250aHMoKVxuICAgICAgICB0aGlzLnRvZGF5TW9udGggPSB0aGlzLmdldE1vbnRoSW5DdXJyZW50WWVhcihcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLm5vdygpXG4gICAgICAgIClcblxuICAgICAgICB0aGlzLl9tb250aHMgPSBbXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1PTlRIU19QRVJfWUVBUiAvIE1PTlRIU19QRVJfUk9XOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IFtdXG5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgTU9OVEhTX1BFUl9ST1c7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vbnRoID0gaiArIGkgKiBNT05USFNfUEVSX1JPV1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vbnRoQ2VsbCA9IHRoaXMuY3JlYXRlTW9udGhDZWxsKG1vbnRoKVxuICAgICAgICAgICAgICAgIHJvdy5wdXNoKG1vbnRoQ2VsbClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fbW9udGhzLnB1c2gocm93KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBDYWxlbmRhckNlbGwgZm9yIHRoZSBnaXZlbiBtb250aC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU1vbnRoQ2VsbChtb250aDogbnVtYmVyKTogQ2FsZW5kYXJDZWxsIHtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlT2ZNb250aCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHRoaXMucGlja2VyTW9tZW50KSxcbiAgICAgICAgICAgIG1vbnRoLFxuICAgICAgICAgICAgMVxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGFyaWFMYWJlbCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdChcbiAgICAgICAgICAgIHN0YXJ0RGF0ZU9mTW9udGgsXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0cy5tb250aFllYXJBMTF5TGFiZWxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBjZWxsQ2xhc3MgPSAnbnh0LWR0LW1vbnRoLScgKyBtb250aFxuICAgICAgICByZXR1cm4gbmV3IENhbGVuZGFyQ2VsbChcbiAgICAgICAgICAgIG1vbnRoLFxuICAgICAgICAgICAgdGhpcy5tb250aE5hbWVzW21vbnRoXSxcbiAgICAgICAgICAgIGFyaWFMYWJlbCxcbiAgICAgICAgICAgIHRoaXMuaXNNb250aEVuYWJsZWQobW9udGgpLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBjZWxsQ2xhc3NcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBtb250aCBpcyBlbmFibGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzTW9udGhFbmFibGVkKG1vbnRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZmlyc3REYXRlT2ZNb250aCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHRoaXMucGlja2VyTW9tZW50KSxcbiAgICAgICAgICAgIG1vbnRoLFxuICAgICAgICAgICAgMVxuICAgICAgICApXG5cbiAgICAgICAgLy8gSWYgYW55IGRhdGUgaW4gdGhlIG1vbnRoIGlzIHNlbGVjdGFibGUsXG4gICAgICAgIC8vIHdlIGNvdW50IHRoZSBtb250aCBhcyBlbmFibGVcbiAgICAgICAgZm9yIChcbiAgICAgICAgICAgIGxldCBkYXRlID0gZmlyc3REYXRlT2ZNb250aDtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKGRhdGUpID09PSBtb250aDtcbiAgICAgICAgICAgIGRhdGUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhckRheXMoZGF0ZSwgMSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgISFkYXRlICYmXG4gICAgICAgICAgICAgICAgKCF0aGlzLmRhdGVUaW1lRmlsdGVyIHx8IHRoaXMuZGF0ZVRpbWVGaWx0ZXIoZGF0ZSwgJ21vbnRoJykpICYmXG4gICAgICAgICAgICAgICAgKCF0aGlzLm1pbiB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKGRhdGUsIHRoaXMubWluKSA+PSAwKSAmJlxuICAgICAgICAgICAgICAgICghdGhpcy5tYXggfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShkYXRlLCB0aGlzLm1heCkgPD0gMClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtb250aCBpbiB0aGlzIHllYXIgdGhhdCB0aGUgZ2l2ZW4gRGF0ZSBmYWxscyBvbi5cbiAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgZ2l2ZW4gRGF0ZSBpcyBpbiBhbm90aGVyIHllYXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRNb250aEluQ3VycmVudFllYXIoZGF0ZT86IFQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy5nZXRWYWxpZERhdGUoZGF0ZSkgJiYgdGhpcy5nZXRWYWxpZERhdGUodGhpcy5fcGlja2VyTW9tZW50KSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZVllYXIoXG4gICAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgICB0aGlzLl9waWNrZXJNb21lbnRcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgLy8gPCAwIDogdGhlIGdpdmVuIGRhdGUncyB5ZWFyIGlzIGJlZm9yZSBwaWNrZXJNb21lbnQncyB5ZWFyLCB3ZSByZXR1cm4gLTEgYXMgc2VsZWN0ZWQgbW9udGggdmFsdWUuXG4gICAgICAgICAgICAvLyA+IDAgOiB0aGUgZ2l2ZW4gZGF0ZSdzIHllYXIgaXMgYWZ0ZXIgcGlja2VyTW9tZW50J3MgeWVhciwgd2UgcmV0dXJuIDEyIGFzIHNlbGVjdGVkIG1vbnRoIHZhbHVlLlxuICAgICAgICAgICAgLy8gMCA6IHRoZSBnaXZlIGRhdGUncyB5ZWFyIGlzIHNhbWUgYXMgdGhlIHBpY2tlck1vbWVudCdzIHllYXIsIHdlIHJldHVybiB0aGUgYWN0dWFsIG1vbnRoIHZhbHVlLlxuICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxMlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHNlbGVjdGVkTW9udGhzIHZhbHVlXG4gICAgICogSW4gc2luZ2xlIG1vZGUsIGl0IGhhcyBvbmx5IG9uZSB2YWx1ZSB3aGljaCByZXByZXNlbnQgdGhlIG1vbnRoIHRoZSBzZWxlY3RlZCBkYXRlIGluXG4gICAgICogSW4gcmFuZ2UgbW9kZSwgaXQgd291bGQgaGFzIHR3byB2YWx1ZXMsIG9uZSBmb3IgdGhlIG1vbnRoIHRoZSBmcm9tVmFsdWUgaW4gYW5kIHRoZSBvdGhlciBmb3IgdGhlIG1vbnRoIHRoZSB0b1ZhbHVlIGluXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRTZWxlY3RlZE1vbnRocygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vbnRocyA9IFtdXG4gICAgICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlICYmIHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNb250aHNbMF0gPSB0aGlzLmdldE1vbnRoSW5DdXJyZW50WWVhcih0aGlzLnNlbGVjdGVkKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNJblJhbmdlTW9kZSAmJiB0aGlzLnNlbGVjdGVkcykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1vbnRoc1swXSA9IHRoaXMuZ2V0TW9udGhJbkN1cnJlbnRZZWFyKFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRzWzBdXG4gICAgICAgICAgICApXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTW9udGhzWzFdID0gdGhpcy5nZXRNb250aEluQ3VycmVudFllYXIoXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZHNbMV1cbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoZSBnaXZlbiBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgeWVhclxuICAgICAqL1xuICAgIHByaXZhdGUgaGFzU2FtZVllYXIoZGF0ZUxlZnQ/OiBULCBkYXRlUmlnaHQ/OiBUKSB7XG4gICAgICAgIHJldHVybiAhIShcbiAgICAgICAgICAgIGRhdGVMZWZ0ICYmXG4gICAgICAgICAgICBkYXRlUmlnaHQgJiZcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIoZGF0ZUxlZnQpID09PVxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcihkYXRlUmlnaHQpXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSB2YWxpZCBkYXRlIG9iamVjdFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0VmFsaWREYXRlKG9iajogYW55KTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc0RhdGVJbnN0YW5jZShvYmopICYmXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKG9iailcbiAgICAgICAgICAgID8gb2JqXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNBY3RpdmVDZWxsKCkge1xuICAgICAgICB0aGlzLmNhbGVuZGFyQm9keUVsbT8uZm9jdXNBY3RpdmVDZWxsKClcbiAgICB9XG59XG4iLCI8dGFibGUgY2xhc3M9XCJueHQtZHQtY2FsZW5kYXItdGFibGUgbnh0LWR0LWNhbGVuZGFyLXllYXItdGFibGVcIj5cbiAgICA8dGhlYWQgY2xhc3M9XCJueHQtZHQtY2FsZW5kYXItaGVhZGVyXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cIm54dC1kdC1jYWxlbmRhci10YWJsZS1kaXZpZGVyXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgIGNvbHNwYW49XCIzXCI+PC90aD5cbiAgICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keSBueHREYXRlVGltZUNhbGVuZGFyQm9keVxuICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgIFtyb3dzXT1cIm1vbnRoc1wiXG4gICAgICAgIFtudW1Db2xzXT1cIjNcIlxuICAgICAgICBbY2VsbFJhdGlvXT1cIjMgLyA3XCJcbiAgICAgICAgW2FjdGl2ZUNlbGxdPVwiYWN0aXZlQ2VsbCA/PyAwXCJcbiAgICAgICAgW3RvZGF5VmFsdWVdPVwidG9kYXlNb250aD8/dW5kZWZpbmVkXCJcbiAgICAgICAgW3NlbGVjdGVkVmFsdWVzXT1cInNlbGVjdGVkTW9udGhzXCJcbiAgICAgICAgW3NlbGVjdE1vZGVdPVwic2VsZWN0TW9kZVwiXG4gICAgICAgIChrZXlkb3duKT1cImhhbmRsZUNhbGVuZGFyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgKHNlbGVjdCk9XCJzZWxlY3RDYWxlbmRhckNlbGwoJGV2ZW50KVwiPlxuICAgIDwvdGJvZHk+XG48L3RhYmxlPlxuIl19