ontimize-web-ngx 15.3.5 → 15.4.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/esm2020/lib/components/form/navigation/o-form.navigation.class.mjs +8 -2
- package/esm2020/lib/components/grid/o-grid.component.mjs +2 -1
- package/esm2020/lib/components/input/date-range/o-daterange-input.component.mjs +240 -218
- package/esm2020/lib/components/input/date-range/o-daterange-input.module.mjs +3 -5
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.component.mjs +353 -0
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.directive.mjs +381 -0
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.module.mjs +21 -0
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-picker.component.mjs +1009 -0
- package/esm2020/lib/components/input/date-range-legacy/o-daterange-picker.config.mjs +2 -0
- package/esm2020/lib/components/input/index.mjs +7 -5
- package/esm2020/lib/components/list/o-list.component.mjs +2 -1
- package/esm2020/lib/components/o-service-base-component.class.mjs +24 -9
- package/esm2020/lib/components/o-service-component.class.mjs +2 -1
- package/esm2020/lib/components/table/extensions/skeleton/o-table-skeleton.component.mjs +26 -4
- package/esm2020/lib/components/table/o-table.component.mjs +7 -3
- package/esm2020/lib/config/o-modules.mjs +5 -3
- package/esm2020/lib/i18n/i18n.mjs +9 -3
- package/esm2020/lib/interfaces/form-layout-manager.interface.mjs +2 -0
- package/esm2020/lib/interfaces/index.mjs +3 -1
- package/esm2020/lib/interfaces/pagination-context.interface.mjs +2 -0
- package/esm2020/lib/layouts/form-layout/o-form-layout-manager-base.class.mjs +1 -1
- package/esm2020/lib/layouts/form-layout/o-form-layout-manager.component.mjs +1 -1
- package/esm2020/lib/ontimize-web-ngx.module.mjs +7 -6
- package/esm2020/lib/services/base-service.class.mjs +12 -1
- package/esm2020/lib/services/index.mjs +2 -1
- package/esm2020/lib/services/pagination-context.service.mjs +25 -0
- package/fesm2015/ontimize-web-ngx.mjs +496 -42
- package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
- package/fesm2020/ontimize-web-ngx.mjs +487 -42
- package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
- package/lib/components/input/date-range/o-daterange-input.component.d.ts +47 -33
- package/lib/components/input/date-range/o-daterange-input.module.d.ts +4 -6
- package/lib/components/input/date-range-legacy/o-daterange-input.component.d.ts +70 -0
- package/lib/components/input/date-range-legacy/o-daterange-input.module.d.ts +11 -0
- package/lib/components/input/index.d.ts +6 -4
- package/lib/components/o-service-base-component.class.d.ts +1 -0
- package/lib/components/table/extensions/header/o-table-header-components.d.ts +2 -2
- package/lib/components/table/extensions/skeleton/o-table-skeleton.component.d.ts +4 -2
- package/lib/i18n/i18n.d.ts +6 -0
- package/lib/interfaces/form-layout-manager.interface.d.ts +43 -0
- package/lib/interfaces/index.d.ts +2 -0
- package/lib/interfaces/pagination-context.interface.d.ts +6 -0
- package/lib/layouts/form-layout/o-form-layout-manager-base.class.d.ts +30 -12
- package/lib/layouts/form-layout/o-form-layout-manager.component.d.ts +2 -1
- package/lib/ontimize-web-ngx.module.d.ts +5 -4
- package/lib/services/base-service.class.d.ts +6 -0
- package/lib/services/index.d.ts +1 -0
- package/lib/services/pagination-context.service.d.ts +11 -0
- package/package.json +1 -1
- package/theme.scss +2 -2
- package/esm2020/lib/components/input/date-range/o-daterange-input.directive.mjs +0 -381
- package/esm2020/lib/components/input/date-range/o-daterange-picker.component.mjs +0 -1009
- package/esm2020/lib/components/input/date-range/o-daterange-picker.config.mjs +0 -2
- /package/lib/components/input/{date-range → date-range-legacy}/o-daterange-input.directive.d.ts +0 -0
- /package/lib/components/input/{date-range → date-range-legacy}/o-daterange-picker.component.d.ts +0 -0
- /package/lib/components/input/{date-range → date-range-legacy}/o-daterange-picker.config.d.ts +0 -0
|
@@ -1,1009 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
3
|
-
import { NG_VALUE_ACCESSOR, UntypedFormControl } from '@angular/forms';
|
|
4
|
-
import moment from 'moment';
|
|
5
|
-
import { BooleanInputConverter } from '../../../decorators/input-converter';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common";
|
|
8
|
-
import * as i2 from "@angular/flex-layout/extended";
|
|
9
|
-
import * as i3 from "@angular/forms";
|
|
10
|
-
import * as i4 from "../../../pipes/o-translate.pipe";
|
|
11
|
-
export var SideEnum;
|
|
12
|
-
(function (SideEnum) {
|
|
13
|
-
SideEnum["left"] = "left";
|
|
14
|
-
SideEnum["right"] = "right";
|
|
15
|
-
})(SideEnum || (SideEnum = {}));
|
|
16
|
-
export class DaterangepickerComponent {
|
|
17
|
-
set ranges(value) {
|
|
18
|
-
this._ranges = value;
|
|
19
|
-
this.renderRanges();
|
|
20
|
-
}
|
|
21
|
-
get ranges() {
|
|
22
|
-
return this._ranges;
|
|
23
|
-
}
|
|
24
|
-
constructor(_ref) {
|
|
25
|
-
this._ref = _ref;
|
|
26
|
-
this._old = { start: null, end: null };
|
|
27
|
-
this.calendarVariables = { left: {}, right: {} };
|
|
28
|
-
this.timepickerVariables = { left: {}, right: {} };
|
|
29
|
-
this.daterangepicker = { start: new UntypedFormControl(), end: new UntypedFormControl() };
|
|
30
|
-
this.applyBtn = { disabled: false };
|
|
31
|
-
this.startDate = moment().startOf('day');
|
|
32
|
-
this.endDate = moment().endOf('day');
|
|
33
|
-
this.dateLimit = null;
|
|
34
|
-
this.sideEnum = SideEnum;
|
|
35
|
-
this.minDate = null;
|
|
36
|
-
this.maxDate = null;
|
|
37
|
-
this.autoApply = false;
|
|
38
|
-
this.singleDatePicker = false;
|
|
39
|
-
this.showDropdowns = false;
|
|
40
|
-
this.showWeekNumbers = false;
|
|
41
|
-
this.showISOWeekNumbers = false;
|
|
42
|
-
this.linkedCalendars = false;
|
|
43
|
-
this.autoUpdateInput = true;
|
|
44
|
-
this.alwaysShowCalendars = false;
|
|
45
|
-
this.maxSpan = false;
|
|
46
|
-
this.timePicker = false;
|
|
47
|
-
this.timePicker24Hour = false;
|
|
48
|
-
this.timePickerIncrement = 1;
|
|
49
|
-
this.timePickerSeconds = false;
|
|
50
|
-
this.showClearButton = false;
|
|
51
|
-
this.firstMonthDayClass = null;
|
|
52
|
-
this.lastMonthDayClass = null;
|
|
53
|
-
this.emptyWeekRowClass = null;
|
|
54
|
-
this.firstDayOfNextMonthClass = null;
|
|
55
|
-
this.lastDayOfPreviousMonthClass = null;
|
|
56
|
-
this._ranges = {};
|
|
57
|
-
this.showCancel = false;
|
|
58
|
-
this.keepCalendarOpeningWithRange = false;
|
|
59
|
-
this.showRangeLabelOnInput = false;
|
|
60
|
-
this.rangesArray = [];
|
|
61
|
-
this.pickingDate = false;
|
|
62
|
-
this.isShown = false;
|
|
63
|
-
this.inline = true;
|
|
64
|
-
this.leftCalendar = {};
|
|
65
|
-
this.rightCalendar = {};
|
|
66
|
-
this.showCalInRanges = false;
|
|
67
|
-
this.adjustedDaysOfWeek = [];
|
|
68
|
-
this.options = {};
|
|
69
|
-
this.choosedDate = new EventEmitter();
|
|
70
|
-
this.rangeClicked = new EventEmitter();
|
|
71
|
-
this.datesUpdated = new EventEmitter();
|
|
72
|
-
}
|
|
73
|
-
ngOnInit() {
|
|
74
|
-
this._buildLocale();
|
|
75
|
-
const daysOfWeek = [...this.locale.daysOfWeek];
|
|
76
|
-
this.adjustedDaysOfWeek = [...daysOfWeek];
|
|
77
|
-
if (this.locale.firstDay !== 0) {
|
|
78
|
-
let iterator = this.locale.firstDay;
|
|
79
|
-
while (iterator > 0) {
|
|
80
|
-
this.adjustedDaysOfWeek.push(this.adjustedDaysOfWeek.shift());
|
|
81
|
-
iterator--;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
if (this.inline) {
|
|
85
|
-
this._old.start = this.startDate.clone();
|
|
86
|
-
this._old.end = this.endDate.clone();
|
|
87
|
-
}
|
|
88
|
-
this.updateMonthsInView();
|
|
89
|
-
this.renderCalendar(SideEnum.left);
|
|
90
|
-
if (!this.singleDatePicker) {
|
|
91
|
-
this.renderCalendar(SideEnum.right);
|
|
92
|
-
}
|
|
93
|
-
this.renderRanges();
|
|
94
|
-
}
|
|
95
|
-
renderRanges() {
|
|
96
|
-
this.rangesArray = [];
|
|
97
|
-
let start;
|
|
98
|
-
let end;
|
|
99
|
-
if (typeof this.ranges === 'object') {
|
|
100
|
-
for (const range in this.ranges) {
|
|
101
|
-
if (typeof this.ranges[range][0] === 'string') {
|
|
102
|
-
start = moment(this.ranges[range][0], this.locale.format);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
start = moment(this.ranges[range][0]);
|
|
106
|
-
}
|
|
107
|
-
if (typeof this.ranges[range][1] === 'string') {
|
|
108
|
-
end = moment(this.ranges[range][1], this.locale.format);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
end = moment(this.ranges[range][1]);
|
|
112
|
-
}
|
|
113
|
-
if (this.minDate && start.isBefore(this.minDate)) {
|
|
114
|
-
start = this.minDate.clone();
|
|
115
|
-
}
|
|
116
|
-
let maxDate = this.maxDate;
|
|
117
|
-
if (this.maxSpan && maxDate && start.clone().add(this.maxSpan).isAfter(maxDate)) {
|
|
118
|
-
maxDate = start.clone().add(this.maxSpan);
|
|
119
|
-
}
|
|
120
|
-
if (maxDate && end.isAfter(maxDate)) {
|
|
121
|
-
end = maxDate.clone();
|
|
122
|
-
}
|
|
123
|
-
if ((this.minDate && end.isBefore(this.minDate, this.timePicker ? 'minute' : 'day'))
|
|
124
|
-
|| (maxDate && start.isAfter(maxDate, this.timePicker ? 'minute' : 'day'))) {
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
let elem = document.createElement('textarea');
|
|
128
|
-
elem.innerHTML = range;
|
|
129
|
-
let rangeHtml = elem.value;
|
|
130
|
-
this.ranges[rangeHtml] = [start, end];
|
|
131
|
-
}
|
|
132
|
-
for (const range in this.ranges) {
|
|
133
|
-
this.rangesArray.push(range);
|
|
134
|
-
}
|
|
135
|
-
if (this.showCustomRangeLabel) {
|
|
136
|
-
this.rangesArray.push(this.locale.customRangeLabel);
|
|
137
|
-
}
|
|
138
|
-
this.showCalInRanges = (!this.rangesArray.length) || this.alwaysShowCalendars;
|
|
139
|
-
if (!this.timePicker) {
|
|
140
|
-
this.startDate = this.startDate.startOf('day');
|
|
141
|
-
this.endDate = this.endDate.endOf('day');
|
|
142
|
-
}
|
|
143
|
-
if (this.timePicker && this.autoApply) {
|
|
144
|
-
this.autoApply = false;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
renderTimePicker(side) {
|
|
149
|
-
if (side === SideEnum.right && !this.endDate) {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
let selected;
|
|
153
|
-
let minDate;
|
|
154
|
-
const maxDate = this.maxDate;
|
|
155
|
-
if (side === SideEnum.left) {
|
|
156
|
-
selected = this.startDate.clone();
|
|
157
|
-
minDate = this.minDate;
|
|
158
|
-
}
|
|
159
|
-
else if (side === SideEnum.right) {
|
|
160
|
-
selected = this.endDate.clone();
|
|
161
|
-
minDate = this.startDate;
|
|
162
|
-
}
|
|
163
|
-
const start = this.timePicker24Hour ? 0 : 1;
|
|
164
|
-
const end = this.timePicker24Hour ? 23 : 12;
|
|
165
|
-
this.timepickerVariables[side] = {
|
|
166
|
-
hours: [],
|
|
167
|
-
minutes: [],
|
|
168
|
-
minutesLabel: [],
|
|
169
|
-
seconds: [],
|
|
170
|
-
secondsLabel: [],
|
|
171
|
-
disabledHours: [],
|
|
172
|
-
disabledMinutes: [],
|
|
173
|
-
disabledSeconds: [],
|
|
174
|
-
selectedHour: 0,
|
|
175
|
-
selectedMinute: 0,
|
|
176
|
-
selectedSecond: 0,
|
|
177
|
-
};
|
|
178
|
-
for (let i = start; i <= end; i++) {
|
|
179
|
-
let i_in_24 = i;
|
|
180
|
-
if (!this.timePicker24Hour) {
|
|
181
|
-
i_in_24 = selected.hour() >= 12 ? (i === 12 ? 12 : i + 12) : (i === 12 ? 0 : i);
|
|
182
|
-
}
|
|
183
|
-
const time = selected.clone().hour(i_in_24);
|
|
184
|
-
let disabled = false;
|
|
185
|
-
if (minDate && time.minute(59).isBefore(minDate)) {
|
|
186
|
-
disabled = true;
|
|
187
|
-
}
|
|
188
|
-
if (maxDate && time.minute(0).isAfter(maxDate)) {
|
|
189
|
-
disabled = true;
|
|
190
|
-
}
|
|
191
|
-
this.timepickerVariables[side].hours.push(i);
|
|
192
|
-
if (i_in_24 === selected.hour() && !disabled) {
|
|
193
|
-
this.timepickerVariables[side].selectedHour = i;
|
|
194
|
-
}
|
|
195
|
-
else if (disabled) {
|
|
196
|
-
this.timepickerVariables[side].disabledHours.push(i);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
for (let i = 0; i < 60; i += this.timePickerIncrement) {
|
|
200
|
-
const padded = i < 10 ? '0' + i : i;
|
|
201
|
-
const time = selected.clone().minute(i);
|
|
202
|
-
let disabled = false;
|
|
203
|
-
if (minDate && time.second(59).isBefore(minDate)) {
|
|
204
|
-
disabled = true;
|
|
205
|
-
}
|
|
206
|
-
if (maxDate && time.second(0).isAfter(maxDate)) {
|
|
207
|
-
disabled = true;
|
|
208
|
-
}
|
|
209
|
-
this.timepickerVariables[side].minutes.push(i);
|
|
210
|
-
this.timepickerVariables[side].minutesLabel.push(padded);
|
|
211
|
-
if (selected.minute() === i && !disabled) {
|
|
212
|
-
this.timepickerVariables[side].selectedMinute = i;
|
|
213
|
-
}
|
|
214
|
-
else if (disabled) {
|
|
215
|
-
this.timepickerVariables[side].disabledMinutes.push(i);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
if (this.timePickerSeconds) {
|
|
219
|
-
for (let i = 0; i < 60; i++) {
|
|
220
|
-
const padded = i < 10 ? '0' + i : i;
|
|
221
|
-
const time = selected.clone().second(i);
|
|
222
|
-
let disabled = false;
|
|
223
|
-
if (minDate && time.isBefore(minDate)) {
|
|
224
|
-
disabled = true;
|
|
225
|
-
}
|
|
226
|
-
if (maxDate && time.isAfter(maxDate)) {
|
|
227
|
-
disabled = true;
|
|
228
|
-
}
|
|
229
|
-
this.timepickerVariables[side].seconds.push(i);
|
|
230
|
-
this.timepickerVariables[side].secondsLabel.push(padded);
|
|
231
|
-
if (selected.second() === i && !disabled) {
|
|
232
|
-
this.timepickerVariables[side].selectedSecond = i;
|
|
233
|
-
}
|
|
234
|
-
else if (disabled) {
|
|
235
|
-
this.timepickerVariables[side].disabledSeconds.push(i);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
if (!this.timePicker24Hour) {
|
|
240
|
-
if (minDate && selected.clone().hour(12).minute(0).second(0).isBefore(minDate)) {
|
|
241
|
-
this.timepickerVariables[side].amDisabled = true;
|
|
242
|
-
}
|
|
243
|
-
if (maxDate && selected.clone().hour(0).minute(0).second(0).isAfter(maxDate)) {
|
|
244
|
-
this.timepickerVariables[side].pmDisabled = true;
|
|
245
|
-
}
|
|
246
|
-
if (selected.hour() >= 12) {
|
|
247
|
-
this.timepickerVariables[side].ampmModel = 'PM';
|
|
248
|
-
}
|
|
249
|
-
else {
|
|
250
|
-
this.timepickerVariables[side].ampmModel = 'AM';
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
this.timepickerVariables[side].selected = selected;
|
|
254
|
-
}
|
|
255
|
-
renderCalendar(side) {
|
|
256
|
-
const mainCalendar = (side === SideEnum.left) ? this.leftCalendar : this.rightCalendar;
|
|
257
|
-
const month = mainCalendar.month.month();
|
|
258
|
-
const year = mainCalendar.month.year();
|
|
259
|
-
const hour = mainCalendar.month.hour();
|
|
260
|
-
const minute = mainCalendar.month.minute();
|
|
261
|
-
const second = mainCalendar.month.second();
|
|
262
|
-
const daysInMonth = moment([year, month]).daysInMonth();
|
|
263
|
-
const firstDay = moment([year, month, 1]);
|
|
264
|
-
const lastDay = moment([year, month, daysInMonth]);
|
|
265
|
-
const lastMonth = moment(firstDay).subtract(1, 'month').month();
|
|
266
|
-
const lastYear = moment(firstDay).subtract(1, 'month').year();
|
|
267
|
-
const daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth();
|
|
268
|
-
const dayOfWeek = firstDay.day();
|
|
269
|
-
const calendar = [];
|
|
270
|
-
calendar.firstDay = firstDay;
|
|
271
|
-
calendar.lastDay = lastDay;
|
|
272
|
-
for (let i = 0; i < 6; i++) {
|
|
273
|
-
calendar[i] = [];
|
|
274
|
-
}
|
|
275
|
-
let startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1;
|
|
276
|
-
if (startDay > daysInLastMonth) {
|
|
277
|
-
startDay -= 7;
|
|
278
|
-
}
|
|
279
|
-
if (dayOfWeek === this.locale.firstDay) {
|
|
280
|
-
startDay = daysInLastMonth - 6;
|
|
281
|
-
}
|
|
282
|
-
let curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]);
|
|
283
|
-
for (let i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) {
|
|
284
|
-
if (i > 0 && col % 7 === 0) {
|
|
285
|
-
col = 0;
|
|
286
|
-
row++;
|
|
287
|
-
}
|
|
288
|
-
calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second);
|
|
289
|
-
curDate.hour(12);
|
|
290
|
-
if (this.minDate && calendar[row][col].format('YYYY-MM-DD') === this.minDate.format('YYYY-MM-DD') &&
|
|
291
|
-
calendar[row][col].isBefore(this.minDate) && side === 'left') {
|
|
292
|
-
calendar[row][col] = this.minDate.clone();
|
|
293
|
-
}
|
|
294
|
-
if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') === this.maxDate.format('YYYY-MM-DD') &&
|
|
295
|
-
calendar[row][col].isAfter(this.maxDate) && side === 'right') {
|
|
296
|
-
calendar[row][col] = this.maxDate.clone();
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
if (side === SideEnum.left) {
|
|
300
|
-
this.leftCalendar.calendar = calendar;
|
|
301
|
-
}
|
|
302
|
-
else {
|
|
303
|
-
this.rightCalendar.calendar = calendar;
|
|
304
|
-
}
|
|
305
|
-
const minDate = side === 'left' ? this.minDate : this.startDate;
|
|
306
|
-
let maxDate = this.maxDate;
|
|
307
|
-
if (this.endDate === null && this.dateLimit) {
|
|
308
|
-
const maxLimit = this.startDate.clone().add(this.dateLimit, 'day').endOf('day');
|
|
309
|
-
if (!maxDate || maxLimit.isBefore(maxDate)) {
|
|
310
|
-
maxDate = maxLimit;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
this.calendarVariables[side] = {
|
|
314
|
-
month: month,
|
|
315
|
-
year: year,
|
|
316
|
-
hour: hour,
|
|
317
|
-
minute: minute,
|
|
318
|
-
second: second,
|
|
319
|
-
daysInMonth: daysInMonth,
|
|
320
|
-
firstDay: firstDay,
|
|
321
|
-
lastDay: lastDay,
|
|
322
|
-
lastMonth: lastMonth,
|
|
323
|
-
lastYear: lastYear,
|
|
324
|
-
daysInLastMonth: daysInLastMonth,
|
|
325
|
-
dayOfWeek: dayOfWeek,
|
|
326
|
-
calRows: Array.from(Array(6).keys()),
|
|
327
|
-
calCols: Array.from(Array(7).keys()),
|
|
328
|
-
classes: {},
|
|
329
|
-
minDate: minDate,
|
|
330
|
-
maxDate: maxDate,
|
|
331
|
-
calendar: calendar
|
|
332
|
-
};
|
|
333
|
-
if (this.showDropdowns) {
|
|
334
|
-
const currentMonth = calendar[1][1].month();
|
|
335
|
-
const currentYear = calendar[1][1].year();
|
|
336
|
-
const maxYear = (maxDate && maxDate.year()) || (currentYear + 5);
|
|
337
|
-
const minYear = (minDate && minDate.year()) || (currentYear - 50);
|
|
338
|
-
const inMinYear = currentYear === minYear;
|
|
339
|
-
const inMaxYear = currentYear === maxYear;
|
|
340
|
-
const years = [];
|
|
341
|
-
for (let y = minYear; y <= maxYear; y++) {
|
|
342
|
-
years.push(y);
|
|
343
|
-
}
|
|
344
|
-
this.calendarVariables[side].dropdowns = {
|
|
345
|
-
currentMonth: currentMonth,
|
|
346
|
-
currentYear: currentYear,
|
|
347
|
-
maxYear: maxYear,
|
|
348
|
-
minYear: minYear,
|
|
349
|
-
inMinYear: inMinYear,
|
|
350
|
-
inMaxYear: inMaxYear,
|
|
351
|
-
monthArrays: Array.from(Array(12).keys()),
|
|
352
|
-
yearArrays: years
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
this._buildCells(calendar, side);
|
|
356
|
-
}
|
|
357
|
-
setStartDate(startDate) {
|
|
358
|
-
if (typeof startDate === 'string') {
|
|
359
|
-
this.startDate = moment(startDate, this.locale.format);
|
|
360
|
-
}
|
|
361
|
-
if (typeof startDate === 'object') {
|
|
362
|
-
this.startDate = moment(startDate);
|
|
363
|
-
}
|
|
364
|
-
if (!this.timePicker) {
|
|
365
|
-
this.startDate = this.startDate.startOf('day');
|
|
366
|
-
}
|
|
367
|
-
if (this.timePicker && this.timePickerIncrement) {
|
|
368
|
-
this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);
|
|
369
|
-
}
|
|
370
|
-
if (this.minDate && this.startDate.isBefore(this.minDate)) {
|
|
371
|
-
this.startDate = this.minDate.clone();
|
|
372
|
-
if (this.timePicker && this.timePickerIncrement) {
|
|
373
|
-
this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
if (this.maxDate && this.startDate.isAfter(this.maxDate)) {
|
|
377
|
-
this.startDate = this.maxDate.clone();
|
|
378
|
-
if (this.timePicker && this.timePickerIncrement) {
|
|
379
|
-
this.startDate.minute(Math.floor(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
if (!this.isShown) {
|
|
383
|
-
this.updateElement();
|
|
384
|
-
}
|
|
385
|
-
this.updateMonthsInView();
|
|
386
|
-
}
|
|
387
|
-
setEndDate(endDate) {
|
|
388
|
-
if (typeof endDate === 'string') {
|
|
389
|
-
this.endDate = moment(endDate, this.locale.format);
|
|
390
|
-
}
|
|
391
|
-
if (typeof endDate === 'object') {
|
|
392
|
-
this.endDate = moment(endDate);
|
|
393
|
-
}
|
|
394
|
-
if (!this.timePicker) {
|
|
395
|
-
this.endDate = this.endDate.add(1, 'd').startOf('day').subtract(1, 'second');
|
|
396
|
-
}
|
|
397
|
-
if (this.timePicker && this.timePickerIncrement) {
|
|
398
|
-
this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);
|
|
399
|
-
}
|
|
400
|
-
if (this.endDate.isBefore(this.startDate)) {
|
|
401
|
-
this.endDate = this.startDate.clone();
|
|
402
|
-
}
|
|
403
|
-
if (this.maxDate && this.endDate.isAfter(this.maxDate)) {
|
|
404
|
-
this.endDate = this.maxDate.clone();
|
|
405
|
-
}
|
|
406
|
-
if (this.dateLimit && this.startDate.clone().add(this.dateLimit, 'day').isBefore(this.endDate)) {
|
|
407
|
-
this.endDate = this.startDate.clone().add(this.dateLimit, 'day');
|
|
408
|
-
}
|
|
409
|
-
if (!this.isShown) {
|
|
410
|
-
}
|
|
411
|
-
this.updateMonthsInView();
|
|
412
|
-
}
|
|
413
|
-
isInvalidDate(date) {
|
|
414
|
-
return false;
|
|
415
|
-
}
|
|
416
|
-
isCustomDate(date) {
|
|
417
|
-
return false;
|
|
418
|
-
}
|
|
419
|
-
updateView() {
|
|
420
|
-
if (this.timePicker) {
|
|
421
|
-
this.renderTimePicker(SideEnum.left);
|
|
422
|
-
this.renderTimePicker(SideEnum.right);
|
|
423
|
-
}
|
|
424
|
-
this.updateMonthsInView();
|
|
425
|
-
this.updateCalendars();
|
|
426
|
-
}
|
|
427
|
-
updateMonthsInView() {
|
|
428
|
-
if (this.endDate) {
|
|
429
|
-
if (this.leftCalendar.month && this.rightCalendar.month &&
|
|
430
|
-
((this.startDate && this.leftCalendar && this.startDate.format('YYYY-MM') === this.leftCalendar.month.format('YYYY-MM')) ||
|
|
431
|
-
(this.startDate && this.rightCalendar && this.startDate.format('YYYY-MM') === this.rightCalendar.month.format('YYYY-MM')))
|
|
432
|
-
&&
|
|
433
|
-
(this.endDate.format('YYYY-MM') === this.leftCalendar.month.format('YYYY-MM') ||
|
|
434
|
-
this.endDate.format('YYYY-MM') === this.rightCalendar.month.format('YYYY-MM'))) {
|
|
435
|
-
return;
|
|
436
|
-
}
|
|
437
|
-
if ((!this.singleDatePicker || (this.singleDatePicker && !this.pickingDate)) && this.startDate) {
|
|
438
|
-
this.leftCalendar.month = this.startDate.clone().date(2);
|
|
439
|
-
if (!this.linkedCalendars && (this.endDate.month() !== this.startDate.month() ||
|
|
440
|
-
this.endDate.year() !== this.startDate.year())) {
|
|
441
|
-
this.rightCalendar.month = this.endDate.clone().date(2);
|
|
442
|
-
}
|
|
443
|
-
else {
|
|
444
|
-
this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month');
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
else {
|
|
449
|
-
if (this.leftCalendar.month.format('YYYY-MM') !== this.startDate.format('YYYY-MM') &&
|
|
450
|
-
this.rightCalendar.month.format('YYYY-MM') !== this.startDate.format('YYYY-MM')) {
|
|
451
|
-
this.leftCalendar.month = this.startDate.clone().date(2);
|
|
452
|
-
this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month');
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
if (this.maxDate && this.linkedCalendars && this.rightCalendar.month > this.maxDate) {
|
|
456
|
-
this.rightCalendar.month = this.maxDate.clone().date(2);
|
|
457
|
-
this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month');
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
updateCalendars() {
|
|
461
|
-
this.renderCalendar(SideEnum.left);
|
|
462
|
-
if (!this.singleDatePicker) {
|
|
463
|
-
this.renderCalendar(SideEnum.right);
|
|
464
|
-
}
|
|
465
|
-
if (this.endDate === null) {
|
|
466
|
-
return;
|
|
467
|
-
}
|
|
468
|
-
this.calculateChosenLabel();
|
|
469
|
-
}
|
|
470
|
-
updateElement() {
|
|
471
|
-
if (this.autoUpdateInput) {
|
|
472
|
-
if (this.startDate && this.endDate) {
|
|
473
|
-
if (this.rangesArray.length && this.showRangeLabelOnInput === true && this.chosenRange &&
|
|
474
|
-
this.locale.customRangeLabel !== this.chosenRange) {
|
|
475
|
-
this.chosenLabel = this.chosenRange;
|
|
476
|
-
}
|
|
477
|
-
else {
|
|
478
|
-
this.chosenLabel = this.startDate.format(this.locale.format) +
|
|
479
|
-
this.locale.separator + this.endDate.format(this.locale.format);
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
remove() {
|
|
485
|
-
this.isShown = false;
|
|
486
|
-
}
|
|
487
|
-
calculateChosenLabel() {
|
|
488
|
-
if (!this.locale || !this.locale.separator) {
|
|
489
|
-
this._buildLocale();
|
|
490
|
-
}
|
|
491
|
-
let customRange = true;
|
|
492
|
-
let i = 0;
|
|
493
|
-
if (this.rangesArray.length > 0) {
|
|
494
|
-
for (const range in this.ranges) {
|
|
495
|
-
if (this.timePicker) {
|
|
496
|
-
const format = this.timePickerSeconds ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD HH:mm';
|
|
497
|
-
if (this.startDate.format(format) === this.ranges[range][0].format(format) && this.endDate.format(format) === this.ranges[range][1].format(format)) {
|
|
498
|
-
customRange = false;
|
|
499
|
-
this.chosenRange = this.rangesArray[i];
|
|
500
|
-
break;
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
else {
|
|
504
|
-
if (this.startDate.format('YYYY-MM-DD') === this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') === this.ranges[range][1].format('YYYY-MM-DD')) {
|
|
505
|
-
customRange = false;
|
|
506
|
-
this.chosenRange = this.rangesArray[i];
|
|
507
|
-
break;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
i++;
|
|
511
|
-
}
|
|
512
|
-
if (customRange) {
|
|
513
|
-
if (this.showCustomRangeLabel) {
|
|
514
|
-
this.chosenRange = this.locale.customRangeLabel;
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
this.chosenRange = null;
|
|
518
|
-
}
|
|
519
|
-
this.showCalInRanges = true;
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
this.updateElement();
|
|
523
|
-
}
|
|
524
|
-
clickApply(e) {
|
|
525
|
-
if (this.startDate && !this.endDate) {
|
|
526
|
-
this.endDate = this.startDate.clone();
|
|
527
|
-
this.calculateChosenLabel();
|
|
528
|
-
}
|
|
529
|
-
if (this.isInvalidDate && this.startDate && this.endDate) {
|
|
530
|
-
const d = this.startDate.clone();
|
|
531
|
-
while (d.isBefore(this.endDate)) {
|
|
532
|
-
if (this.isInvalidDate(d)) {
|
|
533
|
-
this.endDate = d.subtract(1, 'days');
|
|
534
|
-
this.calculateChosenLabel();
|
|
535
|
-
break;
|
|
536
|
-
}
|
|
537
|
-
d.add(1, 'days');
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
if (this.chosenLabel) {
|
|
541
|
-
this.choosedDate.emit({ chosenLabel: this.chosenLabel, startDate: this.startDate, endDate: this.endDate });
|
|
542
|
-
}
|
|
543
|
-
this.datesUpdated.emit({ startDate: this.startDate, endDate: this.endDate });
|
|
544
|
-
this.hide();
|
|
545
|
-
}
|
|
546
|
-
clickCancel(e) {
|
|
547
|
-
this.startDate = this._old.start;
|
|
548
|
-
this.endDate = this._old.end;
|
|
549
|
-
if (this.inline) {
|
|
550
|
-
this.updateView();
|
|
551
|
-
}
|
|
552
|
-
this.hide();
|
|
553
|
-
}
|
|
554
|
-
monthChanged(monthEvent, side) {
|
|
555
|
-
const year = this.calendarVariables[side].dropdowns.currentYear;
|
|
556
|
-
const month = parseInt(monthEvent.target.value, 10);
|
|
557
|
-
this.monthOrYearChanged(month, year, side);
|
|
558
|
-
}
|
|
559
|
-
yearChanged(yearEvent, side) {
|
|
560
|
-
const month = this.calendarVariables[side].dropdowns.currentMonth;
|
|
561
|
-
const year = parseInt(yearEvent.target.value, 10);
|
|
562
|
-
this.monthOrYearChanged(month, year, side);
|
|
563
|
-
}
|
|
564
|
-
timeChanged(timeEvent, side) {
|
|
565
|
-
let hour = parseInt(this.timepickerVariables[side].selectedHour, 10);
|
|
566
|
-
const minute = parseInt(this.timepickerVariables[side].selectedMinute, 10);
|
|
567
|
-
const second = this.timePickerSeconds ? parseInt(this.timepickerVariables[side].selectedSecond, 10) : 0;
|
|
568
|
-
if (!this.timePicker24Hour) {
|
|
569
|
-
const ampm = this.timepickerVariables[side].ampmModel;
|
|
570
|
-
if (ampm === 'PM' && hour < 12) {
|
|
571
|
-
hour += 12;
|
|
572
|
-
}
|
|
573
|
-
if (ampm === 'AM' && hour === 12) {
|
|
574
|
-
hour = 0;
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
if (side === SideEnum.left) {
|
|
578
|
-
const start = this.startDate.clone();
|
|
579
|
-
start.hour(hour);
|
|
580
|
-
start.minute(minute);
|
|
581
|
-
start.second(second);
|
|
582
|
-
this.setStartDate(start);
|
|
583
|
-
if (this.endDate && this.endDate.format('YYYY-MM-DD') === start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) {
|
|
584
|
-
this.setEndDate(start.clone());
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
else if (this.endDate) {
|
|
588
|
-
const end = this.endDate.clone();
|
|
589
|
-
end.hour(hour);
|
|
590
|
-
end.minute(minute);
|
|
591
|
-
end.second(second);
|
|
592
|
-
this.setEndDate(end);
|
|
593
|
-
}
|
|
594
|
-
this.updateCalendars();
|
|
595
|
-
this.renderTimePicker(SideEnum.left);
|
|
596
|
-
this.renderTimePicker(SideEnum.right);
|
|
597
|
-
}
|
|
598
|
-
monthOrYearChanged(month, year, side) {
|
|
599
|
-
const isLeft = side === SideEnum.left;
|
|
600
|
-
if (!isLeft) {
|
|
601
|
-
if (year < this.startDate.year() || (year === this.startDate.year() && month < this.startDate.month())) {
|
|
602
|
-
month = this.startDate.month();
|
|
603
|
-
year = this.startDate.year();
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
if (this.minDate) {
|
|
607
|
-
if (year < this.minDate.year() || (year === this.minDate.year() && month < this.minDate.month())) {
|
|
608
|
-
month = this.minDate.month();
|
|
609
|
-
year = this.minDate.year();
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
if (this.maxDate) {
|
|
613
|
-
if (year > this.maxDate.year() || (year === this.maxDate.year() && month > this.maxDate.month())) {
|
|
614
|
-
month = this.maxDate.month();
|
|
615
|
-
year = this.maxDate.year();
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
this.calendarVariables[side].dropdowns.currentYear = year;
|
|
619
|
-
this.calendarVariables[side].dropdowns.currentMonth = month;
|
|
620
|
-
if (isLeft) {
|
|
621
|
-
this.leftCalendar.month.month(month).year(year);
|
|
622
|
-
if (this.linkedCalendars) {
|
|
623
|
-
this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month');
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
else {
|
|
627
|
-
this.rightCalendar.month.month(month).year(year);
|
|
628
|
-
if (this.linkedCalendars) {
|
|
629
|
-
this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month');
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
this.updateCalendars();
|
|
633
|
-
}
|
|
634
|
-
clickPrev(side) {
|
|
635
|
-
if (side === SideEnum.left) {
|
|
636
|
-
this.leftCalendar.month.subtract(1, 'month');
|
|
637
|
-
if (this.linkedCalendars) {
|
|
638
|
-
this.rightCalendar.month.subtract(1, 'month');
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
else {
|
|
642
|
-
this.rightCalendar.month.subtract(1, 'month');
|
|
643
|
-
}
|
|
644
|
-
this.updateCalendars();
|
|
645
|
-
}
|
|
646
|
-
clickNext(side) {
|
|
647
|
-
if (side === SideEnum.left) {
|
|
648
|
-
this.leftCalendar.month.add(1, 'month');
|
|
649
|
-
}
|
|
650
|
-
else {
|
|
651
|
-
this.rightCalendar.month.add(1, 'month');
|
|
652
|
-
if (this.linkedCalendars) {
|
|
653
|
-
this.leftCalendar.month.add(1, 'month');
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
this.updateCalendars();
|
|
657
|
-
}
|
|
658
|
-
clickDate(e, side, row, col) {
|
|
659
|
-
this.pickingDate = true;
|
|
660
|
-
if (e.target.tagName === 'TD') {
|
|
661
|
-
if (!e.target.classList.contains('available')) {
|
|
662
|
-
return;
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
else if (e.target.tagName === 'SPAN') {
|
|
666
|
-
if (!e.target.parentElement.classList.contains('available')) {
|
|
667
|
-
return;
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
if (this.rangesArray.length) {
|
|
671
|
-
this.chosenRange = this.locale.customRangeLabel;
|
|
672
|
-
}
|
|
673
|
-
let date = side === SideEnum.left ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col];
|
|
674
|
-
if (this.endDate || date.isBefore(this.startDate, 'day')) {
|
|
675
|
-
if (this.timePicker) {
|
|
676
|
-
date = this._getDateWithTime(date, SideEnum.left);
|
|
677
|
-
}
|
|
678
|
-
this.endDate = null;
|
|
679
|
-
this.setStartDate(date.clone());
|
|
680
|
-
}
|
|
681
|
-
else if (!this.endDate && date.isBefore(this.startDate)) {
|
|
682
|
-
this.setEndDate(this.startDate.clone());
|
|
683
|
-
}
|
|
684
|
-
else {
|
|
685
|
-
if (this.timePicker) {
|
|
686
|
-
date = this._getDateWithTime(date, SideEnum.right);
|
|
687
|
-
}
|
|
688
|
-
this.setEndDate(date.clone());
|
|
689
|
-
if (this.autoApply) {
|
|
690
|
-
this.calculateChosenLabel();
|
|
691
|
-
this.clickApply();
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
this.updateView();
|
|
695
|
-
this.pickingDate = false;
|
|
696
|
-
e.stopPropagation();
|
|
697
|
-
}
|
|
698
|
-
clickRange(e, label) {
|
|
699
|
-
this.chosenRange = label;
|
|
700
|
-
if (label === this.locale.customRangeLabel) {
|
|
701
|
-
this.isShown = true;
|
|
702
|
-
this.showCalInRanges = true;
|
|
703
|
-
}
|
|
704
|
-
else {
|
|
705
|
-
const dates = this.ranges[label];
|
|
706
|
-
this.startDate = dates[0].clone();
|
|
707
|
-
this.endDate = dates[1].clone();
|
|
708
|
-
if (this.showRangeLabelOnInput && label !== this.locale.customRangeLabel) {
|
|
709
|
-
this.chosenLabel = label;
|
|
710
|
-
}
|
|
711
|
-
else {
|
|
712
|
-
this.calculateChosenLabel();
|
|
713
|
-
}
|
|
714
|
-
this.showCalInRanges = (!this.rangesArray.length) || this.alwaysShowCalendars;
|
|
715
|
-
if (!this.timePicker) {
|
|
716
|
-
this.startDate.startOf('day');
|
|
717
|
-
this.endDate.endOf('day');
|
|
718
|
-
}
|
|
719
|
-
if (!this.alwaysShowCalendars) {
|
|
720
|
-
this.isShown = false;
|
|
721
|
-
}
|
|
722
|
-
this.rangeClicked.emit({ label: label, dates: dates });
|
|
723
|
-
if (!this.keepCalendarOpeningWithRange) {
|
|
724
|
-
this.clickApply();
|
|
725
|
-
}
|
|
726
|
-
else {
|
|
727
|
-
if (this.maxDate && this.maxDate.isSame(dates[0], 'month')) {
|
|
728
|
-
this.rightCalendar.month.month(dates[0].month());
|
|
729
|
-
this.rightCalendar.month.year(dates[0].year());
|
|
730
|
-
this.leftCalendar.month.month(dates[0].month() - 1);
|
|
731
|
-
this.leftCalendar.month.year(dates[1].year());
|
|
732
|
-
}
|
|
733
|
-
else {
|
|
734
|
-
this.leftCalendar.month.month(dates[0].month());
|
|
735
|
-
this.leftCalendar.month.year(dates[0].year());
|
|
736
|
-
const nextMonth = dates[0].clone().add(1, 'month');
|
|
737
|
-
this.rightCalendar.month.month(nextMonth.month());
|
|
738
|
-
this.rightCalendar.month.year(nextMonth.year());
|
|
739
|
-
}
|
|
740
|
-
this.updateCalendars();
|
|
741
|
-
if (this.timePicker) {
|
|
742
|
-
this.renderTimePicker(SideEnum.left);
|
|
743
|
-
this.renderTimePicker(SideEnum.right);
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
}
|
|
747
|
-
}
|
|
748
|
-
show(e) {
|
|
749
|
-
if (this.isShown) {
|
|
750
|
-
return;
|
|
751
|
-
}
|
|
752
|
-
this._old.start = this.startDate.clone();
|
|
753
|
-
this._old.end = this.endDate.clone();
|
|
754
|
-
this.isShown = true;
|
|
755
|
-
this.updateView();
|
|
756
|
-
}
|
|
757
|
-
hide(e) {
|
|
758
|
-
if (!this.isShown) {
|
|
759
|
-
return;
|
|
760
|
-
}
|
|
761
|
-
if (!this.endDate) {
|
|
762
|
-
if (this._old.start) {
|
|
763
|
-
this.startDate = this._old.start.clone();
|
|
764
|
-
}
|
|
765
|
-
if (this._old.end) {
|
|
766
|
-
this.endDate = this._old.end.clone();
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
if (!this.startDate.isSame(this._old.start) || !this.endDate.isSame(this._old.end)) {
|
|
770
|
-
}
|
|
771
|
-
this.updateElement();
|
|
772
|
-
this.isShown = false;
|
|
773
|
-
this._ref.detectChanges();
|
|
774
|
-
}
|
|
775
|
-
handleInternalClick(e) {
|
|
776
|
-
e.stopPropagation();
|
|
777
|
-
}
|
|
778
|
-
updateLocale(locale) {
|
|
779
|
-
for (const key in locale) {
|
|
780
|
-
if (locale.hasOwnProperty(key)) {
|
|
781
|
-
this.locale[key] = locale[key];
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
clear() {
|
|
786
|
-
this.startDate = moment().startOf('day');
|
|
787
|
-
this.endDate = moment().endOf('day');
|
|
788
|
-
this.choosedDate.emit({ chosenLabel: '', startDate: null, endDate: null });
|
|
789
|
-
this.datesUpdated.emit({ startDate: null, endDate: null });
|
|
790
|
-
this.hide();
|
|
791
|
-
}
|
|
792
|
-
disableRange(range) {
|
|
793
|
-
if (range === this.locale.customRangeLabel) {
|
|
794
|
-
return false;
|
|
795
|
-
}
|
|
796
|
-
const rangeMarkers = this.ranges[range];
|
|
797
|
-
const areBothBefore = rangeMarkers.every(date => {
|
|
798
|
-
if (!this.minDate) {
|
|
799
|
-
return false;
|
|
800
|
-
}
|
|
801
|
-
return date.isBefore(this.minDate);
|
|
802
|
-
});
|
|
803
|
-
const areBothAfter = rangeMarkers.every(date => {
|
|
804
|
-
if (!this.maxDate) {
|
|
805
|
-
return false;
|
|
806
|
-
}
|
|
807
|
-
return date.isAfter(this.maxDate);
|
|
808
|
-
});
|
|
809
|
-
return (areBothBefore || areBothAfter);
|
|
810
|
-
}
|
|
811
|
-
_getDateWithTime(date, side) {
|
|
812
|
-
let hour = parseInt(this.timepickerVariables[side].selectedHour, 10);
|
|
813
|
-
if (!this.timePicker24Hour) {
|
|
814
|
-
const ampm = this.timepickerVariables[side].ampmModel;
|
|
815
|
-
if (ampm === 'PM' && hour < 12) {
|
|
816
|
-
hour += 12;
|
|
817
|
-
}
|
|
818
|
-
if (ampm === 'AM' && hour === 12) {
|
|
819
|
-
hour = 0;
|
|
820
|
-
}
|
|
821
|
-
}
|
|
822
|
-
const minute = parseInt(this.timepickerVariables[side].selectedMinute, 10);
|
|
823
|
-
const second = this.timePickerSeconds ? parseInt(this.timepickerVariables[side].selectedSecond, 10) : 0;
|
|
824
|
-
return date.clone().hour(hour).minute(minute).second(second);
|
|
825
|
-
}
|
|
826
|
-
_buildLocale() {
|
|
827
|
-
if (!this.locale.format) {
|
|
828
|
-
if (this.timePicker) {
|
|
829
|
-
this.locale.format = moment.localeData().longDateFormat('lll');
|
|
830
|
-
}
|
|
831
|
-
else {
|
|
832
|
-
this.locale.format = moment.localeData().longDateFormat('L');
|
|
833
|
-
}
|
|
834
|
-
}
|
|
835
|
-
}
|
|
836
|
-
_buildCells(calendar, side) {
|
|
837
|
-
for (let row = 0; row < 6; row++) {
|
|
838
|
-
this.calendarVariables[side].classes[row] = {};
|
|
839
|
-
const rowClasses = [];
|
|
840
|
-
if (this.emptyWeekRowClass && !this.hasCurrentMonthDays(this.calendarVariables[side].month, calendar[row])) {
|
|
841
|
-
rowClasses.push(this.emptyWeekRowClass);
|
|
842
|
-
}
|
|
843
|
-
for (let col = 0; col < 7; col++) {
|
|
844
|
-
const classes = [];
|
|
845
|
-
if (calendar[row][col].isSame(new Date(), 'day')) {
|
|
846
|
-
classes.push('today');
|
|
847
|
-
}
|
|
848
|
-
if (calendar[row][col].isoWeekday() > 5) {
|
|
849
|
-
classes.push('weekend');
|
|
850
|
-
}
|
|
851
|
-
if (calendar[row][col].month() !== calendar[1][1].month()) {
|
|
852
|
-
classes.push('off');
|
|
853
|
-
if (this.lastDayOfPreviousMonthClass && (calendar[row][col].month() < calendar[1][1].month() || calendar[1][1].month() === 0) && calendar[row][col].date() === this.calendarVariables[side].daysInLastMonth) {
|
|
854
|
-
classes.push(this.lastDayOfPreviousMonthClass);
|
|
855
|
-
}
|
|
856
|
-
if (this.firstDayOfNextMonthClass && (calendar[row][col].month() > calendar[1][1].month() || calendar[row][col].month() === 0) && calendar[row][col].date() === 1) {
|
|
857
|
-
classes.push(this.firstDayOfNextMonthClass);
|
|
858
|
-
}
|
|
859
|
-
}
|
|
860
|
-
if (this.firstMonthDayClass && calendar[row][col].month() === calendar[1][1].month() && calendar[row][col].date() === calendar.firstDay.date()) {
|
|
861
|
-
classes.push(this.firstMonthDayClass);
|
|
862
|
-
}
|
|
863
|
-
if (this.lastMonthDayClass && calendar[row][col].month() === calendar[1][1].month() && calendar[row][col].date() === calendar.lastDay.date()) {
|
|
864
|
-
classes.push(this.lastMonthDayClass);
|
|
865
|
-
}
|
|
866
|
-
if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day')) {
|
|
867
|
-
classes.push('off', 'disabled');
|
|
868
|
-
}
|
|
869
|
-
if (this.calendarVariables[side].maxDate && calendar[row][col].isAfter(this.calendarVariables[side].maxDate, 'day')) {
|
|
870
|
-
classes.push('off', 'disabled');
|
|
871
|
-
}
|
|
872
|
-
if (this.isInvalidDate(calendar[row][col])) {
|
|
873
|
-
classes.push('off', 'disabled');
|
|
874
|
-
}
|
|
875
|
-
if (this.startDate && calendar[row][col].format('YYYY-MM-DD') === this.startDate.format('YYYY-MM-DD')) {
|
|
876
|
-
classes.push('active', 'start-date');
|
|
877
|
-
}
|
|
878
|
-
if (this.endDate !== null && calendar[row][col].format('YYYY-MM-DD') === this.endDate.format('YYYY-MM-DD')) {
|
|
879
|
-
classes.push('active', 'end-date');
|
|
880
|
-
}
|
|
881
|
-
if (this.endDate !== null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate) {
|
|
882
|
-
classes.push('in-range');
|
|
883
|
-
}
|
|
884
|
-
const isCustom = this.isCustomDate(calendar[row][col]);
|
|
885
|
-
if (isCustom !== false) {
|
|
886
|
-
if (typeof isCustom === 'string') {
|
|
887
|
-
classes.push(isCustom);
|
|
888
|
-
}
|
|
889
|
-
else {
|
|
890
|
-
Array.prototype.push.apply(classes, isCustom);
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
let cname = '';
|
|
894
|
-
let disabled = false;
|
|
895
|
-
for (let i = 0; i < classes.length; i++) {
|
|
896
|
-
cname += classes[i] + ' ';
|
|
897
|
-
if (classes[i] === 'disabled') {
|
|
898
|
-
disabled = true;
|
|
899
|
-
}
|
|
900
|
-
}
|
|
901
|
-
if (!disabled) {
|
|
902
|
-
cname += 'available';
|
|
903
|
-
}
|
|
904
|
-
this.calendarVariables[side].classes[row][col] = cname.replace(/^\s+|\s+$/g, '');
|
|
905
|
-
}
|
|
906
|
-
this.calendarVariables[side].classes[row].classList = rowClasses.join(' ');
|
|
907
|
-
}
|
|
908
|
-
}
|
|
909
|
-
hasCurrentMonthDays(currentMonth, row) {
|
|
910
|
-
for (let day = 0; day < 7; day++) {
|
|
911
|
-
if (row[day].month() === currentMonth) {
|
|
912
|
-
return true;
|
|
913
|
-
}
|
|
914
|
-
}
|
|
915
|
-
return false;
|
|
916
|
-
}
|
|
917
|
-
}
|
|
918
|
-
DaterangepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DaterangepickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
919
|
-
DaterangepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DaterangepickerComponent, selector: "o-daterange-picker", inputs: { dateLimit: "dateLimit", minDate: "minDate", maxDate: "maxDate", autoApply: "autoApply", singleDatePicker: "singleDatePicker", showDropdowns: "showDropdowns", showISOWeekNumbers: "showISOWeekNumbers", linkedCalendars: "linkedCalendars", autoUpdateInput: "autoUpdateInput", alwaysShowCalendars: "alwaysShowCalendars", maxSpan: "maxSpan", timePicker: "timePicker", timePicker24Hour: "timePicker24Hour", timePickerIncrement: "timePickerIncrement", timePickerSeconds: "timePickerSeconds", showClearButton: "showClearButton", firstMonthDayClass: "firstMonthDayClass", lastMonthDayClass: "lastMonthDayClass", emptyWeekRowClass: "emptyWeekRowClass", firstDayOfNextMonthClass: "firstDayOfNextMonthClass", lastDayOfPreviousMonthClass: "lastDayOfPreviousMonthClass", locale: "locale", ranges: "ranges", showCustomRangeLabel: "showCustomRangeLabel", showCancel: "showCancel", keepCalendarOpeningWithRange: "keepCalendarOpeningWithRange", showRangeLabelOnInput: "showRangeLabelOnInput", drops: "drops", opens: "opens", isInvalidDate: "isInvalidDate", isCustomDate: "isCustomDate" }, outputs: { choosedDate: "choosedDate", rangeClicked: "rangeClicked", datesUpdated: "datesUpdated" }, host: { listeners: { "click": "handleInternalClick($event)" } }, providers: [{
|
|
920
|
-
provide: NG_VALUE_ACCESSOR,
|
|
921
|
-
useExisting: forwardRef(() => DaterangepickerComponent),
|
|
922
|
-
multi: true
|
|
923
|
-
}], viewQueries: [{ propertyName: "pickerContainer", first: true, predicate: ["pickerContainer"], descendants: true }], ngImport: i0, template: "<div class=\"md-drppicker\" #pickerContainer [ngClass]=\"{\n ltr: locale.direction === 'ltr',\n rtl: this.locale.direction === 'rtl',\n 'shown': isShown || inline,\n 'hidden': !isShown && !inline,\n 'inline': inline,\n 'double': !singleDatePicker && showCalInRanges,\n 'show-ranges': rangesArray.length\n}\" [class]=\"'drops-' + drops + '-' + opens\">\n <div class=\"ranges\">\n <ul>\n <li *ngFor=\"let range of rangesArray\">\n <button type=\"button\" (click)=\"clickRange($event, range)\" [disabled]=\"disableRange(range)\"\n [ngClass]=\"{'active': range === chosenRange}\">{{range | oTranslate}}</button>\n </li>\n </ul>\n </div>\n <div class=\"calendar\" [ngClass]=\"{right: singleDatePicker, left: !singleDatePicker}\" *ngIf=\"showCalInRanges\">\n <div class=\"calendar-table\">\n <table class=\"table-condensed\" *ngIf=\"calendarVariables\" aria-describedby=\"calendar days table\">\n <thead>\n <tr>\n <th scope=\"col\" *ngIf=\"showWeekNumbers || showISOWeekNumbers\"></th>\n <ng-container\n *ngIf=\"!calendarVariables.left.minDate || calendarVariables.left.minDate.isBefore(calendarVariables.left.calendar.firstDay) && (!this.linkedCalendars || true)\">\n <th (click)=\"clickPrev(sideEnum.left)\" class=\"prev available\">\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"!(!calendarVariables.left.minDate || calendarVariables.left.minDate.isBefore(calendarVariables.left.calendar.firstDay) && (!this.linkedCalendars || true))\">\n <th scope=\"col\"></th>\n </ng-container>\n <th scope=\"col\" colspan=\"5\" class=\"month drp-animate\">\n <ng-container *ngIf=\"showDropdowns && calendarVariables.left.dropdowns\">\n <div class=\"dropdowns\">\n {{this.locale.monthNames[calendarVariables?.left?.calendar[1][1].month()]}}\n <select class=\"monthselect\" (change)=\"monthChanged($event, sideEnum.left)\">\n <option\n [disabled]=\"(calendarVariables.left.dropdowns.inMinYear && m < calendarVariables.left.minDate.month()) || (calendarVariables.left.dropdowns.inMaxYear && m > calendarVariables.left.maxDate.month())\"\n *ngFor=\"let m of calendarVariables.left.dropdowns.monthArrays\" [value]=\"m\"\n [selected]=\"calendarVariables.left.dropdowns.currentMonth == m\">\n {{locale.monthNames[m]}}\n </option>\n </select>\n </div>\n <div class=\"dropdowns\">\n {{ calendarVariables?.left?.calendar[1][1].format(\" YYYY\")}}\n <select class=\"yearselect\" (change)=\"yearChanged($event, sideEnum.left)\">\n <option *ngFor=\"let y of calendarVariables.left.dropdowns.yearArrays\"\n [selected]=\"y === calendarVariables.left.dropdowns.currentYear\">\n {{y}}\n </option>\n </select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!showDropdowns || !calendarVariables.left.dropdowns\">\n {{this.locale.monthNames[calendarVariables?.left?.calendar[1][1].month()]}} {{ calendarVariables?.left?.calendar[1][1].format(\"\n YYYY\")}}\n </ng-container>\n </th>\n <ng-container\n *ngIf=\"(!calendarVariables.left.maxDate || calendarVariables.left.maxDate.isAfter(calendarVariables.left.calendar.lastDay)) && (!linkedCalendars || singleDatePicker )\">\n <th scope=\"col\" class=\"next available\" (click)=\"clickNext(sideEnum.left)\">\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"!((!calendarVariables.left.maxDate || calendarVariables.left.maxDate.isAfter(calendarVariables.left.calendar.lastDay)) && (!linkedCalendars || singleDatePicker ))\">\n <th scope=\"col\"></th>\n </ng-container>\n </tr>\n <tr class='week-days'>\n <th scope=\"col\" *ngIf=\"showWeekNumbers || showISOWeekNumbers\" class=\"week\"><span>{{this.locale.weekLabel}}</span></th>\n <th scope=\"col\" *ngFor=\"let dayofweek of adjustedDaysOfWeek\"><span>{{dayofweek}}</span></th>\n </tr>\n </thead>\n <tbody class=\"drp-animate\">\n <tr *ngFor=\"let row of calendarVariables.left.calRows\" [class]=\"calendarVariables.left.classes[row].classList\">\n <!-- add week number -->\n <td class=\"week\" *ngIf=\"showWeekNumbers\">\n <span>{{calendarVariables.left.calendar[row][0].week()}}</span>\n </td>\n <td class=\"week\" *ngIf=\"showISOWeekNumbers\">\n <span>{{calendarVariables.left.calendar[row][0].isoWeek()}}</span>\n </td>\n <!-- cal -->\n <td *ngFor=\"let col of calendarVariables.left.calCols\" [class]=\"calendarVariables.left.classes[row][col]\"\n (click)=\"clickDate($event, sideEnum.left, row, col)\">\n <span>{{calendarVariables.left.calendar[row][col].date()}}</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n <div class=\"calendar-time\" *ngIf=\"timePicker\">\n <div class=\"select\">\n <select class=\"hourselect select-item\" [disabled]=\"!endDate\" [(ngModel)]=\"timepickerVariables.left.selectedHour\"\n (ngModelChange)=\"timeChanged($event, sideEnum.left)\">\n <option *ngFor=\"let i of timepickerVariables.left.hours\" [value]=\"i\" [disabled]=\"timepickerVariables.left.disabledHours.indexOf(i) > -1\">\n {{i}}</option>\n </select>\n </div>\n <div class=\"select\">\n <select class=\"select-item minuteselect\" [disabled]=\"!endDate\" [(ngModel)]=\"timepickerVariables.left.selectedMinute\"\n (ngModelChange)=\"timeChanged($event, sideEnum.left)\">\n <option *ngFor=\"let i of timepickerVariables.left.minutes; let index = index;\" [value]=\"i\"\n [disabled]=\"timepickerVariables.left.disabledMinutes.indexOf(i) > -1\">{{timepickerVariables.left.minutesLabel[index]}}</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n <div class=\"select\">\n <select class=\"select-item secondselect\" *ngIf=\"timePickerSeconds\" [disabled]=\"!endDate\" [(ngModel)]=\"timepickerVariables.left.selectedSecond\"\n (ngModelChange)=\"timeChanged($event, sideEnum.left)\">\n <option *ngFor=\"let i of timepickerVariables.left.seconds; let index = index;\" [value]=\"i\"\n [disabled]=\"timepickerVariables.left.disabledSeconds.indexOf(i) > -1\">{{timepickerVariables.left.secondsLabel[index]}}</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n <div class=\"select\">\n <select class=\"select-item ampmselect\" *ngIf=\"!timePicker24Hour\" [(ngModel)]=\"timepickerVariables.left.ampmModel\"\n (ngModelChange)=\"timeChanged($event, sideEnum.left)\">\n <option value=\"AM\" [disabled]=\"timepickerVariables.left.amDisabled\">AM</option>\n <option value=\"PM\" [disabled]=\"timepickerVariables.left.pmDisabled\">PM</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n </div>\n </div>\n <div class=\"calendar right\" *ngIf=\"showCalInRanges && !singleDatePicker\">\n <div class=\"calendar-table\">\n <table class=\"table-condensed\" *ngIf=\"calendarVariables\" aria-describedby=\"calendar days table\">\n <thead>\n <tr>\n <th scope=\"col\" *ngIf=\"showWeekNumbers || showISOWeekNumbers\"></th>\n <ng-container\n *ngIf=\"(!calendarVariables.right.minDate || calendarVariables.right.minDate.isBefore(calendarVariables.right.calendar.firstDay)) && (!this.linkedCalendars)\">\n <th (click)=\"clickPrev(sideEnum.right)\" class=\"prev available\">\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"!((!calendarVariables.right.minDate || calendarVariables.right.minDate.isBefore(calendarVariables.right.calendar.firstDay)) && (!this.linkedCalendars))\">\n <th scope=\"col\"></th>\n </ng-container>\n <th scope=\"col\" colspan=\"5\" class=\"month\">\n <ng-container *ngIf=\"showDropdowns && calendarVariables.right.dropdowns\">\n <div class=\"dropdowns\">\n {{this.locale.monthNames[calendarVariables?.right?.calendar[1][1].month()]}}\n <select class=\"monthselect\" (change)=\"monthChanged($event, sideEnum.right)\">\n <option\n [disabled]=\"(calendarVariables.right.dropdowns.inMinYear && m < calendarVariables.right.minDate.month()) || (calendarVariables.right.dropdowns.inMaxYear && m > calendarVariables.right.maxDate.month())\"\n *ngFor=\"let m of calendarVariables.right.dropdowns.monthArrays\" [value]=\"m\"\n [selected]=\"calendarVariables.right.dropdowns.currentMonth == m\">\n {{locale.monthNames[m]}}\n </option>\n </select>\n </div>\n <div class=\"dropdowns\">\n {{ calendarVariables?.right?.calendar[1][1].format(\" YYYY\")}}\n <select class=\"yearselect\" (change)=\"yearChanged($event, sideEnum.right)\">\n <option *ngFor=\"let y of calendarVariables.right.dropdowns.yearArrays\"\n [selected]=\"y === calendarVariables.right.dropdowns.currentYear\">\n {{y}}\n </option>\n </select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!showDropdowns || !calendarVariables.right.dropdowns\">\n {{this.locale.monthNames[calendarVariables?.right?.calendar[1][1].month()]}} {{ calendarVariables?.right?.calendar[1][1].format(\"\n YYYY\")}}\n </ng-container>\n </th>\n <ng-container\n *ngIf=\"!calendarVariables.right.maxDate || calendarVariables.right.maxDate.isAfter(calendarVariables.right.calendar.lastDay) && (!linkedCalendars || singleDatePicker || true)\">\n <th scope=\"col\" class=\"next available\" (click)=\"clickNext(sideEnum.right)\">\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"!(!calendarVariables.right.maxDate || calendarVariables.right.maxDate.isAfter(calendarVariables.right.calendar.lastDay) && (!linkedCalendars || singleDatePicker || true))\">\n <th scope=\"col\"></th>\n </ng-container>\n </tr>\n\n <tr>\n <th scope=\"col\" *ngIf=\"showWeekNumbers || showISOWeekNumbers\" class=\"week\"><span>{{this.locale.weekLabel}}</span></th>\n <th scope=\"col\" *ngFor=\"let dayofweek of locale.daysOfWeek\"><span>{{dayofweek}}</span></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of calendarVariables.right.calRows\" [class]=\"calendarVariables.right.classes[row].classList\">\n <td class=\"week\" *ngIf=\"showWeekNumbers\">\n <span>{{calendarVariables.right.calendar[row][0].week()}}</span>\n </td>\n <td class=\"week\" *ngIf=\"showISOWeekNumbers\">\n <span>{{calendarVariables.right.calendar[row][0].isoWeek()}}</span>\n </td>\n <td *ngFor=\"let col of calendarVariables.right.calCols\" [class]=\"calendarVariables.right.classes[row][col]\"\n (click)=\"clickDate($event, sideEnum.right, row, col)\">\n <span>{{calendarVariables.right.calendar[row][col].date()}}</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n <div class=\"calendar-time\" *ngIf=\"timePicker\">\n <div class=\"select\">\n <select class=\"select-item hourselect\" [disabled]=\"!endDate\" [(ngModel)]=\"timepickerVariables.right.selectedHour\"\n (ngModelChange)=\"timeChanged($event, sideEnum.right)\">\n <option *ngFor=\"let i of timepickerVariables.right.hours\" [value]=\"i\" [disabled]=\"timepickerVariables.right.disabledHours.indexOf(i) > -1\">\n {{i}}</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n <div class=\"select\">\n <select class=\"select-item minuteselect\" [disabled]=\"!endDate\" [(ngModel)]=\"timepickerVariables.right.selectedMinute\"\n (ngModelChange)=\"timeChanged($event, sideEnum.right)\">\n <option *ngFor=\"let i of timepickerVariables.right.minutes; let index = index;\" [value]=\"i\"\n [disabled]=\"timepickerVariables.right.disabledMinutes.indexOf(i) > -1\">{{timepickerVariables.right.minutesLabel[index]}}</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n <div class=\"select\">\n <select *ngIf=\"timePickerSeconds\" class=\"select-item secondselect\" [disabled]=\"!endDate\"\n [(ngModel)]=\"timepickerVariables.right.selectedSecond\" (ngModelChange)=\"timeChanged($event, sideEnum.right)\">\n <option *ngFor=\"let i of timepickerVariables.right.seconds; let index = index;\" [value]=\"i\"\n [disabled]=\"timepickerVariables.right.disabledSeconds.indexOf(i) > -1\">{{timepickerVariables.right.secondsLabel[index]}}</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n <div class=\"select\">\n <select *ngIf=\"!timePicker24Hour\" class=\"select-item ampmselect\" [(ngModel)]=\"timepickerVariables.right.ampmModel\"\n (ngModelChange)=\"timeChanged($event, sideEnum.right)\">\n <option value=\"AM\" [disabled]=\"timepickerVariables.right.amDisabled\">AM</option>\n <option value=\"PM\" [disabled]=\"timepickerVariables.right.pmDisabled\">PM</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n </div>\n </div>\n <div class=\"buttons\" *ngIf=\"!autoApply && ( !rangesArray.length || (showCalInRanges && !singleDatePicker))\">\n <div class=\"buttons_input\">\n <button *ngIf=\"showClearButton\" class=\"mat-primary mat-stroked-button clear\" type=\"button\" (click)=\"clear()\" title=\"clear the date\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\" viewBox=\"0 -5 24 24\">\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\n </svg>\n </button>\n <button class=\"mat-primary mat-stroked-button\" *ngIf=\"showCancel\" type=\"button\" (click)=\"clickCancel($event)\">{{locale.cancelLabel}}</button>\n <button class=\"mat-primary mat-stroked-button\" [disabled]=\"applyBtn.disabled\" type=\"button\"\n (click)=\"clickApply($event)\">{{locale.applyLabel}}</button>\n </div>\n </div>\n</div>\n", styles: [".md-drppicker{position:absolute;border-radius:4px;width:278px;padding:4px;margin-top:-10px;overflow:hidden;z-index:1000;font-size:13px;box-shadow:0 2px 4px #00000029,0 2px 8px #0000001f}.md-drppicker.double{width:auto}.md-drppicker.inline{position:relative;display:inline-block}.md-drppicker:after,.md-drppicker:before{position:absolute;display:inline-block;content:\"\"}.md-drppicker.openscenter:before{left:0;right:0;width:0;margin-left:auto;margin-right:auto}.md-drppicker.openscenter:after{left:0;right:0;width:0;margin-left:auto;margin-right:auto}.md-drppicker.single .calendar,.md-drppicker.single .ranges{float:none}.md-drppicker.shown{transform:scale(1);transition:all .1s ease-in-out;transform-origin:0 0;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.md-drppicker.shown.drops-up-left{transform-origin:100% 100%}.md-drppicker.shown.drops-up-right{transform-origin:0 100%}.md-drppicker.shown.drops-down-left{transform-origin:100% 0}.md-drppicker.shown.drops-down-right{transform-origin:0 0}.md-drppicker.shown.drops-down-center{transform-origin:50% 0}.md-drppicker.shown.drops-up-center{transform-origin:50% 100%}.md-drppicker.shown .calendar{display:block}.md-drppicker.hidden{transition:all .1s ease;transform:scale(0);transform-origin:0 0;cursor:default;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.md-drppicker.hidden.drops-up-left{transform-origin:100% 100%}.md-drppicker.hidden.drops-up-right{transform-origin:0 100%}.md-drppicker.hidden.drops-down-left{transform-origin:100% 0}.md-drppicker.hidden.drops-down-right{transform-origin:0 0}.md-drppicker.hidden.drops-down-center{transform-origin:50% 0}.md-drppicker.hidden.drops-up-center{transform-origin:50% 100%}.md-drppicker.hidden .calendar{display:none}.md-drppicker .calendar{max-width:270px;margin:4px}.md-drppicker .calendar.single .calendar-table{border:none}.md-drppicker .calendar td,.md-drppicker .calendar th{padding:0;white-space:nowrap;text-align:center;height:36px;width:36px}.md-drppicker .calendar td span,.md-drppicker .calendar th span{pointer-events:none}.md-drppicker .calendar-table{border-style:1px solid;padding:4px;border-radius:4px}.md-drppicker table{width:100%;margin:0}.md-drppicker td,.md-drppicker th{text-align:center;width:20px;height:20px;border-radius:4px;border-style:1px solid;white-space:nowrap;cursor:pointer}.md-drppicker td.available.prev,.md-drppicker th.available.prev{display:block;background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K);background-repeat:no-repeat;background-size:.5em;background-position:center;opacity:.8;transition:background-color .2s ease;border-radius:2em}.md-drppicker td.available.prev:hover,.md-drppicker th.available.prev:hover{margin:0}.md-drppicker td.available.next,.md-drppicker th.available.next{transform:rotate(180deg);display:block;background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K);background-repeat:no-repeat;background-size:.5em;background-position:center;opacity:.8;transition:background-color .2s ease;border-radius:2em}.md-drppicker td.available.next:hover,.md-drppicker th.available.next:hover{margin:0;transform:rotate(180deg)}.md-drppicker td.available:hover,.md-drppicker th.available:hover{background-repeat:no-repeat;background-size:.5em;background-position:center;margin:.25em 0;opacity:.8;border-radius:2em;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0}.md-drppicker td.week,.md-drppicker th.week{font-size:80%}.md-drppicker td{margin:.25em 0;opacity:.8;border-radius:2em;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0}.md-drppicker td.in-range{border-radius:0}.md-drppicker td.start-date{border-radius:2em 0 0 2em}.md-drppicker td.end-date{border-radius:0 2em 2em 0}.md-drppicker td.start-date.end-date{border-radius:4px}.md-drppicker th.month{width:auto}.md-drppicker option.disabled,.md-drppicker td.disabled{cursor:not-allowed;text-decoration:line-through}.md-drppicker .dropdowns{background-repeat:no-repeat;background-size:10px;background-position-y:center;background-position-x:right;width:50px;background-image:url(data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDI1NSAyNTUiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI1NSAyNTU7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj4KCQk8cG9seWdvbiBwb2ludHM9IjAsNjMuNzUgMTI3LjUsMTkxLjI1IDI1NSw2My43NSAgICIgZmlsbD0iIzk4OGM4YyIvPgoJPC9nPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo=)}.md-drppicker .dropdowns select{display:inline-block;width:100%;padding:5px;border:1px solid;border-radius:2px;height:3rem}.md-drppicker .dropdowns select.monthselect,.md-drppicker .dropdowns select.yearselect{font-size:12px;padding:1px;height:auto;margin:0;cursor:default}.md-drppicker .dropdowns select.ampmselect,.md-drppicker .dropdowns select.hourselect,.md-drppicker .dropdowns select.minuteselect,.md-drppicker .dropdowns select.secondselect{width:50px;margin:0 auto;border-style:1px solid;padding:2px;outline:0;font-size:12px}.md-drppicker .dropdowns select.monthselect,.md-drppicker .dropdowns select.yearselect{cursor:pointer;opacity:0;position:absolute;top:0;left:0;margin:0;padding:0}.md-drppicker th.month>div{position:relative;display:inline-block}.md-drppicker .calendar-time{text-align:center;margin:4px auto 0;line-height:30px;position:relative}.md-drppicker .calendar-time .select{display:inline}.md-drppicker .calendar-time .select .select-item{display:inline-block;width:auto;position:relative;font-family:inherit;background-color:transparent;padding:10px 10px 10px 0;font-size:18px;border-radius:0;border:none;border-bottom-style:1px solid}.md-drppicker .calendar-time .select .select-item:after{position:absolute;top:18px;right:10px;width:0;height:0;padding:0;content:\"\";border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid rgba(0,0,0,.12);pointer-events:none}.md-drppicker .calendar-time .select .select-item:focus{outline:none}.md-drppicker .calendar-time .select .select-item .select-label{font-size:16px;font-weight:400;position:absolute;pointer-events:none;left:0;top:10px;transition:.2s ease all}.md-drppicker .calendar-time select.disabled{cursor:not-allowed}.md-drppicker .label-input{border-style:1px solid;border-radius:4px;height:30px;line-height:30px;display:block;vertical-align:middle;margin:0 auto 5px;padding:0 0 0 28px;width:100%}.md-drppicker .label-input.active{border-style:1px solid;border-radius:4px}.md-drppicker .md-drppicker_input{position:relative;padding:0 30px 0 0}.md-drppicker .md-drppicker_input i,.md-drppicker .md-drppicker_input svg{position:absolute;left:8px;top:8px}.md-drppicker.rtl .label-input{padding-right:28px;padding-left:6px}.md-drppicker.rtl .md-drppicker_input i,.md-drppicker.rtl .md-drppicker_input svg{left:auto;right:8px}.md-drppicker .show-ranges .drp-calendar.left{border-left-style:1px solid}.md-drppicker .ranges{float:none;text-align:left;margin:0}.md-drppicker .ranges ul{list-style:none;margin:0 auto;padding:0;width:100%}.md-drppicker .ranges ul li{font-size:12px}.md-drppicker .ranges ul li button{padding:8px 12px;width:100%;background:none;border:none;text-align:left;cursor:pointer}.md-drppicker .ranges ul li button[disabled]{opacity:.3}.md-drppicker .ranges ul li button:active{background:transparent}.md-drppicker .show-calendar .ranges{margin-top:8px}.md-drppicker [hidden]{display:none}.md-drppicker .buttons{text-align:right;margin:0 5px 5px 0}.md-drppicker .btn{position:relative;overflow:hidden;border-width:0;outline:none;padding:0 6px;cursor:pointer;border-radius:2px;box-shadow:0 1px 4px #0009;color:#ecf0f1;transition:background-color .4s;height:auto;text-transform:uppercase;line-height:36px;border:none}.md-drppicker .btn>*{position:relative}.md-drppicker .btn span{display:block;padding:12px 24px}.md-drppicker .btn:before{content:\"\";position:absolute;top:50%;left:50%;display:block;width:0;padding-top:0;border-radius:100%;transform:translate(-50%,-50%)}.md-drppicker .btn:active:before{width:120%;padding-top:120%;transition:width .2s ease-out,padding-top .2s ease-out}.md-drppicker .btn:disabled{opacity:.5}.md-drppicker .clear{box-shadow:none}.md-drppicker .clear svg{fill:currentColor}@media (min-width: 564px){.md-drppicker{width:auto}.md-drppicker.single .calendar.left{clear:none}.md-drppicker.ltr{direction:ltr;text-align:left}.md-drppicker.ltr .calendar.left{clear:left}.md-drppicker.ltr .calendar.left .calendar-table{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.md-drppicker.ltr .calendar.right{margin-left:0}.md-drppicker.ltr .calendar.right .calendar-table{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.md-drppicker.ltr .left .md-drppicker_input,.md-drppicker.ltr .right .md-drppicker_input{padding-right:35px}.md-drppicker.ltr .calendar.left .calendar-table{padding-right:12px}.md-drppicker.ltr .calendar,.md-drppicker.ltr .ranges{float:left}.md-drppicker.rtl{direction:rtl;text-align:right}.md-drppicker.rtl .calendar.left{clear:right;margin-left:0}.md-drppicker.rtl .calendar.left .calendar-table{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.md-drppicker.rtl .calendar.right{margin-right:0}.md-drppicker.rtl .calendar.right .calendar-table{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.md-drppicker.rtl .left .md-drppicker_input,.md-drppicker.rtl .calendar.left .calendar-table{padding-left:12px}.md-drppicker.rtl .calendar,.md-drppicker.rtl .ranges{text-align:right;float:right}.drp-animate{transform:translate(0);transition:transform .2s ease,opacity .2s ease}.drp-animate.drp-picker-site-this{transition-timing-function:linear}.drp-animate.drp-animate-right{transform:translate(10%);opacity:0}.drp-animate.drp-animate-left{transform:translate(-10%);opacity:0}}@media (min-width: 730px){.md-drppicker .ranges{width:auto}.md-drppicker.ltr .ranges{float:left}.md-drppicker.rtl .ranges{float:right}.md-drppicker .calendar.left{clear:none!important}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i4.OTranslatePipe, name: "oTranslate" }], encapsulation: i0.ViewEncapsulation.None });
|
|
924
|
-
__decorate([
|
|
925
|
-
BooleanInputConverter(),
|
|
926
|
-
__metadata("design:type", Boolean)
|
|
927
|
-
], DaterangepickerComponent.prototype, "showWeekNumbers", void 0);
|
|
928
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DaterangepickerComponent, decorators: [{
|
|
929
|
-
type: Component,
|
|
930
|
-
args: [{ selector: 'o-daterange-picker', host: {
|
|
931
|
-
'(click)': 'handleInternalClick($event)',
|
|
932
|
-
}, encapsulation: ViewEncapsulation.None, providers: [{
|
|
933
|
-
provide: NG_VALUE_ACCESSOR,
|
|
934
|
-
useExisting: forwardRef(() => DaterangepickerComponent),
|
|
935
|
-
multi: true
|
|
936
|
-
}], template: "<div class=\"md-drppicker\" #pickerContainer [ngClass]=\"{\n ltr: locale.direction === 'ltr',\n rtl: this.locale.direction === 'rtl',\n 'shown': isShown || inline,\n 'hidden': !isShown && !inline,\n 'inline': inline,\n 'double': !singleDatePicker && showCalInRanges,\n 'show-ranges': rangesArray.length\n}\" [class]=\"'drops-' + drops + '-' + opens\">\n <div class=\"ranges\">\n <ul>\n <li *ngFor=\"let range of rangesArray\">\n <button type=\"button\" (click)=\"clickRange($event, range)\" [disabled]=\"disableRange(range)\"\n [ngClass]=\"{'active': range === chosenRange}\">{{range | oTranslate}}</button>\n </li>\n </ul>\n </div>\n <div class=\"calendar\" [ngClass]=\"{right: singleDatePicker, left: !singleDatePicker}\" *ngIf=\"showCalInRanges\">\n <div class=\"calendar-table\">\n <table class=\"table-condensed\" *ngIf=\"calendarVariables\" aria-describedby=\"calendar days table\">\n <thead>\n <tr>\n <th scope=\"col\" *ngIf=\"showWeekNumbers || showISOWeekNumbers\"></th>\n <ng-container\n *ngIf=\"!calendarVariables.left.minDate || calendarVariables.left.minDate.isBefore(calendarVariables.left.calendar.firstDay) && (!this.linkedCalendars || true)\">\n <th (click)=\"clickPrev(sideEnum.left)\" class=\"prev available\">\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"!(!calendarVariables.left.minDate || calendarVariables.left.minDate.isBefore(calendarVariables.left.calendar.firstDay) && (!this.linkedCalendars || true))\">\n <th scope=\"col\"></th>\n </ng-container>\n <th scope=\"col\" colspan=\"5\" class=\"month drp-animate\">\n <ng-container *ngIf=\"showDropdowns && calendarVariables.left.dropdowns\">\n <div class=\"dropdowns\">\n {{this.locale.monthNames[calendarVariables?.left?.calendar[1][1].month()]}}\n <select class=\"monthselect\" (change)=\"monthChanged($event, sideEnum.left)\">\n <option\n [disabled]=\"(calendarVariables.left.dropdowns.inMinYear && m < calendarVariables.left.minDate.month()) || (calendarVariables.left.dropdowns.inMaxYear && m > calendarVariables.left.maxDate.month())\"\n *ngFor=\"let m of calendarVariables.left.dropdowns.monthArrays\" [value]=\"m\"\n [selected]=\"calendarVariables.left.dropdowns.currentMonth == m\">\n {{locale.monthNames[m]}}\n </option>\n </select>\n </div>\n <div class=\"dropdowns\">\n {{ calendarVariables?.left?.calendar[1][1].format(\" YYYY\")}}\n <select class=\"yearselect\" (change)=\"yearChanged($event, sideEnum.left)\">\n <option *ngFor=\"let y of calendarVariables.left.dropdowns.yearArrays\"\n [selected]=\"y === calendarVariables.left.dropdowns.currentYear\">\n {{y}}\n </option>\n </select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!showDropdowns || !calendarVariables.left.dropdowns\">\n {{this.locale.monthNames[calendarVariables?.left?.calendar[1][1].month()]}} {{ calendarVariables?.left?.calendar[1][1].format(\"\n YYYY\")}}\n </ng-container>\n </th>\n <ng-container\n *ngIf=\"(!calendarVariables.left.maxDate || calendarVariables.left.maxDate.isAfter(calendarVariables.left.calendar.lastDay)) && (!linkedCalendars || singleDatePicker )\">\n <th scope=\"col\" class=\"next available\" (click)=\"clickNext(sideEnum.left)\">\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"!((!calendarVariables.left.maxDate || calendarVariables.left.maxDate.isAfter(calendarVariables.left.calendar.lastDay)) && (!linkedCalendars || singleDatePicker ))\">\n <th scope=\"col\"></th>\n </ng-container>\n </tr>\n <tr class='week-days'>\n <th scope=\"col\" *ngIf=\"showWeekNumbers || showISOWeekNumbers\" class=\"week\"><span>{{this.locale.weekLabel}}</span></th>\n <th scope=\"col\" *ngFor=\"let dayofweek of adjustedDaysOfWeek\"><span>{{dayofweek}}</span></th>\n </tr>\n </thead>\n <tbody class=\"drp-animate\">\n <tr *ngFor=\"let row of calendarVariables.left.calRows\" [class]=\"calendarVariables.left.classes[row].classList\">\n <!-- add week number -->\n <td class=\"week\" *ngIf=\"showWeekNumbers\">\n <span>{{calendarVariables.left.calendar[row][0].week()}}</span>\n </td>\n <td class=\"week\" *ngIf=\"showISOWeekNumbers\">\n <span>{{calendarVariables.left.calendar[row][0].isoWeek()}}</span>\n </td>\n <!-- cal -->\n <td *ngFor=\"let col of calendarVariables.left.calCols\" [class]=\"calendarVariables.left.classes[row][col]\"\n (click)=\"clickDate($event, sideEnum.left, row, col)\">\n <span>{{calendarVariables.left.calendar[row][col].date()}}</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n <div class=\"calendar-time\" *ngIf=\"timePicker\">\n <div class=\"select\">\n <select class=\"hourselect select-item\" [disabled]=\"!endDate\" [(ngModel)]=\"timepickerVariables.left.selectedHour\"\n (ngModelChange)=\"timeChanged($event, sideEnum.left)\">\n <option *ngFor=\"let i of timepickerVariables.left.hours\" [value]=\"i\" [disabled]=\"timepickerVariables.left.disabledHours.indexOf(i) > -1\">\n {{i}}</option>\n </select>\n </div>\n <div class=\"select\">\n <select class=\"select-item minuteselect\" [disabled]=\"!endDate\" [(ngModel)]=\"timepickerVariables.left.selectedMinute\"\n (ngModelChange)=\"timeChanged($event, sideEnum.left)\">\n <option *ngFor=\"let i of timepickerVariables.left.minutes; let index = index;\" [value]=\"i\"\n [disabled]=\"timepickerVariables.left.disabledMinutes.indexOf(i) > -1\">{{timepickerVariables.left.minutesLabel[index]}}</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n <div class=\"select\">\n <select class=\"select-item secondselect\" *ngIf=\"timePickerSeconds\" [disabled]=\"!endDate\" [(ngModel)]=\"timepickerVariables.left.selectedSecond\"\n (ngModelChange)=\"timeChanged($event, sideEnum.left)\">\n <option *ngFor=\"let i of timepickerVariables.left.seconds; let index = index;\" [value]=\"i\"\n [disabled]=\"timepickerVariables.left.disabledSeconds.indexOf(i) > -1\">{{timepickerVariables.left.secondsLabel[index]}}</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n <div class=\"select\">\n <select class=\"select-item ampmselect\" *ngIf=\"!timePicker24Hour\" [(ngModel)]=\"timepickerVariables.left.ampmModel\"\n (ngModelChange)=\"timeChanged($event, sideEnum.left)\">\n <option value=\"AM\" [disabled]=\"timepickerVariables.left.amDisabled\">AM</option>\n <option value=\"PM\" [disabled]=\"timepickerVariables.left.pmDisabled\">PM</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n </div>\n </div>\n <div class=\"calendar right\" *ngIf=\"showCalInRanges && !singleDatePicker\">\n <div class=\"calendar-table\">\n <table class=\"table-condensed\" *ngIf=\"calendarVariables\" aria-describedby=\"calendar days table\">\n <thead>\n <tr>\n <th scope=\"col\" *ngIf=\"showWeekNumbers || showISOWeekNumbers\"></th>\n <ng-container\n *ngIf=\"(!calendarVariables.right.minDate || calendarVariables.right.minDate.isBefore(calendarVariables.right.calendar.firstDay)) && (!this.linkedCalendars)\">\n <th (click)=\"clickPrev(sideEnum.right)\" class=\"prev available\">\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"!((!calendarVariables.right.minDate || calendarVariables.right.minDate.isBefore(calendarVariables.right.calendar.firstDay)) && (!this.linkedCalendars))\">\n <th scope=\"col\"></th>\n </ng-container>\n <th scope=\"col\" colspan=\"5\" class=\"month\">\n <ng-container *ngIf=\"showDropdowns && calendarVariables.right.dropdowns\">\n <div class=\"dropdowns\">\n {{this.locale.monthNames[calendarVariables?.right?.calendar[1][1].month()]}}\n <select class=\"monthselect\" (change)=\"monthChanged($event, sideEnum.right)\">\n <option\n [disabled]=\"(calendarVariables.right.dropdowns.inMinYear && m < calendarVariables.right.minDate.month()) || (calendarVariables.right.dropdowns.inMaxYear && m > calendarVariables.right.maxDate.month())\"\n *ngFor=\"let m of calendarVariables.right.dropdowns.monthArrays\" [value]=\"m\"\n [selected]=\"calendarVariables.right.dropdowns.currentMonth == m\">\n {{locale.monthNames[m]}}\n </option>\n </select>\n </div>\n <div class=\"dropdowns\">\n {{ calendarVariables?.right?.calendar[1][1].format(\" YYYY\")}}\n <select class=\"yearselect\" (change)=\"yearChanged($event, sideEnum.right)\">\n <option *ngFor=\"let y of calendarVariables.right.dropdowns.yearArrays\"\n [selected]=\"y === calendarVariables.right.dropdowns.currentYear\">\n {{y}}\n </option>\n </select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!showDropdowns || !calendarVariables.right.dropdowns\">\n {{this.locale.monthNames[calendarVariables?.right?.calendar[1][1].month()]}} {{ calendarVariables?.right?.calendar[1][1].format(\"\n YYYY\")}}\n </ng-container>\n </th>\n <ng-container\n *ngIf=\"!calendarVariables.right.maxDate || calendarVariables.right.maxDate.isAfter(calendarVariables.right.calendar.lastDay) && (!linkedCalendars || singleDatePicker || true)\">\n <th scope=\"col\" class=\"next available\" (click)=\"clickNext(sideEnum.right)\">\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"!(!calendarVariables.right.maxDate || calendarVariables.right.maxDate.isAfter(calendarVariables.right.calendar.lastDay) && (!linkedCalendars || singleDatePicker || true))\">\n <th scope=\"col\"></th>\n </ng-container>\n </tr>\n\n <tr>\n <th scope=\"col\" *ngIf=\"showWeekNumbers || showISOWeekNumbers\" class=\"week\"><span>{{this.locale.weekLabel}}</span></th>\n <th scope=\"col\" *ngFor=\"let dayofweek of locale.daysOfWeek\"><span>{{dayofweek}}</span></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of calendarVariables.right.calRows\" [class]=\"calendarVariables.right.classes[row].classList\">\n <td class=\"week\" *ngIf=\"showWeekNumbers\">\n <span>{{calendarVariables.right.calendar[row][0].week()}}</span>\n </td>\n <td class=\"week\" *ngIf=\"showISOWeekNumbers\">\n <span>{{calendarVariables.right.calendar[row][0].isoWeek()}}</span>\n </td>\n <td *ngFor=\"let col of calendarVariables.right.calCols\" [class]=\"calendarVariables.right.classes[row][col]\"\n (click)=\"clickDate($event, sideEnum.right, row, col)\">\n <span>{{calendarVariables.right.calendar[row][col].date()}}</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n <div class=\"calendar-time\" *ngIf=\"timePicker\">\n <div class=\"select\">\n <select class=\"select-item hourselect\" [disabled]=\"!endDate\" [(ngModel)]=\"timepickerVariables.right.selectedHour\"\n (ngModelChange)=\"timeChanged($event, sideEnum.right)\">\n <option *ngFor=\"let i of timepickerVariables.right.hours\" [value]=\"i\" [disabled]=\"timepickerVariables.right.disabledHours.indexOf(i) > -1\">\n {{i}}</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n <div class=\"select\">\n <select class=\"select-item minuteselect\" [disabled]=\"!endDate\" [(ngModel)]=\"timepickerVariables.right.selectedMinute\"\n (ngModelChange)=\"timeChanged($event, sideEnum.right)\">\n <option *ngFor=\"let i of timepickerVariables.right.minutes; let index = index;\" [value]=\"i\"\n [disabled]=\"timepickerVariables.right.disabledMinutes.indexOf(i) > -1\">{{timepickerVariables.right.minutesLabel[index]}}</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n <div class=\"select\">\n <select *ngIf=\"timePickerSeconds\" class=\"select-item secondselect\" [disabled]=\"!endDate\"\n [(ngModel)]=\"timepickerVariables.right.selectedSecond\" (ngModelChange)=\"timeChanged($event, sideEnum.right)\">\n <option *ngFor=\"let i of timepickerVariables.right.seconds; let index = index;\" [value]=\"i\"\n [disabled]=\"timepickerVariables.right.disabledSeconds.indexOf(i) > -1\">{{timepickerVariables.right.secondsLabel[index]}}</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n <div class=\"select\">\n <select *ngIf=\"!timePicker24Hour\" class=\"select-item ampmselect\" [(ngModel)]=\"timepickerVariables.right.ampmModel\"\n (ngModelChange)=\"timeChanged($event, sideEnum.right)\">\n <option value=\"AM\" [disabled]=\"timepickerVariables.right.amDisabled\">AM</option>\n <option value=\"PM\" [disabled]=\"timepickerVariables.right.pmDisabled\">PM</option>\n </select>\n <span class=\"select-highlight\"></span>\n <span class=\"select-bar\"></span>\n </div>\n </div>\n </div>\n <div class=\"buttons\" *ngIf=\"!autoApply && ( !rangesArray.length || (showCalInRanges && !singleDatePicker))\">\n <div class=\"buttons_input\">\n <button *ngIf=\"showClearButton\" class=\"mat-primary mat-stroked-button clear\" type=\"button\" (click)=\"clear()\" title=\"clear the date\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\" viewBox=\"0 -5 24 24\">\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\n </svg>\n </button>\n <button class=\"mat-primary mat-stroked-button\" *ngIf=\"showCancel\" type=\"button\" (click)=\"clickCancel($event)\">{{locale.cancelLabel}}</button>\n <button class=\"mat-primary mat-stroked-button\" [disabled]=\"applyBtn.disabled\" type=\"button\"\n (click)=\"clickApply($event)\">{{locale.applyLabel}}</button>\n </div>\n </div>\n</div>\n", styles: [".md-drppicker{position:absolute;border-radius:4px;width:278px;padding:4px;margin-top:-10px;overflow:hidden;z-index:1000;font-size:13px;box-shadow:0 2px 4px #00000029,0 2px 8px #0000001f}.md-drppicker.double{width:auto}.md-drppicker.inline{position:relative;display:inline-block}.md-drppicker:after,.md-drppicker:before{position:absolute;display:inline-block;content:\"\"}.md-drppicker.openscenter:before{left:0;right:0;width:0;margin-left:auto;margin-right:auto}.md-drppicker.openscenter:after{left:0;right:0;width:0;margin-left:auto;margin-right:auto}.md-drppicker.single .calendar,.md-drppicker.single .ranges{float:none}.md-drppicker.shown{transform:scale(1);transition:all .1s ease-in-out;transform-origin:0 0;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.md-drppicker.shown.drops-up-left{transform-origin:100% 100%}.md-drppicker.shown.drops-up-right{transform-origin:0 100%}.md-drppicker.shown.drops-down-left{transform-origin:100% 0}.md-drppicker.shown.drops-down-right{transform-origin:0 0}.md-drppicker.shown.drops-down-center{transform-origin:50% 0}.md-drppicker.shown.drops-up-center{transform-origin:50% 100%}.md-drppicker.shown .calendar{display:block}.md-drppicker.hidden{transition:all .1s ease;transform:scale(0);transform-origin:0 0;cursor:default;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.md-drppicker.hidden.drops-up-left{transform-origin:100% 100%}.md-drppicker.hidden.drops-up-right{transform-origin:0 100%}.md-drppicker.hidden.drops-down-left{transform-origin:100% 0}.md-drppicker.hidden.drops-down-right{transform-origin:0 0}.md-drppicker.hidden.drops-down-center{transform-origin:50% 0}.md-drppicker.hidden.drops-up-center{transform-origin:50% 100%}.md-drppicker.hidden .calendar{display:none}.md-drppicker .calendar{max-width:270px;margin:4px}.md-drppicker .calendar.single .calendar-table{border:none}.md-drppicker .calendar td,.md-drppicker .calendar th{padding:0;white-space:nowrap;text-align:center;height:36px;width:36px}.md-drppicker .calendar td span,.md-drppicker .calendar th span{pointer-events:none}.md-drppicker .calendar-table{border-style:1px solid;padding:4px;border-radius:4px}.md-drppicker table{width:100%;margin:0}.md-drppicker td,.md-drppicker th{text-align:center;width:20px;height:20px;border-radius:4px;border-style:1px solid;white-space:nowrap;cursor:pointer}.md-drppicker td.available.prev,.md-drppicker th.available.prev{display:block;background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K);background-repeat:no-repeat;background-size:.5em;background-position:center;opacity:.8;transition:background-color .2s ease;border-radius:2em}.md-drppicker td.available.prev:hover,.md-drppicker th.available.prev:hover{margin:0}.md-drppicker td.available.next,.md-drppicker th.available.next{transform:rotate(180deg);display:block;background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K);background-repeat:no-repeat;background-size:.5em;background-position:center;opacity:.8;transition:background-color .2s ease;border-radius:2em}.md-drppicker td.available.next:hover,.md-drppicker th.available.next:hover{margin:0;transform:rotate(180deg)}.md-drppicker td.available:hover,.md-drppicker th.available:hover{background-repeat:no-repeat;background-size:.5em;background-position:center;margin:.25em 0;opacity:.8;border-radius:2em;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0}.md-drppicker td.week,.md-drppicker th.week{font-size:80%}.md-drppicker td{margin:.25em 0;opacity:.8;border-radius:2em;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0}.md-drppicker td.in-range{border-radius:0}.md-drppicker td.start-date{border-radius:2em 0 0 2em}.md-drppicker td.end-date{border-radius:0 2em 2em 0}.md-drppicker td.start-date.end-date{border-radius:4px}.md-drppicker th.month{width:auto}.md-drppicker option.disabled,.md-drppicker td.disabled{cursor:not-allowed;text-decoration:line-through}.md-drppicker .dropdowns{background-repeat:no-repeat;background-size:10px;background-position-y:center;background-position-x:right;width:50px;background-image:url(data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDI1NSAyNTUiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI1NSAyNTU7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj4KCQk8cG9seWdvbiBwb2ludHM9IjAsNjMuNzUgMTI3LjUsMTkxLjI1IDI1NSw2My43NSAgICIgZmlsbD0iIzk4OGM4YyIvPgoJPC9nPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo=)}.md-drppicker .dropdowns select{display:inline-block;width:100%;padding:5px;border:1px solid;border-radius:2px;height:3rem}.md-drppicker .dropdowns select.monthselect,.md-drppicker .dropdowns select.yearselect{font-size:12px;padding:1px;height:auto;margin:0;cursor:default}.md-drppicker .dropdowns select.ampmselect,.md-drppicker .dropdowns select.hourselect,.md-drppicker .dropdowns select.minuteselect,.md-drppicker .dropdowns select.secondselect{width:50px;margin:0 auto;border-style:1px solid;padding:2px;outline:0;font-size:12px}.md-drppicker .dropdowns select.monthselect,.md-drppicker .dropdowns select.yearselect{cursor:pointer;opacity:0;position:absolute;top:0;left:0;margin:0;padding:0}.md-drppicker th.month>div{position:relative;display:inline-block}.md-drppicker .calendar-time{text-align:center;margin:4px auto 0;line-height:30px;position:relative}.md-drppicker .calendar-time .select{display:inline}.md-drppicker .calendar-time .select .select-item{display:inline-block;width:auto;position:relative;font-family:inherit;background-color:transparent;padding:10px 10px 10px 0;font-size:18px;border-radius:0;border:none;border-bottom-style:1px solid}.md-drppicker .calendar-time .select .select-item:after{position:absolute;top:18px;right:10px;width:0;height:0;padding:0;content:\"\";border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid rgba(0,0,0,.12);pointer-events:none}.md-drppicker .calendar-time .select .select-item:focus{outline:none}.md-drppicker .calendar-time .select .select-item .select-label{font-size:16px;font-weight:400;position:absolute;pointer-events:none;left:0;top:10px;transition:.2s ease all}.md-drppicker .calendar-time select.disabled{cursor:not-allowed}.md-drppicker .label-input{border-style:1px solid;border-radius:4px;height:30px;line-height:30px;display:block;vertical-align:middle;margin:0 auto 5px;padding:0 0 0 28px;width:100%}.md-drppicker .label-input.active{border-style:1px solid;border-radius:4px}.md-drppicker .md-drppicker_input{position:relative;padding:0 30px 0 0}.md-drppicker .md-drppicker_input i,.md-drppicker .md-drppicker_input svg{position:absolute;left:8px;top:8px}.md-drppicker.rtl .label-input{padding-right:28px;padding-left:6px}.md-drppicker.rtl .md-drppicker_input i,.md-drppicker.rtl .md-drppicker_input svg{left:auto;right:8px}.md-drppicker .show-ranges .drp-calendar.left{border-left-style:1px solid}.md-drppicker .ranges{float:none;text-align:left;margin:0}.md-drppicker .ranges ul{list-style:none;margin:0 auto;padding:0;width:100%}.md-drppicker .ranges ul li{font-size:12px}.md-drppicker .ranges ul li button{padding:8px 12px;width:100%;background:none;border:none;text-align:left;cursor:pointer}.md-drppicker .ranges ul li button[disabled]{opacity:.3}.md-drppicker .ranges ul li button:active{background:transparent}.md-drppicker .show-calendar .ranges{margin-top:8px}.md-drppicker [hidden]{display:none}.md-drppicker .buttons{text-align:right;margin:0 5px 5px 0}.md-drppicker .btn{position:relative;overflow:hidden;border-width:0;outline:none;padding:0 6px;cursor:pointer;border-radius:2px;box-shadow:0 1px 4px #0009;color:#ecf0f1;transition:background-color .4s;height:auto;text-transform:uppercase;line-height:36px;border:none}.md-drppicker .btn>*{position:relative}.md-drppicker .btn span{display:block;padding:12px 24px}.md-drppicker .btn:before{content:\"\";position:absolute;top:50%;left:50%;display:block;width:0;padding-top:0;border-radius:100%;transform:translate(-50%,-50%)}.md-drppicker .btn:active:before{width:120%;padding-top:120%;transition:width .2s ease-out,padding-top .2s ease-out}.md-drppicker .btn:disabled{opacity:.5}.md-drppicker .clear{box-shadow:none}.md-drppicker .clear svg{fill:currentColor}@media (min-width: 564px){.md-drppicker{width:auto}.md-drppicker.single .calendar.left{clear:none}.md-drppicker.ltr{direction:ltr;text-align:left}.md-drppicker.ltr .calendar.left{clear:left}.md-drppicker.ltr .calendar.left .calendar-table{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.md-drppicker.ltr .calendar.right{margin-left:0}.md-drppicker.ltr .calendar.right .calendar-table{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.md-drppicker.ltr .left .md-drppicker_input,.md-drppicker.ltr .right .md-drppicker_input{padding-right:35px}.md-drppicker.ltr .calendar.left .calendar-table{padding-right:12px}.md-drppicker.ltr .calendar,.md-drppicker.ltr .ranges{float:left}.md-drppicker.rtl{direction:rtl;text-align:right}.md-drppicker.rtl .calendar.left{clear:right;margin-left:0}.md-drppicker.rtl .calendar.left .calendar-table{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.md-drppicker.rtl .calendar.right{margin-right:0}.md-drppicker.rtl .calendar.right .calendar-table{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.md-drppicker.rtl .left .md-drppicker_input,.md-drppicker.rtl .calendar.left .calendar-table{padding-left:12px}.md-drppicker.rtl .calendar,.md-drppicker.rtl .ranges{text-align:right;float:right}.drp-animate{transform:translate(0);transition:transform .2s ease,opacity .2s ease}.drp-animate.drp-picker-site-this{transition-timing-function:linear}.drp-animate.drp-animate-right{transform:translate(10%);opacity:0}.drp-animate.drp-animate-left{transform:translate(-10%);opacity:0}}@media (min-width: 730px){.md-drppicker .ranges{width:auto}.md-drppicker.ltr .ranges{float:left}.md-drppicker.rtl .ranges{float:right}.md-drppicker .calendar.left{clear:none!important}}\n"] }]
|
|
937
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { dateLimit: [{
|
|
938
|
-
type: Input
|
|
939
|
-
}], minDate: [{
|
|
940
|
-
type: Input
|
|
941
|
-
}], maxDate: [{
|
|
942
|
-
type: Input
|
|
943
|
-
}], autoApply: [{
|
|
944
|
-
type: Input
|
|
945
|
-
}], singleDatePicker: [{
|
|
946
|
-
type: Input
|
|
947
|
-
}], showDropdowns: [{
|
|
948
|
-
type: Input
|
|
949
|
-
}], showWeekNumbers: [], showISOWeekNumbers: [{
|
|
950
|
-
type: Input
|
|
951
|
-
}], linkedCalendars: [{
|
|
952
|
-
type: Input
|
|
953
|
-
}], autoUpdateInput: [{
|
|
954
|
-
type: Input
|
|
955
|
-
}], alwaysShowCalendars: [{
|
|
956
|
-
type: Input
|
|
957
|
-
}], maxSpan: [{
|
|
958
|
-
type: Input
|
|
959
|
-
}], timePicker: [{
|
|
960
|
-
type: Input
|
|
961
|
-
}], timePicker24Hour: [{
|
|
962
|
-
type: Input
|
|
963
|
-
}], timePickerIncrement: [{
|
|
964
|
-
type: Input
|
|
965
|
-
}], timePickerSeconds: [{
|
|
966
|
-
type: Input
|
|
967
|
-
}], showClearButton: [{
|
|
968
|
-
type: Input
|
|
969
|
-
}], firstMonthDayClass: [{
|
|
970
|
-
type: Input
|
|
971
|
-
}], lastMonthDayClass: [{
|
|
972
|
-
type: Input
|
|
973
|
-
}], emptyWeekRowClass: [{
|
|
974
|
-
type: Input
|
|
975
|
-
}], firstDayOfNextMonthClass: [{
|
|
976
|
-
type: Input
|
|
977
|
-
}], lastDayOfPreviousMonthClass: [{
|
|
978
|
-
type: Input
|
|
979
|
-
}], locale: [{
|
|
980
|
-
type: Input
|
|
981
|
-
}], ranges: [{
|
|
982
|
-
type: Input
|
|
983
|
-
}], showCustomRangeLabel: [{
|
|
984
|
-
type: Input
|
|
985
|
-
}], showCancel: [{
|
|
986
|
-
type: Input
|
|
987
|
-
}], keepCalendarOpeningWithRange: [{
|
|
988
|
-
type: Input
|
|
989
|
-
}], showRangeLabelOnInput: [{
|
|
990
|
-
type: Input
|
|
991
|
-
}], drops: [{
|
|
992
|
-
type: Input
|
|
993
|
-
}], opens: [{
|
|
994
|
-
type: Input
|
|
995
|
-
}], choosedDate: [{
|
|
996
|
-
type: Output
|
|
997
|
-
}], rangeClicked: [{
|
|
998
|
-
type: Output
|
|
999
|
-
}], datesUpdated: [{
|
|
1000
|
-
type: Output
|
|
1001
|
-
}], pickerContainer: [{
|
|
1002
|
-
type: ViewChild,
|
|
1003
|
-
args: ['pickerContainer']
|
|
1004
|
-
}], isInvalidDate: [{
|
|
1005
|
-
type: Input
|
|
1006
|
-
}], isCustomDate: [{
|
|
1007
|
-
type: Input
|
|
1008
|
-
}] } });
|
|
1009
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1kYXRlcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0L2RhdGUtcmFuZ2Uvby1kYXRlcmFuZ2UtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0L2RhdGUtcmFuZ2Uvby1kYXRlcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hKLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7O0FBRzVFLE1BQU0sQ0FBTixJQUFZLFFBR1g7QUFIRCxXQUFZLFFBQVE7SUFDbEIseUJBQWEsQ0FBQTtJQUNiLDJCQUFlLENBQUE7QUFDakIsQ0FBQyxFQUhXLFFBQVEsS0FBUixRQUFRLFFBR25CO0FBZ0JELE1BQU0sT0FBTyx3QkFBd0I7SUFnRW5DLElBQWEsTUFBTSxDQUFDLEtBQUs7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQThCRCxZ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bmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IEJvb2xlYW5JbnB1dENvbnZlcnRlciB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMvaW5wdXQtY29udmVydGVyJztcblxuXG5leHBvcnQgZW51bSBTaWRlRW51bSB7XG4gIGxlZnQgPSAnbGVmdCcsXG4gIHJpZ2h0ID0gJ3JpZ2h0J1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvLWRhdGVyYW5nZS1waWNrZXInLFxuICBzdHlsZVVybHM6IFsnLi9vLWRhdGVyYW5nZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL28tZGF0ZXJhbmdlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHtcbiAgICAnKGNsaWNrKSc6ICdoYW5kbGVJbnRlcm5hbENsaWNrKCRldmVudCknLFxuICB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZXJhbmdlcGlja2VyQ29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxuICB9XVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlcmFuZ2VwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIF9vbGQ6IHsgc3RhcnQ6IGFueSwgZW5kOiBhbnkgfSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuICBjaG9zZW5MYWJlbDogc3RyaW5nO1xuICBjYWxlbmRhclZhcmlhYmxlczogeyBsZWZ0OiBhbnksIHJpZ2h0OiBhbnkgfSA9IHsgbGVmdDoge30sIHJpZ2h0OiB7fSB9O1xuICB0aW1lcGlja2VyVmFyaWFibGVzOiB7IGxlZnQ6IGFueSwgcmlnaHQ6IGFueSB9ID0geyBsZWZ0OiB7fSwgcmlnaHQ6IHt9IH07XG4gIGRhdGVyYW5nZXBpY2tlcjogeyBzdGFydDogVW50eXBlZEZvcm1Db250cm9sLCBlbmQ6IFVudHlwZWRGb3JtQ29udHJvbCB9ID0geyBzdGFydDogbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpLCBlbmQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSB9O1xuICBhcHBseUJ0bjogeyBkaXNhYmxlZDogYm9vbGVhbiB9ID0geyBkaXNhYmxlZDogZmFsc2UgfTtcbiAgc3RhcnREYXRlID0gbW9tZW50KCkuc3RhcnRPZignZGF5Jyk7XG4gIGVuZERhdGUgPSBtb21lbnQoKS5lbmRPZignZGF5Jyk7XG4gIEBJbnB1dCgpXG4gIGRhdGVMaW1pdDogbnVtYmVyID0gbnVsbDtcbiAgLy8gdXNlZCBpbiB0ZW1wbGF0ZSBmb3IgY29tcGlsZSB0aW1lIHN1cHBvcnQgb2YgZW51bSB2YWx1ZXMuXG4gIHNpZGVFbnVtID0gU2lkZUVudW07XG5cbiAgQElucHV0KClcbiAgbWluRGF0ZTogbW9tZW50Lk1vbWVudCA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIG1heERhdGU6IG1vbWVudC5Nb21lbnQgPSBudWxsO1xuICBASW5wdXQoKVxuICBhdXRvQXBwbHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgc2luZ2xlRGF0ZVBpY2tlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBzaG93RHJvcGRvd25zOiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93V2Vla051bWJlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgc2hvd0lTT1dlZWtOdW1iZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGxpbmtlZENhbGVuZGFyczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBhdXRvVXBkYXRlSW5wdXQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBhbHdheXNTaG93Q2FsZW5kYXJzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIG1heFNwYW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gdGltZXBpY2tlciB2YXJpYWJsZXNcbiAgQElucHV0KClcbiAgdGltZVBpY2tlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICB0aW1lUGlja2VyMjRIb3VyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHRpbWVQaWNrZXJJbmNyZW1lbnQ6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpXG4gIHRpbWVQaWNrZXJTZWNvbmRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIGVuZCBvZiB0aW1lcGlja2VyIHZhcmlhYmxlc1xuICBASW5wdXQoKVxuICBzaG93Q2xlYXJCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZmlyc3RNb250aERheUNsYXNzOiBzdHJpbmcgPSBudWxsO1xuICBASW5wdXQoKVxuICBsYXN0TW9udGhEYXlDbGFzczogc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KClcbiAgZW1wdHlXZWVrUm93Q2xhc3M6IHN0cmluZyA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIGZpcnN0RGF5T2ZOZXh0TW9udGhDbGFzczogc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KClcbiAgbGFzdERheU9mUHJldmlvdXNNb250aENsYXNzOiBzdHJpbmcgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIGxvY2FsZTogYW55O1xuICAvLyBjdXN0b20gcmFuZ2VzXG4gIF9yYW5nZXM6IGFueSA9IHt9O1xuXG4gIEBJbnB1dCgpIHNldCByYW5nZXModmFsdWUpIHtcbiAgICB0aGlzLl9yYW5nZXMgPSB2YWx1ZTtcbiAgICB0aGlzLnJlbmRlclJhbmdlcygpO1xuICB9XG4gIGdldCByYW5nZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fcmFuZ2VzO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2hvd0N1c3RvbVJhbmdlTGFiZWw6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHNob3dDYW5jZWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAga2VlcENhbGVuZGFyT3BlbmluZ1dpdGhSYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBzaG93UmFuZ2VMYWJlbE9uSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2hvc2VuUmFuZ2U6IHN0cmluZztcbiAgcmFuZ2VzQXJyYXk6IEFycmF5PGFueT4gPSBbXTtcblxuICAvLyBzb21lIHN0YXRlIGluZm9ybWF0aW9uXG4gIHBpY2tpbmdEYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIGlzU2hvd246IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW5saW5lOiBib29sZWFuID0gdHJ1ZTtcbiAgbGVmdENhbGVuZGFyOiBhbnkgPSB7fTtcbiAgcmlnaHRDYWxlbmRhcjogYW55ID0ge307XG4gIHNob3dDYWxJblJhbmdlczogYm9vbGVhbiA9IGZhbHNlO1xuICBhZGp1c3RlZERheXNPZldlZWsgPSBbXTtcblxuICBvcHRpb25zOiBhbnkgPSB7fTsgLy8gc2hvdWxkIGdldCBzb21lIG9wdCBmcm9tIHVzZXJcbiAgQElucHV0KCkgZHJvcHM6IHN0cmluZztcbiAgQElucHV0KCkgb3BlbnM6IHN0cmluZztcbiAgQE91dHB1dCgpIGNob29zZWREYXRlOiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcbiAgQE91dHB1dCgpIHJhbmdlQ2xpY2tlZDogRXZlbnRFbWl0dGVyPG9iamVjdD47XG4gIEBPdXRwdXQoKSBkYXRlc1VwZGF0ZWQ6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xuICBAVmlld0NoaWxkKCdwaWNrZXJDb250YWluZXInKSBwaWNrZXJDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLmNob29zZWREYXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMucmFuZ2VDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZGF0ZXNVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fYnVpbGRMb2NhbGUoKTtcbiAgICBjb25zdCBkYXlzT2ZXZWVrID0gWy4uLnRoaXMubG9jYWxlLmRheXNPZldlZWtdO1xuICAgICB0aGlzLmFkanVzdGVkRGF5c09mV2VlayA9IFsuLi5kYXlzT2ZXZWVrXTtcblxuICAgIC8vIENoZWNrIGlmIHJvdGF0aW9uIGlzIG5lZWRlZFxuICAgIGlmICh0aGlzLmxvY2FsZS5maXJzdERheSAhPT0gMCkge1xuICAgICAgbGV0IGl0ZXJhdG9yID0gdGhpcy5sb2NhbGUuZmlyc3REYXk7XG4gICAgICB3aGlsZSAoaXRlcmF0b3IgPiAwKSB7XG4gICAgICAgIHRoaXMuYWRqdXN0ZWREYXlzT2ZXZWVrLnB1c2godGhpcy5hZGp1c3RlZERheXNPZldlZWsuc2hpZnQoKSk7IC8vIFJvdGF0ZSB0aGUgZGF5c1xuICAgICAgICBpdGVyYXRvci0tO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5pbmxpbmUpIHtcbiAgICAgIHRoaXMuX29sZC5zdGFydCA9IHRoaXMuc3RhcnREYXRlLmNsb25lKCk7XG4gICAgICB0aGlzLl9vbGQuZW5kID0gdGhpcy5lbmREYXRlLmNsb25lKCk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLmxlZnQpO1xuICAgIGlmICghdGhpcy5zaW5nbGVEYXRlUGlja2VyKSB7XG4gICAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJSYW5nZXMoKTtcbiAgfVxuXG4gIHJlbmRlclJhbmdlcygpIHtcbiAgICB0aGlzLnJhbmdlc0FycmF5ID0gW107XG4gICAgbGV0IHN0YXJ0O1xuICAgIGxldCBlbmQ7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnJhbmdlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAoY29uc3QgcmFuZ2UgaW4gdGhpcy5yYW5nZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJhbmdlc1tyYW5nZV1bMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgc3RhcnQgPSBtb21lbnQodGhpcy5yYW5nZXNbcmFuZ2VdWzBdLCB0aGlzLmxvY2FsZS5mb3JtYXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXJ0ID0gbW9tZW50KHRoaXMucmFuZ2VzW3JhbmdlXVswXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucmFuZ2VzW3JhbmdlXVsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBlbmQgPSBtb21lbnQodGhpcy5yYW5nZXNbcmFuZ2VdWzFdLCB0aGlzLmxvY2FsZS5mb3JtYXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVuZCA9IG1vbWVudCh0aGlzLnJhbmdlc1tyYW5nZV1bMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHN0YXJ0IG9yIGVuZCBkYXRlIGV4Y2VlZCB0aG9zZSBhbGxvd2VkIGJ5IHRoZSBtaW5EYXRlIG9yIG1heFNwYW5cbiAgICAgICAgLy8gb3B0aW9ucywgc2hvcnRlbiB0aGUgcmFuZ2UgdG8gdGhlIGFsbG93YWJsZSBwZXJpb2QuXG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgc3RhcnQuaXNCZWZvcmUodGhpcy5taW5EYXRlKSkge1xuICAgICAgICAgIHN0YXJ0ID0gdGhpcy5taW5EYXRlLmNsb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZTtcbiAgICAgICAgaWYgKHRoaXMubWF4U3BhbiAmJiBtYXhEYXRlICYmIHN0YXJ0LmNsb25lKCkuYWRkKHRoaXMubWF4U3BhbikuaXNBZnRlcihtYXhEYXRlKSkge1xuICAgICAgICAgIG1heERhdGUgPSBzdGFydC5jbG9uZSgpLmFkZCh0aGlzLm1heFNwYW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhEYXRlICYmIGVuZC5pc0FmdGVyKG1heERhdGUpKSB7XG4gICAgICAgICAgZW5kID0gbWF4RGF0ZS5jbG9uZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIGVuZCBvZiB0aGUgcmFuZ2UgaXMgYmVmb3JlIHRoZSBtaW5pbXVtIG9yIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgaXNcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIG1heGltdW0sIGRvbid0IGRpc3BsYXkgdGhpcyByYW5nZSBvcHRpb24gYXQgYWxsLlxuICAgICAgICBpZiAoKHRoaXMubWluRGF0ZSAmJiBlbmQuaXNCZWZvcmUodGhpcy5taW5EYXRlLCB0aGlzLnRpbWVQaWNrZXIgPyAnbWludXRlJyA6ICdkYXknKSlcbiAgICAgICAgICB8fCAobWF4RGF0ZSAmJiBzdGFydC5pc0FmdGVyKG1heERhdGUsIHRoaXMudGltZVBpY2tlciA/ICdtaW51dGUnIDogJ2RheScpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9TdXBwb3J0IHVuaWNvZGUgY2hhcnMgaW4gdGhlIHJhbmdlIG5hbWVzLlxuICAgICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgICAgIGVsZW0uaW5uZXJIVE1MID0gcmFuZ2U7XG4gICAgICAgIGxldCByYW5nZUh0bWwgPSBlbGVtLnZhbHVlO1xuXG4gICAgICAgIHRoaXMucmFuZ2VzW3JhbmdlSHRtbF0gPSBbc3RhcnQsIGVuZF07XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHJhbmdlIGluIHRoaXMucmFuZ2VzKSB7XG4gICAgICAgIHRoaXMucmFuZ2VzQXJyYXkucHVzaChyYW5nZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zaG93Q3VzdG9tUmFuZ2VMYWJlbCkge1xuICAgICAgICB0aGlzLnJhbmdlc0FycmF5LnB1c2godGhpcy5sb2NhbGUuY3VzdG9tUmFuZ2VMYWJlbCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNob3dDYWxJblJhbmdlcyA9ICghdGhpcy5yYW5nZXNBcnJheS5sZW5ndGgpIHx8IHRoaXMuYWx3YXlzU2hvd0NhbGVuZGFycztcbiAgICAgIGlmICghdGhpcy50aW1lUGlja2VyKSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGUuc3RhcnRPZignZGF5Jyk7XG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IHRoaXMuZW5kRGF0ZS5lbmRPZignZGF5Jyk7XG4gICAgICB9XG4gICAgICAvLyBjYW4ndCBiZSB1c2VkIHRvZ2V0aGVyIGZvciBub3dcbiAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIgJiYgdGhpcy5hdXRvQXBwbHkpIHtcbiAgICAgICAgdGhpcy5hdXRvQXBwbHkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXJUaW1lUGlja2VyKHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLnJpZ2h0ICYmICF0aGlzLmVuZERhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNlbGVjdGVkO1xuICAgIGxldCBtaW5EYXRlO1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGU7XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQpIHtcbiAgICAgIHNlbGVjdGVkID0gdGhpcy5zdGFydERhdGUuY2xvbmUoKTtcbiAgICAgIG1pbkRhdGUgPSB0aGlzLm1pbkRhdGU7XG4gICAgfSBlbHNlIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCkge1xuICAgICAgc2VsZWN0ZWQgPSB0aGlzLmVuZERhdGUuY2xvbmUoKTtcbiAgICAgIG1pbkRhdGUgPSB0aGlzLnN0YXJ0RGF0ZTtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnRpbWVQaWNrZXIyNEhvdXIgPyAwIDogMTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLnRpbWVQaWNrZXIyNEhvdXIgPyAyMyA6IDEyO1xuICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlc1tzaWRlXSA9IHtcbiAgICAgIGhvdXJzOiBbXSxcbiAgICAgIG1pbnV0ZXM6IFtdLFxuICAgICAgbWludXRlc0xhYmVsOiBbXSxcbiAgICAgIHNlY29uZHM6IFtdLFxuICAgICAgc2Vjb25kc0xhYmVsOiBbXSxcbiAgICAgIGRpc2FibGVkSG91cnM6IFtdLFxuICAgICAgZGlzYWJsZWRNaW51dGVzOiBbXSxcbiAgICAgIGRpc2FibGVkU2Vjb25kczogW10sXG4gICAgICBzZWxlY3RlZEhvdXI6IDAsXG4gICAgICBzZWxlY3RlZE1pbnV0ZTogMCxcbiAgICAgIHNlbGVjdGVkU2Vjb25kOiAwLFxuICAgIH07XG4gICAgLy8gZ2VuZXJhdGUgaG91cnNcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgIGxldCBpX2luXzI0ID0gaTtcbiAgICAgIGlmICghdGhpcy50aW1lUGlja2VyMjRIb3VyKSB7XG4gICAgICAgIGlfaW5fMjQgPSBzZWxlY3RlZC5ob3VyKCkgPj0gMTIgPyAoaSA9PT0gMTIgPyAxMiA6IGkgKyAxMikgOiAoaSA9PT0gMTIgPyAwIDogaSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRpbWUgPSBzZWxlY3RlZC5jbG9uZSgpLmhvdXIoaV9pbl8yNCk7XG4gICAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGlmIChtaW5EYXRlICYmIHRpbWUubWludXRlKDU5KS5pc0JlZm9yZShtaW5EYXRlKSkge1xuICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZSAmJiB0aW1lLm1pbnV0ZSgwKS5pc0FmdGVyKG1heERhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzW3NpZGVdLmhvdXJzLnB1c2goaSk7XG4gICAgICBpZiAoaV9pbl8yNCA9PT0gc2VsZWN0ZWQuaG91cigpICYmICFkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXNbc2lkZV0uc2VsZWN0ZWRIb3VyID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzW3NpZGVdLmRpc2FibGVkSG91cnMucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZ2VuZXJhdGUgbWludXRlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjA7IGkgKz0gdGhpcy50aW1lUGlja2VySW5jcmVtZW50KSB7XG4gICAgICBjb25zdCBwYWRkZWQgPSBpIDwgMTAgPyAnMCcgKyBpIDogaTtcbiAgICAgIGNvbnN0IHRpbWUgPSBzZWxlY3RlZC5jbG9uZSgpLm1pbnV0ZShpKTtcblxuICAgICAgbGV0IGRpc2FibGVkID0gZmFsc2U7XG4gICAgICBpZiAobWluRGF0ZSAmJiB0aW1lLnNlY29uZCg1OSkuaXNCZWZvcmUobWluRGF0ZSkpIHtcbiAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG1heERhdGUgJiYgdGltZS5zZWNvbmQoMCkuaXNBZnRlcihtYXhEYXRlKSkge1xuICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXNbc2lkZV0ubWludXRlcy5wdXNoKGkpO1xuICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzW3NpZGVdLm1pbnV0ZXNMYWJlbC5wdXNoKHBhZGRlZCk7XG4gICAgICBpZiAoc2VsZWN0ZWQubWludXRlKCkgPT09IGkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlc1tzaWRlXS5zZWxlY3RlZE1pbnV0ZSA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlc1tzaWRlXS5kaXNhYmxlZE1pbnV0ZXMucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZ2VuZXJhdGUgc2Vjb25kc1xuICAgIGlmICh0aGlzLnRpbWVQaWNrZXJTZWNvbmRzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDYwOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFkZGVkID0gaSA8IDEwID8gJzAnICsgaSA6IGk7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBzZWxlY3RlZC5jbG9uZSgpLnNlY29uZChpKTtcblxuICAgICAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKG1pbkRhdGUgJiYgdGltZS5pc0JlZm9yZShtaW5EYXRlKSkge1xuICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4RGF0ZSAmJiB0aW1lLmlzQWZ0ZXIobWF4RGF0ZSkpIHtcbiAgICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXNbc2lkZV0uc2Vjb25kcy5wdXNoKGkpO1xuICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXNbc2lkZV0uc2Vjb25kc0xhYmVsLnB1c2gocGFkZGVkKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkLnNlY29uZCgpID09PSBpICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlc1tzaWRlXS5zZWxlY3RlZFNlY29uZCA9IGk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXNbc2lkZV0uZGlzYWJsZWRTZWNvbmRzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZ2VuZXJhdGUgQU0vUE1cbiAgICBpZiAoIXRoaXMudGltZVBpY2tlcjI0SG91cikge1xuXG4gICAgICBpZiAobWluRGF0ZSAmJiBzZWxlY3RlZC5jbG9uZSgpLmhvdXIoMTIpLm1pbnV0ZSgwKS5zZWNvbmQoMCkuaXNCZWZvcmUobWluRGF0ZSkpIHtcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzW3NpZGVdLmFtRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4RGF0ZSAmJiBzZWxlY3RlZC5jbG9uZSgpLmhvdXIoMCkubWludXRlKDApLnNlY29uZCgwKS5pc0FmdGVyKG1heERhdGUpKSB7XG4gICAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlc1tzaWRlXS5wbURpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3RlZC5ob3VyKCkgPj0gMTIpIHtcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzW3NpZGVdLmFtcG1Nb2RlbCA9ICdQTSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXNbc2lkZV0uYW1wbU1vZGVsID0gJ0FNJztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzW3NpZGVdLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gIH1cblxuICByZW5kZXJDYWxlbmRhcihzaWRlOiBTaWRlRW51bSkgeyAvLyBzaWRlIGVudW1cbiAgICBjb25zdCBtYWluQ2FsZW5kYXI6IGFueSA9IChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSA/IHRoaXMubGVmdENhbGVuZGFyIDogdGhpcy5yaWdodENhbGVuZGFyO1xuICAgIGNvbnN0IG1vbnRoID0gbWFpbkNhbGVuZGFyLm1vbnRoLm1vbnRoKCk7XG4gICAgY29uc3QgeWVhciA9IG1haW5DYWxlbmRhci5tb250aC55ZWFyKCk7XG4gICAgY29uc3QgaG91ciA9IG1haW5DYWxlbmRhci5tb250aC5ob3VyKCk7XG4gICAgY29uc3QgbWludXRlID0gbWFpbkNhbGVuZGFyLm1vbnRoLm1pbnV0ZSgpO1xuICAgIGNvbnN0IHNlY29uZCA9IG1haW5DYWxlbmRhci5tb250aC5zZWNvbmQoKTtcbiAgICBjb25zdCBkYXlzSW5Nb250aCA9IG1vbWVudChbeWVhciwgbW9udGhdKS5kYXlzSW5Nb250aCgpO1xuICAgIGNvbnN0IGZpcnN0RGF5ID0gbW9tZW50KFt5ZWFyLCBtb250aCwgMV0pO1xuICAgIGNvbnN0IGxhc3REYXkgPSBtb21lbnQoW3llYXIsIG1vbnRoLCBkYXlzSW5Nb250aF0pO1xuICAgIGNvbnN0IGxhc3RNb250aCA9IG1vbWVudChmaXJzdERheSkuc3VidHJhY3QoMSwgJ21vbnRoJykubW9udGgoKTtcbiAgICBjb25zdCBsYXN0WWVhciA9IG1vbWVudChmaXJzdERheSkuc3VidHJhY3QoMSwgJ21vbnRoJykueWVhcigpO1xuICAgIGNvbnN0IGRheXNJbkxhc3RNb250aCA9IG1vbWVudChbbGFzdFllYXIsIGxhc3RNb250aF0pLmRheXNJbk1vbnRoKCk7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZmlyc3REYXkuZGF5KCk7XG4gICAgLy8gaW5pdGlhbGl6ZSBhIDYgcm93cyB4IDcgY29sdW1ucyBhcnJheSBmb3IgdGhlIGNhbGVuZGFyXG4gICAgY29uc3QgY2FsZW5kYXI6IGFueSA9IFtdO1xuICAgIGNhbGVuZGFyLmZpcnN0RGF5ID0gZmlyc3REYXk7XG4gICAgY2FsZW5kYXIubGFzdERheSA9IGxhc3REYXk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgY2FsZW5kYXJbaV0gPSBbXTtcbiAgICB9XG5cbiAgICAvLyBwb3B1bGF0ZSB0aGUgY2FsZW5kYXIgd2l0aCBkYXRlIG9iamVjdHNcbiAgICBsZXQgc3RhcnREYXkgPSBkYXlzSW5MYXN0TW9udGggLSBkYXlPZldlZWsgKyB0aGlzLmxvY2FsZS5maXJzdERheSArIDE7XG4gICAgaWYgKHN0YXJ0RGF5ID4gZGF5c0luTGFzdE1vbnRoKSB7XG4gICAgICBzdGFydERheSAtPSA3O1xuICAgIH1cblxuICAgIGlmIChkYXlPZldlZWsgPT09IHRoaXMubG9jYWxlLmZpcnN0RGF5KSB7XG4gICAgICBzdGFydERheSA9IGRheXNJbkxhc3RNb250aCAtIDY7XG4gICAgfVxuXG4gICAgbGV0IGN1ckRhdGUgPSBtb21lbnQoW2xhc3RZZWFyLCBsYXN0TW9udGgsIHN0YXJ0RGF5LCAxMiwgbWludXRlLCBzZWNvbmRdKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBjb2wgPSAwLCByb3cgPSAwOyBpIDwgNDI7IGkrKywgY29sKyssIGN1ckRhdGUgPSBtb21lbnQoY3VyRGF0ZSkuYWRkKDI0LCAnaG91cicpKSB7XG4gICAgICBpZiAoaSA+IDAgJiYgY29sICUgNyA9PT0gMCkge1xuICAgICAgICBjb2wgPSAwO1xuICAgICAgICByb3crKztcbiAgICAgIH1cbiAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA9IGN1ckRhdGUuY2xvbmUoKS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICAgICAgY3VyRGF0ZS5ob3VyKDEyKTtcblxuICAgICAgaWYgKHRoaXMubWluRGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IHRoaXMubWluRGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSAmJlxuICAgICAgICBjYWxlbmRhcltyb3ddW2NvbF0uaXNCZWZvcmUodGhpcy5taW5EYXRlKSAmJiBzaWRlID09PSAnbGVmdCcpIHtcbiAgICAgICAgY2FsZW5kYXJbcm93XVtjb2xdID0gdGhpcy5taW5EYXRlLmNsb25lKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1heERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSB0aGlzLm1heERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgJiZcbiAgICAgICAgY2FsZW5kYXJbcm93XVtjb2xdLmlzQWZ0ZXIodGhpcy5tYXhEYXRlKSAmJiBzaWRlID09PSAncmlnaHQnKSB7XG4gICAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA9IHRoaXMubWF4RGF0ZS5jbG9uZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG1ha2UgdGhlIGNhbGVuZGFyIG9iamVjdCBhdmFpbGFibGUgdG8gaG92ZXJEYXRlL2NsaWNrRGF0ZVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICB0aGlzLmxlZnRDYWxlbmRhci5jYWxlbmRhciA9IGNhbGVuZGFyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIuY2FsZW5kYXIgPSBjYWxlbmRhcjtcbiAgICB9XG4gICAgLy9cbiAgICAvLyBEaXNwbGF5IHRoZSBjYWxlbmRhclxuICAgIC8vXG4gICAgY29uc3QgbWluRGF0ZSA9IHNpZGUgPT09ICdsZWZ0JyA/IHRoaXMubWluRGF0ZSA6IHRoaXMuc3RhcnREYXRlO1xuICAgIGxldCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlO1xuICAgIC8vIGFkanVzdCBtYXhEYXRlIHRvIHJlZmxlY3QgdGhlIGRhdGVMaW1pdCBzZXR0aW5nIGluIG9yZGVyIHRvXG4gICAgLy8gZ3JleSBvdXQgZW5kIGRhdGVzIGJleW9uZCB0aGUgZGF0ZUxpbWl0XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSA9PT0gbnVsbCAmJiB0aGlzLmRhdGVMaW1pdCkge1xuICAgICAgY29uc3QgbWF4TGltaXQgPSB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpLmFkZCh0aGlzLmRhdGVMaW1pdCwgJ2RheScpLmVuZE9mKCdkYXknKTtcbiAgICAgIGlmICghbWF4RGF0ZSB8fCBtYXhMaW1pdC5pc0JlZm9yZShtYXhEYXRlKSkge1xuICAgICAgICBtYXhEYXRlID0gbWF4TGltaXQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2FsZW5kYXJWYXJpYWJsZXNbc2lkZV0gPSB7XG4gICAgICBtb250aDogbW9udGgsXG4gICAgICB5ZWFyOiB5ZWFyLFxuICAgICAgaG91cjogaG91cixcbiAgICAgIG1pbnV0ZTogbWludXRlLFxuICAgICAgc2Vjb25kOiBzZWNvbmQsXG4gICAgICBkYXlzSW5Nb250aDogZGF5c0luTW9udGgsXG4gICAgICBmaXJzdERheTogZmlyc3REYXksXG4gICAgICBsYXN0RGF5OiBsYXN0RGF5LFxuICAgICAgbGFzdE1vbnRoOiBsYXN0TW9udGgsXG4gICAgICBsYXN0WWVhcjogbGFzdFllYXIsXG4gICAgICBkYXlzSW5MYXN0TW9udGg6IGRheXNJbkxhc3RNb250aCxcbiAgICAgIGRheU9mV2VlazogZGF5T2ZXZWVrLFxuICAgICAgLy8gb3RoZXIgdmFyc1xuICAgICAgY2FsUm93czogQXJyYXkuZnJvbShBcnJheSg2KS5rZXlzKCkpLFxuICAgICAgY2FsQ29sczogQXJyYXkuZnJvbShBcnJheSg3KS5rZXlzKCkpLFxuICAgICAgY2xhc3Nlczoge30sXG4gICAgICBtaW5EYXRlOiBtaW5EYXRlLFxuICAgICAgbWF4RGF0ZTogbWF4RGF0ZSxcbiAgICAgIGNhbGVuZGFyOiBjYWxlbmRhclxuICAgIH07XG4gICAgaWYgKHRoaXMuc2hvd0Ryb3Bkb3ducykge1xuICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gY2FsZW5kYXJbMV1bMV0ubW9udGgoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gY2FsZW5kYXJbMV1bMV0ueWVhcigpO1xuICAgICAgY29uc3QgbWF4WWVhciA9IChtYXhEYXRlICYmIG1heERhdGUueWVhcigpKSB8fCAoY3VycmVudFllYXIgKyA1KTtcbiAgICAgIGNvbnN0IG1pblllYXIgPSAobWluRGF0ZSAmJiBtaW5EYXRlLnllYXIoKSkgfHwgKGN1cnJlbnRZZWFyIC0gNTApO1xuICAgICAgY29uc3QgaW5NaW5ZZWFyID0gY3VycmVudFllYXIgPT09IG1pblllYXI7XG4gICAgICBjb25zdCBpbk1heFllYXIgPSBjdXJyZW50WWVhciA9PT0gbWF4WWVhcjtcbiAgICAgIGNvbnN0IHllYXJzID0gW107XG4gICAgICBmb3IgKGxldCB5ID0gbWluWWVhcjsgeSA8PSBtYXhZZWFyOyB5KyspIHtcbiAgICAgICAgeWVhcnMucHVzaCh5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsZW5kYXJWYXJpYWJsZXNbc2lkZV0uZHJvcGRvd25zID0ge1xuICAgICAgICBjdXJyZW50TW9udGg6IGN1cnJlbnRNb250aCxcbiAgICAgICAgY3VycmVudFllYXI6IGN1cnJlbnRZZWFyLFxuICAgICAgICBtYXhZZWFyOiBtYXhZZWFyLFxuICAgICAgICBtaW5ZZWFyOiBtaW5ZZWFyLFxuICAgICAgICBpbk1pblllYXI6IGluTWluWWVhcixcbiAgICAgICAgaW5NYXhZZWFyOiBpbk1heFllYXIsXG4gICAgICAgIG1vbnRoQXJyYXlzOiBBcnJheS5mcm9tKEFycmF5KDEyKS5rZXlzKCkpLFxuICAgICAgICB5ZWFyQXJyYXlzOiB5ZWFyc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9idWlsZENlbGxzKGNhbGVuZGFyLCBzaWRlKTtcbiAgfVxuICBzZXRTdGFydERhdGUoc3RhcnREYXRlKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydERhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG1vbWVudChzdGFydERhdGUsIHRoaXMubG9jYWxlLmZvcm1hdCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzdGFydERhdGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG1vbWVudChzdGFydERhdGUpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudGltZVBpY2tlcikge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZS5zdGFydE9mKCdkYXknKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50aW1lUGlja2VyICYmIHRoaXMudGltZVBpY2tlckluY3JlbWVudCkge1xuICAgICAgdGhpcy5zdGFydERhdGUubWludXRlKE1hdGgucm91bmQodGhpcy5zdGFydERhdGUubWludXRlKCkgLyB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQpICogdGhpcy50aW1lUGlja2VySW5jcmVtZW50KTtcbiAgICB9XG5cblxuICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgdGhpcy5zdGFydERhdGUuaXNCZWZvcmUodGhpcy5taW5EYXRlKSkge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLm1pbkRhdGUuY2xvbmUoKTtcbiAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIgJiYgdGhpcy50aW1lUGlja2VySW5jcmVtZW50KSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlLm1pbnV0ZShNYXRoLnJvdW5kKHRoaXMuc3RhcnREYXRlLm1pbnV0ZSgpIC8gdGhpcy50aW1lUGlja2VySW5jcmVtZW50KSAqIHRoaXMudGltZVBpY2tlckluY3JlbWVudCk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXhEYXRlICYmIHRoaXMuc3RhcnREYXRlLmlzQWZ0ZXIodGhpcy5tYXhEYXRlKSkge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLm1heERhdGUuY2xvbmUoKTtcbiAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIgJiYgdGhpcy50aW1lUGlja2VySW5jcmVtZW50KSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlLm1pbnV0ZShNYXRoLmZsb29yKHRoaXMuc3RhcnREYXRlLm1pbnV0ZSgpIC8gdGhpcy50aW1lUGlja2VySW5jcmVtZW50KSAqIHRoaXMudGltZVBpY2tlckluY3JlbWVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzU2hvd24pIHtcbiAgICAgIHRoaXMudXBkYXRlRWxlbWVudCgpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlTW9udGhzSW5WaWV3KCk7XG4gIH1cblxuICBzZXRFbmREYXRlKGVuZERhdGUpIHtcbiAgICBpZiAodHlwZW9mIGVuZERhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmVuZERhdGUgPSBtb21lbnQoZW5kRGF0ZSwgdGhpcy5sb2NhbGUuZm9ybWF0KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGVuZERhdGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmVuZERhdGUgPSBtb21lbnQoZW5kRGF0ZSk7XG4gICAgfVxuICAgIGlmICghdGhpcy50aW1lUGlja2VyKSB7XG4gICAgICB0aGlzLmVuZERhdGUgPSB0aGlzLmVuZERhdGUuYWRkKDEsICdkJykuc3RhcnRPZignZGF5Jykuc3VidHJhY3QoMSwgJ3NlY29uZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRpbWVQaWNrZXIgJiYgdGhpcy50aW1lUGlja2VySW5jcmVtZW50KSB7XG4gICAgICB0aGlzLmVuZERhdGUubWludXRlKE1hdGgucm91bmQodGhpcy5lbmREYXRlLm1pbnV0ZSgpIC8gdGhpcy50aW1lUGlja2VySW5jcmVtZW50KSAqIHRoaXMudGltZVBpY2tlckluY3JlbWVudCk7XG4gICAgfVxuXG5cbiAgICBpZiAodGhpcy5lbmREYXRlLmlzQmVmb3JlKHRoaXMuc3RhcnREYXRlKSkge1xuICAgICAgdGhpcy5lbmREYXRlID0gdGhpcy5zdGFydERhdGUuY2xvbmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXhEYXRlICYmIHRoaXMuZW5kRGF0ZS5pc0FmdGVyKHRoaXMubWF4RGF0ZSkpIHtcbiAgICAgIHRoaXMuZW5kRGF0ZSA9IHRoaXMubWF4RGF0ZS5jbG9uZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVMaW1pdCAmJiB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpLmFkZCh0aGlzLmRhdGVMaW1pdCwgJ2RheScpLmlzQmVmb3JlKHRoaXMuZW5kRGF0ZSkpIHtcbiAgICAgIHRoaXMuZW5kRGF0ZSA9IHRoaXMuc3RhcnREYXRlLmNsb25lKCkuYWRkKHRoaXMuZGF0ZUxpbWl0LCAnZGF5Jyk7XG4gICAgfVxuXG5cbiAgICBpZiAoIXRoaXMuaXNTaG93bikge1xuICAgICAgLy8gdGhpcy51cGRhdGVFbGVtZW50KCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlTW9udGhzSW5WaWV3KCk7XG4gIH1cbiAgQElucHV0KClcbiAgaXNJbnZhbGlkRGF0ZShkYXRlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGlzQ3VzdG9tRGF0ZShkYXRlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdXBkYXRlVmlldygpIHtcbiAgICBpZiAodGhpcy50aW1lUGlja2VyKSB7XG4gICAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ubGVmdCk7XG4gICAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ucmlnaHQpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICB1cGRhdGVNb250aHNJblZpZXcoKSB7XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSkge1xuICAgICAgLy8gaWYgYm90aCBkYXRlcyBhcmUgdmlzaWJsZSBhbHJlYWR5LCBkbyBub3RoaW5nXG4gICAgICBpZiAodGhpcy5sZWZ0Q2FsZW5kYXIubW9udGggJiYgdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoICYmXG4gICAgICAgICgodGhpcy5zdGFydERhdGUgJiYgdGhpcy5sZWZ0Q2FsZW5kYXIgJiYgdGhpcy5zdGFydERhdGUuZm9ybWF0KCdZWVlZLU1NJykgPT09IHRoaXMubGVmdENhbGVuZGFyLm1vbnRoLmZvcm1hdCgnWVlZWS1NTScpKSB8fFxuICAgICAgICAgICh0aGlzLnN0YXJ0RGF0ZSAmJiB0aGlzLnJpZ2h0Q2FsZW5kYXIgJiYgdGhpcy5zdGFydERhdGUuZm9ybWF0KCdZWVlZLU1NJykgPT09IHRoaXMucmlnaHRDYWxlbmRhci5tb250aC5mb3JtYXQoJ1lZWVktTU0nKSkpXG4gICAgICAgICYmXG4gICAgICAgICh0aGlzLmVuZERhdGUuZm9ybWF0KCdZWVlZLU1NJykgPT09IHRoaXMubGVmdENhbGVuZGFyLm1vbnRoLmZvcm1hdCgnWVlZWS1NTScpIHx8XG4gICAgICAgICAgdGhpcy5lbmREYXRlLmZvcm1hdCgnWVlZWS1NTScpID09PSB0aGlzLnJpZ2h0Q2FsZW5kYXIubW9udGguZm9ybWF0KCdZWVlZLU1NJykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvL2Rvbid0IHJlc3RhcnQgdmlldyBmb3Igc3RhcnQgbW9udGggd2hlbiBzZWxlY3QgZW5kIGRhdGUgd2hlbiBzaW5nbGVEYXRhUGlja2VyID0gdHJ1ZVxuICAgICAgaWYgKCghdGhpcy5zaW5nbGVEYXRlUGlja2VyIHx8ICh0aGlzLnNpbmdsZURhdGVQaWNrZXIgJiYgIXRoaXMucGlja2luZ0RhdGUpKSAmJiB0aGlzLnN0YXJ0RGF0ZSkge1xuICAgICAgICB0aGlzLmxlZnRDYWxlbmRhci5tb250aCA9IHRoaXMuc3RhcnREYXRlLmNsb25lKCkuZGF0ZSgyKTtcbiAgICAgICAgaWYgKCF0aGlzLmxpbmtlZENhbGVuZGFycyAmJiAodGhpcy5lbmREYXRlLm1vbnRoKCkgIT09IHRoaXMuc3RhcnREYXRlLm1vbnRoKCkgfHxcbiAgICAgICAgICB0aGlzLmVuZERhdGUueWVhcigpICE9PSB0aGlzLnN0YXJ0RGF0ZS55ZWFyKCkpKSB7XG4gICAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoID0gdGhpcy5lbmREYXRlLmNsb25lKCkuZGF0ZSgyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIubW9udGggPSB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpLmRhdGUoMikuYWRkKDEsICdtb250aCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubGVmdENhbGVuZGFyLm1vbnRoLmZvcm1hdCgnWVlZWS1NTScpICE9PSB0aGlzLnN0YXJ0RGF0ZS5mb3JtYXQoJ1lZWVktTU0nKSAmJlxuICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIubW9udGguZm9ybWF0KCdZWVlZLU1NJykgIT09IHRoaXMuc3RhcnREYXRlLmZvcm1hdCgnWVlZWS1NTScpKSB7XG4gICAgICAgIHRoaXMubGVmdENhbGVuZGFyLm1vbnRoID0gdGhpcy5zdGFydERhdGUuY2xvbmUoKS5kYXRlKDIpO1xuICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIubW9udGggPSB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpLmRhdGUoMikuYWRkKDEsICdtb250aCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5tYXhEYXRlICYmIHRoaXMubGlua2VkQ2FsZW5kYXJzICYmIHRoaXMucmlnaHRDYWxlbmRhci5tb250aCA+IHRoaXMubWF4RGF0ZSkge1xuICAgICAgdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoID0gdGhpcy5tYXhEYXRlLmNsb25lKCkuZGF0ZSgyKTtcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyLm1vbnRoID0gdGhpcy5tYXhEYXRlLmNsb25lKCkuZGF0ZSgyKS5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqICBUaGlzIGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyB0aGUgY2FsZW5kYXJzXG4gICAqL1xuICB1cGRhdGVDYWxlbmRhcnMoKSB7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5sZWZ0KTtcbiAgICAvL1JpZ2h0IGNhbGVuZGFyIGluIHNpbmdsZURhdGVwaWNrZXIgaXMgbm90IHJlbmRlcmluZ1xuICAgIGlmICghdGhpcy5zaW5nbGVEYXRlUGlja2VyKSB7XG4gICAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbmREYXRlID09PSBudWxsKSB7IHJldHVybjsgfVxuICAgIHRoaXMuY2FsY3VsYXRlQ2hvc2VuTGFiZWwoKTtcbiAgfVxuICB1cGRhdGVFbGVtZW50KCkge1xuICAgIGlmICh0aGlzLmF1dG9VcGRhdGVJbnB1dCkge1xuICAgICAgaWYgKHRoaXMuc3RhcnREYXRlICYmIHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICAvLyBpZiB3ZSB1c2UgcmFuZ2VzIGFuZCBzaG91bGQgc2hvdyByYW5nZSBsYWJlbCBvbiBpbnB1XG4gICAgICAgIGlmICh0aGlzLnJhbmdlc0FycmF5Lmxlbmd0aCAmJiB0aGlzLnNob3dSYW5nZUxhYmVsT25JbnB1dCA9PT0gdHJ1ZSAmJiB0aGlzLmNob3NlblJhbmdlICYmXG4gICAgICAgICAgdGhpcy5sb2NhbGUuY3VzdG9tUmFuZ2VMYWJlbCAhPT0gdGhpcy5jaG9zZW5SYW5nZSkge1xuICAgICAgICAgIHRoaXMuY2hvc2VuTGFiZWwgPSB0aGlzLmNob3NlblJhbmdlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hvc2VuTGFiZWwgPSB0aGlzLnN0YXJ0RGF0ZS5mb3JtYXQodGhpcy5sb2NhbGUuZm9ybWF0KSArXG4gICAgICAgICAgICB0aGlzLmxvY2FsZS5zZXBhcmF0b3IgKyB0aGlzLmVuZERhdGUuZm9ybWF0KHRoaXMubG9jYWxlLmZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLmlzU2hvd24gPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogdGhpcyBzaG91bGQgY2FsY3VsYXRlIHRoZSBsYWJlbFxuICAgKi9cbiAgY2FsY3VsYXRlQ2hvc2VuTGFiZWwoKSB7XG4gICAgaWYgKCF0aGlzLmxvY2FsZSB8fCAhdGhpcy5sb2NhbGUuc2VwYXJhdG9yKSB7XG4gICAgICB0aGlzLl9idWlsZExvY2FsZSgpO1xuICAgIH1cbiAgICBsZXQgY3VzdG9tUmFuZ2UgPSB0cnVlO1xuICAgIGxldCBpID0gMDtcbiAgICBpZiAodGhpcy5yYW5nZXNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHJhbmdlIGluIHRoaXMucmFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIpIHtcbiAgICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnRpbWVQaWNrZXJTZWNvbmRzID8gJ1lZWVktTU0tREQgSEg6bW06c3MnIDogJ1lZWVktTU0tREQgSEg6bW0nO1xuICAgICAgICAgIC8vaWdub3JlIHRpbWVzIHdoZW4gY29tcGFyaW5nIGRhdGVzIGlmIHRpbWUgcGlja2VyIHNlY29uZHMgaXMgbm90IGVuYWJsZWRcbiAgICAgICAgICBpZiAodGhpcy5zdGFydERhdGUuZm9ybWF0KGZvcm1hdCkgPT09IHRoaXMucmFuZ2VzW3JhbmdlXVswXS5mb3JtYXQoZm9ybWF0KSAmJiB0aGlzLmVuZERhdGUuZm9ybWF0KGZvcm1hdCkgPT09IHRoaXMucmFuZ2VzW3JhbmdlXVsxXS5mb3JtYXQoZm9ybWF0KSkge1xuICAgICAgICAgICAgY3VzdG9tUmFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2hvc2VuUmFuZ2UgPSB0aGlzLnJhbmdlc0FycmF5W2ldO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vaWdub3JlIHRpbWVzIHdoZW4gY29tcGFyaW5nIGRhdGVzIGlmIHRpbWUgcGlja2VyIGlzIG5vdCBlbmFibGVkXG4gICAgICAgICAgaWYgKHRoaXMuc3RhcnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSB0aGlzLnJhbmdlc1tyYW5nZV1bMF0uZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgdGhpcy5lbmREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSB0aGlzLnJhbmdlc1tyYW5nZV1bMV0uZm9ybWF0KCdZWVlZLU1NLUREJykpIHtcbiAgICAgICAgICAgIGN1c3RvbVJhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNob3NlblJhbmdlID0gdGhpcy5yYW5nZXNBcnJheVtpXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICAgIGlmIChjdXN0b21SYW5nZSkge1xuICAgICAgICBpZiAodGhpcy5zaG93Q3VzdG9tUmFuZ2VMYWJlbCkge1xuICAgICAgICAgIHRoaXMuY2hvc2VuUmFuZ2UgPSB0aGlzLmxvY2FsZS5jdXN0b21SYW5nZUxhYmVsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hvc2VuUmFuZ2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGN1c3RvbSBsYWJlbDogc2hvdyBjYWxlbmFyXG4gICAgICAgIHRoaXMuc2hvd0NhbEluUmFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgfVxuXG4gIGNsaWNrQXBwbHkoZT8pIHtcbiAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgIXRoaXMuZW5kRGF0ZSkge1xuICAgICAgdGhpcy5lbmREYXRlID0gdGhpcy5zdGFydERhdGUuY2xvbmUoKTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlQ2hvc2VuTGFiZWwoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNJbnZhbGlkRGF0ZSAmJiB0aGlzLnN0YXJ0RGF0ZSAmJiB0aGlzLmVuZERhdGUpIHtcbiAgICAgIC8vIGdldCBpZiB0aGVyZSBhcmUgaW52YWxpZCBkYXRlIGJldHdlZW4gcmFuZ2VcbiAgICAgIGNvbnN0IGQgPSB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpO1xuICAgICAgd2hpbGUgKGQuaXNCZWZvcmUodGhpcy5lbmREYXRlKSkge1xuICAgICAgICBpZiAodGhpcy5pc0ludmFsaWREYXRlKGQpKSB7XG4gICAgICAgICAgdGhpcy5lbmREYXRlID0gZC5zdWJ0cmFjdCgxLCAnZGF5cycpO1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ2hvc2VuTGFiZWwoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkLmFkZCgxLCAnZGF5cycpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jaG9zZW5MYWJlbCkge1xuICAgICAgdGhpcy5jaG9vc2VkRGF0ZS5lbWl0KHsgY2hvc2VuTGFiZWw6IHRoaXMuY2hvc2VuTGFiZWwsIHN0YXJ0RGF0ZTogdGhpcy5zdGFydERhdGUsIGVuZERhdGU6IHRoaXMuZW5kRGF0ZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGVzVXBkYXRlZC5lbWl0KHsgc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSwgZW5kRGF0ZTogdGhpcy5lbmREYXRlIH0pO1xuICAgIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgY2xpY2tDYW5jZWwoZSkge1xuICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5fb2xkLnN0YXJ0O1xuICAgIHRoaXMuZW5kRGF0ZSA9IHRoaXMuX29sZC5lbmQ7XG4gICAgaWYgKHRoaXMuaW5saW5lKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICB9XG4gICAgdGhpcy5oaWRlKCk7XG4gIH1cbiAgLyoqXG4gICAqIGNhbGxlZCB3aGVuIG1vbnRoIGlzIGNoYW5nZWRcbiAgICogQHBhcmFtIG1vbnRoRXZlbnQgZ2V0IHZhbHVlIGluIGV2ZW50LnRhcmdldC52YWx1ZVxuICAgKiBAcGFyYW0gc2lkZSBsZWZ0IG9yIHJpZ2h0XG4gICAqL1xuICBtb250aENoYW5nZWQobW9udGhFdmVudDogYW55LCBzaWRlOiBTaWRlRW51bSkge1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzW3NpZGVdLmRyb3Bkb3ducy5jdXJyZW50WWVhcjtcbiAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KG1vbnRoRXZlbnQudGFyZ2V0LnZhbHVlLCAxMCk7XG4gICAgdGhpcy5tb250aE9yWWVhckNoYW5nZWQobW9udGgsIHllYXIsIHNpZGUpO1xuICB9XG4gIC8qKlxuICAgKiBjYWxsZWQgd2hlbiB5ZWFyIGlzIGNoYW5nZWRcbiAgICogQHBhcmFtIHllYXJFdmVudCBnZXQgdmFsdWUgaW4gZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAqIEBwYXJhbSBzaWRlIGxlZnQgb3IgcmlnaHRcbiAgICovXG4gIHllYXJDaGFuZ2VkKHllYXJFdmVudDogYW55LCBzaWRlOiBTaWRlRW51bSkge1xuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jYWxlbmRhclZhcmlhYmxlc1tzaWRlXS5kcm9wZG93bnMuY3VycmVudE1vbnRoO1xuICAgIGNvbnN0IHllYXIgPSBwYXJzZUludCh5ZWFyRXZlbnQudGFyZ2V0LnZhbHVlLCAxMCk7XG4gICAgdGhpcy5tb250aE9yWWVhckNoYW5nZWQobW9udGgsIHllYXIsIHNpZGUpO1xuICB9XG4gIC8qKlxuICAgKiBjYWxsZWQgd2hlbiB0aW1lIGlzIGNoYW5nZWRcbiAgICogQHBhcmFtIHRpbWVFdmVudCAgYW4gZXZlbnRcbiAgICogQHBhcmFtIHNpZGUgbGVmdCBvciByaWdodFxuICAgKi9cbiAgdGltZUNoYW5nZWQodGltZUV2ZW50OiBhbnksIHNpZGU6IFNpZGVFbnVtKSB7XG5cbiAgICBsZXQgaG91ciA9IHBhcnNlSW50KHRoaXMudGltZXBpY2tlclZhcmlhYmxlc1tzaWRlXS5zZWxlY3RlZEhvdXIsIDEwKTtcbiAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXNbc2lkZV0uc2VsZWN0ZWRNaW51dGUsIDEwKTtcbiAgICBjb25zdCBzZWNvbmQgPSB0aGlzLnRpbWVQaWNrZXJTZWNvbmRzID8gcGFyc2VJbnQodGhpcy50aW1lcGlja2VyVmFyaWFibGVzW3NpZGVdLnNlbGVjdGVkU2Vjb25kLCAxMCkgOiAwO1xuXG4gICAgaWYgKCF0aGlzLnRpbWVQaWNrZXIyNEhvdXIpIHtcbiAgICAgIGNvbnN0IGFtcG0gPSB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXNbc2lkZV0uYW1wbU1vZGVsO1xuICAgICAgaWYgKGFtcG0gPT09ICdQTScgJiYgaG91ciA8IDEyKSB7XG4gICAgICAgIGhvdXIgKz0gMTI7XG4gICAgICB9XG4gICAgICBpZiAoYW1wbSA9PT0gJ0FNJyAmJiBob3VyID09PSAxMikge1xuICAgICAgICBob3VyID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpO1xuICAgICAgc3RhcnQuaG91cihob3VyKTtcbiAgICAgIHN0YXJ0Lm1pbnV0ZShtaW51dGUpO1xuICAgICAgc3RhcnQuc2Vjb25kKHNlY29uZCk7XG4gICAgICB0aGlzLnNldFN0YXJ0RGF0ZShzdGFydCk7XG4gICAgICBpZiAodGhpcy5lbmREYXRlICYmIHRoaXMuZW5kRGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gc3RhcnQuZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgdGhpcy5lbmREYXRlLmlzQmVmb3JlKHN0YXJ0KSkge1xuICAgICAgICB0aGlzLnNldEVuZERhdGUoc3RhcnQuY2xvbmUoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmVuZERhdGUpIHtcbiAgICAgIGNvbnN0IGVuZCA9IHRoaXMuZW5kRGF0ZS5jbG9uZSgpO1xuICAgICAgZW5kLmhvdXIoaG91cik7XG4gICAgICBlbmQubWludXRlKG1pbnV0ZSk7XG4gICAgICBlbmQuc2Vjb25kKHNlY29uZCk7XG4gICAgICB0aGlzLnNldEVuZERhdGUoZW5kKTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgdGhlIGNhbGVuZGFycyBzbyBhbGwgY2xpY2thYmxlIGRhdGVzIHJlZmxlY3QgdGhlIG5ldyB0aW1lIGNvbXBvbmVudFxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG5cbiAgICAvLyByZS1yZW5kZXIgdGhlIHRpbWUgcGlja2VycyBiZWNhdXNlIGNoYW5naW5nIG9uZSBzZWxlY3Rpb24gY2FuIGFmZmVjdCB3aGF0J3MgZW5hYmxlZCBpbiBhbm90aGVyXG4gICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLmxlZnQpO1xuICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcihTaWRlRW51bS5yaWdodCk7XG4gIH1cbiAgLyoqXG4gICAqICBjYWxsIHdoZW4gbW9udGggb3IgeWVhciBjaGFuZ2VkXG4gICAqIEBwYXJhbSBtb250aCBtb250aCBudW1iZXIgMCAtMTFcbiAgICogQHBhcmFtIHllYXIgeWVhciBlZzogMTk5NVxuICAgKiBAcGFyYW0gc2lkZSBsZWZ0IG9yIHJpZ2h0XG4gICAqL1xuICBtb250aE9yWWVhckNoYW5nZWQobW9udGg6IG51bWJlciwgeWVhcjogbnVtYmVyLCBzaWRlOiBTaWRlRW51bSkge1xuICAgIGNvbnN0IGlzTGVmdCA9IHNpZGUgPT09IFNpZGVFbnVtLmxlZnQ7XG5cbiAgICBpZiAoIWlzTGVmdCkge1xuICAgICAgaWYgKHllYXIgPCB0aGlzLnN0YXJ0RGF0ZS55ZWFyKCkgfHwgKHllYXIgPT09IHRoaXMuc3RhcnREYXRlLnllYXIoKSAmJiBtb250aCA8IHRoaXMuc3RhcnREYXRlLm1vbnRoKCkpKSB7XG4gICAgICAgIG1vbnRoID0gdGhpcy5zdGFydERhdGUubW9udGgoKTtcbiAgICAgICAgeWVhciA9IHRoaXMuc3RhcnREYXRlLnllYXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5EYXRlKSB7XG4gICAgICBpZiAoeWVhciA8IHRoaXMubWluRGF0ZS55ZWFyKCkgfHwgKHllYXIgPT09IHRoaXMubWluRGF0ZS55ZWFyKCkgJiYgbW9udGggPCB0aGlzLm1pbkRhdGUubW9udGgoKSkpIHtcbiAgICAgICAgbW9udGggPSB0aGlzLm1pbkRhdGUubW9udGgoKTtcbiAgICAgICAgeWVhciA9IHRoaXMubWluRGF0ZS55ZWFyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWF4RGF0ZSkge1xuICAgICAgaWYgKHllYXIgPiB0aGlzLm1heERhdGUueWVhcigpIHx8ICh5ZWFyID09PSB0aGlzLm1heERhdGUueWVhcigpICYmIG1vbnRoID4gdGhpcy5tYXhEYXRlLm1vbnRoKCkpKSB7XG4gICAgICAgIG1vbnRoID0gdGhpcy5tYXhEYXRlLm1vbnRoKCk7XG4gICAgICAgIHllYXIgPSB0aGlzLm1heERhdGUueWVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNhbGVuZGFyVmFyaWFibGVzW3NpZGVdLmRyb3Bkb3ducy5jdXJyZW50WWVhciA9IHllYXI7XG4gICAgdGhpcy5jYWxlbmRhclZhcmlhYmxlc1tzaWRlXS5kcm9wZG93bnMuY3VycmVudE1vbnRoID0gbW9udGg7XG4gICAgaWYgKGlzTGVmdCkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIubW9udGgubW9udGgobW9udGgpLnllYXIoeWVhcik7XG4gICAgICBpZiAodGhpcy5saW5rZWRDYWxlbmRhcnMpIHtcbiAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoID0gdGhpcy5sZWZ0Q2FsZW5kYXIubW9udGguY2xvbmUoKS5hZGQoMSwgJ21vbnRoJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhci5tb250aC5tb250aChtb250aCkueWVhcih5ZWFyKTtcbiAgICAgIGlmICh0aGlzLmxpbmtlZENhbGVuZGFycykge1xuICAgICAgICB0aGlzLmxlZnRDYWxlbmRhci5tb250aCA9IHRoaXMucmlnaHRDYWxlbmRhci5tb250aC5jbG9uZSgpLnN1YnRyYWN0KDEsICdtb250aCcpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsaWNrIG9uIHByZXZpb3VzIG1vbnRoXG4gICAqIEBwYXJhbSBzaWRlIGxlZnQgb3IgcmlnaHQgY2FsZW5kYXJcbiAgICovXG4gIGNsaWNrUHJldihzaWRlOiBTaWRlRW51bSkge1xuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICB0aGlzLmxlZnRDYWxlbmRhci5tb250aC5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcbiAgICAgIGlmICh0aGlzLmxpbmtlZENhbGVuZGFycykge1xuICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIubW9udGguc3VidHJhY3QoMSwgJ21vbnRoJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhci5tb250aC5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICAvKipcbiAgICogQ2xpY2sgb24gbmV4dCBtb250aFxuICAgKiBAcGFyYW0gc2lkZSBsZWZ0IG9yIHJpZ2h0IGNhbGVuZGFyXG4gICAqL1xuICBjbGlja05leHQoc2lkZTogU2lkZUVudW0pIHtcbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIubW9udGguYWRkKDEsICdtb250aCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIubW9udGguYWRkKDEsICdtb250aCcpO1xuICAgICAgaWYgKHRoaXMubGlua2VkQ2FsZW5kYXJzKSB7XG4gICAgICAgIHRoaXMubGVmdENhbGVuZGFyLm1vbnRoLmFkZCgxLCAnbW9udGgnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICAvKipcbiAgICogV2hlbiBzZWxlY3RpbmcgYSBkYXRlXG4gICAqIEBwYXJhbSBlIGV2ZW50OiBnZXQgdmFsdWUgYnkgZS50YXJnZXQudmFsdWVcbiAgICogQHBhcmFtIHNpZGUgbGVmdCBvciByaWdodFxuICAgKiBAcGFyYW0gcm93IHJvdyBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBkYXRlIGNsaWNrZWRcbiAgICogQHBhcmFtIGNvbCBjb2wgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgZGF0ZSBjbGlja2VkXG4gICAqL1xuICBjbGlja0RhdGUoZSwgc2lkZTogU2lkZUVudW0sIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIHRoaXMucGlja2luZ0RhdGUgPSB0cnVlO1xuXG4gICAgaWYgKGUudGFyZ2V0LnRhZ05hbWUgPT09ICdURCcpIHtcbiAgICAgIGlmICghZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhdmFpbGFibGUnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLnRhcmdldC50YWdOYW1lID09PSAnU1BBTicpIHtcbiAgICAgIGlmICghZS50YXJnZXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2F2YWlsYWJsZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMucmFuZ2VzQXJyYXkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNob3NlblJhbmdlID0gdGhpcy5sb2NhbGUuY3VzdG9tUmFuZ2VMYWJlbDtcbiAgICB9XG5cbiAgICBsZXQgZGF0ZSA9IHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgPyB0aGlzLmxlZnRDYWxlbmRhci5jYWxlbmRhcltyb3ddW2NvbF0gOiB0aGlzLnJpZ2h0Q2FsZW5kYXIuY2FsZW5kYXJbcm93XVtjb2xdO1xuXG4gICAgaWYgKHRoaXMuZW5kRGF0ZSB8fCBkYXRlLmlzQmVmb3JlKHRoaXMuc3RhcnREYXRlLCAnZGF5JykpIHsgLy8gcGlja2luZyBzdGFydFxuICAgICAgaWYgKHRoaXMudGltZVBpY2tlcikge1xuICAgICAgICBkYXRlID0gdGhpcy5fZ2V0RGF0ZVdpdGhUaW1lKGRhdGUsIFNpZGVFbnVtLmxlZnQpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbmREYXRlID0gbnVsbDtcbiAgICAgIHRoaXMuc2V0U3RhcnREYXRlKGRhdGUuY2xvbmUoKSk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5lbmREYXRlICYmIGRhdGUuaXNCZWZvcmUodGhpcy5zdGFydERhdGUpKSB7XG4gICAgICAvLyBzcGVjaWFsIGNhc2U6IGNsaWNraW5nIHRoZSBzYW1lIGRhdGUgZm9yIHN0YXJ0L2VuZCxcbiAgICAgIC8vIGJ1dCB0aGUgdGltZSBvZiB0aGUgZW5kIGRhdGUgaXMgYmVmb3JlIHRoZSBzdGFydCBkYXRlXG4gICAgICB0aGlzLnNldEVuZERhdGUodGhpcy5zdGFydERhdGUuY2xvbmUoKSk7XG4gICAgfSBlbHNlIHsgLy8gcGlja2luZyBlbmRcbiAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIpIHtcbiAgICAgICAgZGF0ZSA9IHRoaXMuX2dldERhdGVXaXRoVGltZShkYXRlLCBTaWRlRW51bS5yaWdodCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldEVuZERhdGUoZGF0ZS5jbG9uZSgpKTtcbiAgICAgIGlmICh0aGlzLmF1dG9BcHBseSkge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNob3NlbkxhYmVsKCk7XG4gICAgICAgIHRoaXMuY2xpY2tBcHBseSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIHRoaXMucGlja2luZ0RhdGUgPSBmYWxzZVxuICAgIC8vIFRoaXMgaXMgdG8gY2FuY2VsIHRoZSBibHVyIGV2ZW50IGhhbmRsZXIgaWYgdGhlIG1vdXNlIHdhcyBpbiBvbmUgb2YgdGhlIGlucHV0c1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgfVxuICAvKipcbiAgICogIENsaWNrIG9uIHRoZSBjdXN0b20gcmFuZ2VcbiAgICogQHBhcmFtIGU6IEV2ZW50XG4gICAqIEBwYXJhbSBsYWJlbFxuICAgKi9cbiAgY2xpY2tSYW5nZShlLCBsYWJlbCkge1xuICAgIHRoaXMuY2hvc2VuUmFuZ2UgPSBsYWJlbDtcbiAgICBpZiAobGFiZWwgPT09IHRoaXMubG9jYWxlLmN1c3RvbVJhbmdlTGFiZWwpIHtcbiAgICAgIHRoaXMuaXNTaG93biA9IHRydWU7IC8vIHNob3cgY2FsZW5kYXJzXG4gICAgICB0aGlzLnNob3dDYWxJblJhbmdlcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGVzID0gdGhpcy5yYW5nZXNbbGFiZWxdO1xuICAgICAgdGhpcy5zdGFydERhdGUgPSBkYXRlc1swXS5jbG9uZSgpO1xuICAgICAgdGhpcy5lbmREYXRlID0gZGF0ZXNbMV0uY2xvbmUoKTtcbiAgICAgIGlmICh0aGlzLnNob3dSYW5nZUxhYmVsT25JbnB1dCAmJiBsYWJlbCAhPT0gdGhpcy5sb2NhbGUuY3VzdG9tUmFuZ2VMYWJlbCkge1xuICAgICAgICB0aGlzLmNob3NlbkxhYmVsID0gbGFiZWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNob3NlbkxhYmVsKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNob3dDYWxJblJhbmdlcyA9ICghdGhpcy5yYW5nZXNBcnJheS5sZW5ndGgpIHx8IHRoaXMuYWx3YXlzU2hvd0NhbGVuZGFycztcblxuICAgICAgaWYgKCF0aGlzLnRpbWVQaWNrZXIpIHtcbiAgICAgICAgdGhpcy5zdGFydERhdGUuc3RhcnRPZignZGF5Jyk7XG4gICAgICAgIHRoaXMuZW5kRGF0ZS5lbmRPZignZGF5Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5hbHdheXNTaG93Q2FsZW5kYXJzKSB7XG4gICAgICAgIHRoaXMuaXNTaG93biA9IGZhbHNlOyAvLyBoaWRlIGNhbGVuZGFyc1xuICAgICAgfVxuICAgICAgdGhpcy5yYW5nZUNsaWNrZWQuZW1pdCh7IGxhYmVsOiBsYWJlbCwgZGF0ZXM6IGRhdGVzIH0pO1xuICAgICAgaWYgKCF0aGlzLmtlZXBDYWxlbmRhck9wZW5pbmdXaXRoUmFuZ2UpIHtcbiAgICAgICAgdGhpcy5jbGlja0FwcGx5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5tYXhEYXRlICYmIHRoaXMubWF4RGF0ZS5pc1NhbWUoZGF0ZXNbMF0sICdtb250aCcpKSB7XG4gICAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoLm1vbnRoKGRhdGVzWzBdLm1vbnRoKCkpO1xuICAgICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci5tb250aC55ZWFyKGRhdGVzWzBdLnllYXIoKSk7XG4gICAgICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIubW9udGgubW9udGgoZGF0ZXNbMF0ubW9udGgoKSAtIDEpO1xuICAgICAgICAgIHRoaXMubGVmdENhbGVuZGFyLm1vbnRoLnllYXIoZGF0ZXNbMV0ueWVhcigpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxlZnRDYWxlbmRhci5tb250aC5tb250aChkYXRlc1swXS5tb250aCgpKTtcbiAgICAgICAgICB0aGlzLmxlZnRDYWxlbmRhci5tb250aC55ZWFyKGRhdGVzWzBdLnllYXIoKSk7XG4gICAgICAgICAgLy8gZ2V0IHRoZSBuZXh0IHllYXJcbiAgICAgICAgICBjb25zdCBuZXh0TW9udGggPSBkYXRlc1swXS5jbG9uZSgpLmFkZCgxLCAnbW9udGgnKTtcbiAgICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIubW9udGgubW9udGgobmV4dE1vbnRoLm1vbnRoKCkpO1xuICAgICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci5tb250aC55ZWFyKG5leHRNb250aC55ZWFyKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ubGVmdCk7XG4gICAgICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cblxuICBzaG93KGU/KSB7XG4gICAgaWYgKHRoaXMuaXNTaG93bikgeyByZXR1cm47IH1cbiAgICB0aGlzLl9vbGQuc3RhcnQgPSB0aGlzLnN0YXJ0RGF0ZS5jbG9uZSgpO1xuICAgIHRoaXMuX29sZC5lbmQgPSB0aGlzLmVuZERhdGUuY2xvbmUoKTtcbiAgICB0aGlzLmlzU2hvd24gPSB0cnVlO1xuICAgIHRoaXMudXBkYXRlVmlldygpO1xuICB9XG5cbiAgaGlkZShlPykge1xuICAgIGlmICghdGhpcy5pc1Nob3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGluY29tcGxldGUgZGF0ZSBzZWxlY3Rpb24sIHJldmVydCB0byBsYXN0IHZhbHVlc1xuICAgIGlmICghdGhpcy5lbmREYXRlKSB7XG4gICAgICBpZiAodGhpcy5fb2xkLnN0YXJ0KSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5fb2xkLnN0YXJ0LmNsb25lKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fb2xkLmVuZCkge1xuICAgICAgICB0aGlzLmVuZERhdGUgPSB0aGlzLl9vbGQuZW5kLmNsb25lKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgYSBuZXcgZGF0ZSByYW5nZSB3YXMgc2VsZWN0ZWQsIGludm9rZSB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvblxuICAgIGlmICghdGhpcy5zdGFydERhdGUuaXNTYW1lKHRoaXMuX29sZC5zdGFydCkgfHwgIXRoaXMuZW5kRGF0ZS5pc1NhbWUodGhpcy5fb2xkLmVuZCkpIHtcbiAgICAgIC8vIHRoaXMuY2FsbGJhY2sodGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZSwgdGhpcy5jaG9zZW5MYWJlbCk7XG4gICAgfVxuXG4gICAgLy8gaWYgcGlja2VyIGlzIGF0dGFjaGVkIHRvIGEgdGV4dCBpbnB1dCwgdXBkYXRlIGl0XG4gICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG4gICAgdGhpcy5pc1Nob3duID0gZmFsc2U7XG4gICAgdGhpcy5fcmVmLmRldGVjdENoYW5nZXMoKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIGhhbmRsZSBjbGljayBvbiBhbGwgZWxlbWVudCBpbiB0aGUgY29tcG9uZW50LCB1c2VmdWxsIGZvciBvdXRzaWRlIG9mIGNsaWNrXG4gICAqIEBwYXJhbSBlIGV2ZW50XG4gICAqL1xuICBoYW5kbGVJbnRlcm5hbENsaWNrKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG4gIC8qKlxuICAgKiB1cGRhdGUgdGhlIGxvY2FsZSBvcHRpb25zXG4gICAqIEBwYXJhbSBsb2NhbGVcbiAgICovXG4gIHVwZGF0ZUxvY2FsZShsb2NhbGUpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbGUpIHtcbiAgICAgIGlmIChsb2NhbGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB0aGlzLmxvY2FsZVtrZXldID0gbG9jYWxlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiAgY2xlYXIgdGhlIGRhdGVyYW5nZSBwaWNrZXJcbiAgICovXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuc3RhcnREYXRlID0gbW9tZW50KCkuc3RhcnRPZignZGF5Jyk7XG4gICAgdGhpcy5lbmREYXRlID0gbW9tZW50KCkuZW5kT2YoJ2RheScpO1xuICAgIHRoaXMuY2hvb3NlZERhdGUuZW1pdCh7IGNob3NlbkxhYmVsOiAnJywgc3RhcnREYXRlOiBudWxsLCBlbmREYXRlOiBudWxsIH0pO1xuICAgIHRoaXMuZGF0ZXNVcGRhdGVkLmVtaXQoeyBzdGFydERhdGU6IG51bGwsIGVuZERhdGU6IG51bGwgfSk7XG4gICAgdGhpcy5oaWRlKCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBvdXQgaWYgdGhlIHNlbGVjdGVkIHJhbmdlIHNob3VsZCBiZSBkaXNhYmxlZCBpZiBpdCBkb2Vzbid0XG4gICAqIGZpdCBpbnRvIG1pbkRhdGUgYW5kIG1heERhdGUgbGltaXRhdGlvbnMuXG4gICAqL1xuICBkaXNhYmxlUmFuZ2UocmFuZ2UpIHtcbiAgICBpZiAocmFuZ2UgPT09IHRoaXMubG9jYWxlLmN1c3RvbVJhbmdlTGFiZWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2VNYXJrZXJzID0gdGhpcy5yYW5nZXNbcmFuZ2VdO1xuICAgIGNvbnN0IGFyZUJvdGhCZWZvcmUgPSByYW5nZU1hcmtlcnMuZXZlcnkoZGF0ZSA9PiB7XG4gICAgICBpZiAoIXRoaXMubWluRGF0ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0ZS5pc0JlZm9yZSh0aGlzLm1pbkRhdGUpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYXJlQm90aEFmdGVyID0gcmFuZ2VNYXJrZXJzLmV2ZXJ5KGRhdGUgPT4ge1xuICAgICAgaWYgKCF0aGlzLm1heERhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGUuaXNBZnRlcih0aGlzLm1heERhdGUpO1xuICAgIH0pO1xuICAgIHJldHVybiAoYXJlQm90aEJlZm9yZSB8fCBhcmVCb3RoQWZ0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIGFkZCB0aW1lXG4gICAqIEBwYXJhbSBzaWRlIGxlZnQgb3IgcmlnaHRcbiAgICovXG4gIHByaXZhdGUgX2dldERhdGVXaXRoVGltZShkYXRlLCBzaWRlOiBTaWRlRW51bSk6IG1vbWVudC5Nb21lbnQge1xuICAgIGxldCBob3VyID0gcGFyc2VJbnQodGhpcy50aW1lcGlja2VyVmFyaWFibGVzW3NpZGVdLnNlbGVjdGVkSG91ciwgMTApO1xuICAgIGlmICghdGhpcy50aW1lUGlja2VyMjRIb3VyKSB7XG4gICAgICBjb25zdCBhbXBtID0gdGhpcy50aW1lcGlja2VyVmFyaWFibGVzW3NpZGVdLmFtcG1Nb2RlbDtcbiAgICAgIGlmIChhbXBtID09PSAnUE0nICYmIGhvdXIgPCAxMikge1xuICAgICAgICBob3VyICs9IDEyO1xuICAgICAgfVxuICAgICAgaWYgKGFtcG0gPT09ICdBTScgJiYgaG91ciA9PT0gMTIpIHtcbiAgICAgICAgaG91ciA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KHRoaXMudGltZXBpY2tlclZhcmlhYmxlc1tzaWRlXS5zZWxlY3RlZE1pbnV0ZSwgMTApO1xuICAgIGNvbnN0IHNlY29uZCA9IHRoaXMudGltZVBpY2tlclNlY29uZHMgPyBwYXJzZUludCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXNbc2lkZV0uc2VsZWN0ZWRTZWNvbmQsIDEwKSA6IDA7XG4gICAgcmV0dXJuIGRhdGUuY2xvbmUoKS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICB9XG4gIC8qKlxuICAgKiAgYnVpbGQgdGhlIGxvY2FsZSBjb25maWdcbiAgICovXG4gIHByaXZhdGUgX2J1aWxkTG9jYWxlKCkge1xuICAgIGlmICghdGhpcy5sb2NhbGUuZm9ybWF0KSB7XG4gICAgICBpZiAodGhpcy50aW1lUGlja2VyKSB7XG4gICAgICAgIHRoaXMubG9jYWxlLmZvcm1hdCA9IG1vbWVudC5sb2NhbGVEYXRhKCkubG9uZ0RhdGVGb3JtYXQoJ2xsbCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2NhbGUuZm9ybWF0ID0gbW9tZW50LmxvY2FsZURhdGEoKS5sb25nRGF0ZUZvcm1hdCgnTCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIF9idWlsZENlbGxzKGNhbGVuZGFyLCBzaWRlOiBTaWRlRW51bSkge1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IDY7IHJvdysrKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyVmFyaWFibGVzW3NpZGVdLmNsYXNzZXNbcm93XSA9IHt9O1xuICAgICAgY29uc3Qgcm93Q2xhc3NlcyA9IFtdO1xuICAgICAgaWYgKHRoaXMuZW1wdHlXZWVrUm93Q2xhc3MgJiYgIXRoaXMuaGFzQ3VycmVudE1vbnRoRGF5cyh0aGlzLmNhbGVuZGFyVmFyaWFibGVzW3NpZGVdLm1vbnRoLCBjYWxlbmRhcltyb3ddKSkge1xuICAgICAgICByb3dDbGFzc2VzLnB1c2godGhpcy5lbXB0eVdlZWtSb3dDbGFzcyk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCA3OyBjb2wrKykge1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gW107XG4gICAgICAgIC8vIGhpZ2hsaWdodCB0b2RheSdzIGRhdGVcbiAgICAgICAgaWYgKGNhbGVuZGFyW3Jvd11bY29sXS5pc1NhbWUobmV3IERhdGUoKSwgJ2RheScpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCd0b2RheScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhpZ2hsaWdodCB3ZWVrZW5kc1xuICAgICAgICBpZiAoY2FsZW5kYXJbcm93XVtjb2xdLmlzb1dlZWtkYXkoKSA+IDUpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ3dlZWtlbmQnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBncmV5IG91dCB0aGUgZGF0ZXMgaW4gb3RoZXIgbW9udGhzIGRpc3BsYXllZCBhdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGlzIGNhbGVuZGFyXG4gICAgICAgIGlmIChjYWxlbmRhcltyb3ddW2NvbF0ubW9udGgoKSAhPT0gY2FsZW5kYXJbMV1bMV0ubW9udGgoKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnb2ZmJyk7XG5cbiAgICAgICAgICAvLyBtYXJrIHRoZSBsYXN0IGRheSBvZiB0aGUgcHJldmlvdXMgbW9udGggaW4gdGhpcyBjYWxlbmRhclxuICAgICAgICAgIGlmICh0aGlzLmxhc3REYXlPZlByZXZpb3VzTW9udGhDbGFzcyAmJiAoY2FsZW5kYXJbcm93XVtjb2xdLm1vbnRoKCkgPCBjYWxlbmRhclsxXVsxXS5tb250aCgpIHx8IGNhbGVuZGFyWzFdWzFdLm1vbnRoKCkgPT09IDApICYmIGNhbGVuZGFyW3Jvd11bY29sXS5kYXRlKCkgPT09IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXNbc2lkZV0uZGF5c0luTGFzdE1vbnRoKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5sYXN0RGF5T2ZQcmV2aW91c01vbnRoQ2xhc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG1hcmsgdGhlIGZpcnN0IGRheSBvZiB0aGUgbmV4dCBtb250aCBpbiB0aGlzIGNhbGVuZGFyXG4gICAgICAgICAgaWYgKHRoaXMuZmlyc3REYXlPZk5leHRNb250aENsYXNzICYmIChjYWxlbmRhcltyb3ddW2NvbF0ubW9udGgoKSA+IGNhbGVuZGFyWzFdWzFdLm1vbnRoKCkgfHwgY2FsZW5kYXJbcm93XVtjb2xdLm1vbnRoKCkgPT09IDApICYmIGNhbGVuZGFyW3Jvd11bY29sXS5kYXRlKCkgPT09IDEpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmZpcnN0RGF5T2ZOZXh0TW9udGhDbGFzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG1hcmsgdGhlIGZpcnN0IGRheSBvZiB0aGUgY3VycmVudCBtb250aCB3aXRoIGEgY3VzdG9tIGNsYXNzXG4gICAgICAgIGlmICh0aGlzLmZpcnN0TW9udGhEYXlDbGFzcyAmJiBjYWxlbmRhcltyb3ddW2NvbF0ubW9udGgoKSA9PT0gY2FsZW5kYXJbMV1bMV0ubW9udGgoKSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uZGF0ZSgpID09PSBjYWxlbmRhci5maXJzdERheS5kYXRlKCkpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5maXJzdE1vbnRoRGF5Q2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG1hcmsgdGhlIGxhc3QgZGF5IG9mIHRoZSBjdXJyZW50IG1vbnRoIHdpdGggYSBjdXN0b20gY2xhc3NcbiAgICAgICAgaWYgKHRoaXMubGFzdE1vbnRoRGF5Q2xhc3MgJiYgY2FsZW5kYXJbcm93XVtjb2xdLm1vbnRoKCkgPT09IGNhbGVuZGFyWzFdWzFdLm1vbnRoKCkgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmRhdGUoKSA9PT0gY2FsZW5kYXIubGFzdERheS5kYXRlKCkpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5sYXN0TW9udGhEYXlDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZG9uJ3QgYWxsb3cgc2VsZWN0aW9uIG9mIGRhdGVzIGJlZm9yZSB0aGUgbWluaW11bSBkYXRlXG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQmVmb3JlKHRoaXMubWluRGF0ZSwgJ2RheScpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdvZmYnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkb24ndCBhbGxvdyBzZWxlY3Rpb24gb2YgZGF0ZXMgYWZ0ZXIgdGhlIG1heGltdW0gZGF0ZVxuICAgICAgICBpZiAodGhpcy5jYWxlbmRhclZhcmlhYmxlc1tzaWRlXS5tYXhEYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5pc0FmdGVyKHRoaXMuY2FsZW5kYXJWYXJpYWJsZXNbc2lkZV0ubWF4RGF0ZSwgJ2RheScpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdvZmYnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkb24ndCBhbGxvdyBzZWxlY3Rpb24gb2YgZGF0ZSBpZiBhIGN1c3RvbSBmdW5jdGlvbiBkZWNpZGVzIGl0J3MgaW52YWxpZFxuICAgICAgICBpZiAodGhpcy5pc0ludmFsaWREYXRlKGNhbGVuZGFyW3Jvd11bY29sXSkpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ29mZicsICdkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhpZ2hsaWdodCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN0YXJ0IGRhdGVcbiAgICAgICAgaWYgKHRoaXMuc3RhcnREYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gdGhpcy5zdGFydERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2FjdGl2ZScsICdzdGFydC1kYXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGlnaGxpZ2h0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZW5kIGRhdGVcbiAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSAhPT0gbnVsbCAmJiBjYWxlbmRhcltyb3ddW2NvbF0uZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IHRoaXMuZW5kRGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnYWN0aXZlJywgJ2VuZC1kYXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGlnaGxpZ2h0IGRhdGVzIGluLWJldHdlZW4gdGhlIHNlbGVjdGVkIGRhdGVzXG4gICAgICAgIGlmICh0aGlzLmVuZERhdGUgIT09IG51bGwgJiYgY2FsZW5kYXJbcm93XVtjb2xdID4gdGhpcy5zdGFydERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdIDwgdGhpcy5lbmREYXRlKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpbi1yYW5nZScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFwcGx5IGN1c3RvbSBjbGFzc2VzIGZvciB0aGlzIGRhdGVcbiAgICAgICAgY29uc3QgaXNDdXN0b20gPSB0aGlzLmlzQ3VzdG9tRGF0ZShjYWxlbmRhcltyb3ddW2NvbF0pO1xuICAgICAgICBpZiAoaXNDdXN0b20gIT09IGZhbHNlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBpc0N1c3RvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaChpc0N1c3RvbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGNsYXNzZXMsIGlzQ3VzdG9tKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RvcmUgY2xhc3NlcyB2YXJcbiAgICAgICAgbGV0IGNuYW1lID0gJyc7XG4gICAgICAgIGxldCBkaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjbmFtZSArPSBjbGFzc2VzW2ldICsgJyAnO1xuICAgICAgICAgIGlmIChjbGFzc2VzW2ldID09PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgICBjbmFtZSArPSAnYXZhaWxhYmxlJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGVuZGFyVmFyaWFibGVzW3NpZGVdLmNsYXNzZXNbcm93XVtjb2xdID0gY25hbWUucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxlbmRhclZhcmlhYmxlc1tzaWRlXS5jbGFzc2VzW3Jvd10uY2xhc3NMaXN0ID0gcm93Q2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgb3V0IGlmIHRoZSBjdXJyZW50IGNhbGVuZGFyIHJvdyBoYXMgY3VycmVudCBtb250aCBkYXlzXG4gICAqIChhcyBvcHBvc2VkIHRvIGNvbnNpc3Rpbmcgb2Ygb25seSBwcmV2aW91cy9uZXh0IG1vbnRoIGRheXMpXG4gICAqL1xuICBoYXNDdXJyZW50TW9udGhEYXlzKGN1cnJlbnRNb250aCwgcm93KSB7XG4gICAgZm9yIChsZXQgZGF5ID0gMDsgZGF5IDwgNzsgZGF5KyspIHtcbiAgICAgIGlmIChyb3dbZGF5XS5tb250aCgpID09PSBjdXJyZW50TW9udGgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1kLWRycHBpY2tlclwiICNwaWNrZXJDb250YWluZXIgW25nQ2xhc3NdPVwie1xuICAgIGx0cjogbG9jYWxlLmRpcmVjdGlvbiA9PT0gJ2x0cicsXG4gICAgcnRsOiB0aGlzLmxvY2FsZS5kaXJlY3Rpb24gPT09ICdydGwnLFxuICAgICdzaG93bic6IGlzU2hvd24gfHwgaW5saW5lLFxuICAgICdoaWRkZW4nOiAhaXNTaG93biAmJiAhaW5saW5lLFxuICAgICdpbmxpbmUnOiBpbmxpbmUsXG4gICAgJ2RvdWJsZSc6ICAhc2luZ2xlRGF0ZVBpY2tlciAmJiBzaG93Q2FsSW5SYW5nZXMsXG4gICAgJ3Nob3ctcmFuZ2VzJzogcmFuZ2VzQXJyYXkubGVuZ3RoXG59XCIgW2NsYXNzXT1cIidkcm9wcy0nICsgZHJvcHMgKyAnLScgKyBvcGVuc1wiPlxuICA8ZGl2IGNsYXNzPVwicmFuZ2VzXCI+XG4gICAgPHVsPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCByYW5nZSBvZiByYW5nZXNBcnJheVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xpY2tSYW5nZSgkZXZlbnQsIHJhbmdlKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlUmFuZ2UocmFuZ2UpXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IHJhbmdlID09PSBjaG9zZW5SYW5nZX1cIj57e3JhbmdlIHwgb1RyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXJcIiBbbmdDbGFzc109XCJ7cmlnaHQ6IHNpbmdsZURhdGVQaWNrZXIsIGxlZnQ6ICFzaW5nbGVEYXRlUGlja2VyfVwiICpuZ0lmPVwic2hvd0NhbEluUmFuZ2VzXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXRhYmxlXCI+XG4gICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZS1jb25kZW5zZWRcIiAqbmdJZj1cImNhbGVuZGFyVmFyaWFibGVzXCIgYXJpYS1kZXNjcmliZWRieT1cImNhbGVuZGFyIGRheXMgdGFibGVcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiICpuZ0lmPVwic2hvd1dlZWtOdW1iZXJzIHx8IHNob3dJU09XZWVrTnVtYmVyc1wiPjwvdGg+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWNhbGVuZGFyVmFyaWFibGVzLmxlZnQubWluRGF0ZSB8fCBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0Lm1pbkRhdGUuaXNCZWZvcmUoY2FsZW5kYXJWYXJpYWJsZXMubGVmdC5jYWxlbmRhci5maXJzdERheSkgJiYgKCF0aGlzLmxpbmtlZENhbGVuZGFycyB8fCB0cnVlKVwiPlxuICAgICAgICAgICAgICA8dGggKGNsaWNrKT1cImNsaWNrUHJldihzaWRlRW51bS5sZWZ0KVwiIGNsYXNzPVwicHJldiBhdmFpbGFibGVcIj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdJZj1cIiEoIWNhbGVuZGFyVmFyaWFibGVzLmxlZnQubWluRGF0ZSB8fCBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0Lm1pbkRhdGUuaXNCZWZvcmUoY2FsZW5kYXJWYXJpYWJsZXMubGVmdC5jYWxlbmRhci5maXJzdERheSkgJiYgKCF0aGlzLmxpbmtlZENhbGVuZGFycyB8fCB0cnVlKSlcIj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgY29sc3Bhbj1cIjVcIiBjbGFzcz1cIm1vbnRoIGRycC1hbmltYXRlXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RHJvcGRvd25zICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQuZHJvcGRvd25zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duc1wiPlxuICAgICAgICAgICAgICAgICAge3t0aGlzLmxvY2FsZS5tb250aE5hbWVzW2NhbGVuZGFyVmFyaWFibGVzPy5sZWZ0Py5jYWxlbmRhclsxXVsxXS5tb250aCgpXX19XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwibW9udGhzZWxlY3RcIiAoY2hhbmdlKT1cIm1vbnRoQ2hhbmdlZCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiKGNhbGVuZGFyVmFyaWFibGVzLmxlZnQuZHJvcGRvd25zLmluTWluWWVhciAmJiBtIDwgY2FsZW5kYXJWYXJpYWJsZXMubGVmdC5taW5EYXRlLm1vbnRoKCkpIHx8IChjYWxlbmRhclZhcmlhYmxlcy5sZWZ0LmRyb3Bkb3ducy5pbk1heFllYXIgJiYgbSA+IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQubWF4RGF0ZS5tb250aCgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG0gb2YgY2FsZW5kYXJWYXJpYWJsZXMubGVmdC5kcm9wZG93bnMubW9udGhBcnJheXNcIiBbdmFsdWVdPVwibVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImNhbGVuZGFyVmFyaWFibGVzLmxlZnQuZHJvcGRvd25zLmN1cnJlbnRNb250aCA9PSBtXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3tsb2NhbGUubW9udGhOYW1lc1ttXX19XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duc1wiPlxuICAgICAgICAgICAgICAgICAge3sgY2FsZW5kYXJWYXJpYWJsZXM/LmxlZnQ/LmNhbGVuZGFyWzFdWzFdLmZvcm1hdChcIiBZWVlZXCIpfX1cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJ5ZWFyc2VsZWN0XCIgKGNoYW5nZSk9XCJ5ZWFyQ2hhbmdlZCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHkgb2YgY2FsZW5kYXJWYXJpYWJsZXMubGVmdC5kcm9wZG93bnMueWVhckFycmF5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cInkgPT09IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQuZHJvcGRvd25zLmN1cnJlbnRZZWFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3t5fX1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvd0Ryb3Bkb3ducyB8fCAhY2FsZW5kYXJWYXJpYWJsZXMubGVmdC5kcm9wZG93bnNcIj5cbiAgICAgICAgICAgICAgICB7e3RoaXMubG9jYWxlLm1vbnRoTmFtZXNbY2FsZW5kYXJWYXJpYWJsZXM/LmxlZnQ/LmNhbGVuZGFyWzFdWzFdLm1vbnRoKCldfX0ge3sgY2FsZW5kYXJWYXJpYWJsZXM/LmxlZnQ/LmNhbGVuZGFyWzFdWzFdLmZvcm1hdChcIlxuICAgICAgICAgICAgICAgIFlZWVlcIil9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiKCFjYWxlbmRhclZhcmlhYmxlcy5sZWZ0Lm1heERhdGUgfHwgY2FsZW5kYXJWYXJpYWJsZXMubGVmdC5tYXhEYXRlLmlzQWZ0ZXIoY2FsZW5kYXJWYXJpYWJsZXMubGVmdC5jYWxlbmRhci5sYXN0RGF5KSkgJiYgKCFsaW5rZWRDYWxlbmRhcnMgfHwgc2luZ2xlRGF0ZVBpY2tlciApXCI+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIGNsYXNzPVwibmV4dCBhdmFpbGFibGVcIiAoY2xpY2spPVwiY2xpY2tOZXh0KHNpZGVFbnVtLmxlZnQpXCI+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhKCghY2FsZW5kYXJWYXJpYWJsZXMubGVmdC5tYXhEYXRlIHx8IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQubWF4RGF0ZS5pc0FmdGVyKGNhbGVuZGFyVmFyaWFibGVzLmxlZnQuY2FsZW5kYXIubGFzdERheSkpICYmICghbGlua2VkQ2FsZW5kYXJzIHx8IHNpbmdsZURhdGVQaWNrZXIgKSlcIj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPHRyIGNsYXNzPSd3ZWVrLWRheXMnPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgKm5nSWY9XCJzaG93V2Vla051bWJlcnMgfHwgc2hvd0lTT1dlZWtOdW1iZXJzXCIgY2xhc3M9XCJ3ZWVrXCI+PHNwYW4+e3t0aGlzLmxvY2FsZS53ZWVrTGFiZWx9fTwvc3Bhbj48L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgKm5nRm9yPVwibGV0IGRheW9md2VlayBvZiBhZGp1c3RlZERheXNPZldlZWtcIj48c3Bhbj57e2RheW9md2Vla319PC9zcGFuPjwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5IGNsYXNzPVwiZHJwLWFuaW1hdGVcIj5cbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0LmNhbFJvd3NcIiBbY2xhc3NdPVwiY2FsZW5kYXJWYXJpYWJsZXMubGVmdC5jbGFzc2VzW3Jvd10uY2xhc3NMaXN0XCI+XG4gICAgICAgICAgICA8IS0tIGFkZCB3ZWVrIG51bWJlciAtLT5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndlZWtcIiAqbmdJZj1cInNob3dXZWVrTnVtYmVyc1wiPlxuICAgICAgICAgICAgICA8c3Bhbj57e2NhbGVuZGFyVmFyaWFibGVzLmxlZnQuY2FsZW5kYXJbcm93XVswXS53ZWVrKCl9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ3ZWVrXCIgKm5nSWY9XCJzaG93SVNPV2Vla051bWJlcnNcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3tjYWxlbmRhclZhcmlhYmxlcy5sZWZ0LmNhbGVuZGFyW3Jvd11bMF0uaXNvV2VlaygpfX08L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPCEtLSBjYWwgLS0+XG4gICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbCBvZiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0LmNhbENvbHNcIiBbY2xhc3NdPVwiY2FsZW5kYXJWYXJpYWJsZXMubGVmdC5jbGFzc2VzW3Jvd11bY29sXVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0RhdGUoJGV2ZW50LCBzaWRlRW51bS5sZWZ0LCByb3csIGNvbClcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3tjYWxlbmRhclZhcmlhYmxlcy5sZWZ0LmNhbGVuZGFyW3Jvd11bY29sXS5kYXRlKCl9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXRpbWVcIiAqbmdJZj1cInRpbWVQaWNrZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cbiAgICAgICAgPHNlbGVjdCBjbGFzcz1cImhvdXJzZWxlY3Qgc2VsZWN0LWl0ZW1cIiBbZGlzYWJsZWRdPVwiIWVuZERhdGVcIiBbKG5nTW9kZWwpXT1cInRpbWVwaWNrZXJWYXJpYWJsZXMubGVmdC5zZWxlY3RlZEhvdXJcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRpbWVDaGFuZ2VkKCRldmVudCwgc2lkZUVudW0ubGVmdClcIj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpIG9mIHRpbWVwaWNrZXJWYXJpYWJsZXMubGVmdC5ob3Vyc1wiIFt2YWx1ZV09XCJpXCIgW2Rpc2FibGVkXT1cInRpbWVwaWNrZXJWYXJpYWJsZXMubGVmdC5kaXNhYmxlZEhvdXJzLmluZGV4T2YoaSkgPiAtMVwiPlxuICAgICAgICAgICAge3tpfX08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cbiAgICAgICAgPHNlbGVjdCBjbGFzcz1cInNlbGVjdC1pdGVtIG1pbnV0ZXNlbGVjdFwiIFtkaXNhYmxlZF09XCIhZW5kRGF0ZVwiIFsobmdNb2RlbCldPVwidGltZXBpY2tlclZhcmlhYmxlcy5sZWZ0LnNlbGVjdGVkTWludXRlXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0aW1lQ2hhbmdlZCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQpXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaSBvZiB0aW1lcGlja2VyVmFyaWFibGVzLmxlZnQubWludXRlczsgbGV0IGluZGV4ID0gaW5kZXg7XCIgW3ZhbHVlXT1cImlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRpbWVwaWNrZXJWYXJpYWJsZXMubGVmdC5kaXNhYmxlZE1pbnV0ZXMuaW5kZXhPZihpKSA+IC0xXCI+e3t0aW1lcGlja2VyVmFyaWFibGVzLmxlZnQubWludXRlc0xhYmVsW2luZGV4XX19PC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC1oaWdobGlnaHRcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWJhclwiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdFwiPlxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwic2VsZWN0LWl0ZW0gc2Vjb25kc2VsZWN0XCIgKm5nSWY9XCJ0aW1lUGlja2VyU2Vjb25kc1wiIFtkaXNhYmxlZF09XCIhZW5kRGF0ZVwiIFsobmdNb2RlbCldPVwidGltZXBpY2tlclZhcmlhYmxlcy5sZWZ0LnNlbGVjdGVkU2Vjb25kXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0aW1lQ2hhbmdlZCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQpXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaSBvZiB0aW1lcGlja2VyVmFyaWFibGVzLmxlZnQuc2Vjb25kczsgbGV0IGluZGV4ID0gaW5kZXg7XCIgW3ZhbHVlXT1cImlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRpbWVwaWNrZXJWYXJpYWJsZXMubGVmdC5kaXNhYmxlZFNlY29uZHMuaW5kZXhPZihpKSA+IC0xXCI+e3t0aW1lcGlja2VyVmFyaWFibGVzLmxlZnQuc2Vjb25kc0xhYmVsW2luZGV4XX19PC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC1oaWdobGlnaHRcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWJhclwiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdFwiPlxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwic2VsZWN0LWl0ZW0gYW1wbXNlbGVjdFwiICpuZ0lmPVwiIXRpbWVQaWNrZXIyNEhvdXJcIiBbKG5nTW9kZWwpXT1cInRpbWVwaWNrZXJWYXJpYWJsZXMubGVmdC5hbXBtTW9kZWxcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRpbWVDaGFuZ2VkKCRldmVudCwgc2lkZUVudW0ubGVmdClcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQU1cIiBbZGlzYWJsZWRdPVwidGltZXBpY2tlclZhcmlhYmxlcy5sZWZ0LmFtRGlzYWJsZWRcIj5BTTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJQTVwiIFtkaXNhYmxlZF09XCJ0aW1lcGlja2VyVmFyaWFibGVzLmxlZnQucG1EaXNhYmxlZFwiPlBNPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC1oaWdobGlnaHRcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWJhclwiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNhbGVuZGFyIHJpZ2h0XCIgKm5nSWY9XCJzaG93Q2FsSW5SYW5nZXMgJiYgIXNpbmdsZURhdGVQaWNrZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItdGFibGVcIj5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlLWNvbmRlbnNlZFwiICpuZ0lmPVwiY2FsZW5kYXJWYXJpYWJsZXNcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiY2FsZW5kYXIgZGF5cyB0YWJsZVwiPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgKm5nSWY9XCJzaG93V2Vla051bWJlcnMgfHwgc2hvd0lTT1dlZWtOdW1iZXJzXCI+PC90aD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCIoIWNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0Lm1pbkRhdGUgfHwgY2FsZW5kYXJWYXJpYWJsZXMucmlnaHQubWluRGF0ZS5pc0JlZm9yZShjYWxlbmRhclZhcmlhYmxlcy5yaWdodC5jYWxlbmRhci5maXJzdERheSkpICYmICghdGhpcy5saW5rZWRDYWxlbmRhcnMpXCI+XG4gICAgICAgICAgICAgIDx0aCAoY2xpY2spPVwiY2xpY2tQcmV2KHNpZGVFbnVtLnJpZ2h0KVwiIGNsYXNzPVwicHJldiBhdmFpbGFibGVcIj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdJZj1cIiEoKCFjYWxlbmRhclZhcmlhYmxlcy5yaWdodC5taW5EYXRlIHx8IGNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0Lm1pbkRhdGUuaXNCZWZvcmUoY2FsZW5kYXJWYXJpYWJsZXMucmlnaHQuY2FsZW5kYXIuZmlyc3REYXkpKSAmJiAoIXRoaXMubGlua2VkQ2FsZW5kYXJzKSlcIj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgY29sc3Bhbj1cIjVcIiBjbGFzcz1cIm1vbnRoXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RHJvcGRvd25zICYmIGNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0LmRyb3Bkb3duc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bnNcIj5cbiAgICAgICAgICAgICAgICAgIHt7dGhpcy5sb2NhbGUubW9udGhOYW1lc1tjYWxlbmRhclZhcmlhYmxlcz8ucmlnaHQ/LmNhbGVuZGFyWzFdWzFdLm1vbnRoKCldfX1cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJtb250aHNlbGVjdFwiIChjaGFuZ2UpPVwibW9udGhDaGFuZ2VkKCRldmVudCwgc2lkZUVudW0ucmlnaHQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiKGNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0LmRyb3Bkb3ducy5pbk1pblllYXIgJiYgbSA8IGNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0Lm1pbkRhdGUubW9udGgoKSkgfHwgKGNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0LmRyb3Bkb3ducy5pbk1heFllYXIgJiYgbSA+IGNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0Lm1heERhdGUubW9udGgoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtIG9mIGNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0LmRyb3Bkb3ducy5tb250aEFycmF5c1wiIFt2YWx1ZV09XCJtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY2FsZW5kYXJWYXJpYWJsZXMucmlnaHQuZHJvcGRvd25zLmN1cnJlbnRNb250aCA9PSBtXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3tsb2NhbGUubW9udGhOYW1lc1ttXX19XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duc1wiPlxuICAgICAgICAgICAgICAgICAge3sgY2FsZW5kYXJWYXJpYWJsZXM/LnJpZ2h0Py5jYWxlbmRhclsxXVsxXS5mb3JtYXQoXCIgWVlZWVwiKX19XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwieWVhcnNlbGVjdFwiIChjaGFuZ2UpPVwieWVhckNoYW5nZWQoJGV2ZW50LCBzaWRlRW51bS5yaWdodClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgeSBvZiBjYWxlbmRhclZhcmlhYmxlcy5yaWdodC5kcm9wZG93bnMueWVhckFycmF5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cInkgPT09IGNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0LmRyb3Bkb3ducy5jdXJyZW50WWVhclwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7eX19XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3dEcm9wZG93bnMgfHwgIWNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0LmRyb3Bkb3duc1wiPlxuICAgICAgICAgICAgICAgIHt7dGhpcy5sb2NhbGUubW9udGhOYW1lc1tjYWxlbmRhclZhcmlhYmxlcz8ucmlnaHQ/LmNhbGVuZGFyWzFdWzFdLm1vbnRoKCldfX0ge3sgY2FsZW5kYXJWYXJpYWJsZXM/LnJpZ2h0Py5jYWxlbmRhclsxXVsxXS5mb3JtYXQoXCJcbiAgICAgICAgICAgICAgICBZWVlZXCIpfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdJZj1cIiFjYWxlbmRhclZhcmlhYmxlcy5yaWdodC5tYXhEYXRlIHx8IGNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0Lm1heERhdGUuaXNBZnRlcihjYWxlbmRhclZhcmlhYmxlcy5yaWdodC5jYWxlbmRhci5sYXN0RGF5KSAmJiAoIWxpbmtlZENhbGVuZGFycyB8fCBzaW5nbGVEYXRlUGlja2VyIHx8IHRydWUpXCI+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIGNsYXNzPVwibmV4dCBhdmFpbGFibGVcIiAoY2xpY2spPVwiY2xpY2tOZXh0KHNpZGVFbnVtLnJpZ2h0KVwiPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiISghY2FsZW5kYXJWYXJpYWJsZXMucmlnaHQubWF4RGF0ZSB8fCBjYWxlbmRhclZhcmlhYmxlcy5yaWdodC5tYXhEYXRlLmlzQWZ0ZXIoY2FsZW5kYXJWYXJpYWJsZXMucmlnaHQuY2FsZW5kYXIubGFzdERheSkgJiYgKCFsaW5rZWRDYWxlbmRhcnMgfHwgc2luZ2xlRGF0ZVBpY2tlciB8fCB0cnVlKSlcIj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiAqbmdJZj1cInNob3dXZWVrTnVtYmVycyB8fCBzaG93SVNPV2Vla051bWJlcnNcIiBjbGFzcz1cIndlZWtcIj48c3Bhbj57e3RoaXMubG9jYWxlLndlZWtMYWJlbH19PC9zcGFuPjwvdGg+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiAqbmdGb3I9XCJsZXQgZGF5b2Z3ZWVrIG9mIGxvY2FsZS5kYXlzT2ZXZWVrXCI+PHNwYW4+e3tkYXlvZndlZWt9fTwvc3Bhbj48L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBjYWxlbmRhclZhcmlhYmxlcy5yaWdodC5jYWxSb3dzXCIgW2NsYXNzXT1cImNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0LmNsYXNzZXNbcm93XS5jbGFzc0xpc3RcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndlZWtcIiAqbmdJZj1cInNob3dXZWVrTnVtYmVyc1wiPlxuICAgICAgICAgICAgICA8c3Bhbj57e2NhbGVuZGFyVmFyaWFibGVzLnJpZ2h0LmNhbGVuZGFyW3Jvd11bMF0ud2VlaygpfX08L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwid2Vla1wiICpuZ0lmPVwic2hvd0lTT1dlZWtOdW1iZXJzXCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7Y2FsZW5kYXJWYXJpYWJsZXMucmlnaHQuY2FsZW5kYXJbcm93XVswXS5pc29XZWVrKCl9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbCBvZiBjYWxlbmRhclZhcmlhYmxlcy5yaWdodC5jYWxDb2xzXCIgW2NsYXNzXT1cImNhbGVuZGFyVmFyaWFibGVzLnJpZ2h0LmNsYXNzZXNbcm93XVtjb2xdXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrRGF0ZSgkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0LCByb3csIGNvbClcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3tjYWxlbmRhclZhcmlhYmxlcy5yaWdodC5jYWxlbmRhcltyb3ddW2NvbF0uZGF0ZSgpfX08L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci10aW1lXCIgKm5nSWY9XCJ0aW1lUGlja2VyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0XCI+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3QtaXRlbSBob3Vyc2VsZWN0XCIgW2Rpc2FibGVkXT1cIiFlbmREYXRlXCIgWyhuZ01vZGVsKV09XCJ0aW1lcGlja2VyVmFyaWFibGVzLnJpZ2h0LnNlbGVjdGVkSG91clwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidGltZUNoYW5nZWQoJGV2ZW50LCBzaWRlRW51bS5yaWdodClcIj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpIG9mIHRpbWVwaWNrZXJWYXJpYWJsZXMucmlnaHQuaG91cnNcIiBbdmFsdWVdPVwiaVwiIFtkaXNhYmxlZF09XCJ0aW1lcGlja2VyVmFyaWFibGVzLnJpZ2h0LmRpc2FibGVkSG91cnMuaW5kZXhPZihpKSA+IC0xXCI+XG4gICAgICAgICAgICB7e2l9fTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtaGlnaGxpZ2h0XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC1iYXJcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cbiAgICAgICAgPHNlbGVjdCBjbGFzcz1cInNlbGVjdC1pdGVtIG1pbnV0ZXNlbGVjdFwiIFtkaXNhYmxlZF09XCIhZW5kRGF0ZVwiIFsobmdNb2RlbCldPVwidGltZXBpY2tlclZhcmlhYmxlcy5yaWdodC5zZWxlY3RlZE1pbnV0ZVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidGltZUNoYW5nZWQoJGV2ZW50LCBzaWRlRW51bS5yaWdodClcIj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpIG9mIHRpbWVwaWNrZXJWYXJpYWJsZXMucmlnaHQubWludXRlczsgbGV0IGluZGV4ID0gaW5kZXg7XCIgW3ZhbHVlXT1cImlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRpbWVwaWNrZXJWYXJpYWJsZXMucmlnaHQuZGlzYWJsZWRNaW51dGVzLmluZGV4T2YoaSkgPiAtMVwiPnt7dGltZXBpY2tlclZhcmlhYmxlcy5yaWdodC5taW51dGVzTGFiZWxbaW5kZXhdfX08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWhpZ2hsaWdodFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtYmFyXCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0XCI+XG4gICAgICAgIDxzZWxlY3QgKm5nSWY9XCJ0aW1lUGlja2VyU2Vjb25kc1wiIGNsYXNzPVwic2VsZWN0LWl0ZW0gc2Vjb25kc2VsZWN0XCIgW2Rpc2FibGVkXT1cIiFlbmREYXRlXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInRpbWVwaWNrZXJWYXJpYWJsZXMucmlnaHQuc2VsZWN0ZWRTZWNvbmRcIiAobmdNb2RlbENoYW5nZSk9XCJ0aW1lQ2hhbmdlZCgkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0KVwiPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGkgb2YgdGltZXBpY2tlclZhcmlhYmxlcy5yaWdodC5zZWNvbmRzOyBsZXQgaW5kZXggPSBpbmRleDtcIiBbdmFsdWVdPVwiaVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidGltZXBpY2tlclZhcmlhYmxlcy5yaWdodC5kaXNhYmxlZFNlY29uZHMuaW5kZXhPZihpKSA+IC0xXCI+e3t0aW1lcGlja2VyVmFyaWFibGVzLnJpZ2h0LnNlY29uZHNMYWJlbFtpbmRleF19fTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtaGlnaGxpZ2h0XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC1iYXJcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cbiAgICAgICAgPHNlbGVjdCAqbmdJZj1cIiF0aW1lUGlja2VyMjRIb3VyXCIgY2xhc3M9XCJzZWxlY3QtaXRlbSBhbXBtc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJ0aW1lcGlja2VyVmFyaWFibGVzLnJpZ2h0LmFtcG1Nb2RlbFwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidGltZUNoYW5nZWQoJGV2ZW50LCBzaWRlRW51bS5yaWdodClcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQU1cIiBbZGlzYWJsZWRdPVwidGltZXBpY2tlclZhcmlhYmxlcy5yaWdodC5hbURpc2FibGVkXCI+QU08L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUE1cIiBbZGlzYWJsZWRdPVwidGltZXBpY2tlclZhcmlhYmxlcy5yaWdodC5wbURpc2FibGVkXCI+UE08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWhpZ2hsaWdodFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtYmFyXCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uc1wiICpuZ0lmPVwiIWF1dG9BcHBseSAmJiAoICFyYW5nZXNBcnJheS5sZW5ndGggfHwgKHNob3dDYWxJblJhbmdlcyAmJiAhc2luZ2xlRGF0ZVBpY2tlcikpXCI+XG4gICAgPGRpdiBjbGFzcz1cImJ1dHRvbnNfaW5wdXRcIj5cbiAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93Q2xlYXJCdXR0b25cIiBjbGFzcz1cIm1hdC1wcmltYXJ5IG1hdC1zdHJva2VkLWJ1dHRvbiBjbGVhclwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xlYXIoKVwiIHRpdGxlPVwiY2xlYXIgdGhlIGRhdGVcIj5cbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIzMFwiIGhlaWdodD1cIjMwXCIgdmlld0JveD1cIjAgLTUgMjQgMjRcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnpNMTkgNGgtMy41bC0xLTFoLTVsLTEgMUg1djJoMTRWNHpcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1hdC1wcmltYXJ5IG1hdC1zdHJva2VkLWJ1dHRvblwiICpuZ0lmPVwic2hvd0NhbmNlbFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xpY2tDYW5jZWwoJGV2ZW50KVwiPnt7bG9jYWxlLmNhbmNlbExhYmVsfX08L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJtYXQtcHJpbWFyeSBtYXQtc3Ryb2tlZC1idXR0b25cIiBbZGlzYWJsZWRdPVwiYXBwbHlCdG4uZGlzYWJsZWRcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cImNsaWNrQXBwbHkoJGV2ZW50KVwiPnt7bG9jYWxlLmFwcGx5TGFiZWx9fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|