@dereekb/dbx-form 10.2.0 → 11.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 (144) hide show
  1. package/calendar/lib/calendar.schedule.selection.cell.component.d.ts +0 -1
  2. package/calendar/lib/calendar.schedule.selection.component.d.ts +1 -2
  3. package/calendar/lib/calendar.schedule.selection.days.component.d.ts +1 -2
  4. package/calendar/lib/calendar.schedule.selection.dialog.button.component.d.ts +1 -2
  5. package/calendar/lib/calendar.schedule.selection.popover.button.component.d.ts +1 -2
  6. package/calendar/lib/calendar.schedule.selection.range.component.d.ts +2 -3
  7. package/calendar/lib/calendar.schedule.selection.store.provide.d.ts +1 -2
  8. package/calendar/lib/calendar.schedule.selection.toggle.button.component.d.ts +0 -1
  9. package/calendar/lib/field/schedule/calendar.schedule.field.component.d.ts +2 -3
  10. package/esm2022/calendar/lib/calendar.module.mjs +6 -6
  11. package/esm2022/calendar/lib/calendar.schedule.selection.cell.component.mjs +10 -13
  12. package/esm2022/calendar/lib/calendar.schedule.selection.component.mjs +49 -52
  13. package/esm2022/calendar/lib/calendar.schedule.selection.days.component.mjs +23 -27
  14. package/esm2022/calendar/lib/calendar.schedule.selection.days.form.component.mjs +5 -8
  15. package/esm2022/calendar/lib/calendar.schedule.selection.dialog.button.component.mjs +12 -13
  16. package/esm2022/calendar/lib/calendar.schedule.selection.dialog.component.mjs +4 -4
  17. package/esm2022/calendar/lib/calendar.schedule.selection.popover.button.component.mjs +22 -24
  18. package/esm2022/calendar/lib/calendar.schedule.selection.popover.component.mjs +4 -4
  19. package/esm2022/calendar/lib/calendar.schedule.selection.popover.content.component.mjs +4 -4
  20. package/esm2022/calendar/lib/calendar.schedule.selection.range.component.mjs +81 -86
  21. package/esm2022/calendar/lib/calendar.schedule.selection.store.mjs +123 -123
  22. package/esm2022/calendar/lib/calendar.schedule.selection.store.provide.mjs +8 -13
  23. package/esm2022/calendar/lib/calendar.schedule.selection.toggle.button.component.mjs +39 -42
  24. package/esm2022/calendar/lib/field/schedule/calendar.schedule.field.component.mjs +24 -31
  25. package/esm2022/calendar/lib/field/schedule/calendar.schedule.module.mjs +6 -6
  26. package/esm2022/lib/form/action/form.action.directive.mjs +29 -20
  27. package/esm2022/lib/form/action/form.action.module.mjs +4 -4
  28. package/esm2022/lib/form/action/transition/form.action.transition.module.mjs +4 -4
  29. package/esm2022/lib/form/action/transition/form.action.transition.safety.directive.mjs +7 -18
  30. package/esm2022/lib/form/form.module.mjs +4 -4
  31. package/esm2022/lib/form/io/form.changes.directive.mjs +7 -13
  32. package/esm2022/lib/form/io/form.input.directive.mjs +7 -13
  33. package/esm2022/lib/form/io/form.io.module.mjs +4 -4
  34. package/esm2022/lib/form/io/form.loading.directive.mjs +9 -15
  35. package/esm2022/lib/form.module.mjs +4 -4
  36. package/esm2022/lib/formly/field/checklist/checklist.field.mjs +4 -4
  37. package/esm2022/lib/formly/field/checklist/checklist.item.field.component.mjs +23 -31
  38. package/esm2022/lib/formly/field/checklist/checklist.item.field.content.default.component.mjs +5 -4
  39. package/esm2022/lib/formly/field/checklist/checklist.item.field.module.mjs +6 -6
  40. package/esm2022/lib/formly/field/component/component.field.component.mjs +4 -4
  41. package/esm2022/lib/formly/field/component/component.field.module.mjs +6 -6
  42. package/esm2022/lib/formly/field/form.field.module.mjs +4 -4
  43. package/esm2022/lib/formly/field/selection/list/list.field.component.mjs +33 -36
  44. package/esm2022/lib/formly/field/selection/list/list.field.module.mjs +6 -6
  45. package/esm2022/lib/formly/field/selection/pickable/pickable.chip.field.component.mjs +3 -3
  46. package/esm2022/lib/formly/field/selection/pickable/pickable.field.directive.mjs +72 -74
  47. package/esm2022/lib/formly/field/selection/pickable/pickable.field.module.mjs +6 -6
  48. package/esm2022/lib/formly/field/selection/pickable/pickable.list.field.component.mjs +21 -24
  49. package/esm2022/lib/formly/field/selection/searchable/searchable.chip.field.component.mjs +6 -9
  50. package/esm2022/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.mjs +27 -34
  51. package/esm2022/lib/formly/field/selection/searchable/searchable.field.directive.mjs +32 -30
  52. package/esm2022/lib/formly/field/selection/searchable/searchable.field.module.mjs +6 -6
  53. package/esm2022/lib/formly/field/selection/searchable/searchable.text.field.component.mjs +8 -11
  54. package/esm2022/lib/formly/field/selection/selection.module.mjs +4 -4
  55. package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.component.mjs +143 -145
  56. package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.module.mjs +6 -6
  57. package/esm2022/lib/formly/field/texteditor/texteditor.field.component.mjs +19 -24
  58. package/esm2022/lib/formly/field/texteditor/texteditor.field.module.mjs +6 -6
  59. package/esm2022/lib/formly/field/value/array/array.field.component.mjs +22 -25
  60. package/esm2022/lib/formly/field/value/array/array.field.module.mjs +6 -6
  61. package/esm2022/lib/formly/field/value/boolean/boolean.field.module.mjs +4 -4
  62. package/esm2022/lib/formly/field/value/date/date.field.module.mjs +6 -6
  63. package/esm2022/lib/formly/field/value/date/datetime.field.component.mjs +233 -236
  64. package/esm2022/lib/formly/field/value/date/datetime.field.service.mjs +7 -15
  65. package/esm2022/lib/formly/field/value/date/fixeddaterange.field.component.mjs +97 -101
  66. package/esm2022/lib/formly/field/value/number/number.field.module.mjs +4 -4
  67. package/esm2022/lib/formly/field/value/phone/phone.field.component.mjs +15 -18
  68. package/esm2022/lib/formly/field/value/phone/phone.field.module.mjs +6 -6
  69. package/esm2022/lib/formly/field/value/text/text.field.module.mjs +4 -4
  70. package/esm2022/lib/formly/field/value/value.module.mjs +4 -4
  71. package/esm2022/lib/formly/field/wrapper/autotouch.wrapper.component.mjs +4 -4
  72. package/esm2022/lib/formly/field/wrapper/expand.wrapper.component.mjs +39 -0
  73. package/esm2022/lib/formly/field/wrapper/expand.wrapper.delegate.mjs +55 -0
  74. package/esm2022/lib/formly/field/wrapper/flex.wrapper.component.mjs +4 -4
  75. package/esm2022/lib/formly/field/wrapper/form.wrapper.module.mjs +10 -10
  76. package/esm2022/lib/formly/field/wrapper/index.mjs +3 -3
  77. package/esm2022/lib/formly/field/wrapper/info.wrapper.component.mjs +4 -4
  78. package/esm2022/lib/formly/field/wrapper/section.wrapper.component.mjs +4 -4
  79. package/esm2022/lib/formly/field/wrapper/style.wrapper.component.mjs +8 -11
  80. package/esm2022/lib/formly/field/wrapper/subsection.wrapper.component.mjs +4 -4
  81. package/esm2022/lib/formly/field/wrapper/toggle.wrapper.component.mjs +15 -18
  82. package/esm2022/lib/formly/field/wrapper/working.wrapper.component.mjs +6 -9
  83. package/esm2022/lib/formly/field/wrapper/wrapper.key.mjs +2 -3
  84. package/esm2022/lib/formly/field/wrapper/wrapper.mjs +3 -3
  85. package/esm2022/lib/formly/form/form.form.module.mjs +4 -4
  86. package/esm2022/lib/formly/form/search.form.component.mjs +6 -9
  87. package/esm2022/lib/formly/formly.context.directive.mjs +5 -8
  88. package/esm2022/lib/formly/formly.context.mjs +10 -12
  89. package/esm2022/lib/formly/formly.directive.mjs +16 -25
  90. package/esm2022/lib/formly/formly.form.component.mjs +73 -77
  91. package/esm2022/lib/formly/formly.module.mjs +6 -6
  92. package/esm2022/lib/layout/form.layout.module.mjs +4 -4
  93. package/esm2022/lib/layout/form.spacer.component.mjs +4 -4
  94. package/esm2022/mapbox/lib/field/latlng/latlng.field.component.mjs +48 -57
  95. package/esm2022/mapbox/lib/field/latlng/latlng.field.marker.component.mjs +17 -20
  96. package/esm2022/mapbox/lib/field/latlng/latlng.module.mjs +6 -6
  97. package/esm2022/mapbox/lib/field/zoom/zoom.field.component.mjs +26 -32
  98. package/esm2022/mapbox/lib/field/zoom/zoom.module.mjs +6 -6
  99. package/esm2022/mapbox/lib/mapbox.module.mjs +4 -4
  100. package/fesm2022/dereekb-dbx-form-calendar.mjs +383 -407
  101. package/fesm2022/dereekb-dbx-form-calendar.mjs.map +1 -1
  102. package/fesm2022/dereekb-dbx-form-mapbox.mjs +96 -111
  103. package/fesm2022/dereekb-dbx-form-mapbox.mjs.map +1 -1
  104. package/fesm2022/dereekb-dbx-form.mjs +1071 -1163
  105. package/fesm2022/dereekb-dbx-form.mjs.map +1 -1
  106. package/lib/form/action/form.action.directive.d.ts +3 -3
  107. package/lib/form/action/transition/form.action.transition.safety.directive.d.ts +3 -7
  108. package/lib/form/io/form.changes.directive.d.ts +2 -3
  109. package/lib/form/io/form.input.directive.d.ts +3 -4
  110. package/lib/form/io/form.loading.directive.d.ts +3 -4
  111. package/lib/formly/field/checklist/checklist.field.d.ts +0 -1
  112. package/lib/formly/field/checklist/checklist.item.field.component.d.ts +4 -6
  113. package/lib/formly/field/selection/pickable/pickable.list.field.component.d.ts +0 -1
  114. package/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.d.ts +1 -2
  115. package/lib/formly/field/selection/searchable/searchable.field.directive.d.ts +0 -1
  116. package/lib/formly/field/selection/sourceselect/sourceselect.field.component.d.ts +2 -2
  117. package/lib/formly/field/texteditor/texteditor.field.component.d.ts +2 -4
  118. package/lib/formly/field/value/date/datetime.field.component.d.ts +1 -3
  119. package/lib/formly/field/value/date/datetime.field.service.d.ts +1 -4
  120. package/lib/formly/field/value/date/fixeddaterange.field.component.d.ts +2 -6
  121. package/lib/formly/field/wrapper/{expandable.wrapper.component.d.ts → expand.wrapper.component.d.ts} +4 -4
  122. package/lib/formly/field/wrapper/{expandable.wrapper.delegate.d.ts → expand.wrapper.delegate.d.ts} +7 -7
  123. package/lib/formly/field/wrapper/form.wrapper.module.d.ts +1 -1
  124. package/lib/formly/field/wrapper/index.d.ts +2 -2
  125. package/lib/formly/field/wrapper/toggle.wrapper.component.d.ts +4 -4
  126. package/lib/formly/field/wrapper/wrapper.d.ts +1 -1
  127. package/lib/formly/field/wrapper/wrapper.key.d.ts +1 -1
  128. package/lib/formly/formly.directive.d.ts +0 -1
  129. package/lib/formly/formly.form.component.d.ts +2 -3
  130. package/mapbox/esm2022/lib/field/latlng/latlng.field.component.mjs +48 -57
  131. package/mapbox/esm2022/lib/field/latlng/latlng.field.marker.component.mjs +17 -20
  132. package/mapbox/esm2022/lib/field/latlng/latlng.module.mjs +6 -6
  133. package/mapbox/esm2022/lib/field/zoom/zoom.field.component.mjs +26 -32
  134. package/mapbox/esm2022/lib/field/zoom/zoom.module.mjs +6 -6
  135. package/mapbox/esm2022/lib/mapbox.module.mjs +4 -4
  136. package/mapbox/fesm2022/dereekb-dbx-form-mapbox.mjs +96 -111
  137. package/mapbox/fesm2022/dereekb-dbx-form-mapbox.mjs.map +1 -1
  138. package/mapbox/lib/field/latlng/latlng.field.component.d.ts +4 -6
  139. package/mapbox/lib/field/latlng/latlng.field.marker.component.d.ts +1 -2
  140. package/mapbox/lib/field/zoom/zoom.field.component.d.ts +2 -3
  141. package/mapbox/package.json +1 -1
  142. package/package.json +1 -1
  143. package/esm2022/lib/formly/field/wrapper/expandable.wrapper.component.mjs +0 -39
  144. package/esm2022/lib/formly/field/wrapper/expandable.wrapper.delegate.mjs +0 -58
@@ -1,7 +1,7 @@
1
1
  import { asArray, filterMaybeValues, isISO8601DayStringStart, mapIdentityFunction } from '@dereekb/util';
2
2
  import { dateFromLogicalDate, DateTimeMinuteInstance, guessCurrentTimezone, readableTimeStringToDate, toLocalReadableTimeString, utcDayForDate, safeToJsDate, findMinDate, findMaxDate, isSameDateHoursAndMinutes, getTimezoneAbbreviation, isSameDateDay, dateTimezoneUtcNormal, toJsDayDate, isSameDate, dateTimeMinuteWholeDayDecisionFunction } from '@dereekb/date';
3
3
  import { switchMap, shareReplay, map, startWith, tap, first, distinctUntilChanged, debounceTime, throttleTime, BehaviorSubject, combineLatest, Subject, merge, interval, of, combineLatestWith, filter, skip } from 'rxjs';
4
- import { ChangeDetectorRef, Component } from '@angular/core';
4
+ import { ChangeDetectorRef, Component, inject } from '@angular/core';
5
5
  import { FormControl, Validators } from '@angular/forms';
6
6
  import { FieldType } from '@ngx-formly/material';
7
7
  import { addMinutes, startOfDay, addDays } from 'date-fns';
