@wkly/datetime-picker 12.0.0 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/cdk-overlay/index.d.ts +5 -0
  2. package/cdk-overlay/public-api.d.ts +10 -0
  3. package/config.d.ts +3 -0
  4. package/esm2020/cdk-overlay/public-api.mjs +137 -0
  5. package/{esm2015/cdk-overlay/wkly-datetime-picker-cdk-overlay.js → esm2020/cdk-overlay/wkly-datetime-picker-cdk-overlay.mjs} +1 -1
  6. package/esm2020/config.mjs +100 -0
  7. package/esm2020/field.component.mjs +253 -0
  8. package/esm2020/picker.component.mjs +955 -0
  9. package/esm2020/presentation.mjs +303 -0
  10. package/esm2020/public-api.mjs +31 -0
  11. package/{esm2015/wkly-datetime-picker.js → esm2020/wkly-datetime-picker.mjs} +1 -1
  12. package/fesm2015/wkly-datetime-picker-cdk-overlay.mjs +143 -0
  13. package/fesm2015/wkly-datetime-picker-cdk-overlay.mjs.map +1 -0
  14. package/fesm2015/wkly-datetime-picker.mjs +1624 -0
  15. package/fesm2015/wkly-datetime-picker.mjs.map +1 -0
  16. package/fesm2020/wkly-datetime-picker-cdk-overlay.mjs +143 -0
  17. package/fesm2020/wkly-datetime-picker-cdk-overlay.mjs.map +1 -0
  18. package/fesm2020/wkly-datetime-picker.mjs +1622 -0
  19. package/fesm2020/wkly-datetime-picker.mjs.map +1 -0
  20. package/field.component.d.ts +3 -0
  21. package/{cdk-overlay/wkly-datetime-picker-cdk-overlay.d.ts → index.d.ts} +1 -0
  22. package/package.json +35 -15
  23. package/picker.component.d.ts +3 -0
  24. package/presentation.d.ts +7 -0
  25. package/public-api.d.ts +8 -0
  26. package/bundles/wkly-datetime-picker-cdk-overlay.umd.js +0 -675
  27. package/bundles/wkly-datetime-picker-cdk-overlay.umd.js.map +0 -1
  28. package/bundles/wkly-datetime-picker.umd.js +0 -2373
  29. package/bundles/wkly-datetime-picker.umd.js.map +0 -1
  30. package/cdk-overlay/package.json +0 -11
  31. package/cdk-overlay/public-api.ngfactory.d.ts +0 -3
  32. package/cdk-overlay/wkly-datetime-picker-cdk-overlay.metadata.json +0 -1
  33. package/esm2015/cdk-overlay/public-api.js +0 -127
  34. package/esm2015/cdk-overlay/public-api.ngfactory.js +0 -19
  35. package/esm2015/cdk-overlay/public-api.ngsummary.json +0 -1
  36. package/esm2015/cdk-overlay/wkly-datetime-picker-cdk-overlay.ngsummary.json +0 -1
  37. package/esm2015/config.js +0 -241
  38. package/esm2015/config.ngsummary.json +0 -1
  39. package/esm2015/field.component.css.shim.ngstyle.js +0 -9
  40. package/esm2015/field.component.js +0 -240
  41. package/esm2015/field.component.ngfactory.js +0 -52
  42. package/esm2015/field.component.ngsummary.json +0 -1
  43. package/esm2015/picker.component.js +0 -929
  44. package/esm2015/picker.component.ngfactory.js +0 -137
  45. package/esm2015/picker.component.ngsummary.json +0 -1
  46. package/esm2015/presentation.js +0 -295
  47. package/esm2015/presentation.ngsummary.json +0 -1
  48. package/esm2015/public-api.js +0 -24
  49. package/esm2015/public-api.ngfactory.js +0 -13
  50. package/esm2015/public-api.ngsummary.json +0 -1
  51. package/esm2015/wkly-datetime-picker.ngsummary.json +0 -1
  52. package/fesm2015/wkly-datetime-picker-cdk-overlay.js +0 -134
  53. package/fesm2015/wkly-datetime-picker-cdk-overlay.js.map +0 -1
  54. package/fesm2015/wkly-datetime-picker.js +0 -1715
  55. package/fesm2015/wkly-datetime-picker.js.map +0 -1
  56. package/field.component.css.shim.ngstyle.d.ts +0 -1
  57. package/field.component.ngfactory.d.ts +0 -1
  58. package/picker.component.ngfactory.d.ts +0 -1
  59. package/public-api.ngfactory.d.ts +0 -3
  60. package/wkly-datetime-picker.d.ts +0 -5
  61. package/wkly-datetime-picker.metadata.json +0 -1
