cps-ui-kit 17.3.0 → 17.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +1 -0
  2. package/esm2022/lib/components/cps-autocomplete/cps-autocomplete.component.mjs +30 -12
  3. package/esm2022/lib/components/cps-button/cps-button.component.mjs +2 -2
  4. package/esm2022/lib/components/cps-button-toggle/cps-button-toggle.component.mjs +1 -1
  5. package/esm2022/lib/components/cps-datepicker/cps-datepicker.component.mjs +3 -3
  6. package/esm2022/lib/components/cps-scheduler/cps-scheduler.component.mjs +672 -0
  7. package/esm2022/lib/components/cps-scheduler/cps-scheduler.utils.mjs +604 -0
  8. package/esm2022/lib/components/cps-select/cps-select.component.mjs +2 -2
  9. package/esm2022/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.mjs +1 -1
  10. package/esm2022/lib/components/cps-table/cps-table.component.mjs +1 -1
  11. package/esm2022/lib/components/cps-timepicker/cps-timepicker.component.mjs +10 -3
  12. package/esm2022/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.mjs +1 -1
  13. package/esm2022/lib/directives/cps-tooltip/cps-tooltip.directive.mjs +1 -1
  14. package/esm2022/lib/services/cps-notification/cps-notification.service.mjs +1 -5
  15. package/esm2022/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.mjs +9 -5
  16. package/esm2022/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.mjs +3 -3
  17. package/esm2022/lib/services/cps-notification/utils/cps-notification-config.mjs +1 -1
  18. package/esm2022/public-api.mjs +2 -1
  19. package/fesm2022/cps-ui-kit.mjs +1316 -30
  20. package/fesm2022/cps-ui-kit.mjs.map +1 -1
  21. package/lib/components/cps-autocomplete/cps-autocomplete.component.d.ts +10 -4
  22. package/lib/components/cps-button/cps-button.component.d.ts +1 -1
  23. package/lib/components/cps-scheduler/cps-scheduler.component.d.ts +146 -0
  24. package/lib/components/cps-scheduler/cps-scheduler.utils.d.ts +1 -0
  25. package/lib/components/cps-select/cps-select.component.d.ts +1 -1
  26. package/lib/components/cps-timepicker/cps-timepicker.component.d.ts +6 -1
  27. package/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.d.ts +1 -6
  28. package/lib/services/cps-notification/utils/cps-notification-config.d.ts +5 -0
  29. package/package.json +1 -1
  30. package/public-api.d.ts +1 -0