@@ -12,19 +12,18 @@ import { DbxDateTimeValueMode, dbxDateTimeInputValueParseFactory, dbxDateTimeIsS
12
12
  import { streamValueFromControl } from '../../../../form/form.angular.util';
13
13
  import { toggleDisableFormControl } from '../../../../form/form';
14
14
  import * as i0 from "@angular/core";
15
- import * as i1 from "./datetime.field.service";
16
- import * as i2 from "@angular/common";
17
- import * as i3 from "@angular/forms";
18
- import * as i4 from "@angular/material/input";
19
- import * as i5 from "@angular/material/form-field";
20
- import * as i6 from "@angular/material/divider";
21
- import * as i7 from "@angular/material/button";
22
- import * as i8 from "@angular/material/datepicker";
23
- import * as i9 from "@angular/material/menu";
24
- import * as i10 from "@angular/material/icon";
25
- import * as i11 from "@ngbracket/ngx-layout/flex";
26
- import * as i12 from "@ngbracket/ngx-layout/extended";
27
- import * as i13 from "@dereekb/dbx-core";
15
+ import * as i1 from "@angular/common";
16
+ import * as i2 from "@angular/forms";
17
+ import * as i3 from "@angular/material/input";
18
+ import * as i4 from "@angular/material/form-field";
19
+ import * as i5 from "@angular/material/divider";
20
+ import * as i6 from "@angular/material/button";
21
+ import * as i7 from "@angular/material/datepicker";
22
+ import * as i8 from "@angular/material/menu";
23
+ import * as i9 from "@angular/material/icon";
24
+ import * as i10 from "@ngbracket/ngx-layout/flex";
25
+ import * as i11 from "@ngbracket/ngx-layout/extended";
26
+ import * as i12 from "@dereekb/dbx-core";
28
27
  export var DbxDateTimeFieldTimeMode;
29
28
  (function (DbxDateTimeFieldTimeMode) {
30
29
  /**
@@ -67,6 +66,81 @@ export const DBX_DATE_TIME_FIELD_DATE_NOT_IN_SCHEDULE_ERROR = 'dateTimeFieldDate
67
66
  */
68
67
  export const DBX_DATE_TIME_FIELD_TIME_NOT_IN_RANGE_ERROR = 'dateTimeFieldTimeNotInRange';
69
68
  export class DbxDateTimeFieldComponent extends FieldType {
69
+ cdRef = inject(ChangeDetectorRef);
70
+ dbxDateTimeFieldConfigService = inject(DbxDateTimeFieldMenuPresetsService);
71
+ _sub = new SubscriptionObject();
72
+ _valueSub = new SubscriptionObject();
73
+ _autoFillDateSync = new SubscriptionObject();
74
+ _config = new BehaviorSubject(undefined);
75
+ latestConfig$ = this._config.pipe(switchMapMaybeDefault(), distinctUntilChanged(), shareReplay(1));
76
+ _syncConfigObs = new BehaviorSubject(undefined);
77
+ _defaultTimezone = new BehaviorSubject(undefined);
78
+ _timeDate = new BehaviorSubject(undefined);
79
+ _presets = new BehaviorSubject(of([]));
80
+ _fullDayInputCtrl;
81
+ _fullDayControlObs = new BehaviorSubject(undefined);
82
+ fullDayControl$ = this._fullDayControlObs.pipe(filterMaybe());
83
+ _offset = new BehaviorSubject(0);
84
+ _formControlObs = new BehaviorSubject(undefined);
85
+ formControl$ = this._formControlObs.pipe(filterMaybe());
86
+ _cleared = new Subject();
87
+ _updateTime = new Subject();
88
+ _resyncTimeInputSub = new SubscriptionObject();
89
+ _resyncTimeInput = new Subject();
90
+ timeErrorStateMatcher = {
91
+ isErrorState: (control, form) => {
92
+ if (control) {
93
+ return (control.invalid && (control.dirty || control.touched)) || this.errorStateMatcher.isErrorState(this.formControl, form);
94
+ }
95
+ else {
96
+ return false;
97
+ }
98
+ }
99
+ };
100
+ resyncTimeInput$ = this._resyncTimeInput.pipe(debounceTime(200), shareReplay(1));
101
+ _configUpdateTimeSync = new SubscriptionObject(this.latestConfig$.pipe(skip(1)).subscribe((x) => {
102
+ this._updateTime.next();
103
+ }));
104
+ timezone$ = this._defaultTimezone.pipe(switchMapMaybeDefault(), distinctUntilChanged()).pipe(map((defaultTimezone) => {
105
+ return defaultTimezone ?? guessCurrentTimezone();
106
+ }), distinctUntilChanged(), shareReplay(1));
107
+ timezoneInstance$ = this.timezone$.pipe(map((timezone) => (timezone ? dateTimezoneUtcNormal({ timezone }) : undefined)), shareReplay(1));
108
+ timeDate$ = this._timeDate.pipe(switchMapMaybeDefault(), switchMap((x) => {
109
+ let obs;
110
+ if (x) {
111
+ // if the string is not a date string, then treat it as a path
112
+ if ((typeof x === 'string' && !isISO8601DayStringStart(x)) || isDbxDateTimeFieldTimeDateConfig(x)) {
113
+ const { path, mapValue } = typeof x === 'string' ? { path: x } : x;
114
+ obs =
115
+ streamValueFromControl(this.form, path)?.pipe(map(mapValue ?? mapIdentityFunction()), map((x) => (x ? toJsDayDate(x) : undefined))) ?? of(undefined);
116
+ }
117
+ else {
118
+ obs = of(toJsDayDate(x));
119
+ }
120
+ }
121
+ else {
122
+ obs = of(undefined);
123
+ }
124
+ return obs;
125
+ }), distinctUntilChanged(isSameDateDay), shareReplay(1));
126
+ valueInSystemTimezone$ = this.formControl$.pipe(map((control) => control.valueChanges.pipe(startWith(control.value), shareReplay(1))), combineLatestWith(this.timezoneInstance$), switchMap(([x, timezoneInstance]) => {
127
+ return x.pipe(map(dbxDateTimeInputValueParseFactory(this.valueMode, timezoneInstance)));
128
+ }), throttleTime(20, undefined, { leading: true, trailing: true }), // throttle incoming values and timezone changes
129
+ distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
130
+ refreshInteral$ = interval(10 * 1000);
131
+ /**
132
+ * Used to trigger/display visual updates (specifically on timeDistance, etc.).
133
+ */
134
+ displayValue$ = this.refreshInteral$.pipe(
135
+ // every 10 seconds, refresh w/interval
136
+ startWith(0), map(() => new Date().getMinutes()), distinctUntilChanged(), tap(() => this.cdRef.markForCheck()), switchMap(() => this.valueInSystemTimezone$), shareReplay(1));
137
+ timeString$ = this.valueInSystemTimezone$.pipe(map((x) => (x ? toLocalReadableTimeString(x) : '')), distinctUntilChanged(), shareReplay(1));
138
+ dateInputCtrl = new FormControl(null, {
139
+ validators: []
140
+ });
141
+ timeInputCtrl = new FormControl(null, {
142
+ validators: [Validators.pattern(/^(now)$|^([0-9]|(0[0-9])|(1[0-9])|(2[0-3]))(:)?([0-5][0-9])?(\s)?([apAP][Mm])?(\\s)*$/)]
143
+ });
70
144
  get dateLabel() {
71
145
  return this.props.dateLabel ?? 'Date';
72
146
  }
@@ -148,242 +222,165 @@ export class DbxDateTimeFieldComponent extends FieldType {
148
222
  get minuteStep() {
149
223
  return this.field.props.minuteStep ?? this.field.props.step ?? 5;
150
224
  }
151
- constructor(cdRef, dbxDateTimeFieldConfigService) {
152
- super();
153
- this.cdRef = cdRef;
154
- this.dbxDateTimeFieldConfigService = dbxDateTimeFieldConfigService;
155
- this._sub = new SubscriptionObject();
156
- this._valueSub = new SubscriptionObject();
157
- this._autoFillDateSync = new SubscriptionObject();
158
- this._config = new BehaviorSubject(undefined);
159
- this.latestConfig$ = this._config.pipe(switchMapMaybeDefault(), distinctUntilChanged(), shareReplay(1));
160
- this._syncConfigObs = new BehaviorSubject(undefined);
161
- this._defaultTimezone = new BehaviorSubject(undefined);
162
- this._timeDate = new BehaviorSubject(undefined);
163
- this._presets = new BehaviorSubject(of([]));
164
- this._fullDayControlObs = new BehaviorSubject(undefined);
165
- this.fullDayControl$ = this._fullDayControlObs.pipe(filterMaybe());
166
- this._offset = new BehaviorSubject(0);
167
- this._formControlObs = new BehaviorSubject(undefined);
168
- this.formControl$ = this._formControlObs.pipe(filterMaybe());
169
- this._cleared = new Subject();
170
- this._updateTime = new Subject();
171
- this._resyncTimeInputSub = new SubscriptionObject();
172
- this._resyncTimeInput = new Subject();
173
- this.timeErrorStateMatcher = {
174
- isErrorState: (control, form) => {
225
+ fullDay$ = this.fullDayControl$.pipe(switchMap((control) => control.valueChanges.pipe(startWith(control.value))), distinctUntilChanged(), shareReplay(1));
226
+ showTimeInput$ = this.fullDay$.pipe(map((x) => !x && this.timeMode !== DbxDateTimeFieldTimeMode.NONE));
227
+ showAddTime$ = this.showTimeInput$.pipe(map((x) => !x && this.timeMode === DbxDateTimeFieldTimeMode.OPTIONAL), shareReplay(1));
228
+ currentDate$ = this.dateInputCtrl.valueChanges.pipe(startWith(this.dateInputCtrl.value), shareReplay(1));
229
+ date$ = this.currentDate$.pipe(filterMaybe(), shareReplay(1));
230
+ timezoneAbbreviation$ = combineLatest([this.currentDate$, this.timezone$, this.timeDate$]).pipe(map(([date, timezone, timeDate]) => getTimezoneAbbreviation(timezone, timeDate ?? date ?? new Date())), distinctUntilChanged(), shareReplay(1));
231
+ dateValue$ = merge(this.date$, this.valueInSystemTimezone$.pipe(skipFirstMaybe())).pipe(map((x) => (x ? startOfDay(x) : null)), distinctUntilChanged(isSameDateDay), shareReplay(1));
232
+ timeInput$ = this._updateTime.pipe(debounceTime(5), map(() => this.timeInputCtrl.value || ''), distinctUntilChanged());
233
+ syncConfigObs$ = this._syncConfigObs.pipe(switchMapMaybeDefault(), shareReplay(1));
234
+ parsedSyncConfigs$ = this.syncConfigObs$.pipe(map((x) => {
235
+ let parsed;
236
+ if (x) {
237
+ parsed = filterMaybeValues(asArray(x).map((y) => {
238
+ const control = this.form.get(y.syncWith);
175
239
  if (control) {
176
- return (control.invalid && (control.dirty || control.touched)) || this.errorStateMatcher.isErrorState(this.formControl, form);
177
- }
178
- else {
179
- return false;
180
- }
181
- }
182
- };
183
- this.resyncTimeInput$ = this._resyncTimeInput.pipe(debounceTime(200), shareReplay(1));
184
- this._configUpdateTimeSync = new SubscriptionObject(this.latestConfig$.pipe(skip(1)).subscribe((x) => {
185
- this._updateTime.next();
186
- }));
187
- this.timezone$ = this._defaultTimezone.pipe(switchMapMaybeDefault(), distinctUntilChanged()).pipe(map((defaultTimezone) => {
188
- return defaultTimezone ?? guessCurrentTimezone();
189
- }), distinctUntilChanged(), shareReplay(1));
190
- this.timezoneInstance$ = this.timezone$.pipe(map((timezone) => (timezone ? dateTimezoneUtcNormal({ timezone }) : undefined)), shareReplay(1));
191
- this.timeDate$ = this._timeDate.pipe(switchMapMaybeDefault(), switchMap((x) => {
192
- let obs;
193
- if (x) {
194
- // if the string is not a date string, then treat it as a path
195
- if ((typeof x === 'string' && !isISO8601DayStringStart(x)) || isDbxDateTimeFieldTimeDateConfig(x)) {
196
- const { path, mapValue } = typeof x === 'string' ? { path: x } : x;
197
- obs =
198
- streamValueFromControl(this.form, path)?.pipe(map(mapValue ?? mapIdentityFunction()), map((x) => (x ? toJsDayDate(x) : undefined))) ?? of(undefined);
240
+ return {
241
+ control,
242
+ ...y
243
+ };
199
244
  }
200
245
  else {
201
- obs = of(toJsDayDate(x));
246
+ return undefined;
202
247
  }
248
+ }));
249
+ }
250
+ else {
251
+ parsed = [];
252
+ }
253
+ return parsed;
254
+ }), shareReplay(1));
255
+ syncConfigBeforeValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'before');
256
+ syncConfigAfterValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'after');
257
+ isTimeCleared$ = combineLatest([this.currentDate$, this._timeDate.pipe(startWith(null))]).pipe(switchMap(([date, time]) => {
258
+ const isTimeCleared = Boolean(!date && !time);
259
+ return this._cleared.pipe(map(() => true), startWith(isTimeCleared));
260
+ }), distinctUntilChanged(), shareReplay(1));
261
+ rawDateTime$ = combineLatest([
262
+ this._config.pipe(first(), switchMap(() => (this.timeOnly ? of(null) : this.dateValue$))),
263
+ this.timeInput$.pipe(startWith(null)),
264
+ this.fullDay$,
265
+ this.timeDate$,
266
+ this.isTimeCleared$
267
+ ]).pipe(map(([date, timeString, fullDay, timeDate, isTimeCleared]) => {
268
+ let result;
269
+ if (!isTimeCleared) {
270
+ if (!date || this.timeOnly) {
271
+ date = timeDate ?? new Date(); // use the time date, or default to the current day
203
272
  }
204
- else {
205
- obs = of(undefined);
206
- }
207
- return obs;
208
- }), distinctUntilChanged(isSameDateDay), shareReplay(1));
209
- this.valueInSystemTimezone$ = this.formControl$.pipe(map((control) => control.valueChanges.pipe(startWith(control.value), shareReplay(1))), combineLatestWith(this.timezoneInstance$), switchMap(([x, timezoneInstance]) => {
210
- return x.pipe(map(dbxDateTimeInputValueParseFactory(this.valueMode, timezoneInstance)));
211
- }), throttleTime(20, undefined, { leading: true, trailing: true }), // throttle incoming values and timezone changes
212
- distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
213
- this.refreshInteral$ = interval(10 * 1000);
214
- /**
215
- * Used to trigger/display visual updates (specifically on timeDistance, etc.).
216
- */
217
- this.displayValue$ = this.refreshInteral$.pipe(
218
- // every 10 seconds, refresh w/interval
219
- startWith(0), map(() => new Date().getMinutes()), distinctUntilChanged(), tap(() => this.cdRef.markForCheck()), switchMap(() => this.valueInSystemTimezone$), shareReplay(1));
220
- this.timeString$ = this.valueInSystemTimezone$.pipe(map((x) => (x ? toLocalReadableTimeString(x) : '')), distinctUntilChanged(), shareReplay(1));
221
- this.dateInputCtrl = new FormControl(null, {
222
- validators: []
223
- });
224
- this.timeInputCtrl = new FormControl(null, {
225
- validators: [Validators.pattern(/^(now)$|^([0-9]|(0[0-9])|(1[0-9])|(2[0-3]))(:)?([0-5][0-9])?(\s)?([apAP][Mm])?(\\s)*$/)]
226
- });
227
- this.fullDay$ = this.fullDayControl$.pipe(switchMap((control) => control.valueChanges.pipe(startWith(control.value))), distinctUntilChanged(), shareReplay(1));
228
- this.showTimeInput$ = this.fullDay$.pipe(map((x) => !x && this.timeMode !== DbxDateTimeFieldTimeMode.NONE));
229
- this.showAddTime$ = this.showTimeInput$.pipe(map((x) => !x && this.timeMode === DbxDateTimeFieldTimeMode.OPTIONAL), shareReplay(1));
230
- this.currentDate$ = this.dateInputCtrl.valueChanges.pipe(startWith(this.dateInputCtrl.value), shareReplay(1));
231
- this.date$ = this.currentDate$.pipe(filterMaybe(), shareReplay(1));
232
- this.timezoneAbbreviation$ = combineLatest([this.currentDate$, this.timezone$, this.timeDate$]).pipe(map(([date, timezone, timeDate]) => getTimezoneAbbreviation(timezone, timeDate ?? date ?? new Date())), distinctUntilChanged(), shareReplay(1));
233
- this.dateValue$ = merge(this.date$, this.valueInSystemTimezone$.pipe(skipFirstMaybe())).pipe(map((x) => (x ? startOfDay(x) : null)), distinctUntilChanged(isSameDateDay), shareReplay(1));
234
- this.timeInput$ = this._updateTime.pipe(debounceTime(5), map(() => this.timeInputCtrl.value || ''), distinctUntilChanged());
235
- this.syncConfigObs$ = this._syncConfigObs.pipe(switchMapMaybeDefault(), shareReplay(1));
236
- this.parsedSyncConfigs$ = this.syncConfigObs$.pipe(map((x) => {
237
- let parsed;
238
- if (x) {
239
- parsed = filterMaybeValues(asArray(x).map((y) => {
240
- const control = this.form.get(y.syncWith);
241
- if (control) {
242
- return {
243
- control,
244
- ...y
245
- };
273
+ if (date) {
274
+ if (fullDay) {
275
+ if (this.dateTimeField.fullDayInUTC) {
276
+ result = utcDayForDate(date);
246
277
  }
247
278
  else {
248
- return undefined;
279
+ result = startOfDay(date);
249
280
  }
250
- }));
251
- }
252
- else {
253
- parsed = [];
254
- }
255
- return parsed;
256
- }), shareReplay(1));
257
- this.syncConfigBeforeValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'before');
258
- this.syncConfigAfterValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'after');
259
- this.isTimeCleared$ = combineLatest([this.currentDate$, this._timeDate.pipe(startWith(null))]).pipe(switchMap(([date, time]) => {
260
- const isTimeCleared = Boolean(!date && !time);
261
- return this._cleared.pipe(map(() => true), startWith(isTimeCleared));
262
- }), distinctUntilChanged(), shareReplay(1));
263
- this.rawDateTime$ = combineLatest([
264
- this._config.pipe(first(), switchMap(() => (this.timeOnly ? of(null) : this.dateValue$))),
265
- this.timeInput$.pipe(startWith(null)),
266
- this.fullDay$,
267
- this.timeDate$,
268
- this.isTimeCleared$
269
- ]).pipe(map(([date, timeString, fullDay, timeDate, isTimeCleared]) => {
270
- let result;
271
- if (!isTimeCleared) {
272
- if (!date || this.timeOnly) {
273
- date = timeDate ?? new Date(); // use the time date, or default to the current day
274
281
  }
275
- if (date) {
276
- if (fullDay) {
277
- if (this.dateTimeField.fullDayInUTC) {
278
- result = utcDayForDate(date);
279
- }
280
- else {
281
- result = startOfDay(date);
282
- }
283
- }
284
- else if (timeString) {
285
- result =
286
- readableTimeStringToDate(timeString, {
287
- date,
288
- useSystemTimezone: true
289
- }) ?? date;
290
- }
291
- else if (!this.timeOnly) {
292
- if (this.timeMode !== DbxDateTimeFieldTimeMode.REQUIRED) {
293
- // only autofill the date if the time is marked as required (and the time string is empty)
294
- result = date;
295
- }
296
- }
282
+ else if (timeString) {
283
+ result =
284
+ readableTimeStringToDate(timeString, {
285
+ date,
286
+ useSystemTimezone: true
287
+ }) ?? date;
297
288
  }
298
- }
299
- return result;
300
- }), distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
301
- this.dateTimePickerConfig$ = combineLatest([this._config.pipe(switchMapMaybeObs()), this.syncConfigBeforeValue$, this.syncConfigAfterValue$]).pipe(map(([x, dateInputMin, dateInputMax]) => {
302
- let result = x;
303
- if (dateInputMin != null || dateInputMax != null) {
304
- const { min: limitMin, max: limitMax } = x?.limits ?? {};
305
- const min = findMinDate([dateInputMin, dateFromLogicalDate(limitMin)]);
306
- const max = findMaxDate([dateInputMax, dateFromLogicalDate(limitMax)]);
307
- result = {
308
- ...x,
309
- limits: {
310
- ...x?.limits,
311
- min,
312
- max
313
- }
314
- };
315
- }
316
- return result;
317
- }), distinctUntilChanged(), shareReplay(1));
318
- this.dateInputMin$ = this.dateTimePickerConfig$.pipe(map((x) => (x?.limits?.min ?? null)), distinctUntilChanged(isSameDate), shareReplay(1));
319
- this.dateInputMax$ = this.dateTimePickerConfig$.pipe(map((x) => (x?.limits?.max ?? null)), distinctUntilChanged(isSameDate), shareReplay(1));
320
- /**
321
- * Whether or not there is a limited min/max date range applied/available.
322
- */
323
- this.hasRestrictedDateRange$ = combineLatest([this.dateInputMin$, this.dateInputMax$]).pipe(map(([a, b]) => Boolean(a || b)), distinctUntilChanged(), shareReplay(1));
324
- this.dateMinAndMaxIsSameDay$ = combineLatest([this.dateInputMin$, this.dateInputMax$]).pipe(map(([a, b]) => Boolean(a && b) && isSameDateDay(a, b)), distinctUntilChanged(), shareReplay(1));
325
- this.pickerFilter$ = this.dateTimePickerConfig$.pipe(distinctUntilChanged(), map((x) => {
326
- if (x) {
327
- const filter = dateTimeMinuteWholeDayDecisionFunction(x, false);
328
- return (x) => (x != null ? filter(x) : true);
329
- }
330
- else {
331
- return () => true;
332
- }
333
- }), shareReplay(1));
334
- this.defaultPickerFilter = () => true;
335
- this.timeOutput$ = combineLatest([this.rawDateTime$, this._offset, this.dateTimePickerConfig$]).pipe(throttleTime(TIME_OUTPUT_THROTTLE_TIME, undefined, { leading: false, trailing: true }), distinctUntilChanged((current, next) => current[0] === next[0] && next[1] === 0 && current[2] === next[2]), tap(([, stepsOffset]) => (stepsOffset ? this._offset.next(0) : 0)), map(([date, stepsOffset, config]) => {
336
- if (date != null) {
337
- const instance = new DateTimeMinuteInstance({
338
- date,
339
- ...config,
340
- roundDownToMinute: true
341
- });
342
- // only clamp when the steps offset is set
343
- if (stepsOffset) {
344
- date = instance.clamp(date);
345
- const minutes = stepsOffset * this.minuteStep;
346
- if (minutes != 0) {
347
- date = addMinutes(date, minutes);
348
- date = instance.clamp(date); // clamp the date again
289
+ else if (!this.timeOnly) {
290
+ if (this.timeMode !== DbxDateTimeFieldTimeMode.REQUIRED) {
291
+ // only autofill the date if the time is marked as required (and the time string is empty)
292
+ result = date;
349
293
  }
350
294
  }
351
295
  }
352
- return date;
353
- }), distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
354
- this.dateTimePickerInstance$ = this.dateTimePickerConfig$.pipe(map((config) => {
355
- return new DateTimeMinuteInstance({
296
+ }
297
+ return result;
298
+ }), distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
299
+ dateTimePickerConfig$ = combineLatest([this._config.pipe(switchMapMaybeObs()), this.syncConfigBeforeValue$, this.syncConfigAfterValue$]).pipe(map(([x, dateInputMin, dateInputMax]) => {
300
+ let result = x;
301
+ if (dateInputMin != null || dateInputMax != null) {
302
+ const { min: limitMin, max: limitMax } = x?.limits ?? {};
303
+ const min = findMinDate([dateInputMin, dateFromLogicalDate(limitMin)]);
304
+ const max = findMaxDate([dateInputMax, dateFromLogicalDate(limitMax)]);
305
+ result = {
306
+ ...x,
307
+ limits: {
308
+ ...x?.limits,
309
+ min,
310
+ max
311
+ }
312
+ };
313
+ }
314
+ return result;
315
+ }), distinctUntilChanged(), shareReplay(1));
316
+ dateInputMin$ = this.dateTimePickerConfig$.pipe(map((x) => (x?.limits?.min ?? null)), distinctUntilChanged(isSameDate), shareReplay(1));
317
+ dateInputMax$ = this.dateTimePickerConfig$.pipe(map((x) => (x?.limits?.max ?? null)), distinctUntilChanged(isSameDate), shareReplay(1));
318
+ /**
319
+ * Whether or not there is a limited min/max date range applied/available.
320
+ */
321
+ hasRestrictedDateRange$ = combineLatest([this.dateInputMin$, this.dateInputMax$]).pipe(map(([a, b]) => Boolean(a || b)), distinctUntilChanged(), shareReplay(1));
322
+ dateMinAndMaxIsSameDay$ = combineLatest([this.dateInputMin$, this.dateInputMax$]).pipe(map(([a, b]) => Boolean(a && b) && isSameDateDay(a, b)), distinctUntilChanged(), shareReplay(1));
323
+ pickerFilter$ = this.dateTimePickerConfig$.pipe(distinctUntilChanged(), map((x) => {
324
+ if (x) {
325
+ const filter = dateTimeMinuteWholeDayDecisionFunction(x, false);
326
+ return (x) => (x != null ? filter(x) : true);
327
+ }
328
+ else {
329
+ return () => true;
330
+ }
331
+ }), shareReplay(1));
332
+ defaultPickerFilter = () => true;
333
+ timeOutput$ = combineLatest([this.rawDateTime$, this._offset, this.dateTimePickerConfig$]).pipe(throttleTime(TIME_OUTPUT_THROTTLE_TIME, undefined, { leading: false, trailing: true }), distinctUntilChanged((current, next) => current[0] === next[0] && next[1] === 0 && current[2] === next[2]), tap(([, stepsOffset]) => (stepsOffset ? this._offset.next(0) : 0)), map(([date, stepsOffset, config]) => {
334
+ if (date != null) {
335
+ const instance = new DateTimeMinuteInstance({
336
+ date,
356
337
  ...config,
357
338
  roundDownToMinute: true
358
339
  });
359
- }), shareReplay(1));
360
- this.hasEmptyDisplayValue$ = this.displayValue$.pipe(map((x) => !x), distinctUntilChanged(), shareReplay(1));
361
- this.presets$ = this._presets.pipe(switchMapMaybeObs(), map((x) => x.map(dateTimePreset)), shareReplay(1));
362
- this.showClearButton$ = this.hasEmptyDisplayValue$.pipe(map((x) => Boolean(this.showClearButton && !x)), distinctUntilChanged(), shareReplay(1));
363
- this.canAutofillDateWithOnlyAvailableDate$ = this.dateMinAndMaxIsSameDay$;
364
- this.showDateInput$ = this.dateMinAndMaxIsSameDay$.pipe(map((dateMinAndMaxIsSameDay) => {
365
- return this.showDateInput && (this.alwaysShowDateInput || !dateMinAndMaxIsSameDay);
366
- }), distinctUntilChanged(), shareReplay(1));
367
- this.currentErrorMessage$ = this.formControl$.pipe(switchMap((formControl) => formControl.statusChanges.pipe(filter((x) => x === 'INVALID' || x === 'VALID'), map((x) => {
368
- let currentErrorMessage;
369
- if (x === 'INVALID') {
370
- if (this.formControl.hasError('required')) {
371
- currentErrorMessage = 'Date is required';
372
- }
373
- else if (this.formControl.hasError(DBX_DATE_TIME_FIELD_DATE_NOT_IN_SCHEDULE_ERROR)) {
374
- currentErrorMessage = 'Date does not fall on an available dates in schedule.';
375
- }
376
- else if (this.formControl.hasError(DBX_DATE_TIME_FIELD_TIME_NOT_IN_RANGE_ERROR)) {
377
- currentErrorMessage = 'Time is not valid for the given date.';
378
- }
379
- else {
380
- currentErrorMessage = 'The given date and time is invalid.';
340
+ // only clamp when the steps offset is set
341
+ if (stepsOffset) {
342
+ date = instance.clamp(date);
343
+ const minutes = stepsOffset * this.minuteStep;
344
+ if (minutes != 0) {
345
+ date = addMinutes(date, minutes);
346
+ date = instance.clamp(date); // clamp the date again
381
347
  }
382
348
  }
383
- return currentErrorMessage;
384
- }))), startWith(undefined), shareReplay(1));
385
- this.hasError$ = this.currentErrorMessage$.pipe(map((x) => Boolean(x)), distinctUntilChanged(), shareReplay(1));
386
- }
349
+ }
350
+ return date;
351
+ }), distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
352
+ dateTimePickerInstance$ = this.dateTimePickerConfig$.pipe(map((config) => {
353
+ return new DateTimeMinuteInstance({
354
+ ...config,
355
+ roundDownToMinute: true
356
+ });
357
+ }), shareReplay(1));
358
+ hasEmptyDisplayValue$ = this.displayValue$.pipe(map((x) => !x), distinctUntilChanged(), shareReplay(1));
359
+ presets$ = this._presets.pipe(switchMapMaybeObs(), map((x) => x.map(dateTimePreset)), shareReplay(1));
360
+ showClearButton$ = this.hasEmptyDisplayValue$.pipe(map((x) => Boolean(this.showClearButton && !x)), distinctUntilChanged(), shareReplay(1));
361
+ canAutofillDateWithOnlyAvailableDate$ = this.dateMinAndMaxIsSameDay$;
362
+ showDateInput$ = this.dateMinAndMaxIsSameDay$.pipe(map((dateMinAndMaxIsSameDay) => {
363
+ return this.showDateInput && (this.alwaysShowDateInput || !dateMinAndMaxIsSameDay);
364
+ }), distinctUntilChanged(), shareReplay(1));
365
+ currentErrorMessage$ = this.formControl$.pipe(switchMap((formControl) => formControl.statusChanges.pipe(filter((x) => x === 'INVALID' || x === 'VALID'), map((x) => {
366
+ let currentErrorMessage;
367
+ if (x === 'INVALID') {
368
+ if (this.formControl.hasError('required')) {
369
+ currentErrorMessage = 'Date is required';
370
+ }
371
+ else if (this.formControl.hasError(DBX_DATE_TIME_FIELD_DATE_NOT_IN_SCHEDULE_ERROR)) {
372
+ currentErrorMessage = 'Date does not fall on an available dates in schedule.';
373
+ }
374
+ else if (this.formControl.hasError(DBX_DATE_TIME_FIELD_TIME_NOT_IN_RANGE_ERROR)) {
375
+ currentErrorMessage = 'Time is not valid for the given date.';
376
+ }
377
+ else {
378
+ currentErrorMessage = 'The given date and time is invalid.';
379
+ }
380
+ }
381
+ return currentErrorMessage;
382
+ }))), startWith(undefined), shareReplay(1));
383
+ hasError$ = this.currentErrorMessage$.pipe(map((x) => Boolean(x)), distinctUntilChanged(), shareReplay(1));
387
384
  ngOnInit() {
388
385
  this._formControlObs.next(this.formControl);
389
386
  const inputPickerConfig = this.dateTimeField.pickerConfig;
@@ -663,11 +660,11 @@ export class DbxDateTimeFieldComponent extends FieldType {
663
660
  clearValue() {
664
661
  this._cleared.next();
665
662
  }
666
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxDateTimeFieldComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DbxDateTimeFieldMenuPresetsService }], target: i0.ɵɵFactoryTarget.Component }); }
667
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DbxDateTimeFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutGap=\"6px grid\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput$ | async\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"(showDateInput$ | async) ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <!-- Date Hint -->\n <ng-container [ngSwitch]=\"hasError$ | async\">\n <ng-container *ngSwitchCase=\"false\">\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\">\n <ng-container [ngSwitch]=\"hasEmptyDisplayValue$ | async\">\n <ng-container *ngSwitchCase=\"true\">\n <span class=\"dbx-small\">No date/time set</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"false\">\n <ng-container [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"true\">\n <mat-error *ngIf=\"currentErrorMessage$ | async\">{{ currentErrorMessage$ | async }}</mat-error>\n </ng-container>\n </ng-container>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [disabled]=\"disabled\" [required]=\"isDateRequired\" [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"dbx-datetime-row-button\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <button matSuffix *ngIf=\"showClearButton$ | async\" class=\"dbx-datetime-clear-button\" mat-icon-button aria-label=\"clears the date and time menu\" [disabled]=\"disabled\" (click)=\"clearValue()\">\n <mat-icon>clear</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput [errorStateMatcher]=\"timeErrorStateMatcher\" matInput [required]=\"isTimeRequired\" [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n <mat-error *ngIf=\"timeInputCtrl.hasError('pattern')\">The input time is not recognizable.</mat-error>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i8.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i11.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i11.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i11.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i12.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i13.DateDistancePipe, name: "dateDistance" }, { kind: "pipe", type: i13.TimeDistancePipe, name: "timeDistance" }, { kind: "pipe", type: i13.GetValuePipe, name: "getValue" }] }); }
663
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxDateTimeFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
664
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DbxDateTimeFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutGap=\"6px grid\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput$ | async\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"(showDateInput$ | async) ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <!-- Date Hint -->\n <ng-container [ngSwitch]=\"hasError$ | async\">\n <ng-container *ngSwitchCase=\"false\">\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\">\n <ng-container [ngSwitch]=\"hasEmptyDisplayValue$ | async\">\n <ng-container *ngSwitchCase=\"true\">\n <span class=\"dbx-small\">No date/time set</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"false\">\n <ng-container [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"true\">\n <mat-error *ngIf=\"currentErrorMessage$ | async\">{{ currentErrorMessage$ | async }}</mat-error>\n </ng-container>\n </ng-container>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [disabled]=\"disabled\" [required]=\"isDateRequired\" [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"dbx-datetime-row-button\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <button matSuffix *ngIf=\"showClearButton$ | async\" class=\"dbx-datetime-clear-button\" mat-icon-button aria-label=\"clears the date and time menu\" [disabled]=\"disabled\" (click)=\"clearValue()\">\n <mat-icon>clear</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput [errorStateMatcher]=\"timeErrorStateMatcher\" matInput [required]=\"isTimeRequired\" [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n <mat-error *ngIf=\"timeInputCtrl.hasError('pattern')\">The input time is not recognizable.</mat-error>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i10.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i10.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i10.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i11.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i12.DateDistancePipe, name: "dateDistance" }, { kind: "pipe", type: i12.TimeDistancePipe, name: "timeDistance" }, { kind: "pipe", type: i12.GetValuePipe, name: "getValue" }] });
668
665
  }
669
666
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxDateTimeFieldComponent, decorators: [{
670
667
  type: Component,
671
668
  args: [{ template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutGap=\"6px grid\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput$ | async\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"(showDateInput$ | async) ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <!-- Date Hint -->\n <ng-container [ngSwitch]=\"hasError$ | async\">\n <ng-container *ngSwitchCase=\"false\">\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\">\n <ng-container [ngSwitch]=\"hasEmptyDisplayValue$ | async\">\n <ng-container *ngSwitchCase=\"true\">\n <span class=\"dbx-small\">No date/time set</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"false\">\n <ng-container [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"true\">\n <mat-error *ngIf=\"currentErrorMessage$ | async\">{{ currentErrorMessage$ | async }}</mat-error>\n </ng-container>\n </ng-container>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [disabled]=\"disabled\" [required]=\"isDateRequired\" [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"dbx-datetime-row-button\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <button matSuffix *ngIf=\"showClearButton$ | async\" class=\"dbx-datetime-clear-button\" mat-icon-button aria-label=\"clears the date and time menu\" [disabled]=\"disabled\" (click)=\"clearValue()\">\n <mat-icon>clear</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput [errorStateMatcher]=\"timeErrorStateMatcher\" matInput [required]=\"isTimeRequired\" [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n <mat-error *ngIf=\"timeInputCtrl.hasError('pattern')\">The input time is not recognizable.</mat-error>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n" }]
672
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DbxDateTimeFieldMenuPresetsService }]; } });
673
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vc3JjL2xpYi9mb3JtbHkvZmllbGQvdmFsdWUvZGF0ZS9kYXRldGltZS5maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2RhdGV0aW1lLmZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0YsT0FBTyxFQUFFLGlCQUFpQixFQUF5Ryx1QkFBdUIsRUFBb0IsbUJBQW1CLEVBQXFELE1BQU0sZUFBZSxDQUFDO0FBQ3JXLE9BQU8sRUFBRSxtQkFBbUIsRUFBd0Isc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBaUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5WixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZPLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBbUIsV0FBVyxF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QUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBZ0I7UUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNqRCxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7K0dBMzJCVSx5QkFBeUI7bUdBQXpCLHlCQUF5QiwyRUM3T3RDLDB1S0FrR0E7OzRGRDJJYSx5QkFBeUI7a0JBSHJDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIE1heWJlLCB0eXBlIFJlYWRhYmxlVGltZVN0cmluZywgdHlwZSBBcnJheU9yVmFsdWUsIHR5cGUgSVNPODYwMURhdGVTdHJpbmcsIGFzQXJyYXksIGZpbHRlck1heWJlVmFsdWVzLCB0eXBlIERlY2lzaW9uRnVuY3Rpb24sIHR5cGUgTWlsbGlzZWNvbmRzLCB0eXBlIFRpbWV6b25lU3RyaW5nLCB0eXBlIExvZ2ljYWxEYXRlLCB0eXBlIERhdGVPckRheVN0cmluZywgaXNJU084NjAxRGF5U3RyaW5nU3RhcnQsIHR5cGUgTWFwRnVuY3Rpb24sIG1hcElkZW50aXR5RnVuY3Rpb24sIE1pbnV0ZU9mRGF5LCBVbml4RGF0ZVRpbWVOdW1iZXIsIElTTzg2MDFEYXlTdHJpbmcgfSBmcm9tICdAZGVyZWVrYi91dGlsJztcbmltcG9ydCB7IGRhdGVGcm9tTG9naWNhbERhdGUsIERhdGVUaW1lTWludXRlQ29uZmlnLCBEYXRlVGltZU1pbnV0ZUluc3RhbmNlLCBndWVzc0N1cnJlbnRUaW1lem9uZSwgcmVhZGFibGVUaW1lU3RyaW5nVG9EYXRlLCB0b0xvY2FsUmVhZGFibGVUaW1lU3RyaW5nLCB1dGNEYXlGb3JEYXRlLCBzYWZlVG9Kc0RhdGUsIGZpbmRNaW5EYXRlLCBmaW5kTWF4RGF0ZSwgaXNTYW1lRGF0ZUhvdXJzQW5kTWludXRlcywgZ2V0VGltZXpvbmVBYmJyZXZpYXRpb24sIGlzU2FtZURhdGVEYXksIGRhdGVUaW1lem9uZVV0Y05vcm1hbCwgRGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2UsIHRvSnNEYXlEYXRlLCBpc1NhbWVEYXRlLCBkYXRlVGltZU1pbnV0ZVdob2xlRGF5RGVjaXNpb25GdW5jdGlvbiB9IGZyb20gJ0BkZXJlZWtiL2RhdGUnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCBzaGFyZVJlcGxheSwgbWFwLCBzdGFydFdpdGgsIHRhcCwgZmlyc3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBkZWJvdW5jZVRpbWUsIHRocm90dGxlVGltZSwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBTdWJqZWN0LCBtZXJnZSwgaW50ZXJ2YWwsIG9mLCBjb21iaW5lTGF0ZXN0V2l0aCwgZmlsdGVyLCBza2lwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycywgRm9ybUdyb3VwLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnQG5neC1mb3JtbHkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRmllbGRUeXBlQ29uZmlnLCBGb3JtbHlGaWVsZFByb3BzIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VySW5wdXRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgYWRkTWludXRlcywgc3RhcnRPZkRheSwgYWRkRGF5cyB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIsIGZpbHRlck1heWJlLCBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlciwgc2tpcEZpcnN0TWF5YmUsIFN1YnNjcmlwdGlvbk9iamVjdCwgc3dpdGNoTWFwTWF5YmVEZWZhdWx0LCBzd2l0Y2hNYXBNYXliZU9icyB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgRGF0ZVRpbWVQcmVzZXQsIERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbiwgZGF0ZVRpbWVQcmVzZXQgfSBmcm9tICcuL2RhdGV0aW1lJztcbmltcG9ydCB7IERieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UgfSBmcm9tICcuL2RhdGV0aW1lLmZpZWxkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUsIGRieERhdGVUaW1lSW5wdXRWYWx1ZVBhcnNlRmFjdG9yeSwgZGJ4RGF0ZVRpbWVJc1NhbWVEYXRlVGltZUZpZWxkVmFsdWUsIGRieERhdGVUaW1lT3V0cHV0VmFsdWVGYWN0b3J5IH0gZnJvbSAnLi9kYXRlLnZhbHVlJztcbmltcG9ydCB7IEZvcm1Db250cm9sUGF0aCwgc3RyZWFtVmFsdWVGcm9tQ29udHJvbCB9IGZyb20gJy4uLy4uLy4uLy4uL2Zvcm0vZm9ybS5hbmd1bGFyLnV0aWwnO1xuaW1wb3J0IHsgdG9nZ2xlRGlzYWJsZUZvcm1Db250cm9sIH0gZnJvbSAnLi4vLi4vLi4vLi4vZm9ybS9mb3JtJztcbmltcG9ydCB7IEVycm9yU3RhdGVNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5cbmV4cG9ydCBlbnVtIERieERhdGVUaW1lRmllbGRUaW1lTW9kZSB7XG4gIC8qKlxuICAgKiBUaW1lIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgUkVRVUlSRUQgPSAncmVxdWlyZWQnLFxuICAvKipcbiAgICogVGltZSBpcyBvcHRpb25hbC5cbiAgICovXG4gIE9QVElPTkFMID0gJ29wdGlvbmFsJyxcbiAgLyoqXG4gICAqIFRpbWUgaXMgcGVybWVuYW50bHkgb2ZmLlxuICAgKi9cbiAgTk9ORSA9ICdub25lJ1xufVxuXG5leHBvcnQgdHlwZSBEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24gPSBPbWl0PERhdGVUaW1lTWludXRlQ29uZmlnLCAnZGF0ZSc+O1xuXG5leHBvcnQgdHlwZSBEYnhEYXRlVGltZUZpZWxkU3luY1R5cGUgPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFN5bmNGaWVsZCB7XG4gIC8qKlxuICAgKiBGaWVsZCBrZXkvcGF0aCB0byBzeW5jIHdpdGgvYWdhaW5zdC5cbiAgICovXG4gIHJlYWRvbmx5IHN5bmNXaXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb3cgdG8gc3luYyBhZ2FpbnN0IHRoZSBvdGhlciBmaWVsZC5cbiAgICovXG4gIHJlYWRvbmx5IHN5bmNUeXBlOiBEYnhEYXRlVGltZUZpZWxkU3luY1R5cGU7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHRpbWUgZGF0ZSBmaWVsZCB0aGF0IGhhcyBhIHJlZmVyZW5jZSBhbmQgb3B0aW9uYWwgbWFwIGZ1bmN0aW9uIHRvIG1hcCB0aGUgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnPEkgPSB1bmtub3duPiB7XG4gIHJlYWRvbmx5IHBhdGg6IEZvcm1Db250cm9sUGF0aDtcbiAgcmVhZG9ubHkgbWFwVmFsdWU/OiBNYXBGdW5jdGlvbjxJLCBNYXliZTxEYXRlT3JEYXlTdHJpbmc+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnKGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnIHtcbiAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKGlucHV0IGFzIERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZykucGF0aCA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFByb3BzIGV4dGVuZHMgRm9ybWx5RmllbGRQcm9wcyB7XG4gIC8qKlxuICAgKiBDdXN0b20gZGF0ZSBsYWJlbC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gRGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0ZUxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gdGltZSBsYWJlbC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gVGltZVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZUxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMYWJlbCB0byB1c2UgZm9yIHRoZSBkYXRlIGhpbnQgZm9yIFwiQWxsIERheVwiLiBEZWZhdWx0cyB0byBcIkFsbCBEYXlcIi5cbiAgICovXG4gIHJlYWRvbmx5IGFsbERheUxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMYWJlbCB0byB1c2UgZm9yIHRoZSBkYXRlIGhpbnQgZm9yIFwiQXRcIi4gRGVmYXVsdHMgdG8gXCJBdFwiLlxuICAgKi9cbiAgcmVhZG9ubHkgYXRUaW1lTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG1vZGUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIERBVEVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlTW9kZT86IERieERhdGVUaW1lVmFsdWVNb2RlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZGF0ZSBpcyBoaWRkZW4sIGFuZCBhdXRvbWF0aWNhbGx5IHVzZXMgdG9kYXkvaW5wdXQgZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVPbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gdGltZU9ubHkgaXMgZmFsc2UuXG4gICAqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGFsd2F5cyBzaG93IHRoZSBkYXRlIGlucHV0IGV2ZW4gd2hlbiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIGRhdGUgdGhhdCBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICByZWFkb25seSBhbHdheXNTaG93RGF0ZUlucHV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gYXV0b2ZpbGwgdGhlIGRhdGUgd2hlbiB0aW1lIGlzIHBpY2tlZC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqL1xuICByZWFkb25seSBhdXRvZmlsbERhdGVXaGVuVGltZUlzUGlja2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHRpbWUgY2FuIGJlIGFkZGVkL3JlbW92ZWQgb3B0aW9uYWxseS5cbiAgICpcbiAgICogVGhpcyBpcyBpZ25vcmVkIGlmIHRpbWVPbmx5IGlzIHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVNb2RlPzogRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlO1xuXG4gIC8qKlxuICAgKiBPdGhlciBmb3JtIGNvbnRyb2wgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB3aGV0aGVyIG9yIG5vdCBpdCBpcyBhIGZ1bGwgZGF5LlxuICAgKlxuICAgKiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpZiB0aW1lIGlzIG9wdGlvbmFsLlxuICAgKlxuICAgKiBXaGVuIHRpbWUgaXMgb2ZmLCB0aGUgZmllbGQgaXMgc2V0IHRvIHRydWUuXG4gICAqL1xuICByZWFkb25seSBmdWxsRGF5RmllbGROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBwYXNzIHRoZSBkYXRlIHZhbHVlIGFzIGEgVVRDIGRhdGUsIG9yIGEgZGF0ZSBpbiB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bGxEYXlJblVUQz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IG90IGhpZGUgdGhlIGRhdGUgaGludCBpbmZvIGNvbnRlbnQuXG4gICAqXG4gICAqIEZhbHNlIGJ5IGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGhpZGVEYXRlSGludD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGhpZGUgdGhlIGRhdGUvY2FsZW5kYXIgcGlja2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgaGlkZURhdGVQaWNrZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHBpY2tlckNvbmZpZz86IE9ic2VydmFibGVPclZhbHVlR2V0dGVyPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj47XG5cbiAgLyoqXG4gICAqIFVzZWQgZm9yIHN5bmNpbmcgd2l0aCBvbmUgb3IgbW9yZSBmaWVsZHMgd2l0aCBhIERhdGUgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSBnZXRTeW5jRmllbGRzT2JzPzogKCkgPT4gT2JzZXJ2YWJsZTxBcnJheU9yVmFsdWU8RGJ4RGF0ZVRpbWVGaWVsZFN5bmNGaWVsZD4+O1xuXG4gIC8qKlxuICAgKiAoT3B0aW9uYWwpIFRoZSBpbnB1dCB0aW1lem9uZSB0byBkZWZhdWx0IHRvLlxuICAgKlxuICAgKiBJZ25vcmVkIGlmIGZ1bGxEYXlJblVUQyBpcyB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZXpvbmU/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxNYXliZTxUaW1lem9uZVN0cmluZz4+PjtcblxuICAvKipcbiAgICogKE9wdGlvbmFsKSBUaGUgZGF0ZSB0byBhcHBseSB0aGUgdGltZSB0by5cbiAgICpcbiAgICogVGhlIHRpbWV6b25lIGFiYnJ2aWF0aW9uIHdpbGwgYWxzbyB1c2UgdGhpcyBkYXRlIHdoZW4gdXNpbmcgdGhlIHRpbWUtb25seSBtb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZURhdGU/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxNYXliZTxEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcgfCBGb3JtQ29udHJvbFBhdGggfCBEYXRlT3JEYXlTdHJpbmc+Pj47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgdGhlIHRpbWV6b25lLiBUcnVlIGJ5IGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBzaG93VGltZXpvbmU/OiBNYXliZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3VzdG9tIHByZXNldHMgdG8gc2hvdyBpbiB0aGUgZHJvcGRvd24uXG4gICAqL1xuICByZWFkb25seSBwcmVzZXRzPzogT2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8RGF0ZVRpbWVQcmVzZXRDb25maWd1cmF0aW9uW10+O1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZSBpbiBtcyB0byBwcmV2ZW50IG91dHB1dCBmcm9tIGdvaW5nIG91dCB3aGVuIHRoZSBpbnB1dCB2YWx1ZSBjaGFuZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRPdXRwdXREZWJvdW5jZVRpbWU/OiBNaWxsaXNlY29uZHM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgdGhlIGNsZWFyIGRhdGUgYnV0dG9uLiBUcnVlIGJ5IGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBzaG93Q2xlYXJCdXR0b24/OiBNYXliZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaW51dGVzIHRvIGFkZC9zdWJ0cmFjdCB3aGVuIHVzaW5nIHRoZSBhcnJvdyBrZXlzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWludXRlU3RlcD86IE1heWJlPG51bWJlcj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFN5bmNQYXJzZWRGaWVsZCBleHRlbmRzIFBpY2s8RGJ4RGF0ZVRpbWVGaWVsZFN5bmNGaWVsZCwgJ3N5bmNUeXBlJz4ge1xuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w8TWF5YmU8RGF0ZSB8IElTTzg2MDFEYXRlU3RyaW5nPj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzeW5jQ29uZmlnVmFsdWVPYnMocGFyc2VDb25maWdzT2JzOiBPYnNlcnZhYmxlPERieERhdGVUaW1lRmllbGRTeW5jUGFyc2VkRmllbGRbXT4sIHR5cGU6IERieERhdGVUaW1lRmllbGRTeW5jVHlwZSk6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+IHtcbiAgcmV0dXJuIHBhcnNlQ29uZmlnc09icy5waXBlKFxuICAgIHN3aXRjaE1hcCgoeCkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnID0geC5maW5kKCh5KSA9PiB5LnN5bmNUeXBlID09PSB0eXBlKTtcbiAgICAgIGxldCByZXN1bHQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+O1xuXG4gICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHsgY29udHJvbCB9ID0gY29uZmlnO1xuICAgICAgICByZXN1bHQgPSBjb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChjb250cm9sLnZhbHVlKSxcbiAgICAgICAgICBtYXAoKHgpID0+IHNhZmVUb0pzRGF0ZSh4KSA/PyBudWxsKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gb2YobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xufVxuXG5jb25zdCBUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FOiBNaWxsaXNlY29uZHMgPSAxMDtcblxuLyoqXG4gKiBFcnJvciBjb2RlIHVzZWQgd2hlbiB0aGUgc2VsZWN0ZWQgZGF0ZSBpcyBub3QgaW4gdGhlIHNjaGVkdWxlLlxuICovXG5leHBvcnQgY29uc3QgREJYX0RBVEVfVElNRV9GSUVMRF9EQVRFX05PVF9JTl9TQ0hFRFVMRV9FUlJPUiA9ICdkYXRlVGltZUZpZWxkRGF0ZU5vdEluU2NoZWR1bGUnO1xuXG4vKipcbiAqIEVycm9yIGNvZGUgdXNlZCB3aGVuIHRoZSBzZWxlY3RlZCB0aW1lL3RpbWUgaW5wdXQgaXMgbm90IGluIHRoZSBsaW1pdGVkIHJhbmdlLlxuICovXG5leHBvcnQgY29uc3QgREJYX0RBVEVfVElNRV9GSUVMRF9USU1FX05PVF9JTl9SQU5HRV9FUlJPUiA9ICdkYXRlVGltZUZpZWxkVGltZU5vdEluUmFuZ2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICdkYXRldGltZS5maWVsZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRGJ4RGF0ZVRpbWVGaWVsZENvbXBvbmVudCBleHRlbmRzIEZpZWxkVHlwZTxGaWVsZFR5cGVDb25maWc8RGJ4RGF0ZVRpbWVGaWVsZFByb3BzPj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX3N1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSBfdmFsdWVTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX2F1dG9GaWxsRGF0ZVN5bmMgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgcHJpdmF0ZSBfY29uZmlnID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBsYXRlc3RDb25maWckID0gdGhpcy5fY29uZmlnLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICBwcml2YXRlIF9zeW5jQ29uZmlnT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPEFycmF5T3JWYWx1ZTxEYnhEYXRlVGltZUZpZWxkU3luY0ZpZWxkPj4+Pih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgX2RlZmF1bHRUaW1lem9uZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfdGltZURhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPE9ic2VydmFibGU8TWF5YmU8RGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnIHwgRm9ybUNvbnRyb2xQYXRoIHwgRGF0ZU9yRGF5U3RyaW5nPj4+Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIF9wcmVzZXRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPYnNlcnZhYmxlPERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdPj4ob2YoW10pKTtcblxuICBwcml2YXRlIF9mdWxsRGF5SW5wdXRDdHJsPzogRm9ybUNvbnRyb2w7XG4gIHByaXZhdGUgX2Z1bGxEYXlDb250cm9sT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxBYnN0cmFjdENvbnRyb2w8Ym9vbGVhbj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmdWxsRGF5Q29udHJvbCQgPSB0aGlzLl9mdWxsRGF5Q29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIHByaXZhdGUgX29mZnNldCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSBfZm9ybUNvbnRyb2xPYnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPEFic3RyYWN0Q29udHJvbDxNYXliZTxEYXRlPj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmb3JtQ29udHJvbCQgPSB0aGlzLl9mb3JtQ29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIHByaXZhdGUgX2NsZWFyZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF91cGRhdGVUaW1lID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIF9yZXN5bmNUaW1lSW5wdXRTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX3Jlc3luY1RpbWVJbnB1dCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcmVhZG9ubHkgdGltZUVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlciA9IHtcbiAgICBpc0Vycm9yU3RhdGU6IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsLCBmb3JtKSA9PiB7XG4gICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICByZXR1cm4gKGNvbnRyb2wuaW52YWxpZCAmJiAoY29udHJvbC5kaXJ0eSB8fCBjb250cm9sLnRvdWNoZWQpKSB8fCB0aGlzLmVycm9yU3RhdGVNYXRjaGVyLmlzRXJyb3JTdGF0ZSh0aGlzLmZvcm1Db250cm9sLCBmb3JtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmVhZG9ubHkgcmVzeW5jVGltZUlucHV0JCA9IHRoaXMuX3Jlc3luY1RpbWVJbnB1dC5waXBlKGRlYm91bmNlVGltZSgyMDApLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcHJpdmF0ZSBfY29uZmlnVXBkYXRlVGltZVN5bmMgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KFxuICAgIHRoaXMubGF0ZXN0Q29uZmlnJC5waXBlKHNraXAoMSkpLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlVGltZS5uZXh0KCk7XG4gICAgfSlcbiAgKTtcblxuICByZWFkb25seSB0aW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuX2RlZmF1bHRUaW1lem9uZS5waXBlKHN3aXRjaE1hcE1heWJlRGVmYXVsdCgpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5waXBlKFxuICAgIG1hcCgoZGVmYXVsdFRpbWV6b25lKSA9PiB7XG4gICAgICByZXR1cm4gZGVmYXVsdFRpbWV6b25lID8/IGd1ZXNzQ3VycmVudFRpbWV6b25lKCk7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWV6b25lSW5zdGFuY2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlPj4gPSB0aGlzLnRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgodGltZXpvbmUpID0+ICh0aW1lem9uZSA/IGRhdGVUaW1lem9uZVV0Y05vcm1hbCh7IHRpbWV6b25lIH0pIDogdW5kZWZpbmVkKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSB0aW1lRGF0ZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gdGhpcy5fdGltZURhdGUucGlwZShcbiAgICBzd2l0Y2hNYXBNYXliZURlZmF1bHQoKSxcbiAgICBzd2l0Y2hNYXAoKHgpID0+IHtcbiAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+O1xuXG4gICAgICBpZiAoeCkge1xuICAgICAgICAvLyBpZiB0aGUgc3RyaW5nIGlzIG5vdCBhIGRhdGUgc3RyaW5nLCB0aGVuIHRyZWF0IGl0IGFzIGEgcGF0aFxuICAgICAgICBpZiAoKHR5cGVvZiB4ID09PSAnc3RyaW5nJyAmJiAhaXNJU084NjAxRGF5U3RyaW5nU3RhcnQoeCkpIHx8IGlzRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnKHgpKSB7XG4gICAgICAgICAgY29uc3QgeyBwYXRoLCBtYXBWYWx1ZSB9OiBEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcgPSB0eXBlb2YgeCA9PT0gJ3N0cmluZycgPyB7IHBhdGg6IHggfSA6IHg7XG4gICAgICAgICAgb2JzID1cbiAgICAgICAgICAgIHN0cmVhbVZhbHVlRnJvbUNvbnRyb2w8RGF0ZU9yRGF5U3RyaW5nPih0aGlzLmZvcm0sIHBhdGgpPy5waXBlKFxuICAgICAgICAgICAgICBtYXAobWFwVmFsdWUgPz8gbWFwSWRlbnRpdHlGdW5jdGlvbigpKSxcbiAgICAgICAgICAgICAgbWFwKCh4KSA9PiAoeCA/IHRvSnNEYXlEYXRlKHgpIDogdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICkgPz8gb2YodW5kZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYnMgPSBvZih0b0pzRGF5RGF0ZSh4KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9icyA9IG9mKHVuZGVmaW5lZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYnM7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZURheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSB2YWx1ZUluU3lzdGVtVGltZXpvbmUkOiBPYnNlcnZhYmxlPE1heWJlPERhdGU+PiA9IHRoaXMuZm9ybUNvbnRyb2wkLnBpcGUoXG4gICAgbWFwKChjb250cm9sKSA9PiBjb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aDxNYXliZTxEYXRlIHwgSVNPODYwMURheVN0cmluZyB8IE1pbnV0ZU9mRGF5IHwgVW5peERhdGVUaW1lTnVtYmVyPj4oY29udHJvbC52YWx1ZSksIHNoYXJlUmVwbGF5KDEpKSksXG4gICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy50aW1lem9uZUluc3RhbmNlJCksXG4gICAgc3dpdGNoTWFwKChbeCwgdGltZXpvbmVJbnN0YW5jZV0pID0+IHtcbiAgICAgIHJldHVybiB4LnBpcGUobWFwKGRieERhdGVUaW1lSW5wdXRWYWx1ZVBhcnNlRmFjdG9yeSh0aGlzLnZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZSkpKTtcbiAgICB9KSxcbiAgICB0aHJvdHRsZVRpbWUoMjAsIHVuZGVmaW5lZCwgeyBsZWFkaW5nOiB0cnVlLCB0cmFpbGluZzogdHJ1ZSB9KSwgLy8gdGhyb3R0bGUgaW5jb21pbmcgdmFsdWVzIGFuZCB0aW1lem9uZSBjaGFuZ2VzXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZUhvdXJzQW5kTWludXRlcyksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSByZWZyZXNoSW50ZXJhbCQgPSBpbnRlcnZhbCgxMCAqIDEwMDApO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHRyaWdnZXIvZGlzcGxheSB2aXN1YWwgdXBkYXRlcyAoc3BlY2lmaWNhbGx5IG9uIHRpbWVEaXN0YW5jZSwgZXRjLikuXG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5VmFsdWUkID0gdGhpcy5yZWZyZXNoSW50ZXJhbCQucGlwZShcbiAgICAvLyBldmVyeSAxMCBzZWNvbmRzLCByZWZyZXNoIHcvaW50ZXJ2YWxcbiAgICBzdGFydFdpdGgoMCksXG4gICAgbWFwKCgpID0+IG5ldyBEYXRlKCkuZ2V0TWludXRlcygpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHRhcCgoKSA9PiB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpKSxcbiAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWVTdHJpbmckOiBPYnNlcnZhYmxlPFJlYWRhYmxlVGltZVN0cmluZyB8ICcnPiA9IHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gKHggPyB0b0xvY2FsUmVhZGFibGVUaW1lU3RyaW5nKHgpIDogJycpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZUlucHV0Q3RybCA9IG5ldyBGb3JtQ29udHJvbDxNYXliZTxEYXRlPj4obnVsbCwge1xuICAgIHZhbGlkYXRvcnM6IFtdXG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRpbWVJbnB1dEN0cmwgPSBuZXcgRm9ybUNvbnRyb2w8TWF5YmU8UmVhZGFibGVUaW1lU3RyaW5nPj4obnVsbCwge1xuICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnBhdHRlcm4oL14obm93KSR8XihbMC05XXwoMFswLTldKXwoMVswLTldKXwoMlswLTNdKSkoOik/KFswLTVdWzAtOV0pPyhcXHMpPyhbYXBBUF1bTW1dKT8oXFxcXHMpKiQvKV1cbiAgfSk7XG5cbiAgZ2V0IGRhdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmRhdGVMYWJlbCA/PyAnRGF0ZSc7XG4gIH1cblxuICBnZXQgdGltZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMudGltZUxhYmVsID8/ICdUaW1lJztcbiAgfVxuXG4gIGdldCBhbGxEYXlMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmFsbERheUxhYmVsID8/ICdBbGwgRGF5JztcbiAgfVxuXG4gIGdldCBhdFRpbWVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmF0VGltZUxhYmVsID8/ICdBdCc7XG4gIH1cblxuICBnZXQgZGF0ZU9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGltZU1vZGUgPT09IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5OT05FO1xuICB9XG5cbiAgZ2V0IGRhdGVUaW1lRmllbGQoKTogRGJ4RGF0ZVRpbWVGaWVsZFByb3BzIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcztcbiAgfVxuXG4gIGdldCB0aW1lT25seSgpOiBNYXliZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGltZVZhbHVlc09ubHkgPSB0aGlzLnZhbHVlTW9kZSA9PT0gRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUuTUlOVVRFX09GX0RBWTtcblxuICAgIGlmICh0aW1lVmFsdWVzT25seSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRmllbGQudGltZU9ubHk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFsd2F5c1Nob3dEYXRlSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYWx3YXlzU2hvd0RhdGVJbnB1dCA/PyB0cnVlO1xuICB9XG5cbiAgZ2V0IGF1dG9maWxsRGF0ZVdoZW5UaW1lSXNQaWNrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYXV0b2ZpbGxEYXRlV2hlblRpbWVJc1BpY2tlZCA/PyB0aGlzLmFsd2F5c1Nob3dEYXRlSW5wdXQgPT09IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHNob3dEYXRlSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnRpbWVPbmx5O1xuICB9XG5cbiAgZ2V0IHZhbHVlTW9kZSgpOiBEYnhEYXRlVGltZVZhbHVlTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMudmFsdWVNb2RlID8/IERieERhdGVUaW1lVmFsdWVNb2RlLkRBVEU7XG4gIH1cblxuICBnZXQgdGltZU1vZGUoKTogRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlIHtcbiAgICBjb25zdCBkYXRlVmFsdWVzT25seSA9IHRoaXMudmFsdWVNb2RlID09PSBEYnhEYXRlVGltZVZhbHVlTW9kZS5EQVlfU1RSSU5HO1xuXG4gICAgaWYgKGRhdGVWYWx1ZXNPbmx5KSB7XG4gICAgICByZXR1cm4gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWVPbmx5ID8gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVEIDogdGhpcy5kYXRlVGltZUZpZWxkLnRpbWVNb2RlID8/IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRDtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNEYXRlUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucmVxdWlyZWQgPz8gZmFsc2U7XG4gIH1cblxuICBnZXQgaXNUaW1lUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEYXRlUmVxdWlyZWQgJiYgdGhpcy50aW1lTW9kZSA9PT0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVEO1xuICB9XG5cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IE1heWJlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgZ2V0IGhpZGVEYXRlSGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5oaWRlRGF0ZUhpbnQgPz8gZmFsc2U7XG4gIH1cblxuICBnZXQgaGlkZURhdGVQaWNrZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuaGlkZURhdGVQaWNrZXIgPz8gZmFsc2U7XG4gIH1cblxuICBnZXQgdGltZXpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMudGltZXpvbmU7XG4gIH1cblxuICBnZXQgdGltZURhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMudGltZURhdGU7XG4gIH1cblxuICBnZXQgc2hvd1RpbWV6b25lKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnNob3dUaW1lem9uZSA/PyB0cnVlO1xuICB9XG5cbiAgZ2V0IHByZXNldHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMucHJlc2V0cztcbiAgfVxuXG4gIGdldCBzaG93Q2xlYXJCdXR0b24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuc2hvd0NsZWFyQnV0dG9uO1xuICB9XG5cbiAgZ2V0IG1pbnV0ZVN0ZXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMubWludXRlU3RlcCA/PyB0aGlzLmZpZWxkLnByb3BzLnN0ZXAgPz8gNTtcbiAgfVxuXG4gIHJlYWRvbmx5IGZ1bGxEYXkkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5mdWxsRGF5Q29udHJvbCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKGNvbnRyb2wpID0+IGNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKGNvbnRyb2wudmFsdWUpKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNob3dUaW1lSW5wdXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5mdWxsRGF5JC5waXBlKG1hcCgoeCkgPT4gIXggJiYgdGhpcy50aW1lTW9kZSAhPT0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkUpKTtcblxuICByZWFkb25seSBzaG93QWRkVGltZSQgPSB0aGlzLnNob3dUaW1lSW5wdXQkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAheCAmJiB0aGlzLnRpbWVNb2RlID09PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuT1BUSU9OQUwpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudERhdGUkID0gdGhpcy5kYXRlSW5wdXRDdHJsLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmRhdGVJbnB1dEN0cmwudmFsdWUpLCBzaGFyZVJlcGxheSgxKSk7XG4gIHJlYWRvbmx5IGRhdGUkID0gdGhpcy5jdXJyZW50RGF0ZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgdGltZXpvbmVBYmJyZXZpYXRpb24kID0gY29tYmluZUxhdGVzdChbdGhpcy5jdXJyZW50RGF0ZSQsIHRoaXMudGltZXpvbmUkLCB0aGlzLnRpbWVEYXRlJF0pLnBpcGUoXG4gICAgbWFwKChbZGF0ZSwgdGltZXpvbmUsIHRpbWVEYXRlXSkgPT4gZ2V0VGltZXpvbmVBYmJyZXZpYXRpb24odGltZXpvbmUsIHRpbWVEYXRlID8/IGRhdGUgPz8gbmV3IERhdGUoKSkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlVmFsdWUkOiBPYnNlcnZhYmxlPE1heWJlPERhdGU+PiA9IG1lcmdlKHRoaXMuZGF0ZSQsIHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJC5waXBlKHNraXBGaXJzdE1heWJlKCkpKS5waXBlKFxuICAgIG1hcCgoeDogTWF5YmU8RGF0ZT4pID0+ICh4ID8gc3RhcnRPZkRheSh4KSA6IG51bGwpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxNYXliZTxEYXRlPj4oaXNTYW1lRGF0ZURheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSB0aW1lSW5wdXQkOiBPYnNlcnZhYmxlPFJlYWRhYmxlVGltZVN0cmluZz4gPSB0aGlzLl91cGRhdGVUaW1lLnBpcGUoXG4gICAgZGVib3VuY2VUaW1lKDUpLFxuICAgIG1hcCgoKSA9PiB0aGlzLnRpbWVJbnB1dEN0cmwudmFsdWUgfHwgJycpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcblxuICByZWFkb25seSBzeW5jQ29uZmlnT2JzJCA9IHRoaXMuX3N5bmNDb25maWdPYnMucGlwZShzd2l0Y2hNYXBNYXliZURlZmF1bHQoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHBhcnNlZFN5bmNDb25maWdzJDogT2JzZXJ2YWJsZTxEYnhEYXRlVGltZUZpZWxkU3luY1BhcnNlZEZpZWxkW10+ID0gdGhpcy5zeW5jQ29uZmlnT2JzJC5waXBlKFxuICAgIG1hcCgoeCkgPT4ge1xuICAgICAgbGV0IHBhcnNlZDogRGJ4RGF0ZVRpbWVGaWVsZFN5bmNQYXJzZWRGaWVsZFtdO1xuXG4gICAgICBpZiAoeCkge1xuICAgICAgICBwYXJzZWQgPSBmaWx0ZXJNYXliZVZhbHVlcyhcbiAgICAgICAgICBhc0FycmF5KHgpLm1hcCgoeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoeS5zeW5jV2l0aCk7XG5cbiAgICAgICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udHJvbCxcbiAgICAgICAgICAgICAgICAuLi55XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWQgPSBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHN5bmNDb25maWdCZWZvcmVWYWx1ZSQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+ID0gc3luY0NvbmZpZ1ZhbHVlT2JzKHRoaXMucGFyc2VkU3luY0NvbmZpZ3MkLCAnYmVmb3JlJyk7XG4gIHJlYWRvbmx5IHN5bmNDb25maWdBZnRlclZhbHVlJDogT2JzZXJ2YWJsZTxEYXRlIHwgbnVsbD4gPSBzeW5jQ29uZmlnVmFsdWVPYnModGhpcy5wYXJzZWRTeW5jQ29uZmlncyQsICdhZnRlcicpO1xuXG4gIHJlYWRvbmx5IGlzVGltZUNsZWFyZWQkID0gY29tYmluZUxhdGVzdChbdGhpcy5jdXJyZW50RGF0ZSQsIHRoaXMuX3RpbWVEYXRlLnBpcGUoc3RhcnRXaXRoKG51bGwpKV0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbZGF0ZSwgdGltZV0pID0+IHtcbiAgICAgIGNvbnN0IGlzVGltZUNsZWFyZWQgPSBCb29sZWFuKCFkYXRlICYmICF0aW1lKTtcbiAgICAgIHJldHVybiB0aGlzLl9jbGVhcmVkLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB0cnVlKSxcbiAgICAgICAgc3RhcnRXaXRoKGlzVGltZUNsZWFyZWQpXG4gICAgICApO1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSByYXdEYXRlVGltZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fY29uZmlnLnBpcGUoXG4gICAgICBmaXJzdCgpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+ICh0aGlzLnRpbWVPbmx5ID8gb2YobnVsbCkgOiB0aGlzLmRhdGVWYWx1ZSQpKVxuICAgICksXG4gICAgdGhpcy50aW1lSW5wdXQkLnBpcGUoc3RhcnRXaXRoKG51bGwpKSxcbiAgICB0aGlzLmZ1bGxEYXkkLFxuICAgIHRoaXMudGltZURhdGUkLFxuICAgIHRoaXMuaXNUaW1lQ2xlYXJlZCRcbiAgXSkucGlwZShcbiAgICBtYXAoKFtkYXRlLCB0aW1lU3RyaW5nLCBmdWxsRGF5LCB0aW1lRGF0ZSwgaXNUaW1lQ2xlYXJlZF0pID0+IHtcbiAgICAgIGxldCByZXN1bHQ6IE1heWJlPERhdGU+O1xuXG4gICAgICBpZiAoIWlzVGltZUNsZWFyZWQpIHtcbiAgICAgICAgaWYgKCFkYXRlIHx8IHRoaXMudGltZU9ubHkpIHtcbiAgICAgICAgICBkYXRlID0gdGltZURhdGUgPz8gbmV3IERhdGUoKTsgLy8gdXNlIHRoZSB0aW1lIGRhdGUsIG9yIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgZGF5XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIGlmIChmdWxsRGF5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRlVGltZUZpZWxkLmZ1bGxEYXlJblVUQykge1xuICAgICAgICAgICAgICByZXN1bHQgPSB1dGNEYXlGb3JEYXRlKGRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gc3RhcnRPZkRheShkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVTdHJpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAgIHJlYWRhYmxlVGltZVN0cmluZ1RvRGF0ZSh0aW1lU3RyaW5nLCB7XG4gICAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgICB1c2VTeXN0ZW1UaW1lem9uZTogdHJ1ZVxuICAgICAgICAgICAgICB9KSA/PyBkYXRlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudGltZU9ubHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVNb2RlICE9PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQpIHtcbiAgICAgICAgICAgICAgLy8gb25seSBhdXRvZmlsbCB0aGUgZGF0ZSBpZiB0aGUgdGltZSBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgKGFuZCB0aGUgdGltZSBzdHJpbmcgaXMgZW1wdHkpXG4gICAgICAgICAgICAgIHJlc3VsdCA9IGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZUhvdXJzQW5kTWludXRlcyksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlVGltZVBpY2tlckNvbmZpZyQ6IE9ic2VydmFibGU8TWF5YmU8RGJ4RGF0ZVRpbWVQaWNrZXJDb25maWd1cmF0aW9uPj4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9jb25maWcucGlwZShzd2l0Y2hNYXBNYXliZU9icygpKSwgdGhpcy5zeW5jQ29uZmlnQmVmb3JlVmFsdWUkLCB0aGlzLnN5bmNDb25maWdBZnRlclZhbHVlJF0pLnBpcGUoXG4gICAgbWFwKChbeCwgZGF0ZUlucHV0TWluLCBkYXRlSW5wdXRNYXhdKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0OiBNYXliZTxEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24+ID0geDtcblxuICAgICAgaWYgKGRhdGVJbnB1dE1pbiAhPSBudWxsIHx8IGRhdGVJbnB1dE1heCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHsgbWluOiBsaW1pdE1pbiwgbWF4OiBsaW1pdE1heCB9ID0geD8ubGltaXRzID8/IHt9O1xuICAgICAgICBjb25zdCBtaW4gPSBmaW5kTWluRGF0ZShbZGF0ZUlucHV0TWluLCBkYXRlRnJvbUxvZ2ljYWxEYXRlKGxpbWl0TWluKV0pO1xuICAgICAgICBjb25zdCBtYXggPSBmaW5kTWF4RGF0ZShbZGF0ZUlucHV0TWF4LCBkYXRlRnJvbUxvZ2ljYWxEYXRlKGxpbWl0TWF4KV0pO1xuXG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAuLi54LFxuICAgICAgICAgIGxpbWl0czoge1xuICAgICAgICAgICAgLi4ueD8ubGltaXRzLFxuICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgbWF4XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlSW5wdXRNaW4kOiBPYnNlcnZhYmxlPERhdGUgfCBudWxsPiA9IHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeD8ubGltaXRzPy5taW4gPz8gbnVsbCkgYXMgRGF0ZSB8IG51bGwpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkPERhdGUgfCBudWxsPihpc1NhbWVEYXRlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVJbnB1dE1heCQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+ID0gdGhpcy5kYXRlVGltZVBpY2tlckNvbmZpZyQucGlwZShcbiAgICBtYXAoKHgpID0+ICh4Py5saW1pdHM/Lm1heCA/PyBudWxsKSBhcyBEYXRlIHwgbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQ8RGF0ZSB8IG51bGw+KGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGEgbGltaXRlZCBtaW4vbWF4IGRhdGUgcmFuZ2UgYXBwbGllZC9hdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBoYXNSZXN0cmljdGVkRGF0ZVJhbmdlJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF0ZUlucHV0TWluJCwgdGhpcy5kYXRlSW5wdXRNYXgkXSkucGlwZShcbiAgICBtYXAoKFthLCBiXSkgPT4gQm9vbGVhbihhIHx8IGIpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZU1pbkFuZE1heElzU2FtZURheSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRhdGVJbnB1dE1pbiQsIHRoaXMuZGF0ZUlucHV0TWF4JF0pLnBpcGUoXG4gICAgbWFwKChbYSwgYl0pID0+IEJvb2xlYW4oYSAmJiBiKSAmJiBpc1NhbWVEYXRlRGF5KGEsIGIpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgcGlja2VyRmlsdGVyJDogT2JzZXJ2YWJsZTxEZWNpc2lvbkZ1bmN0aW9uPERhdGUgfCBudWxsPj4gPSB0aGlzLmRhdGVUaW1lUGlja2VyQ29uZmlnJC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgbWFwKCh4KSA9PiB7XG4gICAgICBpZiAoeCkge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBkYXRlVGltZU1pbnV0ZVdob2xlRGF5RGVjaXNpb25GdW5jdGlvbih4LCBmYWxzZSk7XG4gICAgICAgIHJldHVybiAoeDogRGF0ZSB8IG51bGwpID0+ICh4ICE9IG51bGwgPyBmaWx0ZXIoeCkgOiB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdFBpY2tlckZpbHRlcjogRGVjaXNpb25GdW5jdGlvbjxEYXRlIHwgbnVsbD4gPSAoKSA9PiB0cnVlO1xuXG4gIHJlYWRvbmx5IHRpbWVPdXRwdXQkOiBPYnNlcnZhYmxlPE1heWJlPERhdGU+PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMucmF3RGF0ZVRpbWUkLCB0aGlzLl9vZmZzZXQsIHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckXSkucGlwZShcbiAgICB0aHJvdHRsZVRpbWUoVElNRV9PVVRQVVRfVEhST1RUTEVfVElNRSwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IGZhbHNlLCB0cmFpbGluZzogdHJ1ZSB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoY3VycmVudCwgbmV4dCkgPT4gY3VycmVudFswXSA9PT0gbmV4dFswXSAmJiBuZXh0WzFdID09PSAwICYmIGN1cnJlbnRbMl0gPT09IG5leHRbMl0pLFxuICAgIHRhcCgoWywgc3RlcHNPZmZzZXRdKSA9PiAoc3RlcHNPZmZzZXQgPyB0aGlzLl9vZmZzZXQubmV4dCgwKSA6IDApKSxcbiAgICBtYXAoKFtkYXRlLCBzdGVwc09mZnNldCwgY29uZmlnXSkgPT4ge1xuICAgICAgaWYgKGRhdGUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEYXRlVGltZU1pbnV0ZUluc3RhbmNlKHtcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICByb3VuZERvd25Ub01pbnV0ZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBvbmx5IGNsYW1wIHdoZW4gdGhlIHN0ZXBzIG9mZnNldCBpcyBzZXRcbiAgICAgICAgaWYgKHN0ZXBzT2Zmc2V0KSB7XG4gICAgICAgICAgZGF0ZSA9IGluc3RhbmNlLmNsYW1wKGRhdGUpO1xuXG4gICAgICAgICAgY29uc3QgbWludXRlcyA9IHN0ZXBzT2Zmc2V0ICogdGhpcy5taW51dGVTdGVwO1xuXG4gICAgICAgICAgaWYgKG1pbnV0ZXMgIT0gMCkge1xuICAgICAgICAgICAgZGF0ZSA9IGFkZE1pbnV0ZXMoZGF0ZSwgbWludXRlcyk7XG4gICAgICAgICAgICBkYXRlID0gaW5zdGFuY2UuY2xhbXAoZGF0ZSk7IC8vIGNsYW1wIHRoZSBkYXRlIGFnYWluXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVIb3Vyc0FuZE1pbnV0ZXMpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZVRpbWVQaWNrZXJJbnN0YW5jZSQgPSB0aGlzLmRhdGVUaW1lUGlja2VyQ29uZmlnJC5waXBlKFxuICAgIG1hcCgoY29uZmlnKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lTWludXRlSW5zdGFuY2Uoe1xuICAgICAgICAuLi5jb25maWcsXG4gICAgICAgIHJvdW5kRG93blRvTWludXRlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGhhc0VtcHR5RGlzcGxheVZhbHVlJCA9IHRoaXMuZGlzcGxheVZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gIXgpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBwcmVzZXRzJDogT2JzZXJ2YWJsZTxEYXRlVGltZVByZXNldFtdPiA9IHRoaXMuX3ByZXNldHMucGlwZShcbiAgICBzd2l0Y2hNYXBNYXliZU9icygpLFxuICAgIG1hcCgoeDogRGF0ZVRpbWVQcmVzZXRDb25maWd1cmF0aW9uW10pID0+IHgubWFwKGRhdGVUaW1lUHJlc2V0KSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzaG93Q2xlYXJCdXR0b24kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5oYXNFbXB0eURpc3BsYXlWYWx1ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IEJvb2xlYW4odGhpcy5zaG93Q2xlYXJCdXR0b24gJiYgIXgpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY2FuQXV0b2ZpbGxEYXRlV2l0aE9ubHlBdmFpbGFibGVEYXRlJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuZGF0ZU1pbkFuZE1heElzU2FtZURheSQ7XG5cbiAgcmVhZG9ubHkgc2hvd0RhdGVJbnB1dCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmRhdGVNaW5BbmRNYXhJc1NhbWVEYXkkLnBpcGUoXG4gICAgbWFwKChkYXRlTWluQW5kTWF4SXNTYW1lRGF5KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93RGF0ZUlucHV0ICYmICh0aGlzLmFsd2F5c1Nob3dEYXRlSW5wdXQgfHwgIWRhdGVNaW5BbmRNYXhJc1NhbWVEYXkpO1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50RXJyb3JNZXNzYWdlJCA9IHRoaXMuZm9ybUNvbnRyb2wkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChmb3JtQ29udHJvbCkgPT5cbiAgICAgIGZvcm1Db250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShcbiAgICAgICAgZmlsdGVyKCh4KSA9PiB4ID09PSAnSU5WQUxJRCcgfHwgeCA9PT0gJ1ZBTElEJyksXG4gICAgICAgIG1hcCgoeCkgPT4ge1xuICAgICAgICAgIGxldCBjdXJyZW50RXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoeCA9PT0gJ0lOVkFMSUQnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgICAgICAgICBjdXJyZW50RXJyb3JNZXNzYWdlID0gJ0RhdGUgaXMgcmVxdWlyZWQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1Db250cm9sLmhhc0Vycm9yKERCWF9EQVRFX1RJTUVfRklFTERfREFURV9OT1RfSU5fU0NIRURVTEVfRVJST1IpKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFcnJvck1lc3NhZ2UgPSAnRGF0ZSBkb2VzIG5vdCBmYWxsIG9uIGFuIGF2YWlsYWJsZSBkYXRlcyBpbiBzY2hlZHVsZS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1Db250cm9sLmhhc0Vycm9yKERCWF9EQVRFX1RJTUVfRklFTERfVElNRV9OT1RfSU5fUkFOR0VfRVJST1IpKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFcnJvck1lc3NhZ2UgPSAnVGltZSBpcyBub3QgdmFsaWQgZm9yIHRoZSBnaXZlbiBkYXRlLic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjdXJyZW50RXJyb3JNZXNzYWdlID0gJ1RoZSBnaXZlbiBkYXRlIGFuZCB0aW1lIGlzIGludmFsaWQuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudEVycm9yTWVzc2FnZTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApLFxuICAgIHN0YXJ0V2l0aCh1bmRlZmluZWQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaGFzRXJyb3IkID0gdGhpcy5jdXJyZW50RXJyb3JNZXNzYWdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gQm9vbGVhbih4KSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHJlYWRvbmx5IGRieERhdGVUaW1lRmllbGRDb25maWdTZXJ2aWNlOiBEYnhEYXRlVGltZUZpZWxkTWVudVByZXNldHNTZXJ2aWNlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2Zvcm1Db250cm9sT2JzLm5leHQodGhpcy5mb3JtQ29udHJvbCk7XG5cbiAgICBjb25zdCBpbnB1dFBpY2tlckNvbmZpZyA9IHRoaXMuZGF0ZVRpbWVGaWVsZC5waWNrZXJDb25maWc7XG4gICAgdGhpcy5fY29uZmlnLm5leHQoaW5wdXRQaWNrZXJDb25maWcgPyBhc09ic2VydmFibGVGcm9tR2V0dGVyKGlucHV0UGlja2VyQ29uZmlnKSA6IG9mKHt9KSk7XG4gICAgdGhpcy5fc3luY0NvbmZpZ09icy5uZXh0KHRoaXMuZGF0ZVRpbWVGaWVsZC5nZXRTeW5jRmllbGRzT2JzPy4oKSk7XG5cbiAgICB0aGlzLl9zdWIuc3Vic2NyaXB0aW9uID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkXG4gICAgICAucGlwZShcbiAgICAgICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy50aW1lem9uZUluc3RhbmNlJC5waXBlKG1hcCgodGltZXpvbmVJbnN0YW5jZSkgPT4gZGJ4RGF0ZVRpbWVPdXRwdXRWYWx1ZUZhY3RvcnkodGhpcy52YWx1ZU1vZGUsIHRpbWV6b25lSW5zdGFuY2UpKSkpLFxuICAgICAgICB0aHJvdHRsZVRpbWUoVElNRV9PVVRQVVRfVEhST1RUTEVfVElNRSwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IGZhbHNlLCB0cmFpbGluZzogdHJ1ZSB9KSxcbiAgICAgICAgc3dpdGNoTWFwKChbY3VycmVudFZhbHVlLCB2YWx1ZUZhY3RvcnldKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudGltZU91dHB1dCQucGlwZShcbiAgICAgICAgICAgIHRocm90dGxlVGltZShUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FICogMiwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IGZhbHNlLCB0cmFpbGluZzogdHJ1ZSB9KSxcbiAgICAgICAgICAgIHNraXBGaXJzdE1heWJlKCksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlSG91cnNBbmRNaW51dGVzKSxcbiAgICAgICAgICAgIG1hcCgoeCkgPT4gdmFsdWVGYWN0b3J5KHgpKSxcbiAgICAgICAgICAgIGZpbHRlcigoeCkgPT4gIWRieERhdGVUaW1lSXNTYW1lRGF0ZVRpbWVGaWVsZFZhbHVlKHgsIGN1cnJlbnRWYWx1ZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgfSk7XG5cbiAgICBsZXQgaGFzU2V0TWlkbmlnaHRGcm9tSW5wdXQgPSBmYWxzZTtcblxuICAgIC8qXG4gICAgdGhpcy5fdmFsdWVTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy50aW1lU3RyaW5nJC5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHRoaXMuc2V0VGltZSh4KTtcbiAgICB9KTtcbiAgICAqL1xuXG4gICAgaWYgKHRoaXMuYXV0b2ZpbGxEYXRlV2hlblRpbWVJc1BpY2tlZCkge1xuICAgICAgdGhpcy5fYXV0b0ZpbGxEYXRlU3luYy5zdWJzY3JpcHRpb24gPSB0aGlzLmNhbkF1dG9maWxsRGF0ZVdpdGhPbmx5QXZhaWxhYmxlRGF0ZSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChjYW5BdXRvZmlsbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNhbkF1dG9maWxsKSB7XG4gICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHRpbWUgdXBkYXRlcyB0aGUgZmlyc3QgdGltZSwgc2V0IHRoZSBjdXJyZW50IG1pbiBkYXRlXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVUaW1lLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCh4KSA9PiB0aGlzLmRhdGVJbnB1dE1pbiQpLFxuICAgICAgICAgICAgICAgIGZpbHRlck1heWJlKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTsgLy8gZG9uJ3Qgc2hvdyBhbnl0aGluZ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoYXV0b0RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoYXV0b0RhdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kYXRlSW5wdXRDdHJsLnNldFZhbHVlKGF1dG9EYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX3ZhbHVlU3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoeCkgPT4gKHggPyBpc1NhbWVEYXRlKHgsIHN0YXJ0T2ZEYXkoeCkpIDogZmFsc2UpKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgc3dpdGNoTWFwKChpc0lucHV0VmFsdWVBdE1pZG5pZ2h0KSA9PiB7XG4gICAgICAgICAgaGFzU2V0TWlkbmlnaHRGcm9tSW5wdXQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gdGhpcy50aW1lU3RyaW5nJC5waXBlKFxuICAgICAgICAgICAgLy8gc2tpcCgxKSxcbiAgICAgICAgICAgIG1hcCgodGltZVN0cmluZykgPT4gW3RpbWVTdHJpbmcsIGlzSW5wdXRWYWx1ZUF0TWlkbmlnaHRdIGFzIFtzdHJpbmcsIGJvb2xlYW5dKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbeCwgaXNJbnB1dFZhbHVlQXRNaWRuaWdodF0pID0+IHtcbiAgICAgICAgLy8gU2tpcCBldmVudHMgd2hlcmUgdGhlIHRpbWVJbnB1dCB2YWx1ZSBpcyBjbGVhcmVkLCB1bmxlc3MgdGhlIGlucHV0IHZhbHVlIGlzIGF0IG1pZG5pZ2h0IGFuZCB3ZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCBpdCBiZWluZyBhdCBtaWRuaWdodFxuICAgICAgICBpZiAoIXRoaXMudGltZUlucHV0Q3RybC52YWx1ZSAmJiB4ID09PSAnMTI6MDBBTScgJiYgKCFpc0lucHV0VmFsdWVBdE1pZG5pZ2h0IHx8IChpc0lucHV0VmFsdWVBdE1pZG5pZ2h0ICYmIGhhc1NldE1pZG5pZ2h0RnJvbUlucHV0KSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgdGhlIGhhcyBzZXQgZmxhZ1xuICAgICAgICBpZiAoeCA9PT0gJzEyOjAwQU0nICYmIGlzSW5wdXRWYWx1ZUF0TWlkbmlnaHQpIHtcbiAgICAgICAgICBoYXNTZXRNaWRuaWdodEZyb21JbnB1dCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFRpbWUoeCk7XG4gICAgICB9KTtcblxuICAgIC8vIFNldCBkZWZhdWx0IHRpbWV6b25lIGlmIHByb3ZpZGVkLlxuICAgIGlmICh0aGlzLnRpbWV6b25lICYmICF0aGlzLmRhdGVUaW1lRmllbGQuZnVsbERheUluVVRDKSB7XG4gICAgICB0aGlzLl9kZWZhdWx0VGltZXpvbmUubmV4dChhc09ic2VydmFibGVGcm9tR2V0dGVyKHRoaXMudGltZXpvbmUpKTtcbiAgICB9XG5cbiAgICB0aGlzLl90aW1lRGF0ZS5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy50aW1lRGF0ZSkpO1xuXG4gICAgLy8gV2F0Y2ggZm9yIGRpc2FibGVkIGNoYW5nZXMgc28gd2UgY2FuIHByb3BvZ2F0ZSB0aGVtIHByb3Blcmx5LlxuICAgIHRoaXMuZm9ybUNvbnRyb2wucmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKChpc0Rpc2FibGVkKSA9PiB7XG4gICAgICB0b2dnbGVEaXNhYmxlRm9ybUNvbnRyb2wodGhpcy5kYXRlSW5wdXRDdHJsLCBpc0Rpc2FibGVkKTtcbiAgICAgIHRvZ2dsZURpc2FibGVGb3JtQ29udHJvbCh0aGlzLnRpbWVJbnB1dEN0cmwsIGlzRGlzYWJsZWQpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaXNGdWxsRGF5RmllbGQgPSB0aGlzLmRhdGVUaW1lRmllbGQuZnVsbERheUZpZWxkTmFtZTtcbiAgICBsZXQgZnVsbERheUZpZWxkQ3RybDogTWF5YmU8QWJzdHJhY3RDb250cm9sPjtcblxuICAgIGlmIChpc0Z1bGxEYXlGaWVsZCkge1xuICAgICAgZnVsbERheUZpZWxkQ3RybCA9IHRoaXMuZm9ybS5nZXQoaXNGdWxsRGF5RmllbGQpO1xuICAgIH1cblxuICAgIGlmICghZnVsbERheUZpZWxkQ3RybCkge1xuICAgICAgY29uc3QgaXNGdWxsRGF5ID0gdGhpcy50aW1lTW9kZSA9PT0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkU7XG4gICAgICB0aGlzLl9mdWxsRGF5SW5wdXRDdHJsID0gbmV3IEZvcm1Db250cm9sKGlzRnVsbERheSk7XG5cbiAgICAgIC8vIFNldCB0aGUgY29udHJvbCBpbiB0aGUgZm9ybSB0b28gaWYgdGhlIG5hbWUgaXMgZGVmaW5lZC5cbiAgICAgIGlmIChpc0Z1bGxEYXlGaWVsZCkge1xuICAgICAgICAodGhpcy5mb3JtIGFzIEZvcm1Hcm91cCkuYWRkQ29udHJvbChpc0Z1bGxEYXlGaWVsZCwgdGhpcy5fZnVsbERheUlucHV0Q3RybCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bGxEYXlGaWVsZEN0cmwgPSB0aGlzLl9mdWxsRGF5SW5wdXRDdHJsO1xuICAgIH1cblxuICAgIHRoaXMuX2Z1bGxEYXlDb250cm9sT2JzLm5leHQoZnVsbERheUZpZWxkQ3RybCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMudGltZU1vZGUpIHtcbiAgICAgIGNhc2UgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk9QVElPTkFMOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkU6XG4gICAgICAgIHRoaXMucmVtb3ZlVGltZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVEOlxuICAgICAgICB0aGlzLmFkZFRpbWUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJlc2V0cyAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9wcmVzZXRzLm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLnByZXNldHMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcHJlc2V0cy5uZXh0KHRoaXMuZGJ4RGF0ZVRpbWVGaWVsZENvbmZpZ1NlcnZpY2UuY29uZmlndXJhdGlvbnMkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXN5bmNUaW1lSW5wdXRTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy5yZXN5bmNUaW1lSW5wdXQkLnBpcGUoc3dpdGNoTWFwKCh4KSA9PiBjb21iaW5lTGF0ZXN0KFt0aGlzLmN1cnJlbnREYXRlJCwgdGhpcy50aW1lU3RyaW5nJF0pLnBpcGUoZmlyc3QoKSkpKS5zdWJzY3JpYmUoKFtjdXJyZW50RGF0ZSwgdGltZVN0cmluZ10pID0+IHtcbiAgICAgIC8vIG9ubHkgcmVzeW5jIHdoZW4gdGhlIGN1cnJlbnQgZGF0ZSBpcyBzZXQsIG90aGVyd2lzZSBkbyBub3QgY2hhbmdlIHRoZSB0aW1lIHN0cmluZy5cbiAgICAgIC8vIFRoaXMgaGVscHMgaW4gY2FzZXMgd2hlcmUgdGhlIHVzZXIgcGlja3MgYSB0aW1lIGZpcnN0IGFuZCB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIGNsZWFyZWQuXG4gICAgICBpZiAoY3VycmVudERhdGUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnRpbWVJbnB1dEN0cmwuc2V0VmFsdWUodGltZVN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gYWRkIHZhbGlkYXRvcnMvZXJyb3JzIGZvciB0aGUgZm9ybVxuICAgIHRoaXMuZm9ybUNvbnRyb2wuYWRkQXN5bmNWYWxpZGF0b3JzKFtcbiAgICAgICh4KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHgudmFsdWUgYXMgTWF5YmU8RGF0ZT47XG4gICAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycz47XG5cbiAgICAgICAgaWYgKGZvcm1WYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb2JzID0gY29tYmluZUxhdGVzdChbdGhpcy50aW1lem9uZUluc3RhbmNlJCwgdGhpcy5kYXRlVGltZVBpY2tlckluc3RhbmNlJF0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKFt0aW1lem9uZUluc3RhbmNlLCB4XSkgPT4ge1xuICAgICAgICAgICAgICAvLyB0aGUgZm9ybSB2YWx1ZSBpcyBnb2luZyB0byBiZSBpbiB0aGUgb3V0cHV0IGZvcm0sIHNvIHdlIG5lZWQgdG8gcGFyc2UgaXQgYmFjayB0byB0aGUgXCJpbnB1dFwiIGRhdGUgYmVmb3JlIGV2YWx1YXRpbmcgaXRcbiAgICAgICAgICAgICAgY29uc3QgZm9ybVZhbHVlSW5TeXN0ZW1UaW1lem9uZSA9IGRieERhdGVUaW1lSW5wdXRWYWx1ZVBhcnNlRmFjdG9yeSh0aGlzLnZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZSkoZm9ybVZhbHVlKTtcblxuICAgICAgICAgICAgICBsZXQgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMudGltZUlucHV0Q3RybC5lcnJvcnNcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlSW5TeXN0ZW1UaW1lem9uZSkge1xuICAgICAgICAgICAgICAgIGlmICh4LmRhdGVJc0luU2NoZWR1bGUoZm9ybVZhbHVlSW5TeXN0ZW1UaW1lem9uZSkpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgheC5pc0luVmFsaWRSYW5nZShmb3JtVmFsdWVJblN5c3RlbVRpbWV6b25lKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgW0RCWF9EQVRFX1RJTUVfRklFTERfVElNRV9OT1RfSU5fUkFOR0VfRVJST1JdOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGVycm9ycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgW0RCWF9EQVRFX1RJTUVfRklFTERfREFURV9OT1RfSU5fU0NIRURVTEVfRVJST1JdOiB0cnVlXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpcnN0KClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9icyA9IG9mKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYnM7XG4gICAgICB9XG4gICAgXSk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuX3N1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fdmFsdWVTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2NvbmZpZy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2NvbmZpZ1VwZGF0ZVRpbWVTeW5jLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9kZWZhdWx0VGltZXpvbmUuY29tcGxldGUoKTtcbiAgICB0aGlzLl9yZXN5bmNUaW1lSW5wdXRTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2F1dG9GaWxsRGF0ZVN5bmMuZGVzdHJveSgpO1xuICAgIHRoaXMuX3RpbWVEYXRlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcHJlc2V0cy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2Z1bGxEYXlDb250cm9sT2JzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fb2Zmc2V0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMuY29tcGxldGUoKTtcbiAgICB0aGlzLl91cGRhdGVUaW1lLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fY2xlYXJlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3Jlc3luY1RpbWVJbnB1dC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3N5bmNDb25maWdPYnMuY29tcGxldGUoKTtcbiAgfVxuXG4gIHNlbGVjdFByZXNldChwcmVzZXQ6IERhdGVUaW1lUHJlc2V0KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSBwcmVzZXQudmFsdWUoKTtcblxuICAgIGlmICh2YWx1ZS5sb2dpY2FsRGF0ZSkge1xuICAgICAgdGhpcy5zZXRMb2dpY2FsVGltZSh2YWx1ZS5sb2dpY2FsRGF0ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50aW1lU3RyaW5nKSB7XG4gICAgICB0aGlzLnNldFRpbWUodmFsdWUudGltZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgZGF0ZVBpY2tlZChldmVudDogTWF0RGF0ZXBpY2tlcklucHV0RXZlbnQ8RGF0ZT4pOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlID0gZXZlbnQudmFsdWU7XG5cbiAgICBpZiAoZGF0ZSkge1xuICAgICAgdGhpcy5zZXREYXRlSW5wdXRWYWx1ZShkYXRlKTtcbiAgICB9XG4gIH1cblxuICBzZXRMb2dpY2FsVGltZSh0aW1lOiBMb2dpY2FsRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGUgPSBkYXRlRnJvbUxvZ2ljYWxEYXRlKHRpbWUpO1xuXG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIHRoaXMuc2V0VGltZUZyb21EYXRlKGRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHNldERhdGVJbnB1dFZhbHVlKGRhdGU6IERhdGUpIHtcbiAgICB0aGlzLmRhdGVJbnB1dEN0cmwuc2V0VmFsdWUoZGF0ZSk7XG4gICAgdGhpcy5fdXBkYXRlVGltZS5uZXh0KCk7XG4gIH1cblxuICBzZXRUaW1lRnJvbURhdGUodGltZURhdGU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lU3RyaW5nID0gdG9Mb2NhbFJlYWRhYmxlVGltZVN0cmluZyh0aW1lRGF0ZSk7XG4gICAgdGhpcy5zZXRUaW1lKHRpbWVTdHJpbmcpO1xuICB9XG5cbiAgc2V0VGltZSh0aW1lOiBSZWFkYWJsZVRpbWVTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lSW5wdXRDdHJsLnZhbHVlICE9PSB0aW1lKSB7XG4gICAgICB0aGlzLnRpbWVJbnB1dEN0cmwuc2V0VmFsdWUodGltZSk7XG4gICAgICB0aGlzLl9vZmZzZXQubmV4dCgwKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpbWUubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGtleWRvd25PbkRhdGVJbnB1dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGxldCBkaXJlY3Rpb24gPSAwO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXk/LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICBkaXJlY3Rpb24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Fycm93ZG93bic6XG4gICAgICAgIGRpcmVjdGlvbiA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBsZXQgb2Zmc2V0ID0gMTtcblxuICAgIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSAzNjU7XG4gICAgfSBlbHNlIGlmIChldmVudC5jdHJsS2V5KSB7XG4gICAgICBvZmZzZXQgPSAzMDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSA3O1xuICAgIH1cblxuICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF0ZSQsIHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckXSlcbiAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgLnN1YnNjcmliZSgoW2RhdGUsIGNvbmZpZ10pID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdEYXRlID0gc3RhcnRPZkRheShhZGREYXlzKGRhdGUsIG9mZnNldCAqIGRpcmVjdGlvbikpO1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERhdGVUaW1lTWludXRlSW5zdGFuY2Uoe1xuICAgICAgICAgICAgZGF0ZTogbmV3RGF0ZSxcbiAgICAgICAgICAgIC4uLmNvbmZpZ1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgbmV4dERhdGUgPSBpbnN0YW5jZS5pc0luU2NoZWR1bGUobmV3RGF0ZSkgPyBuZXdEYXRlIDogaW5zdGFuY2UuZmluZE5leHRBdmFpbGFibGVEYXlJblNjaGVkdWxlKG5ld0RhdGUsIGRpcmVjdGlvbiA9PT0gMSA/ICdmdXR1cmUnIDogJ3Bhc3QnKTtcblxuICAgICAgICAgIGlmIChuZXh0RGF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldERhdGVJbnB1dFZhbHVlKGluc3RhbmNlLmNsYW1wVG9MaW1pdChuZXh0RGF0ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAga2V5ZG93bk9uVGltZUlucHV0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgbGV0IGRpcmVjdGlvbiA9IDA7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleT8udG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnYXJyb3d1cCc6XG4gICAgICAgIGRpcmVjdGlvbiA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXJyb3dkb3duJzpcbiAgICAgICAgZGlyZWN0aW9uID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXQgPSAxO1xuXG4gICAgaWYgKGV2ZW50LmFsdEtleSAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgb2Zmc2V0ID0gMzAwO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICBvZmZzZXQgPSA2MDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSA1O1xuICAgIH1cblxuICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgIHRoaXMuX29mZnNldC5uZXh0KHRoaXMuX29mZnNldC52YWx1ZSArIG9mZnNldCAqIGRpcmVjdGlvbik7XG4gICAgICB0aGlzLl91cGRhdGVUaW1lLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBmb2N1c1RpbWUoKTogdm9pZCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgZm9jdXNPdXRUaW1lKCk6IHZvaWQge1xuICAgIC8vIG9ubHkgcmVmcmVzaCB3aGVuIHRoZXJlIGlzIG5vdCBhIHBhdHRlcm4gZXJyb3JcbiAgICBpZiAoIXRoaXMudGltZUlucHV0Q3RybC5oYXNFcnJvcigncGF0dGVybicpKSB7XG4gICAgICB0aGlzLl91cGRhdGVUaW1lLm5leHQoKTtcbiAgICAgIHRoaXMuX3Jlc3luY1RpbWVJbnB1dC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgYWRkVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldEZ1bGxEYXkoZmFsc2UpO1xuICB9XG5cbiAgcmVtb3ZlVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldEZ1bGxEYXkodHJ1ZSk7XG4gIH1cblxuICBzZXRGdWxsRGF5KGZ1bGxEYXk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmZ1bGxEYXlDb250cm9sJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgeC5zZXRWYWx1ZShmdWxsRGF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyVmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJlZC5uZXh0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkYngtZGF0ZXRpbWUtZmllbGRcIiBmeExheW91dD1cInJvdyB3cmFwXCIgZnhMYXlvdXQueHM9XCJjb2x1bW4gd3JhcFwiIGZ4TGF5b3V0R2FwPVwiNnB4IGdyaWRcIiBmeExheW91dEFsaWduPVwic3BhY2UtZXZlbmx5IHN0cmV0Y2hcIj5cbiAgPCEtLSBEYXRlIC0tPlxuICA8ZGl2IGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvd1wiIGZ4RmxleC5sdC1zbT1cIjEwMFwiIFtmeEZsZXhdPVwiZGF0ZU9ubHkgPyAnMTAwJyA6ICc1MCdcIiAqbmdJZj1cInNob3dEYXRlSW5wdXQkIHwgYXN5bmNcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGF0ZUlucHV0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDwhLS0gVGltZSAtLT5cbiAgPGRpdiBjbGFzcz1cImRieC1kYXRldGltZS1yb3dcIiBmeEZsZXgubHQtc209XCIxMDBcIiBbZnhGbGV4XT1cIihzaG93RGF0ZUlucHV0JCB8IGFzeW5jKSA/ICc1MCcgOiAnMTAwJ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93VGltZUlucHV0JCB8IGFzeW5jXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGltZU1lbnVBbmRJbnB1dFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdiAqbmdJZj1cInNob3dBZGRUaW1lJCB8IGFzeW5jXCIgY2xhc3M9XCJhZGQtdGltZS1idXR0b24td3JhcHBlclwiPlxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwibWF0LWRhdGVwaWNrZXItYnV0dG9uLWhpZ2hsaWdodCBkYngtYnV0dG9uLXNwYWNlciBhZGQtdGltZS1idXR0b25cIiBuZ0NsYXNzLmx0LXNtPVwiYWRkLXRpbWUtYnV0dG9uLWZ1bGxcIiAoY2xpY2spPVwiYWRkVGltZSgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj50aW1lcjwvbWF0LWljb24+XG4gICAgICAgIEFkZCBUaW1lXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDwhLS0gRGF0ZSBIaW50IC0tPlxuICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJoYXNFcnJvciQgfCBhc3luY1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImZhbHNlXCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWhpZGVEYXRlSGludFwiIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvdyBkYngtZGF0ZXRpbWUtaGludC1yb3dcIiBmeEZsZXg9XCIxMDBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRieC1oaW50XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiaGFzRW1wdHlEaXNwbGF5VmFsdWUkIHwgYXN5bmNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYngtc21hbGxcIj5ObyBkYXRlL3RpbWUgc2V0PC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmdWxsRGF5JCB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgICAgPHNtYWxsICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICA8YiBjbGFzcz1cImRieC1va1wiPnt7IGFsbERheUxhYmVsIH19PC9iPlxuICAgICAgICAgICAgICAgICAge3sgZGlzcGxheVZhbHVlJCB8IGFzeW5jIHwgZGF0ZTogJ2Z1bGxEYXRlJyB9fSB7eyB0aW1lem9uZUFiYnJldmlhdGlvbiQgfCBhc3luYyB9fSAoe3sgZGlzcGxheVZhbHVlJCB8IGFzeW5jIHwgZGF0ZURpc3RhbmNlIH19KVxuICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPHNtYWxsICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlWYWx1ZSQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgICAgICA8YiBjbGFzcz1cImRieC1va1wiPnt7IGF0VGltZUxhYmVsIH19PC9iPlxuICAgICAgICAgICAgICAgICAgICB7eyBkaXNwbGF5VmFsdWUkIHwgYXN5bmMgfCBkYXRlOiAnbWVkaXVtJyB9fSB7eyB0aW1lem9uZUFiYnJldmlhdGlvbiQgfCBhc3luYyB9fSAoe3sgZGlzcGxheVZhbHVlJCB8IGFzeW5jIHwgdGltZURpc3RhbmNlIH19KVxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiY3VycmVudEVycm9yTWVzc2FnZSQgfCBhc3luY1wiPnt7IGN1cnJlbnRFcnJvck1lc3NhZ2UkIHwgYXN5bmMgfX08L21hdC1lcnJvcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPCEtLSBEYXRlIElucHV0IFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNkYXRlSW5wdXRUZW1wbGF0ZT5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvdy1maWVsZFwiPlxuICAgIDxtYXQtbGFiZWw+e3sgZGF0ZUxhYmVsIH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0ICNkYXRlSW5wdXQgbWF0SW5wdXQgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW3JlcXVpcmVkXT1cImlzRGF0ZVJlcXVpcmVkXCIgW21pbl09XCJkYXRlSW5wdXRNaW4kIHwgYXN5bmNcIiBbbWF4XT1cImRhdGVJbnB1dE1heCQgfCBhc3luY1wiIFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiIFttYXREYXRlcGlja2VyRmlsdGVyXT1cIihwaWNrZXJGaWx0ZXIkIHwgYXN5bmMpIHx8IGRlZmF1bHRQaWNrZXJGaWx0ZXJcIiAoZGF0ZUNoYW5nZSk9XCJkYXRlUGlja2VkKCRldmVudClcIiBbdmFsdWVdPVwiZGF0ZVZhbHVlJCB8IGFzeW5jXCIgKGtleWRvd24pPVwia2V5ZG93bk9uRGF0ZUlucHV0KCRldmVudClcIiAvPlxuICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgPGJ1dHRvbiBtYXRQcmVmaXggY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93LWJ1dHRvblwiICpuZ0lmPVwiIWhpZGVEYXRlUGlja2VyXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJwaWNrZXIub3BlbigpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICA8bWF0LWljb24+Y2FsZW5kYXJfdG9kYXk8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0U3VmZml4ICpuZ0lmPVwic2hvd0NsZWFyQnV0dG9uJCB8IGFzeW5jXCIgY2xhc3M9XCJkYngtZGF0ZXRpbWUtY2xlYXItYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJjbGVhcnMgdGhlIGRhdGUgYW5kIHRpbWUgbWVudVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIChjbGljayk9XCJjbGVhclZhbHVlKClcIj5cbiAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPHNwYW4gbWF0VGV4dFN1ZmZpeCAqbmdJZj1cIiEoc2hvd1RpbWVJbnB1dCQgfCBhc3luYylcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0aW1lem9uZVN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9zcGFuPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBUaW1lIE1lbnUvSW5wdXQgVGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI3RpbWVNZW51QW5kSW5wdXRUZW1wbGF0ZT5cbiAgPG1hdC1tZW51ICN0aW1lbWVudT1cIm1hdE1lbnVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGltZU1vZGUgPT09ICdvcHRpb25hbCdcIj5cbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVtb3ZlVGltZSgpXCI+XG4gICAgICAgIDxzcGFuPlJlbW92ZSBUaW1lPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcmVzZXQgb2YgcHJlc2V0cyQgfCBhc3luY1wiPlxuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzZWxlY3RQcmVzZXQocHJlc2V0KVwiPnt7IHByZXNldC5sYWJlbCB8IGdldFZhbHVlIH19PC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbWF0LW1lbnU+XG4gIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRieC1kYXRldGltZS1yb3ctZmllbGRcIj5cbiAgICA8bWF0LWxhYmVsPnt7IHRpbWVMYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCAjdGltZUlucHV0IFtlcnJvclN0YXRlTWF0Y2hlcl09XCJ0aW1lRXJyb3JTdGF0ZU1hdGNoZXJcIiBtYXRJbnB1dCBbcmVxdWlyZWRdPVwiaXNUaW1lUmVxdWlyZWRcIiBbZm9ybUNvbnRyb2xdPVwidGltZUlucHV0Q3RybFwiIChmb2N1cyk9XCJmb2N1c1RpbWUoKVwiIChmb2N1c291dCk9XCJmb2N1c091dFRpbWUoKVwiIChrZXlkb3duKT1cImtleWRvd25PblRpbWVJbnB1dCgkZXZlbnQpXCIgLz5cbiAgICA8YnV0dG9uIG1hdFByZWZpeCBjbGFzcz1cImRieC1kYXRldGltZS1yb3ctYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJ0aW1lbWVudVwiIGFyaWEtbGFiZWw9XCJvcGVucyB0aGUgdGltZSBtZW51XCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICA8bWF0LWljb24+dGltZXI8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGltZXpvbmVTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvc3Bhbj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwidGltZUlucHV0Q3RybC5oYXNFcnJvcigncGF0dGVybicpXCI+VGhlIGlucHV0IHRpbWUgaXMgbm90IHJlY29nbml6YWJsZS48L21hdC1lcnJvcj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gVGltZXpvbmUgU3VmZml4IC0tPlxuPG5nLXRlbXBsYXRlICN0aW1lem9uZVN1ZmZpeFRlbXBsYXRlPlxuICA8c3BhbiAqbmdJZj1cInNob3dUaW1lem9uZVwiIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXRpbWV6b25lIGRieC1mYWludFwiPnt7IHRpbWV6b25lQWJicmV2aWF0aW9uJCB8IGFzeW5jIH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
669
+ }] });
670
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vc3JjL2xpYi9mb3JtbHkvZmllbGQvdmFsdWUvZGF0ZS9kYXRldGltZS5maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2RhdGV0aW1lLmZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0YsT0FBTyxFQUFFLGlCQUFpQixFQUF5Ryx1QkFBdUIsRUFBb0IsbUJBQW1CLEVBQXFELE1BQU0sZUFBZSxDQUFDO0FBQ3JXLE9BQU8sRUFBRSxtQkFBbUIsRUFBd0Isc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBaUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5WixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZPLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVB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QUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQWdCO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDakQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO3dHQTEyQlUseUJBQXlCOzRGQUF6Qix5QkFBeUIsMkVDN090QywwdUtBa0dBOzs0RkQySWEseUJBQXlCO2tCQUhyQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBNYXliZSwgdHlwZSBSZWFkYWJsZVRpbWVTdHJpbmcsIHR5cGUgQXJyYXlPclZhbHVlLCB0eXBlIElTTzg2MDFEYXRlU3RyaW5nLCBhc0FycmF5LCBmaWx0ZXJNYXliZVZhbHVlcywgdHlwZSBEZWNpc2lvbkZ1bmN0aW9uLCB0eXBlIE1pbGxpc2Vjb25kcywgdHlwZSBUaW1lem9uZVN0cmluZywgdHlwZSBMb2dpY2FsRGF0ZSwgdHlwZSBEYXRlT3JEYXlTdHJpbmcsIGlzSVNPODYwMURheVN0cmluZ1N0YXJ0LCB0eXBlIE1hcEZ1bmN0aW9uLCBtYXBJZGVudGl0eUZ1bmN0aW9uLCBNaW51dGVPZkRheSwgVW5peERhdGVUaW1lTnVtYmVyLCBJU084NjAxRGF5U3RyaW5nIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBkYXRlRnJvbUxvZ2ljYWxEYXRlLCBEYXRlVGltZU1pbnV0ZUNvbmZpZywgRGF0ZVRpbWVNaW51dGVJbnN0YW5jZSwgZ3Vlc3NDdXJyZW50VGltZXpvbmUsIHJlYWRhYmxlVGltZVN0cmluZ1RvRGF0ZSwgdG9Mb2NhbFJlYWRhYmxlVGltZVN0cmluZywgdXRjRGF5Rm9yRGF0ZSwgc2FmZVRvSnNEYXRlLCBmaW5kTWluRGF0ZSwgZmluZE1heERhdGUsIGlzU2FtZURhdGVIb3Vyc0FuZE1pbnV0ZXMsIGdldFRpbWV6b25lQWJicmV2aWF0aW9uLCBpc1NhbWVEYXRlRGF5LCBkYXRlVGltZXpvbmVVdGNOb3JtYWwsIERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlLCB0b0pzRGF5RGF0ZSwgaXNTYW1lRGF0ZSwgZGF0ZVRpbWVNaW51dGVXaG9sZURheURlY2lzaW9uRnVuY3Rpb24gfSBmcm9tICdAZGVyZWVrYi9kYXRlJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgc2hhcmVSZXBsYXksIG1hcCwgc3RhcnRXaXRoLCB0YXAsIGZpcnN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZGVib3VuY2VUaW1lLCB0aHJvdHRsZVRpbWUsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCwgU3ViamVjdCwgbWVyZ2UsIGludGVydmFsLCBvZiwgY29tYmluZUxhdGVzdFdpdGgsIGZpbHRlciwgc2tpcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycywgRm9ybUdyb3VwLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnQG5neC1mb3JtbHkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRmllbGRUeXBlQ29uZmlnLCBGb3JtbHlGaWVsZFByb3BzIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VySW5wdXRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgYWRkTWludXRlcywgc3RhcnRPZkRheSwgYWRkRGF5cyB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIsIGZpbHRlck1heWJlLCBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlciwgc2tpcEZpcnN0TWF5YmUsIFN1YnNjcmlwdGlvbk9iamVjdCwgc3dpdGNoTWFwTWF5YmVEZWZhdWx0LCBzd2l0Y2hNYXBNYXliZU9icyB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgRGF0ZVRpbWVQcmVzZXQsIERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbiwgZGF0ZVRpbWVQcmVzZXQgfSBmcm9tICcuL2RhdGV0aW1lJztcbmltcG9ydCB7IERieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UgfSBmcm9tICcuL2RhdGV0aW1lLmZpZWxkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUsIGRieERhdGVUaW1lSW5wdXRWYWx1ZVBhcnNlRmFjdG9yeSwgZGJ4RGF0ZVRpbWVJc1NhbWVEYXRlVGltZUZpZWxkVmFsdWUsIGRieERhdGVUaW1lT3V0cHV0VmFsdWVGYWN0b3J5IH0gZnJvbSAnLi9kYXRlLnZhbHVlJztcbmltcG9ydCB7IEZvcm1Db250cm9sUGF0aCwgc3RyZWFtVmFsdWVGcm9tQ29udHJvbCB9IGZyb20gJy4uLy4uLy4uLy4uL2Zvcm0vZm9ybS5hbmd1bGFyLnV0aWwnO1xuaW1wb3J0IHsgdG9nZ2xlRGlzYWJsZUZvcm1Db250cm9sIH0gZnJvbSAnLi4vLi4vLi4vLi4vZm9ybS9mb3JtJztcbmltcG9ydCB7IEVycm9yU3RhdGVNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5cbmV4cG9ydCBlbnVtIERieERhdGVUaW1lRmllbGRUaW1lTW9kZSB7XG4gIC8qKlxuICAgKiBUaW1lIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgUkVRVUlSRUQgPSAncmVxdWlyZWQnLFxuICAvKipcbiAgICogVGltZSBpcyBvcHRpb25hbC5cbiAgICovXG4gIE9QVElPTkFMID0gJ29wdGlvbmFsJyxcbiAgLyoqXG4gICAqIFRpbWUgaXMgcGVybWVuYW50bHkgb2ZmLlxuICAgKi9cbiAgTk9ORSA9ICdub25lJ1xufVxuXG5leHBvcnQgdHlwZSBEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24gPSBPbWl0PERhdGVUaW1lTWludXRlQ29uZmlnLCAnZGF0ZSc+O1xuXG5leHBvcnQgdHlwZSBEYnhEYXRlVGltZUZpZWxkU3luY1R5cGUgPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFN5bmNGaWVsZCB7XG4gIC8qKlxuICAgKiBGaWVsZCBrZXkvcGF0aCB0byBzeW5jIHdpdGgvYWdhaW5zdC5cbiAgICovXG4gIHJlYWRvbmx5IHN5bmNXaXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb3cgdG8gc3luYyBhZ2FpbnN0IHRoZSBvdGhlciBmaWVsZC5cbiAgICovXG4gIHJlYWRvbmx5IHN5bmNUeXBlOiBEYnhEYXRlVGltZUZpZWxkU3luY1R5cGU7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHRpbWUgZGF0ZSBmaWVsZCB0aGF0IGhhcyBhIHJlZmVyZW5jZSBhbmQgb3B0aW9uYWwgbWFwIGZ1bmN0aW9uIHRvIG1hcCB0aGUgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnPEkgPSB1bmtub3duPiB7XG4gIHJlYWRvbmx5IHBhdGg6IEZvcm1Db250cm9sUGF0aDtcbiAgcmVhZG9ubHkgbWFwVmFsdWU/OiBNYXBGdW5jdGlvbjxJLCBNYXliZTxEYXRlT3JEYXlTdHJpbmc+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnKGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnIHtcbiAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKGlucHV0IGFzIERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZykucGF0aCA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFByb3BzIGV4dGVuZHMgRm9ybWx5RmllbGRQcm9wcyB7XG4gIC8qKlxuICAgKiBDdXN0b20gZGF0ZSBsYWJlbC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gRGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0ZUxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gdGltZSBsYWJlbC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gVGltZVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZUxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMYWJlbCB0byB1c2UgZm9yIHRoZSBkYXRlIGhpbnQgZm9yIFwiQWxsIERheVwiLiBEZWZhdWx0cyB0byBcIkFsbCBEYXlcIi5cbiAgICovXG4gIHJlYWRvbmx5IGFsbERheUxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMYWJlbCB0byB1c2UgZm9yIHRoZSBkYXRlIGhpbnQgZm9yIFwiQXRcIi4gRGVmYXVsdHMgdG8gXCJBdFwiLlxuICAgKi9cbiAgcmVhZG9ubHkgYXRUaW1lTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG1vZGUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIERBVEVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlTW9kZT86IERieERhdGVUaW1lVmFsdWVNb2RlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZGF0ZSBpcyBoaWRkZW4sIGFuZCBhdXRvbWF0aWNhbGx5IHVzZXMgdG9kYXkvaW5wdXQgZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVPbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gdGltZU9ubHkgaXMgZmFsc2UuXG4gICAqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGFsd2F5cyBzaG93IHRoZSBkYXRlIGlucHV0IGV2ZW4gd2hlbiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIGRhdGUgdGhhdCBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICByZWFkb25seSBhbHdheXNTaG93RGF0ZUlucHV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gYXV0b2ZpbGwgdGhlIGRhdGUgd2hlbiB0aW1lIGlzIHBpY2tlZC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqL1xuICByZWFkb25seSBhdXRvZmlsbERhdGVXaGVuVGltZUlzUGlja2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHRpbWUgY2FuIGJlIGFkZGVkL3JlbW92ZWQgb3B0aW9uYWxseS5cbiAgICpcbiAgICogVGhpcyBpcyBpZ25vcmVkIGlmIHRpbWVPbmx5IGlzIHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVNb2RlPzogRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlO1xuXG4gIC8qKlxuICAgKiBPdGhlciBmb3JtIGNvbnRyb2wgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB3aGV0aGVyIG9yIG5vdCBpdCBpcyBhIGZ1bGwgZGF5LlxuICAgKlxuICAgKiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpZiB0aW1lIGlzIG9wdGlvbmFsLlxuICAgKlxuICAgKiBXaGVuIHRpbWUgaXMgb2ZmLCB0aGUgZmllbGQgaXMgc2V0IHRvIHRydWUuXG4gICAqL1xuICByZWFkb25seSBmdWxsRGF5RmllbGROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBwYXNzIHRoZSBkYXRlIHZhbHVlIGFzIGEgVVRDIGRhdGUsIG9yIGEgZGF0ZSBpbiB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bGxEYXlJblVUQz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IG90IGhpZGUgdGhlIGRhdGUgaGludCBpbmZvIGNvbnRlbnQuXG4gICAqXG4gICAqIEZhbHNlIGJ5IGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGhpZGVEYXRlSGludD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGhpZGUgdGhlIGRhdGUvY2FsZW5kYXIgcGlja2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgaGlkZURhdGVQaWNrZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHBpY2tlckNvbmZpZz86IE9ic2VydmFibGVPclZhbHVlR2V0dGVyPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj47XG5cbiAgLyoqXG4gICAqIFVzZWQgZm9yIHN5bmNpbmcgd2l0aCBvbmUgb3IgbW9yZSBmaWVsZHMgd2l0aCBhIERhdGUgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSBnZXRTeW5jRmllbGRzT2JzPzogKCkgPT4gT2JzZXJ2YWJsZTxBcnJheU9yVmFsdWU8RGJ4RGF0ZVRpbWVGaWVsZFN5bmNGaWVsZD4+O1xuXG4gIC8qKlxuICAgKiAoT3B0aW9uYWwpIFRoZSBpbnB1dCB0aW1lem9uZSB0byBkZWZhdWx0IHRvLlxuICAgKlxuICAgKiBJZ25vcmVkIGlmIGZ1bGxEYXlJblVUQyBpcyB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZXpvbmU/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxNYXliZTxUaW1lem9uZVN0cmluZz4+PjtcblxuICAvKipcbiAgICogKE9wdGlvbmFsKSBUaGUgZGF0ZSB0byBhcHBseSB0aGUgdGltZSB0by5cbiAgICpcbiAgICogVGhlIHRpbWV6b25lIGFiYnJ2aWF0aW9uIHdpbGwgYWxzbyB1c2UgdGhpcyBkYXRlIHdoZW4gdXNpbmcgdGhlIHRpbWUtb25seSBtb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZURhdGU/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxNYXliZTxEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcgfCBGb3JtQ29udHJvbFBhdGggfCBEYXRlT3JEYXlTdHJpbmc+Pj47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgdGhlIHRpbWV6b25lLiBUcnVlIGJ5IGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBzaG93VGltZXpvbmU/OiBNYXliZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3VzdG9tIHByZXNldHMgdG8gc2hvdyBpbiB0aGUgZHJvcGRvd24uXG4gICAqL1xuICByZWFkb25seSBwcmVzZXRzPzogT2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8RGF0ZVRpbWVQcmVzZXRDb25maWd1cmF0aW9uW10+O1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZSBpbiBtcyB0byBwcmV2ZW50IG91dHB1dCBmcm9tIGdvaW5nIG91dCB3aGVuIHRoZSBpbnB1dCB2YWx1ZSBjaGFuZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRPdXRwdXREZWJvdW5jZVRpbWU/OiBNaWxsaXNlY29uZHM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgdGhlIGNsZWFyIGRhdGUgYnV0dG9uLiBUcnVlIGJ5IGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBzaG93Q2xlYXJCdXR0b24/OiBNYXliZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaW51dGVzIHRvIGFkZC9zdWJ0cmFjdCB3aGVuIHVzaW5nIHRoZSBhcnJvdyBrZXlzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWludXRlU3RlcD86IE1heWJlPG51bWJlcj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFN5bmNQYXJzZWRGaWVsZCBleHRlbmRzIFBpY2s8RGJ4RGF0ZVRpbWVGaWVsZFN5bmNGaWVsZCwgJ3N5bmNUeXBlJz4ge1xuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w8TWF5YmU8RGF0ZSB8IElTTzg2MDFEYXRlU3RyaW5nPj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzeW5jQ29uZmlnVmFsdWVPYnMocGFyc2VDb25maWdzT2JzOiBPYnNlcnZhYmxlPERieERhdGVUaW1lRmllbGRTeW5jUGFyc2VkRmllbGRbXT4sIHR5cGU6IERieERhdGVUaW1lRmllbGRTeW5jVHlwZSk6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+IHtcbiAgcmV0dXJuIHBhcnNlQ29uZmlnc09icy5waXBlKFxuICAgIHN3aXRjaE1hcCgoeCkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnID0geC5maW5kKCh5KSA9PiB5LnN5bmNUeXBlID09PSB0eXBlKTtcbiAgICAgIGxldCByZXN1bHQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+O1xuXG4gICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHsgY29udHJvbCB9ID0gY29uZmlnO1xuICAgICAgICByZXN1bHQgPSBjb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChjb250cm9sLnZhbHVlKSxcbiAgICAgICAgICBtYXAoKHgpID0+IHNhZmVUb0pzRGF0ZSh4KSA/PyBudWxsKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gb2YobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xufVxuXG5jb25zdCBUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FOiBNaWxsaXNlY29uZHMgPSAxMDtcblxuLyoqXG4gKiBFcnJvciBjb2RlIHVzZWQgd2hlbiB0aGUgc2VsZWN0ZWQgZGF0ZSBpcyBub3QgaW4gdGhlIHNjaGVkdWxlLlxuICovXG5leHBvcnQgY29uc3QgREJYX0RBVEVfVElNRV9GSUVMRF9EQVRFX05PVF9JTl9TQ0hFRFVMRV9FUlJPUiA9ICdkYXRlVGltZUZpZWxkRGF0ZU5vdEluU2NoZWR1bGUnO1xuXG4vKipcbiAqIEVycm9yIGNvZGUgdXNlZCB3aGVuIHRoZSBzZWxlY3RlZCB0aW1lL3RpbWUgaW5wdXQgaXMgbm90IGluIHRoZSBsaW1pdGVkIHJhbmdlLlxuICovXG5leHBvcnQgY29uc3QgREJYX0RBVEVfVElNRV9GSUVMRF9USU1FX05PVF9JTl9SQU5HRV9FUlJPUiA9ICdkYXRlVGltZUZpZWxkVGltZU5vdEluUmFuZ2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICdkYXRldGltZS5maWVsZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRGJ4RGF0ZVRpbWVGaWVsZENvbXBvbmVudCBleHRlbmRzIEZpZWxkVHlwZTxGaWVsZFR5cGVDb25maWc8RGJ4RGF0ZVRpbWVGaWVsZFByb3BzPj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRieERhdGVUaW1lRmllbGRDb25maWdTZXJ2aWNlID0gaW5qZWN0KERieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UpO1xuXG4gIHByaXZhdGUgX3N1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSBfdmFsdWVTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX2F1dG9GaWxsRGF0ZVN5bmMgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgcHJpdmF0ZSBfY29uZmlnID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBsYXRlc3RDb25maWckID0gdGhpcy5fY29uZmlnLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICBwcml2YXRlIF9zeW5jQ29uZmlnT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPEFycmF5T3JWYWx1ZTxEYnhEYXRlVGltZUZpZWxkU3luY0ZpZWxkPj4+Pih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgX2RlZmF1bHRUaW1lem9uZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfdGltZURhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPE9ic2VydmFibGU8TWF5YmU8RGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnIHwgRm9ybUNvbnRyb2xQYXRoIHwgRGF0ZU9yRGF5U3RyaW5nPj4+Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIF9wcmVzZXRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPYnNlcnZhYmxlPERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdPj4ob2YoW10pKTtcblxuICBwcml2YXRlIF9mdWxsRGF5SW5wdXRDdHJsPzogRm9ybUNvbnRyb2w7XG4gIHByaXZhdGUgX2Z1bGxEYXlDb250cm9sT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxBYnN0cmFjdENvbnRyb2w8Ym9vbGVhbj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmdWxsRGF5Q29udHJvbCQgPSB0aGlzLl9mdWxsRGF5Q29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIHByaXZhdGUgX29mZnNldCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSBfZm9ybUNvbnRyb2xPYnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPEFic3RyYWN0Q29udHJvbDxNYXliZTxEYXRlPj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmb3JtQ29udHJvbCQgPSB0aGlzLl9mb3JtQ29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIHByaXZhdGUgX2NsZWFyZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF91cGRhdGVUaW1lID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIF9yZXN5bmNUaW1lSW5wdXRTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX3Jlc3luY1RpbWVJbnB1dCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcmVhZG9ubHkgdGltZUVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlciA9IHtcbiAgICBpc0Vycm9yU3RhdGU6IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsLCBmb3JtKSA9PiB7XG4gICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICByZXR1cm4gKGNvbnRyb2wuaW52YWxpZCAmJiAoY29udHJvbC5kaXJ0eSB8fCBjb250cm9sLnRvdWNoZWQpKSB8fCB0aGlzLmVycm9yU3RhdGVNYXRjaGVyLmlzRXJyb3JTdGF0ZSh0aGlzLmZvcm1Db250cm9sLCBmb3JtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmVhZG9ubHkgcmVzeW5jVGltZUlucHV0JCA9IHRoaXMuX3Jlc3luY1RpbWVJbnB1dC5waXBlKGRlYm91bmNlVGltZSgyMDApLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcHJpdmF0ZSBfY29uZmlnVXBkYXRlVGltZVN5bmMgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KFxuICAgIHRoaXMubGF0ZXN0Q29uZmlnJC5waXBlKHNraXAoMSkpLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlVGltZS5uZXh0KCk7XG4gICAgfSlcbiAgKTtcblxuICByZWFkb25seSB0aW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuX2RlZmF1bHRUaW1lem9uZS5waXBlKHN3aXRjaE1hcE1heWJlRGVmYXVsdCgpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5waXBlKFxuICAgIG1hcCgoZGVmYXVsdFRpbWV6b25lKSA9PiB7XG4gICAgICByZXR1cm4gZGVmYXVsdFRpbWV6b25lID8/IGd1ZXNzQ3VycmVudFRpbWV6b25lKCk7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWV6b25lSW5zdGFuY2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlPj4gPSB0aGlzLnRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgodGltZXpvbmUpID0+ICh0aW1lem9uZSA/IGRhdGVUaW1lem9uZVV0Y05vcm1hbCh7IHRpbWV6b25lIH0pIDogdW5kZWZpbmVkKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSB0aW1lRGF0ZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gdGhpcy5fdGltZURhdGUucGlwZShcbiAgICBzd2l0Y2hNYXBNYXliZURlZmF1bHQoKSxcbiAgICBzd2l0Y2hNYXAoKHgpID0+IHtcbiAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+O1xuXG4gICAgICBpZiAoeCkge1xuICAgICAgICAvLyBpZiB0aGUgc3RyaW5nIGlzIG5vdCBhIGRhdGUgc3RyaW5nLCB0aGVuIHRyZWF0IGl0IGFzIGEgcGF0aFxuICAgICAgICBpZiAoKHR5cGVvZiB4ID09PSAnc3RyaW5nJyAmJiAhaXNJU084NjAxRGF5U3RyaW5nU3RhcnQoeCkpIHx8IGlzRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnKHgpKSB7XG4gICAgICAgICAgY29uc3QgeyBwYXRoLCBtYXBWYWx1ZSB9OiBEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcgPSB0eXBlb2YgeCA9PT0gJ3N0cmluZycgPyB7IHBhdGg6IHggfSA6IHg7XG4gICAgICAgICAgb2JzID1cbiAgICAgICAgICAgIHN0cmVhbVZhbHVlRnJvbUNvbnRyb2w8RGF0ZU9yRGF5U3RyaW5nPih0aGlzLmZvcm0sIHBhdGgpPy5waXBlKFxuICAgICAgICAgICAgICBtYXAobWFwVmFsdWUgPz8gbWFwSWRlbnRpdHlGdW5jdGlvbigpKSxcbiAgICAgICAgICAgICAgbWFwKCh4KSA9PiAoeCA/IHRvSnNEYXlEYXRlKHgpIDogdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICkgPz8gb2YodW5kZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYnMgPSBvZih0b0pzRGF5RGF0ZSh4KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9icyA9IG9mKHVuZGVmaW5lZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYnM7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZURheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSB2YWx1ZUluU3lzdGVtVGltZXpvbmUkOiBPYnNlcnZhYmxlPE1heWJlPERhdGU+PiA9IHRoaXMuZm9ybUNvbnRyb2wkLnBpcGUoXG4gICAgbWFwKChjb250cm9sKSA9PiBjb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aDxNYXliZTxEYXRlIHwgSVNPODYwMURheVN0cmluZyB8IE1pbnV0ZU9mRGF5IHwgVW5peERhdGVUaW1lTnVtYmVyPj4oY29udHJvbC52YWx1ZSksIHNoYXJlUmVwbGF5KDEpKSksXG4gICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy50aW1lem9uZUluc3RhbmNlJCksXG4gICAgc3dpdGNoTWFwKChbeCwgdGltZXpvbmVJbnN0YW5jZV0pID0+IHtcbiAgICAgIHJldHVybiB4LnBpcGUobWFwKGRieERhdGVUaW1lSW5wdXRWYWx1ZVBhcnNlRmFjdG9yeSh0aGlzLnZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZSkpKTtcbiAgICB9KSxcbiAgICB0aHJvdHRsZVRpbWUoMjAsIHVuZGVmaW5lZCwgeyBsZWFkaW5nOiB0cnVlLCB0cmFpbGluZzogdHJ1ZSB9KSwgLy8gdGhyb3R0bGUgaW5jb21pbmcgdmFsdWVzIGFuZCB0aW1lem9uZSBjaGFuZ2VzXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZUhvdXJzQW5kTWludXRlcyksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSByZWZyZXNoSW50ZXJhbCQgPSBpbnRlcnZhbCgxMCAqIDEwMDApO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHRyaWdnZXIvZGlzcGxheSB2aXN1YWwgdXBkYXRlcyAoc3BlY2lmaWNhbGx5IG9uIHRpbWVEaXN0YW5jZSwgZXRjLikuXG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5VmFsdWUkID0gdGhpcy5yZWZyZXNoSW50ZXJhbCQucGlwZShcbiAgICAvLyBldmVyeSAxMCBzZWNvbmRzLCByZWZyZXNoIHcvaW50ZXJ2YWxcbiAgICBzdGFydFdpdGgoMCksXG4gICAgbWFwKCgpID0+IG5ldyBEYXRlKCkuZ2V0TWludXRlcygpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHRhcCgoKSA9PiB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpKSxcbiAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWVTdHJpbmckOiBPYnNlcnZhYmxlPFJlYWRhYmxlVGltZVN0cmluZyB8ICcnPiA9IHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gKHggPyB0b0xvY2FsUmVhZGFibGVUaW1lU3RyaW5nKHgpIDogJycpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZUlucHV0Q3RybCA9IG5ldyBGb3JtQ29udHJvbDxNYXliZTxEYXRlPj4obnVsbCwge1xuICAgIHZhbGlkYXRvcnM6IFtdXG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRpbWVJbnB1dEN0cmwgPSBuZXcgRm9ybUNvbnRyb2w8TWF5YmU8UmVhZGFibGVUaW1lU3RyaW5nPj4obnVsbCwge1xuICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnBhdHRlcm4oL14obm93KSR8XihbMC05XXwoMFswLTldKXwoMVswLTldKXwoMlswLTNdKSkoOik/KFswLTVdWzAtOV0pPyhcXHMpPyhbYXBBUF1bTW1dKT8oXFxcXHMpKiQvKV1cbiAgfSk7XG5cbiAgZ2V0IGRhdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmRhdGVMYWJlbCA/PyAnRGF0ZSc7XG4gIH1cblxuICBnZXQgdGltZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMudGltZUxhYmVsID8/ICdUaW1lJztcbiAgfVxuXG4gIGdldCBhbGxEYXlMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmFsbERheUxhYmVsID8/ICdBbGwgRGF5JztcbiAgfVxuXG4gIGdldCBhdFRpbWVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmF0VGltZUxhYmVsID8/ICdBdCc7XG4gIH1cblxuICBnZXQgZGF0ZU9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGltZU1vZGUgPT09IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5OT05FO1xuICB9XG5cbiAgZ2V0IGRhdGVUaW1lRmllbGQoKTogRGJ4RGF0ZVRpbWVGaWVsZFByb3BzIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcztcbiAgfVxuXG4gIGdldCB0aW1lT25seSgpOiBNYXliZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGltZVZhbHVlc09ubHkgPSB0aGlzLnZhbHVlTW9kZSA9PT0gRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUuTUlOVVRFX09GX0RBWTtcblxuICAgIGlmICh0aW1lVmFsdWVzT25seSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRmllbGQudGltZU9ubHk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFsd2F5c1Nob3dEYXRlSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYWx3YXlzU2hvd0RhdGVJbnB1dCA/PyB0cnVlO1xuICB9XG5cbiAgZ2V0IGF1dG9maWxsRGF0ZVdoZW5UaW1lSXNQaWNrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYXV0b2ZpbGxEYXRlV2hlblRpbWVJc1BpY2tlZCA/PyB0aGlzLmFsd2F5c1Nob3dEYXRlSW5wdXQgPT09IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHNob3dEYXRlSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnRpbWVPbmx5O1xuICB9XG5cbiAgZ2V0IHZhbHVlTW9kZSgpOiBEYnhEYXRlVGltZVZhbHVlTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMudmFsdWVNb2RlID8/IERieERhdGVUaW1lVmFsdWVNb2RlLkRBVEU7XG4gIH1cblxuICBnZXQgdGltZU1vZGUoKTogRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlIHtcbiAgICBjb25zdCBkYXRlVmFsdWVzT25seSA9IHRoaXMudmFsdWVNb2RlID09PSBEYnhEYXRlVGltZVZhbHVlTW9kZS5EQVlfU1RSSU5HO1xuXG4gICAgaWYgKGRhdGVWYWx1ZXNPbmx5KSB7XG4gICAgICByZXR1cm4gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWVPbmx5ID8gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVEIDogdGhpcy5kYXRlVGltZUZpZWxkLnRpbWVNb2RlID8/IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRDtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNEYXRlUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucmVxdWlyZWQgPz8gZmFsc2U7XG4gIH1cblxuICBnZXQgaXNUaW1lUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEYXRlUmVxdWlyZWQgJiYgdGhpcy50aW1lTW9kZSA9PT0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVEO1xuICB9XG5cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IE1heWJlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgZ2V0IGhpZGVEYXRlSGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5oaWRlRGF0ZUhpbnQgPz8gZmFsc2U7XG4gIH1cblxuICBnZXQgaGlkZURhdGVQaWNrZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuaGlkZURhdGVQaWNrZXIgPz8gZmFsc2U7XG4gIH1cblxuICBnZXQgdGltZXpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMudGltZXpvbmU7XG4gIH1cblxuICBnZXQgdGltZURhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMudGltZURhdGU7XG4gIH1cblxuICBnZXQgc2hvd1RpbWV6b25lKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnNob3dUaW1lem9uZSA/PyB0cnVlO1xuICB9XG5cbiAgZ2V0IHByZXNldHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMucHJlc2V0cztcbiAgfVxuXG4gIGdldCBzaG93Q2xlYXJCdXR0b24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuc2hvd0NsZWFyQnV0dG9uO1xuICB9XG5cbiAgZ2V0IG1pbnV0ZVN0ZXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMubWludXRlU3RlcCA/PyB0aGlzLmZpZWxkLnByb3BzLnN0ZXAgPz8gNTtcbiAgfVxuXG4gIHJlYWRvbmx5IGZ1bGxEYXkkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5mdWxsRGF5Q29udHJvbCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKGNvbnRyb2wpID0+IGNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKGNvbnRyb2wudmFsdWUpKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNob3dUaW1lSW5wdXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5mdWxsRGF5JC5waXBlKG1hcCgoeCkgPT4gIXggJiYgdGhpcy50aW1lTW9kZSAhPT0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkUpKTtcblxuICByZWFkb25seSBzaG93QWRkVGltZSQgPSB0aGlzLnNob3dUaW1lSW5wdXQkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAheCAmJiB0aGlzLnRpbWVNb2RlID09PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuT1BUSU9OQUwpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudERhdGUkID0gdGhpcy5kYXRlSW5wdXRDdHJsLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmRhdGVJbnB1dEN0cmwudmFsdWUpLCBzaGFyZVJlcGxheSgxKSk7XG4gIHJlYWRvbmx5IGRhdGUkID0gdGhpcy5jdXJyZW50RGF0ZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgdGltZXpvbmVBYmJyZXZpYXRpb24kID0gY29tYmluZUxhdGVzdChbdGhpcy5jdXJyZW50RGF0ZSQsIHRoaXMudGltZXpvbmUkLCB0aGlzLnRpbWVEYXRlJF0pLnBpcGUoXG4gICAgbWFwKChbZGF0ZSwgdGltZXpvbmUsIHRpbWVEYXRlXSkgPT4gZ2V0VGltZXpvbmVBYmJyZXZpYXRpb24odGltZXpvbmUsIHRpbWVEYXRlID8/IGRhdGUgPz8gbmV3IERhdGUoKSkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlVmFsdWUkOiBPYnNlcnZhYmxlPE1heWJlPERhdGU+PiA9IG1lcmdlKHRoaXMuZGF0ZSQsIHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJC5waXBlKHNraXBGaXJzdE1heWJlKCkpKS5waXBlKFxuICAgIG1hcCgoeDogTWF5YmU8RGF0ZT4pID0+ICh4ID8gc3RhcnRPZkRheSh4KSA6IG51bGwpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxNYXliZTxEYXRlPj4oaXNTYW1lRGF0ZURheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSB0aW1lSW5wdXQkOiBPYnNlcnZhYmxlPFJlYWRhYmxlVGltZVN0cmluZz4gPSB0aGlzLl91cGRhdGVUaW1lLnBpcGUoXG4gICAgZGVib3VuY2VUaW1lKDUpLFxuICAgIG1hcCgoKSA9PiB0aGlzLnRpbWVJbnB1dEN0cmwudmFsdWUgfHwgJycpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcblxuICByZWFkb25seSBzeW5jQ29uZmlnT2JzJCA9IHRoaXMuX3N5bmNDb25maWdPYnMucGlwZShzd2l0Y2hNYXBNYXliZURlZmF1bHQoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHBhcnNlZFN5bmNDb25maWdzJDogT2JzZXJ2YWJsZTxEYnhEYXRlVGltZUZpZWxkU3luY1BhcnNlZEZpZWxkW10+ID0gdGhpcy5zeW5jQ29uZmlnT2JzJC5waXBlKFxuICAgIG1hcCgoeCkgPT4ge1xuICAgICAgbGV0IHBhcnNlZDogRGJ4RGF0ZVRpbWVGaWVsZFN5bmNQYXJzZWRGaWVsZFtdO1xuXG4gICAgICBpZiAoeCkge1xuICAgICAgICBwYXJzZWQgPSBmaWx0ZXJNYXliZVZhbHVlcyhcbiAgICAgICAgICBhc0FycmF5KHgpLm1hcCgoeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoeS5zeW5jV2l0aCk7XG5cbiAgICAgICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udHJvbCxcbiAgICAgICAgICAgICAgICAuLi55XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWQgPSBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHN5bmNDb25maWdCZWZvcmVWYWx1ZSQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+ID0gc3luY0NvbmZpZ1ZhbHVlT2JzKHRoaXMucGFyc2VkU3luY0NvbmZpZ3MkLCAnYmVmb3JlJyk7XG4gIHJlYWRvbmx5IHN5bmNDb25maWdBZnRlclZhbHVlJDogT2JzZXJ2YWJsZTxEYXRlIHwgbnVsbD4gPSBzeW5jQ29uZmlnVmFsdWVPYnModGhpcy5wYXJzZWRTeW5jQ29uZmlncyQsICdhZnRlcicpO1xuXG4gIHJlYWRvbmx5IGlzVGltZUNsZWFyZWQkID0gY29tYmluZUxhdGVzdChbdGhpcy5jdXJyZW50RGF0ZSQsIHRoaXMuX3RpbWVEYXRlLnBpcGUoc3RhcnRXaXRoKG51bGwpKV0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbZGF0ZSwgdGltZV0pID0+IHtcbiAgICAgIGNvbnN0IGlzVGltZUNsZWFyZWQgPSBCb29sZWFuKCFkYXRlICYmICF0aW1lKTtcbiAgICAgIHJldHVybiB0aGlzLl9jbGVhcmVkLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB0cnVlKSxcbiAgICAgICAgc3RhcnRXaXRoKGlzVGltZUNsZWFyZWQpXG4gICAgICApO1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSByYXdEYXRlVGltZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fY29uZmlnLnBpcGUoXG4gICAgICBmaXJzdCgpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+ICh0aGlzLnRpbWVPbmx5ID8gb2YobnVsbCkgOiB0aGlzLmRhdGVWYWx1ZSQpKVxuICAgICksXG4gICAgdGhpcy50aW1lSW5wdXQkLnBpcGUoc3RhcnRXaXRoKG51bGwpKSxcbiAgICB0aGlzLmZ1bGxEYXkkLFxuICAgIHRoaXMudGltZURhdGUkLFxuICAgIHRoaXMuaXNUaW1lQ2xlYXJlZCRcbiAgXSkucGlwZShcbiAgICBtYXAoKFtkYXRlLCB0aW1lU3RyaW5nLCBmdWxsRGF5LCB0aW1lRGF0ZSwgaXNUaW1lQ2xlYXJlZF0pID0+IHtcbiAgICAgIGxldCByZXN1bHQ6IE1heWJlPERhdGU+O1xuXG4gICAgICBpZiAoIWlzVGltZUNsZWFyZWQpIHtcbiAgICAgICAgaWYgKCFkYXRlIHx8IHRoaXMudGltZU9ubHkpIHtcbiAgICAgICAgICBkYXRlID0gdGltZURhdGUgPz8gbmV3IERhdGUoKTsgLy8gdXNlIHRoZSB0aW1lIGRhdGUsIG9yIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgZGF5XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIGlmIChmdWxsRGF5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRlVGltZUZpZWxkLmZ1bGxEYXlJblVUQykge1xuICAgICAgICAgICAgICByZXN1bHQgPSB1dGNEYXlGb3JEYXRlKGRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gc3RhcnRPZkRheShkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVTdHJpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAgIHJlYWRhYmxlVGltZVN0cmluZ1RvRGF0ZSh0aW1lU3RyaW5nLCB7XG4gICAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgICB1c2VTeXN0ZW1UaW1lem9uZTogdHJ1ZVxuICAgICAgICAgICAgICB9KSA/PyBkYXRlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudGltZU9ubHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVNb2RlICE9PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQpIHtcbiAgICAgICAgICAgICAgLy8gb25seSBhdXRvZmlsbCB0aGUgZGF0ZSBpZiB0aGUgdGltZSBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgKGFuZCB0aGUgdGltZSBzdHJpbmcgaXMgZW1wdHkpXG4gICAgICAgICAgICAgIHJlc3VsdCA9IGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZUhvdXJzQW5kTWludXRlcyksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlVGltZVBpY2tlckNvbmZpZyQ6IE9ic2VydmFibGU8TWF5YmU8RGJ4RGF0ZVRpbWVQaWNrZXJDb25maWd1cmF0aW9uPj4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9jb25maWcucGlwZShzd2l0Y2hNYXBNYXliZU9icygpKSwgdGhpcy5zeW5jQ29uZmlnQmVmb3JlVmFsdWUkLCB0aGlzLnN5bmNDb25maWdBZnRlclZhbHVlJF0pLnBpcGUoXG4gICAgbWFwKChbeCwgZGF0ZUlucHV0TWluLCBkYXRlSW5wdXRNYXhdKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0OiBNYXliZTxEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24+ID0geDtcblxuICAgICAgaWYgKGRhdGVJbnB1dE1pbiAhPSBudWxsIHx8IGRhdGVJbnB1dE1heCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHsgbWluOiBsaW1pdE1pbiwgbWF4OiBsaW1pdE1heCB9ID0geD8ubGltaXRzID8/IHt9O1xuICAgICAgICBjb25zdCBtaW4gPSBmaW5kTWluRGF0ZShbZGF0ZUlucHV0TWluLCBkYXRlRnJvbUxvZ2ljYWxEYXRlKGxpbWl0TWluKV0pO1xuICAgICAgICBjb25zdCBtYXggPSBmaW5kTWF4RGF0ZShbZGF0ZUlucHV0TWF4LCBkYXRlRnJvbUxvZ2ljYWxEYXRlKGxpbWl0TWF4KV0pO1xuXG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAuLi54LFxuICAgICAgICAgIGxpbWl0czoge1xuICAgICAgICAgICAgLi4ueD8ubGltaXRzLFxuICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgbWF4XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlSW5wdXRNaW4kOiBPYnNlcnZhYmxlPERhdGUgfCBudWxsPiA9IHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeD8ubGltaXRzPy5taW4gPz8gbnVsbCkgYXMgRGF0ZSB8IG51bGwpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkPERhdGUgfCBudWxsPihpc1NhbWVEYXRlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVJbnB1dE1heCQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+ID0gdGhpcy5kYXRlVGltZVBpY2tlckNvbmZpZyQucGlwZShcbiAgICBtYXAoKHgpID0+ICh4Py5saW1pdHM/Lm1heCA/PyBudWxsKSBhcyBEYXRlIHwgbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQ8RGF0ZSB8IG51bGw+KGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGEgbGltaXRlZCBtaW4vbWF4IGRhdGUgcmFuZ2UgYXBwbGllZC9hdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBoYXNSZXN0cmljdGVkRGF0ZVJhbmdlJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF0ZUlucHV0TWluJCwgdGhpcy5kYXRlSW5wdXRNYXgkXSkucGlwZShcbiAgICBtYXAoKFthLCBiXSkgPT4gQm9vbGVhbihhIHx8IGIpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZU1pbkFuZE1heElzU2FtZURheSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRhdGVJbnB1dE1pbiQsIHRoaXMuZGF0ZUlucHV0TWF4JF0pLnBpcGUoXG4gICAgbWFwKChbYSwgYl0pID0+IEJvb2xlYW4oYSAmJiBiKSAmJiBpc1NhbWVEYXRlRGF5KGEsIGIpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgcGlja2VyRmlsdGVyJDogT2JzZXJ2YWJsZTxEZWNpc2lvbkZ1bmN0aW9uPERhdGUgfCBudWxsPj4gPSB0aGlzLmRhdGVUaW1lUGlja2VyQ29uZmlnJC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgbWFwKCh4KSA9PiB7XG4gICAgICBpZiAoeCkge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBkYXRlVGltZU1pbnV0ZVdob2xlRGF5RGVjaXNpb25GdW5jdGlvbih4LCBmYWxzZSk7XG4gICAgICAgIHJldHVybiAoeDogRGF0ZSB8IG51bGwpID0+ICh4ICE9IG51bGwgPyBmaWx0ZXIoeCkgOiB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdFBpY2tlckZpbHRlcjogRGVjaXNpb25GdW5jdGlvbjxEYXRlIHwgbnVsbD4gPSAoKSA9PiB0cnVlO1xuXG4gIHJlYWRvbmx5IHRpbWVPdXRwdXQkOiBPYnNlcnZhYmxlPE1heWJlPERhdGU+PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMucmF3RGF0ZVRpbWUkLCB0aGlzLl9vZmZzZXQsIHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckXSkucGlwZShcbiAgICB0aHJvdHRsZVRpbWUoVElNRV9PVVRQVVRfVEhST1RUTEVfVElNRSwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IGZhbHNlLCB0cmFpbGluZzogdHJ1ZSB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoY3VycmVudCwgbmV4dCkgPT4gY3VycmVudFswXSA9PT0gbmV4dFswXSAmJiBuZXh0WzFdID09PSAwICYmIGN1cnJlbnRbMl0gPT09IG5leHRbMl0pLFxuICAgIHRhcCgoWywgc3RlcHNPZmZzZXRdKSA9PiAoc3RlcHNPZmZzZXQgPyB0aGlzLl9vZmZzZXQubmV4dCgwKSA6IDApKSxcbiAgICBtYXAoKFtkYXRlLCBzdGVwc09mZnNldCwgY29uZmlnXSkgPT4ge1xuICAgICAgaWYgKGRhdGUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEYXRlVGltZU1pbnV0ZUluc3RhbmNlKHtcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICByb3VuZERvd25Ub01pbnV0ZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBvbmx5IGNsYW1wIHdoZW4gdGhlIHN0ZXBzIG9mZnNldCBpcyBzZXRcbiAgICAgICAgaWYgKHN0ZXBzT2Zmc2V0KSB7XG4gICAgICAgICAgZGF0ZSA9IGluc3RhbmNlLmNsYW1wKGRhdGUpO1xuXG4gICAgICAgICAgY29uc3QgbWludXRlcyA9IHN0ZXBzT2Zmc2V0ICogdGhpcy5taW51dGVTdGVwO1xuXG4gICAgICAgICAgaWYgKG1pbnV0ZXMgIT0gMCkge1xuICAgICAgICAgICAgZGF0ZSA9IGFkZE1pbnV0ZXMoZGF0ZSwgbWludXRlcyk7XG4gICAgICAgICAgICBkYXRlID0gaW5zdGFuY2UuY2xhbXAoZGF0ZSk7IC8vIGNsYW1wIHRoZSBkYXRlIGFnYWluXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVIb3Vyc0FuZE1pbnV0ZXMpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZVRpbWVQaWNrZXJJbnN0YW5jZSQgPSB0aGlzLmRhdGVUaW1lUGlja2VyQ29uZmlnJC5waXBlKFxuICAgIG1hcCgoY29uZmlnKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lTWludXRlSW5zdGFuY2Uoe1xuICAgICAgICAuLi5jb25maWcsXG4gICAgICAgIHJvdW5kRG93blRvTWludXRlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGhhc0VtcHR5RGlzcGxheVZhbHVlJCA9IHRoaXMuZGlzcGxheVZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gIXgpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBwcmVzZXRzJDogT2JzZXJ2YWJsZTxEYXRlVGltZVByZXNldFtdPiA9IHRoaXMuX3ByZXNldHMucGlwZShcbiAgICBzd2l0Y2hNYXBNYXliZU9icygpLFxuICAgIG1hcCgoeDogRGF0ZVRpbWVQcmVzZXRDb25maWd1cmF0aW9uW10pID0+IHgubWFwKGRhdGVUaW1lUHJlc2V0KSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzaG93Q2xlYXJCdXR0b24kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5oYXNFbXB0eURpc3BsYXlWYWx1ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IEJvb2xlYW4odGhpcy5zaG93Q2xlYXJCdXR0b24gJiYgIXgpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY2FuQXV0b2ZpbGxEYXRlV2l0aE9ubHlBdmFpbGFibGVEYXRlJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuZGF0ZU1pbkFuZE1heElzU2FtZURheSQ7XG5cbiAgcmVhZG9ubHkgc2hvd0RhdGVJbnB1dCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmRhdGVNaW5BbmRNYXhJc1NhbWVEYXkkLnBpcGUoXG4gICAgbWFwKChkYXRlTWluQW5kTWF4SXNTYW1lRGF5KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93RGF0ZUlucHV0ICYmICh0aGlzLmFsd2F5c1Nob3dEYXRlSW5wdXQgfHwgIWRhdGVNaW5BbmRNYXhJc1NhbWVEYXkpO1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50RXJyb3JNZXNzYWdlJCA9IHRoaXMuZm9ybUNvbnRyb2wkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChmb3JtQ29udHJvbCkgPT5cbiAgICAgIGZvcm1Db250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShcbiAgICAgICAgZmlsdGVyKCh4KSA9PiB4ID09PSAnSU5WQUxJRCcgfHwgeCA9PT0gJ1ZBTElEJyksXG4gICAgICAgIG1hcCgoeCkgPT4ge1xuICAgICAgICAgIGxldCBjdXJyZW50RXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoeCA9PT0gJ0lOVkFMSUQnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgICAgICAgICBjdXJyZW50RXJyb3JNZXNzYWdlID0gJ0RhdGUgaXMgcmVxdWlyZWQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1Db250cm9sLmhhc0Vycm9yKERCWF9EQVRFX1RJTUVfRklFTERfREFURV9OT1RfSU5fU0NIRURVTEVfRVJST1IpKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFcnJvck1lc3NhZ2UgPSAnRGF0ZSBkb2VzIG5vdCBmYWxsIG9uIGFuIGF2YWlsYWJsZSBkYXRlcyBpbiBzY2hlZHVsZS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1Db250cm9sLmhhc0Vycm9yKERCWF9EQVRFX1RJTUVfRklFTERfVElNRV9OT1RfSU5fUkFOR0VfRVJST1IpKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFcnJvck1lc3NhZ2UgPSAnVGltZSBpcyBub3QgdmFsaWQgZm9yIHRoZSBnaXZlbiBkYXRlLic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjdXJyZW50RXJyb3JNZXNzYWdlID0gJ1RoZSBnaXZlbiBkYXRlIGFuZCB0aW1lIGlzIGludmFsaWQuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudEVycm9yTWVzc2FnZTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApLFxuICAgIHN0YXJ0V2l0aCh1bmRlZmluZWQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaGFzRXJyb3IkID0gdGhpcy5jdXJyZW50RXJyb3JNZXNzYWdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gQm9vbGVhbih4KSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2Zvcm1Db250cm9sT2JzLm5leHQodGhpcy5mb3JtQ29udHJvbCk7XG5cbiAgICBjb25zdCBpbnB1dFBpY2tlckNvbmZpZyA9IHRoaXMuZGF0ZVRpbWVGaWVsZC5waWNrZXJDb25maWc7XG4gICAgdGhpcy5fY29uZmlnLm5leHQoaW5wdXRQaWNrZXJDb25maWcgPyBhc09ic2VydmFibGVGcm9tR2V0dGVyKGlucHV0UGlja2VyQ29uZmlnKSA6IG9mKHt9KSk7XG4gICAgdGhpcy5fc3luY0NvbmZpZ09icy5uZXh0KHRoaXMuZGF0ZVRpbWVGaWVsZC5nZXRTeW5jRmllbGRzT2JzPy4oKSk7XG5cbiAgICB0aGlzLl9zdWIuc3Vic2NyaXB0aW9uID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkXG4gICAgICAucGlwZShcbiAgICAgICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy50aW1lem9uZUluc3RhbmNlJC5waXBlKG1hcCgodGltZXpvbmVJbnN0YW5jZSkgPT4gZGJ4RGF0ZVRpbWVPdXRwdXRWYWx1ZUZhY3RvcnkodGhpcy52YWx1ZU1vZGUsIHRpbWV6b25lSW5zdGFuY2UpKSkpLFxuICAgICAgICB0aHJvdHRsZVRpbWUoVElNRV9PVVRQVVRfVEhST1RUTEVfVElNRSwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IGZhbHNlLCB0cmFpbGluZzogdHJ1ZSB9KSxcbiAgICAgICAgc3dpdGNoTWFwKChbY3VycmVudFZhbHVlLCB2YWx1ZUZhY3RvcnldKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudGltZU91dHB1dCQucGlwZShcbiAgICAgICAgICAgIHRocm90dGxlVGltZShUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FICogMiwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IGZhbHNlLCB0cmFpbGluZzogdHJ1ZSB9KSxcbiAgICAgICAgICAgIHNraXBGaXJzdE1heWJlKCksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlSG91cnNBbmRNaW51dGVzKSxcbiAgICAgICAgICAgIG1hcCgoeCkgPT4gdmFsdWVGYWN0b3J5KHgpKSxcbiAgICAgICAgICAgIGZpbHRlcigoeCkgPT4gIWRieERhdGVUaW1lSXNTYW1lRGF0ZVRpbWVGaWVsZFZhbHVlKHgsIGN1cnJlbnRWYWx1ZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgfSk7XG5cbiAgICBsZXQgaGFzU2V0TWlkbmlnaHRGcm9tSW5wdXQgPSBmYWxzZTtcblxuICAgIC8qXG4gICAgdGhpcy5fdmFsdWVTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy50aW1lU3RyaW5nJC5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHRoaXMuc2V0VGltZSh4KTtcbiAgICB9KTtcbiAgICAqL1xuXG4gICAgaWYgKHRoaXMuYXV0b2ZpbGxEYXRlV2hlblRpbWVJc1BpY2tlZCkge1xuICAgICAgdGhpcy5fYXV0b0ZpbGxEYXRlU3luYy5zdWJzY3JpcHRpb24gPSB0aGlzLmNhbkF1dG9maWxsRGF0ZVdpdGhPbmx5QXZhaWxhYmxlRGF0ZSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChjYW5BdXRvZmlsbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNhbkF1dG9maWxsKSB7XG4gICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHRpbWUgdXBkYXRlcyB0aGUgZmlyc3QgdGltZSwgc2V0IHRoZSBjdXJyZW50IG1pbiBkYXRlXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVUaW1lLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCh4KSA9PiB0aGlzLmRhdGVJbnB1dE1pbiQpLFxuICAgICAgICAgICAgICAgIGZpbHRlck1heWJlKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTsgLy8gZG9uJ3Qgc2hvdyBhbnl0aGluZ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoYXV0b0RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoYXV0b0RhdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kYXRlSW5wdXRDdHJsLnNldFZhbHVlKGF1dG9EYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX3ZhbHVlU3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoeCkgPT4gKHggPyBpc1NhbWVEYXRlKHgsIHN0YXJ0T2ZEYXkoeCkpIDogZmFsc2UpKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgc3dpdGNoTWFwKChpc0lucHV0VmFsdWVBdE1pZG5pZ2h0KSA9PiB7XG4gICAgICAgICAgaGFzU2V0TWlkbmlnaHRGcm9tSW5wdXQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gdGhpcy50aW1lU3RyaW5nJC5waXBlKFxuICAgICAgICAgICAgLy8gc2tpcCgxKSxcbiAgICAgICAgICAgIG1hcCgodGltZVN0cmluZykgPT4gW3RpbWVTdHJpbmcsIGlzSW5wdXRWYWx1ZUF0TWlkbmlnaHRdIGFzIFtzdHJpbmcsIGJvb2xlYW5dKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbeCwgaXNJbnB1dFZhbHVlQXRNaWRuaWdodF0pID0+IHtcbiAgICAgICAgLy8gU2tpcCBldmVudHMgd2hlcmUgdGhlIHRpbWVJbnB1dCB2YWx1ZSBpcyBjbGVhcmVkLCB1bmxlc3MgdGhlIGlucHV0IHZhbHVlIGlzIGF0IG1pZG5pZ2h0IGFuZCB3ZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCBpdCBiZWluZyBhdCBtaWRuaWdodFxuICAgICAgICBpZiAoIXRoaXMudGltZUlucHV0Q3RybC52YWx1ZSAmJiB4ID09PSAnMTI6MDBBTScgJiYgKCFpc0lucHV0VmFsdWVBdE1pZG5pZ2h0IHx8IChpc0lucHV0VmFsdWVBdE1pZG5pZ2h0ICYmIGhhc1NldE1pZG5pZ2h0RnJvbUlucHV0KSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgdGhlIGhhcyBzZXQgZmxhZ1xuICAgICAgICBpZiAoeCA9PT0gJzEyOjAwQU0nICYmIGlzSW5wdXRWYWx1ZUF0TWlkbmlnaHQpIHtcbiAgICAgICAgICBoYXNTZXRNaWRuaWdodEZyb21JbnB1dCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFRpbWUoeCk7XG4gICAgICB9KTtcblxuICAgIC8vIFNldCBkZWZhdWx0IHRpbWV6b25lIGlmIHByb3ZpZGVkLlxuICAgIGlmICh0aGlzLnRpbWV6b25lICYmICF0aGlzLmRhdGVUaW1lRmllbGQuZnVsbERheUluVVRDKSB7XG4gICAgICB0aGlzLl9kZWZhdWx0VGltZXpvbmUubmV4dChhc09ic2VydmFibGVGcm9tR2V0dGVyKHRoaXMudGltZXpvbmUpKTtcbiAgICB9XG5cbiAgICB0aGlzLl90aW1lRGF0ZS5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy50aW1lRGF0ZSkpO1xuXG4gICAgLy8gV2F0Y2ggZm9yIGRpc2FibGVkIGNoYW5nZXMgc28gd2UgY2FuIHByb3BvZ2F0ZSB0aGVtIHByb3Blcmx5LlxuICAgIHRoaXMuZm9ybUNvbnRyb2wucmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKChpc0Rpc2FibGVkKSA9PiB7XG4gICAgICB0b2dnbGVEaXNhYmxlRm9ybUNvbnRyb2wodGhpcy5kYXRlSW5wdXRDdHJsLCBpc0Rpc2FibGVkKTtcbiAgICAgIHRvZ2dsZURpc2FibGVGb3JtQ29udHJvbCh0aGlzLnRpbWVJbnB1dEN0cmwsIGlzRGlzYWJsZWQpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaXNGdWxsRGF5RmllbGQgPSB0aGlzLmRhdGVUaW1lRmllbGQuZnVsbERheUZpZWxkTmFtZTtcbiAgICBsZXQgZnVsbERheUZpZWxkQ3RybDogTWF5YmU8QWJzdHJhY3RDb250cm9sPjtcblxuICAgIGlmIChpc0Z1bGxEYXlGaWVsZCkge1xuICAgICAgZnVsbERheUZpZWxkQ3RybCA9IHRoaXMuZm9ybS5nZXQoaXNGdWxsRGF5RmllbGQpO1xuICAgIH1cblxuICAgIGlmICghZnVsbERheUZpZWxkQ3RybCkge1xuICAgICAgY29uc3QgaXNGdWxsRGF5ID0gdGhpcy50aW1lTW9kZSA9PT0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkU7XG4gICAgICB0aGlzLl9mdWxsRGF5SW5wdXRDdHJsID0gbmV3IEZvcm1Db250cm9sKGlzRnVsbERheSk7XG5cbiAgICAgIC8vIFNldCB0aGUgY29udHJvbCBpbiB0aGUgZm9ybSB0b28gaWYgdGhlIG5hbWUgaXMgZGVmaW5lZC5cbiAgICAgIGlmIChpc0Z1bGxEYXlGaWVsZCkge1xuICAgICAgICAodGhpcy5mb3JtIGFzIEZvcm1Hcm91cCkuYWRkQ29udHJvbChpc0Z1bGxEYXlGaWVsZCwgdGhpcy5fZnVsbERheUlucHV0Q3RybCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bGxEYXlGaWVsZEN0cmwgPSB0aGlzLl9mdWxsRGF5SW5wdXRDdHJsO1xuICAgIH1cblxuICAgIHRoaXMuX2Z1bGxEYXlDb250cm9sT2JzLm5leHQoZnVsbERheUZpZWxkQ3RybCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMudGltZU1vZGUpIHtcbiAgICAgIGNhc2UgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk9QVElPTkFMOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkU6XG4gICAgICAgIHRoaXMucmVtb3ZlVGltZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVEOlxuICAgICAgICB0aGlzLmFkZFRpbWUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJlc2V0cyAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9wcmVzZXRzLm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLnByZXNldHMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcHJlc2V0cy5uZXh0KHRoaXMuZGJ4RGF0ZVRpbWVGaWVsZENvbmZpZ1NlcnZpY2UuY29uZmlndXJhdGlvbnMkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXN5bmNUaW1lSW5wdXRTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy5yZXN5bmNUaW1lSW5wdXQkLnBpcGUoc3dpdGNoTWFwKCh4KSA9PiBjb21iaW5lTGF0ZXN0KFt0aGlzLmN1cnJlbnREYXRlJCwgdGhpcy50aW1lU3RyaW5nJF0pLnBpcGUoZmlyc3QoKSkpKS5zdWJzY3JpYmUoKFtjdXJyZW50RGF0ZSwgdGltZVN0cmluZ10pID0+IHtcbiAgICAgIC8vIG9ubHkgcmVzeW5jIHdoZW4gdGhlIGN1cnJlbnQgZGF0ZSBpcyBzZXQsIG90aGVyd2lzZSBkbyBub3QgY2hhbmdlIHRoZSB0aW1lIHN0cmluZy5cbiAgICAgIC8vIFRoaXMgaGVscHMgaW4gY2FzZXMgd2hlcmUgdGhlIHVzZXIgcGlja3MgYSB0aW1lIGZpcnN0IGFuZCB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIGNsZWFyZWQuXG4gICAgICBpZiAoY3VycmVudERhdGUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnRpbWVJbnB1dEN0cmwuc2V0VmFsdWUodGltZVN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gYWRkIHZhbGlkYXRvcnMvZXJyb3JzIGZvciB0aGUgZm9ybVxuICAgIHRoaXMuZm9ybUNvbnRyb2wuYWRkQXN5bmNWYWxpZGF0b3JzKFtcbiAgICAgICh4KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHgudmFsdWUgYXMgTWF5YmU8RGF0ZT47XG4gICAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycz47XG5cbiAgICAgICAgaWYgKGZvcm1WYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb2JzID0gY29tYmluZUxhdGVzdChbdGhpcy50aW1lem9uZUluc3RhbmNlJCwgdGhpcy5kYXRlVGltZVBpY2tlckluc3RhbmNlJF0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKFt0aW1lem9uZUluc3RhbmNlLCB4XSkgPT4ge1xuICAgICAgICAgICAgICAvLyB0aGUgZm9ybSB2YWx1ZSBpcyBnb2luZyB0byBiZSBpbiB0aGUgb3V0cHV0IGZvcm0sIHNvIHdlIG5lZWQgdG8gcGFyc2UgaXQgYmFjayB0byB0aGUgXCJpbnB1dFwiIGRhdGUgYmVmb3JlIGV2YWx1YXRpbmcgaXRcbiAgICAgICAgICAgICAgY29uc3QgZm9ybVZhbHVlSW5TeXN0ZW1UaW1lem9uZSA9IGRieERhdGVUaW1lSW5wdXRWYWx1ZVBhcnNlRmFjdG9yeSh0aGlzLnZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZSkoZm9ybVZhbHVlKTtcblxuICAgICAgICAgICAgICBsZXQgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMudGltZUlucHV0Q3RybC5lcnJvcnNcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlSW5TeXN0ZW1UaW1lem9uZSkge1xuICAgICAgICAgICAgICAgIGlmICh4LmRhdGVJc0luU2NoZWR1bGUoZm9ybVZhbHVlSW5TeXN0ZW1UaW1lem9uZSkpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgheC5pc0luVmFsaWRSYW5nZShmb3JtVmFsdWVJblN5c3RlbVRpbWV6b25lKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgW0RCWF9EQVRFX1RJTUVfRklFTERfVElNRV9OT1RfSU5fUkFOR0VfRVJST1JdOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGVycm9ycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgW0RCWF9EQVRFX1RJTUVfRklFTERfREFURV9OT1RfSU5fU0NIRURVTEVfRVJST1JdOiB0cnVlXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpcnN0KClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9icyA9IG9mKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYnM7XG4gICAgICB9XG4gICAgXSk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuX3N1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fdmFsdWVTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2NvbmZpZy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2NvbmZpZ1VwZGF0ZVRpbWVTeW5jLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9kZWZhdWx0VGltZXpvbmUuY29tcGxldGUoKTtcbiAgICB0aGlzLl9yZXN5bmNUaW1lSW5wdXRTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2F1dG9GaWxsRGF0ZVN5bmMuZGVzdHJveSgpO1xuICAgIHRoaXMuX3RpbWVEYXRlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcHJlc2V0cy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2Z1bGxEYXlDb250cm9sT2JzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fb2Zmc2V0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMuY29tcGxldGUoKTtcbiAgICB0aGlzLl91cGRhdGVUaW1lLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fY2xlYXJlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3Jlc3luY1RpbWVJbnB1dC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3N5bmNDb25maWdPYnMuY29tcGxldGUoKTtcbiAgfVxuXG4gIHNlbGVjdFByZXNldChwcmVzZXQ6IERhdGVUaW1lUHJlc2V0KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSBwcmVzZXQudmFsdWUoKTtcblxuICAgIGlmICh2YWx1ZS5sb2dpY2FsRGF0ZSkge1xuICAgICAgdGhpcy5zZXRMb2dpY2FsVGltZSh2YWx1ZS5sb2dpY2FsRGF0ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50aW1lU3RyaW5nKSB7XG4gICAgICB0aGlzLnNldFRpbWUodmFsdWUudGltZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgZGF0ZVBpY2tlZChldmVudDogTWF0RGF0ZXBpY2tlcklucHV0RXZlbnQ8RGF0ZT4pOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlID0gZXZlbnQudmFsdWU7XG5cbiAgICBpZiAoZGF0ZSkge1xuICAgICAgdGhpcy5zZXREYXRlSW5wdXRWYWx1ZShkYXRlKTtcbiAgICB9XG4gIH1cblxuICBzZXRMb2dpY2FsVGltZSh0aW1lOiBMb2dpY2FsRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGUgPSBkYXRlRnJvbUxvZ2ljYWxEYXRlKHRpbWUpO1xuXG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIHRoaXMuc2V0VGltZUZyb21EYXRlKGRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHNldERhdGVJbnB1dFZhbHVlKGRhdGU6IERhdGUpIHtcbiAgICB0aGlzLmRhdGVJbnB1dEN0cmwuc2V0VmFsdWUoZGF0ZSk7XG4gICAgdGhpcy5fdXBkYXRlVGltZS5uZXh0KCk7XG4gIH1cblxuICBzZXRUaW1lRnJvbURhdGUodGltZURhdGU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lU3RyaW5nID0gdG9Mb2NhbFJlYWRhYmxlVGltZVN0cmluZyh0aW1lRGF0ZSk7XG4gICAgdGhpcy5zZXRUaW1lKHRpbWVTdHJpbmcpO1xuICB9XG5cbiAgc2V0VGltZSh0aW1lOiBSZWFkYWJsZVRpbWVTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lSW5wdXRDdHJsLnZhbHVlICE9PSB0aW1lKSB7XG4gICAgICB0aGlzLnRpbWVJbnB1dEN0cmwuc2V0VmFsdWUodGltZSk7XG4gICAgICB0aGlzLl9vZmZzZXQubmV4dCgwKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpbWUubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGtleWRvd25PbkRhdGVJbnB1dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGxldCBkaXJlY3Rpb24gPSAwO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXk/LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICBkaXJlY3Rpb24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Fycm93ZG93bic6XG4gICAgICAgIGRpcmVjdGlvbiA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBsZXQgb2Zmc2V0ID0gMTtcblxuICAgIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSAzNjU7XG4gICAgfSBlbHNlIGlmIChldmVudC5jdHJsS2V5KSB7XG4gICAgICBvZmZzZXQgPSAzMDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSA3O1xuICAgIH1cblxuICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF0ZSQsIHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckXSlcbiAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgLnN1YnNjcmliZSgoW2RhdGUsIGNvbmZpZ10pID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdEYXRlID0gc3RhcnRPZkRheShhZGREYXlzKGRhdGUsIG9mZnNldCAqIGRpcmVjdGlvbikpO1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERhdGVUaW1lTWludXRlSW5zdGFuY2Uoe1xuICAgICAgICAgICAgZGF0ZTogbmV3RGF0ZSxcbiAgICAgICAgICAgIC4uLmNvbmZpZ1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgbmV4dERhdGUgPSBpbnN0YW5jZS5pc0luU2NoZWR1bGUobmV3RGF0ZSkgPyBuZXdEYXRlIDogaW5zdGFuY2UuZmluZE5leHRBdmFpbGFibGVEYXlJblNjaGVkdWxlKG5ld0RhdGUsIGRpcmVjdGlvbiA9PT0gMSA/ICdmdXR1cmUnIDogJ3Bhc3QnKTtcblxuICAgICAgICAgIGlmIChuZXh0RGF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldERhdGVJbnB1dFZhbHVlKGluc3RhbmNlLmNsYW1wVG9MaW1pdChuZXh0RGF0ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAga2V5ZG93bk9uVGltZUlucHV0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgbGV0IGRpcmVjdGlvbiA9IDA7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleT8udG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnYXJyb3d1cCc6XG4gICAgICAgIGRpcmVjdGlvbiA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXJyb3dkb3duJzpcbiAgICAgICAgZGlyZWN0aW9uID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXQgPSAxO1xuXG4gICAgaWYgKGV2ZW50LmFsdEtleSAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgb2Zmc2V0ID0gMzAwO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICBvZmZzZXQgPSA2MDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSA1O1xuICAgIH1cblxuICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgIHRoaXMuX29mZnNldC5uZXh0KHRoaXMuX29mZnNldC52YWx1ZSArIG9mZnNldCAqIGRpcmVjdGlvbik7XG4gICAgICB0aGlzLl91cGRhdGVUaW1lLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBmb2N1c1RpbWUoKTogdm9pZCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgZm9jdXNPdXRUaW1lKCk6IHZvaWQge1xuICAgIC8vIG9ubHkgcmVmcmVzaCB3aGVuIHRoZXJlIGlzIG5vdCBhIHBhdHRlcm4gZXJyb3JcbiAgICBpZiAoIXRoaXMudGltZUlucHV0Q3RybC5oYXNFcnJvcigncGF0dGVybicpKSB7XG4gICAgICB0aGlzLl91cGRhdGVUaW1lLm5leHQoKTtcbiAgICAgIHRoaXMuX3Jlc3luY1RpbWVJbnB1dC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgYWRkVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldEZ1bGxEYXkoZmFsc2UpO1xuICB9XG5cbiAgcmVtb3ZlVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldEZ1bGxEYXkodHJ1ZSk7XG4gIH1cblxuICBzZXRGdWxsRGF5KGZ1bGxEYXk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmZ1bGxEYXlDb250cm9sJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgeC5zZXRWYWx1ZShmdWxsRGF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyVmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJlZC5uZXh0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkYngtZGF0ZXRpbWUtZmllbGRcIiBmeExheW91dD1cInJvdyB3cmFwXCIgZnhMYXlvdXQueHM9XCJjb2x1bW4gd3JhcFwiIGZ4TGF5b3V0R2FwPVwiNnB4IGdyaWRcIiBmeExheW91dEFsaWduPVwic3BhY2UtZXZlbmx5IHN0cmV0Y2hcIj5cbiAgPCEtLSBEYXRlIC0tPlxuICA8ZGl2IGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvd1wiIGZ4RmxleC5sdC1zbT1cIjEwMFwiIFtmeEZsZXhdPVwiZGF0ZU9ubHkgPyAnMTAwJyA6ICc1MCdcIiAqbmdJZj1cInNob3dEYXRlSW5wdXQkIHwgYXN5bmNcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGF0ZUlucHV0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDwhLS0gVGltZSAtLT5cbiAgPGRpdiBjbGFzcz1cImRieC1kYXRldGltZS1yb3dcIiBmeEZsZXgubHQtc209XCIxMDBcIiBbZnhGbGV4XT1cIihzaG93RGF0ZUlucHV0JCB8IGFzeW5jKSA/ICc1MCcgOiAnMTAwJ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93VGltZUlucHV0JCB8IGFzeW5jXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGltZU1lbnVBbmRJbnB1dFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdiAqbmdJZj1cInNob3dBZGRUaW1lJCB8IGFzeW5jXCIgY2xhc3M9XCJhZGQtdGltZS1idXR0b24td3JhcHBlclwiPlxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwibWF0LWRhdGVwaWNrZXItYnV0dG9uLWhpZ2hsaWdodCBkYngtYnV0dG9uLXNwYWNlciBhZGQtdGltZS1idXR0b25cIiBuZ0NsYXNzLmx0LXNtPVwiYWRkLXRpbWUtYnV0dG9uLWZ1bGxcIiAoY2xpY2spPVwiYWRkVGltZSgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj50aW1lcjwvbWF0LWljb24+XG4gICAgICAgIEFkZCBUaW1lXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDwhLS0gRGF0ZSBIaW50IC0tPlxuICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJoYXNFcnJvciQgfCBhc3luY1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImZhbHNlXCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWhpZGVEYXRlSGludFwiIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvdyBkYngtZGF0ZXRpbWUtaGludC1yb3dcIiBmeEZsZXg9XCIxMDBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRieC1oaW50XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiaGFzRW1wdHlEaXNwbGF5VmFsdWUkIHwgYXN5bmNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYngtc21hbGxcIj5ObyBkYXRlL3RpbWUgc2V0PC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmdWxsRGF5JCB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgICAgPHNtYWxsICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICA8YiBjbGFzcz1cImRieC1va1wiPnt7IGFsbERheUxhYmVsIH19PC9iPlxuICAgICAgICAgICAgICAgICAge3sgZGlzcGxheVZhbHVlJCB8IGFzeW5jIHwgZGF0ZTogJ2Z1bGxEYXRlJyB9fSB7eyB0aW1lem9uZUFiYnJldmlhdGlvbiQgfCBhc3luYyB9fSAoe3sgZGlzcGxheVZhbHVlJCB8IGFzeW5jIHwgZGF0ZURpc3RhbmNlIH19KVxuICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPHNtYWxsICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlWYWx1ZSQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgICAgICA8YiBjbGFzcz1cImRieC1va1wiPnt7IGF0VGltZUxhYmVsIH19PC9iPlxuICAgICAgICAgICAgICAgICAgICB7eyBkaXNwbGF5VmFsdWUkIHwgYXN5bmMgfCBkYXRlOiAnbWVkaXVtJyB9fSB7eyB0aW1lem9uZUFiYnJldmlhdGlvbiQgfCBhc3luYyB9fSAoe3sgZGlzcGxheVZhbHVlJCB8IGFzeW5jIHwgdGltZURpc3RhbmNlIH19KVxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiY3VycmVudEVycm9yTWVzc2FnZSQgfCBhc3luY1wiPnt7IGN1cnJlbnRFcnJvck1lc3NhZ2UkIHwgYXN5bmMgfX08L21hdC1lcnJvcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPCEtLSBEYXRlIElucHV0IFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNkYXRlSW5wdXRUZW1wbGF0ZT5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvdy1maWVsZFwiPlxuICAgIDxtYXQtbGFiZWw+e3sgZGF0ZUxhYmVsIH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0ICNkYXRlSW5wdXQgbWF0SW5wdXQgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW3JlcXVpcmVkXT1cImlzRGF0ZVJlcXVpcmVkXCIgW21pbl09XCJkYXRlSW5wdXRNaW4kIHwgYXN5bmNcIiBbbWF4XT1cImRhdGVJbnB1dE1heCQgfCBhc3luY1wiIFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiIFttYXREYXRlcGlja2VyRmlsdGVyXT1cIihwaWNrZXJGaWx0ZXIkIHwgYXN5bmMpIHx8IGRlZmF1bHRQaWNrZXJGaWx0ZXJcIiAoZGF0ZUNoYW5nZSk9XCJkYXRlUGlja2VkKCRldmVudClcIiBbdmFsdWVdPVwiZGF0ZVZhbHVlJCB8IGFzeW5jXCIgKGtleWRvd24pPVwia2V5ZG93bk9uRGF0ZUlucHV0KCRldmVudClcIiAvPlxuICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgPGJ1dHRvbiBtYXRQcmVmaXggY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93LWJ1dHRvblwiICpuZ0lmPVwiIWhpZGVEYXRlUGlja2VyXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJwaWNrZXIub3BlbigpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICA8bWF0LWljb24+Y2FsZW5kYXJfdG9kYXk8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0U3VmZml4ICpuZ0lmPVwic2hvd0NsZWFyQnV0dG9uJCB8IGFzeW5jXCIgY2xhc3M9XCJkYngtZGF0ZXRpbWUtY2xlYXItYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJjbGVhcnMgdGhlIGRhdGUgYW5kIHRpbWUgbWVudVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIChjbGljayk9XCJjbGVhclZhbHVlKClcIj5cbiAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPHNwYW4gbWF0VGV4dFN1ZmZpeCAqbmdJZj1cIiEoc2hvd1RpbWVJbnB1dCQgfCBhc3luYylcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0aW1lem9uZVN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9zcGFuPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBUaW1lIE1lbnUvSW5wdXQgVGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI3RpbWVNZW51QW5kSW5wdXRUZW1wbGF0ZT5cbiAgPG1hdC1tZW51ICN0aW1lbWVudT1cIm1hdE1lbnVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGltZU1vZGUgPT09ICdvcHRpb25hbCdcIj5cbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVtb3ZlVGltZSgpXCI+XG4gICAgICAgIDxzcGFuPlJlbW92ZSBUaW1lPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcmVzZXQgb2YgcHJlc2V0cyQgfCBhc3luY1wiPlxuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzZWxlY3RQcmVzZXQocHJlc2V0KVwiPnt7IHByZXNldC5sYWJlbCB8IGdldFZhbHVlIH19PC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbWF0LW1lbnU+XG4gIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRieC1kYXRldGltZS1yb3ctZmllbGRcIj5cbiAgICA8bWF0LWxhYmVsPnt7IHRpbWVMYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCAjdGltZUlucHV0IFtlcnJvclN0YXRlTWF0Y2hlcl09XCJ0aW1lRXJyb3JTdGF0ZU1hdGNoZXJcIiBtYXRJbnB1dCBbcmVxdWlyZWRdPVwiaXNUaW1lUmVxdWlyZWRcIiBbZm9ybUNvbnRyb2xdPVwidGltZUlucHV0Q3RybFwiIChmb2N1cyk9XCJmb2N1c1RpbWUoKVwiIChmb2N1c291dCk9XCJmb2N1c091dFRpbWUoKVwiIChrZXlkb3duKT1cImtleWRvd25PblRpbWVJbnB1dCgkZXZlbnQpXCIgLz5cbiAgICA8YnV0dG9uIG1hdFByZWZpeCBjbGFzcz1cImRieC1kYXRldGltZS1yb3ctYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJ0aW1lbWVudVwiIGFyaWEtbGFiZWw9XCJvcGVucyB0aGUgdGltZSBtZW51XCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICA8bWF0LWljb24+dGltZXI8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGltZXpvbmVTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvc3Bhbj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwidGltZUlucHV0Q3RybC5oYXNFcnJvcigncGF0dGVybicpXCI+VGhlIGlucHV0IHRpbWUgaXMgbm90IHJlY29nbml6YWJsZS48L21hdC1lcnJvcj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gVGltZXpvbmUgU3VmZml4IC0tPlxuPG5nLXRlbXBsYXRlICN0aW1lem9uZVN1ZmZpeFRlbXBsYXRlPlxuICA8c3BhbiAqbmdJZj1cInNob3dUaW1lem9uZVwiIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXRpbWV6b25lIGRieC1mYWludFwiPnt7IHRpbWV6b25lQWJicmV2aWF0aW9uJCB8IGFzeW5jIH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==