@@ -1,929 +0,0 @@
1
- import { ChangeDetectorRef, Component, ElementRef, forwardRef, Inject, LOCALE_ID, PLATFORM_ID, ViewChild, } from "@angular/core";
2
- import { getLocaleFirstDayOfWeek, isPlatformBrowser } from "@angular/common";
3
- import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from "@angular/forms";
4
- import { absoluteWeekOf, createWeekGenerator, firstEpochDayOf, integer, } from "@wkly/core";
5
- import { decodeIso, error, resolveWeekOffset, validateSelection, WklyGregorianCalendarAdapter, } from "@wkly/adapters";
6
- import { draftDayDifference, setDraftDayDifference, calendarMonthBounds, resolveWklyTranslation, createWeekRows, validateDrafts, } from "@wkly/presentation";
7
- import { coerceBoolean, WKLY_CLOCK, WKLY_CONFIG, WKLY_LOCALIZATION, WKLY_TRANSLATIONS, WklyPickerInputs, WklyPickerInputsPropertyKeys, WklyPickerOutputsPropertyKeys, } from "./config";
8
- export class WklyDateTimePickerComponent extends WklyPickerInputs {
9
- constructor(defaultLocale, defaults, clock, strings, defaultTranslations, platform, host, changeDetector) {
10
- super();
11
- this.defaultLocale = defaultLocale;
12
- this.defaults = defaults;
13
- this.clock = clock;
14
- this.strings = strings;
15
- this.defaultTranslations = defaultTranslations;
16
- this.host = host;
17
- this.changeDetector = changeDetector;
18
- this.presentation = "inline";
19
- this.viewMode = "calendar";
20
- this.endView = "date";
21
- this.effectiveLocale = "en-US";
22
- this.effectiveOffset = 0;
23
- this.effectiveHourCycle = "h24";
24
- this.direction = "ltr";
25
- this.rows = [];
26
- this.weekdays = [];
27
- this.drafts = [];
28
- this.errors = [];
29
- this.today = 0;
30
- this.focused = 0;
31
- this.anchorWeek = 0;
32
- this.firstWeek = 0;
33
- this.visibleCount = 6;
34
- this.rowHeight = 76;
35
- this.scrollHeight = 152076;
36
- this.paddingTop = 0;
37
- this.initialized = false;
38
- this.compact = false;
39
- this.WklyPickerInputsPropertyKeys = WklyPickerInputsPropertyKeys;
40
- this.baseWeek = 0;
41
- this.firstSupportedDay = 0;
42
- this.lastSupportedDay = 0;
43
- this.firstSupportedWeek = 0;
44
- this.lastSupportedWeek = 0;
45
- this.initialMonth = "";
46
- this.clipMonth = false;
47
- this.browser = false;
48
- this.destroyed = false;
49
- this.snapPending = false;
50
- this.onChange = () => { };
51
- this.onTouched = () => { };
52
- this.validatorChanged = () => { };
53
- this.configErrors = [];
54
- this.pendingValue = null;
55
- this.emittedValue = null;
56
- this.manualDateEndpoint = 0;
57
- this.browser = isPlatformBrowser(platform);
58
- }
59
- ngOnInit() {
60
- this.initialize();
61
- }
62
- ngOnChanges(changes) {
63
- if (this.initialized) {
64
- if (Object.keys(changes).length === 1 &&
65
- changes[WklyPickerInputsPropertyKeys.Value] &&
66
- this.emittedValue ===
67
- JSON.stringify(this[WklyPickerInputsPropertyKeys.Value])) {
68
- this.emittedValue = null;
69
- return;
70
- }
71
- const focus = this.focused;
72
- this.configure();
73
- if (changes[WklyPickerInputsPropertyKeys.Value] ||
74
- changes[WklyPickerInputsPropertyKeys.Mode] ||
75
- changes[WklyPickerInputsPropertyKeys.CalendarAdapter]) {
76
- this.load(this[WklyPickerInputsPropertyKeys.Value]);
77
- this.position(this.focused, true);
78
- }
79
- else {
80
- this.check();
81
- if (changes[WklyPickerInputsPropertyKeys.ViewportPreset])
82
- this.position(focus, true);
83
- else
84
- this.scrollToEpochDay(focus);
85
- }
86
- }
87
- }
88
- initialize() {
89
- if (this.initialized)
90
- return;
91
- this.configure();
92
- const initialEpochDay = this[WklyPickerInputsPropertyKeys.InitialEpochDay];
93
- this.today = this.browser
94
- ? Math.floor(this.clock.now().getTime() / 86400000)
95
- : initialEpochDay === null
96
- ? 0
97
- : initialEpochDay;
98
- this.focused =
99
- initialEpochDay === null
100
- ? this.defaults.initialEpochDay === undefined
101
- ? this.today
102
- : this.defaults.initialEpochDay
103
- : initialEpochDay;
104
- this.load(this[WklyPickerInputsPropertyKeys.Value]);
105
- this.initialized = true;
106
- this.position(this.focused, true);
107
- }
108
- configure() {
109
- this.configErrors = [];
110
- [
111
- WklyPickerInputsPropertyKeys.ShowSeconds,
112
- WklyPickerInputsPropertyKeys.AllowRangeAcrossDisabled,
113
- WklyPickerInputsPropertyKeys.Required,
114
- WklyPickerInputsPropertyKeys.Disabled,
115
- WklyPickerInputsPropertyKeys.CloseOnBackdrop,
116
- ].forEach((key) => (this[key] = coerceBoolean(this[key])));
117
- this.effectiveLocale =
118
- this[WklyPickerInputsPropertyKeys.Locale] ||
119
- this.defaults.locale ||
120
- this.defaultLocale;
121
- this.direction = /^(ar|he|fa|ur)(-|$)/.test(this.effectiveLocale)
122
- ? "rtl"
123
- : "ltr";
124
- this.adapter =
125
- this[WklyPickerInputsPropertyKeys.CalendarAdapter] ||
126
- new WklyGregorianCalendarAdapter(this.effectiveLocale);
127
- try {
128
- let firstDay;
129
- try {
130
- firstDay = getLocaleFirstDayOfWeek(this.effectiveLocale);
131
- }
132
- catch (_) { }
133
- this.effectiveOffset = resolveWeekOffset(this.effectiveLocale, this[WklyPickerInputsPropertyKeys.WeekOffset], this.defaults.weekOffset, firstDay);
134
- integer(this[WklyPickerInputsPropertyKeys.WeekCacheSize]);
135
- integer(this[WklyPickerInputsPropertyKeys.OverscanWeeks]);
136
- if (this[WklyPickerInputsPropertyKeys.WeekCacheSize] < 0 ||
137
- this[WklyPickerInputsPropertyKeys.OverscanWeeks] < 0 ||
138
- this[WklyPickerInputsPropertyKeys.OverscanWeeks] > 50)
139
- throw new RangeError();
140
- if (![
141
- "datetime",
142
- "date",
143
- "time",
144
- "datetime-range",
145
- "date-range",
146
- "time-range",
147
- ].includes(this[WklyPickerInputsPropertyKeys.Mode]))
148
- throw new RangeError();
149
- const preset = this[WklyPickerInputsPropertyKeys.ViewportPreset];
150
- if (preset.kind === "weeks") {
151
- integer(preset.visibleWeekCount);
152
- if (preset.visibleWeekCount < 1 || preset.visibleWeekCount > 52)
153
- throw new RangeError();
154
- }
155
- if (preset.kind === "full-month-and-around")
156
- for (const n of [
157
- preset.extraWeeksBefore || 0,
158
- preset.extraWeeksAfter || 0,
159
- ]) {
160
- integer(n);
161
- if (n < 0 || n > 52)
162
- throw new RangeError();
163
- }
164
- this.generator = createWeekGenerator({
165
- weekOffset: this.effectiveOffset,
166
- cacheSize: this[WklyPickerInputsPropertyKeys.WeekCacheSize],
167
- });
168
- }
169
- catch (_) {
170
- this.configErrors.push(error("configuration-error", this[WklyPickerInputsPropertyKeys.WeekOffset]));
171
- this.generator = createWeekGenerator();
172
- this.effectiveOffset = 0;
173
- }
174
- this.setSupportedScrollRange();
175
- this.effectiveHourCycle =
176
- this[WklyPickerInputsPropertyKeys.HourCycle] === "h12"
177
- ? "h12"
178
- : this[WklyPickerInputsPropertyKeys.HourCycle] === "locale"
179
- ? new Intl.DateTimeFormat(this.effectiveLocale, {
180
- hour: "numeric",
181
- timeZone: "UTC",
182
- }).resolvedOptions().hour12
183
- ? "h12"
184
- : "h24"
185
- : "h24";
186
- this.weekdays = Array.from({ length: 7 }, (_, i) => this.adapter.formatWeekday(this.effectiveOffset + i, "short"));
187
- }
188
- setSupportedScrollRange() {
189
- let [first, last] = this.adapter.supportedEpochDayRange;
190
- const [firstYear, lastYear] = this.adapter.supportedYearRange;
191
- const yearOf = (day) => this.adapter.epochDayToDate(day).year;
192
- if (yearOf(first) < firstYear) {
193
- let low = first, high = last;
194
- while (low < high) {
195
- const mid = Math.floor((low + high) / 2);
196
- if (yearOf(mid) < firstYear)
197
- low = mid + 1;
198
- else
199
- high = mid;
200
- }
201
- first = low;
202
- }
203
- if (yearOf(last) > lastYear) {
204
- let low = first, high = last;
205
- while (low < high) {
206
- const mid = Math.ceil((low + high) / 2);
207
- if (yearOf(mid) > lastYear)
208
- high = mid - 1;
209
- else
210
- low = mid;
211
- }
212
- last = low;
213
- }
214
- if (first > last ||
215
- yearOf(first) < firstYear ||
216
- yearOf(first) > lastYear ||
217
- yearOf(last) < firstYear ||
218
- yearOf(last) > lastYear)
219
- throw new RangeError("No supported days within the calendar year range");
220
- this.firstSupportedDay = first;
221
- this.lastSupportedDay = last;
222
- this.firstSupportedWeek = absoluteWeekOf(first, this.effectiveOffset);
223
- this.lastSupportedWeek = absoluteWeekOf(last, this.effectiveOffset);
224
- }
225
- clampFirstWeek(week) {
226
- // Keep supported weeks inside the viewport; renderRows adds the buffer rows.
227
- const last = Math.max(this.firstSupportedWeek, this.lastSupportedWeek - this.visibleCount + 1);
228
- return Math.max(this.firstSupportedWeek, Math.min(last, week));
229
- }
230
- ngAfterViewInit() {
231
- this.resetScroll();
232
- if (this.browser && typeof ResizeObserver !== "undefined") {
233
- this.observer = new ResizeObserver(() => {
234
- this.compact = this.host.nativeElement.clientWidth < 338;
235
- const row = this.host.nativeElement.querySelector(".week-row");
236
- // CSS heights and scrollTop use layout pixels; client rectangles include zoom.
237
- const height = row ? parseFloat(getComputedStyle(row).height) : 0;
238
- if (height && height !== this.rowHeight) {
239
- this.rowHeight = height;
240
- this.scrollHeight = this.rowHeight * 2001;
241
- this.renderRows();
242
- this.resetScroll();
243
- }
244
- });
245
- this.observer.observe(this.host.nativeElement);
246
- }
247
- }
248
- ngOnDestroy() {
249
- this.destroyed = true;
250
- if (this.observer)
251
- this.observer.disconnect();
252
- if (this.scrollEndTimer)
253
- clearTimeout(this.scrollEndTimer);
254
- if (this.generator)
255
- this.generator.clearCache();
256
- }
257
- t(key) {
258
- return resolveWklyTranslation(key, this.effectiveLocale, this[WklyPickerInputsPropertyKeys.Translations] ||
259
- this.defaultTranslations, this.strings);
260
- }
261
- get isRange() {
262
- return this[WklyPickerInputsPropertyKeys.Mode].endsWith("-range");
263
- }
264
- get hasDate() {
265
- return !this[WklyPickerInputsPropertyKeys.Mode].startsWith("time");
266
- }
267
- get hasTime() {
268
- return (this[WklyPickerInputsPropertyKeys.Mode] !== "date" &&
269
- this[WklyPickerInputsPropertyKeys.Mode] !== "date-range");
270
- }
271
- get submitVisible() {
272
- return (this.presentation === "transient" &&
273
- (this[WklyPickerInputsPropertyKeys.Mode] !== "date" ||
274
- this.viewMode === "manual"));
275
- }
276
- get title() {
277
- try {
278
- const d = this.adapter.epochDayToDate(Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, firstEpochDayOf(this.anchorWeek, this.effectiveOffset))));
279
- return this.adapter.formatMonth(d) + " " + this.adapter.formatYear(d);
280
- }
281
- catch (_) {
282
- return "";
283
- }
284
- }
285
- get canSubmit() {
286
- return (!this[WklyPickerInputsPropertyKeys.Disabled] &&
287
- !this.errors.length &&
288
- this.pendingValue !== null);
289
- }
290
- blank(day) {
291
- const safe = Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, day));
292
- return {
293
- date: this.adapter.epochDayToDate(safe),
294
- hour: 0,
295
- minute: 0,
296
- second: 0,
297
- present: false,
298
- };
299
- }
300
- load(value) {
301
- this.drafts = [this.blank(this.focused), this.blank(this.focused)];
302
- const validation = validateSelection(value, this, this.adapter);
303
- if (value !== null && !validation.length) {
304
- const values = typeof value === "string" ? [value] : value;
305
- values.forEach((v, i) => {
306
- const d = decodeIso(v);
307
- this.drafts[i] = {
308
- date: this.hasDate
309
- ? this.adapter.epochDayToDate(d.epochDay)
310
- : this.blank(this.today).date,
311
- hour: d.hour,
312
- minute: d.minute,
313
- second: d.second,
314
- present: true,
315
- };
316
- if (i === 0 && this.hasDate)
317
- this.focused = d.epochDay;
318
- });
319
- }
320
- if (validation.length) {
321
- this.pendingValue = null;
322
- this.report(validation);
323
- }
324
- else
325
- this.check();
326
- }
327
- writeValue(value) {
328
- this[WklyPickerInputsPropertyKeys.Value] = value;
329
- if (this.initialized) {
330
- this.load(value);
331
- this.position(this.focused, true);
332
- }
333
- }
334
- registerOnChange(fn) {
335
- this.onChange = fn;
336
- }
337
- registerOnTouched(fn) {
338
- this.onTouched = fn;
339
- }
340
- setDisabledState(disabled) {
341
- this[WklyPickerInputsPropertyKeys.Disabled] = disabled;
342
- }
343
- validate(_control) {
344
- return this.errors.length ? { wkly: this.errors } : null;
345
- }
346
- registerOnValidatorChange(fn) {
347
- this.validatorChanged = fn;
348
- }
349
- touched() {
350
- Promise.resolve().then(() => this.onTouched());
351
- }
352
- report(errors) {
353
- const changed = JSON.stringify(this.errors) !== JSON.stringify(errors);
354
- this.errors = errors;
355
- if (changed) {
356
- this[WklyPickerOutputsPropertyKeys.ValidationChange].emit(errors);
357
- this.validatorChanged();
358
- }
359
- }
360
- check() {
361
- const result = validateDrafts({
362
- drafts: this.drafts,
363
- configErrors: this.configErrors,
364
- adapter: this.adapter,
365
- selection: this,
366
- mode: this[WklyPickerInputsPropertyKeys.Mode],
367
- isRange: this.isRange,
368
- hasDate: this.hasDate,
369
- hasTime: this.hasTime,
370
- showSeconds: this[WklyPickerInputsPropertyKeys.ShowSeconds],
371
- required: this[WklyPickerInputsPropertyKeys.Required],
372
- });
373
- this.pendingValue = result.pendingValue;
374
- this.report(result.errors);
375
- }
376
- trackDraft(index) {
377
- // Endpoint controls keep their identity and focus when draft objects swap.
378
- return index;
379
- }
380
- orderDrafts() {
381
- if (!this.isRange || !this.drafts.every((draft) => draft.present))
382
- return;
383
- if (this.drafts.some((draft) => draft.unsupportedEpochDay !== undefined))
384
- return;
385
- try {
386
- const a = this.drafts[0], b = this.drafts[1];
387
- const key = (d) => this.adapter.dateToEpochDay(d.date) * 86400 +
388
- (d.hour || 0) * 3600 +
389
- (d.minute || 0) * 60 +
390
- (d.second || 0);
391
- if (key(a) > key(b))
392
- this.drafts = [b, a];
393
- }
394
- catch (_) {
395
- // Impossible or incomplete dates remain editable until corrected.
396
- }
397
- }
398
- finish() {
399
- if (this[WklyPickerInputsPropertyKeys.Disabled])
400
- return;
401
- this.orderDrafts();
402
- if (this.viewMode === "manual" && this.hasDate)
403
- this.positionOnManualDate();
404
- this.check();
405
- if (this.presentation === "inline" && this.canSubmit)
406
- this.commit();
407
- }
408
- commit() {
409
- if (!this.canSubmit)
410
- return;
411
- const next = this.pendingValue;
412
- if (JSON.stringify(next) !==
413
- JSON.stringify(this[WklyPickerInputsPropertyKeys.Value])) {
414
- this[WklyPickerInputsPropertyKeys.Value] = next;
415
- this.emittedValue = JSON.stringify(next);
416
- this.onChange(next);
417
- this[WklyPickerOutputsPropertyKeys.ValueChange].emit(next);
418
- }
419
- this.onTouched();
420
- }
421
- submit(reason = "submit") {
422
- this.check();
423
- if (!this.canSubmit)
424
- return;
425
- this.commit();
426
- if (this.presentation === "transient")
427
- this[WklyPickerOutputsPropertyKeys.Closed].emit(reason);
428
- }
429
- cancel(reason = "close-button") {
430
- if (this[WklyPickerInputsPropertyKeys.Disabled])
431
- return;
432
- this.load(this[WklyPickerInputsPropertyKeys.Value]);
433
- this.onTouched();
434
- this[WklyPickerOutputsPropertyKeys.Closed].emit(reason);
435
- }
436
- now() {
437
- if (this[WklyPickerInputsPropertyKeys.Disabled])
438
- return;
439
- const n = this.clock.now();
440
- const day = Math.floor(n.getTime() / 86400000);
441
- this.drafts = [0, 1].map((index) => (Object.assign(Object.assign({}, this.clockDraft(day, n)), { present: index === 0 || this.isRange })));
442
- if (this.hasDate &&
443
- (day < this.firstSupportedDay || day > this.lastSupportedDay)) {
444
- this.report([error("unsupported-adapter-date", day)]);
445
- return;
446
- }
447
- this.focused = day;
448
- this.position(day, true);
449
- this.check();
450
- this.submit("now");
451
- }
452
- clockDraft(day, now) {
453
- return Object.assign(Object.assign({}, this.blank(day)), { hour: now.getUTCHours(), minute: Math.floor(now.getUTCMinutes() / this[WklyPickerInputsPropertyKeys.MinuteStep]) * this[WklyPickerInputsPropertyKeys.MinuteStep], second: this[WklyPickerInputsPropertyKeys.ShowSeconds]
454
- ? Math.floor(now.getUTCSeconds() / this[WklyPickerInputsPropertyKeys.SecondStep]) * this[WklyPickerInputsPropertyKeys.SecondStep]
455
- : 0 });
456
- }
457
- initializeManualRange() {
458
- if (!this.isRange ||
459
- !this.hasDate ||
460
- this.drafts.every((draft) => draft.present))
461
- return;
462
- let seed = this.drafts.find((draft) => draft.present);
463
- if (!seed) {
464
- if (this[WklyPickerInputsPropertyKeys.Value] !== null)
465
- return;
466
- const now = this.clock.now();
467
- const initialEpochDay = this[WklyPickerInputsPropertyKeys.InitialEpochDay];
468
- const day = initialEpochDay === null
469
- ? this.defaults.initialEpochDay === undefined
470
- ? Math.floor(now.getTime() / 86400000)
471
- : this.defaults.initialEpochDay
472
- : initialEpochDay;
473
- seed = Object.assign(Object.assign({}, this.clockDraft(day, now)), { present: true });
474
- }
475
- // Complete missing endpoints without replacing selected or invalid drafts.
476
- const initial = seed;
477
- this.drafts = this.drafts.map((draft) => draft.present ? draft : Object.assign(Object.assign({}, initial), { date: Object.assign({}, initial.date) }));
478
- this.finish();
479
- // Positioning renders before validation; refresh completion controls afterward.
480
- this.changeDetector.markForCheck();
481
- }
482
- toggleView() {
483
- if (this[WklyPickerInputsPropertyKeys.Disabled] || !this.hasDate)
484
- return;
485
- this.viewMode = this.viewMode === "calendar" ? "manual" : "calendar";
486
- if (this.viewMode === "manual")
487
- this.initializeManualRange();
488
- if (this.viewMode === "calendar")
489
- this.positionOnManualDate();
490
- this[WklyPickerOutputsPropertyKeys.ViewModeChange].emit(this.viewMode);
491
- if (this.viewMode === "calendar")
492
- setTimeout(() => this.resetScroll());
493
- }
494
- positionOnManualDate() {
495
- const draft = this.drafts[this.manualDateEndpoint];
496
- if (!draft || !draft.present)
497
- return;
498
- try {
499
- // A valid day follows the selection. An impossible day keeps its draft
500
- // fields but still shows the chosen month in the calendar.
501
- const target = this.adapter.dateToEpochDay(draft.date);
502
- this.focused = target;
503
- this.position(target, true);
504
- }
505
- catch (_) {
506
- try {
507
- const first = this.adapter.dateToEpochDay(Object.assign(Object.assign({}, draft.date), { day: 1 }));
508
- this.focused = first;
509
- this.position(first, true);
510
- }
511
- catch (_) { }
512
- }
513
- }
514
- months(draft) {
515
- try {
516
- return this.adapter.getMonths(draft.date.year).map((m) => m.label);
517
- }
518
- catch (_) {
519
- return [];
520
- }
521
- }
522
- monthCount(draft) {
523
- return this.months(draft).length || 12;
524
- }
525
- get inDays() {
526
- return draftDayDifference(this.drafts, this.adapter);
527
- }
528
- get inDaysLabel() {
529
- const days = this.inDays;
530
- return this.t("inDays").replace(/{{\s*days\s*}}/g, days === null
531
- ? this.t("daysUnavailable")
532
- : new Intl.NumberFormat(this.effectiveLocale, {
533
- useGrouping: false,
534
- }).format(days));
535
- }
536
- get resultingEndDate() {
537
- try {
538
- const draft = this.drafts[1];
539
- if (draft.unsupportedEpochDay !== undefined ||
540
- this.adapter.validateDate(draft.date).length)
541
- return "";
542
- return [
543
- this.adapter.formatDay(draft.date),
544
- this.adapter.formatMonth(draft.date),
545
- this.adapter.formatYear(draft.date),
546
- ].join(" ");
547
- }
548
- catch (_) {
549
- return "";
550
- }
551
- }
552
- toggleEndView(view) {
553
- if (this[WklyPickerInputsPropertyKeys.Disabled])
554
- return;
555
- this.endView = view;
556
- }
557
- days(value) {
558
- if (this[WklyPickerInputsPropertyKeys.Disabled])
559
- return;
560
- this.manualDateEndpoint = 1;
561
- setDraftDayDifference(this.drafts, this.adapter, value);
562
- this.check();
563
- }
564
- field(index, field, value) {
565
- if (this[WklyPickerInputsPropertyKeys.Disabled])
566
- return;
567
- const draft = this.drafts[index];
568
- draft.present = true;
569
- if (field === "day" || field === "year" || field === "month") {
570
- this.manualDateEndpoint = index;
571
- delete draft.unsupportedEpochDay;
572
- let date = Object.assign(Object.assign({}, draft.date), { [field]: value });
573
- if (field === "month") {
574
- let month;
575
- try {
576
- month = this.adapter
577
- .getMonths(date.year)
578
- .find((m) => m.month === value);
579
- }
580
- catch (_) { }
581
- date = Object.assign(Object.assign({}, date), { monthCode: month ? month.monthCode : "" });
582
- }
583
- if (field === "year" && value !== null) {
584
- try {
585
- const months = this.adapter.getMonths(value);
586
- const month = months.find((m) => m.monthCode === date.monthCode);
587
- if (month)
588
- date = Object.assign(Object.assign({}, date), { month: month.month });
589
- }
590
- catch (_) { }
591
- }
592
- draft.date = date;
593
- }
594
- else if (field === "hour" && this.effectiveHourCycle === "h12")
595
- draft.hour =
596
- value === null
597
- ? null
598
- : value >= 1 && value <= 12
599
- ? (value % 12) + ((draft.hour || 0) >= 12 ? 12 : 0)
600
- : 24 + value;
601
- else
602
- draft[field] = value;
603
- this.check();
604
- }
605
- displayHour(draft) {
606
- return draft.hour === null
607
- ? null
608
- : this.effectiveHourCycle === "h12"
609
- ? draft.hour % 12 || 12
610
- : draft.hour;
611
- }
612
- period(index, period) {
613
- if (this[WklyPickerInputsPropertyKeys.Disabled])
614
- return;
615
- if (period === "24")
616
- this.effectiveHourCycle = "h24";
617
- else {
618
- this.effectiveHourCycle = "h12";
619
- this.drafts[index].hour =
620
- ((this.drafts[index].hour || 0) % 12) + (period === "pm" ? 12 : 0);
621
- this.drafts[index].present = true;
622
- this.finish();
623
- }
624
- }
625
- selected(day) {
626
- return this.drafts.some((d) => {
627
- try {
628
- return d.present && this.adapter.dateToEpochDay(d.date) === day;
629
- }
630
- catch (_) {
631
- return false;
632
- }
633
- });
634
- }
635
- inRange(day) {
636
- if (!this.isRange || !this.drafts.every((d) => d.present))
637
- return false;
638
- try {
639
- const a = this.adapter.dateToEpochDay(this.drafts[0].date), b = this.adapter.dateToEpochDay(this.drafts[1].date);
640
- return day > Math.min(a, b) && day < Math.max(a, b);
641
- }
642
- catch (_) {
643
- return false;
644
- }
645
- }
646
- dayDisabled(day) {
647
- var _a, _b;
648
- if (day < this.firstSupportedDay || day > this.lastSupportedDay)
649
- return true;
650
- try {
651
- const date = this.adapter.epochDayToDate(day);
652
- const isDateDisabled = this[WklyPickerInputsPropertyKeys.IsDateDisabled];
653
- if (isDateDisabled &&
654
- isDateDisabled(day, {
655
- mode: this[WklyPickerInputsPropertyKeys.Mode],
656
- endpoint: this.isRange
657
- ? ((_a = this.drafts[0]) === null || _a === void 0 ? void 0 : _a.present) && !((_b = this.drafts[1]) === null || _b === void 0 ? void 0 : _b.present)
658
- ? "end"
659
- : "start"
660
- : "single",
661
- calendarDate: date,
662
- }))
663
- return true;
664
- const min = this[WklyPickerInputsPropertyKeys.Min];
665
- const max = this[WklyPickerInputsPropertyKeys.Max];
666
- if (min && day < decodeIso(min).epochDay)
667
- return true;
668
- if (max && day > decodeIso(max).epochDay)
669
- return true;
670
- return false;
671
- }
672
- catch (_) {
673
- return true;
674
- }
675
- }
676
- select(day) {
677
- if (this[WklyPickerInputsPropertyKeys.Disabled] || this.dayDisabled(day))
678
- return;
679
- this.focused = day;
680
- const index = this.isRange && this.drafts[0].present && !this.drafts[1].present ? 1 : 0;
681
- if (this.isRange && index === 0)
682
- this.drafts[1].present = false;
683
- delete this.drafts[index].unsupportedEpochDay;
684
- this.drafts[index].date = this.adapter.epochDayToDate(day);
685
- this.drafts[index].present = true;
686
- this.orderDrafts();
687
- this.renderRows();
688
- this.finish();
689
- if (this.presentation === "transient" &&
690
- this[WklyPickerInputsPropertyKeys.Mode] === "date" &&
691
- this.viewMode === "calendar")
692
- this.submit("auto-submit");
693
- }
694
- key(event, day) {
695
- let delta = 0;
696
- if (event.key === "ArrowLeft")
697
- delta = -1;
698
- if (event.key === "ArrowRight")
699
- delta = 1;
700
- if (event.key === "ArrowUp")
701
- delta = -7;
702
- if (event.key === "ArrowDown")
703
- delta = 7;
704
- if (event.key === "PageUp")
705
- delta = -7 * (event.shiftKey ? this.visibleCount : 1);
706
- if (event.key === "PageDown")
707
- delta = 7 * (event.shiftKey ? this.visibleCount : 1);
708
- if (event.key === "Home") {
709
- event.preventDefault();
710
- this.scrollToEpochDay(this.today, { focus: true });
711
- }
712
- if (delta) {
713
- event.preventDefault();
714
- const target = day + delta;
715
- if (target >= this.firstSupportedDay && target <= this.lastSupportedDay)
716
- this.scrollToEpochDay(target, { focus: true });
717
- }
718
- }
719
- position(day, preset = false, options = {}) {
720
- day = Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, day));
721
- this.anchorWeek = absoluteWeekOf(day, this.effectiveOffset);
722
- const viewportPreset = this[WklyPickerInputsPropertyKeys.ViewportPreset];
723
- this.clipMonth = preset && viewportPreset.kind === "full-month";
724
- if (preset && viewportPreset.kind !== "weeks") {
725
- const d = this.adapter.epochDayToDate(day);
726
- this.initialMonth = d.year + "/" + d.monthCode;
727
- const [start, end] = calendarMonthBounds(this.adapter, day);
728
- this.firstWeek = absoluteWeekOf(start, this.effectiveOffset);
729
- this.visibleCount =
730
- absoluteWeekOf(end, this.effectiveOffset) - this.firstWeek + 1;
731
- if (viewportPreset.kind === "full-month-and-around" &&
732
- !this.configErrors.length) {
733
- const before = viewportPreset.extraWeeksBefore || 0, after = viewportPreset.extraWeeksAfter || 0;
734
- this.firstWeek -= before;
735
- this.visibleCount += before + after;
736
- }
737
- }
738
- else {
739
- if (viewportPreset.kind === "weeks")
740
- this.visibleCount = this.configErrors.length
741
- ? 6
742
- : viewportPreset.visibleWeekCount;
743
- this.firstWeek =
744
- this.anchorWeek -
745
- (options.align === "start"
746
- ? 0
747
- : options.align === "end"
748
- ? this.visibleCount - 1
749
- : Math.floor(this.visibleCount / 2));
750
- }
751
- this.firstWeek = this.clampFirstWeek(this.firstWeek);
752
- this.baseWeek = this.firstWeek - 1000;
753
- this.renderRows();
754
- // Apply the new runway before writing scrollTop or locating a focus target.
755
- this.changeDetector.detectChanges();
756
- this.resetScroll();
757
- }
758
- resetScroll() {
759
- // Round week boundaries to avoid scrollTop truncation under CSS zoom.
760
- if (this.scroller)
761
- this.scroller.nativeElement.scrollTop = Math.round(1000 * this.rowHeight);
762
- }
763
- scroll(event) {
764
- const element = event.target;
765
- this.snapPending = true;
766
- this.scheduleSnap();
767
- // Quantize displacement around the reset point, equally in both directions.
768
- const relativeRows = element.scrollTop / this.rowHeight - 1000;
769
- const index = 1000 + Math.sign(relativeRows) * Math.round(Math.abs(relativeRows));
770
- const requestedFirst = this.baseWeek + index;
771
- const first = this.clampFirstWeek(requestedFirst);
772
- if (requestedFirst !== first) {
773
- element.scrollTop = Math.round((first - this.baseWeek) * this.rowHeight);
774
- }
775
- if (first === this.firstWeek)
776
- return;
777
- this.clipMonth = false;
778
- this.firstWeek = first;
779
- this.anchorWeek = first + Math.floor(this.visibleCount / 2);
780
- if (index < 100 || index > 1900) {
781
- // Preserve signed displacement from this week; modulo turns fractional
782
- // rounding just below a boundary into almost a full row after rebasing.
783
- const offset = element.scrollTop - (first - this.baseWeek) * this.rowHeight;
784
- this.baseWeek = first - 1000;
785
- element.scrollTop = Math.round(1000 * this.rowHeight + offset);
786
- }
787
- this.renderRows();
788
- }
789
- scheduleSnap() {
790
- if (this.scrollEndTimer)
791
- clearTimeout(this.scrollEndTimer);
792
- this.scrollEndTimer = setTimeout(() => this.snapWeek(), 200);
793
- }
794
- snapWeek() {
795
- if (this.scrollEndTimer)
796
- clearTimeout(this.scrollEndTimer);
797
- this.scrollEndTimer = undefined;
798
- if (!this.snapPending || !this.scroller)
799
- return;
800
- this.snapPending = false;
801
- // Align the current virtual week without rebuilding or rebasing its rows.
802
- const element = this.scroller.nativeElement;
803
- const target = Math.round((this.firstWeek - this.baseWeek) * this.rowHeight);
804
- if (element.scrollTop !== target)
805
- element.scrollTop = target;
806
- }
807
- showFirstWeek(week) {
808
- const first = this.clampFirstWeek(week);
809
- if (first === this.firstWeek)
810
- return;
811
- this.clipMonth = false;
812
- this.firstWeek = first;
813
- this.anchorWeek = first + Math.floor(this.visibleCount / 2);
814
- this.baseWeek = first - 1000;
815
- this.renderRows();
816
- this.resetScroll();
817
- }
818
- canMoveWeek(delta) {
819
- return this.clampFirstWeek(this.firstWeek + delta) !== this.firstWeek;
820
- }
821
- moveWeek(delta) {
822
- if (!this[WklyPickerInputsPropertyKeys.Disabled])
823
- this.showFirstWeek(this.firstWeek + delta);
824
- }
825
- renderRows() {
826
- // Keep the virtual scroll offset here; row data is shared across Angular versions.
827
- const overscan = Math.max(0, Math.min(50, this[WklyPickerInputsPropertyKeys.OverscanWeeks] || 0));
828
- const start = this.firstWeek - overscan;
829
- this.paddingTop = (start - this.baseWeek) * this.rowHeight;
830
- this.rows = createWeekRows({
831
- generator: this.generator,
832
- adapter: this.adapter,
833
- startWeek: start,
834
- count: this.visibleCount + 2 * overscan,
835
- firstVisibleWeek: this.firstWeek,
836
- firstSupportedDay: this.firstSupportedDay,
837
- lastSupportedDay: this.lastSupportedDay,
838
- clipMonth: this.clipMonth,
839
- initialMonth: this.initialMonth,
840
- weekLabelMode: this[WklyPickerInputsPropertyKeys.WeekLabelMode],
841
- weekLabelFormatter: this[WklyPickerInputsPropertyKeys.WeekLabelFormatter] || null,
842
- isDayDisabled: (day) => this.dayDisabled(day),
843
- });
844
- this[WklyPickerOutputsPropertyKeys.ViewportChange].emit({
845
- firstVisibleAbsoluteWeek: this.firstWeek,
846
- lastVisibleAbsoluteWeek: this.firstWeek + this.visibleCount - 1,
847
- anchorAbsoluteWeek: this.anchorWeek,
848
- });
849
- }
850
- // Retain day DOM nodes and keyboard focus when row metadata is regenerated.
851
- trackCell(_i, cell) {
852
- return cell.epochDay;
853
- }
854
- trackRow(_i, row) {
855
- return row.week.absoluteWeek;
856
- }
857
- scrollToEpochDay(day, options = {}) {
858
- integer(day);
859
- this.adapter.epochDayToDate(day);
860
- day = Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, day));
861
- // position renders synchronously; publish the tab stop before that render.
862
- if (options.focus)
863
- this.focused = day;
864
- this.position(day, false, options);
865
- if (options.select)
866
- this.select(day);
867
- if (options.focus)
868
- this.focusDay();
869
- }
870
- scrollToAbsoluteWeek(week, options = {}) {
871
- // A boundary week can start before the adapter's first supported day.
872
- const first = firstEpochDayOf(week, this.effectiveOffset);
873
- this.scrollToEpochDay(week === this.firstSupportedWeek
874
- ? Math.max(first, this.firstSupportedDay)
875
- : first, options);
876
- }
877
- scrollToCalendarDate(date, options = {}) {
878
- this.scrollToEpochDay(this.adapter.dateToEpochDay(date), options);
879
- }
880
- scrollToValue(value, options = {}) {
881
- this.scrollToEpochDay(decodeIso(value).epochDay, options);
882
- }
883
- focusDay() {
884
- if (!this.browser)
885
- return;
886
- setTimeout(() => {
887
- var _a;
888
- if (this.destroyed)
889
- return;
890
- this.changeDetector.detectChanges();
891
- const day = this.host.nativeElement.querySelector('[data-day="' + this.focused + '"]');
892
- const fallback = this.host.nativeElement.querySelector("button:not(:disabled),input:not(:disabled)");
893
- (_a = (day || fallback)) === null || _a === void 0 ? void 0 : _a.focus({ preventScroll: true });
894
- });
895
- }
896
- }
897
- WklyDateTimePickerComponent.decorators = [
898
- { type: Component, args: [{
899
- selector: "wkly-datetime-picker",
900
- template: "<section\n class=\"wkly\"\n [attr.dir]=\"direction\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel] || 'Date and time picker'\n \"\n [attr.aria-describedby]=\"this[WklyPickerInputsPropertyKeys.AriaDescribedBy]\"\n (focusout)=\"touched()\"\n>\n <header class=\"toolbar\">\n <button\n *ngIf=\"hasDate\"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"t(viewMode === 'calendar' ? 'manual' : 'calendar')\"\n (click)=\"toggleView()\"\n >\n {{ viewMode === \"calendar\" ? \"\u2637\" : \"\u25A6\" }}\n </button>\n <span *ngIf=\"hasDate\" class=\"year-control\">{{ title }}</span>\n <span class=\"spacer\"></span\n ><button\n type=\"button\"\n class=\"now\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n (click)=\"now()\"\n >\n {{ t(\"now\") }}\n </button>\n <button\n *ngIf=\"presentation === 'transient'\"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"t('close')\"\n (click)=\"cancel()\"\n >\n \u00D7\n </button>\n </header>\n <ng-container *ngIf=\"hasDate && viewMode === 'calendar'\">\n <div\n role=\"grid\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel] || 'Calendar'\n \"\n [attr.aria-multiselectable]=\"isRange\"\n >\n <div\n role=\"row\"\n class=\"week-head\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] === 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] !== 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n role=\"columnheader\"\n aria-label=\"Week\"\n ></span\n ><span *ngFor=\"let day of weekdays\" role=\"columnheader\">{{ day }}</span>\n </div>\n <div\n #scroller\n class=\"week-scroll\"\n [style.height.px]=\"visibleCount * rowHeight\"\n (scroll)=\"scroll($event)\"\n (scrollend)=\"snapWeek()\"\n >\n <div [style.height.px]=\"scrollHeight\" class=\"scroll-space\">\n <div class=\"rows\" [style.top.px]=\"paddingTop\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n role=\"row\"\n class=\"week-row\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] !==\n 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n role=\"rowheader\"\n class=\"week-number\"\n >{{ row.label }}</span\n >\n <div\n *ngFor=\"\n let cell of row.cells;\n let dayIndex = index;\n trackBy: trackCell\n \"\n role=\"gridcell\"\n [attr.data-weekday-index]=\"dayIndex\"\n [attr.aria-colindex]=\"\n dayIndex +\n (compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n ? 1\n : 2)\n \"\n [attr.aria-selected]=\"selected(cell.epochDay)\"\n [attr.aria-disabled]=\"\n cell.disabled || this[WklyPickerInputsPropertyKeys.Disabled]\n \"\n [class.range]=\"inRange(cell.epochDay)\"\n [class.hidden]=\"cell.hidden\"\n [class.odd-month]=\"cell.date && cell.date.month % 2 === 1\"\n >\n <span [class]=\"'annotation annotation--' + dayIndex\">{{\n cell.annotation\n }}</span>\n <button\n type=\"button\"\n class=\"day\"\n [attr.data-day]=\"cell.epochDay\"\n [attr.aria-label]=\"cell.accessible\"\n [attr.aria-current]=\"cell.epochDay === today ? 'date' : null\"\n [attr.aria-disabled]=\"\n cell.disabled || this[WklyPickerInputsPropertyKeys.Disabled]\n \"\n [attr.tabindex]=\"\n !cell.hidden && cell.epochDay === focused ? 0 : -1\n \"\n [class.selected]=\"selected(cell.epochDay)\"\n [class.today]=\"cell.epochDay === today\"\n (focus)=\"focused = cell.epochDay\"\n (click)=\"select(cell.epochDay)\"\n (keydown)=\"key($event, cell.epochDay)\"\n >\n {{ cell.label }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"week-navigation\">\n <button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] || !canMoveWeek(-1)\n \"\n [attr.aria-label]=\"t('previous')\"\n (click)=\"moveWeek(-1)\"\n >\n \u2191</button\n ><span>{{ title }}</span\n ><button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] || !canMoveWeek(1)\n \"\n [attr.aria-label]=\"t('next')\"\n (click)=\"moveWeek(1)\"\n >\n \u2193\n </button>\n </div>\n </ng-container>\n <ng-container\n *ngFor=\"let draft of drafts; let i = index; trackBy: trackDraft\"\n >\n <fieldset\n *ngIf=\"(i === 0 || isRange) && (hasTime || viewMode === 'manual')\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"isRange ? t(i === 0 ? 'start' : 'end') : null\"\n >\n <legend *ngIf=\"isRange\">\n <ng-container\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual';\n else endpointLabel\n \"\n >\n <span class=\"end-view-toggle\">\n <button\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"endView === 'date'\"\n (click)=\"toggleEndView('date')\"\n >\n {{ t(\"end\") }}\n </button>\n <button\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"endView === 'days'\"\n (click)=\"toggleEndView('days')\"\n >\n {{ inDaysLabel }}\n </button>\n </span>\n </ng-container>\n <ng-template #endpointLabel>{{\n t(i === 0 ? \"start\" : \"end\")\n }}</ng-template>\n </legend>\n <div\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual' && endView === 'days'\n \"\n class=\"date-fields in-days-fields\"\n >\n <span class=\"resulting-end-date\" [attr.aria-label]=\"t('endDate')\">{{\n resultingEndDate\n }}</span>\n <wkly-field\n [label]=\"t('days')\"\n [hideLabel]=\"true\"\n [previousLabel]=\"t('daysPrevious')\"\n [nextLabel]=\"t('daysNext')\"\n [locale]=\"effectiveLocale\"\n [value]=\"inDays\"\n [min]=\"-9999\"\n [max]=\"9999\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"days($event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"\n hasDate && viewMode === 'manual' && (i === 0 || endView === 'date')\n \"\n class=\"date-fields\"\n >\n <wkly-field\n [label]=\"t('day')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.day\"\n [min]=\"1\"\n [max]=\"31\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'day', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('month')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.month\"\n [min]=\"1\"\n [max]=\"monthCount(draft)\"\n [labels]=\"months(draft)\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'month', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('year')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.year\"\n [min]=\"adapter.supportedYearRange[0]\"\n [max]=\"adapter.supportedYearRange[1]\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'year', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"hasTime\"\n class=\"time-fields\"\n [class.seconds]=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]\"\n >\n <wkly-field\n [label]=\"t('hour')\"\n [locale]=\"effectiveLocale\"\n [value]=\"displayHour(draft)\"\n [min]=\"effectiveHourCycle === 'h12' ? 1 : 0\"\n [max]=\"effectiveHourCycle === 'h12' ? 12 : 23\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'hour', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('minute')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.minute\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.MinuteStep] > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.MinuteStep] === 0\n ? this[WklyPickerInputsPropertyKeys.MinuteStep]\n : 1\n \"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'minute', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n *ngIf=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]\"\n [label]=\"t('second')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.second\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.SecondStep] > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.SecondStep] === 0\n ? this[WklyPickerInputsPropertyKeys.SecondStep]\n : 1\n \"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'second', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <div class=\"period\">\n <button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle] === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) < 12\n \"\n (click)=\"period(i, 'am')\"\n >\n {{ t(\"am\") }}</button\n ><button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] ||\n this[WklyPickerInputsPropertyKeys.HourCycle] !== 'switchable'\n \"\n [attr.aria-pressed]=\"effectiveHourCycle === 'h24'\"\n (click)=\"period(i, '24')\"\n >\n 24</button\n ><button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle] === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) >= 12\n \"\n (click)=\"period(i, 'pm')\"\n >\n {{ t(\"pm\") }}\n </button>\n </div>\n </div>\n </fieldset>\n </ng-container>\n <div class=\"validation\" role=\"status\" aria-live=\"polite\">\n <p *ngFor=\"let err of errors\">! {{ t(err.messageKey) }}</p>\n </div>\n <footer *ngIf=\"submitVisible\">\n <button\n type=\"button\"\n class=\"confirm\"\n [disabled]=\"!canSubmit\"\n (click)=\"submit()\"\n >\n {{ t(\"confirm\") }}\n </button>\n </footer>\n</section>\n",
901
- providers: [
902
- {
903
- provide: NG_VALUE_ACCESSOR,
904
- useExisting: forwardRef(() => WklyDateTimePickerComponent),
905
- multi: true,
906
- },
907
- {
908
- provide: NG_VALIDATORS,
909
- useExisting: forwardRef(() => WklyDateTimePickerComponent),
910
- multi: true,
911
- },
912
- ],
913
- styles: [":host{display:block;width:100%;box-sizing:border-box;--wkly-background-color: #fff;--wkly-background-color-alternate: #fafafa;--wkly-text-color: #192c28;--wkly-muted-color: #52635e;--wkly-border-color: #dce5e1;--wkly-accent-color: #176c55;--wkly-accent-color-alternate: #6ea494;--wkly-accent-text-color: #fff;--wkly-range-color: #e5f1ee;--wkly-error-color: #b42318;--wkly-focus-color: #245bd6;--wkly-size-multiplier: 1;--wkly-size-unit: 3.5em;color:var(--wkly-text-color);font:14px/1.4 system-ui,sans-serif;container-type:inline-size}.wkly{background:var(--wkly-background-color);border:1px solid var(--wkly-border-color);border-radius:14px;overflow:hidden;min-width:0;font-size:calc(14px * clamp(1,var(--wkly-size-multiplier),1.5))}button{font:inherit;color:inherit;min-width:var(--wkly-size-unit);min-height:var(--wkly-size-unit);border:0;background:transparent;border-radius:8px;cursor:pointer}button:hover:not(:disabled):not([aria-disabled=\"true\"]){background:var(--wkly-accent-color-alternate)}button:disabled,button[aria-disabled=true]{opacity:.4;cursor:default}button:focus-visible{outline:2px solid var(--wkly-focus-color);outline-offset:-2px}.toolbar{display:flex;align-items:center;padding:8px;grid-gap:3px;gap:3px;border-bottom:1px solid var(--wkly-border-color)}.spacer{flex:1}.year-control{padding:0 6px;font-weight:650;text-align:start;line-height:1.2}.now{color:var(--wkly-accent-color);font-weight:650}.week-head,.week-row{display:grid;grid-template-columns:28px repeat(7,minmax(0,1fr))}.week-head{font-size:.85em;color:var(--wkly-muted-color);height:34px;align-items:center;text-align:center}.week-row{height:calc(var(--wkly-size-unit) * clamp(1,var(--wkly-size-multiplier),1));align-items:end}.no-label{grid-template-columns:repeat(7,minmax(0,1fr))}.week-scroll{overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;overflow-anchor:none;scrollbar-width:thin;max-height:65vh;touch-action:pan-y}.scroll-space{position:relative}.rows{position:absolute;left:0;right:0}.week-number{font-size:.85em;text-align:center;align-self:end;line-height:var(--wkly-size-unit);color:var(--wkly-muted-color)}[role=gridcell]{position:relative;min-width:0;height:var(--wkly-size-unit);text-align:center}[role=gridcell].odd-month:not(.range):not(.today){background:var(--wkly-background-color-alternate)}.day{width:100%;min-width:0;height:var(--wkly-size-unit);padding:0;border-radius:8px}.annotation{position:absolute;bottom:.25em;white-space:nowrap;font-size:1.25em;font-weight:650;line-height:1;pointer-events:none;z-index:1;color:var(--wkly-muted-color);color:color-mix(in srgb,var(--wkly-muted-color) 50%,transparent);text-shadow:0 0 2px --wkly-background-color,0 0 4px --wkly-background-color}.odd-month .annotation{text-shadow:0 0 2px --wkly-background-color-alternate,0 0 4px --wkly-background-color-alternate}.annotation:empty{display:none}.annotation--0{inset-inline-start:10%;bottom:1.75em}.annotation--1{inset-inline-start:-5%}.annotation--2{inset-inline-start:-20%}.annotation--3{inset-inline-start:-50%;inset-inline-end:-50%}.annotation--4{inset-inline-end:-20%}.annotation--5{inset-inline-end:-5%}.annotation--6{inset-inline-end:10%}.range{background:var(--wkly-range-color)}.day.selected{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);font-weight:700}.today:after{content:\"\";display:block;width:5px;height:5px;background:currentColor;border-radius:50%;position:absolute;bottom:2px;left:calc(50% - 2px)}.today{font-weight:750;box-shadow:inset 0 0 0 1px var(--wkly-accent-color)}.hidden{visibility:hidden}.week-navigation{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--wkly-border-color);font-size:.85em;color:var(--wkly-muted-color)}fieldset{border:0;padding:0 12px;margin:0;min-width:0}legend{padding-top:.85em;font-weight:650;color:var(--wkly-accent-color)}.date-fields{display:grid;grid-template-columns:1fr 2fr 1.4fr;grid-gap:7px;gap:7px;padding:12px 0}.end-view-toggle{display:inline-flex}.end-view-toggle button{min-height:0;min-width:0;padding:0 6px;border-radius:0;line-height:inherit}.end-view-toggle button:first-child{padding-inline-start:0}.end-view-toggle button+button{border-inline-start:1px solid var(--wkly-text-color)}.end-view-toggle button[aria-pressed=false]{color:var(--wkly-muted-color);font-weight:400}.in-days-fields{grid-template-columns:minmax(0,1fr);grid-gap:0;gap:0;text-align:center}.resulting-end-date{font-size:11px;color:var(--wkly-muted-color);height:1.4em;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.time-fields{display:grid;grid-template-columns:1fr 1fr 52px;grid-gap:8px;gap:8px;padding:14px 0;border-top:1px solid var(--wkly-border-color)}.time-fields.seconds{grid-template-columns:1fr 1fr 1fr 48px}.period{display:flex;flex-direction:column;justify-content:center;grid-gap:2px;gap:2px;padding-top:1.25em}.period button{font-size:.85em}.period [aria-pressed=true]{background:var(--wkly-range-color);box-shadow:inset 0 0 0 1px var(--wkly-accent-color);font-weight:700}.validation{color:var(--wkly-error-color);font-size:.85em}.validation p{margin:.5em .85em}footer{padding:12px;border-top:1px solid var(--wkly-border-color)}.confirm{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);width:100%;font-weight:650}.confirm:hover:not(:disabled){background:var(--wkly-accent-color-alternate)}@media (forced-colors: active){.day.selected{outline:2px solid Highlight}.range{border-bottom:2px solid Highlight}.today{outline:1px dashed CanvasText}}@media (prefers-reduced-motion: reduce){*{scroll-behavior:auto!important;animation:none!important}}\n"]
914
- },] }
915
- ];
916
- WklyDateTimePickerComponent.ctorParameters = () => [
917
- { type: String, decorators: [{ type: Inject, args: [LOCALE_ID,] }] },
918
- { type: undefined, decorators: [{ type: Inject, args: [WKLY_CONFIG,] }] },
919
- { type: undefined, decorators: [{ type: Inject, args: [WKLY_CLOCK,] }] },
920
- { type: undefined, decorators: [{ type: Inject, args: [WKLY_LOCALIZATION,] }] },
921
- { type: undefined, decorators: [{ type: Inject, args: [WKLY_TRANSLATIONS,] }] },
922
- { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
923
- { type: ElementRef },
924
- { type: ChangeDetectorRef }
925
- ];
926
- WklyDateTimePickerComponent.propDecorators = {
927
- scroller: [{ type: ViewChild, args: ["scroller",] }]
928
- };
929
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3drbHktZGF0ZXRpbWUtcGlja2VyLjEyL3NyYy9waWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsTUFBTSxFQUNOLFNBQVMsRUFJVCxXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdFLE9BQU8sRUFHTCxhQUFhLEVBQ2IsaUJBQWlCLEdBR2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLE9BQU8sR0FHUixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxpQkFBaUIsRUFDakIsaUJBQWlCLEVBSWpCLDRCQUE0QixHQUc3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsY0FBYyxFQUNkLGNBQWMsR0FHZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCxhQUFhLEVBQ2IsVUFBVSxFQUNWLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsaUJBQWlCLEVBS2pCLGdCQUFnQixFQUNoQiw0QkFBNEIsRUFDNUIsNkJBQTZCLEdBRzlCLE1BQU0sVUFBVSxDQUFDO0FBdUJsQixNQUFNLE9BQU8sMkJBQ1gsU0FBUSxnQkFBZ0I7SUFxRHhCLFlBQzZCLGFBQXFCLEVBQ25CLFFBQTJCLEVBQzVCLEtBQWdCLEVBQ1QsT0FBb0IsRUFDcEIsbUJBQXFDLEVBQ25ELFFBQWdCLEVB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RCxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjs7YUFDRjs7O3lDQXdESSxNQUFNLFNBQUMsU0FBUzs0Q0FDaEIsTUFBTSxTQUFDLFdBQVc7NENBQ2xCLE1BQU0sU0FBQyxVQUFVOzRDQUNqQixNQUFNLFNBQUMsaUJBQWlCOzRDQUN4QixNQUFNLFNBQUMsaUJBQWlCO1lBQ00sTUFBTSx1QkFBcEMsTUFBTSxTQUFDLFdBQVc7WUFuSnJCLFVBQVU7WUFGVixpQkFBaUI7Ozt1QkFtR2hCLFNBQVMsU0FBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBMT0NBTEVfSUQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFBMQVRGT1JNX0lELFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBnZXRMb2NhbGVGaXJzdERheU9mV2VlaywgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gIGFic29sdXRlV2Vla09mLFxuICBjcmVhdGVXZWVrR2VuZXJhdG9yLFxuICBmaXJzdEVwb2NoRGF5T2YsXG4gIGludGVnZXIsXG4gIFdrbHlXZWVrR2VuZXJhdG9yLFxuICBXa2x5V2Vla09mZnNldCxcbn0gZnJvbSBcIkB3a2x5L2NvcmVcIjtcbmltcG9ydCB7XG4gIGRlY29kZUlzbyxcbiAgZXJyb3IsXG4gIHJlc29sdmVXZWVrT2Zmc2V0LFxuICB2YWxpZGF0ZVNlbGVjdGlvbixcbiAgV2tseUNhbGVuZGFyQWRhcHRlcixcbiAgV2tseUNhbGVuZGFyRGF0ZSxcbiAgV2tseURhdGVUaW1lLFxuICBXa2x5R3JlZ29yaWFuQ2FsZW5kYXJBZGFwdGVyLFxuICBXa2x5UGlja2VyVmFsdWUsXG4gIFdrbHlWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAd2tseS9hZGFwdGVyc1wiO1xuaW1wb3J0IHtcbiAgZHJhZnREYXlEaWZmZXJlbmNlLFxuICBzZXREcmFmdERheURpZmZlcmVuY2UsXG4gIGNhbGVuZGFyTW9udGhCb3VuZHMsXG4gIHJlc29sdmVXa2x5VHJhbnNsYXRpb24sXG4gIGNyZWF0ZVdlZWtSb3dzLFxuICB2YWxpZGF0ZURyYWZ0cyxcbiAgV2tseURyYWZ0IGFzIERyYWZ0LFxuICBXa2x5V2Vla1JvdyBhcyBSb3csXG59IGZyb20gXCJAd2tseS9wcmVzZW50YXRpb25cIjtcbmltcG9ydCB7XG4gIGNvZXJjZUJvb2xlYW4sXG4gIFdLTFlfQ0xPQ0ssXG4gIFdLTFlfQ09ORklHLFxuICBXS0xZX0xPQ0FMSVpBVElPTixcbiAgV0tMWV9UUkFOU0xBVElPTlMsXG4gIFdrbHlDbG9jayxcbiAgV2tseUNsb3NlUmVhc29uLFxuICBXa2x5Q29uZmlndXJhdGlvbixcbiAgV2tseUp1bXBPcHRpb25zLFxuICBXa2x5UGlja2VySW5wdXRzLFxuICBXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLFxuICBXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cyxcbiAgV2tseVN0cmluZ3MsXG4gIFdrbHlUcmFuc2xhdGlvbnMsXG59IGZyb20gXCIuL2NvbmZpZ1wiO1xuZGVjbGFyZSBjbGFzcyBSZXNpemVPYnNlcnZlciB7XG4gIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiAoKSA9PiB2b2lkKTtcbiAgb2JzZXJ2ZShlbGVtZW50OiBFbGVtZW50KTogdm9pZDtcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xufVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIndrbHktZGF0ZXRpbWUtcGlja2VyXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vcGlja2VyLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi4vLi4vd2tseS1kYXRldGltZS1waWNrZXIvc3JjL3BpY2tlci5jb21wb25lbnQuY3NzXCJdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFdrbHlEYXRlVGltZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBXa2x5RGF0ZVRpbWVQaWNrZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgV2tseURhdGVUaW1lUGlja2VyQ29tcG9uZW50XG4gIGV4dGVuZHMgV2tseVBpY2tlcklucHV0c1xuICBpbXBsZW1lbnRzXG4gICAgT25Jbml0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIE9uRGVzdHJveSxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBWYWxpZGF0b3JcbntcbiAgQFZpZXdDaGlsZChcInNjcm9sbGVyXCIpIHNjcm9sbGVyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHByZXNlbnRhdGlvbjogXCJpbmxpbmVcIiB8IFwidHJhbnNpZW50XCIgPSBcImlubGluZVwiO1xuICB2aWV3TW9kZTogXCJjYWxlbmRhclwiIHwgXCJtYW51YWxcIiA9IFwiY2FsZW5kYXJcIjtcbiAgZW5kVmlldzogXCJkYXRlXCIgfCBcImRheXNcIiA9IFwiZGF0ZVwiO1xuICBhZGFwdGVyITogV2tseUNhbGVuZGFyQWRhcHRlcjtcbiAgZWZmZWN0aXZlTG9jYWxlID0gXCJlbi1VU1wiO1xuICBlZmZlY3RpdmVPZmZzZXQ6IFdrbHlXZWVrT2Zmc2V0ID0gMDtcbiAgZWZmZWN0aXZlSG91ckN5Y2xlOiBcImgxMlwiIHwgXCJoMjRcIiA9IFwiaDI0XCI7XG4gIGRpcmVjdGlvbiA9IFwibHRyXCI7XG4gIHJvd3M6IFJvd1tdID0gW107XG4gIHdlZWtkYXlzOiBzdHJpbmdbXSA9IFtdO1xuICBkcmFmdHM6IERyYWZ0W10gPSBbXTtcbiAgZXJyb3JzOiByZWFkb25seSBXa2x5VmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgdG9kYXkgPSAwO1xuICBmb2N1c2VkID0gMDtcbiAgYW5jaG9yV2VlayA9IDA7XG4gIGZpcnN0V2VlayA9IDA7XG4gIHZpc2libGVDb3VudCA9IDY7XG4gIHJvd0hlaWdodCA9IDc2O1xuICBzY3JvbGxIZWlnaHQgPSAxNTIwNzY7XG4gIHBhZGRpbmdUb3AgPSAwO1xuICBpbml0aWFsaXplZCA9IGZhbHNlO1xuICBjb21wYWN0ID0gZmFsc2U7XG4gIHJlYWRvbmx5IFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMgPSBXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzO1xuICBwcml2YXRlIGJhc2VXZWVrID0gMDtcbiAgcHJpdmF0ZSBmaXJzdFN1cHBvcnRlZERheSA9IDA7XG4gIHByaXZhdGUgbGFzdFN1cHBvcnRlZERheSA9IDA7XG4gIHByaXZhdGUgZmlyc3RTdXBwb3J0ZWRXZWVrID0gMDtcbiAgcHJpdmF0ZSBsYXN0U3VwcG9ydGVkV2VlayA9IDA7XG4gIHByaXZhdGUgZ2VuZXJhdG9yITogV2tseVdlZWtHZW5lcmF0b3I7XG4gIHByaXZhdGUgaW5pdGlhbE1vbnRoID0gXCJcIjtcbiAgcHJpdmF0ZSBjbGlwTW9udGggPSBmYWxzZTtcbiAgcHJpdmF0ZSBicm93c2VyID0gZmFsc2U7XG4gIHByaXZhdGUgb2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY3JvbGxFbmRUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIHNuYXBQZW5kaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogV2tseVBpY2tlclZhbHVlKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgdmFsaWRhdG9yQ2hhbmdlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIGNvbmZpZ0Vycm9yczogV2tseVZhbGlkYXRpb25FcnJvcltdID0gW107XG4gIHByaXZhdGUgcGVuZGluZ1ZhbHVlOiBXa2x5UGlja2VyVmFsdWUgPSBudWxsO1xuICBwcml2YXRlIGVtaXR0ZWRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFudWFsRGF0ZUVuZHBvaW50ID0gMDtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgZGVmYXVsdExvY2FsZTogc3RyaW5nLFxuICAgIEBJbmplY3QoV0tMWV9DT05GSUcpIHByaXZhdGUgZGVmYXVsdHM6IFdrbHlDb25maWd1cmF0aW9uLFxuICAgIEBJbmplY3QoV0tMWV9DTE9DSykgcHJpdmF0ZSBjbG9jazogV2tseUNsb2NrLFxuICAgIEBJbmplY3QoV0tMWV9MT0NBTElaQVRJT04pIHByaXZhdGUgc3RyaW5nczogV2tseVN0cmluZ3MsXG4gICAgQEluamVjdChXS0xZX1RSQU5TTEFUSU9OUykgcHJpdmF0ZSBkZWZhdWx0VHJhbnNsYXRpb25zOiBXa2x5VHJhbnNsYXRpb25zLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtOiBPYmplY3QsXG4gICAgcHJpdmF0ZSBob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybSk7XG4gIH1cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgT2JqZWN0LmtleXMoY2hhbmdlcykubGVuZ3RoID09PSAxICYmXG4gICAgICAgIGNoYW5nZXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0gJiZcbiAgICAgICAgdGhpcy5lbWl0dGVkVmFsdWUgPT09XG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLmVtaXR0ZWRWYWx1ZSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvY3VzID0gdGhpcy5mb2N1c2VkO1xuICAgICAgdGhpcy5jb25maWd1cmUoKTtcbiAgICAgIGlmIChcbiAgICAgICAgY2hhbmdlc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSB8fFxuICAgICAgICBjaGFuZ2VzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0gfHxcbiAgICAgICAgY2hhbmdlc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkNhbGVuZGFyQWRhcHRlcl1cbiAgICAgICkge1xuICAgICAgICB0aGlzLmxvYWQodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSk7XG4gICAgICAgIHRoaXMucG9zaXRpb24odGhpcy5mb2N1c2VkLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hlY2soKTtcbiAgICAgICAgaWYgKGNoYW5nZXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WaWV3cG9ydFByZXNldF0pXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbihmb2N1cywgdHJ1ZSk7XG4gICAgICAgIGVsc2UgdGhpcy5zY3JvbGxUb0Vwb2NoRGF5KGZvY3VzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuY29uZmlndXJlKCk7XG4gICAgY29uc3QgaW5pdGlhbEVwb2NoRGF5ID0gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkluaXRpYWxFcG9jaERheV07XG4gICAgdGhpcy50b2RheSA9IHRoaXMuYnJvd3NlclxuICAgICAgPyBNYXRoLmZsb29yKHRoaXMuY2xvY2subm93KCkuZ2V0VGltZSgpIC8gODY0MDAwMDApXG4gICAgICA6IGluaXRpYWxFcG9jaERheSA9PT0gbnVsbFxuICAgICAgICA/IDBcbiAgICAgICAgOiBpbml0aWFsRXBvY2hEYXk7XG4gICAgdGhpcy5mb2N1c2VkID1cbiAgICAgIGluaXRpYWxFcG9jaERheSA9PT0gbnVsbFxuICAgICAgICA/IHRoaXMuZGVmYXVsdHMuaW5pdGlhbEVwb2NoRGF5ID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHRoaXMudG9kYXlcbiAgICAgICAgICA6IHRoaXMuZGVmYXVsdHMuaW5pdGlhbEVwb2NoRGF5XG4gICAgICAgIDogaW5pdGlhbEVwb2NoRGF5O1xuICAgIHRoaXMubG9hZCh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnBvc2l0aW9uKHRoaXMuZm9jdXNlZCwgdHJ1ZSk7XG4gIH1cbiAgY29uZmlndXJlKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnRXJyb3JzID0gW107XG4gICAgW1xuICAgICAgV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TaG93U2Vjb25kcyxcbiAgICAgIFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuQWxsb3dSYW5nZUFjcm9zc0Rpc2FibGVkLFxuICAgICAgV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5SZXF1aXJlZCxcbiAgICAgIFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWQsXG4gICAgICBXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkNsb3NlT25CYWNrZHJvcCxcbiAgICBdLmZvckVhY2goXG4gICAgICAoa2V5KSA9PiAoKHRoaXMgYXMgYW55KVtrZXldID0gY29lcmNlQm9vbGVhbigodGhpcyBhcyBhbnkpW2tleV0pKSxcbiAgICApO1xuICAgIHRoaXMuZWZmZWN0aXZlTG9jYWxlID1cbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Mb2NhbGVdIHx8XG4gICAgICB0aGlzLmRlZmF1bHRzLmxvY2FsZSB8fFxuICAgICAgdGhpcy5kZWZhdWx0TG9jYWxlO1xuICAgIHRoaXMuZGlyZWN0aW9uID0gL14oYXJ8aGV8ZmF8dXIpKC18JCkvLnRlc3QodGhpcy5lZmZlY3RpdmVMb2NhbGUpXG4gICAgICA/IFwicnRsXCJcbiAgICAgIDogXCJsdHJcIjtcbiAgICB0aGlzLmFkYXB0ZXIgPVxuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkNhbGVuZGFyQWRhcHRlcl0gfHxcbiAgICAgIG5ldyBXa2x5R3JlZ29yaWFuQ2FsZW5kYXJBZGFwdGVyKHRoaXMuZWZmZWN0aXZlTG9jYWxlKTtcbiAgICB0cnkge1xuICAgICAgbGV0IGZpcnN0RGF5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBmaXJzdERheSA9IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrKHRoaXMuZWZmZWN0aXZlTG9jYWxlKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB0aGlzLmVmZmVjdGl2ZU9mZnNldCA9IHJlc29sdmVXZWVrT2Zmc2V0KFxuICAgICAgICB0aGlzLmVmZmVjdGl2ZUxvY2FsZSxcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtPZmZzZXRdLFxuICAgICAgICB0aGlzLmRlZmF1bHRzLndlZWtPZmZzZXQsXG4gICAgICAgIGZpcnN0RGF5LFxuICAgICAgKTtcbiAgICAgIGludGVnZXIodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtDYWNoZVNpemVdKTtcbiAgICAgIGludGVnZXIodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk92ZXJzY2FuV2Vla3NdKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtDYWNoZVNpemVdIDwgMCB8fFxuICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuT3ZlcnNjYW5XZWVrc10gPCAwIHx8XG4gICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5PdmVyc2NhbldlZWtzXSA+IDUwXG4gICAgICApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCk7XG4gICAgICBpZiAoXG4gICAgICAgICFbXG4gICAgICAgICAgXCJkYXRldGltZVwiLFxuICAgICAgICAgIFwiZGF0ZVwiLFxuICAgICAgICAgIFwidGltZVwiLFxuICAgICAgICAgIFwiZGF0ZXRpbWUtcmFuZ2VcIixcbiAgICAgICAgICBcImRhdGUtcmFuZ2VcIixcbiAgICAgICAgICBcInRpbWUtcmFuZ2VcIixcbiAgICAgICAgXS5pbmNsdWRlcyh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0pXG4gICAgICApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCk7XG4gICAgICBjb25zdCBwcmVzZXQgPSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmlld3BvcnRQcmVzZXRdO1xuICAgICAgaWYgKHByZXNldC5raW5kID09PSBcIndlZWtzXCIpIHtcbiAgICAgICAgaW50ZWdlcihwcmVzZXQudmlzaWJsZVdlZWtDb3VudCk7XG4gICAgICAgIGlmIChwcmVzZXQudmlzaWJsZVdlZWtDb3VudCA8IDEgfHwgcHJlc2V0LnZpc2libGVXZWVrQ291bnQgPiA1MilcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigpO1xuICAgICAgfVxuICAgICAgaWYgKHByZXNldC5raW5kID09PSBcImZ1bGwtbW9udGgtYW5kLWFyb3VuZFwiKVxuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgW1xuICAgICAgICAgIHByZXNldC5leHRyYVdlZWtzQmVmb3JlIHx8IDAsXG4gICAgICAgICAgcHJlc2V0LmV4dHJhV2Vla3NBZnRlciB8fCAwLFxuICAgICAgICBdKSB7XG4gICAgICAgICAgaW50ZWdlcihuKTtcbiAgICAgICAgICBpZiAobiA8IDAgfHwgbiA+IDUyKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB0aGlzLmdlbmVyYXRvciA9IGNyZWF0ZVdlZWtHZW5lcmF0b3Ioe1xuICAgICAgICB3ZWVrT2Zmc2V0OiB0aGlzLmVmZmVjdGl2ZU9mZnNldCxcbiAgICAgICAgY2FjaGVTaXplOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0NhY2hlU2l6ZV0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0aGlzLmNvbmZpZ0Vycm9ycy5wdXNoKFxuICAgICAgICBlcnJvcihcbiAgICAgICAgICBcImNvbmZpZ3VyYXRpb24tZXJyb3JcIixcbiAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla09mZnNldF0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgdGhpcy5nZW5lcmF0b3IgPSBjcmVhdGVXZWVrR2VuZXJhdG9yKCk7XG4gICAgICB0aGlzLmVmZmVjdGl2ZU9mZnNldCA9IDA7XG4gICAgfVxuICAgIHRoaXMuc2V0U3VwcG9ydGVkU2Nyb2xsUmFuZ2UoKTtcbiAgICB0aGlzLmVmZmVjdGl2ZUhvdXJDeWNsZSA9XG4gICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuSG91ckN5Y2xlXSA9PT0gXCJoMTJcIlxuICAgICAgICA/IFwiaDEyXCJcbiAgICAgICAgOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuSG91ckN5Y2xlXSA9PT0gXCJsb2NhbGVcIlxuICAgICAgICAgID8gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5lZmZlY3RpdmVMb2NhbGUsIHtcbiAgICAgICAgICAgICAgaG91cjogXCJudW1lcmljXCIsXG4gICAgICAgICAgICAgIHRpbWVab25lOiBcIlVUQ1wiLFxuICAgICAgICAgICAgfSkucmVzb2x2ZWRPcHRpb25zKCkuaG91cjEyXG4gICAgICAgICAgICA/IFwiaDEyXCJcbiAgICAgICAgICAgIDogXCJoMjRcIlxuICAgICAgICAgIDogXCJoMjRcIjtcbiAgICB0aGlzLndlZWtkYXlzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogNyB9LCAoXywgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5mb3JtYXRXZWVrZGF5KHRoaXMuZWZmZWN0aXZlT2Zmc2V0ICsgaSwgXCJzaG9ydFwiKSxcbiAgICApO1xuICB9XG4gIHByaXZhdGUgc2V0U3VwcG9ydGVkU2Nyb2xsUmFuZ2UoKTogdm9pZCB7XG4gICAgbGV0IFtmaXJzdCwgbGFzdF0gPSB0aGlzLmFkYXB0ZXIuc3VwcG9ydGVkRXBvY2hEYXlSYW5nZTtcbiAgICBjb25zdCBbZmlyc3RZZWFyLCBsYXN0WWVhcl0gPSB0aGlzLmFkYXB0ZXIuc3VwcG9ydGVkWWVhclJhbmdlO1xuICAgIGNvbnN0IHllYXJPZiA9IChkYXk6IG51bWJlcikgPT4gdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKGRheSkueWVhcjtcbiAgICBpZiAoeWVhck9mKGZpcnN0KSA8IGZpcnN0WWVhcikge1xuICAgICAgbGV0IGxvdyA9IGZpcnN0LFxuICAgICAgICBoaWdoID0gbGFzdDtcbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICAgIGlmICh5ZWFyT2YobWlkKSA8IGZpcnN0WWVhcikgbG93ID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaWdoID0gbWlkO1xuICAgICAgfVxuICAgICAgZmlyc3QgPSBsb3c7XG4gICAgfVxuICAgIGlmICh5ZWFyT2YobGFzdCkgPiBsYXN0WWVhcikge1xuICAgICAgbGV0IGxvdyA9IGZpcnN0LFxuICAgICAgICBoaWdoID0gbGFzdDtcbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IE1hdGguY2VpbCgobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgaWYgKHllYXJPZihtaWQpID4gbGFzdFllYXIpIGhpZ2ggPSBtaWQgLSAxO1xuICAgICAgICBlbHNlIGxvdyA9IG1pZDtcbiAgICAgIH1cbiAgICAgIGxhc3QgPSBsb3c7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGZpcnN0ID4gbGFzdCB8fFxuICAgICAgeWVhck9mKGZpcnN0KSA8IGZpcnN0WWVhciB8fFxuICAgICAgeWVhck9mKGZpcnN0KSA+IGxhc3RZZWFyIHx8XG4gICAgICB5ZWFyT2YobGFzdCkgPCBmaXJzdFllYXIgfHxcbiAgICAgIHllYXJPZihsYXN0KSA+IGxhc3RZZWFyXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJObyBzdXBwb3J0ZWQgZGF5cyB3aXRoaW4gdGhlIGNhbGVuZGFyIHllYXIgcmFuZ2VcIik7XG4gICAgdGhpcy5maXJzdFN1cHBvcnRlZERheSA9IGZpcnN0O1xuICAgIHRoaXMubGFzdFN1cHBvcnRlZERheSA9IGxhc3Q7XG4gICAgdGhpcy5maXJzdFN1cHBvcnRlZFdlZWsgPSBhYnNvbHV0ZVdlZWtPZihmaXJzdCwgdGhpcy5lZmZlY3RpdmVPZmZzZXQpO1xuICAgIHRoaXMubGFzdFN1cHBvcnRlZFdlZWsgPSBhYnNvbHV0ZVdlZWtPZihsYXN0LCB0aGlzLmVmZmVjdGl2ZU9mZnNldCk7XG4gIH1cbiAgcHJpdmF0ZSBjbGFtcEZpcnN0V2Vlayh3ZWVrOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIEtlZXAgc3VwcG9ydGVkIHdlZWtzIGluc2lkZSB0aGUgdmlld3BvcnQ7IHJlbmRlclJvd3MgYWRkcyB0aGUgYnVmZmVyIHJvd3MuXG4gICAgY29uc3QgbGFzdCA9IE1hdGgubWF4KFxuICAgICAgdGhpcy5maXJzdFN1cHBvcnRlZFdlZWssXG4gICAgICB0aGlzLmxhc3RTdXBwb3J0ZWRXZWVrIC0gdGhpcy52aXNpYmxlQ291bnQgKyAxLFxuICAgICk7XG4gICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuZmlyc3RTdXBwb3J0ZWRXZWVrLCBNYXRoLm1pbihsYXN0LCB3ZWVrKSk7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgICBpZiAodGhpcy5icm93c2VyICYmIHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcGFjdCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIDwgMzM4O1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwiLndlZWstcm93XCIsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vIENTUyBoZWlnaHRzIGFuZCBzY3JvbGxUb3AgdXNlIGxheW91dCBwaXhlbHM7IGNsaWVudCByZWN0YW5nbGVzIGluY2x1ZGUgem9vbS5cbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcm93ID8gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHJvdykuaGVpZ2h0KSA6IDA7XG4gICAgICAgIGlmIChoZWlnaHQgJiYgaGVpZ2h0ICE9PSB0aGlzLnJvd0hlaWdodCkge1xuICAgICAgICAgIHRoaXMucm93SGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gdGhpcy5yb3dIZWlnaHQgKiAyMDAxO1xuICAgICAgICAgIHRoaXMucmVuZGVyUm93cygpO1xuICAgICAgICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIGlmICh0aGlzLnNjcm9sbEVuZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxFbmRUaW1lcik7XG4gICAgaWYgKHRoaXMuZ2VuZXJhdG9yKSB0aGlzLmdlbmVyYXRvci5jbGVhckNhY2hlKCk7XG4gIH1cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVXa2x5VHJhbnNsYXRpb24oXG4gICAgICBrZXksXG4gICAgICB0aGlzLmVmZmVjdGl2ZUxvY2FsZSxcbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5UcmFuc2xhdGlvbnNdIHx8XG4gICAgICAgIHRoaXMuZGVmYXVsdFRyYW5zbGF0aW9ucyxcbiAgICAgIHRoaXMuc3RyaW5ncyxcbiAgICApO1xuICB9XG4gIGdldCBpc1JhbmdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0uZW5kc1dpdGgoXCItcmFuZ2VcIik7XG4gIH1cbiAgZ2V0IGhhc0RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0uc3RhcnRzV2l0aChcInRpbWVcIik7XG4gIH1cbiAgZ2V0IGhhc1RpbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSAhPT0gXCJkYXRlXCIgJiZcbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSAhPT0gXCJkYXRlLXJhbmdlXCJcbiAgICApO1xuICB9XG4gIGdldCBzdWJtaXRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnByZXNlbnRhdGlvbiA9PT0gXCJ0cmFuc2llbnRcIiAmJlxuICAgICAgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSAhPT0gXCJkYXRlXCIgfHxcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9PT0gXCJtYW51YWxcIilcbiAgICApO1xuICB9XG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKFxuICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5LFxuICAgICAgICAgIE1hdGgubWluKFxuICAgICAgICAgICAgdGhpcy5sYXN0U3VwcG9ydGVkRGF5LFxuICAgICAgICAgICAgZmlyc3RFcG9jaERheU9mKHRoaXMuYW5jaG9yV2VlaywgdGhpcy5lZmZlY3RpdmVPZmZzZXQpLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5mb3JtYXRNb250aChkKSArIFwiIFwiICsgdGhpcy5hZGFwdGVyLmZvcm1hdFllYXIoZCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9XG4gIGdldCBjYW5TdWJtaXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdICYmXG4gICAgICAhdGhpcy5lcnJvcnMubGVuZ3RoICYmXG4gICAgICB0aGlzLnBlbmRpbmdWYWx1ZSAhPT0gbnVsbFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBibGFuayhkYXk6IG51bWJlcik6IERyYWZ0IHtcbiAgICBjb25zdCBzYWZlID0gTWF0aC5tYXgoXG4gICAgICB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5LFxuICAgICAgTWF0aC5taW4odGhpcy5sYXN0U3VwcG9ydGVkRGF5LCBkYXkpLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGU6IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShzYWZlKSxcbiAgICAgIGhvdXI6IDAsXG4gICAgICBtaW51dGU6IDAsXG4gICAgICBzZWNvbmQ6IDAsXG4gICAgICBwcmVzZW50OiBmYWxzZSxcbiAgICB9O1xuICB9XG4gIGxvYWQodmFsdWU6IFdrbHlQaWNrZXJWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuZHJhZnRzID0gW3RoaXMuYmxhbmsodGhpcy5mb2N1c2VkKSwgdGhpcy5ibGFuayh0aGlzLmZvY3VzZWQpXTtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVTZWxlY3Rpb24odmFsdWUsIHRoaXMsIHRoaXMuYWRhcHRlcik7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmICF2YWxpZGF0aW9uLmxlbmd0aCkge1xuICAgICAgY29uc3QgdmFsdWVzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gW3ZhbHVlXSA6IHZhbHVlO1xuICAgICAgdmFsdWVzLmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgY29uc3QgZCA9IGRlY29kZUlzbyh2KTtcbiAgICAgICAgdGhpcy5kcmFmdHNbaV0gPSB7XG4gICAgICAgICAgZGF0ZTogdGhpcy5oYXNEYXRlXG4gICAgICAgICAgICA/IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkLmVwb2NoRGF5KVxuICAgICAgICAgICAgOiB0aGlzLmJsYW5rKHRoaXMudG9kYXkpLmRhdGUsXG4gICAgICAgICAgaG91cjogZC5ob3VyLFxuICAgICAgICAgIG1pbnV0ZTogZC5taW51dGUsXG4gICAgICAgICAgc2Vjb25kOiBkLnNlY29uZCxcbiAgICAgICAgICBwcmVzZW50OiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoaSA9PT0gMCAmJiB0aGlzLmhhc0RhdGUpIHRoaXMuZm9jdXNlZCA9IGQuZXBvY2hEYXk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHZhbGlkYXRpb24ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnBlbmRpbmdWYWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLnJlcG9ydCh2YWxpZGF0aW9uKTtcbiAgICB9IGVsc2UgdGhpcy5jaGVjaygpO1xuICB9XG4gIHdyaXRlVmFsdWUodmFsdWU6IFdrbHlQaWNrZXJWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0gPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5sb2FkKHZhbHVlKTtcbiAgICAgIHRoaXMucG9zaXRpb24odGhpcy5mb2N1c2VkLCB0cnVlKTtcbiAgICB9XG4gIH1cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBXa2x5UGlja2VyVmFsdWUpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG4gIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdID0gZGlzYWJsZWQ7XG4gIH1cbiAgdmFsaWRhdGUoX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMubGVuZ3RoID8geyB3a2x5OiB0aGlzLmVycm9ycyB9IDogbnVsbDtcbiAgfVxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0b3JDaGFuZ2VkID0gZm47XG4gIH1cbiAgdG91Y2hlZCgpOiB2b2lkIHtcbiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMub25Ub3VjaGVkKCkpO1xuICB9XG4gIHByaXZhdGUgcmVwb3J0KGVycm9yczogcmVhZG9ubHkgV2tseVZhbGlkYXRpb25FcnJvcltdKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbmdlZCA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZXJyb3JzKSAhPT0gSlNPTi5zdHJpbmdpZnkoZXJyb3JzKTtcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgdGhpc1tXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cy5WYWxpZGF0aW9uQ2hhbmdlXS5lbWl0KGVycm9ycyk7XG4gICAgICB0aGlzLnZhbGlkYXRvckNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgY2hlY2soKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVEcmFmdHMoe1xuICAgICAgZHJhZnRzOiB0aGlzLmRyYWZ0cyxcbiAgICAgIGNvbmZpZ0Vycm9yczogdGhpcy5jb25maWdFcnJvcnMsXG4gICAgICBhZGFwdGVyOiB0aGlzLmFkYXB0ZXIsXG4gICAgICBzZWxlY3Rpb246IHRoaXMsXG4gICAgICBtb2RlOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0sXG4gICAgICBpc1JhbmdlOiB0aGlzLmlzUmFuZ2UsXG4gICAgICBoYXNEYXRlOiB0aGlzLmhhc0RhdGUsXG4gICAgICBoYXNUaW1lOiB0aGlzLmhhc1RpbWUsXG4gICAgICBzaG93U2Vjb25kczogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNob3dTZWNvbmRzXSxcbiAgICAgIHJlcXVpcmVkOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuUmVxdWlyZWRdLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZ1ZhbHVlID0gcmVzdWx0LnBlbmRpbmdWYWx1ZTtcbiAgICB0aGlzLnJlcG9ydChyZXN1bHQuZXJyb3JzKTtcbiAgfVxuICB0cmFja0RyYWZ0KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIEVuZHBvaW50IGNvbnRyb2xzIGtlZXAgdGhlaXIgaWRlbnRpdHkgYW5kIGZvY3VzIHdoZW4gZHJhZnQgb2JqZWN0cyBzd2FwLlxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuICBwcml2YXRlIG9yZGVyRHJhZnRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1JhbmdlIHx8ICF0aGlzLmRyYWZ0cy5ldmVyeSgoZHJhZnQpID0+IGRyYWZ0LnByZXNlbnQpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuZHJhZnRzLnNvbWUoKGRyYWZ0KSA9PiBkcmFmdC51bnN1cHBvcnRlZEVwb2NoRGF5ICE9PSB1bmRlZmluZWQpKVxuICAgICAgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhID0gdGhpcy5kcmFmdHNbMF0sXG4gICAgICAgIGIgPSB0aGlzLmRyYWZ0c1sxXTtcbiAgICAgIGNvbnN0IGtleSA9IChkOiBEcmFmdCkgPT5cbiAgICAgICAgdGhpcy5hZGFwdGVyLmRhdGVUb0Vwb2NoRGF5KGQuZGF0ZSkgKiA4NjQwMCArXG4gICAgICAgIChkLmhvdXIgfHwgMCkgKiAzNjAwICtcbiAgICAgICAgKGQubWludXRlIHx8IDApICogNjAgK1xuICAgICAgICAoZC5zZWNvbmQgfHwgMCk7XG4gICAgICBpZiAoa2V5KGEpID4ga2V5KGIpKSB0aGlzLmRyYWZ0cyA9IFtiLCBhXTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICAvLyBJbXBvc3NpYmxlIG9yIGluY29tcGxldGUgZGF0ZXMgcmVtYWluIGVkaXRhYmxlIHVudGlsIGNvcnJlY3RlZC5cbiAgICB9XG4gIH1cbiAgZmluaXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKSByZXR1cm47XG4gICAgdGhpcy5vcmRlckRyYWZ0cygpO1xuICAgIGlmICh0aGlzLnZpZXdNb2RlID09PSBcIm1hbnVhbFwiICYmIHRoaXMuaGFzRGF0ZSkgdGhpcy5wb3NpdGlvbk9uTWFudWFsRGF0ZSgpO1xuICAgIHRoaXMuY2hlY2soKTtcbiAgICBpZiAodGhpcy5wcmVzZW50YXRpb24gPT09IFwiaW5saW5lXCIgJiYgdGhpcy5jYW5TdWJtaXQpIHRoaXMuY29tbWl0KCk7XG4gIH1cbiAgcHJpdmF0ZSBjb21taXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblN1Ym1pdCkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLnBlbmRpbmdWYWx1ZTtcbiAgICBpZiAoXG4gICAgICBKU09OLnN0cmluZ2lmeShuZXh0KSAhPT1cbiAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0pXG4gICAgKSB7XG4gICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdID0gbmV4dDtcbiAgICAgIHRoaXMuZW1pdHRlZFZhbHVlID0gSlNPTi5zdHJpbmdpZnkobmV4dCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKG5leHQpO1xuICAgICAgdGhpc1tXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cy5WYWx1ZUNoYW5nZV0uZW1pdChuZXh0KTtcbiAgICB9XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuICBzdWJtaXQocmVhc29uOiBXa2x5Q2xvc2VSZWFzb24gPSBcInN1Ym1pdFwiKTogdm9pZCB7XG4gICAgdGhpcy5jaGVjaygpO1xuICAgIGlmICghdGhpcy5jYW5TdWJtaXQpIHJldHVybjtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICAgIGlmICh0aGlzLnByZXNlbnRhdGlvbiA9PT0gXCJ0cmFuc2llbnRcIilcbiAgICAgIHRoaXNbV2tseVBpY2tlck91dHB1dHNQcm9wZXJ0eUtleXMuQ2xvc2VkXS5lbWl0KHJlYXNvbik7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbjogV2tseUNsb3NlUmVhc29uID0gXCJjbG9zZS1idXR0b25cIik6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKSByZXR1cm47XG4gICAgdGhpcy5sb2FkKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0pO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpc1tXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cy5DbG9zZWRdLmVtaXQocmVhc29uKTtcbiAgfVxuICBub3coKTogdm9pZCB7XG4gICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0pIHJldHVybjtcbiAgICBjb25zdCBuID0gdGhpcy5jbG9jay5ub3coKTtcbiAgICBjb25zdCBkYXkgPSBNYXRoLmZsb29yKG4uZ2V0VGltZSgpIC8gODY0MDAwMDApO1xuICAgIHRoaXMuZHJhZnRzID0gWzAsIDFdLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAuLi50aGlzLmNsb2NrRHJhZnQoZGF5LCBuKSxcbiAgICAgIHByZXNlbnQ6IGluZGV4ID09PSAwIHx8IHRoaXMuaXNSYW5nZSxcbiAgICB9KSk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5oYXNEYXRlICYmXG4gICAgICAoZGF5IDwgdGhpcy5maXJzdFN1cHBvcnRlZERheSB8fCBkYXkgPiB0aGlzLmxhc3RTdXBwb3J0ZWREYXkpXG4gICAgKSB7XG4gICAgICB0aGlzLnJlcG9ydChbZXJyb3IoXCJ1bnN1cHBvcnRlZC1hZGFwdGVyLWRhdGVcIiwgZGF5KV0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZvY3VzZWQgPSBkYXk7XG4gICAgdGhpcy5wb3NpdGlvbihkYXksIHRydWUpO1xuICAgIHRoaXMuY2hlY2soKTtcbiAgICB0aGlzLnN1Ym1pdChcIm5vd1wiKTtcbiAgfVxuICBwcml2YXRlIGNsb2NrRHJhZnQoZGF5OiBudW1iZXIsIG5vdzogRGF0ZSk6IERyYWZ0IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5ibGFuayhkYXkpLFxuICAgICAgaG91cjogbm93LmdldFVUQ0hvdXJzKCksXG4gICAgICBtaW51dGU6XG4gICAgICAgIE1hdGguZmxvb3IoXG4gICAgICAgICAgbm93LmdldFVUQ01pbnV0ZXMoKSAvIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5NaW51dGVTdGVwXSxcbiAgICAgICAgKSAqIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5NaW51dGVTdGVwXSxcbiAgICAgIHNlY29uZDogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNob3dTZWNvbmRzXVxuICAgICAgICA/IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBub3cuZ2V0VVRDU2Vjb25kcygpIC8gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNlY29uZFN0ZXBdLFxuICAgICAgICAgICkgKiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuU2Vjb25kU3RlcF1cbiAgICAgICAgOiAwLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBpbml0aWFsaXplTWFudWFsUmFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNSYW5nZSB8fFxuICAgICAgIXRoaXMuaGFzRGF0ZSB8fFxuICAgICAgdGhpcy5kcmFmdHMuZXZlcnkoKGRyYWZ0KSA9PiBkcmFmdC5wcmVzZW50KVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBsZXQgc2VlZCA9IHRoaXMuZHJhZnRzLmZpbmQoKGRyYWZ0KSA9PiBkcmFmdC5wcmVzZW50KTtcbiAgICBpZiAoIXNlZWQpIHtcbiAgICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdICE9PSBudWxsKSByZXR1cm47XG4gICAgICBjb25zdCBub3cgPSB0aGlzLmNsb2NrLm5vdygpO1xuICAgICAgY29uc3QgaW5pdGlhbEVwb2NoRGF5ID1cbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkluaXRpYWxFcG9jaERheV07XG4gICAgICBjb25zdCBkYXkgPVxuICAgICAgICBpbml0aWFsRXBvY2hEYXkgPT09IG51bGxcbiAgICAgICAgICA/IHRoaXMuZGVmYXVsdHMuaW5pdGlhbEVwb2NoRGF5ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gTWF0aC5mbG9vcihub3cuZ2V0VGltZSgpIC8gODY0MDAwMDApXG4gICAgICAgICAgICA6IHRoaXMuZGVmYXVsdHMuaW5pdGlhbEVwb2NoRGF5XG4gICAgICAgICAgOiBpbml0aWFsRXBvY2hEYXk7XG4gICAgICBzZWVkID0geyAuLi50aGlzLmNsb2NrRHJhZnQoZGF5LCBub3cpLCBwcmVzZW50OiB0cnVlIH07XG4gICAgfVxuICAgIC8vIENvbXBsZXRlIG1pc3NpbmcgZW5kcG9pbnRzIHdpdGhvdXQgcmVwbGFjaW5nIHNlbGVjdGVkIG9yIGludmFsaWQgZHJhZnRzLlxuICAgIGNvbnN0IGluaXRpYWwgPSBzZWVkO1xuICAgIHRoaXMuZHJhZnRzID0gdGhpcy5kcmFmdHMubWFwKChkcmFmdCkgPT5cbiAgICAgIGRyYWZ0LnByZXNlbnQgPyBkcmFmdCA6IHsgLi4uaW5pdGlhbCwgZGF0ZTogeyAuLi5pbml0aWFsLmRhdGUgfSB9LFxuICAgICk7XG4gICAgdGhpcy5maW5pc2goKTtcbiAgICAvLyBQb3NpdGlvbmluZyByZW5kZXJzIGJlZm9yZSB2YWxpZGF0aW9uOyByZWZyZXNoIGNvbXBsZXRpb24gY29udHJvbHMgYWZ0ZXJ3YXJkLlxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgdG9nZ2xlVmlldygpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSB8fCAhdGhpcy5oYXNEYXRlKSByZXR1cm47XG4gICAgdGhpcy52aWV3TW9kZSA9IHRoaXMudmlld01vZGUgPT09IFwiY2FsZW5kYXJcIiA/IFwibWFudWFsXCIgOiBcImNhbGVuZGFyXCI7XG4gICAgaWYgKHRoaXMudmlld01vZGUgPT09IFwibWFudWFsXCIpIHRoaXMuaW5pdGlhbGl6ZU1hbnVhbFJhbmdlKCk7XG4gICAgaWYgKHRoaXMudmlld01vZGUgPT09IFwiY2FsZW5kYXJcIikgdGhpcy5wb3NpdGlvbk9uTWFudWFsRGF0ZSgpO1xuICAgIHRoaXNbV2tseVBpY2tlck91dHB1dHNQcm9wZXJ0eUtleXMuVmlld01vZGVDaGFuZ2VdLmVtaXQodGhpcy52aWV3TW9kZSk7XG4gICAgaWYgKHRoaXMudmlld01vZGUgPT09IFwiY2FsZW5kYXJcIikgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlc2V0U2Nyb2xsKCkpO1xuICB9XG4gIHByaXZhdGUgcG9zaXRpb25Pbk1hbnVhbERhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgZHJhZnQgPSB0aGlzLmRyYWZ0c1t0aGlzLm1hbnVhbERhdGVFbmRwb2ludF07XG4gICAgaWYgKCFkcmFmdCB8fCAhZHJhZnQucHJlc2VudCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICAvLyBBIHZhbGlkIGRheSBmb2xsb3dzIHRoZSBzZWxlY3Rpb24uIEFuIGltcG9zc2libGUgZGF5IGtlZXBzIGl0cyBkcmFmdFxuICAgICAgLy8gZmllbGRzIGJ1dCBzdGlsbCBzaG93cyB0aGUgY2hvc2VuIG1vbnRoIGluIHRoZSBjYWxlbmRhci5cbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheShkcmFmdC5kYXRlKTtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRhcmdldDtcbiAgICAgIHRoaXMucG9zaXRpb24odGFyZ2V0LCB0cnVlKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmaXJzdCA9IHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheSh7IC4uLmRyYWZ0LmRhdGUsIGRheTogMSB9KTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmlyc3Q7XG4gICAgICAgIHRoaXMucG9zaXRpb24oZmlyc3QsIHRydWUpO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9XG4gIH1cbiAgbW9udGhzKGRyYWZ0OiBEcmFmdCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRNb250aHMoZHJhZnQuZGF0ZS55ZWFyKS5tYXAoKG0pID0+IG0ubGFiZWwpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgbW9udGhDb3VudChkcmFmdDogRHJhZnQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1vbnRocyhkcmFmdCkubGVuZ3RoIHx8IDEyO1xuICB9XG4gIGdldCBpbkRheXMoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIGRyYWZ0RGF5RGlmZmVyZW5jZSh0aGlzLmRyYWZ0cywgdGhpcy5hZGFwdGVyKTtcbiAgfVxuICBnZXQgaW5EYXlzTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXlzID0gdGhpcy5pbkRheXM7XG4gICAgcmV0dXJuIHRoaXMudChcImluRGF5c1wiKS5yZXBsYWNlKFxuICAgICAgL3t7XFxzKmRheXNcXHMqfX0vZyxcbiAgICAgIGRheXMgPT09IG51bGxcbiAgICAgICAgPyB0aGlzLnQoXCJkYXlzVW5hdmFpbGFibGVcIilcbiAgICAgICAgOiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5lZmZlY3RpdmVMb2NhbGUsIHtcbiAgICAgICAgICAgIHVzZUdyb3VwaW5nOiBmYWxzZSxcbiAgICAgICAgICB9KS5mb3JtYXQoZGF5cyksXG4gICAgKTtcbiAgfVxuICBnZXQgcmVzdWx0aW5nRW5kRGF0ZSgpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkcmFmdCA9IHRoaXMuZHJhZnRzWzFdO1xuICAgICAgaWYgKFxuICAgICAgICBkcmFmdC51bnN1cHBvcnRlZEVwb2NoRGF5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgdGhpcy5hZGFwdGVyLnZhbGlkYXRlRGF0ZShkcmFmdC5kYXRlKS5sZW5ndGhcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLmFkYXB0ZXIuZm9ybWF0RGF5KGRyYWZ0LmRhdGUpLFxuICAgICAgICB0aGlzLmFkYXB0ZXIuZm9ybWF0TW9udGgoZHJhZnQuZGF0ZSksXG4gICAgICAgIHRoaXMuYWRhcHRlci5mb3JtYXRZZWFyKGRyYWZ0LmRhdGUpLFxuICAgICAgXS5qb2luKFwiIFwiKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cbiAgdG9nZ2xlRW5kVmlldyh2aWV3OiBcImRhdGVcIiB8IFwiZGF5c1wiKTogdm9pZCB7XG4gICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0pIHJldHVybjtcbiAgICB0aGlzLmVuZFZpZXcgPSB2aWV3O1xuICB9XG4gIGRheXModmFsdWU6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSkgcmV0dXJuO1xuICAgIHRoaXMubWFudWFsRGF0ZUVuZHBvaW50ID0gMTtcbiAgICBzZXREcmFmdERheURpZmZlcmVuY2UodGhpcy5kcmFmdHMsIHRoaXMuYWRhcHRlciwgdmFsdWUpO1xuICAgIHRoaXMuY2hlY2soKTtcbiAgfVxuICBmaWVsZChpbmRleDogbnVtYmVyLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKSByZXR1cm47XG4gICAgY29uc3QgZHJhZnQgPSB0aGlzLmRyYWZ0c1tpbmRleF07XG4gICAgZHJhZnQucHJlc2VudCA9IHRydWU7XG4gICAgaWYgKGZpZWxkID09PSBcImRheVwiIHx8IGZpZWxkID09PSBcInllYXJcIiB8fCBmaWVsZCA9PT0gXCJtb250aFwiKSB7XG4gICAgICB0aGlzLm1hbnVhbERhdGVFbmRwb2ludCA9IGluZGV4O1xuICAgICAgZGVsZXRlIGRyYWZ0LnVuc3VwcG9ydGVkRXBvY2hEYXk7XG4gICAgICBsZXQgZGF0ZSA9IHsgLi4uZHJhZnQuZGF0ZSwgW2ZpZWxkXTogdmFsdWUgfSBhcyBXa2x5Q2FsZW5kYXJEYXRlO1xuICAgICAgaWYgKGZpZWxkID09PSBcIm1vbnRoXCIpIHtcbiAgICAgICAgbGV0IG1vbnRoO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1vbnRoID0gdGhpcy5hZGFwdGVyXG4gICAgICAgICAgICAuZ2V0TW9udGhzKGRhdGUueWVhcilcbiAgICAgICAgICAgIC5maW5kKChtKSA9PiBtLm1vbnRoID09PSB2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIGRhdGUgPSB7IC4uLmRhdGUsIG1vbnRoQ29kZTogbW9udGggPyBtb250aC5tb250aENvZGUgOiBcIlwiIH07XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQgPT09IFwieWVhclwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbW9udGhzID0gdGhpcy5hZGFwdGVyLmdldE1vbnRocyh2YWx1ZSk7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBtb250aHMuZmluZCgobSkgPT4gbS5tb250aENvZGUgPT09IGRhdGUubW9udGhDb2RlKTtcbiAgICAgICAgICBpZiAobW9udGgpIGRhdGUgPSB7IC4uLmRhdGUsIG1vbnRoOiBtb250aC5tb250aCB9O1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfVxuICAgICAgZHJhZnQuZGF0ZSA9IGRhdGU7XG4gICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gXCJob3VyXCIgJiYgdGhpcy5lZmZlY3RpdmVIb3VyQ3ljbGUgPT09IFwiaDEyXCIpXG4gICAgICBkcmFmdC5ob3VyID1cbiAgICAgICAgdmFsdWUgPT09IG51bGxcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMTJcbiAgICAgICAgICAgID8gKHZhbHVlICUgMTIpICsgKChkcmFmdC5ob3VyIHx8IDApID49IDEyID8gMTIgOiAwKVxuICAgICAgICAgICAgOiAyNCArIHZhbHVlO1xuICAgIGVsc2UgKGRyYWZ0IGFzIGFueSlbZmllbGRdID0gdmFsdWU7XG4gICAgdGhpcy5jaGVjaygpO1xuICB9XG4gIGRpc3BsYXlIb3VyKGRyYWZ0OiBEcmFmdCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiBkcmFmdC5ob3VyID09PSBudWxsXG4gICAgICA/IG51bGxcbiAgICAgIDogdGhpcy5lZmZlY3RpdmVIb3VyQ3ljbGUgPT09IFwiaDEyXCJcbiAgICAgICAgPyBkcmFmdC5ob3VyICUgMTIgfHwgMTJcbiAgICAgICAgOiBkcmFmdC5ob3VyO1xuICB9XG4gIHBlcmlvZChpbmRleDogbnVtYmVyLCBwZXJpb2Q6IFwiYW1cIiB8IFwicG1cIiB8IFwiMjRcIik6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKSByZXR1cm47XG4gICAgaWYgKHBlcmlvZCA9PT0gXCIyNFwiKSB0aGlzLmVmZmVjdGl2ZUhvdXJDeWNsZSA9IFwiaDI0XCI7XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmVmZmVjdGl2ZUhvdXJDeWNsZSA9IFwiaDEyXCI7XG4gICAgICB0aGlzLmRyYWZ0c1tpbmRleF0uaG91ciA9XG4gICAgICAgICgodGhpcy5kcmFmdHNbaW5kZXhdLmhvdXIgfHwgMCkgJSAxMikgKyAocGVyaW9kID09PSBcInBtXCIgPyAxMiA6IDApO1xuICAgICAgdGhpcy5kcmFmdHNbaW5kZXhdLnByZXNlbnQgPSB0cnVlO1xuICAgICAgdGhpcy5maW5pc2goKTtcbiAgICB9XG4gIH1cbiAgc2VsZWN0ZWQoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kcmFmdHMuc29tZSgoZCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGQucHJlc2VudCAmJiB0aGlzLmFkYXB0ZXIuZGF0ZVRvRXBvY2hEYXkoZC5kYXRlKSA9PT0gZGF5O1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgaW5SYW5nZShkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc1JhbmdlIHx8ICF0aGlzLmRyYWZ0cy5ldmVyeSgoZCkgPT4gZC5wcmVzZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhID0gdGhpcy5hZGFwdGVyLmRhdGVUb0Vwb2NoRGF5KHRoaXMuZHJhZnRzWzBdLmRhdGUpLFxuICAgICAgICBiID0gdGhpcy5hZGFwdGVyLmRhdGVUb0Vwb2NoRGF5KHRoaXMuZHJhZnRzWzFdLmRhdGUpO1xuICAgICAgcmV0dXJuIGRheSA+IE1hdGgubWluKGEsIGIpICYmIGRheSA8IE1hdGgubWF4KGEsIGIpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZGF5RGlzYWJsZWQoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoZGF5IDwgdGhpcy5maXJzdFN1cHBvcnRlZERheSB8fCBkYXkgPiB0aGlzLmxhc3RTdXBwb3J0ZWREYXkpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkYXkpO1xuICAgICAgY29uc3QgaXNEYXRlRGlzYWJsZWQgPSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuSXNEYXRlRGlzYWJsZWRdO1xuICAgICAgaWYgKFxuICAgICAgICBpc0RhdGVEaXNhYmxlZCAmJlxuICAgICAgICBpc0RhdGVEaXNhYmxlZChkYXksIHtcbiAgICAgICAgICBtb2RlOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0sXG4gICAgICAgICAgZW5kcG9pbnQ6IHRoaXMuaXNSYW5nZVxuICAgICAgICAgICAgPyB0aGlzLmRyYWZ0c1swXT8ucHJlc2VudCAmJiAhdGhpcy5kcmFmdHNbMV0/LnByZXNlbnRcbiAgICAgICAgICAgICAgPyBcImVuZFwiXG4gICAgICAgICAgICAgIDogXCJzdGFydFwiXG4gICAgICAgICAgICA6IFwic2luZ2xlXCIsXG4gICAgICAgICAgY2FsZW5kYXJEYXRlOiBkYXRlLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IG1pbiA9IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5NaW5dO1xuICAgICAgY29uc3QgbWF4ID0gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1heF07XG4gICAgICBpZiAobWluICYmIGRheSA8IGRlY29kZUlzbyhtaW4pLmVwb2NoRGF5KSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChtYXggJiYgZGF5ID4gZGVjb2RlSXNvKG1heCkuZXBvY2hEYXkpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBzZWxlY3QoZGF5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSB8fCB0aGlzLmRheURpc2FibGVkKGRheSkpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5mb2N1c2VkID0gZGF5O1xuICAgIGNvbnN0IGluZGV4ID1cbiAgICAgIHRoaXMuaXNSYW5nZSAmJiB0aGlzLmRyYWZ0c1swXS5wcmVzZW50ICYmICF0aGlzLmRyYWZ0c1sxXS5wcmVzZW50ID8gMSA6IDA7XG4gICAgaWYgKHRoaXMuaXNSYW5nZSAmJiBpbmRleCA9PT0gMCkgdGhpcy5kcmFmdHNbMV0ucHJlc2VudCA9IGZhbHNlO1xuICAgIGRlbGV0ZSB0aGlzLmRyYWZ0c1tpbmRleF0udW5zdXBwb3J0ZWRFcG9jaERheTtcbiAgICB0aGlzLmRyYWZ0c1tpbmRleF0uZGF0ZSA9IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkYXkpO1xuICAgIHRoaXMuZHJhZnRzW2luZGV4XS5wcmVzZW50ID0gdHJ1ZTtcbiAgICB0aGlzLm9yZGVyRHJhZnRzKCk7XG4gICAgdGhpcy5yZW5kZXJSb3dzKCk7XG4gICAgdGhpcy5maW5pc2goKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnByZXNlbnRhdGlvbiA9PT0gXCJ0cmFuc2llbnRcIiAmJlxuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdID09PSBcImRhdGVcIiAmJlxuICAgICAgdGhpcy52aWV3TW9kZSA9PT0gXCJjYWxlbmRhclwiXG4gICAgKVxuICAgICAgdGhpcy5zdWJtaXQoXCJhdXRvLXN1Ym1pdFwiKTtcbiAgfVxuICBrZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGRheTogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGRlbHRhID0gMDtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93TGVmdFwiKSBkZWx0YSA9IC0xO1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiQXJyb3dSaWdodFwiKSBkZWx0YSA9IDE7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd1VwXCIpIGRlbHRhID0gLTc7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd0Rvd25cIikgZGVsdGEgPSA3O1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiUGFnZVVwXCIpXG4gICAgICBkZWx0YSA9IC03ICogKGV2ZW50LnNoaWZ0S2V5ID8gdGhpcy52aXNpYmxlQ291bnQgOiAxKTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIlBhZ2VEb3duXCIpXG4gICAgICBkZWx0YSA9IDcgKiAoZXZlbnQuc2hpZnRLZXkgPyB0aGlzLnZpc2libGVDb3VudCA6IDEpO1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiSG9tZVwiKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zY3JvbGxUb0Vwb2NoRGF5KHRoaXMudG9kYXksIHsgZm9jdXM6IHRydWUgfSk7XG4gICAgfVxuICAgIGlmIChkZWx0YSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGRheSArIGRlbHRhO1xuICAgICAgaWYgKHRhcmdldCA+PSB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5ICYmIHRhcmdldCA8PSB0aGlzLmxhc3RTdXBwb3J0ZWREYXkpXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9FcG9jaERheSh0YXJnZXQsIHsgZm9jdXM6IHRydWUgfSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcG9zaXRpb24oXG4gICAgZGF5OiBudW1iZXIsXG4gICAgcHJlc2V0ID0gZmFsc2UsXG4gICAgb3B0aW9uczogV2tseUp1bXBPcHRpb25zID0ge30sXG4gICk6IHZvaWQge1xuICAgIGRheSA9IE1hdGgubWF4KFxuICAgICAgdGhpcy5maXJzdFN1cHBvcnRlZERheSxcbiAgICAgIE1hdGgubWluKHRoaXMubGFzdFN1cHBvcnRlZERheSwgZGF5KSxcbiAgICApO1xuICAgIHRoaXMuYW5jaG9yV2VlayA9IGFic29sdXRlV2Vla09mKGRheSwgdGhpcy5lZmZlY3RpdmVPZmZzZXQpO1xuICAgIGNvbnN0IHZpZXdwb3J0UHJlc2V0ID0gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZpZXdwb3J0UHJlc2V0XTtcbiAgICB0aGlzLmNsaXBNb250aCA9IHByZXNldCAmJiB2aWV3cG9ydFByZXNldC5raW5kID09PSBcImZ1bGwtbW9udGhcIjtcbiAgICBpZiAocHJlc2V0ICYmIHZpZXdwb3J0UHJlc2V0LmtpbmQgIT09IFwid2Vla3NcIikge1xuICAgICAgY29uc3QgZCA9IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkYXkpO1xuICAgICAgdGhpcy5pbml0aWFsTW9udGggPSBkLnllYXIgKyBcIi9cIiArIGQubW9udGhDb2RlO1xuICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gY2FsZW5kYXJNb250aEJvdW5kcyh0aGlzLmFkYXB0ZXIsIGRheSk7XG4gICAgICB0aGlzLmZpcnN0V2VlayA9IGFic29sdXRlV2Vla09mKHN0YXJ0LCB0aGlzLmVmZmVjdGl2ZU9mZnNldCk7XG4gICAgICB0aGlzLnZpc2libGVDb3VudCA9XG4gICAgICAgIGFic29sdXRlV2Vla09mKGVuZCwgdGhpcy5lZmZlY3RpdmVPZmZzZXQpIC0gdGhpcy5maXJzdFdlZWsgKyAxO1xuICAgICAgaWYgKFxuICAgICAgICB2aWV3cG9ydFByZXNldC5raW5kID09PSBcImZ1bGwtbW9udGgtYW5kLWFyb3VuZFwiICYmXG4gICAgICAgICF0aGlzLmNvbmZpZ0Vycm9ycy5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICBjb25zdCBiZWZvcmUgPSB2aWV3cG9ydFByZXNldC5leHRyYVdlZWtzQmVmb3JlIHx8IDAsXG4gICAgICAgICAgYWZ0ZXIgPSB2aWV3cG9ydFByZXNldC5leHRyYVdlZWtzQWZ0ZXIgfHwgMDtcbiAgICAgICAgdGhpcy5maXJzdFdlZWsgLT0gYmVmb3JlO1xuICAgICAgICB0aGlzLnZpc2libGVDb3VudCArPSBiZWZvcmUgKyBhZnRlcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZpZXdwb3J0UHJlc2V0LmtpbmQgPT09IFwid2Vla3NcIilcbiAgICAgICAgdGhpcy52aXNpYmxlQ291bnQgPSB0aGlzLmNvbmZpZ0Vycm9ycy5sZW5ndGhcbiAgICAgICAgICA/IDZcbiAgICAgICAgICA6IHZpZXdwb3J0UHJlc2V0LnZpc2libGVXZWVrQ291bnQ7XG4gICAgICB0aGlzLmZpcnN0V2VlayA9XG4gICAgICAgIHRoaXMuYW5jaG9yV2VlayAtXG4gICAgICAgIChvcHRpb25zLmFsaWduID09PSBcInN0YXJ0XCJcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IG9wdGlvbnMuYWxpZ24gPT09IFwiZW5kXCJcbiAgICAgICAgICAgID8gdGhpcy52aXNpYmxlQ291bnQgLSAxXG4gICAgICAgICAgICA6IE1hdGguZmxvb3IodGhpcy52aXNpYmxlQ291bnQgLyAyKSk7XG4gICAgfVxuICAgIHRoaXMuZmlyc3RXZWVrID0gdGhpcy5jbGFtcEZpcnN0V2Vlayh0aGlzLmZpcnN0V2Vlayk7XG4gICAgdGhpcy5iYXNlV2VlayA9IHRoaXMuZmlyc3RXZWVrIC0gMTAwMDtcbiAgICB0aGlzLnJlbmRlclJvd3MoKTtcbiAgICAvLyBBcHBseSB0aGUgbmV3IHJ1bndheSBiZWZvcmUgd3JpdGluZyBzY3JvbGxUb3Agb3IgbG9jYXRpbmcgYSBmb2N1cyB0YXJnZXQuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICB9XG4gIHByaXZhdGUgcmVzZXRTY3JvbGwoKTogdm9pZCB7XG4gICAgLy8gUm91bmQgd2VlayBib3VuZGFyaWVzIHRvIGF2b2lkIHNjcm9sbFRvcCB0cnVuY2F0aW9uIHVuZGVyIENTUyB6b29tLlxuICAgIGlmICh0aGlzLnNjcm9sbGVyKVxuICAgICAgdGhpcy5zY3JvbGxlci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IE1hdGgucm91bmQoMTAwMCAqIHRoaXMucm93SGVpZ2h0KTtcbiAgfVxuICBzY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLnNuYXBQZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNjaGVkdWxlU25hcCgpO1xuICAgIC8vIFF1YW50aXplIGRpc3BsYWNlbWVudCBhcm91bmQgdGhlIHJlc2V0IHBvaW50LCBlcXVhbGx5IGluIGJvdGggZGlyZWN0aW9ucy5cbiAgICBjb25zdCByZWxhdGl2ZVJvd3MgPSBlbGVtZW50LnNjcm9sbFRvcCAvIHRoaXMucm93SGVpZ2h0IC0gMTAwMDtcbiAgICBjb25zdCBpbmRleCA9XG4gICAgICAxMDAwICsgTWF0aC5zaWduKHJlbGF0aXZlUm93cykgKiBNYXRoLnJvdW5kKE1hdGguYWJzKHJlbGF0aXZlUm93cykpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEZpcnN0ID0gdGhpcy5iYXNlV2VlayArIGluZGV4O1xuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5jbGFtcEZpcnN0V2VlayhyZXF1ZXN0ZWRGaXJzdCk7XG4gICAgaWYgKHJlcXVlc3RlZEZpcnN0ICE9PSBmaXJzdCkge1xuICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBNYXRoLnJvdW5kKChmaXJzdCAtIHRoaXMuYmFzZVdlZWspICogdGhpcy5yb3dIZWlnaHQpO1xuICAgIH1cbiAgICBpZiAoZmlyc3QgPT09IHRoaXMuZmlyc3RXZWVrKSByZXR1cm47XG4gICAgdGhpcy5jbGlwTW9udGggPSBmYWxzZTtcbiAgICB0aGlzLmZpcnN0V2VlayA9IGZpcnN0O1xuICAgIHRoaXMuYW5jaG9yV2VlayA9IGZpcnN0ICsgTWF0aC5mbG9vcih0aGlzLnZpc2libGVDb3VudCAvIDIpO1xuICAgIGlmIChpbmRleCA8IDEwMCB8fCBpbmRleCA+IDE5MDApIHtcbiAgICAgIC8vIFByZXNlcnZlIHNpZ25lZCBkaXNwbGFjZW1lbnQgZnJvbSB0aGlzIHdlZWs7IG1vZHVsbyB0dXJucyBmcmFjdGlvbmFsXG4gICAgICAvLyByb3VuZGluZyBqdXN0IGJlbG93IGEgYm91bmRhcnkgaW50byBhbG1vc3QgYSBmdWxsIHJvdyBhZnRlciByZWJhc2luZy5cbiAgICAgIGNvbnN0IG9mZnNldCA9XG4gICAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wIC0gKGZpcnN0IC0gdGhpcy5iYXNlV2VlaykgKiB0aGlzLnJvd0hlaWdodDtcbiAgICAgIHRoaXMuYmFzZVdlZWsgPSBmaXJzdCAtIDEwMDA7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IE1hdGgucm91bmQoMTAwMCAqIHRoaXMucm93SGVpZ2h0ICsgb2Zmc2V0KTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJSb3dzKCk7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZVNuYXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsRW5kVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVyKTtcbiAgICB0aGlzLnNjcm9sbEVuZFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNuYXBXZWVrKCksIDIwMCk7XG4gIH1cbiAgc25hcFdlZWsoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsRW5kVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVyKTtcbiAgICB0aGlzLnNjcm9sbEVuZFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIGlmICghdGhpcy5zbmFwUGVuZGluZyB8fCAhdGhpcy5zY3JvbGxlcikgcmV0dXJuO1xuICAgIHRoaXMuc25hcFBlbmRpbmcgPSBmYWxzZTtcbiAgICAvLyBBbGlnbiB0aGUgY3VycmVudCB2aXJ0dWFsIHdlZWsgd2l0aG91dCByZWJ1aWxkaW5nIG9yIHJlYmFzaW5nIGl0cyByb3dzLlxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNjcm9sbGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gTWF0aC5yb3VuZChcbiAgICAgICh0aGlzLmZpcnN0V2VlayAtIHRoaXMuYmFzZVdlZWspICogdGhpcy5yb3dIZWlnaHQsXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudC5zY3JvbGxUb3AgIT09IHRhcmdldCkgZWxlbWVudC5zY3JvbGxUb3AgPSB0YXJnZXQ7XG4gIH1cbiAgcHJpdmF0ZSBzaG93Rmlyc3RXZWVrKHdlZWs6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5jbGFtcEZpcnN0V2Vlayh3ZWVrKTtcbiAgICBpZiAoZmlyc3QgPT09IHRoaXMuZmlyc3RXZWVrKSByZXR1cm47XG4gICAgdGhpcy5jbGlwTW9udGggPSBmYWxzZTtcbiAgICB0aGlzLmZpcnN0V2VlayA9IGZpcnN0O1xuICAgIHRoaXMuYW5jaG9yV2VlayA9IGZpcnN0ICsgTWF0aC5mbG9vcih0aGlzLnZpc2libGVDb3VudCAvIDIpO1xuICAgIHRoaXMuYmFzZVdlZWsgPSBmaXJzdCAtIDEwMDA7XG4gICAgdGhpcy5yZW5kZXJSb3dzKCk7XG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICB9XG4gIGNhbk1vdmVXZWVrKGRlbHRhOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbGFtcEZpcnN0V2Vlayh0aGlzLmZpcnN0V2VlayArIGRlbHRhKSAhPT0gdGhpcy5maXJzdFdlZWs7XG4gIH1cbiAgbW92ZVdlZWsoZGVsdGE6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSlcbiAgICAgIHRoaXMuc2hvd0ZpcnN0V2Vlayh0aGlzLmZpcnN0V2VlayArIGRlbHRhKTtcbiAgfVxuICBwcml2YXRlIHJlbmRlclJvd3MoKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgdmlydHVhbCBzY3JvbGwgb2Zmc2V0IGhlcmU7IHJvdyBkYXRhIGlzIHNoYXJlZCBhY3Jvc3MgQW5ndWxhciB2ZXJzaW9ucy5cbiAgICBjb25zdCBvdmVyc2NhbiA9IE1hdGgubWF4KFxuICAgICAgMCxcbiAgICAgIE1hdGgubWluKDUwLCB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuT3ZlcnNjYW5XZWVrc10gfHwgMCksXG4gICAgKTtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuZmlyc3RXZWVrIC0gb3ZlcnNjYW47XG4gICAgdGhpcy5wYWRkaW5nVG9wID0gKHN0YXJ0IC0gdGhpcy5iYXNlV2VlaykgKiB0aGlzLnJvd0hlaWdodDtcbiAgICB0aGlzLnJvd3MgPSBjcmVhdGVXZWVrUm93cyh7XG4gICAgICBnZW5lcmF0b3I6IHRoaXMuZ2VuZXJhdG9yLFxuICAgICAgYWRhcHRlcjogdGhpcy5hZGFwdGVyLFxuICAgICAgc3RhcnRXZWVrOiBzdGFydCxcbiAgICAgIGNvdW50OiB0aGlzLnZpc2libGVDb3VudCArIDIgKiBvdmVyc2NhbixcbiAgICAgIGZpcnN0VmlzaWJsZVdlZWs6IHRoaXMuZmlyc3RXZWVrLFxuICAgICAgZmlyc3RTdXBwb3J0ZWREYXk6IHRoaXMuZmlyc3RTdXBwb3J0ZWREYXksXG4gICAgICBsYXN0U3VwcG9ydGVkRGF5OiB0aGlzLmxhc3RTdXBwb3J0ZWREYXksXG4gICAgICBjbGlwTW9udGg6IHRoaXMuY2xpcE1vbnRoLFxuICAgICAgaW5pdGlhbE1vbnRoOiB0aGlzLmluaXRpYWxNb250aCxcbiAgICAgIHdlZWtMYWJlbE1vZGU6IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxNb2RlXSxcbiAgICAgIHdlZWtMYWJlbEZvcm1hdHRlcjpcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbEZvcm1hdHRlcl0gfHwgbnVsbCxcbiAgICAgIGlzRGF5RGlzYWJsZWQ6IChkYXkpID0+IHRoaXMuZGF5RGlzYWJsZWQoZGF5KSxcbiAgICB9KTtcbiAgICB0aGlzW1drbHlQaWNrZXJPdXRwdXRzUHJvcGVydHlLZXlzLlZpZXdwb3J0Q2hhbmdlXS5lbWl0KHtcbiAgICAgIGZpcnN0VmlzaWJsZUFic29sdXRlV2VlazogdGhpcy5maXJzdFdlZWssXG4gICAgICBsYXN0VmlzaWJsZUFic29sdXRlV2VlazogdGhpcy5maXJzdFdlZWsgKyB0aGlzLnZpc2libGVDb3VudCAtIDEsXG4gICAgICBhbmNob3JBYnNvbHV0ZVdlZWs6IHRoaXMuYW5jaG9yV2VlayxcbiAgICB9KTtcbiAgfVxuICAvLyBSZXRhaW4gZGF5IERPTSBub2RlcyBhbmQga2V5Ym9hcmQgZm9jdXMgd2hlbiByb3cgbWV0YWRhdGEgaXMgcmVnZW5lcmF0ZWQuXG4gIHRyYWNrQ2VsbChfaTogbnVtYmVyLCBjZWxsOiB7IGVwb2NoRGF5OiBudW1iZXIgfSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGNlbGwuZXBvY2hEYXk7XG4gIH1cbiAgdHJhY2tSb3coX2k6IG51bWJlciwgcm93OiBSb3cpOiBudW1iZXIge1xuICAgIHJldHVybiByb3cud2Vlay5hYnNvbHV0ZVdlZWs7XG4gIH1cbiAgc2Nyb2xsVG9FcG9jaERheShkYXk6IG51bWJlciwgb3B0aW9uczogV2tseUp1bXBPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBpbnRlZ2VyKGRheSk7XG4gICAgdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKGRheSk7XG4gICAgZGF5ID0gTWF0aC5tYXgoXG4gICAgICB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5LFxuICAgICAgTWF0aC5taW4odGhpcy5sYXN0U3VwcG9ydGVkRGF5LCBkYXkpLFxuICAgICk7XG4gICAgLy8gcG9zaXRpb24gcmVuZGVycyBzeW5jaHJvbm91c2x5OyBwdWJsaXNoIHRoZSB0YWIgc3RvcCBiZWZvcmUgdGhhdCByZW5kZXIuXG4gICAgaWYgKG9wdGlvbnMuZm9jdXMpIHRoaXMuZm9jdXNlZCA9IGRheTtcbiAgICB0aGlzLnBvc2l0aW9uKGRheSwgZmFsc2UsIG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zLnNlbGVjdCkgdGhpcy5zZWxlY3QoZGF5KTtcbiAgICBpZiAob3B0aW9ucy5mb2N1cykgdGhpcy5mb2N1c0RheSgpO1xuICB9XG4gIHNjcm9sbFRvQWJzb2x1dGVXZWVrKHdlZWs6IG51bWJlciwgb3B0aW9uczogV2tseUp1bXBPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICAvLyBBIGJvdW5kYXJ5IHdlZWsgY2FuIHN0YXJ0IGJlZm9yZSB0aGUgYWRhcHRlcidzIGZpcnN0IHN1cHBvcnRlZCBkYXkuXG4gICAgY29uc3QgZmlyc3QgPSBmaXJzdEVwb2NoRGF5T2Yod2VlaywgdGhpcy5lZmZlY3RpdmVPZmZzZXQpO1xuICAgIHRoaXMuc2Nyb2xsVG9FcG9jaERheShcbiAgICAgIHdlZWsgPT09IHRoaXMuZmlyc3RTdXBwb3J0ZWRXZWVrXG4gICAgICAgID8gTWF0aC5tYXgoZmlyc3QsIHRoaXMuZmlyc3RTdXBwb3J0ZWREYXkpXG4gICAgICAgIDogZmlyc3QsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH1cbiAgc2Nyb2xsVG9DYWxlbmRhckRhdGUoXG4gICAgZGF0ZTogV2tseUNhbGVuZGFyRGF0ZSxcbiAgICBvcHRpb25zOiBXa2x5SnVtcE9wdGlvbnMgPSB7fSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxUb0Vwb2NoRGF5KHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheShkYXRlKSwgb3B0aW9ucyk7XG4gIH1cbiAgc2Nyb2xsVG9WYWx1ZSh2YWx1ZTogc3RyaW5nLCBvcHRpb25zOiBXa2x5SnVtcE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcG9jaERheShkZWNvZGVJc28odmFsdWUpLmVwb2NoRGF5LCBvcHRpb25zKTtcbiAgfVxuICBmb2N1c0RheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYnJvd3NlcikgcmV0dXJuO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIGNvbnN0IGRheSA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICdbZGF0YS1kYXk9XCInICsgdGhpcy5mb2N1c2VkICsgJ1wiXScsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcImJ1dHRvbjpub3QoOmRpc2FibGVkKSxpbnB1dDpub3QoOmRpc2FibGVkKVwiLFxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIChkYXkgfHwgZmFsbGJhY2spPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==