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.
- package/{esm2020 → esm2022}/lib/class/date-time-adapter.class.mjs +96 -96
- package/{esm2020 → esm2022}/lib/class/date-time-format.class.mjs +3 -3
- package/esm2022/lib/class/date-time.class.mjs +96 -0
- package/{esm2020 → esm2022}/lib/class/dialog-config.class.mjs +46 -46
- package/{esm2020 → esm2022}/lib/class/dialog-ref.class.mjs +118 -118
- package/esm2022/lib/date-time/calendar/calendar.component.mjs +347 -0
- package/esm2022/lib/date-time/calendar-body/calendar-body.component.mjs +152 -0
- package/esm2022/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +430 -0
- package/esm2022/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +359 -0
- package/esm2022/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +363 -0
- package/esm2022/lib/date-time/date-time-inline/date-time-inline.component.mjs +276 -0
- package/esm2022/lib/date-time/date-time-picker/date-time-picker.component.mjs +542 -0
- package/{esm2020 → esm2022}/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs +18 -18
- package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +390 -0
- package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +619 -0
- package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +62 -0
- package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +71 -0
- package/esm2022/lib/date-time/date-time.module.mjs +97 -0
- package/esm2022/lib/date-time/number-fixed-len.pipe.mjs +23 -0
- package/esm2022/lib/date-time/timer/timer.component.mjs +300 -0
- package/esm2022/lib/date-time/timer-box/timer-box.component.mjs +96 -0
- package/esm2022/lib/dialog/dialog-container/dialog-container.component.mjs +249 -0
- package/esm2022/lib/dialog/dialog.module.mjs +43 -0
- package/esm2022/lib/dialog/dialog.service.mjs +252 -0
- package/esm2022/lib/utils/object.mjs +24 -0
- package/esm2022/moment-adapter/date-time-adapter.class.mjs +221 -0
- package/{esm2020 → esm2022}/moment-adapter/date-time-format.class.mjs +12 -12
- package/esm2022/moment-adapter/moment-adapter.module.mjs +38 -0
- package/{esm2020 → esm2022}/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +4 -4
- package/{esm2020 → esm2022}/moment-adapter/public-api.mjs +2 -2
- package/esm2022/native-adapter/date-time-adapter.class.mjs +367 -0
- package/{esm2020 → esm2022}/native-adapter/date-time-format.class.mjs +12 -12
- package/esm2022/native-adapter/native-adapter.module.mjs +38 -0
- package/{esm2020 → esm2022}/native-adapter/nxt-pick-datetime-native-adapter.mjs +4 -4
- package/{esm2020 → esm2022}/native-adapter/public-api.mjs +1 -1
- package/{esm2020 → esm2022}/nxt-pick-datetime.mjs +4 -4
- package/{esm2020 → esm2022}/public-api.mjs +13 -13
- package/{fesm2020 → fesm2022}/nxt-pick-datetime-moment-adapter.mjs +257 -257
- package/{fesm2020 → fesm2022}/nxt-pick-datetime-moment-adapter.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/nxt-pick-datetime-native-adapter.mjs +402 -402
- package/{fesm2020 → fesm2022}/nxt-pick-datetime-native-adapter.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/nxt-pick-datetime.mjs +4858 -4860
- package/{fesm2020 → fesm2022}/nxt-pick-datetime.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/class/date-time-adapter.class.d.ts +176 -176
- package/lib/class/date-time-format.class.d.ts +12 -12
- package/lib/class/date-time.class.d.ts +76 -76
- package/lib/class/dialog-config.class.d.ts +90 -90
- package/lib/class/dialog-ref.class.d.ts +50 -50
- package/lib/date-time/calendar/calendar.component.d.ts +147 -147
- package/lib/date-time/calendar-body/calendar-body.component.d.ts +79 -79
- package/lib/date-time/calendar-month-view/calendar-month-view.component.d.ts +139 -139
- package/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +115 -115
- package/lib/date-time/calendar-year-view/calendar-year-view.component.d.ts +123 -123
- package/lib/date-time/date-time-inline/date-time-inline.component.d.ts +106 -106
- package/lib/date-time/date-time-picker/date-time-picker.component.d.ts +172 -172
- package/lib/date-time/date-time-picker-container/date-time-picker-container.animations.d.ts +6 -6
- package/lib/date-time/date-time-picker-container/date-time-picker-container.component.d.ts +129 -129
- package/lib/date-time/date-time-picker-input.directive.d.ts +167 -167
- package/lib/date-time/date-time-picker-intl.service.d.ts +51 -51
- package/lib/date-time/date-time-picker-trigger.directive.d.ts +22 -22
- package/lib/date-time/date-time.module.d.ts +23 -23
- package/lib/date-time/number-fixed-len.pipe.d.ts +8 -8
- package/lib/date-time/timer/timer.component.d.ts +131 -131
- package/lib/date-time/timer-box/timer-box.component.d.ts +37 -37
- package/lib/dialog/dialog-container/dialog-container.component.d.ts +69 -69
- package/lib/dialog/dialog.module.d.ts +12 -12
- package/lib/dialog/dialog.service.d.ts +78 -78
- package/lib/utils/object.d.ts +9 -10
- package/moment-adapter/date-time-adapter.class.d.ts +64 -64
- package/moment-adapter/date-time-format.class.d.ts +5 -5
- package/moment-adapter/index.d.ts +5 -5
- package/moment-adapter/moment-adapter.module.d.ts +6 -6
- package/moment-adapter/public-api.d.ts +2 -2
- package/native-adapter/date-time-adapter.class.d.ts +72 -72
- package/native-adapter/date-time-format.class.d.ts +5 -5
- package/native-adapter/index.d.ts +5 -5
- package/native-adapter/native-adapter.module.d.ts +7 -7
- package/native-adapter/public-api.d.ts +1 -1
- package/package.json +18 -28
- package/public-api.d.ts +14 -14
- package/esm2020/lib/class/date-time.class.mjs +0 -95
- package/esm2020/lib/date-time/calendar/calendar.component.mjs +0 -346
- package/esm2020/lib/date-time/calendar-body/calendar-body.component.mjs +0 -151
- package/esm2020/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +0 -429
- package/esm2020/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -358
- package/esm2020/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +0 -362
- package/esm2020/lib/date-time/date-time-inline/date-time-inline.component.mjs +0 -275
- package/esm2020/lib/date-time/date-time-picker/date-time-picker.component.mjs +0 -541
- package/esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +0 -389
- package/esm2020/lib/date-time/date-time-picker-input.directive.mjs +0 -618
- package/esm2020/lib/date-time/date-time-picker-intl.service.mjs +0 -61
- package/esm2020/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
- package/esm2020/lib/date-time/date-time.module.mjs +0 -96
- package/esm2020/lib/date-time/number-fixed-len.pipe.mjs +0 -22
- package/esm2020/lib/date-time/timer/timer.component.mjs +0 -299
- package/esm2020/lib/date-time/timer-box/timer-box.component.mjs +0 -95
- package/esm2020/lib/dialog/dialog-container/dialog-container.component.mjs +0 -248
- package/esm2020/lib/dialog/dialog.module.mjs +0 -42
- package/esm2020/lib/dialog/dialog.service.mjs +0 -252
- package/esm2020/lib/utils/object.mjs +0 -25
- package/esm2020/moment-adapter/date-time-adapter.class.mjs +0 -220
- package/esm2020/moment-adapter/moment-adapter.module.mjs +0 -37
- package/esm2020/native-adapter/date-time-adapter.class.mjs +0 -366
- package/esm2020/native-adapter/native-adapter.module.mjs +0 -37
- package/fesm2015/nxt-pick-datetime-moment-adapter.mjs +0 -274
- package/fesm2015/nxt-pick-datetime-moment-adapter.mjs.map +0 -1
- package/fesm2015/nxt-pick-datetime-native-adapter.mjs +0 -420
- package/fesm2015/nxt-pick-datetime-native-adapter.mjs.map +0 -1
- package/fesm2015/nxt-pick-datetime.mjs +0 -5014
- package/fesm2015/nxt-pick-datetime.mjs.map +0 -1
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { CalendarCell, CalendarBodyComponent } from '../calendar-body/calendar-body.component';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../date-time-picker-intl.service";
|
|
5
|
+
import * as i2 from "../../class/date-time-adapter.class";
|
|
6
|
+
import * as i3 from "../calendar-body/calendar-body.component";
|
|
7
|
+
/** @internal */
|
|
8
|
+
export const YEARS_PER_ROW = 3;
|
|
9
|
+
/** @internal */
|
|
10
|
+
export const YEAR_ROWS = 7;
|
|
11
|
+
class MultiYearViewComponent {
|
|
12
|
+
get selectMode() {
|
|
13
|
+
return this._selectMode;
|
|
14
|
+
}
|
|
15
|
+
set selectMode(val) {
|
|
16
|
+
this._selectMode = val;
|
|
17
|
+
if (this.initiated) {
|
|
18
|
+
this.setSelectedYears();
|
|
19
|
+
this.cdRef.markForCheck();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
get selected() {
|
|
23
|
+
return this._selected;
|
|
24
|
+
}
|
|
25
|
+
set selected(value) {
|
|
26
|
+
const oldSelected = this._selected;
|
|
27
|
+
value = this.dateTimeAdapter.deserialize(value);
|
|
28
|
+
this._selected = this.getValidDate(value);
|
|
29
|
+
if (!this.dateTimeAdapter.isSameDay(oldSelected, this._selected)) {
|
|
30
|
+
this.setSelectedYears();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
get selecteds() {
|
|
34
|
+
return this._selecteds;
|
|
35
|
+
}
|
|
36
|
+
set selecteds(values) {
|
|
37
|
+
this._selecteds = values.map((v) => {
|
|
38
|
+
v = this.dateTimeAdapter.deserialize(v);
|
|
39
|
+
return this.getValidDate(v);
|
|
40
|
+
});
|
|
41
|
+
this.setSelectedYears();
|
|
42
|
+
}
|
|
43
|
+
get pickerMoment() {
|
|
44
|
+
return this._pickerMoment;
|
|
45
|
+
}
|
|
46
|
+
set pickerMoment(value) {
|
|
47
|
+
const oldMoment = this._pickerMoment;
|
|
48
|
+
value = this.dateTimeAdapter.deserialize(value);
|
|
49
|
+
this._pickerMoment = this.getValidDate(value) || this.dateTimeAdapter.now();
|
|
50
|
+
if (oldMoment && this._pickerMoment &&
|
|
51
|
+
!this.isSameYearList(oldMoment, this._pickerMoment)) {
|
|
52
|
+
this.generateYearList();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
get dateTimeFilter() {
|
|
56
|
+
return this._dateTimeFilter;
|
|
57
|
+
}
|
|
58
|
+
set dateTimeFilter(filter) {
|
|
59
|
+
this._dateTimeFilter = filter;
|
|
60
|
+
if (this.initiated) {
|
|
61
|
+
this.generateYearList();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
get min() {
|
|
65
|
+
return this._minDate;
|
|
66
|
+
}
|
|
67
|
+
set min(value) {
|
|
68
|
+
value = this.dateTimeAdapter.deserialize(value);
|
|
69
|
+
this._minDate = this.getValidDate(value);
|
|
70
|
+
if (this.initiated) {
|
|
71
|
+
this.generateYearList();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
get max() {
|
|
75
|
+
return this._maxDate;
|
|
76
|
+
}
|
|
77
|
+
set max(value) {
|
|
78
|
+
value = this.dateTimeAdapter.deserialize(value);
|
|
79
|
+
this._maxDate = this.getValidDate(value);
|
|
80
|
+
if (this.initiated) {
|
|
81
|
+
this.generateYearList();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
get todayYear() {
|
|
85
|
+
return this._todayYear;
|
|
86
|
+
}
|
|
87
|
+
get years() {
|
|
88
|
+
return this._years;
|
|
89
|
+
}
|
|
90
|
+
get selectedYears() {
|
|
91
|
+
return this._selectedYears;
|
|
92
|
+
}
|
|
93
|
+
get isInSingleMode() {
|
|
94
|
+
return this.selectMode === 'single';
|
|
95
|
+
}
|
|
96
|
+
get isInRangeMode() {
|
|
97
|
+
return this.selectMode === 'range' || this.selectMode === 'rangeFrom'
|
|
98
|
+
|| this.selectMode === 'rangeTo';
|
|
99
|
+
}
|
|
100
|
+
get activeCell() {
|
|
101
|
+
if (this._pickerMoment) {
|
|
102
|
+
return this.dateTimeAdapter.getYear(this._pickerMoment) % (YEARS_PER_ROW * YEAR_ROWS);
|
|
103
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
get tableHeader() {
|
|
107
|
+
if (this._years && this._years.length > 0) {
|
|
108
|
+
return `${this._years[0][0].displayValue} ~ ${this._years[YEAR_ROWS - 1][YEARS_PER_ROW - 1].displayValue}`;
|
|
109
|
+
}
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
get prevButtonLabel() {
|
|
113
|
+
return this.pickerIntl.prevMultiYearLabel;
|
|
114
|
+
}
|
|
115
|
+
get nextButtonLabel() {
|
|
116
|
+
return this.pickerIntl.nextMultiYearLabel;
|
|
117
|
+
}
|
|
118
|
+
/** @internal */
|
|
119
|
+
get calendarView() {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
/** @internal */
|
|
123
|
+
get calendarMultiYearView() {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
constructor(cdRef, pickerIntl, dateTimeAdapter) {
|
|
127
|
+
this.cdRef = cdRef;
|
|
128
|
+
this.pickerIntl = pickerIntl;
|
|
129
|
+
this.dateTimeAdapter = dateTimeAdapter;
|
|
130
|
+
/**
|
|
131
|
+
* The select mode of the picker;
|
|
132
|
+
*/
|
|
133
|
+
this._selectMode = 'single';
|
|
134
|
+
this._selecteds = new Array();
|
|
135
|
+
this.initiated = false;
|
|
136
|
+
/**
|
|
137
|
+
* Callback to invoke when a new month is selected
|
|
138
|
+
*/
|
|
139
|
+
// eslint-disable-next-line @angular-eslint/no-output-native
|
|
140
|
+
this.change = new EventEmitter();
|
|
141
|
+
/**
|
|
142
|
+
* Emits the selected year
|
|
143
|
+
*
|
|
144
|
+
* This doesn't imply a change on the selected date.
|
|
145
|
+
*/
|
|
146
|
+
this.yearSelected = new EventEmitter();
|
|
147
|
+
/** Emits when any date is activated */
|
|
148
|
+
this.pickerMomentChange = new EventEmitter();
|
|
149
|
+
/** Emits when use keyboard enter to select a calendar cell */
|
|
150
|
+
this.keyboardEnter = new EventEmitter();
|
|
151
|
+
}
|
|
152
|
+
ngOnInit() {
|
|
153
|
+
}
|
|
154
|
+
ngAfterContentInit() {
|
|
155
|
+
this._todayYear = this.dateTimeAdapter.getYear(this.dateTimeAdapter.now());
|
|
156
|
+
this.generateYearList();
|
|
157
|
+
this.initiated = true;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Handle a calendarCell selected
|
|
161
|
+
*/
|
|
162
|
+
selectCalendarCell(cell) {
|
|
163
|
+
this.selectYear(cell.value);
|
|
164
|
+
}
|
|
165
|
+
selectYear(year) {
|
|
166
|
+
this.yearSelected.emit(this.dateTimeAdapter.createDate(year, 0, 1));
|
|
167
|
+
const firstDateOfMonth = this.dateTimeAdapter.createDate(year, this.dateTimeAdapter.getMonth(this.pickerMoment), 1);
|
|
168
|
+
const daysInMonth = this.dateTimeAdapter.getNumDaysInMonth(firstDateOfMonth);
|
|
169
|
+
const selected = this.dateTimeAdapter.createDate(year, this.dateTimeAdapter.getMonth(this.pickerMoment), Math.min(daysInMonth, this.dateTimeAdapter.getDate(this.pickerMoment)), this.dateTimeAdapter.getHours(this.pickerMoment), this.dateTimeAdapter.getMinutes(this.pickerMoment), this.dateTimeAdapter.getSeconds(this.pickerMoment));
|
|
170
|
+
this.change.emit(selected);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Generate the previous year list
|
|
174
|
+
*/
|
|
175
|
+
prevYearList(event) {
|
|
176
|
+
this._pickerMoment = this.dateTimeAdapter.addCalendarYears(this.pickerMoment, -1 * YEAR_ROWS * YEARS_PER_ROW);
|
|
177
|
+
this.generateYearList();
|
|
178
|
+
event.preventDefault();
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Generate the next year list
|
|
182
|
+
*/
|
|
183
|
+
nextYearList(event) {
|
|
184
|
+
this._pickerMoment = this.dateTimeAdapter.addCalendarYears(this.pickerMoment, YEAR_ROWS * YEARS_PER_ROW);
|
|
185
|
+
this.generateYearList();
|
|
186
|
+
event.preventDefault();
|
|
187
|
+
}
|
|
188
|
+
generateYearList() {
|
|
189
|
+
this._years = [];
|
|
190
|
+
const pickerMomentYear = this.dateTimeAdapter.getYear(this._pickerMoment);
|
|
191
|
+
const offset = pickerMomentYear % (YEARS_PER_ROW * YEAR_ROWS);
|
|
192
|
+
for (let i = 0; i < YEAR_ROWS; i++) {
|
|
193
|
+
const row = [];
|
|
194
|
+
for (let j = 0; j < YEARS_PER_ROW; j++) {
|
|
195
|
+
const year = pickerMomentYear - offset + (j + i * YEARS_PER_ROW);
|
|
196
|
+
const yearCell = this.createYearCell(year);
|
|
197
|
+
row.push(yearCell);
|
|
198
|
+
}
|
|
199
|
+
this._years.push(row);
|
|
200
|
+
}
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
/** Whether the previous period button is enabled */
|
|
204
|
+
previousEnabled() {
|
|
205
|
+
if (!this.min) {
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
return !this.min || !this.isSameYearList(this._pickerMoment, this.min);
|
|
209
|
+
}
|
|
210
|
+
/** Whether the next period button is enabled */
|
|
211
|
+
nextEnabled() {
|
|
212
|
+
return !this.max || !this.isSameYearList(this._pickerMoment, this.max);
|
|
213
|
+
}
|
|
214
|
+
handleCalendarKeydown(event) {
|
|
215
|
+
let moment;
|
|
216
|
+
switch (event.code.toLowerCase()) {
|
|
217
|
+
// minus 1 year
|
|
218
|
+
case 'arrowleft':
|
|
219
|
+
moment = this.dateTimeAdapter.addCalendarYears(this._pickerMoment, -1);
|
|
220
|
+
this.pickerMomentChange.emit(moment);
|
|
221
|
+
break;
|
|
222
|
+
// add 1 year
|
|
223
|
+
case 'arrowright':
|
|
224
|
+
moment = this.dateTimeAdapter.addCalendarYears(this._pickerMoment, 1);
|
|
225
|
+
this.pickerMomentChange.emit(moment);
|
|
226
|
+
break;
|
|
227
|
+
// minus 3 years
|
|
228
|
+
case 'arrowup':
|
|
229
|
+
moment = this.dateTimeAdapter.addCalendarYears(this._pickerMoment, -1 * YEARS_PER_ROW);
|
|
230
|
+
this.pickerMomentChange.emit(moment);
|
|
231
|
+
break;
|
|
232
|
+
// add 3 years
|
|
233
|
+
case 'arrowdown':
|
|
234
|
+
moment = this.dateTimeAdapter.addCalendarYears(this._pickerMoment, YEARS_PER_ROW);
|
|
235
|
+
this.pickerMomentChange.emit(moment);
|
|
236
|
+
break;
|
|
237
|
+
// go to the first year of the year page
|
|
238
|
+
case 'home':
|
|
239
|
+
moment = this.dateTimeAdapter.addCalendarYears(this._pickerMoment, -this.dateTimeAdapter.getYear(this._pickerMoment) % (YEARS_PER_ROW * YEAR_ROWS));
|
|
240
|
+
this.pickerMomentChange.emit(moment);
|
|
241
|
+
break;
|
|
242
|
+
// go to the last year of the year page
|
|
243
|
+
case 'end':
|
|
244
|
+
moment = this.dateTimeAdapter.addCalendarYears(this._pickerMoment, (YEARS_PER_ROW * YEAR_ROWS) - this.dateTimeAdapter.getYear(this._pickerMoment) % (YEARS_PER_ROW * YEAR_ROWS) - 1);
|
|
245
|
+
this.pickerMomentChange.emit(moment);
|
|
246
|
+
break;
|
|
247
|
+
// minus 1 year page (or 10 year pages)
|
|
248
|
+
case 'pageup':
|
|
249
|
+
moment = this.dateTimeAdapter.addCalendarYears(this.pickerMoment, event.altKey ? -10 * (YEARS_PER_ROW * YEAR_ROWS) : -1 * (YEARS_PER_ROW * YEAR_ROWS));
|
|
250
|
+
this.pickerMomentChange.emit(moment);
|
|
251
|
+
break;
|
|
252
|
+
// add 1 year page (or 10 year pages)
|
|
253
|
+
case 'pagedown':
|
|
254
|
+
moment = this.dateTimeAdapter.addCalendarYears(this.pickerMoment, event.altKey ? 10 * (YEARS_PER_ROW * YEAR_ROWS) : (YEARS_PER_ROW * YEAR_ROWS));
|
|
255
|
+
this.pickerMomentChange.emit(moment);
|
|
256
|
+
break;
|
|
257
|
+
case 'enter':
|
|
258
|
+
this.selectYear(this.dateTimeAdapter.getYear(this._pickerMoment));
|
|
259
|
+
this.keyboardEnter.emit();
|
|
260
|
+
break;
|
|
261
|
+
default:
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
this.focusActiveCell();
|
|
265
|
+
event.preventDefault();
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Creates an CalendarCell for the given year.
|
|
269
|
+
*/
|
|
270
|
+
createYearCell(year) {
|
|
271
|
+
const startDateOfYear = this.dateTimeAdapter.createDate(year, 0, 1);
|
|
272
|
+
const ariaLabel = this.dateTimeAdapter.getYearName(startDateOfYear);
|
|
273
|
+
const cellClass = 'nxt-dt-year-' + year;
|
|
274
|
+
return new CalendarCell(year, year.toString(), ariaLabel, this.isYearEnabled(year), false, cellClass);
|
|
275
|
+
}
|
|
276
|
+
setSelectedYears() {
|
|
277
|
+
this._selectedYears = [];
|
|
278
|
+
if (this.isInSingleMode && this.selected) {
|
|
279
|
+
this._selectedYears[0] = this.dateTimeAdapter.getYear(this.selected);
|
|
280
|
+
}
|
|
281
|
+
if (this.isInRangeMode && this.selecteds) {
|
|
282
|
+
this._selectedYears = this.selecteds.map((selected) => {
|
|
283
|
+
if (this.dateTimeAdapter.isValid(selected)) {
|
|
284
|
+
return this.dateTimeAdapter.getYear(selected);
|
|
285
|
+
}
|
|
286
|
+
return;
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/** Whether the given year is enabled */
|
|
291
|
+
isYearEnabled(year) {
|
|
292
|
+
// enable if it reaches here and there's no filter defined
|
|
293
|
+
if (!this.dateTimeFilter) {
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
const firstOfYear = this.dateTimeAdapter.createDate(year, 0, 1);
|
|
297
|
+
// If any date in the year is enabled count the year as enabled.
|
|
298
|
+
for (let date = firstOfYear; this.dateTimeAdapter.getYear(date) == year; date = this.dateTimeAdapter.addCalendarDays(date, 1)) {
|
|
299
|
+
if (this.dateTimeFilter(date, 'year')) {
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
isSameYearList(date1, date2) {
|
|
306
|
+
return Math.floor(this.dateTimeAdapter.getYear(date1) / (YEARS_PER_ROW * YEAR_ROWS)) ===
|
|
307
|
+
Math.floor(this.dateTimeAdapter.getYear(date2) / (YEARS_PER_ROW * YEAR_ROWS));
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Get a valid date object
|
|
311
|
+
*/
|
|
312
|
+
getValidDate(obj) {
|
|
313
|
+
return (this.dateTimeAdapter.isDateInstance(obj) && this.dateTimeAdapter.isValid(obj))
|
|
314
|
+
? obj
|
|
315
|
+
: undefined;
|
|
316
|
+
}
|
|
317
|
+
focusActiveCell() {
|
|
318
|
+
this.calendarBodyElm?.focusActiveCell();
|
|
319
|
+
}
|
|
320
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MultiYearViewComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DateTimeIntl }, { token: i2.DateTimeAdapter }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
321
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: MultiYearViewComponent, selector: "nxt-date-time-multi-year-view", inputs: { selectMode: "selectMode", selected: "selected", selecteds: "selecteds", pickerMoment: "pickerMoment", dateTimeFilter: "dateTimeFilter", min: "min", max: "max" }, outputs: { change: "change", yearSelected: "yearSelected", pickerMomentChange: "pickerMomentChange", keyboardEnter: "keyboardEnter" }, host: { properties: { "class.nxt-dt-calendar-view": "this.calendarView", "class.nxt-dt-calendar-multi-year-view": "this.calendarMultiYearView" } }, viewQueries: [{ propertyName: "calendarBodyElm", first: true, predicate: CalendarBodyComponent, descendants: true, static: true }], ngImport: i0, template: "<button class=\"nxt-dt-control-button nxt-dt-control-arrow-button\"\n [disabled]=\"!previousEnabled()\"\n [attr.aria-label]=\"prevButtonLabel\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"prevYearList($event)\">\n <span class=\"nxt-dt-control-button-content\"\n tabindex=\"-1\">\n <!-- <editor-fold desc=\"SVG Arrow Left\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n version=\"1.1\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 250.738 250.738\"\n style=\"enable-background:new 0 0 250.738 250.738;\"\n xml:space=\"preserve\"\n width=\"100%\"\n height=\"100%\">\n <path style=\"fill-rule: evenodd; clip-rule: evenodd;\"\n d=\"M96.633,125.369l95.053-94.533c7.101-7.055,7.101-18.492,0-25.546 c-7.1-7.054-18.613-7.054-25.714,0L58.989,111.689c-3.784,3.759-5.487,8.759-5.238,13.68c-0.249,4.922,1.454,9.921,5.238,13.681 l106.983,106.398c7.101,7.055,18.613,7.055,25.714,0c7.101-7.054,7.101-18.491,0-25.544L96.633,125.369z\" />\n </svg>\n <!-- </editor-fold> -->\n </span>\n</button>\n<table class=\"nxt-dt-calendar-table nxt-dt-calendar-multi-year-table\">\n <thead class=\"nxt-dt-calendar-header\">\n <tr>\n <th colspan=\"3\">{{tableHeader}}</th>\n </tr>\n </thead>\n <tbody nxtDateTimeCalendarBody\n role=\"grid\"\n [rows]=\"years\"\n [numCols]=\"3\"\n [cellRatio]=\"3 / 7\"\n [activeCell]=\"activeCell ?? 0\"\n [todayValue]=\"todayYear\"\n [selectedValues]=\"selectedYears\"\n [selectMode]=\"selectMode\"\n (keydown)=\"handleCalendarKeydown($event)\"\n (select)=\"selectCalendarCell($event)\"></tbody>\n</table>\n<button class=\"nxt-dt-control-button nxt-dt-control-arrow-button\"\n [disabled]=\"!nextEnabled()\"\n [attr.aria-label]=\"nextButtonLabel\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"nextYearList($event)\">\n <span class=\"nxt-dt-control-button-content\"\n tabindex=\"-1\">\n <!-- <editor-fold desc=\"SVG Arrow Right\"> -->\n <svg version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 250.738 250.738\"\n style=\"enable-background:new 0 0 250.738 250.738;\"\n xml:space=\"preserve\">\n <path style=\"fill-rule:evenodd;clip-rule:evenodd;\"\n d=\"M191.75,111.689L84.766,5.291c-7.1-7.055-18.613-7.055-25.713,0\n c-7.101,7.054-7.101,18.49,0,25.544l95.053,94.534l-95.053,94.533c-7.101,7.054-7.101,18.491,0,25.545\n c7.1,7.054,18.613,7.054,25.713,0L191.75,139.05c3.784-3.759,5.487-8.759,5.238-13.681\n C197.237,120.447,195.534,115.448,191.75,111.689z\" />\n </svg>\n <!-- </editor-fold> -->\n </span>\n</button>\n", styles: [""], dependencies: [{ kind: "component", type: i3.CalendarBodyComponent, selector: "[nxtDateTimeCalendarBody]", inputs: ["activeCell", "rows", "numCols", "cellRatio", "todayValue", "selectedValues", "selectMode"], outputs: ["select"], exportAs: ["nxtDateTimeCalendarBody"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
322
|
+
}
|
|
323
|
+
export { MultiYearViewComponent };
|
|
324
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MultiYearViewComponent, decorators: [{
|
|
325
|
+
type: Component,
|
|
326
|
+
args: [{ selector: 'nxt-date-time-multi-year-view', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button class=\"nxt-dt-control-button nxt-dt-control-arrow-button\"\n [disabled]=\"!previousEnabled()\"\n [attr.aria-label]=\"prevButtonLabel\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"prevYearList($event)\">\n <span class=\"nxt-dt-control-button-content\"\n tabindex=\"-1\">\n <!-- <editor-fold desc=\"SVG Arrow Left\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n version=\"1.1\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 250.738 250.738\"\n style=\"enable-background:new 0 0 250.738 250.738;\"\n xml:space=\"preserve\"\n width=\"100%\"\n height=\"100%\">\n <path style=\"fill-rule: evenodd; clip-rule: evenodd;\"\n d=\"M96.633,125.369l95.053-94.533c7.101-7.055,7.101-18.492,0-25.546 c-7.1-7.054-18.613-7.054-25.714,0L58.989,111.689c-3.784,3.759-5.487,8.759-5.238,13.68c-0.249,4.922,1.454,9.921,5.238,13.681 l106.983,106.398c7.101,7.055,18.613,7.055,25.714,0c7.101-7.054,7.101-18.491,0-25.544L96.633,125.369z\" />\n </svg>\n <!-- </editor-fold> -->\n </span>\n</button>\n<table class=\"nxt-dt-calendar-table nxt-dt-calendar-multi-year-table\">\n <thead class=\"nxt-dt-calendar-header\">\n <tr>\n <th colspan=\"3\">{{tableHeader}}</th>\n </tr>\n </thead>\n <tbody nxtDateTimeCalendarBody\n role=\"grid\"\n [rows]=\"years\"\n [numCols]=\"3\"\n [cellRatio]=\"3 / 7\"\n [activeCell]=\"activeCell ?? 0\"\n [todayValue]=\"todayYear\"\n [selectedValues]=\"selectedYears\"\n [selectMode]=\"selectMode\"\n (keydown)=\"handleCalendarKeydown($event)\"\n (select)=\"selectCalendarCell($event)\"></tbody>\n</table>\n<button class=\"nxt-dt-control-button nxt-dt-control-arrow-button\"\n [disabled]=\"!nextEnabled()\"\n [attr.aria-label]=\"nextButtonLabel\"\n type=\"button\"\n tabindex=\"0\"\n (click)=\"nextYearList($event)\">\n <span class=\"nxt-dt-control-button-content\"\n tabindex=\"-1\">\n <!-- <editor-fold desc=\"SVG Arrow Right\"> -->\n <svg version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 250.738 250.738\"\n style=\"enable-background:new 0 0 250.738 250.738;\"\n xml:space=\"preserve\">\n <path style=\"fill-rule:evenodd;clip-rule:evenodd;\"\n d=\"M191.75,111.689L84.766,5.291c-7.1-7.055-18.613-7.055-25.713,0\n c-7.101,7.054-7.101,18.49,0,25.544l95.053,94.534l-95.053,94.533c-7.101,7.054-7.101,18.491,0,25.545\n c7.1,7.054,18.613,7.054,25.713,0L191.75,139.05c3.784-3.759,5.487-8.759,5.238-13.681\n C197.237,120.447,195.534,115.448,191.75,111.689z\" />\n </svg>\n <!-- </editor-fold> -->\n </span>\n</button>\n" }]
|
|
327
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DateTimeIntl }, { type: i2.DateTimeAdapter }]; }, propDecorators: { selectMode: [{
|
|
328
|
+
type: Input
|
|
329
|
+
}], selected: [{
|
|
330
|
+
type: Input
|
|
331
|
+
}], selecteds: [{
|
|
332
|
+
type: Input
|
|
333
|
+
}], pickerMoment: [{
|
|
334
|
+
type: Input
|
|
335
|
+
}], dateTimeFilter: [{
|
|
336
|
+
type: Input
|
|
337
|
+
}], min: [{
|
|
338
|
+
type: Input
|
|
339
|
+
}], max: [{
|
|
340
|
+
type: Input
|
|
341
|
+
}], change: [{
|
|
342
|
+
type: Output
|
|
343
|
+
}], yearSelected: [{
|
|
344
|
+
type: Output
|
|
345
|
+
}], pickerMomentChange: [{
|
|
346
|
+
type: Output
|
|
347
|
+
}], keyboardEnter: [{
|
|
348
|
+
type: Output
|
|
349
|
+
}], calendarBodyElm: [{
|
|
350
|
+
type: ViewChild,
|
|
351
|
+
args: [CalendarBodyComponent, { static: true }]
|
|
352
|
+
}], calendarView: [{
|
|
353
|
+
type: HostBinding,
|
|
354
|
+
args: ['class.nxt-dt-calendar-view']
|
|
355
|
+
}], calendarMultiYearView: [{
|
|
356
|
+
type: HostBinding,
|
|
357
|
+
args: ['class.nxt-dt-calendar-multi-year-view']
|
|
358
|
+
}] } });
|
|
359
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3BpY2stZGF0ZXRpbWUvc3JjL2xpYi9kYXRlLXRpbWUvY2FsZW5kYXItbXVsdGkteWVhci12aWV3L2NhbGVuZGFyLW11bHRpLXllYXItdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2NhbGVuZGFyLW11bHRpLXllYXItdmlldy9jYWxlbmRhci1tdWx0aS15ZWFyLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQix1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFHcEssT0FBTyxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFBOzs7OztBQUc5RixnQkFBZ0I7QUFDaEIsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQTtBQUU5QixnQkFBZ0I7QUFDaEIsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQTtBQUUxQixNQVFhLHNCQUFzQjtJQU0vQixJQUNJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUE7SUFDM0IsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLEdBQWU7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUE7UUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUE7U0FDNUI7SUFDTCxDQUFDO0lBSUQsSUFDSSxR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QkFBc0I7a0dBQXRCLHNCQUFzQiw2akJBeUxwQixxQkFBcUIsOERDN01wQywrK0ZBcUVBOztTRGpEYSxzQkFBc0I7MkZBQXRCLHNCQUFzQjtrQkFSbEMsU0FBUzsrQkFDSSwrQkFBK0IsdUJBR3BCLEtBQUssbUJBQ1QsdUJBQXVCLENBQUMsTUFBTTtpS0FVM0MsVUFBVTtzQkFEYixLQUFLO2dCQWdCRixRQUFRO3NCQURYLEtBQUs7Z0JBaUJGLFNBQVM7c0JBRFosS0FBSztnQkFlRixZQUFZO3NCQURmLEtBQUs7Z0JBcUJGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBZUYsR0FBRztzQkFETixLQUFLO2dCQWdCRixHQUFHO3NCQUROLEtBQUs7Z0JBa0VHLE1BQU07c0JBRGQsTUFBTTtnQkFTRSxZQUFZO3NCQURwQixNQUFNO2dCQUtFLGtCQUFrQjtzQkFEMUIsTUFBTTtnQkFLRSxhQUFhO3NCQURyQixNQUFNO2dCQUtDLGVBQWU7c0JBRHRCLFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUs5QyxZQUFZO3NCQURmLFdBQVc7dUJBQUMsNEJBQTRCO2dCQU9yQyxxQkFBcUI7c0JBRHhCLFdBQVc7dUJBQUMsdUNBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IERhdGVUaW1lQWRhcHRlciB9IGZyb20gJy4uLy4uL2NsYXNzL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJ1xuaW1wb3J0IHsgRGF0ZUZpbHRlciwgU2VsZWN0TW9kZSB9IGZyb20gJy4uLy4uL2NsYXNzL2RhdGUtdGltZS5jbGFzcydcbmltcG9ydCB7IENhbGVuZGFyQ2VsbCwgQ2FsZW5kYXJCb2R5Q29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXItYm9keS9jYWxlbmRhci1ib2R5LmNvbXBvbmVudCdcbmltcG9ydCB7IERhdGVUaW1lSW50bCB9IGZyb20gJy4uL2RhdGUtdGltZS1waWNrZXItaW50bC5zZXJ2aWNlJ1xuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgWUVBUlNfUEVSX1JPVyA9IDNcblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IFlFQVJfUk9XUyA9IDdcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdueHQtZGF0ZS10aW1lLW11bHRpLXllYXItdmlldycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLW11bHRpLXllYXItdmlldy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5cbmV4cG9ydCBjbGFzcyBNdWx0aVllYXJWaWV3Q29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3QgbW9kZSBvZiB0aGUgcGlja2VyO1xuICAgICAqL1xuICAgIHByaXZhdGUgX3NlbGVjdE1vZGU6IFNlbGVjdE1vZGUgPSAnc2luZ2xlJ1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlbGVjdE1vZGUoKTogU2VsZWN0TW9kZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RNb2RlXG4gICAgfVxuXG4gICAgc2V0IHNlbGVjdE1vZGUodmFsOiBTZWxlY3RNb2RlKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdE1vZGUgPSB2YWxcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkWWVhcnMoKVxuICAgICAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZSAqL1xuICAgIHByaXZhdGUgX3NlbGVjdGVkPzogVFxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlbGVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRcbiAgICB9XG5cbiAgICBzZXQgc2VsZWN0ZWQodmFsdWU6IFQgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb2xkU2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3RlZFxuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuZ2V0VmFsaWREYXRlKHZhbHVlKVxuXG4gICAgICAgIGlmICghdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNTYW1lRGF5KG9sZFNlbGVjdGVkLCB0aGlzLl9zZWxlY3RlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRZZWFycygpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZWxlY3RlZHMgPSBuZXcgQXJyYXk8VCB8IHVuZGVmaW5lZD4oKVxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlbGVjdGVkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkc1xuICAgIH1cblxuICAgIHNldCBzZWxlY3RlZHModmFsdWVzOiBBcnJheTxUIHwgdW5kZWZpbmVkPikge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZHMgPSB2YWx1ZXMubWFwKCh2KSA9PiB7XG4gICAgICAgICAgICB2ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbGlkRGF0ZSh2KVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkWWVhcnMoKVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BpY2tlck1vbWVudD86IFRcbiAgICBASW5wdXQoKVxuICAgIGdldCBwaWNrZXJNb21lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waWNrZXJNb21lbnRcbiAgICB9XG5cbiAgICBzZXQgcGlja2VyTW9tZW50KHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG9sZE1vbWVudCA9IHRoaXMuX3BpY2tlck1vbWVudFxuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxuICAgICAgICB0aGlzLl9waWNrZXJNb21lbnQgPSB0aGlzLmdldFZhbGlkRGF0ZSh2YWx1ZSkgfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIubm93KClcblxuICAgICAgICBpZiAob2xkTW9tZW50ICYmIHRoaXMuX3BpY2tlck1vbWVudCAmJlxuICAgICAgICAgICAgIXRoaXMuaXNTYW1lWWVhckxpc3Qob2xkTW9tZW50LCB0aGlzLl9waWNrZXJNb21lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlWWVhckxpc3QoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiB1c2VkIHRvIGZpbHRlciB3aGljaCBkYXRlcyBhcmUgc2VsZWN0YWJsZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2RhdGVUaW1lRmlsdGVyPzogRGF0ZUZpbHRlcjxUPlxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGRhdGVUaW1lRmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVRpbWVGaWx0ZXJcbiAgICB9XG5cbiAgICBzZXQgZGF0ZVRpbWVGaWx0ZXIoZmlsdGVyOiBEYXRlRmlsdGVyPFQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2RhdGVUaW1lRmlsdGVyID0gZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmluaXRpYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVllYXJMaXN0KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgbWluaW11bSBzZWxlY3RhYmxlIGRhdGUgKi9cbiAgICBwcml2YXRlIF9taW5EYXRlPzogVFxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG1pbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbkRhdGVcbiAgICB9XG5cbiAgICBzZXQgbWluKHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpXG4gICAgICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLmdldFZhbGlkRGF0ZSh2YWx1ZSlcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlWWVhckxpc3QoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBtYXhpbXVtIHNlbGVjdGFibGUgZGF0ZSAqL1xuICAgIHByaXZhdGUgX21heERhdGU/OiBUXG4gICAgQElucHV0KClcbiAgICBnZXQgbWF4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZVxuICAgIH1cblxuICAgIHNldCBtYXgodmFsdWU6IFQgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSlcbiAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IHRoaXMuZ2V0VmFsaWREYXRlKHZhbHVlKVxuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVZZWFyTGlzdCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF90b2RheVllYXI/OiBudW1iZXJcbiAgICBnZXQgdG9kYXlZZWFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG9kYXlZZWFyXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfeWVhcnM/OiBDYWxlbmRhckNlbGxbXVtdXG4gICAgZ2V0IHllYXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5feWVhcnNcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZWxlY3RlZFllYXJzPzogQXJyYXk8bnVtYmVyIHwgdW5kZWZpbmVkPlxuICAgIGdldCBzZWxlY3RlZFllYXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRZZWFyc1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhdGVkID0gZmFsc2VcblxuICAgIGdldCBpc0luU2luZ2xlTW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZSdcbiAgICB9XG5cbiAgICBnZXQgaXNJblJhbmdlTW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyB8fCB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nXG4gICAgICAgICAgICB8fCB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZVRvJ1xuICAgIH1cblxuICAgIGdldCBhY3RpdmVDZWxsKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLl9waWNrZXJNb21lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHRoaXMuX3BpY2tlck1vbWVudCkgJSAoWUVBUlNfUEVSX1JPVyAqIFlFQVJfUk9XUylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBnZXQgdGFibGVIZWFkZXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuX3llYXJzICYmIHRoaXMuX3llYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLl95ZWFyc1swXVswXS5kaXNwbGF5VmFsdWV9IH4gJHt0aGlzLl95ZWFyc1tZRUFSX1JPV1MgLSAxXVtZRUFSU19QRVJfUk9XIC0gMV0uZGlzcGxheVZhbHVlfWBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBnZXQgcHJldkJ1dHRvbkxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwucHJldk11bHRpWWVhckxhYmVsXG4gICAgfVxuXG4gICAgZ2V0IG5leHRCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJJbnRsLm5leHRNdWx0aVllYXJMYWJlbFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgbmV3IG1vbnRoIGlzIHNlbGVjdGVkXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpXG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyB0aGUgc2VsZWN0ZWQgeWVhclxuICAgICAqXG4gICAgICogVGhpcyBkb2Vzbid0IGltcGx5IGEgY2hhbmdlIG9uIHRoZSBzZWxlY3RlZCBkYXRlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHllYXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKVxuXG4gICAgLyoqIEVtaXRzIHdoZW4gYW55IGRhdGUgaXMgYWN0aXZhdGVkICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgcGlja2VyTW9tZW50Q2hhbmdlOiBFdmVudEVtaXR0ZXI8VD4gPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KClcblxuICAgIC8qKiBFbWl0cyB3aGVuIHVzZSBrZXlib2FyZCBlbnRlciB0byBzZWxlY3QgYSBjYWxlbmRhciBjZWxsICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkga2V5Ym9hcmRFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKVxuXG4gICAgLyoqIFRoZSBib2R5IG9mIGNhbGVuZGFyIHRhYmxlICovXG4gICAgQFZpZXdDaGlsZChDYWxlbmRhckJvZHlDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBjYWxlbmRhckJvZHlFbG0/OiBDYWxlbmRhckJvZHlDb21wb25lbnRcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm54dC1kdC1jYWxlbmRhci12aWV3JylcbiAgICBnZXQgY2FsZW5kYXJWaWV3KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm54dC1kdC1jYWxlbmRhci1tdWx0aS15ZWFyLXZpZXcnKVxuICAgIGdldCBjYWxlbmRhck11bHRpWWVhclZpZXcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHBpY2tlckludGw6IERhdGVUaW1lSW50bCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkYXRlVGltZUFkYXB0ZXI6IERhdGVUaW1lQWRhcHRlcjxUPlxuICAgICkgeyB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RvZGF5WWVhciA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5kYXRlVGltZUFkYXB0ZXIubm93KCkpXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVZZWFyTGlzdCgpXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkID0gdHJ1ZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBhIGNhbGVuZGFyQ2VsbCBzZWxlY3RlZFxuICAgICAqL1xuICAgIHNlbGVjdENhbGVuZGFyQ2VsbChjZWxsOiBDYWxlbmRhckNlbGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RZZWFyKGNlbGwudmFsdWUpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RZZWFyKHllYXI6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnllYXJTZWxlY3RlZC5lbWl0KHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgMCwgMSkpXG4gICAgICAgIGNvbnN0IGZpcnN0RGF0ZU9mTW9udGggPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKFxuICAgICAgICAgICAgeWVhcixcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKHRoaXMucGlja2VyTW9tZW50KSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKGZpcnN0RGF0ZU9mTW9udGgpXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgICAgIHllYXIsXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRNb250aCh0aGlzLnBpY2tlck1vbWVudCksXG4gICAgICAgICAgICBNYXRoLm1pbihkYXlzSW5Nb250aCwgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLnBpY2tlck1vbWVudCkpLFxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0SG91cnModGhpcy5waWNrZXJNb21lbnQpLFxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TWludXRlcyh0aGlzLnBpY2tlck1vbWVudCksXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRTZWNvbmRzKHRoaXMucGlja2VyTW9tZW50KVxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdChzZWxlY3RlZClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSB0aGUgcHJldmlvdXMgeWVhciBsaXN0XG4gICAgICovXG4gICAgcHJldlllYXJMaXN0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcGlja2VyTW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLnBpY2tlck1vbWVudCwgLTEgKiBZRUFSX1JPV1MgKiBZRUFSU19QRVJfUk9XKVxuICAgICAgICB0aGlzLmdlbmVyYXRlWWVhckxpc3QoKVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIG5leHQgeWVhciBsaXN0XG4gICAgICovXG4gICAgbmV4dFllYXJMaXN0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcGlja2VyTW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLnBpY2tlck1vbWVudCwgWUVBUl9ST1dTICogWUVBUlNfUEVSX1JPVylcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVllYXJMaXN0KClcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cblxuICAgIGdlbmVyYXRlWWVhckxpc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3llYXJzID0gW11cblxuICAgICAgICBjb25zdCBwaWNrZXJNb21lbnRZZWFyID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9waWNrZXJNb21lbnQpXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHBpY2tlck1vbWVudFllYXIgJSAoWUVBUlNfUEVSX1JPVyAqIFlFQVJfUk9XUylcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFlFQVJfUk9XUzsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBbXVxuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IFlFQVJTX1BFUl9ST1c7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHllYXIgPSBwaWNrZXJNb21lbnRZZWFyIC0gb2Zmc2V0ICsgKGogKyBpICogWUVBUlNfUEVSX1JPVylcbiAgICAgICAgICAgICAgICBjb25zdCB5ZWFyQ2VsbCA9IHRoaXMuY3JlYXRlWWVhckNlbGwoeWVhcilcbiAgICAgICAgICAgICAgICByb3cucHVzaCh5ZWFyQ2VsbClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5feWVhcnMucHVzaChyb3cpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5cblxuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBwcmV2aW91cyBwZXJpb2QgYnV0dG9uIGlzIGVuYWJsZWQgKi9cbiAgICBwcmV2aW91c0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5taW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0aGlzLm1pbiB8fCAhdGhpcy5pc1NhbWVZZWFyTGlzdCh0aGlzLl9waWNrZXJNb21lbnQsIHRoaXMubWluKVxuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBuZXh0IHBlcmlvZCBidXR0b24gaXMgZW5hYmxlZCAqL1xuICAgIG5leHRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMubWF4IHx8ICF0aGlzLmlzU2FtZVllYXJMaXN0KHRoaXMuX3BpY2tlck1vbWVudCwgdGhpcy5tYXgpXG4gICAgfVxuXG4gICAgaGFuZGxlQ2FsZW5kYXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGxldCBtb21lbnRcbiAgICAgICAgc3dpdGNoIChldmVudC5jb2RlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIC8vIG1pbnVzIDEgeWVhclxuICAgICAgICAgICAgY2FzZSAnYXJyb3dsZWZ0JzpcbiAgICAgICAgICAgICAgICBtb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX3BpY2tlck1vbWVudCwgLTEpXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpXG4gICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgLy8gYWRkIDEgeWVhclxuICAgICAgICAgICAgY2FzZSAnYXJyb3dyaWdodCc6XG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9waWNrZXJNb21lbnQsIDEpXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpXG4gICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgLy8gbWludXMgMyB5ZWFyc1xuICAgICAgICAgICAgY2FzZSAnYXJyb3d1cCc6XG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9waWNrZXJNb21lbnQsIC0xICogWUVBUlNfUEVSX1JPVylcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcbiAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICAvLyBhZGQgMyB5ZWFyc1xuICAgICAgICAgICAgY2FzZSAnYXJyb3dkb3duJzpcbiAgICAgICAgICAgICAgICBtb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX3BpY2tlck1vbWVudCwgWUVBUlNfUEVSX1JPVylcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcbiAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICAvLyBnbyB0byB0aGUgZmlyc3QgeWVhciBvZiB0aGUgeWVhciBwYWdlXG4gICAgICAgICAgICBjYXNlICdob21lJzpcbiAgICAgICAgICAgICAgICBtb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX3BpY2tlck1vbWVudCxcbiAgICAgICAgICAgICAgICAgICAgLXRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5fcGlja2VyTW9tZW50KSAlIChZRUFSU19QRVJfUk9XICogWUVBUl9ST1dTKSlcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcbiAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICAvLyBnbyB0byB0aGUgbGFzdCB5ZWFyIG9mIHRoZSB5ZWFyIHBhZ2VcbiAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgbW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9waWNrZXJNb21lbnQsXG4gICAgICAgICAgICAgICAgICAgIChZRUFSU19QRVJfUk9XICogWUVBUl9ST1dTKSAtIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5fcGlja2VyTW9tZW50KSAlIChZRUFSU19QRVJfUk9XICogWUVBUl9ST1dTKSAtIDEpXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnRDaGFuZ2UuZW1pdChtb21lbnQpXG4gICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgLy8gbWludXMgMSB5ZWFyIHBhZ2UgKG9yIDEwIHllYXIgcGFnZXMpXG4gICAgICAgICAgICBjYXNlICdwYWdldXAnOlxuICAgICAgICAgICAgICAgIG1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5waWNrZXJNb21lbnQsIGV2ZW50LmFsdEtleSA/IC0xMCAqIChZRUFSU19QRVJfUk9XICogWUVBUl9ST1dTKSA6IC0xICogKFlFQVJTX1BFUl9ST1cgKiBZRUFSX1JPV1MpKVxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyTW9tZW50Q2hhbmdlLmVtaXQobW9tZW50KVxuICAgICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIC8vIGFkZCAxIHllYXIgcGFnZSAob3IgMTAgeWVhciBwYWdlcylcbiAgICAgICAgICAgIGNhc2UgJ3BhZ2Vkb3duJzpcbiAgICAgICAgICAgICAgICBtb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMucGlja2VyTW9tZW50LCBldmVudC5hbHRLZXkgPyAxMCAqIChZRUFSU19QRVJfUk9XICogWUVBUl9ST1dTKSA6IChZRUFSU19QRVJfUk9XICogWUVBUl9ST1dTKSlcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlck1vbWVudENoYW5nZS5lbWl0KG1vbWVudClcbiAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdlbnRlcic6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RZZWFyKHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5fcGlja2VyTW9tZW50KSlcbiAgICAgICAgICAgICAgICB0aGlzLmtleWJvYXJkRW50ZXIuZW1pdCgpXG4gICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmVDZWxsKClcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gQ2FsZW5kYXJDZWxsIGZvciB0aGUgZ2l2ZW4geWVhci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVllYXJDZWxsKHllYXI6IG51bWJlcik6IENhbGVuZGFyQ2VsbCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZU9mWWVhciA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgMCwgMSlcbiAgICAgICAgY29uc3QgYXJpYUxhYmVsID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhck5hbWUoc3RhcnREYXRlT2ZZZWFyKVxuICAgICAgICBjb25zdCBjZWxsQ2xhc3MgPSAnbnh0LWR0LXllYXItJyArIHllYXJcbiAgICAgICAgcmV0dXJuIG5ldyBDYWxlbmRhckNlbGwoeWVhciwgeWVhci50b1N0cmluZygpLCBhcmlhTGFiZWwsIHRoaXMuaXNZZWFyRW5hYmxlZCh5ZWFyKSwgZmFsc2UsIGNlbGxDbGFzcylcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFNlbGVjdGVkWWVhcnMoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRZZWFycyA9IFtdXG5cbiAgICAgICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUgJiYgdGhpcy5zZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRZZWFyc1swXSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5zZWxlY3RlZClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUgJiYgdGhpcy5zZWxlY3RlZHMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkWWVhcnMgPSB0aGlzLnNlbGVjdGVkcy5tYXAoKHNlbGVjdGVkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQoc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHNlbGVjdGVkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogV2hldGhlciB0aGUgZ2l2ZW4geWVhciBpcyBlbmFibGVkICovXG4gICAgcHJpdmF0ZSBpc1llYXJFbmFibGVkKHllYXI6IG51bWJlcikge1xuXG4gICAgICAgIC8vIGVuYWJsZSBpZiBpdCByZWFjaGVzIGhlcmUgYW5kIHRoZXJlJ3Mgbm8gZmlsdGVyIGRlZmluZWRcbiAgICAgICAgaWYgKCF0aGlzLmRhdGVUaW1lRmlsdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RPZlllYXIgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIDAsIDEpXG5cbiAgICAgICAgLy8gSWYgYW55IGRhdGUgaW4gdGhlIHllYXIgaXMgZW5hYmxlZCBjb3VudCB0aGUgeWVhciBhcyBlbmFibGVkLlxuICAgICAgICBmb3IgKGxldCBkYXRlID0gZmlyc3RPZlllYXI7IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIoZGF0ZSkgPT0geWVhcjtcbiAgICAgICAgICAgIGRhdGUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5hZGRDYWxlbmRhckRheXMoZGF0ZSwgMSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGVUaW1lRmlsdGVyKGRhdGUsICd5ZWFyJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1NhbWVZZWFyTGlzdChkYXRlMT86IFQsIGRhdGUyPzogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLmRhdGVUaW1lQWRhcHRlci5nZXRZZWFyKGRhdGUxKSAvIChZRUFSU19QRVJfUk9XICogWUVBUl9ST1dTKSkgPT09XG4gICAgICAgICAgICBNYXRoLmZsb29yKHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIoZGF0ZTIpIC8gKFlFQVJTX1BFUl9ST1cgKiBZRUFSX1JPV1MpKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHZhbGlkIGRhdGUgb2JqZWN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRWYWxpZERhdGUob2JqOiBhbnkpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmRhdGVUaW1lQWRhcHRlci5pc0RhdGVJbnN0YW5jZShvYmopICYmIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQob2JqKSlcbiAgICAgICAgICAgID8gb2JqXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNBY3RpdmVDZWxsKCkge1xuICAgICAgICB0aGlzLmNhbGVuZGFyQm9keUVsbT8uZm9jdXNBY3RpdmVDZWxsKClcbiAgICB9XG59XG4iLCI8YnV0dG9uIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wtYnV0dG9uIG54dC1kdC1jb250cm9sLWFycm93LWJ1dHRvblwiXG4gICAgW2Rpc2FibGVkXT1cIiFwcmV2aW91c0VuYWJsZWQoKVwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwcmV2QnV0dG9uTGFiZWxcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHRhYmluZGV4PVwiMFwiXG4gICAgKGNsaWNrKT1cInByZXZZZWFyTGlzdCgkZXZlbnQpXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udHJvbC1idXR0b24tY29udGVudFwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgPCEtLSA8ZWRpdG9yLWZvbGQgZGVzYz1cIlNWRyBBcnJvdyBMZWZ0XCI+IC0tPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiAgICAgICAgICAgIHZlcnNpb249XCIxLjFcIlxuICAgICAgICAgICAgeD1cIjBweFwiXG4gICAgICAgICAgICB5PVwiMHB4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjUwLjczOCAyNTAuNzM4XCJcbiAgICAgICAgICAgIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNTAuNzM4IDI1MC43Mzg7XCJcbiAgICAgICAgICAgIHhtbDpzcGFjZT1cInByZXNlcnZlXCJcbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxMDAlXCI+XG4gICAgICAgICAgICA8cGF0aCBzdHlsZT1cImZpbGwtcnVsZTogZXZlbm9kZDsgY2xpcC1ydWxlOiBldmVub2RkO1wiXG4gICAgICAgICAgICAgICAgZD1cIk05Ni42MzMsMTI1LjM2OWw5NS4wNTMtOTQuNTMzYzcuMTAxLTcuMDU1LDcuMTAxLTE4LjQ5MiwwLTI1LjU0NiAgIGMtNy4xLTcuMDU0LTE4LjYxMy03LjA1NC0yNS43MTQsMEw1OC45ODksMTExLjY4OWMtMy43ODQsMy43NTktNS40ODcsOC43NTktNS4yMzgsMTMuNjhjLTAuMjQ5LDQuOTIyLDEuNDU0LDkuOTIxLDUuMjM4LDEzLjY4MSAgIGwxMDYuOTgzLDEwNi4zOThjNy4xMDEsNy4wNTUsMTguNjEzLDcuMDU1LDI1LjcxNCwwYzcuMTAxLTcuMDU0LDcuMTAxLTE4LjQ5MSwwLTI1LjU0NEw5Ni42MzMsMTI1LjM2OXpcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPCEtLSA8L2VkaXRvci1mb2xkPiAtLT5cbiAgICA8L3NwYW4+XG48L2J1dHRvbj5cbjx0YWJsZSBjbGFzcz1cIm54dC1kdC1jYWxlbmRhci10YWJsZSBueHQtZHQtY2FsZW5kYXItbXVsdGkteWVhci10YWJsZVwiPlxuICAgIDx0aGVhZCBjbGFzcz1cIm54dC1kdC1jYWxlbmRhci1oZWFkZXJcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIGNvbHNwYW49XCIzXCI+e3t0YWJsZUhlYWRlcn19PC90aD5cbiAgICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keSBueHREYXRlVGltZUNhbGVuZGFyQm9keVxuICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgIFtyb3dzXT1cInllYXJzXCJcbiAgICAgICAgW251bUNvbHNdPVwiM1wiXG4gICAgICAgIFtjZWxsUmF0aW9dPVwiMyAvIDdcIlxuICAgICAgICBbYWN0aXZlQ2VsbF09XCJhY3RpdmVDZWxsID8/IDBcIlxuICAgICAgICBbdG9kYXlWYWx1ZV09XCJ0b2RheVllYXJcIlxuICAgICAgICBbc2VsZWN0ZWRWYWx1ZXNdPVwic2VsZWN0ZWRZZWFyc1wiXG4gICAgICAgIFtzZWxlY3RNb2RlXT1cInNlbGVjdE1vZGVcIlxuICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVDYWxlbmRhcktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgIChzZWxlY3QpPVwic2VsZWN0Q2FsZW5kYXJDZWxsKCRldmVudClcIj48L3Rib2R5PlxuPC90YWJsZT5cbjxidXR0b24gY2xhc3M9XCJueHQtZHQtY29udHJvbC1idXR0b24gbnh0LWR0LWNvbnRyb2wtYXJyb3ctYnV0dG9uXCJcbiAgICBbZGlzYWJsZWRdPVwiIW5leHRFbmFibGVkKClcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibmV4dEJ1dHRvbkxhYmVsXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0YWJpbmRleD1cIjBcIlxuICAgIChjbGljayk9XCJuZXh0WWVhckxpc3QoJGV2ZW50KVwiPlxuICAgIDxzcGFuIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wtYnV0dG9uLWNvbnRlbnRcIlxuICAgICAgICB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgIDwhLS0gPGVkaXRvci1mb2xkIGRlc2M9XCJTVkcgQXJyb3cgUmlnaHRcIj4gLS0+XG4gICAgICAgIDxzdmcgdmVyc2lvbj1cIjEuMVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG4gICAgICAgICAgICB4PVwiMHB4XCJcbiAgICAgICAgICAgIHk9XCIwcHhcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNTAuNzM4IDI1MC43MzhcIlxuICAgICAgICAgICAgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI1MC43MzggMjUwLjczODtcIlxuICAgICAgICAgICAgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cbiAgICAgICAgICAgIDxwYXRoIHN0eWxlPVwiZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7XCJcbiAgICAgICAgICAgICAgICBkPVwiTTE5MS43NSwxMTEuNjg5TDg0Ljc2Niw1LjI5MWMtNy4xLTcuMDU1LTE4LjYxMy03LjA1NS0yNS43MTMsMFxuICAgICAgICAgICAgICAgIGMtNy4xMDEsNy4wNTQtNy4xMDEsMTguNDksMCwyNS41NDRsOTUuMDUzLDk0LjUzNGwtOTUuMDUzLDk0LjUzM2MtNy4xMDEsNy4wNTQtNy4xMDEsMTguNDkxLDAsMjUuNTQ1XG4gICAgICAgICAgICAgICAgYzcuMSw3LjA1NCwxOC42MTMsNy4wNTQsMjUuNzEzLDBMMTkxLjc1LDEzOS4wNWMzLjc4NC0zLjc1OSw1LjQ4Ny04Ljc1OSw1LjIzOC0xMy42ODFcbiAgICAgICAgICAgICAgICBDMTk3LjIzNywxMjAuNDQ3LDE5NS41MzQsMTE1LjQ0OCwxOTEuNzUsMTExLjY4OXpcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPCEtLSA8L2VkaXRvci1mb2xkPiAtLT5cbiAgICA8L3NwYW4+XG48L2J1dHRvbj5cbiJdfQ==
|