@libs-ui/components-datetime-picker 0.1.1-1
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/README.md +3 -0
- package/custom-ranges/calendar/calendar.component.d.ts +141 -0
- package/custom-ranges/custom-ranges.component.d.ts +62 -0
- package/defines/calendar.define.d.ts +13 -0
- package/defines/common-date.define.d.ts +2 -0
- package/defines/date-options.define.d.ts +19 -0
- package/esm2022/custom-ranges/calendar/calendar.component.mjs +1287 -0
- package/esm2022/custom-ranges/custom-ranges.component.mjs +307 -0
- package/esm2022/defines/calendar.define.mjs +135 -0
- package/esm2022/defines/common-date.define.mjs +4 -0
- package/esm2022/defines/date-options.define.mjs +53 -0
- package/esm2022/index.mjs +5 -0
- package/esm2022/interfaces/calendar-emit.interface.mjs +2 -0
- package/esm2022/interfaces/calendar-variables.interface.mjs +6 -0
- package/esm2022/interfaces/function-control.interface.mjs +2 -0
- package/esm2022/interfaces/index.mjs +7 -0
- package/esm2022/interfaces/picker.interface.mjs +2 -0
- package/esm2022/interfaces/time-variables.interface.mjs +2 -0
- package/esm2022/interfaces/valid.interface.mjs +2 -0
- package/esm2022/libs-ui-components-datetime-picker.mjs +5 -0
- package/esm2022/picker.component.mjs +247 -0
- package/fesm2022/libs-ui-components-datetime-picker.mjs +2024 -0
- package/fesm2022/libs-ui-components-datetime-picker.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/interfaces/calendar-emit.interface.d.ts +25 -0
- package/interfaces/calendar-variables.interface.d.ts +80 -0
- package/interfaces/function-control.interface.d.ts +12 -0
- package/interfaces/index.d.ts +6 -0
- package/interfaces/picker.interface.d.ts +26 -0
- package/interfaces/time-variables.interface.d.ts +36 -0
- package/interfaces/valid.interface.d.ts +5 -0
- package/package.json +35 -0
- package/picker.component.d.ts +89 -0
|
@@ -0,0 +1,1287 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, model, output, signal, untracked, viewChild } from '@angular/core';
|
|
4
|
+
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
5
|
+
import { LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';
|
|
6
|
+
import { LibsUiComponentsInputsInputComponent } from '@libs-ui/components-inputs-input';
|
|
7
|
+
import { getDayjs, isEmpty, set } from '@libs-ui/utils';
|
|
8
|
+
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
9
|
+
import dayjs from 'dayjs';
|
|
10
|
+
import isoWeek from 'dayjs/plugin/isoWeek';
|
|
11
|
+
import { getMonthsDetailById, getMonthsListConfig, getYearsDetailById, getYearsListConfig } from '../../defines/calendar.define';
|
|
12
|
+
import { DEFAULT_MAX_YEAR, DEFAULT_MIN_YEAR } from '../../defines/common-date.define';
|
|
13
|
+
import { defaultLocaleConfig, getDateOptions } from '../../defines/date-options.define';
|
|
14
|
+
import { SideEnum } from '../../interfaces/calendar-variables.interface';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "@ngx-translate/core";
|
|
17
|
+
dayjs.extend(isoWeek);
|
|
18
|
+
export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
|
|
19
|
+
/** PROPERTY */
|
|
20
|
+
sideEnum = SideEnum;
|
|
21
|
+
calendarVariables = signal({ left: signal({}), right: signal({}) });
|
|
22
|
+
timepickerVariables = signal({ left: signal({ selectedHour: 0, selectedMinute: 0 }), right: signal({ selectedHour: 23, selectedMinute: 59 }) });
|
|
23
|
+
disableMonth = signal({ left: signal([]), right: signal([]) });
|
|
24
|
+
today = signal(getDayjs());
|
|
25
|
+
listKeyFromSelected = signal({ month: undefined, year: undefined });
|
|
26
|
+
listKeyToSelected = signal({ month: undefined, year: undefined });
|
|
27
|
+
checkShowListDropdown = signal({});
|
|
28
|
+
selectedQuickRange = signal('');
|
|
29
|
+
leftCalendar = signal({});
|
|
30
|
+
rightCalendar = signal({});
|
|
31
|
+
listMonthsConfig = signal(undefined);
|
|
32
|
+
monthHttpDetailConfig = signal(getMonthsDetailById());
|
|
33
|
+
listLeftYearConfig = signal(undefined);
|
|
34
|
+
listRightYearConfig = signal(undefined);
|
|
35
|
+
listYearConfig = signal(undefined);
|
|
36
|
+
leftYearHttpDetailConfig = signal(undefined);
|
|
37
|
+
rightYearHttpDetailConfig = signal(undefined);
|
|
38
|
+
timePickerError = signal(false);
|
|
39
|
+
computedDisplayTimeLeft = computed(() => this.computedDisplayTime({ selectedHour: this.timepickerValueItem().lefthour(), selectedMinute: this.timepickerValueItem().leftminute() }));
|
|
40
|
+
computedDisplayTimeRight = computed(() => this.computedDisplayTime({ selectedHour: this.timepickerValueItem().righthour(), selectedMinute: this.timepickerValueItem().rightminute() }));
|
|
41
|
+
computedDisplayTimeLeftInputHour = computed(() => this.computedDisplayTimeInput(SideEnum.left, 'hour'));
|
|
42
|
+
computedDisplayTimeLeftInputMinute = computed(() => this.computedDisplayTimeInput(SideEnum.left, 'minute'));
|
|
43
|
+
computedDisplayTimeRightInputHour = computed(() => this.computedDisplayTimeInput(SideEnum.right, 'hour'));
|
|
44
|
+
computedDisplayTimeRightInputMinute = computed(() => this.computedDisplayTimeInput(SideEnum.right, 'minute'));
|
|
45
|
+
timepickerValueItem = signal({ lefthour: signal(0), leftminute: signal(0), righthour: signal(0), rightminute: signal(0) });
|
|
46
|
+
functionControls = new Map();
|
|
47
|
+
pickingDate = signal(false);
|
|
48
|
+
isShown = signal(false);
|
|
49
|
+
nowHoveredDate = signal(null);
|
|
50
|
+
timePickerIncrement = signal(1);
|
|
51
|
+
selectedLabel = signal(undefined);
|
|
52
|
+
keyCodeBackspace = signal(false);
|
|
53
|
+
checkBackspaceFocus = signal({ lefthour: signal(1), leftminute: signal(1), righthour: signal(1), rightminute: signal(1) });
|
|
54
|
+
isZero = signal(undefined);
|
|
55
|
+
oldDate = signal({ start: dayjs(0), end: dayjs(0) });
|
|
56
|
+
isSelectedData = signal({ leftmonth: false, leftyear: false, rightmonth: false, rightyear: false });
|
|
57
|
+
splitPickerDate = signal({ start: signal({ month: 0, year: 0, day: 0, hour: 0, minute: 0 }), end: signal({ month: 0, year: 0, day: 0, hour: 23, minute: 59 }) });
|
|
58
|
+
/** INPUT */
|
|
59
|
+
quickRangesArray = input([]);
|
|
60
|
+
zIndex = input(1200, { transform: (value) => value ?? 1200 });
|
|
61
|
+
classInclude = input('');
|
|
62
|
+
isSingle = input(false);
|
|
63
|
+
showDropdownsSelect = input(true);
|
|
64
|
+
hasTimePicker = input(true);
|
|
65
|
+
flagMouse = input({ isMouseEnter: false, isMouseEnterContent: false });
|
|
66
|
+
dateOptions = input({ ...defaultLocaleConfig(), ...getDateOptions() });
|
|
67
|
+
autoApply = input(false);
|
|
68
|
+
hasSecondPicker = input(false);
|
|
69
|
+
showRangeLabelOnInput = input(undefined);
|
|
70
|
+
startDate = model(getDayjs().startOf('day'));
|
|
71
|
+
endDate = model(getDayjs().endOf('day'));
|
|
72
|
+
minDate = input(undefined, { transform: this.transformMinMaxDate.bind(this) });
|
|
73
|
+
maxDate = input(undefined, { transform: this.transformMinMaxDate.bind(this) });
|
|
74
|
+
listYearHiddenInputSearch = input(true, { transform: (value) => value ?? true });
|
|
75
|
+
/** OUTPUT */
|
|
76
|
+
outChangStageFlagMouse = output();
|
|
77
|
+
// readonly outStartDateChanged = output<{ startDate: Dayjs | undefined }>();
|
|
78
|
+
// readonly outEndDateChanged = output<{ endDate: Dayjs | undefined }>();
|
|
79
|
+
outPickerDate = output();
|
|
80
|
+
// readonly outRangeClicked: EventEmitter<IRangesClicked> = new EventEmitter();
|
|
81
|
+
outCancel = output();
|
|
82
|
+
outUpdateWidth = output();
|
|
83
|
+
outFunctionsControl = output();
|
|
84
|
+
/** INJECTION */
|
|
85
|
+
translate = inject(TranslateService);
|
|
86
|
+
pickerContainer = viewChild('pickerContainer');
|
|
87
|
+
constructor() {
|
|
88
|
+
this.listMonthsConfig.set(getMonthsListConfig(this.translate));
|
|
89
|
+
effect(() => {
|
|
90
|
+
const oldStart = getDayjs({ date: this.startDate()?.clone() });
|
|
91
|
+
const oldEnd = getDayjs({ date: this.endDate()?.clone() });
|
|
92
|
+
untracked(() => {
|
|
93
|
+
this.oldDate.set({ start: oldStart, end: oldEnd });
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
ngOnInit() {
|
|
98
|
+
const startDate = getDayjs({ date: this.startDate()?.clone() });
|
|
99
|
+
const endDate = getDayjs({ date: this.endDate()?.clone() });
|
|
100
|
+
this.splitPickerDate.update((current) => {
|
|
101
|
+
current.start.update((sideCurrent) => {
|
|
102
|
+
sideCurrent.day = (startDate ?? getDayjs().startOf('day')).date();
|
|
103
|
+
return sideCurrent;
|
|
104
|
+
});
|
|
105
|
+
current.end.update((sideCurrent) => {
|
|
106
|
+
sideCurrent.day = (endDate ?? getDayjs().endOf('day')).date();
|
|
107
|
+
return sideCurrent;
|
|
108
|
+
});
|
|
109
|
+
return current;
|
|
110
|
+
});
|
|
111
|
+
if (startDate) {
|
|
112
|
+
this.updateElement();
|
|
113
|
+
}
|
|
114
|
+
if (startDate && this.hasTimePicker()) {
|
|
115
|
+
this.setStartDate(startDate);
|
|
116
|
+
this.renderTimePicker(SideEnum.left);
|
|
117
|
+
}
|
|
118
|
+
if (endDate && this.hasTimePicker()) {
|
|
119
|
+
this.setEndDate(endDate);
|
|
120
|
+
this.renderTimePicker(SideEnum.right);
|
|
121
|
+
}
|
|
122
|
+
this.buildConfigYear(SideEnum.left);
|
|
123
|
+
this.buildConfigYear(SideEnum.right, startDate?.year());
|
|
124
|
+
this.updateMonthsInView();
|
|
125
|
+
this.renderCalendar(SideEnum.left);
|
|
126
|
+
if ((getDayjs({ date: this.maxDate() })?.year() ?? DEFAULT_MAX_YEAR) < (startDate?.year() || 0)) {
|
|
127
|
+
this.handlerSelectedDropdown({ key: getDayjs({ date: this.maxDate() })?.year() }, SideEnum.left + 'year');
|
|
128
|
+
}
|
|
129
|
+
if (!this.isSingle()) {
|
|
130
|
+
this.renderCalendar(SideEnum.right);
|
|
131
|
+
if ((getDayjs({ date: this.maxDate() })?.year() ?? DEFAULT_MAX_YEAR) < (endDate?.year() || 0)) {
|
|
132
|
+
this.handlerSelectedDropdown({ key: getDayjs({ date: this.maxDate() })?.year() }, SideEnum.right + 'year');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// this.renderRanges();
|
|
136
|
+
this.formatMonthYear();
|
|
137
|
+
this.outUpdateWidth.emit(1);
|
|
138
|
+
this.updateElement();
|
|
139
|
+
this.timepickerValueItem.set({
|
|
140
|
+
lefthour: signal(this.timepickerVariables().left().selectedHour),
|
|
141
|
+
righthour: signal(this.timepickerVariables().right().selectedHour),
|
|
142
|
+
leftminute: signal(this.timepickerVariables().left().selectedMinute),
|
|
143
|
+
rightminute: signal(this.timepickerVariables().right().selectedMinute),
|
|
144
|
+
});
|
|
145
|
+
// this.outFunctionsControl.emit({ buildDefaultRange: this.buildDefaultRange.bind(this), applyToSelect: this.applyToSelect.bind(this) })
|
|
146
|
+
}
|
|
147
|
+
buildConfigYear(side, startYear) {
|
|
148
|
+
const minDate = getDayjs({ date: this.minDate() });
|
|
149
|
+
const maxDate = getDayjs({ date: this.maxDate() });
|
|
150
|
+
const listLeftYear = [];
|
|
151
|
+
const listRightYear = [];
|
|
152
|
+
if (side === SideEnum.left) {
|
|
153
|
+
const start = maxDate?.year() ?? DEFAULT_MAX_YEAR;
|
|
154
|
+
const end = minDate?.year() ?? DEFAULT_MIN_YEAR;
|
|
155
|
+
for (let i = start; i >= end; i--) {
|
|
156
|
+
listLeftYear.push({
|
|
157
|
+
id: i,
|
|
158
|
+
label: `${i}`,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
this.listLeftYearConfig.set(getYearsListConfig(listLeftYear));
|
|
162
|
+
this.leftYearHttpDetailConfig.set(getYearsDetailById(listLeftYear));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const start = maxDate?.year() ?? DEFAULT_MAX_YEAR;
|
|
166
|
+
const end = startYear ?? minDate?.year() ?? getDayjs().year();
|
|
167
|
+
for (let i = start; i >= end; i--) {
|
|
168
|
+
listRightYear.push({
|
|
169
|
+
id: i,
|
|
170
|
+
label: `${i}`,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
this.listRightYearConfig.set(getYearsListConfig(listRightYear));
|
|
174
|
+
this.rightYearHttpDetailConfig.set(getYearsDetailById(listRightYear));
|
|
175
|
+
}
|
|
176
|
+
handlerChangeFlagMouse(flagMouse) {
|
|
177
|
+
this.outChangStageFlagMouse.emit(flagMouse);
|
|
178
|
+
}
|
|
179
|
+
updateStartEndDate(date) {
|
|
180
|
+
date = getDayjs({ date });
|
|
181
|
+
if (this.endDate() || date.isBefore(getDayjs({ date: this.startDate() }), 'day')) {
|
|
182
|
+
if (this.hasTimePicker()) {
|
|
183
|
+
date = this.getDateWithTime(date, SideEnum.left);
|
|
184
|
+
}
|
|
185
|
+
this.endDate.set(undefined);
|
|
186
|
+
this.setStartDate(getDayjs({ date: date.clone() }));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (!this.endDate() && this.startDate() && date.isBefore(getDayjs({ date: this.startDate() }))) {
|
|
190
|
+
this.setEndDate(getDayjs({ date: this.startDate()?.clone() }));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (this.hasTimePicker()) {
|
|
194
|
+
date = getDayjs({ date: this.getDateWithTime(date, SideEnum.right) });
|
|
195
|
+
}
|
|
196
|
+
if (!date.isBefore(getDayjs({ date: this.startDate() }), 'day')) {
|
|
197
|
+
this.setEndDate(getDayjs({ date: date.clone() }));
|
|
198
|
+
}
|
|
199
|
+
if (this.autoApply()) {
|
|
200
|
+
this.calculateSelectedLabel();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
calculateSelectedLabel() {
|
|
204
|
+
this.updateElement();
|
|
205
|
+
}
|
|
206
|
+
formatMonthYear() {
|
|
207
|
+
const month = (this.calendarVariables().left().dropdowns?.()?.currentMonth ?? 0) + 1;
|
|
208
|
+
this.listKeyFromSelected.update((current) => {
|
|
209
|
+
current.month = month;
|
|
210
|
+
current.year = this.calendarVariables().left().dropdowns?.()?.currentYear;
|
|
211
|
+
return current;
|
|
212
|
+
});
|
|
213
|
+
if (this.isSingle()) {
|
|
214
|
+
this.isSelectedData.set({ leftmonth: true, leftyear: true, rightmonth: true, rightyear: true });
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const rightMonth = (this.calendarVariables().right().dropdowns?.()?.currentMonth ?? 0) + 1;
|
|
218
|
+
this.listKeyToSelected.update((current) => {
|
|
219
|
+
current.month = rightMonth;
|
|
220
|
+
current.year = this.calendarVariables().right().dropdowns?.()?.currentYear;
|
|
221
|
+
return current;
|
|
222
|
+
});
|
|
223
|
+
this.isSelectedData.set({ leftmonth: true, leftyear: true, rightmonth: true, rightyear: true });
|
|
224
|
+
}
|
|
225
|
+
setStartDate(startDate) {
|
|
226
|
+
if (!this.startDate()) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (typeof startDate === 'string') {
|
|
230
|
+
this.startDate.set(getDayjs({ date: dayjs(startDate, this.dateOptions().format), returnDayjsIfConfigDateNotExist: true }));
|
|
231
|
+
}
|
|
232
|
+
if (typeof startDate === 'object') {
|
|
233
|
+
this.pickingDate.set(true);
|
|
234
|
+
this.startDate.set(getDayjs({ date: startDate, returnDayjsIfConfigDateNotExist: true }));
|
|
235
|
+
}
|
|
236
|
+
if (!this.hasTimePicker()) {
|
|
237
|
+
this.pickingDate.set(true);
|
|
238
|
+
this.startDate.set(getDayjs({ date: this.startDate()?.startOf('day') }));
|
|
239
|
+
}
|
|
240
|
+
this.setStartDateInTimePicker();
|
|
241
|
+
if (this.minDate() && this.startDate()?.isBefore(this.minDate())) {
|
|
242
|
+
this.startDate.set(getDayjs({ date: this.minDate() })?.clone());
|
|
243
|
+
this.setStartDateInTimePicker();
|
|
244
|
+
}
|
|
245
|
+
if (this.maxDate() && this.startDate()?.isAfter(this.maxDate())) {
|
|
246
|
+
this.startDate.set(getDayjs({ date: this.maxDate() })?.clone());
|
|
247
|
+
this.setStartDateInTimePicker();
|
|
248
|
+
}
|
|
249
|
+
if (!this.isShown()) {
|
|
250
|
+
this.updateElement();
|
|
251
|
+
}
|
|
252
|
+
// this.outStartDateChanged.emit({ startDate: this.startDate() });
|
|
253
|
+
this.updateMonthsInView();
|
|
254
|
+
}
|
|
255
|
+
setStartDateInTimePicker() {
|
|
256
|
+
if (!this.hasTimePicker() || !this.timePickerIncrement()) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
this.startDate.update((current) => {
|
|
260
|
+
if (!current) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
current.minute(Math.round(current.minute() / this.timePickerIncrement()) * this.timePickerIncrement());
|
|
264
|
+
return current;
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
setEndDate(endDate) {
|
|
268
|
+
if (typeof endDate === 'string') {
|
|
269
|
+
this.endDate.set(getDayjs({ date: dayjs(endDate, this.dateOptions().format), returnDayjsIfConfigDateNotExist: true }));
|
|
270
|
+
}
|
|
271
|
+
if (typeof endDate === 'object') {
|
|
272
|
+
this.pickingDate.set(false);
|
|
273
|
+
this.endDate.set(getDayjs({ date: dayjs(endDate), returnDayjsIfConfigDateNotExist: true }));
|
|
274
|
+
}
|
|
275
|
+
if (!this.endDate() || !this.startDate()) {
|
|
276
|
+
return this.updateMonthsInView();
|
|
277
|
+
}
|
|
278
|
+
if (!this.hasTimePicker()) {
|
|
279
|
+
this.pickingDate.set(false);
|
|
280
|
+
this.endDate.set(this.endDate()?.add(1, 'd').startOf('day').subtract(1, 'second'));
|
|
281
|
+
}
|
|
282
|
+
if (this.hasTimePicker() && this.timePickerIncrement()) {
|
|
283
|
+
this.endDate.update((current) => {
|
|
284
|
+
if (!current) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
current.minute(Math.round(current.minute() / this.timePickerIncrement()) * this.timePickerIncrement());
|
|
288
|
+
return current;
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
if (this.endDate()?.isBefore(this.startDate())) {
|
|
292
|
+
this.endDate.set(this.startDate()?.clone());
|
|
293
|
+
}
|
|
294
|
+
if (this.maxDate() && this.endDate()?.isAfter(this.maxDate())) {
|
|
295
|
+
this.endDate.set(getDayjs({ date: this.maxDate() })?.clone());
|
|
296
|
+
}
|
|
297
|
+
// this.outEndDateChanged.emit({ endDate: this.endDate() });
|
|
298
|
+
this.updateMonthsInView();
|
|
299
|
+
}
|
|
300
|
+
handlerHoverDate(event, side, row, col) {
|
|
301
|
+
event.stopPropagation();
|
|
302
|
+
const leftCalDate = this.calendarVariables().left().calendar?.[row][col];
|
|
303
|
+
const rightCalDate = this.calendarVariables().right().calendar?.[row][col];
|
|
304
|
+
if (!this.pickingDate || !rightCalDate || !leftCalDate) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
this.nowHoveredDate.set(side === SideEnum.left ? leftCalDate : rightCalDate);
|
|
308
|
+
this.renderCalendar(SideEnum.left);
|
|
309
|
+
this.renderCalendar(SideEnum.right);
|
|
310
|
+
}
|
|
311
|
+
getDisable(type) {
|
|
312
|
+
const minDate = getDayjs({ date: this.minDate() });
|
|
313
|
+
const maxDate = getDayjs({ date: this.maxDate() });
|
|
314
|
+
if (type === 'left') {
|
|
315
|
+
this.disableMonth().left.set([]);
|
|
316
|
+
if (minDate && minDate?.year() === this.listKeyFromSelected().year) {
|
|
317
|
+
for (let i = 1; i < minDate?.month() + 1; i++) {
|
|
318
|
+
this.disableMonth().left.update((current) => {
|
|
319
|
+
current.push(i);
|
|
320
|
+
return current;
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (maxDate && maxDate?.year() === this.listKeyFromSelected().year) {
|
|
325
|
+
for (let i = maxDate?.month() + 2; i < 13; i++) {
|
|
326
|
+
this.disableMonth().left.update((current) => {
|
|
327
|
+
current.push(i);
|
|
328
|
+
return current;
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
this.disableMonth().right.set([]);
|
|
335
|
+
if (minDate && minDate?.year() === this.listKeyToSelected().year) {
|
|
336
|
+
for (let i = 1; i < minDate?.month() + 1; i++) {
|
|
337
|
+
this.disableMonth().right.update((current) => {
|
|
338
|
+
current.push(i);
|
|
339
|
+
return current;
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (maxDate && maxDate?.year() === this.listKeyToSelected().year) {
|
|
344
|
+
for (let i = maxDate?.month() + 2; i < 13; i++) {
|
|
345
|
+
this.disableMonth().right.update((current) => {
|
|
346
|
+
current.push(i);
|
|
347
|
+
return current;
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (Number(this.listKeyFromSelected().year) === Number(this.listKeyToSelected().year)) {
|
|
352
|
+
for (let i = 1; i <= Number(this.listKeyFromSelected().month); i++) {
|
|
353
|
+
this.disableMonth().right.update((current) => {
|
|
354
|
+
current.push(i);
|
|
355
|
+
return current;
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
handlerClickPrev(side) {
|
|
361
|
+
if (side === SideEnum.left && this.leftCalendar().month) {
|
|
362
|
+
this.leftCalendar.update((current) => {
|
|
363
|
+
current.month = current.month?.subtract(1, 'month');
|
|
364
|
+
return current;
|
|
365
|
+
});
|
|
366
|
+
this.listKeyFromSelected.update((current) => {
|
|
367
|
+
current.month = (this.leftCalendar().month?.month() ?? 0) + 1;
|
|
368
|
+
current.year = this.leftCalendar().month?.year();
|
|
369
|
+
return current;
|
|
370
|
+
});
|
|
371
|
+
return this.updateCalendars();
|
|
372
|
+
}
|
|
373
|
+
this.rightCalendar.update((current) => {
|
|
374
|
+
current.month = current.month?.subtract(1, 'month');
|
|
375
|
+
return current;
|
|
376
|
+
});
|
|
377
|
+
this.listKeyToSelected.update((current) => {
|
|
378
|
+
current.month = (this.rightCalendar().month?.month() ?? 0) + 1;
|
|
379
|
+
current.year = this.rightCalendar().month?.year();
|
|
380
|
+
return current;
|
|
381
|
+
});
|
|
382
|
+
this.getDisable('right');
|
|
383
|
+
this.updateCalendars();
|
|
384
|
+
}
|
|
385
|
+
handlerClickNext(side) {
|
|
386
|
+
if (side === SideEnum.left) {
|
|
387
|
+
this.leftCalendar.update((current) => {
|
|
388
|
+
current.month = current.month?.add(1, 'month');
|
|
389
|
+
return current;
|
|
390
|
+
});
|
|
391
|
+
this.listKeyFromSelected.update((current) => {
|
|
392
|
+
current.month = (this.leftCalendar().month?.month() ?? 0) + 1;
|
|
393
|
+
current.year = this.leftCalendar().month?.year();
|
|
394
|
+
return current;
|
|
395
|
+
});
|
|
396
|
+
if (this.listKeyFromSelected().month === this.listKeyToSelected().month && this.listKeyFromSelected().year === this.listKeyToSelected().year) {
|
|
397
|
+
this.rightCalendar.update((current) => {
|
|
398
|
+
current.month = current.month?.add(1, 'month');
|
|
399
|
+
return current;
|
|
400
|
+
});
|
|
401
|
+
this.listKeyToSelected.update((current) => {
|
|
402
|
+
current.month = (this.rightCalendar().month?.month() ?? 0) + 1;
|
|
403
|
+
current.year = this.rightCalendar().month?.year();
|
|
404
|
+
return current;
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
this.getDisable('right');
|
|
408
|
+
return this.updateCalendars();
|
|
409
|
+
}
|
|
410
|
+
this.rightCalendar.update((current) => {
|
|
411
|
+
current.month = current.month?.add(1, 'month');
|
|
412
|
+
return current;
|
|
413
|
+
});
|
|
414
|
+
this.listKeyToSelected.update((current) => {
|
|
415
|
+
current.month = (this.rightCalendar().month?.month() ?? 0) + 1;
|
|
416
|
+
current.year = this.rightCalendar().month?.year();
|
|
417
|
+
return current;
|
|
418
|
+
});
|
|
419
|
+
this.updateCalendars();
|
|
420
|
+
}
|
|
421
|
+
handlerPickerDate(event, side, row, col) {
|
|
422
|
+
event.stopPropagation();
|
|
423
|
+
if (event.target?.tagName === 'TD') {
|
|
424
|
+
if (event.target.classList && !event.target.classList.contains('available')) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
if (event.target.tagName === 'SPAN') {
|
|
429
|
+
if (event.target.parentElement && event.target.parentElement.classList && !event.target.parentElement.classList.contains('available')) {
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
if (!this.dateOptions().customRangeLabel) {
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
if (this.quickRangesArray().length) {
|
|
437
|
+
this.selectedQuickRange.set(this.dateOptions().customRangeLabel);
|
|
438
|
+
}
|
|
439
|
+
const date = side === SideEnum.left ? this.leftCalendar().calendar?.[row][col] : this.rightCalendar().calendar?.[row][col];
|
|
440
|
+
if (!date) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
this.splitPickerDate.update((current) => {
|
|
444
|
+
current[side === SideEnum.left ? 'start' : 'end'].update((sideCurrent) => {
|
|
445
|
+
sideCurrent.day = date.date();
|
|
446
|
+
return sideCurrent;
|
|
447
|
+
});
|
|
448
|
+
return current;
|
|
449
|
+
});
|
|
450
|
+
this.updateStartEndDate(date);
|
|
451
|
+
if (this.isSingle() && this.startDate()) {
|
|
452
|
+
this.setEndDate(this.startDate());
|
|
453
|
+
this.updateElement();
|
|
454
|
+
if (this.autoApply()) {
|
|
455
|
+
this.handlerClickApply();
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
this.updateView();
|
|
459
|
+
if (this.autoApply() && this.startDate() && this.endDate()) {
|
|
460
|
+
this.handlerClickApply();
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
handlerClickApply(event) {
|
|
464
|
+
event?.stopPropagation();
|
|
465
|
+
// this.validate();
|
|
466
|
+
// if (!this.validate()) {
|
|
467
|
+
// return;
|
|
468
|
+
// }
|
|
469
|
+
if (this.hasTimePicker()) {
|
|
470
|
+
this.setTimeInput(SideEnum.left);
|
|
471
|
+
this.setTimeInput(SideEnum.right);
|
|
472
|
+
}
|
|
473
|
+
this.calculateSelectedLabel();
|
|
474
|
+
if (this.selectedLabel()) {
|
|
475
|
+
this.outPickerDate.emit({ displayLabel: this.selectedLabel(), startDate: this.startDate(), endDate: this.endDate(), detailDatePicker: this.splitPickerDate() });
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
handlerClickCancel(event) {
|
|
479
|
+
event.stopPropagation();
|
|
480
|
+
this.startDate.set(dayjs(0));
|
|
481
|
+
this.endDate.set(dayjs(0));
|
|
482
|
+
this.outCancel.emit('');
|
|
483
|
+
}
|
|
484
|
+
handlerFunctionControl(event, type) {
|
|
485
|
+
this.functionControls.set(type, event);
|
|
486
|
+
}
|
|
487
|
+
handlerSelectedDropdown(event, type) {
|
|
488
|
+
this.outChangStageFlagMouse.emit({
|
|
489
|
+
isMouseEnter: false,
|
|
490
|
+
isMouseEnterContent: false,
|
|
491
|
+
isContainerHasScroll: false,
|
|
492
|
+
});
|
|
493
|
+
if (!event) {
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
switch (type) {
|
|
497
|
+
case `${SideEnum.left}month`:
|
|
498
|
+
case `${SideEnum.right}month`:
|
|
499
|
+
this.updateMonthSelect(event, type);
|
|
500
|
+
break;
|
|
501
|
+
case `${SideEnum.left}year`:
|
|
502
|
+
case `${SideEnum.right}year`:
|
|
503
|
+
this.updateYearSelect(event, type);
|
|
504
|
+
break;
|
|
505
|
+
default:
|
|
506
|
+
break;
|
|
507
|
+
}
|
|
508
|
+
this.splitPickerDate.update((current) => {
|
|
509
|
+
if (type === `${SideEnum.left}month` || type === `${SideEnum.left}year`) {
|
|
510
|
+
current.start.update((start) => {
|
|
511
|
+
if (type === `${SideEnum.left}month`) {
|
|
512
|
+
start.month = event.key;
|
|
513
|
+
}
|
|
514
|
+
if (type === `${SideEnum.left}year`) {
|
|
515
|
+
start.year = event.key;
|
|
516
|
+
}
|
|
517
|
+
return start;
|
|
518
|
+
});
|
|
519
|
+
return current;
|
|
520
|
+
}
|
|
521
|
+
current.end.update((end) => {
|
|
522
|
+
if (type === `${SideEnum.right}month`) {
|
|
523
|
+
end.month = event.key;
|
|
524
|
+
}
|
|
525
|
+
if (type === `${SideEnum.right}year`) {
|
|
526
|
+
end.year = event.key;
|
|
527
|
+
}
|
|
528
|
+
return end;
|
|
529
|
+
});
|
|
530
|
+
return current;
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
updateMonthSelect(event, type) {
|
|
534
|
+
const side = type.includes(SideEnum.left) ? SideEnum.left : SideEnum.right;
|
|
535
|
+
const year = this.calendarVariables()[side]().dropdowns?.()?.currentYear || getDayjs().year();
|
|
536
|
+
const month = Number(event.key) - 1;
|
|
537
|
+
if (side === SideEnum.left) {
|
|
538
|
+
if (this.isSelectedData().leftmonth) {
|
|
539
|
+
this.isSelectedData.update((current) => {
|
|
540
|
+
current.leftmonth = false;
|
|
541
|
+
return current;
|
|
542
|
+
});
|
|
543
|
+
this.getDisable('right');
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
this.listKeyFromSelected.update((current) => {
|
|
547
|
+
current.month = event.key;
|
|
548
|
+
return current;
|
|
549
|
+
});
|
|
550
|
+
if (Number(event.key) >= Number(this.listKeyFromSelected().month) && Number(this.listKeyFromSelected().year) === Number(this.listKeyToSelected().year)) {
|
|
551
|
+
if (Number(event.key) <= 11) {
|
|
552
|
+
this.listKeyToSelected.update((current) => {
|
|
553
|
+
current.month = Number(event.key) + 1;
|
|
554
|
+
return current;
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
if (Number(event.key) === 12) {
|
|
558
|
+
this.listKeyToSelected.update((current) => {
|
|
559
|
+
current.month = 1;
|
|
560
|
+
current.year += 1;
|
|
561
|
+
return current;
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
if (side === SideEnum.right) {
|
|
567
|
+
if (this.isSelectedData().rightmonth) {
|
|
568
|
+
this.isSelectedData.update((current) => {
|
|
569
|
+
current.rightmonth = false;
|
|
570
|
+
return current;
|
|
571
|
+
});
|
|
572
|
+
this.getDisable('right');
|
|
573
|
+
return;
|
|
574
|
+
}
|
|
575
|
+
this.listKeyToSelected.update((current) => {
|
|
576
|
+
current.month = event.key;
|
|
577
|
+
return current;
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
this.functionControls.get(type)?.removeList();
|
|
581
|
+
this.getDisable('right');
|
|
582
|
+
this.monthOrYearChanged(month, year, side);
|
|
583
|
+
}
|
|
584
|
+
updateYearSelect(event, type) {
|
|
585
|
+
const side = type.includes(SideEnum.left) ? SideEnum.left : SideEnum.right;
|
|
586
|
+
if (side === SideEnum.left) {
|
|
587
|
+
if (this.isSelectedData()?.leftyear) {
|
|
588
|
+
this.isSelectedData.update((current) => {
|
|
589
|
+
current.leftyear = false;
|
|
590
|
+
return current;
|
|
591
|
+
});
|
|
592
|
+
this.getDisable('left');
|
|
593
|
+
// this.SetListYearRight(this.listViewKeySelectedYear as number);
|
|
594
|
+
this.functionControls.get(type)?.removeList();
|
|
595
|
+
return;
|
|
596
|
+
}
|
|
597
|
+
this.listKeyFromSelected.update((current) => {
|
|
598
|
+
current.year = event.key;
|
|
599
|
+
return current;
|
|
600
|
+
});
|
|
601
|
+
if (this.listKeyFromSelected().year && this.listKeyToSelected().year && this.listKeyFromSelected().year >= this.listKeyToSelected().year) {
|
|
602
|
+
this.listKeyToSelected.update((current) => {
|
|
603
|
+
current.year = event.key;
|
|
604
|
+
return current;
|
|
605
|
+
});
|
|
606
|
+
if (this.listKeyFromSelected().month && Number(this.listKeyFromSelected().month) <= 11) {
|
|
607
|
+
this.listKeyToSelected.update((current) => {
|
|
608
|
+
current.month = Number(this.listKeyFromSelected().month) + 1;
|
|
609
|
+
return current;
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
if (this.listKeyFromSelected().month && this.listKeyFromSelected().month === 12) {
|
|
613
|
+
this.listKeyToSelected.update((current) => {
|
|
614
|
+
current.month = Number(this.listKeyFromSelected().month);
|
|
615
|
+
return current;
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
this.getDisable('left');
|
|
620
|
+
this.buildConfigYear(SideEnum.right, this.listKeyFromSelected().year);
|
|
621
|
+
this.functionControls.get(type)?.removeList();
|
|
622
|
+
}
|
|
623
|
+
if (side === SideEnum.right) {
|
|
624
|
+
if (this.isSelectedData().rightyear) {
|
|
625
|
+
this.isSelectedData.update((current) => {
|
|
626
|
+
current.rightyear = false;
|
|
627
|
+
return current;
|
|
628
|
+
});
|
|
629
|
+
this.getDisable('right');
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
this.listKeyToSelected.update((current) => {
|
|
633
|
+
current.year = event.key;
|
|
634
|
+
return current;
|
|
635
|
+
});
|
|
636
|
+
if (this.listKeyFromSelected().year && this.listKeyToSelected().year && this.listKeyFromSelected().year >= this.listKeyToSelected().year) {
|
|
637
|
+
if (this.listKeyFromSelected().month && Number(this.listKeyFromSelected().month) <= 11) {
|
|
638
|
+
this.listKeyToSelected.update((current) => {
|
|
639
|
+
current.month = Number(this.listKeyFromSelected().month) + 1;
|
|
640
|
+
return current;
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
if (this.listKeyFromSelected().month && this.listKeyFromSelected().month === 12) {
|
|
644
|
+
this.listKeyToSelected.update((current) => {
|
|
645
|
+
current.month = Number(this.listKeyFromSelected().month);
|
|
646
|
+
return current;
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
this.getDisable('right');
|
|
652
|
+
let month = getDayjs().month();
|
|
653
|
+
if (side === SideEnum.right && this.listKeyFromSelected().month) {
|
|
654
|
+
month = Number(this.listKeyFromSelected().month) - 1;
|
|
655
|
+
}
|
|
656
|
+
if (side === SideEnum.left && this.listKeyFromSelected().month) {
|
|
657
|
+
month = Number(this.listKeyFromSelected().month) - 1;
|
|
658
|
+
}
|
|
659
|
+
const year = Number(event.key);
|
|
660
|
+
this.monthOrYearChanged(month, year, side);
|
|
661
|
+
}
|
|
662
|
+
monthOrYearChanged(month, year, side) {
|
|
663
|
+
const isLeft = side === SideEnum.left;
|
|
664
|
+
const minDate = getDayjs({ date: this.minDate() });
|
|
665
|
+
const maxDate = getDayjs({ date: this.maxDate() });
|
|
666
|
+
if (minDate && (year < minDate?.year() || (year === minDate?.year() && month < minDate?.month()))) {
|
|
667
|
+
month = minDate?.month();
|
|
668
|
+
year = minDate?.year();
|
|
669
|
+
}
|
|
670
|
+
if (maxDate && (year > maxDate?.year() || (year === maxDate?.year() && month > maxDate?.month()))) {
|
|
671
|
+
month = maxDate?.month();
|
|
672
|
+
year = maxDate?.year();
|
|
673
|
+
}
|
|
674
|
+
const dropdowns = this.calendarVariables()[side]().dropdowns;
|
|
675
|
+
if (dropdowns?.()) {
|
|
676
|
+
dropdowns.update((current) => {
|
|
677
|
+
current.currentYear = year;
|
|
678
|
+
current.currentMonth = month;
|
|
679
|
+
return current;
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
if (isLeft && this.leftCalendar().month) {
|
|
683
|
+
this.leftCalendar.update((current) => {
|
|
684
|
+
current.month = current.month?.month(month).year(year);
|
|
685
|
+
return current;
|
|
686
|
+
});
|
|
687
|
+
return this.updateCalendars();
|
|
688
|
+
}
|
|
689
|
+
if (month === 12) {
|
|
690
|
+
this.rightCalendar.update((current) => {
|
|
691
|
+
current.month = current.month?.clone().add(1, 'month');
|
|
692
|
+
return current;
|
|
693
|
+
});
|
|
694
|
+
return this.updateCalendars();
|
|
695
|
+
}
|
|
696
|
+
this.rightCalendar.update((current) => {
|
|
697
|
+
current.month = current.month?.month(month).year(year);
|
|
698
|
+
return current;
|
|
699
|
+
});
|
|
700
|
+
this.updateCalendars();
|
|
701
|
+
}
|
|
702
|
+
handlerInputEvent(event, type) {
|
|
703
|
+
if (event.keyCode !== 8) {
|
|
704
|
+
event.keyCode &&
|
|
705
|
+
this.checkBackspaceFocus.update((current) => {
|
|
706
|
+
current[type].set(1);
|
|
707
|
+
return current;
|
|
708
|
+
});
|
|
709
|
+
this.keyCodeBackspace.set(false);
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
this.keyCodeBackspace.set(true);
|
|
713
|
+
switch (type) {
|
|
714
|
+
case 'leftminute':
|
|
715
|
+
if (isEmpty(this.timepickerValueItem().leftminute())) {
|
|
716
|
+
if (this.checkBackspaceFocus()[type]() === 1) {
|
|
717
|
+
this.checkBackspaceFocus.update((current) => {
|
|
718
|
+
current[type].set(current[type]() + 1);
|
|
719
|
+
return current;
|
|
720
|
+
});
|
|
721
|
+
return;
|
|
722
|
+
}
|
|
723
|
+
this.checkBackspaceFocus.update((current) => {
|
|
724
|
+
current[type].set(1);
|
|
725
|
+
return current;
|
|
726
|
+
});
|
|
727
|
+
this.functionControls.get(`${SideEnum.left}hour`)?.focus();
|
|
728
|
+
}
|
|
729
|
+
break;
|
|
730
|
+
case 'rightminute':
|
|
731
|
+
if (isEmpty(this.timepickerValueItem().rightminute())) {
|
|
732
|
+
if (this.checkBackspaceFocus()[type]() === 1) {
|
|
733
|
+
this.checkBackspaceFocus.update((current) => {
|
|
734
|
+
current[type].set(current[type]() + 1);
|
|
735
|
+
return current;
|
|
736
|
+
});
|
|
737
|
+
return;
|
|
738
|
+
}
|
|
739
|
+
this.checkBackspaceFocus.update((current) => {
|
|
740
|
+
current[type].set(1);
|
|
741
|
+
return current;
|
|
742
|
+
});
|
|
743
|
+
this.functionControls.get(`${SideEnum.right}hour`)?.focus();
|
|
744
|
+
}
|
|
745
|
+
break;
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
handlerFocusAndBlurTime(event, type) {
|
|
749
|
+
if (event.name === 'focus') {
|
|
750
|
+
return;
|
|
751
|
+
}
|
|
752
|
+
const eventInput = event.event;
|
|
753
|
+
const target = eventInput.target;
|
|
754
|
+
switch (type) {
|
|
755
|
+
case 'lefthour':
|
|
756
|
+
this.timepickerVariables().left.update((current) => {
|
|
757
|
+
current.selectedHour = !isEmpty(this.timepickerValueItem().lefthour()) ? this.timepickerValueItem().lefthour() : 0;
|
|
758
|
+
return current;
|
|
759
|
+
});
|
|
760
|
+
if (Number(this.timepickerValueItem().lefthour()) === 0 || isEmpty(this.timepickerValueItem().lefthour())) {
|
|
761
|
+
this.timepickerValueItem.update((current) => {
|
|
762
|
+
current.lefthour.set(0);
|
|
763
|
+
return current;
|
|
764
|
+
});
|
|
765
|
+
target.value = '00';
|
|
766
|
+
break;
|
|
767
|
+
}
|
|
768
|
+
if (Number(this.timepickerValueItem().lefthour()) < 10) {
|
|
769
|
+
target.value = `0${Number(this.timepickerValueItem().lefthour())}`;
|
|
770
|
+
}
|
|
771
|
+
break;
|
|
772
|
+
case 'righthour':
|
|
773
|
+
this.timepickerVariables().right.update((current) => {
|
|
774
|
+
current.selectedHour = !isEmpty(this.timepickerValueItem().righthour()) ? this.timepickerValueItem().righthour() : 0;
|
|
775
|
+
return current;
|
|
776
|
+
});
|
|
777
|
+
if (Number(this.timepickerValueItem().righthour()) === 0 || isEmpty(this.timepickerValueItem().righthour())) {
|
|
778
|
+
this.timepickerValueItem.update((current) => {
|
|
779
|
+
current.righthour.set(0);
|
|
780
|
+
return current;
|
|
781
|
+
});
|
|
782
|
+
target.value = '00';
|
|
783
|
+
break;
|
|
784
|
+
}
|
|
785
|
+
if (Number(this.timepickerValueItem().righthour()) < 10) {
|
|
786
|
+
target.value = `0${Number(this.timepickerValueItem().righthour())}`;
|
|
787
|
+
}
|
|
788
|
+
break;
|
|
789
|
+
case 'leftminute':
|
|
790
|
+
this.timepickerVariables().left.update((current) => {
|
|
791
|
+
current.selectedMinute = !isEmpty(this.timepickerValueItem().leftminute()) ? this.timepickerValueItem().leftminute() : 0;
|
|
792
|
+
return current;
|
|
793
|
+
});
|
|
794
|
+
if (Number(this.timepickerValueItem().leftminute()) === 0 || isEmpty(this.timepickerValueItem().leftminute())) {
|
|
795
|
+
this.timepickerValueItem.update((current) => {
|
|
796
|
+
current.leftminute.set(0);
|
|
797
|
+
return current;
|
|
798
|
+
});
|
|
799
|
+
target.value = '00';
|
|
800
|
+
break;
|
|
801
|
+
}
|
|
802
|
+
if (Number(this.timepickerValueItem().leftminute()) < 10) {
|
|
803
|
+
target.value = `0${Number(this.timepickerValueItem().leftminute())}`;
|
|
804
|
+
}
|
|
805
|
+
break;
|
|
806
|
+
case 'rightminute':
|
|
807
|
+
this.timepickerVariables().right.update((current) => {
|
|
808
|
+
current.selectedMinute = !isEmpty(this.timepickerValueItem().rightminute()) ? this.timepickerValueItem().rightminute() : 0;
|
|
809
|
+
return current;
|
|
810
|
+
});
|
|
811
|
+
if (Number(this.timepickerValueItem().rightminute()) === 0 || isEmpty(this.timepickerValueItem().rightminute())) {
|
|
812
|
+
this.timepickerValueItem.update((current) => {
|
|
813
|
+
current.rightminute.set(0);
|
|
814
|
+
return current;
|
|
815
|
+
});
|
|
816
|
+
target.value = '00';
|
|
817
|
+
break;
|
|
818
|
+
}
|
|
819
|
+
if (Number(this.timepickerValueItem().rightminute()) < 10) {
|
|
820
|
+
target.value = `0${Number(this.timepickerValueItem().rightminute())}`;
|
|
821
|
+
}
|
|
822
|
+
break;
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
handlerChangeTimeValue(event, type) {
|
|
826
|
+
this.timepickerValueItem.update((current) => {
|
|
827
|
+
current[type].set(event);
|
|
828
|
+
return current;
|
|
829
|
+
});
|
|
830
|
+
const side = type.includes(SideEnum.left) ? SideEnum.left : SideEnum.right;
|
|
831
|
+
const attr = type.includes('hour') ? 'hour' : 'minute';
|
|
832
|
+
this.splitPickerDate.update((current) => {
|
|
833
|
+
current[side === SideEnum.left ? 'start' : 'end'].update((sideCurrent) => {
|
|
834
|
+
sideCurrent[attr] = event;
|
|
835
|
+
return sideCurrent;
|
|
836
|
+
});
|
|
837
|
+
return current;
|
|
838
|
+
});
|
|
839
|
+
if ((type !== 'lefthour' && type !== 'righthour') || event === undefined) {
|
|
840
|
+
this.isZero.set(false);
|
|
841
|
+
return;
|
|
842
|
+
}
|
|
843
|
+
if (`${event}`.length === 2 || Number(event) > 2 || (Number(event) <= 2 && Number(event) > 0 && this.isZero()) || (this.isZero() && !this.keyCodeBackspace())) {
|
|
844
|
+
this.isZero.set(false);
|
|
845
|
+
this.functionControls.get(type === 'lefthour' ? `${SideEnum.left}minute` : `${SideEnum.right}minute`)?.focus();
|
|
846
|
+
return;
|
|
847
|
+
}
|
|
848
|
+
if (Number(event) === 0 && !this.keyCodeBackspace()) {
|
|
849
|
+
this.isZero.set(true);
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
handlerShowListDropdown(event, type) {
|
|
854
|
+
this.checkShowListDropdown.update((current) => {
|
|
855
|
+
current[type] = event;
|
|
856
|
+
return current;
|
|
857
|
+
});
|
|
858
|
+
}
|
|
859
|
+
convertItemMonth = (item) => {
|
|
860
|
+
if (!item) {
|
|
861
|
+
return '';
|
|
862
|
+
}
|
|
863
|
+
set(item, 'labelDisplay', this.translate.instant(item.label || ' ', { year: '' }));
|
|
864
|
+
return item;
|
|
865
|
+
};
|
|
866
|
+
convertItemYear = (item) => {
|
|
867
|
+
if (!item) {
|
|
868
|
+
return '';
|
|
869
|
+
}
|
|
870
|
+
item.labelDisplay = this.translate.instant('i18n_year_param', { year: item.label });
|
|
871
|
+
return item;
|
|
872
|
+
};
|
|
873
|
+
updateMonthsInView() {
|
|
874
|
+
if (this.endDate()) {
|
|
875
|
+
if (!this.isSingle() &&
|
|
876
|
+
this.leftCalendar().month &&
|
|
877
|
+
this.rightCalendar().month &&
|
|
878
|
+
((this.leftCalendar() && this.startDate()?.format('YYYY-MM') === this.leftCalendar().month?.format('YYYY-MM')) || (this.rightCalendar() && this.startDate()?.format('YYYY-MM') === this.rightCalendar().month?.format('YYYY-MM'))) &&
|
|
879
|
+
(this.endDate()?.format('YYYY-MM') === this.leftCalendar().month?.format('YYYY-MM') || this.endDate()?.format('YYYY-MM') === this.rightCalendar().month?.format('YYYY-MM'))) {
|
|
880
|
+
return;
|
|
881
|
+
}
|
|
882
|
+
if (this.startDate()) {
|
|
883
|
+
this.leftCalendar.update((current) => {
|
|
884
|
+
current.month = this.startDate()?.clone()?.date(2);
|
|
885
|
+
return current;
|
|
886
|
+
});
|
|
887
|
+
if (this.endDate()?.month() !== this.startDate()?.month() || this.endDate()?.year() !== this.startDate()?.year()) {
|
|
888
|
+
this.rightCalendar.update((current) => {
|
|
889
|
+
current.month = this.endDate()?.clone()?.date(2);
|
|
890
|
+
return current;
|
|
891
|
+
});
|
|
892
|
+
return;
|
|
893
|
+
}
|
|
894
|
+
this.rightCalendar.update((current) => {
|
|
895
|
+
current.month = this.startDate()?.clone()?.date(2)?.add(1, 'month');
|
|
896
|
+
return current;
|
|
897
|
+
});
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
if (this.startDate() &&
|
|
901
|
+
this.leftCalendar().month &&
|
|
902
|
+
this.rightCalendar().month &&
|
|
903
|
+
this.leftCalendar().month?.format('YYYY-MM') !== this.startDate()?.format('YYYY-MM') &&
|
|
904
|
+
this.rightCalendar().month?.format('YYYY-MM') !== this.startDate()?.format('YYYY-MM')) {
|
|
905
|
+
this.leftCalendar.update((current) => {
|
|
906
|
+
current.month = this.startDate()?.clone()?.date(2);
|
|
907
|
+
return current;
|
|
908
|
+
});
|
|
909
|
+
this.rightCalendar.update((current) => {
|
|
910
|
+
current.month = this.startDate()?.clone()?.date(2)?.add(1, 'month');
|
|
911
|
+
return current;
|
|
912
|
+
});
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
setTimeInput(side) {
|
|
916
|
+
const hour = parseInt(`${this.timepickerVariables()[side]().selectedHour}`);
|
|
917
|
+
const minute = parseInt(`${this.timepickerVariables()[side]().selectedMinute}`);
|
|
918
|
+
if (side === SideEnum.left && this.startDate()) {
|
|
919
|
+
let start = this.startDate()?.clone();
|
|
920
|
+
start = start?.hour(hour);
|
|
921
|
+
start = start?.minute(minute);
|
|
922
|
+
this.setStartDate(start);
|
|
923
|
+
if (this.isSingle()) {
|
|
924
|
+
this.endDate.set(this.startDate()?.clone());
|
|
925
|
+
}
|
|
926
|
+
if (this.endDate() && this.endDate()?.format('YYYY-MM-DD') === start?.format('YYYY-MM-DD') && this.endDate()?.isBefore(start)) {
|
|
927
|
+
this.setEndDate(start?.clone());
|
|
928
|
+
}
|
|
929
|
+
if (!this.endDate() && start && this.hasTimePicker()) {
|
|
930
|
+
const startClone = this.getDateWithTime(start, SideEnum.right);
|
|
931
|
+
if (startClone.isBefore(start)) {
|
|
932
|
+
this.timepickerVariables()[SideEnum.right].update((current) => {
|
|
933
|
+
current.selectedHour = hour;
|
|
934
|
+
current.selectedMinute = minute;
|
|
935
|
+
return current;
|
|
936
|
+
});
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
return;
|
|
940
|
+
}
|
|
941
|
+
if (this.endDate()) {
|
|
942
|
+
let end = this.endDate()?.clone();
|
|
943
|
+
end = end?.hour(hour);
|
|
944
|
+
end = end?.minute(minute);
|
|
945
|
+
this.setEndDate(end);
|
|
946
|
+
}
|
|
947
|
+
this.updateCalendars();
|
|
948
|
+
this.renderTimePicker(SideEnum.left);
|
|
949
|
+
this.renderTimePicker(SideEnum.right);
|
|
950
|
+
}
|
|
951
|
+
updateCalendars() {
|
|
952
|
+
this.renderCalendar(SideEnum.left);
|
|
953
|
+
this.renderCalendar(SideEnum.right);
|
|
954
|
+
if (this.endDate() === null) {
|
|
955
|
+
return;
|
|
956
|
+
}
|
|
957
|
+
this.calculateSelectedLabel();
|
|
958
|
+
}
|
|
959
|
+
renderCalendar(side) {
|
|
960
|
+
// side enum
|
|
961
|
+
const mainCalendar = side === SideEnum.left ? this.leftCalendar() : this.rightCalendar();
|
|
962
|
+
if (!mainCalendar.month || this.dateOptions().firstDay === undefined || this.dateOptions().firstDay === undefined) {
|
|
963
|
+
return;
|
|
964
|
+
}
|
|
965
|
+
const month = mainCalendar.month.month();
|
|
966
|
+
const year = mainCalendar.month.year();
|
|
967
|
+
const hour = mainCalendar.month.hour();
|
|
968
|
+
const minute = mainCalendar.month.minute();
|
|
969
|
+
const second = mainCalendar.month.second();
|
|
970
|
+
const daysInMonth = getDayjs({ date: new Date(year, month) }).daysInMonth();
|
|
971
|
+
const firstDay = getDayjs({ date: new Date(year, month, 1) });
|
|
972
|
+
const lastDay = getDayjs({ date: new Date(year, month, daysInMonth) });
|
|
973
|
+
const lastMonth = getDayjs({ date: firstDay.subtract(1, 'month') }).month();
|
|
974
|
+
const lastYear = getDayjs({ date: firstDay.subtract(1, 'month') }).year();
|
|
975
|
+
const daysInLastMonth = getDayjs({ date: new Date(lastYear, lastMonth) }).daysInMonth();
|
|
976
|
+
const dayOfWeek = firstDay.day();
|
|
977
|
+
const calendar = {};
|
|
978
|
+
calendar.firstDay = firstDay;
|
|
979
|
+
calendar.lastDay = lastDay;
|
|
980
|
+
for (let i = 0; i < 6; i++) {
|
|
981
|
+
calendar[i] = [];
|
|
982
|
+
}
|
|
983
|
+
let startDay = daysInLastMonth - dayOfWeek + (this.dateOptions().firstDay ?? 1) + 1;
|
|
984
|
+
if (startDay > daysInLastMonth) {
|
|
985
|
+
startDay -= 7;
|
|
986
|
+
}
|
|
987
|
+
if (dayOfWeek === this.dateOptions().firstDay) {
|
|
988
|
+
startDay = daysInLastMonth - 6;
|
|
989
|
+
}
|
|
990
|
+
let curDate = getDayjs({ date: new Date(lastYear, lastMonth, startDay, 12, minute, second) });
|
|
991
|
+
for (let i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = getDayjs({ date: curDate }).add(24, 'hour')) {
|
|
992
|
+
if (i > 0 && col % 7 === 0) {
|
|
993
|
+
col = 0;
|
|
994
|
+
row++;
|
|
995
|
+
}
|
|
996
|
+
calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second);
|
|
997
|
+
curDate = curDate.hour(12);
|
|
998
|
+
const minDate = getDayjs({ date: this.minDate() });
|
|
999
|
+
const maxDate = getDayjs({ date: this.maxDate() });
|
|
1000
|
+
if (minDate && calendar[row][col].format('YYYY-MM-DD') === minDate?.format('YYYY-MM-DD') && calendar[row][col].isBefore(minDate) && side === 'left') {
|
|
1001
|
+
calendar[row][col] = minDate?.clone();
|
|
1002
|
+
}
|
|
1003
|
+
if (maxDate && calendar[row][col].format('YYYY-MM-DD') === maxDate?.format('YYYY-MM-DD') && calendar[row][col].isAfter(maxDate) && side === 'right') {
|
|
1004
|
+
calendar[row][col] = maxDate?.clone();
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
if (side === SideEnum.left) {
|
|
1008
|
+
this.leftCalendar.update((current) => {
|
|
1009
|
+
current.calendar = calendar;
|
|
1010
|
+
return current;
|
|
1011
|
+
});
|
|
1012
|
+
}
|
|
1013
|
+
if (side === SideEnum.right) {
|
|
1014
|
+
this.rightCalendar.update((current) => {
|
|
1015
|
+
current.calendar = calendar;
|
|
1016
|
+
return current;
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
const minDate = side === 'left' ? getDayjs({ date: this.minDate() }) : getDayjs({ date: this.startDate() });
|
|
1020
|
+
const maxDate = getDayjs({ date: this.maxDate() });
|
|
1021
|
+
this.calendarVariables()[side].set({
|
|
1022
|
+
month: month,
|
|
1023
|
+
year: year,
|
|
1024
|
+
hour: hour,
|
|
1025
|
+
minute: minute,
|
|
1026
|
+
second: second,
|
|
1027
|
+
daysInMonth: daysInMonth,
|
|
1028
|
+
firstDay: firstDay,
|
|
1029
|
+
lastDay: lastDay,
|
|
1030
|
+
lastMonth: lastMonth,
|
|
1031
|
+
lastYear: lastYear,
|
|
1032
|
+
daysInLastMonth: daysInLastMonth,
|
|
1033
|
+
dayOfWeek: dayOfWeek,
|
|
1034
|
+
calRows: signal(Array.from(Array(6).keys())),
|
|
1035
|
+
calCols: signal(Array.from(Array(7).keys())),
|
|
1036
|
+
classes: {},
|
|
1037
|
+
minDate: minDate,
|
|
1038
|
+
maxDate: maxDate,
|
|
1039
|
+
calendar: calendar,
|
|
1040
|
+
dropdowns: signal({}),
|
|
1041
|
+
});
|
|
1042
|
+
if (this.showDropdownsSelect()) {
|
|
1043
|
+
const currentMonth = calendar[1][1].month();
|
|
1044
|
+
const currentYear = calendar[1][1].year();
|
|
1045
|
+
const maxYear = maxDate?.year() ?? DEFAULT_MAX_YEAR;
|
|
1046
|
+
const minYear = minDate?.year() ?? DEFAULT_MIN_YEAR;
|
|
1047
|
+
const inMinYear = currentYear === minYear;
|
|
1048
|
+
const inMaxYear = currentYear === maxYear;
|
|
1049
|
+
const years = [];
|
|
1050
|
+
for (let y = minYear; y <= maxYear; y++) {
|
|
1051
|
+
years.push(y);
|
|
1052
|
+
}
|
|
1053
|
+
this.calendarVariables()[side]()
|
|
1054
|
+
.dropdowns?.set({
|
|
1055
|
+
currentMonth: currentMonth,
|
|
1056
|
+
currentYear: currentYear,
|
|
1057
|
+
maxYear: maxYear,
|
|
1058
|
+
minYear: minYear,
|
|
1059
|
+
inMinYear: inMinYear,
|
|
1060
|
+
inMaxYear: inMaxYear,
|
|
1061
|
+
monthArrays: signal(Array.from(Array(12).keys())),
|
|
1062
|
+
yearArrays: signal(years),
|
|
1063
|
+
});
|
|
1064
|
+
}
|
|
1065
|
+
this.buildCells(calendar, side);
|
|
1066
|
+
}
|
|
1067
|
+
buildCells(calendar, side) {
|
|
1068
|
+
for (let row = 0; row < 6; row++) {
|
|
1069
|
+
const classless = this.calendarVariables()[side]();
|
|
1070
|
+
if (classless.classes) {
|
|
1071
|
+
classless.classes[row] = {};
|
|
1072
|
+
}
|
|
1073
|
+
for (let col = 0; col < 7; col++) {
|
|
1074
|
+
const classes = [];
|
|
1075
|
+
const startDate = getDayjs({ date: this.startDate() });
|
|
1076
|
+
const endDate = getDayjs({ date: this.endDate() });
|
|
1077
|
+
const nowHoveredDate = this.nowHoveredDate();
|
|
1078
|
+
if (calendar[row][col].isSame(new Date(), 'day')) {
|
|
1079
|
+
classes.push('today');
|
|
1080
|
+
}
|
|
1081
|
+
if (calendar[row][col].isoWeekday() > 5) {
|
|
1082
|
+
classes.push('weekend');
|
|
1083
|
+
}
|
|
1084
|
+
if (calendar[row][col].month() !== calendar[1][1].month()) {
|
|
1085
|
+
classes.push('off');
|
|
1086
|
+
}
|
|
1087
|
+
if (this.minDate() && calendar[row][col].isBefore(this.minDate(), 'day')) {
|
|
1088
|
+
classes.push('off', 'disabled');
|
|
1089
|
+
}
|
|
1090
|
+
if (this.calendarVariables()[side]().maxDate && calendar[row][col].isAfter(this.calendarVariables()[side]().maxDate, 'day')) {
|
|
1091
|
+
classes.push('off', 'disabled');
|
|
1092
|
+
}
|
|
1093
|
+
if (startDate && calendar[row][col].format('YYYY-MM-DD') === startDate?.format('YYYY-MM-DD')) {
|
|
1094
|
+
classes.push('active', 'start-date');
|
|
1095
|
+
}
|
|
1096
|
+
if (endDate !== null && calendar[row][col].format('YYYY-MM-DD') === endDate?.format('YYYY-MM-DD')) {
|
|
1097
|
+
classes.push('active', 'end-date');
|
|
1098
|
+
}
|
|
1099
|
+
if (startDate && calendar[row][col].format('YYYY-MM-DD') === startDate?.format('YYYY-MM-DD') && (!endDate || (endDate !== null && calendar[row][col].format('YYYY-MM-DD') === endDate?.format('YYYY-MM-DD')))) {
|
|
1100
|
+
classes.push('active', 'full-date');
|
|
1101
|
+
}
|
|
1102
|
+
if (startDate &&
|
|
1103
|
+
endDate &&
|
|
1104
|
+
((nowHoveredDate !== null && this.pickingDate()) || endDate !== null) &&
|
|
1105
|
+
calendar[row][col] > startDate &&
|
|
1106
|
+
(calendar[row][col] < endDate || (nowHoveredDate && calendar[row][col] < nowHoveredDate && this.pickingDate()))) {
|
|
1107
|
+
classes.push(!classes.find((el) => el === 'off') ? 'in-range' : 'focus-off');
|
|
1108
|
+
}
|
|
1109
|
+
let cname = '', disabled = false;
|
|
1110
|
+
for (let i = 0; i < classes.length; i++) {
|
|
1111
|
+
cname += classes[i] + ' ';
|
|
1112
|
+
if (classes[i] === 'disabled') {
|
|
1113
|
+
disabled = true;
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
if (!disabled) {
|
|
1117
|
+
cname += 'available';
|
|
1118
|
+
}
|
|
1119
|
+
if (classless.classes) {
|
|
1120
|
+
classless.classes[row][col] = cname.replace(/^\s+|\s+$/g, '');
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
renderTimePicker(side) {
|
|
1126
|
+
let selected = getDayjs(), minDate;
|
|
1127
|
+
const maxDate = getDayjs({ date: this.maxDate() });
|
|
1128
|
+
const startDate = getDayjs({ date: this.startDate() });
|
|
1129
|
+
const endDate = getDayjs({ date: this.endDate() });
|
|
1130
|
+
if (side === SideEnum.left && startDate) {
|
|
1131
|
+
selected = startDate.clone();
|
|
1132
|
+
minDate = this.maxDate();
|
|
1133
|
+
}
|
|
1134
|
+
if (side === SideEnum.right && endDate) {
|
|
1135
|
+
selected = endDate.clone();
|
|
1136
|
+
minDate = this.startDate();
|
|
1137
|
+
}
|
|
1138
|
+
if (side === SideEnum.right && !endDate) {
|
|
1139
|
+
if (!startDate) {
|
|
1140
|
+
return;
|
|
1141
|
+
}
|
|
1142
|
+
selected = getDayjs({ date: this.getDateWithTime(startDate, SideEnum.right) });
|
|
1143
|
+
if (selected.isBefore(startDate)) {
|
|
1144
|
+
selected = startDate.clone();
|
|
1145
|
+
}
|
|
1146
|
+
minDate = startDate;
|
|
1147
|
+
}
|
|
1148
|
+
const start = 0;
|
|
1149
|
+
const end = 23;
|
|
1150
|
+
this.timepickerVariables()[side].set({
|
|
1151
|
+
hours: [],
|
|
1152
|
+
minutes: [],
|
|
1153
|
+
minutesLabel: [],
|
|
1154
|
+
seconds: [],
|
|
1155
|
+
secondsLabel: [],
|
|
1156
|
+
disabledHours: [],
|
|
1157
|
+
disabledMinutes: [],
|
|
1158
|
+
disabledSeconds: [],
|
|
1159
|
+
selectedHour: 0,
|
|
1160
|
+
selectedMinute: 0,
|
|
1161
|
+
selectedSecond: 0,
|
|
1162
|
+
});
|
|
1163
|
+
for (let i = start; i <= end; i++) {
|
|
1164
|
+
const i_in_24 = i;
|
|
1165
|
+
const time = selected.clone().hour(i_in_24);
|
|
1166
|
+
let disabled = false;
|
|
1167
|
+
if (minDate && time.minute(59).isBefore(minDate)) {
|
|
1168
|
+
disabled = true;
|
|
1169
|
+
}
|
|
1170
|
+
if (maxDate && time.minute(0).isAfter(maxDate)) {
|
|
1171
|
+
disabled = true;
|
|
1172
|
+
}
|
|
1173
|
+
this.timepickerVariables()[side].update((current) => {
|
|
1174
|
+
current.hours?.push(i);
|
|
1175
|
+
if (i_in_24 === selected.hour() && !disabled) {
|
|
1176
|
+
current.selectedHour = i;
|
|
1177
|
+
}
|
|
1178
|
+
if (disabled) {
|
|
1179
|
+
current.disabledHours?.push(i);
|
|
1180
|
+
}
|
|
1181
|
+
return current;
|
|
1182
|
+
});
|
|
1183
|
+
}
|
|
1184
|
+
for (let i = 0; i < 60; i += this.timePickerIncrement()) {
|
|
1185
|
+
const padded = i < 10 ? '0' + i : `${i}`;
|
|
1186
|
+
const time = selected.clone().minute(i);
|
|
1187
|
+
let disabled = false;
|
|
1188
|
+
if (minDate && time.second(59).isBefore(minDate)) {
|
|
1189
|
+
disabled = true;
|
|
1190
|
+
}
|
|
1191
|
+
if (maxDate && time.second(0).isAfter(maxDate)) {
|
|
1192
|
+
disabled = true;
|
|
1193
|
+
}
|
|
1194
|
+
this.timepickerVariables()[side].update((current) => {
|
|
1195
|
+
current.minutes?.push(i);
|
|
1196
|
+
current.minutesLabel?.push(padded);
|
|
1197
|
+
if (selected.minute() === i && !disabled) {
|
|
1198
|
+
current.selectedMinute = i;
|
|
1199
|
+
}
|
|
1200
|
+
if (disabled) {
|
|
1201
|
+
current.disabledMinutes?.push(i);
|
|
1202
|
+
}
|
|
1203
|
+
return current;
|
|
1204
|
+
});
|
|
1205
|
+
}
|
|
1206
|
+
this.timepickerVariables()[side].update((current) => {
|
|
1207
|
+
current.selected = selected;
|
|
1208
|
+
return current;
|
|
1209
|
+
});
|
|
1210
|
+
}
|
|
1211
|
+
updateElement() {
|
|
1212
|
+
if (!this.startDate()) {
|
|
1213
|
+
return;
|
|
1214
|
+
}
|
|
1215
|
+
if (this.isSingle()) {
|
|
1216
|
+
this.selectedLabel.set(this.startDate()?.format('DD/MM/YYYY'));
|
|
1217
|
+
return;
|
|
1218
|
+
}
|
|
1219
|
+
if (this.endDate()) {
|
|
1220
|
+
// if we use ranges and should show range label on input
|
|
1221
|
+
if (this.quickRangesArray().length && this.showRangeLabelOnInput() && this.selectedQuickRange() && this.dateOptions().customRangeLabel !== this.selectedQuickRange()) {
|
|
1222
|
+
this.selectedLabel.set(this.selectedQuickRange());
|
|
1223
|
+
return;
|
|
1224
|
+
}
|
|
1225
|
+
this.selectedLabel.set(`${this.startDate()?.format('DD/MM/YYYY')}${this.dateOptions().separator}${this.endDate()?.format('DD/MM/YYYY')}`);
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1228
|
+
this.selectedLabel.set(`${this.startDate()?.format('DD/MM/YYYY')}${this.dateOptions().separator}${this.startDate()?.format('DD/MM/YYYY')}`);
|
|
1229
|
+
}
|
|
1230
|
+
updateView() {
|
|
1231
|
+
if (this.hasTimePicker()) {
|
|
1232
|
+
this.renderTimePicker(SideEnum.left);
|
|
1233
|
+
this.renderTimePicker(SideEnum.right);
|
|
1234
|
+
}
|
|
1235
|
+
this.updateMonthsInView();
|
|
1236
|
+
this.updateCalendars();
|
|
1237
|
+
}
|
|
1238
|
+
getDateWithTime(date, side) {
|
|
1239
|
+
const hour = parseInt(`${this.timepickerVariables()[side]().selectedHour}`, 10);
|
|
1240
|
+
const minute = parseInt(`${this.timepickerVariables()[side]().selectedMinute}`, 10);
|
|
1241
|
+
const second = this.hasSecondPicker() && !isEmpty(this.timepickerVariables()[side]().selectedSecond) ? parseInt(`${this.timepickerVariables()[side]().selectedSecond}`, 10) : 0;
|
|
1242
|
+
return date.clone().hour(hour).minute(minute).second(second);
|
|
1243
|
+
}
|
|
1244
|
+
transformMinMaxDate(value) {
|
|
1245
|
+
if (isEmpty(value)) {
|
|
1246
|
+
return undefined;
|
|
1247
|
+
}
|
|
1248
|
+
if (dayjs.isDayjs(value)) {
|
|
1249
|
+
return value;
|
|
1250
|
+
}
|
|
1251
|
+
if (typeof value === 'string') {
|
|
1252
|
+
return getDayjs({ date: value });
|
|
1253
|
+
}
|
|
1254
|
+
return undefined;
|
|
1255
|
+
}
|
|
1256
|
+
computedDisplayTime(side) {
|
|
1257
|
+
let strHours = side.selectedHour;
|
|
1258
|
+
let strMinute = side.selectedMinute;
|
|
1259
|
+
if ((side.selectedHour || 0) < 10) {
|
|
1260
|
+
strHours = `0${side.selectedHour ?? 0}`;
|
|
1261
|
+
}
|
|
1262
|
+
if ((side.selectedMinute || 0) < 10) {
|
|
1263
|
+
strMinute = `0${side.selectedMinute ?? 0}`;
|
|
1264
|
+
}
|
|
1265
|
+
return `${strHours}:${strMinute}`;
|
|
1266
|
+
}
|
|
1267
|
+
computedDisplayTimeInput(side, timeType) {
|
|
1268
|
+
const time = timeType === 'hour' ? (side === SideEnum.left ? this.timepickerValueItem().lefthour() : this.timepickerValueItem().righthour()) : side === SideEnum.left ? this.timepickerValueItem().leftminute() : this.timepickerValueItem().rightminute();
|
|
1269
|
+
if (!time) {
|
|
1270
|
+
return '00';
|
|
1271
|
+
}
|
|
1272
|
+
if (time < 10) {
|
|
1273
|
+
return `0${time}`;
|
|
1274
|
+
}
|
|
1275
|
+
return time;
|
|
1276
|
+
}
|
|
1277
|
+
ngOnDestroy() {
|
|
1278
|
+
return;
|
|
1279
|
+
}
|
|
1280
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1281
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, isStandalone: true, selector: "libs_ui-components-datetime-picker-custom_ranges-calendar", inputs: { quickRangesArray: { classPropertyName: "quickRangesArray", publicName: "quickRangesArray", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, isSingle: { classPropertyName: "isSingle", publicName: "isSingle", isSignal: true, isRequired: false, transformFunction: null }, showDropdownsSelect: { classPropertyName: "showDropdownsSelect", publicName: "showDropdownsSelect", isSignal: true, isRequired: false, transformFunction: null }, hasTimePicker: { classPropertyName: "hasTimePicker", publicName: "hasTimePicker", isSignal: true, isRequired: false, transformFunction: null }, flagMouse: { classPropertyName: "flagMouse", publicName: "flagMouse", isSignal: true, isRequired: false, transformFunction: null }, dateOptions: { classPropertyName: "dateOptions", publicName: "dateOptions", isSignal: true, isRequired: false, transformFunction: null }, autoApply: { classPropertyName: "autoApply", publicName: "autoApply", isSignal: true, isRequired: false, transformFunction: null }, hasSecondPicker: { classPropertyName: "hasSecondPicker", publicName: "hasSecondPicker", isSignal: true, isRequired: false, transformFunction: null }, showRangeLabelOnInput: { classPropertyName: "showRangeLabelOnInput", publicName: "showRangeLabelOnInput", isSignal: true, isRequired: false, transformFunction: null }, startDate: { classPropertyName: "startDate", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, listYearHiddenInputSearch: { classPropertyName: "listYearHiddenInputSearch", publicName: "listYearHiddenInputSearch", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { startDate: "startDateChange", endDate: "endDateChange", outChangStageFlagMouse: "outChangStageFlagMouse", outPickerDate: "outPickerDate", outCancel: "outCancel", outUpdateWidth: "outUpdateWidth", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "pickerContainer", first: true, predicate: ["pickerContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"libs-ui-component-custom_ranges-calendar test-class\">\n <div class=\"relative flex\">\n <div\n class=\"libs-ui-component-custom_ranges-calendar\"\n [class.right]=\"isSingle()\"\n [class.left]=\"!isSingle()\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables(); as calendarVariables) {\n <table>\n <thead>\n <tr>\n <th\n colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables.left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class=\"mr-[8px]\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{ widthByParent: false, ignoreArrow: true, paddingLeftItem: true, classInclude: '!w-[130px]', position: { mode: 'center', distance: 0 } }\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().left()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyFromSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [listHiddenInputSearch]=\"true\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'month')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'month')\">\n <div\n class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'month']\">\n <div\n class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i\n class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'month'] ? '90deg' : '270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown\n [listMaxItemShow]=\"10\"\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{ widthByParent: false, ignoreArrow: true, paddingLeftItem: true, classInclude: '!w-[110px]', position: { mode: 'center', distance: 0 } }\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"listYearHiddenInputSearch()\"\n [listConfig]=\"listLeftYearConfig()\"\n [listKeySelected]=\"listKeyFromSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"leftYearHttpDetailConfig()\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'year')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'year')\">\n <div\n class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'year']\">\n <div\n class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(' YYYY') }}\n </div>\n <i\n class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'year'] ? '90deg' : '270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n\n <div class=\"w-1/4 flex items-center relative\">\n @if (!calendarVariables.left().minDate || calendarVariables.left().minDate?.isBefore(calendarVariables.left().calendar && calendarVariables.left().calendar?.firstDay)) {\n <div (click)=\"handlerClickPrev(sideEnum.left)\">\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n @if ((!calendarVariables.left().maxDate || calendarVariables.left().maxDate?.isAfter(calendarVariables.left().calendar && calendarVariables.left().calendar?.lastDay)) && isSingle()) {\n <div (click)=\"handlerClickNext(sideEnum.left)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables.left().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(' YYYY') }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span\n class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dayofweek }}\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"drp-animate\">\n @for (row of calendarVariables.left().calRows?.(); track row) {\n <tr\n class=\"h-[32px]\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.classList\">\n @for (col of calendarVariables.left().calCols?.(); track col) {\n <td\n class=\"libs-ui-font-h5r\"\n [class.today]=\"\n calendarVariables.left().calendar &&\n calendarVariables.left().calendar?.[row]?.[col]?.date() === today().date() &&\n calendarVariables.left().calendar?.[row]?.[col]?.month() === today().month() &&\n calendarVariables.left().calendar?.[row]?.[col]?.year() === today().year()\n \"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.[col]\"\n (click)=\"handlerPickerDate($event, sideEnum.left, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.left, row, col)\">\n <span class=\"libs-ui-font-h5r\">{{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center column items-center pt-[12px]\">\n <div\n class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().lefthour()\"\n (outInputEvent)=\"handlerInputEvent($event, 'lefthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'hour')\"\n (outChange)=\"handlerChangeTimeValue($event, 'lefthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'lefthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().leftminute()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'minute')\"\n (outInputEvent)=\"handlerInputEvent($event, 'leftminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'leftminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'leftminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (!isSingle()) {\n <div class=\"libs-ui-component-custom_ranges-calendar right ml-[24px]\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables()) {\n <table>\n <thead>\n <tr>\n <th\n colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables().left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class=\"mr-[8px]\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{ widthByParent: false, ignoreArrow: true, paddingLeftItem: true, classInclude: '!w-[130px]', position: { mode: 'center', distance: 0 } }\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().right()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listHiddenInputSearch]=\"true\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyToSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'month')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'month')\">\n <div\n class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'month']\">\n <div\n class=\"libs-ui-font-h4m\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i\n class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'month'] ? '90deg' : '270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown\n [listMaxItemShow]=\"10\"\n [zIndex]=\"zIndex() + 1\"\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{ widthByParent: false, ignoreArrow: true, paddingLeftItem: true, classInclude: '!w-[110px]', position: { mode: 'center', distance: 0 } }\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"listYearHiddenInputSearch()\"\n [listConfig]=\"listRightYearConfig()\"\n [listKeySelected]=\"listKeyToSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"rightYearHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'year')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'year')\">\n <div\n class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'year']\">\n <div\n class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format('YYYY') }}\n </div>\n <i\n class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'year'] ? '90deg' : '270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n <div class=\"w-1/4 flex items-center relative\">\n @if (\n (listKeyFromSelected().year &&\n listKeyToSelected().year &&\n !(listKeyFromSelected().year + 1 === listKeyToSelected().year && listKeyFromSelected().month === 12 && listKeyToSelected().month === 1) &&\n listKeyFromSelected().year < listKeyToSelected().year) ||\n (listKeyFromSelected().month && listKeyToSelected().month && listKeyFromSelected().month + 1 < +listKeyToSelected().month)\n ) {\n <div\n class=\"flex items-center justify-center absolute left-0 top-[-3px]\"\n (click)=\"handlerClickPrev(sideEnum.right)\">\n <i class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n }\n @if (\n listKeyFromSelected().month &&\n listKeyToSelected().month &&\n listKeyFromSelected().month > listKeyToSelected().month &&\n listKeyFromSelected().year &&\n listKeyToSelected().year &&\n listKeyFromSelected().year === listKeyToSelected().year\n ) {\n <div class=\"bg-[#ffffff] w-[21px] h-[21px] cursor-none flex items-center justify-center rounded-[50px]\"></div>\n }\n @if (\n !calendarVariables().right().maxDate ||\n calendarVariables()\n .right()\n .maxDate?.isAfter(calendarVariables().right().calendar && calendarVariables().right().calendar?.lastDay)\n ) {\n <div (click)=\"handlerClickNext(sideEnum.right)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables().right().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format('YYYY') }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span\n class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dayofweek }}\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of calendarVariables().right().calRows?.(); track row) {\n <tr\n class=\"h-[32px]\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.classList\">\n @for (col of calendarVariables().right().calCols?.(); track col) {\n <td\n class=\"libs-ui-font-h5r\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.[col]\"\n [class.today]=\"\n calendarVariables().right().calendar &&\n calendarVariables().right().calendar?.[row]?.[col]?.date() === today().date() &&\n calendarVariables().right().calendar?.[row]?.[col]?.month() === today().month() &&\n calendarVariables().right().calendar &&\n calendarVariables().right().calendar?.[row]?.[col]?.year() === today().year()\n \"\n (click)=\"handlerPickerDate($event, sideEnum.right, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.right, row, col)\">\n <span>{{ calendarVariables().right().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center items-center pt-[12px]\">\n <div\n class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().righthour()\"\n (outChange)=\"handlerChangeTimeValue($event, 'righthour')\"\n (outInputEvent)=\"handlerInputEvent($event, 'righthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'righthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'righthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().rightminute()\"\n (outInputEvent)=\"handlerInputEvent($event, 'rightminute')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'rightminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'rightminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'rightminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n <div>\n <div class=\"flex w-full\">\n @if (!isSingle() && hasTimePicker()) {\n <div class=\"mt-[8px] libs-ui-font-h7r text-[#ff5454] h-[14px]\">\n @if (timePickerError()) {\n <span>{{ 'i18n_date_compare_start_end_message_error' | translate }}</span>\n }\n </div>\n }\n </div>\n @if (!quickRangesArray().length || !isSingle()) {\n <div class=\"flex w-full pt-[16px] justify-between\">\n <div class=\"flex items-center\">\n @if (!isSingle()) {\n @if (!endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span>{{ computedDisplayTimeLeft() }}</span>\n }\n ‐\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span>{{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n @if (endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span>{{ computedDisplayTimeLeft() }}</span>\n }\n ‐\n <span>{{ endDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span>{{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n }\n </div>\n\n <div class=\"flex\">\n <libs_ui-components-buttons-button\n class=\"mr-[12px]\"\n label=\"i18n_cancel\"\n type=\"button-third\"\n (outClick)=\"handlerClickCancel($event)\" />\n <libs_ui-components-buttons-button\n label=\"i18n_select\"\n (outClick)=\"handlerClickApply($event)\" />\n </div>\n </div>\n }\n </div>\n</div>\n", styles: [".libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown{display:flex;align-items:center}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar table{border-collapse:inherit;border-spacing:0 2px}.libs-ui-component-custom_ranges-calendar th,.libs-ui-component-custom_ranges-calendar td{padding:0;text-align:center;min-width:32px}.libs-ui-component-custom_ranges-calendar th span,.libs-ui-component-custom_ranges-calendar td span{pointer-events:none}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:before{font-size:20px}.libs-ui-component-custom_ranges-calendar td,.libs-ui-component-custom_ranges-calendar th{cursor:pointer;height:2em;width:2em}.libs-ui-component-custom_ranges-calendar td.available:hover,.libs-ui-component-custom_ranges-calendar th.available:hover{background-color:#f8f5fe;border-color:transparent;border-radius:8px;color:inherit;background-repeat:no-repeat;background-size:.5em;background-position:center;margin:.25em 0;opacity:.8;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms}.libs-ui-component-custom_ranges-calendar td{margin:.25em 0;background-color:#fff;transition:background-color .2s ease;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms;color:#071631!important}.libs-ui-component-custom_ranges-calendar td:hover{color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.off,.libs-ui-component-custom_ranges-calendar td.off.in-range,.libs-ui-component-custom_ranges-calendar td.off.start-date,.libs-ui-component-custom_ranges-calendar td.off.end-date{background-color:#fff;border-color:transparent;color:#cdd0d6!important}.libs-ui-component-custom_ranges-calendar td.focus-off{background-color:#f8f5fe!important}.libs-ui-component-custom_ranges-calendar td.in-range{background-color:#f8f5fe;border-color:transparent;border-radius:0;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today{position:relative;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today:after{position:absolute;content:\"\";width:2px;height:2px;background-color:#8e61ee;left:49%;bottom:5px}.libs-ui-component-custom_ranges-calendar td.active{transition:background .3s ease-out;background:#0000001a}.libs-ui-component-custom_ranges-calendar td.active.today:after{position:absolute;content:\"\";background-color:#fff}.libs-ui-component-custom_ranges-calendar td.active.start-date{border-radius:8px 0 0 8px}.libs-ui-component-custom_ranges-calendar td.active.end-date{border-radius:0 8px 8px 0}.libs-ui-component-custom_ranges-calendar td.active.full-date{border-radius:8px}.libs-ui-component-custom_ranges-calendar td.active,.libs-ui-component-custom_ranges-calendar td.active:hover{background-color:#8e61ee;border-color:transparent;color:#fff!important}.libs-ui-component-custom_ranges-calendar th.month{width:auto}.libs-ui-component-custom_ranges-calendar td.disabled,.libs-ui-component-custom_ranges-calendar option.disabled{color:#999!important;cursor:not-allowed;text-decoration:line-through;background-color:#f4f5f7}.libs-ui-component-custom_ranges-calendar .dropdowns{background-repeat:no-repeat;background-size:10px;background-position-y:center;background-position-x:right}.libs-ui-component-custom_ranges-calendar th.month>div{position:relative;display:inline-block}@media (min-width: 564px){.libs-ui-component-custom_ranges{width:auto}}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "typeInput", "modeInput", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "selectAllTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iframeTextareaCustomStyle", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1282
|
+
}
|
|
1283
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, decorators: [{
|
|
1284
|
+
type: Component,
|
|
1285
|
+
args: [{ selector: 'libs_ui-components-datetime-picker-custom_ranges-calendar', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsDropdownComponent, LibsUiComponentsInputsInputComponent, LibsUiComponentsButtonsButtonComponent], template: "<div class=\"libs-ui-component-custom_ranges-calendar test-class\">\n <div class=\"relative flex\">\n <div\n class=\"libs-ui-component-custom_ranges-calendar\"\n [class.right]=\"isSingle()\"\n [class.left]=\"!isSingle()\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables(); as calendarVariables) {\n <table>\n <thead>\n <tr>\n <th\n colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables.left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class=\"mr-[8px]\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{ widthByParent: false, ignoreArrow: true, paddingLeftItem: true, classInclude: '!w-[130px]', position: { mode: 'center', distance: 0 } }\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().left()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyFromSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [listHiddenInputSearch]=\"true\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'month')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'month')\">\n <div\n class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'month']\">\n <div\n class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i\n class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'month'] ? '90deg' : '270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown\n [listMaxItemShow]=\"10\"\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{ widthByParent: false, ignoreArrow: true, paddingLeftItem: true, classInclude: '!w-[110px]', position: { mode: 'center', distance: 0 } }\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"listYearHiddenInputSearch()\"\n [listConfig]=\"listLeftYearConfig()\"\n [listKeySelected]=\"listKeyFromSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"leftYearHttpDetailConfig()\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'year')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'year')\">\n <div\n class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'year']\">\n <div\n class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(' YYYY') }}\n </div>\n <i\n class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'year'] ? '90deg' : '270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n\n <div class=\"w-1/4 flex items-center relative\">\n @if (!calendarVariables.left().minDate || calendarVariables.left().minDate?.isBefore(calendarVariables.left().calendar && calendarVariables.left().calendar?.firstDay)) {\n <div (click)=\"handlerClickPrev(sideEnum.left)\">\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n @if ((!calendarVariables.left().maxDate || calendarVariables.left().maxDate?.isAfter(calendarVariables.left().calendar && calendarVariables.left().calendar?.lastDay)) && isSingle()) {\n <div (click)=\"handlerClickNext(sideEnum.left)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables.left().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(' YYYY') }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span\n class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dayofweek }}\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"drp-animate\">\n @for (row of calendarVariables.left().calRows?.(); track row) {\n <tr\n class=\"h-[32px]\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.classList\">\n @for (col of calendarVariables.left().calCols?.(); track col) {\n <td\n class=\"libs-ui-font-h5r\"\n [class.today]=\"\n calendarVariables.left().calendar &&\n calendarVariables.left().calendar?.[row]?.[col]?.date() === today().date() &&\n calendarVariables.left().calendar?.[row]?.[col]?.month() === today().month() &&\n calendarVariables.left().calendar?.[row]?.[col]?.year() === today().year()\n \"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.[col]\"\n (click)=\"handlerPickerDate($event, sideEnum.left, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.left, row, col)\">\n <span class=\"libs-ui-font-h5r\">{{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center column items-center pt-[12px]\">\n <div\n class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().lefthour()\"\n (outInputEvent)=\"handlerInputEvent($event, 'lefthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'hour')\"\n (outChange)=\"handlerChangeTimeValue($event, 'lefthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'lefthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().leftminute()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'minute')\"\n (outInputEvent)=\"handlerInputEvent($event, 'leftminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'leftminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'leftminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (!isSingle()) {\n <div class=\"libs-ui-component-custom_ranges-calendar right ml-[24px]\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables()) {\n <table>\n <thead>\n <tr>\n <th\n colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables().left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class=\"mr-[8px]\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{ widthByParent: false, ignoreArrow: true, paddingLeftItem: true, classInclude: '!w-[130px]', position: { mode: 'center', distance: 0 } }\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().right()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listHiddenInputSearch]=\"true\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyToSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'month')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'month')\">\n <div\n class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'month']\">\n <div\n class=\"libs-ui-font-h4m\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i\n class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'month'] ? '90deg' : '270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown\n [listMaxItemShow]=\"10\"\n [zIndex]=\"zIndex() + 1\"\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{ widthByParent: false, ignoreArrow: true, paddingLeftItem: true, classInclude: '!w-[110px]', position: { mode: 'center', distance: 0 } }\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"listYearHiddenInputSearch()\"\n [listConfig]=\"listRightYearConfig()\"\n [listKeySelected]=\"listKeyToSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"rightYearHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'year')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'year')\">\n <div\n class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'year']\">\n <div\n class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format('YYYY') }}\n </div>\n <i\n class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'year'] ? '90deg' : '270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n <div class=\"w-1/4 flex items-center relative\">\n @if (\n (listKeyFromSelected().year &&\n listKeyToSelected().year &&\n !(listKeyFromSelected().year + 1 === listKeyToSelected().year && listKeyFromSelected().month === 12 && listKeyToSelected().month === 1) &&\n listKeyFromSelected().year < listKeyToSelected().year) ||\n (listKeyFromSelected().month && listKeyToSelected().month && listKeyFromSelected().month + 1 < +listKeyToSelected().month)\n ) {\n <div\n class=\"flex items-center justify-center absolute left-0 top-[-3px]\"\n (click)=\"handlerClickPrev(sideEnum.right)\">\n <i class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n }\n @if (\n listKeyFromSelected().month &&\n listKeyToSelected().month &&\n listKeyFromSelected().month > listKeyToSelected().month &&\n listKeyFromSelected().year &&\n listKeyToSelected().year &&\n listKeyFromSelected().year === listKeyToSelected().year\n ) {\n <div class=\"bg-[#ffffff] w-[21px] h-[21px] cursor-none flex items-center justify-center rounded-[50px]\"></div>\n }\n @if (\n !calendarVariables().right().maxDate ||\n calendarVariables()\n .right()\n .maxDate?.isAfter(calendarVariables().right().calendar && calendarVariables().right().calendar?.lastDay)\n ) {\n <div (click)=\"handlerClickNext(sideEnum.right)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables().right().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format('YYYY') }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span\n class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dayofweek }}\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of calendarVariables().right().calRows?.(); track row) {\n <tr\n class=\"h-[32px]\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.classList\">\n @for (col of calendarVariables().right().calCols?.(); track col) {\n <td\n class=\"libs-ui-font-h5r\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.[col]\"\n [class.today]=\"\n calendarVariables().right().calendar &&\n calendarVariables().right().calendar?.[row]?.[col]?.date() === today().date() &&\n calendarVariables().right().calendar?.[row]?.[col]?.month() === today().month() &&\n calendarVariables().right().calendar &&\n calendarVariables().right().calendar?.[row]?.[col]?.year() === today().year()\n \"\n (click)=\"handlerPickerDate($event, sideEnum.right, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.right, row, col)\">\n <span>{{ calendarVariables().right().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center items-center pt-[12px]\">\n <div\n class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().righthour()\"\n (outChange)=\"handlerChangeTimeValue($event, 'righthour')\"\n (outInputEvent)=\"handlerInputEvent($event, 'righthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'righthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'righthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input\n classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().rightminute()\"\n (outInputEvent)=\"handlerInputEvent($event, 'rightminute')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'rightminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'rightminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'rightminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n <div>\n <div class=\"flex w-full\">\n @if (!isSingle() && hasTimePicker()) {\n <div class=\"mt-[8px] libs-ui-font-h7r text-[#ff5454] h-[14px]\">\n @if (timePickerError()) {\n <span>{{ 'i18n_date_compare_start_end_message_error' | translate }}</span>\n }\n </div>\n }\n </div>\n @if (!quickRangesArray().length || !isSingle()) {\n <div class=\"flex w-full pt-[16px] justify-between\">\n <div class=\"flex items-center\">\n @if (!isSingle()) {\n @if (!endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span>{{ computedDisplayTimeLeft() }}</span>\n }\n ‐\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span>{{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n @if (endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span>{{ computedDisplayTimeLeft() }}</span>\n }\n ‐\n <span>{{ endDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span>{{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n }\n </div>\n\n <div class=\"flex\">\n <libs_ui-components-buttons-button\n class=\"mr-[12px]\"\n label=\"i18n_cancel\"\n type=\"button-third\"\n (outClick)=\"handlerClickCancel($event)\" />\n <libs_ui-components-buttons-button\n label=\"i18n_select\"\n (outClick)=\"handlerClickApply($event)\" />\n </div>\n </div>\n }\n </div>\n</div>\n", styles: [".libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown{display:flex;align-items:center}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar table{border-collapse:inherit;border-spacing:0 2px}.libs-ui-component-custom_ranges-calendar th,.libs-ui-component-custom_ranges-calendar td{padding:0;text-align:center;min-width:32px}.libs-ui-component-custom_ranges-calendar th span,.libs-ui-component-custom_ranges-calendar td span{pointer-events:none}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:before{font-size:20px}.libs-ui-component-custom_ranges-calendar td,.libs-ui-component-custom_ranges-calendar th{cursor:pointer;height:2em;width:2em}.libs-ui-component-custom_ranges-calendar td.available:hover,.libs-ui-component-custom_ranges-calendar th.available:hover{background-color:#f8f5fe;border-color:transparent;border-radius:8px;color:inherit;background-repeat:no-repeat;background-size:.5em;background-position:center;margin:.25em 0;opacity:.8;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms}.libs-ui-component-custom_ranges-calendar td{margin:.25em 0;background-color:#fff;transition:background-color .2s ease;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms;color:#071631!important}.libs-ui-component-custom_ranges-calendar td:hover{color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.off,.libs-ui-component-custom_ranges-calendar td.off.in-range,.libs-ui-component-custom_ranges-calendar td.off.start-date,.libs-ui-component-custom_ranges-calendar td.off.end-date{background-color:#fff;border-color:transparent;color:#cdd0d6!important}.libs-ui-component-custom_ranges-calendar td.focus-off{background-color:#f8f5fe!important}.libs-ui-component-custom_ranges-calendar td.in-range{background-color:#f8f5fe;border-color:transparent;border-radius:0;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today{position:relative;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today:after{position:absolute;content:\"\";width:2px;height:2px;background-color:#8e61ee;left:49%;bottom:5px}.libs-ui-component-custom_ranges-calendar td.active{transition:background .3s ease-out;background:#0000001a}.libs-ui-component-custom_ranges-calendar td.active.today:after{position:absolute;content:\"\";background-color:#fff}.libs-ui-component-custom_ranges-calendar td.active.start-date{border-radius:8px 0 0 8px}.libs-ui-component-custom_ranges-calendar td.active.end-date{border-radius:0 8px 8px 0}.libs-ui-component-custom_ranges-calendar td.active.full-date{border-radius:8px}.libs-ui-component-custom_ranges-calendar td.active,.libs-ui-component-custom_ranges-calendar td.active:hover{background-color:#8e61ee;border-color:transparent;color:#fff!important}.libs-ui-component-custom_ranges-calendar th.month{width:auto}.libs-ui-component-custom_ranges-calendar td.disabled,.libs-ui-component-custom_ranges-calendar option.disabled{color:#999!important;cursor:not-allowed;text-decoration:line-through;background-color:#f4f5f7}.libs-ui-component-custom_ranges-calendar .dropdowns{background-repeat:no-repeat;background-size:10px;background-position-y:center;background-position-x:right}.libs-ui-component-custom_ranges-calendar th.month>div{position:relative;display:inline-block}@media (min-width: 564px){.libs-ui-component-custom_ranges{width:auto}}\n"] }]
|
|
1286
|
+
}], ctorParameters: () => [] });
|
|
1287
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RhdGV0aW1lL3BpY2tlci9zcmMvY3VzdG9tLXJhbmdlcy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZGF0ZXRpbWUvcGlja2VyL3NyYy9jdXN0b20tcmFuZ2VzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ2hNLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBaUQsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoSSxPQUFPLEVBQWtELG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFLeEksT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sS0FBZ0IsTUFBTSxPQUFPLENBQUM7QUFDckMsT0FBTyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakksT0FBTyxF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Q0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWhQLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ2QsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3BCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTztJQUNULENBQUM7d0dBMzlDVSwyREFBMkQ7NEZBQTNELDJEQUEyRCx3dEZDaEN4RSx1LzNCQXlkQSw0b0lEM2JZLGVBQWUsNEZBQUUsaUNBQWlDLGkxREFBRSxvQ0FBb0Msd2hEQUFFLHNDQUFzQzs7NEZBRS9ILDJEQUEyRDtrQkFUdkUsU0FBUzsrQkFFRSwyREFBMkQsY0FHekQsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsZUFBZSxFQUFFLGlDQUFpQyxFQUFFLG9DQUFvQyxFQUFFLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGQsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElGb2N1c0FuZEJsdXJFdmVudCwgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNJbnB1dENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLWlucHV0JztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBJRmxhZ01vdXNlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IElFdmVudCB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgSUh0dHBSZXF1ZXN0Q29uZmlnIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtaHR0cC1yZXF1ZXN0JztcbmltcG9ydCB7IGdldERheWpzLCBpc0VtcHR5LCBzZXQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCBkYXlqcywgeyBEYXlqcyB9IGZyb20gJ2RheWpzJztcbmltcG9ydCBpc29XZWVrIGZyb20gJ2RheWpzL3BsdWdpbi9pc29XZWVrJztcbmltcG9ydCB7IGdldE1vbnRoc0RldGFpbEJ5SWQsIGdldE1vbnRoc0xpc3RDb25maWcsIGdldFllYXJzRGV0YWlsQnlJZCwgZ2V0WWVhcnNMaXN0Q29uZmlnIH0gZnJvbSAnLi4vLi4vZGVmaW5lcy9jYWxlbmRhci5kZWZpbmUnO1xuaW1wb3J0IHsgREVGQVVMVF9NQVhfWUVBUiwgREVGQVVMVF9NSU5fWUVBUiB9IGZyb20gJy4uLy4uL2RlZmluZXMvY29tbW9uLWRhdGUuZGVmaW5lJztcbmltcG9ydCB7IGRlZmF1bHRMb2NhbGVDb25maWcsIGdldERhdGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vZGVmaW5lcy9kYXRlLW9wdGlvbnMuZGVmaW5lJztcbmltcG9ydCB7IElFbWl0RGF0ZUNhbGVuZGFyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jYWxlbmRhci1lbWl0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJQ2FsZW5kYXIsIElDYWxlbmRhclZhcmlhYmxlcywgSURhdGVSYW5nZSwgSVNwbGl0UGlja2VyRGF0ZSwgU2lkZUVudW0gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2NhbGVuZGFyLXZhcmlhYmxlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUNhbGVuZGFyRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Z1bmN0aW9uLWNvbnRyb2wuaW50ZXJmYWNlJztcbmltcG9ydCB7IExvY2FsaXphdGlvbkNvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGlja2VyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJQ2hlY2tUaW1lcGlja2VyU2VsZWN0ZWQsIElTZWxlY3RlZE9sZCwgSVRpbWVwaWNrZXJJdGVtVmFsdWUsIElUaW1lcGlja2VyVmFyaWFibGVzLCBJVGltZXBpY2tlclZhcmlhYmxlc1NpZGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3RpbWUtdmFyaWFibGVzLmludGVyZmFjZSc7XG5kYXlqcy5leHRlbmQoaXNvV2Vlayk7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZGF0ZXRpbWUtcGlja2VyLWN1c3RvbV9yYW5nZXMtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzSW5wdXRDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0RhdGV0aW1lUGlja2VyQ3VzdG9tUmFuZ2VzQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lkZUVudW0gPSBTaWRlRW51bTtcbiAgcHJvdGVjdGVkIGNhbGVuZGFyVmFyaWFibGVzID0gc2lnbmFsPElDYWxlbmRhclZhcmlhYmxlcz4oeyBsZWZ0OiBzaWduYWwoe30pLCByaWdodDogc2lnbmFsKHt9KSB9KTtcbiAgcHJvdGVjdGVkIHRpbWVwaWNrZXJWYXJpYWJsZXMgPSBzaWduYWw8SVRpbWVwaWNrZXJWYXJpYWJsZXM+KHsgbGVmdDogc2lnbmFsKHsgc2VsZWN0ZWRIb3VyOiAwLCBzZWxlY3RlZE1pbnV0ZTogMCB9KSwgcmlnaHQ6IHNpZ25hbCh7IHNlbGVjdGVkSG91cjogMjMsIHNlbGVjdGVkTWludXRlOiA1OSB9KSB9KTtcbiAgcHJvdGVjdGVkIGRpc2FibGVNb250aCA9IHNpZ25hbDx7IGxlZnQ6IFdyaXRhYmxlU2lnbmFsPEFycmF5PGFueT4+OyByaWdodDogV3JpdGFibGVTaWduYWw8QXJyYXk8YW55Pj4gfT4oeyBsZWZ0OiBzaWduYWwoW10pLCByaWdodDogc2lnbmFsKFtdKSB9KTtcbiAgcHJvdGVjdGVkIHRvZGF5ID0gc2lnbmFsPERheWpzPihnZXREYXlqcygpKTtcbiAgcHJvdGVjdGVkIGxpc3RLZXlGcm9tU2VsZWN0ZWQgPSBzaWduYWw8eyBtb250aDogYW55OyB5ZWFyOiBhbnkgfT4oeyBtb250aDogdW5kZWZpbmVkLCB5ZWFyOiB1bmRlZmluZWQgfSk7XG4gIHByb3RlY3RlZCBsaXN0S2V5VG9TZWxlY3RlZCA9IHNpZ25hbDx7IG1vbnRoOiBhbnk7IHllYXI6IGFueSB9Pih7IG1vbnRoOiB1bmRlZmluZWQsIHllYXI6IHVuZGVmaW5lZCB9KTtcbiAgcHJvdGVjdGVkIGNoZWNrU2hvd0xpc3REcm9wZG93biA9IHNpZ25hbDx7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfT4oe30pO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRRdWlja1JhbmdlID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgbGVmdENhbGVuZGFyID0gc2lnbmFsPHsgY2FsZW5kYXI/OiBJQ2FsZW5kYXI7IG1vbnRoPzogRGF5anMgfT4oe30pO1xuICBwcm90ZWN0ZWQgcmlnaHRDYWxlbmRhciA9IHNpZ25hbDx7IGNhbGVuZGFyPzogSUNhbGVuZGFyOyBtb250aD86IERheWpzIH0+KHt9KTtcblxuICBwcm90ZWN0ZWQgbGlzdE1vbnRoc0NvbmZpZyA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBtb250aEh0dHBEZXRhaWxDb25maWcgPSBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnPihnZXRNb250aHNEZXRhaWxCeUlkKCkpO1xuICBwcm90ZWN0ZWQgbGlzdExlZnRZZWFyQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxpc3RSaWdodFllYXJDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGlzdFllYXJDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGVmdFllYXJIdHRwRGV0YWlsQ29uZmlnID0gc2lnbmFsPElIdHRwUmVxdWVzdENvbmZpZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIHJpZ2h0WWVhckh0dHBEZXRhaWxDb25maWcgPSBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCB0aW1lUGlja2VyRXJyb3IgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZUxlZnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWUoeyBzZWxlY3RlZEhvdXI6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCksIHNlbGVjdGVkTWludXRlOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0bWludXRlKCkgfSkpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lKHsgc2VsZWN0ZWRIb3VyOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSwgc2VsZWN0ZWRNaW51dGU6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKCkgfSkpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZUxlZnRJbnB1dEhvdXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5sZWZ0LCAnaG91cicpKTtcbiAgcHJvdGVjdGVkIGNvbXB1dGVkRGlzcGxheVRpbWVMZWZ0SW5wdXRNaW51dGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5sZWZ0LCAnbWludXRlJykpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0SW5wdXRIb3VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lSW5wdXQoU2lkZUVudW0ucmlnaHQsICdob3VyJykpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0SW5wdXRNaW51dGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5yaWdodCwgJ21pbnV0ZScpKTtcbiAgcHJvdGVjdGVkIHRpbWVwaWNrZXJWYWx1ZUl0ZW0gPSBzaWduYWw8SVRpbWVwaWNrZXJJdGVtVmFsdWU+KHsgbGVmdGhvdXI6IHNpZ25hbCgwKSwgbGVmdG1pbnV0ZTogc2lnbmFsKDApLCByaWdodGhvdXI6IHNpZ25hbCgwKSwgcmlnaHRtaW51dGU6IHNpZ25hbCgwKSB9KTtcblxuICBwcml2YXRlIGZ1bmN0aW9uQ29udHJvbHMgPSBuZXcgTWFwPHN0cmluZywgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQgfCBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcHJpdmF0ZSBwaWNraW5nRGF0ZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaXNTaG93biA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbm93SG92ZXJlZERhdGUgPSBzaWduYWw8RGF5anMgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSB0aW1lUGlja2VySW5jcmVtZW50ID0gc2lnbmFsPG51bWJlcj4oMSk7XG4gIHByaXZhdGUgc2VsZWN0ZWRMYWJlbCA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUga2V5Q29kZUJhY2tzcGFjZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgY2hlY2tCYWNrc3BhY2VGb2N1cyA9IHNpZ25hbDxJVGltZXBpY2tlckl0ZW1WYWx1ZT4oeyBsZWZ0aG91cjogc2lnbmFsKDEpLCBsZWZ0bWludXRlOiBzaWduYWwoMSksIHJpZ2h0aG91cjogc2lnbmFsKDEpLCByaWdodG1pbnV0ZTogc2lnbmFsKDEpIH0pO1xuICBwcml2YXRlIGlzWmVybyA9IHNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIG9sZERhdGUgPSBzaWduYWw8SVNlbGVjdGVkT2xkPih7IHN0YXJ0OiBkYXlqcygwKSwgZW5kOiBkYXlqcygwKSB9KTtcbiAgcHJpdmF0ZSBpc1NlbGVjdGVkRGF0YSA9IHNpZ25hbDxJQ2hlY2tUaW1lcGlja2VyU2VsZWN0ZWQ+KHsgbGVmdG1vbnRoOiBmYWxzZSwgbGVmdHllYXI6IGZhbHNlLCByaWdodG1vbnRoOiBmYWxzZSwgcmlnaHR5ZWFyOiBmYWxzZSB9KTtcbiAgcHJpdmF0ZSBzcGxpdFBpY2tlckRhdGUgPSBzaWduYWw8SVNwbGl0UGlja2VyRGF0ZT4oeyBzdGFydDogc2lnbmFsKHsgbW9udGg6IDAsIHllYXI6IDAsIGRheTogMCwgaG91cjogMCwgbWludXRlOiAwIH0pLCBlbmQ6IHNpZ25hbCh7IG1vbnRoOiAwLCB5ZWFyOiAwLCBkYXk6IDAsIGhvdXI6IDIzLCBtaW51dGU6IDU5IH0pIH0pO1xuXG4gIC8qKiBJTlBVVCAqL1xuICByZWFkb25seSBxdWlja1Jhbmdlc0FycmF5ID0gaW5wdXQ8QXJyYXk8SURhdGVSYW5nZT4+KFtdKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXI+KDEyMDAsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IDEyMDAgfSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBpc1NpbmdsZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2hvd0Ryb3Bkb3duc1NlbGVjdCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBoYXNUaW1lUGlja2VyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGZsYWdNb3VzZSA9IGlucHV0PElGbGFnTW91c2U+KHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGRhdGVPcHRpb25zID0gaW5wdXQ8TG9jYWxpemF0aW9uQ29uZmlnPih7IC4uLmRlZmF1bHRMb2NhbGVDb25maWcoKSwgLi4uZ2V0RGF0ZU9wdGlvbnMoKSB9KTtcbiAgcmVhZG9ubHkgYXV0b0FwcGx5ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBoYXNTZWNvbmRQaWNrZXIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dSYW5nZUxhYmVsT25JbnB1dCA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcmVhZG9ubHkgc3RhcnREYXRlID0gbW9kZWw8RGF5anMgfCB1bmRlZmluZWQ+KGdldERheWpzKCkuc3RhcnRPZignZGF5JykpO1xuICByZWFkb25seSBlbmREYXRlID0gbW9kZWw8RGF5anMgfCB1bmRlZmluZWQ+KGdldERheWpzKCkuZW5kT2YoJ2RheScpKTtcbiAgcmVhZG9ubHkgbWluRGF0ZSA9IGlucHV0PERheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCBEYXlqcyB8IHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7IHRyYW5zZm9ybTogdGhpcy50cmFuc2Zvcm1NaW5NYXhEYXRlLmJpbmQodGhpcykgfSk7XG4gIHJlYWRvbmx5IG1heERhdGUgPSBpbnB1dDxEYXlqcyB8IHN0cmluZyB8IHVuZGVmaW5lZCwgRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwgeyB0cmFuc2Zvcm06IHRoaXMudHJhbnNmb3JtTWluTWF4RGF0ZS5iaW5kKHRoaXMpIH0pO1xuICByZWFkb25seSBsaXN0WWVhckhpZGRlbklucHV0U2VhcmNoID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4odHJ1ZSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gdHJ1ZSB9KTtcbiAgLyoqIE9VVFBVVCAqL1xuICByZWFkb25seSBvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlID0gb3V0cHV0PElGbGFnTW91c2U+KCk7XG4gIC8vIHJlYWRvbmx5IG91dFN0YXJ0RGF0ZUNoYW5nZWQgPSBvdXRwdXQ8eyBzdGFydERhdGU6IERheWpzIHwgdW5kZWZpbmVkIH0+KCk7XG4gIC8vIHJlYWRvbmx5IG91dEVuZERhdGVDaGFuZ2VkID0gb3V0cHV0PHsgZW5kRGF0ZTogRGF5anMgfCB1bmRlZmluZWQgfT4oKTtcbiAgcmVhZG9ubHkgb3V0UGlja2VyRGF0ZSA9IG91dHB1dDxJRW1pdERhdGVDYWxlbmRhcj4oKTtcbiAgLy8gcmVhZG9ubHkgb3V0UmFuZ2VDbGlja2VkOiBFdmVudEVtaXR0ZXI8SVJhbmdlc0NsaWNrZWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICByZWFkb25seSBvdXRDYW5jZWwgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRVcGRhdGVXaWR0aCA9IG91dHB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SUNhbGVuZGFyRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgLyoqIElOSkVDVElPTiAqL1xuICBwcml2YXRlIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICByZWFkb25seSBwaWNrZXJDb250YWluZXIgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ3BpY2tlckNvbnRhaW5lcicpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubGlzdE1vbnRoc0NvbmZpZy5zZXQoZ2V0TW9udGhzTGlzdENvbmZpZyh0aGlzLnRyYW5zbGF0ZSkpO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG9sZFN0YXJ0ID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpIH0pO1xuICAgICAgY29uc3Qgb2xkRW5kID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLmVuZERhdGUoKT8uY2xvbmUoKSB9KTtcblxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5vbGREYXRlLnNldCh7IHN0YXJ0OiBvbGRTdGFydCwgZW5kOiBvbGRFbmQgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKSB9KTtcbiAgICBjb25zdCBlbmREYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLmVuZERhdGUoKT8uY2xvbmUoKSB9KTtcblxuICAgIHRoaXMuc3BsaXRQaWNrZXJEYXRlLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5zdGFydC51cGRhdGUoKHNpZGVDdXJyZW50KSA9PiB7XG4gICAgICAgIHNpZGVDdXJyZW50LmRheSA9IChzdGFydERhdGUgPz8gZ2V0RGF5anMoKS5zdGFydE9mKCdkYXknKSkuZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBzaWRlQ3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgY3VycmVudC5lbmQudXBkYXRlKChzaWRlQ3VycmVudCkgPT4ge1xuICAgICAgICBzaWRlQ3VycmVudC5kYXkgPSAoZW5kRGF0ZSA/PyBnZXREYXlqcygpLmVuZE9mKCdkYXknKSkuZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBzaWRlQ3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0RGF0ZSAmJiB0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5zZXRTdGFydERhdGUoc3RhcnREYXRlKTtcbiAgICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcihTaWRlRW51bS5sZWZ0KTtcbiAgICB9XG5cbiAgICBpZiAoZW5kRGF0ZSAmJiB0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5zZXRFbmREYXRlKGVuZERhdGUpO1xuICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy5idWlsZENvbmZpZ1llYXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5idWlsZENvbmZpZ1llYXIoU2lkZUVudW0ucmlnaHQsIHN0YXJ0RGF0ZT8ueWVhcigpKTtcbiAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ubGVmdCk7XG4gICAgaWYgKChnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pPy55ZWFyKCkgPz8gREVGQVVMVF9NQVhfWUVBUikgPCAoc3RhcnREYXRlPy55ZWFyKCkgfHwgMCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oeyBrZXk6IGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk/LnllYXIoKSBhcyB1bmtub3duIGFzIHN0cmluZyB9LCBTaWRlRW51bS5sZWZ0ICsgJ3llYXInKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNTaW5nbGUoKSkge1xuICAgICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5yaWdodCk7XG4gICAgICBpZiAoKGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk/LnllYXIoKSA/PyBERUZBVUxUX01BWF9ZRUFSKSA8IChlbmREYXRlPy55ZWFyKCkgfHwgMCkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0ZWREcm9wZG93bih7IGtleTogZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KT8ueWVhcigpIGFzIHVua25vd24gYXMgc3RyaW5nIH0sIFNpZGVFbnVtLnJpZ2h0ICsgJ3llYXInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGlzLnJlbmRlclJhbmdlcygpO1xuICAgIHRoaXMuZm9ybWF0TW9udGhZZWFyKCk7XG4gICAgdGhpcy5vdXRVcGRhdGVXaWR0aC5lbWl0KDEpO1xuICAgIHRoaXMudXBkYXRlRWxlbWVudCgpO1xuICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS5zZXQoe1xuICAgICAgbGVmdGhvdXI6IHNpZ25hbCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5sZWZ0KCkuc2VsZWN0ZWRIb3VyKSxcbiAgICAgIHJpZ2h0aG91cjogc2lnbmFsKHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpLnJpZ2h0KCkuc2VsZWN0ZWRIb3VyKSxcbiAgICAgIGxlZnRtaW51dGU6IHNpZ25hbCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5sZWZ0KCkuc2VsZWN0ZWRNaW51dGUpLFxuICAgICAgcmlnaHRtaW51dGU6IHNpZ25hbCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5yaWdodCgpLnNlbGVjdGVkTWludXRlKSxcbiAgICB9KTtcblxuICAgIC8vIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHsgYnVpbGREZWZhdWx0UmFuZ2U6IHRoaXMuYnVpbGREZWZhdWx0UmFuZ2UuYmluZCh0aGlzKSwgYXBwbHlUb1NlbGVjdDogdGhpcy5hcHBseVRvU2VsZWN0LmJpbmQodGhpcykgfSlcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb25maWdZZWFyKHNpZGU6IFNpZGVFbnVtLCBzdGFydFllYXI/OiBudW1iZXIpIHtcbiAgICBjb25zdCBtaW5EYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1pbkRhdGUoKSB9KTtcbiAgICBjb25zdCBtYXhEYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KTtcblxuICAgIGNvbnN0IGxpc3RMZWZ0WWVhciA9IFtdO1xuICAgIGNvbnN0IGxpc3RSaWdodFllYXIgPSBbXTtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICBjb25zdCBzdGFydCA9IG1heERhdGU/LnllYXIoKSA/PyBERUZBVUxUX01BWF9ZRUFSO1xuICAgICAgY29uc3QgZW5kID0gbWluRGF0ZT8ueWVhcigpID8/IERFRkFVTFRfTUlOX1lFQVI7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPj0gZW5kOyBpLS0pIHtcbiAgICAgICAgbGlzdExlZnRZZWFyLnB1c2goe1xuICAgICAgICAgIGlkOiBpLFxuICAgICAgICAgIGxhYmVsOiBgJHtpfWAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5saXN0TGVmdFllYXJDb25maWcuc2V0KGdldFllYXJzTGlzdENvbmZpZyhsaXN0TGVmdFllYXIpKTtcbiAgICAgIHRoaXMubGVmdFllYXJIdHRwRGV0YWlsQ29uZmlnLnNldChnZXRZZWFyc0RldGFpbEJ5SWQobGlzdExlZnRZZWFyKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IG1heERhdGU/LnllYXIoKSA/PyBERUZBVUxUX01BWF9ZRUFSO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0WWVhciA/PyBtaW5EYXRlPy55ZWFyKCkgPz8gZ2V0RGF5anMoKS55ZWFyKCk7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpID49IGVuZDsgaS0tKSB7XG4gICAgICBsaXN0UmlnaHRZZWFyLnB1c2goe1xuICAgICAgICBpZDogaSxcbiAgICAgICAgbGFiZWw6IGAke2l9YCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubGlzdFJpZ2h0WWVhckNvbmZpZy5zZXQoZ2V0WWVhcnNMaXN0Q29uZmlnKGxpc3RSaWdodFllYXIpKTtcbiAgICB0aGlzLnJpZ2h0WWVhckh0dHBEZXRhaWxDb25maWcuc2V0KGdldFllYXJzRGV0YWlsQnlJZChsaXN0UmlnaHRZZWFyKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUZsYWdNb3VzZShmbGFnTW91c2U6IElGbGFnTW91c2UpIHtcbiAgICB0aGlzLm91dENoYW5nU3RhZ2VGbGFnTW91c2UuZW1pdChmbGFnTW91c2UpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGFydEVuZERhdGUoZGF0ZTogRGF5anMpIHtcbiAgICBkYXRlID0gZ2V0RGF5anMoeyBkYXRlIH0pO1xuICAgIGlmICh0aGlzLmVuZERhdGUoKSB8fCBkYXRlLmlzQmVmb3JlKGdldERheWpzKHsgZGF0ZTogdGhpcy5zdGFydERhdGUoKSB9KSwgJ2RheScpKSB7XG4gICAgICBpZiAodGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgZGF0ZSA9IHRoaXMuZ2V0RGF0ZVdpdGhUaW1lKGRhdGUsIFNpZGVFbnVtLmxlZnQpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbmREYXRlLnNldCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5zZXRTdGFydERhdGUoZ2V0RGF5anMoeyBkYXRlOiBkYXRlLmNsb25lKCkgfSkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5lbmREYXRlKCkgJiYgdGhpcy5zdGFydERhdGUoKSAmJiBkYXRlLmlzQmVmb3JlKGdldERheWpzKHsgZGF0ZTogdGhpcy5zdGFydERhdGUoKSB9KSkpIHtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZShnZXREYXlqcyh7IGRhdGU6IHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCkgfSkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgZGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5nZXREYXRlV2l0aFRpbWUoZGF0ZSwgU2lkZUVudW0ucmlnaHQpIH0pO1xuICAgIH1cbiAgICBpZiAoIWRhdGUuaXNCZWZvcmUoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpIH0pLCAnZGF5JykpIHtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZShnZXREYXlqcyh7IGRhdGU6IGRhdGUuY2xvbmUoKSB9KSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmF1dG9BcHBseSgpKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVNlbGVjdGVkTGFiZWwoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZVNlbGVjdGVkTGFiZWwoKSB7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdE1vbnRoWWVhcigpIHtcbiAgICBjb25zdCBtb250aCA9ICh0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkubGVmdCgpLmRyb3Bkb3ducz8uKCk/LmN1cnJlbnRNb250aCA/PyAwKSArIDE7XG4gICAgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9IG1vbnRoO1xuICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpLmxlZnQoKS5kcm9wZG93bnM/LigpPy5jdXJyZW50WWVhcjtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGUoKSkge1xuICAgICAgdGhpcy5pc1NlbGVjdGVkRGF0YS5zZXQoeyBsZWZ0bW9udGg6IHRydWUsIGxlZnR5ZWFyOiB0cnVlLCByaWdodG1vbnRoOiB0cnVlLCByaWdodHllYXI6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJpZ2h0TW9udGggPSAodGhpcy5jYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuZHJvcGRvd25zPy4oKT8uY3VycmVudE1vbnRoID8/IDApICsgMTtcbiAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9IHJpZ2h0TW9udGg7XG4gICAgICBjdXJyZW50LnllYXIgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5kcm9wZG93bnM/LigpPy5jdXJyZW50WWVhcjtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5pc1NlbGVjdGVkRGF0YS5zZXQoeyBsZWZ0bW9udGg6IHRydWUsIGxlZnR5ZWFyOiB0cnVlLCByaWdodG1vbnRoOiB0cnVlLCByaWdodHllYXI6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YXJ0RGF0ZShzdGFydERhdGU6IERheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3RhcnREYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KGdldERheWpzKHsgZGF0ZTogZGF5anMoc3RhcnREYXRlLCB0aGlzLmRhdGVPcHRpb25zKCkuZm9ybWF0KSwgcmV0dXJuRGF5anNJZkNvbmZpZ0RhdGVOb3RFeGlzdDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3RhcnREYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZ2V0RGF5anMoeyBkYXRlOiBzdGFydERhdGUsIHJldHVybkRheWpzSWZDb25maWdEYXRlTm90RXhpc3Q6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnBpY2tpbmdEYXRlLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuc3RhcnREYXRlLnNldChnZXREYXlqcyh7IGRhdGU6IHRoaXMuc3RhcnREYXRlKCk/LnN0YXJ0T2YoJ2RheScpIH0pKTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGFydERhdGVJblRpbWVQaWNrZXIoKTtcblxuICAgIGlmICh0aGlzLm1pbkRhdGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5pc0JlZm9yZSh0aGlzLm1pbkRhdGUoKSkpIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlLnNldChnZXREYXlqcyh7IGRhdGU6IHRoaXMubWluRGF0ZSgpIH0pPy5jbG9uZSgpKTtcblxuICAgICAgdGhpcy5zZXRTdGFydERhdGVJblRpbWVQaWNrZXIoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4RGF0ZSgpICYmIHRoaXMuc3RhcnREYXRlKCk/LmlzQWZ0ZXIodGhpcy5tYXhEYXRlKCkpKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KT8uY2xvbmUoKSk7XG4gICAgICB0aGlzLnNldFN0YXJ0RGF0ZUluVGltZVBpY2tlcigpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNTaG93bigpKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB9XG4gICAgLy8gdGhpcy5vdXRTdGFydERhdGVDaGFuZ2VkLmVtaXQoeyBzdGFydERhdGU6IHRoaXMuc3RhcnREYXRlKCkgfSk7XG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCkge1xuICAgIGlmICghdGhpcy5oYXNUaW1lUGlja2VyKCkgfHwgIXRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydERhdGUudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3VycmVudC5taW51dGUoTWF0aC5yb3VuZChjdXJyZW50Lm1pbnV0ZSgpIC8gdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpICogdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNldEVuZERhdGUoZW5kRGF0ZTogRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuZERhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KGdldERheWpzKHsgZGF0ZTogZGF5anMoZW5kRGF0ZSwgdGhpcy5kYXRlT3B0aW9ucygpLmZvcm1hdCksIHJldHVybkRheWpzSWZDb25maWdEYXRlTm90RXhpc3Q6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuZERhdGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLnBpY2tpbmdEYXRlLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KGdldERheWpzKHsgZGF0ZTogZGF5anMoZW5kRGF0ZSksIHJldHVybkRheWpzSWZDb25maWdEYXRlTm90RXhpc3Q6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZW5kRGF0ZSgpIHx8ICF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5lbmREYXRlLnNldCh0aGlzLmVuZERhdGUoKT8uYWRkKDEsICdkJykuc3RhcnRPZignZGF5Jykuc3VidHJhY3QoMSwgJ3NlY29uZCcpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpICYmIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSB7XG4gICAgICB0aGlzLmVuZERhdGUudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50Lm1pbnV0ZShNYXRoLnJvdW5kKGN1cnJlbnQubWludXRlKCkgLyB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSkgKiB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpPy5pc0JlZm9yZSh0aGlzLnN0YXJ0RGF0ZSgpKSkge1xuICAgICAgdGhpcy5lbmREYXRlLnNldCh0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4RGF0ZSgpICYmIHRoaXMuZW5kRGF0ZSgpPy5pc0FmdGVyKHRoaXMubWF4RGF0ZSgpKSkge1xuICAgICAgdGhpcy5lbmREYXRlLnNldChnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pPy5jbG9uZSgpKTtcbiAgICB9XG4gICAgLy8gdGhpcy5vdXRFbmREYXRlQ2hhbmdlZC5lbWl0KHsgZW5kRGF0ZTogdGhpcy5lbmREYXRlKCkgfSk7XG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFuZGxlckhvdmVyRGF0ZShldmVudDogRXZlbnQsIHNpZGU6IFNpZGVFbnVtLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IGxlZnRDYWxEYXRlID0gdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpLmxlZnQoKS5jYWxlbmRhcj8uW3Jvd11bY29sXTtcbiAgICBjb25zdCByaWdodENhbERhdGUgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uW3Jvd11bY29sXTtcblxuICAgIGlmICghdGhpcy5waWNraW5nRGF0ZSB8fCAhcmlnaHRDYWxEYXRlIHx8ICFsZWZ0Q2FsRGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5vd0hvdmVyZWREYXRlLnNldChzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gbGVmdENhbERhdGUgOiByaWdodENhbERhdGUpO1xuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5yaWdodCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXREaXNhYmxlKHR5cGU6ICdsZWZ0JyB8ICdyaWdodCcpIHtcbiAgICBjb25zdCBtaW5EYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1pbkRhdGUoKSB9KTtcbiAgICBjb25zdCBtYXhEYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KTtcblxuICAgIGlmICh0eXBlID09PSAnbGVmdCcpIHtcbiAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkubGVmdC5zZXQoW10pO1xuXG4gICAgICBpZiAobWluRGF0ZSAmJiBtaW5EYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtaW5EYXRlPy5tb250aCgpICsgMTsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlTW9udGgoKS5sZWZ0LnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1heERhdGUgJiYgbWF4RGF0ZT8ueWVhcigpID09PSB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBtYXhEYXRlPy5tb250aCgpICsgMjsgaSA8IDEzOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVNb250aCgpLmxlZnQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc2FibGVNb250aCgpLnJpZ2h0LnNldChbXSk7XG4gICAgaWYgKG1pbkRhdGUgJiYgbWluRGF0ZT8ueWVhcigpID09PSB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikge1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtaW5EYXRlPy5tb250aCgpICsgMTsgaSsrKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkucmlnaHQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWF4RGF0ZSAmJiBtYXhEYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICBmb3IgKGxldCBpID0gbWF4RGF0ZT8ubW9udGgoKSArIDI7IGkgPCAxMzsgaSsrKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkucmlnaHQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIpID09PSBOdW1iZXIodGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpOyBpKyspIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja1ByZXYoc2lkZTogU2lkZUVudW0pIHtcbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCAmJiB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoKSB7XG4gICAgICB0aGlzLmxlZnRDYWxlbmRhci51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LnN1YnRyYWN0KDEsICdtb250aCcpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LnN1YnRyYWN0KDEsICdtb250aCcpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9ICh0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICBjdXJyZW50LnllYXIgPSB0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8ueWVhcigpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLmdldERpc2FibGUoJ3JpZ2h0Jyk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tOZXh0KHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQpIHtcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyID09PSB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikge1xuICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmFkZCgxLCAnbW9udGgnKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gKHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy5tb250aCgpID8/IDApICsgMTtcbiAgICAgICAgICBjdXJyZW50LnllYXIgPSB0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8ueWVhcigpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmFkZCgxLCAnbW9udGgnKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/Lm1vbnRoKCkgPz8gMCkgKyAxO1xuICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFuZGxlclBpY2tlckRhdGUoZXZlbnQ6IGFueSwgc2lkZTogU2lkZUVudW0sIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKGV2ZW50LnRhcmdldD8udGFnTmFtZSA9PT0gJ1REJykge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2F2YWlsYWJsZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lID09PSAnU1BBTicpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQucGFyZW50RWxlbWVudCAmJiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYXZhaWxhYmxlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0ZU9wdGlvbnMoKS5jdXN0b21SYW5nZUxhYmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWlja1JhbmdlLnNldCh0aGlzLmRhdGVPcHRpb25zKCkuY3VzdG9tUmFuZ2VMYWJlbCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5jYWxlbmRhcj8uW3Jvd11bY29sXSA6IHRoaXMucmlnaHRDYWxlbmRhcigpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuXG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3BsaXRQaWNrZXJEYXRlLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudFtzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gJ3N0YXJ0JyA6ICdlbmQnXS51cGRhdGUoKHNpZGVDdXJyZW50KSA9PiB7XG4gICAgICAgIHNpZGVDdXJyZW50LmRheSA9IGRhdGUuZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBzaWRlQ3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0RW5kRGF0ZShkYXRlKTtcblxuICAgIGlmICh0aGlzLmlzU2luZ2xlKCkgJiYgdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgdGhpcy5zZXRFbmREYXRlKHRoaXMuc3RhcnREYXRlKCkpO1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG5cbiAgICAgIGlmICh0aGlzLmF1dG9BcHBseSgpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlckNsaWNrQXBwbHkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICBpZiAodGhpcy5hdXRvQXBwbHkoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpICYmIHRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICB0aGlzLmhhbmRsZXJDbGlja0FwcGx5KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0FwcGx5KGV2ZW50PzogRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgLy8gdGhpcy52YWxpZGF0ZSgpO1xuICAgIC8vIGlmICghdGhpcy52YWxpZGF0ZSgpKSB7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICAgIGlmICh0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5zZXRUaW1lSW5wdXQoU2lkZUVudW0ubGVmdCk7XG4gICAgICB0aGlzLnNldFRpbWVJbnB1dChTaWRlRW51bS5yaWdodCk7XG4gICAgfVxuICAgIHRoaXMuY2FsY3VsYXRlU2VsZWN0ZWRMYWJlbCgpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMYWJlbCgpKSB7XG4gICAgICB0aGlzLm91dFBpY2tlckRhdGUuZW1pdCh7IGRpc3BsYXlMYWJlbDogdGhpcy5zZWxlY3RlZExhYmVsKCksIHN0YXJ0RGF0ZTogdGhpcy5zdGFydERhdGUoKSwgZW5kRGF0ZTogdGhpcy5lbmREYXRlKCksIGRldGFpbERhdGVQaWNrZXI6IHRoaXMuc3BsaXRQaWNrZXJEYXRlKCkgfSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tDYW5jZWwoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zdGFydERhdGUuc2V0KGRheWpzKDApKTtcbiAgICB0aGlzLmVuZERhdGUuc2V0KGRheWpzKDApKTtcbiAgICB0aGlzLm91dENhbmNlbC5lbWl0KCcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sKGV2ZW50OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCB8IElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50LCB0eXBlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbHMuc2V0KHR5cGUsIGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWREcm9wZG93bihldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQsIHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZS5lbWl0KHtcbiAgICAgIGlzTW91c2VFbnRlcjogZmFsc2UsXG4gICAgICBpc01vdXNlRW50ZXJDb250ZW50OiBmYWxzZSxcbiAgICAgIGlzQ29udGFpbmVySGFzU2Nyb2xsOiBmYWxzZSxcbiAgICB9KTtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBgJHtTaWRlRW51bS5sZWZ0fW1vbnRoYDpcbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ucmlnaHR9bW9udGhgOlxuICAgICAgICB0aGlzLnVwZGF0ZU1vbnRoU2VsZWN0KGV2ZW50LCB0eXBlKTtcblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBgJHtTaWRlRW51bS5sZWZ0fXllYXJgOlxuICAgICAgY2FzZSBgJHtTaWRlRW51bS5yaWdodH15ZWFyYDpcbiAgICAgICAgdGhpcy51cGRhdGVZZWFyU2VsZWN0KGV2ZW50LCB0eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuc3BsaXRQaWNrZXJEYXRlLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLmxlZnR9bW9udGhgIHx8IHR5cGUgPT09IGAke1NpZGVFbnVtLmxlZnR9eWVhcmApIHtcbiAgICAgICAgY3VycmVudC5zdGFydC51cGRhdGUoKHN0YXJ0KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLmxlZnR9bW9udGhgKSB7XG4gICAgICAgICAgICBzdGFydC5tb250aCA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlID09PSBgJHtTaWRlRW51bS5sZWZ0fXllYXJgKSB7XG4gICAgICAgICAgICBzdGFydC55ZWFyID0gZXZlbnQua2V5IGFzIG51bWJlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3RhcnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50LmVuZC51cGRhdGUoKGVuZCkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gYCR7U2lkZUVudW0ucmlnaHR9bW9udGhgKSB7XG4gICAgICAgICAgZW5kLm1vbnRoID0gZXZlbnQua2V5IGFzIG51bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gYCR7U2lkZUVudW0ucmlnaHR9eWVhcmApIHtcbiAgICAgICAgICBlbmQueWVhciA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW5kO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNb250aFNlbGVjdChldmVudDogSUVtaXRTZWxlY3RLZXksIHR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHNpZGUgPSB0eXBlLmluY2x1ZGVzKFNpZGVFbnVtLmxlZnQpID8gU2lkZUVudW0ubGVmdCA6IFNpZGVFbnVtLnJpZ2h0O1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0oKS5kcm9wZG93bnM/LigpPy5jdXJyZW50WWVhciB8fCBnZXREYXlqcygpLnllYXIoKTtcbiAgICBjb25zdCBtb250aCA9IE51bWJlcihldmVudC5rZXkpIC0gMTtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGVkRGF0YSgpLmxlZnRtb250aCkge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQubGVmdG1vbnRoID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSBldmVudC5rZXk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChOdW1iZXIoZXZlbnQua2V5KSA+PSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICYmIE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyKSA9PT0gTnVtYmVyKHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSkge1xuICAgICAgICBpZiAoTnVtYmVyKGV2ZW50LmtleSkgPD0gMTEpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IE51bWJlcihldmVudC5rZXkpICsgMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE51bWJlcihldmVudC5rZXkpID09PSAxMikge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gMTtcbiAgICAgICAgICAgIGN1cnJlbnQueWVhciArPSAxO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZERhdGEoKS5yaWdodG1vbnRoKSB7XG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZERhdGEudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5yaWdodG1vbnRoID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gZXZlbnQua2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KHR5cGUpIGFzIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KT8ucmVtb3ZlTGlzdCgpO1xuXG4gICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuICAgIHRoaXMubW9udGhPclllYXJDaGFuZ2VkKG1vbnRoLCB5ZWFyLCBzaWRlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVllYXJTZWxlY3QoZXZlbnQ6IElFbWl0U2VsZWN0S2V5LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaWRlID0gdHlwZS5pbmNsdWRlcyhTaWRlRW51bS5sZWZ0KSA/IFNpZGVFbnVtLmxlZnQgOiBTaWRlRW51bS5yaWdodDtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGVkRGF0YSgpPy5sZWZ0eWVhcikge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQubGVmdHllYXIgPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXREaXNhYmxlKCdsZWZ0Jyk7XG4gICAgICAgIC8vIHRoaXMuU2V0TGlzdFllYXJSaWdodCh0aGlzLmxpc3RWaWV3S2V5U2VsZWN0ZWRZZWFyIGFzIG51bWJlcik7XG4gICAgICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KHR5cGUpIGFzIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KT8ucmVtb3ZlTGlzdCgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC55ZWFyID0gZXZlbnQua2V5O1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgJiYgdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIgJiYgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA+PSB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikge1xuICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQueWVhciA9IGV2ZW50LmtleTtcbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIDw9IDExKSB7XG4gICAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICsgMTtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gMTIpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCk7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5nZXREaXNhYmxlKCdsZWZ0Jyk7XG4gICAgICB0aGlzLmJ1aWxkQ29uZmlnWWVhcihTaWRlRW51bS5yaWdodCwgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciBhcyBudW1iZXIpO1xuICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scy5nZXQodHlwZSkgYXMgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQpPy5yZW1vdmVMaXN0KCk7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZERhdGEoKS5yaWdodHllYXIpIHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkRGF0YS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LnJpZ2h0eWVhciA9IGZhbHNlO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdldERpc2FibGUoJ3JpZ2h0Jyk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC55ZWFyID0gZXZlbnQua2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciAmJiB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyID49IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICAgIGlmICh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIDw9IDExKSB7XG4gICAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICsgMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoID09PSAxMikge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuICAgIGxldCBtb250aCA9IGdldERheWpzKCkubW9udGgoKTtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkge1xuICAgICAgbW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIC0gMTtcbiAgICB9XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIHtcbiAgICAgIG1vbnRoID0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSAtIDE7XG4gICAgfVxuICAgIGNvbnN0IHllYXIgPSBOdW1iZXIoZXZlbnQua2V5KTtcblxuICAgIHRoaXMubW9udGhPclllYXJDaGFuZ2VkKG1vbnRoLCB5ZWFyLCBzaWRlKTtcbiAgfVxuICBwcml2YXRlIG1vbnRoT3JZZWFyQ2hhbmdlZChtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIsIHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgY29uc3QgaXNMZWZ0ID0gc2lkZSA9PT0gU2lkZUVudW0ubGVmdDtcbiAgICBjb25zdCBtaW5EYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1pbkRhdGUoKSB9KTtcbiAgICBjb25zdCBtYXhEYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KTtcblxuICAgIGlmIChtaW5EYXRlICYmICh5ZWFyIDwgbWluRGF0ZT8ueWVhcigpIHx8ICh5ZWFyID09PSBtaW5EYXRlPy55ZWFyKCkgJiYgbW9udGggPCBtaW5EYXRlPy5tb250aCgpKSkpIHtcbiAgICAgIG1vbnRoID0gbWluRGF0ZT8ubW9udGgoKTtcbiAgICAgIHllYXIgPSBtaW5EYXRlPy55ZWFyKCk7XG4gICAgfVxuXG4gICAgaWYgKG1heERhdGUgJiYgKHllYXIgPiBtYXhEYXRlPy55ZWFyKCkgfHwgKHllYXIgPT09IG1heERhdGU/LnllYXIoKSAmJiBtb250aCA+IG1heERhdGU/Lm1vbnRoKCkpKSkge1xuICAgICAgbW9udGggPSBtYXhEYXRlPy5tb250aCgpO1xuICAgICAgeWVhciA9IG1heERhdGU/LnllYXIoKTtcbiAgICB9XG5cbiAgICBjb25zdCBkcm9wZG93bnMgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0oKS5kcm9wZG93bnM7XG5cbiAgICBpZiAoZHJvcGRvd25zPy4oKSkge1xuICAgICAgZHJvcGRvd25zLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LmN1cnJlbnRZZWFyID0geWVhcjtcbiAgICAgICAgY3VycmVudC5jdXJyZW50TW9udGggPSBtb250aDtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaXNMZWZ0ICYmIHRoaXMubGVmdENhbGVuZGFyKCkubW9udGgpIHtcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8ubW9udGgobW9udGgpLnllYXIoeWVhcik7XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgIH1cblxuICAgIGlmIChtb250aCA9PT0gMTIpIHtcbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmNsb25lKCkuYWRkKDEsICdtb250aCcpO1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/Lm1vbnRoKG1vbnRoKS55ZWFyKHllYXIpO1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVySW5wdXRFdmVudChldmVudDogSUV2ZW50LCB0eXBlOiBgbGVmdGhvdXJgIHwgYGxlZnRtaW51dGVgIHwgYHJpZ2h0aG91cmAgfCBgcmlnaHRtaW51dGVgKSB7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgIT09IDgpIHtcbiAgICAgIGV2ZW50LmtleUNvZGUgJiZcbiAgICAgICAgdGhpcy5jaGVja0JhY2tzcGFjZUZvY3VzLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnRbdHlwZV0uc2V0KDEpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLmtleUNvZGVCYWNrc3BhY2Uuc2V0KGZhbHNlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMua2V5Q29kZUJhY2tzcGFjZS5zZXQodHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2xlZnRtaW51dGUnOlxuICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0bWludXRlKCkpKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cygpW3R5cGVdKCkgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cy51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgICAgY3VycmVudFt0eXBlXS5zZXQoY3VycmVudFt0eXBlXSgpICsgMSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50W3R5cGVdLnNldCgxKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scy5nZXQoYCR7U2lkZUVudW0ubGVmdH1ob3VyYCkgYXMgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQpPy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyaWdodG1pbnV0ZSc6XG4gICAgICAgIGlmIChpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKCkpKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cygpW3R5cGVdKCkgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cy51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgICAgY3VycmVudFt0eXBlXS5zZXQoY3VycmVudFt0eXBlXSgpICsgMSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50W3R5cGVdLnNldCgxKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scy5nZXQoYCR7U2lkZUVudW0ucmlnaHR9aG91cmApIGFzIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoZXZlbnQ6IElGb2N1c0FuZEJsdXJFdmVudCwgdHlwZTogYGxlZnRob3VyYCB8IGBsZWZ0bWludXRlYCB8IGByaWdodGhvdXJgIHwgYHJpZ2h0bWludXRlYCkge1xuICAgIGlmIChldmVudC5uYW1lID09PSAnZm9jdXMnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50SW5wdXQgPSBldmVudC5ldmVudCBhcyBJRXZlbnQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnRJbnB1dC50YXJnZXQ7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2xlZnRob3VyJzpcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkSG91ciA9ICFpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCkpID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSA6IDA7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSkgPT09IDAgfHwgaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSkge1xuICAgICAgICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubGVmdGhvdXIuc2V0KDApO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0YXJnZXQudmFsdWUgPSAnMDAnO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSA8IDEwKSB7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlID0gYDAke051bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKX1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyaWdodGhvdXInOlxuICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5yaWdodC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkSG91ciA9ICFpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0aG91cigpKSA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0aG91cigpIDogMDtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSkgPT09IDAgfHwgaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSkpIHtcbiAgICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LnJpZ2h0aG91ci5zZXQoMCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9ICcwMCc7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpIDwgMTApIHtcbiAgICAgICAgICB0YXJnZXQudmFsdWUgPSBgMCR7TnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0aG91cigpKX1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdsZWZ0bWludXRlJzpcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkTWludXRlID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKSA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSA6IDA7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKSA9PT0gMCB8fCBpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkpIHtcbiAgICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LmxlZnRtaW51dGUuc2V0KDApO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0YXJnZXQudmFsdWUgPSAnMDAnO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKX1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyaWdodG1pbnV0ZSc6XG4gICAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpLnJpZ2h0LnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRNaW51dGUgPSAhaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpKSA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKCkgOiAwO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoTnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKCkpID09PSAwIHx8IGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkpIHtcbiAgICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LnJpZ2h0bWludXRlLnNldCgwKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlID0gJzAwJztcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpKSA8IDEwKSB7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlID0gYDAke051bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpKX1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlVGltZVZhbHVlKGV2ZW50OiBzdHJpbmcgfCBudW1iZXIsIHR5cGU6IGBsZWZ0aG91cmAgfCBgbGVmdG1pbnV0ZWAgfCBgcmlnaHRob3VyYCB8IGByaWdodG1pbnV0ZWApIHtcbiAgICB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50W3R5cGVdLnNldChldmVudCBhcyBudW1iZXIpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZGUgPSB0eXBlLmluY2x1ZGVzKFNpZGVFbnVtLmxlZnQpID8gU2lkZUVudW0ubGVmdCA6IFNpZGVFbnVtLnJpZ2h0O1xuICAgIGNvbnN0IGF0dHIgPSB0eXBlLmluY2x1ZGVzKCdob3VyJykgPyAnaG91cicgOiAnbWludXRlJztcblxuICAgIHRoaXMuc3BsaXRQaWNrZXJEYXRlLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudFtzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gJ3N0YXJ0JyA6ICdlbmQnXS51cGRhdGUoKHNpZGVDdXJyZW50KSA9PiB7XG4gICAgICAgIHNpZGVDdXJyZW50W2F0dHJdID0gZXZlbnQgYXMgbnVtYmVyO1xuXG4gICAgICAgIHJldHVybiBzaWRlQ3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICBpZiAoKHR5cGUgIT09ICdsZWZ0aG91cicgJiYgdHlwZSAhPT0gJ3JpZ2h0aG91cicpIHx8IGV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNaZXJvLnNldChmYWxzZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGAke2V2ZW50fWAubGVuZ3RoID09PSAyIHx8IE51bWJlcihldmVudCkgPiAyIHx8IChOdW1iZXIoZXZlbnQpIDw9IDIgJiYgTnVtYmVyKGV2ZW50KSA+IDAgJiYgdGhpcy5pc1plcm8oKSkgfHwgKHRoaXMuaXNaZXJvKCkgJiYgIXRoaXMua2V5Q29kZUJhY2tzcGFjZSgpKSkge1xuICAgICAgdGhpcy5pc1plcm8uc2V0KGZhbHNlKTtcbiAgICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KHR5cGUgPT09ICdsZWZ0aG91cicgPyBgJHtTaWRlRW51bS5sZWZ0fW1pbnV0ZWAgOiBgJHtTaWRlRW51bS5yaWdodH1taW51dGVgKSBhcyBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudCk/LmZvY3VzKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKE51bWJlcihldmVudCkgPT09IDAgJiYgIXRoaXMua2V5Q29kZUJhY2tzcGFjZSgpKSB7XG4gICAgICB0aGlzLmlzWmVyby5zZXQodHJ1ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNob3dMaXN0RHJvcGRvd24oZXZlbnQ6IGJvb2xlYW4sIHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMuY2hlY2tTaG93TGlzdERyb3Bkb3duLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudFt0eXBlXSA9IGV2ZW50O1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb252ZXJ0SXRlbU1vbnRoID0gKGl0ZW06IGFueSkgPT4ge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBzZXQoaXRlbSwgJ2xhYmVsRGlzcGxheScsIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoaXRlbS5sYWJlbCB8fCAnICcsIHsgeWVhcjogJycgfSkpO1xuXG4gICAgcmV0dXJuIGl0ZW07XG4gIH07XG4gIHByb3RlY3RlZCBjb252ZXJ0SXRlbVllYXIgPSAoaXRlbTogYW55KSA9PiB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGl0ZW0ubGFiZWxEaXNwbGF5ID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnaTE4bl95ZWFyX3BhcmFtJywgeyB5ZWFyOiBpdGVtLmxhYmVsIH0pO1xuXG4gICAgcmV0dXJuIGl0ZW07XG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVNb250aHNJblZpZXcoKSB7XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmlzU2luZ2xlKCkgJiZcbiAgICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aCAmJlxuICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aCAmJlxuICAgICAgICAoKHRoaXMubGVmdENhbGVuZGFyKCkgJiYgdGhpcy5zdGFydERhdGUoKT8uZm9ybWF0KCdZWVlZLU1NJykgPT09IHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/LmZvcm1hdCgnWVlZWS1NTScpKSB8fCAodGhpcy5yaWdodENhbGVuZGFyKCkgJiYgdGhpcy5zdGFydERhdGUoKT8uZm9ybWF0KCdZWVlZLU1NJykgPT09IHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy5mb3JtYXQoJ1lZWVktTU0nKSkpICYmXG4gICAgICAgICh0aGlzLmVuZERhdGUoKT8uZm9ybWF0KCdZWVlZLU1NJykgPT09IHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/LmZvcm1hdCgnWVlZWS1NTScpIHx8IHRoaXMuZW5kRGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LmZvcm1hdCgnWVlZWS1NTScpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhcnREYXRlKCkpIHtcbiAgICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9IHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCk/LmRhdGUoMik7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSgpPy5tb250aCgpICE9PSB0aGlzLnN0YXJ0RGF0ZSgpPy5tb250aCgpIHx8IHRoaXMuZW5kRGF0ZSgpPy55ZWFyKCkgIT09IHRoaXMuc3RhcnREYXRlKCk/LnllYXIoKSkge1xuICAgICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSB0aGlzLmVuZERhdGUoKT8uY2xvbmUoKT8uZGF0ZSgyKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQubW9udGggPSB0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpPy5kYXRlKDIpPy5hZGQoMSwgJ21vbnRoJyk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGFydERhdGUoKSAmJlxuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aCAmJlxuICAgICAgdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGggJiZcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/LmZvcm1hdCgnWVlZWS1NTScpICE9PSB0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSAmJlxuICAgICAgdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LmZvcm1hdCgnWVlZWS1NTScpICE9PSB0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKVxuICAgICkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSB0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpPy5kYXRlKDIpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSB0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpPy5kYXRlKDIpPy5hZGQoMSwgJ21vbnRoJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFRpbWVJbnB1dChzaWRlOiBTaWRlRW51bSkge1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkSG91cn1gKTtcbiAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkTWludXRlfWApO1xuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKTtcblxuICAgICAgc3RhcnQgPSBzdGFydD8uaG91cihob3VyKTtcbiAgICAgIHN0YXJ0ID0gc3RhcnQ/Lm1pbnV0ZShtaW51dGUpO1xuICAgICAgdGhpcy5zZXRTdGFydERhdGUoc3RhcnQpO1xuICAgICAgaWYgKHRoaXMuaXNTaW5nbGUoKSkge1xuICAgICAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCkpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5kRGF0ZSgpICYmIHRoaXMuZW5kRGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gc3RhcnQ/LmZvcm1hdCgnWVlZWS1NTS1ERCcpICYmIHRoaXMuZW5kRGF0ZSgpPy5pc0JlZm9yZShzdGFydCkpIHtcbiAgICAgICAgdGhpcy5zZXRFbmREYXRlKHN0YXJ0Py5jbG9uZSgpKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5lbmREYXRlKCkgJiYgc3RhcnQgJiYgdGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDbG9uZSA9IHRoaXMuZ2V0RGF0ZVdpdGhUaW1lKHN0YXJ0LCBTaWRlRW51bS5yaWdodCk7XG5cbiAgICAgICAgaWYgKHN0YXJ0Q2xvbmUuaXNCZWZvcmUoc3RhcnQpKSB7XG4gICAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbU2lkZUVudW0ucmlnaHRdLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5zZWxlY3RlZEhvdXIgPSBob3VyO1xuICAgICAgICAgICAgY3VycmVudC5zZWxlY3RlZE1pbnV0ZSA9IG1pbnV0ZTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIGxldCBlbmQgPSB0aGlzLmVuZERhdGUoKT8uY2xvbmUoKTtcblxuICAgICAgZW5kID0gZW5kPy5ob3VyKGhvdXIpO1xuICAgICAgZW5kID0gZW5kPy5taW51dGUobWludXRlKTtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZShlbmQpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcihTaWRlRW51bS5sZWZ0KTtcbiAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ucmlnaHQpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDYWxlbmRhcnMoKSB7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5sZWZ0KTtcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgICBpZiAodGhpcy5lbmREYXRlKCkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jYWxjdWxhdGVTZWxlY3RlZExhYmVsKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckNhbGVuZGFyKHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgLy8gc2lkZSBlbnVtXG4gICAgY29uc3QgbWFpbkNhbGVuZGFyOiB7IGNhbGVuZGFyPzogSUNhbGVuZGFyOyBtb250aD86IERheWpzIH0gPSBzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy5sZWZ0Q2FsZW5kYXIoKSA6IHRoaXMucmlnaHRDYWxlbmRhcigpO1xuXG4gICAgaWYgKCFtYWluQ2FsZW5kYXIubW9udGggfHwgdGhpcy5kYXRlT3B0aW9ucygpLmZpcnN0RGF5ID09PSB1bmRlZmluZWQgfHwgdGhpcy5kYXRlT3B0aW9ucygpLmZpcnN0RGF5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9udGggPSBtYWluQ2FsZW5kYXIubW9udGgubW9udGgoKTtcbiAgICBjb25zdCB5ZWFyID0gbWFpbkNhbGVuZGFyLm1vbnRoLnllYXIoKTtcbiAgICBjb25zdCBob3VyID0gbWFpbkNhbGVuZGFyLm1vbnRoLmhvdXIoKTtcbiAgICBjb25zdCBtaW51dGUgPSBtYWluQ2FsZW5kYXIubW9udGgubWludXRlKCk7XG4gICAgY29uc3Qgc2Vjb25kID0gbWFpbkNhbGVuZGFyLm1vbnRoLnNlY29uZCgpO1xuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gZ2V0RGF5anMoeyBkYXRlOiBuZXcgRGF0ZSh5ZWFyLCBtb250aCkgfSkuZGF5c0luTW9udGgoKTtcbiAgICBjb25zdCBmaXJzdERheSA9IGdldERheWpzKHsgZGF0ZTogbmV3IERhdGUoeWVhciwgbW9udGgsIDEpIH0pO1xuICAgIGNvbnN0IGxhc3REYXkgPSBnZXREYXlqcyh7IGRhdGU6IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXlzSW5Nb250aCkgfSk7XG4gICAgY29uc3QgbGFzdE1vbnRoID0gZ2V0RGF5anMoeyBkYXRlOiBmaXJzdERheS5zdWJ0cmFjdCgxLCAnbW9udGgnKSB9KS5tb250aCgpO1xuICAgIGNvbnN0IGxhc3RZZWFyID0gZ2V0RGF5anMoeyBkYXRlOiBmaXJzdERheS5zdWJ0cmFjdCgxLCAnbW9udGgnKSB9KS55ZWFyKCk7XG4gICAgY29uc3QgZGF5c0luTGFzdE1vbnRoID0gZ2V0RGF5anMoeyBkYXRlOiBuZXcgRGF0ZShsYXN0WWVhciwgbGFzdE1vbnRoKSB9KS5kYXlzSW5Nb250aCgpO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGZpcnN0RGF5LmRheSgpO1xuICAgIGNvbnN0IGNhbGVuZGFyOiBJQ2FsZW5kYXIgPSB7fTtcblxuICAgIGNhbGVuZGFyLmZpcnN0RGF5ID0gZmlyc3REYXk7XG4gICAgY2FsZW5kYXIubGFzdERheSA9IGxhc3REYXk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgIGNhbGVuZGFyW2ldID0gW107XG4gICAgfVxuICAgIGxldCBzdGFydERheSA9IGRheXNJbkxhc3RNb250aCAtIGRheU9mV2VlayArICh0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPz8gMSkgKyAxO1xuXG4gICAgaWYgKHN0YXJ0RGF5ID4gZGF5c0luTGFzdE1vbnRoKSB7XG4gICAgICBzdGFydERheSAtPSA3O1xuICAgIH1cbiAgICBpZiAoZGF5T2ZXZWVrID09PSB0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkpIHtcbiAgICAgIHN0YXJ0RGF5ID0gZGF5c0luTGFzdE1vbnRoIC0gNjtcbiAgICB9XG4gICAgbGV0IGN1ckRhdGUgPSBnZXREYXlqcyh7IGRhdGU6IG5ldyBEYXRlKGxhc3RZZWFyLCBsYXN0TW9udGgsIHN0YXJ0RGF5LCAxMiwgbWludXRlLCBzZWNvbmQpIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGNvbCA9IDAsIHJvdyA9IDA7IGkgPCA0MjsgaSsrLCBjb2wrKywgY3VyRGF0ZSA9IGdldERheWpzKHsgZGF0ZTogY3VyRGF0ZSB9KS5hZGQoMjQsICdob3VyJykpIHtcbiAgICAgIGlmIChpID4gMCAmJiBjb2wgJSA3ID09PSAwKSB7XG4gICAgICAgIGNvbCA9IDA7XG4gICAgICAgIHJvdysrO1xuICAgICAgfVxuICAgICAgY2FsZW5kYXJbcm93XVtjb2xdID0gY3VyRGF0ZS5jbG9uZSgpLmhvdXIoaG91cikubWludXRlKG1pbnV0ZSkuc2Vjb25kKHNlY29uZCk7XG4gICAgICBjdXJEYXRlID0gY3VyRGF0ZS5ob3VyKDEyKTtcblxuICAgICAgY29uc3QgbWluRGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5taW5EYXRlKCkgfSk7XG4gICAgICBjb25zdCBtYXhEYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KTtcbiAgICAgIGlmIChtaW5EYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gbWluRGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQmVmb3JlKG1pbkRhdGUpICYmIHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgICBjYWxlbmRhcltyb3ddW2NvbF0gPSBtaW5EYXRlPy5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgaWYgKG1heERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBtYXhEYXRlPy5mb3JtYXQoJ1lZWVktTU0tREQnKSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uaXNBZnRlcihtYXhEYXRlKSAmJiBzaWRlID09PSAncmlnaHQnKSB7XG4gICAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA9IG1heERhdGU/LmNsb25lKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQpIHtcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LmNhbGVuZGFyID0gY2FsZW5kYXI7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLnJpZ2h0KSB7XG4gICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQuY2FsZW5kYXIgPSBjYWxlbmRhcjtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBtaW5EYXRlID0gc2lkZSA9PT0gJ2xlZnQnID8gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1pbkRhdGUoKSB9KSA6IGdldERheWpzKHsgZGF0ZTogdGhpcy5zdGFydERhdGUoKSB9KTtcbiAgICBjb25zdCBtYXhEYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KTtcblxuICAgIHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXS5zZXQoe1xuICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgeWVhcjogeWVhcixcbiAgICAgIGhvdXI6IGhvdXIsXG4gICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICAgIHNlY29uZDogc2Vjb25kLFxuICAgICAgZGF5c0luTW9udGg6IGRheXNJbk1vbnRoLFxuICAgICAgZmlyc3REYXk6IGZpcnN0RGF5LFxuICAgICAgbGFzdERheTogbGFzdERheSxcbiAgICAgIGxhc3RNb250aDogbGFzdE1vbnRoLFxuICAgICAgbGFzdFllYXI6IGxhc3RZZWFyLFxuICAgICAgZGF5c0luTGFzdE1vbnRoOiBkYXlzSW5MYXN0TW9udGgsXG4gICAgICBkYXlPZldlZWs6IGRheU9mV2VlayxcbiAgICAgIGNhbFJvd3M6IHNpZ25hbChBcnJheS5mcm9tKEFycmF5KDYpLmtleXMoKSkpLFxuICAgICAgY2FsQ29sczogc2lnbmFsKEFycmF5LmZyb20oQXJyYXkoNykua2V5cygpKSksXG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIG1pbkRhdGU6IG1pbkRhdGUsXG4gICAgICBtYXhEYXRlOiBtYXhEYXRlLFxuICAgICAgY2FsZW5kYXI6IGNhbGVuZGFyLFxuICAgICAgZHJvcGRvd25zOiBzaWduYWwoe30pLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLnNob3dEcm9wZG93bnNTZWxlY3QoKSkge1xuICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gY2FsZW5kYXJbMV1bMV0ubW9udGgoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gY2FsZW5kYXJbMV1bMV0ueWVhcigpO1xuICAgICAgY29uc3QgbWF4WWVhciA9IG1heERhdGU/LnllYXIoKSA/PyBERUZBVUxUX01BWF9ZRUFSO1xuICAgICAgY29uc3QgbWluWWVhciA9IG1pbkRhdGU/LnllYXIoKSA/PyBERUZBVUxUX01JTl9ZRUFSO1xuICAgICAgY29uc3QgaW5NaW5ZZWFyID0gY3VycmVudFllYXIgPT09IG1pblllYXI7XG4gICAgICBjb25zdCBpbk1heFllYXIgPSBjdXJyZW50WWVhciA9PT0gbWF4WWVhcjtcbiAgICAgIGNvbnN0IHllYXJzID0gW107XG5cbiAgICAgIGZvciAobGV0IHkgPSBtaW5ZZWFyOyB5IDw9IG1heFllYXI7IHkrKykge1xuICAgICAgICB5ZWFycy5wdXNoKHkpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpXG4gICAgICAgIFtzaWRlXSgpXG4gICAgICAgIC5kcm9wZG93bnM/LnNldCh7XG4gICAgICAgICAgY3VycmVudE1vbnRoOiBjdXJyZW50TW9udGgsXG4gICAgICAgICAgY3VycmVudFllYXI6IGN1cnJlbnRZZWFyLFxuICAgICAgICAgIG1heFllYXI6IG1heFllYXIsXG4gICAgICAgICAgbWluWWVhcjogbWluWWVhcixcbiAgICAgICAgICBpbk1pblllYXI6IGluTWluWWVhcixcbiAgICAgICAgICBpbk1heFllYXI6IGluTWF4WWVhcixcbiAgICAgICAgICBtb250aEFycmF5czogc2lnbmFsKEFycmF5LmZyb20oQXJyYXkoMTIpLmtleXMoKSkpLFxuICAgICAgICAgIHllYXJBcnJheXM6IHNpZ25hbCh5ZWFycyksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmJ1aWxkQ2VsbHMoY2FsZW5kYXIsIHNpZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENlbGxzKGNhbGVuZGFyOiBJQ2FsZW5kYXIsIHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgNjsgcm93KyspIHtcbiAgICAgIGNvbnN0IGNsYXNzbGVzcyA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXSgpO1xuXG4gICAgICBpZiAoY2xhc3NsZXNzLmNsYXNzZXMpIHtcbiAgICAgICAgY2xhc3NsZXNzLmNsYXNzZXNbcm93XSA9IHt9O1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgNzsgY29sKyspIHtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5zdGFydERhdGUoKSB9KTtcbiAgICAgICAgY29uc3QgZW5kRGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5lbmREYXRlKCkgfSk7XG4gICAgICAgIGNvbnN0IG5vd0hvdmVyZWREYXRlID0gdGhpcy5ub3dIb3ZlcmVkRGF0ZSgpO1xuXG4gICAgICAgIGlmIChjYWxlbmRhcltyb3ddW2NvbF0uaXNTYW1lKG5ldyBEYXRlKCksICdkYXknKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgndG9kYXknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsZW5kYXJbcm93XVtjb2xdLmlzb1dlZWtkYXkoKSA+IDUpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ3dlZWtlbmQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsZW5kYXJbcm93XVtjb2xdLm1vbnRoKCkgIT09IGNhbGVuZGFyWzFdWzFdLm1vbnRoKCkpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ29mZicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUoKSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uaXNCZWZvcmUodGhpcy5taW5EYXRlKCksICdkYXknKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnb2ZmJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXSgpLm1heERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQWZ0ZXIodGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCkubWF4RGF0ZSwgJ2RheScpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdvZmYnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnREYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gc3RhcnREYXRlPy5mb3JtYXQoJ1lZWVktTU0tREQnKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnYWN0aXZlJywgJ3N0YXJ0LWRhdGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kRGF0ZSAhPT0gbnVsbCAmJiBjYWxlbmRhcltyb3ddW2NvbF0uZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IGVuZERhdGU/LmZvcm1hdCgnWVlZWS1NTS1ERCcpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdhY3RpdmUnLCAnZW5kLWRhdGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnREYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gc3RhcnREYXRlPy5mb3JtYXQoJ1lZWVktTU0tREQnKSAmJiAoIWVuZERhdGUgfHwgKGVuZERhdGUgIT09IG51bGwgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBlbmREYXRlPy5mb3JtYXQoJ1lZWVktTU0tREQnKSkpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdhY3RpdmUnLCAnZnVsbC1kYXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgc3RhcnREYXRlICYmXG4gICAgICAgICAgZW5kRGF0ZSAmJlxuICAgICAgICAgICgobm93SG92ZXJlZERhdGUgIT09IG51bGwgJiYgdGhpcy5waWNraW5nRGF0ZSgpKSB8fCBlbmREYXRlICE9PSBudWxsKSAmJlxuICAgICAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA+IHN0YXJ0RGF0ZSAmJlxuICAgICAgICAgIChjYWxlbmRhcltyb3ddW2NvbF0gPCBlbmREYXRlIHx8IChub3dIb3ZlcmVkRGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0gPCBub3dIb3ZlcmVkRGF0ZSAmJiB0aGlzLnBpY2tpbmdEYXRlKCkpKVxuICAgICAgICApIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goIWNsYXNzZXMuZmluZCgoZWwpID0+IGVsID09PSAnb2ZmJykgPyAnaW4tcmFuZ2UnIDogJ2ZvY3VzLW9mZicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjbmFtZSA9ICcnLFxuICAgICAgICAgIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY25hbWUgKz0gY2xhc3Nlc1tpXSArICcgJztcblxuICAgICAgICAgIGlmIChjbGFzc2VzW2ldID09PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgICBjbmFtZSArPSAnYXZhaWxhYmxlJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbGFzc2xlc3MuY2xhc3Nlcykge1xuICAgICAgICAgIGNsYXNzbGVzcy5jbGFzc2VzW3Jvd11bY29sXSA9IGNuYW1lLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyVGltZVBpY2tlcihzaWRlOiBTaWRlRW51bSkge1xuICAgIGxldCBzZWxlY3RlZDogRGF5anMgPSBnZXREYXlqcygpLFxuICAgICAgbWluRGF0ZTtcbiAgICBjb25zdCBtYXhEYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KTtcbiAgICBjb25zdCBzdGFydERhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMuc3RhcnREYXRlKCkgfSk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5lbmREYXRlKCkgfSk7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCAmJiBzdGFydERhdGUpIHtcbiAgICAgIHNlbGVjdGVkID0gc3RhcnREYXRlLmNsb25lKCk7XG4gICAgICBtaW5EYXRlID0gdGhpcy5tYXhEYXRlKCk7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCAmJiBlbmREYXRlKSB7XG4gICAgICBzZWxlY3RlZCA9IGVuZERhdGUuY2xvbmUoKTtcbiAgICAgIG1pbkRhdGUgPSB0aGlzLnN0YXJ0RGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQgJiYgIWVuZERhdGUpIHtcbiAgICAgIGlmICghc3RhcnREYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlbGVjdGVkID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLmdldERhdGVXaXRoVGltZShzdGFydERhdGUsIFNpZGVFbnVtLnJpZ2h0KSB9KTtcbiAgICAgIGlmIChzZWxlY3RlZC5pc0JlZm9yZShzdGFydERhdGUpKSB7XG4gICAgICAgIHNlbGVjdGVkID0gc3RhcnREYXRlLmNsb25lKCk7XG4gICAgICB9XG4gICAgICBtaW5EYXRlID0gc3RhcnREYXRlO1xuICAgIH1cbiAgICBjb25zdCBzdGFydCA9IDA7XG4gICAgY29uc3QgZW5kID0gMjM7XG5cbiAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXS5zZXQoe1xuICAgICAgaG91cnM6IFtdLFxuICAgICAgbWludXRlczogW10sXG4gICAgICBtaW51dGVzTGFiZWw6IFtdLFxuICAgICAgc2Vjb25kczogW10sXG4gICAgICBzZWNvbmRzTGFiZWw6IFtdLFxuICAgICAgZGlzYWJsZWRIb3VyczogW10sXG4gICAgICBkaXNhYmxlZE1pbnV0ZXM6IFtdLFxuICAgICAgZGlzYWJsZWRTZWNvbmRzOiBbXSxcbiAgICAgIHNlbGVjdGVkSG91cjogMCxcbiAgICAgIHNlbGVjdGVkTWludXRlOiAwLFxuICAgICAgc2VsZWN0ZWRTZWNvbmQ6IDAsXG4gICAgfSk7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICBjb25zdCBpX2luXzI0ID0gaTtcblxuICAgICAgY29uc3QgdGltZSA9IHNlbGVjdGVkLmNsb25lKCkuaG91cihpX2luXzI0KTtcbiAgICAgIGxldCBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAobWluRGF0ZSAmJiB0aW1lLm1pbnV0ZSg1OSkuaXNCZWZvcmUobWluRGF0ZSkpIHtcbiAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG1heERhdGUgJiYgdGltZS5taW51dGUoMCkuaXNBZnRlcihtYXhEYXRlKSkge1xuICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5ob3Vycz8ucHVzaChpKTtcbiAgICAgICAgaWYgKGlfaW5fMjQgPT09IHNlbGVjdGVkLmhvdXIoKSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkSG91ciA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgY3VycmVudC5kaXNhYmxlZEhvdXJzPy5wdXNoKGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2MDsgaSArPSB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSkge1xuICAgICAgY29uc3QgcGFkZGVkID0gaSA8IDEwID8gJzAnICsgaSA6IGAke2l9YDtcbiAgICAgIGNvbnN0IHRpbWUgPSBzZWxlY3RlZC5jbG9uZSgpLm1pbnV0ZShpKTtcblxuICAgICAgbGV0IGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChtaW5EYXRlICYmIHRpbWUuc2Vjb25kKDU5KS5pc0JlZm9yZShtaW5EYXRlKSkge1xuICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZSAmJiB0aW1lLnNlY29uZCgwKS5pc0FmdGVyKG1heERhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50Lm1pbnV0ZXM/LnB1c2goaSk7XG4gICAgICAgIGN1cnJlbnQubWludXRlc0xhYmVsPy5wdXNoKHBhZGRlZCk7XG4gICAgICAgIGlmIChzZWxlY3RlZC5taW51dGUoKSA9PT0gaSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkTWludXRlID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICBjdXJyZW50LmRpc2FibGVkTWludXRlcz8ucHVzaChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50LnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVFbGVtZW50KCkge1xuICAgIGlmICghdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1NpbmdsZSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTGFiZWwuc2V0KHRoaXMuc3RhcnREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIC8vIGlmIHdlIHVzZSByYW5nZXMgYW5kIHNob3VsZCBzaG93IHJhbmdlIGxhYmVsIG9uIGlucHV0XG4gICAgICBpZiAodGhpcy5xdWlja1Jhbmdlc0FycmF5KCkubGVuZ3RoICYmIHRoaXMuc2hvd1JhbmdlTGFiZWxPbklucHV0KCkgJiYgdGhpcy5zZWxlY3RlZFF1aWNrUmFuZ2UoKSAmJiB0aGlzLmRhdGVPcHRpb25zKCkuY3VzdG9tUmFuZ2VMYWJlbCAhPT0gdGhpcy5zZWxlY3RlZFF1aWNrUmFuZ2UoKSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWwuc2V0KHRoaXMuc2VsZWN0ZWRRdWlja1JhbmdlKCkpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbC5zZXQoYCR7dGhpcy5zdGFydERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJyl9JHt0aGlzLmRhdGVPcHRpb25zKCkuc2VwYXJhdG9yfSR7dGhpcy5lbmREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpfWApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRMYWJlbC5zZXQoYCR7dGhpcy5zdGFydERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJyl9JHt0aGlzLmRhdGVPcHRpb25zKCkuc2VwYXJhdG9yfSR7dGhpcy5zdGFydERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJyl9YCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZpZXcoKSB7XG4gICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ubGVmdCk7XG4gICAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ucmlnaHQpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGdldERhdGVXaXRoVGltZShkYXRlOiBEYXlqcywgc2lkZTogU2lkZUVudW0pOiBEYXlqcyB7XG4gICAgY29uc3QgaG91ciA9IHBhcnNlSW50KGAke3RoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdKCkuc2VsZWN0ZWRIb3VyfWAsIDEwKTtcbiAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkTWludXRlfWAsIDEwKTtcbiAgICBjb25zdCBzZWNvbmQgPSB0aGlzLmhhc1NlY29uZFBpY2tlcigpICYmICFpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdKCkuc2VsZWN0ZWRTZWNvbmQpID8gcGFyc2VJbnQoYCR7dGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0oKS5zZWxlY3RlZFNlY29uZH1gLCAxMCkgOiAwO1xuXG4gICAgcmV0dXJuIGRhdGUuY2xvbmUoKS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1NaW5NYXhEYXRlKHZhbHVlOiBEYXlqcyB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IERheWpzIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChkYXlqcy5pc0RheWpzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGdldERheWpzKHsgZGF0ZTogdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZWREaXNwbGF5VGltZShzaWRlOiBJVGltZXBpY2tlclZhcmlhYmxlc1NpZGUpIHtcbiAgICBsZXQgc3RySG91cnM6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9IHNpZGUuc2VsZWN0ZWRIb3VyO1xuICAgIGxldCBzdHJNaW51dGU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9IHNpZGUuc2VsZWN0ZWRNaW51dGU7XG5cbiAgICBpZiAoKHNpZGUuc2VsZWN0ZWRIb3VyIHx8IDApIDwgMTApIHtcbiAgICAgIHN0ckhvdXJzID0gYDAke3NpZGUuc2VsZWN0ZWRIb3VyID8/IDB9YDtcbiAgICB9XG5cbiAgICBpZiAoKHNpZGUuc2VsZWN0ZWRNaW51dGUgfHwgMCkgPCAxMCkge1xuICAgICAgc3RyTWludXRlID0gYDAke3NpZGUuc2VsZWN0ZWRNaW51dGUgPz8gMH1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtzdHJIb3Vyc306JHtzdHJNaW51dGV9YDtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZWREaXNwbGF5VGltZUlucHV0KHNpZGU6IFNpZGVFbnVtLCB0aW1lVHlwZTogJ2hvdXInIHwgJ21pbnV0ZScpIHtcbiAgICBjb25zdCB0aW1lID1cbiAgICAgIHRpbWVUeXBlID09PSAnaG91cicgPyAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCkgOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSkgOiBzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpIDogdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKTtcblxuICAgIGlmICghdGltZSkge1xuICAgICAgcmV0dXJuICcwMCc7XG4gICAgfVxuICAgIGlmICh0aW1lIDwgMTApIHtcbiAgICAgIHJldHVybiBgMCR7dGltZX1gO1xuICAgIH1cblxuICAgIHJldHVybiB0aW1lO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgcmV0dXJuO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhciB0ZXN0LWNsYXNzXCI+XG4gIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4XCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyXCJcbiAgICAgIFtjbGFzcy5yaWdodF09XCJpc1NpbmdsZSgpXCJcbiAgICAgIFtjbGFzcy5sZWZ0XT1cIiFpc1NpbmdsZSgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm91bmRlZC1bNHB4XSBiZy1bI2ZmZmZmZl1cIj5cbiAgICAgICAgQGlmIChjYWxlbmRhclZhcmlhYmxlcygpOyBhcyBjYWxlbmRhclZhcmlhYmxlcykge1xuICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgY29sc3Bhbj1cIjdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb250aFwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChzaG93RHJvcGRvd25zU2VsZWN0KCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmRyb3Bkb3ducz8uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiFmbGV4IG1iLVsxMHB4XSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0zLzQgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1bOHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7IHdpZHRoQnlQYXJlbnQ6IGZhbHNlLCBpZ25vcmVBcnJvdzogdHJ1ZSwgcGFkZGluZ0xlZnRJdGVtOiB0cnVlLCBjbGFzc0luY2x1ZGU6ICchdy1bMTMwcHhdJywgcG9zaXRpb246IHsgbW9kZTogJ2NlbnRlcicsIGRpc3RhbmNlOiAwIH0gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDbGlja0V4YWN0bHldPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0S2V5c0Rpc2FibGVdPVwiZGlzYWJsZU1vbnRoKCkubGVmdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29udmVydEl0ZW1TZWxlY3RlZF09XCJjb252ZXJ0SXRlbU1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0TW9udGhzQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0S2V5U2VsZWN0ZWRdPVwibGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cIm1vbnRoSHR0cERldGFpbENvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ubGVmdCArICdtb250aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ubGVmdCArICdtb250aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9XCJoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTaG93TGlzdCk9XCJoYW5kbGVyU2hvd0xpc3REcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAnbW9udGgnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICdtb250aCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVsjNmE3MzgzXV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICdtb250aCddXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg0bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXNbY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8ubW9udGgoKSA/PyAtMV0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsxM3B4XSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucm90YXRlXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJ10gPyAnOTBkZWcnIDogJzI3MGRlZydcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7IHdpZHRoQnlQYXJlbnQ6IGZhbHNlLCBpZ25vcmVBcnJvdzogdHJ1ZSwgcGFkZGluZ0xlZnRJdGVtOiB0cnVlLCBjbGFzc0luY2x1ZGU6ICchdy1bMTEwcHhdJywgcG9zaXRpb246IHsgbW9kZTogJ2NlbnRlcicsIGRpc3RhbmNlOiAwIH0gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDbGlja0V4YWN0bHldPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb252ZXJ0SXRlbVNlbGVjdGVkXT1cImNvbnZlcnRJdGVtWWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJsaXN0WWVhckhpZGRlbklucHV0U2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RMZWZ0WWVhckNvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF09XCJsZWZ0WWVhckh0dHBEZXRhaWxDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckNoYW5nZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ3llYXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWREcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAneWVhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ubGVmdCArICd5ZWFyJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAneWVhciddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVsjNmE3MzgzXV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICd5ZWFyJ11cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDRtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8uZm9ybWF0KCcgWVlZWScpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgdGV4dC1bMTNweF0gdGV4dC1bIzZhNzM4M11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICd5ZWFyJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucm90YXRlXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ3llYXInXSA/ICc5MGRlZycgOiAnMjcwZGVnJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvNCBmbGV4IGl0ZW1zLWNlbnRlciByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLm1pbkRhdGUgfHwgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLm1pbkRhdGU/LmlzQmVmb3JlKGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/LmZpcnN0RGF5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJoYW5kbGVyQ2xpY2tQcmV2KHNpZGVFbnVtLmxlZnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGFic29sdXRlIGxlZnQtMCB0b3AtWy0zcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHJvdGF0ZS1bMTgwZGVnXSB0ZXh0LVsjNmE3MzgzXSBjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgoIWNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5tYXhEYXRlIHx8IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5tYXhEYXRlPy5pc0FmdGVyKGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lmxhc3REYXkpKSAmJiBpc1NpbmdsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImhhbmRsZXJDbGlja05leHQoc2lkZUVudW0ubGVmdClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbWwtWzEycHhdIGFic29sdXRlIHJpZ2h0LTAgdG9wLVstM3B4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsjNmE3MzgzXSBjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAoIXNob3dEcm9wZG93bnNTZWxlY3QoKSB8fCAhY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmRyb3Bkb3ducykge1xuICAgICAgICAgICAgICAgICAgICB7eyBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyICYmIGRhdGVPcHRpb25zKCkubW9udGhOYW1lc1tjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5tb250aCgpID8/IC0xXSB9fVxuICAgICAgICAgICAgICAgICAgICB7eyBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8uZm9ybWF0KCcgWVlZWScpIH19XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPHRyIGNsYXNzPVwid2Vlay1kYXlzXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoZGF5b2Z3ZWVrIG9mIGRhdGVPcHRpb25zKCkuZGF5c09mV2VlazsgdHJhY2sgZGF5b2Z3ZWVrKSB7XG4gICAgICAgICAgICAgICAgICA8dGg+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDZtIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBkYXlvZndlZWsgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5IGNsYXNzPVwiZHJwLWFuaW1hdGVcIj5cbiAgICAgICAgICAgICAgQGZvciAocm93IG9mIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxSb3dzPy4oKTsgdHJhY2sgcm93KSB7XG4gICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImgtWzMycHhdXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2xhc3NlcyAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2xhc3Nlcz8uW3Jvd10/LmNsYXNzTGlzdFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxDb2xzPy4oKTsgdHJhY2sgY29sKSB7XG4gICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg1clwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRvZGF5XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8uZGF0ZSgpID09PSB0b2RheSgpLmRhdGUoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/Lm1vbnRoKCkgPT09IHRvZGF5KCkubW9udGgoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LnllYXIoKSA9PT0gdG9kYXkoKS55ZWFyKClcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2xhc3NlcyAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2xhc3Nlcz8uW3Jvd10/Lltjb2xdXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclBpY2tlckRhdGUoJGV2ZW50LCBzaWRlRW51bS5sZWZ0LCByb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJIb3ZlckRhdGUoJGV2ZW50LCBzaWRlRW51bS5sZWZ0LCByb3csIGNvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oNXJcIj57eyBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LmRhdGUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBjb2x1bW4gaXRlbXMtY2VudGVyIHB0LVsxMnB4XVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciByb3VuZGVkLVs0cHhdIGJvcmRlclwiXG4gICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItWyNlNmU4ZWRdXT1cIiF0aW1lUGlja2VyRXJyb3IoKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItWyNmZjU0NTRdXT1cInRpbWVQaWNrZXJFcnJvcigpXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLWlucHV0XG4gICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlPVwiIXctWzMwcHhdICFwLTAgIWJvcmRlci1ub25lICF0ZXh0LWNlbnRlciBsaWJzLXVpLWZvbnQtaDRzICF0ZXh0LVsjMDcxNjMxXVwiXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU9XCJpbnRcIlxuICAgICAgICAgICAgICAgIFtmb2N1c1RpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgW2JsdXJUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgIFthdXRvQWRkWmVyb0xlc3NUaGFuMTBJblR5cGVJbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2VtaXRFbXB0eUluRGF0YVR5cGVOdW1iZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIjIzXCJcbiAgICAgICAgICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwiMFwiXG4gICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKClcIlxuICAgICAgICAgICAgICAgIChvdXRJbnB1dEV2ZW50KT1cImhhbmRsZXJJbnB1dEV2ZW50KCRldmVudCwgJ2xlZnRob3VyJylcIlxuICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ2hvdXInKVwiXG4gICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVGltZVZhbHVlKCRldmVudCwgJ2xlZnRob3VyJylcIlxuICAgICAgICAgICAgICAgIChvdXRGb2N1c0FuZEJsdXJFdmVudCk9XCJoYW5kbGVyRm9jdXNBbmRCbHVyVGltZSgkZXZlbnQsICdsZWZ0aG91cicpXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDNzIHRleHQtWyMzMzMzMzNdXCI+Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzc0luY2x1ZGU9XCIhdy1bMzBweF0gIXAtMCAhYm9yZGVyLW5vbmUgIXRleHQtY2VudGVyICFsaWJzLXVpLWZvbnQtaDRzICF0ZXh0LVsjMDcxNjMxXVwiXG4gICAgICAgICAgICAgICAgW2F1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZT1cImludFwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICBbYmx1clRpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIjU5XCJcbiAgICAgICAgICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwiMFwiXG4gICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKVwiXG4gICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAnbWludXRlJylcIlxuICAgICAgICAgICAgICAgIChvdXRJbnB1dEV2ZW50KT1cImhhbmRsZXJJbnB1dEV2ZW50KCRldmVudCwgJ2xlZnRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVGltZVZhbHVlKCRldmVudCwgJ2xlZnRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgKG91dEZvY3VzQW5kQmx1ckV2ZW50KT1cImhhbmRsZXJGb2N1c0FuZEJsdXJUaW1lKCRldmVudCwgJ2xlZnRtaW51dGUnKVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKCFpc1NpbmdsZSgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhciByaWdodCBtbC1bMjRweF1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdW5kZWQtWzRweF0gYmctWyNmZmZmZmZdXCI+XG4gICAgICAgICAgQGlmIChjYWxlbmRhclZhcmlhYmxlcygpKSB7XG4gICAgICAgICAgICA8dGFibGU+XG4gICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgY29sc3Bhbj1cIjdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1vbnRoXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd0Ryb3Bkb3duc1NlbGVjdCgpICYmIGNhbGVuZGFyVmFyaWFibGVzKCkubGVmdCgpLmRyb3Bkb3ducz8uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIWZsZXggbWItWzEwcHhdIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMy80IGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtci1bOHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cInsgd2lkdGhCeVBhcmVudDogZmFsc2UsIGlnbm9yZUFycm93OiB0cnVlLCBwYWRkaW5nTGVmdEl0ZW06IHRydWUsIGNsYXNzSW5jbHVkZTogJyF3LVsxMzBweF0nLCBwb3NpdGlvbjogeyBtb2RlOiAnY2VudGVyJywgZGlzdGFuY2U6IDAgfSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDbGlja0V4YWN0bHldPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlzRGlzYWJsZV09XCJkaXNhYmxlTW9udGgoKS5yaWdodCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnZlcnRJdGVtU2VsZWN0ZWRdPVwiY29udmVydEl0ZW1Nb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdE1vbnRoc0NvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0S2V5U2VsZWN0ZWRdPVwibGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cIm1vbnRoSHR0cERldGFpbENvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICdtb250aCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICdtb250aCddXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oNG1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICdtb250aCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyICYmIGRhdGVPcHRpb25zKCkubW9udGhOYW1lc1tjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5tb250aCgpID8/IC0xXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWzEzcHhdIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yb3RhdGVdPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ21vbnRoJ10gPyAnOTBkZWcnIDogJzI3MGRlZydcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpICsgMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7IHdpZHRoQnlQYXJlbnQ6IGZhbHNlLCBpZ25vcmVBcnJvdzogdHJ1ZSwgcGFkZGluZ0xlZnRJdGVtOiB0cnVlLCBjbGFzc0luY2x1ZGU6ICchdy1bMTEwcHhdJywgcG9zaXRpb246IHsgbW9kZTogJ2NlbnRlcicsIGRpc3RhbmNlOiAwIH0gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENsaWNrRXhhY3RseV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb252ZXJ0SXRlbVNlbGVjdGVkXT1cImNvbnZlcnRJdGVtWWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cImxpc3RZZWFySGlkZGVuSW5wdXRTZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0UmlnaHRZZWFyQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZsYWdNb3VzZV09XCJmbGFnTW91c2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF09XCJyaWdodFllYXJIdHRwRGV0YWlsQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWREcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0ICsgJ3llYXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ucmlnaHQgKyAneWVhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICd5ZWFyJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ3llYXInXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVsjNmE3MzgzXV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAneWVhciddXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oNG1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5mb3JtYXQoJ1lZWVknKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWzEzcHhdIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAneWVhciddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yb3RhdGVdPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ3llYXInXSA/ICc5MGRlZycgOiAnMjcwZGVnJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS80IGZsZXggaXRlbXMtY2VudGVyIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEobGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgKyAxID09PSBsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXIgJiYgbGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoID09PSAxMiAmJiBsaXN0S2V5VG9TZWxlY3RlZCgpLm1vbnRoID09PSAxKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgPCBsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiBsaXN0S2V5VG9TZWxlY3RlZCgpLm1vbnRoICYmIGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCArIDEgPCArbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBhYnNvbHV0ZSBsZWZ0LTAgdG9wLVstM3B4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckNsaWNrUHJldihzaWRlRW51bS5yaWdodClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgcm90YXRlLVsxODBkZWddIHRleHQtWyM2YTczODNdIGN1cnNvci1wb2ludGVyIGxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RLZXlUb1NlbGVjdGVkKCkubW9udGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggPiBsaXN0S2V5VG9TZWxlY3RlZCgpLm1vbnRoICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA9PT0gbGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy1bI2ZmZmZmZl0gdy1bMjFweF0gaC1bMjFweF0gY3Vyc29yLW5vbmUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1bNTBweF1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkubWF4RGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyVmFyaWFibGVzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yaWdodCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4RGF0ZT8uaXNBZnRlcihjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5sYXN0RGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJoYW5kbGVyQ2xpY2tOZXh0KHNpZGVFbnVtLnJpZ2h0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1sLVsxMnB4XSBhYnNvbHV0ZSByaWdodC0wIHRvcC1bLTNweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsjNmE3MzgzXSBjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmICghc2hvd0Ryb3Bkb3duc1NlbGVjdCgpIHx8ICFjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuZHJvcGRvd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJiBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXNbY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8ubW9udGgoKSA/PyAtMV0gfX1cbiAgICAgICAgICAgICAgICAgICAgICB7eyBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8uZm9ybWF0KCdZWVlZJykgfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIndlZWstZGF5c1wiPlxuICAgICAgICAgICAgICAgICAgQGZvciAoZGF5b2Z3ZWVrIG9mIGRhdGVPcHRpb25zKCkuZGF5c09mV2VlazsgdHJhY2sgZGF5b2Z3ZWVrKSB7XG4gICAgICAgICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDZtIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXlvZndlZWsgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsUm93cz8uKCk7IHRyYWNrIHJvdykge1xuICAgICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC1bMzJweF1cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXM/Lltyb3ddPy5jbGFzc0xpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxDb2xzPy4oKTsgdHJhY2sgY29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oNXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jbGFzc2VzICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jbGFzc2VzPy5bcm93XT8uW2NvbF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRvZGF5XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LmRhdGUoKSA9PT0gdG9kYXkoKS5kYXRlKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/Lm1vbnRoKCkgPT09IHRvZGF5KCkubW9udGgoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LnllYXIoKSA9PT0gdG9kYXkoKS55ZWFyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclBpY2tlckRhdGUoJGV2ZW50LCBzaWRlRW51bS5yaWdodCwgcm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJIb3ZlckRhdGUoJGV2ZW50LCBzaWRlRW51bS5yaWdodCwgcm93LCBjb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8uZGF0ZSgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgcHQtWzEycHhdXCI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciByb3VuZGVkLVs0cHhdIGJvcmRlclwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1bI2U2ZThlZF1dPVwiIXRpbWVQaWNrZXJFcnJvcigpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLVsjZmY1NDU0XV09XCJ0aW1lUGlja2VyRXJyb3IoKVwiPlxuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLWlucHV0XG4gICAgICAgICAgICAgICAgICBjbGFzc0luY2x1ZGU9XCIhdy1bMzBweF0gIXAtMCAhYm9yZGVyLW5vbmUgIXRleHQtY2VudGVyICFsaWJzLXVpLWZvbnQtaDRzICF0ZXh0LVsjMDcxNjMxXVwiXG4gICAgICAgICAgICAgICAgICBkYXRhVHlwZT1cImludFwiXG4gICAgICAgICAgICAgICAgICBbYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW2VtaXRFbXB0eUluRGF0YVR5cGVOdW1iZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiMjNcIlxuICAgICAgICAgICAgICAgICAgW21pblZhbHVlTnVtYmVyXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW2ZvY3VzVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFtibHVyVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwiMlwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0aG91cigpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZVRpbWVWYWx1ZSgkZXZlbnQsICdyaWdodGhvdXInKVwiXG4gICAgICAgICAgICAgICAgICAob3V0SW5wdXRFdmVudCk9XCJoYW5kbGVySW5wdXRFdmVudCgkZXZlbnQsICdyaWdodGhvdXInKVwiXG4gICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgJ3JpZ2h0aG91cicpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRGb2N1c0FuZEJsdXJFdmVudCk9XCJoYW5kbGVyRm9jdXNBbmRCbHVyVGltZSgkZXZlbnQsICdyaWdodGhvdXInKVwiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDNzIHRleHQtWyMzMzMzMzNdXCI+Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1pbnB1dFxuICAgICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlPVwiIXctWzMwcHhdICFwLTAgIWJvcmRlci1ub25lICF0ZXh0LWNlbnRlciBsaWJzLXVpLWZvbnQtaDRzICF0ZXh0LVsjMDcxNjMxXVwiXG4gICAgICAgICAgICAgICAgICBkYXRhVHlwZT1cImludFwiXG4gICAgICAgICAgICAgICAgICBbYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW2VtaXRFbXB0eUluRGF0YVR5cGVOdW1iZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiNTlcIlxuICAgICAgICAgICAgICAgICAgW21pblZhbHVlTnVtYmVyXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW2ZvY3VzVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFtibHVyVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwiMlwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKClcIlxuICAgICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCAncmlnaHRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgJ3JpZ2h0bWludXRlJylcIlxuICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVGltZVZhbHVlKCRldmVudCwgJ3JpZ2h0bWludXRlJylcIlxuICAgICAgICAgICAgICAgICAgKG91dEZvY3VzQW5kQmx1ckV2ZW50KT1cImhhbmRsZXJGb2N1c0FuZEJsdXJUaW1lKCRldmVudCwgJ3JpZ2h0bWludXRlJylcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICA8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbFwiPlxuICAgICAgQGlmICghaXNTaW5nbGUoKSAmJiBoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LVs4cHhdIGxpYnMtdWktZm9udC1oN3IgdGV4dC1bI2ZmNTQ1NF0gaC1bMTRweF1cIj5cbiAgICAgICAgICBAaWYgKHRpbWVQaWNrZXJFcnJvcigpKSB7XG4gICAgICAgICAgICA8c3Bhbj57eyAnaTE4bl9kYXRlX2NvbXBhcmVfc3RhcnRfZW5kX21lc3NhZ2VfZXJyb3InIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgQGlmICghcXVpY2tSYW5nZXNBcnJheSgpLmxlbmd0aCB8fCAhaXNTaW5nbGUoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIHB0LVsxNnB4XSBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgQGlmICghaXNTaW5nbGUoKSkge1xuICAgICAgICAgICAgQGlmICghZW5kRGF0ZSgpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LVsjY2RkMGQ2XSBsaWJzLXVpLWZvbnQtaDZyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgc3RhcnREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZiAoaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjb21wdXRlZERpc3BsYXlUaW1lTGVmdCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAmaHlwaGVuO1xuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0KCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoZW5kRGF0ZSgpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LVsjY2RkMGQ2XSBsaWJzLXVpLWZvbnQtaDZyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgc3RhcnREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZiAoaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjb21wdXRlZERpc3BsYXlUaW1lTGVmdCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAmaHlwaGVuO1xuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGVuZERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvbXB1dGVkRGlzcGxheVRpbWVSaWdodCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibXItWzEycHhdXCJcbiAgICAgICAgICAgIGxhYmVsPVwiaTE4bl9jYW5jZWxcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvbi10aGlyZFwiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrQ2FuY2VsKCRldmVudClcIiAvPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgIGxhYmVsPVwiaTE4bl9zZWxlY3RcIlxuICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0FwcGx5KCRldmVudClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|