@@ -0,0 +1,672 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
4
+ import { timeZones } from './cps-scheduler.utils';
5
+ import { CpsSelectComponent } from '../cps-select/cps-select.component';
6
+ import { CpsRadioGroupComponent } from '../cps-radio-group/cps-radio-group.component';
7
+ import { CpsRadioComponent } from '../cps-radio-group/cps-radio/cps-radio.component';
8
+ import { CpsCheckboxComponent } from '../cps-checkbox/cps-checkbox.component';
9
+ import { CpsInputComponent } from '../cps-input/cps-input.component';
10
+ import { CpsAutocompleteComponent } from '../cps-autocomplete/cps-autocomplete.component';
11
+ import { CpsButtonToggleComponent } from '../cps-button-toggle/cps-button-toggle.component';
12
+ import { CpsTimepickerComponent } from '../cps-timepicker/cps-timepicker.component';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/forms";
15
+ import * as i2 from "@angular/common";
16
+ const Days = {
17
+ MON: 'Monday',
18
+ TUE: 'Tuesday',
19
+ WED: 'Wednesday',
20
+ THU: 'Thursday',
21
+ FRI: 'Friday',
22
+ SAT: 'Saturday',
23
+ SUN: 'Sunday'
24
+ };
25
+ const MonthWeeks = {
26
+ '#1': 'First',
27
+ '#2': 'Second',
28
+ '#3': 'Third',
29
+ '#4': 'Fourth',
30
+ '#5': 'Fifth',
31
+ L: 'Last'
32
+ };
33
+ var Months;
34
+ (function (Months) {
35
+ Months[Months["January"] = 1] = "January";
36
+ Months[Months["February"] = 2] = "February";
37
+ Months[Months["March"] = 3] = "March";
38
+ Months[Months["April"] = 4] = "April";
39
+ Months[Months["May"] = 5] = "May";
40
+ Months[Months["June"] = 6] = "June";
41
+ Months[Months["July"] = 7] = "July";
42
+ Months[Months["August"] = 8] = "August";
43
+ Months[Months["September"] = 9] = "September";
44
+ Months[Months["October"] = 10] = "October";
45
+ Months[Months["November"] = 11] = "November";
46
+ Months[Months["December"] = 12] = "December";
47
+ })(Months || (Months = {}));
48
+ /**
49
+ * CpsSchedulerComponent is a component designed to facilitate the creation of Amazon EventBridge CRON expressions.
50
+ * @group Components
51
+ */
52
+ export class CpsSchedulerComponent {
53
+ // eslint-disable-next-line no-useless-constructor
54
+ constructor(_fb, _cdr) {
55
+ this._fb = _fb;
56
+ this._cdr = _cdr;
57
+ /**
58
+ * Label of the component.
59
+ * @group Props
60
+ */
61
+ this.label = '';
62
+ /**
63
+ * Cron expression value.
64
+ * @group Props
65
+ */
66
+ this.cron = '';
67
+ /**
68
+ * Time zone value.
69
+ * @group Props
70
+ */
71
+ this.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
72
+ /**
73
+ * Determines whether to show the 'Not set' tab.
74
+ * @group Props
75
+ */
76
+ this.showNotSet = true;
77
+ /**
78
+ * Determines whether to show the 'Advanced' tab.
79
+ * @group Props
80
+ */
81
+ this.showAdvanced = true;
82
+ /**
83
+ * Determines whether to show the time zone selector.
84
+ * @group Props
85
+ */
86
+ this.showTimeZone = false;
87
+ /**
88
+ * Default time format for the component.
89
+ * @group Props
90
+ */
91
+ this.defaultTime = '00:00';
92
+ /**
93
+ * Determines whether to use 24-hour time format.
94
+ * @group Props
95
+ */
96
+ this.use24HourTime = true;
97
+ /**
98
+ * Determines whether the component is disabled.
99
+ * @group Props
100
+ */
101
+ this.disabled = false;
102
+ /**
103
+ * Information tooltip for the component.
104
+ * @group Props
105
+ */
106
+ this.infoTooltip = '';
107
+ /**
108
+ * Callback to invoke on cron expression value change.
109
+ * @param {string} string - cron expression value changed.
110
+ * @group Emits
111
+ */
112
+ this.cronChange = new EventEmitter();
113
+ /**
114
+ * Callback to invoke on time zone change.
115
+ * @param {string} string - time zone changed.
116
+ * @group Emits
117
+ */
118
+ this.timeZoneChange = new EventEmitter();
119
+ this.scheduleTypes = [
120
+ { label: 'Not set', value: 'Not set' },
121
+ { label: 'Minutes', value: 'Minutes' },
122
+ { label: 'Hourly', value: 'Hourly' },
123
+ { label: 'Daily', value: 'Daily' },
124
+ { label: 'Weekly', value: 'Weekly' },
125
+ { label: 'Monthly', value: 'Monthly' },
126
+ { label: 'Yearly', value: 'Yearly' },
127
+ { label: 'Advanced', value: 'Advanced' }
128
+ ];
129
+ this.activeScheduleType = 'Not set';
130
+ this.selectOptions = this._getSelectOptions();
131
+ this.timeZoneOptions = timeZones.map((tz) => ({ label: tz, value: tz }));
132
+ this._isDirty = false;
133
+ this._minutesDefault = '0/1 * 1/1 * ? *';
134
+ }
135
+ ngOnInit() {
136
+ this.state = this._getDefaultState();
137
+ if (!this.showAdvanced) {
138
+ this.scheduleTypes.pop();
139
+ }
140
+ if (!this.showNotSet) {
141
+ this.scheduleTypes.shift();
142
+ if (!this.cron)
143
+ this.cron = this._minutesDefault;
144
+ }
145
+ this._handleModelChange(this.cron);
146
+ this.form = this._fb.group({
147
+ advanced: [
148
+ this.state.advanced.expression ?? '',
149
+ [this._validateAdvancedExpr]
150
+ ]
151
+ });
152
+ }
153
+ ngOnChanges(changes) {
154
+ const newCron = changes.value;
155
+ if (newCron && !newCron.firstChange) {
156
+ this._handleModelChange(this.cron);
157
+ }
158
+ }
159
+ setActiveScheduleType(value) {
160
+ if (!this.disabled) {
161
+ this.activeScheduleType = value;
162
+ this.regenerateCron(true);
163
+ }
164
+ if (value && this.form) {
165
+ if (value === 'Advanced') {
166
+ this.form.controls.advanced.addValidators(Validators.required);
167
+ this.form.controls.advanced.updateValueAndValidity();
168
+ }
169
+ else {
170
+ this.form.controls.advanced.removeValidators(Validators.required);
171
+ this.form.controls.advanced.setErrors(null);
172
+ }
173
+ }
174
+ }
175
+ regenerateCron(tabChange) {
176
+ this._isDirty = true;
177
+ switch (this.activeScheduleType) {
178
+ case 'Minutes':
179
+ this._updateCron(`0/${this.state.minutes.minutes} * 1/1 * ? *`);
180
+ break;
181
+ case 'Hourly':
182
+ this._updateCron(`${this.state.hourly.minutes} 0/${this.state.hourly.hours} 1/1 * ? *`);
183
+ break;
184
+ case 'Daily':
185
+ switch (this.state.daily.subTab) {
186
+ case 'everyDays':
187
+ this._updateCron(`${this.state.daily.everyDays.minutes} ${this._hourToCron(this.state.daily.everyDays.hours, this.state.daily.everyDays.hourType)} 1/${this.state.daily.everyDays.days} * ? *`);
188
+ break;
189
+ case 'everyWeekDay':
190
+ this._updateCron(`${this.state.daily.everyWeekDay.minutes} ${this._hourToCron(this.state.daily.everyWeekDay.hours, this.state.daily.everyWeekDay.hourType)} ? * MON-FRI *`);
191
+ break;
192
+ default:
193
+ throw new Error('Invalid cron daily subtab selection');
194
+ }
195
+ break;
196
+ case 'Weekly': {
197
+ const days = this.selectOptions.days
198
+ .map((d) => d.value)
199
+ .reduce((acc, day) => (this.state.weekly[day] ? acc.concat([day]) : acc), [])
200
+ .join(',');
201
+ this._updateCron(`${this.state.weekly.minutes} ${this._hourToCron(this.state.weekly.hours, this.state.weekly.hourType)} ? * ${days} *`);
202
+ break;
203
+ }
204
+ case 'Monthly': {
205
+ switch (this.state.monthly.subTab) {
206
+ case 'specificDay': {
207
+ const day = this.state.monthly.runOnWeekday
208
+ ? `${this.state.monthly.specificDay.day}W`
209
+ : this.state.monthly.specificDay.day;
210
+ this._updateCron(`${this.state.monthly.specificDay.minutes} ${this._hourToCron(this.state.monthly.specificDay.hours, this.state.monthly.specificDay.hourType)} ${day} 1/${this.state.monthly.specificDay.months} ? *`);
211
+ break;
212
+ }
213
+ case 'specificWeekDay':
214
+ this._updateCron(`${this.state.monthly.specificWeekDay.minutes} ${this._hourToCron(this.state.monthly.specificWeekDay.hours, this.state.monthly.specificWeekDay.hourType)} ? ${this.state.monthly.specificWeekDay.startMonth}/${this.state.monthly.specificWeekDay.months} ${this.state.monthly.specificWeekDay.day}${this.state.monthly.specificWeekDay.monthWeek} *`);
215
+ break;
216
+ default:
217
+ throw new Error('Invalid cron monthly subtab selection');
218
+ }
219
+ break;
220
+ }
221
+ case 'Yearly':
222
+ switch (this.state.yearly.subTab) {
223
+ case 'specificMonthDay': {
224
+ const day = this.state.yearly.runOnWeekday
225
+ ? `${this.state.yearly.specificMonthDay.day}W`
226
+ : this.state.yearly.specificMonthDay.day;
227
+ this._updateCron(`${this.state.yearly.specificMonthDay.minutes} ${this._hourToCron(this.state.yearly.specificMonthDay.hours, this.state.yearly.specificMonthDay.hourType)} ${day} ${this.state.yearly.specificMonthDay.month} ? *`);
228
+ break;
229
+ }
230
+ case 'specificMonthWeek':
231
+ this._updateCron(`${this.state.yearly.specificMonthWeek.minutes} ${this._hourToCron(this.state.yearly.specificMonthWeek.hours, this.state.yearly.specificMonthWeek.hourType)} ? ${this.state.yearly.specificMonthWeek.month} ${this.state.yearly.specificMonthWeek.day}${this.state.yearly.specificMonthWeek.monthWeek} *`);
232
+ break;
233
+ default:
234
+ throw new Error('Invalid cron yearly subtab selection');
235
+ }
236
+ break;
237
+ case 'Advanced':
238
+ if (!tabChange)
239
+ this._updateCron(this.form.value.advanced || '');
240
+ this.form.controls.advanced.setValue(this.cron);
241
+ break;
242
+ default:
243
+ if (this.showNotSet)
244
+ this._updateCron('');
245
+ else
246
+ throw new Error('Invalid cron type');
247
+ }
248
+ }
249
+ onTimeZoneChanged(value) {
250
+ if (!this.showTimeZone)
251
+ return;
252
+ this.timeZoneChange.emit(value);
253
+ }
254
+ onTimeChanged(value, target) {
255
+ target.hours = this._stringToNum(value.hours);
256
+ target.minutes = this._stringToNum(value.minutes);
257
+ this.regenerateCron();
258
+ }
259
+ formatTimeValue(value) {
260
+ return {
261
+ hours: this._numToString(value.hours),
262
+ minutes: this._numToString(value.minutes)
263
+ };
264
+ }
265
+ _updateCron(value) {
266
+ if (this.cron === value)
267
+ return;
268
+ this.cron = value;
269
+ this.cronChange.emit(this.cron);
270
+ }
271
+ _isValidCron(cron) {
272
+ if (typeof cron !== 'string')
273
+ return false;
274
+ if (!this.showNotSet) {
275
+ if (!cron)
276
+ return false;
277
+ }
278
+ else if (cron === '')
279
+ return true;
280
+ const parts = cron.split(' ');
281
+ if (parts.length !== 6) {
282
+ return false;
283
+ }
284
+ return true;
285
+ }
286
+ _validateAdvancedExpr(c) {
287
+ const cron = c.value;
288
+ if (!cron)
289
+ return null;
290
+ const splits = cron?.split(' ') || [];
291
+ if (splits.length !== 6)
292
+ return { invalidExpression: 'Invalid expression' };
293
+ const cronSeven = `0 ${cron}`;
294
+ return cronSeven.match(/\d+ 0\/\d+ \* 1\/1 \* \? \*/) ||
295
+ cronSeven.match(/\d+ \d+ 0\/\d+ 1\/1 \* \? \*/) ||
296
+ cronSeven.match(/\d+ \d+ \d+ 1\/\d+ \* \? \*/) ||
297
+ cronSeven.match(/\d+ \d+ \d+ \? \* MON-FRI \*/) ||
298
+ cronSeven.match(/\d+ \d+ \d+ \? \* (MON|TUE|WED|THU|FRI|SAT|SUN)(,(MON|TUE|WED|THU|FRI|SAT|SUN))* \*/) ||
299
+ cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) 1\/\d+ \? \*/) ||
300
+ cronSeven.match(/\d+ \d+ \d+ \? \d+\/\d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/) ||
301
+ cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) \d+ \? \*/) ||
302
+ cronSeven.match(/\d+ \d+ \d+ \? \d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/)
303
+ ? null
304
+ : { invalidExpression: 'Invalid expression' };
305
+ }
306
+ _getAmPmHour(hour) {
307
+ return this.use24HourTime ? hour : ((hour + 11) % 12) + 1;
308
+ }
309
+ _getHourType(hour) {
310
+ return this.use24HourTime ? undefined : hour >= 12 ? 'PM' : 'AM';
311
+ }
312
+ _hourToCron(hour, hourType) {
313
+ if (this.use24HourTime) {
314
+ return hour;
315
+ }
316
+ else {
317
+ return hourType === 'AM'
318
+ ? hour === 12
319
+ ? 0
320
+ : hour
321
+ : hour === 12
322
+ ? 12
323
+ : hour + 12;
324
+ }
325
+ }
326
+ _handleModelChange(cron) {
327
+ if (!this._isValidCron(cron)) {
328
+ console.error('Invalid cron value:', cron);
329
+ this.cron = this.showNotSet ? '' : this._minutesDefault;
330
+ return;
331
+ }
332
+ if (this._isDirty) {
333
+ this._isDirty = false;
334
+ return;
335
+ }
336
+ else {
337
+ this._isDirty = false;
338
+ }
339
+ if (!cron || cron.length < 1) {
340
+ this.activeScheduleType = 'Not set';
341
+ this._cdr.detectChanges();
342
+ return;
343
+ }
344
+ const cronSeven = `0 ${cron}`;
345
+ const [minutes, hours, dayOfMonth, month, dayOfWeek] = cron.split(' ');
346
+ if (cronSeven.match(/\d+ 0\/\d+ \* 1\/1 \* \? \*/)) {
347
+ this.activeScheduleType = 'Minutes';
348
+ this.state.minutes.minutes = Number(minutes.substring(2));
349
+ }
350
+ else if (cronSeven.match(/\d+ \d+ 0\/\d+ 1\/1 \* \? \*/)) {
351
+ this.activeScheduleType = 'Hourly';
352
+ this.state.hourly.hours = Number(hours.substring(2));
353
+ this.state.hourly.minutes = Number(minutes);
354
+ }
355
+ else if (cronSeven.match(/\d+ \d+ \d+ 1\/\d+ \* \? \*/)) {
356
+ this.activeScheduleType = 'Daily';
357
+ this.state.daily.subTab = 'everyDays';
358
+ this.state.daily.everyDays.days = Number(dayOfMonth.substring(2));
359
+ const parsedHours = Number(hours);
360
+ this.state.daily.everyDays.hours = this._getAmPmHour(parsedHours);
361
+ this.state.daily.everyDays.hourType = this._getHourType(parsedHours);
362
+ this.state.daily.everyDays.minutes = Number(minutes);
363
+ }
364
+ else if (cronSeven.match(/\d+ \d+ \d+ \? \* MON-FRI \*/)) {
365
+ this.activeScheduleType = 'Daily';
366
+ this.state.daily.subTab = 'everyWeekDay';
367
+ const parsedHours = Number(hours);
368
+ this.state.daily.everyWeekDay.hours = this._getAmPmHour(parsedHours);
369
+ this.state.daily.everyWeekDay.hourType = this._getHourType(parsedHours);
370
+ this.state.daily.everyWeekDay.minutes = Number(minutes);
371
+ }
372
+ else if (cronSeven.match(/\d+ \d+ \d+ \? \* (MON|TUE|WED|THU|FRI|SAT|SUN)(,(MON|TUE|WED|THU|FRI|SAT|SUN))* \*/)) {
373
+ this.activeScheduleType = 'Weekly';
374
+ this.selectOptions.days
375
+ .map((d) => d.value)
376
+ .forEach((weekDay) => (this.state.weekly[weekDay] = false));
377
+ dayOfWeek
378
+ .split(',')
379
+ .forEach((weekDay) => (this.state.weekly[weekDay] = true));
380
+ const parsedHours = Number(hours);
381
+ this.state.weekly.hours = this._getAmPmHour(parsedHours);
382
+ this.state.weekly.hourType = this._getHourType(parsedHours);
383
+ this.state.weekly.minutes = Number(minutes);
384
+ }
385
+ else if (cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) 1\/\d+ \? \*/)) {
386
+ this.activeScheduleType = 'Monthly';
387
+ this.state.monthly.subTab = 'specificDay';
388
+ if (dayOfMonth.indexOf('W') !== -1) {
389
+ this.state.monthly.specificDay.day = dayOfMonth.charAt(0);
390
+ this.state.monthly.runOnWeekday = true;
391
+ }
392
+ else {
393
+ this.state.monthly.specificDay.day = dayOfMonth;
394
+ }
395
+ this.state.monthly.specificDay.months = Number(month.substring(2));
396
+ const parsedHours = Number(hours);
397
+ this.state.monthly.specificDay.hours = this._getAmPmHour(parsedHours);
398
+ this.state.monthly.specificDay.hourType = this._getHourType(parsedHours);
399
+ this.state.monthly.specificDay.minutes = Number(minutes);
400
+ }
401
+ else if (cronSeven.match(/\d+ \d+ \d+ \? \d+\/\d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/)) {
402
+ const day = dayOfWeek.substring(0, 3);
403
+ const monthWeek = dayOfWeek.substring(3);
404
+ this.activeScheduleType = 'Monthly';
405
+ this.state.monthly.subTab = 'specificWeekDay';
406
+ this.state.monthly.specificWeekDay.monthWeek = monthWeek;
407
+ this.state.monthly.specificWeekDay.day = day;
408
+ if (month.indexOf('/') !== -1) {
409
+ const [startMonth, months] = month.split('/').map(Number);
410
+ this.state.monthly.specificWeekDay.months = months;
411
+ this.state.monthly.specificWeekDay.startMonth = startMonth;
412
+ }
413
+ const parsedHours = Number(hours);
414
+ this.state.monthly.specificWeekDay.hours = this._getAmPmHour(parsedHours);
415
+ this.state.monthly.specificWeekDay.hourType =
416
+ this._getHourType(parsedHours);
417
+ this.state.monthly.specificWeekDay.minutes = Number(minutes);
418
+ }
419
+ else if (cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) \d+ \? \*/)) {
420
+ this.activeScheduleType = 'Yearly';
421
+ this.state.yearly.subTab = 'specificMonthDay';
422
+ this.state.yearly.specificMonthDay.month = Number(month);
423
+ if (dayOfMonth.indexOf('W') !== -1) {
424
+ this.state.yearly.specificMonthDay.day = dayOfMonth.charAt(0);
425
+ this.state.yearly.runOnWeekday = true;
426
+ }
427
+ else {
428
+ this.state.yearly.specificMonthDay.day = dayOfMonth;
429
+ }
430
+ const parsedHours = Number(hours);
431
+ this.state.yearly.specificMonthDay.hours = this._getAmPmHour(parsedHours);
432
+ this.state.yearly.specificMonthDay.hourType =
433
+ this._getHourType(parsedHours);
434
+ this.state.yearly.specificMonthDay.minutes = Number(minutes);
435
+ }
436
+ else if (cronSeven.match(/\d+ \d+ \d+ \? \d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/)) {
437
+ const day = dayOfWeek.substring(0, 3);
438
+ const monthWeek = dayOfWeek.substring(3);
439
+ this.activeScheduleType = 'Yearly';
440
+ this.state.yearly.subTab = 'specificMonthWeek';
441
+ this.state.yearly.specificMonthWeek.monthWeek = monthWeek;
442
+ this.state.yearly.specificMonthWeek.day = day;
443
+ this.state.yearly.specificMonthWeek.month = Number(month);
444
+ const parsedHours = Number(hours);
445
+ this.state.yearly.specificMonthWeek.hours =
446
+ this._getAmPmHour(parsedHours);
447
+ this.state.yearly.specificMonthWeek.hourType =
448
+ this._getHourType(parsedHours);
449
+ this.state.yearly.specificMonthWeek.minutes = Number(minutes);
450
+ }
451
+ else {
452
+ this.activeScheduleType = 'Advanced';
453
+ this.form.controls.advanced.setValue(cron);
454
+ }
455
+ this._cdr.detectChanges();
456
+ }
457
+ _getDefaultState() {
458
+ const [defaultHours, defaultMinutes] = this.defaultTime
459
+ .split(':')
460
+ .map(Number);
461
+ return {
462
+ minutes: {
463
+ minutes: 1
464
+ },
465
+ hourly: {
466
+ hours: 1,
467
+ minutes: 0
468
+ },
469
+ daily: {
470
+ subTab: 'everyDays',
471
+ everyDays: {
472
+ days: 1,
473
+ hours: this._getAmPmHour(defaultHours),
474
+ minutes: defaultMinutes,
475
+ hourType: this._getHourType(defaultHours)
476
+ },
477
+ everyWeekDay: {
478
+ hours: this._getAmPmHour(defaultHours),
479
+ minutes: defaultMinutes,
480
+ hourType: this._getHourType(defaultHours)
481
+ }
482
+ },
483
+ weekly: {
484
+ MON: true,
485
+ TUE: false,
486
+ WED: false,
487
+ THU: false,
488
+ FRI: false,
489
+ SAT: false,
490
+ SUN: false,
491
+ hours: this._getAmPmHour(defaultHours),
492
+ minutes: defaultMinutes,
493
+ hourType: this._getHourType(defaultHours)
494
+ },
495
+ monthly: {
496
+ subTab: 'specificDay',
497
+ runOnWeekday: false,
498
+ specificDay: {
499
+ day: '1',
500
+ months: 1,
501
+ hours: this._getAmPmHour(defaultHours),
502
+ minutes: defaultMinutes,
503
+ hourType: this._getHourType(defaultHours)
504
+ },
505
+ specificWeekDay: {
506
+ monthWeek: '#1',
507
+ day: 'MON',
508
+ startMonth: 1,
509
+ months: 1,
510
+ hours: this._getAmPmHour(defaultHours),
511
+ minutes: defaultMinutes,
512
+ hourType: this._getHourType(defaultHours)
513
+ }
514
+ },
515
+ yearly: {
516
+ subTab: 'specificMonthDay',
517
+ runOnWeekday: false,
518
+ specificMonthDay: {
519
+ month: 1,
520
+ day: '1',
521
+ hours: this._getAmPmHour(defaultHours),
522
+ minutes: defaultMinutes,
523
+ hourType: this._getHourType(defaultHours)
524
+ },
525
+ specificMonthWeek: {
526
+ monthWeek: '#1',
527
+ day: 'MON',
528
+ month: 1,
529
+ hours: this._getAmPmHour(defaultHours),
530
+ minutes: defaultMinutes,
531
+ hourType: this._getHourType(defaultHours)
532
+ }
533
+ },
534
+ advanced: {
535
+ expression: this.cron
536
+ }
537
+ };
538
+ }
539
+ _getRange(startFrom, until) {
540
+ return Array.from({ length: until + 1 - startFrom }, (_, k) => k + startFrom);
541
+ }
542
+ _getSelectOptions() {
543
+ return {
544
+ monthsNumeric: this._getRange(1, 12).map((month) => ({
545
+ label: month,
546
+ value: month
547
+ })),
548
+ months: this._getRange(1, 12).map((month) => ({
549
+ label: Months[month],
550
+ value: month
551
+ })),
552
+ monthWeeks: Object.entries(MonthWeeks).map(([key, value]) => ({
553
+ label: value,
554
+ value: key
555
+ })),
556
+ days: Object.entries(Days).map(([key, value]) => ({
557
+ label: value,
558
+ value: key
559
+ })),
560
+ minutes: this._getRange(1, 59).map((min) => ({
561
+ label: min,
562
+ value: min
563
+ })),
564
+ fullMinutes: this._getRange(0, 59).map((min) => ({
565
+ label: this._numToString(min),
566
+ value: min
567
+ })),
568
+ hours: this._getRange(1, 23).map((hour) => ({
569
+ label: hour,
570
+ value: hour
571
+ })),
572
+ monthDays: this._getRange(1, 31).map((day) => ({
573
+ label: day,
574
+ value: day
575
+ })),
576
+ monthDaysWithLasts: [...this._getRange(1, 31).map(String), 'L'].map((mdl) => {
577
+ return {
578
+ label: this._getMonthDayLabel(mdl),
579
+ value: mdl
580
+ };
581
+ })
582
+ };
583
+ }
584
+ _getMonthDayLabel(month) {
585
+ if (month === 'L') {
586
+ return 'Last Day';
587
+ }
588
+ else if (month === 'LW') {
589
+ return 'Last Weekday';
590
+ }
591
+ else if (month === '1W') {
592
+ return 'First Weekday';
593
+ }
594
+ else {
595
+ let suffix = '';
596
+ if (month.length > 1) {
597
+ const secondToLastDigit = month.charAt(month.length - 2);
598
+ if (secondToLastDigit === '1') {
599
+ suffix = 'th';
600
+ }
601
+ }
602
+ if (!suffix) {
603
+ const lastDigit = month.charAt(month.length - 1);
604
+ switch (lastDigit) {
605
+ case '1':
606
+ suffix = 'st';
607
+ break;
608
+ case '2':
609
+ suffix = 'nd';
610
+ break;
611
+ case '3':
612
+ suffix = 'rd';
613
+ break;
614
+ default:
615
+ suffix = 'th';
616
+ break;
617
+ }
618
+ }
619
+ return `${month}${suffix} day`;
620
+ }
621
+ }
622
+ _numToString(value) {
623
+ return value >= 0 && value <= 9 ? '0' + value : value.toString();
624
+ }
625
+ _stringToNum(value) {
626
+ const res = Number(value);
627
+ return isNaN(res) ? 0 : res;
628
+ }
629
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CpsSchedulerComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
630
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: CpsSchedulerComponent, isStandalone: true, selector: "cps-scheduler", inputs: { label: "label", cron: "cron", timeZone: "timeZone", showNotSet: "showNotSet", showAdvanced: "showAdvanced", showTimeZone: "showTimeZone", defaultTime: "defaultTime", use24HourTime: "use24HourTime", disabled: "disabled", infoTooltip: "infoTooltip" }, outputs: { cronChange: "cronChange", timeZoneChange: "timeZoneChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cps-scheduler-selector\">\n <cps-button-toggle\n [options]=\"scheduleTypes\"\n [disabled]=\"disabled\"\n [label]=\"label\"\n [infoTooltip]=\"infoTooltip\"\n [(ngModel)]=\"activeScheduleType\"\n (ngModelChange)=\"setActiveScheduleType($event)\">\n </cps-button-toggle>\n</div>\n\n<div\n [ngSwitch]=\"activeScheduleType\"\n class=\"cps-scheduler-container\"\n [ngClass]=\"{ 'cps-scheduler-container-disabled': disabled }\">\n <div *ngSwitchCase=\"'Not set'\" class=\"cps-scheduler-tab-pane\"></div>\n\n <div *ngSwitchCase=\"'Minutes'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.minutes.minutes\"\n [options]=\"selectOptions.minutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n minute(s)\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Hourly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.hours\"\n [options]=\"selectOptions.hours\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n hour(s) on minute\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.minutes\"\n [options]=\"selectOptions.fullMinutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Daily'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.daily.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'everyDays', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyDays'\n }\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.daily.everyDays.days\"\n [options]=\"selectOptions.monthDays\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n day(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyDays)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyDays)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n <cps-radio [option]=\"{ value: 'everyWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyWeekDay'\n }\">\n Every working day at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyWeekDay)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Weekly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-days-checkbox-group\">\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Monday\"\n [(ngModel)]=\"state.weekly.MON\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Tuesday\"\n [(ngModel)]=\"state.weekly.TUE\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Wednesday\"\n [(ngModel)]=\"state.weekly.WED\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Thursday\"\n [(ngModel)]=\"state.weekly.THU\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Friday\"\n [(ngModel)]=\"state.weekly.FRI\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Saturday\"\n [(ngModel)]=\"state.weekly.SAT\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Sunday\"\n [(ngModel)]=\"state.weekly.SUN\">\n </cps-checkbox>\n </div>\n <div class=\"cps-scheduler-tab-pane-row\">\n at\n <cps-timepicker\n [disabled]=\"disabled\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.weekly)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.weekly)\">\n </cps-timepicker>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Monthly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.monthly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificDay'\n }\">\n On the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.monthly.specificDay)\">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.monthly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificWeekDay'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"130px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"90px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) starting in\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.startMonth\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.monthly.specificWeekDay)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Yearly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.yearly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificMonthDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthDay'\n }\">\n Every\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n on the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthDay)\n \">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.yearly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificMonthWeek', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthWeek'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthWeek)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthWeek)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Advanced'\">\n <form [formGroup]=\"form\">\n <cps-input\n label=\"\"\n [disabled]=\"disabled\"\n width=\"500px\"\n placeholder=\"Please enter\"\n formControlName=\"advanced\"\n (valueChanged)=\"regenerateCron()\">\n </cps-input>\n </form>\n </div>\n <div class=\"cps-scheduler-time-zone\" *ngIf=\"cron && showTimeZone\">\n <cps-autocomplete\n label=\"Time zone\"\n [(ngModel)]=\"timeZone\"\n (valueChanged)=\"onTimeZoneChanged($event)\"\n [returnObject]=\"false\"\n width=\"300\"\n [options]=\"timeZoneOptions\"></cps-autocomplete>\n </div>\n</div>\n", styles: [":host .cps-scheduler-selector{margin-bottom:24px}:host .cps-scheduler-container{margin-top:10px;margin-left:16px}:host .cps-scheduler-container .cps-scheduler-select-control{margin-left:8px;margin-right:8px}:host .cps-scheduler-container .cps-scheduler-days-checkbox-group{max-width:700px;display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));grid-template-rows:1fr 1fr;grid-gap:20px;margin-bottom:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane{margin-bottom:28px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-radio-group ::ng-deep .cps-radio-group-content{margin-left:0!important}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row{display:flex;align-items:center}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row-disabled{color:var(--cps-color-text-light)}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-nearest-weekday-checkbox{margin-left:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-timepicker{margin-left:8px}:host .cps-scheduler-container-disabled{color:var(--cps-color-text-light)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CpsButtonToggleComponent, selector: "cps-button-toggle", inputs: ["label", "options", "multiple", "disabled", "mandatory", "equalWidths", "optionTooltipPosition", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsSelectComponent, selector: "cps-select", inputs: ["label", "placeholder", "hint", "returnObject", "multiple", "disabled", "width", "selectAll", "chips", "closableChips", "clearable", "openOnClear", "options", "keepInitialOrder", "optionLabel", "optionValue", "optionInfo", "hideDetails", "persistentClear", "prefixIcon", "prefixIconSize", "loading", "virtualScroll", "numToleratedItems", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "optionsClass", "appearance", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsRadioGroupComponent, selector: "cps-radio-group", inputs: ["options", "groupLabel", "vertical", "disabled", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsRadioComponent, selector: "cps-radio", inputs: ["option"] }, { kind: "component", type: CpsCheckboxComponent, selector: "cps-checkbox", inputs: ["label", "disabled", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "icon", "iconColor", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsInputComponent, selector: "cps-input", inputs: ["label", "hint", "placeholder", "disabled", "readonly", "width", "type", "loading", "clearable", "prefixIcon", "prefixIconClickable", "prefixIconSize", "prefixText", "hideDetails", "persistentClear", "error", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "appearance", "valueToDisplay", "value"], outputs: ["valueChanged", "focused", "prefixIconClicked", "blurred", "cleared", "enterClicked"] }, { kind: "component", type: CpsTimepickerComponent, selector: "cps-timepicker", inputs: ["label", "disabled", "use24HourTime", "withSeconds", "hint", "hideDetails", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "mandatoryValue", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsAutocompleteComponent, selector: "cps-autocomplete", inputs: ["label", "placeholder", "hint", "returnObject", "multiple", "disabled", "width", "selectAll", "showChevron", "withOptionsAliases", "useOptionsAliasesWhenNoMatch", "optionAlias", "chips", "closableChips", "clearable", "openOnClear", "options", "keepInitialOrder", "optionLabel", "optionValue", "optionInfo", "hideDetails", "persistentClear", "prefixIcon", "prefixIconSize", "loading", "emptyMessage", "showEmptyMessage", "virtualScroll", "numToleratedItems", "externalError", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "appearance", "emptyOptionIndex", "value"], outputs: ["valueChanged", "blurred"] }] }); }
631
+ }
632
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CpsSchedulerComponent, decorators: [{
633
+ type: Component,
634
+ args: [{ selector: 'cps-scheduler', standalone: true, imports: [
635
+ CommonModule,
636
+ FormsModule,
637
+ ReactiveFormsModule,
638
+ CpsButtonToggleComponent,
639
+ CpsSelectComponent,
640
+ CpsRadioGroupComponent,
641
+ CpsRadioComponent,
642
+ CpsCheckboxComponent,
643
+ CpsInputComponent,
644
+ CpsTimepickerComponent,
645
+ CpsAutocompleteComponent
646
+ ], template: "<div class=\"cps-scheduler-selector\">\n <cps-button-toggle\n [options]=\"scheduleTypes\"\n [disabled]=\"disabled\"\n [label]=\"label\"\n [infoTooltip]=\"infoTooltip\"\n [(ngModel)]=\"activeScheduleType\"\n (ngModelChange)=\"setActiveScheduleType($event)\">\n </cps-button-toggle>\n</div>\n\n<div\n [ngSwitch]=\"activeScheduleType\"\n class=\"cps-scheduler-container\"\n [ngClass]=\"{ 'cps-scheduler-container-disabled': disabled }\">\n <div *ngSwitchCase=\"'Not set'\" class=\"cps-scheduler-tab-pane\"></div>\n\n <div *ngSwitchCase=\"'Minutes'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.minutes.minutes\"\n [options]=\"selectOptions.minutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n minute(s)\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Hourly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.hours\"\n [options]=\"selectOptions.hours\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n hour(s) on minute\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.minutes\"\n [options]=\"selectOptions.fullMinutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Daily'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.daily.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'everyDays', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyDays'\n }\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.daily.everyDays.days\"\n [options]=\"selectOptions.monthDays\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n day(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyDays)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyDays)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n <cps-radio [option]=\"{ value: 'everyWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyWeekDay'\n }\">\n Every working day at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyWeekDay)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Weekly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-days-checkbox-group\">\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Monday\"\n [(ngModel)]=\"state.weekly.MON\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Tuesday\"\n [(ngModel)]=\"state.weekly.TUE\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Wednesday\"\n [(ngModel)]=\"state.weekly.WED\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Thursday\"\n [(ngModel)]=\"state.weekly.THU\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Friday\"\n [(ngModel)]=\"state.weekly.FRI\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Saturday\"\n [(ngModel)]=\"state.weekly.SAT\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Sunday\"\n [(ngModel)]=\"state.weekly.SUN\">\n </cps-checkbox>\n </div>\n <div class=\"cps-scheduler-tab-pane-row\">\n at\n <cps-timepicker\n [disabled]=\"disabled\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.weekly)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.weekly)\">\n </cps-timepicker>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Monthly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.monthly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificDay'\n }\">\n On the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.monthly.specificDay)\">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.monthly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificWeekDay'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"130px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"90px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) starting in\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.startMonth\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.monthly.specificWeekDay)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Yearly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [(ngModel)]=\"state.yearly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificMonthDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthDay'\n }\">\n Every\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n on the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthDay)\n \">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.yearly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificMonthWeek', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthWeek'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthWeek)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthWeek)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Advanced'\">\n <form [formGroup]=\"form\">\n <cps-input\n label=\"\"\n [disabled]=\"disabled\"\n width=\"500px\"\n placeholder=\"Please enter\"\n formControlName=\"advanced\"\n (valueChanged)=\"regenerateCron()\">\n </cps-input>\n </form>\n </div>\n <div class=\"cps-scheduler-time-zone\" *ngIf=\"cron && showTimeZone\">\n <cps-autocomplete\n label=\"Time zone\"\n [(ngModel)]=\"timeZone\"\n (valueChanged)=\"onTimeZoneChanged($event)\"\n [returnObject]=\"false\"\n width=\"300\"\n [options]=\"timeZoneOptions\"></cps-autocomplete>\n </div>\n</div>\n", styles: [":host .cps-scheduler-selector{margin-bottom:24px}:host .cps-scheduler-container{margin-top:10px;margin-left:16px}:host .cps-scheduler-container .cps-scheduler-select-control{margin-left:8px;margin-right:8px}:host .cps-scheduler-container .cps-scheduler-days-checkbox-group{max-width:700px;display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));grid-template-rows:1fr 1fr;grid-gap:20px;margin-bottom:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane{margin-bottom:28px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-radio-group ::ng-deep .cps-radio-group-content{margin-left:0!important}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row{display:flex;align-items:center}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row-disabled{color:var(--cps-color-text-light)}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-nearest-weekday-checkbox{margin-left:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-timepicker{margin-left:8px}:host .cps-scheduler-container-disabled{color:var(--cps-color-text-light)}\n"] }]
647
+ }], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { label: [{
648
+ type: Input
649
+ }], cron: [{
650
+ type: Input
651
+ }], timeZone: [{
652
+ type: Input
653
+ }], showNotSet: [{
654
+ type: Input
655
+ }], showAdvanced: [{
656
+ type: Input
657
+ }], showTimeZone: [{
658
+ type: Input
659
+ }], defaultTime: [{
660
+ type: Input
661
+ }], use24HourTime: [{
662
+ type: Input
663
+ }], disabled: [{
664
+ type: Input
665
+ }], infoTooltip: [{
666
+ type: Input
667
+ }], cronChange: [{
668
+ type: Output
669
+ }], timeZoneChange: [{
670
+ type: Output
671
+ }] } });
672
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BzLXNjaGVkdWxlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcHMtdWkta2l0L3NyYy9saWIvY29tcG9uZW50cy9jcHMtc2NoZWR1bGVyL2Nwcy1zY2hlZHVsZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXNjaGVkdWxlci9jcHMtc2NoZWR1bGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCxXQUFXLEVBQ1gsbUJBQW1CLEVBR25CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNyRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUMxRixPQUFPLEVBQ0wsd0JBQXdCLEVBRXpCLE1BQU0sa0RBQWtELENBQUM7QUFDMUQsT0FBTyxFQUNMLHNCQUFzQixFQUV2QixNQUFNLDRDQUE0QyxDQUFDOzs7O0FBRXBELE1BQU0sSUFBSSxHQUFHO0lBQ1gsR0FBRyxFQUFFLFFBQVE7SUFDYixHQUFHLEVBQUUsU0FBUztJQUNkLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdBQUcsRUFBRSxVQUFVO0lBQ2YsR0FBRyxFQUFFLFFBQVE7SUFDYixHQUFHLEVBQUUsVUFBVTtJQUNmLEdBQUcsRUFBRSxRQUFRO0NBQ2QsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLElBQUksRUFBRSxPQUFPO0lBQ2IsSUFBSSxFQUFFLFFBQVE7SUFDZCxJQUFJLEVBQUUsT0FBTztJQUNiLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLE9BQU87SUFDYixDQUFDLEVBQUUsTUFBTTtDQUNWLENBQUM7QUFFRixJQUFLLE1BYUo7QUFiRCxXQUFLLE1BQU07SUFDVCx5Q0FBVyxDQUFBO0lBQ1gsMkNBQVEsQ0FBQTtJQUNSLHFDQUFLLENBQUE7SUFDTCxxQ0FBSyxDQUFBO0lBQ0wsaUNBQUcsQ0FBQTtJQUNILG1DQUFJLENBQUE7SUFDSixtQ0FBSSxDQUFBO0lBQ0osdUNBQU0sQ0FBQTtJQUNOLDZDQUFTLENBQUE7SUFDVCwwQ0FBTyxDQUFBO0lBQ1AsNENBQVEsQ0FBQTtJQUNSLDRDQUFRLENBQUE7QUFDVixDQUFDLEVBYkksTUFBTSxLQUFOLE1BQU0sUUFhVjtBQUVEOzs7R0FHRztBQW9CSCxNQUFNLE9BQU8scUJBQXFCO0lBK0ZoQyxrREFBa0Q7SUFDbEQsWUFDVSxHQUF1QixFQUN2QixJQUF1QjtRQUR2QixRQUFHLEdBQUgsR0FBRyxDQUFvQjtRQUN2QixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQWpHakM7OztXQUdHO1FBQ00sVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVwQjs7O1dBR0c7UUFDTSxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBRW5COzs7V0FHRztRQUNNLGFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUU5RTs7O1dBR0c7UUFDTSxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRTNCOzs7V0FHRztRQUNNLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRTdCOzs7V0FHRztRQUNNLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTlCOzs7V0FHRztRQUNNLGdCQUFXLEdBQUcsT0FBTyxDQUFDO1FBRS9COzs7V0FHRztRQUNNLGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBRTlCOzs7V0FHRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUI7OztXQUdHO1FBQ00sZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFFMUI7Ozs7V0FJRztRQUNPLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRWxEOzs7O1dBSUc7UUFDTyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFdEQsa0JBQWEsR0FBNEI7WUFDdkMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDdEMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDdEMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDcEMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7WUFDbEMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDcEMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDdEMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDcEMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7U0FDekMsQ0FBQztRQUVGLHVCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUMvQixrQkFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pDLG9CQUFlLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUk1RCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLG9CQUFlLEdBQUcsaUJBQWlCLENBQUM7SUFNekMsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXJDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtnQkFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDbkQsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUN6QixRQUFRLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxJQUFJLEVBQUU7Z0JBQ3BDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO2FBQzdCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzlCLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFhO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsSUFBSSxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN2RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsU0FBbUI7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFckIsUUFBUSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNoQyxLQUFLLFNBQVM7Z0JBQ1osSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sY0FBYyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FDZCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFlBQVksQ0FDdEUsQ0FBQztnQkFDRixNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2hDLEtBQUssV0FBVzt3QkFDZCxJQUFJLENBQUMsV0FBVyxDQUNkLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUNwQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFFBQVEsQ0FDL0MsQ0FBQzt3QkFFRixNQUFNO29CQUNSLEtBQUssY0FBYzt3QkFDakIsSUFBSSxDQUFDLFdBQVcsQ0FDZCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FDMUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FDdkMsZ0JBQWdCLENBQ2xCLENBQUM7d0JBQ0YsTUFBTTtvQkFDUjt3QkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7Z0JBQzNELENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUk7cUJBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztxQkFDbkIsTUFBTSxDQUNMLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUNoRSxFQUFjLENBQ2Y7cUJBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLElBQUksQ0FBQyxXQUFXLENBQ2QsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQzNCLFFBQVEsSUFBSSxJQUFJLENBQ2xCLENBQUM7Z0JBQ0YsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbEMsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO3dCQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZOzRCQUN6QyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHOzRCQUMxQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQzt3QkFFdkMsSUFBSSxDQUFDLFdBQVcsQ0FDZCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssRUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FDeEMsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sTUFBTSxDQUMxRCxDQUFDO3dCQUNGLE1BQU07b0JBQ1IsQ0FBQztvQkFDRCxLQUFLLGlCQUFpQjt3QkFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FDZCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FDL0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssRUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FDNUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFDckMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxHQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsU0FDckMsSUFBSSxDQUNMLENBQUM7d0JBQ0YsTUFBTTtvQkFDUjt3QkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7Z0JBQzdELENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFFBQVE7Z0JBQ1gsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDakMsS0FBSyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7d0JBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVk7NEJBQ3hDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsR0FBRzs0QkFDOUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQzt3QkFFM0MsSUFBSSxDQUFDLFdBQVcsQ0FDZCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FDNUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxNQUFNLENBQzNELENBQUM7d0JBQ0YsTUFBTTtvQkFDUixDQUFDO29CQUNELEtBQUssbUJBQW1CO3dCQUN0QixJQUFJLENBQUMsV0FBVyxDQUNkLEdBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsT0FDdEMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FDN0MsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQ3RDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxJQUFJLENBQ3JELENBQUM7d0JBQ0YsTUFBTTtvQkFDUjt3QkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7Z0JBQzVELENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssVUFBVTtnQkFDYixJQUFJLENBQUMsU0FBUztvQkFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELE1BQU07WUFDUjtnQkFDRSxJQUFJLElBQUksQ0FBQyxVQUFVO29CQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7O29CQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFjLEVBQUUsTUFBVztRQUN2QyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBVTtRQUN4QixPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1NBQzFDLENBQUM7SUFDSixDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUs7WUFBRSxPQUFPO1FBQ2hDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVk7UUFDL0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUMxQixDQUFDO2FBQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXBDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLHFCQUFxQixDQUFDLENBQWM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLENBQUM7UUFFNUUsTUFBTSxTQUFTLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUU5QixPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUM7WUFDbkQsU0FBUyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQztZQUMvQyxTQUFTLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDO1lBQzlDLFNBQVMsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUM7WUFDL0MsU0FBUyxDQUFDLEtBQUssQ0FDYixxRkFBcUYsQ0FDdEY7WUFDRCxTQUFTLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDO1lBQ3pELFNBQVMsQ0FBQyxLQUFLLENBQ2Isc0VBQXNFLENBQ3ZFO1lBQ0QsU0FBUyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQztZQUN0RCxTQUFTLENBQUMsS0FBSyxDQUNiLGlFQUFpRSxDQUNsRTtZQUNELENBQUMsQ0FBQyxJQUFJO1lBQ04sQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVk7UUFDL0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyxZQUFZLENBQUMsSUFBWTtRQUMvQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkUsQ0FBQztJQUVPLFdBQVcsQ0FBQyxJQUFZLEVBQUUsUUFBZ0I7UUFDaEQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sUUFBUSxLQUFLLElBQUk7Z0JBQ3RCLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRTtvQkFDWCxDQUFDLENBQUMsQ0FBQztvQkFDSCxDQUFDLENBQUMsSUFBSTtnQkFDUixDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUU7b0JBQ1gsQ0FBQyxDQUFDLEVBQUU7b0JBQ0osQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxJQUFZO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUN4RCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUU5QixNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdkUsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1lBRXBDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDO1lBQzNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7WUFFbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxDQUFDO2FBQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDO1lBRWxDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDO1lBQzNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUM7WUFFbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQztZQUN6QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxDQUFDO2FBQU0sSUFDTCxTQUFTLENBQUMsS0FBSyxDQUNiLHFGQUFxRixDQUN0RixFQUNELENBQUM7WUFDRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDO1lBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSTtpQkFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUNuQixPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM5RCxTQUFTO2lCQUNOLEtBQUssQ0FBQyxHQUFHLENBQUM7aUJBQ1YsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztZQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO1lBRTFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDO1lBQ2xELENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkUsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUFNLElBQ0wsU0FBUyxDQUFDLEtBQUssQ0FDYixzRUFBc0UsQ0FDdkUsRUFDRCxDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQztZQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUU3QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQzdELENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxRQUFRO2dCQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7WUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDO1lBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFekQsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3hDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDO1lBQ3RELENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUTtnQkFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELENBQUM7YUFBTSxJQUNMLFNBQVMsQ0FBQyxLQUFLLENBQ2IsaUVBQWlFLENBQ2xFLEVBQ0QsQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQztZQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUM7WUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQUs7Z0JBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBUTtnQkFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQztZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsTUFBTSxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVzthQUNwRCxLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWYsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUCxPQUFPLEVBQUUsQ0FBQzthQUNYO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLEtBQUssRUFBRSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLFNBQVMsRUFBRTtvQkFDVCxJQUFJLEVBQUUsQ0FBQztvQkFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7b0JBQ3RDLE9BQU8sRUFBRSxjQUFjO29CQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7aUJBQzFDO2dCQUNELFlBQVksRUFBRTtvQkFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7b0JBQ3RDLE9BQU8sRUFBRSxjQUFjO29CQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7aUJBQzFDO2FBQ0Y7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sR0FBRyxFQUFFLElBQUk7Z0JBQ1QsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO2dCQUN0QyxPQUFPLEVBQUUsY0FBYztnQkFDdkIsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO2FBQzFDO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLE1BQU0sRUFBRSxhQUFhO2dCQUNyQixZQUFZLEVBQUUsS0FBSztnQkFDbkIsV0FBVyxFQUFFO29CQUNYLEdBQUcsRUFBRSxHQUFHO29CQUNSLE1BQU0sRUFBRSxDQUFDO29CQUNULEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQkFDdEMsT0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztpQkFDMUM7Z0JBQ0QsZUFBZSxFQUFFO29CQUNmLFNBQVMsRUFBRSxJQUFJO29CQUNmLEdBQUcsRUFBRSxLQUFLO29CQUNWLFVBQVUsRUFBRSxDQUFDO29CQUNiLE1BQU0sRUFBRSxDQUFDO29CQUNULEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQkFDdEMsT0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztpQkFDMUM7YUFDRjtZQUNELE1BQU0sRUFBRTtnQkFDTixNQUFNLEVBQUUsa0JBQWtCO2dCQUMxQixZQUFZLEVBQUUsS0FBSztnQkFDbkIsZ0JBQWdCLEVBQUU7b0JBQ2hCLEtBQUssRUFBRSxDQUFDO29CQUNSLEdBQUcsRUFBRSxHQUFHO29CQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQkFDdEMsT0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztpQkFDMUM7Z0JBQ0QsaUJBQWlCLEVBQUU7b0JBQ2pCLFNBQVMsRUFBRSxJQUFJO29CQUNmLEdBQUcsRUFBRSxLQUFLO29CQUNWLEtBQUssRUFBRSxDQUFDO29CQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQkFDdEMsT0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztpQkFDMUM7YUFDRjtZQUNELFFBQVEsRUFBRTtnQkFDUixVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUk7YUFDdEI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLFNBQVMsQ0FBQyxTQUFpQixFQUFFLEtBQWE7UUFDaEQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUNmLEVBQUUsTUFBTSxFQUFFLEtBQUssR0FBRyxDQUFDLEdBQUcsU0FBUyxFQUFFLEVBQ2pDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsT0FBTztZQUNMLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ25ELEtBQUssRUFBRSxLQUFLO2dCQUNaLEtBQUssRUFBRSxLQUFLO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3BCLEtBQUssRUFBRSxLQUFLO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsVUFBVSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzVELEtBQUssRUFBRSxLQUFLO2dCQUNaLEtBQUssRUFBRSxHQUFHO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hELEtBQUssRUFBRSxLQUFLO2dCQUNaLEtBQUssRUFBRSxHQUFHO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDM0MsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsS0FBSyxFQUFFLEdBQUc7YUFDWCxDQUFDLENBQUM7WUFDSCxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7Z0JBQzdCLEtBQUssRUFBRSxHQUFHO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDMUMsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsS0FBSyxFQUFFLElBQUk7YUFDWixDQUFDLENBQUM7WUFDSCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxLQUFLLEVBQUUsR0FBRztnQkFDVixLQUFLLEVBQUUsR0FBRzthQUNYLENBQUMsQ0FBQztZQUNILGtCQUFrQixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUNqRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNOLE9BQU87b0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUM7b0JBQ2xDLEtBQUssRUFBRSxHQUFHO2lCQUNYLENBQUM7WUFDSixDQUFDLENBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQixDQUFDLEtBQWE7UUFDckMsSUFBSSxLQUFLLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDbEIsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQzthQUFNLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzFCLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7YUFBTSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMxQixPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLGlCQUFpQixLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUM5QixNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNoQixDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELFFBQVEsU0FBUyxFQUFFLENBQUM7b0JBQ2xCLEtBQUssR0FBRzt3QkFDTixNQUFNLEdBQUcsSUFBSSxDQUFDO3dCQUNkLE1BQU07b0JBQ1IsS0FBSyxHQUFHO3dCQUNOLE1BQU0sR0FBRyxJQUFJLENBQUM7d0JBQ2QsTUFBTTtvQkFDUixLQUFLLEdBQUc7d0JBQ04sTUFBTSxHQUFHLElBQUksQ0FBQzt3QkFDZCxNQUFNO29CQUNSO3dCQUNFLE1BQU0sR0FBRyxJQUFJLENBQUM7d0JBQ2QsTUFBTTtnQkFDVixDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sR0FBRyxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsS0FBYTtRQUNoQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFFTyxZQUFZLENBQUMsS0FBYTtRQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzlCLENBQUM7OEdBOXFCVSxxQkFBcUI7a0dBQXJCLHFCQUFxQiwyYUM1RmxDLG13ZkF5YUEsNHFDRDVWSSxZQUFZLDRaQUNaLFdBQVcsbW1CQUNYLG1CQUFtQixnVkFDbkIsd0JBQXdCLHVUQUN4QixrQkFBa0IsK2pCQUNsQixzQkFBc0IscVFBQ3RCLGlCQUFpQiwwRUFDakIsb0JBQW9CLDJQQUNwQixpQkFBaUIscWdCQUNqQixzQkFBc0IsaVRBQ3RCLHdCQUF3Qjs7MkZBS2YscUJBQXFCO2tCQW5CakMsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLHdCQUF3Qjt3QkFDeEIsa0JBQWtCO3dCQUNsQixzQkFBc0I7d0JBQ3RCLGlCQUFpQjt3QkFDakIsb0JBQW9CO3dCQUNwQixpQkFBaUI7d0JBQ2pCLHNCQUFzQjt3QkFDdEIsd0JBQXdCO3FCQUN6Qjt1SEFTUSxLQUFLO3NCQUFiLEtBQUs7Z0JBTUcsSUFBSTtzQkFBWixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsVUFBVTtzQkFBbEIsS0FBSztnQkFNRyxZQUFZO3NCQUFwQixLQUFLO2dCQU1HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFNRyxhQUFhO3NCQUFyQixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFPSSxVQUFVO3NCQUFuQixNQUFNO2dCQU9HLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEZvcm1Db250cm9sLFxuICBGb3Jtc01vZHVsZSxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVW50eXBlZEZvcm1CdWlsZGVyLFxuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHRpbWVab25lcyB9IGZyb20gJy4vY3BzLXNjaGVkdWxlci51dGlscyc7XG5pbXBvcnQgeyBDcHNTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9jcHMtc2VsZWN0L2Nwcy1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IENwc1JhZGlvR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9jcHMtcmFkaW8tZ3JvdXAvY3BzLXJhZGlvLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcHNSYWRpb0NvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1yYWRpby1ncm91cC9jcHMtcmFkaW8vY3BzLXJhZGlvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcHNDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1jaGVja2JveC9jcHMtY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IENwc0lucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vY3BzLWlucHV0L2Nwcy1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3BzQXV0b2NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vY3BzLWF1dG9jb21wbGV0ZS9jcHMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDcHNCdXR0b25Ub2dnbGVDb21wb25lbnQsXG4gIENwc0J1dHRvblRvZ2dsZU9wdGlvblxufSBmcm9tICcuLi9jcHMtYnV0dG9uLXRvZ2dsZS9jcHMtYnV0dG9uLXRvZ2dsZS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQ3BzVGltZXBpY2tlckNvbXBvbmVudCxcbiAgQ3BzVGltZVxufSBmcm9tICcuLi9jcHMtdGltZXBpY2tlci9jcHMtdGltZXBpY2tlci5jb21wb25lbnQnO1xuXG5jb25zdCBEYXlzID0ge1xuICBNT046ICdNb25kYXknLFxuICBUVUU6ICdUdWVzZGF5JyxcbiAgV0VEOiAnV2VkbmVzZGF5JyxcbiAgVEhVOiAnVGh1cnNkYXknLFxuICBGUkk6ICdGcmlkYXknLFxuICBTQVQ6ICdTYXR1cmRheScsXG4gIFNVTjogJ1N1bmRheSdcbn07XG5cbmNvbnN0IE1vbnRoV2Vla3MgPSB7XG4gICcjMSc6ICdGaXJzdCcsXG4gICcjMic6ICdTZWNvbmQnLFxuICAnIzMnOiAnVGhpcmQnLFxuICAnIzQnOiAnRm91cnRoJyxcbiAgJyM1JzogJ0ZpZnRoJyxcbiAgTDogJ0xhc3QnXG59O1xuXG5lbnVtIE1vbnRocyB7XG4gIEphbnVhcnkgPSAxLFxuICBGZWJydWFyeSxcbiAgTWFyY2gsXG4gIEFwcmlsLFxuICBNYXksXG4gIEp1bmUsXG4gIEp1bHksXG4gIEF1Z3VzdCxcbiAgU2VwdGVtYmVyLFxuICBPY3RvYmVyLFxuICBOb3ZlbWJlcixcbiAgRGVjZW1iZXJcbn1cblxuLyoqXG4gKiBDcHNTY2hlZHVsZXJDb21wb25lbnQgaXMgYSBjb21wb25lbnQgZGVzaWduZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY3JlYXRpb24gb2YgQW1hem9uIEV2ZW50QnJpZGdlIENST04gZXhwcmVzc2lvbnMuXG4gKiBAZ3JvdXAgQ29tcG9uZW50c1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcHMtc2NoZWR1bGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIENwc0J1dHRvblRvZ2dsZUNvbXBvbmVudCxcbiAgICBDcHNTZWxlY3RDb21wb25lbnQsXG4gICAgQ3BzUmFkaW9Hcm91cENvbXBvbmVudCxcbiAgICBDcHNSYWRpb0NvbXBvbmVudCxcbiAgICBDcHNDaGVja2JveENvbXBvbmVudCxcbiAgICBDcHNJbnB1dENvbXBvbmVudCxcbiAgICBDcHNUaW1lcGlja2VyQ29tcG9uZW50LFxuICAgIENwc0F1dG9jb21wbGV0ZUNvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vY3BzLXNjaGVkdWxlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jcHMtc2NoZWR1bGVyLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBDcHNTY2hlZHVsZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBMYWJlbCBvZiB0aGUgY29tcG9uZW50LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG5cbiAgLyoqXG4gICAqIENyb24gZXhwcmVzc2lvbiB2YWx1ZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBjcm9uID0gJyc7XG5cbiAgLyoqXG4gICAqIFRpbWUgem9uZSB2YWx1ZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB0aW1lWm9uZSA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCAnVVRDJztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHNob3cgdGhlICdOb3Qgc2V0JyB0YWIuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2hvd05vdFNldCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0byBzaG93IHRoZSAnQWR2YW5jZWQnIHRhYi5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93QWR2YW5jZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgdGltZSB6b25lIHNlbGVjdG9yLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHNob3dUaW1lWm9uZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHRpbWUgZm9ybWF0IGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUaW1lID0gJzAwOjAwJztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSAyNC1ob3VyIHRpbWUgZm9ybWF0LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHVzZTI0SG91clRpbWUgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiB0b29sdGlwIGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwID0gJyc7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSBvbiBjcm9uIGV4cHJlc3Npb24gdmFsdWUgY2hhbmdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIC0gY3JvbiBleHByZXNzaW9uIHZhbHVlIGNoYW5nZWQuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGNyb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIG9uIHRpbWUgem9uZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSB0aW1lIHpvbmUgY2hhbmdlZC5cbiAgICogQGdyb3VwIEVtaXRzXG4gICAqL1xuICBAT3V0cHV0KCkgdGltZVpvbmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBzY2hlZHVsZVR5cGVzOiBDcHNCdXR0b25Ub2dnbGVPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnTm90IHNldCcsIHZhbHVlOiAnTm90IHNldCcgfSxcbiAgICB7IGxhYmVsOiAnTWludXRlcycsIHZhbHVlOiAnTWludXRlcycgfSxcbiAgICB7IGxhYmVsOiAnSG91cmx5JywgdmFsdWU6ICdIb3VybHknIH0sXG4gICAgeyBsYWJlbDogJ0RhaWx5JywgdmFsdWU6ICdEYWlseScgfSxcbiAgICB7IGxhYmVsOiAnV2Vla2x5JywgdmFsdWU6ICdXZWVrbHknIH0sXG4gICAgeyBsYWJlbDogJ01vbnRobHknLCB2YWx1ZTogJ01vbnRobHknIH0sXG4gICAgeyBsYWJlbDogJ1llYXJseScsIHZhbHVlOiAnWWVhcmx5JyB9LFxuICAgIHsgbGFiZWw6ICdBZHZhbmNlZCcsIHZhbHVlOiAnQWR2YW5jZWQnIH1cbiAgXTtcblxuICBhY3RpdmVTY2hlZHVsZVR5cGUgPSAnTm90IHNldCc7XG4gIHNlbGVjdE9wdGlvbnMgPSB0aGlzLl9nZXRTZWxlY3RPcHRpb25zKCk7XG4gIHRpbWVab25lT3B0aW9ucyA9IHRpbWVab25lcy5tYXAoKHR6KSA9PiAoeyBsYWJlbDogdHosIHZhbHVlOiB0eiB9KSk7XG4gIHN0YXRlOiBhbnk7XG4gIGZvcm0hOiBVbnR5cGVkRm9ybUdyb3VwO1xuXG4gIHByaXZhdGUgX2lzRGlydHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWludXRlc0RlZmF1bHQgPSAnMC8xICogMS8xICogPyAqJztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jb25zdHJ1Y3RvclxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9mYjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSB0aGlzLl9nZXREZWZhdWx0U3RhdGUoKTtcblxuICAgIGlmICghdGhpcy5zaG93QWR2YW5jZWQpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVUeXBlcy5wb3AoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2hvd05vdFNldCkge1xuICAgICAgdGhpcy5zY2hlZHVsZVR5cGVzLnNoaWZ0KCk7XG4gICAgICBpZiAoIXRoaXMuY3JvbikgdGhpcy5jcm9uID0gdGhpcy5fbWludXRlc0RlZmF1bHQ7XG4gICAgfVxuXG4gICAgdGhpcy5faGFuZGxlTW9kZWxDaGFuZ2UodGhpcy5jcm9uKTtcblxuICAgIHRoaXMuZm9ybSA9IHRoaXMuX2ZiLmdyb3VwKHtcbiAgICAgIGFkdmFuY2VkOiBbXG4gICAgICAgIHRoaXMuc3RhdGUuYWR2YW5jZWQuZXhwcmVzc2lvbiA/PyAnJyxcbiAgICAgICAgW3RoaXMuX3ZhbGlkYXRlQWR2YW5jZWRFeHByXVxuICAgICAgXVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0Nyb24gPSBjaGFuZ2VzLnZhbHVlO1xuICAgIGlmIChuZXdDcm9uICYmICFuZXdDcm9uLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLl9oYW5kbGVNb2RlbENoYW5nZSh0aGlzLmNyb24pO1xuICAgIH1cbiAgfVxuXG4gIHNldEFjdGl2ZVNjaGVkdWxlVHlwZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9IHZhbHVlO1xuICAgICAgdGhpcy5yZWdlbmVyYXRlQ3Jvbih0cnVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICYmIHRoaXMuZm9ybSkge1xuICAgICAgaWYgKHZhbHVlID09PSAnQWR2YW5jZWQnKSB7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5hZHZhbmNlZC5hZGRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuYWR2YW5jZWQudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFkdmFuY2VkLnJlbW92ZVZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5hZHZhbmNlZC5zZXRFcnJvcnMobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVnZW5lcmF0ZUNyb24odGFiQ2hhbmdlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuXG4gICAgc3dpdGNoICh0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSkge1xuICAgICAgY2FzZSAnTWludXRlcyc6XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNyb24oYDAvJHt0aGlzLnN0YXRlLm1pbnV0ZXMubWludXRlc30gKiAxLzEgKiA/ICpgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdIb3VybHknOlxuICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgIGAke3RoaXMuc3RhdGUuaG91cmx5Lm1pbnV0ZXN9IDAvJHt0aGlzLnN0YXRlLmhvdXJseS5ob3Vyc30gMS8xICogPyAqYFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RhaWx5JzpcbiAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlLmRhaWx5LnN1YlRhYikge1xuICAgICAgICAgIGNhc2UgJ2V2ZXJ5RGF5cyc6XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgICAgICBgJHt0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5taW51dGVzfSAke3RoaXMuX2hvdXJUb0Nyb24oXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeURheXMuaG91cnMsXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeURheXMuaG91clR5cGVcbiAgICAgICAgICAgICAgKX0gMS8ke3RoaXMuc3RhdGUuZGFpbHkuZXZlcnlEYXlzLmRheXN9ICogPyAqYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZXZlcnlXZWVrRGF5JzpcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNyb24oXG4gICAgICAgICAgICAgIGAke3RoaXMuc3RhdGUuZGFpbHkuZXZlcnlXZWVrRGF5Lm1pbnV0ZXN9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheS5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheS5ob3VyVHlwZVxuICAgICAgICAgICAgICApfSA/ICogTU9OLUZSSSAqYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY3JvbiBkYWlseSBzdWJ0YWIgc2VsZWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXZWVrbHknOiB7XG4gICAgICAgIGNvbnN0IGRheXMgPSB0aGlzLnNlbGVjdE9wdGlvbnMuZGF5c1xuICAgICAgICAgIC5tYXAoKGQpID0+IGQudmFsdWUpXG4gICAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGRheSkgPT4gKHRoaXMuc3RhdGUud2Vla2x5W2RheV0gPyBhY2MuY29uY2F0KFtkYXldKSA6IGFjYyksXG4gICAgICAgICAgICBbXSBhcyBzdHJpbmdbXVxuICAgICAgICAgIClcbiAgICAgICAgICAuam9pbignLCcpO1xuICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgIGAke3RoaXMuc3RhdGUud2Vla2x5Lm1pbnV0ZXN9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgIHRoaXMuc3RhdGUud2Vla2x5LmhvdXJzLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS53ZWVrbHkuaG91clR5cGVcbiAgICAgICAgICApfSA/ICogJHtkYXlzfSAqYFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ01vbnRobHknOiB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS5tb250aGx5LnN1YlRhYikge1xuICAgICAgICAgIGNhc2UgJ3NwZWNpZmljRGF5Jzoge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5zdGF0ZS5tb250aGx5LnJ1bk9uV2Vla2RheVxuICAgICAgICAgICAgICA/IGAke3RoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5kYXl9V2BcbiAgICAgICAgICAgICAgOiB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkuZGF5O1xuXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgICAgICBgJHt0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkubWludXRlc30gJHt0aGlzLl9ob3VyVG9Dcm9uKFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkuaG91clR5cGVcbiAgICAgICAgICAgICAgKX0gJHtkYXl9IDEvJHt0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkubW9udGhzfSA/ICpgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3NwZWNpZmljV2Vla0RheSc6XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgICAgICBgJHt0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5Lm1pbnV0ZXN9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5LmhvdXJzLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuaG91clR5cGVcbiAgICAgICAgICAgICAgKX0gPyAke3RoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuc3RhcnRNb250aH0vJHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5Lm1vbnRoc1xuICAgICAgICAgICAgICB9ICR7dGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5kYXl9JHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5Lm1vbnRoV2Vla1xuICAgICAgICAgICAgICB9ICpgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjcm9uIG1vbnRobHkgc3VidGFiIHNlbGVjdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnWWVhcmx5JzpcbiAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlLnllYXJseS5zdWJUYWIpIHtcbiAgICAgICAgICBjYXNlICdzcGVjaWZpY01vbnRoRGF5Jzoge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5zdGF0ZS55ZWFybHkucnVuT25XZWVrZGF5XG4gICAgICAgICAgICAgID8gYCR7dGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5kYXl9V2BcbiAgICAgICAgICAgICAgOiB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmRheTtcblxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ3JvbihcbiAgICAgICAgICAgICAgYCR7dGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5taW51dGVzfSAke3RoaXMuX2hvdXJUb0Nyb24oXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmhvdXJUeXBlXG4gICAgICAgICAgICAgICl9ICR7ZGF5fSAke3RoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkubW9udGh9ID8gKmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnc3BlY2lmaWNNb250aFdlZWsnOlxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ3JvbihcbiAgICAgICAgICAgICAgYCR7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubWludXRlc1xuICAgICAgICAgICAgICB9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoV2Vlay5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoV2Vlay5ob3VyVHlwZVxuICAgICAgICAgICAgICApfSA/ICR7dGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGh9ICR7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsuZGF5XG4gICAgICAgICAgICAgIH0ke3RoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLm1vbnRoV2Vla30gKmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNyb24geWVhcmx5IHN1YnRhYiBzZWxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0FkdmFuY2VkJzpcbiAgICAgICAgaWYgKCF0YWJDaGFuZ2UpIHRoaXMuX3VwZGF0ZUNyb24odGhpcy5mb3JtLnZhbHVlLmFkdmFuY2VkIHx8ICcnKTtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFkdmFuY2VkLnNldFZhbHVlKHRoaXMuY3Jvbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHRoaXMuc2hvd05vdFNldCkgdGhpcy5fdXBkYXRlQ3JvbignJyk7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNyb24gdHlwZScpO1xuICAgIH1cbiAgfVxuXG4gIG9uVGltZVpvbmVDaGFuZ2VkKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1RpbWVab25lKSByZXR1cm47XG4gICAgdGhpcy50aW1lWm9uZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uVGltZUNoYW5nZWQodmFsdWU6IENwc1RpbWUsIHRhcmdldDogYW55KTogdm9pZCB7XG4gICAgdGFyZ2V0LmhvdXJzID0gdGhpcy5fc3RyaW5nVG9OdW0odmFsdWUuaG91cnMpO1xuICAgIHRhcmdldC5taW51dGVzID0gdGhpcy5fc3RyaW5nVG9OdW0odmFsdWUubWludXRlcyk7XG4gICAgdGhpcy5yZWdlbmVyYXRlQ3JvbigpO1xuICB9XG5cbiAgZm9ybWF0VGltZVZhbHVlKHZhbHVlOiBhbnkpOiBDcHNUaW1lIHtcbiAgICByZXR1cm4ge1xuICAgICAgaG91cnM6IHRoaXMuX251bVRvU3RyaW5nKHZhbHVlLmhvdXJzKSxcbiAgICAgIG1pbnV0ZXM6IHRoaXMuX251bVRvU3RyaW5nKHZhbHVlLm1pbnV0ZXMpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUNyb24odmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNyb24gPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5jcm9uID0gdmFsdWU7XG4gICAgdGhpcy5jcm9uQ2hhbmdlLmVtaXQodGhpcy5jcm9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsaWRDcm9uKGNyb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgY3JvbiAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICghdGhpcy5zaG93Tm90U2V0KSB7XG4gICAgICBpZiAoIWNyb24pIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGNyb24gPT09ICcnKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IHBhcnRzID0gY3Jvbi5zcGxpdCgnICcpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDYpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3ZhbGlkYXRlQWR2YW5jZWRFeHByKGM6IEZvcm1Db250cm9sKSB7XG4gICAgY29uc3QgY3JvbiA9IGMudmFsdWU7XG4gICAgaWYgKCFjcm9uKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHNwbGl0cyA9IGNyb24/LnNwbGl0KCcgJykgfHwgW107XG4gICAgaWYgKHNwbGl0cy5sZW5ndGggIT09IDYpIHJldHVybiB7IGludmFsaWRFeHByZXNzaW9uOiAnSW52YWxpZCBleHByZXNzaW9uJyB9O1xuXG4gICAgY29uc3QgY3JvblNldmVuID0gYDAgJHtjcm9ufWA7XG5cbiAgICByZXR1cm4gY3JvblNldmVuLm1hdGNoKC9cXGQrIDBcXC9cXGQrIFxcKiAxXFwvMSBcXCogXFw/IFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goL1xcZCsgXFxkKyAwXFwvXFxkKyAxXFwvMSBcXCogXFw/IFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goL1xcZCsgXFxkKyBcXGQrIDFcXC9cXGQrIFxcKiBcXD8gXFwqLykgfHxcbiAgICAgIGNyb25TZXZlbi5tYXRjaCgvXFxkKyBcXGQrIFxcZCsgXFw/IFxcKiBNT04tRlJJIFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFwqIChNT058VFVFfFdFRHxUSFV8RlJJfFNBVHxTVU4pKCwoTU9OfFRVRXxXRUR8VEhVfEZSSXxTQVR8U1VOKSkqIFxcKi9cbiAgICAgICkgfHxcbiAgICAgIGNyb25TZXZlbi5tYXRjaCgvXFxkKyBcXGQrIFxcZCsgKFxcZCt8THxMV3wxVykgMVxcL1xcZCsgXFw/IFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFxkK1xcL1xcZCsgKE1PTnxUVUV8V0VEfFRIVXxGUkl8U0FUfFNVTikoKCNbMS01XSl8TCkgXFwqL1xuICAgICAgKSB8fFxuICAgICAgY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyAoXFxkK3xMfExXfDFXKSBcXGQrIFxcPyBcXCovKSB8fFxuICAgICAgY3JvblNldmVuLm1hdGNoKFxuICAgICAgICAvXFxkKyBcXGQrIFxcZCsgXFw/IFxcZCsgKE1PTnxUVUV8V0VEfFRIVXxGUkl8U0FUfFNVTikoKCNbMS01XSl8TCkgXFwqL1xuICAgICAgKVxuICAgICAgPyBudWxsXG4gICAgICA6IHsgaW52YWxpZEV4cHJlc3Npb246ICdJbnZhbGlkIGV4cHJlc3Npb24nIH07XG4gIH1cblxuICBwcml2YXRlIF9nZXRBbVBtSG91cihob3VyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnVzZTI0SG91clRpbWUgPyBob3VyIDogKChob3VyICsgMTEpICUgMTIpICsgMTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEhvdXJUeXBlKGhvdXI6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudXNlMjRIb3VyVGltZSA/IHVuZGVmaW5lZCA6IGhvdXIgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgfVxuXG4gIHByaXZhdGUgX2hvdXJUb0Nyb24oaG91cjogbnVtYmVyLCBob3VyVHlwZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy51c2UyNEhvdXJUaW1lKSB7XG4gICAgICByZXR1cm4gaG91cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGhvdXJUeXBlID09PSAnQU0nXG4gICAgICAgID8gaG91ciA9PT0gMTJcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IGhvdXJcbiAgICAgICAgOiBob3VyID09PSAxMlxuICAgICAgICAgID8gMTJcbiAgICAgICAgICA6IGhvdXIgKyAxMjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVNb2RlbENoYW5nZShjcm9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzVmFsaWRDcm9uKGNyb24pKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGNyb24gdmFsdWU6JywgY3Jvbik7XG4gICAgICB0aGlzLmNyb24gPSB0aGlzLnNob3dOb3RTZXQgPyAnJyA6IHRoaXMuX21pbnV0ZXNEZWZhdWx0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc0RpcnR5KSB7XG4gICAgICB0aGlzLl9pc0RpcnR5ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lzRGlydHkgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWNyb24gfHwgY3Jvbi5sZW5ndGggPCAxKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9ICdOb3Qgc2V0JztcbiAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3JvblNldmVuID0gYDAgJHtjcm9ufWA7XG5cbiAgICBjb25zdCBbbWludXRlcywgaG91cnMsIGRheU9mTW9udGgsIG1vbnRoLCBkYXlPZldlZWtdID0gY3Jvbi5zcGxpdCgnICcpO1xuXG4gICAgaWYgKGNyb25TZXZlbi5tYXRjaCgvXFxkKyAwXFwvXFxkKyBcXCogMVxcLzEgXFwqIFxcPyBcXCovKSkge1xuICAgICAgdGhpcy5hY3RpdmVTY2hlZHVsZVR5cGUgPSAnTWludXRlcyc7XG5cbiAgICAgIHRoaXMuc3RhdGUubWludXRlcy5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMuc3Vic3RyaW5nKDIpKTtcbiAgICB9IGVsc2UgaWYgKGNyb25TZXZlbi5tYXRjaCgvXFxkKyBcXGQrIDBcXC9cXGQrIDFcXC8xIFxcKiBcXD8gXFwqLykpIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ0hvdXJseSc7XG5cbiAgICAgIHRoaXMuc3RhdGUuaG91cmx5LmhvdXJzID0gTnVtYmVyKGhvdXJzLnN1YnN0cmluZygyKSk7XG4gICAgICB0aGlzLnN0YXRlLmhvdXJseS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyAxXFwvXFxkKyBcXCogXFw/IFxcKi8pKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9ICdEYWlseSc7XG5cbiAgICAgIHRoaXMuc3RhdGUuZGFpbHkuc3ViVGFiID0gJ2V2ZXJ5RGF5cyc7XG4gICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5kYXlzID0gTnVtYmVyKGRheU9mTW9udGguc3Vic3RyaW5nKDIpKTtcbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUuZGFpbHkuZXZlcnlEYXlzLmhvdXJzID0gdGhpcy5fZ2V0QW1QbUhvdXIocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeURheXMuaG91clR5cGUgPSB0aGlzLl9nZXRIb3VyVHlwZShwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyBcXD8gXFwqIE1PTi1GUkkgXFwqLykpIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ0RhaWx5JztcblxuICAgICAgdGhpcy5zdGF0ZS5kYWlseS5zdWJUYWIgPSAnZXZlcnlXZWVrRGF5JztcbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUuZGFpbHkuZXZlcnlXZWVrRGF5LmhvdXJzID0gdGhpcy5fZ2V0QW1QbUhvdXIocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeVdlZWtEYXkuaG91clR5cGUgPSB0aGlzLl9nZXRIb3VyVHlwZShwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFwqIChNT058VFVFfFdFRHxUSFV8RlJJfFNBVHxTVU4pKCwoTU9OfFRVRXxXRUR8VEhVfEZSSXxTQVR8U1VOKSkqIFxcKi9cbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ1dlZWtseSc7XG4gICAgICB0aGlzLnNlbGVjdE9wdGlvbnMuZGF5c1xuICAgICAgICAubWFwKChkKSA9PiBkLnZhbHVlKVxuICAgICAgICAuZm9yRWFjaCgod2Vla0RheSkgPT4gKHRoaXMuc3RhdGUud2Vla2x5W3dlZWtEYXldID0gZmFsc2UpKTtcbiAgICAgIGRheU9mV2Vla1xuICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAuZm9yRWFjaCgod2Vla0RheSkgPT4gKHRoaXMuc3RhdGUud2Vla2x5W3dlZWtEYXldID0gdHJ1ZSkpO1xuICAgICAgY29uc3QgcGFyc2VkSG91cnMgPSBOdW1iZXIoaG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS53ZWVrbHkuaG91cnMgPSB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLndlZWtseS5ob3VyVHlwZSA9IHRoaXMuX2dldEhvdXJUeXBlKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUud2Vla2x5Lm1pbnV0ZXMgPSBOdW1iZXIobWludXRlcyk7XG4gICAgfSBlbHNlIGlmIChjcm9uU2V2ZW4ubWF0Y2goL1xcZCsgXFxkKyBcXGQrIChcXGQrfEx8TFd8MVcpIDFcXC9cXGQrIFxcPyBcXCovKSkge1xuICAgICAgdGhpcy5hY3RpdmVTY2hlZHVsZVR5cGUgPSAnTW9udGhseSc7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3ViVGFiID0gJ3NwZWNpZmljRGF5JztcblxuICAgICAgaWYgKGRheU9mTW9udGguaW5kZXhPZignVycpICE9PSAtMSkge1xuICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkuZGF5ID0gZGF5T2ZNb250aC5jaGFyQXQoMCk7XG4gICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5ydW5PbldlZWtkYXkgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljRGF5LmRheSA9IGRheU9mTW9udGg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5tb250aHMgPSBOdW1iZXIobW9udGguc3Vic3RyaW5nKDIpKTtcbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5ob3VycyA9IHRoaXMuX2dldEFtUG1Ib3VyKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5ob3VyVHlwZSA9IHRoaXMuX2dldEhvdXJUeXBlKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFxkK1xcL1xcZCsgKE1PTnxUVUV8V0VEfFRIVXxGUkl8U0FUfFNVTikoKCNbMS01XSl8TCkgXFwqL1xuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3QgZGF5ID0gZGF5T2ZXZWVrLnN1YnN0cmluZygwLCAzKTtcbiAgICAgIGNvbnN0IG1vbnRoV2VlayA9IGRheU9mV2Vlay5zdWJzdHJpbmcoMyk7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9ICdNb250aGx5JztcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zdWJUYWIgPSAnc3BlY2lmaWNXZWVrRGF5JztcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkubW9udGhXZWVrID0gbW9udGhXZWVrO1xuICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5kYXkgPSBkYXk7XG5cbiAgICAgIGlmIChtb250aC5pbmRleE9mKCcvJykgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IFtzdGFydE1vbnRoLCBtb250aHNdID0gbW9udGguc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5tb250aHMgPSBtb250aHM7XG4gICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuc3RhcnRNb250aCA9IHN0YXJ0TW9udGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuaG91cnMgPSB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5LmhvdXJUeXBlID1cbiAgICAgICAgdGhpcy5fZ2V0SG91clR5cGUocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyAoXFxkK3xMfExXfDFXKSBcXGQrIFxcPyBcXCovKSkge1xuICAgICAgdGhpcy5hY3RpdmVTY2hlZHVsZVR5cGUgPSAnWWVhcmx5JztcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnN1YlRhYiA9ICdzcGVjaWZpY01vbnRoRGF5JztcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkubW9udGggPSBOdW1iZXIobW9udGgpO1xuXG4gICAgICBpZiAoZGF5T2ZNb250aC5pbmRleE9mKCdXJykgIT09IC0xKSB7XG4gICAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkuZGF5ID0gZGF5T2ZNb250aC5jaGFyQXQoMCk7XG4gICAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnJ1bk9uV2Vla2RheSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmRheSA9IGRheU9mTW9udGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkuaG91cnMgPSB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmhvdXJUeXBlID1cbiAgICAgICAgdGhpcy5fZ2V0SG91clR5cGUocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFxkKyAoTU9OfFRVRXxXRUR8VEhVfEZSSXxTQVR8U1VOKSgoI1sxLTVdKXxMKSBcXCovXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCBkYXkgPSBkYXlPZldlZWsuc3Vic3RyaW5nKDAsIDMpO1xuICAgICAgY29uc3QgbW9udGhXZWVrID0gZGF5T2ZXZWVrLnN1YnN0cmluZygzKTtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ1llYXJseSc7XG4gICAgICB0aGlzLnN0YXRlLnllYXJseS5zdWJUYWIgPSAnc3BlY2lmaWNNb250aFdlZWsnO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGhXZWVrID0gbW9udGhXZWVrO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsuZGF5ID0gZGF5O1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGggPSBOdW1iZXIobW9udGgpO1xuICAgICAgY29uc3QgcGFyc2VkSG91cnMgPSBOdW1iZXIoaG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsuaG91cnMgPVxuICAgICAgICB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoV2Vlay5ob3VyVHlwZSA9XG4gICAgICAgIHRoaXMuX2dldEhvdXJUeXBlKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLm1pbnV0ZXMgPSBOdW1iZXIobWludXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ0FkdmFuY2VkJztcbiAgICAgIHRoaXMuZm9ybS5jb250cm9scy5hZHZhbmNlZC5zZXRWYWx1ZShjcm9uKTtcbiAgICB9XG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldERlZmF1bHRTdGF0ZSgpIHtcbiAgICBjb25zdCBbZGVmYXVsdEhvdXJzLCBkZWZhdWx0TWludXRlc10gPSB0aGlzLmRlZmF1bHRUaW1lXG4gICAgICAuc3BsaXQoJzonKVxuICAgICAgLm1hcChOdW1iZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbnV0ZXM6IHtcbiAgICAgICAgbWludXRlczogMVxuICAgICAgfSxcbiAgICAgIGhvdXJseToge1xuICAgICAgICBob3VyczogMSxcbiAgICAgICAgbWludXRlczogMFxuICAgICAgfSxcbiAgICAgIGRhaWx5OiB7XG4gICAgICAgIHN1YlRhYjogJ2V2ZXJ5RGF5cycsXG4gICAgICAgIGV2ZXJ5RGF5czoge1xuICAgICAgICAgIGRheXM6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfSxcbiAgICAgICAgZXZlcnlXZWVrRGF5OiB7XG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdlZWtseToge1xuICAgICAgICBNT046IHRydWUsXG4gICAgICAgIFRVRTogZmFsc2UsXG4gICAgICAgIFdFRDogZmFsc2UsXG4gICAgICAgIFRIVTogZmFsc2UsXG4gICAgICAgIEZSSTogZmFsc2UsXG4gICAgICAgIFNBVDogZmFsc2UsXG4gICAgICAgIFNVTjogZmFsc2UsXG4gICAgICAgIGhvdXJzOiB0aGlzLl9nZXRBbVBtSG91cihkZWZhdWx0SG91cnMpLFxuICAgICAgICBtaW51dGVzOiBkZWZhdWx0TWludXRlcyxcbiAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgIH0sXG4gICAgICBtb250aGx5OiB7XG4gICAgICAgIHN1YlRhYjogJ3NwZWNpZmljRGF5JyxcbiAgICAgICAgcnVuT25XZWVrZGF5OiBmYWxzZSxcbiAgICAgICAgc3BlY2lmaWNEYXk6IHtcbiAgICAgICAgICBkYXk6ICcxJyxcbiAgICAgICAgICBtb250aHM6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfSxcbiAgICAgICAgc3BlY2lmaWNXZWVrRGF5OiB7XG4gICAgICAgICAgbW9udGhXZWVrOiAnIzEnLFxuICAgICAgICAgIGRheTogJ01PTicsXG4gICAgICAgICAgc3RhcnRNb250aDogMSxcbiAgICAgICAgICBtb250aHM6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHllYXJseToge1xuICAgICAgICBzdWJUYWI6ICdzcGVjaWZpY01vbnRoRGF5JyxcbiAgICAgICAgcnVuT25XZWVrZGF5OiBmYWxzZSxcbiAgICAgICAgc3BlY2lmaWNNb250aERheToge1xuICAgICAgICAgIG1vbnRoOiAxLFxuICAgICAgICAgIGRheTogJzEnLFxuICAgICAgICAgIGhvdXJzOiB0aGlzLl9nZXRBbVBtSG91cihkZWZhdWx0SG91cnMpLFxuICAgICAgICAgIG1pbnV0ZXM6IGRlZmF1bHRNaW51dGVzLFxuICAgICAgICAgIGhvdXJUeXBlOiB0aGlzLl9nZXRIb3VyVHlwZShkZWZhdWx0SG91cnMpXG4gICAgICAgIH0sXG4gICAgICAgIHNwZWNpZmljTW9udGhXZWVrOiB7XG4gICAgICAgICAgbW9udGhXZWVrOiAnIzEnLFxuICAgICAgICAgIGRheTogJ01PTicsXG4gICAgICAgICAgbW9udGg6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFkdmFuY2VkOiB7XG4gICAgICAgIGV4cHJlc3Npb246IHRoaXMuY3JvblxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9nZXRSYW5nZShzdGFydEZyb206IG51bWJlciwgdW50aWw6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiB1bnRpbCArIDEgLSBzdGFydEZyb20gfSxcbiAgICAgIChfLCBrKSA9PiBrICsgc3RhcnRGcm9tXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlbGVjdE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vbnRoc051bWVyaWM6IHRoaXMuX2dldFJhbmdlKDEsIDEyKS5tYXAoKG1vbnRoKSA9PiAoe1xuICAgICAgICBsYWJlbDogbW9udGgsXG4gICAgICAgIHZhbHVlOiBtb250aFxuICAgICAgfSkpLFxuICAgICAgbW9udGhzOiB0aGlzLl9nZXRSYW5nZSgxLCAxMikubWFwKChtb250aCkgPT4gKHtcbiAgICAgICAgbGFiZWw6IE1vbnRoc1ttb250aF0sXG4gICAgICAgIHZhbHVlOiBtb250aFxuICAgICAgfSkpLFxuICAgICAgbW9udGhXZWVrczogT2JqZWN0LmVudHJpZXMoTW9udGhXZWVrcykubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGxhYmVsOiB2YWx1ZSxcbiAgICAgICAgdmFsdWU6IGtleVxuICAgICAgfSkpLFxuICAgICAgZGF5czogT2JqZWN0LmVudHJpZXMoRGF5cykubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGxhYmVsOiB2YWx1ZSxcbiAgICAgICAgdmFsdWU6IGtleVxuICAgICAgfSkpLFxuICAgICAgbWludXRlczogdGhpcy5fZ2V0UmFuZ2UoMSwgNTkpLm1hcCgobWluKSA9PiAoe1xuICAgICAgICBsYWJlbDogbWluLFxuICAgICAgICB2YWx1ZTogbWluXG4gICAgICB9KSksXG4gICAgICBmdWxsTWludXRlczogdGhpcy5fZ2V0UmFuZ2UoMCwgNTkpLm1hcCgobWluKSA9PiAoe1xuICAgICAgICBsYWJlbDogdGhpcy5fbnVtVG9TdHJpbmcobWluKSxcbiAgICAgICAgdmFsdWU6IG1pblxuICAgICAgfSkpLFxuICAgICAgaG91cnM6IHRoaXMuX2dldFJhbmdlKDEsIDIzKS5tYXAoKGhvdXIpID0+ICh7XG4gICAgICAgIGxhYmVsOiBob3VyLFxuICAgICAgICB2YWx1ZTogaG91clxuICAgICAgfSkpLFxuICAgICAgbW9udGhEYXlzOiB0aGlzLl9nZXRSYW5nZSgxLCAzMSkubWFwKChkYXkpID0+ICh7XG4gICAgICAgIGxhYmVsOiBkYXksXG4gICAgICAgIHZhbHVlOiBkYXlcbiAgICAgIH0pKSxcbiAgICAgIG1vbnRoRGF5c1dpdGhMYXN0czogWy4uLnRoaXMuX2dldFJhbmdlKDEsIDMxKS5tYXAoU3RyaW5nKSwgJ0wnXS5tYXAoXG4gICAgICAgIChtZGwpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2dldE1vbnRoRGF5TGFiZWwobWRsKSxcbiAgICAgICAgICAgIHZhbHVlOiBtZGxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE1vbnRoRGF5TGFiZWwobW9udGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKG1vbnRoID09PSAnTCcpIHtcbiAgICAgIHJldHVybiAnTGFzdCBEYXknO1xuICAgIH0gZWxzZSBpZiAobW9udGggPT09ICdMVycpIHtcbiAgICAgIHJldHVybiAnTGFzdCBXZWVrZGF5JztcbiAgICB9IGVsc2UgaWYgKG1vbnRoID09PSAnMVcnKSB7XG4gICAgICByZXR1cm4gJ0ZpcnN0IFdlZWtkYXknO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgc3VmZml4ID0gJyc7XG4gICAgICBpZiAobW9udGgubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzZWNvbmRUb0xhc3REaWdpdCA9IG1vbnRoLmNoYXJBdChtb250aC5sZW5ndGggLSAyKTtcbiAgICAgICAgaWYgKHNlY29uZFRvTGFzdERpZ2l0ID09PSAnMScpIHtcbiAgICAgICAgICBzdWZmaXggPSAndGgnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXN1ZmZpeCkge1xuICAgICAgICBjb25zdCBsYXN0RGlnaXQgPSBtb250aC5jaGFyQXQobW9udGgubGVuZ3RoIC0gMSk7XG4gICAgICAgIHN3aXRjaCAobGFzdERpZ2l0KSB7XG4gICAgICAgICAgY2FzZSAnMSc6XG4gICAgICAgICAgICBzdWZmaXggPSAnc3QnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnMic6XG4gICAgICAgICAgICBzdWZmaXggPSAnbmQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnMyc6XG4gICAgICAgICAgICBzdWZmaXggPSAncmQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHN1ZmZpeCA9ICd0aCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYCR7bW9udGh9JHtzdWZmaXh9IGRheWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbnVtVG9TdHJpbmcodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gOSA/ICcwJyArIHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0cmluZ1RvTnVtKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlcyA9IE51bWJlcih2YWx1ZSk7XG4gICAgcmV0dXJuIGlzTmFOKHJlcykgPyAwIDogcmVzO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3RvclwiPlxuICA8Y3BzLWJ1dHRvbi10b2dnbGVcbiAgICBbb3B0aW9uc109XCJzY2hlZHVsZVR5cGVzXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtsYWJlbF09XCJsYWJlbFwiXG4gICAgW2luZm9Ub29sdGlwXT1cImluZm9Ub29sdGlwXCJcbiAgICBbKG5nTW9kZWwpXT1cImFjdGl2ZVNjaGVkdWxlVHlwZVwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0QWN0aXZlU2NoZWR1bGVUeXBlKCRldmVudClcIj5cbiAgPC9jcHMtYnV0dG9uLXRvZ2dsZT5cbjwvZGl2PlxuXG48ZGl2XG4gIFtuZ1N3aXRjaF09XCJhY3RpdmVTY2hlZHVsZVR5cGVcIlxuICBjbGFzcz1cImNwcy1zY2hlZHVsZXItY29udGFpbmVyXCJcbiAgW25nQ2xhc3NdPVwieyAnY3BzLXNjaGVkdWxlci1jb250YWluZXItZGlzYWJsZWQnOiBkaXNhYmxlZCB9XCI+XG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidOb3Qgc2V0J1wiIGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZVwiPjwvZGl2PlxuXG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidNaW51dGVzJ1wiIGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvd1wiPlxuICAgICAgRXZlcnlcbiAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgIHdpZHRoPVwiNzBweFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUubWludXRlcy5taW51dGVzXCJcbiAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5taW51dGVzXCJcbiAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICBtaW51dGUocylcbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0hvdXJseSdcIiBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3dcIj5cbiAgICAgIEV2ZXJ5XG4gICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICB3aWR0aD1cIjcwcHhcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLmhvdXJseS5ob3Vyc1wiXG4gICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMuaG91cnNcIlxuICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgIGhvdXIocykgb24gbWludXRlXG4gICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICB3aWR0aD1cIjcwcHhcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLmhvdXJseS5taW51dGVzXCJcbiAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5mdWxsTWludXRlc1wiXG4gICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgPC9jcHMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInRGFpbHknXCIgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lXCI+XG4gICAgPGNwcy1yYWRpby1ncm91cFxuICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5kYWlseS5zdWJUYWJcIlxuICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgIFt2ZXJ0aWNhbF09XCJ0cnVlXCI+XG4gICAgICA8Y3BzLXJhZGlvIFtvcHRpb25dPVwieyB2YWx1ZTogJ2V2ZXJ5RGF5cycsIGRpc2FibGVkOiBkaXNhYmxlZCB9XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3ctZGlzYWJsZWQnOlxuICAgICAgICAgICAgICBzdGF0ZS5kYWlseS5zdWJUYWIgIT09ICdldmVyeURheXMnXG4gICAgICAgICAgfVwiPlxuICAgICAgICAgIEV2ZXJ5XG4gICAgICAgICAgPGNwcy1zZWxlY3RcbiAgICAgICAgICAgIHdpZHRoPVwiNzBweFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUuZGFpbHkuc3ViVGFiICE9PSAnZXZlcnlEYXlzJ1wiXG4gICAgICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5kYXlzXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMubW9udGhEYXlzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICBkYXkocykgYXRcbiAgICAgICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5kYWlseS5zdWJUYWIgIT09ICdldmVyeURheXMnXCJcbiAgICAgICAgICAgIFt1c2UyNEhvdXJUaW1lXT1cInVzZTI0SG91clRpbWVcIlxuICAgICAgICAgICAgW21hbmRhdG9yeVZhbHVlXT1cInRydWVcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm1hdFRpbWVWYWx1ZShzdGF0ZS5kYWlseS5ldmVyeURheXMpXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwib25UaW1lQ2hhbmdlZCgkZXZlbnQsIHN0YXRlLmRhaWx5LmV2ZXJ5RGF5cylcIj5cbiAgICAgICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvY3BzLXJhZGlvPlxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdldmVyeVdlZWtEYXknLCBkaXNhYmxlZDogZGlzYWJsZWQgfVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvd1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2Nwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93LWRpc2FibGVkJzpcbiAgICAgICAgICAgICAgc3RhdGUuZGFpbHkuc3ViVGFiICE9PSAnZXZlcnlXZWVrRGF5J1xuICAgICAgICAgIH1cIj5cbiAgICAgICAgICBFdmVyeSB3b3JraW5nIGRheSBhdFxuICAgICAgICAgIDxjcHMtdGltZXBpY2tlclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLmRhaWx5LnN1YlRhYiAhPT0gJ2V2ZXJ5V2Vla0RheSdcIlxuICAgICAgICAgICAgW3VzZTI0SG91clRpbWVdPVwidXNlMjRIb3VyVGltZVwiXG4gICAgICAgICAgICBbbWFuZGF0b3J5VmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZm9ybWF0VGltZVZhbHVlKHN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheSlcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUuZGFpbHkuZXZlcnlXZWVrRGF5KVwiPlxuICAgICAgICAgIDwvY3BzLXRpbWVwaWNrZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jcHMtcmFkaW8+XG4gICAgPC9jcHMtcmFkaW8tZ3JvdXA+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidXZWVrbHknXCIgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lXCI+XG4gICAgPGRpdiBjbGFzcz1cImNwcy1zY2hlZHVsZXItZGF5cy1jaGVja2JveC1ncm91cFwiPlxuICAgICAgPGNwcy1jaGVja2JveFxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBsYWJlbD1cIk1vbmRheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5Lk1PTlwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiVHVlc2RheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5LlRVRVwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiV2VkbmVzZGF5XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS53ZWVrbHkuV0VEXCI+XG4gICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgbGFiZWw9XCJUaHVyc2RheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5LlRIVVwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiRnJpZGF5XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS53ZWVrbHkuRlJJXCI+XG4gICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgbGFiZWw9XCJTYXR1cmRheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5LlNBVFwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiU3VuZGF5XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS53ZWVrbHkuU1VOXCI+XG4gICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3dcIj5cbiAgICAgIGF0XG4gICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW3VzZTI0SG91clRpbWVdPVwidXNlMjRIb3VyVGltZVwiXG4gICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgW3ZhbHVlXT1cImZvcm1hdFRpbWVWYWx1ZShzdGF0ZS53ZWVrbHkpXCJcbiAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cIm9uVGltZUNoYW5nZWQoJGV2ZW50LCBzdGF0ZS53ZWVrbHkpXCI+XG4gICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInTW9udGhseSdcIiBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmVcIj5cbiAgICA8Y3BzLXJhZGlvLWdyb3VwXG4gICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLm1vbnRobHkuc3ViVGFiXCJcbiAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICBbdmVydGljYWxdPVwidHJ1ZVwiPlxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY0RheScsIGRpc2FibGVkOiBkaXNhYmxlZCB9XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3ctZGlzYWJsZWQnOlxuICAgICAgICAgICAgICBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljRGF5J1xuICAgICAgICAgIH1cIj5cbiAgICAgICAgICBPbiB0aGVcbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCIxMjBweFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljRGF5LmRheVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoRGF5c1dpdGhMYXN0c1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgb2YgZXZlcnlcbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCI3MHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljRGF5J1wiXG4gICAgICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkubW9udGhzXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMubW9udGhzTnVtZXJpY1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgbW9udGgocykgYXRcbiAgICAgICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljRGF5J1wiXG4gICAgICAgICAgICBbdXNlMjRIb3VyVGltZV09XCJ1c2UyNEhvdXJUaW1lXCJcbiAgICAgICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtYXRUaW1lVmFsdWUoc3RhdGUubW9udGhseS5zcGVjaWZpY0RheSlcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUubW9udGhseS5zcGVjaWZpY0RheSlcIj5cbiAgICAgICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgICAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY0RheSdcIlxuICAgICAgICAgICAgbGFiZWw9XCJEdXJpbmcgdGhlIG5lYXJlc3Qgd2Vla2RheVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLm1vbnRobHkucnVuT25XZWVrZGF5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1uZWFyZXN0LXdlZWtkYXktY2hlY2tib3hcIj5cbiAgICAgICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Nwcy1yYWRpbz5cblxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY1dlZWtEYXknLCBkaXNhYmxlZDogZGlzYWJsZWQgfVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvd1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2Nwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93LWRpc2FibGVkJzpcbiAgICAgICAgICAgICAgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY1dlZWtEYXknXG4gICAgICAgICAgfVwiPlxuICAgICAgICAgIE9uIHRoZVxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEwNnB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljV2Vla0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5tb250aFdlZWtcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5tb250aFdlZWtzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCIxMzBweFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY1dlZWtEYXknXCJcbiAgICAgICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuZGF5XCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMuZGF5c1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgb2YgZXZlcnlcbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCI5MHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljV2Vla0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5tb250aHNcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5tb250aHNOdW1lcmljXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICBtb250aChzKSBzdGFydGluZyBpblxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEyMHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljV2Vla0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5zdGFydE1vbnRoXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMubW9udGhzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICBhdFxuICAgICAgICAgIDxjcHMtdGltZXBpY2tlclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLm1vbnRobHkuc3ViVGFiICE9PSAnc3BlY2lmaWNXZWVrRGF5J1wiXG4gICAgICAgICAgICBbdXNlMjRIb3VyVGltZV09XCJ1c2UyNEhvdXJUaW1lXCJcbiAgICAgICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtYXRUaW1lVmFsdWUoc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkpXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwiXG4gICAgICAgICAgICAgIG9uVGltZUNoYW5nZWQoJGV2ZW50LCBzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheSlcbiAgICAgICAgICAgIFwiPlxuICAgICAgICAgIDwvY3BzLXRpbWVwaWNrZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jcHMtcmFkaW8+XG4gICAgPC9jcHMtcmFkaW8tZ3JvdXA+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidZZWFybHknXCIgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lXCI+XG4gICAgPGNwcy1yYWRpby1ncm91cFxuICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkuc3ViVGFiXCJcbiAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICBbdmVydGljYWxdPVwidHJ1ZVwiPlxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY01vbnRoRGF5JywgZGlzYWJsZWQ6IGRpc2FibGVkIH1cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3dcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvdy1kaXNhYmxlZCc6XG4gICAgICAgICAgICAgIHN0YXRlLnllYXJseS5zdWJUYWIgIT09ICdzcGVjaWZpY01vbnRoRGF5J1xuICAgICAgICAgIH1cIj5cbiAgICAgICAgICBFdmVyeVxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEyMHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aERheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5tb250aFwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoc1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgb24gdGhlXG4gICAgICAgICAgPGNwcy1zZWxlY3RcbiAgICAgICAgICAgIHdpZHRoPVwiMTIwcHhcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLnllYXJseS5zdWJUYWIgIT09ICdzcGVjaWZpY01vbnRoRGF5J1wiXG4gICAgICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmRheVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoRGF5c1dpdGhMYXN0c1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgYXRcbiAgICAgICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aERheSdcIlxuICAgICAgICAgICAgW3VzZTI0SG91clRpbWVdPVwidXNlMjRIb3VyVGltZVwiXG4gICAgICAgICAgICBbbWFuZGF0b3J5VmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZm9ybWF0VGltZVZhbHVlKHN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5KVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cIlxuICAgICAgICAgICAgICBvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkpXG4gICAgICAgICAgICBcIj5cbiAgICAgICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgICAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUueWVhcmx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljTW9udGhEYXknXCJcbiAgICAgICAgICAgIGxhYmVsPVwiRHVyaW5nIHRoZSBuZWFyZXN0IHdlZWtkYXlcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkucnVuT25XZWVrZGF5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1uZWFyZXN0LXdlZWtkYXktY2hlY2tib3hcIj5cbiAgICAgICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Nwcy1yYWRpbz5cblxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY01vbnRoV2VlaycsIGRpc2FibGVkOiBkaXNhYmxlZCB9XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3ctZGlzYWJsZWQnOlxuICAgICAgICAgICAgICBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aFdlZWsnXG4gICAgICAgICAgfVwiPlxuICAgICAgICAgIE9uIHRoZVxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEwNnB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aFdlZWsnXCJcbiAgICAgICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLm1vbnRoV2Vla1wiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoV2Vla3NcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICAgICAgPC9jcHMtc2VsZWN0PlxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEyMHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aFdlZWsnXCJcbiAgICAgICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLmRheVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLmRheXNcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICAgICAgPC9jcHMtc2VsZWN0PlxuICAgICAgICAgIG9mXG4gICAgICAgICAgPGNwcy1zZWxlY3RcbiAgICAgICAgICAgIHdpZHRoPVwiMTIwcHhcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLnllYXJseS5zdWJUYWIgIT09ICdzcGVjaWZpY01vbnRoV2VlaydcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGhcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5tb250aHNcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICAgICAgPC9jcHMtc2VsZWN0PlxuICAgICAgICAgIGF0XG4gICAgICAgICAgPGNwcy10aW1lcGlja2VyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUueWVhcmx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljTW9udGhXZWVrJ1wiXG4gICAgICAgICAgICBbdXNlMjRIb3VyVGltZV09XCJ1c2UyNEhvdXJUaW1lXCJcbiAgICAgICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtYXRUaW1lVmFsdWUoc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrKVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cIlxuICAgICAgICAgICAgICBvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrKVxuICAgICAgICAgICAgXCI+XG4gICAgICAgICAgPC9jcHMtdGltZXBpY2tlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Nwcy1yYWRpbz5cbiAgICA8L2Nwcy1yYWRpby1ncm91cD5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0FkdmFuY2VkJ1wiPlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgICAgPGNwcy1pbnB1dFxuICAgICAgICBsYWJlbD1cIlwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIHdpZHRoPVwiNTAwcHhcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIlBsZWFzZSBlbnRlclwiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkdmFuY2VkXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCI+XG4gICAgICA8L2Nwcy1pbnB1dD5cbiAgICA8L2Zvcm0+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci10aW1lLXpvbmVcIiAqbmdJZj1cImNyb24gJiYgc2hvd1RpbWVab25lXCI+XG4gICAgPGNwcy1hdXRvY29tcGxldGVcbiAgICAgIGxhYmVsPVwiVGltZSB6b25lXCJcbiAgICAgIFsobmdNb2RlbCldPVwidGltZVpvbmVcIlxuICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJvblRpbWVab25lQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgd2lkdGg9XCIzMDBcIlxuICAgICAgW29wdGlvbnNdPVwidGltZVpvbmVPcHRpb25zXCI+PC9jcHMtYXV0b2NvbXBsZXRlPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19